Contributed by Yevgeniy Anfalov
Contributed by Edgar Walthert
Contributed by Julien Kobrin
Contributed by Nikolas Wrobel