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 592fea25bbffbe37a4ac7bc4896ddd8086ad0816..cdba687ee3c7f2dc369d8b2342afc66972cdaf75 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
@@ -8,6 +8,8 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
+import java.util.stream.Stream;
 
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -17,11 +19,12 @@ import org.springframework.stereotype.Component;
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
 import de.ozgcloud.eingang.common.formdata.ServiceKonto;
 import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
-import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter;
 import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory;
+import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
@@ -36,8 +39,9 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	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";
+	private static final String KEY_FORM_ID = "ProjectTitle";
 
-	static final String DEFAULT_FORM_NAME = "dFördermittelantrag: Ohne Titel";
+	static final String DEFAULT_FORM_NAME = "dFördermittelantrag";
 
 	@Autowired
 	private ServiceKontoFactory serviceKontoFactory;
@@ -51,26 +55,49 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	}
 
 	FormData processFachnachricht(FormData formData) {
-		Map<String, Object> fachnachricht = getFachnachricht(formData);
+		return pipe(
+				Stream.of(
+						this::addFormName,
+						this::addFormEngineName,
+						this::addServiceKonto,
+						this::addOrganisationsEinheitId,
+						this::addFormId
+				)
+		).apply(formData);
+	}
 
-		var extendedFormData = addFormName(formData);
-		extendedFormData = addFormEngineName(extendedFormData);
-		extendedFormData = addServiceKonto(extendedFormData, fachnachricht);
-		return addOrganisationsEinheitId(extendedFormData, fachnachricht);
+	private UnaryOperator<FormData> pipe(Stream<UnaryOperator<FormData>> functions) {
+		return (formData) -> functions
+				.reduce(formData, (acc, f) -> f.apply(acc), (a, b) -> a);
 	}
 
+	FormData addFormId(FormData formData) {
+		return getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_ID)
+				.map(formId -> mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formId(formId)))
+				.orElse(formData);
+	}
 
-	FormData addServiceKonto(FormData formData, Map<String, Object> fachnachricht) {
-		return Optional.ofNullable((String) fachnachricht.get(KEY_POSTFACH_ID))
+	private Optional<String> getNonEmptyFachnachrichtValueByKey(FormData formData, String key) {
+		return Optional.ofNullable((String) getFachnachricht(formData).get(key))
+				.filter(StringUtils::isNotBlank);
+	}
+
+	private FormData mapWithModifiedHeader(FormData formData, UnaryOperator<FormHeader.FormHeaderBuilder> headerBuilderOperator) {
+		return formData.toBuilder()
+				.header(headerBuilderOperator.apply(formData.getHeader().toBuilder()).build())
+				.build();
+	}
+
+	FormData addServiceKonto(FormData formData) {
+		return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_POSTFACH_ID))
 				.map(this::extractPrefix)
 				.map(this::createServiceKonto)
-				.map(serviceKonto -> formData.getHeader().toBuilder().serviceKonto(serviceKonto).build())
-				.map(header -> formData.toBuilder().header(header).build())
+				.map(serviceKonto -> mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.serviceKonto(serviceKonto)))
 				.orElse(formData);
 	}
 
-	FormData addOrganisationsEinheitId(FormData formData, Map<String, Object> fachnachricht) {
-		return Optional.ofNullable((String) fachnachricht.get(KEY_ORGANISATIONS_EINHEIT_ID))
+	FormData addOrganisationsEinheitId(FormData formData) {
+		return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_ORGANISATIONS_EINHEIT_ID))
 				.map(orgaId -> addOrganisationsEinheitId(orgaId, formData.getZustaendigeStelle()))
 				.map(zustStelle -> formData.toBuilder().zustaendigeStelle(zustStelle).build())
 				.orElse(formData);
@@ -88,16 +115,10 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	}
 
 	FormData addFormName(FormData formData) {
-		return formData.toBuilder()
-				.header(formData.getHeader().toBuilder()
-						.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);
+		return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formName(
+				getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_NAME)
+						.orElse(DEFAULT_FORM_NAME)
+		));
 	}
 
 	@SuppressWarnings("unchecked")
@@ -106,12 +127,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema
 	}
 
 	FormData addFormEngineName(FormData formData) {
-		return formData.toBuilder()
-				.header(formData.getHeader().toBuilder()
-						.formEngineName("dFördermittelantrag")
-						.build()
-				)
-				.build();
+		return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formEngineName("dFördermittelantrag"));
 	}
 
 	String extractPrefix(@NonNull String postfachId) {
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 8f3bcec4c6ac8eb48984b6f40c38fca0473d5fe5..110e80b7d0a2f055a9624458e3ae15594ef87d86 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
@@ -22,6 +22,7 @@ import de.ozgcloud.common.binaryfile.TempFileUtils;
 import de.ozgcloud.common.test.TestUtils;
 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.PostfachAddressTestFactory;
 import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory;
@@ -153,22 +154,23 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 		@Mock
 		FormData formData4;
 
+		@Mock
+		FormData formData5;
+
 		@BeforeEach
 		void mock() {
-			var formData = DFoerdermittelFormDataTestFactory.create();
-			var fachnachrichtMap = DFoerdermittelFormDataTestFactory.createFachnachrichtMap();
-			when(formData0.getFormData()).thenReturn(formData.getFormData());
 			doReturn(formData1).when(adapter).addFormName(formData0);
 			doReturn(formData2).when(adapter).addFormEngineName(formData1);
-			doReturn(formData3).when(adapter).addServiceKonto(formData2, fachnachrichtMap);
-			doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3, fachnachrichtMap);
+			doReturn(formData3).when(adapter).addServiceKonto(formData2);
+			doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3);
+			doReturn(formData5).when(adapter).addFormId(formData4);
 		}
 
 		@Test
 		void shouldReturn() {
 			var processedFormData = adapter.processFachnachricht(formData0);
 
-			assertThat(processedFormData).isEqualTo(formData4);
+			assertThat(processedFormData).isEqualTo(formData5);
 		}
 	}
 
@@ -182,8 +184,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 
 		@Test
 		void shouldHaveServiceKonto() {
-			var formData = adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create(),
-					DFoerdermittelFormDataTestFactory.createFachnachrichtMap());
+			var formData = adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create());
 
 			assertThat(formData.getHeader().getServiceKonto().getPostfachAddresses().get(0).getIdentifier())
 					.asInstanceOf(type(StringBasedIdentifier.class)).extracting(StringBasedIdentifier::getPostfachId)
@@ -192,7 +193,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 
 		@Test
 		void shouldRemovePrefix() {
-			adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create(), DFoerdermittelFormDataTestFactory.createFachnachrichtMap());
+			adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create());
 
 			verify(serviceKontoFactory).buildOsiServiceKonto(DFoerdermittelFormDataTestFactory.POSTFACH_ID);
 		}
@@ -219,8 +220,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 	class TestAddOrganisationsEinheitId {
 		@Test
 		void shouldHaveOrganisationsEinheitId() {
-			var formData = adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create(),
-					DFoerdermittelFormDataTestFactory.createFachnachrichtMap());
+			var formData = adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create());
 
 			assertThat(formData.getZustaendigeStelle()).isNotNull().extracting(ZustaendigeStelle::getOrganisationseinheitenId)
 					.isEqualTo(ORGANISATIONS_EINHEIT_ID);
@@ -260,6 +260,40 @@ class DFoerdermittelEngineBasedSemantikAdapterTest {
 
 	}
 
+	@DisplayName("add form id")
+	@Nested
+	class TestAddFormId {
+
+		@DisplayName("should get form id from project title")
+		@Test
+		void shouldGetFormIdFromProjectTitle() {
+			var formData = adapter.addFormId(createFormDataWithProjectTitle(FORM_ID));
+
+			assertThat(formData.getHeader().getFormId()).isEqualTo(FORM_ID);
+		}
+
+		@DisplayName("should keep form id if project title is empty")
+		@Test
+		void shouldKeepFormIdIfProjectTitleIsEmpty() {
+			var formData = adapter.addFormId(createFormDataWithProjectTitle(""));
+
+			assertThat(formData.getHeader().getFormId()).isEqualTo(FormHeaderTestFactory.FORM_ID);
+		}
+
+		@DisplayName("should keep form id if project title is null")
+		@Test
+		void shouldKeepFormIdIfProjectTitleIsNull() {
+			var formData = adapter.addFormId(createFormDataWithProjectTitle(null));
+
+			assertThat(formData.getHeader().getFormId()).isEqualTo(FormHeaderTestFactory.FORM_ID);
+		}
+
+		FormData createFormDataWithProjectTitle(String projectTitle) {
+			return createFachnachrichtBuilder().projectTitle(projectTitle).build().createFormData();
+		}
+
+	}
+
 	@Nested
 	class TestAddFormEngineName {
 
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 969f4a635ed892e59106591f73d945b27f0b40be..8b8c9bf4103b13f085a7910361925a11e7b90297 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
@@ -8,17 +8,20 @@ import java.util.function.Predicate;
 import java.util.stream.IntStream;
 
 import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
 import lombok.Builder;
 
 class DFoerdermittelFormDataTestFactory {
 
 	static final String FORM_NAME = "Name of form";
+	static final String FORM_ID = "Wert von ProjectTitle";
 	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)
+				.projectTitle(FORM_ID)
 				.postfachId(POSTFACH_ID)
 				.organisationsEinheitId(ORGANISATIONS_EINHEIT_ID);
 	}
@@ -33,6 +36,7 @@ class DFoerdermittelFormDataTestFactory {
 
 	static FormData.FormDataBuilder createBuilderWithFachnachricht(Fachnachricht fachnachricht) {
 		return FormData.builder()
+				.header(FormHeaderTestFactory.create())
 				.formData(Map.of("Fachnachricht", createFachnachrichtMapWithFachnachricht(fachnachricht)));
 	}
 
@@ -44,6 +48,7 @@ class DFoerdermittelFormDataTestFactory {
 		return createMapWithValueFilter(
 				Objects::nonNull,
 				"Title", fachnachricht.title(),
+				"ProjectTitle", fachnachricht.projectTitle(),
 				"InboxReference", "sh/sh/" + fachnachricht.postfachId(),
 				"MetaText1", fachnachricht.organisationsEinheitId()
 		);
@@ -61,7 +66,7 @@ class DFoerdermittelFormDataTestFactory {
 	}
 
 	@Builder
-	record Fachnachricht(String title, String postfachId, String organisationsEinheitId) {
+	record Fachnachricht(String title, String projectTitle, String postfachId, String organisationsEinheitId) {
 		FormData createFormData() {
 			return createBuilderWithFachnachricht(this).build();
 		}