Contributed by saurabh kumar
Contributed by Ross Gehm
Contributed by Valerio Nicoletti
Contributed by Jérôme Knebusch