Refactor the project to properly use interfaces and sensible abstractions
Refactor the project to properly use interfaces and sensible abstractions