a lot of redesign and refactoring!