@startuml skinparam packageStyle file package Person { abstract class Person { +name } abstract class Employee extends Person { +ssn +email } class Tap extends Employee { } class Vip extends Employee { } class Dean extends Vip { } class ResearchAssociate extends Vip { +field } class Supervisor extends ResearchAssociate { } class Lecturer extends ResearchAssociate { } class Student extends Person { } } package Org { abstract class Org { +name } interface Place { +address } class University implements Place class University extends Org { } class Faculty extends Org { } Faculty --* University Faculty "1" *- Person.Dean class Institute implements Place class Institute extends Org { } Institute --* Faculty Institute *- Person.ResearchAssociate } package Project { abstract Project { +name +dateBegin +dateEnd } class ProjectHours { } ProjectHours "1" *-- Project ProjectHours o-- Person.ResearchAssociate interface ProvidesEcts { +ects } class Course implements ProvidesEcts class Course extends Project { +id +name +hoursWeekly } Course -- Person.Lecturer class StudentProject implements ProvidesEcts class StudentProject extends Project { } StudentProject --* Person.Supervisor class Programme { addActivity() valid() } Programme o- Course Programme o- StudentProject Programme --* Person.Student } package Bachelorizer { class Bachelorizer { } Bachelorizer --> Project.Programme } @enduml