Author Christian Riedel <[email protected]> Additional contributions by (sorted by name) Cielquan <[email protected]>