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