diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..28700d38cc1435fa9942e1b083cda0e1cdafa341
--- /dev/null
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java
@@ -0,0 +1,59 @@
+package de.ozgcloud.eingang.semantik.enginebased.formcycle;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.eingang.common.formdata.Antragsteller;
+import de.ozgcloud.eingang.common.formdata.FormData;
+
+@Component
+@ConditionalOnBean(FormCycleEngineBasedAdapter.class)
+public class FormcycleAntragstellerMapper implements FormcycleEngineBasedMapper {
+
+	static final String KEY_ANTRAGSTELLER = "fsBKAllDaten";
+	static final String KEY_ANREDE = "tfAntragstellerAnrede";
+	static final String KEY_VORNAME = "tfAntragstellerVorname";
+	static final String KEY_NACHNAME = "tfAntragstellerNachname";
+	static final String KEY_GEBURTSNAME = "tfAntragstellerGeburtsname";
+	static final String KEY_GEBURTSDATUM = "tfAntragstellerGeburtsdatum";
+	static final String KEY_GEBURTSORT = "tfAntragstellerGeburtsort";
+	static final String KEY_EMAIL = "tfAntragstellerEmail";
+	static final String KEY_TELEFON = "tfAntragstellerTelefon";
+	static final String KEY_ADDRESS = "tfAntragstellerAdresse";
+	static final String KEY_PLZ = "tfAntragstellerPLZ";
+	static final String KEY_ORT = "tfAntragstellerOrt";
+
+	@Override
+	public FormData parseFormData(final FormData formData) {
+		return getAntragstellerData(formData.getFormData())
+				.map(this::buildAntragsteller)
+				.map(antragsteller -> formData.toBuilder().antragsteller(antragsteller).build())
+				.orElse(formData);
+	}
+
+	@SuppressWarnings("unchecked")
+	Optional<Map<String, Object>> getAntragstellerData(Map<String, Object> formDataMap) {
+		var antragstellerData = (Map<String, Object>) MapUtils.getMap(formDataMap, KEY_ANTRAGSTELLER);
+		return Optional.ofNullable(antragstellerData);
+	}
+
+	Antragsteller buildAntragsteller(Map<String, Object> antragstellerData) {
+		return Antragsteller.builder()
+				.anrede(MapUtils.getString(antragstellerData, KEY_ANREDE))
+				.vorname(MapUtils.getString(antragstellerData, KEY_VORNAME))
+				.nachname(MapUtils.getString(antragstellerData, KEY_NACHNAME))
+				.geburtsname(MapUtils.getString(antragstellerData, KEY_GEBURTSNAME))
+				.geburtsdatum(MapUtils.getString(antragstellerData, KEY_GEBURTSDATUM))
+				.geburtsort(MapUtils.getString(antragstellerData, KEY_GEBURTSORT))
+				.email(MapUtils.getString(antragstellerData, KEY_EMAIL))
+				.telefon(MapUtils.getString(antragstellerData, KEY_TELEFON))
+				.strasse(MapUtils.getString(antragstellerData, KEY_ADDRESS))
+				.plz(MapUtils.getString(antragstellerData, KEY_PLZ))
+				.ort(MapUtils.getString(antragstellerData, KEY_ORT))
+				.build();
+	}
+}
diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f1f20a85652afc550b7eaacd677b987c3080f5c
--- /dev/null
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java
@@ -0,0 +1,6 @@
+package de.ozgcloud.eingang.semantik.enginebased.formcycle;
+
+import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper;
+
+interface FormcycleEngineBasedMapper extends EngineBasedMapper {
+}
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..36b93bf3bbce2b79629c92bb05da6795f01c9136
--- /dev/null
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java
@@ -0,0 +1,196 @@
+package de.ozgcloud.eingang.semantik.enginebased.formcycle;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+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.eingang.common.formdata.Antragsteller;
+import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory;
+import de.ozgcloud.eingang.common.formdata.FormData;
+import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
+
+class FormcycleAntragstellerMapperTest {
+
+	@Spy
+	@InjectMocks
+	private FormcycleAntragstellerMapper mapper;
+
+	private static final Map<String, Object> ANTRAGSTELLER_DATA = new HashMap<>();
+	private static final Map<String, Object> ANTRAGSTELLER_MAP = Map.of("fsBKAllDaten", ANTRAGSTELLER_DATA);
+
+	@BeforeAll
+	static void fillAntragstellerData() {
+		ANTRAGSTELLER_DATA.put("tfAntragstellerAnrede", AntragstellerTestFactory.ANREDE);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerVorname", AntragstellerTestFactory.VORNAME);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerNachname", AntragstellerTestFactory.NACHNAME);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsname", AntragstellerTestFactory.GEBURTSNAME);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsdatum", AntragstellerTestFactory.GEBURTSDATUM);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsort", AntragstellerTestFactory.GEBURTSORT);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerEmail", AntragstellerTestFactory.EMAIL);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerTelefon", AntragstellerTestFactory.TELEFON);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerAdresse", AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerPLZ", AntragstellerTestFactory.PLZ);
+		ANTRAGSTELLER_DATA.put("tfAntragstellerOrt", AntragstellerTestFactory.ORT);
+	}
+
+	@Nested
+	class TestParseFormData {
+
+		@Mock
+		private Antragsteller antragsteller;
+
+		@Test
+		void shouldCallGetAntragsteller() {
+			mapper.parseFormData(buildFormData());
+
+			verify(mapper).getAntragstellerData(ANTRAGSTELLER_MAP);
+		}
+
+		@Test
+		void shouldCallBuildAntragsteller() {
+			doReturn(Optional.of(ANTRAGSTELLER_DATA)).when(mapper).getAntragstellerData(anyMap());
+
+			mapper.parseFormData(buildFormData());
+
+			verify(mapper).buildAntragsteller(ANTRAGSTELLER_DATA);
+		}
+
+		@Test
+		void shouldSetAntragsteller() {
+			doReturn(antragsteller).when(mapper).buildAntragsteller(anyMap());
+
+			var formData = mapper.parseFormData(buildFormData());
+
+			assertThat(formData.getAntragsteller()).isSameAs(antragsteller);
+		}
+
+		@Test
+		void shouldReturnSameFormData() {
+			var formData = FormDataTestFactory.create();
+
+			var result = mapper.parseFormData(formData);
+
+			assertThat(result).isSameAs(formData);
+		}
+
+		FormData buildFormData() {
+			return FormData.builder().formData(ANTRAGSTELLER_MAP).build();
+		}
+	}
+
+	@Nested
+	class TestGetAntragstellerData {
+
+		@Test
+		void shouldReturnEmpty() {
+			Map<String, Object> formDataMap = Map.of("key", "value");
+
+			var result = mapper.getAntragstellerData(formDataMap);
+
+			assertThat(result).isEmpty();
+		}
+
+		@Test
+		void shouldReturnAntragstellerData() {
+			var result = mapper.getAntragstellerData(ANTRAGSTELLER_MAP);
+
+			assertThat(result).contains(ANTRAGSTELLER_DATA);
+		}
+	}
+
+	@Nested
+	class TestBuildAntragsteller {
+
+		@Test
+		void shouldSetAnrede() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getAnrede()).isEqualTo(AntragstellerTestFactory.ANREDE);
+		}
+
+		@Test
+		void shouldSetVorname() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getVorname()).isEqualTo(AntragstellerTestFactory.VORNAME);
+		}
+
+		@Test
+		void shouldSetNachname() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getNachname()).isEqualTo(AntragstellerTestFactory.NACHNAME);
+		}
+
+		@Test
+		void shouldSetGeburtsname() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getGeburtsname()).isEqualTo(AntragstellerTestFactory.GEBURTSNAME);
+		}
+
+		@Test
+		void shouldSetGeburtsdatum() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getGeburtsdatum()).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM);
+		}
+
+		@Test
+		void shouldSetGeburtsort() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getGeburtsort()).isEqualTo(AntragstellerTestFactory.GEBURTSORT);
+		}
+
+		@Test
+		void shouldSetEmail() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getEmail()).isEqualTo(AntragstellerTestFactory.EMAIL);
+		}
+
+		@Test
+		void shouldSetTelefon() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getTelefon()).isEqualTo(AntragstellerTestFactory.TELEFON);
+		}
+
+		@Test
+		void shouldSetStrasse() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getStrasse()).isEqualTo(AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER);
+		}
+
+		@Test
+		void shouldSetPlz() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getPlz()).isEqualTo(AntragstellerTestFactory.PLZ);
+		}
+
+		@Test
+		void shouldSetOrt() {
+			var result = buildAntragsteller();
+
+			assertThat(result.getOrt()).isEqualTo(AntragstellerTestFactory.ORT);
+		}
+
+		Antragsteller buildAntragsteller() {
+			return mapper.buildAntragsteller(ANTRAGSTELLER_DATA);
+		}
+	}
+}
\ No newline at end of file