diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 07e45902fdd2599d9798e90a6ad1c7d4a467bfa6..27acb0c4ffd60cdf9acd3a905de168d91ac7417e 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -12,7 +12,7 @@
 	<groupId>de.ozgcloud.bescheid</groupId>
 	<artifactId>bescheid-manager</artifactId>
 	<name>OZG-Cloud Bescheid Manager</name>
-	<version>1.14.0-SNAPSHOT</version>
+	<version>1.15.0-SNAPSHOT</version>
 
 	<properties>
 		<vorgang-manager.version>2.9.0</vorgang-manager.version>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
index b3ce8a3e1a88daa5cff3e3a4b6af9f6b46ce2e98..651017599265902ee54a2e1c153ecfe5dd744f57 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
@@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.reactive.function.BodyExtractors;
 import org.springframework.web.reactive.function.client.ClientResponse;
 import org.springframework.web.reactive.function.client.WebClient;
+import org.w3c.dom.Document;
 import org.w3c.dom.Text;
 import org.xml.sax.SAXException;
 
@@ -55,6 +56,9 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 	private static final String FILE_TYPE_PDF = "PDF";
 	private static final String FILE_TYPE_XML = "XML";
 
+	static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR
+	static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; //NOSONAR
+
 	@SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding
 	private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8;
 
@@ -116,31 +120,48 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 	}
 
 	Optional<String> getNachrichtText(SmartDocumentsResponse response) {
-		return getXMLFile(response).flatMap(this::extractTextFormXmlFile);
+		return getXMLFile(response).flatMap(this::extractTextFromXmlFile);
 	}
 
-	Optional<String> extractTextFormXmlFile(File xmlFile) {
+	Optional<String> extractTextFromXmlFile(File xmlFile) {
 		try {
-			return doExtractText(xmlFile);
-		} catch (XPathExpressionException | SAXException | IOException | ParserConfigurationException e) {
-			LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e);
-		} catch (ClassCastException e) {
-			LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e);
+			var document = parseXml(xmlFile);
+			if (document.isPresent()) {
+				return document.flatMap(this::getNachrichtenText).or(() -> getFieldTemplateText(document.get())).map(Text::getTextContent);
+			}
 		} catch (RuntimeException e) {
 			LOG.warn("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e);
 		}
 		return Optional.empty();
 	}
 
-	Optional<String> doExtractText(File xmlFile)
-			throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
-		var xPath = XPathFactory.newInstance().newXPath();
+	Optional<Document> parseXml(File xmlFile) {
+		try {
+			return Optional.of(DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile));
+		} catch (SAXException | IOException | ParserConfigurationException e) {
+			LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e);
+		}
+		return Optional.empty();
+	}
+
+	Optional<Text> getNachrichtenText(Document document) {
+		return evaluateXPath(document, NACHRICHTEN_TEXT_EXPRESSION);
+	}
 
-		var document = DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile);
-		var expr = xPath.compile("/root/SmartDocument/Fields/NachrichtenText/text()");
+	Optional<Text> getFieldTemplateText(Document document) {
+		return evaluateXPath(document, FIELD_TEMPLATE_EXPRESSION);
+	}
 
-		return Optional.ofNullable((Text) expr.evaluate(document, XPathConstants.NODE))
-				.map(Text::getTextContent);
+	Optional<Text> evaluateXPath(Document document, String xpathExpression) {
+		try {
+			var expr = XPathFactory.newInstance().newXPath().compile(xpathExpression);
+			return Optional.ofNullable(expr.evaluate(document, XPathConstants.NODE)).map(Text.class::cast);
+		} catch (ClassCastException e) {
+			LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e);
+		} catch (XPathExpressionException e) {
+			LOG.warn("Cannot evaluate XPath: {}", xpathExpression, e);
+		}
+		return Optional.empty();
 	}
 
 	Optional<File> getXMLFile(SmartDocumentsResponse response) {
@@ -178,9 +199,9 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 
 	private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) {
 		return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder()
-				.templateGroup(properties.getTemplateGroup())
-				.template(vorgang.getVorgangName())
-				.build())
+						.templateGroup(properties.getTemplateGroup())
+						.template(vorgang.getVorgangName())
+						.build())
 				.build();
 	}
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java
index 28c3e88f5c362906b9288319b4062347daeea5f2..9bbaa5728dc689fe6d70fe510af8ae909b65ae7f 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java
@@ -1,6 +1,8 @@
 package de.ozgcloud.bescheid;
 
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.info.BuildProperties;
+import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.security.authentication.AuthenticationTrustResolver;
@@ -10,6 +12,9 @@ import org.springframework.security.authentication.AuthenticationTrustResolverIm
 @ComponentScan({ "de.ozgcloud.*" })
 public class BescheidTestApplication {
 
+	@MockBean
+	private BuildProperties buildProperties;
+
 	@Bean
 	AuthenticationTrustResolver trustResolver() {
 		return new AuthenticationTrustResolverImpl();
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java
index 61873f64571613f97a8a55b58cb23c7d4751a2f4..071cb7d7ee00b57de1a217ccef7e4522df18a4c9 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java
@@ -6,7 +6,6 @@ import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.info.BuildProperties;
 import org.springframework.boot.test.mock.mockito.MockBean;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
@@ -21,8 +20,6 @@ class TemplateHandlerITCase {
 	@Autowired
 	private TemplateHandler handler;
 	@MockBean
-	private BuildProperties properties;
-	@MockBean
 	private OzgCloudCommandService commandService;
 	@MockBean
 	private CommandMapper commandMapper;
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java
index e0280020426fe92f6dce27b0f223738f57e108b5..47a6694e656de4082a3bdaf7d2e3e799793636f1 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java
@@ -6,7 +6,6 @@ import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.info.BuildProperties;
 import org.springframework.boot.test.mock.mockito.MockBean;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
@@ -23,8 +22,6 @@ class NachrichtServiceITCase {
 	private OzgCloudCommandService commandService;
 	@MockBean
 	private CommandMapper commandMapper;
-	@MockBean
-	private BuildProperties buildProperties;
 
 	@DisplayName("Build message")
 	@Nested
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java
index 3126ecfe5b5f98c41749c406cd426253a65b053e..764fc28f4882f0f160b07deef03f080c4c8b975d 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java
@@ -2,7 +2,10 @@ package de.ozgcloud.bescheid.smartdocuments;
 
 import static org.assertj.core.api.Assertions.*;
 
+import java.io.File;
+
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -14,9 +17,10 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.bescheid.BescheidRequestTestFactory;
 import de.ozgcloud.bescheid.BescheidTestApplication;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+import de.ozgcloud.common.binaryfile.TempFileUtils;
 import de.ozgcloud.common.test.ITCase;
+import de.ozgcloud.common.test.TestUtils;
 
-@Disabled
 @SpringBootTest(classes = BescheidTestApplication.class)
 @ITCase
 @ActiveProfiles({ "itcase", "local" })
@@ -29,6 +33,7 @@ class SmartDocumentsBescheidRemoteServiceITCase {
 	@MockBean
 	private CommandMapper commandMapper;
 
+	@Disabled("This test request SmartDocuments service")
 	@Test
 	void createBescheid() {
 		var bescheid = remoteService.create(BescheidRequestTestFactory.create(), VorgangTestFactory.create());
@@ -38,4 +43,37 @@ class SmartDocumentsBescheidRemoteServiceITCase {
 		assertThat(bescheid.getBescheidFileName()).isNotEmpty();
 	}
 
+	@Nested
+	class TestGetNachrichtenText {
+
+		private static final String NACHRICHTEN_TEXT = "Nachrichtentext";
+		private static final String FIELD_TEMPLATE_TEXT = "Nachrichten Field Text";
+
+		@Test
+		void shouldGetNachrichtenText() {
+			var nachrichtenText = remoteService.extractTextFromXmlFile(loadFile("SD_answer.xml"));
+
+			assertThat(nachrichtenText).contains(NACHRICHTEN_TEXT);
+		}
+
+		@Test
+		void shouldGetFieldTemplateText() {
+			var fieldTemplateText = remoteService.extractTextFromXmlFile(loadFile("SD_answer_field_template.xml"));
+
+			assertThat(fieldTemplateText).contains(FIELD_TEMPLATE_TEXT);
+		}
+
+		@Test
+		void shouldExpectMissingTextNode() {
+			File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml"));
+
+			var text = remoteService.extractTextFromXmlFile(xmlFileWithoutText);
+
+			assertThat(text).isEmpty();
+		}
+
+		private File loadFile(String fileName) {
+			return TempFileUtils.writeTmpFile(TestUtils.loadFile(fileName));
+		}
+	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
index 695e1cad6f1f865c19181e4b510d51ce03a12b96..4db4b0e81338307b7af8df53bf85667096e738e3 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
@@ -7,19 +7,20 @@ import static org.mockito.Mockito.*;
 import java.io.File;
 import java.util.Optional;
 
+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 org.mockito.Spy;
+import org.w3c.dom.Document;
+import org.w3c.dom.Text;
 
 import de.ozgcloud.bescheid.BescheidRequestTestFactory;
 import de.ozgcloud.bescheid.BescheidTestFactory;
 import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
 import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.common.binaryfile.TempFileUtils;
-import de.ozgcloud.common.test.TestUtils;
 import lombok.SneakyThrows;
 
 class SmartDocumentsBescheidRemoteServiceTest {
@@ -30,6 +31,10 @@ class SmartDocumentsBescheidRemoteServiceTest {
 
 	@Mock
 	private SmartDocumentsProperties properties;
+	@Mock
+	private Text xmlText;
+	@Mock
+	private File xmlFile;
 
 	@Nested
 	class TestBuildBescheid {
@@ -57,7 +62,15 @@ class SmartDocumentsBescheidRemoteServiceTest {
 
 	@Nested
 	class TestGetNachrichtText {
-		private final File xmlFile = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer.xml"));
+
+		@Test
+		void shouldCallGetXMLFile() {
+			var response = SmartDocumentsResponseTestFactory.create();
+
+			service.getNachrichtText(response);
+
+			verify(service).getXMLFile(response);
+		}
 
 		@Test
 		void shouldCallExtractText() {
@@ -65,36 +78,171 @@ class SmartDocumentsBescheidRemoteServiceTest {
 
 			service.getNachrichtText(SmartDocumentsResponseTestFactory.create());
 
-			verify(service).extractTextFormXmlFile(notNull());
+			verify(service).extractTextFromXmlFile(xmlFile);
+		}
+	}
+
+	@Nested
+	class TestExtractTextFromXmlFileSuccessfully {
+
+		private static final String NACHRICHT_TEXT = "NachrichtText";
+
+		@Mock
+		private Document document;
+
+		@SneakyThrows
+		@BeforeEach
+		void init() {
+			doReturn(Optional.of(document)).when(service).parseXml(any());
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldCallParseXml() {
+			service.extractTextFromXmlFile(xmlFile);
+
+			verify(service).parseXml(xmlFile);
+		}
+
+		@Test
+		void shouldCallGetNachrichtenText() {
+			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
+
+			service.extractTextFromXmlFile(xmlFile);
+
+			verify(service).getNachrichtenText(document);
+		}
+
+		@Test
+		void shouldReturnNachrichtenText() {
+			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
+			when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT);
+
+			var text = service.extractTextFromXmlFile(xmlFile);
+
+			assertThat(text).contains(NACHRICHT_TEXT);
+		}
+
+		@Test
+		void shouldNotCallGetFieldTemplateText() {
+			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
+
+			service.extractTextFromXmlFile(xmlFile);
+
+			verify(service, never()).getFieldTemplateText(document);
 		}
 
-		@Nested
-		class ExtractingText {
+		@Test
+		void shouldCallGetFieldTemplateText() {
+			doReturn(Optional.empty()).when(service).getNachrichtenText(any());
+			doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any());
+
+			service.extractTextFromXmlFile(xmlFile);
 
-			@Test
-			void shouldReturnText() {
-				var text = service.extractTextFormXmlFile(xmlFile);
+			verify(service).getFieldTemplateText(document);
+		}
 
-				assertThat(text).isPresent().get().isNotNull();
-			}
+		@Test
+		void shouldReturnFieldTemplateText() {
+			doReturn(Optional.empty()).when(service).getNachrichtenText(any());
+			doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any());
+			when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT);
 
-			@Test
-			void shouldHandleError() {
-				var text = service.extractTextFormXmlFile(null);
+			var text = service.extractTextFromXmlFile(xmlFile);
 
-				assertThat(text).isEmpty();
-			}
+			assertThat(text).contains(NACHRICHT_TEXT);
+		}
+	}
 
-			@Test
-			@SneakyThrows
-			void shouldExpectMissingTextNode() {
-				File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml"));
+	@Nested
+	class TestExtractTextFormXmlFileFails {
 
-				var text = service.doExtractText(xmlFileWithoutText);
+		@Mock
+		private Document document;
 
-				assertThat(text).isEmpty();
-			}
+		@SneakyThrows
+		@Test
+		void shouldHandleMissingXmlDocument() {
+			doReturn(Optional.empty()).when(service).parseXml(any());
+
+			var text = service.extractTextFromXmlFile(xmlFile);
+
+			assertThat(text).isEmpty();
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldExpectMissingTextNode() {
+			doReturn(Optional.of(document)).when(service).parseXml(any());
+			doReturn(Optional.empty()).when(service).getFieldTemplateText(any());
+
+			var text = service.extractTextFromXmlFile(xmlFile);
+
+			assertThat(text).isEmpty();
+		}
+	}
+
+	@Nested
+	class TestGetNachrichtenText {
+
+		@Mock
+		private Text text;
+		@Mock
+		private Document document;
+
+		@BeforeEach
+		void init() {
+			doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any());
+		}
+
+		@Test
+		void shouldCallEvaluatePath() {
+			getNachrichtenText();
+
+			verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.NACHRICHTEN_TEXT_EXPRESSION);
+		}
+
+		@Test
+		void shouldReturnText() {
+			var result = getNachrichtenText();
+
+			assertThat(result).contains(text);
+		}
+
+		private Optional<Text> getNachrichtenText() {
+			return service.getNachrichtenText(document);
+		}
+	}
+
+	@Nested
+	class TestGetFieldTemplateText {
+
+		@Mock
+		private Text text;
+		@Mock
+		private Document document;
+
+		@BeforeEach
+		void init() {
+			doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any());
+		}
+
+		@Test
+		void shouldCallEvaluatePath() {
+			getFieldTemplateText();
+
+			verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.FIELD_TEMPLATE_EXPRESSION);
+		}
+
+		@Test
+		void shouldReturnText() {
+			var result = getFieldTemplateText();
+
+			assertThat(result).contains(text);
+		}
 
+		private Optional<Text> getFieldTemplateText() {
+			return service.getFieldTemplateText(document);
 		}
 	}
 }
diff --git a/bescheid-manager/src/test/resources/SD_answer.xml b/bescheid-manager/src/test/resources/SD_answer.xml
index df9d905e472c9b0a077421064ad61a990389ede5..172f70cc754469dec0ee76b32714c0ea1b127c5c 100644
--- a/bescheid-manager/src/test/resources/SD_answer.xml
+++ b/bescheid-manager/src/test/resources/SD_answer.xml
@@ -258,13 +258,7 @@
          <Field ID="FEC37A441C9D46189533DBD9CFD0E0E8"><![CDATA[STEUBER]]></Field>
          <Field ID="FECCC52ABB614390BAE2577AD8C44262"><![CDATA[24103]]></Field>
          <Field ID="root/CustomerData/Dateiname"><![CDATA[Fleet_9-Verk-AO_01-08_06.12.2023-06.12.2023]]></Field>
-         <NachrichtenText>Sehr geehrte/r Antragstellende,
-
-anliegend erhalten Sie die verkehrsrechtliche Anordnung für die Aufstellung der von Ihnen beantragten Beschilderung. Die Prüfung der Straßenverkehrsbehörde bezieht sich nur auf die Vollständigkeit des Antrages und die Plausibilität der Angaben. Die richtige Auswahl der aufzustellenden Verkehrszeichen oder Überschneidung mit anderen Anträgen wurde dabei nicht geprüft.
-
-BITTE DRINGEND BEACHTEN
-Der Antrag einer mobilen Haltverbotszone ist MINDESTENS 1 Woche vor Aufstellung der Beschilderung zu stellen. Des Weiteren gilt die Beschilderung erst als angeordnet, wenn die Antragstellenden das von der Straßenverkehrsbehörde unterschriebene Anmeldeformular zurückerhalten haben (Fax, E-Mail, Post). Vorab sind keine Schilder aufzustellen!!!
-</NachrichtenText>
+         <NachrichtenText>Nachrichtentext</NachrichtenText>
       </Fields>
       <DocumentProperties>
          <Guid>7ACEA5AE7C3642978ACCC48182EBCD6E</Guid>
diff --git a/bescheid-manager/src/test/resources/SD_answer_field_template.xml b/bescheid-manager/src/test/resources/SD_answer_field_template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7ad2b6b9bdd219cf10ac96c711d43fff926a4009
--- /dev/null
+++ b/bescheid-manager/src/test/resources/SD_answer_field_template.xml
@@ -0,0 +1,299 @@
+<?xml version='1.0' encoding='UTF-8'?><!--
+  ~ Copyright (C) 2024 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.
+  -->
+<root>
+	<SmartDocument Version="2.0">
+		<Selection>
+			<TypistID>072D2DBF07C049858DFB716BDBAAE83A</TypistID>
+			<UserGroupID>
+				DA9D309EF1374D8A920CC9878DD3D629
+			</UserGroupID>
+			<AuthorID>072D2DBF07C049858DFB716BDBAAE83A
+			</AuthorID>
+			<TemplateGroupID>94A1C1208DF0479CB58E3CFB0A6057BC</TemplateGroupID>
+			<Template>
+				KFAS_LIVE_KI_10_Haltverbot_befristet
+			</Template>
+			<TemplateID VersionID="87731D1F4AB74952979B58497D95EA86">
+				7ACEA5AE7C3642978ACCC48182EBCD6E
+			</TemplateID>
+			<Blocks>
+				<Block VersionID="15DCCB4DFE1A414796EBA44352C7AAFF">
+					CC2A9C0E14164B9A967CEE8DCD41B3B5
+				</Block>
+				<Placeholders>
+					<Placeholder ID="125E766AF0424D4992F8F04C806F75EB">
+						CC2A9C0E14164B9A967CEE8DCD41B3B5
+					</Placeholder>
+				</Placeholders>
+			</Blocks>
+			<FixedValues/>
+		</Selection>
+		<Variables/>
+		<QuestionAnswers>
+			<Question ID="07BE1279C0504852AEFBB264D165E139" Description="Tagesdatum" OriginalValue="2024-06-25">
+				25.06.2024
+			</Question>
+			<Question ID="23BB945F7BA44321B09A0A984D541DD1" Description="Tage Halteverbot"
+					  ContentId="23BB945F7BA44321B09A0A984D541DD1" IsFormatted="true" ContentType="XML">
+				<Records>
+					<Record>
+						<Field Name="71F5F35C4FD94982A1F8321A73E9B593">
+							<Value>nein</Value>
+							<QuestionAnswers>
+								<Question ID="58F6E456AE1F4E13907D78E158BF4847" Description="Freitag">
+									<Answer ID="313DC774D89E45D8864FC33983C95923" Description="Nein" IsFormatted="true"
+											ContentId="313DC774D89E45D8864FC33983C95923"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="B66C9D21D31A4293852EEDCAB57C593B">
+							<Value>ja</Value>
+							<QuestionAnswers>
+								<Question ID="EF33891FF01A42B0BEFB1E78E3FC023D" Description="Samstag">
+									<Answer ID="F22F6FE074784CCD950430166F42B33F" Description="Ja" IsFormatted="true"
+											ContentId="F22F6FE074784CCD950430166F42B33F"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="67082AAB675E457180A7014531C46CB3">
+							<Value>ja</Value>
+							<QuestionAnswers>
+								<Question ID="60C6CD1F29084A26BEC493A862583AAB" Description="Montag">
+									<Answer ID="8EAE05F9D89C46AE8CCB08A24104CC17" Description="Ja" IsFormatted="true"
+											ContentId="8EAE05F9D89C46AE8CCB08A24104CC17"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="3FD23F8F98EF459A95B50448DEDFF20E">
+							<Value>ja</Value>
+							<QuestionAnswers>
+								<Question ID="C8BC6BFFE8BE4E6BBDC4CBCD34377DB2" Description="Mittwoch">
+									<Answer ID="97B676CAC9B74D00B574F319B2D20BB5" Description="Ja" IsFormatted="true"
+											ContentId="97B676CAC9B74D00B574F319B2D20BB5"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="09658B4DA4BB4295822A42C0AA8FC2EC">
+							<Value>nein</Value>
+							<QuestionAnswers>
+								<Question ID="39BF39565D4043078ABEEC9601A091E7" Description="Donnerstag">
+									<Answer ID="8D4A19B4D3AF448FB720E9160E7A40D2" Description="Nein" IsFormatted="true"
+											ContentId="8D4A19B4D3AF448FB720E9160E7A40D2"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="975867EBE97547ACA6B8D85F1D8D39C8">
+							<Value>nein</Value>
+							<QuestionAnswers>
+								<Question ID="03906ABB93494C6EB087D87C4C70217C" Description="Dienstag">
+									<Answer ID="B9ACD0E74C6B41BEA700C9EB8FCFFC25" Description="Nein" IsFormatted="true"
+											ContentId="B9ACD0E74C6B41BEA700C9EB8FCFFC25"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+						<Field Name="AF89873144744EDC9A1B78776F3D25F5">
+							<Value>nein</Value>
+							<QuestionAnswers>
+								<Question ID="06349259221C4DEFBB4FE9FD33D76403" Description="Sonntag">
+									<Answer ID="853ED74B536C4BD8AF95193450F18201" Description="Nein" IsFormatted="true"
+											ContentId="853ED74B536C4BD8AF95193450F18201"/>
+								</Question>
+							</QuestionAnswers>
+						</Field>
+					</Record>
+				</Records>
+			</Question>
+			<Question ID="28CB094DAD1A4604B08CE7C5D2177C03" Description="Beschilderung">
+				<Answer ID="605F18E32DE04FF2B058BD66F2DE9C06" Description="Nein" IsFormatted="true"
+						ContentId="605F18E32DE04FF2B058BD66F2DE9C06"/>
+			</Question>
+			<Question ID="736372FDB0A2407CBBFB15DE71FD1450" Description="Geschlecht Antragssteller">
+				<Answer ID="CCFD78217BC84D339F582F4B5703A7B6" Description="keine Angabe" IsFormatted="true"
+						ContentId="CCFD78217BC84D339F582F4B5703A7B6"/>
+			</Question>
+			<Question ID="97E309BDBDB548F48D162D289056B313" Description="Uhrzeit Halteverbot">
+				<Answer ID="E45BE1342D5F43D59E21986C377DA1B0" Description="ganztägig" IsFormatted="true"
+						ContentId="E45BE1342D5F43D59E21986C377DA1B0"/>
+			</Question>
+			<Question ID="992F241A1DF4497A8B4568E69B9C567C" Description="Vor Ort geltende Parkregelung">
+				<Answer ID="9875A84F77164A9C88426FD6A01D784F" Description="Parken am Fahrbahnrand" IsFormatted="true"
+						ContentId="9875A84F77164A9C88426FD6A01D784F"/>
+			</Question>
+			<Question ID="9BD81FB0E5FF4235A094BE3D21544615" Description="Name Ansprechperson / Firma"
+					  AlternativeParentID="736372FDB0A2407CBBFB15DE71FD1450">
+				<Answer ID="FC9E396BAA894B52A475BCE1184230D9" Description="keine Angabe" IsFormatted="true"
+						ContentId="FC9E396BAA894B52A475BCE1184230D9"/>
+			</Question>
+			<Question ID="9CE081D9122E43B1B778863AE32AB29F" Description="Protokoll">
+				<Answer ID="8490AF83642D4D26A408A2C431F52183" Description="Nein" IsFormatted="true"
+						ContentId="8490AF83642D4D26A408A2C431F52183"/>
+			</Question>
+			<Question ID="B651AC699A4F4B768DC34DE87BBD578C" Description="Gründe für Halteverbot"
+					  ContentId="B651AC699A4F4B768DC34DE87BBD578C" IsFormatted="true" ContentType="XML">
+				<Records/>
+			</Question>
+			<Question ID="C33A6D64E1B542CB97520C1F32D18C35" Description="Unterschrift">
+				<Answer ID="68A02377AE9D473C9F6BAFF4EF150DE5" Description="Reusche" IsFormatted="true"
+						ContentId="68A02377AE9D473C9F6BAFF4EF150DE5"/>
+			</Question>
+			<Question ID="C7C9CCBF9633499EAB08D1BBB84BFD98" Description="Richtigkeit">
+				<Answer ID="6DF6B7C6A88D4F2282B8366027B0032D" Description="Nein" IsFormatted="true"
+						ContentId="6DF6B7C6A88D4F2282B8366027B0032D"/>
+			</Question>
+			<Question ID="C7D1A20B17CD4C96BF55A2738B8A4631" Description="Kenntnisnahme">
+				<Answer ID="50BBC8449BEB4AFEB774AC706F1D66B9" Description="Nein" IsFormatted="true"
+						ContentId="50BBC8449BEB4AFEB774AC706F1D66B9"/>
+			</Question>
+		</QuestionAnswers>
+		<Fields>
+			<Field ID="3C5C7920FB444A9DB2F5239339599BD7"/>
+			<Field ID="41237CC02584421A8D65990E7F78F833"/>
+			<Field ID="423CB6F4AEB54A44BC67F97626ADC06C"/>
+			<Field ID="442D48B946C64853B78DB99D9341AAC8">16:23</Field>
+			<Field ID="4D4178B6F808409391990233D33BF54C"/>
+			<Field ID="5AE5217E97F845B48D4274894BC2F043">03:25</Field>
+			<Field ID="635CEB0B41DE44EFB2207122CCB8EE1D"/>
+			<Field ID="6B06CD242FC64865BFC5B770BB03EAA4"/>
+			<Field ID="769E3AC926154741AABE870EB802E2AD"/>
+			<Field ID="7AF097E4E741455685CD543ABB7CE337"/>
+			<Field ID="8CA72E11F95F4352AE6FB8001BE79508">25.05.2023</Field>
+			<Field ID="8D38662ADBF2408B8C8DDB5294A5A5A9"/>
+			<Field ID="CA36A227CFEC4B89A40CA8B0CF4460C0">23</Field>
+			<Field ID="CC330D642D7D465FA611D029F6A06344">KFAS_LIVE_KI_10_Haltverbot_befristet-JhQDdq2F</Field>
+			<Field ID="D316B8AE41A3496495C058CCB3766F3A"/>
+			<Field ID="DB270EC247D5476A9D8BFA008E872D7D">Kiel</Field>
+			<Field ID="DE7F7E00C8C246AEA9FFDF7F89E2FB03">05.05.2023</Field>
+			<Field ID="F1826BE2F3D04E508F6401E8AA1D08C1"/>
+			<Field ID="FEC37A441C9D46189533DBD9CFD0E0E8"/>
+			<Field ID="FECCC52ABB614390BAE2577AD8C44262">24114</Field>
+			<Field ID="Template.56E7AA0956C7486292E9A02114CB231C">Nachrichten Field Text</Field>
+			<Field ID="root/CustomerData/Dateiname">_23-Verk-AO_05-23_05.05.2023-25.05.2023</Field>
+		</Fields>
+		<DocumentProperties>
+			<Guid>7ACEA5AE7C3642978ACCC48182EBCD6E</Guid>
+			<BuiltIn>
+				<creator>MGM</creator>
+			</BuiltIn>
+			<Extended/>
+			<Custom>
+				<Author name="Author" type="lpwstr" property="true" variable="false" xml="false">MGM</Author>
+				<Typist name="Typist" type="lpwstr" property="true" variable="false" xml="false">MGM</Typist>
+				<TemplateId name="TemplateId" type="lpwstr" property="true" variable="false" xml="false">
+					7ACEA5AE7C3642978ACCC48182EBCD6E
+				</TemplateId>
+				<Template name="Template" type="lpwstr" property="true" variable="false" xml="false">
+					KFAS_LIVE_KI_10_Haltverbot_befristet
+				</Template>
+			</Custom>
+		</DocumentProperties>
+	</SmartDocument>
+	<CustomerData>
+		<bescheid>
+			<bescheidVom>2023-06-26</bescheidVom>
+			<genehmigt>true</genehmigt>
+		</bescheid>
+		<userData>
+			<firstName>Theo</firstName>
+			<lastName>Test</lastName>
+		</userData>
+		<vorgang>
+			<vorgangName>KFAS_LIVE_KI_10_Haltverbot_befristet</vorgangName>
+			<eingang>
+				<zustaendigeStelle>
+					<organisationseinheitenId>10363455</organisationseinheitenId>
+					<email/>
+				</zustaendigeStelle>
+				<antragsteller/>
+				<formData>
+					<Antrag_abschlie_en>
+						<Ich_best_tige__dass_die_Beschilderung_entsprechend_den_wichtigen_Hinweisen_durchgef_hrt_wird>
+							ja
+						</Ich_best_tige__dass_die_Beschilderung_entsprechend_den_wichtigen_Hinweisen_durchgef_hrt_wird>
+						<Ich_best_tige_hiermit__dass_ein_Protokoll_entsprechend_den_wichtigen_Hinweisen_erstellt_wird>
+							ja
+						</Ich_best_tige_hiermit__dass_ein_Protokoll_entsprechend_den_wichtigen_Hinweisen_erstellt_wird>
+						<Hiermit_best_tige_ich_die_Kenntnisnahme_des_Vorgehens_bei_parkenden_KFZ>ja
+						</Hiermit_best_tige_ich_die_Kenntnisnahme_des_Vorgehens_bei_parkenden_KFZ>
+						<Hiermit_best_tige_ich_die_Richtigkeit_der_gemachten_Angaben>ja
+						</Hiermit_best_tige_ich_die_Richtigkeit_der_gemachten_Angaben>
+					</Antrag_abschlie_en>
+					<Stammdaten__Antragstellende_Person_>
+						<Adresse_Kiel_vorbef_llt_mit_Kontaktdaten>
+							<AS_E-Mail>Bjoern.Reusche@kiel.de</AS_E-Mail>
+							<Postleitzahl>24114</Postleitzahl>
+							<AS_Telefon>015142536149</AS_Telefon>
+							<Wohnort>Kiel</Wohnort>
+							<Stra_e>Je?stra?e</Stra_e>
+							<Hausnummer>23</Hausnummer>
+						</Adresse_Kiel_vorbef_llt_mit_Kontaktdaten>
+						<Nachname>Reusche</Nachname>
+						<Angabe_zur_Person__Firma>m?nnlich</Angabe_zur_Person__Firma>
+						<Verantwortliche_Person_f_r_die_Aufstellung_der_Beschilderung/>
+						<Vorname>Bj?rn</Vorname>
+					</Stammdaten__Antragstellende_Person_>
+					<Angaben_zur_Parkregelung_und_zur_Beschilderung>
+						<Objektgruppe_Hinweis_kein_Abschleppen_m_glich/>
+						<Ort_des_Haltverbotes>
+							<Postleitzahl>24114</Postleitzahl>
+							<Wohnort>Kiel</Wohnort>
+							<Stra_e>Je?stra?e</Stra_e>
+							<Hausnummer>23</Hausnummer>
+						</Ort_des_Haltverbotes>
+						<L_nge_der_Fl_che_in_Metern>25</L_nge_der_Fl_che_in_Metern>
+						<Gr_nde>
+							<Container>nein</Container>
+							<Baufahrzeug>nein</Baufahrzeug>
+							<Materiallagerung>nein</Materiallagerung>
+							<Umzug>ja</Umzug>
+							<Hubsteiger__Kran>nein</Hubsteiger__Kran>
+							<Sonstiges>ja</Sonstiges>
+						</Gr_nde>
+						<Beginn_des_Haltverbotes>05.05.2023</Beginn_des_Haltverbotes>
+						<Bitte_erl_utern_Sie_Ihren_Grund>Verl?ngerung bisher ab 01.04.2023
+						</Bitte_erl_utern_Sie_Ihren_Grund>
+						<Uhrzeit>
+							<Ende_des_Haltverbotes__Uhrzeit_>16:23</Ende_des_Haltverbotes__Uhrzeit_>
+							<Beginn_des_Haltverbotes__Uhrzeit_>03:25</Beginn_des_Haltverbotes__Uhrzeit_>
+						</Uhrzeit>
+						<Vor_Ort_geltende_Parkregelung>Parken am Fahrbahnrand</Vor_Ort_geltende_Parkregelung>
+						<Tage_Haltverbot>
+							<Freitag>nein</Freitag>
+							<Samstag>ja</Samstag>
+							<Montag>ja</Montag>
+							<Mittwoch>ja</Mittwoch>
+							<Donnerstag>nein</Donnerstag>
+							<Dienstag>nein</Dienstag>
+							<Sonntag>nein</Sonntag>
+						</Tage_Haltverbot>
+						<Ende_des_Haltverbotes>25.05.2023</Ende_des_Haltverbotes>
+					</Angaben_zur_Parkregelung_und_zur_Beschilderung>
+					<Informationen_und_Hinweise_zu_erforderlichen_Unterlagen/>
+				</formData>
+			</eingang>
+			<vorgangNummer>KFAS_LIVE_KI_10_Haltverbot_befristet-JhQDdq2F</vorgangNummer>
+			<aktenzeichen>KFAS_LIVE_KI_10_Haltverbot_befristet-JhQDdq2F</aktenzeichen>
+		</vorgang>
+		<Dateiname>_23-Verk-AO_05-23_05.05.2023-25.05.2023</Dateiname>
+	</CustomerData>
+</root>
diff --git a/pom.xml b/pom.xml
index b8aec14705c319a0b4710203f947b9e23d43df88..1b9b61485236e8343cc4790763c73dde40c7512f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager</artifactId>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager</name>
 	<packaging>pom</packaging>
diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml
index 0437702163106cd37fa6be06609c547b8907a3f3..28fab29f9e443b50b32b87d68c9ffdedc0220d4d 100644
--- a/src/main/helm/templates/network_policy.yaml
+++ b/src/main/helm/templates/network_policy.yaml
@@ -109,6 +109,18 @@ spec:
         podSelector: 
           matchLabels:
             component: info-manager
+{{- end }}
+{{- if (.Values.zufiManager).enabled }}
+  - to:
+    - namespaceSelector:
+        matchLabels:
+          kubernetes.io/metadata.name: {{ required "zufiManager.namespace must be set if zufiManager server is enabled" (.Values.zufiManager).namespace }}
+      podSelector: 
+        matchLabels:
+          component: zufi-server
+    ports:
+      - port: 9090
+        protocol: TCP
 {{- end }}
   - to:
     - namespaceSelector:
diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml
index 6348f8be5667775ec59dd74d3a1ab935baa25005..f63746306c5edeaa76f17028551c04243a137d31 100644
--- a/src/test/helm/network_policy_test.yaml
+++ b/src/test/helm/network_policy_test.yaml
@@ -27,21 +27,28 @@ release:
   namespace: by-helm-test
 templates:
   - templates/network_policy.yaml
-set: 
-  networkPolicy:
-    dnsServerNamespace: test-dns-namespace
+
 tests:
   - it: should match apiVersion
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - isAPIVersion:
           of: networking.k8s.io/v1
 
   - it: should match kind
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - isKind:
           of: NetworkPolicy
 
   - it: validate metadata
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - equal:
           path: metadata
@@ -50,6 +57,9 @@ tests:
             namespace: by-helm-test
 
   - it: should set policy target matchLabel
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - equal:
           path: spec.podSelector
@@ -59,18 +69,27 @@ tests:
 
 
   - it: should add policyType Egress
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.policyTypes
           content: Egress
 
   - it: should add policyType Ingress
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.policyTypes
           content: Ingress
 
   - it: should add ingress rule for eingangsmanager and alfa
+    set: 
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.ingress
@@ -90,6 +109,8 @@ tests:
 
   - it: should add ingress rule for antragraum if antragraum is enabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         antragraum:
           enabled: true
@@ -109,6 +130,8 @@ tests:
 
   - it: should not add ingress rule for antragraum if antragraum is disabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         antragraum:
           enabled: false
@@ -126,6 +149,8 @@ tests:
 
   - it: should throw error if antragraum is enabled but antragraum namespace is not set
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         antragraum:
           enabled: true
@@ -135,6 +160,9 @@ tests:
 
 
   - it: should add egress rule to elasticsearch
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.egress
@@ -151,6 +179,9 @@ tests:
                   protocol: TCP
 
   - it: should add egress rule to mongodb
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.egress
@@ -164,6 +195,9 @@ tests:
                   protocol: TCP
 
   - it: should add egress rule to user-manager
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.egress
@@ -178,6 +212,8 @@ tests:
 
   - it: should add egress rule to nachrichten-bayernid-proxy if bayernid is enabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         bayernid:
           enabled: true
@@ -200,6 +236,8 @@ tests:
 
   - it: should not add egress rule to bayernid-proxy if bayernid is disabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         bayernid:
           enabled: false
@@ -220,6 +258,8 @@ tests:
   
   - it: should throw error if bayernid-proxy is enabled but bayernid namespace is not set
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         bayernid:
           enabled: true
@@ -229,6 +269,8 @@ tests:
 
   - it: should add egress rule to info-manager if antragraum is enabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         antragraum:
           enabled: true
@@ -247,6 +289,8 @@ tests:
 
   - it: should not add egress rule to info-manager if antragraum is disabled
     set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
       ozgcloud:
         antragraum:
           enabled: false
@@ -262,8 +306,83 @@ tests:
                   matchLabels:
                     component: info-manager
 
+  - it: should add egress rule to zufi server if zufi is enabled
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+      zufiManager:
+        enabled: true
+        namespace: zufi
+    asserts:
+      - contains:
+          path: spec.egress
+          content:
+            to:
+            - podSelector: 
+                matchLabels:
+                  component: zufi-server
+              namespaceSelector:
+                matchLabels:
+                      kubernetes.io/metadata.name: zufi
+            ports:
+            - port: 9090
+              protocol: TCP         
+                  
+
+  - it: should not add egress rule to zufi server if zufi is disabled
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+      zufiManager:
+        enabled: false
+        namespace: zufi
+    asserts:
+      - notContains:
+          path: spec.egress
+          content:
+            to:
+            - namespaceSelector:
+                matchLabels:
+                  kubernetes.io/metadata.name: zufi
+              podSelector: 
+                matchLabels:
+                  component: zufi-server
+          any: true
+  
+  - it: should throw error if zufi is enabled but zufi namespace is not set
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+      zufiManager:
+        enabled: true
+    asserts:
+      - failedTemplate:
+          errorMessage: zufiManager.namespace must be set if zufiManager server is enabled
+
+  - it: should not enable zufi netpol by default
+    set:
+      zufiManager:
+        namespace: zufi
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+    asserts:
+      - notContains:
+          path: spec.egress
+          content: 
+            to:
+            - namespaceSelector:
+                matchLabels:
+                  kubernetes.io/metadata.name: zufi
+              podSelector: 
+                matchLabels:
+                  component: zufi-server
+          any: true
+
 
   - it: should add egress rule to dns service
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
     asserts:
       - contains:
           path: spec.egress
@@ -285,6 +404,7 @@ tests:
   - it: add ingress rule local by values
     set:
       networkPolicy:
+        dnsServerNamespace: test-dns-namespace
         ssoPublicIp: 51.89.117.53/32
         additionalIngressConfigGlobal:
         - from:
@@ -302,6 +422,7 @@ tests:
   - it: add ingress rule global by values
     set:
       networkPolicy:
+        dnsServerNamespace: test-dns-namespace
         ssoPublicIp: 51.89.117.53/32
         additionalIngressConfigLocal:
         - from:
@@ -320,6 +441,7 @@ tests:
   - it: add egress rules local by values
     set:
       networkPolicy:
+        dnsServerNamespace: test-dns-namespace
         additionalEgressConfigGlobal:
         - to:
           - ipBlock:
@@ -351,6 +473,7 @@ tests:
   - it: add egress rules global by values
     set:
       networkPolicy:
+        dnsServerNamespace: test-dns-namespace
         additionalEgressConfigLocal:
         - to:
           - ipBlock:
@@ -380,6 +503,22 @@ tests:
     set:
       networkPolicy:
         disabled: false
+        dnsServerNamespace: test-dns-namespace
+    asserts:
+      - hasDocuments:
+          count: 1
+  - it: test network policy dnsServerNamespace must be set message
+    set:
+      networkPolicy:
+        disabled: false
+    asserts:
+      - failedTemplate:
+          errorMessage: networkPolicy.dnsServerNamespace must be set
+
+  - it: test network policy should be enabled by default
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-server-namespace
     asserts:
       - hasDocuments:
           count: 1
\ No newline at end of file
diff --git a/vorgang-manager-base/pom.xml b/vorgang-manager-base/pom.xml
index 11057a5ac33d4ea904dcc3298b8f110744168159..01a891cafa5c98d4a5bf87091817403b5c6a9f88 100644
--- a/vorgang-manager-base/pom.xml
+++ b/vorgang-manager-base/pom.xml
@@ -12,7 +12,7 @@
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-base</artifactId>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager Base</name>
 
diff --git a/vorgang-manager-command/pom.xml b/vorgang-manager-command/pom.xml
index 513bb76f3728cadb4d8a30e14f55c8f79959398c..1427d6e703f39962af7b6136e3319e01c87022e2 100644
--- a/vorgang-manager-command/pom.xml
+++ b/vorgang-manager-command/pom.xml
@@ -10,7 +10,7 @@
 	
 	<groupId>de.ozgcloud.command</groupId>
 	<artifactId>command-manager</artifactId>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 	<name>OZG-Cloud Command Manager</name>
 
 	<properties>
diff --git a/vorgang-manager-interface/pom.xml b/vorgang-manager-interface/pom.xml
index f5f097fbf2b5cb4fc430858578035b32ca2fe890..c64435edbd2a453b7b75be55b0647d46ac6d644b 100644
--- a/vorgang-manager-interface/pom.xml
+++ b/vorgang-manager-interface/pom.xml
@@ -36,7 +36,7 @@
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-interface</artifactId>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager gRPC Interface</name>
 	<description>Interface (gRPC) for Vorgang Manager Server</description>
diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml
index 37cdd581ffa39423471d70a1dabf68e326801933..e12c6d0fbaa919e7374e51d583ab1b13da62f2de 100644
--- a/vorgang-manager-server/pom.xml
+++ b/vorgang-manager-server/pom.xml
@@ -38,7 +38,7 @@
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-server</artifactId>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager Server</name>
 	<description>Server Implementierung des VorgangManagers</description>
@@ -50,10 +50,10 @@
 		<spring-boot.build-image.imageName>docker.ozg-sh.de/vorgang-manager:build-latest</spring-boot.build-image.imageName>
 
 		<ozgcloud.license.version>1.3.0</ozgcloud.license.version>
-		<zufi-manager-interface.version>1.0.0-SNAPSHOT</zufi-manager-interface.version>
+		<zufi-manager-interface.version>1.0.0</zufi-manager-interface.version>
 
 		<user-manager-interface.version>2.1.0</user-manager-interface.version>
-		<bescheid-manager.version>1.14.0-SNAPSHOT</bescheid-manager.version>
+		<bescheid-manager.version>1.14.1</bescheid-manager.version>
 		<processor-manager.version>0.4.1</processor-manager.version>
 		<nachrichten-manager.version>2.9.0</nachrichten-manager.version>
 		<ozgcloud-starter.version>0.10.0</ozgcloud-starter.version>
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemCustomRepositoryImpl.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemCustomRepositoryImpl.java
index c3bb8ce0a775e518f791f245f5d0b3cb7614ad27..21a29bfe93e5821cf99dceee801fbc234908a6a4 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemCustomRepositoryImpl.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemCustomRepositoryImpl.java
@@ -78,16 +78,16 @@ public class VorgangAttachedItemCustomRepositoryImpl implements VorgangAttachedI
 	private Update buildUpdateForItemAndVersion(Map<String, Object> propertyMap) {
 		var item = new Document();
 		item.putAll(propertyMap);
-		return new Update().set(VorgangAttachedItem.FIELDNAME_ITEM, item);
+		return new Update().set(VorgangAttachedItem.FIELDNAME_ITEM, item).inc(VorgangAttachedItem.FIELDNAME_VERSION, 1);
 	}
 
 	@Override
 	public void patch(String itemId, long version, Map<String, Object> propertyMap) {
-		mongoOperations.updateFirst(
+		var patchedResult = mongoOperations.updateFirst(
 				query(byIdAndVersion(itemId, version)),
 				createPatchUpdateForItemAndVersion(propertyMap),
 				VorgangAttachedItem.class);
-
+		collisionVerifier.verify(patchedResult, itemId);
 	}
 
 	@Override
@@ -123,7 +123,7 @@ public class VorgangAttachedItemCustomRepositoryImpl implements VorgangAttachedI
 	}
 
 	private Document buildItemPatchDocument(Map<String, Object> propertiesMap) {
-		Map<String, Object> resultMap = new HashMap<>(propertiesMap.size());
+		var resultMap = new HashMap<String, Object>(propertiesMap.size());
 		propertiesMap.forEach((k, v) -> resultMap.put("%s.%s".formatted(VorgangAttachedItem.FIELDNAME_ITEM, k), v));
 		return new Document(resultMap);
 	}
@@ -140,5 +140,4 @@ public class VorgangAttachedItemCustomRepositoryImpl implements VorgangAttachedI
 				Update.update(VorgangAttachedItem.FIELDNAME_IS_DELETED, deleted), VorgangAttachedItem.COLLECTION_NAME);
 		collisionVerifier.verify(updateResult, itemId);
 	}
-
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java
index b32e3bd29b0bcaa5dfd0378b1f1f1406092ceab0..bc2698d065807fa34449c44f86bb2cf82e544319 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListener.java
@@ -23,28 +23,32 @@
  */
 package de.ozgcloud.vorgang.attached_item;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.function.Predicate;
 
+import jakarta.validation.ValidationException;
+
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
-import jakarta.validation.ValidationException;
-
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEvent;
 import de.ozgcloud.command.CommandFailedEvent;
-import de.ozgcloud.command.CommandRevokeFailedEvent;
-import de.ozgcloud.command.CommandRevokedEvent;
 import de.ozgcloud.command.RevokeCommandEvent;
+import de.ozgcloud.vorgang.command.CommandService;
 import de.ozgcloud.vorgang.command.Order;
+import de.ozgcloud.vorgang.command.PersistedCommand;
 import de.ozgcloud.vorgang.vorgang.VorgangDeletedEvent;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 @Component
+@RequiredArgsConstructor
 @Log4j2
 class VorgangAttachedItemEventListener {
 
@@ -58,42 +62,48 @@ class VorgangAttachedItemEventListener {
 	public static final Predicate<Command> IS_PATCH_ITEM_ORDER = command -> Order.PATCH_ATTACHED_ITEM.isMeant(command.getOrder());
 	public static final Predicate<Command> IS_DELETE_ITEM_ORDER = command -> Order.DELETE_ATTACHED_ITEM.isMeant(command.getOrder());
 
-	@Autowired
-	private VorgangAttachedItemService service;
-	@Autowired
-	private VorgangAttachedItemMapper mapper;
-	@Autowired
-	private ApplicationEventPublisher publisher;
+	private final VorgangAttachedItemService service;
+	private final VorgangAttachedItemMapper mapper;
+
+	private final ApplicationEventPublisher publisher;
+
+	private final CommandService commandService;
 
 	@EventListener(condition = IS_CREATE_ITEM_ORDER_CONDITION)
 	public void createItem(CommandCreatedEvent event) {
 		var command = event.getSource();
 		validateCreateCommand(command);
 
-		var item = mapper.fill(command.getBodyObject());
-		service.create(command.getId(), item.toBuilder().id(null).version(0).build());
+		var item = mapper.fill(command.getBodyObject()).toBuilder().id(null).version(0).build();
+		service.create(command.getId(), item);
 	}
 
-	private void validateCreateCommand(Command command) {
+	void validateCreateCommand(Command command) {
 		if (!StringUtils.equals(command.getRelationId(), command.getVorgangId())) {
 			throw new ValidationException("Command invalid creation command: vorgangId and relationId must be equals");
 		}
-
 	}
 
 	@EventListener(condition = IS_UPDATE_ITEM_ORDER_CONDITION)
 	public void updateItem(CommandCreatedEvent event) {
 		var command = event.getSource();
-		var itemBuilder = mapper.fill(command.getBodyObject())
-				.toBuilder().id(command.getRelationId());
+		var filledItem = mapper.fill(command.getBodyObject()).toBuilder().id(command.getRelationId()).build();
 
+		setCommandPreviousState(command.getId(), getVorgangAttachedItem(command.getRelationId()).getItem());
+
+		doUpdate(command, filledItem);
+	}
+
+	private void doUpdate(Command command, VorgangAttachedItem filledItem) {
 		if (Objects.nonNull(command.getRelationVersion())) {
-			itemBuilder.version(command.getRelationVersion());
-			service.update(command.getId(), itemBuilder.build());
+			service.update(command.getId(), filledItem.toBuilder().version(command.getRelationVersion()).build());
 		} else {
-			service.forceUpdate(command.getId(), itemBuilder.build());
+			service.forceUpdate(command.getId(), filledItem.getId(), filledItem.getItem());
 		}
+	}
 
+	VorgangAttachedItem getVorgangAttachedItem(String id) {
+		return service.getById(id);
 	}
 
 	@EventListener(condition = IS_PATCH_ITEM_ORDER_CONDITION)
@@ -101,9 +111,20 @@ class VorgangAttachedItemEventListener {
 		var command = event.getSource();
 		var item = mapper.fill(command.getBodyObject());
 
+		setCommandPreviousState(command.getId(), getExistingItemMapEntries(command.getRelationId(), item.getItem().keySet()));
+
 		service.patch(command, item.getItem());
 	}
 
+	Map<String, Object> getExistingItemMapEntries(String id, Set<String> keys) {
+		return getVorgangAttachedItem(id).getItem().entrySet().stream().filter(entry -> keys.contains(entry.getKey()))
+				.collect(HashMap::new, (itemMap, entry) -> itemMap.put(entry.getKey(), entry.getValue()), HashMap::putAll);
+	}
+
+	void setCommandPreviousState(String commandId, Map<String, Object> itemMap) {
+		commandService.setPreviousState(commandId, itemMap);
+	}
+
 	@EventListener(condition = IS_DELETE_ITEM_ORDER_CONDITION)
 	public void deleteItem(CommandCreatedEvent event) {
 		var command = event.getSource();
@@ -129,16 +150,31 @@ class VorgangAttachedItemEventListener {
 		}
 	}
 
+	@EventListener(condition = IS_CREATE_ITEM_ORDER_CONDITION)
+	public void onRevokeCreateItem(RevokeCommandEvent event) {
+		service.revokeCreate(event.getSource());
+	}
+
 	@EventListener(condition = IS_DELETE_ITEM_ORDER_CONDITION)
 	public void onRevokeDeleteItem(RevokeCommandEvent event) {
+		service.revokeDelete(event.getSource());
+	}
+
+	@EventListener(condition = IS_UPDATE_ITEM_ORDER_CONDITION)
+	public void onRevokeUpdateItem(RevokeCommandEvent event) {
 		var command = event.getSource();
-		try {
-			service.unmarkAsDeleteByIdAndVersion(command.getRelationId(), command.getRelationVersion());
-			publisher.publishEvent(new CommandRevokedEvent(command));
-		} catch (RuntimeException e) {
-			LOG.error("Revoke of delete item command failed", e);
-			publisher.publishEvent(new CommandRevokeFailedEvent(command.getId(), e.getMessage()));
-		}
+		var persistedCommand = getPersistedCommand(command.getId());
+		service.revokeUpdate(command, persistedCommand.getPreviousState());
 	}
 
+	@EventListener(condition = IS_PATCH_ITEM_ORDER_CONDITION)
+	public void onRevokePatchItem(RevokeCommandEvent event) {
+		var command = event.getSource();
+		var persistedCommand = getPersistedCommand(command.getId());
+		service.revokePatch(command, persistedCommand.getPreviousState());
+	}
+
+	private PersistedCommand getPersistedCommand(String commandId) {
+		return (PersistedCommand) commandService.getById(commandId);
+	}
 }
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapper.java
index b4ebb33584da5dd2745b959dbcee27d8a3fc3bdd..74edfabb0549cae70fba2d7443ba3d9ed3008c20 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapper.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapper.java
@@ -24,7 +24,6 @@
 package de.ozgcloud.vorgang.attached_item;
 
 import java.util.Map;
-import java.util.Optional;
 
 import org.apache.commons.collections.MapUtils;
 import org.mapstruct.Mapper;
@@ -41,25 +40,18 @@ public interface VorgangAttachedItemMapper {
 	public static final String PROPERTY_ITEM_NAME = "itemName";
 	public static final String PROPERTY_ITEM = "item";
 
-	@SuppressWarnings("unchecked")
 	default VorgangAttachedItem fill(Map<String, Object> propertyMap) {
-
 		return VorgangAttachedItem.builder()
-				.id(extractIdFromItem(propertyMap))
 				.client(MapUtils.getString(propertyMap, PROPERTY_CLIENT))
 				.vorgangId(MapUtils.getString(propertyMap, PROPERTY_VORGANG_ID))
 				.itemName(MapUtils.getString(propertyMap, PROPERTY_ITEM_NAME))
-				.item((Map<String, Object>) propertyMap.get(PROPERTY_ITEM))
+				.item(getPropertyItem(propertyMap))
 				.version(MapUtils.getLong(propertyMap, PROPERTY_VERSION, 0L))
 				.build();
 	}
 
-	// TODO remove mapping of id from Map
 	@SuppressWarnings("unchecked")
-	default String extractIdFromItem(Map<String, Object> propertyMap) {
-		return (String) Optional.ofNullable(propertyMap.get(PROPERTY_ID))
-				.orElseGet(() -> ((Map<String, Object>) propertyMap.get(PROPERTY_ITEM)).get(PROPERTY_ID));
-
+	default Map<String, Object> getPropertyItem(Map<String, Object> propertyMap) {
+		return (Map<String, Object>) propertyMap.get(PROPERTY_ITEM);
 	}
-
 }
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
index 2a6d887bac4dd22eae1201d9a1a28f9b64a20732..06aafc83380e42ac5d8ab5bdbd82ac5ff5f9914f 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
@@ -31,25 +31,28 @@ import java.util.stream.Stream;
 
 import jakarta.validation.Valid;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandRevokeFailedEvent;
+import de.ozgcloud.command.CommandRevokedEvent;
 import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
-@Service
+@Log4j2
 @Validated
+@RequiredArgsConstructor
+@Service
 public class VorgangAttachedItemService {
 
 	static final boolean NOT_DELETED = false;
 
-	@Autowired
-	private VorgangAttachedItemRepository repository;
-	@Autowired
-	private ApplicationEventPublisher publisher;
+	private final VorgangAttachedItemRepository repository;
+	private final ApplicationEventPublisher publisher;
 
 	public VorgangAttachedItem create(@NonNull String commandId, @Valid VorgangAttachedItem item) {
 		var saved = repository.save(prepareForCreation(item));
@@ -74,13 +77,21 @@ public class VorgangAttachedItemService {
 	}
 
 	public void update(String commandId, VorgangAttachedItem item) {
-		repository.update(item.getId(), item.getVersion(), item.getItem());
+		doUpdate(item.getId(), item.getVersion(), item.getItem());
 
 		publisher.publishEvent(new VorgangAttachedItemUpdatedEvent(commandId));
 	}
 
-	public void forceUpdate(String commandId, VorgangAttachedItem item) {
-		repository.forceUpdate(item.getId(), item.getItem());
+	public void revokeUpdate(Command command, Map<String, Object> itemMap) {
+		handleRevoke(command, () -> doUpdate(command.getRelationId(), command.getRelationVersion() + 1, itemMap));
+	}
+
+	void doUpdate(String id, long version, Map<String, Object> body) {
+		repository.update(id, version, body);
+	}
+
+	public void forceUpdate(String commandId, String itemId, Map<String, Object> itemMap) {
+		repository.forceUpdate(itemId, itemMap);
 
 		publisher.publishEvent(new VorgangAttachedItemUpdatedEvent(commandId));
 	}
@@ -115,11 +126,19 @@ public class VorgangAttachedItemService {
 	}
 
 	public void patch(Command command, Map<String, Object> body) {
-		repository.patch(command.getRelationId(), command.getRelationVersion(), body);
+		doPatch(command, command.getRelationVersion(), body);
 
 		publisher.publishEvent(new VorgangAttachedItemUpdatedEvent(command.getId()));
 	}
 
+	public void revokePatch(Command command, Map<String, Object> itemMap) {
+		handleRevoke(command, () -> doPatch(command, command.getRelationVersion() + 1, itemMap));
+	}
+
+	void doPatch(Command command, Long relationVersion, Map<String, Object> body) {
+		repository.patch(command.getRelationId(), relationVersion, body);
+	}
+
 	public VorgangAttachedItem getById(String id) {
 		var attachedItem = repository.findByIdAndDeleted(id, NOT_DELETED).orElseThrow(() -> new NotFoundException(VorgangAttachedItem.class, id));
 
@@ -136,12 +155,33 @@ public class VorgangAttachedItemService {
 		repository.updateDeleted(true, itemId, version);
 	}
 
-	public void unmarkAsDeleteByIdAndVersion(String itemId, long version) {
-		repository.updateDeleted(false, itemId, version);
-	}
-
 	public void deleteByVorgangId(String vorgangId) {
 		repository.deleteByVorgangId(vorgangId);
 	}
 
+	public void revokeCreate(Command command) {
+		handleRevoke(command, () -> delete(command.getRelationId(), command.getRelationVersion()));
+	}
+
+	void delete(String id, long version) {
+		repository.delete(id, version);
+	}
+
+	public void revokeDelete(Command command) {
+		handleRevoke(command, () -> unmarkAsDeleteByIdAndVersion(command.getRelationId(), command.getRelationVersion()));
+	}
+
+	void unmarkAsDeleteByIdAndVersion(String itemId, long version) {
+		repository.updateDeleted(false, itemId, version);
+	}
+
+	void handleRevoke(Command command, Runnable runnable) {
+		try {
+			runnable.run();
+			publisher.publishEvent(new CommandRevokedEvent(command));
+		} catch (RuntimeException e) {
+			LOG.error("Revoke item command failed(order: {})", command.getOrder(), e);
+			publisher.publishEvent(new CommandRevokeFailedEvent(command.getId(), e.getMessage()));
+		}
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
index ded88ec207ad812ab5ad43ad235a6208ee9331d5..799cf72d841c523ca1bbbd866ddeb4770789110d 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
@@ -68,8 +68,8 @@ class CommandRepository {
 	private static final String MONGODB_ASSIGNED_TO = "body.assignedTo";
 	private static final String MONGODB_CREATED_RESOURCE = "createdResource";
 	private static final String MONGODB_PARENT_ID = PersistedCommand.FIELD_BODY_OBJECT + "." + PersistedCommand.PROPERTY_PARENT_ID;
-	private static final String MONGODB_COMPLETE_IF_SUBS_COMPLETED =
-			PersistedCommand.FIELD_BODY_OBJECT + "." + PersistedCommand.PROPERTY_COMPLETE_IF_SUBS_COMPLETED;
+	private static final String MONGODB_COMPLETE_IF_SUBS_COMPLETED = PersistedCommand.FIELD_BODY_OBJECT + "."
+			+ PersistedCommand.PROPERTY_COMPLETE_IF_SUBS_COMPLETED;
 	private static final String MONGODB_CLASS = "_class";
 
 	@Autowired
@@ -129,7 +129,7 @@ class CommandRepository {
 				Command.class);
 	}
 
-	Optional<Command> getById(String commandId) {
+	Optional<Command> findById(String commandId) {
 		return Optional.ofNullable(mongoOperations.findById(commandId, Command.class));
 	}
 
@@ -268,8 +268,8 @@ class CommandRepository {
 		var switchOperation = Switch.switchCases(
 				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED),
 				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING),
-				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING)
-		).defaultTo("$status");
+				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING))
+				.defaultTo("$status");
 		return Aggregation.newUpdate(SetOperation.set(MONGODB_STATUS).toValue(switchOperation));
 	}
 
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
index d57cc5dbd90b796435c0609e2a6181962f033539..1be2e2f0f0c81071f5d1dc766f8cd4424c419e56 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
@@ -55,11 +55,9 @@ import de.ozgcloud.vorgang.callcontext.CurrentUserService;
 import de.ozgcloud.vorgang.callcontext.User;
 import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
 import lombok.NonNull;
-import lombok.extern.log4j.Log4j2;
 
 @Service
 @Validated
-@Log4j2
 public class CommandService {
 
 	@Autowired
@@ -117,7 +115,7 @@ public class CommandService {
 	}
 
 	public void setCommandFinished(String commandId, String createdResource) {
-		var command = getCommand(commandId);
+		var command = getById(commandId);
 		if (isRevokeCommand(command)) {
 			repository.setRevokeStatus(commandId);
 			publishRevokeCommandEvent(command);
@@ -146,7 +144,7 @@ public class CommandService {
 	}
 
 	public void publishCommandExecutedEvent(String commandId) {
-		findCommand(commandId).ifPresent(command -> publisher.publishEvent(new CommandExecutedEvent(command)));
+		findById(commandId).ifPresent(command -> publisher.publishEvent(new CommandExecutedEvent(command)));
 	}
 
 	public void setCommandError(String commandId, String errorMessage) {
@@ -223,19 +221,19 @@ public class CommandService {
 	}
 
 	Command getPendingCommand(String commandId) {
-		var command = getCommand(commandId);
+		var command = getById(commandId);
 		if (command.getStatus() != CommandStatus.PENDING) {
 			throw new TechnicalException("Cannot add sub commands to command '%s'. Parent command must have status PENDING".formatted(commandId));
 		}
 		return command;
 	}
 
-	public Command getCommand(String commandId) {
-		return findCommand(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId));
+	public Command getById(String commandId) {
+		return findById(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId));
 	}
 
-	public Optional<Command> findCommand(String commandId) {
-		return repository.getById(commandId);
+	public Optional<Command> findById(String commandId) {
+		return repository.findById(commandId);
 	}
 
 	Map<String, Object> buildSubCommandValues(CreateSubCommandsRequest request) {
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/GrpcCommandService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/GrpcCommandService.java
index cf9e95cf726b7dd2753af1cf31bf1604200054ea..2c766482361af3a881e54da567f32052195fa478 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/GrpcCommandService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/GrpcCommandService.java
@@ -118,7 +118,7 @@ public class GrpcCommandService extends CommandServiceImplBase {
 	}
 
 	Command getCommand(String commandId) {
-		return commandService.findCommand(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId));
+		return commandService.findById(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId));
 	}
 
 	private GrpcCommandResponse mapToGrpcResponse(Command response) {
@@ -172,7 +172,7 @@ public class GrpcCommandService extends CommandServiceImplBase {
 
 	@Override
 	public void setCommandExecuted(GrpcSetCommandExecutedRequest request, StreamObserver<GrpcEmpty> responseObserver) {
-		commandService.findCommand(request.getCommandId())
+		commandService.findById(request.getCommandId())
 				.map(command -> new CommandExecutedEvent(command, trimToNull(request.getCreatedResource())))
 				.ifPresentOrElse(publisher::publishEvent,
 						() -> LOG.warn("Command with ID '%s' not found. Cannot mark as executed.".formatted(request.getCommandId())));
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchEventListener.java
index 6575b816370c075ac0ce7ef8c5251fa095dd4920..c844c3f36cc550abab150590103780d6b28bdc84 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchEventListener.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchEventListener.java
@@ -74,7 +74,7 @@ public class SearchEventListener {
 	}
 
 	private void updateVorgangById(String commandId) {
-		commandService.findCommand(commandId).ifPresentOrElse(this::updateVorgang, () -> {
+		commandService.findById(commandId).ifPresentOrElse(this::updateVorgang, () -> {
 			throw new IllegalStateException(MessageFormat.format("Kein Command mit der ID {0} gefunden", commandId));
 		});
 	}
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/registry/ZufiRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/registry/ZufiRemoteService.java
index 3aa2a888cfbd90f119e22290567d807bc636659b..bc436dedd25d7bd9ee4ef1ad95f7cfffb1612e8b 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/registry/ZufiRemoteService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/registry/ZufiRemoteService.java
@@ -28,7 +28,7 @@ class ZufiRemoteService {
 	}
 
 	private GrpcVorgangManagerRegistrationRequest buildRequest(List<String> organistationsEinheitenIds, String address) {
-		return GrpcVorgangManagerRegistrationRequest.newBuilder().addAllOrganisationsEinheitenIds(organistationsEinheitenIds)
+		return GrpcVorgangManagerRegistrationRequest.newBuilder().addAllOrganisationsEinheitIds(organistationsEinheitenIds)
 				.setServiceAddress(address).build();
 	}
 }
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusEventListener.java
index 4596de8fd1ea0477bd122b1af94e571076ee48ac..5c7db826fa425ebafb747b911bc8d6afbd3d5e7f 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusEventListener.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusEventListener.java
@@ -120,7 +120,7 @@ class StatusEventListener {
 	Command setPreviousState(Command command) {
 		var vorgang = vorgangService.getById(command.getVorgangId());
 		commandService.setPreviousState(command.getId(), getPreviousStateMap(vorgang));
-		return commandService.findCommand(command.getId())
+		return commandService.findById(command.getId())
 				.orElseThrow(() -> new NoSuchElementException("No command with Id %s found".formatted(command.getId())));
 	}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
index 0926bd140fa344c6435b74befbda978e161dbf81..a85658f21505777e07cf1a862bbbcfdbdd83e3a5 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
@@ -26,6 +26,7 @@ package de.ozgcloud.bescheid;
 import static de.ozgcloud.bescheid.BescheidEventListener.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.awaitility.Awaitility.*;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.time.ZonedDateTime;
@@ -44,7 +45,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.SpyBean;
-import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
@@ -59,7 +59,6 @@ import de.ozgcloud.apilib.user.OzgCloudUserProfile;
 import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
 import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEvent;
 import de.ozgcloud.command.CommandStatus;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
@@ -100,8 +99,6 @@ class BescheidITCase {
 
 	@Autowired
 	private CommandService commandService;
-	@Autowired
-	private ApplicationEventPublisher eventPublisher;
 	@SpyBean
 	private TestEventListener bescheiTestEventListener;
 
@@ -195,14 +192,21 @@ class BescheidITCase {
 		@Captor
 		private ArgumentCaptor<StatusChangedEvent> statusChangedEventCaptor;
 
+		private VorgangAttachedItem bescheidItem;;
+		private String vorgangId;
+
+		@BeforeEach
+		void mock() {
+			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
+			bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
+		}
+
 		@Test
 		void shouldSetBescheidStatusToSent() {
-			var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
-			var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
-
-			eventPublisher.publishEvent(buildCommandCreatedEvent(vorgangId, bescheidItem));
+			commandService.createCommand(buildCreateCommandRequest());
 
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(loadBescheid(bescheidItem.getId()).getVersion()).isEqualTo(2);
 				verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
 				assertThat(loadBescheid(bescheidItem.getId()).getItem()).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name());
 			});
@@ -210,13 +214,10 @@ class BescheidITCase {
 
 		@Test
 		void shouldSetVorgangStatusToBeschieden() {
-			var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
-			var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
-			var event = buildCommandCreatedEvent(vorgangId, bescheidItem);
-
-			eventPublisher.publishEvent(event);
+			commandService.createCommand(buildCreateCommandRequest());
 
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(loadBescheid(bescheidItem.getId()).getVersion()).isEqualTo(2);
 				verify(bescheiTestEventListener).onBescheidStatusChangedEvent(statusChangedEventCaptor.capture());
 				assertThat(loadVorgang(vorgangId).getStatus()).isEqualTo(Vorgang.Status.BESCHIEDEN);
 			});
@@ -235,8 +236,8 @@ class BescheidITCase {
 					.build();
 		}
 
-		private CommandCreatedEvent buildCommandCreatedEvent(String vorgangId, VorgangAttachedItem bescheidItem) {
-			var createCommandRequest = CreateCommandRequest.builder()
+		private CreateCommandRequest buildCreateCommandRequest() {
+			return CreateCommandRequest.builder()
 					.vorgangId(vorgangId)
 					.relationId(bescheidItem.getId())
 					.relationVersion(bescheidItem.getVersion())
@@ -244,7 +245,6 @@ class BescheidITCase {
 					.bodyObject(Map.of(BESCHEID_VOM_BODY_KEY, "2024-01-01",
 							GENEHMIGT_BODY_KEY, true))
 					.build();
-			return new CommandCreatedEvent(commandService.createCommand(createCommandRequest));
 		}
 
 		private VorgangAttachedItem loadBescheid(String bescheidId) {
@@ -312,7 +312,7 @@ class BescheidITCase {
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
 				verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
 				var sentInfoMap = MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO);
-				assertThat(sentInfoMap.get(Bescheid.FIELD_SENT_BY)).asString().isNotBlank();
+				assertThat(MapUtils.getString(sentInfoMap, Bescheid.FIELD_SENT_BY)).isNotBlank();
 			});
 		}
 
@@ -339,6 +339,7 @@ class BescheidITCase {
 			});
 		}
 
+		@DirtiesContext
 		@Test
 		void shouldSendPostfachNachricht() {
 			var expectedPostfachAddress = PostfachAddressTestFactory.createBuilder()
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
index 502e0829ebbc47f6cd630cd9030ee7222acc3b00..516b1ea807fd936a7d7c91b034f8bba505c02017 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
@@ -75,7 +75,7 @@ class PostfachEventListenerITCase {
 
 		@BeforeEach
 		void initServices() {
-			when(commandService.findCommand(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 		}
 
 		@Test
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java
index 2688640366bfcfc09504f2db123a0dfba3fa12dc..495d3665e76fb0e5badd9cceaadb0e6b8a99dd18 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/processor/ProcessorITCase.java
@@ -79,7 +79,7 @@ class ProcessorITCase {
 		var commandBuilder = PersistedCommand.builder().id("42").status(CommandStatus.PENDING).createdAt(ZonedDateTime.now());
 
 		when(commandService.createCommand(any())).thenReturn(commandBuilder.build());
-		when(commandService.findCommand("42"))
+		when(commandService.findById("42"))
 				.thenReturn(Optional.of(commandBuilder.status(CommandStatus.FINISHED).finishedAt(ZonedDateTime.now()).build()));
 	}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java
index 248ebc6edb9c5dcc677b60457a71151448a67089..1ef45402d363fe6e8a0a695dd349c88383f31773 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerITCase.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.*;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +38,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.SpyBean;
 import org.springframework.context.ApplicationEventPublisher;
 
+import de.ozgcloud.command.Command;
 import de.ozgcloud.command.RevokeCommandEvent;
 import de.ozgcloud.common.test.ITCase;
 import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory;
@@ -64,6 +66,12 @@ class VorgangAttachedItemEventListenerITCase {
 
 	@Nested
 	class TestOnCreateItemCommand {
+
+		@BeforeEach
+		void mock() {
+			when(service.create(any(), any())).thenReturn(VorgangAttachedItemTestFactory.create());
+		}
+
 		@Test
 		void shouldCallListener() {
 			var command = CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name()).relationId(VorgangTestFactory.ID)
@@ -78,6 +86,12 @@ class VorgangAttachedItemEventListenerITCase {
 
 	@Nested
 	class TestOnUpdateItemCommand {
+
+		@BeforeEach
+		void mock() {
+			when(service.getById(any())).thenReturn(VorgangAttachedItemTestFactory.create());
+		}
+
 		@Test
 		void shouldCallListener() {
 			var command = CommandTestFactory.createBuilder().order(Order.UPDATE_ATTACHED_ITEM.name())
@@ -92,7 +106,14 @@ class VorgangAttachedItemEventListenerITCase {
 
 	@Nested
 	class TestOnPatchItemCommand {
-		private Map<String, Object> bodyMap = Map.of("id", VorgangAttachedItemTestFactory.ID, "item", Map.of("done", true));
+
+		private final Map<String, Object> bodyMap = Map.of(VorgangAttachedItem.FIELDNAME_ID, VorgangAttachedItemTestFactory.ID,
+				VorgangAttachedItem.FIELDNAME_ITEM, Map.of("done", true));
+
+		@BeforeEach
+		void mock() {
+			when(service.getById(any())).thenReturn(VorgangAttachedItemTestFactory.create());
+		}
 
 		@Test
 		void shouldCallListener() {
@@ -134,17 +155,13 @@ class VorgangAttachedItemEventListenerITCase {
 	@Nested
 	class TestOnRevokeDeleteItem {
 
+		private final Command command = CommandTestFactory.createBuilder().order(Order.DELETE_ATTACHED_ITEM.name()).build();
+
 		@Test
 		void shouldCallUnmarkAsDeleted() {
-			var command = CommandTestFactory.createBuilder().order(Order.DELETE_ATTACHED_ITEM.name()).build();
-			var event = new RevokeCommandEvent(command);
+			publisher.publishEvent(new RevokeCommandEvent(command));
 
-			publisher.publishEvent(event);
-
-			await().atMost(5, TimeUnit.SECONDS).untilAsserted(
-					() -> verify(service).unmarkAsDeleteByIdAndVersion(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION));
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> verify(service).revokeDelete(command));
 		}
-
 	}
-
-}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java
index 7b83059e27150e6459fb4f4a08d72e672fd7dc5b..ff6d202f4ecc7f06568d57f6405ca0e18852d7a3 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemEventListenerTest.java
@@ -27,11 +27,14 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import jakarta.validation.ValidationException;
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -44,9 +47,9 @@ import org.mockito.Spy;
 import org.springframework.context.ApplicationEventPublisher;
 
 import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandRevokeFailedEvent;
 import de.ozgcloud.command.RevokeCommandEvent;
 import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory;
+import de.ozgcloud.vorgang.command.CommandService;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
 import de.ozgcloud.vorgang.vorgang.VorgangDeletedEventTestFactory;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
@@ -61,9 +64,12 @@ class VorgangAttachedItemEventListenerTest {
 	private VorgangAttachedItemService service;
 	@Mock
 	private ApplicationEventPublisher publisher;
+	@Mock
+	private CommandService commandService;
 	@Spy
 	private VorgangAttachedItemMapper mapper = Mappers.getMapper(VorgangAttachedItemMapper.class);
 
+	@DisplayName("Create item")
 	@Nested
 	class TestCreateItem {
 
@@ -73,14 +79,12 @@ class VorgangAttachedItemEventListenerTest {
 
 		@Captor
 		private ArgumentCaptor<VorgangAttachedItem> itemCaptor;
+		@Captor
+		private ArgumentCaptor<VorgangAttachedItemCreatedEvent> vorgangAttachedItemCreatedEventCaptor;
 
-		@Test
-		void shouldThrowExceptionOnIdDismatching() {
-			var command = CommandTestFactory.createBuilder().vorgangId("other").build();
-			var event = CommandCreatedEventTestFactory.create(command);
-
-			assertThatThrownBy(() -> listener.createItem(event)).isInstanceOf(ValidationException.class);
-
+		@BeforeEach
+		void mock() {
+			when(service.create(any(), any())).thenReturn(VorgangAttachedItemTestFactory.create());
 		}
 
 		@DisplayName("should call service")
@@ -91,7 +95,7 @@ class VorgangAttachedItemEventListenerTest {
 			void withItem() {
 				listener.createItem(CommandCreatedEventTestFactory.create(command));
 
-				verify(service).create(anyString(), itemCaptor.capture());
+				verify(service).create(eq(CommandTestFactory.ID), itemCaptor.capture());
 				assertThat(itemCaptor.getValue()).usingRecursiveComparison()
 						.ignoringFields(VorgangAttachedItem.FIELDNAME_ID, VorgangAttachedItem.FIELDNAME_VERSION)
 						.isEqualTo(VorgangAttachedItemTestFactory.create());
@@ -101,7 +105,7 @@ class VorgangAttachedItemEventListenerTest {
 			void withIdAndVersionAsNull() {
 				listener.createItem(CommandCreatedEventTestFactory.create(command));
 
-				verify(service).create(anyString(), itemCaptor.capture());
+				verify(service).create(eq(CommandTestFactory.ID), itemCaptor.capture());
 				var item = itemCaptor.getValue();
 
 				assertThat(item.getId()).isNull();
@@ -112,12 +116,24 @@ class VorgangAttachedItemEventListenerTest {
 			void withCommandId() {
 				listener.createItem(CommandCreatedEventTestFactory.create(command));
 
-				verify(service).create(eq(CommandTestFactory.ID), any());
+				verify(service).create(any(), any());
 			}
+		}
+	}
 
+	@DisplayName("Validate create command")
+	@Nested
+	class TestValidateCreateCommand {
+
+		@Test
+		void shouldThrowExceptionOnIdMismatching() {
+			var command = CommandTestFactory.createBuilder().vorgangId("other").build();
+
+			assertThatThrownBy(() -> listener.validateCreateCommand(command)).isInstanceOf(ValidationException.class);
 		}
 	}
 
+	@DisplayName("Update item")
 	@Nested
 	class TestUpdateItem {
 		private Map<String, Object> bodyMap = VorgangAttachedItemTestFactory.asMap();
@@ -126,23 +142,47 @@ class VorgangAttachedItemEventListenerTest {
 
 		@Captor
 		private ArgumentCaptor<VorgangAttachedItem> itemCaptor;
+		@Captor
+		private ArgumentCaptor<Map<String, Object>> itemMapCaptor;
+		@Captor
+		private ArgumentCaptor<VorgangAttachedItemUpdatedEvent> eventCaptor;
+
+		@BeforeEach
+		void mock() {
+			doReturn(VorgangAttachedItemTestFactory.create()).when(listener).getVorgangAttachedItem(any());
+		}
+
+		@Test
+		void shouldGetVorgangAttachedItem() {
+			doUpdateItem();
+
+			verify(listener).getVorgangAttachedItem(VorgangAttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallSetCommandPreviousState() {
+			doUpdateItem();
+
+			verify(listener).setCommandPreviousState(CommandTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
+		}
 
 		@DisplayName("service Call")
 		@Nested
 		class TestCallService {
+
 			@Test
 			void shouldHaveItem() {
-				listener.updateItem(CommandCreatedEventTestFactory.create(command));
+				doUpdateItem();
 
-				verify(service).update(anyString(), itemCaptor.capture());
+				verify(service).update(eq(CommandTestFactory.ID), itemCaptor.capture());
 				assertThat(itemCaptor.getValue()).usingRecursiveComparison().isEqualTo(VorgangAttachedItemTestFactory.create());
 			}
 
 			@Test
 			void shouldHaveCommand() {
-				listener.updateItem(CommandCreatedEventTestFactory.create(command));
+				doUpdateItem();
 
-				verify(service).update(eq(CommandTestFactory.ID), any());
+				verify(service).update(any(), any());
 			}
 
 			@Test
@@ -152,22 +192,92 @@ class VorgangAttachedItemEventListenerTest {
 
 				listener.updateItem(CommandCreatedEventTestFactory.create(buildCommand(bMap)));
 
-				verify(service).update(anyString(), itemCaptor.capture());
+				verify(service).update(eq(CommandTestFactory.ID), itemCaptor.capture());
 				assertThat(itemCaptor.getValue().getId()).isEqualTo(VorgangAttachedItemTestFactory.ID);
 			}
 		}
 
+		private void doUpdateItem() {
+			listener.updateItem(CommandCreatedEventTestFactory.create(command));
+		}
+
 		private Command buildCommand(Map<String, Object> bodyMap) {
 			return CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID)
 					.relationVersion(VorgangAttachedItemTestFactory.VERSION).bodyObject(bodyMap).build();
 		}
 	}
 
+	@DisplayName("Get vorgangAttachedItem")
+	@Nested
+	class TestGetVorgangAttachedItem {
+
+		@BeforeEach
+		void mock() {
+			when(service.getById(any())).thenReturn(VorgangAttachedItemTestFactory.create());
+		}
+
+		@Test
+		void shouldCallService() {
+			listener.getVorgangAttachedItem(VorgangAttachedItemTestFactory.ID);
+
+			verify(service).getById(VorgangAttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var item = listener.getVorgangAttachedItem(VorgangAttachedItemTestFactory.ID);
+
+			assertThat(item).usingRecursiveComparison().isEqualTo(VorgangAttachedItemTestFactory.create());
+		}
+	}
+
+	@DisplayName("Set command previous state")
+	@Nested
+	class TestSetCommandPreviousState {
+
+		@Test
+		void shouldCallCommandService() {
+			listener.setCommandPreviousState(CommandTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
+
+			verify(commandService).setPreviousState(CommandTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
+		}
+	}
+
+	@DisplayName("Patch item")
 	@Nested
 	class TestPatchItem {
-		private Map<String, Object> bodyMap = Map.of("id", VorgangAttachedItemTestFactory.ID, "item", Map.of("number", "73"));
 
-		private Command command = buildCommand(bodyMap);
+		@Captor
+		private ArgumentCaptor<VorgangAttachedItemUpdatedEvent> eventCaptor;
+
+		private Map<String, Object> itemMap = Map.of("number", "73");
+		private Set<String> itemKeys = Set.of("number");
+		private Map<String, Object> bodyMap = Map.of("id", VorgangAttachedItemTestFactory.ID, VorgangAttachedItem.FIELDNAME_ITEM,
+				itemMap);
+
+		private Command command = CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID)
+				.relationVersion(VorgangAttachedItemTestFactory.VERSION).bodyObject(bodyMap).build();
+
+		private Map<String, Object> patchMap = Collections.emptyMap();
+
+		@BeforeEach
+		void mock() {
+			doReturn(patchMap).when(listener).getExistingItemMapEntries(any(), any());
+		}
+
+		@Test
+		void shouldBuildPatchMap() {
+			doPatchItem();
+
+			verify(listener).getExistingItemMapEntries(CommandTestFactory.RELATION_ID, itemKeys);
+		}
+
+		@Test
+		void shouldCallSetCommandPreviousState() {
+			doPatchItem();
+
+			verify(listener).setCommandPreviousState(CommandTestFactory.ID, patchMap);
+		}
 
 		@DisplayName("service Call")
 		@Nested
@@ -175,22 +285,66 @@ class VorgangAttachedItemEventListenerTest {
 			@SuppressWarnings("unchecked")
 			@Test
 			void shouldHaveItem() {
-				listener.patchItem(CommandCreatedEventTestFactory.create(command));
+				doPatchItem();
 
-				verify(service).patch(any(), (Map<String, Object>) eq(bodyMap.get("item")));
+				verify(service).patch(any(), (Map<String, Object>) eq(bodyMap.get(VorgangAttachedItem.FIELDNAME_ITEM)));
 			}
 
 			@Test
 			void shouldHaveCommand() {
-				listener.patchItem(CommandCreatedEventTestFactory.create(command));
+				doPatchItem();
 
 				verify(service).patch(eq(command), any());
 			}
 		}
 
-		private Command buildCommand(Map<String, Object> bodyMap) {
-			return CommandTestFactory.createBuilder().relationId(VorgangAttachedItemTestFactory.ID)
-					.relationVersion(VorgangAttachedItemTestFactory.VERSION).bodyObject(bodyMap).build();
+		private void doPatchItem() {
+			listener.patchItem(CommandCreatedEventTestFactory.create(command));
+		}
+	}
+
+	@DisplayName("Build patch map")
+	@Nested
+	class TestBuildPatchMap {
+
+		private final Set<String> commandPatchKeySet = Set.of("KeyToPatch", "KeyWithNullValueToPatch");
+		private final Map<String, Object> itemMap = buildItemMap();
+
+		private Map<String, Object> buildItemMap() {
+			var itemMap = new HashMap<String, Object>();
+			itemMap.put("KeyToPatch", "ValueToPatch");
+			itemMap.put("KeyToIgnore", "ValueToIgnore");
+			itemMap.put("KeyWithNullValueToPatch", null);
+			return itemMap;
+		}
+
+		private final VorgangAttachedItem vorgangAttachedItem = VorgangAttachedItemTestFactory.createBuilder().item(itemMap).build();
+
+		@BeforeEach
+		void mock() {
+			when(service.getById(any())).thenReturn(vorgangAttachedItem);
+		}
+
+		@Test
+		void shouldCallGetVorgangAttachedItem() {
+			listener.getExistingItemMapEntries(VorgangAttachedItemTestFactory.ID, commandPatchKeySet);
+
+			verify(service).getById(VorgangAttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnMapWithPatchEntry() {
+			var patchMap = listener.getExistingItemMapEntries(VorgangAttachedItemTestFactory.ID, commandPatchKeySet);
+
+			assertThat(patchMap).hasSize(2).containsEntry("KeyToPatch", "ValueToPatch");
+		}
+
+		@Test
+		void shouldReturnMapWithNullPatchEntry() {
+			var patchMap = listener.getExistingItemMapEntries(VorgangAttachedItemTestFactory.ID, commandPatchKeySet);
+
+			assertThat(patchMap).hasSize(2).containsKey("KeyWithNullValueToPatch");
+			assertThat(patchMap.get("KeyWithNullValueToPatch")).isNull();
 		}
 	}
 
@@ -242,27 +396,87 @@ class VorgangAttachedItemEventListenerTest {
 		}
 	}
 
+	@DisplayName("On revoke create item")
 	@Nested
-	class TestRevokeCommand {
+	class TestOnRevokeCreateItem {
 
-		@Nested
-		class TestDeleteItem {
+		private final Command command = CommandTestFactory.create();
+		private final RevokeCommandEvent revokeEvent = new RevokeCommandEvent(command);
 
-			@Test
-			void shouldCallService() {
-				listener.onRevokeDeleteItem(new RevokeCommandEvent(CommandTestFactory.createBuilder().build()));
+		@Test
+		void shouldCallService() {
+			listener.onRevokeCreateItem(revokeEvent);
 
-				verify(service).unmarkAsDeleteByIdAndVersion(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION);
-			}
+			verify(service).revokeCreate(command);
+		}
+	}
 
-			@Test
-			void shouldCallHandleException() {
-				doThrow(new RuntimeException()).when(service).unmarkAsDeleteByIdAndVersion(anyString(), anyLong());
+	@DisplayName("On revoke delete item")
+	@Nested
+	class TestOnRevokeDeleteItem {
 
-				listener.onRevokeDeleteItem(new RevokeCommandEvent(CommandTestFactory.createBuilder().build()));
+		private final Command command = CommandTestFactory.create();
+		private final RevokeCommandEvent revokeEvent = new RevokeCommandEvent(command);
 
-				verify(publisher).publishEvent(any(CommandRevokeFailedEvent.class));
-			}
+		@Test
+		void shouldCallService() {
+			listener.onRevokeDeleteItem(revokeEvent);
+
+			verify(service).revokeDelete(command);
+		}
+	}
+
+	@DisplayName("On revoke update item")
+	@Nested
+	class TestOnRevokeUpdateItem {
+
+		private final Command command = CommandTestFactory.create();
+		private final RevokeCommandEvent revokeEvent = new RevokeCommandEvent(command);
+
+		@BeforeEach
+		void mock() {
+			when(commandService.getById(any())).thenReturn(command);
+		}
+
+		@Test
+		void shouldGetCommand() {
+			listener.onRevokeUpdateItem(revokeEvent);
+
+			verify(commandService).getById(CommandTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallService() {
+			listener.onRevokeUpdateItem(revokeEvent);
+
+			verify(service).revokeUpdate(command, CommandTestFactory.PREVIOUS_STATE);
+		}
+	}
+
+	@DisplayName("On revoke patch item")
+	@Nested
+	class TestOnRevokePatchItem {
+
+		private final Command command = CommandTestFactory.create();
+		private final RevokeCommandEvent revokeEvent = new RevokeCommandEvent(command);
+
+		@BeforeEach
+		void mock() {
+			when(commandService.getById(any())).thenReturn(CommandTestFactory.create());
+		}
+
+		@Test
+		void shouldGetCommand() {
+			listener.onRevokePatchItem(revokeEvent);
+
+			verify(commandService).getById(CommandTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallService() {
+			listener.onRevokePatchItem(revokeEvent);
+
+			verify(service).revokePatch(command, CommandTestFactory.PREVIOUS_STATE);
 		}
 	}
-}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
index 2612de99af4c87b621fdbd554082ffe1f0fd6ae8..cfaf9ff74c00daa0d1405a656fb898ce181a0256 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
@@ -29,6 +29,8 @@ import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
@@ -45,14 +47,17 @@ import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.security.access.AccessDeniedException;
 
-import de.ozgcloud.command.CommandCreatedEvent;
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandStatus;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory;
 import de.ozgcloud.vorgang.callcontext.CurrentUserService;
 import de.ozgcloud.vorgang.command.CommandService;
+import de.ozgcloud.vorgang.command.CommandTestFactory;
 import de.ozgcloud.vorgang.command.CreateCommandRequest;
 import de.ozgcloud.vorgang.command.CreateCommandRequestTestFactory;
 import de.ozgcloud.vorgang.command.Order;
+import de.ozgcloud.vorgang.command.RevokeCommandEventTestFactory;
 import de.ozgcloud.vorgang.vorgang.Vorgang;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory;
@@ -78,7 +83,9 @@ class VorgangAttachedItemITCase {
 
 	@BeforeEach
 	void prepareDatabase() {
+		mongoOperations.dropCollection(Vorgang.COLLECTION_NAME);
 		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+		mongoOperations.dropCollection(Command.COLLECTION_NAME);
 	}
 
 	@DisplayName("Create item")
@@ -112,7 +119,6 @@ class VorgangAttachedItemITCase {
 	class TestUpdateItem {
 
 		private CreateCommandRequest createCommandRequest;
-		private CommandCreatedEvent event;
 
 		private VorgangAttachedItem persistedItem;
 
@@ -261,4 +267,221 @@ class VorgangAttachedItemITCase {
 			return responseCaptor.getValue();
 		}
 	}
+
+	@DisplayName("Revoke create item")
+	@Nested
+	class TestRevokeCreateItem {
+
+		private VorgangAttachedItem persistedItem;
+
+		@BeforeEach
+		void mock() {
+			persistedItem = mongoOperations.save(VorgangAttachedItemTestFactory.createBuilder().id(null).version(0).build());
+		}
+
+		@Test
+		void shouldDeleteVorgangAttachedItem() {
+			publisher.publishEvent(RevokeCommandEventTestFactory.create(createRevokeCommand()));
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> assertThat(findVorgangAttachedItems()).isEmpty());
+		}
+
+		private Command createRevokeCommand() {
+			return CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name())
+					.relationId(persistedItem.getId())
+					.relationVersion(persistedItem.getVersion())
+					.bodyObject(VorgangAttachedItemTestFactory.asMap()).build();
+		}
+	}
+
+	@DisplayName("Revoke update item")
+	@Nested
+	class TestRevokeUpdateItem {
+
+		private final Map<String, Object> createItem = Map.<String, Object>of("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue",
+				VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
+		private VorgangAttachedItem persistedItem;
+
+		private final Map<String, Object> updateItem = Map.<String, Object>of(
+				VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "RevertByRevokeValue",
+				"NewToRemoveByRevokeKey", "NewToRemoveByRevokeValue");
+		private Command updatedCommand;
+		private String vorgangId;
+
+		@BeforeEach
+		void mock() {
+			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build()).getId();
+			createVorgangAttachedItem();
+
+			persistedItem = findVorgangAttachedItems().get(0);
+
+			updateVorgangAttchedItem();
+		}
+
+		private void createVorgangAttachedItem() {
+			commandService.createCommand(createAttachedItemCommandRequest());
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(findCommands()).hasSize(1);
+				var vorgangAttachedItems = findVorgangAttachedItems();
+				assertThat(vorgangAttachedItems).hasSize(1);
+				assertThat(vorgangAttachedItems.get(0).getVersion()).isEqualTo(1);
+				assertThat(vorgangAttachedItems.get(0).getItem()).isEqualTo(createItem);
+			});
+		}
+
+		private CreateCommandRequest createAttachedItemCommandRequest() {
+			return CreateCommandRequestTestFactory.createBuilder()
+					.order(Order.CREATE_ATTACHED_ITEM.name())
+					.vorgangId(vorgangId)
+					.relationId(vorgangId)
+					.relationVersion(0L)
+					.bodyObject(createCreateCommandBodyObject(0L, createItem))
+					.build();
+		}
+
+		private void updateVorgangAttchedItem() {
+			updatedCommand = commandService.createCommand(createUpdateCommandRequest());
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(findCommands()).hasSize(2);
+				assertThat(findVorgangAttachedItems()).hasSize(1);
+				assertThat(findVorgangAttachedItems().get(0).getVersion()).isEqualTo(2);
+				assertThat(findVorgangAttachedItems().get(0).getItem()).isEqualTo(updateItem);
+			});
+		}
+
+		private CreateCommandRequest createUpdateCommandRequest() {
+			return CreateCommandRequestTestFactory.createBuilder()
+					.order(Order.UPDATE_ATTACHED_ITEM.name())
+					.vorgangId(vorgangId)
+					.relationId(persistedItem.getId())
+					.relationVersion(persistedItem.getVersion())
+					.bodyObject(createCreateCommandBodyObject(1L, updateItem))
+					.build();
+		}
+
+		private Map<String, Object> createCreateCommandBodyObject(Long relationVersion, Map<String, Object> bodyMap) {
+			var bodyObjectMap = new HashMap<>(VorgangAttachedItemTestFactory.asMap());
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_ITEM, new HashMap<>(bodyMap));
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_VORGANG_ID, vorgangId);
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_VERSION, relationVersion);
+			return bodyObjectMap;
+		}
+
+		@Test
+		void shouldRestoreItemValues() {
+			commandService.revokeCommand(updatedCommand.getId());
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				var vorgangAttachedItem = findVorgangAttachedItems().get(0);
+				assertThat(findVorgangAttachedItems()).hasSize(1);
+				assertThat(vorgangAttachedItem.getVersion()).isEqualTo(3);
+				var updateCommand = mongoOperations.findById(updatedCommand.getId(), Command.class);
+				assertThat(updateCommand.getStatus()).isEqualTo(CommandStatus.REVOKED);
+				assertThat(vorgangAttachedItem.getItem()).containsEntry("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue");
+				assertThat(vorgangAttachedItem.getItem()).containsEntry(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
+						VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
+				assertThat(vorgangAttachedItem.getItem()).doesNotContainKey("NewToRemoveByRevokeKey");
+			});
+		}
+	}
+
+	@DisplayName("Revoke patch item")
+	@Nested
+	class TestRevokePatchItem {
+
+		private final Map<String, Object> createItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
+				VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
+		private VorgangAttachedItem persistedItem;
+
+		private final Map<String, Object> patchItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue");
+		private Command patchedCommand;
+		private String vorgangId;
+
+		@BeforeEach
+		void mock() {
+			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build()).getId();
+			createVorgangAttachedItem();
+
+			persistedItem = findVorgangAttachedItems().get(0);
+
+			patchVorgangAttchedItem();
+		}
+
+		private void createVorgangAttachedItem() {
+			commandService.createCommand(createAttachedItemCommandRequest());
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(findCommands()).hasSize(1);
+				var vorgangAttachedItems = findVorgangAttachedItems();
+				assertThat(vorgangAttachedItems).hasSize(1);
+				assertThat(vorgangAttachedItems.get(0).getVersion()).isEqualTo(1);
+				assertThat(vorgangAttachedItems.get(0).getItem()).containsEntry(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
+						VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
+			});
+		}
+
+		private CreateCommandRequest createAttachedItemCommandRequest() {
+			return CreateCommandRequestTestFactory.createBuilder()
+					.order(Order.CREATE_ATTACHED_ITEM.name())
+					.vorgangId(vorgangId)
+					.relationId(vorgangId)
+					.relationVersion(0L)
+					.bodyObject(createCreateCommandBodyObject(0L, createItem))
+					.build();
+		}
+
+		private void patchVorgangAttchedItem() {
+			patchedCommand = commandService.createCommand(createPatchCommandRequest());
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				assertThat(findCommands()).hasSize(2);
+				var vorgangAttachedItems = findVorgangAttachedItems();
+				assertThat(vorgangAttachedItems).hasSize(1);
+				assertThat(vorgangAttachedItems.get(0).getVersion()).isEqualTo(2);
+				assertThat(vorgangAttachedItems.get(0).getItem()).containsEntry(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue");
+			});
+		}
+
+		private CreateCommandRequest createPatchCommandRequest() {
+			return CreateCommandRequestTestFactory.createBuilder()
+					.order(Order.PATCH_ATTACHED_ITEM.name())
+					.vorgangId(vorgangId)
+					.relationId(persistedItem.getId())
+					.relationVersion(persistedItem.getVersion())
+					.bodyObject(createCreateCommandBodyObject(1L, patchItem))
+					.build();
+		}
+
+		private Map<String, Object> createCreateCommandBodyObject(Long relationVersion, Map<String, Object> bodyMap) {
+			var bodyObjectMap = new HashMap<>(VorgangAttachedItemTestFactory.asMap());
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_ITEM, new HashMap<>(bodyMap));
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_VORGANG_ID, vorgangId);
+			bodyObjectMap.put(VorgangAttachedItem.FIELDNAME_VERSION, relationVersion);
+			return bodyObjectMap;
+		}
+
+		@Test
+		void shouldRestoreItemValues() {
+			commandService.revokeCommand(patchedCommand.getId());
+
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				var updateCommand = mongoOperations.findById(patchedCommand.getId(), Command.class);
+				assertThat(updateCommand.getStatus()).isEqualTo(CommandStatus.REVOKED);
+				assertThat(findVorgangAttachedItems()).hasSize(1);
+				var vorgangAttachedItem = findVorgangAttachedItems().get(0);
+				assertThat(vorgangAttachedItem.getVersion()).isEqualTo(3);
+				assertThat(findVorgangAttachedItems().get(0).getItem()).containsEntry(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
+						VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
+			});
+		}
+	}
+
+	private List<VorgangAttachedItem> findVorgangAttachedItems() {
+		return mongoOperations.findAll(VorgangAttachedItem.class);
+	}
+
+	private List<Command> findCommands() {
+		return mongoOperations.findAll(Command.class);
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapperTest.java
index 93c89a4951f318bff83ecea305ef89a26a2f74f7..db159bbd05feb088276177df9becc3ab69dca57a 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapperTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemMapperTest.java
@@ -40,7 +40,7 @@ class VorgangAttachedItemMapperTest {
 	void shouldBeFilled() {
 		var item = mapper.fill(itemAsMap);
 
-		assertThat(item).usingRecursiveComparison().isEqualTo(VorgangAttachedItemTestFactory.create());
+		assertThat(item).usingRecursiveComparison().ignoringFields(VorgangAttachedItem.FIELDNAME_ID)
+				.isEqualTo(VorgangAttachedItemTestFactory.create());
 	}
-
-}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemRepositoryITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemRepositoryITCase.java
index f9c325212a072878c07fa8e88769812d229fa510..8292b3c695855fa04b2e12cfc06e7cae04b2ca6f 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemRepositoryITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemRepositoryITCase.java
@@ -260,12 +260,11 @@ class VorgangAttachedItemRepositoryITCase {
 		}
 
 		@Test
-		void shouldNotUpdateOnWrongVersion() {
-			repository.patch(persistedItem.getId(), 42, UPDATE_ITEM_MAP);
-
-			var loaded = findVorgangAttachedItem();
+		void shouldThrowExceptionWhenVersionMismatch() {
+			mongoOperations.save(persistedItem);
 
-			assertThat(loaded).usingRecursiveComparison().isEqualTo(persistedItem);
+			var itemId = persistedItem.getId();
+			assertThrows(ConcurrentModificationException.class, () -> repository.patch(itemId, 42, UPDATE_ITEM_MAP));
 		}
 
 		@Test
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceITCase.java
index eccdc065fd841e0119aa7074808c44d9aa23655c..6bafdceabe71af6f52b99993f7a89d309f612924 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceITCase.java
@@ -2,6 +2,8 @@ package de.ozgcloud.vorgang.attached_item;
 
 import static org.assertj.core.api.Assertions.*;
 
+import jakarta.validation.ConstraintViolationException;
+
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -11,7 +13,6 @@ import org.springframework.context.ApplicationEventPublisher;
 
 import de.ozgcloud.common.test.ITCase;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
-import jakarta.validation.ConstraintViolationException;
 
 @ITCase
 class VorgangAttachedItemServiceITCase {
@@ -30,25 +31,21 @@ class VorgangAttachedItemServiceITCase {
 		void shouldDenyMissingClientName() {
 			var item = VorgangAttachedItemTestFactory.createBuilder().client(StringUtils.EMPTY).build();
 
-			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item))
-					.isInstanceOf(ConstraintViolationException.class);
+			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item)).isInstanceOf(ConstraintViolationException.class);
 		}
 
 		@Test
 		void shouldDenyMissingVorgangId() {
 			var item = VorgangAttachedItemTestFactory.createBuilder().vorgangId(StringUtils.EMPTY).build();
 
-			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item))
-					.isInstanceOf(ConstraintViolationException.class);
+			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item)).isInstanceOf(ConstraintViolationException.class);
 		}
 
 		@Test
 		void shouldDenyMissingItemName() {
 			var item = VorgangAttachedItemTestFactory.createBuilder().itemName(StringUtils.EMPTY).build();
 
-			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item))
-					.isInstanceOf(ConstraintViolationException.class);
+			assertThatThrownBy(() -> service.create(CommandTestFactory.ID, item)).isInstanceOf(ConstraintViolationException.class);
 		}
 	}
-
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
index e7d01613b0258fb7da57ad9b862b463e4f6ebaf7..932e678e5585088726653434c5e55ee0210fc3a9 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
@@ -44,6 +44,8 @@ import org.mockito.Spy;
 import org.springframework.context.ApplicationEventPublisher;
 
 import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandRevokeFailedEvent;
+import de.ozgcloud.command.CommandRevokedEvent;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
 import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
@@ -110,19 +112,20 @@ class VorgangAttachedItemServiceTest {
 				assertThat(prepared.isDeleted()).isFalse();
 			}
 		}
-
 	}
 
+	@DisplayName("Update item")
 	@Nested
 	class TestUpdateItem {
 
 		@Captor
 		private ArgumentCaptor<VorgangAttachedItemUpdatedEvent> eventCaptor;
+
 		@Test
-		void shouldCallRepository() {
+		void shouldCallDoUpate() {
 			service.update(CommandTestFactory.ID, VorgangAttachedItemTestFactory.create());
 
-			verify(repository).update(VorgangAttachedItemTestFactory.ID, VERSION, STRING_MAP);
+			verify(service).doUpdate(VorgangAttachedItemTestFactory.ID, VERSION, STRING_MAP);
 		}
 
 		@Test
@@ -134,6 +137,7 @@ class VorgangAttachedItemServiceTest {
 		}
 	}
 
+	@DisplayName("Force update")
 	@Nested
 	class TestForceUpdateItem {
 
@@ -142,14 +146,14 @@ class VorgangAttachedItemServiceTest {
 
 		@Test
 		void shouldCallRepository() {
-			service.forceUpdate(CommandTestFactory.ID, VorgangAttachedItemTestFactory.create());
+			service.forceUpdate(CommandTestFactory.ID, VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
 
-			verify(repository).forceUpdate(VorgangAttachedItemTestFactory.ID, STRING_MAP);
+			verify(repository).forceUpdate(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
 		}
 
 		@Test
 		void shouldPublishEvent() {
-			service.forceUpdate(CommandTestFactory.ID, VorgangAttachedItemTestFactory.create());
+			service.forceUpdate(CommandTestFactory.ID, VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.STRING_MAP);
 
 			verify(publisher).publishEvent(eventCaptor.capture());
 			assertThat(eventCaptor.getValue()).extracting(VorgangAttachedItemUpdatedEvent::getSource).isEqualTo(CommandTestFactory.ID);
@@ -165,7 +169,6 @@ class VorgangAttachedItemServiceTest {
 
 			verify(repository).findByIdAndDeleted(PostfachNachrichtTestFactory.ID, VorgangAttachedItemService.NOT_DELETED);
 		}
-
 	}
 
 	@Nested
@@ -204,23 +207,24 @@ class VorgangAttachedItemServiceTest {
 	@Nested
 	class TestPatch {
 
-		@Test
-		void shouldCallRepository() {
-			Map<String, Object> propertyMap = Map.of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
-					VorgangAttachedItemTestFactory.ITEM_FIELD_INT_VALUE);
-			var item = VorgangAttachedItemTestFactory.createBuilder().item(propertyMap).build();
-			var command = buildCommand(propertyMap);
+		private final Command command = CommandTestFactory.create();
 
-			service.patch(command, item.getItem());
+		@Captor
+		private ArgumentCaptor<VorgangAttachedItemUpdatedEvent> eventCaptor;
+
+		@Test
+		void shouldCallDoPatch() {
+			service.patch(command, VorgangAttachedItemTestFactory.STRING_MAP);
 
-			verify(repository).patch(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.VERSION, propertyMap);
+			verify(service).doPatch(command, CommandTestFactory.RELATION_VERSION, VorgangAttachedItemTestFactory.STRING_MAP);
 		}
 
-		private Command buildCommand(Map<String, Object> bodyMap) {
-			return CommandTestFactory.createBuilder()
-					.relationId(VorgangAttachedItemTestFactory.ID)
-					.relationVersion(VorgangAttachedItemTestFactory.VERSION)
-					.bodyObject(bodyMap).build();
+		@Test
+		void shouldPublishEvent() {
+			service.update(CommandTestFactory.ID, VorgangAttachedItemTestFactory.create());
+
+			verify(publisher).publishEvent(eventCaptor.capture());
+			assertThat(eventCaptor.getValue()).extracting(VorgangAttachedItemUpdatedEvent::getSource).isEqualTo(CommandTestFactory.ID);
 		}
 	}
 
@@ -239,8 +243,8 @@ class VorgangAttachedItemServiceTest {
 	}
 
 	@Nested
-
 	class TestGetById {
+
 		@Test
 		void shouldReturnAttachedItem() {
 			var item = VorgangAttachedItemTestFactory.create();
@@ -306,7 +310,7 @@ class VorgangAttachedItemServiceTest {
 
 	@Nested
 	@DisplayName("Delete item by vorgangId")
-	class TestDelete {
+	class TestDeleteByVorgangId {
 
 		@Test
 		void shouldCallDeleteMethod() {
@@ -316,4 +320,164 @@ class VorgangAttachedItemServiceTest {
 		}
 
 	}
+
+	@DisplayName("Delete")
+	@Nested
+	class TestDelete {
+
+		@Test
+		void shouldCallRepository() {
+			service.delete(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.VERSION);
+
+			verify(repository).delete(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.VERSION);
+		}
+	}
+
+	@DisplayName("Do patch")
+	@Nested
+	class TestDoPatch {
+
+		@Test
+		void shouldCallRepository() {
+			service.doPatch(CommandTestFactory.create(), CommandTestFactory.RELATION_VERSION, STRING_MAP);
+
+			verify(repository).patch(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION, STRING_MAP);
+		}
+	}
+
+	@DisplayName("Do Update")
+	@Nested
+	class TestDoUpdate {
+
+		@Test
+		void shouldCallRepository() {
+			service.doUpdate(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.VERSION, STRING_MAP);
+
+			verify(repository).update(VorgangAttachedItemTestFactory.ID, VorgangAttachedItemTestFactory.VERSION, STRING_MAP);
+		}
+	}
+
+	@DisplayName("Revoke create")
+	@Nested
+	class TestRevokeCreate {
+
+		private final Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallHandleRevoke() {
+			service.revokeCreate(command);
+
+			verify(service).handleRevoke(eq(command), any(Runnable.class));
+		}
+
+		@Test
+		void shouldCallDelete() {
+			service.revokeCreate(command);
+
+			verify(service).delete(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION);
+		}
+	}
+
+	@DisplayName("Revoke delete")
+	@Nested
+	class TestRevokeDelete {
+
+		private final Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallHandleRevoke() {
+			service.revokeDelete(command);
+
+			verify(service).handleRevoke(eq(command), any(Runnable.class));
+		}
+
+		@Test
+		void shouldCallDelete() {
+			service.revokeDelete(command);
+
+			verify(service).unmarkAsDeleteByIdAndVersion(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION);
+		}
+	}
+
+	@DisplayName("Revoke Patch")
+	@Nested
+	class TestRevokePatch {
+
+		private final Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallHandleRevoke() {
+			service.revokePatch(command, STRING_MAP);
+
+			verify(service).handleRevoke(eq(command), any(Runnable.class));
+		}
+
+		@Test
+		void shouldCallPatch() {
+			service.revokePatch(command, STRING_MAP);
+
+			verify(service).doPatch(command, CommandTestFactory.RELATION_VERSION + 1, STRING_MAP);
+		}
+	}
+
+	@DisplayName("Revoke Update")
+	@Nested
+	class TestRevokeUpdate {
+
+		private final Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallHandleRevoke() {
+			service.revokeUpdate(command, STRING_MAP);
+
+			verify(service).handleRevoke(eq(command), any(Runnable.class));
+		}
+
+		@Test
+		void shouldCallPatch() {
+			service.revokeUpdate(command, STRING_MAP);
+
+			verify(service).doUpdate(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION + 1, STRING_MAP);
+		}
+	}
+
+	@DisplayName("Handle revoke")
+	@Nested
+	class TestHandleRevoke {
+
+		@Captor
+		private ArgumentCaptor<CommandRevokedEvent> commandRevokedEventCaptor;
+		@Captor
+		private ArgumentCaptor<CommandRevokeFailedEvent> commandRevokedFailedEventCaptor;
+
+		@Mock
+		private Runnable runnable;
+
+		private final Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallServiceFunction() {
+			service.handleRevoke(command, runnable);
+
+			verify(runnable).run();
+		}
+
+		@Test
+		void shouldPublishCommandRevokedEvent() {
+			service.handleRevoke(command, runnable);
+
+			verify(publisher).publishEvent(commandRevokedEventCaptor.capture());
+			assertThat(commandRevokedEventCaptor.getValue().getSource()).isEqualTo(command);
+		}
+
+		@Test
+		void shouldPublishCommandRevokeFailedEventOnException() {
+			doThrow(new RuntimeException()).when(runnable).run();
+
+			service.handleRevoke(command, runnable);
+
+			verify(publisher).publishEvent(commandRevokedFailedEventCaptor.capture());
+			assertThat(commandRevokedFailedEventCaptor.getValue().getSource()).isEqualTo(CommandTestFactory.ID);
+		}
+	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemTestFactory.java
index 58bf4f855c2a2d04302354cdc898ca1e5afbde38..b0a8dbbf4dc0a6fe293e7e68d0d4b5b141be81b9 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemTestFactory.java
@@ -40,25 +40,16 @@ public class VorgangAttachedItemTestFactory {
 	public static final long VERSION = 1L;
 
 	public static final String CLIENT = LoremIpsum.getInstance().getFirstName() + "Client";
-	public static final String ITEM_NAME = "test";
 
+	public static final String ITEM_NAME = "test";
 	public static final String ITEM_FIELD_NAME = "number";
 	public static final Integer ITEM_FIELD_INT_VALUE = 42;
 	public static final String ITEM_FIELD_STRING_VALUE = "73";
 
-	public static final String FIELD_NAME_VORGANG_ID = "vorgangId";
-	public static final String FIELD_NAME_VORGANG_VERSION = "vorgangVersion";
-	public static final String FIELD_NAME_CREATED_AT = "createdAt";
-	public static final String CREATED_BY_FIELD_NAME = "createdBy";
-	public static final String CREATED_BY_NAME_FIELD_NAME = "createdByName";
-	public static final String BETREFF_FIELD_NAME = "betreff";
-	public static final String BESCHREIBUNG_FIELD_NAME = "beschreibung";
-	public static final String ATTACHMENTS_FIELD_NAME = "attachments";
-
 	public static final FileId ATTACHMENT_ID = FileId.createNew();
 	static final List<FileId> ATTACHMENTS = List.of(ATTACHMENT_ID, ATTACHMENT_ID);
 
-	static final Map<String, Object> STRING_MAP = Map.of(ITEM_FIELD_NAME, ITEM_FIELD_STRING_VALUE);
+	public static final Map<String, Object> STRING_MAP = Map.of(ITEM_FIELD_NAME, ITEM_FIELD_STRING_VALUE);
 
 	public static VorgangAttachedItem create() {
 		return createBuilder().build();
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandITCase.java
index e3b2e977d1d0a969a94390603f538008ba097ebb..cbb89a295b4dde09f94322dc54cad4cf97f7c172 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandITCase.java
@@ -127,7 +127,7 @@ class CommandITCase {
 			var response = responseCaptor.getValue();
 
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
-				var command = commandService.findCommand(response.getCommand().getId());
+				var command = commandService.findById(response.getCommand().getId());
 
 				assertThat(command).isPresent().get().satisfies(cmd -> {
 					assertThat(cmd.getId()).isNotNull();
@@ -380,7 +380,7 @@ class CommandITCase {
 				callServiceRevokeCommand();
 
 				await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
-					var command = commandService.findCommand(responseCaptor.getValue().getCommand().getId());
+					var command = commandService.findById(responseCaptor.getValue().getCommand().getId());
 
 					assertThat(command).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKED);
 				});
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
index 1302487486ea0c97f9040c595819dda2f385ca37..c5d52feb6a7e0c74662328fd61d65cd9cb01f346 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
@@ -105,7 +105,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.FINISHED);
 		}
 
@@ -117,7 +117,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(commandStatus);
 		}
 
@@ -127,7 +127,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(command.getId());
 
-			var result = repository.getById(command.getId()).get();
+			var result = repository.findById(command.getId()).get();
 			assertThat(result.getFinishedAt()).isNotNull();
 		}
 
@@ -137,7 +137,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(command.getId(), CommandTestFactory.CREATED_RESOURCE);
 
-			var result = repository.getById(command.getId()).get();
+			var result = repository.findById(command.getId()).get();
 			assertThat(result.getStatus()).isEqualTo(CommandStatus.FINISHED);
 		}
 
@@ -147,7 +147,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(command.getId(), CommandTestFactory.CREATED_RESOURCE);
 
-			var result = repository.getById(command.getId()).get();
+			var result = repository.findById(command.getId()).get();
 			assertThat(result.getFinishedAt()).isNotNull();
 		}
 
@@ -159,7 +159,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(savedCommand.getId(), CommandTestFactory.CREATED_RESOURCE);
 
-			var result = repository.getById(savedCommand.getId()).get();
+			var result = repository.findById(savedCommand.getId()).get();
 			assertThat(result.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
 		}
 
@@ -170,7 +170,7 @@ class CommandRepositoryITCase {
 
 			repository.finishCommand(savedCommand.getId(), CommandTestFactory.CREATED_RESOURCE);
 
-			var result = repository.getById(savedCommand.getId()).get();
+			var result = repository.findById(savedCommand.getId()).get();
 			assertThat(result.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
 		}
 	}
@@ -198,7 +198,7 @@ class CommandRepositoryITCase {
 		}
 
 		private void verifyCommandExists(String id) {
-			Optional<Command> command = repository.getById(id);
+			Optional<Command> command = repository.findById(id);
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getId()).isEqualTo(id);
@@ -218,7 +218,7 @@ class CommandRepositoryITCase {
 		void shouldUpdateCommandStatus(CommandStatus status) {
 			repository.updateCommandStatus(CommandTestFactory.ID, status);
 
-			Optional<Command> command = repository.getById(CommandTestFactory.ID);
+			Optional<Command> command = repository.findById(CommandTestFactory.ID);
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getStatus()).isEqualTo(status);
@@ -238,7 +238,7 @@ class CommandRepositoryITCase {
 		void shouldUpdateCommandStatus(CommandStatus status) {
 			repository.updateCommandStatusAndVersion(CommandTestFactory.ID, status, 78L);
 
-			Optional<Command> command = repository.getById(CommandTestFactory.ID);
+			Optional<Command> command = repository.findById(CommandTestFactory.ID);
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getRelationVersion()).isEqualTo(78L);
@@ -322,7 +322,7 @@ class CommandRepositoryITCase {
 			}
 
 			@Test
-				// TODO schreibe ein Testcase für Order, Status und Zeit
+			// TODO schreibe ein Testcase für Order, Status und Zeit
 			void shouldFindCommand() {
 				var command = repository.save(createCommandBuilder()
 						.status(CommandStatus.FINISHED)
@@ -355,7 +355,7 @@ class CommandRepositoryITCase {
 		void shouldSavePreviousStateValue() {
 			repository.patch(command.getId(), Map.of(PREVIOUS_STATE_STATUS_FIELD_KEY, PREVIOUS_STATE_STATUS_VALUE));
 
-			var persitedCommand = repository.getById(command.getId());
+			var persitedCommand = repository.findById(command.getId());
 
 			assertThat(persitedCommand).isPresent().get()
 					.extracting(command -> ((PersistedCommand) command).getPreviousState(), as(InstanceOfAssertFactories.MAP))
@@ -434,7 +434,7 @@ class CommandRepositoryITCase {
 
 			repository.addSubCommands(commandId, Map.of("addedKey", "addedValue"));
 
-			var result = repository.getById(commandId);
+			var result = repository.findById(commandId);
 			assertThat(result).isPresent().get().extracting(Command::getBodyObject, as(InstanceOfAssertFactories.MAP))
 					.containsAllEntriesOf(expectedMap);
 		}
@@ -483,7 +483,7 @@ class CommandRepositoryITCase {
 		@Test
 		void shouldReturnParentId() {
 			var commandId = mongoOperations.save(
-							CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build())
+					CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build())
 					.getId();
 
 			var parentId = repository.getParentId(commandId);
@@ -617,7 +617,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatus(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.CANCELED);
 		}
 
@@ -627,7 +627,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatus(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
 		}
 
@@ -637,7 +637,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatus(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
 		}
 
@@ -649,7 +649,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatus(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(status);
 		}
 	}
@@ -663,7 +663,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatusIfNotPending(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.CANCELED);
 		}
 
@@ -673,7 +673,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatusIfNotPending(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
 		}
 
@@ -685,7 +685,7 @@ class CommandRepositoryITCase {
 
 			repository.setRevokeStatusIfNotPending(command.getId());
 
-			var result = repository.getById(command.getId());
+			var result = repository.findById(command.getId());
 			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(status);
 		}
 	}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRevokedEventTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRevokedEventTestFactory.java
index a54027a07cd0861344dfb06b26026d7a2123e208..526d0a592966588a4a52d33b38ccb9bd783b5b93 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRevokedEventTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRevokedEventTestFactory.java
@@ -4,6 +4,7 @@ import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandRevokedEvent;
 
 public class CommandRevokedEventTestFactory {
+
 	public static CommandRevokedEvent create(Command command) {
 		return new CommandRevokedEvent(command);
 	}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java
index 5f2b3a176f5730f33c3e2eddfdf0bec49cf59cbb..e22db2e28e1106c2e140a3ad2ce80321fda82c33 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java
@@ -25,6 +25,7 @@ package de.ozgcloud.vorgang.command;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.awaitility.Awaitility.*;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Map;
@@ -78,15 +79,12 @@ class CommandServiceITCase {
 
 		@Test
 		void persistCommand() {
-			Command persistedCommand = commandService.saveCommand(
+			var persistedCommand = commandService.saveCommand(
 					CommandTestFactory.createBuilder()
 							.relationId(CommandTestFactory.RELATION_ID)
 							.relationVersion(CommandTestFactory.RELATION_VERSION).build());
 
-			Optional<Command> commandOpt = commandService.findCommand(persistedCommand.getId());
-			assertThat(commandOpt).isPresent();
-
-			Command command = commandOpt.get();
+			var command = commandService.getById(persistedCommand.getId());
 			assertThat(command.getId()).hasSize(36);
 			assertThat(command.getCreatedAt()).isNotNull();
 			assertThat(command.getStatus()).isEqualTo(CommandStatus.PENDING);
@@ -95,24 +93,23 @@ class CommandServiceITCase {
 
 		@Test
 		void persistCommandHappyPath() {
-			CreateCommandRequest request = CreateCommandRequestTestFactory
+			var request = CreateCommandRequestTestFactory
 					.createBuilder()
 					.relationId(CommandTestFactory.RELATION_ID)
 					.relationVersion(CommandTestFactory.RELATION_VERSION)
 					.build();
 
-			Command persistedCommand = commandService.createCommand(request);
-			verify(commandService, timeout(60000)).setCommandFinished(eq(persistedCommand.getId()), any());
-
-			Optional<Command> commandOpt = commandService.findCommand(persistedCommand.getId());
-			assertThat(commandOpt).isPresent();
+			var persistedCommand = commandService.createCommand(request);
 
-			Command command = commandOpt.get();
-			assertThat(command.getId()).hasSize(36);
-			assertThat(command.getCreatedAt()).isNotNull();
-			assertThat(command.getCreatedBy()).isEqualTo(request.getCallContext().getUser().getId());
-			assertThat(command.getStatus()).isEqualTo(CommandStatus.FINISHED);
-			assertThat(command.getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID);
+			await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+				verify(commandService).setCommandFinished(eq(persistedCommand.getId()), any());
+				var command = commandService.getById(persistedCommand.getId());
+				assertThat(command.getId()).hasSize(36);
+				assertThat(command.getCreatedAt()).isNotNull();
+				assertThat(command.getCreatedBy()).isEqualTo(request.getCallContext().getUser().getId());
+				assertThat(command.getStatus()).isEqualTo(CommandStatus.FINISHED);
+				assertThat(command.getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID);
+			});
 		}
 	}
 
@@ -134,7 +131,7 @@ class CommandServiceITCase {
 		void setCommandFinishedHappyPath() {
 			commandService.setCommandFinished(CommandTestFactory.ID);
 
-			Command command = mongoOperations.findById(CommandTestFactory.ID, Command.class);
+			var command = mongoOperations.findById(CommandTestFactory.ID, Command.class);
 
 			assertThat(command.getId()).hasSize(36);
 			assertThat(command.getCreatedAt()).isNotNull();
@@ -190,7 +187,7 @@ class CommandServiceITCase {
 
 		@Test
 		void shouldReturnCommand1() {
-			Optional<Command> command = commandService.findCommand(command1.getId());
+			Optional<Command> command = commandService.findById(command1.getId());
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getId()).isEqualTo(command1.getId());
@@ -202,7 +199,7 @@ class CommandServiceITCase {
 
 		@Test
 		void shouldReturnCommand2() {
-			Optional<Command> command = commandService.findCommand(command2.getId());
+			Optional<Command> command = commandService.findById(command2.getId());
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getId()).isEqualTo(command2.getId());
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
index b0b498207da99d1729551fec6cc270e6cab27a4b..9af3b3021ec2c08f5d78d1709b4b1dc1b88e01c9 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
@@ -164,19 +164,19 @@ class CommandServiceTest {
 
 		@BeforeEach
 		void mockOperationRepository() {
-			when(repository.getById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(repository.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 		}
 
 		@Test
 		void shouldCallOperationRepository() {
-			service.findCommand(commandId);
+			service.findById(commandId);
 
-			verify(repository).getById(any());
+			verify(repository).findById(any());
 		}
 
 		@Test
 		void shouldReturnCommand() {
-			Optional<Command> command = service.findCommand(commandId);
+			Optional<Command> command = service.findById(commandId);
 
 			assertThat(command).isPresent();
 			assertThat(command.get().getId()).isEqualTo(commandId);
@@ -206,7 +206,7 @@ class CommandServiceTest {
 
 		@Test
 		void shouldThrowExceptionIfCommandNotFound() {
-			doThrow(NotFoundException.class).when(service).getCommand(anyString());
+			doThrow(NotFoundException.class).when(service).getById(anyString());
 
 			assertThrows(NotFoundException.class, () -> service.setCommandFinished(CommandTestFactory.ID));
 		}
@@ -219,7 +219,7 @@ class CommandServiceTest {
 			@BeforeEach
 			void init() {
 				doReturn(true).when(service).isRevokeCommand(any());
-				doReturn(REVOKE_PENDING_COMMAND).when(service).getCommand(anyString());
+				doReturn(REVOKE_PENDING_COMMAND).when(service).getById(anyString());
 			}
 
 			@Test
@@ -264,7 +264,7 @@ class CommandServiceTest {
 			@BeforeEach
 			void init() {
 				doReturn(false).when(service).isParentCommandFailed(any());
-				doReturn(FINISHED_COMMAND).when(service).getCommand(anyString());
+				doReturn(FINISHED_COMMAND).when(service).getById(anyString());
 			}
 
 			@Test
@@ -278,7 +278,7 @@ class CommandServiceTest {
 			void shouldCallGetCommand() {
 				setCommandFinished();
 
-				verify(service).getCommand(CommandTestFactory.ID);
+				verify(service).getById(CommandTestFactory.ID);
 			}
 
 			@Test
@@ -501,13 +501,13 @@ class CommandServiceTest {
 		void shouldCallFindCommand() {
 			service.publishCommandExecutedEvent(CommandTestFactory.ID);
 
-			verify(service).findCommand(CommandTestFactory.ID);
+			verify(service).findById(CommandTestFactory.ID);
 		}
 
 		@Test
 		void shouldCallPublishMethod() {
 			var expectedCommand = CommandTestFactory.create();
-			doReturn(Optional.of(expectedCommand)).when(service).findCommand(anyString());
+			doReturn(Optional.of(expectedCommand)).when(service).findById(anyString());
 
 			service.publishCommandExecutedEvent(CommandTestFactory.ID);
 
@@ -874,12 +874,12 @@ class CommandServiceTest {
 	class TestGetPendingCommand {
 
 		@Test
-		void shouldCallGetCommand() {
-			doReturn(Optional.of(CommandTestFactory.create())).when(service).findCommand(anyString());
+		void shouldCallFindCommand() {
+			doReturn(Optional.of(CommandTestFactory.create())).when(service).findById(anyString());
 
 			service.getPendingCommand(CommandTestFactory.ID);
 
-			verify(service).getCommand(CommandTestFactory.ID);
+			verify(service).findById(CommandTestFactory.ID);
 		}
 
 		@DisplayName("should throw exception when")
@@ -887,7 +887,7 @@ class CommandServiceTest {
 		@EnumSource(value = CommandStatus.class, names = { "PENDING" }, mode = EnumSource.Mode.EXCLUDE)
 		void shouldThrowExceptionIfCommandFailed(CommandStatus status) {
 			var command = CommandTestFactory.createBuilder().status(status).build();
-			doReturn(command).when(service).getCommand(anyString());
+			doReturn(command).when(service).getById(anyString());
 
 			assertThrows(TechnicalException.class, () -> service.getPendingCommand(CommandTestFactory.ID));
 		}
@@ -895,7 +895,7 @@ class CommandServiceTest {
 		@Test
 		void shouldReturnCommand() {
 			var command = CommandTestFactory.create();
-			doReturn(Optional.of(command)).when(service).findCommand(anyString());
+			doReturn(Optional.of(command)).when(service).findById(anyString());
 
 			var result = service.getPendingCommand(CommandTestFactory.ID);
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceTest.java
index c2e958b07f5bfa6f33db92d00c56c61ec2715bb7..afef68d9bc130103b2bf09d0bbc6a38ab05b47cb 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceTest.java
@@ -104,7 +104,7 @@ class GrpcCommandServiceTest {
 		void mockMapper() {
 			when(createCommandRequestMapper.fromGrpc(any(GrpcCreateCommandRequest.class))).thenReturn(createComandRequest);
 			when(commandService.createCommand(any(CreateCommandRequest.class))).thenReturn(persistedCommand);
-			when(commandService.findCommand(anyString())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(anyString())).thenReturn(Optional.of(CommandTestFactory.create()));
 			when(commandResponseMapper.toGrpc(any(CommandResponse.class))).thenReturn(response);
 		}
 
@@ -157,7 +157,7 @@ class GrpcCommandServiceTest {
 
 		@BeforeEach
 		void init() {
-			when(commandService.findCommand(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 			when(commandMapper.toGrpc(any())).thenReturn(GrpcCommand.newBuilder().setId(CommandTestFactory.ID).build());
 		}
 
@@ -172,7 +172,7 @@ class GrpcCommandServiceTest {
 		void shouldCallVorgangCommandService() throws Exception {
 			callGetVorgangCommand();
 
-			verify(commandService).findCommand(CommandTestFactory.ID);
+			verify(commandService).findById(CommandTestFactory.ID);
 		}
 
 		@Test
@@ -419,14 +419,14 @@ class GrpcCommandServiceTest {
 
 		@BeforeEach
 		void init() {
-			when(commandService.findCommand(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 		}
 
 		@Test
 		void shouldLoadCommand() {
 			service.setCommandExecuted(buildRequest(), responseObserver);
 
-			verify(commandService).findCommand(CommandTestFactory.ID);
+			verify(commandService).findById(CommandTestFactory.ID);
 		}
 
 		@Test
@@ -438,7 +438,7 @@ class GrpcCommandServiceTest {
 
 		@Test
 		void shouldHandleMissingCommand() {
-			when(commandService.findCommand(any())).thenReturn(Optional.empty());
+			when(commandService.findById(any())).thenReturn(Optional.empty());
 
 			service.setCommandExecuted(buildRequest(), responseObserver);
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/RevokeCommandEventTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/RevokeCommandEventTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..61b93ce3d08e3afe118e21fe0d2017310f2c9714
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/RevokeCommandEventTestFactory.java
@@ -0,0 +1,11 @@
+package de.ozgcloud.vorgang.command;
+
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.RevokeCommandEvent;
+
+public class RevokeCommandEventTestFactory {
+
+	public static RevokeCommandEvent create(Command command) {
+		return new RevokeCommandEvent(command);
+	}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchEventListenerTest.java
index 3b2a5913798dce1392dc9c53031fa31fa763c8b4..359c21709666e3ec0f2c5c8e07d5317ba351dc79 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchEventListenerTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchEventListenerTest.java
@@ -112,7 +112,7 @@ class SearchEventListenerTest {
 
 		@BeforeEach
 		void init() {
-			when(commandService.findCommand(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 			when(vorgangService.getById(anyString())).thenReturn(vorgang);
 		}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchServiceITCase.java
index e54948ec4f0108debde76cf2a8e8635ebc5b1b87..867f0f4b9f6355f1d4e4b3d1498e4daeb77543eb 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/search/SearchServiceITCase.java
@@ -89,7 +89,7 @@ public class SearchServiceITCase {
 		@BeforeEach
 		void init() {
 			Command cmd = CommandTestFactory.createBuilder().build();
-			when(commandService.findCommand(CommandTestFactory.ID)).thenReturn(Optional.of(cmd));
+			when(commandService.findById(CommandTestFactory.ID)).thenReturn(Optional.of(cmd));
 
 			elasticsearchOperations.indexOps(IndexedVorgang.class).delete();
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java
index bb751bec059f5f0bb76e50af39caa5d755a928fe..2b3c260fd811ad45c157eb172fdcd4a20ffae1b2 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerITCase.java
@@ -45,7 +45,7 @@ class StatusEventListenerITCase {
 	void init() {
 		when(vorgangService.getById(anyString())).thenReturn(VorgangTestFactory.create());
 
-		when(commandService.findCommand(anyString())).thenReturn(Optional.of(CommandTestFactory.create()));
+		when(commandService.findById(anyString())).thenReturn(Optional.of(CommandTestFactory.create()));
 	}
 
 	@DisplayName("Test creating status events")
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerTest.java
index dca80473467488a16fe29282bb80103c4002acfa..91866958ed434e56b7f297e4a8825085802fbb2b 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusEventListenerTest.java
@@ -68,7 +68,7 @@ class StatusEventListenerTest {
 		void init() {
 			when(event.getSource()).thenReturn(command);
 			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
-			when(commandService.findCommand(any())).thenReturn(Optional.of(CommandTestFactory.create()));
+			when(commandService.findById(any())).thenReturn(Optional.of(CommandTestFactory.create()));
 		}
 
 		@Test
@@ -82,7 +82,7 @@ class StatusEventListenerTest {
 		void shouldCallCommandService() {
 			eventListener.abschiessen(event);
 
-			verify(commandService).findCommand(any());
+			verify(commandService).findById(any());
 		}
 
 		@Test
@@ -195,7 +195,7 @@ class StatusEventListenerTest {
 
 		@Test
 		void shouldHandleNoSuchElementException() {
-			when(commandService.findCommand(any())).thenReturn(Optional.empty());
+			when(commandService.findById(any())).thenReturn(Optional.empty());
 			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
 
 			eventListener.annehmen(CommandCreatedEventTestFactory.create(CommandTestFactory.create()));
diff --git a/vorgang-manager-utils/pom.xml b/vorgang-manager-utils/pom.xml
index 1c0254fb998531b9521cf1796c43ea40e4bf93cf..8e78361b0e1cae1ecef07ee4a41cf1e1ed1b0315 100644
--- a/vorgang-manager-utils/pom.xml
+++ b/vorgang-manager-utils/pom.xml
@@ -37,7 +37,7 @@
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-utils</artifactId>
 	<name>OZG-Cloud Vorgang Manager Utils</name>
-	<version>2.10.0-SNAPSHOT</version>
+	<version>2.11.0-SNAPSHOT</version>
 
 	<properties>
 		<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>