done version*
Again refactor