major refactoring
committing to merge