inital version
refactor