diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9309f17bc69a469c4570e95743915df691951916
--- /dev/null
+++ b/.idea/jpa-buddy.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JpaBuddyIdeaProjectConfig" ddlActionDbType="maria">
+    <option name="defaultUnitInitialized" value="true" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..280ac52a8cee8757263389e9302e00be8445d5be
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="0d616560-06e0-45af-8dd9-ccab83963a0f" name="Changes" comment="Hibernate ORM for DB">
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/Application.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/Application.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/classes/Course.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Course.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/classes/CoursesOfStudy.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/CoursesOfStudy.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/classes/Enrollment.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Enrollment.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/classes/Lecturer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/classes/Lecturer.java" afterDir="false" />
+    </list>
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="JpbToolWindowState">
+    <option name="myId2FirstActivated">
+      <map>
+        <entry key="com.haulmont.jpb.jpaInspector" value="true" />
+        <entry key="com.haulmont.jpb.jpaPalette" value="true" />
+        <entry key="com.haulmont.jpb.jpaStructure" value="true" />
+      </map>
+    </option>
+    <option name="myId2Visible">
+      <map>
+        <entry key="com.haulmont.jpb.jpaInspector" value="false" />
+        <entry key="com.haulmont.jpb.jpaPalette" value="false" />
+        <entry key="com.haulmont.jpb.jpaStructure" value="false" />
+      </map>
+    </option>
+  </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="ProblemsViewState">
+    <option name="selectedTabId" value="CurrentFile" />
+  </component>
+  <component name="ProjectId" id="2AA7EXVwC9qbqrXYGnaxyK7xE03" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
+    &quot;project.structure.last.edited&quot;: &quot;Modules&quot;,
+    &quot;project.structure.proportion&quot;: &quot;0.15&quot;,
+    &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;DBNavigator.Project.ConnectionSettings&quot;
+  }
+}</component>
+  <component name="RecentsManager">
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="C:\Users\tayfu\IdeaProjects\jpa-hibernate\src\main" />
+    </key>
+  </component>
+  <component name="RunManager">
+    <configuration name="Application" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="Application" />
+      <module name="jpa-hibernate" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.Application" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="0d616560-06e0-45af-8dd9-ccab83963a0f" name="Changes" comment="" />
+      <created>1654440427551</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1654440427551</updated>
+    </task>
+    <task id="LOCAL-00001" summary="Hibernate ORM for DB">
+      <created>1655210036433</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1655210036433</updated>
+    </task>
+    <option name="localTasksCounter" value="2" />
+    <servers />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="VcsManagerConfiguration">
+    <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
+    <MESSAGE value="Hibernate ORM for DB" />
+    <option name="LAST_COMMIT_MESSAGE" value="Hibernate ORM for DB" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5c3206ebc3a60fda94fcb762d64c46e218cff4dc..711806cd1f5d3541b18a2b6a8a23c73134d218a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,17 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<<<<<<< pom.xml
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>com.example</groupId>
-    <artifactId>GradeManager_GUI</artifactId>
+    <artifactId>GradeManager</artifactId>
     <version>1.0-SNAPSHOT</version>
-    <name>GradeManager_GUI</name>
+    <name>GradeManager</name>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <junit.version>5.8.2</junit.version>
+        <maven.compiler.source>18</maven.compiler.source>
+        <maven.compiler.target>18</maven.compiler.target>
     </properties>
     <dependencies>
         <dependency>
@@ -37,6 +40,27 @@
             <version>${junit.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core-jakarta</artifactId>
+            <version>5.6.8.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jaxb</groupId>
+            <artifactId>jaxb-runtime</artifactId>
+            <version>3.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.29</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -72,9 +96,4 @@
                 </executions>
             </plugin>
         </plugins>
-    </build>
-
-
-
-
-</project>
\ No newline at end of file
+    </build>
\ No newline at end of file
diff --git a/src/main/Application.java b/src/main/Application.java
new file mode 100644
index 0000000000000000000000000000000000000000..9241b496e60edaf8fbdfd3afaac5128fff6c217e
--- /dev/null
+++ b/src/main/Application.java
@@ -0,0 +1,37 @@
+import classes.*;
+import enumeration.*;
+
+import java.time.Duration;
+
+/**
+ * Defines the entry point of the Java application.
+ */
+public class Application
+{
+    private static JpaService jpaService = JpaService.getInstance();
+
+    public static void main(String[] args)
+    {
+        try
+        {
+            jpaService.runInTransaction(entityManager -> {
+                // name, semester, courseType, sws, ects, examType, isCredited
+                //entityManager.persist(new Course("Numerische Methoden", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null));
+                //entityManager.persist(new Course("Echtzeitsysteme", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null));
+                //entityManager.persist(new Course("Digitale Signalverarbeitung", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null));
+                //int id, String name, String degree, int duration, int fees, String fieldOfStudy
+                CoursesOfStudy coursesOfStudy = new CoursesOfStudy("Angewandte Informatik", Degree.BACHELOR_OF_SCIENCE.getDegree(), 7, 62, FieldOfStudy.B_ACS_EMBEDDED_SYSTEMS.getFieldOfStudy());
+
+                coursesOfStudy.addCourse(new Course("Systemprogrammierung", Semester.SIXTH.getSemester(), CourseType.REQUIRED.getCourseType(), 4, 5, ExamType.WRITTEN.getExamType(), null));
+
+                entityManager.persist(coursesOfStudy);
+
+                return null;
+            });
+        }
+        finally
+        {
+            jpaService.closeResource();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/JpaService.java b/src/main/JpaService.java
new file mode 100644
index 0000000000000000000000000000000000000000..18e432b8d52bbee5fbc2d73c5d45509b19c70b4b
--- /dev/null
+++ b/src/main/JpaService.java
@@ -0,0 +1,76 @@
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.EntityTransaction;
+import jakarta.persistence.Persistence;
+import java.util.function.Function;
+
+/**
+ * A singleton implementation that encapsulates the JPA logic.
+ * You can configure the database connection in the
+ * {@link /src/main/resources/META-INF/persistence.xml} file.
+ */
+public class JpaService
+{
+    private static JpaService instance;
+    private EntityManagerFactory entityManagerFactory;
+
+    private JpaService()
+    {
+        entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hibernate-notenmanager");
+    }
+
+    public static synchronized JpaService getInstance()
+    {
+        return instance == null ? instance = new JpaService() : instance;
+    }
+
+    public void closeResource()
+    {
+        if(entityManagerFactory != null)
+        {
+            entityManagerFactory.close();
+        }
+    }
+
+    public EntityManagerFactory getEntityManagerFactory()
+    {
+        return entityManagerFactory;
+    }
+
+    /**
+     * Runs the specified function inside a transaction boundary. The function has
+     * access to a ready to use {@link EntityManager} and can return any type of
+     * value ({@code T}).
+     *
+     * @param function The function to run.
+     * @param <T>      The function's return type.
+     * @return the value returned by the specified function.
+     */
+    public <T> T runInTransaction(Function <EntityManager, T> function)
+    {
+        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        EntityTransaction entityTransaction = entityManager.getTransaction();
+        boolean isPersisted = false;
+
+        entityTransaction.begin();
+
+        try
+        {
+            T returnValue = function.apply(entityManager);
+            isPersisted = true;
+
+            return returnValue;
+        }
+        finally
+        {
+            if(isPersisted)
+            {
+                entityTransaction.commit();
+            }
+            else
+            {
+                entityTransaction.rollback();
+            }
+        }
+    }
+}
diff --git a/src/main/abstractClasses/UniversityMember.java b/src/main/abstractClasses/UniversityMember.java
new file mode 100644
index 0000000000000000000000000000000000000000..e66139bc83a1966a8b5580df81c78879191ee2eb
--- /dev/null
+++ b/src/main/abstractClasses/UniversityMember.java
@@ -0,0 +1,164 @@
+package abstractClasses;
+
+import enumeration.Gender;
+import jakarta.persistence.*;
+
+import java.util.Objects;
+
+@MappedSuperclass
+@Table(name = "Hochschulmitglied")
+public abstract class UniversityMember
+{
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ID")
+    private int id;
+
+    @Column(name = "Geschlecht")
+    private String gender;
+
+    @Column(name = "Vorname")
+    private String firstName;
+
+    @Column(name = "Nachname")
+    private String lastName;
+
+    @Column(name = "Wohnort")
+    private String placeOfResidence;
+
+    @Column(name = "Geburtsort")
+    private String birthPlace;
+
+    @Column(name = "Hochschul E-Mail")
+    private String officialEmail;
+
+    @Column(name = "Private E-Mail")
+    private String privateEmail;
+
+    @Column(name = "Angemeldet")
+    private Boolean isSignedUpForCourse;
+
+    protected UniversityMember()
+    {
+
+    }
+
+    protected UniversityMember(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace,
+                            String officialEmail, String privateEmail, Boolean isSignedUpForCourse)
+    {
+        this.id = id;
+        this.gender = gender;
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.placeOfResidence = placeOfResidence;
+        this.birthPlace = birthPlace;
+        this.officialEmail = officialEmail;
+        this.privateEmail = privateEmail;
+        this.isSignedUpForCourse = isSignedUpForCourse;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        UniversityMember that = (UniversityMember) o;
+        return id == that.id;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(id);
+    }
+
+    public int getId()
+    {
+        return id;
+    }
+
+    public void setId(int id)
+    {
+        this.id = id;
+    }
+
+    public String getGender()
+    {
+        return gender;
+    }
+
+    public void setGender(String gender)
+    {
+        this.gender = gender;
+    }
+
+    public String getFirstName()
+    {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName)
+    {
+        this.firstName = firstName;
+    }
+
+    public String getLastName()
+    {
+        return lastName;
+    }
+
+    public void setLastName(String lastName)
+    {
+        this.lastName = lastName;
+    }
+
+    public String getPlaceOfResidence()
+    {
+        return placeOfResidence;
+    }
+
+    public void setPlaceOfResidence(String placeOfResidence)
+    {
+        this.placeOfResidence = placeOfResidence;
+    }
+
+    public String getBirthPlace()
+    {
+        return birthPlace;
+    }
+
+    public void setBirthPlace(String birthPlace)
+    {
+        this.birthPlace = birthPlace;
+    }
+
+    public String getOfficialEmail()
+    {
+        return officialEmail;
+    }
+
+    public void setOfficialEmail(String officialEmail)
+    {
+        this.officialEmail = officialEmail;
+    }
+
+    public String getPrivateEmail()
+    {
+        return privateEmail;
+    }
+
+    public void setPrivateEmail(String privateEmail)
+    {
+        this.privateEmail = privateEmail;
+    }
+
+    public Boolean getSignedUpForCourse()
+    {
+        return isSignedUpForCourse;
+    }
+
+    public void setSignedUpForCourse(Boolean signedUpForCourse)
+    {
+        isSignedUpForCourse = signedUpForCourse;
+    }
+}
diff --git a/src/main/classes/Course.java b/src/main/classes/Course.java
new file mode 100644
index 0000000000000000000000000000000000000000..d44236f44f0b9ced8b8b95517bf8e971c323ea17
--- /dev/null
+++ b/src/main/classes/Course.java
@@ -0,0 +1,154 @@
+package classes;
+
+import jakarta.persistence.*;
+import java.util.Objects;
+
+@Entity
+@Table(name = "Kurs")
+public class Course
+{
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ID")
+    private int id;
+
+    @Column(name = "Name")
+    private String name;
+
+    @Column(name = "Semester")
+    private int semester;
+
+    @Column(name = "Typ")
+    private String courseType;
+
+    @Column(name = "SWS")
+    private int sws;
+
+    @Column(name = "ECTS")
+    private double ects;
+
+    @Column(name = "Prüfungstyp")
+    private String examType;
+
+    @Column(name = "Anrechnung")
+    private Boolean isCredited;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    private CoursesOfStudy coursesOfStudy;
+
+    public Course()
+    {
+
+    }
+
+    public Course(String name, int semester, String courseType, int sws, double ects, String examType, Boolean isCredited)
+    {
+        this.name = name;
+        this.semester = semester;
+        this.courseType = courseType;
+        this.sws = sws;
+        this.ects = ects;
+        this.examType = examType;
+        this.isCredited = isCredited;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Course course = (Course) o;
+        return id == course.id;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(id);
+    }
+
+    public int getId()
+    {
+        return id;
+    }
+
+    public void setId(int id)
+    {
+        this.id = id;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public int getSemester()
+    {
+        return semester;
+    }
+
+    public void setSemester(int semester)
+    {
+        this.semester = semester;
+    }
+
+    public String getCourseType()
+    {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType)
+    {
+        this.courseType = courseType;
+    }
+
+    public int getSws()
+    {
+        return sws;
+    }
+
+    public void setSws(int sws)
+    {
+        this.sws = sws;
+    }
+
+    public double getEcts()
+    {
+        return ects;
+    }
+
+    public void setEcts(double ects)
+    {
+        this.ects = ects;
+    }
+
+    public String getExamType()
+    {
+        return examType;
+    }
+
+    public void setExamType(String examType)
+    {
+        this.examType = examType;
+    }
+
+    public Boolean isCredited()
+    {
+        return isCredited;
+    }
+
+    public void setCredited(Boolean credited)
+    {
+        isCredited = credited;
+    }
+
+    public void setCoursesOfStudy(CoursesOfStudy coursesOfStudy)
+    {
+        this.coursesOfStudy = coursesOfStudy;
+    }
+}
diff --git a/src/main/classes/CoursesOfStudy.java b/src/main/classes/CoursesOfStudy.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d160765897cd856aa85479431b985f4b8b2b905
--- /dev/null
+++ b/src/main/classes/CoursesOfStudy.java
@@ -0,0 +1,153 @@
+package classes;
+
+import jakarta.persistence.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Entity
+@Table(name = "Studiengang")
+public class CoursesOfStudy
+{
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ID")
+    private int id;
+
+    @Column(name = "Name")
+    private String name;
+
+    @Column(name = "Abschluss")
+    private String degree;
+
+    @Column(name = "Dauer")
+    private int duration;
+
+    @Column(name = "Studiengebühr")
+    private int fees;
+
+    @Column(name = "Schwerpunkt")
+    private String fieldOfStudy;
+
+    @OneToMany(
+            mappedBy = "coursesOfStudy",
+            cascade = CascadeType.ALL,
+            orphanRemoval = true
+    )
+    private List<Course> courses = new ArrayList<>();
+    @ManyToOne
+    @JoinColumn(name = "courses_of_study_id")
+    private CoursesOfStudy coursesOfStudy;
+
+    public CoursesOfStudy getCoursesOfStudy() {
+        return coursesOfStudy;
+    }
+
+    /*
+    @ManyToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "courses_of_study_id")
+    private CoursesOfStudy coursesOfStudy;
+    */
+
+    public CoursesOfStudy()
+    {
+
+    }
+
+    public CoursesOfStudy(String name, String degree, int duration, int fees, String fieldOfStudy)
+    {
+        this.name = name;
+        this.degree = degree;
+        this.duration = duration;
+        this.fees = fees;
+        this.fieldOfStudy = fieldOfStudy;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CoursesOfStudy that = (CoursesOfStudy) o;
+        return id == that.id;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(id);
+    }
+
+    public int getId()
+    {
+        return id;
+    }
+
+    public void setId(int id)
+    {
+        this.id = id;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getDegree()
+    {
+        return degree;
+    }
+
+    public void setDegree(String degree)
+    {
+        this.degree = degree;
+    }
+
+    public int getDuration()
+    {
+        return duration;
+    }
+
+    public void setDuration(int duration)
+    {
+        this.duration = duration;
+    }
+
+    public int getFees()
+    {
+        return fees;
+    }
+
+    public void setFees(int fees)
+    {
+        this.fees = fees;
+    }
+
+    public String getFieldOfStudy()
+    {
+        return fieldOfStudy;
+    }
+
+    public void setFieldOfStudy(String fieldOfStudy)
+    {
+        this.fieldOfStudy = fieldOfStudy;
+    }
+
+    public void addCourse(Course course)
+    {
+        courses.add(course);
+        course.setCoursesOfStudy(this);
+    }
+
+    public void removeCourse(Course course)
+    {
+        courses.remove(course);
+        course.setCoursesOfStudy(null);
+    }
+}
diff --git a/src/main/classes/Enrollment.java b/src/main/classes/Enrollment.java
new file mode 100644
index 0000000000000000000000000000000000000000..64f7c8911f6d1ab096459f8df4ad79ebe533e21a
--- /dev/null
+++ b/src/main/classes/Enrollment.java
@@ -0,0 +1,96 @@
+package classes;
+
+import jakarta.persistence.*;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+@Entity
+@Table(name = "Kursanmeldung")
+public class Enrollment
+{
+    @Id
+    @Column(name = "ID")
+    private int id;
+
+    @ManyToOne
+    @JoinColumn(name = "Matrikelnummer")
+    Student student;
+
+    @ManyToOne
+    @JoinColumn(name = "Kursnummer")
+    Course course;
+
+    @Column(name = "Datum der Anmeldung")
+    private LocalDateTime enrollmentDate;
+
+    @Column(name = "Note")
+    private double grade;
+
+    public Enrollment()
+    {
+
+    }
+
+    public Enrollment(Student student, Course course, LocalDateTime enrollmentDate)
+    {
+        this.student = student;
+        this.course = course;
+        this.enrollmentDate = enrollmentDate;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Enrollment that = (Enrollment) o;
+        return student == that.student && course == that.course;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(student, course);
+    }
+
+    public Student getStudent()
+    {
+        return student;
+    }
+
+    public void setStudent(Student student)
+    {
+        this.student = student;
+    }
+
+    public Course getCourse()
+    {
+        return course;
+    }
+
+    public void setCourse(Course course)
+    {
+        this.course = course;
+    }
+
+    public LocalDateTime getEnrollmentDate()
+    {
+        return enrollmentDate;
+    }
+
+    public void setEnrollmentDate(LocalDateTime enrollmentDate)
+    {
+        this.enrollmentDate = enrollmentDate;
+    }
+
+    public double getGrade()
+    {
+        return grade;
+    }
+
+    public void setGrade(double grade)
+    {
+        this.grade = grade;
+    }
+}
diff --git a/src/main/classes/Lecturer.java b/src/main/classes/Lecturer.java
new file mode 100644
index 0000000000000000000000000000000000000000..f067a1f2be916338d44b495753cdc8b66b23242d
--- /dev/null
+++ b/src/main/classes/Lecturer.java
@@ -0,0 +1,37 @@
+package classes;
+
+import abstractClasses.UniversityMember;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "Dozent")
+public class Lecturer extends UniversityMember
+{
+    @Column(name = "Fakultaet")
+    String faculty;
+
+    public Lecturer()
+    {
+
+    }
+
+    public Lecturer(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace,
+                    String officialEmail, String privateEmail, Boolean isSignedUpForCourse, String faculty)
+    {
+        super(id, gender, firstName, lastName, placeOfResidence, birthPlace,
+                officialEmail, privateEmail, isSignedUpForCourse);
+        this.faculty = faculty;
+    }
+
+    public String getFaculty()
+    {
+        return faculty;
+    }
+
+    public void setFaculty(String faculty)
+    {
+        this.faculty = faculty;
+    }
+}
diff --git a/src/main/classes/Student.java b/src/main/classes/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3f3775430b019fd01f95f694217024748d20040
--- /dev/null
+++ b/src/main/classes/Student.java
@@ -0,0 +1,82 @@
+package classes;
+
+import abstractClasses.UniversityMember;
+import interfaces.Calculable;
+import jakarta.persistence.*;
+
+import java.util.Set;
+
+@Entity
+@Table(name = "Student")
+public class Student extends UniversityMember implements Calculable
+{
+    @Column(name = "Status")
+    private String status;
+
+    @Column(name = "Gebühren bezahlt")
+    private boolean paidFees;
+
+    @Column(name = "Semester")
+    private int semester;
+
+    @OneToMany(mappedBy = "student")
+    Set<Enrollment> enrollments;
+
+    public Student()
+    {
+
+    }
+
+    public Student(int id, String gender, String firstName, String lastName, String placeOfResidence, String birthPlace,
+                   String officialEmail, String privateEmail, Boolean isSignedUpForCourse, String status,
+                   boolean paidFess, int semester)
+    {
+        super(id, gender, firstName, lastName, placeOfResidence, birthPlace,
+                officialEmail, privateEmail, isSignedUpForCourse);
+        this.status = status;
+        this.paidFees = paidFess;
+        this.semester = semester;
+    }
+
+    @Override
+    public double calculateAverage()
+    {
+        return 0;
+    }
+
+    @Override
+    public int calculateMedian()
+    {
+        return 0;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public boolean isPaidFees()
+    {
+        return paidFees;
+    }
+
+    public void setPaidFees(boolean paidFees)
+    {
+        this.paidFees = paidFees;
+    }
+
+    public int getSemester()
+    {
+        return semester;
+    }
+
+    public void setSemester(int semester)
+    {
+        this.semester = semester;
+    }
+}
\ No newline at end of file
diff --git a/src/main/enumeration/CourseType.java b/src/main/enumeration/CourseType.java
new file mode 100644
index 0000000000000000000000000000000000000000..a38e51e4630f464eca70ec43d2c04c166519cfe1
--- /dev/null
+++ b/src/main/enumeration/CourseType.java
@@ -0,0 +1,22 @@
+package enumeration;
+
+public enum CourseType
+{
+    COMPULSORY("FWP"),
+    ELECTIVE("AWP"),
+    PLV("PLV"),
+    REQUIRED("Required"),
+    VOLUNTARY("Voluntary");
+
+    private String courseType;
+
+    private CourseType(String courseType)
+    {
+        this.courseType = courseType;
+    }
+
+    public String getCourseType()
+    {
+        return courseType;
+    }
+}
diff --git a/src/main/enumeration/Degree.java b/src/main/enumeration/Degree.java
new file mode 100644
index 0000000000000000000000000000000000000000..6325147084e0970b864f707292fbfbfc0ed1a985
--- /dev/null
+++ b/src/main/enumeration/Degree.java
@@ -0,0 +1,23 @@
+package enumeration;
+
+public enum Degree
+{
+    BACHELOR_OF_ARTS("B.A."),
+    BACHELOR_OF_ENGINEERING("B.Eng."),
+    BACHELOR_OF_SCIENCE("B.Sc."),
+    MASTER_OF_ARTS("M.A."),
+    MASTER_OF_ENGINEERING("M.Eng."),
+    MASTER_OF_SCIENCE("M.Sc.");
+
+    private String degree;
+
+    private Degree(String degree)
+    {
+        this.degree = degree;
+    }
+
+    public String getDegree()
+    {
+        return degree;
+    }
+}
diff --git a/src/main/enumeration/ExamType.java b/src/main/enumeration/ExamType.java
new file mode 100644
index 0000000000000000000000000000000000000000..13627e62f3d6c7b7e323e57e327077e5ad63c7ad
--- /dev/null
+++ b/src/main/enumeration/ExamType.java
@@ -0,0 +1,25 @@
+package enumeration;
+
+public enum ExamType
+{
+    BACHELOR_THESIS("BA"),
+    INTERNSHIP("Pr"),
+    MASTER_THESIS("MA"),
+    ORAL("mdlP"),
+    PERFORMANCE_RECORD("LN"),
+    PROOF_OF_PARTICIPATION("TN"),
+    RESEARCH_PROJECT("PStA"),
+    WRITTEN("schrP");
+
+    private String examType;
+
+    private ExamType(String examType)
+    {
+        this.examType = examType;
+    }
+
+    public String getExamType()
+    {
+        return examType;
+    }
+}
diff --git a/src/main/enumeration/FieldOfStudy.java b/src/main/enumeration/FieldOfStudy.java
new file mode 100644
index 0000000000000000000000000000000000000000..c24baf737c395f9f8f140f0236c995d8387c9f10
--- /dev/null
+++ b/src/main/enumeration/FieldOfStudy.java
@@ -0,0 +1,19 @@
+package enumeration;
+
+public enum FieldOfStudy
+{
+    B_ACS_EMBEDDED_SYSTEMS("Embedded Systems"),
+    B_ACS_MOBILE_AND_SPATIAL_SYSTEMS("Mobile and Spatial Systems");
+
+    private String fieldOfStudy;
+
+    private FieldOfStudy(String fieldOfStudy)
+    {
+        this.fieldOfStudy = fieldOfStudy;
+    }
+
+    public String getFieldOfStudy()
+    {
+        return fieldOfStudy;
+    }
+}
diff --git a/src/main/enumeration/Gender.java b/src/main/enumeration/Gender.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ff2250cbd5356250a0ce59a405be26ca23a1a9a
--- /dev/null
+++ b/src/main/enumeration/Gender.java
@@ -0,0 +1,20 @@
+package enumeration;
+
+public enum Gender
+{
+    MALE("Male"),
+    FEMALE("Female"),
+    OTHER("Other");
+
+    private String gender;
+
+    private Gender(String gender)
+    {
+        this.gender = gender;
+    }
+
+    public String getGender()
+    {
+        return gender;
+    }
+}
diff --git a/src/main/enumeration/Mark.java b/src/main/enumeration/Mark.java
new file mode 100644
index 0000000000000000000000000000000000000000..677a033fa2007a84b00ced4e11ffb9d4449c50d5
--- /dev/null
+++ b/src/main/enumeration/Mark.java
@@ -0,0 +1,30 @@
+package enumeration;
+
+public enum Mark
+{
+    EINS_NULL(1.0),
+    EINS_DREI(1.3),
+    EINS_SIEBEN(1.7),
+    ZWEI_NULL(2.0),
+    ZWEI_DREI(2.3),
+    ZWEI_SIEBEN(2.7),
+    DREI_NULL(3.0),
+    DREI_DREI(3.3),
+    DREI_SIEBEN(3.7),
+    VIER_NULL(4.0),
+    FUENF_NULL(5.0),
+    SECHS_NULL(6.0),
+    SIEBEN_NULL(7.0);
+
+    private double mark;
+
+    Mark(double mark)
+    {
+        this.mark = mark;
+    }
+
+    public double getMark()
+    {
+        return mark;
+    }
+}
diff --git a/src/main/enumeration/Semester.java b/src/main/enumeration/Semester.java
new file mode 100644
index 0000000000000000000000000000000000000000..864f22a346fff34e9e2ce3e95ffe6124d7cea735
--- /dev/null
+++ b/src/main/enumeration/Semester.java
@@ -0,0 +1,31 @@
+package enumeration;
+
+public enum Semester
+{
+    FIRST(1),
+    SECOND(2),
+    THIRD(3),       // Regelstudienzeit Master
+    FOURTH(4),
+    FIFTH(5),       // Erstmaliges Ablegen der Masterarbeit; nur ein weiterer Versuch erlaubt
+    SIXTH(6),       // max. Anzahl an Master-Semester; bis hier: ohne Corona
+    SEVENTH(7),     // Regelstudienzeit Bachelor // M: WS 2021/22
+    EIGHTH(8),      // M: SS 2021
+    NINTH(9),       // Erstmaliges Ablegen der Bachelorarbeit; nur ein weiterer Versuch erlaubt // M: WS 2020/21
+    TENTH(10),      // max. Anzahl an Bachelor-Semester; bis hier: ohne Corona // M: vor und zum SS 2020
+    ELEVENTH(11),   // B: WS 2021/22
+    TWELFTH(12),    // B: SS 2021
+    THIRTEENTH(13), // B: WS 2020/21
+    FOURTEENTH(14); // B: vor und zum SS 2020
+
+    private final int semester;
+
+    private Semester(final int semester)
+    {
+        this.semester = semester;
+    }
+
+    public int getSemester()
+    {
+        return semester;
+    }
+}
diff --git a/src/main/enumeration/Status.java b/src/main/enumeration/Status.java
new file mode 100644
index 0000000000000000000000000000000000000000..a56370cd8b802ec3573d91f77dc239274fee81b9
--- /dev/null
+++ b/src/main/enumeration/Status.java
@@ -0,0 +1,20 @@
+package enumeration;
+
+public enum Status
+{
+    ENROLLED("Enrolled"),
+    WITHDRAWAL("Withdrawing"),
+    DISMISSAL("Dismissed");
+
+    private String status;
+
+    private Status(String status)
+    {
+        this.status = status;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+}
diff --git a/src/main/interfaces/Calculable.java b/src/main/interfaces/Calculable.java
new file mode 100644
index 0000000000000000000000000000000000000000..e49ea804341396b0a478ec3b98855ade8e059ca8
--- /dev/null
+++ b/src/main/interfaces/Calculable.java
@@ -0,0 +1,7 @@
+package interfaces;
+
+public interface Calculable
+{
+    double calculateAverage();
+    int calculateMedian();
+}
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1593f7f5fbdc503a774fa8db817a57b499f52b28
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,14 @@
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+             version="2.0">
+    <persistence-unit name="jpa-hibernate-notenmanager" transaction-type="RESOURCE_LOCAL">
+        <properties>
+            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/notenmanager"/>
+            <property name="jakarta.persistence.jdbc.user" value="root"/>
+            <property name="jakarta.persistence.jdbc.password" value=""/>
+            <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>
+        </properties>
+    </persistence-unit>
+</persistence>
+