Written by:
- James Wells <james@wells.net>

With many great ideas and some fixes from:
- Martin Imobersteg
- Norbert Andres
- Anatoli Arkhipenko
