Contributed by Florian Hardwig
Contributed by Mark Price
Contributed by Gareth Hague
Contributed by Nick Sherman