redesign;
refactor
updates test cases