lots of refactor, design work, etc...