Contributed by Marcus Garde
Contributed by Alex Slobzheninov
Contributed by Bharath Arappali
Contributed by Piotr Stala