diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
index 0ad23b9e4e08d54aa7e356c3ea2cde213d0fc7f4..5c5f434fd84471469f5c6a05324b9ec94eab2a97 100644
--- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
+++ b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java
@@ -29,6 +29,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
@@ -61,6 +62,8 @@ public class FormDataTestFactory {
 			IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build());
 	public static final List<IncomingFile> REPRESENTATIONS = List.of(IncomingFileTestFactory.create());
 
+	public static final FormDataControl FORM_DATA_CONTROL = FormDataControlTestFactory.create();
+
 	public static final Map<String, Object> FORM_DATA = Map.of(
 			SIMPLE_VALUE_KEY, SIMPLE_VALUE,
 			SUBFORM_KEY, SUBFORM_VALUE,
@@ -76,7 +79,7 @@ public class FormDataTestFactory {
 				.header(FormHeaderTestFactory.create())
 				.antragsteller(AntragstellerTestFactory.create())
 				.zustaendigeStelle(ZustaendigeStelleTestFactory.create())
-				.control(FormDataControlTestFactory.create())
+				.control(FORM_DATA_CONTROL)
 				.formData(FORM_DATA)
 				// TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen
 				.numberOfAttachments(2)
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java
index f64fee934e5fd263903ce5a0143a05b80f4b051b..9dfc1519007b4f0bd2807f90cda31413ae8a28d9 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java
@@ -1,7 +1,9 @@
 package de.ozgcloud.eingang.fim;
 
 import java.util.Map;
+import java.util.Optional;
 
+import org.apache.commons.collections.MapUtils;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.eingang.common.formdata.Antragsteller;
@@ -24,30 +26,30 @@ class AntragstellerMapper implements FimEngineBasedMapper {
 
 	@Override
 	public FormData parseFormData(FormData formData) {
-		return formData.toBuilder()
-				.antragsteller(mapAntragsteller(formData.getFormData()))
-				.build();
+		return Optional.ofNullable(getAntragsteller(formData.getFormData()))
+				.filter(MapUtils::isNotEmpty)
+				.map(this::mapAntragsteller)
+				.map(antragsteller -> formData.toBuilder().antragsteller(antragsteller).build()).orElse(formData);
+	}
+
+	Map<String, Object> getAntragsteller(Map<String, Object> formData) {
+		return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY);
 	}
 
-	Antragsteller mapAntragsteller(Map<String, Object> formData) {
-		var antragsteller = getAntragsteller(formData);
+	Antragsteller mapAntragsteller(Map<String, Object> antragsteller) {
 		var anschrift = getAnschrift(antragsteller);
 
 		return Antragsteller.builder()
-				.vorname(FimDataUtil.getValue(antragsteller, VORNAME_KEY).orElse(null))
-				.nachname(FimDataUtil.getValue(antragsteller, NACHNAME_KEY).orElse(null))
-				.email(FimDataUtil.getValue(antragsteller, EMAIL_KEY).orElse(null))
-				.strasse(FimDataUtil.getValue(anschrift, STRASSE_KEY).orElse(null))
-				.hausnummer(FimDataUtil.getValue(anschrift, HAUSNUMMER_KEY).orElse(null))
-				.plz(FimDataUtil.getValue(anschrift, PLZ_KEY).orElse(null))
-				.ort(FimDataUtil.getValue(anschrift, ORT_KEY).orElse(null))
+				.vorname(FimDataUtil.getValueByKey(antragsteller, VORNAME_KEY).orElse(null))
+				.nachname(FimDataUtil.getValueByKey(antragsteller, NACHNAME_KEY).orElse(null))
+				.email(FimDataUtil.getValueByKey(antragsteller, EMAIL_KEY).orElse(null))
+				.strasse(FimDataUtil.getValueByKey(anschrift, STRASSE_KEY).orElse(null))
+				.hausnummer(FimDataUtil.getValueByKey(anschrift, HAUSNUMMER_KEY).orElse(null))
+				.plz(FimDataUtil.getValueByKey(anschrift, PLZ_KEY).orElse(null))
+				.ort(FimDataUtil.getValueByKey(anschrift, ORT_KEY).orElse(null))
 				.build();
 	}
 
-	private Map<String, Object> getAntragsteller(Map<String, Object> formData) {
-		return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY);
-	}
-
 	private Map<String, Object> getAnschrift(Map<String, Object> antragsteller) {
 		return FimDataUtil.getSubmap(antragsteller, ANSCHRIFT_KEY);
 	}
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java
index 75487f4b3eba8ddd41ae2856bc557be292ac67ae..cd406cce2d95d9679884597da32083f8d668110e 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java
@@ -1,10 +1,15 @@
 package de.ozgcloud.eingang.fim;
 
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.springframework.stereotype.Component;
+import org.w3c.dom.Document;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.IncomingFile;
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
@@ -31,11 +36,27 @@ public class FimBasedAdapter implements EngineBasedSemantikAdapter {
 		for (var mapper : mappers) {
 			processedFormData = mapper.parseFormData(processedFormData);
 		}
-
 		return processedFormData;
 	}
 
 	FormData addFormDataDataMap(FormData formData) {
-		return formData.toBuilder().formData(service.parseRequestData(formData)).build();
+		return formData.toBuilder().formData(parseRequestData(formData)).build();
+	}
+
+	Map<String, Object> parseRequestData(FormData formData) {
+		return service.findPrimaryRepresentation(formData).map(this::doParse).orElseGet(Collections::emptyMap);
+	}
+
+	Map<String, Object> doParse(IncomingFile file) {
+		try {
+			return processData(DocumentHelper.parse(file.getContentStream()));
+		} catch (Exception e) {
+			LOG.warn("Error on parsing Document.", e);
+			return Collections.<String, Object>emptyMap();
+		}
+	}
+
+	Map<String, Object> processData(Document content) {
+		return FimDocumentHelper.createProcessor(content, service.getScheme(content)).process();
 	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java
deleted file mode 100644
index b027412baa094ca2e8074eb58b45225cbd772d85..0000000000000000000000000000000000000000
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package de.ozgcloud.eingang.fim;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.function.BiFunction;
-
-import org.springframework.stereotype.Service;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-import lombok.extern.log4j.Log4j2;
-
-@Log4j2
-@Service
-class FimDataMapper implements BiFunction<Document, FimScheme, Map<String, Object>> {
-
-	private static final String LABEL_KEY = "label";
-	private static final String VALUE_KEY = "value";
-
-	@Override
-	public Map<String, Object> apply(Document document, FimScheme fimScheme) {
-		return extractDocumentData(document.getDocumentElement(), fimScheme);
-	}
-
-	Map<String, Object> extractDocumentData(Element documentRoot, FimScheme fimScheme) {
-		var data = new LinkedHashMap<String, Object>();
-		processNode(documentRoot, fimScheme, data, 0);
-		return data;
-	}
-
-	void processNode(Node element, FimScheme fimScheme, Map<String, Object> data, int level) {
-		LOG.debug(">".repeat(level) + " " + element.getNodeName());
-
-		var childNodes = element.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			if (childNodes.item(i) instanceof Element childElement) {
-				processElement(childElement, fimScheme, data, level);
-			}
-		}
-	}
-
-	void processElement(Element childElement, FimScheme fimScheme, Map<String, Object> data, int level) {
-		var fieldName = fimScheme.getFieldName(childElement.getNodeName());
-		var fieldNameWithoutNamespace = getFieldNameWithoutNamespace(childElement.getNodeName());
-		var label = fieldName.orElse(fieldNameWithoutNamespace);
-
-		if (isTextNode(childElement)) {
-			data.put(fieldNameWithoutNamespace, buildFieldMap(label, childElement.getTextContent()));
-		} else {
-			var childMap = new LinkedHashMap<String, Object>();
-			data.put(fieldNameWithoutNamespace, buildFieldMap(label, childMap));
-			processNode(childElement, fimScheme, childMap, level + 1);
-		}
-	}
-
-	private String getFieldNameWithoutNamespace(String nodeName) {
-		var fieldNameParts = nodeName.split(":");
-		return fieldNameParts[fieldNameParts.length - 1];
-	}
-
-	private boolean isTextNode(Node child) {
-		return child.getChildNodes().getLength() == 1 && child.getChildNodes().item(0) instanceof Text;
-	}
-
-	private Map<String, Object> buildFieldMap(String fieldName, Object obj) {
-		return Map.<String, Object>of(LABEL_KEY, fieldName, VALUE_KEY, obj);
-	}
-}
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java
index 06bbb98cec5de6c6bf94c13720693059a42ec76f..6d932ed9ee5642ad0010892cc2e5dc7f116124e0 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java
@@ -1,5 +1,6 @@
 package de.ozgcloud.eingang.fim;
 
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
@@ -15,21 +16,16 @@ class FimDataUtil {
 
 	static final String VALUE_KEY = "value";
 
-	public static Optional<String> getValue(Map<String, Object> data, String... path) {
-		var current = FimDataUtil.getSubmap(data, ArrayUtils.subarray(path, 0, path.length - 1));
+	public static Optional<String> getValue(Map<String, Object> data, String key, String... path) {
+		var current = FimDataUtil.getSubmap(data, ArrayUtils.subarray(path, 0, path.length));
 		if (Objects.isNull(current)) {
 			return Optional.empty();
 		}
-		var map = FimDataUtil.castToMap(MapUtils.getMap(current, path[path.length - 1]));
-		return Optional.ofNullable(FimDataUtil.getValueAsString(map));
+		return FimDataUtil.getValueByKey(current, key);
 	}
 
 	public static Map<String, Object> getSubmap(Map<String, Object> data, String... path) {
-		var current = data;
-		for (var step : path) {
-			current = FimDataUtil.getValueMapByKey(current, step);
-		}
-		return current;
+		return Arrays.stream(path).reduce(data, FimDataUtil::getValueMapByKey, (accumulator, combiner) -> combiner);
 	}
 
 	static Map<String, Object> getValueMapByKey(Map<String, Object> obj, String key) {
@@ -39,6 +35,11 @@ class FimDataUtil {
 				.orElse(null);
 	}
 
+	public static Optional<String> getValueByKey(Map<String, Object> data, String key) {
+		var map = FimDataUtil.castToMap(MapUtils.getMap(data, key));
+		return Optional.ofNullable(MapUtils.getString(map, VALUE_KEY));
+	}
+
 	@SuppressWarnings("unchecked")
 	private static Map<String, Object> castToMap(Map<?, ?> obj) {
 		return (Map<String, Object>) obj;
@@ -47,8 +48,4 @@ class FimDataUtil {
 	private static Map<String, Object> getValueAsMap(Map<String, Object> map) {
 		return FimDataUtil.castToMap(MapUtils.getMap(map, VALUE_KEY));
 	}
-
-	private static String getValueAsString(Map<String, Object> map) {
-		return (String) map.get(VALUE_KEY);
-	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..c629f7dd8d0ccc88aa4dfa3ad280b14399d79e84
--- /dev/null
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java
@@ -0,0 +1,71 @@
+package de.ozgcloud.eingang.fim;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.springframework.stereotype.Component;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@Component
+class FimDocumentHelper {
+
+	public static FimDocumentProcessor createProcessor(Document doc, FimScheme fimScheme) {
+		return new FimDocumentProcessor(doc, fimScheme);
+	}
+
+	@Log4j2
+	@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+	static class FimDocumentProcessor {
+
+		private static final String LABEL_KEY = "label";
+		private static final String VALUE_KEY = "value";
+
+		private final Document document;
+		private final FimScheme scheme;
+
+		public Map<String, Object> process() {
+			var data = new LinkedHashMap<String, Object>();
+			processNode(document.getDocumentElement(), data);
+			return Collections.unmodifiableMap(data);
+		}
+
+		void processNode(Node element, Map<String, Object> data) {
+			LOG.debug(() -> "process node... " + element.getNodeName());
+			DocumentHelper.getChildNodes(element.getChildNodes()).forEach(childElement -> processElement(childElement, data));
+		}
+
+		void processElement(Element element, Map<String, Object> data) {
+			if (DocumentHelper.isTextNode(element)) {
+				addToMap(element, data, element.getTextContent());
+			} else {
+				var childMap = new LinkedHashMap<String, Object>();
+				addToMap(element, data, childMap);
+				processNode(element, childMap);
+			}
+		}
+
+		private void addToMap(Element element, Map<String, Object> data, Object value) {
+			var fieldName = DocumentHelper.getFieldNameWithoutNamespace(element.getNodeName());
+			data.put(fieldName, buildFieldMap(getFieldName(element).orElse(fieldName), value));
+		}
+
+		private Optional<String> getFieldName(Element element) {
+			return scheme.getFieldName(element.getNodeName());
+		}
+
+		private Map<String, Object> buildFieldMap(String fieldName, Object obj) {
+			return Map.<String, Object>of(LABEL_KEY, fieldName, VALUE_KEY, obj);
+		}
+	}
+}
\ No newline at end of file
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java
index 5e7e6ca6e1ceb4ad714be35a289c11fe02333419..1269441bbe51bd8b99ddf0c5bd15fcf4be983737 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java
@@ -6,7 +6,9 @@ import java.util.Optional;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
 
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 import lombok.Getter;
 
 class FimScheme {
@@ -28,15 +30,18 @@ class FimScheme {
 	}
 
 	private void buildFieldIndex() {
-		var groupList = doc.getElementsByTagName("xs:element");
-		for (int i = 0; i < groupList.getLength(); i++) {
-			var group = (Element) groupList.item(i);
-			var groupName = group.getAttribute("name");
-			fieldIndex.put(groupName, group);
-		}
+		DocumentHelper.getChildNodes(getElements()).forEach(group -> fieldIndex.put(getName(group), group));
 	}
 
-	Optional<String> getFieldName(final String fieldName) {
+	private NodeList getElements() {
+		return doc.getElementsByTagName("xs:element");
+	}
+
+	private String getName(Element element) {
+		return element.getAttribute("name");
+	}
+
+	Optional<String> getFieldName(String fieldName) {
 		return schemeAdapter.getFieldName(fieldIndex, fieldName);
 	}
 }
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java
index e2097792bfee16fa4e04ae93d01f17b24005de8f..f4c6fe23afcd3d94c44df1f8bd08a7ccd4a54dfb 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java
@@ -4,36 +4,26 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 public abstract class FimSchemeAdapter {
 
-    public abstract FimSchemeIdentifier getIdentifier();
-
-    public Optional<String> getFieldName(final Map<String, Element> fieldIndex, final String fieldName) {
-        final String[] fieldNameParts = fieldName.split(":");
-        final String fieldNameWithoutNamespace = fieldNameParts[fieldNameParts.length - 1];
-        if (!fieldIndex.containsKey(fieldNameWithoutNamespace)) {
-            LOG.error("Cannot find Field: " + fieldName);
-            return Optional.empty();
-        }
-        final Element nodeNameElement = fieldIndex.get(fieldNameWithoutNamespace);
-        final Optional<String> nodeNameOpt = getNameForElement(nodeNameElement);
-        return nodeNameOpt.map(this::cleanNodeName);
-    }
-
-    public Optional<String> getNameForElement(final Element element) {
-        final NodeList nameTags = element.getElementsByTagName("name");
-        if (nameTags.getLength() != 1) {
-            return Optional.empty();
-        }
-        return Optional.ofNullable(nameTags.item(0).getTextContent());
-    }
-
-    public String cleanNodeName(final String s) {
-        return s.trim();
-    }
+	public abstract FimSchemeIdentifier getIdentifier();
+
+	public Optional<String> getFieldName(Map<String, Element> fieldIndex, String fieldName) {
+		var fieldNameWithoutNamespace = DocumentHelper.getFieldNameWithoutNamespace(fieldName);
+
+		if (!fieldIndex.containsKey(fieldNameWithoutNamespace)) {
+			LOG.error("Cannot find Field: " + fieldName);
+			return Optional.empty();
+		}
+		return getNameForElement(fieldIndex.get(fieldNameWithoutNamespace));
+	}
+
+	public Optional<String> getNameForElement(Element element) {
+		return DocumentHelper.getChildElement(element, "name");
+	}
 }
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java
index 580a3d9a4c70950c200e9f6cccfd40d789221ae2..f0e9330434bfdfc6cc1fbac5866bd403e47c2d1a 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java
@@ -4,8 +4,6 @@ import java.io.File;
 import java.io.IOException;
 import java.util.LinkedHashMap;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.springframework.core.io.ResourceLoader;
@@ -13,6 +11,7 @@ import org.w3c.dom.Document;
 import org.xml.sax.SAXException;
 
 import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -56,12 +55,12 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> {
 	}
 
 	private void initUnknownScheme() throws ParserConfigurationException {
-		put(createScheme(createDocumentBuilder().newDocument(), UnknownSchemeAdapter.UNKNOWN_SCHEME_NAME));
+		put(createScheme(DocumentHelper.getDocumentBuilder().newDocument(), UnknownSchemeAdapter.UNKNOWN_SCHEME_NAME));
 	}
 
 	private FimScheme loadFimScheme(String path) throws ParserConfigurationException, IOException, SAXException {
 		LOG.debug(() -> "Load FIM schema: " + path);
-		var doc = createDocumentBuilder().parse(getFile(path));
+		var doc = DocumentHelper.parse(getFile(path));
 		return createScheme(doc, getTargetNamespace(doc));
 	}
 
@@ -69,10 +68,6 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> {
 		this.put(scheme.getIdentifier(), scheme);
 	}
 
-	private DocumentBuilder createDocumentBuilder() throws ParserConfigurationException {
-		return DocumentBuilderFactory.newInstance().newDocumentBuilder();
-	}
-
 	private File getFile(String path) throws IOException {
 		return resourceLoader.getResource("classpath:" + path).getFile();
 	}
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java
index b0c2a5db8f5b5b698aea4f722001f9d504723696..b8b4143d04963a77a57844daf09c5dcc7b9df8f5 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java
@@ -1,16 +1,15 @@
 package de.ozgcloud.eingang.fim;
 
+import lombok.AccessLevel;
 import lombok.EqualsAndHashCode;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 @EqualsAndHashCode
 class FimSchemeIdentifier {
 
 	private final String schemeId;
 
-	FimSchemeIdentifier(String schemeId) {
-		this.schemeId = schemeId;
-	}
-
 	public static FimSchemeIdentifier fromString(String schemeId) {
 		return new FimSchemeIdentifier(schemeId);
 	}
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java
index 689bfae8147f7b103c53fca26eb5d1bfa271d404..121b7a9369c617c4270548297099a31469e2d470 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java
@@ -1,7 +1,5 @@
 package de.ozgcloud.eingang.fim;
 
-import java.util.Collections;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -25,32 +23,16 @@ public class FimService {
 
 	static final String DEFAULT_FORMDATA_REPRESENTATION_NAME = "Antrag.xml";
 
-	private final FimDataMapper fimDataMapper;
 	private final FimSchemeHelper schemeHelper;
-	private final DocumentHelper documentHelper;
 
-	public Map<String, Object> parseRequestData(FormData formData) {
-		return findRequestFile(formData).map(this::doParse).orElseGet(Collections::emptyMap);
-	}
-
-	Map<String, Object> doParse(IncomingFile file) {
-		try {
-			var content = documentHelper.parse(file);
-			var schemeIdentifier = getSchemeForIdentifier(getSchemeName(content));
-			return fimDataMapper.apply(content, schemeIdentifier);
-		} catch (Exception e) {
-			return Collections.<String, Object>emptyMap();
-		}
-	}
-
-	Optional<IncomingFile> findRequestFile(FormData formData) {
-		var primaryFormDataRepresentationName = getPrimaryRepresentationName(formData.getControl());
+	public Optional<IncomingFile> findPrimaryRepresentation(FormData formData) {
+		var representationName = getRepresentationName(formData.getControl());
 		return formData.getRepresentations().stream()
-				.filter(file -> file.getName().endsWith(primaryFormDataRepresentationName))
+				.filter(file -> file.getName().endsWith(representationName))
 				.findFirst();
 	}
 
-	String getPrimaryRepresentationName(FormDataControl formDataControl) {
+	String getRepresentationName(FormDataControl formDataControl) {
 		return formDataControl.getRepresentations().map(Representations::getPrimaryFormDataRepresentation)
 				.orElseGet(() -> {
 					LOG.warn("No entry point found in metadata file for fim data mapping. Trying default.");
@@ -58,13 +40,8 @@ public class FimService {
 				});
 	}
 
-	String getSchemeName(Document doc) {
-		return Optional.of(documentHelper.extractSchemeName(doc))
-				.filter(StringUtils::isNotEmpty)
-				.orElseThrow(() -> new FimException("XML Document does not provide a scheme."));
-	}
-
-	FimScheme getSchemeForIdentifier(String fimSchemaName) {
+	public FimScheme getScheme(Document document) {
+		var fimSchemaName = getSchemeName(document);
 		var fimScheme = schemeHelper.getScheme(fimSchemaName);
 
 		if (Objects.isNull(fimScheme)) {
@@ -73,4 +50,10 @@ public class FimService {
 		}
 		return fimScheme;
 	}
+
+	String getSchemeName(Document doc) {
+		return Optional.of(DocumentHelper.extractSchemeName(doc))
+				.filter(StringUtils::isNotEmpty)
+				.orElseThrow(() -> new FimException("XML Document does not provide a scheme."));
+	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java
index 31e45366490cf6bcd1c54fcba2e81b45ccd8355e..9309107809f45f4e177f440b4647df4120675e2c 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java
@@ -6,7 +6,6 @@ import java.util.Optional;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.FormHeader;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
@@ -15,20 +14,22 @@ import lombok.extern.log4j.Log4j2;
 @Component
 class HeaderMapper implements FimEngineBasedMapper {
 
+	static final String FORM_NAME_KEY = "F05002753";
+
 	@Override
 	public FormData parseFormData(FormData formData) {
-		return formData.toBuilder()
-				.header(buildHeader(formData))
-				.build();
+		return getFormName(formData.getFormData()).map(formName -> addFormName(formData, formName)).orElse(formData);
 	}
 
-	FormHeader buildHeader(FormData formData) {
-		return formData.getHeader().toBuilder()
-				.formName(getFormName(formData.getFormData()).orElse(null))
-				.build();
+	Optional<String> getFormName(Map<String, Object> formData) {
+		return FimDataUtil.getValue(formData, FORM_NAME_KEY, "G17003529", "G05001479", "G05001480");
 	}
 
-	Optional<String> getFormName(Map<String, Object> formData) {
-		return FimDataUtil.getValue(formData, "G17003529", "G05001479", "G05001480", "F05002753");
+	private FormData addFormName(FormData formData, String formName) {
+		return formData.toBuilder()
+				.header(formData.getHeader().toBuilder()
+						.formName(formName)
+						.build())
+				.build();
 	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java
index 69b20d1af523317fc741083b1ec198334a574afa..2190e23435ead3afd4b40399b1de1aa27fd44335 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java
@@ -3,10 +3,12 @@ package de.ozgcloud.eingang.fim;
 import java.util.Map;
 import java.util.Optional;
 
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Component;
 import org.w3c.dom.Element;
 
-@Service
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
+
+@Component
 class UnknownSchemeAdapter extends FimSchemeAdapter {
 
 	public static final String UNKNOWN_SCHEME_NAME = "unknown";
@@ -19,8 +21,6 @@ class UnknownSchemeAdapter extends FimSchemeAdapter {
 
 	@Override
 	public Optional<String> getFieldName(Map<String, Element> fieldIndex, String fieldName) {
-		var fieldNameParts = fieldName.split(":");
-		var fieldNameWithoutNamespace = fieldNameParts[fieldNameParts.length - 1];
-		return Optional.of(fieldNameWithoutNamespace);
+		return Optional.of(DocumentHelper.getFieldNameWithoutNamespace(fieldName));
 	}
 }
diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java
index 6b31ebfc85afe8082d52a47b433235410adfa50e..0e410f64de2854a09777ef948e7cd9417a2e2581 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java
@@ -1,26 +1,69 @@
 package de.ozgcloud.eingang.fim.common.xml;
 
+import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.util.Optional;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.springframework.stereotype.Component;
+import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
 import org.xml.sax.SAXException;
 
-import de.ozgcloud.eingang.common.formdata.IncomingFile;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
-@Component
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class DocumentHelper {
 
-	public Document parse(IncomingFile incomingFile) throws ParserConfigurationException, IOException, SAXException {
-		return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(incomingFile.getContentStream());
+	public static Document parse(InputStream inputStream) throws ParserConfigurationException, IOException, SAXException {
+		return getDocumentBuilder().parse(inputStream);
 	}
 
-	public String extractSchemeName(Document doc) {
+	public static Document parse(File file) throws ParserConfigurationException, IOException, SAXException {
+		return getDocumentBuilder().parse(file);
+	}
+
+	public static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
+		return DocumentBuilderFactory.newInstance().newDocumentBuilder();
+	}
+
+	public static String extractSchemeName(Document doc) {
 		var tagParts = doc.getDocumentElement().getTagName().split(":");
 		var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]);
 		return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix);
 	}
-}
+
+	public static Stream<Element> getChildNodes(NodeList childNodes) {
+		return IntStream.range(0, childNodes.getLength())
+				.mapToObj(childNodes::item)
+				.filter(Element.class::isInstance)
+				.map(Element.class::cast);
+	}
+
+	public static boolean isTextNode(Node child) {
+		return child.getChildNodes().getLength() == 1 && child.getChildNodes().item(0) instanceof Text;
+	}
+
+	public static String getFieldNameWithoutNamespace(String nodeName) {
+		var fieldNameParts = nodeName.split(":");
+		return fieldNameParts[fieldNameParts.length - 1];
+	}
+
+	public static Optional<String> getChildElement(Element element, String tagName) {
+		var nameTags = element.getElementsByTagName(tagName);
+		if (nameTags.getLength() != 1) {
+			return Optional.empty();
+		}
+		return Optional.ofNullable(nameTags.item(0).getTextContent()).map(StringUtils::trim);
+	}
+}
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java
index fe829d0ef1416d982a3644476b46cd3965a1bca2..f6daa78ea5d7a00b56f86ed99941c87e1e0d6cc7 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java
@@ -30,23 +30,78 @@ class AntragstellerMapperTest {
 
 		private final FormData formData = FormDataTestFactory.createBuilder().antragsteller(null).build();
 
-		@BeforeEach
-		void mock() {
-			doReturn(AntragstellerTestFactory.create()).when(mapper).mapAntragsteller(any());
+		@DisplayName("on existing antragsteller")
+		@Nested
+		class TestOnExistingAntragsteller {
+
+			private final Map<String, Object> antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap();
+			private final Antragsteller antragsteller = AntragstellerTestFactory.create();
+
+			@BeforeEach
+			void mock() {
+				doReturn(antragstellerMap).when(mapper).getAntragsteller(any());
+				doReturn(antragsteller).when(mapper).mapAntragsteller(any());
+			}
+
+			@Test
+			void shouldCallGetAntragsteller() {
+				mapper.parseFormData(formData);
+
+				verify(mapper).getAntragsteller(FormDataTestFactory.FORM_DATA);
+			}
+
+			@Test
+			void shouldCallMapAntragsteller() {
+				mapper.parseFormData(formData);
+
+				verify(mapper).mapAntragsteller(antragstellerMap);
+			}
+
+			@Test
+			void shouldReturnFormDataWithAntragsteller() {
+				var mappedFormData = mapper.parseFormData(formData);
+
+				assertThat(mappedFormData.getAntragsteller()).isNotNull();
+			}
 		}
 
+		@DisplayName("on missing antragsteller")
+		@Nested
+		class TestOnMissingAntragsteller {
+
+			@BeforeEach
+			void mock() {
+				doReturn(Collections.emptyMap()).when(mapper).getAntragsteller(any());
+			}
+
+			@Test
+			void shouldReturnNullAsAntragsteller() {
+				var mappedFormData = mapper.parseFormData(formData);
+
+				assertThat(mappedFormData.getAntragsteller()).isNull();
+			}
+		}
+	}
+
+	@DisplayName("Get antragsteller")
+	@Nested
+	class TestGetAntragsteller {
+
 		@Test
-		void shouldCallMapAntragsteller() {
-			mapper.parseFormData(formData);
+		void shouldReturnMapIfAntragstellerExists() {
+			var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap();
+			var formDataMap = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, Map.of(FimDataUtil.VALUE_KEY, antragstellerMap));
 
-			verify(mapper).mapAntragsteller(FormDataTestFactory.FORM_DATA);
+			var antragsteller = mapper.getAntragsteller(formDataMap);
+
+			assertThat(antragsteller).isNotEmpty().usingRecursiveComparison().isEqualTo(antragstellerMap);
 		}
 
 		@Test
-		void shouldReturnFormDataWithAntragsteller() {
-			var mappedFormData = mapper.parseFormData(formData);
+		void shouldReturnEmptyMapIfAntragstellerIsMissing() {
+			var antragsteller = mapper.getAntragsteller(Collections.emptyMap());
 
-			assertThat(mappedFormData.getAntragsteller()).isNotNull();
+			assertThat(antragsteller).isNull();
 		}
 	}
 
@@ -57,9 +112,8 @@ class AntragstellerMapperTest {
 		@Test
 		void shouldMap() {
 			var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap();
-			var formData = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap);
 
-			var antragsteller = mapper.mapAntragsteller(formData);
+			var antragsteller = mapper.mapAntragsteller(antragstellerMap);
 
 			assertThat(antragsteller).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create());
 		}
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java
index 2dc6ad5a0c7493e50cb4a5e2e02a363b94adfbbc..e72806960894dce1f415e28f1624369c96852c71 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java
@@ -36,13 +36,11 @@ public class AntragstellerTestFactory {
 	}
 
 	public static Map<String, Object> createAntragstellerAsFimMap() {
-		var antragsteller = new HashMap<String, Object>();
-		antragsteller.put(FimDataUtil.VALUE_KEY, Map.of(
+		return Map.of(
 				AntragstellerMapper.VORNAME_KEY, Map.of(FimDataUtil.VALUE_KEY, VORNAME),
 				AntragstellerMapper.NACHNAME_KEY, Map.of(FimDataUtil.VALUE_KEY, NACHNAME),
 				AntragstellerMapper.EMAIL_KEY, Map.of(FimDataUtil.VALUE_KEY, EMAIL),
-				AntragstellerMapper.ANSCHRIFT_KEY, createAnschriftAsFimMap()));
-		return antragsteller;
+				AntragstellerMapper.ANSCHRIFT_KEY, createAnschriftAsFimMap());
 	}
 
 	private static Map<String, Object> createAnschriftAsFimMap() {
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java
deleted file mode 100644
index 4d228a09a8129974a542414e66b7158c231ae9a0..0000000000000000000000000000000000000000
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package de.ozgcloud.eingang.fim;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.List;
-
-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.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.common.test.ReflectionTestUtils;
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
-import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
-
-class FimBaseAdapterTest {
-
-	@Spy
-	@InjectMocks
-	private FimBasedAdapter adapter;
-	@Mock
-	private FimEngineBasedMapper mapper;
-	@Mock
-	private FimService service;
-
-	@DisplayName("Is responsible")
-	@Nested
-	class TestIsResponsible {
-
-		@Test
-		void shouldReturnTrueOnFimFormEngineName() {
-			var formData = FormData.builder()
-					.header(FormHeaderTestFactory.createBuilder()
-							.formEngineName(FimBasedAdapter.FIM_FORM_ENGINE_NAME)
-							.build())
-					.build();
-
-			var isResponsible = adapter.isResponsible(formData);
-
-			assertThat(isResponsible).isTrue();
-		}
-	}
-
-	@DisplayName("Parse formData")
-	@Nested
-	class TestParseFormData {
-
-		private final FormData formData = FormDataTestFactory.create();
-		private final FormData mappedFormData = FormDataTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			doReturn(formData).when(adapter).addFormDataDataMap(any());
-
-			ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper));
-
-			when(mapper.parseFormData(any())).thenReturn(mappedFormData);
-		}
-
-		@Test
-		void shouldCallAddFormDataDataMap() {
-			adapter.parseFormData(formData);
-
-			verify(adapter).addFormDataDataMap(formData);
-		}
-
-		@Test
-		void shouldCallMapper() {
-			adapter.parseFormData(formData);
-
-			verify(mapper).parseFormData(formData);
-		}
-
-		@Test
-		void shouldReturnFormData() {
-			var parsedFormData = adapter.parseFormData(formData);
-
-			assertThat(parsedFormData).isEqualTo(mappedFormData);
-		}
-	}
-
-	@DisplayName("Add formData dataMap")
-	@Nested
-	class TestAddFormDataDataMap {
-
-		private final FormData formData = FormDataTestFactory.createBuilder().formData(null).build();
-
-		@BeforeEach
-		void mock() {
-			when(service.parseRequestData(any())).thenReturn(FormDataTestFactory.FORM_DATA);
-		}
-
-		@Test
-		void shouldCallService() {
-			adapter.addFormDataDataMap(formData);
-
-			verify(service).parseRequestData(formData);
-		}
-
-		@Test
-		void shouldReturnFormDataWithDataMap() {
-			var enrichedFormData = adapter.addFormDataDataMap(formData);
-
-			assertThat(enrichedFormData.getFormData()).isNotNull().isEqualTo(FormDataTestFactory.FORM_DATA);
-		}
-	}
-}
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java
index 683abc75602b2c494f016ad5508eab40cfcdc9de..e32906bc408d40d53b0fc8969f6aa0fa5fd63bf3 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java
@@ -22,6 +22,8 @@ import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl;
 import de.ozgcloud.eingang.common.formdata.FormData.Representations;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
+import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
+import lombok.SneakyThrows;
 
 @ITCase
 @ActiveProfiles({ "itcase", "test" })
@@ -127,8 +129,8 @@ class FimBasedAdapterITCase {
 
 		private Antragsteller createExpectedAntragsteller() {
 			return Antragsteller.builder()
-					.vorname("Jörg").nachname("Bolay")
-					.email("joerg.bolay@dataport.de")
+					.vorname("Jörg").nachname("Smith")
+					.email("example@email.de")
 					.strasse("Muster")
 					.hausnummer("1")
 					.plz("12345")
@@ -136,4 +138,39 @@ class FimBasedAdapterITCase {
 					.build();
 		}
 	}
+
+	@DisplayName("Process data")
+	@Nested
+	class TestDoParse {
+
+		@SneakyThrows
+		@Test
+		void shouldTransformSimpleDocument() {
+			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test2.xml")).build();
+
+			var formData = fimBasedAdapter.doParse(file);
+
+			assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest2AsMap());
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldTransformSimpleDocumentWithoutNamespace() {
+			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test3.xml")).build();
+
+			var formData = fimBasedAdapter.doParse(file);
+
+			assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest3AsMap());
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldTransformDocument() {
+			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/S17000652V1.4_test01.xml")).build();
+
+			var formData = fimBasedAdapter.doParse(file);
+
+			assertThat(formData).isNotEmpty().isEqualTo(FimDocumentTestHelper.getVersammlungsAnzeigeAsMap());
+		}
+	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java
index 07b9477b9d469b8392cc5b7eceac6bde9e98cb5c..39767e81d0c8def5bc9686d0809b60d892b3a204 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java
@@ -1,24 +1,42 @@
 package de.ozgcloud.eingang.fim;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.junit.jupiter.api.AfterEach;
+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.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.Spy;
+import org.w3c.dom.Document;
 
+import de.ozgcloud.common.test.ReflectionTestUtils;
+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.IncomingFile;
+import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
+import de.ozgcloud.eingang.fim.FimDocumentHelper.FimDocumentProcessor;
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 
 class FimBasedAdapterTest {
 
+	@Spy
 	@InjectMocks
 	private FimBasedAdapter adapter;
 	@Mock
 	private FimService service;
-	@Mock
-	private FimEngineBasedMapper mapper;
 
 	@DisplayName("Is responsible")
 	@Nested
@@ -34,4 +52,242 @@ class FimBasedAdapterTest {
 			assertThat(isResponsible).isTrue();
 		}
 	}
+
+	@DisplayName("Parse formData")
+	@Nested
+	class TestParseFormData {
+
+		private final FormData formData = FormDataTestFactory.create();
+		private final FormData enrichedFormData = FormDataTestFactory.create();
+		private final FormData processedFormData = FormDataTestFactory.create();
+
+		@Mock
+		private FimEngineBasedMapper mapper;
+
+		@BeforeEach
+		void initMocks() {
+			ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper));
+
+			doReturn(enrichedFormData).when(adapter).addFormDataDataMap(any());
+			doReturn(processedFormData).when(mapper).parseFormData(any());
+		}
+
+		@Test
+		void shouldCallAddFormDataDataMap() {
+			adapter.parseFormData(formData);
+
+			verify(adapter).addFormDataDataMap(formData);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			adapter.parseFormData(formData);
+
+			verify(mapper).parseFormData(enrichedFormData);
+		}
+
+		@Test
+		void shouldReturnProcessedData() {
+			var parsedFormData = adapter.parseFormData(formData);
+
+			assertThat(parsedFormData).isEqualTo(processedFormData);
+		}
+	}
+
+	@DisplayName("Add formData dataMap")
+	@Nested
+	class TestAddFormDataDataMap {
+
+		private final FormData formData = FormDataTestFactory.createBuilder().formData(null).build();
+		private final Map<String, Object> parsedFormDataDataMap = Collections.emptyMap();
+
+		@BeforeEach
+		void initMocks() {
+			doReturn(parsedFormDataDataMap).when(adapter).parseRequestData(any());
+		}
+
+		@Test
+		void shouldCallParseRequestData() {
+			adapter.addFormDataDataMap(formData);
+
+			verify(adapter).parseRequestData(formData);
+		}
+
+		@Test
+		void shouldHaveAddFormData() {
+			var enrichedFormData = adapter.addFormDataDataMap(formData);
+
+			assertThat(enrichedFormData.getFormData()).isEqualTo(parsedFormDataDataMap);
+		}
+	}
+
+	@DisplayName("Parse requestData")
+	@Nested
+	class TestParseRequestData {
+
+		private final FormData formData = FormDataTestFactory.create();
+
+		@DisplayName("on existing primary representation")
+		@Nested
+		class TestOnExistingPrimaryRepresentation {
+
+			private final IncomingFile representation = IncomingFileTestFactory.create();
+			private final Map<String, Object> parsedData = Collections.emptyMap();
+
+			@BeforeEach
+			void initMocks() {
+				when(service.findPrimaryRepresentation(any())).thenReturn(Optional.of(representation));
+				doReturn(parsedData).when(adapter).doParse(any());
+			}
+
+			@Test
+			void shouldCallServiceToFindPrimaryRepresentation() {
+				adapter.parseRequestData(formData);
+
+				verify(service).findPrimaryRepresentation(formData);
+			}
+
+			@Test
+			void shouldCallDoParse() {
+				adapter.parseRequestData(formData);
+
+				verify(adapter).doParse(representation);
+			}
+
+			@Test
+			void shouldReturnParsedData() {
+				var parsedRequestData = adapter.parseRequestData(formData);
+
+				assertThat(parsedRequestData).isEqualTo(parsedData);
+			}
+		}
+
+		@Test
+		void shouldReturnEmptyMapOnMissingPrimaryRepresentation() {
+			when(service.findPrimaryRepresentation(any())).thenReturn(Optional.empty());
+
+			var parsedRequestData = adapter.parseRequestData(formData);
+
+			assertThat(parsedRequestData).isEmpty();
+		}
+	}
+
+	@DisplayName("Do parse")
+	@Nested
+	class TestDoParse {
+
+		@Mock
+		private IncomingFile file;
+
+		private final InputStream inputStream = InputStream.nullInputStream();
+
+		@BeforeEach
+		void initMocks() {
+			when(file.getContentStream()).thenReturn(inputStream);
+		}
+
+		@Test
+		void shouldCallDocumentHelperParse() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				adapter.doParse(file);
+
+				helper.verify(() -> DocumentHelper.parse(inputStream));
+			}
+		}
+
+		@Test
+		void shouldCallProcessData() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				var parsedContent = mock(Document.class);
+				helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenReturn(parsedContent);
+
+				adapter.doParse(file);
+
+				verify(adapter).processData(parsedContent);
+			}
+		}
+
+		@Test
+		void shouldReturnProcessedContent() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				var parsedContent = mock(Document.class);
+				helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenReturn(parsedContent);
+				var processedMap = Collections.emptyMap();
+				doReturn(processedMap).when(adapter).processData(any());
+
+				var parsedData = adapter.doParse(file);
+
+				assertThat(parsedData).isEqualTo(processedMap);
+			}
+		}
+
+		@Test
+		void shouldReturnEmptyMapOnException() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenThrow(new RuntimeException());
+
+				var parsedData = adapter.doParse(file);
+
+				assertThat(parsedData).isEmpty();
+			}
+		}
+	}
+
+	@DisplayName("Process data")
+	@Nested
+	class TestProcessData {
+
+		@Mock
+		private Document content;
+		@Mock
+		private FimScheme scheme;
+
+		@Mock
+		private FimDocumentProcessor processor;
+
+		private MockedStatic<FimDocumentHelper> helper;
+		private final Map<String, Object> dataMap = Collections.<String, Object>emptyMap();
+
+		@BeforeEach
+		void initMocks() {
+			helper = mockStatic(FimDocumentHelper.class);
+			helper.when(() -> FimDocumentHelper.createProcessor(any(), any())).thenReturn(processor);
+
+			when(processor.process()).thenReturn(dataMap);
+			when(service.getScheme(any())).thenReturn(scheme);
+		}
+
+		@AfterEach
+		void tearDown() {
+			helper.close();
+		}
+
+		@Test
+		void shouldCallServiceToGetScheme() {
+			adapter.processData(content);
+
+			verify(service).getScheme(content);
+		}
+
+		@Test
+		void shouldCreateFimDocumentHelperProcessor() {
+			adapter.processData(content);
+
+			helper.verify(() -> FimDocumentHelper.createProcessor(content, scheme));
+		}
+
+		@Test
+		void shouldProcess() {
+			adapter.processData(content);
+
+			verify(processor).process();
+		}
+
+		@Test
+		void shouldReturnProcessedData() {
+			var processedData = adapter.processData(content);
+
+			assertThat(processedData).isEqualTo(dataMap);
+		}
+	}
 }
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java
deleted file mode 100644
index 9ca64413f8399857126bbbc64e590968a2acdf57..0000000000000000000000000000000000000000
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package de.ozgcloud.eingang.fim;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Map;
-
-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.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
-
-class FimDataMapperTest {
-
-	@Spy
-	@InjectMocks
-	private FimDataMapper mapper;
-
-	@DisplayName("Apply")
-	@Nested
-	class TestApply {
-
-		@Mock
-		private Document document;
-		@Mock
-		private Element element;
-		@Mock
-		private FimScheme fimScheme;
-		@Mock
-		private Map<String, Object> extractedDocumentData;
-
-		private final FormData formData = FormDataTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			when(document.getDocumentElement()).thenReturn(element);
-
-			doReturn(extractedDocumentData).when(mapper).extractDocumentData(any(), any());
-		}
-
-		@Test
-		void shouldCallExtractDocumentData() {
-			apply();
-
-			verify(mapper).extractDocumentData(element, fimScheme);
-		}
-
-		@Test
-		void shouldReturnFormDataMap() {
-			var appliedFormData = apply();
-
-			assertThat(appliedFormData).isEqualTo(extractedDocumentData);
-		}
-
-		private Map<String, Object> apply() {
-			return mapper.apply(document, fimScheme);
-		}
-	}
-
-	@DisplayName("Extract document data")
-	@Nested
-	class TestExtractDocumentData {
-
-		@Mock
-		private Element root;
-		@Mock
-		private FimScheme fimScheme;
-
-		@BeforeEach
-		void mock() {
-			doNothing().when(mapper).processNode(any(), any(), any(), anyInt());
-		}
-
-		@Test
-		void shouldCallProcessElement() {
-			mapper.extractDocumentData(root, fimScheme);
-
-			verify(mapper).processNode(eq(root), eq(fimScheme), any(), eq(0));
-		}
-
-		@Test
-		void shouldReturnCreatedMap() {
-			var dataMap = mapper.extractDocumentData(root, fimScheme);
-
-			assertThat(dataMap).isNotNull();
-		}
-	}
-
-	@DisplayName("Process element")
-	@Nested
-	class TestProcessElement {
-
-	}
-}
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java
index 41b9adca742b71b37d57bd78a9feb9d3806379c5..610263cc895893fd2abe162e469b405df679b7da 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java
@@ -1,24 +1,23 @@
 package de.ozgcloud.eingang.fim;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.Map;
 
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 
 import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
+
+import lombok.SneakyThrows;
 
 public class FimDocumentTestHelper {
 
 	private static final String RESOURCE_PATH = "src/test/resources/";
 
-	public static Document getTest1Document() throws ParserConfigurationException, IOException, SAXException {
+	public static Document getTest1Document() {
 		return loadDocument("test1.xml");
 	}
 
-	public static Document getTest2Document() throws ParserConfigurationException, IOException, SAXException {
+	public static Document getTest2Document() {
 		return loadDocument("test2.xml");
 	}
 
@@ -28,7 +27,7 @@ public class FimDocumentTestHelper {
 				"fim.S1236", Map.of("label", "fim.S1236", "value", "Testvalue 2"));
 	}
 
-	public static Document getTest3Document() throws ParserConfigurationException, IOException, SAXException {
+	public static Document getTest3Document() {
 		return loadDocument("test3.xml");
 	}
 
@@ -38,7 +37,7 @@ public class FimDocumentTestHelper {
 				"fim.S1236", Map.of("label", "fim.S1236", "value", "Testvalue 2"));
 	}
 
-	public static Document getVersammlungsAnzeigeDocument() throws ParserConfigurationException, IOException, SAXException {
+	public static Document getVersammlungsAnzeigeDocument() {
 		return loadDocument("S17000652V1.4_test01.xml");
 	}
 
@@ -85,11 +84,12 @@ public class FimDocumentTestHelper {
 				"F17003371", Map.of("label", "Anzeigenart", "value", "String"));
 	}
 
-	public static Document getAntragDocument() throws ParserConfigurationException, IOException, SAXException {
+	public static Document getAntragDocument() {
 		return loadDocument("antrag.xml");
 	}
 
-	private static Document loadDocument(String fileName) throws ParserConfigurationException, IOException, SAXException {
+	@SneakyThrows
+	private static Document loadDocument(String fileName) {
 		return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(RESOURCE_PATH + fileName));
 	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java
deleted file mode 100644
index 1830c32f8e77c4c928b51c4aedcf899a72c815d1..0000000000000000000000000000000000000000
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package de.ozgcloud.eingang.fim;
-
-import static org.assertj.core.api.Assertions.*;
-
-import java.io.File;
-
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
-
-import de.ozgcloud.common.test.ITCase;
-import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
-import lombok.SneakyThrows;
-
-@ITCase
-@ActiveProfiles({ "itcase", "test" })
-@ImportAutoConfiguration
-@SpringBootTest(classes = FimTestConfig.class)
-class FimServiceITCase {
-
-	@Autowired // NOSONAR
-	private FimService service;
-
-	@Nested
-	class TestGetSchemeForIdentifier {
-
-		@Test
-		void shouldNoFindInvalidScheme() {
-			var scheme = service.getSchemeForIdentifier("test");
-
-			assertThat(scheme.getIdentifier()).isEqualTo(FimSchemeIdentifier.fromString("unknown"));
-		}
-
-		@Test
-		void shouldFindVersammlungsScheme() {
-			var scheme = service.getSchemeForIdentifier("urn:xoev-de:xfall:standard:fim-s17000652_1.4");
-
-			assertThat(scheme).isNotNull();
-		}
-
-		@Test
-		void shouldFindTest2Scheme() {
-			var scheme = service.getSchemeForIdentifier("test2");
-
-			assertThat(scheme).isNotNull();
-		}
-	}
-
-	@Nested
-	class TestDoParse {
-
-		@SneakyThrows
-		@Test
-		void shouldTransformSimpleDocument() {
-			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test2.xml")).build();
-
-			var formData = service.doParse(file);
-
-			assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest2AsMap());
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldTransformSimpleDocumentWithoutNamespace() {
-			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test3.xml")).build();
-
-			var formData = service.doParse(file);
-
-			assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest3AsMap());
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldTransformDocument() {
-			var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/S17000652V1.4_test01.xml")).build();
-
-			var formData = service.doParse(file);
-
-			assertThat(formData).isNotEmpty().isEqualTo(FimDocumentTestHelper.getVersammlungsAnzeigeAsMap());
-		}
-	}
-}
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java
index f94ad5635e9066f8b899aa622310fe651202415b..4d090842c766264a4886e3251acf72358d0d6152 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java
@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.List;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
@@ -13,31 +14,77 @@ 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 org.w3c.dom.Document;
 
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormData.Representations;
 import de.ozgcloud.eingang.common.formdata.FormDataControlTestFactory;
+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.fim.common.errorhandling.FimException;
 import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 
 class FimServiceTest {
 
+	@Spy
 	@InjectMocks
 	private FimService service;
 	@Mock
 	private FimSchemeHelper schemeHelper;
-	@Mock
-	private DocumentHelper documentHelper;
 
-	@DisplayName("Get entry point")
+	@DisplayName("Find primary representation")
+	@Nested
+	class TestFindPrimaryRepresentation {
+
+		private final String representationName = LoremIpsum.getInstance().getName();
+		private final IncomingFile representationFile = IncomingFileTestFactory.createBuilder()
+				.name(representationName)
+				.build();
+		private final IncomingFile file = IncomingFileTestFactory.create();
+		private final FormData formData = FormDataTestFactory.createBuilder()
+				.clearRepresentations().representations(List.of(representationFile, file))
+				.build();
+
+		@BeforeEach
+		void initMocks() {
+			doReturn(representationName).when(service).getRepresentationName(any());
+		}
+
+		@Test
+		void shouldCallGetRepresentationName() {
+			service.findPrimaryRepresentation(formData);
+
+			verify(service).getRepresentationName(FormDataTestFactory.FORM_DATA_CONTROL);
+		}
+
+		@Test
+		void shouldReturnPrimaryRepresentationIfExists() {
+			var primaryRepresentation = service.findPrimaryRepresentation(formData);
+
+			assertThat(primaryRepresentation).hasValue(representationFile);
+		}
+
+		@Test
+		void shouldReturnEmptyIfMissing() {
+			var formDataWithoutMatchingRepresentation = FormDataTestFactory.createBuilder().clearRepresentations().representation(file).build();
+
+			var primaryRepresentation = service.findPrimaryRepresentation(formDataWithoutMatchingRepresentation);
+
+			assertThat(primaryRepresentation).isEmpty();
+		}
+	}
+
+	@DisplayName("Get representation name")
 	@Nested
-	class TestGetEntryPoint {
+	class TestGetRepresentationName {
 
 		@Test
 		void shouldReturnPrimaryRepresentationName() {
-			var result = service.getPrimaryRepresentationName(FormDataControlTestFactory.create());
+			var result = service.getRepresentationName(FormDataControlTestFactory.create());
 
 			assertThat(result).isEqualTo(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION);
 		}
@@ -46,7 +93,7 @@ class FimServiceTest {
 		void shouldReturnDefaultNameOnMissingRepresentations() {
 			var formDataControl = FormDataControlTestFactory.createBuilder().representations(Optional.empty()).build();
 
-			var result = service.getPrimaryRepresentationName(formDataControl);
+			var result = service.getRepresentationName(formDataControl);
 
 			assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME);
 		}
@@ -57,55 +104,34 @@ class FimServiceTest {
 					.representations(Optional.of(Representations.builder().build()))
 					.build();
 
-			var result = service.getPrimaryRepresentationName(formDataControl);
+			var result = service.getRepresentationName(formDataControl);
 
 			assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME);
 		}
 	}
 
-	@DisplayName("Get scheme name")
+	@DisplayName("Get scheme")
 	@Nested
-	class TestGetSchemeName {
+	class TestGetScheme {
 
 		@Mock
 		private Document doc;
+		@Mock
+		private FimScheme fimScheme;
 
 		private final String schemeName = LoremIpsum.getInstance().getName();
 
-		@Test
-		void shouldCallExtractSchemeName() {
-			doReturn(schemeName).when(documentHelper).extractSchemeName(any());
-
-			service.getSchemeName(doc);
-
-			verify(documentHelper).extractSchemeName(doc);
-		}
-
-		@Test
-		void shouldThrowExceptionOnEmptyName() {
-			doReturn(StringUtils.EMPTY).when(documentHelper).extractSchemeName(any());
-
-			assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class);
+		@BeforeEach
+		void initMocks() {
+			doReturn(schemeName).when(service).getSchemeName(any());
 		}
 
 		@Test
-		void shouldReturnValue() {
-			doReturn(schemeName).when(documentHelper).extractSchemeName(any());
+		void shouldCallGetSchemeName() {
+			service.getScheme(doc);
 
-			var schemeName = service.getSchemeName(doc);
-
-			assertThat(schemeName).isEqualTo(schemeName);
+			verify(service).getScheme(doc);
 		}
-	}
-
-	@DisplayName("Get scheme for identifier")
-	@Nested
-	class TestGetSchemeForIdentifier {
-
-		@Mock
-		private FimScheme fimScheme;
-
-		private final String schemeName = LoremIpsum.getInstance().getName();
 
 		@DisplayName("on existing scheme")
 		@Nested
@@ -118,14 +144,14 @@ class FimServiceTest {
 
 			@Test
 			void shouldCallSchemeHelper() {
-				service.getSchemeForIdentifier(schemeName);
+				service.getScheme(doc);
 
 				verify(schemeHelper).getScheme(schemeName);
 			}
 
 			@Test
 			void shouldReturnScheme() {
-				var scheme = service.getSchemeForIdentifier(schemeName);
+				var scheme = service.getScheme(doc);
 
 				assertThat(scheme).isEqualTo(fimScheme);
 			}
@@ -143,17 +169,58 @@ class FimServiceTest {
 
 			@Test
 			void shouldCallSchemeHelperToGetDefaultScheme() {
-				service.getSchemeForIdentifier(schemeName);
+				service.getScheme(doc);
 
 				verify(schemeHelper).getDefaultScheme();
 			}
 
 			@Test
 			void shouldReturnDefaultScheme() {
-				var scheme = service.getSchemeForIdentifier(schemeName);
+				var scheme = service.getScheme(doc);
 
 				assertThat(scheme).isEqualTo(fimScheme);
 			}
 		}
 	}
+
+	@DisplayName("Get scheme name")
+	@Nested
+	class TestGetSchemeName {
+
+		@Mock
+		private Document doc;
+
+		private final String schemeName = LoremIpsum.getInstance().getName();
+
+		@Test
+		void shouldCallExtractSchemeName() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(schemeName);
+
+				service.getSchemeName(doc);
+
+				helper.verify(() -> DocumentHelper.extractSchemeName(doc));
+			}
+		}
+
+		@Test
+		void shouldThrowExceptionOnEmptyName() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(StringUtils.EMPTY);
+
+				assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class);
+			}
+		}
+
+		@Test
+		void shouldReturnValue() {
+			try (var helper = mockStatic(DocumentHelper.class)) {
+				helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(schemeName);
+
+				var name = service.getSchemeName(doc);
+
+				assertThat(name).isEqualTo(schemeName);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f44c281882ae7a26d33fa4690e42c22fe801950b
--- /dev/null
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java
@@ -0,0 +1,100 @@
+package de.ozgcloud.eingang.fim;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Optional;
+
+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.mockito.InjectMocks;
+import org.mockito.Spy;
+
+import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
+import de.ozgcloud.eingang.common.formdata.FormHeader;
+import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
+
+class HeaderMapperTest {
+
+	@Spy
+	@InjectMocks
+	private HeaderMapper mapper;
+
+	@DisplayName("Parse formData")
+	@Nested
+	class TestParseFormData {
+
+		private final FormData formData = FormDataTestFactory.createBuilder().header(FormHeader.builder().build()).build();
+
+		@DisplayName("on existing formName")
+		@Nested
+		class TestOnExistingFormName {
+
+			@BeforeEach
+			void initMocks() {
+				doReturn(Optional.of(FormHeaderTestFactory.FORM_NAME)).when(mapper).getFormName(any());
+			}
+
+			@Test
+			void shouldCallBuildHeader() {
+				mapper.parseFormData(formData);
+
+				verify(mapper).getFormName(FormDataTestFactory.FORM_DATA);
+			}
+
+			@Test
+			void shouldReturnFormDataWithHeader() {
+				var mappedFormData = mapper.parseFormData(formData);
+
+				assertThat(mappedFormData.getHeader().getFormName()).isEqualTo(FormHeaderTestFactory.FORM_NAME);
+			}
+		}
+
+		@DisplayName("on missing formName")
+		@Nested
+		class TestOnMissingFormName {
+
+			@BeforeEach
+			void initMocks() {
+				doReturn(Optional.empty()).when(mapper).getFormName(any());
+			}
+
+			@Test
+			void shouldReturnOriginFormData() {
+				var mappedFormData = mapper.parseFormData(formData);
+
+				assertThat(mappedFormData).isEqualTo(formData);
+			}
+		}
+	}
+
+	@DisplayName("Get formName")
+	@Nested
+	class TestGetFormName {
+
+		@Test
+		void shouldCallFimDataUtilToGetValue() {
+			try (var helper = mockStatic(FimDataUtil.class)) {
+				mapper.getFormName(FormDataTestFactory.FORM_DATA);
+
+				helper.verify(
+						() -> FimDataUtil.getValue(FormDataTestFactory.FORM_DATA, HeaderMapper.FORM_NAME_KEY, "G17003529", "G05001479", "G05001480"));
+			}
+		}
+
+		@Test
+		void shouldReturnValue() {
+			try (var helper = mockStatic(FimDataUtil.class)) {
+				helper.when(() -> FimDataUtil.getValue(any(), any(), any(), any(), any())).thenReturn(Optional.of(FormHeaderTestFactory.FORM_NAME));
+
+				var formNameOpt = mapper.getFormName(FormDataTestFactory.FORM_DATA);
+
+				assertThat(formNameOpt).hasValue(FormHeaderTestFactory.FORM_NAME);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java
index 1821e0bf46530736df3fec0d9df5a0558b6f01e6..16ef2e4f9e4ef0b794c8a3e85dda9ded0130ca4c 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java
@@ -1,23 +1,22 @@
 package de.ozgcloud.eingang.fim;
 
-import org.springframework.stereotype.Service;
+import java.util.Optional;
+
+import org.springframework.stereotype.Component;
 import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 
-import java.util.Optional;
+import de.ozgcloud.eingang.fim.common.xml.DocumentHelper;
 
-@Service
+@Component
 public class TestNonStandardAdapter extends FimSchemeAdapter {
 
-    public FimSchemeIdentifier getIdentifier() {
-        return FimSchemeIdentifier.fromString("test2");
-    }
+	@Override
+	public FimSchemeIdentifier getIdentifier() {
+		return FimSchemeIdentifier.fromString("test2");
+	}
 
-    public Optional<String> getNameForElement(final Element element) {
-        final NodeList nameTags = element.getElementsByTagName("non-standard-name");
-        if (nameTags.getLength() != 1) {
-            return Optional.empty();
-        }
-        return Optional.ofNullable(nameTags.item(0).getTextContent());
-    }
+	@Override
+	public Optional<String> getNameForElement(Element element) {
+		return DocumentHelper.getChildElement(element, "non-standard-name");
+	}
 }
diff --git a/fim-adapter/src/test/resources/antrag.xml b/fim-adapter/src/test/resources/antrag.xml
index 530dc7313da0eada0f7e819023f95913d1f73d30..7b77f0d570d7aa4f484a6a0ec70532f5f627f35b 100644
--- a/fim-adapter/src/test/resources/antrag.xml
+++ b/fim-adapter/src/test/resources/antrag.xml
@@ -27,14 +27,14 @@
     <F17009191>false</F17009191>
     <G17002112>
         <F60000228>Jörg</F60000228>
-        <F60000227>Bolay</F60000227>
+        <F60000227>Smith</F60000227>
         <G60000086>
             <F60000243>Muster</F60000243>
             <F60000244>1</F60000244>
             <F60000246>12345</F60000246>
             <F60000247>Muster</F60000247>
         </G60000086>
-        <F60000242>joerg.bolay@dataport.de</F60000242>
+        <F60000242>example@email.de</F60000242>
         <F17009011>false</F17009011>
     </G17002112>
     <F17003371>Anzeigen einer ortsfesten Versammlung (Kundgebung / Demonstration)</F17003371>