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