Second attempt, make everything OO