Thanks to
 Simon Cozens (original Version)

 Brett Paden (paden@multiply.com)
 Balazs Rauznitz (balazs@multiply.com)
   (Memory patch)