Lots of refactoring and couple new models