Added more abstraction.
Fixed Abstraction
Moved some abstraction out to new class