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