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 755692329b83d31074fbdbebbfcfbf50f24e120b..17653d91cb1dbdb75c8dc4533e8075ce005faef0 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
@@ -5,7 +5,6 @@ import java.util.Map;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.eingang.common.formdata.Antragsteller;
-import de.ozgcloud.eingang.common.formdata.FormData;
 
 @Component
 class AntragstellerMapper {
@@ -22,7 +21,7 @@ class AntragstellerMapper {
 	static final String PLZ_KEY = "F60000246";
 	static final String ORT_KEY = "F60000247";
 
-	public Antragsteller map(FormData formData) {
+	public Antragsteller map(Map<String, Object> formData) {
 		var antragsteller = getAntragsteller(formData);
 		var anschrift = getAnschrift(antragsteller);
 
@@ -37,8 +36,8 @@ class AntragstellerMapper {
 				.build();
 	}
 
-	private Map<String, Object> getAntragsteller(FormData formData) {
-		return FimDataUtil.getSubmap(formData.getFormData(), ANTRAGSTELLER_KEY);
+	private Map<String, Object> getAntragsteller(Map<String, Object> formData) {
+		return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY);
 	}
 
 	private Map<String, Object> getAnschrift(Map<String, Object> antragsteller) {
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
index 86b2f8738e84035d602e577756f98ffaa41cfe21..8b91a29fa41c3489fa8a304423a36d10e1c6194d 100644
--- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java
+++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java
@@ -13,20 +13,16 @@ import org.w3c.dom.Text;
 import de.ozgcloud.eingang.common.formdata.FormData;
 import lombok.extern.log4j.Log4j2;
 
-@Service
 @Log4j2
-class FimDataMapper implements TriFunction<Document, FimScheme, FormData, FormData> {
+@Service
+class FimDataMapper implements TriFunction<Document, FimScheme, FormData, Map<String, Object>> {
 
 	private static final String LABEL_KEY = "label";
 	private static final String VALUE_KEY = "value";
 
 	@Override
-	public FormData apply(Document document, FimScheme fimScheme, FormData initialFormData) {
-		return FormData.builder()
-				.formData(extractDocumentData(document.getDocumentElement(), fimScheme))
-				.attachments(initialFormData.getAttachments())
-				.representations(initialFormData.getRepresentations())
-				.build();
+	public Map<String, Object> apply(Document document, FimScheme fimScheme, FormData initialFormData) {
+		return extractDocumentData(document.getDocumentElement(), fimScheme);
 	}
 
 	Map<String, Object> extractDocumentData(Element documentRoot, FimScheme fimScheme) {
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 447bf27985d0b08ad00abc3c4e0e164b29370507..f6b4bbb019ecd8807209cca4952cb63082f0e2da 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,15 +1,16 @@
 package de.ozgcloud.eingang.fim;
 
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.w3c.dom.Document;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.fim.common.errorhandling.FimException;
-import io.micrometer.common.util.StringUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
@@ -20,44 +21,52 @@ public class FimService {
 
 	private final FimDataMapper fimDataMapper;
 	private final AntragstellerMapper antragstellerMapper;
-	private final FimSchemeHelper schemeCatalogueHelper;
+	private final FimSchemeHelper schemeHelper;
 
-	public FormData transformDocument(Document document, FormData initialFormData) {
-		var schemeName = getSchemeName(document);
-		if (StringUtils.isEmpty(schemeName)) {
-			throw new FimException("XML Document does not provide a scheme");
-		}
-		var formData = fimDataMapper.apply(document, getSchemeForIdentifier(schemeName), initialFormData);
+	public FormData transformDocument(Document document, FormData formData) {
+		var formDataMap = getFormDataMap(document, formData);
 		return formData.toBuilder()
-				.header(initialFormData.getHeader())
-				.antragsteller(antragstellerMapper.map(formData))
-				.header(buildFormHeader(formData))
+				.formData(formDataMap)
+				.antragsteller(antragstellerMapper.map(formDataMap))
+				.header(buildFormHeader(formData, formDataMap))
 				.build();
 	}
 
-	private static String getSchemeName(Document doc) {
+	private Map<String, Object> getFormDataMap(Document document, FormData formData) {
+		return fimDataMapper.apply(document, getSchemeForIdentifier(getSchemeName(document)), formData);
+	}
+
+	String getSchemeName(Document doc) {
+		var schemeName = extractSchemeName(doc);
+		if (StringUtils.isEmpty(schemeName)) {
+			throw new FimException("XML Document does not provide a scheme.");
+		}
+		return schemeName;
+	}
+
+	String extractSchemeName(Document doc) {
 		var tagParts = doc.getDocumentElement().getTagName().split(":");
 		var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]);
 		return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix);
 	}
 
 	FimScheme getSchemeForIdentifier(String fimSchemaName) {
-		var fimScheme = schemeCatalogueHelper.getScheme(fimSchemaName);
+		var fimScheme = schemeHelper.getScheme(fimSchemaName);
 
 		if (Objects.isNull(fimScheme)) {
 			LOG.error("Cannot find schema for: " + fimSchemaName);
-			return schemeCatalogueHelper.getDefaultScheme();
+			return schemeHelper.getDefaultScheme();
 		}
 		return fimScheme;
 	}
 
-	private FormHeader buildFormHeader(FormData formData) {
+	FormHeader buildFormHeader(FormData formData, Map<String, Object> formDataMap) {
 		return formData.getHeader().toBuilder()
-				.formName(getVorgangsName(formData).orElse(null))
+				.formName(getVorgangsName(formDataMap).orElse(null))
 				.build();
 	}
 
-	private Optional<String> getVorgangsName(FormData formData) {
-		return FimDataUtil.getValue(formData.getFormData(), "G17003529", "G05001479", "G05001480", "F05002753");
+	Optional<String> getVorgangsName(Map<String, Object> formData) {
+		return FimDataUtil.getValue(formData, "G17003529", "G05001479", "G05001480", "F05002753");
 	}
 }
\ 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 80a4c0b6bb4f59a072b29dcff7375e3ceb252e8f..142f8c2a5f701c9196b42fd1e90728d0f8877847 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
@@ -11,7 +11,6 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 
 import de.ozgcloud.eingang.common.formdata.Antragsteller;
-import de.ozgcloud.eingang.common.formdata.FormData;
 
 class AntragstellerMapperTest {
 
@@ -25,7 +24,7 @@ class AntragstellerMapperTest {
 		@Test
 		void shouldMap() {
 			var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap();
-			var formData = FormData.builder().formData(Map.of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap)).build();
+			var formData = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap);
 
 			var antragsteller = mapper.map(formData);
 
@@ -34,7 +33,7 @@ class AntragstellerMapperTest {
 
 		@Test
 		void shouldMapEmpty() {
-			var formData = FormData.builder().formData(Collections.emptyMap()).build();
+			var formData = Collections.<String, Object>emptyMap();
 
 			var antragsteller = mapper.map(formData);
 
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
index 3a53dd9665d2678c5f1dc49e87817453704240b3..0ea6ec2b100bdc89d16f78b8b253e4fe17639090 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java
@@ -55,27 +55,13 @@ class FimDataMapperTest {
 		}
 
 		@Test
-		void shouldPutExtractDocumentDataInFormData() {
+		void shouldReturnFormDataMap() {
 			var appliedFormData = apply();
 
-			assertThat(appliedFormData.getFormData()).isEqualTo(extractedDocumentData);
+			assertThat(appliedFormData).isEqualTo(extractedDocumentData);
 		}
 
-		@Test
-		void shouldKeepAttachmentsInFormData() {
-			var appliedFormData = apply();
-
-			assertThat(appliedFormData.getAttachments()).isEqualTo(FormDataTestFactory.ATTACHMENTS);
-		}
-
-		@Test
-		void shouldKeepRepresentationsInFormData() {
-			var appliedFormData = apply();
-
-			assertThat(appliedFormData.getRepresentations()).isEqualTo(FormDataTestFactory.REPRESENTATIONS);
-		}
-
-		private FormData apply() {
+		private Map<String, Object> apply() {
 			return mapper.apply(document, fimScheme, formData);
 		}
 	}
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
index f54b961ef805c945f1416cc9292855d314c95c1c..ae3902ce142bdc5a1d1ec671c80ecdaf1baae079 100644
--- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java
@@ -36,7 +36,7 @@ class FimServiceITCase {
 		assertThatThrownBy(() -> {
 			final Document document = loadDocument("src/test/resources/test1.xml");
 			fimService.transformDocument(document, FormData.builder().build());
-		}).isInstanceOf(FimException.class).hasMessage("XML Document does not provide a scheme");
+		}).isInstanceOf(FimException.class).hasMessage("XML Document does not provide a scheme.");
 	}
 
 	@Test
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
new file mode 100644
index 0000000000000000000000000000000000000000..1c4cb152a7e4e117bea59eda5fcf700029bbb51c
--- /dev/null
+++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java
@@ -0,0 +1,267 @@
+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.Collections;
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+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 com.thedeanda.lorem.LoremIpsum;
+
+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;
+import de.ozgcloud.eingang.fim.common.errorhandling.FimException;
+
+class FimServiceTest {
+
+	@Spy
+	@InjectMocks
+	private FimService service;
+	@Mock
+	private FimDataMapper mapper;
+	@Mock
+	private AntragstellerMapper antragstellerMapper;
+	@Mock
+	private FimSchemeHelper schemeHelper;
+
+	@DisplayName("Transform document")
+	@Nested
+	class TestTransformDocument {
+
+		@Mock
+		private Document doc;
+		@Mock
+		private FimScheme fimScheme;
+
+		private final FormData formData = FormDataTestFactory.create();
+		private final String schemeName = LoremIpsum.getInstance().getName();
+		private final Map<String, Object> formDataMap = Collections.emptyMap();
+		private final FormHeader formHeader = FormHeaderTestFactory.create();
+
+		@BeforeEach
+		void mock() {
+			doReturn(schemeName).when(service).getSchemeName(any());
+			doReturn(fimScheme).when(service).getSchemeForIdentifier(any());
+			doReturn(formHeader).when(service).buildFormHeader(any(), any());
+
+			when(mapper.apply(any(), any(), any())).thenReturn(formDataMap);
+			when(antragstellerMapper.map(any())).thenReturn(AntragstellerTestFactory.create());
+		}
+
+		@Test
+		void shouldCallGetSchemeName() {
+			transformDocument();
+
+			verify(service).getSchemeName(doc);
+		}
+
+		@Test
+		void shouldCallGetSchemeForIdentifier() {
+			transformDocument();
+
+			verify(service).getSchemeForIdentifier(schemeName);
+		}
+
+		@Test
+		void shouldCallFimDataMapper() {
+			transformDocument();
+
+			verify(mapper).apply(doc, fimScheme, formData);
+		}
+
+		@Test
+		void shouldCallAntragstellerMapper() {
+			transformDocument();
+
+			verify(antragstellerMapper).map(formDataMap);
+		}
+
+		@Test
+		void shouldCallBuildFormHeader() {
+			transformDocument();
+
+			verify(service).buildFormHeader(formData, formDataMap);
+		}
+
+		@DisplayName("should return formdata contains")
+		@Nested
+		class TestShouldReturn {
+
+			@DisplayName("antragsteller")
+			@Test
+			void shouldReturnAntragsteller() {
+				var transformedFormData = transformDocument();
+
+				assertThat(transformedFormData.getAntragsteller()).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create());
+			}
+
+			@DisplayName("form header")
+			@Test
+			void shouldReturnFormHeader() {
+				var transformedFormData = transformDocument();
+
+				assertThat(transformedFormData.getHeader()).isEqualTo(formHeader);
+			}
+		}
+
+		private FormData transformDocument() {
+			return service.transformDocument(doc, formData);
+		}
+	}
+
+	@DisplayName("Get scheme name")
+	@Nested
+	class TestGetSchemeName {
+
+		@Mock
+		private Document doc;
+
+		private final String schemeName = LoremIpsum.getInstance().getName();
+
+		@Test
+		void shouldCallExtractSchemeName() {
+			doReturn(schemeName).when(service).extractSchemeName(any());
+
+			service.getSchemeName(doc);
+
+			verify(service).extractSchemeName(doc);
+		}
+
+		@Test
+		void shouldThrowExceptionOnEmptyName() {
+			doReturn(StringUtils.EMPTY).when(service).extractSchemeName(any());
+
+			assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			doReturn(schemeName).when(service).extractSchemeName(any());
+
+			var name = service.getSchemeName(doc);
+
+			assertThat(name).isEqualTo(schemeName);
+		}
+	}
+
+	@DisplayName("Get scheme for identifier")
+	@Nested
+	class TestGetSchemeForIdentifier {
+
+		@Mock
+		private FimScheme fimScheme;
+
+		private final String schemeName = LoremIpsum.getInstance().getName();
+
+		@DisplayName("on existing scheme")
+		@Nested
+		class TestOnExistingScheme {
+
+			@BeforeEach
+			void mock() {
+				when(schemeHelper.getScheme(any())).thenReturn(fimScheme);
+			}
+
+			@Test
+			void shouldCallSchemeHelper() {
+				service.getSchemeForIdentifier(schemeName);
+
+				verify(schemeHelper).getScheme(schemeName);
+			}
+
+			@Test
+			void shouldReturnScheme() {
+				var scheme = service.getSchemeForIdentifier(schemeName);
+
+				assertThat(scheme).isEqualTo(fimScheme);
+			}
+		}
+
+		@DisplayName("on missing scheme")
+		@Nested
+		class TestOnMissingScheme {
+
+			@BeforeEach
+			void mock() {
+				when(schemeHelper.getScheme(any())).thenReturn(null);
+				when(schemeHelper.getDefaultScheme()).thenReturn(fimScheme);
+			}
+
+			@Test
+			void shouldCallSchemeHelperToGetDefaultScheme() {
+				service.getSchemeForIdentifier(schemeName);
+
+				verify(schemeHelper).getDefaultScheme();
+			}
+
+			@Test
+			void shouldReturnDefaultScheme() {
+				var scheme = service.getSchemeForIdentifier(schemeName);
+
+				assertThat(scheme).isEqualTo(fimScheme);
+			}
+		}
+	}
+
+	@DisplayName("Build form header")
+	@Nested
+	class TestBuildFormHeader {
+
+		private final Map<String, Object> formDataMap = Collections.emptyMap();
+		private final FormData formData = FormDataTestFactory.createBuilder()
+				.header(FormHeaderTestFactory.createBuilder().formName(null).build())
+				.build();
+		private final String vorgangName = LoremIpsum.getInstance().getName();
+
+		@Test
+		void shouldCallGetVorgangName() {
+			service.buildFormHeader(formData, formDataMap);
+
+			verify(service).getVorgangsName(formDataMap);
+		}
+
+		@DisplayName("form name")
+		@Nested
+		class TestFormName {
+
+			@Test
+			void shouldSetIfVorgangNameExists() {
+				doReturn(Optional.of(vorgangName)).when(service).getVorgangsName(any());
+
+				var formHeader = service.buildFormHeader(formData, formDataMap);
+
+				assertThat(formHeader.getFormName()).isEqualTo(vorgangName);
+			}
+
+			@Test
+			void shouldBeNullIfVorgangNameNotExist() {
+				doReturn(Optional.empty()).when(service).getVorgangsName(any());
+
+				var formHeader = service.buildFormHeader(formData, formDataMap);
+
+				assertThat(formHeader.getFormName()).isNull();
+			}
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var formHeader = service.buildFormHeader(formData, formDataMap);
+
+			assertThat(formHeader).usingRecursiveComparison().isEqualTo(formData.getHeader());
+		}
+	}
+}
\ No newline at end of file