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 1c2c5340499d72c4101fc52bbbd40ddec37c3c2d..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
@@ -28,7 +28,5 @@ class EntryDataMapper {
 		} catch (IOException e) {
 			throw new ReadingRequestException(e);
 		}
-
 	}
-
 }
diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java
index 3f308dd3d9173e02b78ec94966f615ea9398bd98..a9efb992a4a141f06505a073b64460fa38f78bf5 100644
--- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java
+++ b/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java
@@ -31,6 +31,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.validation.annotation.Validated;
 
+import lombok.Builder;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -43,9 +44,10 @@ public class GrpcClientsProperties {
 
 	private Map<String, ClientProperty> client;
 
+	@Builder
 	@Getter
 	@Setter
-	static class ClientProperty {
+	public static class ClientProperty {
 		@NotEmpty
 		private String address;
 		private String negotationType = "TLS";
diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java
index 99ed3490b7a1f664d5209441d450924b4a28a942..e9264435bf6fe81dc13146d724f3f7562a26aba4 100644
--- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java
+++ b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java
@@ -69,8 +69,7 @@ class VorgangManagerListPropertiesTestFactory {
 	}
 
 	static GrpcClientsProperties createClientProperties() {
-		var property = new ClientProperty();
-		property.setAddress(ADDRESS);
+		var property = new ClientProperty(ADDRESS, "TLS");
 		var properties = new GrpcClientsProperties();
 		properties.setClient(Map.of(CHANNEL_NAME, property));
 		return properties;
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 ccf6f3ce4aad5162e9364c079bf07856bdc74a1d..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
@@ -65,6 +65,6 @@ public class SemantikAdapter {
 	}
 
 	private FormData parseByFormAdapter(FormData formData) {
-		return formBasedAdapter.parseFormData(formData);
+		return formBasedAdapter.adaptFormData(formData);
 	}
 }
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java
index c234ffb21472a2cba5a430312eab492b72982e43..64a5c44af69caffef810a2b4c8a8de077f6d44ac 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java
@@ -27,7 +27,7 @@ import de.ozgcloud.eingang.common.formdata.FormData;
 
 interface FormBasedMapper {
 
-	FormData parseFormData(FormData formData);
+	FormData adaptFormData(FormData formData);
 
 	boolean isResponsible(FormData formData);
 }
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java
index 823879bd947e3526e7931808bfdbc9b62749264e..a5121e8d8295c20eac12701362e33522d390fedf 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java
@@ -23,41 +23,24 @@
  */
 package de.ozgcloud.eingang.semantik.formbased;
 
-import java.util.Collections;
 import java.util.List;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
+import lombok.RequiredArgsConstructor;
 
 @Service
+@RequiredArgsConstructor
 public class FormBasedSemantikAdapter {
 
-	@Autowired(required = false)
-	private List<FormBasedMapper> mappers = Collections.emptyList();
-
-	public FormData parseFormData(FormData formData) {
-
-		return new FormDataProcessor().process(formData);
-	}
-
-	class FormDataProcessor {
-		private FormData processedFormData;
-
-		FormData process(FormData originalFormData) {
-			processedFormData = originalFormData;
-			mappers.stream()
-					.filter(mapper -> mapper.isResponsible(processedFormData))
-					.forEach(this::parseWithMapper);
-
-			return processedFormData;
-		}
-
-		private void parseWithMapper(FormBasedMapper mapper) {
-			processedFormData = mapper.parseFormData(processedFormData);
-		}
+	private final List<FormBasedMapper> mappers;
 
+	public FormData adaptFormData(FormData formData) {
+		return mappers.stream()
+				.filter(mapper -> mapper.isResponsible(formData))
+				.findFirst()
+				.map(mapper -> mapper.adaptFormData(formData))
+				.orElse(formData);
 	}
-
-}
\ No newline at end of file
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..d6e7196a5e2e471cebf54f5891fd5de2f91405ae
--- /dev/null
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java
@@ -0,0 +1,103 @@
+package de.ozgcloud.eingang.semantik.formbased;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.UnaryOperator;
+import java.util.stream.IntStream;
+
+import org.apache.commons.collections.MapUtils;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+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;
+
+	static final String MANTELANTRAG_FORM_ID = "maa_mantelantrag/maa_mantelantrag_pvog";
+
+	static final String ZUSTELLUNG_NACHRICHTENBROKER_FIELD = "zustellung_nachrichtenbroker";
+
+	static final String ORGANISATIONSEINHEIT_ID_FIELD = "kontaktsystem_oeid";
+	static final String BEZEICHNUNG_FIELD = "OrganisationseinheitenBEZEICHNUNG";
+	static final String EMAIL_FIELD = "zust_emailadresse";
+	static final String HAUSANSCHRIFT_STRASSE_FIELD = "zust_strasse";
+	static final String HAUSANSCHRIFT_PLZ_FIELD = "zust_postleitzahl";
+	static final String HAUSANSCHRIFT_ORT_FIELD = "zust_ort";
+	static final String TELEFON_FIELD = "telefon";
+
+	@Override
+	public boolean isResponsible(FormData formData) {
+		return formData
+				.getHeader()
+				.getFormId()
+				.equals(MANTELANTRAG_FORM_ID);
+	}
+
+	@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(
+				fieldMap,
+				getNameForSlotIndex(field, slotIndex)
+		);
+		var organisationseinheitId = getValueOrEmpty.apply(ORGANISATIONSEINHEIT_ID_FIELD);
+
+		if (organisationseinheitId.isBlank()) {
+			throw new TechnicalException("OrganistaionseinheitId not found!");
+		}
+
+		return formData.toBuilder()
+				.zustaendigeStelle(ZustaendigeStelle.builder()
+						.organisationseinheitenId(organisationseinheitId)
+						.bezeichnung(getValueOrEmpty.apply(BEZEICHNUNG_FIELD))
+						.email(getValueOrEmpty.apply(EMAIL_FIELD))
+						.hausanschriftStrasse(getValueOrEmpty.apply(HAUSANSCHRIFT_STRASSE_FIELD))
+						.hausanschriftPlz(getValueOrEmpty.apply(HAUSANSCHRIFT_PLZ_FIELD))
+						.hausanschriftOrt(getValueOrEmpty.apply(HAUSANSCHRIFT_ORT_FIELD))
+						.telefon(getValueOrEmpty.apply(TELEFON_FIELD))
+						.build())
+				.build();
+	}
+
+	int findSlotIndex(Map<String, Object> fieldMap) {
+		var identifier = environment.getProperty("ozgcloud.xta.identifier");
+		return IntStream.range(0, 3)
+				.filter(slotIndex -> getFieldByKeyOrEmpty(
+								fieldMap,
+								getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex)
+						).equals(identifier)
+				)
+				.findFirst()
+				.orElseThrow(() -> new TechnicalException("No matching nachrichtenbroker address '%s' found!".formatted(identifier)));
+	}
+
+	String getNameForSlotIndex(String name, int slotIndex) {
+		return slotIndex > 0 ? "%s%d".formatted(name, slotIndex + 1) : name;
+	}
+
+	private String getFieldByKeyOrEmpty(Map<String, Object> fieldMap, String key) {
+		return Optional.ofNullable(MapUtils.getString(fieldMap, key))
+				.map(String::trim)
+				.orElse("");
+	}
+
+}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java
index dbe206cafc115bf08a30839bab78afbc1933fdb3..0e230d638419df50c78544db57ac0735994ce13a 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java
@@ -107,7 +107,7 @@ class SemantikAdapterTest {
 		void mockEngineAdapter() {
 			doReturn(Optional.of(engineAdapter)).when(adapter).findResponsibleEngineAdapter(formData);
 			when(engineAdapter.parseFormData(any())).thenReturn(engineAdapterResponse);
-			when(formAdapter.parseFormData(any())).thenReturn(formAdapterResponse);
+			when(formAdapter.adaptFormData(any())).thenReturn(formAdapterResponse);
 		}
 
 		@Test
@@ -128,7 +128,7 @@ class SemantikAdapterTest {
 		void shouldCallFormAdapter() {
 			adapter.processFormData(formData);
 
-			verify(formAdapter).parseFormData(engineAdapterResponse);
+			verify(formAdapter).adaptFormData(engineAdapterResponse);
 		}
 
 		@Test
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java
index b5d93dca98b934def05ddc44663222dfc9484b9d..c68c9c3848ab36f3fdcb7a4e2ccdcef6eb611566 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java
@@ -39,8 +39,6 @@ import org.mockito.Spy;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
-import de.ozgcloud.eingang.semantik.formbased.FormBasedMapper;
-import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter;
 
 class FormBasedSemantikAdapterTest {
 
@@ -65,16 +63,16 @@ class FormBasedSemantikAdapterTest {
 
 		@Test
 		void shouldCallMapperIfResponsible() {
-			adapter.parseFormData(formData);
+			adapter.adaptFormData(formData);
 
-			verify(mapper).parseFormData(formData);
+			verify(mapper).adaptFormData(formData);
 		}
 
 		@Test
-		void shouldNotCallMappersIfNOTREsponsible() {
+		void shouldNotCallMapperIfNotResponsible() {
 			when(mapper.isResponsible(any())).thenReturn(false);
 
-			adapter.parseFormData(formData);
+			adapter.adaptFormData(formData);
 
 			verifyNoMoreInteractions(mapper);
 		}
@@ -82,11 +80,11 @@ class FormBasedSemantikAdapterTest {
 		@Test
 		void shouldReturnMappingResult() {
 			var expected = FormDataTestFactory.create();
-			when(mapper.parseFormData(any())).thenReturn(expected);
+			when(mapper.adaptFormData(any())).thenReturn(expected);
 
-			var result = adapter.parseFormData(formData);
+			var result = adapter.adaptFormData(formData);
 
 			assertThat(result).isSameAs(expected);
 		}
 	}
-}
\ No newline at end of file
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..8c019e946e13b43882cbcda8d41f599cbe5d7d18
--- /dev/null
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java
@@ -0,0 +1,307 @@
+package de.ozgcloud.eingang.semantik.formbased;
+
+import static de.ozgcloud.eingang.semantik.formbased.MantelantragFormBasedMapper.*;
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.core.env.Environment;
+
+import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
+import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
+import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
+import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
+
+class MantelantragFormBasedMapperTest {
+	private final static String TARGET_OEID = "123456";
+	private static final String IDENTIFIER = "gea:test";
+
+	@Spy
+	@InjectMocks
+	private MantelantragFormBasedMapper mapper;
+
+	@Mock
+	private Environment environment;
+
+	@DisplayName("is responsible")
+	@Nested
+	class TestIsResponsible {
+
+		@DisplayName("should be true if mantelantrag form id")
+		@Test
+		void shouldBeTrueIfMantelantragFormId() {
+			var formData = createWithFormId(MANTELANTRAG_FORM_ID);
+
+			var isResponsibleResult = mapper.isResponsible(formData);
+
+			assertThat(isResponsibleResult).isTrue();
+		}
+
+		@DisplayName("should be false if not mantelantrag form id")
+		@Test
+		void shouldBeFalseIfNotMantelantragFormId() {
+			var formData = createWithFormId("any other id");
+
+			var isResponsibleResult = mapper.isResponsible(formData);
+
+			assertThat(isResponsibleResult).isFalse();
+		}
+
+		private FormData createWithFormId(String formId) {
+			return FormDataTestFactory.createBuilder()
+					.header(FormHeaderTestFactory.createBuilder()
+							.formId(formId)
+							.build())
+					.build();
+		}
+	}
+
+	@DisplayName("adapt form data")
+	@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;
+
+		@BeforeEach
+		void mock() {
+			fieldMap = new HashMap<>(Map.of(
+					getOrganisationseinheitIDFieldName(1), " ",
+					getOrganisationseinheitIDFieldName(2), "",
+					getOrganisationseinheitIDFieldName(10), "1111111"
+			));
+			formData = FormDataTestFactory.createBuilder()
+					.formData(fieldMap)
+					.build();
+		}
+
+		@DisplayName("should keep form data except zustaendigestelle")
+		@Test
+		void shouldKeepFormDataExceptZustaendigestelle() {
+			doReturn(10).when(mapper).findSlotIndex(fieldMap);
+
+			var resultFormData = mapper.adaptFormData(formData);
+
+			assertThat(resultFormData.getId()).isEqualTo(formData.getId());
+			assertThat(resultFormData.getHeader()).isEqualTo(formData.getHeader());
+			assertThat(resultFormData.getAntragsteller()).isEqualTo(formData.getAntragsteller());
+		}
+
+		@DisplayName("should map organisationseinheitId")
+		@ParameterizedTest
+		@ValueSource(ints = { 0, 1, 2 })
+		void shouldMapOrganisationseinheitId(int slotIndex) {
+			mockWithOEID(slotIndex, TARGET_OEID);
+
+			var zustaendigeStelle = getAdaptedZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(TARGET_OEID);
+		}
+
+		private String getOrganisationseinheitIDFieldName(int slotIndex) {
+			return mapper.getNameForSlotIndex(ORGANISATIONSEINHEIT_ID_FIELD, slotIndex);
+		}
+
+		@DisplayName("should throw if organistaionseinheitId is missing")
+		@ParameterizedTest
+		@ValueSource(ints = { 0, 1, 2 })
+		void shouldThrowIfOrganistationseinheitIdIsMissing(int slotIndex) {
+			doReturn(slotIndex).when(mapper).findSlotIndex(fieldMap);
+
+			assertThatThrownBy(this::getAdaptedZustaendigeStelle)
+					.isInstanceOf(TechnicalException.class);
+		}
+
+		@DisplayName("should throw if organistationseinheitId is empty")
+		@ParameterizedTest
+		@ValueSource(ints = { 0, 1, 2 })
+		void shouldThrowIfOrganistationseinheitIdIsEmpty(int slotIndex) {
+			mockWithOEID(slotIndex, "");
+
+			assertThatThrownBy(this::getAdaptedZustaendigeStelle)
+					.isInstanceOf(TechnicalException.class);
+		}
+
+		static final String TARGET_OPTIONAL_FIELD_VALUE = "optionalFieldValue";
+
+		static final Map<String, Function<ZustaendigeStelle, String>> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR = Map.of(
+				BEZEICHNUNG_FIELD, ZustaendigeStelle::getBezeichnung,
+				EMAIL_FIELD, ZustaendigeStelle::getEmail,
+				HAUSANSCHRIFT_STRASSE_FIELD, ZustaendigeStelle::getHausanschriftStrasse,
+				HAUSANSCHRIFT_PLZ_FIELD, ZustaendigeStelle::getHausanschriftPlz,
+				HAUSANSCHRIFT_ORT_FIELD, ZustaendigeStelle::getHausanschriftOrt,
+				TELEFON_FIELD, ZustaendigeStelle::getTelefon
+		);
+
+		@DisplayName("should map optional field")
+		@ParameterizedTest
+		@MethodSource("fieldNameAndSlotIndex")
+		void shouldMapOptionalField(int slotIndex, String fieldName) {
+			mockWithSomeOEID(slotIndex);
+			fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), TARGET_OPTIONAL_FIELD_VALUE);
+
+			var zustaendigeStelle = getAdaptedZustaendigeStelle();
+
+			assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEqualTo(TARGET_OPTIONAL_FIELD_VALUE);
+		}
+
+		@DisplayName("should map missing optional fields to empty")
+		@ParameterizedTest
+		@MethodSource("fieldNameAndSlotIndex")
+		void shouldMapMissingOptionalFieldsToEmpty(int slotIndex, String fieldName) {
+			mockWithSomeOEID(slotIndex);
+
+			var zustaendigeStelle = getAdaptedZustaendigeStelle();
+
+			assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEmpty();
+		}
+
+		@DisplayName("should map empty optional fields to empty")
+		@ParameterizedTest
+		@MethodSource("fieldNameAndSlotIndex")
+		void shouldMapEmptyOptionalFieldsToEmpty(int slotIndex, String fieldName) {
+			mockWithSomeOEID(slotIndex);
+			fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), "");
+
+			var zustaendigeStelle = getAdaptedZustaendigeStelle();
+
+			assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEmpty();
+		}
+
+		private String getExpectedByFieldName(ZustaendigeStelle zustaendigeStelle, String fieldName) {
+			var valueExtractor = FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR.get(fieldName);
+			return valueExtractor.apply(zustaendigeStelle);
+		}
+
+		private static Stream<Arguments> fieldNameAndSlotIndex() {
+			return Stream.of(0, 1, 2)
+					.flatMap(slotIndex -> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR
+							.keySet().stream()
+							.map(fieldName -> Arguments.of(slotIndex, fieldName))
+					);
+		}
+
+		private void mockWithSomeOEID(int slotIndex) {
+			mockWithOEID(slotIndex, "some");
+		}
+
+		private void mockWithOEID(int slotIndex, String targetOeid) {
+			fieldMap.put(getOrganisationseinheitIDFieldName(slotIndex), targetOeid);
+			doReturn(slotIndex).when(mapper).findSlotIndex(fieldMap);
+		}
+
+		private ZustaendigeStelle getAdaptedZustaendigeStelle() {
+			var formDataResult = mapper.adaptFormDataWithPossibleException(formData);
+			return formDataResult.getZustaendigeStelle();
+		}
+
+	}
+
+	@DisplayName("find slot index")
+	@Nested
+	class TestFindSlotIndex {
+
+		private Map<String, Object> fieldMap;
+
+		@BeforeEach
+		void mock() {
+			when(environment.getProperty("ozgcloud.xta.identifier")).thenReturn(IDENTIFIER);
+
+			fieldMap = new HashMap<>(Map.of(
+					getZustaendigeStelleName(1), "unknown",
+					getZustaendigeStelleName(2), ""
+			));
+		}
+
+		@DisplayName("should return matching slot")
+		@ParameterizedTest
+		@ValueSource(ints = { 0, 1, 2 })
+		void shouldReturnMatchingSlot(int slotIndex) {
+			fieldMap.put(getZustaendigeStelleName(slotIndex), IDENTIFIER);
+
+			var resultSlotIndex = mapper.findSlotIndex(fieldMap);
+
+			assertThat(resultSlotIndex).isEqualTo(slotIndex);
+		}
+
+		private String getZustaendigeStelleName(int slotIndex) {
+			return mapper.getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex);
+		}
+
+		@DisplayName("should throw if no slot matches")
+		@Test
+		void shouldThrowIfNoSlotMatches() {
+			assertThatThrownBy(() -> mapper.findSlotIndex(fieldMap))
+					.isInstanceOf(TechnicalException.class);
+		}
+	}
+
+	@DisplayName("get name for slot index")
+	@Nested
+	class TestGetNameForSlotIndex {
+		@DisplayName("should return name")
+		@ParameterizedTest
+		@MethodSource("nameAndSlotIndexAndExpected")
+		void shouldReturnName(String name, int slotIndex, String expected) {
+			var resultName = mapper.getNameForSlotIndex(name, slotIndex);
+
+			assertThat(resultName).isEqualTo(expected);
+		}
+
+		private static Stream<Arguments> nameAndSlotIndexAndExpected() {
+			return Stream.of(
+					Arguments.of("name", 0, "name"),
+					Arguments.of("name", 1, "name2"),
+					Arguments.of("name", 2, "name3")
+			);
+		}
+	}
+}
diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml
index 6557a321b925d9653ec245854de08eb44d3c9b91..7dd7de51735b0f977c54134c0296e4021a480677 100644
--- a/xta-adapter/pom.xml
+++ b/xta-adapter/pom.xml
@@ -14,6 +14,7 @@
 		<spring-boot.build-image.imageName>docker.ozg-sh.de/xta-adapter:build-latest</spring-boot.build-image.imageName>
 		<okio.version>3.9.0</okio.version>
 		<mockwebserver.version>4.12.0</mockwebserver.version>
+		<grpcmock.version>0.13.0</grpcmock.version>
 	</properties>
 	
 	<dependencies>
@@ -96,6 +97,12 @@
 			<version>${mockwebserver.version}</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.grpcmock</groupId>
+			<artifactId>grpcmock-spring-boot</artifactId>
+			<version>${grpcmock.version}</version>
+			<scope>test</scope>
+		</dependency>
 		<dependency>
 			<groupId>de.ozgcloud.eingang</groupId>
 			<artifactId>common</artifactId>
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java
index 1df581ac477f920aa8069fe84fb6677f3cac6d0e..d8e6cb0515f7d5dce0d2183b6418a33bb4b144f4 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java
@@ -3,8 +3,10 @@ package de.ozgcloud.eingang.xta;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Base64;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -25,16 +27,30 @@ public class MockResponseTestFactory {
 			"Content-Type", "application/xop+xml;charset=utf-8;type=\"application/soap+xml\""
 	);
 
-	public static Map<String, String> MAILBOX_CONTENT = Map.of(
-			"urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a", "AFM",
-			"urn:de:xta:messageid:dataport_xta_210:371ce4e3-44e3-4f9d-8c82-db7f347ae760", "AFM",
-			"urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f", "Versammlungsanzeige",
-			"urn:de:xta:messageid:dataport_xta_210:749f0375-be76-4928-959d-76d52de906c3", "AFM"
+	public static final Map<String, String> MESSAGE_TYPE_BY_ATTACHMENT_FILENAME = Map.of(
+			"mantelantrag_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201",
+			"dfoerdermittel_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201",
+			"versammlungsanzeige.xml", "fim.S17000652.17000652001004",
+			"mantelantrag_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201",
+			"dfoerdermittel_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201",
+			"waffenschein.zip", "Geschaeftsgang.Geschaeftsgang.0201"
 	);
 
-	private static final Map<String, String> ATTACHMENT_FILENAME = Map.of(
-			"AFM", "attachment.zip",
-			"Versammlungsanzeige", "attachment.xml"
+	private static final Map<String, String> MESSAGE_ID_BY_ATTACHMENT_FILENAME = MESSAGE_TYPE_BY_ATTACHMENT_FILENAME
+			.keySet().stream()
+			.collect(Collectors.toMap(name -> name, name -> generateMessageID()));
+
+	private static String generateMessageID() {
+		return "urn:de:xta:messageid:dataport_xta_210:%s".formatted(UUID.randomUUID().toString());
+	}
+
+	private static final Map<String, String> METADATA_NAME_ATTACHMENT_FILENAME = Map.of(
+			"mantelantrag_without_anlage.zip", "afm",
+			"dfoerdermittel_without_anlage.zip", "dfoerdermittel",
+			"versammlungsanzeige.xml", "versammlungsanzeige",
+			"mantelantrag_with_anlage.zip", "afm",
+			"dfoerdermittel_with_anlage.zip", "dfoerdermittel",
+			"waffenschein.zip", "afm"
 	);
 
 	public static MockResponse create() {
@@ -60,14 +76,13 @@ public class MockResponseTestFactory {
 				.setBody(body);
 	}
 
-	public static MockResponse createGetStatusListResponse() {
-		var messageMetaDataEntriesString = MAILBOX_CONTENT.entrySet().stream()
-				.map(kv -> TestUtils.loadTextFile("mock-responses/getStatusList/MessageMetaData/%s.template.xml".formatted(kv.getValue()),
-						kv.getKey()))
+	public static MockResponse createGetStatusListResponse(List<String> xtaAttachmentFileNames) {
+		var messageMetaDataEntriesString = xtaAttachmentFileNames.stream()
+				.map(MockResponseTestFactory::createMessageMetadataXml)
 				.collect(Collectors.joining());
 		var envelopeXMLString = TestUtils.loadTextFile(
 				"mock-responses/getStatusList/envelope.template.xml",
-				String.valueOf(MAILBOX_CONTENT.size()),
+				String.valueOf(xtaAttachmentFileNames.size()),
 				messageMetaDataEntriesString
 		);
 
@@ -83,20 +98,19 @@ public class MockResponseTestFactory {
 				.setBody(body);
 	}
 
-	public static MockResponse createGetMessageResponse(String messageId) {
-		var antragType = Objects.requireNonNull(MAILBOX_CONTENT.get(messageId));
+	public static MockResponse createGetMessageResponse(String xtaAttachmentFileName) {
+		var messageType = Objects.requireNonNull(MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName));
+		var metadataMessageXml = createMessageMetadataXml(xtaAttachmentFileName);
 
 		var envelopeXMLString = TestUtils.loadTextFile(
-				"mock-responses/getMessage/%s/envelope.template.xml".formatted(antragType),
-				messageId, INCLUDE_URL);
-
-		String attachmentBase64;
-		try (var attachmentFile = TestUtils.loadFile(
-				"mock-responses/getMessage/%s/%s".formatted(antragType, Objects.requireNonNull(ATTACHMENT_FILENAME.get(antragType))))) {
-			attachmentBase64 = new String(Base64.getEncoder().encode(attachmentFile.readAllBytes()));
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
+				"mock-responses/getMessage/%s/envelope.template.xml".formatted(
+						messageType
+				),
+				metadataMessageXml,
+				xtaAttachmentFileName,
+				getFileSize(getAttachmentFilePath(xtaAttachmentFileName)),
+				INCLUDE_URL
+		);
 
 		var body = combineParts(
 				createPart(
@@ -109,7 +123,9 @@ public class MockResponseTestFactory {
 								"Content-Transfer-Encoding", "base64",
 								"Content-Type", "application/octet-stream"
 						),
-						attachmentBase64
+						loadFileAsBase64(
+								getAttachmentFilePath(xtaAttachmentFileName)
+						)
 				)
 		);
 
@@ -118,6 +134,46 @@ public class MockResponseTestFactory {
 				.setBody(body);
 	}
 
+	private static String getMessageType(String xtaAttachmentFileName) {
+		return Objects.requireNonNull(
+				MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName),
+				"Xta-message type for '%s' has to be configured!".formatted(xtaAttachmentFileName)
+		);
+	}
+
+	private static String createMessageMetadataXml(String xtaAttachmentFileName) {
+		return TestUtils.loadTextFile(
+				"mock-responses/getStatusList/MessageMetaData/%s/%s.template.xml".formatted(
+						getMessageType(xtaAttachmentFileName),
+						Objects.requireNonNull(
+								METADATA_NAME_ATTACHMENT_FILENAME.get(xtaAttachmentFileName),
+								"Xta-message metadata-name for '%s' has to be configured!".formatted(xtaAttachmentFileName)
+						)
+				), Objects.requireNonNull(MESSAGE_ID_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName)),
+				getFileSize(getAttachmentFilePath(xtaAttachmentFileName))
+		);
+	}
+
+	private static String getFileSize(String filePath) {
+		try (var inputStream = TestUtils.loadFile(filePath)) {
+			return String.valueOf(inputStream.readAllBytes().length);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static String getAttachmentFilePath(String xtaAttachmentFileName) {
+		return "mock-responses/getMessage/%s/%s".formatted(getMessageType(xtaAttachmentFileName), xtaAttachmentFileName);
+	}
+
+	private static String loadFileAsBase64(String fileName) {
+		try (var attachmentFile = TestUtils.loadFile(fileName)) {
+			return new String(Base64.getEncoder().encode(attachmentFile.readAllBytes()));
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
 	private static String combineParts(String... parts) {
 		return Stream.concat(
 						Arrays.stream(parts).map(part -> "--%s\n%s\n".formatted(UUID_BOUNDARY, part)),
@@ -130,4 +186,7 @@ public class MockResponseTestFactory {
 				headers.entrySet().stream().map(kv -> "%s: %s\n".formatted(kv.getKey(), kv.getValue())).collect(Collectors.joining()), content);
 	}
 
+	public static MockResponse createCloseResponse() {
+		return new MockResponse();
+	}
 }
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 8f22e393ae6f75b7bf19a48b6c682e8476899b6e..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
@@ -1,128 +1,281 @@
 package de.ozgcloud.eingang.xta;
 
 import static org.assertj.core.api.Assertions.*;
-import static org.assertj.core.api.InstanceOfAssertFactories.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
+import static org.grpcmock.GrpcMock.*;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.List;
+
+import org.grpcmock.springboot.AutoConfigureGrpcMock;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.test.context.ActiveProfiles;
 
-import de.ozgcloud.common.test.TestUtils;
 import de.ozgcloud.eingang.Application;
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
-import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
-import de.ozgcloud.eingang.router.VorgangRemoteService;
-
-@SpringBootTest(classes = { Application.class, ActivateXTARunnerConfig.class })
-@ActiveProfiles({ "local", "itcase" })
+import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse;
+import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangResponse;
+import de.ozgcloud.vorgang.vorgang.GrpcEingang;
+import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationResponse;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc;
+
+@SpringBootTest(classes = {
+		Application.class,
+		XtaITCase.ActivateXTARunnerConfig.class
+})
+@ActiveProfiles({ "itcase" })
+@AutoConfigureGrpcMock(name = "vorgang-manager-itcase", useInProcessServer = true)
 class XtaITCase {
 
-	@MockBean
-	private XtaRemoteService remoteService;
-	@MockBean
-	private VorgangRemoteService vorgangRemoteService;
+	@Autowired
+	private XtaMockServerConfiguration.XtaMocker xtaMocker;
 
 	@Autowired
 	private XtaRunner runner;
-	@Captor
-	private ArgumentCaptor<FormData> formDataCaptor;
-
-	@BeforeEach
-	void prepareXtaRemoteService() {
-		when(remoteService.getMessagesMetadata()).thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create());
-
-		when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(
-				XtaMessageTestFactory.createBuilder()
-						.clearMessageFiles()
-						.messageFile(XtaFileTestFactory.withFileContent(TestUtils.loadFile("xdomea/dfoerdermittel_without_anlage.zip"),
-								"dfoerdermittel_without_anlage.zip"))
-						.build());
-	}
 
-	@Test
-	void shouldGetMessage() {
-		runner.onApplicationEvent(null);
+	@DisplayName("run get xta messages")
+	@Nested
+	class TestRunGetXtaMessages {
+		@BeforeEach
+		void setup() {
+			mockStartVorgangCreation();
+			mockUploadBinaryFiles();
+			mockFinishVorgangCreation();
+		}
 
-		verify(remoteService).getMessage(XtaMessageTestFactory.MESSAGE_ID);
-	}
+		private void mockStartVorgangCreation() {
+			stubFor(
+					unaryMethod(VorgangServiceGrpc.getStartCreationMethod())
+							.willReturn(GrpcCreateVorgangResponse.getDefaultInstance())
+			);
+		}
 
-	@Test
-	void shouldCloseMessage() {
-		runner.onApplicationEvent(null);
+		private void mockUploadBinaryFiles() {
+			stubFor(
+					clientStreamingMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod())
+							.willReturn(GrpcUploadBinaryFileResponse.getDefaultInstance())
+			);
+		}
 
-		verify(remoteService, timeout(2000)).close(XtaMessageTestFactory.MESSAGE_ID);
-	}
+		private void mockFinishVorgangCreation() {
+			stubFor(
+					unaryMethod(VorgangServiceGrpc.getFinishCreationMethod())
+							.willReturn(GrpcFinishCreationResponse.getDefaultInstance())
+			);
+		}
 
-	@Test
-	void shouldSend3Representations() {
-		runner.onApplicationEvent(null);
+		@AfterEach
+		void teardown() {
+			try {
+				expectOneVorgangCreateAndFinishCall();
+				expectUploadCallForXmlRepresentations();
+			} finally {
+				xtaMocker.teardownServer();
+				resetMappings();
+			}
+		}
 
-		verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any());
-		assertThat(formDataCaptor.getValue().getRepresentations()).hasSize(3);
-		assertThat(formDataCaptor.getValue().getNumberOfRepresentations()).isEqualTo(3);
-	}
+		private void expectOneVorgangCreateAndFinishCall() {
+			verifyThat(
+					calledMethod(VorgangServiceGrpc.getStartCreationMethod())
+							.withRequest(GrpcCreateVorgangRequest::hasEingang),
+					times(1)
+			);
+			verifyThat(
+					calledMethod(VorgangServiceGrpc.getFinishCreationMethod()),
+					times(1)
+			);
+		}
 
-	@Test
-	void shouldSendNoAttachments() {
-		runner.onApplicationEvent(null);
+		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)
+			);
+		}
 
-		verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any());
-		assertThat(formDataCaptor.getValue().getAttachments()).isEmpty();
-		assertThat(formDataCaptor.getValue().getNumberOfAttachments()).isZero();
-	}
+		@DisplayName("should have three representations with pdf")
+		@TestZipFileNamesWithPdf
+		void shouldHaveThreeRepresentationsWithPdf(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
 
-	@Test
-	void shouldHavePostfachId() {
-		runner.onApplicationEvent(null);
+			runner.runGetXtaMessages();
 
-		var formData = captorFormData();
+			var eingang = captureEingang();
+			assertThat(eingang.getNumberOfRepresentations()).isEqualTo(3);
+		}
 
-		assertThat(formData.getHeader().getServiceKonto()).describedAs("ServiceKonto").isNotNull()
-				.extracting(ServiceKonto::getPostfachAddresses).asList().hasSize(1).first()
-				.asInstanceOf(type(PostfachAddress.class))
-				.extracting(PostfachAddress::getIdentifier).isInstanceOf(StringBasedIdentifier.class).asInstanceOf(type(StringBasedIdentifier.class))
-				.extracting(StringBasedIdentifier::getPostfachId).isEqualTo("4dd01647-b9d9-4775-1b50-08da3d83800a");
-	}
+		@DisplayName("should send two representations without pdf")
+		@TestZipFileNamesWithoutPdf
+		void shouldSendTwoXMLRepresentationsWithoutPdf(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
+
+			runner.runGetXtaMessages();
+
+			var eingang = captureEingang();
+			assertThat(eingang.getNumberOfRepresentations()).isEqualTo(2);
+		}
+
+		@DisplayName("should have no attachments")
+		@TestZipFileNamesWithoutAnlage
+		void shouldHaveNoAttachments(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
+
+			runner.runGetXtaMessages();
+
+			var eingang = captureEingang();
+			assertThat(eingang.getNumberOfAttachments()).isZero();
+		}
+
+		@DisplayName("should have one attachment")
+		@TestZipFileNamesWithAnlage
+		void shouldHaveOneAttachment(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
+
+			runner.runGetXtaMessages();
 
-	@Test
-	void shouldHaveOrganisationsEinheitId() {
-		runner.onApplicationEvent(null);
+			var eingang = captureEingang();
+			assertThat(eingang.getNumberOfAttachments()).isEqualTo(1);
+		}
 
-		var formData = captorFormData();
+		@DisplayName("should have postfach id")
+		@TestZipFileNamesWithServiceKonto
+		void shouldHavePostfachId(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
 
-		assertThat(formData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("9795669");
+			runner.runGetXtaMessages();
+
+			var serviceKonto = captureEingang()
+					.getHeader()
+					.getServiceKonto();
+			assertThat(serviceKonto).isNotNull();
+			var postfachId = serviceKonto
+					.getPostfachAddresses(0)
+					.getIdentifier()
+					.getProperty(0)
+					.getValue(0);
+			assertThat(postfachId).isEqualTo("4dd01647-b9d9-4775-1b50-08da3d83800a");
+		}
+
+		@DisplayName("should have organistationseinheit ID")
+		@TestZipFileNames
+		void shouldHaveOrganistationseinheitId(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
+
+			runner.runGetXtaMessages();
+
+			var organisationseinheitenId = captureEingang()
+					.getZustaendigeStelle()
+					.getOrganisationseinheitenId();
+			assertThat(organisationseinheitenId).isEqualTo("9795669");
+		}
+
+		@DisplayName("should have vorgang nummer")
+		@TestZipFileNames
+		void shouldHaveVorgangNummer(String zipFileName) {
+			mockNachrichtenBroker(zipFileName);
+
+			runner.runGetXtaMessages();
+
+			var vorgangNummer = captureEingang()
+					.getHeader()
+					.getVorgangNummer();
+			assertThat(vorgangNummer).hasSize(9);
+		}
+
+		private GrpcEingang captureEingang() {
+			return capturedRequestsFor(
+					calledMethod(VorgangServiceGrpc.getStartCreationMethod())
+			)
+					.getFirst()
+					.requests()
+					.getFirst()
+					.getEingang();
+		}
 	}
 
-	@Test
-	void shouldHaveVorgangNummer() {
-		runner.onApplicationEvent(null);
+	private void mockNachrichtenBroker(String zipFileName) {
+		xtaMocker.setupServer(List.of(zipFileName), true);
+	}
 
-		var formData = captorFormData();
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = { "dfoerdermittel_without_anlage.zip", "mantelantrag_without_anlage.zip" })
+	@interface TestZipFileNamesWithoutAnlage {
+	}
 
-		assertThat(formData.getHeader().getVorgangNummer()).hasSize(9);
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = { "dfoerdermittel_with_anlage.zip", "mantelantrag_with_anlage.zip" })
+	@interface TestZipFileNamesWithAnlage {
 	}
 
-	private FormData captorFormData() {
-		verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any());
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = {
+			"dfoerdermittel_without_anlage.zip",
+			"mantelantrag_without_anlage.zip",
+			"dfoerdermittel_with_anlage.zip",
+			"mantelantrag_with_anlage.zip",
+	})
+	@interface TestZipFileNamesWithPdf {
+	}
 
-		return formDataCaptor.getValue();
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = {
+			"waffenschein.zip"
+	})
+	@interface TestZipFileNamesWithoutPdf {
 	}
 
-}
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = {
+			"dfoerdermittel_without_anlage.zip",
+			"dfoerdermittel_with_anlage.zip",
+	})
+	@interface TestZipFileNamesWithServiceKonto {
+	}
+
+	@Target({ ElementType.METHOD })
+	@Retention(RetentionPolicy.RUNTIME)
+	@ParameterizedTest
+	@ValueSource(strings = {
+			"dfoerdermittel_without_anlage.zip",
+			"mantelantrag_without_anlage.zip",
+			"dfoerdermittel_with_anlage.zip",
+			"mantelantrag_with_anlage.zip",
+			"waffenschein.zip"
+	})
+	@interface TestZipFileNames {
+	}
 
-class ActivateXTARunnerConfig {
-	@Bean
-	XtaRunner xtaRunner() {
-		return new XtaRunner();
+	static class ActivateXTARunnerConfig {
+		@Bean
+		XtaRunner xtaRunner() {
+			return new XtaRunner();
+		}
 	}
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..5484189046e19e820bcc6f9f0065c068af85908d
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java
@@ -0,0 +1,93 @@
+package de.ozgcloud.eingang.xta;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import okhttp3.mockwebserver.MockWebServer;
+
+@Configuration
+public class XtaMockServerConfiguration {
+
+	@Bean
+	XtaMocker xtaMockServer(XtaProperties properties) {
+		return new XtaMocker(properties);
+	}
+
+	@RequiredArgsConstructor
+	@Getter
+	public static class XtaMocker {
+		private final XtaProperties properties;
+
+		private MockWebServer nachrichtenBrokerMock;
+		private List<String> filteredAttachmentFileNames;
+
+		@SneakyThrows
+		public void setupServer(List<String> xtaAttachmentFileNames, boolean expectCloseMessages) {
+			filteredAttachmentFileNames = xtaAttachmentFileNames.stream()
+					.filter(name -> Objects.requireNonNull(
+									MockResponseTestFactory.MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(name),
+									"Xta-attachment name '%s' has to be configured!".formatted(name)
+							)
+							.equals("Geschaeftsgang.Geschaeftsgang.0201"))
+					.toList();
+
+			startServer();
+
+			nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetStatusListResponse(xtaAttachmentFileNames));
+			filteredAttachmentFileNames.forEach(xtaAttachmentFileName -> {
+						nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetMessageResponse(xtaAttachmentFileName));
+						if (expectCloseMessages) {
+							nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createCloseResponse());
+						}
+					}
+			);
+			nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createEmptyGetStatusListResponse());
+		}
+
+		@SneakyThrows
+		private void startServer() {
+			nachrichtenBrokerMock = new MockWebServer();
+
+			nachrichtenBrokerMock.start(InetAddress.getByName("127.0.0.1"), 0);
+			var serverProperties = properties.getServer();
+			serverProperties.setAddress(nachrichtenBrokerMock.getHostName() + ":" + nachrichtenBrokerMock.getPort());
+			serverProperties.setProtocol("http");
+		}
+
+		@SneakyThrows
+		public void teardownServer() {
+			if (nachrichtenBrokerMock == null) {
+				throw new RuntimeException("No server has been set up to tear down!");
+			}
+			try {
+				var expectedCallCount = filteredAttachmentFileNames.size() + 2;
+
+				for (var i = 0; i < expectedCallCount; i++) {
+					var request = nachrichtenBrokerMock.takeRequest(1, TimeUnit.SECONDS);
+					assertNotNull(request, "should have request index %d".formatted(i));
+					assertThat(request.getPath()).isEqualTo("/MB_XTA-WS/XTA210msgBoxPort.svc");
+				}
+			} finally {
+				stopServer();
+			}
+		}
+
+		@SneakyThrows
+		private void stopServer() {
+			nachrichtenBrokerMock.shutdown();
+			nachrichtenBrokerMock = null;
+		}
+
+	}
+}
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 cfc4776f0dd29bdd3a0b85c9236832368a863065..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
@@ -1,12 +1,8 @@
 package de.ozgcloud.eingang.xta;
 
 import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
 
-import java.net.InetAddress;
 import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -19,62 +15,43 @@ import org.springframework.test.context.ActiveProfiles;
 
 import de.ozgcloud.eingang.Application;
 import lombok.SneakyThrows;
-import okhttp3.mockwebserver.MockWebServer;
 
 @ActiveProfiles({ "itcase", "local" })
-@SpringBootTest(classes = Application.class)
+@SpringBootTest(classes = { Application.class, XtaMockServerConfiguration.class })
 class XtaServiceITCase {
 
-	private MockWebServer nachrichtenBrokerMock;
-
-	private static final List<String> FILTERED_MESSAGE_IDS = MockResponseTestFactory.MAILBOX_CONTENT.entrySet().stream()
-			.filter(kv -> kv.getValue().equals("AFM"))
-			.map(Map.Entry::getKey)
-			.toList();
-
 	@Autowired
-	private XtaService xtaService;
+	private XtaMockServerConfiguration.XtaMocker xtaMocker;
 
 	@Autowired
-	private XtaProperties properties;
+	private XtaService xtaService;
 
 	@DisplayName("get messages")
 	@Nested
 	class TestGetMessages {
 
 		@BeforeEach
-		void enqueueResponse() {
-			startServer();
-			nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetStatusListResponse());
-			FILTERED_MESSAGE_IDS.forEach(messageId ->
-					nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetMessageResponse(messageId))
-			);
-			nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createEmptyGetStatusListResponse());
+		void setup() {
+			xtaMocker.setupServer(List.of(
+					"mantelantrag_without_anlage.zip",
+					"dfoerdermittel_without_anlage.zip",
+					"versammlungsanzeige.xml",
+					"waffenschein.zip"
+			), false);
 		}
 
 		@AfterEach
 		@SneakyThrows
-		void verifyRequestCall() {
-			try {
-				var expectedCallCount = FILTERED_MESSAGE_IDS.size() + 2;
-
-				for (var i = 0; i < expectedCallCount; i++) {
-					var request = nachrichtenBrokerMock.takeRequest(1, TimeUnit.SECONDS);
-					assertNotNull(request, "should have request index %d".formatted(i));
-					assertThat(request.getPath()).isEqualTo("/MB_XTA-WS/XTA210msgBoxPort.svc");
-				}
-			} finally {
-				stopServer();
-			}
+		void teardown() {
+			xtaMocker.teardownServer();
 		}
 
-		@DisplayName("should return form data with filtered message ids")
+		@DisplayName("should return data for waffenschein, mantelantrag and dfoerdermittel")
 		@Test
-		void shouldReturnFormDataWithFilteredMessageIds() {
-			var formDataItems = xtaService.getMessages();
+		void shouldReturnDataForMantelantragAndDfoerdermittel() {
+			var formDataItems = xtaService.getMessages().toList();
 
-			var messageIds = formDataItems.map(item -> item.getHeader().getRequestId()).toList();
-			assertThat(messageIds).isEqualTo(FILTERED_MESSAGE_IDS);
+			assertThat(formDataItems).hasSize(3);
 		}
 
 		@DisplayName("should unzip correct number of representations")
@@ -85,6 +62,7 @@ class XtaServiceITCase {
 			assertThat(firstFormData.getRepresentations()).hasSize(3);
 			assertThat(firstFormData.getNumberOfRepresentations()).isEqualTo(3);
 		}
+
 		@DisplayName("should unzip correct number of attachments")
 		@Test
 		void shouldUnzipCorrectNumberOfAttachments() {
@@ -92,22 +70,14 @@ class XtaServiceITCase {
 
 			assertThat(firstFormData.getAttachments()).isEmpty();
 		}
-	}
-
-	@SneakyThrows
-	private void startServer() {
-		nachrichtenBrokerMock = new MockWebServer();
 
-		nachrichtenBrokerMock.start(InetAddress.getByName("127.0.0.1"), 0);
-		var serverProperties = properties.getServer();
-		serverProperties.setAddress(nachrichtenBrokerMock.getHostName() + ":" + nachrichtenBrokerMock.getPort());
-		serverProperties.setProtocol("http");
-	}
+		@DisplayName("should have vorgang nummer at correct length")
+		@Test
+		void shouldHaveVorgangNummerAtCorrectLength() {
+			var vorgangNumbers = xtaService.getMessages().map(formData -> formData.getHeader().getVorgangNummer()).toList();
 
-	@SneakyThrows
-	private void stopServer() {
-		nachrichtenBrokerMock.shutdown();
-		nachrichtenBrokerMock = null;
+			assertThat(vorgangNumbers).isNotEmpty().allMatch(number -> number.length() == 9);
+		}
 	}
 
 }
diff --git a/xta-adapter/src/test/resources/application-itcase.yml b/xta-adapter/src/test/resources/application-itcase.yml
index 10c37fce51476732675a22abedd6ec6257d726f6..99b88fbe12ffdb4562dc264c08595afde1b9092a 100644
--- a/xta-adapter/src/test/resources/application-itcase.yml
+++ b/xta-adapter/src/test/resources/application-itcase.yml
@@ -1,6 +1,21 @@
 ozgcloud:
   xta:
+    identifier: afmsh:010600000000_Online-Dienste
+    server:
+      address: localhost:3000
+      name: LI33-0005
+      protocol: https
     keystore:
       file: classpath:xtaTestStore.p12
       password: changeit
-    identifier: gae:jens.reese@mgm-tp.com
\ No newline at end of file
+  adapter:
+    targetVorgangManagerName: itcase
+    fallbackStrategy: DENY
+    routingStrategy: SINGLE
+
+
+grpc:
+  client:
+    vorgang-manager-itcase:
+      address: in-process:vorgang-manager-itcase
+      negotiationType: PLAINTEXT
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip
deleted file mode 100644
index 8f466f5b2eaf7bfb457ffcf27c3b21886d972a29..0000000000000000000000000000000000000000
Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip and /dev/null differ
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml
deleted file mode 100644
index 4015e654c8a309ee31d039de6a0799fb0f8ed483..0000000000000000000000000000000000000000
--- a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
-	<s:Header>
-		<a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action>
-		<h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-			<ItemsPending>0</ItemsPending>
-		</h:MsgBoxResponse>
-		<h:MessageMetaData xmlns:h="http://www.osci.eu/ws/2014/10/transport" xmlns="http://www.osci.eu/ws/2014/10/transport">
-			<DeliveryAttributes>
-				<Origin>2024-04-04T10:24:07.57</Origin>
-				<Delivery>2024-04-04T10:24:08.723</Delivery>
-			</DeliveryAttributes>
-			<Originators>
-				<Author>
-					<Identifier type="xoev">afmsh:WebMethod_Online-Dienste</Identifier>
-				</Author>
-			</Originators>
-			<Destinations>
-				<Reader>
-					<Identifier type="xoev">afmsh:ozg-cloud-dev001</Identifier>
-				</Reader>
-			</Destinations>
-			<MsgIdentification>
-				<MessageID xmlns="http://www.w3.org/2005/08/addressing">%s</MessageID>
-			</MsgIdentification>
-			<Qualifier>
-				<Service>urn:xdomea:AFM</Service>
-				<BusinessScenario>
-					<Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1">
-						<code xmlns="">AFM_DATA</code>
-					</Defined>
-				</BusinessScenario>
-				<MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="http://www.xdomea.de/V2.0.1">
-					<code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code>
-				</MessageType>
-			</Qualifier>
-			<MsgSize>40142</MsgSize>
-		</h:MessageMetaData>
-	</s:Header>
-	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-		<GenericContentContainer xmlns="http://xoev.de/transport/xta/211">
-			<ContentContainer>
-				<Message contentType="application/zip" filename="9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.zip" size="40142">
-					<xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
-				</Message>
-			</ContentContainer>
-		</GenericContentContainer>
-	</s:Body>
-</s:Envelope>
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip
new file mode 100644
index 0000000000000000000000000000000000000000..9647ba0d49dc5a1983b9c184ddc1d1bd59249004
Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip differ
diff --git a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_without_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage.zip
similarity index 100%
rename from xta-adapter/src/test/resources/xdomea/dfoerdermittel_without_anlage.zip
rename to xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage.zip
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e6f2da91fe005276ba66700d009ffa6de8e9de7b
--- /dev/null
+++ b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml
@@ -0,0 +1,18 @@
+<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
+	<s:Header>
+		<a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action>
+		<h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+			<ItemsPending>0</ItemsPending>
+		</h:MsgBoxResponse>
+		%s
+	</s:Header>
+	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+		<GenericContentContainer xmlns="http://xoev.de/transport/xta/211">
+			<ContentContainer>
+				<Message contentType="application/zip" filename="%s" size="%s">
+					<xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
+				</Message>
+			</ContentContainer>
+		</GenericContentContainer>
+	</s:Body>
+</s:Envelope>
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip
new file mode 100644
index 0000000000000000000000000000000000000000..aa058ff00deba2e3cc06ce2a98c763ad9e18aa35
Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip differ
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip
new file mode 100644
index 0000000000000000000000000000000000000000..b3dbb1819807610e02ba123ad9d8bddc138ca9a5
Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip differ
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3e1455530e1d2634ff373573b2b64e7d16ee71b5
Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip differ
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml
deleted file mode 100644
index 58699f57d3a8c1adbb67844f29d1697ffa6be84c..0000000000000000000000000000000000000000
--- a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
-	<s:Header>
-		<a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action>
-		<h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-			<ItemsPending>0</ItemsPending>
-		</h:MsgBoxResponse>
-		<h:MessageMetaData xmlns:h="http://www.osci.eu/ws/2014/10/transport" xmlns="http://www.osci.eu/ws/2014/10/transport">
-			<DeliveryAttributes>
-				<InitialSend>2024-03-21T08:56:35.214+01:00</InitialSend>
-				<Delivery>2024-03-21T08:56:38.417</Delivery>
-			</DeliveryAttributes>
-			<Originators>
-				<Author>
-					<Identifier type="xoev" name="Dataport" category="Engagement- und Hobbyportal">ehp:010100100000</Identifier>
-				</Author>
-			</Originators>
-			<Destinations>
-				<Reader>
-					<Identifier type="xoev" name="L100012.OE.279550874" category="Versammlungsbehörde">vbe:010550120100</Identifier>
-				</Reader>
-			</Destinations>
-			<MsgIdentification>
-				<MessageID xmlns="http://www.w3.org/2005/08/addressing">%s</MessageID>
-			</MsgIdentification>
-			<Qualifier>
-				<Service>urn:fim:Versammlungsanzeige:1.4</Service>
-				<BusinessScenario>
-					<Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1">
-						<code xmlns="">FIM_DATA</code>
-					</Defined>
-				</BusinessScenario>
-				<MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="urn:xoev-de:xfall:standard:fim-s17000652_1.4">
-					<code xmlns="">fim.S17000652.17000652001004</code>
-					<name xmlns="">fim.S17000652.17000652001004</name>
-				</MessageType>
-			</Qualifier>
-			<MsgSize>1738</MsgSize>
-		</h:MessageMetaData>
-	</s:Header>
-	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-		<GenericContentContainer xmlns="http://xoev.de/transport/xta/211">
-			<ContentContainer>
-				<Message contentType="application/xml" filename="Antrag.xml" size="1738">
-					<xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
-				</Message>
-			</ContentContainer>
-		</GenericContentContainer>
-	</s:Body>
-</s:Envelope>
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8e77bc1ff5e9f8e5f2b94137ee9c6e1501b43b04
--- /dev/null
+++ b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml
@@ -0,0 +1,18 @@
+<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
+	<s:Header>
+		<a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action>
+		<h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+			<ItemsPending>0</ItemsPending>
+		</h:MsgBoxResponse>
+		%s
+	</s:Header>
+	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+		<GenericContentContainer xmlns="http://xoev.de/transport/xta/211">
+			<ContentContainer>
+				<Message contentType="application/xml" filename="%s" size="%s">
+					<xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
+				</Message>
+			</ContentContainer>
+		</GenericContentContainer>
+	</s:Body>
+</s:Envelope>
diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/attachment.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml
similarity index 100%
rename from xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/attachment.xml
rename to xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml
diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml
similarity index 97%
rename from xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml
rename to xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml
index 8fead80cb247fd0f0b73e2722176340354cd08cf..361033e4e2a2a3e91f56f408481230dbe71f2e25 100644
--- a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml
+++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml
@@ -28,5 +28,5 @@
 			<code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code>
 		</MessageType>
 	</Qualifier>
-	<MsgSize>40142</MsgSize>
+	<MsgSize>%s</MsgSize>
 </MessageMetaData>
diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b5f50562d4406a57e481baea5a729329787cdd3f
--- /dev/null
+++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml
@@ -0,0 +1,32 @@
+<MessageMetaData xmlns="http://www.osci.eu/ws/2014/10/transport">
+	<DeliveryAttributes>
+		<Origin>2024-04-26T13:35:41.6323321Z</Origin>
+		<Delivery>2024-04-26T15:35:45.607</Delivery>
+	</DeliveryAttributes>
+	<Originators>
+		<Author>
+			<Identifier type="xoev" category="Generischer Antragsdienst">gad:010200200000</Identifier>
+		</Author>
+	</Originators>
+	<Destinations>
+		<Reader>
+			<Identifier type="xoev" category="Generischer Antragsempfänger">gae:dev-environment@ozg-cloud.de</Identifier>
+		</Reader>
+	</Destinations>
+	<MsgIdentification>
+		<a:MessageID>%s</a:MessageID>
+	</MsgIdentification>
+	<Qualifier>
+		<Service>urn:xoev-de:xdomea:schema:2.4.0/xdomea240Antrag.wsdl</Service>
+		<BusinessScenario>
+			<Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1">
+				<code xmlns="">XDOMEAGAD_DATA</code>
+				<name xmlns=""/>
+			</Defined>
+		</BusinessScenario>
+		<MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="urn:xoev-de:xdomea:schema:2.4.0">
+			<code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code>
+		</MessageType>
+	</Qualifier>
+	<MsgSize>%s</MsgSize>
+</MessageMetaData>
diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml
similarity index 97%
rename from xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml
rename to xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml
index 77f8e312dada38bba29bfe1e3cb6d14b168a9224..02b66074ed3eec73ec3018c92000bd6949821f3c 100644
--- a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml
+++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml
@@ -33,5 +33,5 @@
 			<name xmlns="">fim.S17000652.17000652001004</name>
 		</MessageType>
 	</Qualifier>
-	<MsgSize>1738</MsgSize>
+	<MsgSize>%s</MsgSize>
 </MessageMetaData>