diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java
index 27d668debea6b1b69e56f327dcdea56493b4515d..44a034a849e5b5a34f20f4a369122aac82cf6d80 100644
--- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java
+++ b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java
@@ -54,8 +54,11 @@ public class FormData {
 	@Builder.Default
 	private Map<String, Object> formData = Collections.emptyMap();
 
+	private int numberOfAttachments;
 	@Singular
 	private List<IncomingFileGroup> attachments;
+
+	private int numberOfRepresentations;
 	@Singular
 	private List<IncomingFile> representations;
 
diff --git a/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java
index b205c7e48052942ce401c52565c628857383977b..8f060cb8fa68e7045e788920dc9d5e6364fed2c1 100644
--- a/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java
+++ b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java
@@ -25,6 +25,7 @@ package de.ozgcloud.eingang.common.zip;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -42,6 +43,7 @@ import java.util.zip.ZipInputStream;
 import org.springframework.util.MimeTypeUtils;
 
 import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
+import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -212,10 +214,27 @@ public class ZipAttachmentReader {
 				.build();
 	}
 
+	@Deprecated
+	public InputStream getSourceZipAsStream() {
+		try {
+			return new DeleteOnCloseInputStream(sourceZipFile);
+		} catch (FileNotFoundException e) {
+			throw new TechnicalException("Original ZIP was deleted", e);
+		}
+	}
+
 	public File getSourceZip() {
 		return sourceZipFile;
 	}
 
+	public long getSourceFileSize() {
+		try {
+			return Files.size(sourceZipFile.toPath());
+		} catch (IOException e) {
+			throw new TechnicalException("Cannot get size of source ZIP.", e);
+		}
+	}
+
 	String getContentType(String name) {
 		Objects.requireNonNull(name);
 		return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE);
diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
index 9dced378f2a744c234a0abc57365ee48f6d5e446..05bdcffff581a6e8ce7e4f56fe5d86cb53054bb0 100644
--- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
+++ b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
@@ -65,11 +65,13 @@ public class FormDataTestFactory {
 						SUBFORM_KEY, SUBFORM_VALUE,
 						NESTED_LIST_WITH_STRINGS_KEY, NESTED_LIST_WITH_STRINGS,
 						NESTED_LIST_WITH_OBJECTS_KEY, NESTED_LIST_WITH_OBJECTS))
+				// TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen
+				.numberOfAttachments(2)
+				// TODO zweites Attachment aus der TestFactory entfernen und die entsprechenden
+				// Tests anpassen
 				.attachments(List.of(IncomingFileGroupTestFactory.create(),
-						IncomingFileGroupTestFactory.createBuilder()
-								.name(ATTACHMENT_GROUP_2)
-								.file(IncomingFileTestFactory.create())
-								.build()))
+						IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build()))
+				.numberOfRepresentations(1)
 				.representations(List.of(IncomingFileTestFactory.create()));
 	}
 
diff --git a/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java
index a8bdbe27d084c75abd689628a79e46350c91766b..8cd2ad76c5b602b4b4e9096211afca5621c8569b 100644
--- a/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java
+++ b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java
@@ -33,7 +33,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.function.Predicate;
-import java.util.stream.Stream;
 import java.util.zip.ZipException;
 import java.util.zip.ZipInputStream;
 
@@ -47,7 +46,6 @@ import org.mockito.Spy;
 import org.springframework.util.MimeTypeUtils;
 
 import de.ozgcloud.common.test.TestUtils;
-import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import lombok.SneakyThrows;
 
@@ -75,11 +73,20 @@ class ZipAttachmentReaderTest {
 
 		@SneakyThrows
 		private void verifySourceFileSavedInTmpDirectory() {
-			try (Stream<Path> paths = Files.find(Path.of(getTmpDirectoryPath()), 1,
-					((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX)))) {
-				List<Path> foundFiles = paths.toList();
-				assertThat(foundFiles).hasSize(1);
-			}
+			List<Path> foundFiles = Files.find(Path.of(getTmpDirectoryPath()), 1,
+					((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX)))
+					.toList();
+			assertThat(foundFiles).hasSize(1).first();
+		}
+
+		@Test
+		@DisplayName("should return readable input stream for source zip file")
+		void shouldReturnSourceStream() {
+			var expectedContent = TestUtils.loadFile(ZIP_1_FILE_NAME);
+
+			var sourceZipAsStream = createZipAttachment(ZIP_1_FILE_NAME).getSourceZipAsStream();
+
+			assertThat(sourceZipAsStream).hasSameContentAs(expectedContent);
 		}
 
 		@Test
@@ -128,7 +135,7 @@ class ZipAttachmentReaderTest {
 			var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME));
 
 			assertThat(attachmentContentList).hasSize(1);
-			var contentEntry = attachmentContentList.getFirst();
+			var contentEntry = attachmentContentList.get(0);
 			assertThat(contentEntry.getName()).isEqualTo(content_file_0_name);
 			assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size);
 			assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name));
@@ -162,7 +169,6 @@ class ZipAttachmentReaderTest {
 			entry.getContentStreamForFinalRead().close();
 		}
 
-		@SneakyThrows
 		@Test
 		@DisplayName("should return readable input stream for source zip if cannot extract content")
 		void shouldReturnSourceStreamByError() {
@@ -171,7 +177,7 @@ class ZipAttachmentReaderTest {
 
 			assertThrows(ReadZipException.class, attachment::readContent);
 
-			assertThat(new DeleteOnCloseInputStream(attachment.getSourceZip())).hasSameContentAs(new ByteArrayInputStream(attachmentContent));
+			assertThat(attachment.getSourceZipAsStream()).hasSameContentAs(new ByteArrayInputStream(attachmentContent));
 		}
 
 		@Test
@@ -204,35 +210,30 @@ class ZipAttachmentReaderTest {
 		private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip";
 
 		@Test
-		@SneakyThrows
 		void shouldFailOnExtremCompressionRatio() {
-			try (var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT)) {
+			var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT);
 
-				ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
+			ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
 
-				assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious");
-			}
+			assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious");
 		}
 
 		@Test
 		@SneakyThrows
 		void shouldFailOnTotalExtractedSize() {
-			try (var zip = loadZip(ZIP_1_FILE_NAME)) {
-				reader.readContent(zip);
+			var zip = loadZip(ZIP_1_FILE_NAME);
+			reader.readContent(zip);
 
-				verify(reader).checkTotalExtractedSize(157);
-			}
+			verify(reader).checkTotalExtractedSize(157);
 		}
 
 		@Test
-		@SneakyThrows
 		void shouldFailOnTotalZipEntries() {
-			try (var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES)) {
+			var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES);
 
-				ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
+			ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
 
-				assertThat(exception.getMessage()).contains("Total entries in zip file exceeded");
-			}
+			assertThat(exception.getMessage()).contains("Total entries in zip file exceeded");
 		}
 	}
 
@@ -299,16 +300,12 @@ class ZipAttachmentReaderTest {
 
 	@SneakyThrows
 	private static void cleanupTempFiles() {
-		try (Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) {
-			paths.filter(hasNameSuffix).map(Path::toFile).forEach(File::delete);
-		}
+		Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete);
 	}
 
 	@SneakyThrows
 	private static boolean noFilesWithSuffixInTempDirectory() {
-		try (Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) {
-			return paths.noneMatch(hasNameSuffix);
-		}
+		return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix);
 	}
 
 	@SneakyThrows
@@ -320,4 +317,4 @@ class ZipAttachmentReaderTest {
 	private static String getTmpDirectoryPath() {
 		return TMP_DIRECTORY_PATH.endsWith("/") ? TMP_DIRECTORY_PATH.substring(0, TMP_DIRECTORY_PATH.length() - 1) : TMP_DIRECTORY_PATH;
 	}
-}
+}
\ No newline at end of file
diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java
index f6467d0f714bdcf4f969fede48c36007b3e8c6ad..20b6563bd1a8f6dd48a55340a4f803b05b9e542d 100644
--- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java
+++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java
@@ -3,31 +3,36 @@ package de.ozgcloud.eingang.enterprise.entry;
 import java.io.IOException;
 import java.time.ZonedDateTime;
 
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.Resource;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.bind.annotation.RestController;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
 import de.ozgcloud.eingang.enterprise.entry.EntryResponse.ResponseVorgang;
 import de.ozgcloud.eingang.semantik.SemantikAdapter;
 
-@RestController
+@Controller
+@ResponseBody
 @RequestMapping("antrag")
-@RequiredArgsConstructor
 public class EntryController {
 
 	private static final String STARTING_STATUS = "NEU";
 
-	private final EntryDataMapper mapper;
-	private final SemantikAdapter semantikAdapter;
-	private final VorgangNummerSupplier vorgangNummerSupplier;
+	@Autowired
+	private EntryDataMapper mapper;
+
+	@Autowired
+	private SemantikAdapter semantikAdapter;
+	@Autowired
+	private VorgangNummerSupplier vorgangNummerSupplier;
 
 	@ResponseStatus(HttpStatus.ACCEPTED)
 	@PostMapping(consumes = "multipart/form-data", produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java
index ddbcefa40b341878ac154216c8d184b58b0b6097..189ebcc7becbb1b9aa524efac4555d25e3fe5198 100644
--- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java
+++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java
@@ -3,7 +3,7 @@ package de.ozgcloud.eingang.enterprise.entry;
 import java.io.IOException;
 import java.io.InputStream;
 
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -11,11 +11,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import de.ozgcloud.eingang.common.formdata.FormData;
 
 @Component
-@RequiredArgsConstructor
 class EntryDataMapper {
 
-	private final ObjectMapper objectMapper;
-	private final FormDataMapper formDataMapper;
+	@Autowired
+	private ObjectMapper objectMapper;
+	@Autowired
+	private FormDataMapper formDataMapper;
 
 	public FormData mapEntryData(InputStream request) {
 		return formDataMapper.mapEntryData(readRequest(request));
@@ -27,7 +28,5 @@ class EntryDataMapper {
 		} catch (IOException e) {
 			throw new ReadingRequestException(e);
 		}
-
 	}
-
 }
diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
index 6f633b2998461a29dcf55bcc1a95c0d87699df74..4ecc509d8213d160b34c0af4e8bfc5c98afebbe3 100644
--- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
+++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
@@ -12,6 +12,7 @@ import org.mapstruct.Mapping;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
+import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier;
 import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
 import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
 import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
@@ -25,8 +26,10 @@ public interface FormDataMapper {
 	@Mapping(target = "antragsteller", ignore = true)
 	@Mapping(target = "attachment", ignore = true)
 	@Mapping(target = "attachments", ignore = true)
+	@Mapping(target = "numberOfAttachments", ignore = true)
 	@Mapping(target = "representation", ignore = true)
 	@Mapping(target = "representations", ignore = true)
+	@Mapping(target = "numberOfRepresentations", ignore = true)
 
 	@Mapping(target = "id", ignore = true)
 	@Mapping(target = "header", source = "control")
@@ -77,12 +80,20 @@ public interface FormDataMapper {
 	}
 
 	default int toNumericType(String type) {
-		return switch (type) {
-			case "privat" -> 0;
-			case "unternehmen" -> 1;
-			case "behoerde" -> 2;
-			default -> -1;
-		};
+		switch (type) {
+		case "privat":
+			return 0;
+		case "unternehmen":
+			return 1;
+		case "behoerde":
+			return 2;
+		default:
+			return -1;
+		}
+	}
+
+	default PostfachAddressIdentifier map(String value) {
+		return StringBasedIdentifier.builder().postfachId(value).build();
 	}
 
 }
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java
index a3367f81967d01537c7862e9594c891c5ac3e2d2..40b324dbdd4cdb25229e037a426cb8f19dd9fd07 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java
@@ -33,9 +33,11 @@ import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper;
 public interface FormCycleFormDataMapper {
 
 	@Mapping(target = "antragsteller", ignore = true)
-	@Mapping(target = "id", ignore = true)
 	@Mapping(target = "attachment", ignore = true)
 	@Mapping(target = "attachments", ignore = true)
+	@Mapping(target = "id", ignore = true)
+	@Mapping(target = "numberOfAttachments", ignore = true)
+	@Mapping(target = "numberOfRepresentations", ignore = true)
 	@Mapping(target = "representation", ignore = true)
 	@Mapping(target = "representations", ignore = true)
 	@Mapping(target = "zustaendigeStelle.organisationseinheitenId", source = "header.organisationsEinheitId")
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
index bc14537b1630250aa8d3be26dc70419f6343563a..06206c9f99a6bc1d9442c5452979f90090faa60a 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java
@@ -32,10 +32,11 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestPart;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
 
 import de.ozgcloud.common.binaryfile.TempFileUtils;
@@ -48,11 +49,13 @@ import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
 import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
 import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
 import de.ozgcloud.eingang.semantik.SemantikAdapter;
+import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-@RestController
+@Controller
+@ResponseBody
 @RequestMapping("formData")
 @RequiredArgsConstructor
 class FormDataController {
@@ -88,7 +91,7 @@ class FormDataController {
 
 	private FormData addRepresentations(Optional<Collection<MultipartFile>> files, FormData mappedFormData) {
 		Collection<IncomingFile> representations = buildIncomingFiles(files);
-		return mappedFormData.toBuilder().representations(representations).build();
+		return mappedFormData.toBuilder().representations(representations).numberOfRepresentations(representations.size()).build();
 	}
 
 	private Collection<IncomingFile> buildIncomingFiles(Optional<Collection<MultipartFile>> files) {
@@ -98,7 +101,7 @@ class FormDataController {
 	private FormData addFiles(FormCycleFormData inFormData, Optional<Collection<MultipartFile>> attachments, FormData mappedFormData) {
 		var groups = new AttachmentGroupsBuilder(inFormData.getAttachmentGroupList(), attachments).buildGroups();
 
-		return mappedFormData.toBuilder().attachments(groups).build();
+		return mappedFormData.toBuilder().attachments(groups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(groups)).build();
 	}
 
 	private IncomingFile buildIncomingFile(MultipartFile multipartFile) {
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
index c1fc281ebae3ea8d44fc70863c021b26450437c2..25a588403ce89dc7c6bfa1cd89a5972f0ef2a458 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java
@@ -89,7 +89,7 @@ class FormDataControllerTest {
 
 		static final String VORGANG_NUMMER = "VorgangNummer";
 
-		private final FormData mappedFormData = FormDataTestFactory.create();
+		private FormData mappedFormData = FormDataTestFactory.create();
 
 		@Captor
 		private ArgumentCaptor<FormData> formDataCaptor;
@@ -168,7 +168,7 @@ class FormDataControllerTest {
 
 			@BeforeEach
 			void init() {
-				var formData = FormDataTestFactory.createBuilder().clearRepresentations().build();
+				var formData = FormDataTestFactory.createBuilder().clearRepresentations().numberOfRepresentations(0).build();
 				when(mapper.toFormData(any())).thenReturn(formData);
 				when(htmlCleaner.clean(any())).thenReturn(formData);
 			}
@@ -180,6 +180,7 @@ class FormDataControllerTest {
 				verify(semantikAdapter).processFormData(formDataCaptor.capture());
 				var formData = formDataCaptor.getValue();
 				assertThat(formData.getRepresentations()).hasSize(1);
+				assertThat(formData.getNumberOfRepresentations()).isEqualTo(1);
 			}
 
 			@Test
@@ -206,7 +207,7 @@ class FormDataControllerTest {
 		class Attachments {
 			@BeforeEach
 			void init() {
-				var formData = FormDataTestFactory.createBuilder().clearAttachments().build();
+				var formData = FormDataTestFactory.createBuilder().clearAttachments().numberOfAttachments(0).build();
 				when(mapper.toFormData(any())).thenReturn(formData);
 				when(htmlCleaner.clean(any())).thenReturn(formData);
 			}
@@ -219,6 +220,14 @@ class FormDataControllerTest {
 				assertThat(formDataCaptor.getValue().getAttachments()).hasSize(1);
 			}
 
+			@Test
+			void shouldSetNumberOfAttachments() {
+				doPostRequest();
+
+				verify(semantikAdapter).processFormData(formDataCaptor.capture());
+				assertThat(formDataCaptor.getValue().getNumberOfAttachments()).isEqualTo(1);
+			}
+
 		}
 
 		@SneakyThrows
@@ -361,6 +370,6 @@ class FormDataControllerTest {
 
 	private String getPostfachIdFormData(FormData formData) {
 		return ((StringBasedIdentifier) formData.getHeader().getServiceKonto().getPostfachAddresses()
-				.getFirst().getIdentifier()).getPostfachId();
+				.get(0).getIdentifier()).getPostfachId();
 	}
 }
diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java b/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java
index 3996c20101b170aa632159011ac7d0647bff898c..1f7577426808fb799db0ff3292ad43898cf652c3 100644
--- a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java
+++ b/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java
@@ -71,12 +71,14 @@ class FormSolutionsRequestMapper {
 				.formData(buildFormDataMap(eingang))
 				.attachments(attachmentMapper.mapAttachments(eingang.getZip()))
 				.representation(buildJsonFile(jsonFile));
+		var numberOfRepresentations = 1;
 
 		if (Objects.nonNull(eingang.getPdf())) {
 			builder.representation(buildPdfFile(eingang.getPdf()));
+			numberOfRepresentations++;
 		}
 
-		return builder.build();
+		return builder.numberOfRepresentations(numberOfRepresentations).build();
 	}
 
 	Map<String, Object> buildFormDataMap(FormSolutionsEingang eingang) {
diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java
index 64673c04c7272bfa49113846bf17bb36e5fe8150..bbae0375f29ff23f9c5b93ffcf0843c16762689c 100644
--- a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java
+++ b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java
@@ -134,21 +134,21 @@ class FormSolutionsRequestMapperTest {
 			void shouldContainPanelIdentifier() {
 				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getPanels(eingang).getFirst()).containsEntry(IDENTIFIER_KEY, PANEL_ID);
+				assertThat(getPanels(eingang).get(0)).containsEntry(IDENTIFIER_KEY, PANEL_ID);
 			}
 
 			@Test
 			void shouldContainPanelComponets() {
 				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getPanels(eingang).getFirst().get(COMPONENTS)).isNotNull();
+				assertThat(getPanels(eingang).get(0).get(COMPONENTS)).isNotNull();
 			}
 
 			@Test
 			void shouldContainTextComponets() {
 				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getComponents(eingang).getFirst())
+				assertThat(getComponents(eingang).get(0))
 						.containsEntry(IDENTIFIER_KEY, COMPONENT_ID)
 						.containsEntry(STRING_VALUE, COMPONENT_VALUE);
 			}
@@ -168,14 +168,14 @@ class FormSolutionsRequestMapperTest {
 				void shouldContainGroup() {
 					var eingang = mapper.mapEingang(nestedComponenetJsonFile);
 
-					assertThat(getComponents(eingang).getFirst()).containsEntry(IDENTIFIER_KEY, OBJEKTGRUPPE_0);
+					assertThat(getComponents(eingang).get(0)).containsEntry(IDENTIFIER_KEY, OBJEKTGRUPPE_0);
 				}
 
 				@Test
 				void shouldContainDateField() {
 					var eingang = mapper.mapEingang(nestedComponenetJsonFile);
 
-					assertThat(getNestedComponents(eingang).getFirst())
+					assertThat(getNestedComponents(eingang).get(0))
 							.containsEntry(IDENTIFIER_KEY, DATE_COMPONENT_ID)
 							.containsEntry(STRING_VALUE, DATE_COMPONENT_VALUE);
 				}
@@ -184,16 +184,12 @@ class FormSolutionsRequestMapperTest {
 
 		@SuppressWarnings("unchecked")
 		private List<Map<String, Object>> getComponents(FormSolutionsEingang eingang) {
-			return (List<Map<String, Object>>) getPanels(eingang).getFirst().get(COMPONENTS);
+			return (List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS);
 		}
 
 		@SuppressWarnings("unchecked")
 		private List<Map<String, Object>> getNestedComponents(FormSolutionsEingang eingang) {
-			return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(eingang)
-					.getFirst()
-					.get(COMPONENTS))
-					.getFirst()
-					.get(COMPONENTS);
+			return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS)).get(0).get(COMPONENTS);
 		}
 
 		@SuppressWarnings("unchecked")
@@ -254,6 +250,13 @@ class FormSolutionsRequestMapperTest {
 
 				assertThat(result.getRepresentations()).hasSize(2);
 			}
+
+			@Test
+			void shouldAddNumberOfRepresentations() {
+				var result = mapper.map(jsonFile);
+
+				assertThat(result.getNumberOfRepresentations()).isEqualTo(2);
+			}
 		}
 
 	}
diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java
index f8bd996761a542c149bef0172315626ddc390984..c562cae01b6d903da745260d7e31f29c9b39fb63 100644
--- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java
+++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java
@@ -42,7 +42,6 @@ import lombok.extern.log4j.Log4j2;
 
 @Endpoint
 @Log4j2
-@RequiredArgsConstructor
 public class IntelliFormEndpoint {
 
 	private static final String NAMESPACE_URI = "http://xmlns.cit.de/intelliform/2009/webservices/backend";
@@ -52,8 +51,11 @@ public class IntelliFormEndpoint {
 	private static final QName _DepositResponse_QNAME = new QName(NAMESPACE_URI, "depositResponse");
 	private static final QName _PrefillResponse_QNAME = new QName(NAMESPACE_URI, "prefillResponse");
 
-	private final IntelliFormMapper intelliFormMapper;
-	private final SemantikAdapter semantikAdapter;
+
+	@Autowired
+	private IntelliFormMapper intelliFormMapper;
+	@Autowired
+	private SemantikAdapter semantikAdapter;
 
 	@PayloadRoot(namespace = NAMESPACE_URI, localPart = "deposit")
 	@ResponsePayload
diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java
index 8ec4b78eb890c52cb73deb7638de95e39dd0dfdd..b073dd971016dbdf7b7930efc27309a1682eb65c 100644
--- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java
+++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java
@@ -65,18 +65,20 @@ class IntelliFormMapper {
 
 		// Find ids of <file> attachments
 		var attachmentFileIds = findAttachmentIds(document);
+		var attachments = attachmentFileIds.stream()
+				.map(id -> getIncomingFileById(id, incomingFileMap))
+				.map(this::createSingularFileGroup)
+				.toList();
+		var representations = getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream()
+				.map(id -> getIncomingFileById(id, incomingFileMap))
+				.toList();
 		return FormData.builder()
 				// Put each <file> attachment in a separate file group
-				.attachments(attachmentFileIds.stream()
-						.map(id -> getIncomingFileById(id, incomingFileMap))
-						.map(this::createSingularFileGroup)
-						.toList()
-				)
+				.attachments(attachments)
+				.numberOfAttachments(attachments.size())
 				// If a deposit attachment is not referenced by <file> it is interpreted as a representation
-				.representations(getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream()
-						.map(id -> getIncomingFileById(id, incomingFileMap))
-						.toList()
-				)
+				.representations(representations)
+				.numberOfRepresentations(representations.size())
 				.build();
 	}
 
diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java
index 6f56380d5accd9f047942a21d6546a2ec9638ead..c394c2b2ee230d008e392252f11067af34032d74 100644
--- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java
+++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java
@@ -106,6 +106,14 @@ class IntelliFormMapperTest {
 						.toList();
 				assertThat(incomingFileIds).contains(PNG_ATTACHMENT_ID);
 			}
+
+			@DisplayName("should return with number of representations")
+			@Test
+			void shouldReturnWithNumberOfRepresentations() {
+				var formData = doMapping();
+
+				assertThat(formData.getNumberOfRepresentations()).isEqualTo(2);
+			}
 		}
 
 		@DisplayName("with empty attachments")
diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java
index 3a2bcc0429d4b71c24bb7eb571e0de5e04c58519..74607f148396fb856dd86a4716f5f67f0d2f4019 100644
--- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java
+++ b/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java
@@ -23,9 +23,8 @@
  */
 package de.ozgcloud.eingang.router;
 
-import java.util.List;
+import java.util.UUID;
 
-import de.ozgcloud.eingang.common.formdata.*;
 import org.mapstruct.CollectionMappingStrategy;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
@@ -33,6 +32,12 @@ import org.mapstruct.NullValueCheckStrategy;
 import org.mapstruct.NullValuePropertyMappingStrategy;
 import org.mapstruct.ReportingPolicy;
 
+import com.google.protobuf.ByteString;
+
+import de.ozgcloud.eingang.common.formdata.Antragsteller;
+import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
+import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
 import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper;
 import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller;
 import de.ozgcloud.vorgang.vorgang.GrpcEingang;
@@ -47,19 +52,17 @@ import de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle;
 		uses = { GrpcFormDataMapper.class, ServiceKontoMapper.class })
 public interface GrpcEingangMapper {
 
-	@Mapping(target = "antragsteller.otherData", source = "antragsteller.data")
-	@Mapping(target = "attachmentsList", source = "attachments")
-	@Mapping(target = "numberOfAttachments", source = "attachments")
-	@Mapping(target = "representationsList", source = "representations")
-	@Mapping(target = "numberOfRepresentations", source = "representations")
+	@Mapping(source = "antragsteller.data", target = "antragsteller.otherData")
+	@Mapping(source = "attachments", target = "attachmentsList")
+	@Mapping(source = "representations", target = "representationsList")
 	GrpcEingang toEingang(FormData formData);
 
-	default int representationsToSize(List<IncomingFile> representations) {
-		return representations.size();
-	}
+	default ByteString byteArrayToByteString(byte[] byteArray) {
+		if (byteArray == null) {
+			return null;
+		}
 
-	default int attachmentsToSize(List<IncomingFileGroup> attachments) {
-		return attachments.stream().mapToInt(group -> group.getFiles().size()).sum();
+		return ByteString.copyFrom(byteArray);
 	}
 
 	@Mapping(source = "files", target = "filesList")
@@ -78,6 +81,10 @@ public interface GrpcEingangMapper {
 
 	GrpcAntragsteller toAntragsteller(Antragsteller antragsteller);
 
+	default String uuidToString(UUID id) {
+		return id.toString();
+	}
+
 	// FIXME map representations and attachments
 	@Mapping(target = "attachment", ignore = true)
 	@Mapping(target = "attachments", ignore = true)
diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java
index d54bdf17b8c848ebb42a79fd5b49b300ee06a96f..4150f6cef6d0574b78c6db89d9b61c068cd620e2 100644
--- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java
+++ b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java
@@ -106,7 +106,7 @@ class GrpcEingangMapperITCase {
 			@Test
 			void validateNumberOfAttachments() {
 
-				assertThat(eingang.getNumberOfAttachments()).isEqualTo(3);
+				assertThat(eingang.getNumberOfAttachments()).isEqualTo(2);
 			}
 
 			@Test
@@ -136,7 +136,7 @@ class GrpcEingangMapperITCase {
 			@Test
 			void validateGroup2AttachmentCount() {
 
-				assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(2);
+				assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1);
 			}
 
 			@Test
diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java
index 207b534c4f44785350f93096e1ab95d4b3ed2e01..b0348cc39fa405d1b7ea467d6d99e2a5ee5db4f0 100644
--- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java
+++ b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java
@@ -125,7 +125,7 @@ class GrpcEingangMapperTest {
 			void validateNumberOfAttachments() {
 				var eingang = toEingang();
 
-				assertThat(eingang.getNumberOfAttachments()).isEqualTo(3);
+				assertThat(eingang.getNumberOfAttachments()).isEqualTo(2);
 			}
 
 			@Test
@@ -139,14 +139,14 @@ class GrpcEingangMapperTest {
 			void validateGroup1AttachmentCount() {
 				var eingang = toEingang();
 
-				assertThat(eingang.getAttachmentsList().getFirst().getFilesCount()).isEqualTo(1);
+				assertThat(eingang.getAttachmentsList().get(0).getFilesCount()).isEqualTo(1);
 			}
 
 			@Test
 			void validateGroup1Attachment() {
 				var eingang = toEingang();
 
-				var attachment = eingang.getAttachmentsList().getFirst().getFilesList().getFirst();
+				var attachment = eingang.getAttachmentsList().get(0).getFilesList().get(0);
 				assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID);
 				assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID);
 				assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME);
@@ -158,7 +158,7 @@ class GrpcEingangMapperTest {
 			void validateGroup2AttachmentCount() {
 				var eingang = toEingang();
 
-				assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(2);
+				assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1);
 			}
 
 			@Test
diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java
index 773d545d6ff2b7dbd78a7b1cfeba77aba9cb8e40..60206de34962325a9a4b66061f7f65617233cec3 100644
--- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java
+++ b/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java
@@ -184,7 +184,7 @@ class VorgangRemoteServiceTest {
 		void shouldCallUploadIncomingFile() {
 			vorgangCreator.uploadAttachments();
 
-			verify(vorgangCreator, times(3)).uploadIncomingFile(any(IncomingFile.class));
+			verify(vorgangCreator, times(2)).uploadIncomingFile(any(IncomingFile.class));
 		}
 
 		@Test
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java
index 26a4131246c635ee14f60858fd85193996172ad4..c42fc60a26aeb1e12dcc51249d086181fe677b96 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java
@@ -26,6 +26,7 @@ package de.ozgcloud.eingang.semantik;
 import java.util.List;
 import java.util.Optional;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
@@ -35,12 +36,14 @@ import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter;
 import lombok.RequiredArgsConstructor;
 
 @Service
-@RequiredArgsConstructor
 public class SemantikAdapter {
 
-	private final List<EngineBasedSemantikAdapter> engineBasedAdapters;
-	private final FormBasedSemantikAdapter formBasedAdapter;
-	private final VorgangService vorgangService;
+	@Autowired
+	private List<EngineBasedSemantikAdapter> engineBasedAdapters;
+	@Autowired
+	private FormBasedSemantikAdapter formBasedAdapter;
+	@Autowired
+	private VorgangService vorgangService;
 
 	public String processFormData(FormData formData) {
 		formData = parseByEngineAdapter(formData);
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java
index 5b74b88e7019d211662de352ad6327e62257fe7a..3e0ccb8a863a59546dd91ba4749b399bc5cfd952 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java
@@ -23,8 +23,10 @@
  */
 package de.ozgcloud.eingang.semantik.enginebased;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
@@ -53,6 +55,10 @@ public class FilesMapperHelper {
 		return getMappedFiles(formData).map(mappedFiles -> (List<IncomingFile>) mappedFiles.get(REPRESENTATIONS));
 	}
 
+	public static int countAttachedFiles(Collection<IncomingFileGroup> fileGroups) {
+		return fileGroups.stream().filter(Objects::nonNull).mapToInt(group -> group.getFiles().size()).sum();
+	}
+
 	public static FormData removeProcessedData(FormData formData) {
 		return FormDataUtils.from(formData).remove(FIELD_NAME_MAPPED_FILES).build();
 	}
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java
index e32e8600f3872923d54bacbbae360bbfa1513522..8f6733cd1d89b68580e8ab128fae413714b87e61 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java
@@ -25,6 +25,7 @@ package de.ozgcloud.eingang.semantik.enginebased.afm;
 
 import java.util.List;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
@@ -34,12 +35,13 @@ import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepre
 import lombok.RequiredArgsConstructor;
 
 @Component
-@RequiredArgsConstructor
 public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter {
 
-	private final IntelliFormRepresentationAdapter intelliFormRepresentationAdapter;
+	@Autowired
+	private IntelliFormRepresentationAdapter intelliFormRepresentationAdapter;
 
-	private final List<AfmEngineBasedMapper> mappers;
+	@Autowired
+	private List<AfmEngineBasedMapper> mappers;
 
 	@Override
 	public FormData parseFormData(FormData formData) {
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java
index 120ea31f036e32490d7a01d4fa8770d47d45305c..f9c67a198432302626fb210f1e87c1901feb9545 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java
@@ -33,8 +33,8 @@ import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper;
 
 interface AfmEngineBasedMapper extends EngineBasedMapper {
 
-	String KOP_CONTROLDATA_NODENAME = "_kopControlData";
-	String CONTROLDATA_METADATA_PROPERTYNAME = "metaData";
+	 String KOP_CONTROLDATA_NODENAME = "_kopControlData";
+	 String CONTROLDATA_METADATA_PROPERTYNAME = "metaData";
 
 	default FormData addControlNode(FormData formData, String nodeName) {
 		var editableFormMap = new LinkedHashMap<>(formData.getFormData());
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java
similarity index 76%
rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java
rename to semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java
index aefaaa9778895bf73c5810d02c8679b74027e0e3..e706d63e31d8161b639826fe9f22b06beeda65d1 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java
@@ -29,17 +29,14 @@ import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
 
 @Component
-class AfmAttachedFilesMapper implements AfmEngineBasedMapper {
+class AfmFileCountMapper implements AfmEngineBasedMapper {
 
 	@Override
 	public FormData parseFormData(FormData formData) {
-		var formDataBuilder = formData.toBuilder();
-		FilesMapperHelper.getAttachedFileGroups(formData)
-				.ifPresent(formDataBuilder::attachments);
-		FilesMapperHelper.getRepresentations(formData)
-				.ifPresent(formDataBuilder::representations);
-
-		return FilesMapperHelper.removeProcessedData(formDataBuilder.build());
+		return formData.toBuilder()
+				.numberOfRepresentations(formData.getRepresentations().size())
+				.numberOfAttachments(FilesMapperHelper.countAttachedFiles(formData.getAttachments()))
+				.build();
 	}
 
-}
\ No newline at end of file
+}
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java
index 8e55983c1dd5ac7ea4395aea3b7a8c52b09c7d03..2984f9a6d257eeae0e1c6e2d361383b37d6a2dbb 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java
@@ -23,21 +23,21 @@
  */
 package de.ozgcloud.eingang.semantik.enginebased.afm;
 
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.Optional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormDataUtils;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.ServiceKonto;
 import de.ozgcloud.eingang.semantik.enginebased.ServiceKontoBuildHelper;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Map;
-import java.util.Optional;
 
 @Component
-@RequiredArgsConstructor
 class AfmHeaderMapper implements AfmEngineBasedMapper {
 
 	static final String AFM_FORMENGINE_NAME = "AFM";
@@ -52,7 +52,8 @@ class AfmHeaderMapper implements AfmEngineBasedMapper {
 	static final String FORM = "t:form";
 	static final String SENDER = "t:sender";
 
-	private final ServiceKontoBuildHelper serviceKontoBuildHelper;
+	@Autowired
+	private ServiceKontoBuildHelper serviceKontoBuildHelper;
 
 	@Override
 	public FormData parseFormData(FormData formData) {
@@ -84,7 +85,7 @@ class AfmHeaderMapper implements AfmEngineBasedMapper {
 
 	Optional<ServiceKonto> createBayernIdServiceKonto(FormData formData) {
 		var postfachId1 = getPostfachId(formData);
-		return postfachId1.map(serviceKontoBuildHelper::buildBayernIdServiceKonto);
+		return postfachId1.map(postfachId -> serviceKontoBuildHelper.buildBayernIdServiceKonto(postfachId));
 	}
 
 	Optional<String> getPostfachId(FormData formData) {
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java
index 9cbca92ba867286c544ce762119201542b7c6d90..1e057c6e81f5c937a429d8050c2c8996742026c9 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java
@@ -29,13 +29,13 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
 
 @Component
-@RequiredArgsConstructor
 class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper {
 
 	public static final String ZUSTAENDIGESTELLE = "zustaendigestelle";
@@ -44,7 +44,8 @@ class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper {
 	public static final String ORGANISATIONSEINHEITEN_ID = "OrganisationseinheitenID";
 	public static final String TAG_BEZEICHNUNG = "OrganisationseinheitenBEZEICHNUNG";
 
-	private final ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper;
+	@Autowired
+	private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper;
 
 	@Override
 	public FormData parseFormData(FormData formData) {
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java
index 26bae7ab72ab5d78a80ecffad59e1a8b143d2d19..36fb9fa6507228103bb71f8c0d2612d39b868c11 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java
@@ -103,7 +103,6 @@ public class IntelliFormRepresentationAdapter {
 						Map.of(
 								HEADER_FIELD, createHeaderMap(document)
 						).entrySet().stream()
-
 				).collect(ORDERED_MAP_ENTRY_COLLECTOR))
 				.build();
 	}
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java
index 28f4773dc71c7f08ccba19c80350149398fea7cf..04d21f1a271da454917f3a580727e31bc3baac98 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java
@@ -3,21 +3,23 @@ package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform;
 import java.util.List;
 import java.util.Map;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+
 import de.ozgcloud.common.errorhandling.TechnicalException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
 
 @Component
-@RequiredArgsConstructor
 class JsonService {
 
 	static final TypeReference<List<Map<String, Object>>> VALUE_TYPE_REF = new TypeReference<List<Map<String, Object>>>() {
 	};
 
-	private final ObjectMapper objectMapper;
+	@Autowired
+	private ObjectMapper objectMapper;
 
 	public List<Map<String, Object>> readAsListMap(String json) {
 		return readValueSafety(json, VALUE_TYPE_REF);
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
index 09024a1f5dee52719697d5fc6d7a425548339bef..1bb43a80e2f70556be226637d2d63ad78de41efe 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
@@ -11,6 +11,7 @@ import java.util.function.Predicate;
 
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
@@ -27,7 +28,6 @@ import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 @Component
-@RequiredArgsConstructor
 public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSemantikAdapter {
 
 	private static final String FACHNACHRICHT_SUFFIX = "Fachnachricht.xml";
@@ -37,7 +37,8 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	private static final String KEY_POSTFACH_ID = "InboxReference";
 	private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1";
 
-	private final ServiceKontoBuildHelper serviceKontoHelper;
+	@Autowired
+	private ServiceKontoBuildHelper serviceKontoHelper;
 
 	@Override
 	public FormData parseFormData(FormData formData) {
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
index 2258394fac564f349a94b229fa8b610e631a168e..d63b1e4f5a502a5efce7f280b107422e0ee83a64 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
@@ -54,7 +54,7 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper {
 		if (attachments.isEmpty()) {
 			return formDataBuilder.build();
 		}
-		return formDataBuilder.attachments(attachments).build();
+		return formDataBuilder.attachments(attachments).numberOfAttachments(FilesMapperHelper.countAttachedFiles(attachments)).build();
 	}
 
 	List<IncomingFileGroup> readAttachments(FormData srcFormData) {
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java
index e0b943c707fe2346ccc383406a2ac8db6425be13..d6e7196a5e2e471cebf54f5891fd5de2f91405ae 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java
@@ -13,9 +13,11 @@ import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
 @Component
 @RequiredArgsConstructor
+@Log4j2
 public class MantelantragFormBasedMapper implements FormBasedMapper {
 
 	private final Environment environment;
@@ -42,6 +44,15 @@ public class MantelantragFormBasedMapper implements FormBasedMapper {
 
 	@Override
 	public FormData adaptFormData(FormData formData) {
+		try {
+			return adaptFormDataWithPossibleException(formData);
+		} catch (TechnicalException exception) {
+			LOG.warn("Mantelantrag is invalid: %s".formatted(exception.getMessage()));
+			return formData;
+		}
+	}
+
+	FormData adaptFormDataWithPossibleException(FormData formData) {
 		var fieldMap = formData.getFormData();
 		var slotIndex = findSlotIndex(fieldMap);
 		UnaryOperator<String> getValueOrEmpty = field -> getFieldByKeyOrEmpty(
@@ -51,7 +62,7 @@ public class MantelantragFormBasedMapper implements FormBasedMapper {
 		var organisationseinheitId = getValueOrEmpty.apply(ORGANISATIONSEINHEIT_ID_FIELD);
 
 		if (organisationseinheitId.isBlank()) {
-			throw new TechnicalException("OrganistaionseinheitId not found in Mantelantrag!");
+			throw new TechnicalException("OrganistaionseinheitId not found!");
 		}
 
 		return formData.toBuilder()
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java
index 19a6f7ef707aaaeac2a5f7044ed3d4bf852e63ba..cfbf8d3481cd4679412ceceb84f886152467c30a 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java
@@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
+import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
 
@@ -84,7 +85,7 @@ class FilesMapperHelperTest {
 		}
 
 		@Test
-		void shouldReturnRepresentations() {
+		void souldReturnRepresentations() {
 			var incomingFileGroups = List.of(IncomingFileTestFactory.create());
 			Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES,
 					Map.of(FilesMapperHelper.REPRESENTATIONS, incomingFileGroups));
@@ -104,6 +105,48 @@ class FilesMapperHelperTest {
 		}
 	}
 
+	@Nested
+	class TestAttachmentCount {
+
+		@Test
+		void shouldCountEmptyList() {
+			var counter = FilesMapperHelper.countAttachedFiles(List.of());
+
+			assertThat(counter).isZero();
+		}
+
+		@Test
+		void shouldCountNoAttachedFiles() {
+			var counter = FilesMapperHelper.countAttachedFiles(List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles().build()));
+
+			assertThat(counter).isZero();
+		}
+
+		@Test
+		void shouldCountOneAttachment() {
+			var fileGroup = List.of(IncomingFileGroupTestFactory.createBuilder().file(IncomingFileTestFactory.create()).build());
+
+			var counter = FilesMapperHelper.countAttachedFiles(fileGroup);
+
+			assertThat(counter).isEqualTo(2);
+		}
+
+		@Test
+		void shouldCountAllAttachments() {
+			var counter = FilesMapperHelper.countAttachedFiles(createFileGroupsWith4Files());
+
+			assertThat(counter).isEqualTo(4);
+		}
+
+		private static List<IncomingFileGroup> createFileGroupsWith4Files() {
+			return List.of(IncomingFileGroupTestFactory.createBuilder()
+					.clearFiles()
+					.files(List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create(), IncomingFileTestFactory.create())).build(),
+					IncomingFileGroupTestFactory.create());
+
+		}
+	}
+
 	@Nested
 	class TestRemoveProcessedData {
 
@@ -130,7 +173,9 @@ class FilesMapperHelperTest {
 			assertThat(cleanedFormData.getHeader()).isEqualTo(formData.getHeader());
 			assertThat(cleanedFormData.getZustaendigeStelle()).isEqualTo(formData.getZustaendigeStelle());
 			assertThat(cleanedFormData.getAntragsteller()).isEqualTo(formData.getAntragsteller());
+			assertThat(cleanedFormData.getNumberOfAttachments()).isEqualTo(formData.getNumberOfAttachments());
 			assertThat(cleanedFormData.getAttachments()).isEqualTo(formData.getAttachments());
+			assertThat(cleanedFormData.getNumberOfRepresentations()).isEqualTo(formData.getNumberOfRepresentations());
 			assertThat(cleanedFormData.getRepresentations()).isEqualTo(formData.getRepresentations());
 			assertThat(cleanedFormData.getFormData()).containsAllEntriesOf(formData.getFormData());
 		}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java
deleted file mode 100644
index 1c3db207fb4c46607d68cfd242c98bc0f68b61f3..0000000000000000000000000000000000000000
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package de.ozgcloud.eingang.semantik.enginebased.afm;
-
-import static de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory.*;
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.xml.sax.SAXException;
-
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.IncomingFile;
-import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
-
-class AfmEngineBasedMapperTest {
-	/*
-	@Nested
-	class TestMapFormData {
-
-		private final Deposit deposit = DepositTestFactory.create();
-
-		@Test
-		void shouldMapIdField() throws SAXException, IOException, ParserConfigurationException {
-			var formData = mapToFormData(deposit);
-
-			assertThat(formData.getId()).isNotNull();
-		}
-
-		@Test
-		void shouldRemoveFileReferences() {
-			Map<String, Object> formDataMap = new HashMap<>(Map.of(FILE_REF1, Map.of(IntelliFormMapper.FILE, Map.of(ID, VENDOR_ID_XXX))));
-
-			mapper.removeMappedFileReferences(FILE_GROUPS, formDataMap);
-
-			assertThat(formDataMap).doesNotContainKey(FILE_REF1);
-		}
-
-		@Nested
-		class TestMapDepositRepresentations {
-
-			@Test
-			void shouldMap() throws SAXException, IOException, ParserConfigurationException {
-				var formData = mapToFormData(deposit);
-
-				assertThat(getRepresentations(formData)).hasSize(2);
-			}
-
-			@Test
-			void shouldContainsXmlData() {
-				var formData = mapToFormData(deposit);
-
-				var xmlRepresentation = getRepresentations(formData).stream()
-						.filter(xml -> xml.getContentType().equals(AttachmentTestFactory.XML_CONTENT_TYPE)).findFirst();
-				assertThat(xmlRepresentation).isPresent();
-			}
-
-			@Test
-			void shouldContainsPdfData() {
-				var formData = mapToFormData(deposit);
-
-				var pdfRepresentation = getRepresentations(formData).stream()
-						.filter(pdf -> pdf.getContentType().equals(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE)).findFirst();
-				assertThat(pdfRepresentation).isPresent();
-			}
-
-			@Test
-			void shouldContainsPdfAttributes() {
-				var formData = mapToFormData(deposit);
-
-				var pdfAttachment = getRepresentations(formData).stream()
-						.filter(pdf -> pdf.getContentType().equals(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE)).findFirst();
-
-				assertThat(pdfAttachment).isPresent();
-				assertThat(pdfAttachment.get().getContentType()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE);
-				assertThat(pdfAttachment.get().getVendorId()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_ID);
-				assertThat(pdfAttachment.get().getName()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_NAME);
-				assertThat(pdfAttachment.get().getContentStream()).hasBinaryContent(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT);
-			}
-
-			@SuppressWarnings("unchecked")
-			private List<IncomingFile> getRepresentations(FormData formData) {
-				return (List<IncomingFile>) ((Map<String, Object>) formData.getFormData().get(FilesMapperHelper.FIELD_NAME_MAPPED_FILES))
-						.get(FilesMapperHelper.REPRESENTATIONS);
-			}
-		}
-
-		@Nested
-		class TestMapHeader {
-
-			@Test
-			void shouldMapHeader() {
-				var formData = mapToFormData(deposit);
-
-				var formHeader = getHeader(formData);
-				assertThat(formHeader)
-						.containsEntry(AfmEngineBasedMapper.HEADER_ID, "20201118365670866101")
-						.containsEntry(AfmEngineBasedMapper.HEADER_TIMESTAMP, "2020-11-18T09:09:27.627Z")
-						.containsEntry(AfmEngineBasedMapper.HEADER_FORM_ID, "waffen/kleinerWaffenschein")
-						.containsEntry(AfmEngineBasedMapper.HEADER_FORM, "Kleiner Waffenschein gem. ยง 10 Abs. 4 Satz 4 Waffengesetz (WaffG)")
-						.containsEntry(AfmEngineBasedMapper.HEADER_SENDER, "afm.schleswig-holstein.de")
-						.containsEntry(AfmEngineBasedMapper.HEADER_CUSTOMER, "Einheitlicher Ansprechpartner")
-						.containsEntry(AfmEngineBasedMapper.HEADER_CUSTOMER_ID, "ea-sh")
-						.containsEntry(AfmEngineBasedMapper.HEADER_CLIENT, "Schleswig-Holstein")
-						.containsEntry(AfmEngineBasedMapper.HEADER_CLIENT_ID, "land");
-			}
-
-			@Test
-			void shouldAddBayernHeader() {
-				Map<String, Object> bayernHeader = Map.of(CustomHeaderReader.HEADER_POSTFACH_ID, CustomHeaderTestFactory.POSTFACH_ID);
-				when(customHeaderReader.getHeader(any())).thenReturn(bayernHeader);
-
-				var formData = mapToFormData(deposit);
-
-				verify(customHeaderReader).getHeader(any());
-				assertThat(getHeader(formData)).containsEntry(CustomHeaderReader.HEADER_POSTFACH_ID, CustomHeaderTestFactory.POSTFACH_ID);
-			}
-
-			@SuppressWarnings("unchecked")
-			private Map<String, Object> getHeader(FormData formData) {
-				return (Map<String, Object>) formData.getFormData().get(IntelliFormMapper.HEADER_FIELD);
-			}
-		}
-
-		private FormData mapToFormData(Deposit deposit) {
-			return mapper.mapToFormData(deposit);
-		}
-	}
-	*/
-}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java
similarity index 81%
rename from semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java
rename to semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java
index 8da61c1b9b45fc394f7b679db1072f067fb7195e..7c63ef8ed048579653880f4ef7904f0b97d9554a 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java
@@ -26,25 +26,23 @@ package de.ozgcloud.eingang.semantik.enginebased.afm;
 import static org.assertj.core.api.Assertions.*;
 
 import java.util.List;
-import java.util.Map;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
-import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
 
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
 
-class AfmAttachedFilesMapperTest {
+class AfmFileCountMapperTest {
 
 	@Spy
 	@InjectMocks
-	private AfmAttachedFilesMapper mapper;
+	private AfmFileCountMapper mapper;
 
 	private final IncomingFileGroup attachmentWithMultipleFiles = IncomingFileGroupTestFactory.createBuilder()
 			.name("anotherAttachment")
@@ -54,15 +52,14 @@ class AfmAttachedFilesMapperTest {
 
 	private final FormData formData = FormDataTestFactory.createBuilder()
 			.clearAttachments()
-			.formData(Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES,
-					Map.of(FilesMapperHelper.ATTACHMENTS, List.of(IncomingFileGroupTestFactory.create(), attachmentWithMultipleFiles))))
+			.attachments(List.of(IncomingFileGroupTestFactory.create(), attachmentWithMultipleFiles))
 			.build();
 
 	@Nested
 	class TestParseFormData {
 
 		@Test
-		void shouldMapAttachments() {
+		void shouldKeepAttachments() {
 			var parsedFormData = parseFormData();
 
 			assertThat(parsedFormData.getAttachments()).hasSize(2);
@@ -71,21 +68,28 @@ class AfmAttachedFilesMapperTest {
 		}
 
 		@Test
-		void shouldMapRepresentations() {
+		void shouldSetNumberOfAttachments() {
+			var parsedFormData = parseFormData();
+
+			assertThat(parsedFormData.getNumberOfAttachments()).isEqualTo(3);
+		}
+
+		@Test
+		void shouldKeepRepresentations() {
 			var parsedFormData = parseFormData();
 
 			assertThat(parsedFormData.getRepresentations()).hasSize(1);
 		}
 
 		@Test
-		void shouldRemoveFilesFromMap() {
+		void shouldSetNumberOfRepresentations() {
 			var parsedFormData = parseFormData();
 
-			assertThat(parsedFormData.getFormData().get(FilesMapperHelper.FIELD_NAME_MAPPED_FILES)).isNull();
+			assertThat(parsedFormData.getNumberOfRepresentations()).isEqualTo(1);
 		}
 
 		private FormData parseFormData() {
 			return mapper.parseFormData(formData);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java
index f548a7ca2f7390a43bc3af5791a0c8fb4c792191..47c563508627226dac6341fe8d6e4b36f9062b70 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java
@@ -35,6 +35,7 @@ import java.util.Optional;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.SpyBean;
 import org.springframework.test.context.ActiveProfiles;
 
@@ -49,6 +50,7 @@ import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory;
 import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
+import de.ozgcloud.eingang.semantik.SemantikAdapter;
 import lombok.SneakyThrows;
 
 @SpringBootTest
@@ -58,15 +60,18 @@ public class FormSolutionsEngineBasedAdapterITCase {
 	private static final String ZIP_CONTENT_TYPE = "application/zip";
 	private static final String FILE_NAME_ZIP_ATTACHMENT = "formsolutions/attachment-2files.zip";
 
+	@MockBean
+	private SemantikAdapter semantikAdapter;
+
 	@SpyBean
 	private FormSolutionsEngineBasedAdapter engineAdapter;
 
-	private final ObjectMapper objectMapper = new ObjectMapper();
+	private ObjectMapper objectMapper = new ObjectMapper();
 
 	@Nested
 	class TestEngineBasedAdapter {
 
-		private final FormData formData = prepareTestData();
+		private FormData formData = prepareTestData();
 
 		@Test
 		void shouldMap() {
@@ -126,9 +131,8 @@ public class FormSolutionsEngineBasedAdapterITCase {
 			void shouldMapAttachment() {
 				var data = engineAdapter.parseFormData(formData);
 
-				assertThat(data.getAttachments()).hasSize(1);
-				assertThat(data.getAttachments().getFirst()).isNotNull();
-				assertThat(data.getAttachments().getFirst().getFiles()).hasSize(2);
+				assertThat(data.getAttachments().get(0)).isNotNull();
+				assertThat(data.getNumberOfAttachments()).isEqualTo(2);
 			}
 		}
 
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java
index 744115a5843d2b8e2b4bcb3b66c959b5fad093be..8c019e946e13b43882cbcda8d41f599cbe5d7d18 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java
@@ -76,6 +76,37 @@ class MantelantragFormBasedMapperTest {
 	@Nested
 	class TestAdaptFormData {
 
+		@Mock
+		private FormData formData;
+
+		@Mock
+		private FormData formData2;
+
+		@DisplayName("should return adapted value")
+		@Test
+		void shouldReturnAdaptedValue() {
+			doReturn(formData2).when(mapper).adaptFormDataWithPossibleException(formData);
+
+			var resultFormData = mapper.adaptFormData(formData);
+
+			assertThat(resultFormData).isEqualTo(formData2);
+		}
+
+		@DisplayName("should return original value with exception")
+		@Test
+		void shouldReturnOriginalValueWithException() {
+			doThrow(new TechnicalException("some error")).when(mapper).adaptFormDataWithPossibleException(formData);
+
+			var resultFormData = mapper.adaptFormData(formData);
+
+			assertThat(resultFormData).isEqualTo(formData);
+		}
+	}
+
+	@DisplayName("adapt form data with possible exception")
+	@Nested
+	class TestAdaptFormDataWithPossibleException {
+
 		private FormData formData;
 
 		private Map<String, Object> fieldMap;
@@ -208,7 +239,7 @@ class MantelantragFormBasedMapperTest {
 		}
 
 		private ZustaendigeStelle getAdaptedZustaendigeStelle() {
-			var formDataResult = mapper.adaptFormData(formData);
+			var formDataResult = mapper.adaptFormDataWithPossibleException(formData);
 			return formDataResult.getZustaendigeStelle();
 		}
 
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java
index 9f9f2f93c60d21fe2faa903601e1db37dd4206d4..e6d9f6836b5ef0d26087356de2545d512683b863 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java
@@ -25,37 +25,54 @@ public class XdomeaMessageDataMapper {
 
 	public XdomeaMessageData mapIncomingFilesToXdomeaMessageData(List<IncomingFile> incomingFileList) {
 		var xdomeaXMLFile = findXdomeaXMLFile(incomingFileList);
-
 		var representationFileNames = valueReader.readRepresentationFileNames(xdomeaXMLFile);
+		var attachmentFileNames = getFileNamesExcluding(
+				incomingFileList,
+				Stream.concat(Stream.of(xdomeaXMLFile.getName()), representationFileNames.stream())
+		);
 
-		var fileNameToFileMap = incomingFileList.stream()
-				.collect(Collectors.toMap(IncomingFile::getName, file -> file));
+		var fileNameToFileMap = createFileNameToIncomingFileMap(incomingFileList);
 		return XdomeaMessageData.builder()
 				.metadataFile(xdomeaXMLFile)
-				// Representations are incoming files which are referenced in the xdomea-xml in 'Dateiname' elements
-				.representations(getFilesByName(
-								movePrimaryRepresentationFileNameToFirstPosition(representationFileNames),
-								fileNameToFileMap
-						)
-				)
-				// Attachments are all incoming files which are neither the xdomea-xml nor representations
-				.attachments(Stream.of(IncomingFileGroup.builder()
-								.name(ATTACHMENT_GROUP_NAME)
-								.files(getFilesByName(
-										dropNames(
-												incomingFileList.stream().map(IncomingFile::getName),
-												Stream.concat(Stream.of(xdomeaXMLFile.getName()), representationFileNames.stream())
-														.collect(Collectors.toSet())
-										),
-										fileNameToFileMap))
-								.build())
-						// Do not include empty attachment group
-						.filter(group -> !group.getFiles().isEmpty())
-						.toList()
-				)
+				.representations(getRepresentations(representationFileNames, fileNameToFileMap))
+				.attachments(getAttachments(attachmentFileNames, fileNameToFileMap))
 				.build();
 	}
 
+	private Map<String, IncomingFile> createFileNameToIncomingFileMap(List<IncomingFile> incomingFileList) {
+		return incomingFileList.stream()
+				.collect(Collectors.toMap(IncomingFile::getName, file -> file));
+	}
+
+	private Stream<String> getFileNamesExcluding(List<IncomingFile> incomingFileList, Stream<String> excludedFileNames) {
+		return dropNames(
+				incomingFileList.stream().map(IncomingFile::getName),
+				excludedFileNames.collect(Collectors.toSet())
+		);
+	}
+
+	private List<IncomingFile> getRepresentations(List<String> representationFileNames, Map<String, IncomingFile> fileNameToFileMap) {
+		return getFilesByName(
+				movePrimaryRepresentationFileNameToFirstPosition(representationFileNames),
+				fileNameToFileMap
+		);
+	}
+
+	private List<IncomingFileGroup> getAttachments(Stream<String> attachmentFileNames, Map<String, IncomingFile> fileNameToFileMap) {
+		return Stream.of(IncomingFileGroup.builder()
+						.name(ATTACHMENT_GROUP_NAME)
+						.files(
+								getFilesByName(
+										attachmentFileNames,
+										fileNameToFileMap
+								)
+						)
+						.build())
+				// Do not include empty attachment group
+				.filter(group -> !group.getFiles().isEmpty())
+				.toList();
+	}
+
 	private Stream<String> movePrimaryRepresentationFileNameToFirstPosition(List<String> representationFileNames) {
 		var primaryRepresentationFileName = findPrimaryRepresentationName(representationFileNames);
 		return Stream.concat(
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java
index 5f4d60a4dc45a9c31a88a95c7fbc37c9c7eb6068..f0fc982a33fc939726023ff751d36873e811b105 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java
@@ -25,13 +25,6 @@ public class XdomeaXMLValueReader {
 	private static final String DATEINAME_NODE_QUERY_STRING = "//Hauptobjekt//Dateiname";
 	private static final XPathExpression DATEINAME_NODE_QUERY = compileXPathExpression(DATEINAME_NODE_QUERY_STRING);
 
-	/**
-	 * Find all 'Dateiname' elements in the 'Hauptobjekt' element.
-	 * <h4>Struktur</h4> Geschaeftsgang.Geschaeftsgang.0201 > Hauptobjekt > Dokument > Version > Format > Primaerdokument > Dateiname
-	 *
-	 * @param xdomeaXMLFile the xml incoming file of a xdomea Geschaeftsvorgang.Geschaeftsvorgang.0201
-	 * @return list of file names which represent the primary document
-	 */
 	public List<String> readRepresentationFileNames(IncomingFile xdomeaXMLFile) {
 		return getTextsFromNodes(
 				queryDateinameNodeList(
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java
index 6f936847d3c5f66dfd55c05b35cf9062d725a44c..a685b0a20bfc5a93b90dcd606cebb2dea31e8187 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.eingang.xta;
 
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.ws.client.WebServiceClientException;
 import org.springframework.ws.client.support.interceptor.ClientInterceptor;
@@ -8,6 +8,7 @@ import org.springframework.ws.context.MessageContext;
 import org.springframework.ws.soap.SoapMessage;
 
 import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
+import eu.osci.ws._2014._10.transport.OriginatorsType;
 import eu.osci.ws._2014._10.transport.PartyIdentifierType;
 import eu.osci.ws._2014._10.transport.PartyType;
 import jakarta.validation.Valid;
@@ -16,11 +17,11 @@ import jakarta.xml.bind.JAXBElement;
 import jakarta.xml.bind.JAXBException;
 
 @Component
-@RequiredArgsConstructor
 class WsHeaderAddingInterceptor implements ClientInterceptor {
 
+	@Autowired
 	@Valid
-	private final XtaProperties properties;
+	private XtaProperties properties;
 
 	@Override
 	public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
@@ -46,6 +47,9 @@ class WsHeaderAddingInterceptor implements ClientInterceptor {
 		identifier.setValue(properties.getIdentifier());
 		partyType.setIdentifier(identifier);
 
+		var origin = new OriginatorsType();
+		origin.setAuthor(partyType);
+
 		return objectFactory.createAuthor(partyType);
 	}
 
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
index 79cfdc3eefff7301f9f4daff34e7603f861710e6..af561ff948a92bee781a4745cd9b98af4ece0c8e 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
@@ -11,9 +11,10 @@ import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
+import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
 import de.ozgcloud.eingang.xdomea.XdomeaMessageData;
 
-@Mapper
+@Mapper(imports = FilesMapperHelper.class)
 interface XtaMessageMapper {
 	int VORGANG_NUMMER_SUFFIX_LENGTH = 4;
 
@@ -22,6 +23,8 @@ interface XtaMessageMapper {
 	@Mapping(target = "id", ignore = true)
 	@Mapping(target = "zustaendigeStelle", ignore = true)
 	@Mapping(target = "header", source = "metaData")
+	@Mapping(target = "numberOfAttachments", expression = "java(FilesMapperHelper.countAttachedFiles(xdomeaMessageData.attachments()))")
+	@Mapping(target = "numberOfRepresentations", dependsOn = "representations", expression = "java(getRepresentations(xdomeaMessageData).size())")
 	@Mapping(target = "representations", source = "xdomeaMessageData")
 	@Mapping(target = "representation", ignore = true)
 	@Mapping(target = "attachment", ignore = true)
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
index b543be4a74e03d1f6f453f3071ad51a872c71495..4f59251706db33e1fe5d24ce333fb7f3a255a5a3 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
@@ -10,6 +10,10 @@ import java.util.Iterator;
 import java.util.stream.Stream;
 
 import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
+
+import jakarta.validation.Valid;
+import jakarta.xml.bind.JAXBElement;
 
 import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,8 +47,6 @@ import eu.osci.ws._2008._05.transport.MsgSelector;
 import eu.osci.ws._2008._05.transport.MsgStatusListType;
 import eu.osci.ws._2008._05.transport.ObjectFactory;
 import eu.osci.ws._2014._10.transport.MessageMetaData;
-import jakarta.validation.Valid;
-import jakarta.xml.bind.JAXBElement;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
@@ -103,16 +105,19 @@ class XtaRemoteService {
 	}
 
 	WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) {
-		return message -> {
-			MarshallingUtils.marshal(osciMarshaller, jaxbElement, message);
-			callback.doWithMessage(message);
+		return new WebServiceMessageCallback() {
+			@Override
+			public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
+				MarshallingUtils.marshal(osciMarshaller, jaxbElement, message);
+				callback.doWithMessage(message);
+			}
 		};
 	}
 
 	WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() {
-		return new WebServiceMessageExtractor<>() {
+		return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() {
 			@Override
-			public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException {
+			public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException {
 
 				MsgBoxResponseType header = extractHeader(message);
 
@@ -273,7 +278,7 @@ class XtaRemoteService {
 		@SuppressWarnings("unchecked")
 		ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue();
 
-		return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName());
+		return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString());
 
 	}
 
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java
index 10fad61ff239daa3ce420d95feaa2373b513dfc6..8668263d9b0914c6458296220db651e6b26552c7 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java
@@ -11,7 +11,7 @@ import java.security.cert.CertificateException;
 
 import javax.net.ssl.KeyManagerFactory;
 
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -28,12 +28,12 @@ import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 @Configuration
-@RequiredArgsConstructor
 public class XtaRemoteServiceConfiguration {
 
 	static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc";
 
-	private final XtaProperties properties;
+	@Autowired
+	private XtaProperties properties;
 
 	@Bean
 	Jaxb2Marshaller osciTransportMarshaller() {
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
index 5f580e13f68ed182ac9886601b9ff519edb94782..0c497d51f85560d84085d663c2bc32aaf46a408e 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.eingang.xta;
 
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationListener;
 import org.springframework.context.annotation.Profile;
 import org.springframework.context.event.ContextRefreshedEvent;
@@ -11,15 +11,15 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
-
 @Profile("!itcase")
 @Log4j2
 @Component
-@RequiredArgsConstructor
 class XtaRunner implements ApplicationListener<ContextRefreshedEvent> {
 
-	private final XtaService service;
-	private final SemantikAdapter semantikAdapter;
+	@Autowired
+	private XtaService service;
+	@Autowired
+	private SemantikAdapter semantikAdapter;
 
 	@Override
 	public void onApplicationEvent(ContextRefreshedEvent event) {
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
index 9dcae95b16545544a6a0f9ecab9cd0b2b1411557..2341fbf6dc93899cb0c195ee6f09be52266c5c81 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
@@ -8,6 +8,7 @@ import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier;
 import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
@@ -16,16 +17,20 @@ import lombok.extern.log4j.Log4j2;
 
 @Service
 @Log4j2
-@RequiredArgsConstructor
 class XtaService {
 
 	static final String XDOMEA_0201_MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201";
 
-	private final XtaRemoteService remoteService;
-	private final XtaMessageMapper mapper;
-	private final VorgangNummerSupplier vorgangNummerSupplier;
-	private final XdomeaMessageDataMapper xdomeaMessageDataMapper;
-	private final XtaIncomingFilesMapper xtaIncomingFilesMapper;
+	@Autowired
+	private XtaRemoteService remoteService;
+	@Autowired
+	private XtaMessageMapper mapper;
+	@Autowired
+	private VorgangNummerSupplier vorgangNummerSupplier;
+	@Autowired
+	private XdomeaMessageDataMapper xdomeaMessageDataMapper;
+	@Autowired
+	private XtaIncomingFilesMapper xtaIncomingFilesMapper;
 
 	public Stream<FormData> getMessages() {
 		return createXtaMessageStream().filter(this::isSupportedMessageType).map(this::getFormData);
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
index 374b4de0335bdfadae06528258db5cae4e782b4c..509880984a7ee0a50eb1fa424541121e7c58909e 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
@@ -10,7 +10,8 @@ class FormDataTestFactory {
 
 	static FormData.FormDataBuilder createBuilder() {
 		return FormData.builder()
-				.header(FormHeaderTestFactory.create());
+				.header(FormHeaderTestFactory.create())
+				.numberOfRepresentations(1);
 	}
 
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java
index 6a7881a89df1c91678d1abd9c8ac4602250c1b76..8e2d830f342905d66d07dca69cd304b92bef142c 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java
@@ -1,6 +1,7 @@
 package de.ozgcloud.eingang.xta;
 
-import org.junit.jupiter.api.Assertions;
+import static org.junit.jupiter.api.Assertions.*;
+
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
@@ -14,7 +15,7 @@ class XtaApplicationTest {
 	@Test
 	void startup() {
 		// should start without exception;
-		Assertions.assertTrue(true);
+		assertTrue(true);
 	}
 
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
index e915ba4a787289e6dfa52970dc11c581be501840..48fab4d367f5eaa16cd4426de0c1189bc5b7bd9c 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
@@ -22,7 +22,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.test.context.ActiveProfiles;
 
 import de.ozgcloud.eingang.Application;
-import de.ozgcloud.eingang.semantik.SemantikAdapter;
 import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc;
 import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse;
 import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest;
@@ -30,11 +29,9 @@ import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangResponse;
 import de.ozgcloud.vorgang.vorgang.GrpcEingang;
 import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationResponse;
 import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc;
-import lombok.RequiredArgsConstructor;
 
 @SpringBootTest(classes = {
 		Application.class,
-		XtaITCase.ActivateXTARunnerConfig.class,
 		XtaITCase.ActivateXTARunnerConfig.class
 })
 @ActiveProfiles({ "itcase" })
@@ -52,17 +49,26 @@ class XtaITCase {
 	class TestRunGetXtaMessages {
 		@BeforeEach
 		void setup() {
-			// Mock 'start vorgang creation'
+			mockStartVorgangCreation();
+			mockUploadBinaryFiles();
+			mockFinishVorgangCreation();
+		}
+
+		private void mockStartVorgangCreation() {
 			stubFor(
 					unaryMethod(VorgangServiceGrpc.getStartCreationMethod())
 							.willReturn(GrpcCreateVorgangResponse.getDefaultInstance())
 			);
-			// Mock 'upload binary files'
+		}
+
+		private void mockUploadBinaryFiles() {
 			stubFor(
 					clientStreamingMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod())
 							.willReturn(GrpcUploadBinaryFileResponse.getDefaultInstance())
 			);
-			// Mock 'finish vorgang creation'
+		}
+
+		private void mockFinishVorgangCreation() {
 			stubFor(
 					unaryMethod(VorgangServiceGrpc.getFinishCreationMethod())
 							.willReturn(GrpcFinishCreationResponse.getDefaultInstance())
@@ -72,31 +78,38 @@ class XtaITCase {
 		@AfterEach
 		void teardown() {
 			try {
-				// Expect one Vorgang to be created (start and finish)
-				verifyThat(
-						calledMethod(VorgangServiceGrpc.getStartCreationMethod())
-								.withRequest(GrpcCreateVorgangRequest::hasEingang),
-						times(1)
-				);
-				verifyThat(
-						calledMethod(VorgangServiceGrpc.getFinishCreationMethod()),
-						times(1)
-				);
-				// Expect upload of two xml representations: xdomea.xml and antrag.xml
-				verifyThat(
-						calledMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod())
-								.withRequestsContaining(request ->
-										request.hasMetadata() &&
-												request.getMetadata().getContentType().contains("xml")
-								),
-						times(2)
-				);
+				expectOneVorgangCreateAndFinishCall();
+				expectUploadCallForXmlRepresentations();
 			} finally {
 				xtaMocker.teardownServer();
 				resetMappings();
 			}
 		}
 
+		private void expectOneVorgangCreateAndFinishCall() {
+			verifyThat(
+					calledMethod(VorgangServiceGrpc.getStartCreationMethod())
+							.withRequest(GrpcCreateVorgangRequest::hasEingang),
+					times(1)
+			);
+			verifyThat(
+					calledMethod(VorgangServiceGrpc.getFinishCreationMethod()),
+					times(1)
+			);
+		}
+
+		private void expectUploadCallForXmlRepresentations() {
+			// Expect two xml representations: xdomea.xml and antrag.xml
+			verifyThat(
+					calledMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod())
+							.withRequestsContaining(request ->
+									request.hasMetadata() &&
+											request.getMetadata().getContentType().contains("xml")
+							),
+					times(2)
+			);
+		}
+
 		@DisplayName("should have three representations with pdf")
 		@TestZipFileNamesWithPdf
 		void shouldHaveThreeRepresentationsWithPdf(String zipFileName) {
@@ -259,15 +272,10 @@ class XtaITCase {
 	@interface TestZipFileNames {
 	}
 
-	@RequiredArgsConstructor
 	static class ActivateXTARunnerConfig {
-		private final XtaService service;
-		private final SemantikAdapter semantikAdapter;
-
 		@Bean
 		XtaRunner xtaRunner() {
-			return new XtaRunner(service, semantikAdapter);
+			return new XtaRunner();
 		}
 	}
-
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
index 52eb46a971f9c52dd4c6289b44812a9e464695e9..b9bcda822a302872474e1c4341cbe08b11675b99 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
@@ -46,6 +46,20 @@ class XtaMessageMapperTest {
 			assertThat(formData.getRepresentations()).containsExactly(xdomeaMessageData.metadataFile(), xdomeaMessageData.representations().getFirst());
 		}
 
+		@Test
+		void shouldSetNumberOfAttachments() {
+			var formData = doMapping();
+
+			assertThat(formData.getNumberOfAttachments()).isEqualTo(1);
+		}
+
+		@Test
+		void shouldSetNumberOfRepresentations() {
+			var formData = doMapping();
+
+			assertThat(formData.getNumberOfRepresentations()).isEqualTo(2);
+		}
+
 		@Test
 		void shouldMapAttachments() {
 			var formData = doMapping();
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java
index 5b7ba85a8a5874513b8bfe91b38df36fb9e06a9a..5cbebb33620ba8ec6801326c71526527b2ebdc35 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java
@@ -59,8 +59,8 @@ class XtaServiceITCase {
 		void shouldUnzipCorrectNumberOfRepresentations() {
 			var firstFormData = xtaService.getMessages().toList().getFirst();
 
-			// Expect that there are 3 files (xdomea.xml, intelliform.xml and intelliform.pdf)
 			assertThat(firstFormData.getRepresentations()).hasSize(3);
+			assertThat(firstFormData.getNumberOfRepresentations()).isEqualTo(3);
 		}
 
 		@DisplayName("should unzip correct number of attachments")
@@ -68,7 +68,6 @@ class XtaServiceITCase {
 		void shouldUnzipCorrectNumberOfAttachments() {
 			var firstFormData = xtaService.getMessages().toList().getFirst();
 
-			// Expect that there are no attachment files
 			assertThat(firstFormData.getAttachments()).isEmpty();
 		}