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 b6be4cc8dffcfaec3ae6ae806e13fd040a614fba..850d16c480a8d57553c3109da01fc9bd2598d1d3 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileController.java
@@ -68,13 +68,21 @@ public class FileController {
 	  @PathVariable String nachrichtEventId,
 	  @Parameter(description = "The id of the Nachricht the file belongs to", example = "60af924b4f1a2560298b4567") @PathVariable String nachrichtId,
 	  @Parameter(description = "The id of the file", example = "6358fd0bee7a051389cdd788") @PathVariable String fileId) {
-		var ozgFile = getFile(fileId, nachrichtId, nachrichtEventId);
+		var fileIdentificationData = buildFileIdentificationData(fileId, nachrichtId, nachrichtEventId);
 
-		return buildResponseEntity(ozgFile, createDownloadStreamingBody(fileId, nachrichtId, nachrichtEventId));
+		return buildResponseEntity(getFile(fileIdentificationData), createDownloadStreamingBody(fileIdentificationData));
 	}
 
-	OzgFile getFile(String fileId, String nachrichtId, String nachrichtEventId) {
-		return fileService.getFile(fileId, nachrichtId, nachrichtEventId);
+	private FileIdentificationData buildFileIdentificationData(String fileId, String nachrichtId, String nachrichtEventId) {
+		return FileIdentificationData.builder()
+		  .fileId(fileId)
+		  .nachrichtId(nachrichtId)
+		  .nachrichtEventId(nachrichtEventId)
+		  .build();
+	}
+
+	OzgFile getFile(FileIdentificationData fileIdentificationData) {
+		return fileService.getFile(fileIdentificationData);
 	}
 
 	private ResponseEntity<StreamingResponseBody> buildResponseEntity(OzgFile ozgFile, StreamingResponseBody responseBody) {
@@ -89,8 +97,8 @@ public class FileController {
 		}
 	}
 
-	private StreamingResponseBody createDownloadStreamingBody(String fileId, String nachrichtId, String nachrichtEventId) {
-		return out -> fileService.downloadFileContent(fileId, nachrichtId, out, nachrichtEventId);
+	private StreamingResponseBody createDownloadStreamingBody(FileIdentificationData fileIdentificationData) {
+		return out -> fileService.downloadFileContent(fileIdentificationData, out);
 	}
 
 	@Operation(summary = "Upload file content",
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7a44c19cd3a0fae91e5d34ae353929c39b1f5b5
--- /dev/null
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileIdentificationData.java
@@ -0,0 +1,32 @@
+/*
+ * 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.attachments;
+
+import lombok.Builder;
+
+@Builder
+public record FileIdentificationData(
+  String fileId,
+  String nachrichtId,
+  String nachrichtEventId) {
+}
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 0be8ec0ef7a3f8ad8bbf2d88b83298cb733cc79a..33d3d6b5203bbb5d149858450939dc5345a619f0 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
@@ -36,15 +36,15 @@ import lombok.extern.log4j.Log4j2;
 class FileRemoteService {
 	private final @NonNull FileRestClient restClient;
 
-	OzgFile getFile(String fileId, String nachrichtId, String address) {
-		var grpcFileMetadata = restClient.getFileMetadata(fileId, nachrichtId, address);
+	OzgFile getFile(FileIdentificationData fileIdentificationData, String address) {
+		var grpcFileMetadata = restClient.getFileMetadata(fileIdentificationData, address);
 
 		if (Objects.isNull(grpcFileMetadata.getFileMetadata())) {
-			LOG.warn("Received file id {} from {}, but getFileMetadata returned empty ", fileId, address);
+			LOG.warn("Received file id {} from {}, but getFileMetadata returned empty ", fileIdentificationData.fileId(), address);
 			return null;
 		}
 
-		return OzgFileMapper.fromGrpcFileMetadata(grpcFileMetadata.getFileMetadata(), fileId);
+		return OzgFileMapper.fromGrpcFileMetadata(grpcFileMetadata.getFileMetadata(), fileIdentificationData.fileId());
 	}
 
 	CompletableFuture<String> uploadFile(OzgUploadFile uploadFile, String address) {
@@ -54,7 +54,7 @@ class FileRemoteService {
 		return fileIdFuture;
 	}
 
-	void downloadFileContent(String fileId, String nachrichtId, OutputStream out, String address) {
-		restClient.downloadFileContent(fileId, nachrichtId, out, address);
+	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 bd34570bd1f735ff7f4806e0459f82ac937db761..e8ed91f46f1452c83f306e41db00c432b6813e1f 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java
@@ -64,10 +64,10 @@ class FileRestClient {
 		this.restClient = restClient;
 	}
 
-	AntragraumGrpcGetAttachmentMetadataResponse getFileMetadata(String fileId, String nachrichtId, final String address) {
+	AntragraumGrpcGetAttachmentMetadataResponse getFileMetadata(FileIdentificationData fileIdentificationData, final String address) {
 		var request = new AntragraumGrpcGetAttachmentMetadataRequest();
-		request.setFileId(fileId);
-		request.setNachrichtId(nachrichtId);
+		request.setFileId(fileIdentificationData.fileId());
+		request.setNachrichtId(fileIdentificationData.nachrichtId());
 		request.setSamlToken(AuthenticationHelper.getSamlToken());
 
 		return restClient
@@ -108,15 +108,15 @@ class FileRestClient {
 		  .retrieve().toEntity(String.class).getBody();
 	}
 
-	void downloadFileContent(final String fileId, String nachrichtId, final OutputStream out, final String address) {
+	void downloadFileContent(FileIdentificationData fileIdentificationData, final String address, final OutputStream out) {
 		var request = new AntragraumGrpcGetAttachmentContentRequest();
-		request.setFileId(fileId);
-		request.setNachrichtId(nachrichtId);
+		request.setFileId(fileIdentificationData.fileId());
+		request.setNachrichtId(fileIdentificationData.nachrichtId());
 		request.setSamlToken(AuthenticationHelper.getSamlToken());
 
 		var fileContent = Optional.ofNullable(restClient
 		  .post()
-		  .uri(GET_FILE_CONTENT_API, fileId)
+		  .uri(GET_FILE_CONTENT_API, fileIdentificationData.fileId())
 		  .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address))
 		  .contentType(MediaType.APPLICATION_JSON)
 		  .body(request)
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 01090caf460a62a31e54b2192486878bc0045bb6..f1c616aceebd4325dcb2f8c5ff1743e3d5d9b828 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileService.java
@@ -40,16 +40,16 @@ public class FileService {
 	private final @NonNull VirusScannerClient scanner;
 	private final @NonNull NachrichtEventService nachrichtEventService;
 
-	public OzgFile getFile(String fileId, String nachrichtId, String nachrichtEventId) {
-		var nachrichtEvent = nachrichtEventService.getNachrichtEventById(nachrichtEventId);
+	public OzgFile getFile(FileIdentificationData fileIdentificationData) {
+		var nachrichtEvent = nachrichtEventService.getNachrichtEventById(fileIdentificationData.nachrichtEventId());
 
-		return fileRemoteService.getFile(fileId, nachrichtId, nachrichtEvent.address());
+		return fileRemoteService.getFile(fileIdentificationData, nachrichtEvent.address());
 	}
 
-	void downloadFileContent(String fileId, String nachrichtId, OutputStream out, String nachrichtEventId) {
-		var nachrichtEvent = nachrichtEventService.getNachrichtEventById(nachrichtEventId);
+	void downloadFileContent(FileIdentificationData fileIdentificationData, OutputStream out) {
+		var nachrichtEvent = nachrichtEventService.getNachrichtEventById(fileIdentificationData.nachrichtEventId());
 
-		fileRemoteService.downloadFileContent(fileId, nachrichtId, out, nachrichtEvent.address());
+		fileRemoteService.downloadFileContent(fileIdentificationData, nachrichtEvent.address(), out);
 	}
 
 	CompletableFuture<String> upload(String vorgangId, String nachrichtEventId, MultipartFile file) {
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapper.java b/server/src/main/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapper.java
index 0b77a9290332274745ca5ebbfe33c9d7f0611020..325197b8f0da465b9ebb0a40399d705f17c93cdf 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapper.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapper.java
@@ -29,6 +29,7 @@ import java.util.Objects;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.antragsraum.attachments.FileIdentificationData;
 import de.ozgcloud.antragsraum.attachments.FileService;
 import de.ozgcloud.antragsraum.attachments.OzgFile;
 import de.ozgcloud.antragsraum.proxy.AntragraumproxyGrpcRueckfrage;
@@ -48,23 +49,18 @@ class NachrichtMapper {
 			return List.of();
 		}
 
-		return fileIds.stream().filter(StringUtils::isNotEmpty).map(fileId -> fileService.getFile(fileId, nachrichtId, nachrichtEventId))
+		return fileIds.stream().filter(StringUtils::isNotEmpty).map(fileId -> getFile(fileId, nachrichtId, nachrichtEventId))
 		  .filter(Objects::nonNull).toList();
 	}
 
-	long toMillisecondsTimestamp(String dateString) {
-		long timestamp = 0;
-		try {
-			timestamp = LocalDateTime.parse(dateString).toEpochSecond(ZoneOffset.UTC) * 1000;
-		} catch (DateTimeException e) {
-			if (StringUtils.isEmpty(dateString)) {
-				LOG.debug("Empty date received for Nachricht. Setting it to 0 (=1970-01-01)");
-			} else {
-				LOG.warn("Invalid date [{}] received for Nachricht. Setting it to 0 (=1970-01-01)", dateString);
-			}
-		}
+	private OzgFile getFile(String fileId, String nachrichtId, String nachrichtEventId) {
+		var fileIdentificationData = FileIdentificationData.builder()
+		  .fileId(fileId)
+		  .nachrichtId(nachrichtId)
+		  .nachrichtEventId(nachrichtEventId)
+		  .build();
 
-		return timestamp;
+		return fileService.getFile(fileIdentificationData);
 	}
 
 	public Nachricht fromRestRueckfrage(final AntragraumproxyGrpcRueckfrage rueckfrage, final String id) {
@@ -85,6 +81,21 @@ class NachrichtMapper {
 		return builder.build();
 	}
 
+	private long toMillisecondsTimestamp(String dateString) {
+		long timestamp = 0;
+		try {
+			timestamp = LocalDateTime.parse(dateString).toEpochSecond(ZoneOffset.UTC) * 1000;
+		} catch (DateTimeException e) {
+			if (StringUtils.isEmpty(dateString)) {
+				LOG.debug("Empty date received for Nachricht. Setting it to 0 (=1970-01-01)");
+			} else {
+				LOG.warn("Invalid date [{}] received for Nachricht. Setting it to 0 (=1970-01-01)", dateString);
+			}
+		}
+
+		return timestamp;
+	}
+
 	private List<ReplyNachricht> fromRestRueckfrageAnswer(final AntragraumproxyGrpcRueckfrage rueckfrage, final String id) {
 		if (Objects.isNull(rueckfrage.getAnswers())) {
 			return List.of();
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerITCase.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerITCase.java
index 36a897a46fee1c130a0bb025acec99ec59f9be6c..5be8c6bce51110148ce61c128b48762bac4fc825 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerITCase.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerITCase.java
@@ -84,7 +84,7 @@ public class FileControllerITCase {
 	class TestDownloadingFileContent {
 		@BeforeEach
 		void init() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(OzgFileTestFactory.create());
+			when(fileService.getFile(any(FileIdentificationData.class))).thenReturn(OzgFileTestFactory.create());
 		}
 
 		@Test
@@ -98,7 +98,7 @@ public class FileControllerITCase {
 	class TestFileNotFoundError {
 		@BeforeEach
 		void init() {
-			doThrow(NotFoundException.class).when(fileService).getFile(anyString(), anyString(), anyString());
+			doThrow(NotFoundException.class).when(fileService).getFile(any(FileIdentificationData.class));
 		}
 
 		@Test
@@ -113,7 +113,7 @@ public class FileControllerITCase {
 		@Test
 		@WithMockUser
 		void shouldReturn500ByTechnicalException() throws Exception {
-			doThrow(TechnicalException.class).when(fileService).getFile(anyString(), anyString(), anyString());
+			doThrow(TechnicalException.class).when(fileService).getFile(any(FileIdentificationData.class));
 
 			performRequest().andExpect(status().isInternalServerError());
 		}
@@ -121,7 +121,7 @@ public class FileControllerITCase {
 		@Test
 		@WithMockUser
 		void shouldReturn500ByRuntimeException() throws Exception {
-			doThrow(RuntimeException.class).when(fileService).getFile(anyString(), anyString(), anyString());
+			doThrow(RuntimeException.class).when(fileService).getFile(any(FileIdentificationData.class));
 
 			performRequest().andExpect(status().isInternalServerError());
 		}
@@ -131,8 +131,7 @@ public class FileControllerITCase {
 	class TestNotAcceptable {
 		@BeforeEach
 		void init() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(OzgFileTestFactory.create());
-			doThrow(VirusFoundException.class).when(fileService).getFile(anyString(), anyString(), anyString());
+			doThrow(VirusFoundException.class).when(fileService).getFile(any(FileIdentificationData.class));
 		}
 
 		@Test
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerTest.java
index d8cc49b3af99487f8ec66575a3e0201963257056..7fea74c9db5808ae1514c66bd67118290a541748 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileControllerTest.java
@@ -20,10 +20,7 @@
 
 package de.ozgcloud.antragsraum.attachments;
 
-import static de.ozgcloud.antragsraum.attachments.OzgFileTestFactory.NACHRICHT_EVENT_ID;
-import static de.ozgcloud.antragsraum.attachments.OzgFileTestFactory.VORGANG_ID;
 import static de.ozgcloud.antragsraum.attachments.OzgFileTestFactory.*;
-import static de.ozgcloud.antragsraum.nachricht.NachrichtTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
@@ -62,14 +59,14 @@ class FileControllerTest {
 	class TestGetFileContent {
 		@BeforeEach
 		void init() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(OzgFileTestFactory.create());
+			lenient().when(fileService.getFile(any(FileIdentificationData.class))).thenReturn(OzgFileTestFactory.create());
 		}
 
 		@Test
 		void shouldCallGetFile() {
 			fileController.getFileData(Base64.getEncoder().encodeToString(CHANNEL_ADDRESS.getBytes(StandardCharsets.UTF_8)), NACHRICHT_ID, FILE_ID);
 
-			verify(fileService).getFile(anyString(), anyString(), anyString());
+			verify(fileService).getFile(any(FileIdentificationData.class));
 		}
 
 		@Test
@@ -98,7 +95,7 @@ class FileControllerTest {
 
 		@Test
 		void shouldHandleNullFile() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(null);
+			when(fileService.getFile(any(FileIdentificationData.class))).thenReturn(null);
 
 			var response = fileController.getFileData(Base64.getEncoder().encodeToString(CHANNEL_ADDRESS.getBytes(StandardCharsets.UTF_8)),
 			  NACHRICHT_ID, FILE_ID);
@@ -117,11 +114,13 @@ class FileControllerTest {
 
 	@Nested
 	class TestGetFile {
+		private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
+
 		@Test
 		void shouldCallService() {
-			fileController.getFile(FILE_ID, NACHRICHT_ID, REPLY_TO_NACHRICHT_ID);
+			fileController.getFile(FILE_IDENTIFICATION_DATA);
 
-			verify(fileService).getFile(any(), anyString(), anyString());
+			verify(fileService).getFile(FILE_IDENTIFICATION_DATA);
 		}
 	}
 
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileIdentificationDataTestFactory.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileIdentificationDataTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d4266da59ea7d729df11bb46296a071708afb1c
--- /dev/null
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileIdentificationDataTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * 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.attachments;
+
+import static de.ozgcloud.antragsraum.attachments.OzgFileTestFactory.*;
+
+public class FileIdentificationDataTestFactory {
+
+	public static FileIdentificationData create() {
+		return createBuilder().build();
+	}
+
+	public static FileIdentificationData.FileIdentificationDataBuilder createBuilder() {
+		return FileIdentificationData.builder()
+		  .fileId(FILE_ID)
+		  .nachrichtId(NACHRICHT_ID)
+		  .nachrichtEventId(NACHRICHT_EVENT_ID);
+	}
+
+}
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceITCase.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceITCase.java
index 40841b0a6c3fd03a09a040b2e2abb40c1c6a0460..4f8bbbf0b30bda4191a595694ac68b9b090e130b 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceITCase.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceITCase.java
@@ -42,6 +42,7 @@ import lombok.extern.log4j.Log4j2;
 @SpringJUnitConfig(classes = { FileRemoteServiceTestConfiguration.class })
 @Log4j2
 public class FileRemoteServiceITCase {
+	private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
 	private static final String ADDRESS = "http://localhost:8088";
 
 	@SpyBean
@@ -65,10 +66,11 @@ public class FileRemoteServiceITCase {
 
 	@Nested
 	class TestGetFile {
+
 		@Test
 		@DirtiesContext
 		void shouldGetFile() {
-			var file = fileRemoteService.getFile(FILE_ID, NACHRICHT_ID, ADDRESS);
+			var file = fileRemoteService.getFile(FILE_IDENTIFICATION_DATA, ADDRESS);
 
 			assertThat(file).isNotNull();
 		}
@@ -76,7 +78,7 @@ public class FileRemoteServiceITCase {
 		@Test
 		@DirtiesContext
 		void shouldHaveFileMetaData() {
-			var file = fileRemoteService.getFile(FILE_ID, NACHRICHT_ID, ADDRESS);
+			var file = fileRemoteService.getFile(FILE_IDENTIFICATION_DATA, ADDRESS);
 
 			assertThat(file).isEqualTo(OzgFileTestFactory.create());
 		}
@@ -84,11 +86,12 @@ public class FileRemoteServiceITCase {
 
 	@Nested
 	class TestGetFileContent {
+
 		@Test
 		@DirtiesContext
 		void shouldGetFileContent() {
 			var out = new ByteArrayOutputStream();
-			fileRemoteService.downloadFileContent(FILE_ID, NACHRICHT_ID, out, ADDRESS);
+			fileRemoteService.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS, out);
 
 			assertThat(out.size()).isEqualTo(DATA.length);
 		}
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java
index fd42de2b92fd0edd91409713ffb38d4da184af3e..168acec8f3963de9d93c393c1a626d9cf3a38984 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java
@@ -42,6 +42,8 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 @ExtendWith(MockitoExtension.class)
 class FileRemoteServiceTest {
+	private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
+
 	@Spy
 	@InjectMocks
 	private FileRemoteService remoteService;
@@ -53,41 +55,41 @@ class FileRemoteServiceTest {
 	class TestLoadingFile {
 		@BeforeEach
 		void init() {
-			when(restClient.getFileMetadata(anyString(), anyString(), anyString())).thenReturn(
+			lenient().when(restClient.getFileMetadata(any(FileIdentificationData.class), anyString())).thenReturn(
 			  AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create());
 		}
 
 		@Test
 		void shouldLoadFileMetadata() {
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file).isNotNull();
 		}
 
 		@Test
 		void shouldHaveFileName() {
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file.fileName()).isEqualTo(FILE_NAME);
 		}
 
 		@Test
 		void shouldHaveFileSize() {
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file.fileSize()).isEqualTo(FILE_SIZE);
 		}
 
 		@Test
 		void shouldHaveContentType() {
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file.contentType()).isEqualTo(CONTENT_TYPE);
 		}
 
 		@Test
 		void shouldHaveFileId() {
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file.id()).isEqualTo(FILE_ID);
 		}
@@ -96,9 +98,10 @@ class FileRemoteServiceTest {
 		void shouldHandleEmpty() {
 			var response = AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create();
 			response.setFileMetadata(null);
-			when(restClient.getFileMetadata(anyString(), anyString(), anyString())).thenReturn(response);
 
-			var file = remoteService.getFile(FILE_ID, NACHRICHT_ID, CHANNEL_ADDRESS);
+			when(restClient.getFileMetadata(any(FileIdentificationData.class), anyString())).thenReturn(response);
+
+			var file = remoteService.getFile(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS);
 
 			assertThat(file).isNull();
 		}
@@ -110,9 +113,9 @@ class FileRemoteServiceTest {
 
 		@Test
 		void shouldCallDownloadFileObserver() {
-			remoteService.downloadFileContent(FILE_ID, NACHRICHT_ID, output, CHANNEL_ADDRESS);
+			remoteService.downloadFileContent(FILE_IDENTIFICATION_DATA, CHANNEL_ADDRESS, output);
 
-			verify(restClient).downloadFileContent(eq(FILE_ID), eq(NACHRICHT_ID), any(OutputStream.class), eq(CHANNEL_ADDRESS));
+			verify(restClient).downloadFileContent(eq(FILE_IDENTIFICATION_DATA), eq(CHANNEL_ADDRESS), any(OutputStream.class));
 		}
 	}
 
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java
index b345bcc8a091864d5aa67dd053b70f16ed1ca150..a6f5843e01aa3b3700973de84bb574e57ca4ab31 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java
@@ -23,7 +23,6 @@
 package de.ozgcloud.antragsraum.attachments;
 
 import static de.ozgcloud.antragsraum.attachments.FileRestClient.*;
-import static de.ozgcloud.antragsraum.attachments.OzgFileTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
@@ -55,8 +54,9 @@ import de.ozgcloud.antragsraum.security.UserTestFactory;
 @SpringJUnitConfig(classes = { FileRestClientTestConfiguration.class })
 @RestClientTest(FileRestClient.class)
 class FileRestClientTest {
-	final static String ADDRESS = "http://localhost:8382";
-	public static final String FILE_ID = "test";
+	private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
+	static final String ADDRESS = "http://localhost:8382";
+
 	private FileRestClient fileRestClient;
 
 	@Autowired
@@ -92,7 +92,7 @@ class FileRestClientTest {
 			try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) {
 				authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN);
 
-				var fileMetadata = fileRestClient.getFileMetadata(FILE_ID, NACHRICHT_ID, ADDRESS + FIND_FILE_METADATA_API);
+				var fileMetadata = fileRestClient.getFileMetadata(FILE_IDENTIFICATION_DATA, ADDRESS + FIND_FILE_METADATA_API);
 
 				assertThat(fileMetadata).isNotNull();
 			}
@@ -141,7 +141,7 @@ class FileRestClientTest {
 				authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN);
 
 				var out = new ByteArrayOutputStream();
-				fileRestClient.downloadFileContent(FILE_ID, NACHRICHT_ID, out, ADDRESS + GET_FILE_CONTENT_API);
+				fileRestClient.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API, out);
 				var res = out.toByteArray();
 
 				assertThat(res).isEqualTo(OzgUploadFileTestFactory.MULTIPART_FILE.getBytes());
@@ -157,7 +157,7 @@ class FileRestClientTest {
 				doThrow(IOException.class).when(out).write(any(byte[].class), anyInt(), anyInt());
 
 				assertThatExceptionOfType(TechnicalException.class).isThrownBy(
-				  () -> fileRestClient.downloadFileContent(FILE_ID, NACHRICHT_ID, out, ADDRESS + GET_FILE_CONTENT_API));
+				  () -> fileRestClient.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API, out));
 			}
 		}
 	}
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileServiceTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileServiceTest.java
index 8ce6606b1d03a3b2030cb243db09ae4708b604fe..7abb90873e0ec47906f26a79f3b012e3499cb057 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileServiceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileServiceTest.java
@@ -47,6 +47,8 @@ import de.ozgcloud.antragsraum.events.NachrichtEventService;
 import de.ozgcloud.antragsraum.events.NachrichtEventTestFactory;
 
 class FileServiceTest {
+	private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
+
 	@Spy
 	@InjectMocks
 	private FileService fileService;
@@ -111,13 +113,13 @@ class FileServiceTest {
 	class TestLoadingFile {
 		@BeforeEach
 		void init() {
-			when(remoteService.getFile(anyString(), anyString(), anyString())).thenReturn(OzgFileTestFactory.create());
+			when(remoteService.getFile(any(FileIdentificationData.class), anyString())).thenReturn(OzgFileTestFactory.create());
 			when(nachrichtEventService.getNachrichtEventById(NACHRICHT_EVENT_ID)).thenReturn(NachrichtEventTestFactory.createNachrichtEvent());
 		}
 
 		@Test
 		void shouldGetFile() {
-			var file = fileService.getFile(FILE_ID, NACHRICHT_ID, NACHRICHT_EVENT_ID);
+			var file = fileService.getFile(FILE_IDENTIFICATION_DATA);
 
 			assertThat(file).isNotNull();
 		}
@@ -132,9 +134,9 @@ class FileServiceTest {
 
 		@Test
 		void shouldCallRemoteService() {
-			fileService.downloadFileContent(FILE_ID, NACHRICHT_ID, new ByteArrayOutputStream(), NACHRICHT_EVENT_ID);
+			fileService.downloadFileContent(FILE_IDENTIFICATION_DATA, new ByteArrayOutputStream());
 
-			verify(remoteService).downloadFileContent(anyString(), anyString(), any(OutputStream.class), anyString());
+			verify(remoteService).downloadFileContent(any(FileIdentificationData.class), anyString(), any(OutputStream.class));
 		}
 	}
 
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/StubFileRestClient.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/StubFileRestClient.java
index 109d94dc26f374dbec7dd184da3b34f770dea497..46a80b56b36b90c082fbe3948e98668bb4eeb0c4 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/StubFileRestClient.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/StubFileRestClient.java
@@ -35,7 +35,7 @@ class StubFileRestClient extends FileRestClient {
 		super(null);
 	}
 
-	public AntragraumGrpcGetAttachmentMetadataResponse getFileMetadata(String fileId, String nachrichtId, final String address) {
+	public AntragraumGrpcGetAttachmentMetadataResponse getFileMetadata(FileIdentificationData fileIdentificationData, final String address) {
 		return AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create();
 	}
 
@@ -43,7 +43,7 @@ class StubFileRestClient extends FileRestClient {
 		fileIdFuture.complete(FILE_ID);
 	}
 
-	public void downloadFileContent(final String fileId, String nachrichtId, final OutputStream out, final String address) {
+	public void downloadFileContent(FileIdentificationData fileIdentificationData, final String address, final OutputStream out) {
 		try {
 			out.write(OzgUploadFileTestFactory.MULTIPART_FILE.getBytes());
 		} catch (IOException e) {
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapperTest.java b/server/src/test/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapperTest.java
index 610439d21434e6b714244227605e5aec094fd11b..6b8a2aa6499b97fbf63eec72a15540f5dde22739 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapperTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/nachricht/NachrichtMapperTest.java
@@ -35,6 +35,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import de.ozgcloud.antragsraum.attachments.FileIdentificationData;
 import de.ozgcloud.antragsraum.attachments.FileService;
 import de.ozgcloud.antragsraum.attachments.OzgFile;
 import de.ozgcloud.antragsraum.attachments.OzgFileTestFactory;
@@ -64,7 +65,7 @@ class NachrichtMapperTest {
 
 		@BeforeEach
 		void setup() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(OzgFileTestFactory.create());
+			lenient().when(fileService.getFile(any(FileIdentificationData.class))).thenReturn(OzgFileTestFactory.create());
 		}
 
 		@Test
@@ -148,7 +149,7 @@ class NachrichtMapperTest {
 
 		@Test
 		void shouldMapEmptyAttachments() {
-			when(fileService.getFile(anyString(), anyString(), anyString())).thenReturn(null);
+			when(fileService.getFile(any(FileIdentificationData.class))).thenReturn(null);
 
 			var nachricht = mapper.fromRestRueckfrage(AntragraumproxyGrpcRueckfrageTestFactory.createRueckfrage(),
 			  NachrichtTestFactory.NACHRICHT_EVENT_ID);