Contributed by Florian Hardwig
Contributed by james millner
Contributed by Joost de Boo
Contributed by JAF