Contributed by Florian Hardwig
Contributed by Pavel Kedich
Contributed by Stephen Coles
Contributed by D Jones