Contributed by Florian Hardwig
Contributed by Cory Hassmann
Contributed by Stephen Coles
Contributed by Andy Kelly