a lot of refactoring, redesign and design decisions