With Ramin: Much code rewrite, set up class diagram further