Reworked to OOP