Complete redesign to OOP