diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml
index ee4f7d158376d2684368f2833619acfd491592e0..7cfe37b6aeda3084de15eb85df9d8b8703fb31ca 100644
--- a/xta-adapter/pom.xml
+++ b/xta-adapter/pom.xml
@@ -24,6 +24,10 @@
 			<groupId>de.itvsh.kop.eingangsadapter</groupId>
 			<artifactId>common</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>de.itvsh.kop.eingangsadapter</groupId>
+			<artifactId>semantik-adapter</artifactId>
+		</dependency>
 		<!--mapstruct-->
 		<dependency>
 			<groupId>org.mapstruct</groupId>
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
index d8852bd692a2e14d8e190e063d2e1164e168cb28..6904d6f9e3ffd64e8724f58e4007a5d75b4f8a47 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java
@@ -32,7 +32,7 @@ interface XtaMessageMapper {
 
 	@Mapping(target = "formEngineName", ignore = true)
 	@Mapping(target = "formId", source = "messageType")
-	@Mapping(target = "requestId", ignore = true)
+	@Mapping(target = "requestId", source = "messageId")
 	@Mapping(target = "serviceKonto", ignore = true)
 	@Mapping(target = "createdAt", source = "origin")
 	@Mapping(target = "sender", constant = "XTA")
@@ -58,4 +58,8 @@ interface XtaMessageMapper {
 			throw new TechnicalException("Error opening xta message file.");
 		}
 	}
+
+	default String fromId(XtaMessageId id) {
+		return id.toString();
+	}
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
index 479cbcc9d27ac3e2f9ce0588497bf4fd4016d19e..d04f7e5d6c98d79f202c25c3ce1173b61304dfd8 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java
@@ -1,7 +1,6 @@
 package de.ozgcloud.eingang.xta;
 
 import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
-import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader;
 
 class FormDataTestFactory {
 
@@ -11,15 +10,7 @@ class FormDataTestFactory {
 
 	static FormData.FormDataBuilder createBuilder() {
 		return FormData.builder()
-				.header(createHeader());
+				.header(FormHeaderTestFactory.create());
 	}
 
-	static FormHeader createHeader() {
-		return FormHeader.builder()
-				.sender("XTA")
-				.formName(XtaMessageMetaDataTestFactory.MESSAGE_TYPE)
-				.formId(XtaMessageMetaDataTestFactory.MESSAGE_TYPE)
-				.createdAt(XtaMessageMetaDataTestFactory.ORIGIN)
-				.build();
-	}
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e41248ab66c5d75aaf0c6df90d16ab6c169c818
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java
@@ -0,0 +1,20 @@
+package de.ozgcloud.eingang.xta;
+
+import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader;
+import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader.FormHeaderBuilder;
+
+public class FormHeaderTestFactory {
+
+	static FormHeader create() {
+		return createBuilder().build();
+	}
+
+	static FormHeaderBuilder createBuilder() {
+		return FormHeader.builder()
+				.sender("XTA")
+				.requestId(XtaMessageTestFactory.MESSAGE_ID.toString())
+				.formName(XtaMessageMetaDataTestFactory.MESSAGE_TYPE)
+				.formId(XtaMessageMetaDataTestFactory.MESSAGE_TYPE)
+				.createdAt(XtaMessageMetaDataTestFactory.ORIGIN);
+	}
+}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
index 0fb7ddb9059ce2b7f209d8af1b78f466ae772f3b..cfcb0bfc310218964fa5652775759e922f7006aa 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java
@@ -42,6 +42,16 @@ class XtaMessageMapperTest {
 			verify(mapper).toIncomingFile(message.getMessageFile());
 		}
 
+		@Nested
+		class ToFormHeader {
+			@Test
+			void shouldMapToFormHeader() {
+				var mapped = mapper.formHeaderFromMetaData(XtaMessageMetaDataTestFactory.create());
+
+				assertThat(mapped).usingRecursiveComparison().isEqualTo(FormHeaderTestFactory.create());
+			}
+		}
+
 		@Nested
 		class ToIncomingFile {
 			@Test
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaScheduler.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..fcd1ebf3ffdcd26ef26856d12c20f2b799654f7a
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaScheduler.java
@@ -0,0 +1,38 @@
+package de.ozgcloud.eingang.xta;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Profile;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
+import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter;
+import lombok.NonNull;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+@Component
+@Profile("!itcase")
+@ConditionalOnProperty(havingValue = "ozgcloud.xta.scheduler.enabled")
+class XtaScheduler {
+
+	@Autowired
+	private XtaService service;
+	@Autowired
+	private SemantikAdapter semantikAdapter;
+
+	@Scheduled(initialDelayString = "${ozgcloud.xta.scheduler.initialDelay:5000}", fixedDelayString = "${ozgcloud.xta.scheduler.fixedDelay:900000")
+	void runGetXtaMessages() {
+		service.getMessagesAsFormData().forEach(this::processAndAcknowledge);
+	}
+
+	private void processAndAcknowledge(@NonNull FormData formData) {
+		try {
+			semantikAdapter.processFormData(formData);
+			service.acknowledgeReceive(XtaMessageId.from(formData.getHeader().getRequestId()));
+		} catch (RuntimeException e) {
+			LOG.error("Error on processing XTA-Message. Continue with next message.", e);
+		}
+	}
+}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaSchedulerTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaSchedulerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..506f129c362fcbd1c9d94f08eb4ead320b23fd7b
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaSchedulerTest.java
@@ -0,0 +1,58 @@
+package de.ozgcloud.eingang.xta;
+
+import static org.mockito.Mockito.*;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
+import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter;
+
+class XtaSchedulerTest {
+
+	@InjectMocks
+	private XtaScheduler scheduler;
+
+	@Mock
+	private XtaService service;
+	@Mock
+	private SemantikAdapter semantikAdapter;
+
+	@Nested
+	class TestRunGetXtaMessages {
+
+		private FormData formData = FormDataTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(service.getMessagesAsFormData()).thenReturn(Stream.of(formData));
+		}
+
+		@Test
+		void shouldCallXtaService() {
+			scheduler.runGetXtaMessages();
+
+			verify(service).getMessagesAsFormData();
+		}
+
+		@Test
+		void shouldHandOverFormDataToSemantikAdapter() {
+			scheduler.runGetXtaMessages();
+
+			verify(semantikAdapter).processFormData(formData);
+		}
+
+		@Test
+		void shouldAcknowledgeReceive() {
+			scheduler.runGetXtaMessages();
+
+			verify(service).acknowledgeReceive(XtaMessageTestFactory.MESSAGE_ID);
+		}
+	}
+
+}