Contributed by Eric Schwarz
Contributed by Felix Bronko Noll
Contributed by Filippos Fragkogiannis
Contributed by Hannes Brischke