Complete Object-Oriented Re-write