Initial diff and test by Fabian Raetz <fabian D-O-T raetz A-T gmail D-O-T com> with advanced fixes by me.