Many changes, more refactoring, terrible description :(