Alot of refactoring, using Adapter pattern, interface