major refactor
major refactor2
major refactor3