Final. Tested. Ready for merge to develope branch.