Contributed by Jono Lewarne
Contributed by Nguyen Gobber
Contributed by Zoran Pungerčar
Contributed by Kirill Gluschenko