diff --git a/.gitignore b/.gitignore
index 14fa51a730e6ca3c26ac75cf6d1b35d0bef8187b..09127ca386abb011a63d31df83aca28ae68bc207 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ bin/
 .sts4-cache
 
 ### IntelliJ IDEA ###
+.idea
 *.iws
 *.iml
 *.ipr
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index b4208d1f50f3d62744b4eb594d81fb029e332ed4..0000000000000000000000000000000000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-/sonarlint/
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index c7b7b708dab82c08c005e3bdd77c6b202f9676d5..0000000000000000000000000000000000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <code_scheme name="Project" version="173">
-    <JavaCodeStyleSettings>
-      <option name="GENERATE_FINAL_PARAMETERS" value="true" />
-      <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
-      <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="1" />
-      <option name="IMPORT_LAYOUT_TABLE">
-        <value>
-          <package name="" withSubpackages="true" static="true" />
-          <emptyLine />
-          <package name="java" withSubpackages="true" static="false" />
-          <emptyLine />
-          <package name="jakarta" withSubpackages="true" static="false" />
-          <package name="javax" withSubpackages="true" static="false" />
-          <emptyLine />
-          <package name="org" withSubpackages="true" static="false" />
-          <emptyLine />
-          <package name="com" withSubpackages="true" static="false" />
-          <emptyLine />
-          <package name="" withSubpackages="true" static="false" />
-        </value>
-      </option>
-      <option name="ALIGN_MULTILINE_RECORDS" value="false" />
-      <option name="ALIGN_TYPES_IN_MULTI_CATCH" value="false" />
-      <option name="JD_P_AT_EMPTY_LINES" value="false" />
-      <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
-    </JavaCodeStyleSettings>
-    <JetCodeStyleSettings>
-      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
-    </JetCodeStyleSettings>
-    <codeStyleSettings language="JAVA">
-      <option name="RIGHT_MARGIN" value="150" />
-      <option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
-      <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
-      <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
-      <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
-      <option name="KEEP_BLANK_LINES_BETWEEN_PACKAGE_DECLARATION_AND_HEADER" value="1" />
-      <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
-      <option name="INDENT_CASE_FROM_SWITCH" value="false" />
-      <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
-      <option name="ALIGN_MULTILINE_RESOURCES" value="false" />
-      <option name="ALIGN_MULTILINE_FOR" value="false" />
-      <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="true" />
-      <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" />
-      <option name="CALL_PARAMETERS_WRAP" value="1" />
-      <option name="METHOD_PARAMETERS_WRAP" value="1" />
-      <option name="RESOURCE_LIST_WRAP" value="5" />
-      <option name="EXTENDS_LIST_WRAP" value="1" />
-      <option name="THROWS_LIST_WRAP" value="1" />
-      <option name="EXTENDS_KEYWORD_WRAP" value="1" />
-      <option name="THROWS_KEYWORD_WRAP" value="1" />
-      <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
-      <option name="BINARY_OPERATION_WRAP" value="1" />
-      <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
-      <option name="TERNARY_OPERATION_WRAP" value="5" />
-      <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
-      <option name="ARRAY_INITIALIZER_WRAP" value="1" />
-      <option name="WRAP_COMMENTS" value="true" />
-      <option name="ASSERT_STATEMENT_COLON_ON_NEXT_LINE" value="true" />
-      <option name="ENUM_CONSTANTS_WRAP" value="1" />
-      <indentOptions>
-        <option name="CONTINUATION_INDENT_SIZE" value="2" />
-        <option name="USE_TAB_CHARACTER" value="true" />
-      </indentOptions>
-    </codeStyleSettings>
-    <codeStyleSettings language="XML">
-      <indentOptions>
-        <option name="USE_TAB_CHARACTER" value="true" />
-      </indentOptions>
-    </codeStyleSettings>
-    <codeStyleSettings language="kotlin">
-      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
-    </codeStyleSettings>
-  </code_scheme>
-</component>
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index 79ee123c2b23e069e35ed634d687e17f731cc702..0000000000000000000000000000000000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <state>
-    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
-  </state>
-</component>
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index a0654ae09e17f0f5fff33dc7aff32511e7628ad8..0000000000000000000000000000000000000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <annotationProcessing>
-      <profile default="true" name="Default" enabled="true" />
-      <profile name="Gradle Imported" enabled="true">
-        <outputRelativeToContentRoot value="true" />
-        <processorPath useClasspath="false">
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.projectlombok/lombok/1.18.30/f195ee86e6c896ea47a1d39defbe20eb59cd149d/lombok-1.18.30.jar" />
-        </processorPath>
-      </profile>
-      <profile name="Maven default annotation processors profile" enabled="true">
-        <sourceOutputDir name="target/generated-sources/annotations" />
-        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
-        <outputRelativeToContentRoot value="true" />
-      </profile>
-      <profile name="Annotation profile for OZG-Cloud Antragsraum" enabled="true">
-        <sourceOutputDir name="target/generated-sources/annotations" />
-        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
-        <outputRelativeToContentRoot value="true" />
-        <processorPath useClasspath="false">
-          <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.34/lombok-1.18.34.jar" />
-          <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.6.0/mapstruct-processor-1.6.0.jar" />
-          <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.6.0/mapstruct-1.6.0.jar" />
-          <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.34/lombok-1.18.34.jar" />
-          <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.6.0/mapstruct-processor-1.6.0.jar" />
-          <entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.6.0/mapstruct-1.6.0.jar" />
-        </processorPath>
-        <module name="antragsraum-server" />
-      </profile>
-    </annotationProcessing>
-    <bytecodeTargetLevel target="21" />
-  </component>
-  <component name="JavacSettings">
-    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
-      <module name="antragsraum-server" options="-parameters -Amapstruct.defaultComponentModel=spring -Amapstruct.unmappedTargetPolicy=WARN" />
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/copyright/Eupl1_2.xml b/.idea/copyright/Eupl1_2.xml
deleted file mode 100644
index 8b51bb2301fbdd90e6ee5801f4f7713a2a0dac5a..0000000000000000000000000000000000000000
--- a/.idea/copyright/Eupl1_2.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<component name="CopyrightManager">
-  <copyright>
-    <option name="notice" value="Copyright (c) &amp;#36;originalComment.match(&quot;Copyright \(c\) (\d+)&quot;, 1, &quot;-&quot;, &quot;&amp;#36;today.year&quot;)&amp;#36;today.year.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten&#10;des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.&#10;&#10;Lizenziert unter der EUPL, Version 1.2 oder - sobald&#10;diese von der Europäischen Kommission genehmigt wurden -&#10;Folgeversionen der EUPL (&quot;Lizenz&quot;);&#10;Sie dürfen dieses Werk ausschließlich gemäß&#10;dieser Lizenz nutzen.&#10;Eine Kopie der Lizenz finden Sie hier:&#10;&#10;https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12&#10;&#10;Sofern nicht durch anwendbare Rechtsvorschriften&#10;gefordert oder in schriftlicher Form vereinbart, wird&#10;die unter der Lizenz verbreitete Software &quot;so wie sie&#10;ist&quot;, OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -&#10;ausdrücklich oder stillschweigend - verbreitet.&#10;Die sprachspezifischen Genehmigungen und Beschränkungen&#10;unter der Lizenz sind dem Lizenztext zu entnehmen. " />
-    <option name="myName" value="Eupl1.2" />
-  </copyright>
-</component>
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index 4c8996918f5c5ce3236fb74f10a56f1ba8bf84fa..0000000000000000000000000000000000000000
--- a/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<component name="CopyrightManager">
-  <settings>
-    <module2copyright>
-      <element module="Project Files" copyright="Eupl1.2" />
-    </module2copyright>
-  </settings>
-</component>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 0dabbbf7bffc5e2c9d4af51b7ab52fb15673d093..0000000000000000000000000000000000000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
-    <file url="file://$PROJECT_DIR$/server/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/server/target/generated-sources/openapi" charset="UTF-8" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index 3e3960b71eaef30230fcaeef29ebc18216501448..0000000000000000000000000000000000000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleMigrationSettings" migrationVersion="1" />
-</project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
deleted file mode 100644
index 2f42e537a699dc92219bd00691e0e37d4200b562..0000000000000000000000000000000000000000
--- a/.idea/jarRepositories.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RemoteRepositoriesConfiguration">
-    <remote-repository>
-      <option name="id" value="shibboleth" />
-      <option name="name" value="Shibboleth Maven Repo" />
-      <option name="url" value="https://build.shibboleth.net/nexus/content/repositories/releases" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Central Repository" />
-      <option name="url" value="https://repo.maven.apache.org/maven2" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="shibboleth-releases" />
-      <option name="name" value="Shibboleth Releases Repository" />
-      <option name="url" value="https://build.shibboleth.net/maven/releases/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Maven Central" />
-      <option name="url" value="https://repo1.maven.org/maven2/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Maven Central repository" />
-      <option name="url" value="https://repo1.maven.org/maven2" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="nexus" />
-      <option name="name" value="Ozg nexus" />
-      <option name="url" value="https://nexus.ozg-sh.de/repository/ozg-ozg-releases" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="maven" />
-      <option name="name" value="maven" />
-      <option name="url" value="https://artifacts.mgm-tp.com/artifactory/maven-repos" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="maven2" />
-      <option name="name" value="maven2" />
-      <option name="url" value="https://build.shibboleth.net/nexus/content/repositories/releases/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="MavenRepo" />
-      <option name="name" value="MavenRepo" />
-      <option name="url" value="https://repo.maven.apache.org/maven2/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="project-repository" />
-      <option name="name" value="project-repository" />
-      <option name="url" value="file://$PROJECT_DIR$/server/tmpRepo" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="jboss.community" />
-      <option name="name" value="JBoss Community repository" />
-      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="ozg-snapshots-nexus" />
-      <option name="name" value="ozg-snapshots" />
-      <option name="url" value="https://nexus.ozg-sh.de/repository/ozg-snapshots/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="local-repo" />
-      <option name="name" value="local-repo" />
-      <option name="url" value="file://$PROJECT_DIR$/server/lib" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="ozg-nexus" />
-      <option name="name" value="ozg-releases" />
-      <option name="url" value="https://nexus.ozg-sh.de/repository/ozg-releases/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="shibboleth-thirdparty" />
-      <option name="name" value="Shibboleth Thirdparty Repository" />
-      <option name="url" value="https://build.shibboleth.net/maven/thirdparty/" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="nexus" />
-      <option name="name" value="Ozg nexus" />
-      <option name="url" value="https://nexus.ozg-sh.de/repository/ozg-releases" />
-    </remote-repository>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 290d6c7b10d9725454ff8e20c97a70786d11f5eb..0000000000000000000000000000000000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ExternalStorageConfigurationManager" enabled="true" />
-  <component name="FrameworkDetectionExcludesConfiguration">
-    <file type="web" url="file://$PROJECT_DIR$" />
-  </component>
-  <component name="MavenProjectsManager">
-    <option name="originalFiles">
-      <list>
-        <option value="$PROJECT_DIR$/pom.xml" />
-      </list>
-    </option>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" />
-</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index b8776654896d4d1276d75b8ea0891a1231fab966..0000000000000000000000000000000000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum.integrationTest.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum.integrationTest.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum.main.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum.main.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.integrationTest.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.integrationTest.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.main.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.main.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.test.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum-server/ozg-antragsraum.ozg-antragsraum-server.test.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/keycloak/ozg-antragsraum.ozg-keycloak.iml" filepath="$PROJECT_DIR$/.idea/modules/keycloak/ozg-antragsraum.ozg-keycloak.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/ozg-antragsraum.test.iml" filepath="$PROJECT_DIR$/.idea/modules/ozg-antragsraum.test.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/sonarlint.xml b/.idea/sonarlint.xml
deleted file mode 100644
index 0e83d2e68b218e8d268a339d9812aec0b616780e..0000000000000000000000000000000000000000
--- a/.idea/sonarlint.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="SonarLintProjectSettings">
-    <option name="bindingEnabled" value="true" />
-    <option name="projectKey" value="de.ozgcloud:antragsraum" />
-    <option name="serverId" value="ozg-cloud" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
deleted file mode 100644
index 2b63946d5b31084bbb7dda418ceb3d75eb686373..0000000000000000000000000000000000000000
--- a/.idea/uiDesigner.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?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
deleted file mode 100644
index 35eb1ddfbbc029bcab630581847471d7f238ec53..0000000000000000000000000000000000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java
index 850d16c480a8d57553c3109da01fc9bd2598d1d3..bbe62e4392b2e29ae302db55f225e7c3a2e441db 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java
@@ -55,6 +55,7 @@ import lombok.extern.log4j.Log4j2;
 @RequiredArgsConstructor
 @SecurityRequirement(name = "security_auth")
 public class FileController {
+
 	static final String PATH = "/api/file/"; // NOSONAR
 	static final String PATH_PATTERN = PATH + "%s/%s";
 
@@ -127,4 +128,5 @@ public class FileController {
 			throw new InvalidFileTypeException(file.getName());
 		}
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java
index f7a44c19cd3a0fae91e5d34ae353929c39b1f5b5..30522a261ac6b97af7094f92f4970cfa847f349d 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java
@@ -28,5 +28,7 @@ import lombok.Builder;
 public record FileIdentificationData(
   String fileId,
   String nachrichtId,
-  String nachrichtEventId) {
+  String nachrichtEventId
+) {
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileProperties.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileProperties.java
index 1f2a2411396c18c1ba6ebb282588e5d50a2d5afd..56164c46846009b093aa59fb3ee93d52197569e8 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileProperties.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileProperties.java
@@ -20,19 +20,22 @@
 
 package de.ozgcloud.antragsraum.attachments;
 
-import lombok.Getter;
-import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.util.unit.DataSize;
 
+import lombok.Getter;
+import lombok.Setter;
+
 @Getter
 @Setter
 @Configuration
 @ConfigurationProperties(FileProperties.PREFIX)
 class FileProperties {
-    static final String PREFIX = "ozgcloud.upload";
 
-    private DataSize maxFileSize;
-    private String[] blockedContentTypes;
+	static final String PREFIX = "ozgcloud.upload";
+
+	private DataSize maxFileSize;
+	private String[] blockedContentTypes;
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
index 387b57e63d78e5fe377a49e310fce26848e3ac2a..ecdcdf41917155e3453570f83b74ede2819b915d 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
@@ -34,6 +34,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @RequiredArgsConstructor
 class FileRemoteService {
+
 	private final @NonNull FileRestClient restClient;
 	private final @NonNull OzgFileMapper ozgFileMapper;
 
@@ -58,4 +59,5 @@ class FileRemoteService {
 	void downloadFileContent(FileIdentificationData fileIdentificationData, String address, OutputStream out) {
 		restClient.downloadFileContent(fileIdentificationData, address, out);
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java
index 9f9eb98599cefa037b2ce5623706d6164aecb9ce..78d53042ad1152fd8936357a525177731929f77a 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java
@@ -52,6 +52,7 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 @Component
 class FileRestClient {
+
 	static final String FIND_FILE_METADATA_API = "/api/v1/file/metadata";
 	static final String GET_FILE_CONTENT_API = "/api/v1/file/content";
 	static final String UPLOAD_FILE_API = "/api/v1/file";
@@ -145,4 +146,5 @@ class FileRestClient {
 			throw new TechnicalException(e);
 		}
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java
index f1c616aceebd4325dcb2f8c5ff1743e3d5d9b828..300d239e094e1f8292c5f657e3a2fc8e4fdcbdd3 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java
@@ -36,6 +36,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @RequiredArgsConstructor
 public class FileService {
+
 	private final @NonNull FileRemoteService fileRemoteService;
 	private final @NonNull VirusScannerClient scanner;
 	private final @NonNull NachrichtEventService nachrichtEventService;
@@ -75,4 +76,5 @@ public class FileService {
 	boolean isClean(MultipartFile file) {
 		return scanner.scan(file).isEmpty();
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileValidator.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileValidator.java
index e99a8f7590902c8e51c4cfcc28e580b0e7563a32..5b82907087341aa11847100f3e9fcd9fa40176bd 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileValidator.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileValidator.java
@@ -31,6 +31,7 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 @Component
 class FileValidator {
+
 	private final FileProperties fileProperties;
 
 	boolean isValid(MultipartFile file) {
@@ -48,4 +49,5 @@ class FileValidator {
 
 		return !Arrays.asList(fileProperties.getBlockedContentTypes()).contains(contentType);
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFile.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFile.java
index 8d8a5c657aeb1174dbc5cf4073442b5277475312..20faaa5f0b506248c8cc60d47d38e3d65df4ef57 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFile.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFile.java
@@ -50,5 +50,7 @@ public record OzgFile(
 	type = "string",
 	example = "text/plain"
   )
-  String contentType) {
+  String contentType
+) {
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgUploadFile.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgUploadFile.java
index 690a2372a2b9e86ff20e32ee797b7c3251800306..6809d04b5b86b066ddb4e458c16294c4709047b5 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgUploadFile.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgUploadFile.java
@@ -28,4 +28,5 @@ import lombok.Builder;
 @Validated
 @Builder
 record OzgUploadFile(String vorgangId, MultipartFile file) {
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/VirusScannerClient.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/VirusScannerClient.java
index 4085c550fd58f8bd9597731b265cea39e6941109..531c3df8d497e79e89c4e819b767e728f7301183 100755
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/VirusScannerClient.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/VirusScannerClient.java
@@ -46,6 +46,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @RequiredArgsConstructor
 class VirusScannerClient {
+
 	private static final String FILE_REQUEST_KEY = "FILES";
 
 	@Value("${clamav.scanUrl}")
@@ -88,22 +89,29 @@ class VirusScannerClient {
 	@Getter
 	@Setter
 	static class VirusScanResponse {
+
 		private VirusScanData data;
 		private boolean success;
+
 	}
 
 	@Getter
 	@Setter
 	static class VirusScanData {
+
 		private VirusScanResult[] result;
+
 	}
 
 	@Getter
 	@Setter
 	static class VirusScanResult {
+
 		private String name;
 		@JsonProperty("is_infected")
 		private boolean infected;
 		private String[] viruses;
+
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/Command.java b/server/src/main/java/de/ozgcloud/antragsraum/command/Command.java
index aa5345399859e458d9962ab7269292fcb46be814..c60eb0c7ecbbf7da35bedb2df9a721bb316d0d01 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/Command.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/Command.java
@@ -46,5 +46,7 @@ record Command(
   @Min(0)
   long createdAt,
   @Schema(description = "The date on which the command was completed.")
-  Long finishedAt) {
+  Long finishedAt
+) {
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandController.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandController.java
index f9d2e37cf287b7681956fa9e3aab6ff8cdb66fc5..d72e5ae4a991e264de829931c72fe49c72d7943a 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandController.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandController.java
@@ -37,6 +37,7 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 @SecurityRequirement(name = "security_auth")
 class CommandController {
+
 	static final String PATH = "/api"; // NOSONAR
 
 	private final @NonNull CommandService service;
@@ -48,4 +49,5 @@ class CommandController {
 	  @Parameter(description = "The id of the NachrichtEvent the command belongs to", example = "60af924b4f1a2560298b4567") @PathVariable String nachrichtEventId) {
 		return service.getCommand(commandId, nachrichtEventId);
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandMapper.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandMapper.java
index f66378a0bda86e8f833a22c826e4959a8a66af85..b573e3c4bda5c18f7fede762bd98cbe6a86e7be5 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandMapper.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandMapper.java
@@ -23,32 +23,32 @@
 package de.ozgcloud.antragsraum.command;
 
 import java.time.ZonedDateTime;
-import java.util.Objects;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 
 import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcCommand;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
 
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-class CommandMapper {
-	public static final int IN_MILLISECONDS = 1000;
+@Mapper
+interface CommandMapper {
+
+	int IN_MILLISECONDS = 1000;
 
-	static Command fromRestCommand(final AntragraumproxyGrpcCommand command, String nachrichtEventId) {
-		var createdAt = ZonedDateTime.now().toEpochSecond() + IN_MILLISECONDS;
-		if (Objects.nonNull(command.getCreatedAt())) {
-			createdAt = ZonedDateTime.parse(command.getCreatedAt()).toEpochSecond() * IN_MILLISECONDS;
-		}
+	@Mapping(target = "createdAt", expression = "java(convertCreatedAt(command.getCreatedAt()))")
+	@Mapping(target = "finishedAt", expression = "java(convertFinishedAt(command.getFinishedAt()))")
+	@Mapping(target = "nachrichtEventId", source = "nachrichtEventId")
+	Command fromRestCommand(AntragraumproxyGrpcCommand command, String nachrichtEventId);
 
-		var finishedAt = Objects.isNull(command.getFinishedAt()) || command.getFinishedAt().isEmpty()
+	default Long convertCreatedAt(String createdAt) {
+		return createdAt != null
+		  ? ZonedDateTime.parse(createdAt).toEpochSecond() * IN_MILLISECONDS
+		  : ZonedDateTime.now().toEpochSecond() * IN_MILLISECONDS;
+	}
+
+	default Long convertFinishedAt(String finishedAt) {
+		return (finishedAt == null || finishedAt.isEmpty())
 		  ? null
-		  : ZonedDateTime.parse(command.getFinishedAt()).toEpochSecond() * IN_MILLISECONDS;
-
-		return Command.builder()
-		  .id(command.getId())
-		  .nachrichtEventId(nachrichtEventId)
-		  .status(command.getStatus())
-		  .createdAt(createdAt)
-		  .finishedAt(finishedAt)
-		  .build();
+		  : ZonedDateTime.parse(finishedAt).toEpochSecond() * IN_MILLISECONDS;
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandReference.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandReference.java
index 00e112bc6046822f5d898629f46651866c1a23ba..7480d5df5b1d703de1e07c4aa6b594319b5bc6fd 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandReference.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandReference.java
@@ -38,5 +38,7 @@ public record CommandReference(
 	type = "string",
 	example = "60af924b4f1a2560298b4567"
   )
-  String nachrichtEventId) {
+  String nachrichtEventId
+) {
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRemoteService.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRemoteService.java
index 51793b97671f9656ddf97d1c0c03a4d8203a1563..de5d0ad4ef587b1d083f275d9b5b29bb4956bc2b 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRemoteService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRemoteService.java
@@ -33,11 +33,14 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @RequiredArgsConstructor
 class CommandRemoteService {
+
 	private final @NonNull CommandRestClient restClient;
+	private final @NonNull CommandMapper commandMapper;
 
 	Command getCommand(NachrichtEvent nachrichtEvent, String commandId) {
 		var response = restClient.getCommand(commandId, nachrichtEvent.address());
 
-		return CommandMapper.fromRestCommand(response, nachrichtEvent.id());
+		return commandMapper.fromRestCommand(response, nachrichtEvent.id());
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRestClient.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRestClient.java
index 8bb9b294d01055b9bbf6ac6549e07b08c4007f56..4f217db9f3ef3edbda1907d4534f5c0c840b41e3 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRestClient.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandRestClient.java
@@ -34,6 +34,7 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 @Component
 class CommandRestClient {
+
 	static final String COMMAND_URI = "/api/v1/command/{commandId}";
 
 	private final RestClient restClient;
@@ -48,4 +49,5 @@ class CommandRestClient {
 		  .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address))
 		  .retrieve().toEntity(AntragraumproxyGrpcCommand.class).getBody();
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandService.java b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandService.java
index 999f22bdc9fcebf6f0235bc643b60cebd4df035d..f59b2dec58481dab4bc55e449aa482db021a7cd3 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/command/CommandService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/command/CommandService.java
@@ -33,6 +33,7 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @RequiredArgsConstructor
 class CommandService {
+
 	private final @NonNull CommandRemoteService commandRemoteService;
 	private final @NonNull NachrichtEventService nachrichtEventService;
 
@@ -41,4 +42,5 @@ class CommandService {
 
 		return commandRemoteService.getCommand(nachrichtEvent, commandId);
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundAdvice.java
deleted file mode 100644
index 600933f2dcafc71ef2ce984d0f90101e7e8665cb..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundAdvice.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 0)
-public class AddressNotFoundAdvice extends ResponseEntityExceptionHandler {
-    @ResponseBody
-    @ExceptionHandler(AddressNotFoundException.class)
-    @ResponseStatus(HttpStatus.NOT_FOUND)
-    String addressNotFoundHandler(AddressNotFoundException ex) {
-        LOG.error("Error getting address of target OZG-Cloud instance. Message: " + ex.getMessage(), ex);
-        return "Target address not found";
-    }
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundException.java
index 0d596dbcc01e16dd7bf99a360450694857642f9b..20fb9f3e29400e5594be46dfef5f6cd567893bd2 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundException.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class AddressNotFoundException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "No NachrichtEvent for id '%s' found";
 
-    public AddressNotFoundException(String replyToId) {
-        super(String.format(MESSAGE_TEMPLATE, replyToId));
-    }
+	private static final String MESSAGE_TEMPLATE = "No NachrichtEvent for id '%s' found";
+
+	public AddressNotFoundException(String replyToId) {
+		super(String.format(MESSAGE_TEMPLATE, replyToId));
+	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/AttachmentNotFoundAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/AttachmentNotFoundAdvice.java
deleted file mode 100644
index a3064ebfd134d95e1b20826789a30e8dbf10caf0..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/AttachmentNotFoundAdvice.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 0)
-public class AttachmentNotFoundAdvice extends ResponseEntityExceptionHandler {
-    @ResponseBody
-    @ExceptionHandler(NotFoundException.class)
-    @ResponseStatus(HttpStatus.NOT_FOUND)
-    String handleNotFound(NotFoundException ex) {
-        LOG.error("Error loading attachment.", ex);
-        return "Attachment not found";
-    }
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/ExceptionController.java b/server/src/main/java/de/ozgcloud/antragsraum/common/ExceptionController.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1a6505accb751a92867d34131bcf392d4e5e978
--- /dev/null
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/ExceptionController.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.antragsraum.common;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+@ControllerAdvice
+public class ExceptionController extends ResponseEntityExceptionHandler {
+
+	@ResponseBody
+	@ExceptionHandler(AddressNotFoundException.class)
+	@ResponseStatus(HttpStatus.NOT_FOUND)
+	String handleAddressNotFoundException(AddressNotFoundException ex) {
+		LOG.error("Error getting address of target OZG-Cloud instance. Message: {}", ex.getMessage(), ex);
+		return "Target address not found";
+	}
+
+	@ResponseBody
+	@ExceptionHandler(NotFoundException.class)
+	@ResponseStatus(HttpStatus.NOT_FOUND)
+	String handleNotFoundException(NotFoundException ex) {
+		LOG.error("Error loading attachment.", ex);
+		return "Attachment not found";
+	}
+
+	@ExceptionHandler(value = { RuntimeException.class, TechnicalException.class })
+	@ResponseBody
+	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+	String handleGeneralException(RuntimeException ex) {
+		LOG.error("General error.", ex);
+		return "General error processing your request.";
+	}
+
+	@ExceptionHandler(value = { InvalidFileTypeException.class })
+	ResponseEntity<Object> handleInvalidFileTypeException(RuntimeException ex, WebRequest request) {
+		LOG.error("Uploaded file is not valid.", ex);
+		return handleExceptionInternal(ex, "File not acceptable", new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE, request);
+	}
+
+	@ExceptionHandler(value = { VirusFoundException.class })
+	ResponseEntity<Object> handleVirusFoundException(RuntimeException ex, WebRequest request) {
+		LOG.error("Virus found in uploaded file.", ex);
+		return handleExceptionInternal(ex, "Virus found", new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE, request);
+	}
+
+}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/GeneralExceptionAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/GeneralExceptionAdvice.java
deleted file mode 100755
index 57e7374408a86c008afb86479291fadc96b5fe88..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/GeneralExceptionAdvice.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 9)
-public class GeneralExceptionAdvice extends ResponseEntityExceptionHandler {
-    @ExceptionHandler(value = {RuntimeException.class, TechnicalException.class})
-    @ResponseBody
-    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
-    String handleException(RuntimeException ex) {
-        LOG.error("General error.", ex);
-        return "General error processing your request.";
-    }
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileAdvice.java
deleted file mode 100755
index e24bea7c2cd28b6e85cf79cc0d37d40c86a69552..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileAdvice.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.context.request.WebRequest;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-import lombok.extern.log4j.Log4j2;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 0)
-public class InvalidFileAdvice extends ResponseEntityExceptionHandler {
-	@ExceptionHandler(value = { InvalidFileTypeException.class })
-	protected ResponseEntity<Object> handleInvalidFile(RuntimeException ex, WebRequest request) {
-		LOG.error("Uploaded file is not valid.", ex);
-		return handleExceptionInternal(ex, "File not acceptable", new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE, request);
-	}
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileTypeException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileTypeException.java
index ef2d2293003de12924bc282b13dd1edf25e7f924..bfab6ca9557804c82f7d0c9e66177ab248cbd87e 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileTypeException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileTypeException.java
@@ -1,5 +1,7 @@
 /*
- * Copyright (c) 2023-2024.
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
+ *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
  * Folgeversionen der EUPL ("Lizenz");
@@ -21,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class InvalidFileTypeException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "File '%s' has an unsupported file type";
 
-    public InvalidFileTypeException(String fileName) {
-        super(String.format(MESSAGE_TEMPLATE, fileName));
-    }
+	private static final String MESSAGE_TEMPLATE = "File '%s' has an unsupported file type";
+
+	public InvalidFileTypeException(String fileName) {
+		super(String.format(MESSAGE_TEMPLATE, fileName));
+	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/NotAccessibleException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/NotAccessibleException.java
index 88398b40b1b089bb25a30a9250b27c377311542c..2d974e5ae9f9857d48f679f9b1b6927527bb6520 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/NotAccessibleException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/NotAccessibleException.java
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class NotAccessibleException extends RuntimeException {
+
 	private static final String MESSAGE_TEMPLATE = "Current user does not have the required trust level for the Rueckfrage with id '%s'.";
 
 	public NotAccessibleException(String rueckfrageId) {
 		super(String.format(MESSAGE_TEMPLATE, rueckfrageId));
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/NotFoundException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/NotFoundException.java
index 543be5a1a1b074101087f240a9d8c6f05402616b..a0cbaf2a8e30db5e707ff81f4c8bea54eecaf4c8 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/NotFoundException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/NotFoundException.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class NotFoundException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "Object '%s' with id '%s' not found.";
 
-    public NotFoundException(Class<?> resource, String id) {
-        super(String.format(MESSAGE_TEMPLATE, resource.getSimpleName(), id));
-    }
+	private static final String MESSAGE_TEMPLATE = "Object '%s' with id '%s' not found.";
+
+	public NotFoundException(Class<?> resource, String id) {
+		super(String.format(MESSAGE_TEMPLATE, resource.getSimpleName(), id));
+	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/RestClientUtils.java b/server/src/main/java/de/ozgcloud/antragsraum/common/RestClientUtils.java
index c0930e849f62a161560d89545be020db837020a9..b94e1cf8dcfc20485636d3efb72e032f0498b549 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/RestClientUtils.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/RestClientUtils.java
@@ -27,9 +27,11 @@ import lombok.NoArgsConstructor;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class RestClientUtils {
+
 	public static String sanitizeAddress(String address) {
 		address = address.replaceAll(":\\d{4}$", "");
 		address = address.replaceAll("^static://", "");
 		return address;
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutAdvice.java
deleted file mode 100755
index 39ee5a627bc762039f6ff9414f21fd46258e595f..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutAdvice.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 0)
-public class SendTimeoutAdvice extends ResponseEntityExceptionHandler {
-    @ResponseBody
-    @ExceptionHandler(SendTimeoutException.class)
-    @ResponseStatus(HttpStatus.GATEWAY_TIMEOUT)
-    String sendTimeoutHandler(SendTimeoutException ex) {
-        LOG.error("Timeout while sending answer. Message: " + ex.getMessage(), ex);
-        return "Timeout while sending answer";
-    }
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/TechnicalException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/TechnicalException.java
index f3fd6b1923808c818b893c2879c3e002f129d950..ecb333f0bb1c2092ce7a3297678dbc053eed88bf 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/TechnicalException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/TechnicalException.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class TechnicalException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "TechnicalException happened! Message: ";
 
-    public TechnicalException(Throwable ex) {
-        super(MESSAGE_TEMPLATE + ex.getMessage(), ex);
-    }
+	private static final String MESSAGE_TEMPLATE = "TechnicalException happened! Message: ";
+
+	public TechnicalException(Throwable ex) {
+		super(MESSAGE_TEMPLATE + ex.getMessage(), ex);
+	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundAdvice.java b/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundAdvice.java
deleted file mode 100755
index 6dc0b12e0e0ed8e2b511b9d43a9158b395a16568..0000000000000000000000000000000000000000
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundAdvice.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package de.ozgcloud.antragsraum.common;
-
-import jakarta.annotation.Priority;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.context.request.WebRequest;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-
-@ControllerAdvice
-@Log4j2
-@Priority(value = 0)
-public class VirusFoundAdvice extends ResponseEntityExceptionHandler {
-    @ExceptionHandler(value = {VirusFoundException.class})
-    protected ResponseEntity<Object> handleVirusFound(RuntimeException ex, WebRequest request) {
-        LOG.error("Virus found in uploaded file.", ex);
-        return handleExceptionInternal(ex, "Virus found", new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE, request);
-    }
-}
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundException.java
old mode 100755
new mode 100644
index 6ca6e78da97efc6fe13a267e446a3553efea24c2..d5e3887f4151542b0ac10c97c8c3de4daf5ec1a1
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundException.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class VirusFoundException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "File with nachrichtId '%s' contains virus.";
 
-    public VirusFoundException(String id) {
-        super(String.format(MESSAGE_TEMPLATE, id));
-    }
+	private static final String MESSAGE_TEMPLATE = "File with nachrichtId '%s' contains virus.";
+
+	public VirusFoundException(String id) {
+		super(String.format(MESSAGE_TEMPLATE, id));
+	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusScanException.java b/server/src/main/java/de/ozgcloud/antragsraum/common/VirusScanException.java
index f130b513e469ebc25ef9be032e1a0f2165de0267..14a0a555549f4106a8b769e61966780ea55e62dc 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/VirusScanException.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/VirusScanException.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -23,9 +23,11 @@
 package de.ozgcloud.antragsraum.common;
 
 public class VirusScanException extends RuntimeException {
+
 	private static final String MESSAGE_TEMPLATE = "Virus scan for file with name '%s' failed.";
 
 	public VirusScanException(String fileName) {
 		super(String.format(MESSAGE_TEMPLATE, fileName));
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryAspectPointcut.java b/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryAspectPointcut.java
index 47f0bcdda4fca053d060bed639c87e17a27441aa..e0ffdb8515551923824ea2fb583d0dae677d5db0 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryAspectPointcut.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryAspectPointcut.java
@@ -31,4 +31,5 @@ public class RepositoryAspectPointcut {
 	void anyPublicRepositoryMethod() {
 		// aspect pointcut - no implementation needed
 	}
+
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryLoggingAspect.java b/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryLoggingAspect.java
index efb41906f2b1771743030b3fd3fdbd6d50aaa9c9..4a2566afc52badce37d5a0d754e614f7fc9f01da 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryLoggingAspect.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/common/logging/RepositoryLoggingAspect.java
@@ -36,4 +36,5 @@ public class RepositoryLoggingAspect extends RepositoryAspectPointcut {
 	public void onRepositoryMethod(JoinPoint joinPoint) {
 		AspectLoggingUtils.log(joinPoint);
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/security/InMemoryUserDetailService.java b/server/src/main/java/de/ozgcloud/antragsraum/security/InMemoryUserDetailService.java
index 3cf3fb6d54c788490d00144859e396445259deb5..c89d01e0f220079c9bb9a36bbf59e8d01df32b0d 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/security/InMemoryUserDetailService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/security/InMemoryUserDetailService.java
@@ -49,6 +49,7 @@ import lombok.extern.log4j.Log4j2;
 @NoArgsConstructor
 @Log4j2
 public class InMemoryUserDetailService implements UserDetailsService {
+
 	@Value("${ozgcloud.code.expire.seconds:10}")
 	private long codeExpireSeconds;
 	@Value("${ozgcloud.jwt.expiration.minutes}")
@@ -138,4 +139,5 @@ public class InMemoryUserDetailService implements UserDetailsService {
 	public void logout(User user) {
 		usersMap.remove(user.getId());
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/AntragraumproxyGrpcCommandTestFactory.java b/server/src/test/java/de/ozgcloud/antragsraum/command/AntragraumproxyGrpcCommandTestFactory.java
index 0221cc6cf0132dfa0ccaacf2f759b8ec3f1a25a1..e0262ceba979d63b5f76a82a8a77a64e67814879 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/AntragraumproxyGrpcCommandTestFactory.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/AntragraumproxyGrpcCommandTestFactory.java
@@ -30,6 +30,7 @@ import lombok.NoArgsConstructor;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 class AntragraumproxyGrpcCommandTestFactory {
+
 	public static final String ID = CommandTestFactory.ID;
 	static final String CREATED_BY = UUID.randomUUID().toString();
 	static final String STATUS = CommandTestFactory.STATUS;
@@ -45,4 +46,5 @@ class AntragraumproxyGrpcCommandTestFactory {
 		command.setStatus(STATUS);
 		return command;
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerITCase.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerITCase.java
index c098e33402df2c5f57766133ea662e033f2c11b0..4e35daad68c1c58a6bbf4d5bf02fb9c43b359e3f 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerITCase.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerITCase.java
@@ -46,6 +46,7 @@ import de.ozgcloud.antragsraum.events.NachrichtEventTestFactory;
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
 @SpringJUnitConfig(classes = { CommandControllerTestConfiguration.class })
 public class CommandControllerITCase {
+
 	@SpyBean
 	private CommandController commandController;
 
@@ -57,9 +58,10 @@ public class CommandControllerITCase {
 
 	@Nested
 	class TestGetCommand {
+
 		@BeforeEach
 		void init() {
-			when(commandService.getCommand(CommandTestFactory.ID, NachrichtEventTestFactory.ID)).thenReturn(CommandTestFactory.createCommand());
+			when(commandService.getCommand(CommandTestFactory.ID, NachrichtEventTestFactory.ID)).thenReturn(CommandTestFactory.create());
 		}
 
 		@Test
@@ -96,5 +98,7 @@ public class CommandControllerITCase {
 			  get(CommandController.PATH + "/command/" + CommandTestFactory.ID + "/" + NachrichtEventTestFactory.ID)
 				.contentType(MediaType.APPLICATION_JSON).characterEncoding(Charset.defaultCharset()));
 		}
+
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTest.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTest.java
index 4506a65dbd117175714cbb81faa648938dddff2f..ae25cb8b8aff51bff1641b9f5959a4807eb21d37 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTest.java
@@ -37,6 +37,7 @@ import de.ozgcloud.antragsraum.events.NachrichtEventTestFactory;
 
 @ExtendWith(MockitoExtension.class)
 class CommandControllerTest {
+
 	@Spy
 	@InjectMocks
 	private CommandController commandController;
@@ -46,9 +47,10 @@ class CommandControllerTest {
 
 	@Nested
 	class TestGetCommand {
+
 		@BeforeEach
 		void init() {
-			when(commandService.getCommand(CommandTestFactory.ID, NachrichtEventTestFactory.ID)).thenReturn(CommandTestFactory.createCommand());
+			when(commandService.getCommand(CommandTestFactory.ID, NachrichtEventTestFactory.ID)).thenReturn(CommandTestFactory.create());
 		}
 
 		@Test
@@ -64,5 +66,7 @@ class CommandControllerTest {
 
 			assertThat(result).isInstanceOf(Command.class);
 		}
+
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTestConfiguration.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTestConfiguration.java
index a2d0064a158a0e4f45f9e96485a0376792bd06c8..f3d9409416143b4900cbbca3e1c7be1640cbeab5 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTestConfiguration.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandControllerTestConfiguration.java
@@ -39,6 +39,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 	classes = { CommandRestClientTestConfiguration.class, CommandRemoteServiceTestConfiguration.class }))
 @Configuration
 public class CommandControllerTestConfiguration {
+
 	@Bean
 	CommandRestClient commandRestClient() {
 		CommandRestClient restClient = mock(CommandRestClient.class);
@@ -48,4 +49,5 @@ public class CommandControllerTestConfiguration {
 
 		return restClient;
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandMapperTest.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandMapperTest.java
index ee9fb45a00233b7a08b60ce17135f73cab983fe3..7b99cc596b8267862aaefd85d478b2be5b250502 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandMapperTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandMapperTest.java
@@ -25,47 +25,54 @@ import static org.assertj.core.api.Assertions.*;
 
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
 
 import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcCommand;
 
 class CommandMapperTest {
+
+	private final CommandMapper mapper = Mappers.getMapper(CommandMapper.class);
+
 	@Nested
-	class TestFromGrpcCommand {
-		private final AntragraumproxyGrpcCommand restCommand = CommandTestFactory.createRestCommand();
+	class TestFromRestCommand {
+
+		private final AntragraumproxyGrpcCommand restCommand = GrpcCommandTestFactory.create();
 
 		@Test
 		void shouldMapCommandId() {
-			var command = CommandMapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
+			var command = mapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
 
 			assertThat(command.id()).isEqualTo(CommandTestFactory.ID);
 		}
 
 		@Test
 		void shouldMapNachrichtEventId() {
-			var command = CommandMapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
+			var command = mapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
 
 			assertThat(command.nachrichtEventId()).isEqualTo(CommandTestFactory.NACHRICHT_EVENT_ID);
 		}
 
 		@Test
 		void shouldMapStatus() {
-			var command = CommandMapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
+			var command = mapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
 
 			assertThat(command.status()).isEqualTo(CommandTestFactory.STATUS);
 		}
 
 		@Test
 		void shouldMapCreatedAt() {
-			var command = CommandMapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
+			var command = mapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
 
 			assertThat(command.createdAt()).isEqualTo(CommandTestFactory.CREATED_AT_DATE);
 		}
 
 		@Test
 		void shouldMapFinishedAt() {
-			var command = CommandMapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
+			var command = mapper.fromRestCommand(restCommand, CommandTestFactory.NACHRICHT_EVENT_ID);
 
 			assertThat(command.finishedAt()).isEqualTo(CommandTestFactory.FINISHED_AT_DATE);
 		}
+
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandReferenceTestFactory.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandReferenceTestFactory.java
index 1dfbd06d5d538f4e3bbc9c2037ab6f2e715d0257..76e0b6a45f33470ecd378c5559286536c6e0eb97 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandReferenceTestFactory.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandReferenceTestFactory.java
@@ -24,6 +24,7 @@ package de.ozgcloud.antragsraum.command;
 import java.util.UUID;
 
 public class CommandReferenceTestFactory {
+
 	public static final String ID = UUID.randomUUID().toString();
 	public static final String NACHRICHT_EVENT_ID = UUID.randomUUID().toString();
 
@@ -36,4 +37,5 @@ public class CommandReferenceTestFactory {
 		  .id(ID)
 		  .nachrichtEventId(NACHRICHT_EVENT_ID);
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceITCase.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceITCase.java
index 180813913c99c8814157a618ce77ca2b1d953ca4..5a3318bfc7f439720fced5a248dc93c4ed0579b0 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceITCase.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceITCase.java
@@ -41,6 +41,7 @@ import lombok.extern.log4j.Log4j2;
 @DirtiesContext
 @Log4j2
 class CommandRemoteServiceITCase {
+
 	private static final String ADDRESS = "http://localhost:8080";
 
 	@SpyBean
@@ -48,6 +49,7 @@ class CommandRemoteServiceITCase {
 
 	@Nested
 	class TestGetCommand {
+
 		private final NachrichtEvent nachrichtEvent = NachrichtEventTestFactory.createNachrichtEventBuilder().address(ADDRESS).build();
 
 		@BeforeEach
@@ -98,5 +100,7 @@ class CommandRemoteServiceITCase {
 
 			assertThat(command.finishedAt()).isEqualTo(CommandTestFactory.FINISHED_AT_DATE);
 		}
+
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTest.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTest.java
index 0e015886e2bf1122a211ccd0ae926e9bdcaf2b83..1cba2470cb154a098797342b375e42427902b244 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTest.java
@@ -36,9 +36,11 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 import de.ozgcloud.antragsraum.common.AddressNotFoundException;
 import de.ozgcloud.antragsraum.events.NachrichtEventTestFactory;
+import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcCommand;
 
 @ExtendWith(MockitoExtension.class)
 public class CommandRemoteServiceTest {
+
 	@Spy
 	@InjectMocks
 	private CommandRemoteService commandRemoteService;
@@ -46,11 +48,16 @@ public class CommandRemoteServiceTest {
 	@Mock
 	private CommandRestClient commandRestClient;
 
+	@Mock
+	private CommandMapper commandMapper;
+
 	@Nested
 	class TestGetCommand {
+
 		@BeforeEach
 		void init() {
-			when(commandRestClient.getCommand(anyString(), anyString())).thenReturn(CommandTestFactory.createRestCommand());
+			when(commandRestClient.getCommand(anyString(), anyString())).thenReturn(GrpcCommandTestFactory.create());
+			when(commandMapper.fromRestCommand(any(AntragraumproxyGrpcCommand.class), anyString())).thenReturn(CommandTestFactory.create());
 		}
 
 		@Test
@@ -59,10 +66,12 @@ public class CommandRemoteServiceTest {
 
 			assertThat(command).isInstanceOf(Command.class);
 		}
+
 	}
 
 	@Nested
 	class TestNoTargetAddressAvailable {
+
 		@BeforeEach
 		void init() {
 			doThrow(AddressNotFoundException.class).when(commandRestClient).getCommand(anyString(), anyString());
@@ -75,5 +84,7 @@ public class CommandRemoteServiceTest {
 			assertThatExceptionOfType(AddressNotFoundException.class).isThrownBy(
 			  () -> commandRemoteService.getCommand(nachrichtEvent, CommandTestFactory.ID));
 		}
+
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTestConfiguration.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTestConfiguration.java
index 7287f61a8b30a51d20ffb55778b98e0b3d8bd187..644d54ff8bcdf41e5acefcb5ee46d81a6c0fbcbd 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTestConfiguration.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRemoteServiceTestConfiguration.java
@@ -40,7 +40,8 @@ public class CommandRemoteServiceTestConfiguration {
 	private NachrichtEventService nachrichtEventService;
 
 	@Bean
-	CommandRemoteService commandRemoteService(@Autowired CommandRestClient commandRestClient) {
-		return new CommandRemoteService(commandRestClient);
+	CommandRemoteService commandRemoteService(@Autowired CommandRestClient commandRestClient, @Autowired CommandMapper commandMapper) {
+		return new CommandRemoteService(commandRestClient, commandMapper);
 	}
+
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRestClientTest.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRestClientTest.java
index 0a99eff18ed770c6f34b8d255f3542aede8d704d..119ecda83dff1969b4d40dd34a62621d6c9f9d74 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRestClientTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandRestClientTest.java
@@ -44,6 +44,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 @SpringJUnitConfig(classes = { CommandRestClientTestConfiguration.class })
 @RestClientTest(CommandRestClient.class)
 class CommandRestClientTest {
+
 	final static String ADDRESS = "http://localhost:8382";
 	private static final String COMMAND_ID = UUID.randomUUID().toString();
 
@@ -76,4 +77,5 @@ class CommandRestClientTest {
 
 		assertThat(command.getId()).isEqualTo(AntragraumproxyGrpcCommandTestFactory.ID);
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandServiceTest.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandServiceTest.java
index 9b92ed59efcc385dc9ce8058e79af86d101e962e..b4545f1f8754f979f088897ca36a0eba2e28e1c2 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandServiceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandServiceTest.java
@@ -39,6 +39,7 @@ import de.ozgcloud.antragsraum.events.NachrichtEventTestFactory;
 
 @ExtendWith(MockitoExtension.class)
 class CommandServiceTest {
+
 	@Spy
 	@InjectMocks
 	private CommandService commandService;
@@ -49,11 +50,12 @@ class CommandServiceTest {
 
 	@Nested
 	class TestGetCommand {
+
 		@BeforeEach
 		void init() {
 			final NachrichtEvent nachrichtEvent = NachrichtEventTestFactory.createNachrichtEvent();
 			when(nachrichtEventService.getNachrichtEventById(NachrichtEventTestFactory.ID)).thenReturn(nachrichtEvent);
-			when(commandRemoteService.getCommand(nachrichtEvent, CommandTestFactory.ID)).thenReturn(CommandTestFactory.createCommand());
+			when(commandRemoteService.getCommand(nachrichtEvent, CommandTestFactory.ID)).thenReturn(CommandTestFactory.create());
 		}
 
 		@Test
@@ -62,5 +64,7 @@ class CommandServiceTest {
 
 			assertThat(result).isInstanceOf(Command.class);
 		}
+
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandTestFactory.java b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandTestFactory.java
index d76c60e82c839b8f2c17037e00d80ee653826ec0..b732c1bbf7491761ca74909b78254395b48ee26c 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/command/CommandTestFactory.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/CommandTestFactory.java
@@ -24,9 +24,8 @@ package de.ozgcloud.antragsraum.command;
 import java.time.ZonedDateTime;
 import java.util.UUID;
 
-import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcCommand;
-
 public class CommandTestFactory {
+
 	public static final String ID = UUID.randomUUID().toString();
 	static final String NACHRICHT_EVENT_ID = UUID.randomUUID().toString();
 	static final String STATUS = "FINISHED";
@@ -35,11 +34,11 @@ public class CommandTestFactory {
 	static final String FINISHED_AT = "2024-06-24T08:10:13.076Z";
 	static final long FINISHED_AT_DATE = ZonedDateTime.parse(FINISHED_AT).toEpochSecond() * 1000;
 
-	static Command createCommand() {
-		return createCommandBuilder().build();
+	static Command create() {
+		return createBuilder().build();
 	}
 
-	static Command.CommandBuilder createCommandBuilder() {
+	static Command.CommandBuilder createBuilder() {
 		return Command.builder()
 		  .id(ID)
 		  .nachrichtEventId(NACHRICHT_EVENT_ID)
@@ -48,12 +47,4 @@ public class CommandTestFactory {
 		  .finishedAt(FINISHED_AT_DATE);
 	}
 
-	public static AntragraumproxyGrpcCommand createRestCommand() {
-		var command = new AntragraumproxyGrpcCommand();
-		command.setId(ID);
-		command.setStatus(STATUS);
-		command.setCreatedAt(CREATED_AT);
-		command.setFinishedAt(FINISHED_AT);
-		return command;
-	}
 }
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutException.java b/server/src/test/java/de/ozgcloud/antragsraum/command/GrpcCommandTestFactory.java
old mode 100755
new mode 100644
similarity index 70%
rename from server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutException.java
rename to server/src/test/java/de/ozgcloud/antragsraum/command/GrpcCommandTestFactory.java
index 88db4a8b78b738b2ecddffd6c43a4d703e40ddf1..94d697dc208efbb84e888c3bafe256bacc704462
--- a/server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutException.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/command/GrpcCommandTestFactory.java
@@ -19,13 +19,18 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+package de.ozgcloud.antragsraum.command;
 
-package de.ozgcloud.antragsraum.common;
+import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcCommand;
 
-public class SendTimeoutException extends RuntimeException {
-    private static final String MESSAGE_TEMPLATE = "A timeout sending a nachricht happened. Command %s did not finish in time! Message: %s";
+public class GrpcCommandTestFactory {
+
+	public static AntragraumproxyGrpcCommand create() {
+		return new AntragraumproxyGrpcCommand()
+		  .id(CommandTestFactory.ID)
+		  .status(CommandTestFactory.STATUS)
+		  .createdAt(CommandTestFactory.CREATED_AT)
+		  .finishedAt(CommandTestFactory.FINISHED_AT);
+	}
 
-    public SendTimeoutException(String commandId, Throwable ex) {
-        super(String.format(MESSAGE_TEMPLATE, commandId, ex.getMessage()), ex);
-    }
 }
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/AddressNotFoundExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/AddressNotFoundExceptionTest.java
index 91ea19e6768b7ac0053a1806e8e7a276eef50224..b8c3673735227e6794ed440dcf942720df7f54d0 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/AddressNotFoundExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/AddressNotFoundExceptionTest.java
@@ -29,6 +29,7 @@ import java.util.UUID;
 import org.junit.jupiter.api.Test;
 
 class AddressNotFoundExceptionTest {
+
 	@Test
 	void shouldCreateException() {
 		var id = UUID.randomUUID().toString();
@@ -36,4 +37,5 @@ class AddressNotFoundExceptionTest {
 
 		assertThat(exception.getMessage()).isEqualTo("No NachrichtEvent for id '" + id + "' found");
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/ExceptionControllerTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/ExceptionControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef54f0c33aaa737db155c9d91557b689fcdedd56
--- /dev/null
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/ExceptionControllerTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.antragsraum.common;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.context.request.WebRequest;
+
+@ExtendWith(MockitoExtension.class)
+public class ExceptionControllerTest {
+
+	@InjectMocks
+	private ExceptionController exceptionController;
+
+	@Nested
+	class TestHandleAddressNotFoundException {
+
+		@Mock
+		private AddressNotFoundException exception;
+
+		@Test
+		void shouldReturnMessage() {
+			var message = exceptionController.handleAddressNotFoundException(exception);
+
+			assertThat(message).isNotNull();
+		}
+
+	}
+
+	@Nested
+	class TestHandleNotFoundException {
+
+		@Mock
+		private NotFoundException exception;
+
+		@Test
+		void shouldReturnMessage() {
+			var message = exceptionController.handleNotFoundException(exception);
+
+			assertThat(message).isNotNull();
+		}
+
+	}
+
+	@Nested
+	class TestHandleGeneralException {
+
+		@Mock
+		private TechnicalException exception;
+
+		@Test
+		void shouldReturnMessage() {
+			var message = exceptionController.handleGeneralException(exception);
+
+			assertThat(message).isNotNull();
+		}
+
+	}
+
+	@Nested
+	class TestHandleInvalidFileTypeException {
+
+		@Mock
+		private InvalidFileTypeException exception;
+
+		@Mock
+		private WebRequest webRequest;
+
+		@Test
+		void shouldHaveResponse() {
+			var response = exceptionController.handleInvalidFileTypeException(exception, webRequest);
+
+			assertThat(response).isNotNull();
+		}
+
+		@Test
+		void shouldHaveNotAcceptableError() {
+			var response = exceptionController.handleInvalidFileTypeException(exception, webRequest);
+
+			assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_ACCEPTABLE);
+		}
+
+		@Test
+		void shouldHaveMessage() {
+			var response = exceptionController.handleInvalidFileTypeException(exception, webRequest);
+
+			assertThat(response.getBody()).isEqualTo("File not acceptable");
+		}
+
+	}
+
+	@Nested
+	class TestHandleVirusFoundException {
+
+		@Mock
+		private VirusFoundException exception;
+
+		@Mock
+		private WebRequest webRequest;
+
+		@Test
+		void shouldHaveResponse() {
+			var response = exceptionController.handleVirusFoundException(exception, webRequest);
+
+			assertThat(response).isNotNull();
+		}
+
+		@Test
+		void shouldHaveNotAcceptableError() {
+			var response = exceptionController.handleVirusFoundException(exception, webRequest);
+
+			assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_ACCEPTABLE);
+		}
+
+		@Test
+		void shouldHaveMessage() {
+			var response = exceptionController.handleVirusFoundException(exception, webRequest);
+
+			assertThat(response.getBody()).isEqualTo("Virus found");
+		}
+
+	}
+
+}
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/SendTimeoutExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/InvalidFileTypeExceptionTest.java
old mode 100755
new mode 100644
similarity index 58%
rename from server/src/test/java/de/ozgcloud/antragsraum/common/SendTimeoutExceptionTest.java
rename to server/src/test/java/de/ozgcloud/antragsraum/common/InvalidFileTypeExceptionTest.java
index 214bd6489c4373acab84799313461113b57c2cb2..22080cff4396d21d72d38f5fbb321bf97e872c31
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/SendTimeoutExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/InvalidFileTypeExceptionTest.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -19,21 +19,21 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+
 package de.ozgcloud.antragsraum.common;
 
-import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.*;
 
-import java.util.UUID;
+import org.junit.jupiter.api.Test;
 
-import static org.assertj.core.api.Assertions.*;
+class InvalidFileTypeExceptionTest {
 
-class SendTimeoutExceptionTest {
+	@Test
+	void shouldCreateException() {
+		var fileName = "TestFileName.txt";
+		var exception = new InvalidFileTypeException(fileName);
 
-    @Test
-    void shouldCreateException() {
-        var id = UUID.randomUUID().toString();
-        var exception = new SendTimeoutException(id, new RuntimeException("test"));
+		assertThat(exception.getMessage()).isEqualTo("File '" + fileName + "' has an unsupported file type");
+	}
 
-        assertThat(exception.getMessage()).isEqualTo("A timeout sending a nachricht happened. Command " + id + " did not finish in time! Message: test");
-    }
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/NotAccessibleExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/NotAccessibleExceptionTest.java
index 1c92b68d628b88f86c5b02d2c430d7b2e76298ec..4a12239c858106bf36abb41620d65c6172e3bcee 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/NotAccessibleExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/NotAccessibleExceptionTest.java
@@ -28,6 +28,7 @@ import java.util.UUID;
 import org.junit.jupiter.api.Test;
 
 class NotAccessibleExceptionTest {
+
 	@Test
 	void shouldCreateException() {
 		var rueckfrageId = UUID.randomUUID().toString();
@@ -36,4 +37,5 @@ class NotAccessibleExceptionTest {
 		assertThat(exception.getMessage()).isEqualTo(
 		  "Current user does not have the required trust level for the Rueckfrage with id '" + rueckfrageId + "'.");
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/NotFoundExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/NotFoundExceptionTest.java
index d2837d49881c9e4664d6c488742b7bdc31691ec5..e9d06570fb61c928367a306ab8213e809eb072a5 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/NotFoundExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/NotFoundExceptionTest.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -21,18 +21,20 @@
  */
 package de.ozgcloud.antragsraum.common;
 
-import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.*;
 
 import java.util.UUID;
 
-import static org.assertj.core.api.Assertions.*;
+import org.junit.jupiter.api.Test;
 
 class NotFoundExceptionTest {
-    @Test
-    void shouldCreateException() {
-        var id = UUID.randomUUID().toString();
-        var exception = new NotFoundException(String.class, id);
 
-        assertThat(exception.getMessage()).isEqualTo("Object 'String' with id '" + id + "' not found.");
-    }
+	@Test
+	void shouldCreateException() {
+		var id = UUID.randomUUID().toString();
+		var exception = new NotFoundException(String.class, id);
+
+		assertThat(exception.getMessage()).isEqualTo("Object 'String' with id '" + id + "' not found.");
+	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/RestClientUtilsTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/RestClientUtilsTest.java
index f5aace46e9de92e679393dd642abc16448a8e799..cf2495fb69dde5b67935ef59cb204fd79c9b957b 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/RestClientUtilsTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/RestClientUtilsTest.java
@@ -26,24 +26,19 @@ import static org.assertj.core.api.Assertions.*;
 
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Spy;
-
-import de.ozgcloud.antragsraum.nachricht.NachrichtenRestClient;
 
 class RestClientUtilsTest {
-	@Spy
-	@InjectMocks
-	private NachrichtenRestClient restClient;
 
 	@Nested
 	class TestGrpcAddressSanitizer {
+
 		@Test
 		void shouldSanitizeAddress() {
 			var address = RestClientUtils.sanitizeAddress("static://localhost:9090");
 
 			assertThat(address).isEqualTo("localhost");
 		}
+
 	}
 
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/TechnicalExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/TechnicalExceptionTest.java
index 44ed5387a84695c615d5c30433a08991f3994834..83e4e79c4446bc587ab803f25296e90452cdb3cf 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/TechnicalExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/TechnicalExceptionTest.java
@@ -39,4 +39,5 @@ class TechnicalExceptionTest {
 
 		assertThat(exception.getMessage()).isEqualTo("TechnicalException happened! Message: " + MESSAGE);
 	}
+
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/SecurityExceptionAdviceTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/VirusFoundExceptionTest.java
similarity index 64%
rename from server/src/test/java/de/ozgcloud/antragsraum/common/SecurityExceptionAdviceTest.java
rename to server/src/test/java/de/ozgcloud/antragsraum/common/VirusFoundExceptionTest.java
index 36be2b73108e9f4aa4d2d63fab7967d25e08f033..820a0ee56a095ac79173328e735243335d384cc9 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/SecurityExceptionAdviceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/VirusFoundExceptionTest.java
@@ -1,5 +1,7 @@
 /*
- * Copyright (c) 2024.
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
+ *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
  * Folgeversionen der EUPL ("Lizenz");
@@ -17,23 +19,22 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-
 package de.ozgcloud.antragsraum.common;
 
-import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.*;
 
 import java.util.UUID;
 
-import static org.assertj.core.api.Assertions.*;
+import org.junit.jupiter.api.Test;
 
-class SecurityExceptionAdviceTest {
-    @Test
-    void shouldCreateException() {
-        var message = UUID.randomUUID().toString();
+class VirusFoundExceptionTest {
 
-        var exception = new SecurityException(message, new RuntimeException("test"));
+	@Test
+	void shouldCreateException() {
+		var id = UUID.randomUUID().toString();
+		var exception = new VirusFoundException(id);
 
-        assertThat(exception.getMessage()).isEqualTo(message);
-    }
+		assertThat(exception.getMessage()).isEqualTo("File with nachrichtId '" + id + "' contains virus.");
+	}
 
 }
\ No newline at end of file
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/common/VirusScanExceptionTest.java b/server/src/test/java/de/ozgcloud/antragsraum/common/VirusScanExceptionTest.java
index 340b6336c0b7b29554fbb7630c5f151df077f519..0d5515b02cc1c3d7162ac93a1e5395d72eb4df24 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/common/VirusScanExceptionTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/common/VirusScanExceptionTest.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023-2024.
- * Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ * Copyright (c) 2023-2024.   Das Land Schleswig-Holstein vertreten durch den Ministerpräsidenten
+ * des Landes Schleswig-Holstein Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung.
  *
  * Lizenziert unter der EUPL, Version 1.2 oder - sobald
  * diese von der Europäischen Kommission genehmigt wurden -
@@ -26,6 +26,7 @@ import static org.assertj.core.api.Assertions.*;
 import org.junit.jupiter.api.Test;
 
 class VirusScanExceptionTest {
+
 	@Test
 	void shouldCreateException() {
 		var fileName = "TestFileName.pdf";
@@ -33,4 +34,5 @@ class VirusScanExceptionTest {
 
 		assertThat(exception.getMessage()).isEqualTo("Virus scan for file with name '" + fileName + "' failed.");
 	}
+
 }
\ No newline at end of file