plenty messed up commit, lots of changes. diff will tell :P