Contributed by Stephen Coles
Contributed by Paul Poster
Contributed by tobias schererbauer
Contributed by Eric Dahl Palmér