diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 5f5e43c0d1204185e1f1473897ea2e7d76babb0e..07ca67426a2042ed3f702a4c3ef65e621c984e13 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -15,7 +15,7 @@
 	<version>1.10.0-SNAPSHOT</version>
 
 	<properties>
-		<vorgang-manager.version>2.5.0</vorgang-manager.version>
+		<vorgang-manager.version>2.6.0-SNAPSHOT</vorgang-manager.version>
 		<api-lib.version>0.7.0-SNAPSHOT</api-lib.version>
 	</properties>
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
index fb1cce79ca8b440566661cede1b0ff50cc4036d8..84d0d11a5d44d852abf7d4e2ea7c027a8cc946be 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
@@ -17,7 +17,7 @@ class BescheidGrpcService extends BescheidServiceImplBase {
 
 	@Override
 	public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) {
-		var response = attachedItemService.getBescheidItem(request.getVorgangId())
+		var response = attachedItemService.findBescheidItem(request.getVorgangId())
 				.map(this::buildResponse)
 				.orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance);
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2ba902117c7b2b566957955d9c0a1591cbc5e0f
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import java.util.Map;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class AttachedItem {
+
+	public static final String PROPERTY_ID = "id";
+	public static final String PROPERTY_CLIENT = "client";
+	public static final String PROPERTY_VORGANG_ID = "vorgangId";
+	public static final String PROPERTY_ITEM_NAME = "itemName";
+	public static final String PROPERTY_VERSION = "version";
+	public static final String PROPERTY_ITEM = "item";
+
+	private String id;
+	@Builder.Default
+	private long version = 0L;
+
+	private String client;
+	private String vorgangId;
+	private String itemName;
+
+	private Map<String, Object> item;
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2b373a33138cc4df45ea98c5f516921713f4863
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import org.mapstruct.Mapper;
+
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
+
+@Mapper(uses = { GrpcObjectMapper.class})
+interface AttachedItemMapper {
+
+	AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item);
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
index 5362b2a489b9616f9ecb606446ea1f713e9ecb7e..53e246ff9d1e9d293badd27fdca83e97771977ae 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
@@ -48,7 +48,6 @@ import lombok.extern.log4j.Log4j2;
 public class AttachedItemService {
 
 	static final String BESCHEID_ITEM_NAME = "Bescheid";
-	static final String BESCHEID_DRAFT_STATUS = "DRAFT";
 	static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
 	static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM";
 	static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM";
@@ -59,10 +58,14 @@ public class AttachedItemService {
 	private final VorgangAttachedItemRemoteService remoteService;
 	private final CommandMapper commandMapper;
 
-	public Optional<BescheidItem> getBescheidItem(String vorgangId) {
+	public Optional<BescheidItem> findBescheidItem(String vorgangId) {
 		return remoteService.findBescheidDraft(vorgangId);
 	}
 
+	public BescheidItem getBescheidItem(String id) {
+		return remoteService.getBescheid(id);
+	}
+
 	public String createBescheidDraft(Command command) {
 		validateBescheidData(command.getBodyObject());
 		return remoteService.findBescheidDraft(command.getVorgangId())
@@ -129,7 +132,7 @@ public class AttachedItemService {
 
 	Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) {
 		var result = new HashMap<String, Object>();
-		result.put(BescheidItem.FIELD_STATUS, BESCHEID_DRAFT_STATUS);
+		result.put(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name());
 		addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHIEDEN_AM, result);
 		addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BEWILLIGT, result);
 		addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHEID_DOCUMENT, result);
@@ -168,7 +171,7 @@ public class AttachedItemService {
 
 	void validateBescheidStatus(BescheidItem bescheid) {
 		var bescheidStatus = MapUtils.getString(bescheid.getBescheidData(), BescheidItem.FIELD_STATUS);
-		if (!BESCHEID_DRAFT_STATUS.equals(bescheidStatus)) {
+		if (BescheidItem.Status.DRAFT.not(bescheidStatus)) {
 			throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus));
 		}
 	}
@@ -182,4 +185,7 @@ public class AttachedItemService {
 				.build();
 	}
 
+	public AttachedItem getItem(String id) {
+		return remoteService.getItem(id);
+	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
index 57d6eac58ed8fe7681dbf4e28500d8ca53871205..4bc85092889c6449e0ed12193079734cc6e78459 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
@@ -31,6 +31,7 @@ import lombok.Getter;
 
 @Builder(toBuilder = true)
 @Getter
+@Deprecated(since = "2.6.0")
 public class BescheidItem {
 
 	static final Set<String> ACCEPTED_SEND_BY_VALUES = Set.of("POSTFACH", "MANUAL");
@@ -60,4 +61,16 @@ public class BescheidItem {
 	private String itemName;
 
 	private Map<String, Object> bescheidData;
+
+	public enum Status {
+		DRAFT, BESCHEID;
+
+		public boolean not(String value) {
+			return !hasValue(value);
+		}
+
+		public boolean hasValue(String value) {
+			return this.name().equalsIgnoreCase(value);
+		}
+	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
index 5d3adecfd3983d957cc806ad7851139fbf76a52b..2c915d65d934abab2636433b02e30a1eaf8e764d 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
@@ -23,7 +23,10 @@
  */
 package de.ozgcloud.bescheid.attacheditem;
 
+import static java.util.Objects.*;
+
 import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -39,6 +42,7 @@ import lombok.RequiredArgsConstructor;
 
 @Component
 @RequiredArgsConstructor
+@Deprecated(since = "2.6.0")
 public class BescheidItemMapper {
 
 	private final GrpcObjectMapper grpcObjectMapper;
@@ -74,9 +78,23 @@ public class BescheidItemMapper {
 				.ifPresent(bescheidBuilder::setNachrichtText);
 		Optional.ofNullable(MapUtils.getString(bescheidData, BescheidItem.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull)
 				.ifPresent(bescheidBuilder::setNachrichtSubject);
-		Optional.ofNullable(bescheidData.get(BescheidItem.FIELD_ATTACHMENTS)).filter(Collection.class::isInstance).map(Collection.class::cast)
-				.ifPresent(bescheidBuilder::addAllAttachments);
+		Optional.ofNullable(bescheidData.get(BescheidItem.FIELD_ATTACHMENTS)).map(this::toAttachments).ifPresent(bescheidBuilder::addAllAttachments);
 		return bescheidBuilder.build();
 	}
 
+	@SuppressWarnings("unchecked")
+	Collection<String> toAttachments(Object attachmentsObject) {
+		if (attachmentsObject instanceof Collection<?> attachments) {
+			return (Collection<String>) attachments;
+		}
+		if (attachmentsObject instanceof String attachment) {
+			attachment = StringUtils.trimToNull(attachment);
+			if (nonNull(attachment)) {
+				return List.of(attachment);
+			}
+		} else if (nonNull(attachmentsObject)) {
+			return List.of(String.valueOf(attachmentsObject));
+		}
+		return null; //NOSONAR
+	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
index 192f16e46ab7308c6230b208e88bbdb8093674ce..aa6709149d8d968e263c86e0197e281ff99c3a8e 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
@@ -57,6 +57,8 @@ class VorgangAttachedItemRemoteService {
 	private ClientInterceptor bescheidCallContextInterceptor;
 	@Autowired
 	private BescheidItemMapper bescheidItemMapper;
+	@Autowired
+	private AttachedItemMapper attachedItemMapper;
 
 	public Optional<BescheidItem> findBescheidDraft(String vorgangId) {
 		return findBescheidDraft(buildFindRequest(vorgangId));
@@ -72,14 +74,17 @@ class VorgangAttachedItemRemoteService {
 
 	Optional<BescheidItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) {
 		var grpcResponse = getServiceStub().find(request);
-		var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse)
-				.filter(item -> BESCHEID_DRAFT_STATUS.equals(MapUtils.getString(item.getBescheidData(), BescheidItem.FIELD_STATUS)))
+		var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse).filter(this::hasStatusDraft)
 				.sorted(BY_BESCHIEDEN_AM_DESC).toList();
 		if (bescheidItems.size() > 1) {
 			LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(),
-					bescheidItems.get(0).getVorgangId());
+					bescheidItems.getFirst().getVorgangId());
 		}
-		return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.get(0));
+		return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst());
+	}
+
+	boolean hasStatusDraft(BescheidItem bescheidItem) {
+		return BescheidItem.Status.DRAFT.hasValue(MapUtils.getString(bescheidItem.getBescheidData(), BescheidItem.FIELD_STATUS));
 	}
 
 	public BescheidItem getBescheid(String bescheidId) {
@@ -87,6 +92,11 @@ class VorgangAttachedItemRemoteService {
 		return bescheidItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem());
 	}
 
+	public AttachedItem getItem(String id) {
+		var grpcVorgangAttachedItemResponse = getServiceStub().getById(buildGetByIdRequest(id));
+		return attachedItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem());
+	}
+
 	GrpcVorgangAttachedItemRequest buildGetByIdRequest(String bescheidId) {
 		return GrpcVorgangAttachedItemRequest.newBuilder().setId(bescheidId).build();
 	}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class Document {
+
+	public static final String FIELD_DOCUMENT_TYPE = "type";
+	public static final String FIELD_DOCUMENT_FILE = "documentFile";
+	public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
+	public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject";
+
+	private String id;
+	private String type;
+	private String fileId;
+	private String nachrichtSubject;
+	private String nachrichtText;
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
new file mode 100644
index 0000000000000000000000000000000000000000..673935d696777f3708fafbe134a8a496541b0d02
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceImplBase;
+import io.grpc.stub.StreamObserver;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.server.service.GrpcService;
+
+@GrpcService
+@RequiredArgsConstructor
+public class DocumentGrpcService extends DocumentServiceImplBase {
+
+	private final DocumentService documentService;
+	private final DocumentMapper documentMapper;
+
+	@Override
+	public void getDocument(GrpcGetDocumentRequest request, StreamObserver<GrpcGetDocumentResponse> responseObserver) {
+		var document = documentService.getDocument(request.getId());
+		responseObserver.onNext(buildGetDocumentResponse(document));
+		responseObserver.onCompleted();
+	}
+
+	GrpcGetDocumentResponse buildGetDocumentResponse(Document document) {
+		return GrpcGetDocumentResponse.newBuilder().setDocument(documentMapper.toGrpcDocument(document)).build();
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..41180bab88ef3c302300bd1e51ca34e3ed89619b
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import org.apache.commons.collections.MapUtils;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+
+import de.ozgcloud.bescheid.attacheditem.AttachedItem;
+
+@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+interface DocumentMapper {
+
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "typeBytes", ignore = true)
+	@Mapping(target = "nachrichtTextBytes", ignore = true)
+	@Mapping(target = "nachrichtSubjectBytes", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "idBytes", ignore = true)
+	@Mapping(target = "fileIdBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	GrpcDocument toGrpcDocument(Document document);
+
+	default Document fromAttachedItem(AttachedItem attachedItem) {
+		return Document.builder()
+				.id(attachedItem.getId())
+				.type(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_TYPE))
+				.fileId(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_FILE))
+				.nachrichtText(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_TEXT))
+				.nachrichtSubject(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_SUBJECT))
+				.build();
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
index 1846fb93799c2b8dedffc2f3baa2c57f1e2d587a..f290e57572d8bf1a95a9dec9a8b54671a6b179c8 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
@@ -27,12 +27,14 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
+import org.apache.commons.collections.MapUtils;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.attacheditem.BescheidItem;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.common.errorhandling.TechnicalException;
@@ -42,26 +44,38 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class DocumentService {
 
+	public static final String DOCUMENT_ITEM_NAME = "Document";
+	public static final String DOCUMENT_TYPE = "BESCHEID";
+
 	static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
-	static final String DOCUMENT_ITEM_NAME = "Document";
 	static final String FIELD_DOCUMENT_TYPE = "type";
-	static final String DOCUMENT_TYPE = "BESCHEID";
 	static final String FIELD_DOCUMENT_FILE = "documentFile";
 
+	private final AttachedItemService attachedItemService;
 	private final OzgCloudCommandService commandService;
 	private final CommandMapper commandMapper;
+	private final DocumentMapper documentMapper;
 
 	public String createBescheidDocument(Command command) {
+		validateBescheidItem(command.getRelationId());
 		var ozgCloudCommand = buildCreateDocumentOzgCommand(command);
 		var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand);
 		return executedCommand.getCreatedResource();
 	}
 
+	void validateBescheidItem(String bescheidId) {
+		var bescheidData = attachedItemService.getBescheidItem(bescheidId).getBescheidData();
+		var status = MapUtils.getString(bescheidData, BescheidItem.FIELD_STATUS);
+		if (BescheidItem.Status.DRAFT.not(status)) {
+			throw new TechnicalException("Bescheid is not in draft status");
+		}
+	}
+
 	OzgCloudCommand buildCreateDocumentOzgCommand(Command command) {
 		return OzgCloudCommand.builder()
 				.order(CREATE_ATTACHED_ITEM_ORDER)
 				.vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(command.getRelationId()))
+				.relationId(commandMapper.mapRelationId(command.getVorgangId()))
 				.bodyObject(buildAttachedItem(command))
 				.build();
 	}
@@ -81,4 +95,7 @@ public class DocumentService {
 		return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId);
 	}
 
+	public Document getDocument(String id) {
+		return documentMapper.fromAttachedItem(attachedItemService.getItem(id));
+	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
index 9cb416ff02f582ac1b8d6e535ab583fb704a661f..4d965a689be4c55ce1a9909c85fa8e013eb2da7e 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
@@ -45,7 +45,7 @@ class BescheidGrpcServiceTest {
 		@Test
 		void shouldBuildResponse() {
 			when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
-			when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
+			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
 
 			service.getBescheidDraft(request, responseObserver);
 
@@ -56,7 +56,7 @@ class BescheidGrpcServiceTest {
 		void shouldCallNext() {
 			when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
 			when(service.buildResponse(any())).thenReturn(response);
-			when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
+			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
 
 			service.getBescheidDraft(request, responseObserver);
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..782c98d8cc4bc4066b43d34e9a45334d724ca7d5
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+
+class AttachedItemMapperTest {
+
+	@InjectMocks
+	private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class);
+
+	@Mock
+	private GrpcObjectMapper grpcObjectMapper;
+
+	@BeforeEach
+	void init() {
+		when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem());
+	}
+
+	@Test
+	void shouldMapFromVorgangAttachedItem() {
+		var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.setVersion(AttachedItemTestFactory.VERSION).build();
+
+		var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument());
+	}
+
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
index d81c4212494dea994091fafc85cc78f8d1b56ee7..107f4e3caa00e1fde61ad8d7b14bad6e0e62eb79 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
@@ -72,7 +72,7 @@ class AttachedItemServiceTest {
 
 		@Test
 		void shouldCallGetBescheidDraft() {
-			service.getBescheidItem(CommandTestFactory.VORGANG_ID);
+			service.findBescheidItem(CommandTestFactory.VORGANG_ID);
 
 			verify(remoteService).findBescheidDraft(CommandTestFactory.VORGANG_ID);
 		}
@@ -82,12 +82,33 @@ class AttachedItemServiceTest {
 			var expected = BescheidItemTestFactory.create();
 			when(remoteService.findBescheidDraft(anyString())).thenReturn(Optional.of(expected));
 
-			var actual = service.getBescheidItem(CommandTestFactory.VORGANG_ID);
+			var actual = service.findBescheidItem(CommandTestFactory.VORGANG_ID);
 
 			assertThat(actual).contains(expected);
 		}
 	}
 
+	@Nested
+	class TestGetBescheidItem {
+
+		@Test
+		void shouldCallGetBescheid() {
+			service.getBescheidItem(BescheidItemTestFactory.ID);
+
+			verify(remoteService).getBescheid(BescheidItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnBescheidItem() {
+			var expected = BescheidItemTestFactory.create();
+			when(remoteService.getBescheid(anyString())).thenReturn(expected);
+
+			var actual = service.getBescheidItem(BescheidItemTestFactory.ID);
+
+			assertThat(actual).isEqualTo(expected);
+		}
+	}
+
 	@Nested
 	class TestCreateBescheidDraft {
 
@@ -484,7 +505,7 @@ class AttachedItemServiceTest {
 		void shouldSetStatus() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS);
+			assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name());
 		}
 
 		@Test
@@ -706,4 +727,25 @@ class AttachedItemServiceTest {
 		}
 
 	}
+
+	@Nested
+	class TestGetItem {
+
+		@Test
+		void shouldCallRemoteService() {
+			service.getItem(BescheidItemTestFactory.ID);
+
+			verify(service).getItem(BescheidItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var expectedItem = AttachedItemTestFactory.createDocument();
+			doReturn(expectedItem).when(remoteService).getItem(any());
+
+			var result = service.getItem(BescheidItemTestFactory.ID);
+
+			assertThat(result).isEqualTo(expectedItem);
+		}
+	}
 }
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..56fb0e8ad3050b0dc143f888671c4ef9c59bb8f2
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
@@ -0,0 +1,95 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import de.ozgcloud.bescheid.attacheditem.AttachedItem.AttachedItemBuilder;
+import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.document.Document;
+import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.document.DocumentTestFactory;
+
+public class AttachedItemTestFactory {
+
+	public static final String ID = "bescheid-item-id";
+	public static final long VERSION = 10L;
+	public static final String CLIENT = "client";
+
+	public static final String BESCHEIDEN_AM = "2024-01-01";
+	public static final String BESCHEID_DOCUMENT = "bescheid-document";
+	public static final String ATTACHMENT = "attachment-id";
+	public static final String SEND_BY = "POSTFACH";
+	public static final String NACHRICHT_TEXT = "nachricht-text";
+	public static final String NACHRICHT_SUBJECT = "nachricht-subject";
+
+	public static AttachedItem createBescheid() {
+		return createBuilder()
+				.itemName(AttachedItemService.BESCHEID_ITEM_NAME)
+				.item(createBescheidItem())
+				.build();
+	}
+
+	public static Map<String, Object> createBescheidItem() {
+		return Map.of(
+				BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT,
+				BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM,
+				BescheidItem.FIELD_BEWILLIGT, true,
+				BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT,
+				BescheidItem.FIELD_ATTACHMENTS, List.of(ATTACHMENT),
+				BescheidItem.FIELD_SEND_BY, SEND_BY,
+				BescheidItem.FIELD_NACHRICHT_TEXT, NACHRICHT_TEXT,
+				BescheidItem.FIELD_NACHRICHT_SUBJECT, NACHRICHT_SUBJECT);
+	}
+
+	public static AttachedItem createDocument() {
+		return createDocumentBuilder().build();
+	}
+
+	public static AttachedItem.AttachedItemBuilder createDocumentBuilder() {
+		return createBuilder()
+				.itemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.item(createDocumentItem());
+	}
+
+	public static HashMap<String, Object> createDocumentItem() {
+		var map = new HashMap<String, Object>();
+		map.put(Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE);
+		map.put(Document.FIELD_DOCUMENT_FILE, DocumentTestFactory.DOCUMENT_FILE);
+		map.put(Document.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT);
+		map.put(Document.FIELD_NACHRICHT_SUBJECT, DocumentTestFactory.NACHRICHT_SUBJECT);
+		return map;
+	}
+
+	public static AttachedItemBuilder createBuilder() {
+		return AttachedItem.builder()
+				.id(ID)
+				.version(VERSION)
+				.client(CLIENT)
+				.vorgangId(CommandTestFactory.VORGANG_ID);
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java
index a223382773eb98f62703cb57c003b109a4552d14..027085c7c1c70681debd0503f3e1920c5620a039 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java
@@ -26,7 +26,8 @@ package de.ozgcloud.bescheid.attacheditem;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
-import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -179,8 +180,30 @@ class BescheidItemMapperTest {
 			assertThat(bescheid.getNachrichtSubject()).isEqualTo(BescheidItemTestFactory.NACHRICHT_SUBJECT);
 		}
 
+		@Test
+		void shouldCallToAttachments() {
+			var expectedAttachments = List.of(BescheidItemTestFactory.ATTACHMENT);
+			var bescheidItem = BescheidItemTestFactory.createBuilder()
+					.bescheidData(Map.of(BescheidItem.FIELD_ATTACHMENTS, expectedAttachments)).build();
+
+			mapper.toBescheid(bescheidItem);
+
+			verify(mapper).toAttachments(expectedAttachments);
+		}
+
+		@Test
+		void shouldNotCallToAttachments() {
+			var bescheidItem = BescheidItemTestFactory.createBuilder().bescheidData(Map.of()).build();
+
+			mapper.toBescheid(bescheidItem);
+
+			verify(mapper, never()).toAttachments(any());
+		}
+
 		@Test
 		void shouldSetAttachments() {
+			doReturn(List.of(BescheidItemTestFactory.ATTACHMENT)).when(mapper).toAttachments(any());
+
 			var bescheid = mapBescheid();
 
 			assertThat(bescheid.getAttachmentsList()).containsExactly(BescheidItemTestFactory.ATTACHMENT);
@@ -200,21 +223,35 @@ class BescheidItemMapperTest {
 			assertThat(bescheid.getVersion()).isEqualTo(BescheidItemTestFactory.VERSION);
 		}
 
-		@DisplayName("should skip add attachments when")
-		@ParameterizedTest(name = "attachments is {0}")
-		@NullAndEmptySource
-		void shouldSkipEmptyAttachments(String attachments) {
-			var bescheidData = new HashMap<String, Object>();
-			bescheidData.put(BescheidItem.FIELD_ATTACHMENTS, attachments);
-			var bescheidItem = BescheidItemTestFactory.createBuilder().bescheidData(bescheidData).build();
+		private GrpcBescheid mapBescheid() {
+			return mapper.toBescheid(BescheidItemTestFactory.create());
+		}
+	}
 
-			var result = mapper.toBescheid(bescheidItem);
+	@Nested
+	class TestToAttachments {
 
-			assertThat(result.getAttachmentsList()).isEmpty();
+		@Test
+		void shouldMapCollection() {
+			var result = mapper.toAttachments(List.of(BescheidItemTestFactory.ATTACHMENT));
+
+			assertThat(result).containsExactly(BescheidItemTestFactory.ATTACHMENT);
 		}
 
-		private GrpcBescheid mapBescheid() {
-			return mapper.toBescheid(BescheidItemTestFactory.create());
+		@Test
+		void shouldMapSingleValue() {
+			var result = mapper.toAttachments(BescheidItemTestFactory.ATTACHMENT);
+
+			assertThat(result).containsExactly(BescheidItemTestFactory.ATTACHMENT);
+		}
+
+		@DisplayName("should return null")
+		@ParameterizedTest(name = "when attachmentsObject is \"{0}\"")
+		@NullAndEmptySource
+		void shouldReturnNull(String attachmentsObject) {
+			var result = mapper.toAttachments(attachmentsObject);
+
+			assertThat(result).isNull();
 		}
 	}
 }
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java
index b053862753311d75651238ead6f5ae4492b6a124..1299edf5394b1d9a8ec0d804663dbd450b3d741c 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java
@@ -58,7 +58,7 @@ public class BescheidItemTestFactory {
 
 	public static Map<String,  Object> createBescheidBody() {
 		return Map.of(
-				BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS,
+				BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT,
 				BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM,
 				BescheidItem.FIELD_BEWILLIGT, true,
 				BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT,
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
index 257cbc65ee52e8660fa93be4912f321e01d8089e..444249e06cc391cd8b6d05304ab33f93134cb899 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
@@ -26,7 +26,6 @@
 package de.ozgcloud.bescheid.attacheditem;
 
 import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Map;
@@ -51,7 +50,6 @@ import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest;
 import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse;
 import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub;
 import io.grpc.ClientInterceptor;
-import io.grpc.StatusRuntimeException;
 
 class VorgangAttachedItemRemoteServiceTest {
 
@@ -67,6 +65,8 @@ class VorgangAttachedItemRemoteServiceTest {
 	private ClientInterceptor bescheidCallContextInterceptor;
 	@Mock
 	private BescheidItemMapper bescheidItemMapper;
+	@Mock
+	private AttachedItemMapper attachedItemMapper;
 
 	@Nested
 	class TestFindBescheidDraft {
@@ -130,11 +130,40 @@ class VorgangAttachedItemRemoteServiceTest {
 				verify(bescheidItemMapper).fromFindVorgangAttachedItemResponse(response);
 			}
 
+			@Test
+			void shouldCallHasStatusDraft() {
+				var item = BescheidItemTestFactory.create();
+				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item));
+
+				service.findBescheidDraft(request);
+
+				verify(service).hasStatusDraft(item);
+			}
+
 			@Test
 			void shouldFilterDraftItems() {
-				var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(
-						BescheidItem.FIELD_STATUS, "other")).build();
-				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1));
+				var item = BescheidItemTestFactory.create();
+				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item));
+				doReturn(true).when(service).hasStatusDraft(any());
+
+				var result = service.findBescheidDraft(request);
+
+				assertThat(result).contains(item);
+			}
+
+			@Test
+			void shouldReturnEmptyWhenNotFound() {
+				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.empty());
+
+				var result = service.findBescheidDraft(request);
+
+				assertThat(result).isEmpty();
+			}
+
+			@Test
+			void shouldReturnEmptyWhenNotDraft() {
+				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(BescheidItemTestFactory.create()));
+				doReturn(false).when(service).hasStatusDraft(any());
 
 				var result = service.findBescheidDraft(request);
 
@@ -144,10 +173,10 @@ class VorgangAttachedItemRemoteServiceTest {
 			@Test
 			void shouldReturnLastBescheid() {
 				var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(
-						BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01",
-						BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS)).build();
+						BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01")).build();
 				var item2 = BescheidItemTestFactory.create();
 				when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1, item2));
+				doReturn(true).when(service).hasStatusDraft(any());
 
 				var result = service.findBescheidDraft(request);
 
@@ -191,6 +220,30 @@ class VorgangAttachedItemRemoteServiceTest {
 		}
 	}
 
+	@Nested
+	class TestHasStatusDraft {
+
+		@Test
+		void shouldReturnTrueIfDraft() {
+			var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name()))
+					.build();
+
+			var result = service.hasStatusDraft(item);
+
+			assertThat(result).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalseIfNotDraft() {
+			var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.BESCHEID.name()))
+					.build();
+
+			var result = service.hasStatusDraft(item);
+
+			assertThat(result).isFalse();
+		}
+	}
+
 	@Nested
 	class TestGetBescheid {
 
@@ -255,15 +308,77 @@ class VorgangAttachedItemRemoteServiceTest {
 			assertThat(result).isEqualTo(expectedBescheid);
 		}
 
+		private BescheidItem getBescheid() {
+			return service.getBescheid(BescheidItemTestFactory.ID);
+		}
+	}
+
+	@Nested
+	class TestGetItem {
+
+		@Mock
+		private GrpcVorgangAttachedItemRequest grpcVorgangAttachedItemRequest;
+		@Mock
+		private GrpcVorgangAttachedItemResponse grpcVorgangAttachedItemResponse;
+		@Mock
+		private GrpcVorgangAttachedItem grpcVorgangAttachedItem;
+
+		@BeforeEach
+		void init() {
+			when(serviceStub.getById(any())).thenReturn(grpcVorgangAttachedItemResponse);
+			doReturn(serviceStub).when(service).getServiceStub();
+		}
+
 		@Test
-		void shouldThrowExceptionIfNotFound() {
-			when(serviceStub.getById(any())).thenThrow(StatusRuntimeException.class);
+		void shouldCallGetServiceStab() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
 
-			assertThrows(StatusRuntimeException.class, this::getBescheid);
+			verify(service).getServiceStub();
 		}
 
-		private BescheidItem getBescheid() {
-			return service.getBescheid(BescheidItemTestFactory.ID);
+		@Test
+		void shouldCallBuildRequest() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
+
+			verify(service).buildGetByIdRequest(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallGetById() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+			doReturn(grpcVorgangAttachedItemRequest).when(service).buildGetByIdRequest(any());
+
+			getItem();
+
+			verify(serviceStub).getById(grpcVorgangAttachedItemRequest);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
+
+			verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
+		}
+
+		@Test
+		void shouldReturnFoundBescheid() {
+			var expectedItem = AttachedItemTestFactory.createDocument();
+			when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedItem);
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			var result = getItem();
+
+			assertThat(result).isEqualTo(expectedItem);
+		}
+
+		private AttachedItem getItem() {
+			return service.getItem(BescheidItemTestFactory.ID);
 		}
 	}
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java
deleted file mode 100644
index a7f40a347744785b1be6cee7580c7efe9cfceddd..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.
- */
-package de.ozgcloud.document;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Map;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.Spy;
-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 de.ozgcloud.apilib.common.command.OzgCloudCommand;
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.bescheid.common.callcontext.UserProfile;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEventTestFactory;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.test.ITCase;
-
-@SpringBootTest(classes = DocumentTestApplication.class)
-@ITCase
-class DocumentEventListenerITCase {
-
-	@Spy
-	@Autowired
-	private ApplicationEventPublisher eventPublisher;
-
-	@SpyBean
-	private DocumentEventListener documentEventListener;
-
-	@MockBean
-	private OzgCloudCommandService ozgCloudCommandService;
-	@MockBean
-	private CommandMapper commandMapper;
-	@MockBean
-	private CurrentUserService userService;
-
-	@Mock
-	private UserProfile userProfile;
-
-	@BeforeEach
-	void init() {
-		when(userService.getUserProfile()).thenReturn(userProfile);
-	}
-
-	@Nested
-	class TestCreateBescheidDocument {
-
-		private static final String CREATED_RESOURCE_ID = "created-resource-id";
-
-		@Mock
-		private OzgCloudCommand executedCommand;
-
-		@Captor
-		private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor;
-
-		private Command command = CommandTestFactory.createBuilder()
-				.order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER)
-				.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, "file-id"))
-				.build();
-
-		@Test
-		void shouldPublishBescheidDocumentCreatedEvent() {
-			when(executedCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE_ID);
-			when(ozgCloudCommandService.createAndWaitUntilDone(any())).thenReturn(executedCommand);
-
-			eventPublisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(documentEventListener, timeout(60000)).publishEvent(documentCreatedEventCaptor.capture());
-			assertThat(documentCreatedEventCaptor.getValue()).satisfies(event -> {
-				assertThat(event.getCommand()).isEqualTo(command);
-				assertThat(event.getCreatedResource()).isEqualTo(CREATED_RESOURCE_ID);
-			});
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2157ed90a4161e3e67bfd1dcc30f0010c5ca390
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+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 io.grpc.stub.StreamObserver;
+
+class DocumentGrpcServiceTest {
+
+	@Spy
+	@InjectMocks
+	private DocumentGrpcService service;
+
+	@Mock
+	private DocumentService documentService;
+	@Mock
+	private DocumentMapper documentMapper;
+
+	@Nested
+	class TestGetDocument {
+
+		private final static GrpcGetDocumentRequest REQUEST = GrpcGetDocumentRequest.newBuilder().setId(DocumentTestFactory.ID).build();
+
+		@Mock
+		private GrpcGetDocumentResponse response;
+		@Mock
+		private StreamObserver<GrpcGetDocumentResponse> responseObserver;
+
+		@BeforeEach
+		void init() {
+			doReturn(response).when(service).buildGetDocumentResponse(any());
+		}
+
+		@Test
+		void shouldCallDocumentService() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(documentService).getDocument(DocumentTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallBuildResponse() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(service).buildGetDocumentResponse(any());
+		}
+
+		@Test
+		void shouldCallOnNext() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(responseObserver).onNext(response);
+		}
+
+		@Test
+		void shouldCallOnCompleted() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(responseObserver).onCompleted();
+		}
+	}
+
+	@Nested
+	class TestBuildGetDocumentResponse {
+
+		@Mock
+		private GrpcDocument grpcDocument;
+
+		@BeforeEach
+		void init() {
+			when(documentMapper.toGrpcDocument(any())).thenReturn(grpcDocument);
+		}
+
+		@Test
+		void shouldCallDocumentMapper() {
+			var document = DocumentTestFactory.create();
+
+			service.buildGetDocumentResponse(document);
+
+			verify(documentMapper).toGrpcDocument(document);
+		}
+
+		@Test
+		void shouldSetDocument() {
+			var result = service.buildGetDocumentResponse(DocumentTestFactory.create());
+
+			assertThat(result.getDocument()).isEqualTo(grpcDocument);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ba02e1e11c796f19fc771e9ed29000f911690cd
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+
+class DocumentMapperTest {
+
+	private DocumentMapper mapper = Mappers.getMapper(DocumentMapper.class);
+
+	@DisplayName("To grpc document")
+	@Nested
+	class TestToGrpcDocument {
+
+		@Test
+		void shouldMapDocument() {
+			var result = mapper.toGrpcDocument(DocumentTestFactory.create());
+
+			assertThat(result).usingRecursiveComparison().isEqualTo(GrpcDocumentTestFactory.create());
+		}
+
+		@Test
+		void shouldMapEmptyDocument() {
+			var result = mapper.toGrpcDocument(Document.builder().build());
+
+			assertThat(result).isEqualTo(GrpcDocument.newBuilder().build());
+		}
+	}
+
+	@DisplayName("From attached item")
+	@Nested
+	class TestFromAttachedItem {
+
+		@Test
+		void shouldMapId() {
+			var document = AttachedItemTestFactory.createDocument();
+
+			var result = mapper.fromAttachedItem(document);
+
+			assertThat(result.getId()).isEqualTo(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldMapType() {
+			var document = AttachedItemTestFactory.createDocument();
+
+			var result = mapper.fromAttachedItem(document);
+
+			assertThat(result.getType()).isEqualTo(DocumentService.DOCUMENT_TYPE);
+		}
+
+		@Test
+		void shouldMapFileId() {
+			var document = AttachedItemTestFactory.createDocument();
+
+			var result = mapper.fromAttachedItem(document);
+
+			assertThat(result.getFileId()).isEqualTo(DocumentTestFactory.DOCUMENT_FILE);
+		}
+
+		@Test
+		void shouldMapNachrichtText() {
+			var document = AttachedItemTestFactory.createDocument();
+
+			var result = mapper.fromAttachedItem(document);
+
+			assertThat(result.getNachrichtText()).isEqualTo(DocumentTestFactory.NACHRICHT_TEXT);
+		}
+
+		@Test
+		void shouldMapNachrichtSubject() {
+			var document = AttachedItemTestFactory.createDocument();
+
+			var result = mapper.fromAttachedItem(document);
+
+			assertThat(result.getNachrichtSubject()).isEqualTo(DocumentTestFactory.NACHRICHT_SUBJECT);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
index 559c3bc73436f3d87fd4df9e07b12f29d3eb74ef..736947b3a9ede6e9fbd04893ae3f6079887b4fcd 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
@@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.web.server.ResponseStatusException;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
@@ -42,7 +43,10 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.apilib.common.datatypes.GenericId;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
+import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
 import de.ozgcloud.bescheid.attacheditem.BescheidItem;
+import de.ozgcloud.bescheid.attacheditem.BescheidItemTestFactory;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandTestFactory;
 import de.ozgcloud.common.errorhandling.TechnicalException;
@@ -60,6 +64,10 @@ class DocumentServiceTest {
 	private OzgCloudCommandService commandService;
 	@Mock
 	private CommandMapper commandMapper;
+	@Mock
+	private AttachedItemService attachedItemService;
+	@Mock
+	private DocumentMapper documentMapper;
 
 	private Command command = CommandTestFactory.createBuilder()
 			.relationId(RELATION_ID)
@@ -76,6 +84,14 @@ class DocumentServiceTest {
 		@BeforeEach
 		void init() {
 			when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand);
+			doNothing().when(service).validateBescheidItem(any());
+		}
+
+		@Test
+		void shouldCallValidateBescheidItem() {
+			service.createBescheidDocument(command);
+
+			verify(service).validateBescheidItem(RELATION_ID);
 		}
 
 		@Test
@@ -104,6 +120,44 @@ class DocumentServiceTest {
 		}
 	}
 
+	@Nested
+	class TestValidateBescheidItem {
+
+		@Test
+		void shouldCallGetBescheidItem() {
+			when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create());
+
+			validateBescheidItem();
+
+			verify(attachedItemService).getBescheidItem(BescheidItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldThrowExceptionWhenNoBescheidDraft() {
+			when(attachedItemService.getBescheidItem(any())).thenThrow(ResponseStatusException.class);
+
+			assertThrows(ResponseStatusException.class, this::validateBescheidItem);
+		}
+
+		@Test
+		void shouldNotThrowExceptionIfNotDraft() {
+			when(attachedItemService.getBescheidItem(any())).thenReturn(
+					BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, "not-draft")).build());
+
+			assertThrows(TechnicalException.class, this::validateBescheidItem);
+		}
+
+		@Test
+		void shouldValidateBescheidItem() {
+			when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create());
+
+			assertDoesNotThrow(this::validateBescheidItem);
+		}
+		void validateBescheidItem() {
+			service.validateBescheidItem(BescheidItemTestFactory.ID);
+		}
+	}
+
 	@Nested
 	class TestBuildCreateDocumentOzgCommand {
 
@@ -135,7 +189,7 @@ class DocumentServiceTest {
 		void shouldCallRelationIdMapper() {
 			service.buildCreateDocumentOzgCommand(command);
 
-			verify(commandMapper).mapRelationId(RELATION_ID);
+			verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID);
 		}
 
 		@Test
@@ -242,4 +296,34 @@ class DocumentServiceTest {
 		}
 	}
 
+	@Nested
+	class TestGetDocument {
+
+		@Test
+		void shouldCallAttachedItemService() {
+			service.getDocument(AttachedItemTestFactory.ID);
+
+			verify(attachedItemService).getItem(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallDocumentMapper() {
+			var expectedItem  = AttachedItemTestFactory.createDocument();
+			when(attachedItemService.getItem(any())).thenReturn(expectedItem);
+
+			service.getDocument(AttachedItemTestFactory.ID);
+
+			verify(documentMapper).fromAttachedItem(expectedItem);
+		}
+
+		@Test
+		void shouldReturnDocument() {
+			var expectedDocument = DocumentTestFactory.create();
+			when(documentMapper.fromAttachedItem(any())).thenReturn(expectedDocument);
+
+			Document document = service.getDocument(AttachedItemTestFactory.ID);
+
+			assertThat(document).isEqualTo(expectedDocument);
+		}
+	}
 }
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..0484d6f5492a0b4fe72bbd87b6980797c9bb6110
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import de.ozgcloud.document.Document.DocumentBuilder;
+
+public class DocumentTestFactory {
+
+	public static final String ID = "documentId";
+	public static final String TYPE = "type";
+	public static final String DOCUMENT_FILE = "file-id";
+	public static final String NACHRICHT_SUBJECT = "subject";
+	public static final String NACHRICHT_TEXT = "text";
+
+	public static Document create() {
+		return createBuilder().build();
+	}
+
+	public static DocumentBuilder createBuilder() {
+		return Document.builder()
+				.id(ID)
+				.type(TYPE)
+				.fileId(DOCUMENT_FILE)
+				.nachrichtSubject(NACHRICHT_SUBJECT)
+				.nachrichtText(NACHRICHT_TEXT);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c56530f7b13a986c3cd6fd0914bfc9201d152b7
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+public class GrpcDocumentTestFactory {
+
+	public static GrpcDocument create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcDocument.Builder createBuilder() {
+		return GrpcDocument.newBuilder()
+				.setId(DocumentTestFactory.ID)
+				.setType(DocumentTestFactory.TYPE)
+				.setFileId(DocumentTestFactory.DOCUMENT_FILE)
+				.setNachrichtSubject(DocumentTestFactory.NACHRICHT_SUBJECT)
+				.setNachrichtText(DocumentTestFactory.NACHRICHT_TEXT);
+	}
+}
diff --git a/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml b/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml
index e0effc809597979a1cdb01c636f868c63574f617..95cd70f64a419cc1e585a2f977f48d45aae0eaee 100644
--- a/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml
+++ b/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml
@@ -44,6 +44,9 @@ spec:
           component: vorgang-manager
 {{- with (.Values.networkPolicy).additionalIngressConfig }}
 {{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalIngressConfigNamespace }}
+{{ toYaml . | indent 2 }}
 {{- end }}
   egress:
   - to:
@@ -62,5 +65,8 @@ spec:
 {{- with (.Values.networkPolicy).additionalEgressConfig }}
 {{ toYaml . | indent 2 }}
 {{- end }}
+{{- with (.Values.networkPolicy).additionalEgressConfigNamespace }}
+{{ toYaml . | indent 2 }}
+{{- end }}
 
 {{- end }}
\ No newline at end of file
diff --git a/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml b/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml
index 78236b32067b019da7497306962f0fd74d7d9307..e097f3b15d2c12e7043830c5ba2d794302f07da4 100644
--- a/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml
+++ b/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml
@@ -33,6 +33,8 @@ tests:
     asserts:
       - isKind:
           of: ConfigMap
+      - isAPIVersion:
+          of: v1
       - equal:
           path: metadata.name
           value: bindings-type
diff --git a/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml b/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml
index 7382ad0947be9db238ff1b5d7f9de08439716165..6942329e62a7ca2a0544cc56d6f3d6d76e9b2120 100644
--- a/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml
+++ b/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml
@@ -91,16 +91,15 @@ tests:
                 - port: 5353
                   protocol: TCP
 
-  - it: add ingress rule by values
+  - it: should add additionalIngressConfig
     set:
       networkPolicy:
-        ssoPublicIp: 51.89.117.53/32
-        dnsServerNamespace: test-namespace-dns
+        dnsServerNamespace: test-dns-namespace
         additionalIngressConfig:
         - from:
           - podSelector: 
               matchLabels:
-                component: client2
+                additionalIngressConfig: yes
     asserts:
       - contains:
           path: spec.ingress
@@ -108,41 +107,62 @@ tests:
             from:
             - podSelector: 
                 matchLabels:
-                  component: client2
+                  additionalIngressConfig: yes
 
-  - it: add egress rules by values
+  - it: should add additionalEgressConfig
     set:
-      networkPolicy:
+      networkPolicy: 
+        dnsServerNamespace: test-dns-namespace
         additionalEgressConfig:
-        - to:
-          - ipBlock:
-              cidr: 1.2.3.4/32
         - to:
           - podSelector:
               matchLabels:
-                component: ozg-testservice
-          ports:
-            - port: 12345
-              protocol: TCP
-
-        dnsServerNamespace: test-dns-namespace
+                additionalEgressConfig: yes
     asserts:
     - contains:
         path: spec.egress
         content:
           to:
-          - ipBlock:
-              cidr: 1.2.3.4/32
+          - podSelector:
+              matchLabels:
+                additionalEgressConfig: yes
+
+
+  - it: should add additionalIngressConfigNamespace
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+        additionalIngressConfigNamespace:
+        - from:
+          - podSelector: 
+              matchLabels:
+                additionalIngressConfigNamespace: yes
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+            - podSelector: 
+                matchLabels:
+                  additionalIngressConfigNamespace: yes
+
+  - it: should add additionalEgressConfigNamespace
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+        additionalEgressConfigNamespace:
+        - to:
+          - podSelector:
+              matchLabels:
+                additionalEgressConfigNamespace: yes
+    asserts:
     - contains:
         path: spec.egress
         content:
           to:
           - podSelector:
               matchLabels:
-                component: ozg-testservice
-          ports:
-            - port: 12345
-              protocol: TCP
+                additionalEgressConfigNamespace: yes
 
   - it: test network policy disabled
     set:
diff --git a/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java b/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java
index 111b14522559611bb2dc1ecbc863daae75084786..aa80911f97481bd1fafbe0b11d30e53fc6713d61 100644
--- a/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java
+++ b/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java
@@ -6,6 +6,7 @@ import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto;
 public class GrpcServiceKontoTestFactory {
 
 	public final static String TYPE = "OSI";
+	public final static String TRUST_LEVEL = "STORK-QAA-LEVEL-1";
 
 	public static GrpcServiceKonto create() {
 		return createBuilder().build();
@@ -14,6 +15,7 @@ public class GrpcServiceKontoTestFactory {
 	public static GrpcServiceKonto.Builder createBuilder() {
 		return GrpcServiceKonto.newBuilder()
 				.setType(TYPE)
+				.setTrustLevel(TRUST_LEVEL)
 				.addPostfachAddresses(GrpcPostfachAddressTestFactory.create());
 	}
 }
diff --git a/run_helm_test.sh b/run_helm_test.sh
index 08bccc2c0621f2a7c960924c8bddf3187d0f2647..2bae426e6327e0d169891a6cd4eec42cd5377d87 100755
--- a/run_helm_test.sh
+++ b/run_helm_test.sh
@@ -5,5 +5,4 @@ set -x
 
 helm template  ./src/main/helm/ -f src/test/helm-linter-values.yaml
 helm lint -f src/test/helm-linter-values.yaml ./src/main/helm/
-cd src/main/helm && helm unittest -f '../../test/helm/**/*test.yaml'  .
-
+cd src/main/helm && helm unittest -f '../../test/helm/**/*test.yaml'  .
\ No newline at end of file
diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl
index 71d217abeb2c2927cf55d228823a9f4b11a1065c..b6728207b5b86dec00472dc1b8fdc2ef70741462 100644
--- a/src/main/helm/templates/_helpers.tpl
+++ b/src/main/helm/templates/_helpers.tpl
@@ -41,12 +41,6 @@ app.kubernetes.io/name: {{ .Release.Name }}
 app.kubernetes.io/namespace: {{ include "app.namespace" . }}
 {{- end -}}
 
-{{- define "app.imagePullSecret" }}
-{{- with .Values.imageCredentials }}
-{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"email\":\"%s\",\"auth\":\"%s\"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }}
-{{- end }}
-{{- end }}
-
 {{- define "app.envSpringProfiles" }}
 {{- if (.Values.env).overrideSpringProfiles -}}
 {{ printf "%s" (.Values.env).overrideSpringProfiles }}
diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml
index 711c0d02bed2c1fb0c81025ae0d25b467df2962c..7a17fea9c78bd89a2367bcc0dc002618d30ddc81 100644
--- a/src/main/helm/templates/deployment.yaml
+++ b/src/main/helm/templates/deployment.yaml
@@ -328,11 +328,7 @@ spec:
       dnsConfig: {}
       dnsPolicy: ClusterFirst
       imagePullSecrets:
-      {{- if .Values.imagePullSecret }}
-      - name: {{ .Values.imagePullSecret }}
-      {{ else }}
-      - name: vorgang-manager-image-pull-secret
-      {{- end }}
+      - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }}
       restartPolicy: Always
       {{- with .Values.hostAliases }}
       hostAliases:
diff --git a/src/main/helm/templates/image-pull-secret.yaml b/src/main/helm/templates/image-pull-secret.yaml
deleted file mode 100644
index 3fe7a2fb6f60d52c8cee42df906d7e20f025f226..0000000000000000000000000000000000000000
--- a/src/main/helm/templates/image-pull-secret.yaml
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
-# Ministerpräsidenten des Landes Schleswig-Holstein
-# Staatskanzlei
-# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
-#
-# Lizenziert unter der EUPL, Version 1.2 oder - sobald
-# diese von der Europäischen Kommission genehmigt wurden -
-# Folgeversionen der EUPL ("Lizenz");
-# Sie dürfen dieses Werk ausschließlich gemäß
-# dieser Lizenz nutzen.
-# Eine Kopie der Lizenz finden Sie hier:
-#
-# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
-#
-# Sofern nicht durch anwendbare Rechtsvorschriften
-# gefordert oder in schriftlicher Form vereinbart, wird
-# die unter der Lizenz verbreitete Software "so wie sie
-# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
-# ausdrücklich oder stillschweigend - verbreitet.
-# Die sprachspezifischen Genehmigungen und Beschränkungen
-# unter der Lizenz sind dem Lizenztext zu entnehmen.
-#
-
-{{- if not (.Values.imagePullSecret) }}
-apiVersion: v1
-kind: Secret
-metadata:
-  name: vorgang-manager-image-pull-secret
-  namespace: {{ include "app.namespace" . }}
-type: kubernetes.io/dockerconfigjson
-data:
-  .dockerconfigjson: {{ include "app.imagePullSecret" . }}
-{{- end }}
\ No newline at end of file
diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml
index fb20373df7e5cf5c1045657b25fb3df4057f48cc..88ad059ed4898240276aa3f9a0dc05775705a87e 100644
--- a/src/main/helm/templates/network_policy.yaml
+++ b/src/main/helm/templates/network_policy.yaml
@@ -47,6 +47,9 @@ spec:
           ozg-component: eingangsadapter
 {{- with (.Values.networkPolicy).additionalIngressConfig }}
 {{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalIngressConfigNamespace }}
+{{ toYaml . | indent 2 }}
 {{- end }}
   egress:
   - to:
@@ -101,5 +104,8 @@ spec:
 {{- with (.Values.networkPolicy).additionalEgressConfig }}
 {{ toYaml . | indent 2 }}
 {{- end }}
+{{- with (.Values.networkPolicy).additionalEgressConfigNamespace }}
+{{ toYaml . | indent 2 }}
+{{- end }}
 
 {{- end }}
\ No newline at end of file
diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml
index ad11ce9887d4137c9b708fa65d8f8662c5454476..047b472e2225090f010e1f297a03a7a660062eb1 100644
--- a/src/test/helm-linter-values.yaml
+++ b/src/test/helm-linter-values.yaml
@@ -28,4 +28,6 @@ ozgcloud:
     address: https://info-manager.my-wonderful-domain.local:9000
 
 networkPolicy:
-  dnsServerNamespace: test-dns-namespace
\ No newline at end of file
+  dnsServerNamespace: test-dns-namespace
+
+imagePullSecret: test-image-pull-secret
\ No newline at end of file
diff --git a/src/test/helm/configmap_bindings_type_test.yaml b/src/test/helm/configmap_bindings_type_test.yaml
index 78236b32067b019da7497306962f0fd74d7d9307..e097f3b15d2c12e7043830c5ba2d794302f07da4 100644
--- a/src/test/helm/configmap_bindings_type_test.yaml
+++ b/src/test/helm/configmap_bindings_type_test.yaml
@@ -33,6 +33,8 @@ tests:
     asserts:
       - isKind:
           of: ConfigMap
+      - isAPIVersion:
+          of: v1
       - equal:
           path: metadata.name
           value: bindings-type
diff --git a/src/test/helm/deployment_63_chars_test.yaml b/src/test/helm/deployment_63_chars_test.yaml
index 3495fae61e183cdfd1d2e810ddd2dcc2ace6ad22..a84ec6d6698acc0c874b72e9d5c76f425de07b7e 100644
--- a/src/test/helm/deployment_63_chars_test.yaml
+++ b/src/test/helm/deployment_63_chars_test.yaml
@@ -35,6 +35,7 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 
 tests:
   - it: should fail on .Release.Namespace length longer than 63 characters
diff --git a/src/test/helm/deployment_actuator_test.yaml b/src/test/helm/deployment_actuator_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b01fbbe154949e3b3198fc648fab4b1ce605c87a
--- /dev/null
+++ b/src/test/helm/deployment_actuator_test.yaml
@@ -0,0 +1,66 @@
+#
+# 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.
+#
+
+suite: test deployment actuator 
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: test-image-pull-secret
+tests:
+  - it: check readiness and startup probe
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe
+          value:
+            failureThreshold: 3
+            httpGet:
+              path: /actuator/health/readiness
+              port: 8081
+              scheme: HTTP
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 3
+                                
+      - equal: 
+          path: spec.template.spec.containers[0].startupProbe
+          value: 
+            failureThreshold: 10
+            httpGet:
+              path: /actuator/health/readiness
+              port: 8081
+              scheme: HTTP
+            initialDelaySeconds: 30
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 5
+
+
+
+
+
diff --git a/src/test/helm/deployment_bayernid_test.yaml b/src/test/helm/deployment_bayernid_test.yaml
index 4f662d913bc841f73abf47289ef5c1b7095858a5..f0dee5aaac2e396ea171e929e934bc1b71ddf51e 100644
--- a/src/test/helm/deployment_bayernid_test.yaml
+++ b/src/test/helm/deployment_bayernid_test.yaml
@@ -42,10 +42,9 @@ set:
         dienst: "dienst"
         mandant: "mandant"
         gemeindeSchluessel: "gemeindeSchluessel"
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should enable bayernid
-    templates:
-      - templates/deployment.yaml
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml
index fed0968f63f66c4471c76957858b2a5e27d312c5..d4fa53ca7d43e4998315ec2cfb4f42bc5bd5e3de 100644
--- a/src/test/helm/deployment_bindings_test.yaml
+++ b/src/test/helm/deployment_bindings_test.yaml
@@ -31,9 +31,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should have volumes
-    template: deployment.yaml
     set: 
        usermanagerName: user-manager
     asserts:
@@ -45,7 +45,6 @@ tests:
             subPath: ca.crt
             readOnly: true
   - it: should have volume for user-manager-tls-certificate
-    template: deployment.yaml
     set: 
        usermanagerName: user-manager
     asserts:
diff --git a/src/test/helm/deployment_test.yaml b/src/test/helm/deployment_container_basic_test.yaml
similarity index 57%
rename from src/test/helm/deployment_test.yaml
rename to src/test/helm/deployment_container_basic_test.yaml
index 930892966926123411689524b81e518be23ff059..876b4714aafe538e7c080057c54abd65bfac478d 100644
--- a/src/test/helm/deployment_test.yaml
+++ b/src/test/helm/deployment_container_basic_test.yaml
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# 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
@@ -22,7 +22,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test Vorgangfilter general values
+suite: test deployment container basics
 release:
   name: vorgang-manager
   namespace: sh-helm-test
@@ -31,12 +31,30 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
-  - it: testIsDeployment
-    template: deployment.yaml
+  - it: should have correct values for container image, name, imagePullPolicy
     asserts:
-      - isKind:
-          of: Deployment
       - equal:
           path: spec.template.spec.containers[0].image
           value: docker.ozg-sh.de/vorgang-manager:latest
+      - equal:
+          path: spec.template.spec.containers[0].name
+          value: vorgang-manager
+      - equal: 
+          path: spec.template.spec.containers[0].imagePullPolicy
+          value: Always
+  - it: should have correct values for container ports
+    asserts:
+      - contains: 
+          path: spec.template.spec.containers[0].ports
+          content:  
+            containerPort: 9090
+            name: grpc-9090
+            protocol: TCP
+      - contains: 
+          path: spec.template.spec.containers[0].ports
+          content:  
+            containerPort: 8081
+            name: metrics
+            protocol: TCP
\ No newline at end of file
diff --git a/src/test/helm/deployment_container_security_context_test.yaml b/src/test/helm/deployment_container_security_context_test.yaml
index f3638e95aa39c33c1afd7ebf6860a68367a50ce7..11aef905bd2c4cbfe7fbcdd88ddaab437f0d4d4a 100644
--- a/src/test/helm/deployment_container_security_context_test.yaml
+++ b/src/test/helm/deployment_container_security_context_test.yaml
@@ -22,7 +22,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test deployment
+suite: test deployment security context
 release:
   name: vorgang-manager
   namespace: sh-helm-test
@@ -31,11 +31,10 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check default values
     asserts:
-      - isKind:
-          of: Deployment
       - equal:
           path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation
           value: false
diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml
index 08f277ac27db074e7936b0fc2c7af85efb749301..2cf86a63ea9c342d7c5f6553cbba061eb8e367af 100644
--- a/src/test/helm/deployment_defaults_labels_test.yaml
+++ b/src/test/helm/deployment_defaults_labels_test.yaml
@@ -22,17 +22,16 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test deployment
+suite: test deployment defualt labels
 release:
   name: vorgang-manager
   namespace: sh-helm-test
 templates:
   - templates/deployment.yaml
-  - templates/service.yaml
-  - templates/service_monitor.yaml
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check default labels
     asserts:
@@ -49,26 +48,10 @@ tests:
           path: metadata.labels["app.kubernetes.io/namespace"]
           value: sh-helm-test
   - it: check component label for deployment
-    templates:
-      - templates/deployment.yaml
     asserts:
       - equal:
           path: spec.template.metadata.labels["component"]
           value: vorgang-manager
-  - it: check component label for service
-    templates:
-      - templates/service.yaml
-    asserts:
-      - equal:
-          path: metadata.labels["component"]
-          value: vorgang-manager-service
-  - it: check component label for service monitor
-    templates:
-      - templates/service_monitor.yaml
-    asserts:
-      - equal:
-          path: metadata.labels["component"]
-          value: vorgang-manager-service-monitor
 
   - it: should have label for mongodb client
     asserts:
diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b5e90a80698041766edbf65b61e54943b2a8f032
--- /dev/null
+++ b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml
@@ -0,0 +1,50 @@
+#
+# 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.
+#
+
+suite: test deployment topology spread constrains
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:  
+  ozgcloud:
+    environment: test
+  imagePullSecret: test-image-pull-secret
+ 
+tests:
+  - it: check default values of spec.template.spec.topologySpreadConstraints
+    asserts:
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+          value: 1
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+          value: kubernetes.io/hostname
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+          value: ScheduleAnyway
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"]
+          value: vorgang-manager
\ No newline at end of file
diff --git a/src/test/helm/elasticsearch_deployment_test.yaml b/src/test/helm/deployment_elasticsearch_test.yaml
similarity index 98%
rename from src/test/helm/elasticsearch_deployment_test.yaml
rename to src/test/helm/deployment_elasticsearch_test.yaml
index 6dc0ed45bd0aa299b30ca0d45e06760396ff0248..2da7a513b36639efde128078b9fd5c0d0876c30e 100644
--- a/src/test/helm/elasticsearch_deployment_test.yaml
+++ b/src/test/helm/deployment_elasticsearch_test.yaml
@@ -28,9 +28,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check if elastic credentials are disabled by default
-    template: deployment.yaml
     asserts:
       - notContains:
           path: spec.template.spec.containers[0].env
@@ -89,7 +89,6 @@ tests:
 
 
   - it: smoke test if elasticsearch is disabled when set to false
-    template: deployment.yaml
     set:
       ozgcloud.environment: test
       database.password: hase
@@ -106,7 +105,6 @@ tests:
                 optional: false
 
   - it: check enabled elastic credentials
-    template: deployment.yaml
     set:
       elasticsearch.enabled: true
     asserts:
diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml
index 7c48f92fc3d6707ea82ff187e16eccf852d4e9ef..f4306525a9696b7c8c57b8dfe940712c09ad516c 100644
--- a/src/test/helm/deployment_env_test.yaml
+++ b/src/test/helm/deployment_env_test.yaml
@@ -28,9 +28,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check customList
-    template: deployment.yaml
     set:
       env.customList:
         - name: my_test_environment_name
@@ -43,7 +43,6 @@ tests:
             value: "A test value"
 
   - it: check customList test value is not set by default
-    template: deployment.yaml
     asserts:
       - notContains:
           path: spec.template.spec.containers[0].env
@@ -52,7 +51,6 @@ tests:
             value: "A test value"
 
   - it: should have processor configuration
-    template: deployment.yaml
     set:
       ozgcloud:
         environment: dev
diff --git a/src/test/helm/deployment_grpc_info_manager_address_test.yaml b/src/test/helm/deployment_grpc_info_manager_address_test.yaml
index 11542072c3ac471655983e96221d368c677d49aa..763578ba556ba1c456cdfa7f9d5969b818d13119 100644
--- a/src/test/helm/deployment_grpc_info_manager_address_test.yaml
+++ b/src/test/helm/deployment_grpc_info_manager_address_test.yaml
@@ -35,6 +35,7 @@ tests:
         environment: dev
         infoManager: 
           address: https://info-manager.my-wonderful-domain.local:9000
+      imagePullSecret: test-image-pull-secret
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deployment_grpc_user_manager_address_test.yaml b/src/test/helm/deployment_grpc_user_manager_address_test.yaml
index 016fca501d0c9a9a91b0634e9e0a15f42bb214c5..1e31f050c93476fd389121baed48304cd9b58747 100644
--- a/src/test/helm/deployment_grpc_user_manager_address_test.yaml
+++ b/src/test/helm/deployment_grpc_user_manager_address_test.yaml
@@ -31,10 +31,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should set the grpc user-manager client address
-    templates:
-      - templates/deployment.yaml  
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
@@ -42,8 +41,6 @@ tests:
             name: grpc_client_user-manager_address
             value: user-manager.sh-helm-test:9000
   - it: should contain default user-manager grpc negotiationType tls
-    templates:
-      - templates/deployment.yaml
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
@@ -51,8 +48,6 @@ tests:
             name: grpc_client_user-manager_negotiationType
             value: TLS
   - it: should contain user-manager grpc negotiationType plaintext
-    templates:
-      - templates/deployment.yaml
     set:
       userManager.grpcClientNegotiationType: PLAINTEXT
     asserts:
diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml
index 9f0fc25fe2aacb237130c90425a8e6c4a363bef3..549c387c725ba385235a1a6389da8d67a4e22520 100644
--- a/src/test/helm/deployment_host_aliases_test.yaml
+++ b/src/test/helm/deployment_host_aliases_test.yaml
@@ -31,6 +31,7 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should not set hostAliases
     asserts:
diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml
index 8d096eeba8850f1616715c79b58e2845ca64b465..a509da8e68281789a9454d33c4c5e018a63698b4 100644
--- a/src/test/helm/deployment_imagepull_secret_test.yaml
+++ b/src/test/helm/deployment_imagepull_secret_test.yaml
@@ -22,7 +22,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test deployment
+suite: test deployment image pull secret
 release:
   name: vorgang-manager
   namespace: sh-helm-test
@@ -32,19 +32,14 @@ set:
   ozgcloud:
     environment: dev
 tests:
-  - it: should use default imagePull secret
-    asserts:
-      - isKind:
-          of: Deployment
-      - equal:
-          path: spec.template.spec.imagePullSecrets[0].name
-          value: vorgang-manager-image-pull-secret
   - it: should set the imagePull secret
     set:
       imagePullSecret: image-pull-secret
     asserts:
-      - isKind:
-          of: Deployment
       - equal:
           path: spec.template.spec.imagePullSecrets[0].name
-          value: image-pull-secret
\ No newline at end of file
+          value: image-pull-secret
+  - it: should fail if the imagePull secret not set
+    asserts:
+      - failedTemplate:
+            errorMessage: imagePullSecret must be set
\ No newline at end of file
diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml
index 82db783bcdb7deece5d0a346b2675305fce48582..6eb925f2db9adf6854a03cded85538fccb066d1f 100644
--- a/src/test/helm/deployment_liveness_probe_test.yaml
+++ b/src/test/helm/deployment_liveness_probe_test.yaml
@@ -31,15 +31,14 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: livenessProbe should be disabled by default
-    template: deployment.yaml
     asserts:
       - notExists:
           path: spec.template.spec.containers[0].livenessProbe
 
   - it: enable livenessProbe
-    template: deployment.yaml
     set:
       enableLivenessProbe: true
     asserts:
@@ -54,3 +53,8 @@ tests:
             periodSeconds: 10
             successThreshold: 1
             timeoutSeconds: 3
+  - it: not enable livenessProbe by default
+    asserts:
+      - isNull:
+          path: spec.template.spec.containers[0].livenessProbe
+          
\ No newline at end of file
diff --git a/src/test/helm/deployment_mongodb_test.yaml b/src/test/helm/deployment_mongodb_test.yaml
index a36f2926e9496cd4b539ecf69a13494f549fb842..f63e3bb80bfce479451601935979dab04a63975d 100644
--- a/src/test/helm/deployment_mongodb_test.yaml
+++ b/src/test/helm/deployment_mongodb_test.yaml
@@ -28,9 +28,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check mongodb default env
-    template: deployment.yaml
     release:
       name: vorgang-manager
     asserts:
@@ -57,7 +57,6 @@ tests:
               optional: true
 
   - it: check external mongodb
-    template: deployment.yaml
     release:
       name: vorgang-manager
     set:
@@ -81,7 +80,7 @@ tests:
               name: vorgang-manager-database-spring
 
   - it: check mongodb set secretname
-    template: deployment.yaml
+    
     release:
       name: vorgang-manager
     set:
@@ -102,8 +101,7 @@ tests:
             name: spring_data_mongodb_database
             value: vorgang-manager-database
 
-  - it: check mongodb root ca mount
-    template: deployment.yaml
+  - it: check mongodb root ca mount   
     release:
       name: vorgang-manager
     asserts:
@@ -123,7 +121,6 @@ tests:
               optional: true
 
   - it: check mongodb tls set tls cert name
-    template: deployment.yaml
     release:
       name: vorgang-manager
     set:
diff --git a/src/test/helm/deployment_nachrichten_manager_address_test.yaml b/src/test/helm/deployment_nachrichten_manager_address_test.yaml
index 4a8132270e6156ad9cd5e88762b056e44b8b417c..df50cbe8a66fdf4b2509a757ef468012499e0392 100644
--- a/src/test/helm/deployment_nachrichten_manager_address_test.yaml
+++ b/src/test/helm/deployment_nachrichten_manager_address_test.yaml
@@ -22,7 +22,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test environments
+suite: test environments nachrichten-manager_url
 release:
   name: vorgang-manager
   namespace: sh-helm-test
@@ -31,10 +31,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check if nachrichten-manager address is correct
-    templates:
-      - templates/deployment.yaml 
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..42f5e0771bff080656d567edd16939ab9a99c79a
--- /dev/null
+++ b/src/test/helm/deployment_pod_default_spec_values_test.yaml
@@ -0,0 +1,65 @@
+ #
+# 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.
+#
+
+suite: test deployment container basics
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: test-image-pull-secret
+tests:
+ - it: should have correct pod template values
+   asserts:
+      - isEmpty:
+          path: spec.template.spec.dnsConfig
+      - equal:
+          path: spec.template.spec.dnsPolicy
+          value: "ClusterFirst"
+      - equal:
+          path: spec.template.spec.restartPolicy
+          value: "Always"
+      - equal:
+          path: spec.template.spec.schedulerName
+          value: "default-scheduler"
+      - equal:
+          path: spec.template.spec.terminationGracePeriodSeconds
+          value: 30
+ - it: should have correct values for container terminationMessagePolicy, terminationMessagePath, stdin, tty
+   asserts:
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePolicy
+          value: File
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePath
+          value: /dev/termination-log
+      - equal: 
+          path: spec.template.spec.containers[0].stdin
+          value: true
+      - equal: 
+          path: spec.template.spec.containers[0].tty
+          value: true
\ No newline at end of file
diff --git a/src/test/helm/deployment_rabbitmq_test.yaml b/src/test/helm/deployment_rabbitmq_env_test.yaml
similarity index 97%
rename from src/test/helm/deployment_rabbitmq_test.yaml
rename to src/test/helm/deployment_rabbitmq_env_test.yaml
index 24dc0338a27d155572f8da42cf8f8e926f0558fb..3adaadfd0c5356fca70a79477c7dfd801751512b 100644
--- a/src/test/helm/deployment_rabbitmq_test.yaml
+++ b/src/test/helm/deployment_rabbitmq_env_test.yaml
@@ -28,9 +28,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check rabbitmq spring env
-    template: deployment.yaml
     set:
       rabbitmq.enabled: true
     asserts:
@@ -53,7 +53,6 @@ tests:
                 key: password
                 optional: false
   - it: check rabbitmq spring env is not set by default
-    template: deployment.yaml
     asserts:
       - notContains:
           path: spec.template.spec.containers[0].env
@@ -74,7 +73,6 @@ tests:
                 key: password
                 optional: false
   - it: check rabbitmq spring env is not set
-    template: deployment.yaml
     set:
       rabbitmq.enabled: false
     asserts:
diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml
index b1eb74080c692af6ba87a46621f0d3f6d8d57473..7a545c8e7563e05cf5b7853bc87718f4b90c2240 100644
--- a/src/test/helm/deployment_resources_test.yaml
+++ b/src/test/helm/deployment_resources_test.yaml
@@ -22,7 +22,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test deployment
+suite: test deployment resources
 release:
   name: vorgang-manager
 templates:
@@ -30,9 +30,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: test resources
-    template: deployment.yaml
     set:
       resources:
         limits:
@@ -54,8 +54,7 @@ tests:
       - equal:
           path: spec.template.spec.containers[0].resources.requests.memory
           value: 44Mi
-  - it: no resources defined
-    template: deployment.yaml
+  - it: no resources defined by default
     asserts:
       - isEmpty:
           path: spec.template.spec.containers[0].resources
diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml
index 4d4f8a0b79bde3b86d0283792d82fe50c371fd3e..ad44c8d08f82196b65ff240d7db8bde467185be6 100644
--- a/src/test/helm/deployment_service_account_test.yaml
+++ b/src/test/helm/deployment_service_account_test.yaml
@@ -31,6 +31,7 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should use service account with default name
     set:
diff --git a/src/test/helm/deployment_springProfile_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml
similarity index 84%
rename from src/test/helm/deployment_springProfile_test.yaml
rename to src/test/helm/deployment_springProfile_env_test.yaml
index bc6e22a6779e1de00531a52f1ee232dfa3ba924e..7b24e13faf86d6f0adb38838aac3f548522724f3 100644
--- a/src/test/helm/deployment_springProfile_test.yaml
+++ b/src/test/helm/deployment_springProfile_env_test.yaml
@@ -30,20 +30,11 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
-  - it: is kind of Deployment
-    set:
-      env.overrideSpringProfiles: oc,stage,ea
-    templates:
-      - templates/deployment.yaml
-    asserts:
-      - isKind:
-          of: Deployment
   - it: should override spring profiles
     set:
       env.overrideSpringProfiles: oc,stage,ea
-    templates:
-      - templates/deployment.yaml
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
@@ -51,8 +42,6 @@ tests:
             name: spring_profiles_active
             value: oc,stage,ea
   - it: should generate spring profiles
-    templates:
-      - templates/deployment.yaml  
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml
index 501996d39001690d2e9788840e279ee30c6ba0c9..e39659efbe0ffbbcfca957884cca18d73810f6e4 100644
--- a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml
+++ b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml
@@ -31,15 +31,16 @@ templates:
 
 tests:
   - it: should fail on missing environment
-    template: deployment.yaml
+    set: 
+      imagePullSecret: test-image-pull-secret
     asserts:
       - failedTemplate:
           errorMessage: ozgcloud.environment muss angegeben sein
-  - it: should not fail on missing environment
-    template: deployment.yaml
+  - it: should not fail on not missing environment and not missing imagepullsecret
     set:
       ozgcloud:
         environment: dev
+      imagePullSecret: test-image-pull-secret
     asserts:
       - notFailedTemplate: {}
 
diff --git a/src/test/helm/deployment_usermanager_url_test.yaml b/src/test/helm/deployment_usermanager_url_env_test.yaml
similarity index 96%
rename from src/test/helm/deployment_usermanager_url_test.yaml
rename to src/test/helm/deployment_usermanager_url_env_test.yaml
index 7d9e042f837d8def09f004944c2373188e85b87f..5a2ac4d9af36586647ccaa20b863a38a735ff3d5 100644
--- a/src/test/helm/deployment_usermanager_url_test.yaml
+++ b/src/test/helm/deployment_usermanager_url_env_test.yaml
@@ -31,10 +31,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check if user-manager url is correct
-    templates:
-      - templates/deployment.yaml 
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deployment_zufimanager_address_test.yaml b/src/test/helm/deployment_zufimanager_address_env_test.yaml
similarity index 96%
rename from src/test/helm/deployment_zufimanager_address_test.yaml
rename to src/test/helm/deployment_zufimanager_address_env_test.yaml
index 3e506705ef32fa97a11aad0fa64350c2ae317bec..4771f72d053c23395bf8a67afb2684241875cd71 100644
--- a/src/test/helm/deployment_zufimanager_address_test.yaml
+++ b/src/test/helm/deployment_zufimanager_address_env_test.yaml
@@ -31,10 +31,9 @@ templates:
 set:
   ozgcloud:
     environment: dev
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: check if zufi-manager address is correct
-    templates:
-      - templates/deployment.yaml 
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
diff --git a/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..76331e120081a0f27ce4b20a88ecb4d007ce3635
--- /dev/null
+++ b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml
@@ -0,0 +1,75 @@
+#
+# 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.
+#
+
+suite: test deployment general values
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: test-image-pull-secret
+
+tests:
+  - it: should have correct apiVersion
+    asserts:
+      - isKind:
+          of: Deployment
+      - isAPIVersion:
+           of: "apps/v1"
+      
+  - it: should have correct deployment metadata 
+    asserts: 
+      - equal:
+          path: metadata.name
+          value: vorgang-manager
+      - equal: 
+          path: metadata.namespace
+          value: sh-helm-test
+
+
+  - it: should have correct deyployment general spec values
+    asserts:
+      - equal:
+          path: spec.progressDeadlineSeconds
+          value: 600
+      - equal:
+          path: spec.replicas
+          value: 2
+      - equal:
+          path: spec.revisionHistoryLimit
+          value: 10
+  - it: should have correct deployment spec strategy values
+    asserts:
+      - equal: 
+          path: spec.strategy
+          value: 
+            rollingUpdate:
+              maxSurge: 1
+              maxUnavailable: 0
+            type: RollingUpdate
+          
+
diff --git a/src/test/helm/elasticsearch_cr_test.yaml b/src/test/helm/elasticsearch_cr_test.yaml
index 59674fb8b925276d9ddbc32bd86ea673f569c057..068c1fd7c0170efcac8d73fdba88fc0440a1e7f9 100644
--- a/src/test/helm/elasticsearch_cr_test.yaml
+++ b/src/test/helm/elasticsearch_cr_test.yaml
@@ -12,13 +12,15 @@ tests:
     asserts:
       - isAPIVersion:
           of: operator.ozgcloud.de/v1
-  - it: should contain kind
+  - it: should contain basic info
     set:
       elasticsearch:
         enabled: true
     asserts:
       - isKind:
           of: OzgCloudElasticsearch
+      - isAPIVersion:
+          of: operator.ozgcloud.de/v1
   - it: should have metadata name
     set:
       elasticsearch:
@@ -41,6 +43,7 @@ tests:
     set:
       elasticsearch:
         enabled: true
+        disableOzgCloudOperator: false
     asserts:
       - hasDocuments:
           count: 1
@@ -49,4 +52,14 @@ tests:
     asserts:
       - hasDocuments:
           count: 0
-        documentIndex: 0
\ No newline at end of file
+        documentIndex: 0
+  - it: should NOT create cr if disableOzgCloudOperator true
+    set:
+      elasticsearch:
+        enabled: true
+        disableOzgCloudOperator: true
+    asserts:
+      - hasDocuments:
+          count: 0
+        documentIndex: 0
+  
\ No newline at end of file
diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml
index 16661a34b0b43473c82029e7496f2867220dd785..ac7df6574a59eae14b64a88872f8f37a182dfa89 100644
--- a/src/test/helm/network_policy_test.yaml
+++ b/src/test/helm/network_policy_test.yaml
@@ -253,39 +253,78 @@ tests:
                 matchLabels:
                   component: client2
 
-  - it: add egress rules by values
+  - it: should add additionalIngressConfig
     set:
       networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfig:
+        - from:
+          - podSelector: 
+              matchLabels:
+                additionalIngressConfig: yes
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+            - podSelector: 
+                matchLabels:
+                  additionalIngressConfig: yes
+
+  - it: should add additionalEgressConfig
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
         additionalEgressConfig:
-        - to:
-          - ipBlock:
-              cidr: 1.2.3.4/32
         - to:
           - podSelector:
               matchLabels:
-                component: ozg-testservice
-          ports:
-            - port: 12345
-              protocol: TCP
-
-        dnsServerNamespace: test-dns-namespace
+                additionalEgressConfig: yes
     asserts:
     - contains:
         path: spec.egress
         content:
           to:
-          - ipBlock:
-              cidr: 1.2.3.4/32
+          - podSelector:
+              matchLabels:
+                additionalEgressConfig: yes
+
+
+  - it: should add additionalIngressConfigNamespace
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigNamespace:
+        - from:
+          - podSelector: 
+              matchLabels:
+                additionalIngressConfigNamespace: yes
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+            - podSelector: 
+                matchLabels:
+                  additionalIngressConfigNamespace: yes
+
+  - it: should add additionalEgressConfigNamespace
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+        additionalEgressConfigNamespace:
+        - to:
+          - podSelector:
+              matchLabels:
+                additionalEgressConfigNamespace: yes
+    asserts:
     - contains:
         path: spec.egress
         content:
           to:
           - podSelector:
               matchLabels:
-                component: ozg-testservice
-          ports:
-            - port: 12345
-              protocol: TCP
+                additionalEgressConfigNamespace: yes
 
   - it: test network policy disabled
     set:
diff --git a/src/test/helm/image_pull_secret_test.yaml b/src/test/helm/ozgcloud_proxyapi_secret_test.yaml
similarity index 62%
rename from src/test/helm/image_pull_secret_test.yaml
rename to src/test/helm/ozgcloud_proxyapi_secret_test.yaml
index 2d4aa120dfbd26bf3348cca913c6d53a34e44192..bfc35606b3bddf13b93662723d0a339d2b316f34 100644
--- a/src/test/helm/image_pull_secret_test.yaml
+++ b/src/test/helm/ozgcloud_proxyapi_secret_test.yaml
@@ -22,38 +22,45 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test image pull secret
-templates:
-  - templates/image-pull-secret.yaml
+suite: test secret ozgcloudProxyApi
 release:
   name: vorgang-manager
-  namespace: helm-test
+  namespace: sh-helm-test
+templates:
+  - templates/secret_ozgcloud_proxyapi.yaml
 tests:
-  - it: should match basic data
+  - it: test metadata
     set:
-      imageCredentials:
-        registry: docker.ozg-sh.de
-        username: test
-        password: test1234
-        email: webmaster@ozg-sh.de
+      ozgcloudProxyApi.apikey: api-key
     asserts:
-      - hasDocuments:
-          count: 1
-      - containsDocument:
-          kind: Secret
-          apiVersion: v1
+      - isKind:
+          of: Secret
+      - isAPIVersion:
+          of: v1
       - equal:
           path: metadata.name
-          value: vorgang-manager-image-pull-secret
+          value: vorgang-manager-ozgcloud-proxyapi
       - equal:
           path: metadata.namespace
-          value: helm-test          
-      - isNotNullOrEmpty:
-          path: data[".dockerconfigjson"]
-
-  - it: should not create image pull secret
+          value: sh-helm-test
+  - it: test secret type
     set:
-      imagePullSecret: "image-pull-secret"
+      ozgcloudProxyApi.apikey: api-key
+    asserts:
+      - equal:
+          path: type
+          value: Opaque
+  - it: should not create secret by default
     asserts:
       - hasDocuments:
-          count: 0
\ No newline at end of file
+          count: 0
+
+  - it: should have data
+    set:
+      ozgcloudProxyApi.apikey: api-key
+    asserts:
+      - isNotEmpty:
+          path: data.ozgcloud_osi_postfach_proxyapi_key
+   
+          
+
diff --git a/src/test/helm/rabbitmq_exchange_test.yaml b/src/test/helm/rabbitmq_exchange_test.yaml
index 8a8d0db7acd22d6b2e72b7730c4f9f3f5e825f1e..ca967c1df86550d4ae4da0deb6f490299cc1b866 100644
--- a/src/test/helm/rabbitmq_exchange_test.yaml
+++ b/src/test/helm/rabbitmq_exchange_test.yaml
@@ -35,18 +35,28 @@ tests:
     asserts:
       - isKind:
           of: Exchange
+      - isAPIVersion:
+          of: rabbitmq.com/v1beta1
       - equal:
           path: metadata.name
           value: sh-helm-test
-  - it: test if spec name like namespace
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+  - it: should have correct spec
     set:
       rabbitmq.enabled: true
     asserts:
-      - isKind:
-          of: Exchange
       - equal:
-          path: spec.name
-          value: sh-helm-test-exchange
+          path: spec
+          value: 
+            name: sh-helm-test-exchange
+            type: direct
+            autoDelete: false
+            durable: true
+            rabbitmqClusterReference:
+              name: ozg-mq-cluster
+              namespace: rabbitmq-system
   - it: should not create rabbitmq exchange
     set:
       rabbitmq.enabled: false
diff --git a/src/test/helm/rabbitmq_permissions_test.yaml b/src/test/helm/rabbitmq_permissions_test.yaml
index b680ac19caa9e22f859334ff4cd08a27ee7f12af..155d4d0b9e2481be7654ee6e2a973273a63c71f2 100644
--- a/src/test/helm/rabbitmq_permissions_test.yaml
+++ b/src/test/helm/rabbitmq_permissions_test.yaml
@@ -35,29 +35,32 @@ tests:
     asserts:
       - isKind:
           of: Permission
+      - isAPIVersion:
+          of: rabbitmq.com/v1beta1
       - equal:
-          path: spec.user
+          path: metadata.name
           value: sh-helm-test
-  - it: test specs write permissions
-    set:
-      rabbitmq.enabled: true
-      rabbitmq.cluster.name: rabbit-test
-      rabbitmq.cluster.namespace: rabbit-test-ns
-    asserts:
-      - isKind:
-          of: Permission
       - equal:
-          path: spec.permissions.write
-          value: "sh-helm-test-.*"
-  - it: test specs read permissions
+          path: metadata.namespace
+          value: sh-helm-test
+  - it: should have correct spec
     set:
       rabbitmq.enabled: true
     asserts:
-      - isKind:
-          of: Permission
       - equal:
-          path: spec.permissions.read
-          value: "sh-helm-test-.*"
+          path: spec
+          value: 
+            vhost: "/"
+            user: "sh-helm-test"
+            permissions:
+              write: "sh-helm-test-.*"
+              configure: ".*"
+              read: "sh-helm-test-.*"
+            rabbitmqClusterReference:
+              name: ozg-mq-cluster
+              namespace: rabbitmq-system
+           
+ 
   - it: should not create rabbitmq permission
     set:
       rabbitmq.enabled: false
diff --git a/src/test/helm/rabbitmq_queue_test.yaml b/src/test/helm/rabbitmq_queue_test.yaml
index 684814c49727b442295925fecd63841a6ccf8edf..b1f486a1096af207c78388bb4a2ef36eda38fe47 100644
--- a/src/test/helm/rabbitmq_queue_test.yaml
+++ b/src/test/helm/rabbitmq_queue_test.yaml
@@ -35,9 +35,14 @@ tests:
     asserts:
       - isKind:
           of: Queue
+      - isAPIVersion:
+          of: rabbitmq.com/v1beta1
       - equal:
           path: metadata.name
           value: sh-helm-test
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
   - it: should not create rabbitmq queue
     set:
       rabbitmq.enabled: false
@@ -47,4 +52,28 @@ tests:
   - it: should not create rabbitmq queue by default
     asserts:
       - hasDocuments:
-          count: 0
\ No newline at end of file
+          count: 0
+  - it: should have rabbitmq credentials and clusterReference info when enabled
+    set:
+      rabbitmq.enabled: true
+    asserts:
+      - equal:
+          path: spec.name
+          value: sh-helm-test-queue
+      - equal:
+          path: spec.vhost
+          value: "/"
+      - equal:
+          path: spec.type
+          value: quorum
+      - equal:
+          path: spec.autoDelete
+          value: false
+      - equal:
+          path: spec.durable
+          value: true
+      - equal:
+          path: spec.rabbitmqClusterReference
+          value: 
+            name: ozg-mq-cluster
+            namespace: rabbitmq-system
\ No newline at end of file
diff --git a/src/test/helm/rabbitmq_secret_test.yaml b/src/test/helm/rabbitmq_secret_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fc8fc6889b00b3e173b4dd493624ce6e740ac23e
--- /dev/null
+++ b/src/test/helm/rabbitmq_secret_test.yaml
@@ -0,0 +1,79 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test rabbitmq secret
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/rabbitmq_secret.yaml
+tests:
+  - it: test metadata
+    set:
+      rabbitmq.enabled: true
+    asserts:
+      - isKind:
+          of: Secret
+      - isAPIVersion:
+          of: v1
+      - equal:
+          path: metadata.name
+          value: rabbitmq-credentials
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+      - equal:
+          path: metadata.annotations
+          value: 
+             "helm.sh/resource-policy": "keep"
+  - it: test secret type
+    set:
+      rabbitmq.enabled: true
+    asserts:
+      - equal:
+          path: type
+          value: Opaque
+  - it: should not create rabbitmq secret
+    set:
+      rabbitmq.enabled: false
+    asserts:
+      - hasDocuments:
+          count: 0
+  - it: should not create rabbitmq secret by default
+    set:
+      ozgcloud.environment: test
+    asserts:
+      - hasDocuments:
+          count: 0
+
+  - it: should have stringData
+    set:
+      rabbitmq.enabled: true
+    asserts:
+      - isNotEmpty:
+          path: stringData.password
+      - isNotEmpty:
+          path: stringData.username
+          
+
diff --git a/src/test/helm/rabbitmq_user_test.yaml b/src/test/helm/rabbitmq_user_test.yaml
index e05eb4ddbb45c744ba2aaeb82904c3e4542e17ee..35d940f7733e5516047117adaba1e619f0ee5b3b 100644
--- a/src/test/helm/rabbitmq_user_test.yaml
+++ b/src/test/helm/rabbitmq_user_test.yaml
@@ -35,9 +35,14 @@ tests:
     asserts:
       - isKind:
           of: User
+      - isAPIVersion:
+          of: rabbitmq.com/v1beta1
       - equal:
           path: metadata.name
           value: sh-helm-test
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
   - it: should not create rabbitmq user
     set:
       rabbitmq.enabled: false
@@ -49,4 +54,18 @@ tests:
       ozgcloud.environment: test
     asserts:
       - hasDocuments:
-          count: 0
\ No newline at end of file
+          count: 0
+  - it: should have rabbitmq credentials and clusterReference info when enabled
+    set:
+      rabbitmq.enabled: true
+    asserts:
+      - equal:
+          path: spec.importCredentialsSecret
+          value: 
+            name: rabbitmq-credentials
+      - equal:
+          path: spec.rabbitmqClusterReference.name
+          value: ozg-mq-cluster
+      - equal:
+          path: spec.rabbitmqClusterReference.namespace
+          value: rabbitmq-system
\ No newline at end of file
diff --git a/src/test/helm/service_account_test.yaml b/src/test/helm/service_account_test.yaml
index e71aa0fc9379b68553987dbfe6128ef61f6d0326..0e312737a09f243ce1ea1bc4fc52a5162e139596 100644
--- a/src/test/helm/service_account_test.yaml
+++ b/src/test/helm/service_account_test.yaml
@@ -36,6 +36,8 @@ tests:
     asserts:
       - isKind:
           of: ServiceAccount
+      - isAPIVersion:
+          of: v1
       - equal:
           path: metadata.name
           value: vorgang-manager-service-account
diff --git a/src/test/helm/service_monitor_test.yaml b/src/test/helm/service_monitor_test.yaml
index 96f6e796d08698296662e02757263ff4276768ad..8d1a5caad68d8bc907e066a49b64ae20f4888623 100644
--- a/src/test/helm/service_monitor_test.yaml
+++ b/src/test/helm/service_monitor_test.yaml
@@ -29,13 +29,33 @@ release:
 templates:
   - templates/service_monitor.yaml
 tests:
-  - it: should have the label component with value vorgang-manager-service-monitor attached
+  - it: should have basic info
     asserts:
       - isKind:
           of: ServiceMonitor
+      - isAPIVersion:
+          of: monitoring.coreos.com/v1
       - equal:
-          path: metadata.labels["component"]
-          value: vorgang-manager-service-monitor
+          path: metadata.name
+          value: vorgang-manager
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+  
+  - it: should contain default lables and component lables
+    asserts:
+      - equal:
+          path: metadata.labels
+          value:
+            app.kubernetes.io/instance: vorgang-manager
+            app.kubernetes.io/managed-by: Helm
+            app.kubernetes.io/name: vorgang-manager
+            app.kubernetes.io/namespace: sh-helm-test
+            app.kubernetes.io/part-of: ozgcloud
+            app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS
+            component: vorgang-manager-service-monitor
+            helm.sh/chart: vorgang-manager-0.0.0-MANAGED-BY-JENKINS
+            ozgcloud-mongodb-client: "true"
   - it: should be able to enable the endpoint
     asserts:
       - isKind:
diff --git a/src/test/helm/service_test.yaml b/src/test/helm/service_test.yaml
index 627df058bde17bd49836ffd528a740eb4af30030..6ffb004080c0a7fcf55888124ba95b37ea4d9fc6 100644
--- a/src/test/helm/service_test.yaml
+++ b/src/test/helm/service_test.yaml
@@ -22,20 +22,25 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test deployment
+suite: test service
 release:
   name: vorgang-manager
   namespace: sh-helm-test
 templates:
   - templates/service.yaml
 tests:
-  - it: should have the label component with value vorgang-manager-service attached
+  - it: should have basic info
     asserts:
       - isKind:
           of: Service
+      - isAPIVersion:
+          of: v1
       - equal:
-          path: metadata.labels.component
-          value: vorgang-manager-service
+          path: metadata.name
+          value: vorgang-manager
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
   - it: should be of type ClusterIP
     asserts:
       - equal:
@@ -74,4 +79,17 @@ tests:
       - equal:
           path: spec.selector["app.kubernetes.io/namespace"]
           value: sh-helm-test
-  
\ No newline at end of file
+  - it: should contain default lables and component lables
+    asserts:
+      - equal:
+          path: metadata.labels
+          value:
+            app.kubernetes.io/instance: vorgang-manager
+            app.kubernetes.io/managed-by: Helm
+            app.kubernetes.io/name: vorgang-manager
+            app.kubernetes.io/namespace: sh-helm-test
+            app.kubernetes.io/part-of: ozgcloud
+            app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS
+            component: vorgang-manager-service
+            helm.sh/chart: vorgang-manager-0.0.0-MANAGED-BY-JENKINS
+            ozgcloud-mongodb-client: "true"
\ No newline at end of file
diff --git a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java
index ebaf64a7ee19ca6dcf71de91a13e9f2a011d408d..85ae1cb4e52af123e2e6092e61ec85b16acf3021 100644
--- a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java
+++ b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java
@@ -28,8 +28,8 @@ import java.util.TimeZone;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
-import org.springframework.boot.task.TaskExecutorBuilder;
-import org.springframework.boot.task.TaskExecutorCustomizer;
+import org.springframework.boot.task.ThreadPoolTaskExecutorBuilder;
+import org.springframework.boot.task.ThreadPoolTaskExecutorCustomizer;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.context.annotation.Primary;
@@ -60,19 +60,19 @@ public class VorgangManagerServerApplication {
 	}
 
 	@Bean
-	TaskExecutorCustomizer addSecurityContextCustomizer() {
+	ThreadPoolTaskExecutorCustomizer addSecurityContextCustomizer() {
 		return customizer -> customizer.setTaskDecorator(DelegatingSecurityContextRunnable::new);
 
 	}
 
 	@Bean
-	TaskExecutorCustomizer setThreadName() {
+	ThreadPoolTaskExecutorCustomizer setThreadName() {
 		return customizer -> customizer.setThreadNamePrefix("ozgtask-");
 	}
 
 	@Bean("taskExecutor")
 	@Primary
-	TaskExecutor taskExecutor(TaskExecutorBuilder builder) {
+	TaskExecutor taskExecutor(ThreadPoolTaskExecutorBuilder builder) {
 		return builder.build();
 	}
 
diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto
new file mode 100644
index 0000000000000000000000000000000000000000..ff0025a2197b3ba328547cd595f741ea95852310
--- /dev/null
+++ b/vorgang-manager-interface/src/main/protobuf/document.model.proto
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+ syntax = "proto3";
+
+ package de.ozgcloud.document;
+
+ option java_multiple_files = true;
+ option java_package = "de.ozgcloud.document";
+ option java_outer_classname = "DocumentModelProto";
+
+message GrpcGetDocumentRequest {
+	string id = 1;
+}
+
+message GrpcGetDocumentResponse {
+	GrpcDocument document = 1;
+}
+
+message GrpcDocument {
+	string id = 1;
+	string type = 2;
+	string fileId = 3;
+	string nachrichtSubject = 4;
+	string nachrichtText = 5;
+}
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/document.proto b/vorgang-manager-interface/src/main/protobuf/document.proto
new file mode 100644
index 0000000000000000000000000000000000000000..c2a903373b229e3461932fa15e50706a9e5b41af
--- /dev/null
+++ b/vorgang-manager-interface/src/main/protobuf/document.proto
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+syntax = "proto3";
+
+package de.ozgcloud.document;
+
+import "document.model.proto";
+
+option java_multiple_files = true;
+option java_package = "de.ozgcloud.document";
+option java_outer_classname = "DocumentProto";
+
+service DocumentService {
+  rpc GetDocument(GrpcGetDocumentRequest) returns (GrpcGetDocumentResponse) {}
+}
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto
index ace2dd7613c90a68b2d184c61926c77db9ea3eb9..7719beb188b32fd0fdec649061e9844c5b7119e6 100644
--- a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto
+++ b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto
@@ -113,6 +113,7 @@ message GrpcEingangHeader {
 message GrpcServiceKonto {
   string type = 1;
   repeated GrpcPostfachAddress postfachAddresses = 2;
+  string trustLevel = 3;
 }
 
 message GrpcPostfachAddress {
diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml
index f6a78fc53972e0af85adda4f820c73badb54c46e..06f4f37af8f931a634649d52ed1213713bc83e4b 100644
--- a/vorgang-manager-server/pom.xml
+++ b/vorgang-manager-server/pom.xml
@@ -53,7 +53,7 @@
 		<zufi-manager-interface.version>1.0.0-SNAPSHOT</zufi-manager-interface.version>
 
 		<user-manager-interface.version>2.1.0</user-manager-interface.version>
-		<bescheid-manager.version>1.9.0</bescheid-manager.version>
+		<bescheid-manager.version>1.10.0-SNAPSHOT</bescheid-manager.version>
 		<processor-manager.version>0.3.0</processor-manager.version>
 		<ozgcloud-starter.version>0.7.0-SNAPSHOT</ozgcloud-starter.version>
 
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java
new file mode 100644
index 0000000000000000000000000000000000000000..def17ea4fb35fadcfa7e7e9c9959304404a28239
--- /dev/null
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java
@@ -0,0 +1,39 @@
+package de.ozgcloud.vorgang.common.migration;
+
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+
+import io.mongock.api.annotations.ChangeUnit;
+import io.mongock.api.annotations.Execution;
+import io.mongock.api.annotations.RollbackExecution;
+
+@ChangeUnit(id = "2024-04-02 17:15:00 OZG-4770", order = "M009", author = "ebardin", runAlways = true)
+public class M009_SetServiceKontoTrustLevel { // NOSONAR
+
+	private static final String VORGANG_COLLECTION = "vorgang";
+	private static final String DEFAULT_TRUST_LEVEL = "STORK-QAA-Level-1";
+	private static final String KEY_SERVICE_KONTO = "header.serviceKonto";
+	private static final String KEY_TRUST_LEVEL = KEY_SERVICE_KONTO + ".trustLevel";
+
+	@Execution
+	public void doMigration(MongoOperations db) {
+		db.updateMulti(createFilterQuery(), createUpdate(), VORGANG_COLLECTION);
+	}
+
+	Query createFilterQuery() {
+		var serviceKontoExistsCriteria = Criteria.where(KEY_SERVICE_KONTO).exists(true);
+		var trustLevelNotExistsCriteria = Criteria.where(KEY_TRUST_LEVEL).exists(false);
+		return new Query(new Criteria().andOperator(serviceKontoExistsCriteria, trustLevelNotExistsCriteria));
+	}
+
+	Update createUpdate() {
+		return new Update().set(KEY_TRUST_LEVEL, DEFAULT_TRUST_LEVEL);
+	}
+
+	@RollbackExecution
+	public void rollback() {
+		// kein rollback implementiert
+	}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java
index d04f172061b55665adcdb7b4fa28df7d2e638cf1..f15d3ec01c853a64d85f299f846a1862c6557003 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java
@@ -8,10 +8,14 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.data.mongodb.core.query.UpdateDefinition;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 class RenameUtil {
 
-	private final static String SET_OPERATOR = "$set";
-	private final static String REPLACE_ONE_OPERATOR = "$replaceOne";
+	private static final String SET_OPERATOR = "$set";
+	private static final String REPLACE_ONE_OPERATOR = "$replaceOne";
 
 	static final String CLIENT_KEY = "client";
 
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java
index 1688f1232804f8e396504b8f1525dfb9e41119f3..1e314ce6d6217ffbe0010d97ab9a5b5abbc554d5 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java
@@ -40,7 +40,6 @@ import lombok.extern.log4j.Log4j2;
 @Component
 @ConditionalOnProperty(prefix = "ozgcloud.elasticsearch", name = "address")
 @Profile("initSearchIndex")
-@Async
 @Log4j2
 public class SearchIndexInitializer implements ApplicationListener<ContextRefreshedEvent> {
 	@Autowired
@@ -52,6 +51,7 @@ public class SearchIndexInitializer implements ApplicationListener<ContextRefres
 	@Autowired
 	private ApplicationContext context;
 
+	@Async
 	@Override
 	public void onApplicationEvent(ContextRefreshedEvent event) {
 		LOG.info("Start filling up index");
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
index 413985f9f737f7747251e15d41bce5e90a5b9454..dc55642a887b0d8a453a10ead82e0fb7de5970c8 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
@@ -1,20 +1,45 @@
 package de.ozgcloud.vorgang.servicekonto;
 
 import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
 
 import lombok.Builder;
 import lombok.Getter;
-import lombok.Setter;
 import lombok.Singular;
+import lombok.extern.log4j.Log4j2;
 
 @Getter
 @Builder
-@Setter
+@Log4j2
 public class ServiceKonto {
 
 	public static final String OSI_IDENTIFIER = "OSI";
+	private static final Set<String> EXPECTED_TRUST_LEVELS = Set.of("STORK-QAA-Level-1", "STORK-QAA-Level-2", "STORK-QAA-Level-3",
+			"STORK-QAA-Level-4");
 
 	private String type;
+	private String trustLevel;
 	@Singular
 	private List<PostfachAddress> postfachAddresses;
+
+	static class ServiceKontoBuilder {
+
+		public ServiceKontoBuilder trustLevel(String trustLevel) {
+			validateTrustLevel(trustLevel);
+			this.trustLevel = trustLevel;
+			return this;
+		}
+
+		void validateTrustLevel(String trustLevel) {
+			if (StringUtils.isNotEmpty(trustLevel) && !EXPECTED_TRUST_LEVELS.contains(trustLevel)) {
+				logError(trustLevel);
+			}
+		}
+
+		void logError(String trustLevelValue) {
+			LOG.error("Unexpected trust level: {}", trustLevelValue);
+		}
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..bdbcf04f6d8bb24fdfb319fdd45a57c0bcbf9835
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java
@@ -0,0 +1,149 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.awaitility.Awaitility.*;
+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.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+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.test.annotation.DirtiesContext;
+
+import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
+import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandCreatedEvent;
+import de.ozgcloud.command.CommandFailedEvent;
+import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.vorgang.VorgangManagerServerApplication;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
+import de.ozgcloud.vorgang.command.CommandTestFactory;
+
+@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = {
+		"grpc.server.inProcessName=test",
+		"grpc.server.port=-1",
+		"grpc.client.ozgcloud-command-manager.address=in-process:test",
+		"grpc.client.vorgang-manager.address=in-process:test"
+})
+@DataITCase
+@DirtiesContext
+class DocumentEventListenerITCase {
+
+	private static final String FILE_ID = "file-id";
+
+	@Autowired
+	private ApplicationEventPublisher eventPublisher;
+	@SpyBean
+	private DocumentEventListener eventListener;
+	@Autowired
+	private CommandMapper mapper;
+	@Autowired
+	private MongoOperations mongoOperations;
+
+	@MockBean
+	private CurrentUserService currentUserService;
+	@Mock
+	private CallContextUser callContextUser;
+
+	@Captor
+	private ArgumentCaptor<BescheidDocumentCreatedEvent> bescheidDocumentCreatedEventCaptor;
+	@Captor
+	private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
+
+	@BeforeEach
+	void init() {
+		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+		when(currentUserService.getUser()).thenReturn(callContextUser);
+	}
+
+	@Test
+	void shouldCreateDocument() {
+		var bescheidItem = mongoOperations.save(createBescheidItem("DRAFT"));
+		var command = createCommand(bescheidItem.getId());
+
+		eventPublisher.publishEvent(new CommandCreatedEvent(command));
+
+		assertThat(loadBescheidDocument()).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID);
+	}
+
+	@Test
+	void shouldFailWhenNoBescheidFound() {
+		var command = createCommand("non-existing-id");
+
+		eventPublisher.publishEvent(new CommandCreatedEvent(command));
+
+		await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
+			verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture());
+			assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
+		});
+	}
+
+	@Test
+	void shouldFailWhenNotDraft() {
+		var bescheidItem = mongoOperations.save(createBescheidItem("BESCHEID"));
+		var command = createCommand(bescheidItem.getId());
+
+		eventPublisher.publishEvent(new CommandCreatedEvent(command));
+
+		await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
+			verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture());
+			assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
+		});
+	}
+
+	private VorgangAttachedItem createBescheidItem(String status) {
+		return VorgangAttachedItemTestFactory.createBuilder().id(null).version(0)
+				.item(Map.of("status", status))
+				.build();
+	}
+
+	private Map<String, Object> loadBescheidDocument() {
+		verify(eventListener, timeout(5000)).publishEvent(bescheidDocumentCreatedEventCaptor.capture());
+		var bescheidDocumentId = bescheidDocumentCreatedEventCaptor.getValue().getCreatedResource();
+		return mongoOperations.findById(bescheidDocumentId, VorgangAttachedItem.class).getItem();
+	}
+
+	private Command createCommand(String relationId) {
+		return CommandTestFactory.createBuilder()
+				.relationId(relationId)
+				.order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER)
+				.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID))
+				.build();
+	}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..95720de7ca399b35508f54d47da2550cb858dadd
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
@@ -0,0 +1,110 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+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.data.mongodb.core.MongoOperations;
+import org.springframework.test.annotation.DirtiesContext;
+
+import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
+import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceBlockingStub;
+import de.ozgcloud.vorgang.VorgangManagerServerApplication;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
+import io.grpc.StatusRuntimeException;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = {
+		"grpc.server.inProcessName=test",
+		"grpc.server.port=-1",
+		"grpc.client.vorgang-manager.address=in-process:test",
+		"grpc.client.inProcess.address=in-process:test",
+})
+@DataITCase
+@DirtiesContext
+class DocumentGrpcServiceITCase {
+
+	@GrpcClient("inProcess")
+	private DocumentServiceBlockingStub documentServiceStub;
+
+	@Autowired
+	private MongoOperations mongoOperations;
+
+	@MockBean
+	private CurrentUserService currentUserService;
+	@Mock
+	private CallContextUser callContextUser;
+
+	@BeforeEach
+	void init() {
+		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+		when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser));
+		when(currentUserService.getUser()).thenReturn(callContextUser);
+	}
+
+	@Test
+	void shouldGetDocument() {
+		var documentId = saveDocument();
+
+		var response = documentServiceStub.getDocument(GrpcGetDocumentRequest.newBuilder().setId(documentId).build());
+
+		assertThat(response.hasDocument()).isTrue();
+	}
+
+	@Test
+	void shouldThrowExceptionWhenDocumentNotFound() {
+		saveDocument();
+		var request = GrpcGetDocumentRequest.newBuilder().setId("not-found").build();
+
+		Assertions.assertThrows(StatusRuntimeException.class, () -> documentServiceStub.getDocument(request));
+	}
+
+	private String saveDocument() {
+		var document  = VorgangAttachedItemTestFactory.createBuilder()
+				.id(null)
+				.version(0)
+				.itemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.item(Map.of(
+								Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE,
+								Document.FIELD_DOCUMENT_FILE, "file-id",
+								Document.FIELD_NACHRICHT_TEXT, "nachricht-text",
+								Document.FIELD_NACHRICHT_SUBJECT, "nachricht-subject"))
+				.build();
+		return mongoOperations.save(document, VorgangAttachedItem.COLLECTION_NAME).getId();
+	}
+}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java
index 50e69e9d83be93729a9db83b85d1bbf25c33429e..055a48e234bab978031fcbfa3d91176df3c20640 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java
@@ -50,6 +50,7 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.MediaType;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.web.client.ExpectedCount;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
@@ -77,6 +78,7 @@ import io.grpc.stub.StreamObserver;
 })
 @WithMockUser
 @DataITCase
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
 class PostfachMailITCase {
 
 	private static final String TEST_OSI_POSTFACH_URI = "http://localhost/ApiProxy/V1/Message";
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..1159d4bb164efd9f92d8c0e10ddb204b98df726e
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java
@@ -0,0 +1,136 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.vorgang.common.migration;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.bson.Document;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Spy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Query;
+
+import de.ozgcloud.common.test.DataITCase;
+
+@DataITCase
+class M009_SetServiceKontoTrustLevelITCase {
+
+	private static final String DEFAULT_TRUST_LEVEL = "STORK-QAA-Level-1";
+	private static final String FIELD_HEADER = "header";
+	private static final String FIELD_SERVICE_KONTO = "serviceKonto";
+	private static final String FIELD_TRUST_LEVEL = "trustLevel";
+	private static final String FIELD_DUMMY_KEY = "HEADER_FIELD";
+	private static final String DUMMY_VALUE = "HEADER_VALUE";
+
+	@Spy
+	private M009_SetServiceKontoTrustLevel migration;
+
+	@Autowired
+	private MigrationDbTestUtils dbTestUtils;
+	@Autowired
+	private MongoTemplate template;
+
+	@BeforeEach
+	void init() {
+		dbTestUtils.dropVorgangCollection();
+	}
+
+	@Test
+	void shouldSetTrustLevel() {
+		saveVorgangWithServiceKonto();
+
+		migration.doMigration(template);
+
+		assertThat(getServiceKonto()).containsEntry(FIELD_TRUST_LEVEL, DEFAULT_TRUST_LEVEL);
+	}
+
+	@Test
+	void shouldUpdateAllVorgangs() {
+		saveVorgangWithServiceKonto();
+		saveVorgangWithServiceKonto();
+
+		migration.doMigration(template);
+
+		assertThat(loadVorgangs()).hasSize(2);
+		loadVorgangs().forEach(vorgang -> assertThat(getServiceKonto(vorgang)).containsEntry(FIELD_TRUST_LEVEL, DEFAULT_TRUST_LEVEL));
+	}
+
+	@Test
+	void shouldSkipWhenTrustLevelExists() {
+		var expectedTrustLevel = "trust-level";
+		saveVorgangWithServiceKonto(Map.of(FIELD_TRUST_LEVEL, expectedTrustLevel));
+
+		migration.doMigration(template);
+
+		assertThat(getServiceKonto()).containsEntry(FIELD_TRUST_LEVEL, expectedTrustLevel);
+	}
+
+	@Test
+	void shouldKeepOtherValues() {
+		saveVorgangWithServiceKonto();
+
+		migration.doMigration(template);
+
+		assertThat(getServiceKonto()).containsEntry(FIELD_DUMMY_KEY, DUMMY_VALUE);
+	}
+
+	@Test
+	void shouldNotMigrateIfNoServiceKonto() {
+		dbTestUtils.saveVorgang(new Document(Map.of("header", Map.of(FIELD_DUMMY_KEY, DUMMY_VALUE))));
+
+		migration.doMigration(template);
+
+		assertThat(getServiceKonto()).isNull();
+	}
+
+	private void saveVorgangWithServiceKonto() {
+		saveVorgangWithServiceKonto(Collections.emptyMap());
+	}
+
+	private void saveVorgangWithServiceKonto(Map<String, String> serviceKontoValues) {
+		var serviceKonto = new Document(serviceKontoValues);
+		serviceKonto.append(FIELD_DUMMY_KEY, DUMMY_VALUE);
+		dbTestUtils.saveVorgang(new Document(Map.of(FIELD_HEADER, Map.of(FIELD_SERVICE_KONTO, serviceKonto))));
+	}
+
+	private Document getServiceKonto() {
+		var vorgangs = loadVorgangs();
+		assertThat(vorgangs).hasSize(1);
+		return getServiceKonto(vorgangs.get(0));
+	}
+
+	private Document getServiceKonto(Document vorgang) {
+		return vorgang.get("header", Document.class).get("serviceKonto", Document.class);
+	}
+
+	private List<Document> loadVorgangs() {
+		return dbTestUtils.findVorgang(new Query());
+	}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java
index a394c99824ba082f6b54bd650baeac8e835dcc76..162064ab402e09dd8ee9b02117e36438032afbf1 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java
@@ -11,6 +11,7 @@ public class GrpcServiceKontoTestFactory {
 	public static GrpcServiceKonto.Builder createBuilder() {
 		return GrpcServiceKonto.newBuilder()
 				.setType(ServiceKontoTestFactory.TYPE)
+				.setTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL)
 				.addPostfachAddresses(GrpcPostfachAddressTestFactory.create());
 	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..285fb8fbcbade9604a96da371652d3b44f91b4d0
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package de.ozgcloud.vorgang.servicekonto;
+
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.NullAndEmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.InjectMocks;
+
+class ServiceKontoTest {
+
+	@InjectMocks
+	private ServiceKonto serviceKonto;
+
+	@Test
+	void shouldCallValidateTrustLevel() {
+		var builder = spy(ServiceKonto.builder());
+
+		builder.trustLevel(ServiceKontoTestFactory.TRUST_LEVEL);
+
+		verify(builder).validateTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL);
+	}
+
+	@DisplayName("should validate trust level when")
+	@ParameterizedTest(name = "value is \"{0}\"")
+	@NullAndEmptySource
+	@ValueSource(strings = { "STORK-QAA-Level-1", "STORK-QAA-Level-2", "STORK-QAA-Level-3", "STORK-QAA-Level-4" })
+	void shouldValidateTrustLevelWhen(String trustLevel) {
+		var builder = spy(ServiceKonto.builder());
+
+		builder.validateTrustLevel(trustLevel);
+
+		verify(builder, never()).logError(trustLevel);
+	}
+
+	@DisplayName("should log error when trust level is not expected")
+	@ParameterizedTest(name = "value is \"{0}\"")
+	@ValueSource(strings = { "trust-me", " " })
+	void shouldLogErrorWhenTrustLevelIsNotExpected(String trustLevel) {
+		var builder = spy(ServiceKonto.builder());
+
+		builder.validateTrustLevel(trustLevel);
+
+		verify(builder).logError(trustLevel);
+	}
+}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java
index 7b5645ba07abacb17dd70a1d6873959b2a71f668..d8791679849d93ad70149a507d8d45299c593529 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java
@@ -3,6 +3,7 @@ package de.ozgcloud.vorgang.servicekonto;
 public class ServiceKontoTestFactory {
 
 	public final static String TYPE = "OSI";
+	public final static String TRUST_LEVEL = "STORK-QAA-Level-1";
 
 	public static ServiceKonto create() {
 		return createBuilder().build();
@@ -11,6 +12,7 @@ public class ServiceKontoTestFactory {
 	public static ServiceKonto.ServiceKontoBuilder createBuilder() {
 		return ServiceKonto.builder()
 				.type(TYPE)
+				.trustLevel(TRUST_LEVEL)
 				.postfachAddress(PostfachAddressTestFactory.create());
 	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java
index 9e559153d6bc699f756f384bc2f9c39d84a2f68e..216eb98e9acdd32f73761e69c40c489ffc10a07c 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java
@@ -158,6 +158,7 @@ class VorgangServiceTest {
 
 					assertThat(vorgang.getHeader().getServiceKonto()).isNull();
 				}
+
 			}
 
 		}