WiP rewrite to OO