Contributed by ben Urbain
Contributed by Stephen Coles
Contributed by Nick Shinn
Contributed by Andreas Kofler