Contributed by Mike Blystone
Contributed by Alex Slobzheninov
Contributed by Stéphane Darricau
Contributed by Christoffer Leka