some major refactoring. added go