diff --git a/Jenkinsfile b/Jenkinsfile
index 4859fed0b0d64ee29d7b4736bdf21122207858ba..1b8dc8b1a49a9cae77b1656a4f596d1ade211c09 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -84,7 +84,7 @@ pipeline {
             when {
                 anyOf {
                     branch 'master'
-#                    branch 'release'
+                    branch 'release'
                 }
             }
             steps {
@@ -114,12 +114,12 @@ pipeline {
                         tagAndPushDockerImage('formcycle-adapter', 'snapshot-latest')
                         tagAndPushDockerImage('xta-adapter', 'snapshot-latest')
                     }
-#                    else if (env.BRANCH_NAME == 'release') {
-#                        tagAndPushDockerImage('intelliform-adapter', 'latest')
-#                        tagAndPushDockerImage('formsolutions-adapter', 'latest')
-#                        tagAndPushDockerImage('formcycle-adapter', 'latest')
-#                        tagAndPushDockerImage('xta-adapter', 'latest')
-#                    }
+                    else if (env.BRANCH_NAME == 'release') {
+                        tagAndPushDockerImage('intelliform-adapter', 'latest')
+                        tagAndPushDockerImage('formsolutions-adapter', 'latest')
+                        tagAndPushDockerImage('formcycle-adapter', 'latest')
+                        tagAndPushDockerImage('xta-adapter', 'latest')
+                    }
                 }
             }
         }
@@ -180,7 +180,7 @@ pipeline {
         }
         stage('Trigger Test rollout') {
             when {
-#                branch 'release'
+                branch 'release'
             }
 
             steps {
@@ -200,7 +200,7 @@ pipeline {
             when {
                 anyOf {
                     branch 'master'
-#                    branch 'release'
+                    branch 'release'
                 }
             }
             steps {
@@ -231,12 +231,12 @@ pipeline {
 
 Void deployHelmChart(String helmChartName, String helmChartVersion) {       
     withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){
-   #     if (env.BRANCH_NAME == 'release') {
-   #         result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps -F #file=@'''+helmChartName+'''-'''+helmChartVersion+'''.tgz''', returnStdout: true
-   #     }
-   #     else {
+        if (env.BRANCH_NAME == 'release') {
+            result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps -F file=@'''+helmChartName+'''-'''+helmChartVersion+'''.tgz''', returnStdout: true
+        }
+        else {
             result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps-snapshot -F file=@'''+helmChartName+'''-'''+helmChartVersion+'''.tgz''', returnStdout: true
-   #     }
+        }
 
         if (result != '') {
             error(result)
diff --git a/common/pom.xml b/common/pom.xml
index 5ff67c52753abe4541684d49fe94e070b1ff7cf7..61710c774ee927d3e6196308f4959be0472ee7c3 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -31,7 +31,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 	<artifactId>common</artifactId>
diff --git a/formcycle-adapter/formcycle-adapter-impl/pom.xml b/formcycle-adapter/formcycle-adapter-impl/pom.xml
index b8ad58632830074aa647220c59e594324caa6f36..d48c2789e64d88a1f33f9609107b59efc91a1435 100644
--- a/formcycle-adapter/formcycle-adapter-impl/pom.xml
+++ b/formcycle-adapter/formcycle-adapter-impl/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>formcycle-adapter</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 
diff --git a/formcycle-adapter/formcycle-adapter-interface/pom.xml b/formcycle-adapter/formcycle-adapter-interface/pom.xml
index ce9b16cf89e288b9a3c5b5cae23bd90a55f1c893..5abd6f5c55ab7e76fba351c47fcb6771472316cd 100644
--- a/formcycle-adapter/formcycle-adapter-interface/pom.xml
+++ b/formcycle-adapter/formcycle-adapter-interface/pom.xml
@@ -36,10 +36,10 @@
 	<groupId>de.itvsh.kop.eingangsadapter</groupId>
 	<artifactId>formcycle-adapter-interface</artifactId>
 	<name>EM - Formcycle Adapter - Interface</name>
-	<version>1.11.0-SNAPSHOT</version>
+	<version>1.12.0-SNAPSHOT</version>
 	
 	<properties>
-		<pluto.version>1.11.0-SNAPSHOT</pluto.version>
+		<pluto.version>1.11.0</pluto.version>
 		<java.version>17</java.version>
 		<maven.compiler.source>${java.version}</maven.compiler.source>
 		<maven.compiler.target>${java.version}</maven.compiler.target>
diff --git a/formcycle-adapter/pom.xml b/formcycle-adapter/pom.xml
index f65b15c4cf529ff8e00ad047c90ef4bd3c9563ca..ae12b55b379135e1309e0f9ff36d503ede338b64 100644
--- a/formcycle-adapter/pom.xml
+++ b/formcycle-adapter/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>formcycle-adapter</artifactId>
diff --git a/formsolutions-adapter/pom.xml b/formsolutions-adapter/pom.xml
index e5dab7067df71b843ecc372fff24df0c519b3007..1a49fd0e89eca8cfd79a436f4105193a8dee04a9 100644
--- a/formsolutions-adapter/pom.xml
+++ b/formsolutions-adapter/pom.xml
@@ -30,7 +30,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 
diff --git a/forwarder/pom.xml b/forwarder/pom.xml
index c700166310f8bdae05fd41f7da3b783063803b11..274cebba76c2cb8644adc439eb3dbc05995eb381 100644
--- a/forwarder/pom.xml
+++ b/forwarder/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 
diff --git a/intelliform-adapter/pom.xml b/intelliform-adapter/pom.xml
index 2e2324b142596ed850986809b457ab5b3784b09d..eb73d9d386ef32c3d014864765ab7df974abe488 100644
--- a/intelliform-adapter/pom.xml
+++ b/intelliform-adapter/pom.xml
@@ -31,7 +31,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 
diff --git a/pom.xml b/pom.xml
index 380406f52b9ac5498dc93fc8ed0c550389d37527..d6c21e33619a9716082d235f54b0956f71fead0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,13 +31,13 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-parent</artifactId>
-		<version>2.3.0-SNAPSHOT</version>
+		<version>2.3.1</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
 	
 	<groupId>de.itvsh.kop.eingangsadapter</groupId>
 	<artifactId>parent</artifactId>
-	<version>1.11.0-SNAPSHOT</version>
+	<version>1.12.0-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>Eingangs Adapter - Parent</name>
 
diff --git a/router/pom.xml b/router/pom.xml
index 2ab6d7b2d930744f2f89e930c90278d924b787d8..58f70937570ccd8b893d1dcc53553436d68fda28 100644
--- a/router/pom.xml
+++ b/router/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 		<relativePath>../</relativePath>
 	</parent>
 
diff --git a/run_helm_test.sh b/run_helm_test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7324e7d118cdd0dd4d8815201c07089ea5122d12
--- /dev/null
+++ b/run_helm_test.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set -e
+
+helm template  ./src/main/helm/ -f src/test/unit-values.yaml
+helm lint -f src/test/unit-values.yaml ./src/main/helm/
+cd src/main/helm && helm unittest --helm3 -f '../../test/helm/*.yaml' -v '../../test/unit-values.yaml' .
\ No newline at end of file
diff --git a/semantik-adapter/pom.xml b/semantik-adapter/pom.xml
index 87830d62e27f1888a091855d3f4b6eaab785d957..7fa39439270391dd2a238b1c0c2a428a091787ea 100644
--- a/semantik-adapter/pom.xml
+++ b/semantik-adapter/pom.xml
@@ -30,7 +30,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 	</parent>
 	
 	<artifactId>semantik-adapter</artifactId>
diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl
index 10b786e54ef44f05cbf6471db5c915ac1213b893..a4be54ca4df7a6cefe3c57127c55e5c5bc4621ef 100644
--- a/src/main/helm/templates/_helpers.tpl
+++ b/src/main/helm/templates/_helpers.tpl
@@ -35,6 +35,7 @@ app.kubernetes.io/part-of: kop
 app.kubernetes.io/version: {{ include "app.version" . }}
 app.kubernetes.io/namespace: {{ include "app.namespace" . }}
 helm.sh/chart: {{ include "app.chart" . }}
+ozg-component: eingangsadapter
 {{- end -}}
 
 {{- define "app.matchLabels" }}
diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0aa2458d7c325129c12656431e2fb1a93de17df0
--- /dev/null
+++ b/src/main/helm/templates/network_policy.yaml
@@ -0,0 +1,61 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+{{- if not (.Values.networkPolicy).disabled }} 
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: network-policy-{{ include "app.name" .}}
+  namespace: {{ .Release.Namespace }} 
+spec:
+  podSelector:
+    matchLabels:
+      ozg-component: eingangsadapter
+  policyTypes:
+    - Ingress
+    - Egress
+  ingress:
+  - ports:
+    - port: 8080
+  egress:
+  - to:
+    - podSelector: 
+        matchLabels:
+          component: pluto
+    ports:
+      - port: 9090
+        protocol: TCP
+  - to:
+    - namespaceSelector:
+        matchLabels:
+          kubernetes.io/metadata.name: kube-system
+      podSelector:
+        matchLabels:
+          k8s-app: kube-dns
+    ports:
+      - port: 53
+        protocol: UDP
+      - port: 53
+        protocol: TCP
+{{- end }} 
\ No newline at end of file
diff --git a/src/test/helm/deployment_test.yaml b/src/test/helm/deployment_test.yaml
index 02ab7be03b1f0d6d1640dec5eaaec3ad01c908ad..ca8169b68401d2b65038514a34145a36917e54b7 100644
--- a/src/test/helm/deployment_test.yaml
+++ b/src/test/helm/deployment_test.yaml
@@ -44,3 +44,9 @@ tests:
       - equal:
           path: spec.template.spec.containers[0].image
           value: docker.ozg-sh.de/intelliform-adapter:latest
+  - it: should have label ozg-component
+    asserts:
+      - equal:
+          path: metadata.labels.ozg-component
+          value: eingangsadapter
+
diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c4a917336479388b7a8abd1e630bfebc76612647
--- /dev/null
+++ b/src/test/helm/network_policy_test.yaml
@@ -0,0 +1,96 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: network policy test
+release:
+  name: afm-adapter
+  namespace: by-helm-test
+templates:
+  - templates/network_policy.yaml
+tests:
+  - it: should match apiVersion
+    asserts:
+      - isAPIVersion:
+          of: networking.k8s.io/v1
+  - it: should match kind
+    asserts:
+      - isKind:
+          of: NetworkPolicy
+  - it: validate metadata
+    asserts:
+      - equal:
+          path: metadata
+          value:
+            name: network-policy-afm-adapter
+            namespace: by-helm-test
+  - it: validate spec
+    asserts:
+      - equal:
+          path: spec
+          value:
+            podSelector:
+              matchLabels:
+                ozg-component: eingangsadapter
+            policyTypes:
+              - Ingress
+              - Egress
+            ingress:
+            - ports:
+              - port: 8080
+            egress:
+            - to:
+              - podSelector: 
+                  matchLabels:
+                    component: pluto
+              ports:
+                - port: 9090
+                  protocol: TCP
+            - to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: kube-system
+                podSelector:
+                  matchLabels:
+                    k8s-app: kube-dns
+              ports:
+                - port: 53
+                  protocol: UDP
+                - port: 53
+                  protocol: TCP
+
+  - it: test network policy disabled
+    set:
+      networkPolicy:
+        disabled: true
+    asserts:
+      - hasDocuments:
+          count: 0
+
+  - it: test network policy unset should be disabled
+    set:
+      networkPolicy:
+        disabled: false
+    asserts:
+      - hasDocuments:
+          count: 1
\ No newline at end of file
diff --git a/xta-adapter/doc/example-response-getmessages-items-pending.xml b/xta-adapter/doc/example-response-getmessages-items-pending.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bdc87bdc1989d52151d8bff1700546b5c60adac2
--- /dev/null
+++ b/xta-adapter/doc/example-response-getmessages-items-pending.xml
@@ -0,0 +1,51 @@
+<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
+   <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
+      <tran:MsgBoxResponse xmlns:tran="http://www.osci.eu/ws/2008/05/transport">
+         <tran:MsgBoxResponse MsgBoxRequestID="urn:de:xta:requestid:xta-tester:e8959968-a8c3-4ba4-aad1-5928ad6030dc">
+            <tran:ItemsPending>1</tran:ItemsPending>
+         </tran:MsgBoxResponse>
+      </tran:MsgBoxResponse>
+      <wsa:Action>http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest</wsa:Action>
+      <wsa:RelatesTo>uuid:d30e3dbd-4724-4a08-84b9-55e61ce1b404</wsa:RelatesTo>
+   </soapenv:Header>
+   <soapenv:Body>
+      <tran:MsgStatusList xmlns:tran="http://www.osci.eu/ws/2008/05/transport" xmlns:tran1="http://www.osci.eu/ws/2014/10/transport" xmlns:add="http://www.w3.org/2005/08/addressing">
+         <tran1:MessageMetaData>
+            <tran1:DeliveryAttributes>
+               <tran1:Origin>2022-02-25T14:13:57.613+01:00</tran1:Origin>
+               <tran1:InitialSend>2022-02-25T14:13:57.613+01:00</tran1:InitialSend>
+               <tran1:Delivery>2022-02-25T14:13:57.613+01:00</tran1:Delivery>
+               <tran1:InitialFetch>2022-02-25T14:13:57.613+01:00</tran1:InitialFetch>
+            </tran1:DeliveryAttributes>
+            <tran1:Originators>
+               <tran1:Author>
+                  <tran1:Identifier category="category" type="type"/>
+               </tran1:Author>
+               <tran1:Sender>
+                  <tran1:Identifier category="category" type="type"/>
+               </tran1:Sender>
+            </tran1:Originators>
+            <tran1:Destinations>
+               <tran1:Reader>
+                  <tran1:Identifier category="category" type="type"/>
+               </tran1:Reader>
+            </tran1:Destinations>
+            <tran1:MsgIdentification>
+               <add:MessageID>urn:de:xta:messageid:xta-tester:0149cd17-a905-4b4b-83c6-10b5ca04a96b</add:MessageID>
+            </tran1:MsgIdentification>
+            <tran1:Qualifier>
+               <tran1:Service>urn:service</tran1:Service>
+               <tran1:BusinessScenario>
+                  <tran1:Defined>
+                     <name>test</name>
+                  </tran1:Defined>
+               </tran1:BusinessScenario>
+               <tran1:MessageType>
+                  <name>mytype</name>
+               </tran1:MessageType>
+            </tran1:Qualifier>
+            <tran1:MsgSize>10</tran1:MsgSize>
+         </tran1:MessageMetaData>
+      </tran:MsgStatusList>
+   </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file
diff --git a/xta-adapter/doc/example-response-getmessages-no-messages-available.xml b/xta-adapter/doc/example-response-getmessages-no-messages-available.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f56105d0dc5bf57ffccff6b47c85e7088891741
--- /dev/null
+++ b/xta-adapter/doc/example-response-getmessages-no-messages-available.xml
@@ -0,0 +1,11 @@
+<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
+   <s:Header>
+      <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest</a:Action>
+      <h:MsgBoxResponse MsgBoxRequestID="1" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+         <NoMessageAvailable reason="Keine Nachrichten gefunden."/>
+      </h:MsgBoxResponse>
+   </s:Header>
+   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <MsgStatusList xmlns="http://www.osci.eu/ws/2008/05/transport"/>
+   </s:Body>
+</s:Envelope>
\ No newline at end of file
diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml
index 1ff8141f2256beaf9dc4b4b2b05364714992fbe5..2d9c5027fcd1e64001c77f363978a86b65f3d2fe 100644
--- a/xta-adapter/pom.xml
+++ b/xta-adapter/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.eingangsadapter</groupId>
 		<artifactId>parent</artifactId>
-		<version>1.11.0-SNAPSHOT</version>
+		<version>1.12.0-SNAPSHOT</version>
 	</parent>
 	<artifactId>xta-adapter</artifactId>
 	<name>Eingangs Adapter - XTA</name>
diff --git a/xta-adapter/run_helm_test.sh b/xta-adapter/run_helm_test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9e10b8f0eafbab2eac176bd51e453caedabec7fa
--- /dev/null
+++ b/xta-adapter/run_helm_test.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set -e
+
+helm template  ./src/main/helm/ -f src/main/helm/test-values.yaml
+helm lint -f src/test/helm/values/unit-values.yaml ./src/main/helm/
+cd src/main/helm && helm unittest --helm3 -f '../../test/helm/*.yaml' -v '../../test/helm/values/unit-values.yaml' .
\ No newline at end of file
diff --git a/xta-adapter/src/main/helm/templates/network_policy.yaml b/xta-adapter/src/main/helm/templates/network_policy.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6c806c791f303f964ff490aeeae6daa7e469098d
--- /dev/null
+++ b/xta-adapter/src/main/helm/templates/network_policy.yaml
@@ -0,0 +1,68 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+{{- if not (.Values.networkPolicy).disabled }} 
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: network-policy-xta-adapter
+  namespace: {{ .Release.Namespace }} 
+spec:
+  podSelector:
+    matchLabels:
+      ozg-component: xta-adapter
+  policyTypes:
+    - Egress
+  egress:
+  - to:
+    - podSelector: 
+        matchLabels:
+          component: pluto
+    ports:
+      - port: 9090
+        protocol: TCP
+  - to:
+    - namespaceSelector:
+        matchLabels:
+          kubernetes.io/metadata.name: kube-system
+      podSelector:
+        matchLabels:
+          k8s-app: kube-dns
+    ports:
+      - port: 53
+        protocol: UDP
+      - port: 53
+        protocol: TCP
+  - to:
+    - namespaceSelector:
+        matchLabels:
+          kubernetes.io/metadata.name: ssh-port-forward
+      ports:
+      - port: 9000
+        protocol: TCP
+  {{- with (.Values.networkPolicy).additionalEgressConfig }}
+  - to:
+{{ toYaml . | indent 8 }}
+  {{- end }}
+{{- end }} 
\ No newline at end of file
diff --git a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml
index 47aa8cd899a803aac2fa5105f738e8260d5c562a..371dda54180538f75faee51ae976f1f7fb7d1533 100644
--- a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml
+++ b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml
@@ -42,6 +42,7 @@ spec:
         metadata:
           labels:
             workload: xta-adapter-cronjob
+            ozg-component: xta-adapter
         spec:
           restartPolicy: Never
           containers:
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..aead2074638fccd8336b8c52c9e98fda734fc5f3
--- /dev/null
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java
@@ -0,0 +1,19 @@
+package de.ozgcloud.eingang.xta;
+
+import java.math.BigInteger;
+import java.util.stream.Stream;
+
+import eu.osci.ws._2014._10.transport.MessageMetaData;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+@Builder
+class MsgStatusListTypeAndHeaderResponse {
+	private String msgBoxRequestID;
+	private boolean noMessageAvailable;
+	private BigInteger messageItemsPending;
+	private Stream<MessageMetaData> messages;
+}
\ No newline at end of file
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 6208c760c8e7567575c912d0810b8f9a6303b9f6..f2e05fc7684fe33d1db3dd42ae46f1f044f23ef8 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
@@ -1,15 +1,10 @@
 package de.ozgcloud.eingang.xta;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.Objects;
 
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 
-import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
-import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream;
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.FormHeader;
 import de.ozgcloud.eingang.common.formdata.IncomingFile;
@@ -44,7 +39,6 @@ interface XtaMessageMapper {
 			return IncomingFile.builder()
 					.name(messageFile.name())
 					.contentType("application/zip")
-//					.contentStream(openFile(messageFile.file()))
 					.file(messageFile.file())
 					.size(messageFile.file().length())
 					.build();
@@ -52,14 +46,6 @@ interface XtaMessageMapper {
 		return null;
 	}
 
-	default InputStream openFile(File file) {
-		try {
-			return new DeleteOnCloseInputStream(file);
-		} catch (IOException e) {
-			throw new TechnicalException("Error opening xta message file.");
-		}
-	}
-
 	default String fromId(XtaMessageId id) {
 		return id.toString();
 	}
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java
index 71c7db468e50ae50af7d0746595f06ff17206a88..f81184fc20eb49e375f9d24dd9f5ce68021644c6 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java
@@ -1,8 +1,16 @@
 package de.ozgcloud.eingang.xta;
 
+import java.math.BigInteger;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import jakarta.xml.bind.JAXBElement;
+
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
+import org.mapstruct.Named;
 
+import eu.osci.ws._2008._05.transport.MsgStatusListType;
 import eu.osci.ws._2014._10.transport.MessageMetaData;
 
 @Mapper
@@ -17,4 +25,21 @@ interface XtaMessageMetaDataMapper {
 	default XtaMessageId fromString(String id) {
 		return XtaMessageId.from(id);
 	}
+
+	@Mapping(target = "moreMessagesAvailable", source = ".", qualifiedByName = "moreMessagesAvailable")
+	XtaMessageMetaDatasAndHeader msgStatusListFromSoap(MsgStatusListTypeAndHeaderResponse statusList);
+
+	@Named("moreMessagesAvailable")
+	default boolean moreMessagesAvailable(MsgStatusListTypeAndHeaderResponse statusList) {
+		if (statusList.isNoMessageAvailable()) {
+			return false;
+		}
+		return Optional.ofNullable(statusList.getMessageItemsPending())
+				.filter(messagesPending -> !BigInteger.ZERO.equals(messagesPending))
+				.isPresent();
+	}
+
+	default Stream<XtaMessageMetaData> map(JAXBElement<MsgStatusListType> msgStatusListResponse) {
+		return msgStatusListResponse.getValue().getMessageMetaData().stream().map(this::fromSoap);
+	}
 }
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff04d5df1c24571a7e8e5d4c0f704089536dbe98
--- /dev/null
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.eingang.xta;
+
+import java.util.stream.Stream;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+class XtaMessageMetaDatasAndHeader {
+
+	private String msgBoxRequestID;
+	private boolean moreMessagesAvailable;
+	private Stream<XtaMessageMetaData> messages;
+}
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b12ce91b9ca05f1db26f5ab8b3f8f85fd982ab28
--- /dev/null
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.eingang.xta;
+
+import java.util.Iterator;
+
+public class XtaMessageMetadataRemoteIterator implements Iterator<XtaMessageMetaData> {
+
+	private final XtaRemoteService xtaRemoteService;
+	private XtaMessageMetaDatasAndHeader messagesMetadata;
+	private Iterator<XtaMessageMetaData> remoteMessageIterator;
+
+	public XtaMessageMetadataRemoteIterator(XtaRemoteService xtaRemoteService) {
+		this.xtaRemoteService = xtaRemoteService;
+		messagesMetadata = this.xtaRemoteService.getMessagesMetadata();
+		remoteMessageIterator = getRemoteMessageIterator(messagesMetadata);
+	}
+
+	@Override
+	public boolean hasNext() {
+		if (remoteMessageIterator.hasNext()) {
+			return true;
+		}
+		if (messagesMetadata.isMoreMessagesAvailable()) {
+			loadNextMessages();
+			return remoteMessageIterator.hasNext();
+		}
+		return false;
+	}
+
+	void loadNextMessages() {
+		messagesMetadata = xtaRemoteService.getNextMessagesMetadata(messagesMetadata.getMsgBoxRequestID());
+		remoteMessageIterator = getRemoteMessageIterator(messagesMetadata);
+	}
+
+	Iterator<XtaMessageMetaData> getRemoteMessageIterator(XtaMessageMetaDatasAndHeader messagesMetadata) {
+		return messagesMetadata.getMessages().iterator();
+	}
+
+	@Override
+	public XtaMessageMetaData next() {
+		return remoteMessageIterator.next();
+	}
+}
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
index 2bfb3d539be7f626ed56f4507e389596ef225bcf..5da39aab1d30059a0e4577686a7427bc860f6278 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java
@@ -6,9 +6,11 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.stream.Stream;
 
 import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
 
 import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,10 +18,17 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.webservices.client.WebServiceTemplateBuilder;
 import org.springframework.oxm.jaxb.Jaxb2Marshaller;
 import org.springframework.stereotype.Service;
+import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.client.core.WebServiceMessageCallback;
+import org.springframework.ws.client.core.WebServiceMessageExtractor;
 import org.springframework.ws.soap.SoapFaultDetailElement;
+import org.springframework.ws.soap.SoapHeader;
+import org.springframework.ws.soap.SoapHeaderElement;
+import org.springframework.ws.soap.SoapMessage;
 import org.springframework.ws.soap.addressing.client.ActionCallback;
 import org.springframework.ws.soap.addressing.version.Addressing10;
 import org.springframework.ws.soap.client.SoapFaultClientException;
+import org.springframework.ws.support.MarshallingUtils;
 import org.w3._2005._08.addressing.AttributedURIType;
 
 import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
@@ -28,10 +37,13 @@ import de.xoev.transport.xta._211.ExceptionType;
 import de.xoev.transport.xta._211.GenericContentContainer;
 import eu.osci.ws._2008._05.transport.MsgBoxCloseRequestType;
 import eu.osci.ws._2008._05.transport.MsgBoxFetchRequest;
+import eu.osci.ws._2008._05.transport.MsgBoxGetNextRequestType;
+import eu.osci.ws._2008._05.transport.MsgBoxResponseType;
 import eu.osci.ws._2008._05.transport.MsgBoxStatusListRequestType;
 import eu.osci.ws._2008._05.transport.MsgSelector;
 import eu.osci.ws._2008._05.transport.MsgStatusListType;
 import eu.osci.ws._2008._05.transport.ObjectFactory;
+import eu.osci.ws._2014._10.transport.MessageMetaData;
 import jakarta.validation.Valid;
 import jakarta.xml.bind.JAXBElement;
 import lombok.NonNull;
@@ -62,16 +74,81 @@ class XtaRemoteService {
 	@Qualifier("xoevTransportMarshaller")
 	private Jaxb2Marshaller xoevMarshaller;
 
-	public Stream<XtaMessageMetaData> getMessagesMetadata() {
-		return getStatusList().getMessageMetaData().stream().map(mapper::fromSoap);
+	public XtaMessageMetaDatasAndHeader getMessagesMetadata() {
+		return mapper.msgStatusListFromSoap(getStatusList());
 	}
 
-	@SuppressWarnings("unchecked")
-	MsgStatusListType getStatusList() {
-		var callback = new ActionCallback(properties.getActions().getStatusList(), new Addressing10(), getTargetUri());
+	public XtaMessageMetaDatasAndHeader getNextMessagesMetadata(String msgBoxRequestId) {
+		return mapper.msgStatusListFromSoap(getNextStatusList(msgBoxRequestId));
+	}
+
+	MsgStatusListTypeAndHeaderResponse getStatusList() {
+		var request = buildListRequest();
+		return getGenericStatusList(request);
+	}
+
+	MsgStatusListTypeAndHeaderResponse getNextStatusList(String msgBoxRequestId) {
+		var request = buildNextListRequest(msgBoxRequestId);
+		return getGenericStatusList(request);
+	}
+
+	MsgStatusListTypeAndHeaderResponse getGenericStatusList(Object request) {
+
 		var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(osciMarshaller).build();
 
-		return ((JAXBElement<MsgStatusListType>) template.marshalSendAndReceive(buildListRequest(), callback)).getValue();
+		return template.sendAndReceive(buildMarshalCallBack(request, buildActionCallback()), buildHeaderExtractor());
+	}
+
+	private ActionCallback buildActionCallback() {
+		return new ActionCallback(properties.getActions().getStatusList(), new Addressing10(), getTargetUri());
+	}
+
+	WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) {
+		return new WebServiceMessageCallback() {
+			@Override
+			public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
+				MarshallingUtils.marshal(osciMarshaller, jaxbElement, message);
+				callback.doWithMessage(message);
+			}
+		};
+	}
+
+	WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() {
+		return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() {
+			@Override
+			public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException {
+
+				MsgBoxResponseType header = extractHeader(message);
+
+				return MsgStatusListTypeAndHeaderResponse.builder()
+						.msgBoxRequestID(header.getMsgBoxRequestID())
+						.noMessageAvailable(header.getNoMessageAvailable() != null)
+						.messageItemsPending(header.getItemsPending())
+						.messages(extractMessages(message))
+						.build();
+			}
+
+			@SuppressWarnings("unchecked")
+			private MsgBoxResponseType extractHeader(WebServiceMessage message) {
+				SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
+				Iterator<SoapHeaderElement> it = soapHeader
+						.examineHeaderElements(new QName("http://www.osci.eu/ws/2008/05/transport", "MsgBoxResponse"));
+				validateHasHeader(it);
+				return ((JAXBElement<MsgBoxResponseType>) osciMarshaller.unmarshal(it.next().getSource())).getValue();
+			}
+
+			private void validateHasHeader(Iterator<SoapHeaderElement> it) {
+				if (!it.hasNext()) {
+					throw new TechnicalException("Response from XTA GetStatusList has no header");
+				}
+			}
+
+			@SuppressWarnings("unchecked")
+			private Stream<MessageMetaData> extractMessages(WebServiceMessage message) throws IOException {
+				return ((JAXBElement<MsgStatusListType>) MarshallingUtils.unmarshal(osciMarshaller, message)).getValue().getMessageMetaData()
+						.stream();
+			}
+		};
 	}
 
 	private JAXBElement<MsgBoxStatusListRequestType> buildListRequest() {
@@ -82,16 +159,27 @@ class XtaRemoteService {
 		return objectFactory.createMsgBoxStatusListRequest(msg);
 	}
 
+	private JAXBElement<MsgBoxGetNextRequestType> buildNextListRequest(String msgBoxRequestId) {
+		ObjectFactory objectFactory = new ObjectFactory();
+
+		MsgBoxGetNextRequestType msg = new MsgBoxGetNextRequestType();
+		msg.setMsgBoxRequestID(msgBoxRequestId);
+		return objectFactory.createMsgBoxGetNextRequest(msg);
+	}
+
 	private URI getTargetUri() {
 		try {
-			return new URI(
-					XtaRemoteServiceConfiguration.URI_TEMPLATE.formatted(properties.getServer().getProtocol(),
-							properties.getServer().getName()));
+			return new URI(buildServerAddressUri());
 		} catch (URISyntaxException e) {
 			throw new TechnicalException("Error building target url: " + e);
 		}
 	}
 
+	String buildServerAddressUri() {
+		return XtaRemoteServiceConfiguration.URI_TEMPLATE.formatted(properties.getServer().getProtocol(),
+				properties.getServer().getName());
+	}
+
 	public XtaMessage getMessage(XtaMessageId messageId) {
 		return XtaMessage.builder()
 				.metaData(null)
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
index d823bc31854f7f7946590c3ab8299686d752539e..0c497d51f85560d84085d663c2bc32aaf46a408e 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java
@@ -29,7 +29,7 @@ class XtaRunner implements ApplicationListener<ContextRefreshedEvent> {
 
 	void runGetXtaMessages() {
 		try {
-			service.getMessagesAsFormData().forEach(this::processAndAcknowledge);
+			service.getMessages().forEach(this::processAndAcknowledge);
 		} catch (RuntimeException e) {
 			LOG.error("Error fetch XTA Message List.", e);
 		}
diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
index d19edb54f5074385d8b0b7cd811ff04dcfc6ae48..0fe6d495bf3382335bbb41a8fc186feeb30ba300 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
@@ -1,6 +1,8 @@
 package de.ozgcloud.eingang.xta;
 
+import java.util.Spliterators;
 import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,17 +23,18 @@ class XtaService {
 	@Autowired
 	private XtaMessageMapper mapper;
 
-	public Stream<FormData> getMessagesAsFormData() {
-		return getMessagesMetaData().map(this::getFormData);
+	public Stream<FormData> getMessages() {
+		return createXtaMessageStream().filter(this::filterByMessageType).map(this::getFormData);
 	}
 
-	public Stream<XtaMessageMetaData> getMessagesMetaData() {
-		return remoteService.getMessagesMetadata().filter(this::filterByMessageType);
+	Stream<XtaMessageMetaData> createXtaMessageStream() {
+		var iterator = new XtaMessageMetadataRemoteIterator(remoteService);
+		return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
 	}
 
 	// filter criteria for dFoerdermittelantrag
 	// https://jira.mgm-tp.com/jira/browse/OZG-3659
-	private boolean filterByMessageType(XtaMessageMetaData metaData) {
+	boolean filterByMessageType(XtaMessageMetaData metaData) {
 		if (StringUtils.equals(metaData.getMessageType(), DFOERDERMITTELANTRAG_MESSAGE_TYPE)) {
 			return true;
 		}
diff --git a/xta-adapter/src/main/resources/XTA.wsdl b/xta-adapter/src/main/resources/XTA.wsdl
index 30b538eb9383b128630db8874a5cd565ed52c1d8..d7ca5a364f4864a44ea0c2c5cbff4a76ae63a042 100644
--- a/xta-adapter/src/main/resources/XTA.wsdl
+++ b/xta-adapter/src/main/resources/XTA.wsdl
@@ -119,6 +119,9 @@
 	<message name="FetchListResponse">
 		<part name="FetchResponse" element="osci:MsgStatusList"/>
 	</message>
+	<message name="GetNextRequest">
+		<part name="FetchRequest" element="osci:MsgBoxGetNextListRequest"/>
+	</message>
 	<!--Nachrichten - SOAP-Exceptions-->
 	<message name="PermissionDeniedException">
 		<part name="permissionDeniedException" element="xta:PermissionDeniedException"/>
diff --git a/xta-adapter/src/test/helm/network_policy_test.yaml b/xta-adapter/src/test/helm/network_policy_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..79daaa6a8810843c21adccd3d0f001b220ae219b
--- /dev/null
+++ b/xta-adapter/src/test/helm/network_policy_test.yaml
@@ -0,0 +1,140 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: network policy test
+release:
+  namespace: by-helm-test
+templates:
+  - templates/network_policy.yaml
+tests:
+  - it: should match apiVersion
+    asserts:
+      - isAPIVersion:
+          of: networking.k8s.io/v1
+  - it: should match kind
+    asserts:
+      - isKind:
+          of: NetworkPolicy
+  - it: validate metadata
+    asserts:
+      - equal:
+          path: metadata
+          value:
+            name: network-policy-xta-adapter
+            namespace: by-helm-test
+  - it: validate spec
+    asserts:
+      - equal:
+          path: spec
+          value:
+            podSelector:
+              matchLabels:
+                ozg-component: xta-adapter
+            policyTypes:
+              - Egress
+            egress:
+            - to:
+              - podSelector: 
+                  matchLabels:
+                    component: pluto
+              ports:
+                - port: 9090
+                  protocol: TCP
+            - to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: kube-system
+                podSelector:
+                  matchLabels:
+                    k8s-app: kube-dns
+              ports:
+                - port: 53
+                  protocol: UDP
+                - port: 53
+                  protocol: TCP
+            - to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: ssh-port-forward
+                ports:
+                - port: 9000
+                  protocol: TCP
+
+  - it: add ingress rule by values
+    set:
+      networkPolicy:
+        additionalEgressConfig:
+        - podSelector: 
+            matchLabels:
+              component: client2
+    asserts:
+      - equal:
+          path: spec.egress
+          value:
+            - to:
+              - podSelector: 
+                  matchLabels:
+                    component: pluto
+              ports:
+                - port: 9090
+                  protocol: TCP
+            - to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: kube-system
+                podSelector:
+                  matchLabels:
+                    k8s-app: kube-dns
+              ports:
+                - port: 53
+                  protocol: UDP
+                - port: 53
+                  protocol: TCP
+            - to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: ssh-port-forward
+                ports:
+                - port: 9000
+                  protocol: TCP
+            - to:
+              - podSelector: 
+                  matchLabels:
+                    component: client2
+
+  - it: test network policy disabled
+    set:
+      networkPolicy:
+        disabled: true
+    asserts:
+      - hasDocuments:
+          count: 0
+
+  - it: test network policy unset should be disabled
+    set:
+      networkPolicy:
+        disabled: false
+    asserts:
+      - hasDocuments:
+          count: 1
\ No newline at end of file
diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml
index 3e0ec759c0446fb34062e1934d8dc7bd775225e9..ba879bf700afd49f57a299118130cdd42e3d30c4 100644
--- a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml
+++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml
@@ -99,4 +99,13 @@ tests:
         value: false
     - equal:
         path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsNonRoot
-        value: false
\ No newline at end of file
+        value: false
+  
+  - it: check pod labels
+    template: xta_adapter_cronjob.yaml
+    asserts:
+    - equal:
+        path: spec.jobTemplate.spec.template.metadata.labels
+        value: 
+          ozg-component: xta-adapter
+          workload: xta-adapter-cronjob
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..955fab809aa6298bfc494cae57dfc57b2937d249
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java
@@ -0,0 +1,20 @@
+package de.ozgcloud.eingang.xta;
+
+import java.util.stream.Stream;
+
+import eu.osci.ws._2014._10.transport.MessageMetaData;
+
+class MsgStatusListTypeAndHeaderResponseTestFactory {
+
+	public static final MessageMetaData MESSAGE1 = MessageMetaDataTestFactory.create();
+
+	public static MsgStatusListTypeAndHeaderResponse create() {
+		return createBuilder().build();
+	}
+
+	public static MsgStatusListTypeAndHeaderResponse.MsgStatusListTypeAndHeaderResponseBuilder createBuilder() {
+		return MsgStatusListTypeAndHeaderResponse.builder()
+				.msgBoxRequestID(null)
+				.messages(Stream.of(MESSAGE1));
+	}
+}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
index 60f55923518b5e9622bd99219dc1b54dd807b098..3f6525b5134515108a8b290cdd8f8ae03ba37f9e 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
@@ -5,8 +5,6 @@ import static org.assertj.core.api.InstanceOfAssertFactories.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.util.stream.Stream;
-
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
@@ -41,8 +39,8 @@ class XtaITCase {
 
 	@BeforeEach
 	void prepareXtaRemoteService() {
-		when(remoteService.getMessagesMetadata()).thenReturn(Stream.of(XtaMessageMetaDataTestFactory.create()));
-		
+		when(remoteService.getMessagesMetadata()).thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create());
+
 		when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(
 				XtaMessageTestFactory.createBuilder()
 				.clearMessageFiles().messageFile(XtaFileTestFactory.withFileContent(TestUtils.loadFile("test_content.zip"), "test_content.zip"))
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b26412b73ffb000e3214c0e73fcddce166f6372
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java
@@ -0,0 +1,68 @@
+package de.ozgcloud.eingang.xta;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.math.BigInteger;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.Spy;
+
+class XtaMessageMetaDataMapperTest {
+
+	@Spy
+	private final XtaMessageMetaDataMapper mapper = Mappers.getMapper(XtaMessageMetaDataMapper.class);
+
+	@Nested
+	class TestMoreMessagesAvailable {
+
+		@Test
+		void shouldReturnFalseOnNoMessagesAvailable() {
+
+			var response = mapper.moreMessagesAvailable(buildWithNoMessageAvailable());
+
+			assertThat(response).isFalse();
+		}
+
+		private MsgStatusListTypeAndHeaderResponse buildWithNoMessageAvailable() {
+			return MsgStatusListTypeAndHeaderResponseTestFactory.createBuilder().noMessageAvailable(true).build();
+		}
+
+		@Test
+		void shouldReturnFalseOnPendingMessagesNull() {
+
+			var response = mapper.moreMessagesAvailable(buildPendingMessagesNull());
+
+			assertThat(response).isFalse();
+		}
+
+		private MsgStatusListTypeAndHeaderResponse buildPendingMessagesNull() {
+			return MsgStatusListTypeAndHeaderResponseTestFactory.createBuilder().messageItemsPending(null).build();
+		}
+
+		@Test
+		void shouldReturnFalseOnNoMessagesPending() {
+
+			var response = mapper.moreMessagesAvailable(buildWithoutPendingMessages());
+
+			assertThat(response).isFalse();
+		}
+
+		private MsgStatusListTypeAndHeaderResponse buildWithoutPendingMessages() {
+			return MsgStatusListTypeAndHeaderResponseTestFactory.createBuilder().messageItemsPending(null).build();
+		}
+
+		@Test
+		void shouldReturnTrueOnMessagesPending() {
+
+			var response = mapper.moreMessagesAvailable(buildWithPendingMessages());
+
+			assertThat(response).isTrue();
+		}
+
+		private MsgStatusListTypeAndHeaderResponse buildWithPendingMessages() {
+			return MsgStatusListTypeAndHeaderResponseTestFactory.createBuilder().messageItemsPending(BigInteger.ONE).build();
+		}
+	}
+}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..df3f26ef4d12eadfd7902ab56d88301a2f7e2f4a
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.eingang.xta;
+
+import java.util.UUID;
+import java.util.stream.Stream;
+
+class XtaMessageMetaDatasAndHeaderTestFactory {
+
+	public static final String MSG_BOX_REQUEST_ID = UUID.randomUUID().toString();
+
+	public static final XtaMessageMetaData MESSAGE1 = XtaMessageMetaDataTestFactory.create();
+
+	public static XtaMessageMetaDatasAndHeader create() {
+		return createBuilder().build();
+	}
+
+	public static XtaMessageMetaDatasAndHeader.XtaMessageMetaDatasAndHeaderBuilder createBuilder() {
+		return XtaMessageMetaDatasAndHeader.builder()
+				.msgBoxRequestID(MSG_BOX_REQUEST_ID)
+				.messages(Stream.of(MESSAGE1));
+	}
+}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3afc5fb59dca7c2b626cefe83bfaed5726b81643
--- /dev/null
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java
@@ -0,0 +1,120 @@
+package de.ozgcloud.eingang.xta;
+
+import static org.assertj.core.api.Assertions.*;
+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.Mock;
+
+class XtaMessageMetadataRemoteIteratorTest {
+
+	private XtaMessageMetaDatasAndHeader messageMetaDatasAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.create();
+
+	@Mock
+	private XtaRemoteService remoteService;
+
+	@BeforeEach
+	void setup() {
+		when(remoteService.getMessagesMetadata()).thenReturn(messageMetaDatasAndHeader);
+	}
+
+	@Nested
+	class TestIteratorInitialization {
+
+		@Test
+		void shouldCallGetMessagesMetadata() {
+			new XtaMessageMetadataRemoteIterator(remoteService);
+
+			verify(remoteService).getMessagesMetadata();
+		}
+
+		@Test
+		void shouldCallRemoteMessageIterator() {
+			when(remoteService.getMessagesMetadata()).thenReturn(messageMetaDatasAndHeader);
+
+			Object remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService));
+
+			assertThat(remoteIterator).extracting("remoteMessageIterator").isNotNull();
+		}
+	}
+
+	@Nested
+	class TestHasNext {
+
+		@Test
+		void shouldReturnTrueAfterInitialization() {
+			var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService);
+
+			assertThat(remoteIterator.hasNext()).isTrue();
+		}
+
+		@Test
+		void shouldReturnTrueWhenMoreMessagesAvailable() {
+			var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().moreMessagesAvailable(true).build();
+			when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader);
+
+			var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService);
+
+			assertThat(remoteIterator.hasNext()).isTrue();
+		}
+
+		@Test
+		void shouldCallLoadNextMessages() {
+			initTest();
+			var remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService));
+
+			remoteIterator.hasNext();
+
+			verify(remoteIterator).loadNextMessages();
+		}
+
+		private void initTest() {
+			var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder()
+					.messages(Stream.empty()).moreMessagesAvailable(true).build();
+			when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader);
+			var nextMessageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().msgBoxRequestID("id").build();
+			when(remoteService.getNextMessagesMetadata(any())).thenReturn(nextMessageMetadataAndHeader);
+		}
+
+		@Test
+		void shouldReturnFalseWhenNoMoreMessagesAvailable() {
+			var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().messages(Stream.empty()).build();
+			when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader);
+
+			var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService);
+
+			assertThat(remoteIterator.hasNext()).isFalse();
+		}
+	}
+
+	@Nested
+	class TestLoadNextMessages {
+
+		private XtaMessageMetaDatasAndHeader nextMessageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().msgBoxRequestID("id").build();
+
+		@BeforeEach
+		void setup() {
+			when(remoteService.getNextMessagesMetadata(any())).thenReturn(nextMessageMetadataAndHeader);
+		}
+
+		@Test
+		void shouldCallGetMessages() {
+			new XtaMessageMetadataRemoteIterator(remoteService).loadNextMessages();
+
+			verify(remoteService).getNextMessagesMetadata(messageMetaDatasAndHeader.getMsgBoxRequestID());
+		}
+
+		@Test
+		void shouldCallGetRemoteMessageIterator() {
+			var remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService));
+
+			remoteIterator.loadNextMessages();
+
+			verify(remoteIterator).getRemoteMessageIterator(nextMessageMetadataAndHeader);
+		}
+	}
+}
\ No newline at end of file
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java
index f6579fd837658c475b4081955a3fcedcc84c1db5..dd6b6d41529a9446a78b76bdf8ccd2bf404a3cb0 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java
@@ -30,27 +30,60 @@ class XtaRemoteServiceTest {
 
 		@BeforeEach
 		void init() {
-			doReturn(MsgStatusListTypeTestFactory.create()).when(service).getStatusList();
-			when(mapper.fromSoap(any())).thenReturn(XtaMessageMetaDataTestFactory.create());
+			doReturn(MsgStatusListTypeAndHeaderResponseTestFactory.create()).when(service).getStatusList();
+			when(mapper.msgStatusListFromSoap(any(MsgStatusListTypeAndHeaderResponse.class)))
+					.thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create());
 		}
 
 		@Test
 		void shouldCallGetStatusList() {
-			service.getMessagesMetadata().toList();
+			service.getMessagesMetadata().getMessages().toList();
 
 			verify(service).getStatusList();
 		}
 
 		@Test
 		void shouldCallMapper() {
-			service.getMessagesMetadata().toList();
+			service.getMessagesMetadata();
 
-			verify(mapper).fromSoap(notNull());
+			verify(mapper).msgStatusListFromSoap(notNull());
 		}
 
 		@Test
 		void shouldReturnMessageId() {
-			var metaData = service.getMessagesMetadata();
+			var metaData = service.getMessagesMetadata().getMessages().toList();
+
+			assertThat(metaData).hasSize(1).first().usingRecursiveComparison().isEqualTo(XtaMessageMetaDataTestFactory.create());
+		}
+	}
+
+	@Nested
+	class TestGetNextMessagesMetadata {
+
+		@BeforeEach
+		void init() {
+			doReturn(MsgStatusListTypeAndHeaderResponseTestFactory.create()).when(service).getStatusList();
+			when(mapper.msgStatusListFromSoap(any(MsgStatusListTypeAndHeaderResponse.class)))
+					.thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create());
+		}
+
+		@Test
+		void shouldCallGetNextStatusList() {
+			service.getMessagesMetadata().getMessages().toList();
+
+			verify(service).getStatusList();
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.getMessagesMetadata();
+
+			verify(mapper).msgStatusListFromSoap(notNull());
+		}
+
+		@Test
+		void shouldReturnMessageId() {
+			var metaData = service.getMessagesMetadata().getMessages().toList();
 
 			assertThat(metaData).hasSize(1).first().usingRecursiveComparison().isEqualTo(XtaMessageMetaDataTestFactory.create());
 		}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java
index 7ae08fc8eabf0012c13c6d87d8a5fe95616d6557..08ab8ed4b2e078005773560f1a71156878bb89a3 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java
@@ -26,25 +26,25 @@ class XtaRunnerTest {
 	@Nested
 	class TestRunGetXtaMessages {
 
-		private FormData formData = FormDataTestFactory.create();
+		public static final FormData MESSAGE = FormDataTestFactory.create();
 
 		@BeforeEach
 		void init() {
-			when(service.getMessagesAsFormData()).thenReturn(Stream.of(formData));
+			when(service.getMessages()).thenReturn(Stream.of(MESSAGE));
 		}
 
 		@Test
-		void shouldCallXtaService() {
+		void shouldCallXtaServiceGetNextMessages() {
 			scheduler.runGetXtaMessages();
 
-			verify(service).getMessagesAsFormData();
+			verify(service).getMessages();
 		}
 
 		@Test
 		void shouldHandOverFormDataToSemantikAdapter() {
 			scheduler.runGetXtaMessages();
 
-			verify(semantikAdapter).processFormData(formData);
+			verify(semantikAdapter).processFormData(MESSAGE);
 		}
 
 		@Test
@@ -54,5 +54,4 @@ class XtaRunnerTest {
 			verify(service).acknowledgeReceive(XtaMessageTestFactory.MESSAGE_ID);
 		}
 	}
-
 }
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
index 18d24bff8acc8fe3501cbd8a6bdc7b039b16e1f5..643602f8918e4082a2c71cc0cf6223a79945a596 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
@@ -1,6 +1,5 @@
 package de.ozgcloud.eingang.xta;
 
-import static de.ozgcloud.eingang.xta.XtaService.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
@@ -18,6 +17,8 @@ import org.mockito.Spy;
 
 class XtaServiceTest {
 
+	private static final String MESSAGE_TYPE_OTHER = "MESSAGE_TYPE_OTHER";
+
 	@Spy
 	@InjectMocks
 	private XtaService service;
@@ -30,69 +31,71 @@ class XtaServiceTest {
 	@Nested
 	class TestGetMessagesAsFormData {
 
-		private XtaMessageMetaData metaData = XtaMessageMetaDataTestFactory.create();
+		private XtaMessageMetaDatasAndHeader metaData = XtaMessageMetaDatasAndHeaderTestFactory.create();
+		private XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create();
+		private XtaMessage message = XtaMessageTestFactory.create();
 
 		@BeforeEach
-		void init() {
-			when(service.getMessagesMetaData()).thenReturn(Stream.of(metaData));
+		void setup() {
+			doReturn(Stream.of(messageMetaData)).when(service).createXtaMessageStream();
 		}
 
 		@Test
-		void shouldCallGetFormData() {
-			doReturn(FormDataTestFactory.create()).when(service).getFormData(any());
-
-			service.getMessagesAsFormData().toList();
+		void shouldCallCreateStream() {
+			service.getMessages();
 
-			verify(service).getFormData(metaData);
+			verify(service).createXtaMessageStream();
 		}
 
 		@Test
-		void shouldReturnFormData() {
-			var formData = FormDataTestFactory.create();
-			doReturn(formData).when(service).getFormData(any());
+		void shouldCallFilterByMessageType() {
+			when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message);
 
-			var result = service.getMessagesAsFormData();
+			service.getMessages().toList();
 
-			assertThat(result).hasSize(1).contains(formData);
+			verify(service).filterByMessageType(messageMetaData);
 		}
-	}
 
-	@Nested
-	class TestGetMessages {
+		@Test
+		void shouldCallGetFormData() {
+			when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message);
+			doReturn(true).when(service).filterByMessageType(messageMetaData);
 
-		private XtaMessageMetaData metaData = XtaMessageMetaDataTestFactory.createBuilder().messageType(DFOERDERMITTELANTRAG_MESSAGE_TYPE).build();
+			service.getMessages().toList();
 
-		@BeforeEach
-		void init() {
-			when(remoteService.getMessagesMetadata()).thenReturn(Stream.of(metaData));
+			verify(service).getFormData(messageMetaData);
 		}
 
 		@Test
-		void shouldCallRemoteService() {
-			service.getMessagesMetaData();
+		void shouldNotCallGetFormData() {
+			doReturn(false).when(service).filterByMessageType(messageMetaData);
 
-			verify(remoteService).getMessagesMetadata();
+			service.getMessages().toList();
+
+			verify(service, never()).getFormData(any());
 		}
+	}
+
+	@Nested
+	class TestFilterByMessageType {
 
 		@Test
-		void shouldReturnMetaData() {
-			var result = service.getMessagesMetaData();
+		void shouldAcceptDFoerdermittel() {
+			var metaDataDFoerder = XtaMessageMetaDataTestFactory.create();
 
-			assertThat(result).hasSize(1).contains(metaData);
+			assertThat(service.filterByMessageType(metaDataDFoerder)).isTrue();
 		}
 
 		@Test
-		void shouldOnlyReturnMatchingMessageCode() {
-			when(remoteService.getMessagesMetadata()).thenReturn(Stream.of(XtaMessageMetaDataTestFactory.createBuilder().messageType("other").build()));
-			
-			var result = service.getMessagesMetaData();
+		void shouldNotAcceptOtherMessageType() {
+			var metaDataDFoerder = XtaMessageMetaDataTestFactory.createBuilder().messageType(MESSAGE_TYPE_OTHER).build();
 
-			assertThat(result).isEmpty();
+			assertThat(service.filterByMessageType(metaDataDFoerder)).isFalse();
 		}
 	}
 
 	@Nested
-	class TestFetFormData {
+	class TestGetFormData {
 
 		private XtaMessage message = XtaMessageTestFactory.create();