diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
index b3e75f0cd900dd24d9095c7953939ae450d5db5c..592fea25bbffbe37a4ac7bc4896ddd8086ad0816 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java
@@ -35,6 +35,9 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	private static final String KEY_FACHNACHRICHT = "Fachnachricht";
 	private static final String KEY_POSTFACH_ID = "InboxReference";
 	private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1";
+	private static final String KEY_FORM_NAME = "Title";
+
+	static final String DEFAULT_FORM_NAME = "dFördermittelantrag: Ohne Titel";
 
 	@Autowired
 	private ServiceKontoFactory serviceKontoFactory;
@@ -48,9 +51,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	}
 
 	FormData processFachnachricht(FormData formData) {
-		@SuppressWarnings("unchecked")
-		Map<String, Object> fachnachricht = (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT,
-				Collections.<String, Object>emptyMap());
+		Map<String, Object> fachnachricht = getFachnachricht(formData);
 
 		var extendedFormData = addFormName(formData);
 		extendedFormData = addFormEngineName(extendedFormData);
@@ -58,6 +59,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 		return addOrganisationsEinheitId(extendedFormData, fachnachricht);
 	}
 
+
 	FormData addServiceKonto(FormData formData, Map<String, Object> fachnachricht) {
 		return Optional.ofNullable((String) fachnachricht.get(KEY_POSTFACH_ID))
 				.map(this::extractPrefix)
@@ -88,12 +90,20 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	FormData addFormName(FormData formData) {
 		return formData.toBuilder()
 				.header(formData.getHeader().toBuilder()
-						// TODO replace formName with actual name <Title> from Fachnachricht (KOP-2239)
-						.formName("dFördermittelantrag")
+						.formName(getFormName(formData).orElse(DEFAULT_FORM_NAME))
 						.build()
 				)
 				.build();
 	}
+	private Optional<String> getFormName(FormData formData) {
+		return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_FORM_NAME))
+				.filter(StringUtils::isNotBlank);
+	}
+
+	@SuppressWarnings("unchecked")
+	private Map<String, Object> getFachnachricht(FormData formData) {
+		return (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT, Collections.<String, Object>emptyMap());
+	}
 
 	FormData addFormEngineName(FormData formData) {
 		return formData.toBuilder()
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java
index 05473793842bc54d734988d7cf1ad872d5789b7a..8f3bcec4c6ac8eb48984b6f40c38fca0473d5fe5 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java
@@ -1,5 +1,7 @@
 package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel;
 
+import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelEngineBasedSemantikAdapter.*;
+import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelFormDataTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.assertj.core.api.InstanceOfAssertFactories.*;
 import static org.mockito.ArgumentMatchers.*;
@@ -9,6 +11,7 @@ import java.util.Collections;
 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;
@@ -220,18 +223,39 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 					DFoerdermittelFormDataTestFactory.createFachnachrichtMap());
 
 			assertThat(formData.getZustaendigeStelle()).isNotNull().extracting(ZustaendigeStelle::getOrganisationseinheitenId)
-					.isEqualTo(DFoerdermittelFormDataTestFactory.ORGANISATIONS_EINHEIT_ID);
+					.isEqualTo(ORGANISATIONS_EINHEIT_ID);
 		}
 	}
 
 	@Nested
 	class TestAddFormName {
 
+		@DisplayName("should have form name from title")
 		@Test
-		void shouldHaveFormName() {
-			var formData = adapter.addFormName(DFoerdermittelFormDataTestFactory.create());
+		void shouldHaveFormNameFromTitle() {
+			var formData = adapter.addFormName(createFormDataWithTitle(FORM_NAME));
 
-			assertThat(formData.getHeader().getFormName()).isEqualTo("dFördermittelantrag");
+			assertThat(formData.getHeader().getFormName()).isEqualTo(FORM_NAME);
+		}
+
+		@DisplayName("should have default form name for empty title")
+		@Test
+		void shouldHaveDefaultFormNameForEmptyTitle() {
+			var formData = adapter.addFormName(createFormDataWithTitle(""));
+
+			assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME);
+		}
+
+		@DisplayName("should have default form name for missing title")
+		@Test
+		void shouldHaveDefaultFormNameForMissingTitle() {
+			var formData = adapter.addFormName(createFormDataWithTitle(null));
+
+			assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME);
+		}
+
+		FormData createFormDataWithTitle(String title) {
+			return createFachnachrichtBuilder().title(title).build().createFormData();
 		}
 
 	}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java
index b99c66e48559d39b5c58e747c145a58dc0490363..969f4a635ed892e59106591f73d945b27f0b40be 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java
@@ -1,25 +1,69 @@
 package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel;
 
+import static java.util.stream.Collectors.*;
+
 import java.util.Map;
+import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.IntStream;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
+import lombok.Builder;
 
 class DFoerdermittelFormDataTestFactory {
 
+	static final String FORM_NAME = "Name of form";
 	static final String POSTFACH_ID = "4dd01647-b9d9-4775-1b50-08da3d83800a";
 	static final String ORGANISATIONS_EINHEIT_ID = "9795669";
 
+	static Fachnachricht.FachnachrichtBuilder createFachnachrichtBuilder() {
+		return Fachnachricht.builder()
+				.title(FORM_NAME)
+				.postfachId(POSTFACH_ID)
+				.organisationsEinheitId(ORGANISATIONS_EINHEIT_ID);
+	}
+
 	static FormData create() {
 		return createBuilder().build();
 	}
 
 	static FormData.FormDataBuilder createBuilder() {
+		return createBuilderWithFachnachricht(createFachnachrichtBuilder().build());
+	}
+
+	static FormData.FormDataBuilder createBuilderWithFachnachricht(Fachnachricht fachnachricht) {
 		return FormData.builder()
-				.formData(Map.of("Fachnachricht", createFachnachrichtMap()));
+				.formData(Map.of("Fachnachricht", createFachnachrichtMapWithFachnachricht(fachnachricht)));
 	}
 
 	static Map<String, Object> createFachnachrichtMap() {
-		return Map.of("InboxReference", "sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a",
-				"MetaText1", ORGANISATIONS_EINHEIT_ID);
+		return createFachnachrichtMapWithFachnachricht(createFachnachrichtBuilder().build());
+	}
+
+	static Map<String, Object> createFachnachrichtMapWithFachnachricht(Fachnachricht fachnachricht) {
+		return createMapWithValueFilter(
+				Objects::nonNull,
+				"Title", fachnachricht.title(),
+				"InboxReference", "sh/sh/" + fachnachricht.postfachId(),
+				"MetaText1", fachnachricht.organisationsEinheitId()
+		);
+	}
+
+	private static Map<String, Object> createMapWithValueFilter(Predicate<String> valuePredicate, String... keyValuePairs) {
+		if (keyValuePairs.length % 2 != 0) {
+			throw new IllegalArgumentException("Array length must be even to form key-value pairs.");
+		}
+
+		return IntStream.range(0, keyValuePairs.length / 2)
+				.boxed()
+				.filter(i -> valuePredicate.test(keyValuePairs[2 * i + 1]))
+				.collect(toMap(i -> keyValuePairs[2 * i], i -> keyValuePairs[2 * i + 1]));
+	}
+
+	@Builder
+	record Fachnachricht(String title, String postfachId, String organisationsEinheitId) {
+		FormData createFormData() {
+			return createBuilderWithFachnachricht(this).build();
+		}
 	}
 }