first iteration with basic features
Separated classes for easier read