Large amounts of refactoring. Abstract classes have been streamlined
into interfaces to prevent redundant code.