Added UML and flushed out more abstraction