diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5ff6309b7199129c1afe4f4ec1906e640bec48c6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0168272e1e35b3b5fe6e329825d0d462a06a074c
--- /dev/null
+++ b/.idea/dbnavigator.xml
@@ -0,0 +1,568 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DBNavigator.Project.DataEditorManager">
+    <record-view-column-sorting-type value="BY_INDEX" />
+    <value-preview-text-wrapping value="false" />
+    <value-preview-pinned value="false" />
+  </component>
+  <component name="DBNavigator.Project.DataExportManager">
+    <export-instructions>
+      <create-header value="true" />
+      <friendly-headers value="false" />
+      <quote-values-containing-separator value="true" />
+      <quote-all-values value="false" />
+      <value-separator value="" />
+      <file-name value="" />
+      <file-location value="" />
+      <scope value="GLOBAL" />
+      <destination value="FILE" />
+      <format value="EXCEL" />
+      <charset value="windows-1252" />
+      <charset value="windows-1252" />
+    </export-instructions>
+  </component>
+  <component name="DBNavigator.Project.DatabaseBrowserManager">
+    <autoscroll-to-editor value="false" />
+    <autoscroll-from-editor value="true" />
+    <show-object-properties value="true" />
+    <loaded-nodes />
+  </component>
+  <component name="DBNavigator.Project.DatabaseConsoleManager">
+    <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611">
+      <console name="MySQL Connection" type="STANDARD" schema="notenmanager" session="Main" />
+      <console name="phpmyadmin" type="STANDARD" schema="notenmanager" session="Main" />
+    </connection>
+  </component>
+  <component name="DBNavigator.Project.DatabaseFileManager">
+    <open-files>
+      <object connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" object-ref="schemas/notenmanager/tables/kurs" />
+      <object connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" object-ref="schemas/notenmanager/tables/studiengang" />
+    </open-files>
+  </component>
+  <component name="DBNavigator.Project.DatabaseSessionManager">
+    <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" />
+  </component>
+  <component name="DBNavigator.Project.DatasetFilterManager">
+    <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.course" active-filter-id="EMPTY_FILTER" />
+    <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.coursesofstudy" active-filter-id="EMPTY_FILTER" />
+    <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.kurs" active-filter-id="EMPTY_FILTER" />
+    <filter-actions connection-id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" dataset="notenmanager.studiengang" active-filter-id="EMPTY_FILTER" />
+  </component>
+  <component name="DBNavigator.Project.EditorStateManager">
+    <last-used-providers />
+  </component>
+  <component name="DBNavigator.Project.ExecutionManager">
+    <retain-sticky-names value="false" />
+  </component>
+  <component name="DBNavigator.Project.MethodExecutionManager">
+    <method-browser />
+    <execution-history>
+      <group-entries value="true" />
+      <execution-inputs />
+    </execution-history>
+    <argument-values-cache />
+  </component>
+  <component name="DBNavigator.Project.ObjectDependencyManager">
+    <last-used-dependency-type value="INCOMING" />
+  </component>
+  <component name="DBNavigator.Project.ObjectQuickFilterManager">
+    <last-used-operator value="EQUAL" />
+    <filters />
+  </component>
+  <component name="DBNavigator.Project.ParserDiagnosticsManager">
+    <diagnostics-history />
+  </component>
+  <component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
+    <recently-used-interfaces />
+  </component>
+  <component name="DBNavigator.Project.Settings">
+    <connections>
+      <connection id="1c72da42-0bf8-4e1f-be16-76f69d3e0611" active="true" signed="true">
+        <database>
+          <name value="MySQL Connection" />
+          <description value="DB für den Notenmanager" />
+          <database-type value="MYSQL" />
+          <config-type value="BASIC" />
+          <database-version value="5.5" />
+          <driver-source value="BUILTIN" />
+          <driver-library value="" />
+          <driver value="" />
+          <url-type value="DATABASE" />
+          <host value="localhost" />
+          <port value="3306" />
+          <database value="notenmanager" />
+          <type value="USER" />
+          <user value="root" />
+          <deprecated-pwd value="" />
+        </database>
+        <properties>
+          <auto-commit value="false" />
+          <properties>
+            <property key="serverTimezone" value="UTC" />
+          </properties>
+        </properties>
+        <ssh-settings>
+          <active value="false" />
+          <proxy-host value="" />
+          <proxy-port value="22" />
+          <proxy-user value="" />
+          <deprecated-proxy-pwd value="" />
+          <auth-type value="PASSWORD" />
+          <key-file value="" />
+          <key-passphrase value="" />
+        </ssh-settings>
+        <ssl-settings>
+          <active value="false" />
+          <certificate-authority-file value="" />
+          <client-certificate-file value="" />
+          <client-key-file value="" />
+        </ssl-settings>
+        <details>
+          <charset value="UTF-8" />
+          <session-management value="true" />
+          <ddl-file-binding value="true" />
+          <database-logging value="true" />
+          <connect-automatically value="true" />
+          <restore-workspace value="true" />
+          <restore-workspace-deep value="false" />
+          <environment-type value="default" />
+          <connectivity-timeout value="5" />
+          <idle-time-to-disconnect value="30" />
+          <idle-time-to-disconnect-pool value="5" />
+          <credential-expiry-time value="10" />
+          <max-connection-pool-size value="7" />
+          <alternative-statement-delimiter value="" />
+        </details>
+        <object-filters hide-empty-schemas="false" hide-pseudo-columns="false">
+          <object-type-filter>
+            <object-type name="SCHEMA" enabled="true" />
+            <object-type name="USER" enabled="true" />
+            <object-type name="ROLE" enabled="true" />
+            <object-type name="PRIVILEGE" enabled="true" />
+            <object-type name="CHARSET" enabled="true" />
+            <object-type name="TABLE" enabled="true" />
+            <object-type name="VIEW" enabled="true" />
+            <object-type name="MATERIALIZED_VIEW" enabled="true" />
+            <object-type name="NESTED_TABLE" enabled="true" />
+            <object-type name="COLUMN" enabled="true" />
+            <object-type name="INDEX" enabled="true" />
+            <object-type name="CONSTRAINT" enabled="true" />
+            <object-type name="DATASET_TRIGGER" enabled="true" />
+            <object-type name="DATABASE_TRIGGER" enabled="true" />
+            <object-type name="SYNONYM" enabled="true" />
+            <object-type name="SEQUENCE" enabled="true" />
+            <object-type name="PROCEDURE" enabled="true" />
+            <object-type name="FUNCTION" enabled="true" />
+            <object-type name="PACKAGE" enabled="true" />
+            <object-type name="TYPE" enabled="true" />
+            <object-type name="TYPE_ATTRIBUTE" enabled="true" />
+            <object-type name="ARGUMENT" enabled="true" />
+            <object-type name="DIMENSION" enabled="true" />
+            <object-type name="CLUSTER" enabled="true" />
+            <object-type name="DBLINK" enabled="true" />
+          </object-type-filter>
+          <object-name-filters />
+        </object-filters>
+      </connection>
+    </connections>
+    <browser-settings>
+      <general>
+        <display-mode value="TABBED" />
+        <navigation-history-size value="100" />
+        <show-object-details value="false" />
+      </general>
+      <filters>
+        <object-type-filter>
+          <object-type name="SCHEMA" enabled="true" />
+          <object-type name="USER" enabled="true" />
+          <object-type name="ROLE" enabled="true" />
+          <object-type name="PRIVILEGE" enabled="true" />
+          <object-type name="CHARSET" enabled="true" />
+          <object-type name="TABLE" enabled="true" />
+          <object-type name="VIEW" enabled="true" />
+          <object-type name="MATERIALIZED_VIEW" enabled="true" />
+          <object-type name="NESTED_TABLE" enabled="true" />
+          <object-type name="COLUMN" enabled="true" />
+          <object-type name="INDEX" enabled="true" />
+          <object-type name="CONSTRAINT" enabled="true" />
+          <object-type name="DATASET_TRIGGER" enabled="true" />
+          <object-type name="DATABASE_TRIGGER" enabled="true" />
+          <object-type name="SYNONYM" enabled="true" />
+          <object-type name="SEQUENCE" enabled="true" />
+          <object-type name="PROCEDURE" enabled="true" />
+          <object-type name="FUNCTION" enabled="true" />
+          <object-type name="PACKAGE" enabled="true" />
+          <object-type name="TYPE" enabled="true" />
+          <object-type name="TYPE_ATTRIBUTE" enabled="true" />
+          <object-type name="ARGUMENT" enabled="true" />
+          <object-type name="DIMENSION" enabled="true" />
+          <object-type name="CLUSTER" enabled="true" />
+          <object-type name="DBLINK" enabled="true" />
+        </object-type-filter>
+      </filters>
+      <sorting>
+        <object-type name="COLUMN" sorting-type="NAME" />
+        <object-type name="FUNCTION" sorting-type="NAME" />
+        <object-type name="PROCEDURE" sorting-type="NAME" />
+        <object-type name="ARGUMENT" sorting-type="POSITION" />
+      </sorting>
+      <default-editors>
+        <object-type name="VIEW" editor-type="SELECTION" />
+        <object-type name="PACKAGE" editor-type="SELECTION" />
+        <object-type name="TYPE" editor-type="SELECTION" />
+      </default-editors>
+    </browser-settings>
+    <navigation-settings>
+      <lookup-filters>
+        <lookup-objects>
+          <object-type name="SCHEMA" enabled="true" />
+          <object-type name="USER" enabled="false" />
+          <object-type name="ROLE" enabled="false" />
+          <object-type name="PRIVILEGE" enabled="false" />
+          <object-type name="CHARSET" enabled="false" />
+          <object-type name="TABLE" enabled="true" />
+          <object-type name="VIEW" enabled="true" />
+          <object-type name="MATERIALIZED VIEW" enabled="true" />
+          <object-type name="INDEX" enabled="true" />
+          <object-type name="CONSTRAINT" enabled="true" />
+          <object-type name="DATASET TRIGGER" enabled="true" />
+          <object-type name="DATABASE TRIGGER" enabled="true" />
+          <object-type name="SYNONYM" enabled="false" />
+          <object-type name="SEQUENCE" enabled="true" />
+          <object-type name="PROCEDURE" enabled="true" />
+          <object-type name="FUNCTION" enabled="true" />
+          <object-type name="PACKAGE" enabled="true" />
+          <object-type name="TYPE" enabled="true" />
+          <object-type name="DIMENSION" enabled="false" />
+          <object-type name="CLUSTER" enabled="false" />
+          <object-type name="DBLINK" enabled="true" />
+        </lookup-objects>
+        <force-database-load value="false" />
+        <prompt-connection-selection value="true" />
+        <prompt-schema-selection value="true" />
+      </lookup-filters>
+    </navigation-settings>
+    <dataset-grid-settings>
+      <general>
+        <enable-zooming value="true" />
+        <enable-column-tooltip value="true" />
+      </general>
+      <sorting>
+        <nulls-first value="true" />
+        <max-sorting-columns value="4" />
+      </sorting>
+      <tracking-columns>
+        <columnNames value="" />
+        <visible value="true" />
+        <editable value="false" />
+      </tracking-columns>
+    </dataset-grid-settings>
+    <dataset-editor-settings>
+      <text-editor-popup>
+        <active value="false" />
+        <active-if-empty value="false" />
+        <data-length-threshold value="100" />
+        <popup-delay value="1000" />
+      </text-editor-popup>
+      <values-actions-popup>
+        <show-popup-button value="true" />
+        <element-count-threshold value="1000" />
+        <data-length-threshold value="250" />
+      </values-actions-popup>
+      <general>
+        <fetch-block-size value="100" />
+        <fetch-timeout value="30" />
+        <trim-whitespaces value="true" />
+        <convert-empty-strings-to-null value="true" />
+        <select-content-on-cell-edit value="true" />
+        <large-value-preview-active value="true" />
+      </general>
+      <filters>
+        <prompt-filter-dialog value="true" />
+        <default-filter-type value="BASIC" />
+      </filters>
+      <qualified-text-editor text-length-threshold="300">
+        <content-types>
+          <content-type name="Text" enabled="true" />
+          <content-type name="Properties" enabled="true" />
+          <content-type name="XML" enabled="true" />
+          <content-type name="DTD" enabled="true" />
+          <content-type name="HTML" enabled="true" />
+          <content-type name="XHTML" enabled="true" />
+          <content-type name="Java" enabled="true" />
+          <content-type name="SQL" enabled="true" />
+          <content-type name="PL/SQL" enabled="true" />
+          <content-type name="JSON" enabled="true" />
+          <content-type name="JSON5" enabled="true" />
+          <content-type name="Groovy" enabled="true" />
+          <content-type name="AIDL" enabled="true" />
+          <content-type name="YAML" enabled="true" />
+          <content-type name="Manifest" enabled="true" />
+        </content-types>
+      </qualified-text-editor>
+      <record-navigation>
+        <navigation-target value="VIEWER" />
+      </record-navigation>
+    </dataset-editor-settings>
+    <code-editor-settings>
+      <general>
+        <show-object-navigation-gutter value="false" />
+        <show-spec-declaration-navigation-gutter value="true" />
+        <enable-spellchecking value="true" />
+        <enable-reference-spellchecking value="false" />
+      </general>
+      <confirmations>
+        <save-changes value="false" />
+        <revert-changes value="true" />
+      </confirmations>
+    </code-editor-settings>
+    <code-completion-settings>
+      <filters>
+        <basic-filter>
+          <filter-element type="RESERVED_WORD" id="keyword" selected="true" />
+          <filter-element type="RESERVED_WORD" id="function" selected="true" />
+          <filter-element type="RESERVED_WORD" id="parameter" selected="true" />
+          <filter-element type="RESERVED_WORD" id="datatype" selected="true" />
+          <filter-element type="RESERVED_WORD" id="exception" selected="true" />
+          <filter-element type="OBJECT" id="schema" selected="true" />
+          <filter-element type="OBJECT" id="role" selected="true" />
+          <filter-element type="OBJECT" id="user" selected="true" />
+          <filter-element type="OBJECT" id="privilege" selected="true" />
+          <user-schema>
+            <filter-element type="OBJECT" id="table" selected="true" />
+            <filter-element type="OBJECT" id="view" selected="true" />
+            <filter-element type="OBJECT" id="materialized view" selected="true" />
+            <filter-element type="OBJECT" id="index" selected="true" />
+            <filter-element type="OBJECT" id="constraint" selected="true" />
+            <filter-element type="OBJECT" id="trigger" selected="true" />
+            <filter-element type="OBJECT" id="synonym" selected="false" />
+            <filter-element type="OBJECT" id="sequence" selected="true" />
+            <filter-element type="OBJECT" id="procedure" selected="true" />
+            <filter-element type="OBJECT" id="function" selected="true" />
+            <filter-element type="OBJECT" id="package" selected="true" />
+            <filter-element type="OBJECT" id="type" selected="true" />
+            <filter-element type="OBJECT" id="dimension" selected="true" />
+            <filter-element type="OBJECT" id="cluster" selected="true" />
+            <filter-element type="OBJECT" id="dblink" selected="true" />
+          </user-schema>
+          <public-schema>
+            <filter-element type="OBJECT" id="table" selected="false" />
+            <filter-element type="OBJECT" id="view" selected="false" />
+            <filter-element type="OBJECT" id="materialized view" selected="false" />
+            <filter-element type="OBJECT" id="index" selected="false" />
+            <filter-element type="OBJECT" id="constraint" selected="false" />
+            <filter-element type="OBJECT" id="trigger" selected="false" />
+            <filter-element type="OBJECT" id="synonym" selected="false" />
+            <filter-element type="OBJECT" id="sequence" selected="false" />
+            <filter-element type="OBJECT" id="procedure" selected="false" />
+            <filter-element type="OBJECT" id="function" selected="false" />
+            <filter-element type="OBJECT" id="package" selected="false" />
+            <filter-element type="OBJECT" id="type" selected="false" />
+            <filter-element type="OBJECT" id="dimension" selected="false" />
+            <filter-element type="OBJECT" id="cluster" selected="false" />
+            <filter-element type="OBJECT" id="dblink" selected="false" />
+          </public-schema>
+          <any-schema>
+            <filter-element type="OBJECT" id="table" selected="true" />
+            <filter-element type="OBJECT" id="view" selected="true" />
+            <filter-element type="OBJECT" id="materialized view" selected="true" />
+            <filter-element type="OBJECT" id="index" selected="true" />
+            <filter-element type="OBJECT" id="constraint" selected="true" />
+            <filter-element type="OBJECT" id="trigger" selected="true" />
+            <filter-element type="OBJECT" id="synonym" selected="true" />
+            <filter-element type="OBJECT" id="sequence" selected="true" />
+            <filter-element type="OBJECT" id="procedure" selected="true" />
+            <filter-element type="OBJECT" id="function" selected="true" />
+            <filter-element type="OBJECT" id="package" selected="true" />
+            <filter-element type="OBJECT" id="type" selected="true" />
+            <filter-element type="OBJECT" id="dimension" selected="true" />
+            <filter-element type="OBJECT" id="cluster" selected="true" />
+            <filter-element type="OBJECT" id="dblink" selected="true" />
+          </any-schema>
+        </basic-filter>
+        <extended-filter>
+          <filter-element type="RESERVED_WORD" id="keyword" selected="true" />
+          <filter-element type="RESERVED_WORD" id="function" selected="true" />
+          <filter-element type="RESERVED_WORD" id="parameter" selected="true" />
+          <filter-element type="RESERVED_WORD" id="datatype" selected="true" />
+          <filter-element type="RESERVED_WORD" id="exception" selected="true" />
+          <filter-element type="OBJECT" id="schema" selected="true" />
+          <filter-element type="OBJECT" id="user" selected="true" />
+          <filter-element type="OBJECT" id="role" selected="true" />
+          <filter-element type="OBJECT" id="privilege" selected="true" />
+          <user-schema>
+            <filter-element type="OBJECT" id="table" selected="true" />
+            <filter-element type="OBJECT" id="view" selected="true" />
+            <filter-element type="OBJECT" id="materialized view" selected="true" />
+            <filter-element type="OBJECT" id="index" selected="true" />
+            <filter-element type="OBJECT" id="constraint" selected="true" />
+            <filter-element type="OBJECT" id="trigger" selected="true" />
+            <filter-element type="OBJECT" id="synonym" selected="true" />
+            <filter-element type="OBJECT" id="sequence" selected="true" />
+            <filter-element type="OBJECT" id="procedure" selected="true" />
+            <filter-element type="OBJECT" id="function" selected="true" />
+            <filter-element type="OBJECT" id="package" selected="true" />
+            <filter-element type="OBJECT" id="type" selected="true" />
+            <filter-element type="OBJECT" id="dimension" selected="true" />
+            <filter-element type="OBJECT" id="cluster" selected="true" />
+            <filter-element type="OBJECT" id="dblink" selected="true" />
+          </user-schema>
+          <public-schema>
+            <filter-element type="OBJECT" id="table" selected="true" />
+            <filter-element type="OBJECT" id="view" selected="true" />
+            <filter-element type="OBJECT" id="materialized view" selected="true" />
+            <filter-element type="OBJECT" id="index" selected="true" />
+            <filter-element type="OBJECT" id="constraint" selected="true" />
+            <filter-element type="OBJECT" id="trigger" selected="true" />
+            <filter-element type="OBJECT" id="synonym" selected="true" />
+            <filter-element type="OBJECT" id="sequence" selected="true" />
+            <filter-element type="OBJECT" id="procedure" selected="true" />
+            <filter-element type="OBJECT" id="function" selected="true" />
+            <filter-element type="OBJECT" id="package" selected="true" />
+            <filter-element type="OBJECT" id="type" selected="true" />
+            <filter-element type="OBJECT" id="dimension" selected="true" />
+            <filter-element type="OBJECT" id="cluster" selected="true" />
+            <filter-element type="OBJECT" id="dblink" selected="true" />
+          </public-schema>
+          <any-schema>
+            <filter-element type="OBJECT" id="table" selected="true" />
+            <filter-element type="OBJECT" id="view" selected="true" />
+            <filter-element type="OBJECT" id="materialized view" selected="true" />
+            <filter-element type="OBJECT" id="index" selected="true" />
+            <filter-element type="OBJECT" id="constraint" selected="true" />
+            <filter-element type="OBJECT" id="trigger" selected="true" />
+            <filter-element type="OBJECT" id="synonym" selected="true" />
+            <filter-element type="OBJECT" id="sequence" selected="true" />
+            <filter-element type="OBJECT" id="procedure" selected="true" />
+            <filter-element type="OBJECT" id="function" selected="true" />
+            <filter-element type="OBJECT" id="package" selected="true" />
+            <filter-element type="OBJECT" id="type" selected="true" />
+            <filter-element type="OBJECT" id="dimension" selected="true" />
+            <filter-element type="OBJECT" id="cluster" selected="true" />
+            <filter-element type="OBJECT" id="dblink" selected="true" />
+          </any-schema>
+        </extended-filter>
+      </filters>
+      <sorting enabled="true">
+        <sorting-element type="RESERVED_WORD" id="keyword" />
+        <sorting-element type="RESERVED_WORD" id="datatype" />
+        <sorting-element type="OBJECT" id="column" />
+        <sorting-element type="OBJECT" id="table" />
+        <sorting-element type="OBJECT" id="view" />
+        <sorting-element type="OBJECT" id="materialized view" />
+        <sorting-element type="OBJECT" id="index" />
+        <sorting-element type="OBJECT" id="constraint" />
+        <sorting-element type="OBJECT" id="trigger" />
+        <sorting-element type="OBJECT" id="synonym" />
+        <sorting-element type="OBJECT" id="sequence" />
+        <sorting-element type="OBJECT" id="procedure" />
+        <sorting-element type="OBJECT" id="function" />
+        <sorting-element type="OBJECT" id="package" />
+        <sorting-element type="OBJECT" id="type" />
+        <sorting-element type="OBJECT" id="dimension" />
+        <sorting-element type="OBJECT" id="cluster" />
+        <sorting-element type="OBJECT" id="dblink" />
+        <sorting-element type="OBJECT" id="schema" />
+        <sorting-element type="OBJECT" id="role" />
+        <sorting-element type="OBJECT" id="user" />
+        <sorting-element type="RESERVED_WORD" id="function" />
+        <sorting-element type="RESERVED_WORD" id="parameter" />
+      </sorting>
+      <format>
+        <enforce-code-style-case value="true" />
+      </format>
+    </code-completion-settings>
+    <execution-engine-settings>
+      <statement-execution>
+        <fetch-block-size value="100" />
+        <execution-timeout value="20" />
+        <debug-execution-timeout value="600" />
+        <focus-result value="false" />
+        <prompt-execution value="false" />
+      </statement-execution>
+      <script-execution>
+        <command-line-interfaces />
+        <execution-timeout value="300" />
+      </script-execution>
+      <method-execution>
+        <execution-timeout value="30" />
+        <debug-execution-timeout value="600" />
+        <parameter-history-size value="10" />
+      </method-execution>
+    </execution-engine-settings>
+    <operation-settings>
+      <transactions>
+        <uncommitted-changes>
+          <on-project-close value="ASK" />
+          <on-disconnect value="ASK" />
+          <on-autocommit-toggle value="ASK" />
+        </uncommitted-changes>
+        <multiple-uncommitted-changes>
+          <on-commit value="ASK" />
+          <on-rollback value="ASK" />
+        </multiple-uncommitted-changes>
+      </transactions>
+      <session-browser>
+        <disconnect-session value="ASK" />
+        <kill-session value="ASK" />
+        <reload-on-filter-change value="false" />
+      </session-browser>
+      <compiler>
+        <compile-type value="KEEP" />
+        <compile-dependencies value="ASK" />
+        <always-show-controls value="false" />
+      </compiler>
+      <debugger>
+        <debugger-type value="ASK" />
+        <use-generic-runners value="true" />
+      </debugger>
+    </operation-settings>
+    <ddl-file-settings>
+      <extensions>
+        <mapping file-type-id="VIEW" extensions="vw" />
+        <mapping file-type-id="TRIGGER" extensions="trg" />
+        <mapping file-type-id="PROCEDURE" extensions="prc" />
+        <mapping file-type-id="FUNCTION" extensions="fnc" />
+        <mapping file-type-id="PACKAGE" extensions="pkg" />
+        <mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
+        <mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
+        <mapping file-type-id="TYPE" extensions="tpe" />
+        <mapping file-type-id="TYPE_SPEC" extensions="tps" />
+        <mapping file-type-id="TYPE_BODY" extensions="tpb" />
+      </extensions>
+      <general>
+        <lookup-ddl-files value="true" />
+        <create-ddl-files value="false" />
+        <synchronize-ddl-files value="true" />
+        <use-qualified-names value="false" />
+        <make-scripts-rerunnable value="true" />
+      </general>
+    </ddl-file-settings>
+    <general-settings>
+      <regional-settings>
+        <date-format value="MEDIUM" />
+        <number-format value="UNGROUPED" />
+        <locale value="SYSTEM_DEFAULT" />
+        <use-custom-formats value="false" />
+      </regional-settings>
+      <environment>
+        <environment-types>
+          <environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
+          <environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
+          <environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
+          <environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
+        </environment-types>
+        <visibility-settings>
+          <connection-tabs value="true" />
+          <dialog-headers value="true" />
+          <object-editor-tabs value="true" />
+          <script-editor-tabs value="false" />
+          <execution-result-tabs value="true" />
+        </visibility-settings>
+      </environment>
+    </general-settings>
+  </component>
+  <component name="DBNavigator.Project.StatementExecutionManager">
+    <execution-variables />
+  </component>
+</project>
\ No newline at end of file
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/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f3016ad42d0c9de2ddb8a2c745e2beb36061ec0d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_18" project-jdk-name="18" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="jpab" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b63946d5b31084bbb7dda418ceb3d75eb686373
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </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
new file mode 100644
index 0000000000000000000000000000000000000000..d198d6589970004e07340b84861f44a930110b88
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,39 @@
+<?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"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>jpa-hibernate</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>18</maven.compiler.source>
+        <maven.compiler.target>18</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <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>
+
+</project>
\ 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>
+