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 33d3d6b5203bbb5d149858450939dc5345a619f0..387b57e63d78e5fe377a49e310fce26848e3ac2a 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRemoteService.java
@@ -35,6 +35,7 @@ import lombok.extern.log4j.Log4j2;
 @RequiredArgsConstructor
 class FileRemoteService {
 	private final @NonNull FileRestClient restClient;
+	private final @NonNull OzgFileMapper ozgFileMapper;
 
 	OzgFile getFile(FileIdentificationData fileIdentificationData, String address) {
 		var grpcFileMetadata = restClient.getFileMetadata(fileIdentificationData, address);
@@ -44,7 +45,7 @@ class FileRemoteService {
 			return null;
 		}
 
-		return OzgFileMapper.fromGrpcFileMetadata(grpcFileMetadata.getFileMetadata(), fileIdentificationData.fileId());
+		return ozgFileMapper.fromGrpcFileMetadata(grpcFileMetadata.getFileMetadata(), fileIdentificationData.fileId());
 	}
 
 	CompletableFuture<String> uploadFile(OzgUploadFile uploadFile, String address) {
diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFileMapper.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFileMapper.java
index f87c6de086bfdfa78da7e0e22a7722d39a965ad6..83c813973c3e5587ee2d07dd1c44319a32e66fce 100644
--- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFileMapper.java
+++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/OzgFileMapper.java
@@ -20,20 +20,18 @@
 
 package de.ozgcloud.antragsraum.attachments;
 
-import java.util.Objects;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 
 import de.ozgcloud.antragsraum.proxy.AntragraumGrpcFileMetadata;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
 
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-class OzgFileMapper {
-	static OzgFile fromGrpcFileMetadata(AntragraumGrpcFileMetadata grpcFile, String fileId) {
-		return OzgFile.builder()
-		  .id(fileId)
-		  .fileName(grpcFile.getName())
-		  .contentType(grpcFile.getContentType())
-		  .fileSize(Objects.nonNull(grpcFile.getSize()) ? Long.parseLong(grpcFile.getSize()) : -1L)
-		  .build();
-	}
+@Mapper
+interface OzgFileMapper {
+
+	@Mapping(target = "id", source = "fileId")
+	@Mapping(target = "fileName", source = "grpcFile.name")
+	@Mapping(target = "contentType", source = "grpcFile.contentType")
+	@Mapping(target = "fileSize", expression = "java(grpcFile.getSize() != null ? Long.parseLong(grpcFile.getSize()) : -1L)")
+	OzgFile fromGrpcFileMetadata(AntragraumGrpcFileMetadata grpcFile, String fileId);
+
 }
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 168acec8f3963de9d93c393c1a626d9cf3a38984..a519703c1c6ee78029865dbf8aecadc4525e50b9 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTest.java
@@ -40,6 +40,8 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import de.ozgcloud.antragsraum.proxy.AntragraumGrpcFileMetadata;
+
 @ExtendWith(MockitoExtension.class)
 class FileRemoteServiceTest {
 	private static final FileIdentificationData FILE_IDENTIFICATION_DATA = FileIdentificationDataTestFactory.create();
@@ -51,12 +53,17 @@ class FileRemoteServiceTest {
 	@Mock
 	private FileRestClient restClient;
 
+	@Mock
+	private OzgFileMapper ozgFileMapper;
+
 	@Nested
 	class TestLoadingFile {
 		@BeforeEach
 		void init() {
 			lenient().when(restClient.getFileMetadata(any(FileIdentificationData.class), anyString())).thenReturn(
 			  AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create());
+			lenient().when(ozgFileMapper.fromGrpcFileMetadata(any(AntragraumGrpcFileMetadata.class), anyString()))
+			  .thenReturn(OzgFileTestFactory.create());
 		}
 
 		@Test
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTestConfiguration.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTestConfiguration.java
index 532bc9f603d52860ceab5392bd79cb7ec5b74c34..abbf945050ddad9e86310c2b1525351c4de070a7 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTestConfiguration.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRemoteServiceTestConfiguration.java
@@ -22,6 +22,7 @@
 
 package de.ozgcloud.antragsraum.attachments;
 
+import org.mapstruct.factory.Mappers;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.web.client.RestTemplateBuilder;
 import org.springframework.context.annotation.Bean;
@@ -42,9 +43,14 @@ public class FileRemoteServiceTestConfiguration {
 		return new StubFileRestClient();
 	}
 
+	@Bean
+	OzgFileMapper ozgFileMapper() {
+		return Mappers.getMapper(OzgFileMapper.class);
+	}
+
 	@Bean
 	FileRemoteService fileRemoteService() {
-		return new FileRemoteService(fileRestClient());
+		return new FileRemoteService(fileRestClient(), ozgFileMapper());
 	}
 
 	@Bean
diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/OzgFileMapperTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/OzgFileMapperTest.java
index 4936c15a25a696658487b4854592ff353c644e99..0bf371ff7788306ad627870860cc620d1de8e438 100644
--- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/OzgFileMapperTest.java
+++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/OzgFileMapperTest.java
@@ -27,40 +27,45 @@ 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.AntragraumGrpcFileMetadata;
 
 class OzgFileMapperTest {
+
+	private final OzgFileMapper mapper = Mappers.getMapper(OzgFileMapper.class);
+
 	@Nested
 	class TestMappingGrpcOzgFile {
 		private final AntragraumGrpcFileMetadata grpcOzgFile = AntragraumGrpcFileMetadataTestFactory.create();
 
 		@Test
 		void shouldHaveFileName() {
-			var file = OzgFileMapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
+			var file = mapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
 
 			assertThat(file.fileName()).isEqualTo(FILE_NAME);
 		}
 
 		@Test
 		void shouldHaveFileSize() {
-			var file = OzgFileMapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
+			var file = mapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
 
 			assertThat(file.fileSize()).isEqualTo(FILE_SIZE);
 		}
 
 		@Test
 		void shouldHaveContentType() {
-			var file = OzgFileMapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
+			var file = mapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
 
 			assertThat(file.contentType()).isEqualTo(CONTENT_TYPE);
 		}
 
 		@Test
 		void shouldHaveFileId() {
-			var file = OzgFileMapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
+			var file = mapper.fromGrpcFileMetadata(grpcOzgFile, FILE_ID);
 
 			assertThat(file.id()).isEqualTo(FILE_ID);
 		}
 	}
+
 }
\ No newline at end of file