completly refactor all