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 5196efb4e91e3627882d2c7ecda22666a639deef..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
@@ -45,12 +45,12 @@ class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper {
 	public static final String TAG_BEZEICHNUNG = "OrganisationseinheitenBEZEICHNUNG";
 
 	@Autowired
-	private BayernZustaendigeStelleMetadataMapper bayernZustaendigeStelleMetadataMapper;
+	private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper;
 
 	@Override
 	public FormData parseFormData(FormData formData) {
-		if (bayernZustaendigeStelleMetadataMapper.isResponsible(formData)) {
-			return bayernZustaendigeStelleMetadataMapper.parseZustaendigeStelleData(formData);
+		if (zustaendigeStelleMetadataMapper.isResponsible(formData)) {
+			return zustaendigeStelleMetadataMapper.parseZustaendigeStelleData(formData);
 		}
 		return parseZustaendigeStelleData(formData);
 	}
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernData.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java
similarity index 83%
rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernData.java
rename to semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java
index 3b1b26b1af38aa9432d7f2e9a9538984970af4f5..1f085ab99a1b6c7005799b5e91e0618541e4a2af 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernData.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java
@@ -12,13 +12,18 @@ import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import lombok.Singular;
 
 @JacksonXmlRootElement(localName = "data")
+@Builder
 @Getter
-public class BayernData {
+@NoArgsConstructor
+@AllArgsConstructor
+public class ZustaendigeStelleData {
 
 	@JacksonXmlProperty(localName = "field")
 	@JacksonXmlElementWrapper(useWrapping = false)
+	@Singular
 	private List<Field> fields;
 
 	@Getter
@@ -29,10 +34,10 @@ public class BayernData {
 	public static class Field {
 
 		@JacksonXmlProperty(isAttribute = true)
-		String name;
+		private String name;
 
 		@JacksonXmlText
-		String value;
+		private String value;
 
 	}
 }
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java
similarity index 73%
rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapper.java
rename to semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java
index f60aef2ef21b221b08f60a2ffa3ca4a9da1c9c11..e8dfb7a420386457ead3c08b40aa0d7d623a0769 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapper.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java
@@ -4,16 +4,19 @@ import static java.util.Objects.*;
 
 import java.io.IOException;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 
+import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
@@ -21,7 +24,7 @@ import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 @Component
-public class BayernZustaendigeStelleMetadataMapper {
+public class ZustaendigeStelleMetadataMapper {
 
 	static final String BEHOERDE_METADATA_FILE_NAME = "behoerde_metadata.xml";
 
@@ -37,25 +40,33 @@ public class BayernZustaendigeStelleMetadataMapper {
 	static final String KEY_BEHOERDE_HAUSANSCHRIFT_PLZ = "behoerde_hausanschrift_plz";
 	static final String KEY_BEHOERDE_TELEFON = "behoerde_telefon";
 
+	@Autowired
+	private XmlMapper xmlMapper;
+
 	public FormData parseZustaendigeStelleData(FormData formData) {
 		return formData.getRepresentations().stream().filter(IS_BEHOERDE_METADATA).findAny()
-				.map(this::readBehoerdeMetadata)
+				.map(this::readZustaendigeStelleMetadata)
 				.map(this::mapZustaendigeStelle)
 				.map(zustaendigeStelle -> formData.toBuilder().zustaendigeStelle(zustaendigeStelle).build())
 				.orElse(formData);
 	}
 
-	Map<String, String> readBehoerdeMetadata(IncomingFile metadata) {
+	Map<String, String> readZustaendigeStelleMetadata(IncomingFile metadata) {
+		return readXmlContent(metadata).map(ZustaendigeStelleData::getFields).map(this::collectToMap).orElse(Collections.emptyMap());
+	}
+
+	Optional<ZustaendigeStelleData> readXmlContent(IncomingFile metadata) {
 		try {
-			var mapper = new XmlMapper();
-			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-			BayernData bayernData = mapper.readValue(metadata.getContentStream(), BayernData.class);
-			return bayernData.getFields().stream().filter(field -> nonNull(field.getValue()))
-					.collect(Collectors.toMap(BayernData.Field::getName, BayernData.Field::getValue));
-		} catch (IOException e) {
+			return Optional.of(xmlMapper.readValue(metadata.getContentStream(), ZustaendigeStelleData.class));
+		} catch (IOException | TechnicalException e) {
 			LOG.error("Error parsing {}", BEHOERDE_METADATA_FILE_NAME, e);
 		}
-		return Collections.emptyMap();
+		return Optional.empty();
+	}
+
+	Map<String, String> collectToMap(List<ZustaendigeStelleData.Field> fields) {
+		return fields.stream().filter(field -> nonNull(field.getValue()))
+				.collect(Collectors.toMap(ZustaendigeStelleData.Field::getName, ZustaendigeStelleData.Field::getValue));
 	}
 
 	ZustaendigeStelle mapZustaendigeStelle(Map<String, String> behoerdeMetadata) {
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java
index 7eda28f0c99b23c1f220a0708972232f059d9790..4f83cb409499a33c332c3b8226012cf210949ae8 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java
@@ -45,7 +45,7 @@ class AfmZustaendigeStelleMapperTest {
 	private AfmZustaendigeStelleMapper mapper;
 
 	@Mock
-	private BayernZustaendigeStelleMetadataMapper bayernZustaendigeStelleMetadataMapper;
+	private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper;
 
 	@Nested
 	class TestParseFormData {
@@ -105,9 +105,9 @@ class AfmZustaendigeStelleMapperTest {
 
 			@Test
 			void shouldCallParseBayernMetadata() {
-				when(bayernZustaendigeStelleMetadataMapper.isResponsible(any())).thenReturn(true);
+				when(zustaendigeStelleMetadataMapper.isResponsible(any())).thenReturn(true);
 				var expectedFormData = FormDataTestFactory.create();
-				when(bayernZustaendigeStelleMetadataMapper.parseZustaendigeStelleData(any())).thenReturn(expectedFormData);
+				when(zustaendigeStelleMetadataMapper.parseZustaendigeStelleData(any())).thenReturn(expectedFormData);
 
 				var resultFormData = parseFormData(formData);
 
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapperTest.java
deleted file mode 100644
index 4ab087e4bc6a22c1e31fb0bad1cec5ede722c25a..0000000000000000000000000000000000000000
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/BayernZustaendigeStelleMetadataMapperTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-package de.ozgcloud.eingang.semantik.enginebased.afm;
-
-import static de.ozgcloud.eingang.semantik.enginebased.afm.BayernZustaendigeStelleMetadataMapper.*;
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import java.io.File;
-import java.util.Map;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.Spy;
-
-import de.itvsh.kop.common.test.TestUtils;
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
-import de.ozgcloud.eingang.common.formdata.IncomingFile;
-import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
-import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
-import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory;
-import lombok.SneakyThrows;
-
-class BayernZustaendigeStelleMetadataMapperTest {
-
-	@Spy
-	private BayernZustaendigeStelleMetadataMapper mapper;
-
-	@Nested
-	class TestParseBehoerdeMetadata {
-
-		private IncomingFile behoerdeMetadataFile;
-
-		private FormData formData;
-
-		@BeforeEach
-		void setUp() {
-			behoerdeMetadataFile = IncomingFileTestFactory.createBuilder().name(BayernZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME)
-					.build();
-			formData = FormDataTestFactory.createBuilder()
-					.zustaendigeStelle(null)
-					.representation(behoerdeMetadataFile).build();
-		}
-
-		@Test
-		void shouldCallReadBehoerdeMetadata() {
-			mapper.parseZustaendigeStelleData(formData);
-
-			verify(mapper).readBehoerdeMetadata(behoerdeMetadataFile);
-		}
-
-		@Test
-		void shouldCallMapZustaendigeStelle() {
-			var behoerdeMetadata = Map.of("key", "value");
-			doReturn(behoerdeMetadata).when(mapper).readBehoerdeMetadata(behoerdeMetadataFile);
-
-			mapper.parseZustaendigeStelleData(formData);
-
-			verify(mapper).mapZustaendigeStelle(behoerdeMetadata);
-		}
-
-		@Test
-		void shouldSetParsedZustaendigeStelle() {
-			doReturn(Map.of("key", "value")).when(mapper).readBehoerdeMetadata(any());
-			var zustaendigeStelle = ZustaendigeStelleTestFactory.create();
-			doReturn(zustaendigeStelle).when(mapper).mapZustaendigeStelle(any());
-
-			var result = mapper.parseZustaendigeStelleData(formData);
-
-			assertThat(result.getZustaendigeStelle()).isEqualTo(zustaendigeStelle);
-		}
-	}
-
-	@Nested
-	class TestReadBehoerdeMetadata {
-
-		private IncomingFile behoerdeMetadataXml;
-
-		@SneakyThrows
-		@BeforeEach
-		void setUp() {
-			behoerdeMetadataXml = IncomingFileTestFactory.createBuilder()
-					.name(BayernZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME)
-					.file(new File(TestUtils.class.getClassLoader().getResource(BEHOERDE_METADATA_FILE_NAME).toURI())).build();
-		}
-
-		@Test
-		void shouldParseBehoerdeAnzeigeName() {
-			var expectedValue = "Landratsamt XYZ (Testbehörde für BDA)";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_ANZEIGE_NAME, expectedValue);
-		}
-
-		@Test
-		void shouldParseOrganisationEinheitId() {
-			var expectedValue = "87331322433";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_CALLER_ID, expectedValue);
-		}
-
-		@Test
-		void shouldParseGemeindeSchluesselBp() {
-			var expectedValue = "09189155";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_GEMEINDE_SCHLUESSEL_BP, expectedValue);
-		}
-
-		@Test
-		void shouldParseBehoerdeEmail() {
-			var expectedValue = "poststelle@testbehoerde.bayern";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_EMAIL, expectedValue);
-		}
-
-		@Test
-		void shouldParseAmtlicherRegionalSchlussel() {
-			var expectedValue = "091890000000";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_AMTLICHER_REGIONALSCHLUESSEL, expectedValue);
-		}
-
-		@Test
-		void shouldParseBehoerdeHausanschriftStrasse() {
-			var expectedValue = "Teststraße 1";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE, expectedValue);
-		}
-
-		@Test
-		void shouldParseBehoerdeHausanschriftOrt() {
-			var expectedValue = "Musterstadt";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_HAUSANSCHRIFT_ORT, expectedValue);
-		}
-
-		@Test
-		void shouldParseBehoerdeHausanschriftPlz() {
-			var expectedValue = "12345";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_HAUSANSCHRIFT_PLZ, expectedValue);
-		}
-
-		@Test
-		void shouldParseBehoerdeTelefon() {
-			var expectedValue = "+49 123 45-0";
-
-			var metadata = mapper.readBehoerdeMetadata(behoerdeMetadataXml);
-
-			assertThat(metadata).containsEntry(KEY_BEHOERDE_TELEFON, expectedValue);
-		}
-	}
-
-	@Nested
-	class TestMapZuestaendigeStelle {
-
-		private static final Map<String, String> BEHOERDE_METADATA = Map.of(
-				KEY_BEHOERDE_ANZEIGE_NAME, "beloerde-anzeige-name",
-				KEY_BEHOERDE_CALLER_ID, "behoerde-caller-id",
-				KEY_GEMEINDE_SCHLUESSEL_BP, "gemeinde-schluessel-bp",
-				KEY_BEHOERDE_EMAIL, "behoerde-email",
-				KEY_AMTLICHER_REGIONALSCHLUESSEL, "amtlicher-regionalschluessel",
-				KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE, "behoerde-hausanschrift-strasse",
-				KEY_BEHOERDE_HAUSANSCHRIFT_ORT, "behoerde-hausanschrift-ort",
-				KEY_BEHOERDE_HAUSANSCHRIFT_PLZ, "behoerde-hausanschrift-plz",
-				KEY_BEHOERDE_TELEFON, "behoerde-telefon"
-		);
-
-		@Test
-		void shouldSetBezeichnung() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getBezeichnung()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_ANZEIGE_NAME));
-		}
-
-		@Test
-		void shouldSetOrganisationEinheitId() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_CALLER_ID));
-		}
-
-		@Test
-		void shouldSetGemeindeSchluessel() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getGemeindeSchluessel()).isEqualTo(BEHOERDE_METADATA.get(KEY_GEMEINDE_SCHLUESSEL_BP));
-		}
-
-		@Test
-		void shouldSetEmail() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getEmail()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_EMAIL));
-		}
-
-		@Test
-		void shouldSetAmtlicherRegionalSchluessel() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getAmtlicherRegionalSchluessel()).isEqualTo(BEHOERDE_METADATA.get(KEY_AMTLICHER_REGIONALSCHLUESSEL));
-		}
-
-		@Test
-		void shouldSetHausanschriftStrasse() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getHausanschriftStrasse()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE));
-		}
-
-		@Test
-		void shouldSetHausanschriftOrt() {
-			var zusatendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zusatendigeStelle.getHausanschriftOrt()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_HAUSANSCHRIFT_ORT));
-		}
-
-		@Test
-		void shouldSetHausanschriftPlz() {
-			var zustaendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zustaendigeStelle.getHausanschriftPlz()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_HAUSANSCHRIFT_PLZ));
-		}
-
-		@Test
-		void shouldSetTelefon() {
-			var zusatendigeStelle = mapZustaendigeStelle();
-
-			assertThat(zusatendigeStelle.getTelefon()).isEqualTo(BEHOERDE_METADATA.get(KEY_BEHOERDE_TELEFON));
-		}
-
-		private ZustaendigeStelle mapZustaendigeStelle() {
-			return mapper.mapZustaendigeStelle(BEHOERDE_METADATA);
-		}
-	}
-
-	@Test
-	void shouldApproveResponsibility() {
-		var formData = FormDataTestFactory.createBuilder()
-				.representation(IncomingFileTestFactory.createBuilder().name(BayernZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME)
-						.build()).build();
-
-		var isResponsible = mapper.isResponsible(formData);
-
-		assertThat(isResponsible).isTrue();
-	}
-}
\ No newline at end of file
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7d82d624f06de55c99069480ce537b66edab2a3
--- /dev/null
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java
@@ -0,0 +1,62 @@
+package de.ozgcloud.eingang.semantik.enginebased.afm;
+
+import static de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleMetadataMapper.*;
+
+import java.util.List;
+import java.util.Map;
+
+import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.ZustaendigeStelleDataBuilder;
+
+public class ZustaendigeStelleDataTestFactory {
+	public static final String BEHOERDE_ANZEIGE_NAME = "Landratsamt XYZ (Testbehörde für BDA)";
+	public static final String BEHOERDE_CALLER_ID = "87331322433";
+	public static final String GEMEINDE_SCHLUESSEL_BP = "09189155";
+	public static final String BEHOERDE_EMAIL = "poststelle@testbehoerde.bayern";
+	public static final String AMTLICHER_REGIONALSCHLUESSEL = "091890000000";
+	public static final String BEHOERDE_HAUSANSCHRIFT_STRASSE = "Teststraße 1";
+	public static final String BEHOERDE_HAUSANSCHRIFT_ORT = "Musterstadt";
+	public static final String BEHOERDE_HAUSANSCHRIFT_PLZ = "12345";
+	public static final String BEHOERDE_TELEFON = "+49 123 45-0";
+
+	public static final Map<String, String> BEHOERDE_METADATA = Map.of(
+			KEY_BEHOERDE_ANZEIGE_NAME, BEHOERDE_ANZEIGE_NAME,
+			KEY_BEHOERDE_CALLER_ID, BEHOERDE_CALLER_ID,
+			KEY_GEMEINDE_SCHLUESSEL_BP, GEMEINDE_SCHLUESSEL_BP,
+			KEY_BEHOERDE_EMAIL, BEHOERDE_EMAIL,
+			KEY_AMTLICHER_REGIONALSCHLUESSEL, AMTLICHER_REGIONALSCHLUESSEL,
+			KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE, BEHOERDE_HAUSANSCHRIFT_STRASSE,
+			KEY_BEHOERDE_HAUSANSCHRIFT_ORT, BEHOERDE_HAUSANSCHRIFT_ORT,
+			KEY_BEHOERDE_HAUSANSCHRIFT_PLZ, BEHOERDE_HAUSANSCHRIFT_PLZ,
+			KEY_BEHOERDE_TELEFON, BEHOERDE_TELEFON
+	);
+
+	public static final List<ZustaendigeStelleData.Field> ZUSTAENDIGE_STELLE_DATA_FIELDS = List.of(
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_ANZEIGE_NAME)
+					.value(ZustaendigeStelleDataTestFactory.BEHOERDE_ANZEIGE_NAME).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_CALLER_ID)
+					.value(ZustaendigeStelleDataTestFactory.BEHOERDE_CALLER_ID).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_GEMEINDE_SCHLUESSEL_BP)
+					.value(ZustaendigeStelleDataTestFactory.GEMEINDE_SCHLUESSEL_BP).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_EMAIL).value(ZustaendigeStelleDataTestFactory.BEHOERDE_EMAIL)
+					.build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_AMTLICHER_REGIONALSCHLUESSEL)
+					.value(ZustaendigeStelleDataTestFactory.AMTLICHER_REGIONALSCHLUESSEL).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE)
+					.value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_STRASSE).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_ORT)
+					.value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_ORT).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_PLZ)
+					.value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_PLZ).build(),
+			ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_TELEFON).value(ZustaendigeStelleDataTestFactory.BEHOERDE_TELEFON)
+					.build()
+	);
+
+	public static ZustaendigeStelleData create() {
+		return createBuilder().build();
+	}
+
+	public static ZustaendigeStelleDataBuilder createBuilder() {
+		return ZustaendigeStelleData.builder()
+				.fields(ZUSTAENDIGE_STELLE_DATA_FIELDS);
+	}
+}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2508c76dde41ccc174ed79a3a97c23b08a883a50
--- /dev/null
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java
@@ -0,0 +1,20 @@
+package de.ozgcloud.eingang.semantik.enginebased.afm;
+
+import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.Field;
+import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.Field.FieldBuilder;
+
+public class ZustaendigeStelleMetadataFieldTestFactory {
+
+	public static final String FIELD_NAME = "name";
+	public static final String FIELD_VALUE = "value";
+
+	public static Field create() {
+		return createBuilder().build();
+	}
+
+	public static FieldBuilder createBuilder() {
+		return Field.builder()
+				.name(FIELD_NAME)
+				.value(FIELD_VALUE);
+	}
+}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5da34d86397802416e222b17f31722392944791d
--- /dev/null
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java
@@ -0,0 +1,173 @@
+package de.ozgcloud.eingang.semantik.enginebased.afm;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.io.File;
+import java.util.Map;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
+import de.ozgcloud.eingang.common.formdata.IncomingFile;
+import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
+import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
+import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory;
+import lombok.SneakyThrows;
+
+class ZustaendigeStelleMetadataMapperTest {
+
+	@Spy
+	@InjectMocks
+	private ZustaendigeStelleMetadataMapper mapper;
+
+	@Mock
+	private XmlMapper xmlMapper;
+
+	@Nested
+	class TestParseBehoerdeMetadata {
+
+		private IncomingFile behoerdeMetadataFile;
+
+		private FormData formData;
+
+		@BeforeEach
+		void setUp() {
+			behoerdeMetadataFile = IncomingFileTestFactory.createBuilder().name(ZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME)
+					.build();
+			formData = FormDataTestFactory.createBuilder()
+					.zustaendigeStelle(null)
+					.representation(behoerdeMetadataFile).build();
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldCallReadBehoerdeMetadata() {
+			doReturn(ZustaendigeStelleDataTestFactory.BEHOERDE_METADATA).when(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile);
+
+			mapper.parseZustaendigeStelleData(formData);
+
+			verify(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile);
+		}
+
+		@Test
+		void shouldCallMapZustaendigeStelle() {
+			var behoerdeMetadata = Map.of("key", "value");
+			doReturn(behoerdeMetadata).when(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile);
+
+			mapper.parseZustaendigeStelleData(formData);
+
+			verify(mapper).mapZustaendigeStelle(behoerdeMetadata);
+		}
+
+		@Test
+		void shouldSetParsedZustaendigeStelle() {
+			doReturn(Map.of("key", "value")).when(mapper).readZustaendigeStelleMetadata(any());
+			var zustaendigeStelle = ZustaendigeStelleTestFactory.create();
+			doReturn(zustaendigeStelle).when(mapper).mapZustaendigeStelle(any());
+
+			var result = mapper.parseZustaendigeStelleData(formData);
+
+			assertThat(result.getZustaendigeStelle()).isEqualTo(zustaendigeStelle);
+		}
+	}
+
+	@Nested
+	class TestReadBehoerdeMetadata {
+
+
+		private File brokenFile;
+
+
+	}
+
+	@Nested
+	class TestMapZuestaendigeStelle {
+
+		@Test
+		void shouldSetBezeichnung() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getBezeichnung()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_ANZEIGE_NAME);
+		}
+
+		@Test
+		void shouldSetOrganisationEinheitId() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_CALLER_ID);
+		}
+
+		@Test
+		void shouldSetGemeindeSchluessel() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getGemeindeSchluessel()).isEqualTo(ZustaendigeStelleDataTestFactory.GEMEINDE_SCHLUESSEL_BP);
+		}
+
+		@Test
+		void shouldSetEmail() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getEmail()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_EMAIL);
+		}
+
+		@Test
+		void shouldSetAmtlicherRegionalSchluessel() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getAmtlicherRegionalSchluessel()).isEqualTo(ZustaendigeStelleDataTestFactory.AMTLICHER_REGIONALSCHLUESSEL);
+		}
+
+		@Test
+		void shouldSetHausanschriftStrasse() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getHausanschriftStrasse()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_STRASSE);
+		}
+
+		@Test
+		void shouldSetHausanschriftOrt() {
+			var zusatendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zusatendigeStelle.getHausanschriftOrt()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_ORT);
+		}
+
+		@Test
+		void shouldSetHausanschriftPlz() {
+			var zustaendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zustaendigeStelle.getHausanschriftPlz()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_PLZ);
+		}
+
+		@Test
+		void shouldSetTelefon() {
+			var zusatendigeStelle = mapZustaendigeStelle();
+
+			assertThat(zusatendigeStelle.getTelefon()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_TELEFON);
+		}
+
+		private ZustaendigeStelle mapZustaendigeStelle() {
+			return mapper.mapZustaendigeStelle(ZustaendigeStelleDataTestFactory.BEHOERDE_METADATA);
+		}
+	}
+
+	@Test
+	void shouldApproveResponsibility() {
+		var formData = FormDataTestFactory.createBuilder()
+				.representation(IncomingFileTestFactory.createBuilder().name(ZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME)
+						.build()).build();
+
+		var isResponsible = mapper.isResponsible(formData);
+
+		assertThat(isResponsible).isTrue();
+	}
+}
\ No newline at end of file