lots of changes :D