Rewritten as a class
Further clean up, move to interfaces instead of abstract classes
Constants