adapted from patch by Matthias Schiffer.
based on patch submitted by Jaydeep Patil, with minor changes.