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