From 288bbb79ecb79286ceac57d4b46fe093ae6f977a Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 7 Nov 2024 12:20:28 +0100
Subject: [PATCH] OZG-6949 Refactoring and formatting

---
 .gitignore                                    |   1 +
 .idea/.gitignore                              |   9 --
 .idea/codeStyles/Project.xml                  |  75 ---------
 .idea/codeStyles/codeStyleConfig.xml          |   5 -
 .idea/compiler.xml                            |  39 -----
 .idea/copyright/Eupl1_2.xml                   |   6 -
 .idea/copyright/profiles_settings.xml         |   7 -
 .idea/encodings.xml                           |   7 -
 .idea/gradle.xml                              |   4 -
 .idea/jarRepositories.xml                     |  85 ----------
 .idea/misc.xml                                |  15 --
 .idea/modules.xml                             |  16 --
 .idea/sonarlint.xml                           |   8 -
 .idea/uiDesigner.xml                          | 124 --------------
 .idea/vcs.xml                                 |   6 -
 .../attachments/FileController.java           |   2 +
 .../attachments/FileIdentificationData.java   |   4 +-
 .../attachments/FileProperties.java           |  13 +-
 .../attachments/FileRemoteService.java        |   2 +
 .../attachments/FileRestClient.java           |   2 +
 .../antragsraum/attachments/FileService.java  |   2 +
 .../attachments/FileValidator.java            |   2 +
 .../antragsraum/attachments/OzgFile.java      |   4 +-
 .../attachments/OzgUploadFile.java            |   1 +
 .../attachments/VirusScannerClient.java       |   8 +
 .../ozgcloud/antragsraum/command/Command.java |   4 +-
 .../command/CommandController.java            |   2 +
 .../antragsraum/command/CommandMapper.java    |  42 ++---
 .../antragsraum/command/CommandReference.java |   4 +-
 .../command/CommandRemoteService.java         |   5 +-
 .../command/CommandRestClient.java            |   2 +
 .../antragsraum/command/CommandService.java   |   2 +
 .../common/AddressNotFoundAdvice.java         |  45 ------
 .../common/AddressNotFoundException.java      |  14 +-
 .../common/AttachmentNotFoundAdvice.java      |  45 ------
 .../common/ExceptionController.java           |  77 +++++++++
 .../common/GeneralExceptionAdvice.java        |  45 ------
 .../antragsraum/common/InvalidFileAdvice.java |  44 -----
 .../common/InvalidFileTypeException.java      |  14 +-
 .../common/NotAccessibleException.java        |   2 +
 .../antragsraum/common/NotFoundException.java |  14 +-
 .../antragsraum/common/RestClientUtils.java   |   2 +
 .../antragsraum/common/SendTimeoutAdvice.java |  45 ------
 .../common/TechnicalException.java            |  14 +-
 .../antragsraum/common/VirusFoundAdvice.java  |  44 -----
 .../common/VirusFoundException.java           |  14 +-
 .../common/VirusScanException.java            |   6 +-
 .../logging/RepositoryAspectPointcut.java     |   1 +
 .../logging/RepositoryLoggingAspect.java      |   1 +
 .../security/InMemoryUserDetailService.java   |   2 +
 ...AntragraumproxyGrpcCommandTestFactory.java |   2 +
 .../command/CommandControllerITCase.java      |   6 +-
 .../command/CommandControllerTest.java        |   6 +-
 .../CommandControllerTestConfiguration.java   |   2 +
 .../command/CommandMapperTest.java            |  21 ++-
 .../command/CommandReferenceTestFactory.java  |   2 +
 .../command/CommandRemoteServiceITCase.java   |   4 +
 .../command/CommandRemoteServiceTest.java     |  13 +-
 ...CommandRemoteServiceTestConfiguration.java |   5 +-
 .../command/CommandRestClientTest.java        |   2 +
 .../command/CommandServiceTest.java           |   6 +-
 .../command/CommandTestFactory.java           |  17 +-
 .../command/GrpcCommandTestFactory.java}      |  17 +-
 .../common/AddressNotFoundExceptionTest.java  |   2 +
 .../common/ExceptionControllerTest.java       | 151 ++++++++++++++++++
 ...java => InvalidFileTypeExceptionTest.java} |  24 +--
 .../common/NotAccessibleExceptionTest.java    |   2 +
 .../common/NotFoundExceptionTest.java         |  22 +--
 .../common/RestClientUtilsTest.java           |   9 +-
 .../common/TechnicalExceptionTest.java        |   1 +
 ...Test.java => VirusFoundExceptionTest.java} |  23 +--
 .../common/VirusScanExceptionTest.java        |   6 +-
 72 files changed, 470 insertions(+), 810 deletions(-)
 delete mode 100644 .idea/.gitignore
 delete mode 100644 .idea/codeStyles/Project.xml
 delete mode 100644 .idea/codeStyles/codeStyleConfig.xml
 delete mode 100644 .idea/compiler.xml
 delete mode 100644 .idea/copyright/Eupl1_2.xml
 delete mode 100644 .idea/copyright/profiles_settings.xml
 delete mode 100644 .idea/encodings.xml
 delete mode 100644 .idea/gradle.xml
 delete mode 100644 .idea/jarRepositories.xml
 delete mode 100644 .idea/misc.xml
 delete mode 100644 .idea/modules.xml
 delete mode 100644 .idea/sonarlint.xml
 delete mode 100644 .idea/uiDesigner.xml
 delete mode 100644 .idea/vcs.xml
 delete mode 100644 server/src/main/java/de/ozgcloud/antragsraum/common/AddressNotFoundAdvice.java
 delete mode 100644 server/src/main/java/de/ozgcloud/antragsraum/common/AttachmentNotFoundAdvice.java
 create mode 100644 server/src/main/java/de/ozgcloud/antragsraum/common/ExceptionController.java
 delete mode 100755 server/src/main/java/de/ozgcloud/antragsraum/common/GeneralExceptionAdvice.java
 delete mode 100755 server/src/main/java/de/ozgcloud/antragsraum/common/InvalidFileAdvice.java
 delete mode 100755 server/src/main/java/de/ozgcloud/antragsraum/common/SendTimeoutAdvice.java
 delete mode 100755 server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundAdvice.java
 mode change 100755 => 100644 server/src/main/java/de/ozgcloud/antragsraum/common/VirusFoundException.java
 rename server/src/{main/java/de/ozgcloud/antragsraum/common/SendTimeoutException.java => test/java/de/ozgcloud/antragsraum/command/GrpcCommandTestFactory.java} (70%)
 mode change 100755 => 100644
 create mode 100644 server/src/test/java/de/ozgcloud/antragsraum/common/ExceptionControllerTest.java
 rename server/src/test/java/de/ozgcloud/antragsraum/common/{SendTimeoutExceptionTest.java => InvalidFileTypeExceptionTest.java} (58%)
 mode change 100755 => 100644
 rename server/src/test/java/de/ozgcloud/antragsraum/common/{SecurityExceptionAdviceTest.java => VirusFoundExceptionTest.java} (64%)

diff --git a/.gitignore b/.gitignore
index 14fa51a7..09127ca3 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 b4208d1f..00000000
--- 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 c7b7b708..00000000
--- 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 79ee123c..00000000
--- 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 a0654ae0..00000000
--- 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 8b51bb23..00000000
--- 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 4c899691..00000000
--- 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 0dabbbf7..00000000
--- 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 3e3960b7..00000000
--- 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 2f42e537..00000000
--- 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 290d6c7b..00000000
--- 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 b8776654..00000000
--- 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 0e83d2e6..00000000
--- 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 2b63946d..00000000
--- 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 35eb1ddf..00000000
--- 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 850d16c4..bbe62e43 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 f7a44c19..30522a26 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 1f2a2411..56164c46 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 387b57e6..ecdcdf41 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 9f9eb985..78d53042 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 f1c616ac..300d239e 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 e99a8f75..5b829070 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 8d8a5c65..20faaa5f 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 690a2372..6809d04b 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 4085c550..531c3df8 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 aa534539..c60eb0c7 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 f9d2e37c..d72e5ae4 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 f66378a0..b573e3c4 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 00e112bc..7480d5df 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 51793b97..de5d0ad4 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 8bb9b294..4f217db9 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 999f22bd..f59b2dec 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 600933f2..00000000
--- 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 0d596dbc..20fb9f3e 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 a3064ebf..00000000
--- 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 00000000..d1a6505a
--- /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 57e73744..00000000
--- 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 e24bea7c..00000000
--- 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 ef2d2293..bfab6ca9 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 88398b40..2d974e5a 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 543be5a1..a0cbaf2a 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 c0930e84..b94e1cf8 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 39ee5a62..00000000
--- 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 f3fd6b19..ecb333f0 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 6dc0b12e..00000000
--- 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 6ca6e78d..d5e3887f
--- 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 f130b513..14a0a555 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 47f0bcdd..e0ffdb85 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 efb41906..4a2566af 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 3cf3fb6d..c89d01e0 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 0221cc6c..e0262ceb 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 c098e334..4e35daad 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 4506a65d..ae25cb8b 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 a2d0064a..f3d94094 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 ee9fb45a..7b99cc59 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 1dfbd06d..76e0b6a4 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 18081391..5a3318bf 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 0e015886..1cba2470 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 7287f61a..644d54ff 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 0a99eff1..119ecda8 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 9b92ed59..b4545f1f 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 d76c60e8..b732c1bb 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 88db4a8b..94d697dc
--- 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 91ea19e6..b8c36737 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 00000000..ef54f0c3
--- /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 214bd648..22080cff
--- 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 1c92b68d..4a12239c 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 d2837d49..e9d06570 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 f5aace46..cf2495fb 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 44ed5387..83e4e79c 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 36be2b73..820a0ee5 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 340b6336..0d5515b0 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
-- 
GitLab