redesigned OOP