diff --git a/.gitignore b/.gitignore
index 3fc1d884b983db7cd48581b4198239e70ebc5119..174f39620a3a67eaad565eae9eaff3b03614809e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ target/
 .idea
 *.iml
 *.orig
+.vscode/
diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 2181142a99ae6775e9d9dedcabe3e516e76c29ab..18496857ab75f33de8fb37f5f43600ed908b2201 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -5,24 +5,31 @@
 	<parent>
 		<groupId>de.ozgcloud.common</groupId>
 		<artifactId>ozgcloud-common-parent</artifactId>
-		<version>4.4.0-SNAPSHOT</version>
+		<version>4.5.0-SNAPSHOT</version>
 		<relativePath />
 	</parent>
 
 	<groupId>de.ozgcloud.bescheid</groupId>
 	<artifactId>bescheid-manager</artifactId>
 	<name>OZG-Cloud Bescheid Manager</name>
-	<version>1.18.0-SNAPSHOT</version>
+	<version>1.20.0-SNAPSHOT</version>
 
 	<properties>
-		<vorgang-manager.version>2.15.0-SNAPSHOT</vorgang-manager.version>
-		<nachrichten-manager.version>2.12.0-PR-31-SNAPSHOT</nachrichten-manager.version>
+		<vorgang-manager.version>2.17.0-SNAPSHOT</vorgang-manager.version>
+		<nachrichten-manager.version>2.9.0</nachrichten-manager.version>
+		<nachrichten-manager.version>2.14.0-PR-31-SNAPSHOT</nachrichten-manager.version>
+		<document-manager.version>1.0.0-SNAPSHOT</document-manager.version>
 		<api-lib.version>0.13.0-PR-31-SNAPSHOT</api-lib.version>
 		<spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
 	</properties>
 
 	<dependencies>
 		<!-- ozg-cloud -->
+		<dependency>
+			<groupId>de.ozgcloud.document</groupId>
+			<artifactId>document-manager-server</artifactId>
+			<version>${document-manager.version}</version>
+		</dependency>
 		<dependency>
 			<groupId>de.ozgcloud.vorgang</groupId>
 			<artifactId>vorgang-manager-interface</artifactId>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
deleted file mode 100644
index 63f65d84733dae7ab98e63095234692c04f09dc7..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.time.LocalDate;
-import java.util.List;
-import java.util.Optional;
-
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.common.binaryfile.FileId;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-
-@Builder(toBuilder = true)
-@Getter
-public class Bescheid {
-
-	public static final String FIELD_VORGANG_ID = "vorgangId";
-	public static final String FIELD_CREATED_BY = "createdBy";
-
-	public static final String FIELD_BEWILLIGT = "bewilligt";
-	public static final String FIELD_STATUS = "status";
-	public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument";
-	public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm";
-	public static final String FIELD_SEND_BY = "sendBy";
-
-	public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
-	public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject";
-	public static final String FIELD_ATTACHMENTS = "attachments";
-	public static final String FIELD_SENT_INFO = "sentInfo";
-
-	private BescheidId id;
-	private long version;
-
-	private VorgangId vorgangId;
-	private UserId createdBy;
-
-	private boolean bewilligt;
-	private Status status;
-	private FileId bescheidDocument;
-	private LocalDate beschiedenAm;
-	private SendBy sendBy;
-
-	private SentInfo sentInfo;
-
-	@Builder.Default
-	private Optional<String> nachrichtSubject = Optional.empty();
-	@Builder.Default
-	private Optional<String> nachrichtText = Optional.empty();
-
-	@Singular
-	private List<FileId> attachments;
-
-	public enum Status {
-		DRAFT, SENT;
-
-		public boolean not(Object value) {
-			return !hasValue(value);
-		}
-
-		public boolean hasValue(Object value) {
-			return this.name().equalsIgnoreCase(String.valueOf(value));
-		}
-	}
-
-	public enum SendBy {
-		NACHRICHT, MANUAL;
-
-		public boolean notValue(Object sendByValue) {
-			return !hasValue(sendByValue);
-		}
-
-		public boolean hasValue(Object sendByValue) {
-			return this.name().equalsIgnoreCase(String.valueOf(sendByValue));
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java
deleted file mode 100644
index c3e424ba83e903aee750e69067b037cd5a6e4875..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static de.ozgcloud.common.grpc.GrpcUtil.*;
-
-import java.util.UUID;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import io.grpc.CallOptions;
-import io.grpc.Channel;
-import io.grpc.ClientCall;
-import io.grpc.ClientInterceptor;
-import io.grpc.ForwardingClientCall.SimpleForwardingClientCall;
-import io.grpc.Metadata;
-import io.grpc.MethodDescriptor;
-
-@Component("bescheidCallContextInterceptor")
-public class BescheidCallContextAttachingInterceptor implements ClientInterceptor {
-
-	public static final String BESCHEID_MANAGER_CLIENT_NAME = "OzgCloud_BescheidManager";
-
-	@Autowired
-	private CurrentUserService userService;
-
-	// <A> = Request, <B> = Response
-	@Override
-	public <A, B> ClientCall<A, B> interceptCall(MethodDescriptor<A, B> method, CallOptions callOptions, Channel next) {
-		return new CallContextAttachingClientCall<>(next.newCall(method, callOptions));
-	}
-
-	final class CallContextAttachingClientCall<A, B> extends SimpleForwardingClientCall<A, B> {
-
-		protected CallContextAttachingClientCall(ClientCall<A, B> delegate) {
-			super(delegate);
-		}
-
-		@Override
-		public void start(Listener<B> responseListener, Metadata headers) {
-			headers.merge(buildCallContextMetadata());
-			super.start(responseListener, headers);
-		}
-
-		private Metadata buildCallContextMetadata() {
-			var metadata = new Metadata();
-
-			userService.getUser().getUserId().ifPresent(userId -> metadata.put(HEADER_KEY_USER_ID, userId.getBytes()));
-			metadata.put(HEADER_KEY_CLIENT_NAME, BESCHEID_MANAGER_CLIENT_NAME.getBytes());
-			metadata.put(HEADER_KEY_REQUEST_ID, generateRequestId().getBytes());
-
-			return metadata;
-		}
-
-		// TODO requestId für command handling uebertragen / erstellen
-		private String generateRequestId() {
-			return UUID.randomUUID().toString();
-		}
-
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java
deleted file mode 100644
index 237f07e8205b684d16980017556901a95034ec2f..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandExecutedEvent;
-
-class BescheidCreatedEvent extends CommandExecutedEvent {
-
-	public BescheidCreatedEvent(Command command) {
-		super(command.getId());
-	}
-
-	public BescheidCreatedEvent(Command command, String createdItemId) {
-		super(command, createdItemId);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java
deleted file mode 100644
index dd8fc4c9c180a9bd7125415509125ad57ab830a0..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java
+++ /dev/null
@@ -1,34 +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.bescheid;
-
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandExecutedEvent;
-
-class BescheidDeletedEvent extends CommandExecutedEvent {
-
-	public BescheidDeletedEvent(Command command) {
-		super(command);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
deleted file mode 100644
index 3beaadf3f4fd167bba8a29b34c613afe2348604c..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
+++ /dev/null
@@ -1,226 +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.bescheid;
-
-import static java.util.Objects.*;
-
-import java.time.LocalDate;
-import java.util.Arrays;
-import java.util.Optional;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.stereotype.Component;
-
-import de.ozgcloud.bescheid.Bescheid.SendBy;
-import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEvent;
-import de.ozgcloud.command.CommandExecutedEvent;
-import de.ozgcloud.command.CommandFailedEvent;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.BescheidDocumentCreatedEvent;
-import de.ozgcloud.document.Document;
-import de.ozgcloud.document.DocumentService;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@Log4j2
-@Component
-@RequiredArgsConstructor
-class BescheidEventListener {
-
-	public static final String CREATE_BESCHEID_ORDER = "CREATE_BESCHEID";
-	public static final String DELETE_BESCHEID_ORDER = "DELETE_BESCHEID";
-	public static final String UPDATE_BESCHEID_ORDER = "UPDATE_BESCHEID";
-	public static final String CREATE_BESCHEID_DOCUMENT_ORDER = "CREATE_BESCHEID_DOCUMENT";
-	public static final String SEND_BESCHEID_ORDER = "SEND_BESCHEID";
-
-	public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> CREATE_BESCHEID_ORDER.equals(command.getOrder());
-	private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}";
-
-	public static final Predicate<Command> IS_DELETE_BESCHEID_COMMAND = command -> DELETE_BESCHEID_ORDER.equals(command.getOrder());
-	private static final String IS_DELETE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_DELETE_BESCHEID_COMMAND.test(event.getSource())}";
-
-	public static final Predicate<Command> IS_UPDATE_BESCHEID_COMMAND = command -> UPDATE_BESCHEID_ORDER.equals(command.getOrder());
-	private static final String IS_UPDATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_UPDATE_BESCHEID_COMMAND.test(event.getSource())}";
-
-	public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_COMMAND = command -> CREATE_BESCHEID_DOCUMENT_ORDER.equals(command.getOrder());
-	private static final String IS_CREATE_BESCHEID_DOCUMENT = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_DOCUMENT_COMMAND.test(event.getSource())}";
-
-	public static final Predicate<Command> IS_SEND_BESCHEID_COMMAND = command -> nonNull(command) && SEND_BESCHEID_ORDER.equals(command.getOrder());
-	private static final String IS_SEND_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getSource())}";
-	private static final String IS_SEND_BESCHEID_ORDER = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getCommand())}";
-
-	static final String VORGANG_ID_BODY_KEY = "vorgangId";
-	static final String BESCHEID_VOM_BODY_KEY = "bescheidVom";
-	static final String GENEHMIGT_BODY_KEY = "genehmigt";
-
-	private static final String LOG_MESSAGE_TEMPLATE = "{}. Command failed.";
-	private static final String ERROR_MESSAGE_TEMPLATE = "Error on executing %s Command.";
-
-	private final BescheidService service;
-	private final BinaryFileService fileService;
-	private final AttachedItemService attachedItemService;
-	private final DocumentService documentService;
-
-	private final ApplicationEventPublisher eventPublisher;
-	private final CurrentUserService userService;
-	private final UserProfileService userProfileService;
-
-	@EventListener(condition = IS_CREATE_BESCHEID)
-	public void onCreateBescheidCommand(CommandCreatedEvent event) {
-		runWithSecurityContext(event.getSource(), this::doCreateBescheid);
-	}
-
-	void doCreateBescheid(Command command) {
-		var createdItemId = service.createBescheidDraft(command);
-		eventPublisher.publishEvent(new BescheidCreatedEvent(command, createdItemId));
-	}
-
-	@EventListener(condition = IS_DELETE_BESCHEID)
-	public void onDeleteBescheid(CommandCreatedEvent event) {
-		runWithSecurityContext(event.getSource(), this::doDeleteBescheid);
-	}
-
-	void doDeleteBescheid(Command command) {
-		attachedItemService.deleteBescheidDraft(command);
-		eventPublisher.publishEvent(new BescheidDeletedEvent(command));
-	}
-
-	@EventListener(condition = IS_UPDATE_BESCHEID)
-	public void onUpdateBescheidCommand(CommandCreatedEvent event) {
-		runWithSecurityContext(event.getSource(), this::doUpdateBescheid);
-	}
-
-	void doUpdateBescheid(Command command) {
-		attachedItemService.updateBescheidDraft(command, getDocument(command));
-		eventPublisher.publishEvent(new BescheidUpdatedEvent(command));
-	}
-
-	Optional<Document> getDocument(Command command) {
-		return Optional.ofNullable(MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT))
-				.map(StringUtils::trimToNull)
-				.map(documentService::getDocument);
-	}
-
-	@EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT)
-	public void onCreatedBescheidDocument(CommandCreatedEvent event) {
-		runWithSecurityContext(event.getSource(), this::doCreateBescheidDocument);
-	}
-
-	void doCreateBescheidDocument(Command command) {
-		var bescheid = doCreateBescheidBiz(command);
-		var bescheidDocument = documentService.createBescheidDocument(command, bescheid);
-		eventPublisher.publishEvent(new BescheidDocumentCreatedEvent(command, bescheidDocument));
-	}
-
-	BescheidResponse doCreateBescheidBiz(@NonNull Command command) {
-		var bescheid = service.createBescheid(createRequest(command));
-		return fileService.uploadBescheidFile(bescheid);
-	}
-
-	@EventListener(condition = IS_SEND_BESCHEID)
-	public void onSendBescheidCommand(CommandCreatedEvent event) {
-		runWithSecurityContext(event.getSource(), this::doSendBescheid);
-	}
-
-	void doSendBescheid(Command command) {
-		var bescheidItem = attachedItemService.getItem(command.getRelationId());
-		if (SendBy.MANUAL.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) {
-			service.sendBescheidManually(bescheidItem, command);
-		} else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) {
-			service.sendBescheidPostfachMail(bescheidItem, command);
-		} else {
-			throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Allowed values are %s."
-					.formatted(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY),
-							Arrays.stream(SendBy.values()).map(SendBy::name).collect(Collectors.joining(","))));
-		}
-		eventPublisher.publishEvent(new BescheidSentEvent(command));
-	}
-
-	BescheidRequest createRequest(Command command) {
-		var eventBody = command.getBodyObject();
-		var builder = BescheidRequest.builder();
-
-		builder.vorgangId(VorgangId.from(command.getVorgangId()));
-		Optional.ofNullable(MapUtils.getString(eventBody, BESCHEID_VOM_BODY_KEY))
-				.map(LocalDate::parse).ifPresent(builder::bescheidVom);
-		Optional.ofNullable(MapUtils.getBoolean(eventBody, GENEHMIGT_BODY_KEY))
-				.ifPresentOrElse(builder::genehmigt, () -> builder.genehmigt(true));
-		builder.createFor(userProfileService.getUserProfile());
-
-		return builder.build();
-	}
-
-	@EventListener(condition = IS_SEND_BESCHEID_ORDER)
-	public void onBescheidSent(CommandExecutedEvent event) {
-		runWithSecurityContext(event.getCommand(), this::setAntragBewilligung);
-	}
-
-	void setAntragBewilligung(Command command) {
-		service.setAntragBewilligung(attachedItemService.getItem(command.getRelationId()));
-	}
-
-	void runWithSecurityContext(Command command, Consumer<Command> commandExecutor) {
-		SecurityContext prevContext = null;
-		try {
-			prevContext = userService.startSecurityContext(command);
-			commandExecutor.accept(command);
-		} catch (Exception e) {
-			var errorMessage = ERROR_MESSAGE_TEMPLATE.formatted(command.getOrder());
-			LOG.error(LOG_MESSAGE_TEMPLATE, errorMessage, e);
-			eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(errorMessage, e)));
-		} finally {
-			userService.resetSecurityContext(prevContext);
-		}
-	}
-
-	private String buildErrorMessage(String message, Exception cause) {
-		try {
-			StringBuilder sb = new StringBuilder(message);
-
-			if (StringUtils.isNotBlank(cause.getMessage())) {
-				sb.append(" Cause: ").append(cause.getMessage());
-			}
-
-			return sb.toString();
-		} catch (Exception e2) {
-			LOG.error("Error in building Error Message (sick).", e2);
-			return message;
-		}
-	}
-
-}
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 a4636f96286f70d63b1edc7c45ea6d317744cc2f..81a7307914080aac3ab9599d2b6c20e38b168863 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
@@ -3,17 +3,25 @@ package de.ozgcloud.bescheid;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
 import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.BescheidService;
+import de.ozgcloud.document.bescheid.vorgang.VorgangId;
 import io.grpc.stub.StreamObserver;
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.server.service.GrpcService;
 
 @GrpcService
 @RequiredArgsConstructor
+@Deprecated
+@Component("deprecatedBescheidGrpcService")
 class BescheidGrpcService extends BescheidServiceImplBase {
 
 	private final BescheidService service;
+	@Qualifier("deprecatedBescheidMapper")
 	private final BescheidMapper mapper;
 
 	@Override
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java
deleted file mode 100644
index 4c0f60434f23ebdc201ed906cdc5eb80f9a363cd..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import de.ozgcloud.common.datatype.StringBasedValue;
-
-public class BescheidId extends StringBasedValue {
-
-	BescheidId(String id) {
-		super(id);
-	}
-
-	public static BescheidId from(String id) {
-		return new BescheidId(id);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java
deleted file mode 100644
index 7fbeae993b492c3a8f0d891641640faac9958065..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java
+++ /dev/null
@@ -1,43 +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.bescheid;
-
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class BescheidManagerConfig {
-
-	private String version;
-	private String javaVersion;
-	private Features features;
-
-	@Builder
-	@Getter
-	static class Features {
-
-		private boolean canCreateBescheidDocument;
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java
deleted file mode 100644
index 824f5ad0608057bec16dd5ef1d701fe481d9ff71..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java
+++ /dev/null
@@ -1,49 +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.bescheid;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService;
-import de.ozgcloud.bescheid.common.callcontext.BescheidManagerCallContextProvider;
-import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc;
-import net.devh.boot.grpc.client.inject.GrpcClient;
-
-@Configuration
-public class BescheidManagerConfiguration {
-
-	public static final String COMMAND_SERVICE_NAME = "bescheid_OzgCloudCommandService";
-
-	@GrpcClient("command-manager")
-	private CommandServiceGrpc.CommandServiceBlockingStub commandServiceStub;
-
-	@Bean(COMMAND_SERVICE_NAME)
-	OzgCloudCommandService grpcOzgCloudCommandService(CommandMapper commandMapper, BescheidManagerCallContextProvider contextProvider) {
-		return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider,
-				GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java
index 28d4be14a789e33ff2b5b301c70341ad80f0b560..7624432d0d5ca27ce50af9db638acd3ee045fd47 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.bescheid;
 
-import static de.ozgcloud.bescheid.Bescheid.*;
+import static de.ozgcloud.document.bescheid.Bescheid.*;
 
 import java.time.LocalDate;
 import java.util.Collection;
@@ -13,6 +13,7 @@ import java.util.Optional;
 
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.AnnotateWith;
 import org.mapstruct.CollectionMappingStrategy;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
@@ -20,19 +21,29 @@ import org.mapstruct.NullValueCheckStrategy;
 import org.mapstruct.NullValuePropertyMappingStrategy;
 import org.mapstruct.ReportingPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
-import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.command.Command;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.common.datatype.StringBasedValue;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.Bescheid.SendBy;
+import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.document.bescheid.BescheidId;
+import de.ozgcloud.document.bescheid.BescheidManagerConfig;
+import de.ozgcloud.document.bescheid.SentInfo;
+import de.ozgcloud.document.bescheid.UserId;
+import de.ozgcloud.document.bescheid.vorgang.VorgangId;
+import de.ozgcloud.document.common.attached_item.AttachedItem;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 
 @Mapper(uses = { SentInfoMapper.class }, //
 		unmappedTargetPolicy = ReportingPolicy.WARN, //
 		collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, //
 		nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, //
 		nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) //
+@AnnotateWith(value = Component.class, elements = @AnnotateWith.Element(strings = "deprecatedBescheidMapper"))
+@Deprecated
 public abstract class BescheidMapper {
 
 	@Autowired
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
deleted file mode 100644
index 3110e878975886da00f8989e378afc465415f67c..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-
-public interface BescheidRemoteService {
-
-	BescheidResponse create(BescheidRequest request, Vorgang vorgang);
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
deleted file mode 100644
index bd827b7b2f17effbf96c62304087fcf873925227..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.time.LocalDate;
-
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class BescheidRequest {
-
-	private VorgangId vorgangId;
-
-	private LocalDate bescheidVom;
-	private boolean genehmigt;
-
-	private UserProfile createFor;
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java
deleted file mode 100644
index 234aec472536d4d2b549abda4606d2368f2bbd74..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.io.File;
-import java.util.List;
-import java.util.Optional;
-
-import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.common.binaryfile.FileId;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-import lombok.With;
-
-@Builder(toBuilder = true)
-@Getter
-public class BescheidResponse {
-
-	private VorgangId vorgangId;
-
-	private boolean bewilligt;
-	private UserId createdBy;
-
-	private String bescheidFileName;
-	private File bescheidFile;
-	@With
-	private FileId bescheidFileId;
-	private String contentType;
-	private long size;
-
-	@Builder.Default
-	private Optional<String> nachrichtSubject = Optional.empty();
-	@Builder.Default
-	private Optional<String> nachrichtText = Optional.empty();
-
-	@Singular
-	private List<FileId> attachments;
-
-	private ServiceKonto serviceKonto;
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java
deleted file mode 100644
index 8bfb22f6eec2e1cdee3bef6f7414dedfad82bd26..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java
+++ /dev/null
@@ -1,34 +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.bescheid;
-
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandExecutedEvent;
-
-public class BescheidSentEvent extends CommandExecutedEvent {
-
-	public BescheidSentEvent(final Command command) {
-		super(command);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
deleted file mode 100644
index cd1d2fc2ccb45a29beedfc74b4d90b7ecc8d559f..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
+++ /dev/null
@@ -1,378 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static java.util.Objects.*;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import jakarta.annotation.PostConstruct;
-
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.info.BuildProperties;
-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.OzgCloudCreateSubCommandsRequest;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.administration.AdministrationService;
-import de.ozgcloud.bescheid.attributes.ClientAttributeService;
-import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.bescheid.vorgang.VorgangService;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.Document;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@Service
-@Log4j2
-@RequiredArgsConstructor
-public class BescheidService {
-
-	static final String DEFAULT_NACHRICHT_SUBJECT = "Ihr Bescheid zum Antrag";
-	public static final String DEFAULT_NACHRICHT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh";
-	public static final String KEY_TEMPLATE_SIGNATURE = "signature";
-
-	private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured.";
-
-	static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN";
-	static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL";
-	static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT";
-
-	static final String FIELD_POSTFACH_ID = "postfachId";
-	static final String FIELD_REPLY_OPTION = "replyOption";
-	static final String REPLY_OPTION = "FORBIDDEN";
-	static final String FIELD_SUBJECT = "subject";
-	static final String FIELD_MAIL_BODY = "mailBody";
-	static final String FIELD_ATTACHMENTS = "attachments";
-	static final String SUBJECT = "Ihr Bescheid zum Antrag";
-
-	private final VorgangService vorgangService;
-	private final AttachedItemService attachedItemService;
-	private final UserProfileService userProfileService;
-	@Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME)
-	private final OzgCloudCommandService commandService;
-	private final AdministrationService administrationService;
-
-	private final CommandMapper commandMapper;
-	private final ClientAttributeService bescheidClientAttributeService;
-	private final BuildProperties buildProperties;
-	private final Optional<BescheidRemoteService> remoteService;
-	private final BescheidMapper mapper;
-
-	private final TemplateHandler templateHandler;
-
-	@PostConstruct
-	void logStatus() {
-		remoteService.ifPresentOrElse(
-				service -> LOG.info("Bescheid-Manager is configured."),
-				() -> LOG.info("No BescheidRemoteService configured - Bescheid creation is not possible."));
-	}
-
-	public Optional<Bescheid> findDraft(String vorgangId) {
-		return attachedItemService.findBescheidItem(VorgangId.from(vorgangId)).map(mapper::mapFromAttachedItem);
-	}
-
-	public Stream<Bescheid> findAll(VorgangId vorgangId) {
-		return attachedItemService.findAllBescheid(vorgangId).stream().map(mapper::mapFromAttachedItem);
-	}
-
-	public String createBescheidDraft(Command createBescheidDraftCommand) {
-		validateBescheidData(createBescheidDraftCommand.getBodyObject());
-		return attachedItemService.createBescheidDraft(buildBescheidDraft(createBescheidDraftCommand));
-	}
-
-	void validateBescheidData(Map<String, Object> bodyObject) {
-		validateBescheidField(bodyObject, Bescheid.FIELD_BESCHIEDEN_AM);
-		validateBescheidField(bodyObject, Bescheid.FIELD_BEWILLIGT);
-		validateSendBy(MapUtils.getString(bodyObject, Bescheid.FIELD_SEND_BY));
-	}
-
-	void validateBescheidField(Map<String, Object> bescheid, String field) {
-		if (isNull(bescheid.get(field))) {
-			throw new TechnicalException("Fields '%s' is required for bescheid creation".formatted(field));
-		}
-	}
-
-	void validateSendBy(String sendBy) {
-		if (isUnknownSendByValue(sendBy)) {
-			var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name)
-					.collect(Collectors.joining(","));
-			var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy,
-					possibleSendByValues);
-			throw new TechnicalException(message);
-		}
-	}
-
-	private boolean isUnknownSendByValue(String sendByValue) {
-		return Arrays.stream(Bescheid.SendBy.values()).noneMatch(sendBy -> sendBy.hasValue(sendByValue));
-	}
-
-	Bescheid buildBescheidDraft(Command command) {
-		var bescheid = mapper.mapFromCommand(command);
-		var resultBuilder = bescheid.toBuilder().id(null).version(0).status(Bescheid.Status.DRAFT);
-		if (bescheid.getNachrichtSubject().isEmpty()) {
-			resultBuilder.nachrichtSubject(Optional.of(DEFAULT_NACHRICHT_SUBJECT));
-		}
-		if (bescheid.getNachrichtText().isEmpty()) {
-			resultBuilder.nachrichtText(Optional.of(createNachrichtText()));
-		}
-		return resultBuilder.build();
-	}
-
-	String createNachrichtText() {
-		return templateHandler.fillTemplate(DEFAULT_NACHRICHT_TEMPLATE_FILE, getTemplateParameters());
-	}
-
-	Map<String, Object> getTemplateParameters() {
-		return administrationService.getNachrichtSignature().map(signature -> Map.<String, Object>of(KEY_TEMPLATE_SIGNATURE, signature))
-				.orElseGet(Collections::emptyMap);
-	}
-
-	public BescheidResponse createBescheid(BescheidRequest request) {
-		checkRemoteService();
-
-		return doCreateBescheid(request);
-	}
-
-	private BescheidResponse doCreateBescheid(BescheidRequest request) {
-		var vorgang = vorgangService.getById(request.getVorgangId());
-		return remoteService.map(service -> service.create(request, vorgang))
-				.map(bescheid -> updateBescheid(bescheid, vorgang))
-				.orElseThrow(() -> new TechnicalException(ERROR_MESSAGE_NO_SERVICE));
-	}
-
-	private BescheidResponse updateBescheid(BescheidResponse bescheid, Vorgang vorgang) {
-		return bescheid.toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()).build();
-	}
-
-	private void checkRemoteService() {
-		if (remoteService.isEmpty()) {
-			LOG.error(ERROR_MESSAGE_NO_SERVICE);
-			throw new TechnicalException(ERROR_MESSAGE_NO_SERVICE);
-		}
-	}
-
-	public void sendBescheidManually(AttachedItem bescheidItem, Command parentCommand) {
-		validateBescheidSendManually(bescheidItem, parentCommand.getRelationVersion());
-		var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId()));
-		addSubCommands(parentCommand.getId(), buildSetBescheidSentSubCommands(bescheidItem, vorgang, getUserId()));
-	}
-
-	void validateBescheidSendManually(AttachedItem bescheidItem, long version) {
-		validateBescheid(bescheidItem, version);
-		var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY);
-		if (Bescheid.SendBy.MANUAL.notValue(sendBy)) {
-			throw new TechnicalException(
-					"Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL));
-		}
-	}
-
-	public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) {
-		validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion());
-		var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId()));
-		var userId = getUserId();
-		var subCommands = buildSetBescheidSentSubCommands(bescheidItem, vorgang, userId);
-		subCommands.add(buildSendPostfachNachrichtCommand(bescheidItem, vorgang.getServiceKonto(), userId));
-		addSubCommands(parentCommand.getId(), subCommands);
-	}
-
-	public void validateBescheidSendPostfach(AttachedItem bescheidItem, long version) {
-		validateBescheid(bescheidItem, version);
-		var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY);
-		if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) {
-			throw new TechnicalException(
-					"Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT));
-		}
-		if (getNachrichtSubject(bescheidItem).isEmpty()) {
-			throw new TechnicalException("Bescheid has no nachricht subject");
-		}
-		if (getNachrichtText(bescheidItem).isEmpty()) {
-			throw new TechnicalException("Bescheid has no nachricht text");
-		}
-	}
-
-	void validateBescheid(AttachedItem bescheidItem, long version) {
-		if (bescheidItem.getVersion() != version) {
-			throw new TechnicalException("Bescheid has different version. Expected: %d, but was: %d".formatted(version, bescheidItem.getVersion()));
-		}
-		var status = MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_STATUS);
-		if (Bescheid.Status.DRAFT.not(status)) {
-			throw new TechnicalException("Bescheid has status '%s'. Bescheid must have status DRAFT".formatted(status));
-		}
-		if (StringUtils.isBlank(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT))) {
-			throw new TechnicalException("Bescheid has no document");
-		}
-	}
-
-	Optional<String> getNachrichtSubject(AttachedItem bescheidItem) {
-		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT))
-				.map(StringUtils::trimToNull);
-	}
-
-	Optional<String> getNachrichtText(AttachedItem bescheidItem) {
-		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT))
-				.map(StringUtils::trimToNull);
-	}
-
-	String getUserId() {
-		return userProfileService.getUserProfile().getId().toString();
-	}
-
-	List<OzgCloudCommand> buildSetBescheidSentSubCommands(AttachedItem bescheidItem, Vorgang vorgang, String userId) {
-		var subCommands = new ArrayList<OzgCloudCommand>();
-		subCommands.add(buildVorgangBescheidenCommand(vorgang));
-		subCommands.add(buildSetBescheidSentStatusCommand(bescheidItem, userId));
-		return subCommands;
-	}
-
-	OzgCloudCommand buildVorgangBescheidenCommand(Vorgang vorgang) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString()))
-				.relationId(commandMapper.mapRelationId(vorgang.getId().toString()))
-				.relationVersion(vorgang.getVersion())
-				.order(VORGANG_BESCHEIDEN_ORDER)
-				.build();
-	}
-
-	OzgCloudCommand buildSetBescheidSentStatusCommand(AttachedItem bescheidItem, String userId) {
-		return OzgCloudCommand.builder()
-				.relationId(commandMapper.mapRelationId(bescheidItem.getId()))
-				.relationVersion(bescheidItem.getVersion())
-				.order(AttachedItemService.PATCH_ATTACHED_ITEM)
-				.bodyObject(Map.of(
-						AttachedItem.PROPERTY_ID, bescheidItem.getId(),
-						AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem(userId)))
-				.build();
-	}
-
-	Map<String, Object> buildBescheidSentStatusItem(String userId) {
-		return Map.of(
-				Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(),
-				Bescheid.FIELD_SENT_INFO, buildSentInfoMap(userId));
-	}
-
-	Map<String, Object> buildSentInfoMap(String userId) {
-		return Map.of(
-				SentInfo.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),
-				SentInfo.FIELD_SENT_BY, userId);
-	}
-
-	OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) {
-		var bodyObject = buildSendNachrichtCommandBody(bescheidItem, buildPostfachAddress(serviceKonto.getPostfachAddresses().getFirst(),
-				serviceKonto.getType()));
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId()))
-				.order(SEND_POSTFACH_NACHRICHT_ORDER)
-				.createdBy(commandMapper.toOzgCloudUserId(userId))
-				.bodyObject(bodyObject)
-				.build();
-	}
-
-	Map<String, Object> buildPostfachAddress(Vorgang.PostfachAddress postfachAddress, String serviceKontoType) {
-		return Map.of(Vorgang.PostfachAddress.FIELD_TYPE, postfachAddress.getType(),
-				Vorgang.PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(),
-				Vorgang.PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(),
-				Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, serviceKontoType);
-	}
-
-	Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> postfachAddress) {
-		return Map.of(
-				FIELD_REPLY_OPTION, REPLY_OPTION,
-				FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(SUBJECT),
-				FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY),
-				FIELD_ATTACHMENTS, buildAttachments(bescheidItem),
-				Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress);
-
-	}
-
-	List<String> buildAttachments(AttachedItem bescheidItem) {
-		return Stream.concat(Stream.of(getBescheidFileId(bescheidItem)), getAttachments(bescheidItem).stream()).map(FileId::toString).toList();
-	}
-
-	FileId getBescheidFileId(AttachedItem bescheidItem) {
-		var bescheidDocument = attachedItemService.getItem(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT));
-		return FileId.from(MapUtils.getString(bescheidDocument.getItem(), Document.FIELD_DOCUMENT_FILE));
-	}
-
-	List<FileId> getAttachments(AttachedItem bescheidItem) {
-		var attachmentsObject = bescheidItem.getItem().get(Bescheid.FIELD_ATTACHMENTS);
-		if (attachmentsObject instanceof Collection<?> attachments) {
-			return attachments.stream().map(String::valueOf).map(FileId::from).toList();
-		}
-		return getStringAsList(attachmentsObject);
-	}
-
-	List<FileId> getStringAsList(Object attachmentsObject) {
-		if (attachmentsObject instanceof String attachment && StringUtils.isNotBlank(attachment)) {
-			return Collections.singletonList(FileId.from(attachment));
-		}
-		return Collections.emptyList();
-	}
-
-	void addSubCommands(String parentCommandId, List<OzgCloudCommand> subCommands) {
-		commandService.addSubCommands(buildCreateSubCommandsRequest(parentCommandId, subCommands));
-	}
-
-	OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(String parentCommandId, List<OzgCloudCommand> subCommands) {
-		return OzgCloudCreateSubCommandsRequest.builder()
-				.parentId(parentCommandId)
-				.executionMode(SUBCOMMANDS_EXECUTION_MODE)
-				.completedIfSubsCompleted(true)
-				.subCommands(subCommands)
-				.build();
-	}
-
-	public void setAntragBewilligung(AttachedItem bescheidItem) {
-		try {
-			bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem));
-		} catch (Exception e) {
-			LOG.error("Cannot set antrag result on vorgang (id: {})", bescheidItem.getVorgangId(), e);
-		}
-	}
-
-	boolean getBewilligt(AttachedItem bescheidItem) {
-		return MapUtils.getBooleanValue(bescheidItem.getItem(), Bescheid.FIELD_BEWILLIGT, false);
-	}
-
-	public BescheidManagerConfig getConfig() {
-		return BescheidManagerConfig.builder()
-				.version(buildProperties.getVersion())
-				.javaVersion(getJavaVersion())
-				.features(buildFeatures())
-				.build();
-	}
-
-	String getJavaVersion() {
-		return System.getProperty("java.version");
-	}
-
-	BescheidManagerConfig.Features buildFeatures() {
-		return BescheidManagerConfig.Features.builder()
-				.canCreateBescheidDocument(remoteService.isPresent())
-				.build();
-	}
-
-	public Bescheid getBescheid(String id) {
-		return mapper.mapFromAttachedItem(attachedItemService.getItem(id));
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java
deleted file mode 100644
index a6021663da81fbecf37f177b3d522cefeb7d8afb..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandExecutedEvent;
-
-class BescheidUpdatedEvent extends CommandExecutedEvent {
-
-	public BescheidUpdatedEvent(Command command) {
-		super(command);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
index 95c5b586e88adc7881815f3331ad7213f5bcb530..0d7c6c9309c551922060c4f82efe5df3859d9373 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
@@ -7,12 +7,18 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.commons.collections.MapUtils;
+import org.mapstruct.AnnotateWith;
 import org.mapstruct.CollectionMappingStrategy;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.document.bescheid.SentInfo;
 
 @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
+@AnnotateWith(value = Component.class, elements = @AnnotateWith.Element(strings = "deprecatedSentInfoMapper"))
+@Deprecated
 public interface SentInfoMapper {
 
 	String GRPC_DATE_TIME_FORMATTER = "yyyy-MM-dd'T'HH:mm:ss'Z'";
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java
deleted file mode 100644
index d92b4024521b151c049a71edc1f22f3bafa55de0..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.util.Objects;
-
-import de.ozgcloud.common.datatype.StringBasedValue;
-import lombok.EqualsAndHashCode;
-
-@EqualsAndHashCode(callSuper = true)
-public class UserId extends StringBasedValue {
-
-	UserId(String userId) {
-		super(userId);
-	}
-
-	public static UserId from(String userId) {
-		if (Objects.nonNull(userId)) {
-			return new UserId(userId);
-		}
-		return null;
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java
deleted file mode 100644
index 59f93a0239f649eb4156fb5512494e06749066d9..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java
+++ /dev/null
@@ -1,44 +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.bescheid.administration;
-
-import java.util.Optional;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
-import org.springframework.context.annotation.Configuration;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@RefreshScope
-@Configuration
-@ConfigurationProperties(prefix = "ozgcloud.postfach")
-public class AdministrationProperties {
-
-	private Optional<String> signatur = Optional.empty();
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java
deleted file mode 100644
index 920c5ea67d8285d1646b7840bf6c5fd91fb8c1ab..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java
+++ /dev/null
@@ -1,47 +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.bescheid.administration;
-
-import java.util.Optional;
-
-import org.springframework.cloud.endpoint.RefreshEndpoint;
-import org.springframework.stereotype.Service;
-
-import lombok.RequiredArgsConstructor;
-
-@Service
-@RequiredArgsConstructor
-public class AdministrationService {
-
-	private final AdministrationProperties administrationProperties;
-	private final RefreshEndpoint refreshEndpoint;
-
-	public Optional<String> getNachrichtSignature() {
-		return administrationProperties.getSignatur();
-	}
-
-	public void refreshConfig() {
-		refreshEndpoint.refresh();
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java
deleted file mode 100644
index 41fde870cc01fe94e9d2089742e77ffffd6a3f4a..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java
+++ /dev/null
@@ -1,43 +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.bescheid.administration;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import lombok.RequiredArgsConstructor;
-
-@Component
-@ConditionalOnProperty(value = "ozgcloud.administration.sync.enabled", havingValue = "true", matchIfMissing = true)
-@RequiredArgsConstructor
-public class AdministrationSyncScheduler {
-
-	private final AdministrationService service;
-
-	@Scheduled(initialDelayString = "${ozgcloud.administration.sync.delay}", fixedDelayString = "${ozgcloud.administration.sync.delay}")
-	public void sync() {
-		service.refreshConfig();
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java
deleted file mode 100644
index d87ae7496591bc23df9ba65148ca8c5f2ba24559..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java
+++ /dev/null
@@ -1,66 +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.
- */
-package de.ozgcloud.bescheid.attributes;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
-import io.grpc.ClientInterceptor;
-import net.devh.boot.grpc.client.inject.GrpcClient;
-
-@Service("bescheid_ClientAttributeRemoteService")
-class ClientAttributeRemoteService {
-
-	@GrpcClient("vorgang-manager")
-	private ClientAttributeServiceBlockingStub serviceBlockingStub;
-
-	@Autowired
-	private ClientInterceptor bescheidCallContextInterceptor;
-
-	public void setBooleanReadOnlyClientAttribute(String vorgangId, String attributeName, boolean value) {
-		serviceBlockingStub.withInterceptors(bescheidCallContextInterceptor).set(buildRequest(vorgangId, attributeName, value));
-	}
-
-	GrpcSetClientAttributeRequest buildRequest(String vorgangId, String attributeName, boolean value) {
-		return GrpcSetClientAttributeRequest.newBuilder()
-				.setVorgangId(vorgangId)
-				.setAttribute(buildClientAttribute(attributeName, value))
-				.build();
-	}
-
-	GrpcClientAttribute buildClientAttribute(String attributeName, boolean value) {
-		return GrpcClientAttribute.newBuilder()
-				.setClientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME)
-				.setAccess(GrpcAccessPermission.READ_ONLY)
-				.setAttributeName(attributeName)
-				.setValue(GrpcClientAttributeValue.newBuilder().setBoolValue(value).build())
-				.build();
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java
deleted file mode 100644
index 158597163c2ee60cfc4640a47e4704b453bda5b6..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java
+++ /dev/null
@@ -1,42 +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.
- */
-package de.ozgcloud.bescheid.attributes;
-
-import org.springframework.stereotype.Service;
-
-import lombok.RequiredArgsConstructor;
-
-@Service("bescheid_ClientAttributeService")
-@RequiredArgsConstructor
-public class ClientAttributeService {
-
-	public static final String ATTRIBUTE_NAME_ANTRAG_BEWILLIGT = "antragBewilligt";
-
-	private final ClientAttributeRemoteService bescheidClientAttributeRemoteService;
-
-	public void setAntragResult(String vorgangId, boolean antragResult) {
-		bescheidClientAttributeRemoteService.setBooleanReadOnlyClientAttribute(vorgangId, ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, antragResult);
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
deleted file mode 100644
index 08cac0cfb0bb41e32c4c71b4ad88556326607c4f..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package de.ozgcloud.bescheid.binaryfile;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.apache.commons.io.IOUtils;
-import org.springframework.stereotype.Service;
-
-import com.google.protobuf.ByteString;
-
-import de.ozgcloud.bescheid.BescheidResponse;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils;
-import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub;
-import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileMetaData;
-import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileRequest;
-import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse;
-import de.ozgcloud.vorgang.grpc.command.GrpcCallContext;
-import io.grpc.stub.CallStreamObserver;
-import io.grpc.stub.StreamObserver;
-import lombok.NonNull;
-import net.devh.boot.grpc.client.inject.GrpcClient;
-
-@Service
-class BinaryFileRemoteService {
-
-	private static final String CALL_CONTEXT_CLIENT = "bescheid-manager";
-	private static final String VORGANG_ATTACHMENT_FIELD = "bescheid";
-
-	@GrpcClient("vorgang-manager")
-	private BinaryFileServiceStub binaryFileRemoteStub;
-
-	public FileId uploadBescheidFile(@NonNull BescheidResponse bescheid) {
-		try (var in = openFile(bescheid.getBescheidFile())) {
-			var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, in,
-					this::buildCallStreamObserver)
-					.withMetaData(buildMetaDataRequest(bescheid))
-					.send();
-
-			return FileId.from(waitUntilFutureToComplete(resultFuture, in).getFileId());
-		} catch (IOException e) {
-			throw new TechnicalException("Error on uploading file.", e);
-		}
-	}
-
-	private InputStream openFile(File file) {
-		try {
-			return new FileInputStream(file);
-		} catch (FileNotFoundException e) {
-			throw new TechnicalException("File to upload not found.", e);
-		}
-	}
-
-	private GrpcUploadBinaryFileRequest buildMetaDataRequest(BescheidResponse bescheid) {
-		return GrpcUploadBinaryFileRequest.newBuilder()
-				.setMetadata(GrpcUploadBinaryFileMetaData.newBuilder()
-						// TODO remove context - check why needed!
-						.setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build())
-						.setVorgangId(bescheid.getVorgangId().toString())
-						.setField(VORGANG_ATTACHMENT_FIELD)
-						.setContentType(bescheid.getContentType())
-						.setSize(bescheid.getBescheidFile().length())
-						.setFileName(bescheid.getBescheidFileName())
-						.build())
-				.build();
-	}
-
-	private GrpcUploadBinaryFileRequest buildChunkRequest(byte[] bytes, Integer length) {
-		return GrpcUploadBinaryFileRequest.newBuilder().setFileContent((ByteString.copyFrom(bytes, 0, length))).build();
-	}
-
-	private CallStreamObserver<GrpcUploadBinaryFileRequest> buildCallStreamObserver(
-			StreamObserver<GrpcUploadBinaryFileResponse> responseObserver) {
-		return (CallStreamObserver<GrpcUploadBinaryFileRequest>) binaryFileRemoteStub.uploadBinaryFileAsStream(responseObserver);
-	}
-
-	GrpcUploadBinaryFileResponse waitUntilFutureToComplete(FileSender<GrpcUploadBinaryFileRequest, GrpcUploadBinaryFileResponse> fileSender,
-			InputStream fileContentStream) {
-		try {
-			return fileSender.getResultFuture().get(10, TimeUnit.MINUTES);
-		} catch (InterruptedException e) {
-			Thread.currentThread().interrupt();
-			fileSender.cancelOnError(e);
-			throw new TechnicalException("Waiting for finishing upload was interrupted.", e);
-		} catch (ExecutionException | TimeoutException e) {
-			fileSender.cancelOnTimeout();
-			throw new TechnicalException("Error / Timeout on uploading data.", e);
-		} finally {
-			IOUtils.closeQuietly(fileContentStream);
-		}
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
deleted file mode 100644
index 11ddd6e95554acaf4a7839057a92489f373fa1c2..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.ozgcloud.bescheid.binaryfile;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.bescheid.BescheidResponse;
-import lombok.NonNull;
-
-@Service
-public class BinaryFileService {
-
-	@Autowired
-	private BinaryFileRemoteService remoteService;
-
-	public BescheidResponse uploadBescheidFile(@NonNull BescheidResponse bescheid) {
-		var fileId = remoteService.uploadBescheidFile(bescheid);
-
-		return bescheid.withBescheidFileId(fileId);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java
deleted file mode 100644
index 40cbdaffe962730c81d9c95239babda672aac989..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java
+++ /dev/null
@@ -1,52 +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.bescheid.common.callcontext;
-
-import java.util.Optional;
-
-import org.springframework.stereotype.Component;
-
-import de.ozgcloud.apilib.common.callcontext.CallContext;
-import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
-import de.ozgcloud.apilib.user.OzgCloudUserId;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import lombok.RequiredArgsConstructor;
-
-@Component
-@RequiredArgsConstructor
-public class BescheidManagerCallContextProvider implements OzgCloudCallContextProvider {
-
-	private final CurrentUserService currentUserService;
-
-	@Override
-	public CallContext provideContext() {
-		var callContextBuilder = CallContext.builder().clientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		getUserId().ifPresent(callContextBuilder::userId);
-		return callContextBuilder.build();
-	}
-
-	Optional<OzgCloudUserId> getUserId() {
-		return currentUserService.getUser().getUserId().map(OzgCloudUserId::from);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java
deleted file mode 100644
index 77ec99f9581295e299a16064de28351cfc3ffaf4..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java
+++ /dev/null
@@ -1,64 +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.
- */
-package de.ozgcloud.bescheid.common.callcontext;
-
-import java.util.Collection;
-import java.util.stream.Collectors;
-
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-
-import lombok.EqualsAndHashCode;
-
-@EqualsAndHashCode(callSuper = true)
-public class CallContextAuthenticationToken extends AbstractAuthenticationToken {
-
-	private final CallContextUser user;
-
-	static CallContextAuthenticationToken authenticate(CallContextUser user) {
-		return new CallContextAuthenticationToken(user);
-	}
-
-	private CallContextAuthenticationToken(CallContextUser user) {
-		super(user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet()));
-		this.user = user;
-		super.setAuthenticated(true);
-	}
-
-	@Override
-	public Object getCredentials() {
-		return null;
-	}
-
-	@Override
-	public Object getPrincipal() {
-		return user;
-	}
-
-	@Override
-	public Collection<GrantedAuthority> getAuthorities() {
-		return user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toUnmodifiableSet());
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java
deleted file mode 100644
index 667bb03d8dacb64af48b7d542c893cdca0d594c2..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java
+++ /dev/null
@@ -1,58 +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.
- */
-package de.ozgcloud.bescheid.common.callcontext;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Optional;
-
-import org.springframework.security.core.AuthenticatedPrincipal;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-
-@Builder
-@Getter
-public class CallContextUser implements AuthenticatedPrincipal, Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	private final String clientName;
-
-	@Builder.Default
-	private final transient Optional<String> userId = Optional.empty();
-	@Builder.Default
-	private final transient Optional<String> userName = Optional.empty();
-	@Singular
-	private final Collection<String> organisatorischeEinheitenIds;
-	@Builder.Default
-	private final transient boolean organisationEinheitenIdCheckNecessary = false;
-
-	@Override
-	public String getName() {
-		return clientName;
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java
deleted file mode 100644
index b77b10a648b85eb1da8a39dfc30ecd6a00f18cd9..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java
+++ /dev/null
@@ -1,106 +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.
- */
-package de.ozgcloud.bescheid.common.callcontext;
-
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.security.authentication.AuthenticationTrustResolver;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.command.Command;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-@Service("bescheid_currentUserService")
-public class CurrentUserService {
-
-	private final AuthenticationTrustResolver trustResolver;
-
-	public CallContextUser getUser() {
-		return findUser().orElseThrow(() -> new IllegalStateException("No authenticated User found"));
-	}
-
-	public Optional<CallContextUser> findUser() {
-		return findTrustedAuthentication()
-				.map(this::mapToCallContextUser)
-				// remove this filter as soon we have a trusted authentication
-				.filter(user -> StringUtils.isNotBlank(user.getClientName()));
-	}
-
-	private CallContextUser mapToCallContextUser(Authentication auth) {
-		if (auth instanceof CallContextAuthenticationToken) {
-			return (CallContextUser) auth.getPrincipal();
-		} else {
-			return CallContextUser.builder()
-					.clientName(auth.getName())
-					.organisatorischeEinheitenIds(
-							auth.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toUnmodifiableSet()))
-					.build();
-		}
-	}
-
-	public Optional<Authentication> findAuthentication() {
-		return findTrustedAuthentication();
-	}
-
-	Optional<Authentication> findTrustedAuthentication() {
-		return Optional.ofNullable(SecurityContextHolder.getContext())
-				.map(SecurityContext::getAuthentication)
-				.filter(auth -> !trustResolver.isAnonymous(auth))
-				.filter(Authentication::isAuthenticated);
-	}
-
-	public SecurityContext startSecurityContext(Command command) {
-		var prevContext = SecurityContextHolder.getContext();
-
-		SecurityContextHolder.clearContext();
-		SecurityContextHolder.getContext().setAuthentication(CallContextAuthenticationToken.authenticate(createUser(command)));
-
-		return prevContext;
-	}
-
-	CallContextUser createUser(Command command) {
-		var builder = CallContextUser.builder()
-				.userId(Optional.ofNullable(command.getCreatedBy()))
-				.userName(Optional.ofNullable(command.getCreatedByName()))
-				.clientName("Alfa") // FIXME read client name from command
-				.organisationEinheitenIdCheckNecessary(false);
-
-		return builder.build();
-	}
-
-	public void resetSecurityContext(SecurityContext context) {
-		SecurityContextHolder.clearContext();
-		if (Objects.nonNull(context)) {
-			SecurityContextHolder.setContext(context);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java
deleted file mode 100644
index 8355a9ffca2cf8b9ad91449133240e11745131c5..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package de.ozgcloud.bescheid.common.freemarker;
-
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.springframework.stereotype.Component;
-
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-import lombok.RequiredArgsConstructor;
-
-@Component
-@RequiredArgsConstructor
-public class TemplateHandler {
-
-	private final Configuration freemarkerConfig;
-
-	public String getRawTemplate(String templateName) {
-		return getTemplate(templateName).toString();
-	}
-
-	public String fillTemplate(String templateName, Object dataModel) {
-		try {
-			var template = getTemplate(templateName);
-			var stringWriter = new StringWriter();
-			template.process(dataModel, stringWriter);
-			return stringWriter.toString();
-
-		} catch (IOException | TemplateException e) {
-			throw new TechnicalException("Error filling template", e);
-		}
-	}
-
-	private Template getTemplate(String templateName) {
-		try {
-			return freemarkerConfig.getTemplate(templateName);
-		} catch (IOException e) {
-			throw new TechnicalException("Error loading mail template", e);
-		}
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java
deleted file mode 100644
index 889dbbad42e09d5195cc3daa107994e9af542b5f..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java
+++ /dev/null
@@ -1,38 +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.bescheid.common.user;
-
-import de.ozgcloud.bescheid.UserId;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class UserProfile {
-
-	private UserId id;
-	private String firstName;
-	private String lastName;
-	private String email;
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java
deleted file mode 100644
index 0c7c5ceda1c008597995a38a5306b704226085b6..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java
+++ /dev/null
@@ -1,40 +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.bescheid.common.user;
-
-import org.mapstruct.Mapper;
-
-import de.ozgcloud.apilib.user.OzgCloudUserId;
-import de.ozgcloud.apilib.user.OzgCloudUserProfile;
-import de.ozgcloud.bescheid.UserId;
-
-@Mapper
-public interface UserProfileMapper {
-
-	UserProfile mapProfile(OzgCloudUserProfile userProfile);
-
-	default UserId mapUserId(OzgCloudUserId id) {
-		return UserId.from(id.toString());
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java
deleted file mode 100644
index 5346ead50451064408dd1db5146536520b566b99..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java
+++ /dev/null
@@ -1,52 +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.bescheid.common.user;
-
-import java.util.Optional;
-
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.apilib.user.OzgCloudUserId;
-import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import lombok.RequiredArgsConstructor;
-
-@Service
-@RequiredArgsConstructor
-public class UserProfileService {
-
-	private final CurrentUserService currentUserService;
-	private final Optional<OzgCloudUserProfileService> userProfileService;
-	private final UserProfileMapper mapper;
-
-	public UserProfile getUserProfile() {
-		var service = userProfileService.orElseThrow(() -> new IllegalStateException("No connection to user-manager configured."));
-
-		return currentUserService.getUser().getUserId().map(OzgCloudUserId::from)
-				.map(service::getById)
-				.map(mapper::mapProfile).orElseThrow(() -> new TechnicalException("Unknown UserId or cannot load user profile."));
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java
deleted file mode 100644
index 60949bbe87cf4d3b6c2a366dcc529d4be45c99bf..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java
+++ /dev/null
@@ -1,54 +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.bescheid.common.user;
-
-import java.util.UUID;
-
-import com.thedeanda.lorem.LoremIpsum;
-
-import de.ozgcloud.bescheid.UserId;
-
-public class UserProfileTestFactory {
-
-	private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance();
-
-	public static final String ID_STR = UUID.randomUUID().toString();
-	public static final UserId ID = UserId.from(ID_STR);
-
-	public static final String FIRST_NAME = LOREM_IPSUM.getFirstName();
-	public static final String LAST_NAME = LOREM_IPSUM.getLastName();
-	public static final String EMAIL = "test-email@local";
-
-	public static UserProfile create() {
-		return createBuilder().build();
-	}
-
-	public static UserProfile.UserProfileBuilder createBuilder() {
-		return UserProfile.builder()
-				.id(ID)
-				.firstName(FIRST_NAME)
-				.lastName(LAST_NAME)
-				.email(EMAIL);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
deleted file mode 100644
index ef9589219948ef6c2db265e1d6653b1f06403ba3..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.ozgcloud.bescheid.dummy;
-
-import java.util.Optional;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.stereotype.Service;
-
-import com.google.common.net.MediaType;
-
-import de.ozgcloud.bescheid.BescheidResponse;
-import de.ozgcloud.bescheid.BescheidRemoteService;
-import de.ozgcloud.bescheid.BescheidRequest;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-import de.ozgcloud.common.binaryfile.TempFileUtils;
-
-@Service
-@ConditionalOnProperty("ozgcloud.feature.bescheid.enable-dummy-document-processor")
-class DummyBescheidRemoteService implements BescheidRemoteService {
-
-	private static final String DUMMY_BESCHEID_FILE_NAME = "dummy-bescheid.pdf";
-	private static final String DUMMY_BESCHEID_CONTENT_TYPE = MediaType.PDF.toString();
-
-	@Override
-	public BescheidResponse create(BescheidRequest request, Vorgang vorgang) {
-		var file = TempFileUtils.writeTmpFile(this.getClass().getClassLoader().getResourceAsStream(DUMMY_BESCHEID_FILE_NAME));
-
-		return BescheidResponse.builder()
-				.bescheidFile(file)
-				.bescheidFileName(DUMMY_BESCHEID_FILE_NAME)
-				.contentType(DUMMY_BESCHEID_CONTENT_TYPE)
-				.nachrichtText(Optional.of("Dummy Bescheid"))
-				.nachrichtSubject(Optional.of("Nachricht Subject"))
-				.size(file.length())
-				.createdBy(request.getCreateFor().getId())
-				.build();
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
deleted file mode 100644
index b93412e26623f5b7f04b7f96a1e38a51b56018d2..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Optional;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.http.HttpStatusCode;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Service;
-import org.springframework.web.reactive.function.BodyExtractors;
-import org.springframework.web.reactive.function.client.ClientResponse;
-import org.springframework.web.reactive.function.client.WebClient;
-import org.w3c.dom.Document;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-
-import de.ozgcloud.bescheid.BescheidResponse;
-import de.ozgcloud.bescheid.BescheidRemoteService;
-import de.ozgcloud.bescheid.BescheidRequest;
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.BescheidData;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.SmartDocument.Selection;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-import de.ozgcloud.common.binaryfile.FileDataDeserializer;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-import reactor.core.publisher.Mono;
-
-@Log4j2
-@Service
-@RequiredArgsConstructor
-@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url")
-class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
-
-	private static final String FILE_TYPE_PDF = "PDF";
-	private static final String FILE_TYPE_XML = "XML";
-
-	static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR
-	static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; // NOSONAR
-
-	@SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding
-	private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8;
-
-	@Qualifier("smartDocuments")
-	private final WebClient smartDocumentsWebClient;
-
-	private final SmartDocumentsProperties properties;
-
-	@Override
-	public BescheidResponse create(BescheidRequest request, Vorgang vorgang) {
-		var sdRequest = createRequest(request, vorgang);
-		LOG.debug(() -> buildLogRequest(sdRequest));
-
-		return smartDocumentsWebClient.post().accept(MediaType.APPLICATION_JSON)
-				.contentType(JSON_MEDIA_TYPE_FOR_SD)
-				.bodyValue(sdRequest)
-				.retrieve()
-				.onStatus(HttpStatusCode::is4xxClientError, this::handleClientError)
-				.bodyToMono(SmartDocumentsResponse.class)
-				.map(response -> buildBescheid(request, response))
-				.block();
-	}
-
-	Mono<Throwable> handleClientError(ClientResponse response) {
-		return response.body(BodyExtractors.toMono(String.class))
-				.map(content -> new TechnicalException("Client-Error: " + content));
-	}
-
-	private String buildLogRequest(SmartDocumentsRequest request) {
-		try {
-			ObjectMapper oj = new ObjectMapper();
-			return oj.writerWithDefaultPrettyPrinter().writeValueAsString(request);
-		} catch (Exception e) {
-			LOG.warn("Error writing request as json-string for logging.", e);
-			return "Error generating logging string";
-		}
-	}
-
-	BescheidResponse buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) {
-		var smartDocumentsFile = getSmartDocumentsFile(smartDocumentsResponse);
-
-		return BescheidResponse.builder()
-				.bescheidFile(smartDocumentsFile.getDocument().getData())
-				.bescheidFileName(smartDocumentsFile.getFilename())
-				.size(smartDocumentsFile.getDocument().getData().length())
-				.contentType(MediaType.APPLICATION_PDF_VALUE)
-				.nachrichtText(getNachrichtText(smartDocumentsResponse))
-				.bewilligt(request.isGenehmigt())
-				.createdBy(request.getCreateFor().getId())
-				.vorgangId(request.getVorgangId())
-				.build();
-	}
-
-	private SmartDocumentFile getSmartDocumentsFile(SmartDocumentsResponse response) {
-		return getSmartDocumentsFile(response, FILE_TYPE_PDF)
-				.orElseThrow(() -> new IllegalStateException("No PDF File in SmartDocuments Response found."));
-	}
-
-	Optional<String> getNachrichtText(SmartDocumentsResponse response) {
-		return getXMLFile(response).flatMap(this::extractTextFromXmlFile);
-	}
-
-	Optional<String> extractTextFromXmlFile(File xmlFile) {
-		try {
-			var document = parseXml(xmlFile);
-			if (document.isPresent()) {
-				return document.flatMap(this::getNachrichtenText).or(() -> getFieldTemplateText(document.get())).map(Text::getTextContent);
-			}
-		} catch (RuntimeException e) {
-			LOG.warn("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e);
-		}
-		return Optional.empty();
-	}
-
-	Optional<Document> parseXml(File xmlFile) {
-		try {
-			return Optional.of(DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile));
-		} catch (SAXException | IOException | ParserConfigurationException e) {
-			LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e);
-		}
-		return Optional.empty();
-	}
-
-	Optional<Text> getNachrichtenText(Document document) {
-		return evaluateXPath(document, NACHRICHTEN_TEXT_EXPRESSION);
-	}
-
-	Optional<Text> getFieldTemplateText(Document document) {
-		return evaluateXPath(document, FIELD_TEMPLATE_EXPRESSION);
-	}
-
-	Optional<Text> evaluateXPath(Document document, String xpathExpression) {
-		try {
-			var expr = XPathFactory.newInstance().newXPath().compile(xpathExpression);
-			return Optional.ofNullable(expr.evaluate(document, XPathConstants.NODE)).map(Text.class::cast);
-		} catch (ClassCastException e) {
-			LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e);
-		} catch (XPathExpressionException e) {
-			LOG.warn("Cannot evaluate XPath: {}", xpathExpression, e);
-		}
-		return Optional.empty();
-	}
-
-	Optional<File> getXMLFile(SmartDocumentsResponse response) {
-		return getSmartDocumentsFile(response, FILE_TYPE_XML)
-				.map(SmartDocumentFile::getDocument)
-				.map(SmartDocumentDocument::getData);
-	}
-
-	Optional<SmartDocumentFile> getSmartDocumentsFile(SmartDocumentsResponse response, String fileType) {
-		return response.getFile().stream()
-				.filter(file -> file.getOutputFormat().equals(fileType))
-				.findFirst();
-	}
-
-	SmartDocumentsRequest createRequest(BescheidRequest request, Vorgang vorgang) {
-		return logRequest(SmartDocumentsRequest.builder()
-				.smartDocument(buildSDSection(vorgang))
-				.customerData(
-						CustomerData.builder()
-								.vorgang(vorgang)
-								.userData(buildUserData(request.getCreateFor()))
-								.bescheid(BescheidData.builder().bescheidVom(request.getBescheidVom()).genehmigt(request.isGenehmigt()).build())
-								.build())
-
-				.build());
-	}
-
-	private UserData buildUserData(UserProfile userProfile) {
-		return UserData.builder()
-				.firstName(userProfile.getFirstName())
-				.lastName(userProfile.getLastName())
-				.email(userProfile.getEmail())
-				.build();
-	}
-
-	private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) {
-		return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder()
-				.templateGroup(properties.getTemplateGroup())
-				.template(vorgang.getVorgangName())
-				.build())
-				.build();
-	}
-
-	private SmartDocumentsRequest logRequest(SmartDocumentsRequest request) {
-		LOG.debug(() -> {
-			var ojMapper = new ObjectMapper();
-			try {
-				return ojMapper.writeValueAsString(request);
-			} catch (JsonProcessingException e) {
-				LOG.warn("Json Processing Exception on logging request.", e);
-				return request.toString();
-			}
-		});
-
-		return request;
-	}
-
-	@Builder
-	@Getter
-	@NoArgsConstructor
-	@AllArgsConstructor
-	static class SmartDocumentsResponse {
-		Collection<SmartDocumentFile> file;
-
-		@Builder
-		@Getter
-		@NoArgsConstructor
-		@AllArgsConstructor
-		static class SmartDocumentFile {
-			private String filename;
-			private SmartDocumentDocument document;
-			private String outputFormat;
-		}
-
-		@Builder
-		@Getter
-		@NoArgsConstructor
-		@AllArgsConstructor
-		static class SmartDocumentDocument {
-			@JsonDeserialize(using = FileDataDeserializer.class)
-			private File data;
-		}
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java
deleted file mode 100644
index 579a53d016fe65a7a0c9110173ead505b2793476..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.client.reactive.ReactorClientHttpConnector;
-import org.springframework.web.reactive.function.client.ExchangeFilterFunctions;
-import org.springframework.web.reactive.function.client.WebClient;
-
-import reactor.netty.http.client.HttpClient;
-import reactor.netty.transport.ProxyProvider;
-
-@Configuration
-@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url")
-class SmartDocumentsConfiguration {
-
-	@Autowired
-	private SmartDocumentsProperties properties;
-
-	@Bean("smartDocuments")
-	WebClient smartDocumentsWebClient() {
-		ReactorClientHttpConnector connector = new ReactorClientHttpConnector(buildHttpClient());
-
-		return WebClient.builder()
-				.baseUrl(properties.getUrl())
-				.filter(ExchangeFilterFunctions.basicAuthentication(properties.getBasicAuth().getUsername(), properties.getBasicAuth().getPassword()))
-				.clientConnector(connector)
-				.build();
-	}
-
-	private HttpClient buildHttpClient() {
-		if (properties.getProxy() != null) {
-			return createProxyHttpClient();
-		} else {
-			return createNoProxyHttpClient();
-		}
-	}
-
-	private HttpClient createNoProxyHttpClient() {
-		return HttpClient.create();
-	}
-
-	private HttpClient createProxyHttpClient() {
-		return HttpClient.create()
-				.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
-						.host(properties.getProxy().getHost())
-						.port(properties.getProxy().getPort())
-						.username(properties.getProxy().getUsername())
-						.password(username -> properties.getProxy().getPassword()));
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java
deleted file mode 100644
index c45e9383c581e237dbf565d6daab0a5b9c217dc7..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotNull;
-
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.validation.annotation.Validated;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url")
-@Validated
-@Getter
-@Setter
-@Configuration
-@ConfigurationProperties("ozgcloud.bescheid.smart-documents")
-public class SmartDocumentsProperties {
-
-	/**
-	 * Location of the Smart Documents Server
-	 */
-	@NotBlank
-	private String url;
-
-	/**
-	 * Credential for basic auth to the Smart Documents Server
-	 */
-	@NotNull
-	@Valid
-	private UsernamePassword basicAuth;
-
-	/**
-	 * Smart Documents Template Group
-	 */
-	@NotBlank
-	private String templateGroup;
-	/**
-	 * Smart Documents Template
-	 */
-	@NotBlank
-	private String template;
-
-	/**
-	 * Proxy Configuration if required.
-	 */
-	private ProxyConfiguration proxy;
-
-	@Getter
-	@Setter
-	static class UsernamePassword {
-		/**
-		 * Username for authentication
-		 */
-		@NotBlank
-		private String username;
-		/**
-		 * Password for authentication
-		 */
-		@NotBlank
-		private String password;
-	}
-
-	@Getter
-	@Setter
-	static class ProxyConfiguration {
-		/**
-		 * Host Address of the proxy server with protocol
-		 */
-		@NotBlank
-		private String host;
-		/**
-		 * Port Number of the proxy server
-		 */
-		private int port = 8080;
-		/**
-		 * Username for Authentication for the proxy server
-		 */
-		private String username;
-		/**
-		 * Username for Authentication for the proxy server
-		 */
-		private String password;
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java
deleted file mode 100644
index d842134f98b72ab6a3961ecef0f6aad924d90637..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import java.time.LocalDate;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.PropertyNamingStrategies;
-import com.fasterxml.jackson.databind.annotation.JsonNaming;
-
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.ToString;
-
-@Builder
-@Getter
-@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
-@ToString
-class SmartDocumentsRequest {
-
-	@Builder.Default
-	private CustomerData customerData = CustomerData.builder().build();
-	@Builder.Default
-	private SmartDocument smartDocument = SmartDocument.builder().build();
-
-	@Builder
-	@Getter
-	static class CustomerData {
-		private Vorgang vorgang;
-		private BescheidData bescheid;
-		private UserData userData;
-
-		@Builder
-		@Getter
-		static class BescheidData {
-			private LocalDate bescheidVom;
-			private boolean genehmigt;
-		}
-
-		@Builder
-		@Getter
-		static class UserData {
-			private String firstName;
-			private String lastName;
-			private String email;
-		}
-	}
-
-	@Builder
-	@Getter
-	@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
-	static class SmartDocument {
-
-		@Builder.Default
-		@JsonProperty("Selection")
-		private Selection selection = Selection.builder().build();
-
-		@Builder
-		@Getter
-		@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
-		static class Selection {
-			@Builder.Default
-			private String templateGroup = "Kiel";
-			@Builder.Default
-			private String template = "Halteverbot";
-		}
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java
deleted file mode 100644
index a5445250df8668b4c23a5c8db18295914e78a9ae..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.ReportingPolicy;
-import org.mapstruct.factory.Mappers;
-
-import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-import de.ozgcloud.vorgang.vorgang.GrpcEingang;
-import de.ozgcloud.vorgang.vorgang.GrpcFormData;
-import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress;
-import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto;
-import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang;
-
-@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, //
-		uses = { FormDataEntryMapper.class, GrpcObjectMapper.class })
-interface BescheidVorgangMapper {
-
-	@Mapping(target = "serviceKonto", source = "header.serviceKonto")
-	@Mapping(target = "vorgangNummer", source = "nummer")
-	@Mapping(target = "vorgangName", source = "name")
-	Vorgang mapVorgang(GrpcVorgangWithEingang vorgang);
-
-	@Mapping(target = "postfachAddress", ignore = true)
-	@Mapping(target = "postfachAddresses", source = "postfachAddressesList")
-	Vorgang.ServiceKonto mapServiceKonto(GrpcServiceKonto serviceKonto);
-
-	Vorgang.PostfachAddress mapAddress(GrpcPostfachAddress address);
-
-	VorgangId mapVorgangId(String vorgangId);
-
-	Vorgang.Eingang mapEingang(GrpcEingang eingang);
-
-	default Collection<FormDataEntry> mapFormData(GrpcFormData value) {
-		var result = new ArrayList<FormDataEntry>();
-		var entryMapper = Mappers.getMapper(FormDataEntryMapper.class);
-
-		result.addAll(value.getFieldList().stream().map(entryMapper::fromGrpc).toList());
-		result.addAll(value.getFormList().stream().map(entryMapper::fromGrpc).toList());
-
-		return Collections.unmodifiableList(result);
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java
deleted file mode 100644
index e0e2988ba7883c82f423e767b6df2b0d8cd34b87..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-
-@JsonSerialize(using = FormDataEntrySerializer.class)
-public interface FormDataEntry {
-
-	String getName();
-	@JsonIgnore
-	String getLabel();
-
-	@JsonIgnore
-	default boolean isSubForm() {
-		return false;
-	}
-
-	@JsonIgnore
-	default boolean isFormEntry() {
-		return false;
-	}
-
-	@Builder
-	@Getter
-	static class SubForm implements FormDataEntry {
-
-		private String name;
-		@JsonIgnore
-		private String label;
-
-		@Singular
-		private List<FormDataEntry> entries;
-
-		@JsonIgnore
-		@Override
-		public boolean isSubForm() {
-			return true;
-		}
-	}
-
-	@Builder
-	@Getter
-	static class FormField implements FormDataEntry {
-
-		private String name;
-		@JsonIgnore
-		private String label;
-
-		private Object value;
-
-		@JsonIgnore
-		@Override
-		public boolean isFormEntry() {
-			return true;
-		}
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java
deleted file mode 100644
index 6cd404f3247936a7b6c6ff83e07c00c85c914b20..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.Named;
-import org.mapstruct.ReportingPolicy;
-
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField;
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm;
-import de.ozgcloud.vorgang.vorgang.GrpcFormField;
-import de.ozgcloud.vorgang.vorgang.GrpcSubForm;
-
-@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
-public interface FormDataEntryMapper {
-
-	@Mapping(target = "entries", source = ".", qualifiedByName = "mapEntrys")
-	@Mapping(target = "entry", ignore = true)
-	@Mapping(target = "name", source = "title")
-	SubForm fromGrpc(GrpcSubForm subForm);
-
-	FormField fromGrpc(GrpcFormField field);
-
-	@Named("mapEntrys")
-	default List<FormDataEntry> mapEntrys(GrpcSubForm subForm) {
-		var fieldStream = subForm.getFieldList().stream().map(this::fromGrpc);
-		var subFormsStream = subForm.getSubFormList().stream().map(this::fromGrpc);
-
-		return Stream.concat(fieldStream, subFormsStream).toList();
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java
deleted file mode 100644
index 0a3b48dbe0074d56570a050af1f196edf4da2222..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField;
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-
-public class FormDataEntrySerializer extends StdSerializer<FormDataEntry> {
-
-	public FormDataEntrySerializer() {
-		super(FormDataEntry.class);
-	}
-
-	@Override
-	public void serialize(FormDataEntry value, JsonGenerator gen, SerializerProvider provider) throws IOException {
-
-		if (value.isFormEntry()) {
-			var formEntry = (FormField) value;
-			Optional.ofNullable(formEntry.getValue()).map(Object::toString).filter(StringUtils::isNoneBlank)
-					.ifPresent(val -> writeStringField(value.getName(), val, gen));
-		}
-		if (value.isSubForm()) {
-			gen.writeFieldName(value.getName());
-			gen.writeStartObject();
-			var subForm = (SubForm) value;
-
-			subForm.getEntries().forEach(entry -> writeObject(entry, gen));
-			gen.writeEndObject();
-		}
-	}
-
-	private void writeStringField(String name, String value, JsonGenerator gen) {
-		try {
-			gen.writeStringField(name, value);
-		} catch (IOException e) {
-			throw new TechnicalException("Error writing string field in json.", e);
-		}
-	}
-
-	static void writeObject(Object pojo, JsonGenerator jgen) {
-		try {
-			jgen.writeObject(pojo);
-		} catch (IOException e) {
-			throw new TechnicalException("Error on writing object to json.", e);
-		}
-	}
-}
-
-class FormDataEntryListSerializer extends StdSerializer<List<FormDataEntry>> {
-
-	public FormDataEntryListSerializer() {
-		super(List.class, true);
-	}
-
-	@Override
-	public void serialize(List<FormDataEntry> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
-		gen.writeStartObject();
-
-		value.forEach(entry -> defaultSerializeValue(entry, gen, provider));
-		gen.writeEndObject();
-	}
-
-	private void defaultSerializeValue(Object value, JsonGenerator jgen, SerializerProvider provider) {
-		try {
-			var serializer = provider.findValueSerializer(FormDataEntry.class);
-			serializer.serialize(value, jgen, provider);
-		} catch (IOException e) {
-			throw new TechnicalException("Error serializing value.", e);
-		}
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java
deleted file mode 100644
index ba0e51d7681c81f51a00cad46317330410b98d1e..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import java.util.List;
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-import lombok.ToString;
-
-@Builder
-@Getter
-@ToString
-public class Vorgang {
-
-	@JsonIgnore
-	private VorgangId id;
-	private long version;
-
-	private String vorgangName;
-
-	private String vorgangNummer;
-	private String aktenzeichen;
-
-	@JsonIgnore
-	@ToString.Exclude
-	private ServiceKonto serviceKonto;
-	@ToString.Exclude
-	private Eingang eingang;
-
-	@Builder
-	@Getter
-	public static class ServiceKonto {
-
-		public static final String FIELD_SERVICEKONTO_TYPE = "serviceKontoType";
-		public static final String FIELD_POSTFACH_ADDRESS = "postfachAddress";
-
-		private String type;
-		@Singular
-		private List<PostfachAddress> postfachAddresses;
-	}
-
-	@Builder
-	@Getter
-	public static class PostfachAddress {
-
-		public static final String FIELD_VERSION = "version";
-		public static final String FIELD_TYPE = "type";
-		public static final String FIELD_IDENTIFIER = "identifier";
-
-		private String version;
-		private int type;
-		private Map<String, Object> identifier;
-	}
-
-	@Builder
-	@Getter
-	static class Eingang {
-		private Antragsteller antragsteller;
-		private ZustaendigeStelle zustaendigeStelle;
-
-		@Singular("formData")
-		@JsonSerialize(using = FormDataEntryListSerializer.class)
-		private List<FormDataEntry> formData;
-	}
-
-	@Builder
-	@Getter
-	@JsonInclude(Include.NON_EMPTY)
-	static class Antragsteller {
-		private String anrede;
-		private String nachname;
-		private String vorname;
-		private String geburtsdatum;
-		private String geburtsort;
-		private String geburtsname;
-		private String email;
-		private String telefon;
-		private String strasse;
-		private String hausnummer;
-		private String plz;
-		private String ort;
-	}
-
-	@Builder
-	@Getter
-	static class ZustaendigeStelle {
-		private String organisationseinheitenId;
-		private String email;
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java
deleted file mode 100644
index 2cb8785e563dbbff842baa5996e971d905be1bc7..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import de.ozgcloud.common.datatype.StringBasedValue;
-
-public class VorgangId extends StringBasedValue {
-
-	VorgangId(String vorgangId) {
-		super(vorgangId);
-	}
-
-	public static VorgangId from(String vorgangId) {
-		return new VorgangId(vorgangId);
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java
deleted file mode 100644
index c3a1aa72e30e3147d913117c6f5f4d77e8ee6a12..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest;
-import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
-import io.grpc.ClientInterceptor;
-import lombok.NonNull;
-import net.devh.boot.grpc.client.inject.GrpcClient;
-
-@Service("bescheid_VorgangRemoteService")
-class VorgangRemoteService {
-
-	@GrpcClient("vorgang-manager")
-	private VorgangServiceBlockingStub vorgangServiceStub;
-	@Autowired
-	private BescheidVorgangMapper mapper;
-
-	@Autowired
-	private ClientInterceptor bescheidCallContextInterceptor;
-
-	public Vorgang getById(@NonNull VorgangId vorgangId) {
-		var request = GrpcFindVorgangWithEingangRequest.newBuilder().setId(vorgangId.toString()).build();
-		var response = vorgangServiceStub
-				.withInterceptors(bescheidCallContextInterceptor)
-				.findVorgangWithEingang(request);
-
-		return mapper.mapVorgang(response.getVorgangWithEingang());
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java
deleted file mode 100644
index 98689c96ea25c66ffcfbe9cab54556b148b7fc65..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import org.springframework.stereotype.Service;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-
-@Service("bescheid_VorgangService")
-@RequiredArgsConstructor
-public class VorgangService {
-
-	private final VorgangRemoteService remoteService;
-
-	public Vorgang getById(@NonNull VorgangId id) {
-		return remoteService.getById(id);
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java
deleted file mode 100644
index f47223bc22488d80380ad986dd37ebf79e4c27db..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java
+++ /dev/null
@@ -1,54 +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.common.attached_item;
-
-import java.util.Map;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-
-@Builder(toBuilder = true)
-@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;
-
-	@Singular("itemEntry")
-	private Map<String, Object> item;
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java
deleted file mode 100644
index c3431d175ebf43e14f6a7fd15baf34cb7b81a5f6..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java
+++ /dev/null
@@ -1,47 +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.common.attached_item;
-
-import java.util.Map;
-
-import org.mapstruct.Mapper;
-import org.mapstruct.NullValueCheckStrategy;
-
-import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
-
-@Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
-public interface AttachedItemMapper {
-
-	AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item);
-
-	default Map<String, Object> toMap(AttachedItem attachedItem) {
-		return Map.of(
-				AttachedItem.PROPERTY_VORGANG_ID, attachedItem.getVorgangId(),
-				AttachedItem.PROPERTY_CLIENT, attachedItem.getClient(),
-				AttachedItem.PROPERTY_ITEM_NAME, attachedItem.getItemName(),
-				AttachedItem.PROPERTY_ITEM, attachedItem.getItem());
-	}
-
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java
deleted file mode 100644
index d0ad2ed4e32a2eb9fe424440629f23e0e50e9331..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java
+++ /dev/null
@@ -1,230 +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.common.attached_item;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.Function;
-
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
-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.Bescheid;
-import de.ozgcloud.bescheid.Bescheid.Status;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.BescheidManagerConfiguration;
-import de.ozgcloud.bescheid.BescheidMapper;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.Document;
-import lombok.RequiredArgsConstructor;
-
-@Service
-@RequiredArgsConstructor
-public class AttachedItemService {
-
-	public static final String BESCHEID_ITEM_NAME = "Bescheid";
-	public static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM";
-	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";
-
-	@Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME)
-	private final OzgCloudCommandService commandService;
-	private final VorgangAttachedItemRemoteService remoteService;
-
-	private final CommandMapper commandMapper;
-	private final AttachedItemMapper attachedItemMapper;
-	private final BescheidMapper bescheidMapper;
-
-	public Optional<AttachedItem> findBescheidItem(VorgangId vorgangId) {
-		return remoteService.findBescheidDraft(vorgangId);
-	}
-
-	public AttachedItem getItem(String id) {
-		return remoteService.getItem(id);
-	}
-
-	public String createBescheidDraft(Bescheid bescheidDraft) {
-		return remoteService.findBescheidDraft(bescheidDraft.getVorgangId())
-				.map(bescheidItem -> overrideAttachedItem(mergeBescheidDrafts(bescheidItem, bescheidDraft)))
-				.orElseGet(() -> createAttachedItem(bescheidDraft));
-	}
-
-	AttachedItem mergeBescheidDrafts(AttachedItem existingBescheidItem, Bescheid newBescheidDraft) {
-		return existingBescheidItem.toBuilder()
-				.item(bescheidMapper.mapToItem(newBescheidDraft))
-				.build();
-	}
-
-	String overrideAttachedItem(AttachedItem bescheidItem) {
-		var finishedOzgCloudCommand = commandService.createAndWaitUntilDone(buildPatchAttachedItemCommand(bescheidItem, bescheidItem.getItem()));
-		return finishedOzgCloudCommand.getCreatedResource();
-	}
-
-	Map<String, Object> buildItemMapWithAllBescheidFields(Command command) {
-		var result = new HashMap<String, Object>();
-		result.put(Bescheid.FIELD_BESCHIEDEN_AM, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM));
-		result.put(Bescheid.FIELD_BEWILLIGT, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT));
-		result.put(Bescheid.FIELD_BESCHEID_DOCUMENT,
-				MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT));
-		result.put(Bescheid.FIELD_SEND_BY, getSendBy(command.getBodyObject()));
-		result.put(Bescheid.FIELD_NACHRICHT_TEXT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT));
-		result.put(Bescheid.FIELD_NACHRICHT_SUBJECT,
-				MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT));
-		result.put(Bescheid.FIELD_ATTACHMENTS, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS));
-		return result;
-	}
-
-	private String getSendBy(Map<String, Object> body) {
-		return MapUtils.getString(body, Bescheid.FIELD_SEND_BY);
-	}
-
-	public void updateBescheidDraft(Command command, Optional<Document> document) {
-		createCommandAfterValidation(command, bescheid -> buildUpdateBescheidDraftCommand(command, document, bescheid));
-	}
-
-	private OzgCloudCommand buildUpdateBescheidDraftCommand(Command command, Optional<Document> document, AttachedItem bescheidItem) {
-		return buildPatchAttachedItemCommand(bescheidItem, buildAttachedItemAsMap(command, buildBescheidItemAsMap(command, document)));
-	}
-
-	Map<String, Object> buildBescheidItemAsMap(Command command, Optional<Document> newDocument) {
-		var itemMap = buildItemMapWithExistingBescheidFields(command);
-		var savedBescheid = getItem(command.getRelationId());
-
-		getNewNachrichtText(savedBescheid, newDocument)
-				.ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText));
-
-		return itemMap;
-	}
-
-	Optional<String> getNewNachrichtText(AttachedItem bescheidItem, Optional<Document> newDocument) {
-		return newDocument
-				.filter(document -> isDifferentDocument(document, bescheidItem))
-				.map(Document::getNachrichtText)
-				.filter(StringUtils::isNotBlank);
-	}
-
-	boolean isDifferentDocument(Document document, AttachedItem bescheidItem) {
-		return !StringUtils.equals(document.getId(), getBescheidDocumentId(bescheidItem));
-	}
-
-	private String getBescheidDocumentId(AttachedItem item) {
-		return MapUtils.getString(item.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT);
-	}
-
-	OzgCloudCommand buildPatchAttachedItemCommand(AttachedItem bescheidItem, Map<String, Object> bodyObject) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(bescheidItem.getId()))
-				.relationVersion(bescheidItem.getVersion())
-				.order(PATCH_ATTACHED_ITEM)
-				.bodyObject(bodyObject)
-				.build();
-	}
-
-	String createAttachedItem(Bescheid bescheidDraft) {
-		var bescheidItem = bescheidMapper.mapFromBescheid(bescheidDraft);
-		return commandService.createAndWaitUntilDone(buildCreateAttachedItemCommand(bescheidItem)).getCreatedResource();
-	}
-
-	OzgCloudCommand buildCreateAttachedItemCommand(AttachedItem bescheidItem) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId()))
-				.order(CREATE_ATTACHED_ITEM_ORDER)
-				.bodyObject(attachedItemMapper.toMap(bescheidItem)).build();
-	}
-
-	Map<String, Object> buildAttachedItemAsMap(Command command, Map<String, Object> itemMap) {
-		var result = new HashMap<String, Object>();
-		result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId());
-		result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		result.put(AttachedItem.PROPERTY_ITEM_NAME, BESCHEID_ITEM_NAME);
-		result.put(AttachedItem.PROPERTY_ITEM, itemMap);
-		return result;
-	}
-
-	Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) {
-		var result = buildItemMap(Bescheid.Status.DRAFT);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_SEND_BY, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT, result);
-		addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS, result);
-		return result;
-	}
-
-	void addValueFromMapIfExists(Map<String, Object> sourceMap, String key, Map<String, Object> targetMap) {
-		if (sourceMap.containsKey(key)) {
-			targetMap.put(key, sourceMap.get(key));
-		}
-	}
-
-	public void deleteBescheidDraft(Command command) {
-		createCommandAfterValidation(command, bescheid -> buildDeleteItemCommand(command, bescheid));
-	}
-
-	private void createCommandAfterValidation(Command command, Function<AttachedItem, OzgCloudCommand> buildCommand) {
-		var bescheid = remoteService.getItem(command.getRelationId());
-		validateBescheidStatus(bescheid);
-		commandService.createAndWaitUntilDone(buildCommand.apply(bescheid));
-	}
-
-	void validateBescheidStatus(AttachedItem bescheid) {
-		var bescheidStatus = MapUtils.getString(bescheid.getItem(), Bescheid.FIELD_STATUS);
-		if (Bescheid.Status.DRAFT.not(bescheidStatus)) {
-			throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus));
-		}
-	}
-
-	OzgCloudCommand buildDeleteItemCommand(Command command, AttachedItem bescheid) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(bescheid.getId()))
-				.relationVersion(bescheid.getVersion())
-				.order(DELETE_ATTACHED_ITEM)
-				.build();
-	}
-
-	Map<String, Object> buildItemMap(Status status) {
-		var itemMap = new HashMap<String, Object>();
-		itemMap.put(Bescheid.FIELD_STATUS, status.name());
-		return itemMap;
-	}
-
-	public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) {
-		return remoteService.findAllBescheid(vorgangId);
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java
deleted file mode 100644
index 1d8756a0c968d0463e6f94391afb91fad9143c04..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java
+++ /dev/null
@@ -1,112 +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.common.attached_item;
-
-import static de.ozgcloud.common.attached_item.AttachedItemService.*;
-
-import java.time.LocalDate;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import org.apache.commons.collections.MapUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest;
-import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub;
-import io.grpc.ClientInterceptor;
-import lombok.extern.log4j.Log4j2;
-import net.devh.boot.grpc.client.inject.GrpcClient;
-
-@Service
-@Log4j2
-class VorgangAttachedItemRemoteService {
-
-	private static final Comparator<AttachedItem> BY_BESCHIEDEN_AM_DESC = (bescheid1, bescheid2) -> {
-		var beschiedenAm1 = LocalDate.parse(MapUtils.getString(bescheid1.getItem(), Bescheid.FIELD_BESCHIEDEN_AM));
-		var beschiedenAm2 = LocalDate.parse(MapUtils.getString(bescheid2.getItem(), Bescheid.FIELD_BESCHIEDEN_AM));
-		return beschiedenAm2.compareTo(beschiedenAm1);
-	};
-
-	@GrpcClient("vorgang-manager")
-	private VorgangAttachedItemServiceBlockingStub serviceStub;
-	@Autowired
-	private ClientInterceptor bescheidCallContextInterceptor;
-	@Autowired
-	private AttachedItemMapper attachedItemMapper;
-
-	public Optional<AttachedItem> findBescheidDraft(VorgangId vorgangId) {
-		return findBescheidDraft(buildFindRequest(vorgangId.toString()));
-	}
-
-	public List<AttachedItem> findAllBescheid(VorgangId vorgangId) {
-		return findAllBescheid(buildFindRequest(vorgangId.toString())).toList();
-	}
-
-	GrpcFindVorgangAttachedItemRequest buildFindRequest(String vorgangId) {
-		return GrpcFindVorgangAttachedItemRequest.newBuilder()
-				.setVorgangId(vorgangId)
-				.setItemName(BESCHEID_ITEM_NAME)
-				.setClient(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME)
-				.build();
-	}
-
-	Optional<AttachedItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) {
-		var bescheidItems = findAllBescheid(request).filter(this::hasStatusDraft).toList();
-		if (bescheidItems.size() > 1) {
-			LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(),
-					bescheidItems.getFirst().getVorgangId());
-		}
-		return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst());
-	}
-
-	Stream<AttachedItem> findAllBescheid(GrpcFindVorgangAttachedItemRequest request) {
-		var grpcResponse = getServiceStub().find(request);
-		return grpcResponse.getVorgangAttachedItemsList().stream().map(attachedItemMapper::mapFromVorgangAttachedItem)
-				.sorted(BY_BESCHIEDEN_AM_DESC);
-	}
-
-	boolean hasStatusDraft(AttachedItem bescheidItem) {
-		return Bescheid.Status.DRAFT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_STATUS));
-	}
-
-	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();
-	}
-
-	VorgangAttachedItemServiceBlockingStub getServiceStub() {
-		return serviceStub.withInterceptors(bescheidCallContextInterceptor);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java
deleted file mode 100644
index aa8c127a165ad74cb1132759d977139faace6434..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java
+++ /dev/null
@@ -1,34 +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 de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandExecutedEvent;
-
-public class BescheidDocumentCreatedEvent extends CommandExecutedEvent {
-
-	public BescheidDocumentCreatedEvent(Command command, String createdResource) {
-		super(command, createdResource);
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
deleted file mode 100644
index fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
+++ /dev/null
@@ -1,44 +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 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/DocumentEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java
deleted file mode 100644
index 316388c1057e9a90a9459d21abf64f01dec871a3..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java
+++ /dev/null
@@ -1,99 +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 java.util.Objects;
-import java.util.function.Predicate;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.context.ApplicationEvent;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.stereotype.Component;
-
-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.errorhandling.TechnicalException;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@Component
-@RequiredArgsConstructor
-@Log4j2
-public class DocumentEventListener {
-
-	static final String CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER = "CREATE_BESCHEID_DOCUMENT_FROM_FILE";
-	 public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND = command ->
-			CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER.equals(command.getOrder());
-	private static final String IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE = "{T(de.ozgcloud.document.DocumentEventListener).IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND.test(event.getSource())}";
-
-	private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Document Command.";
-
-	private final DocumentService documentService;
-
-	private final ApplicationEventPublisher eventPublisher;
-	private final CurrentUserService userService;
-
-	@EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE)
-	public void onCreateBescheidDocumentFromFile(CommandCreatedEvent event) {
-		SecurityContext prevContext = null;
-		var command = event.getSource();
-		try {
-			prevContext = userService.startSecurityContext(command);
-			var createdDocumentId = documentService.createBescheidDocument(command);
-			publishEvent(new BescheidDocumentCreatedEvent(command, createdDocumentId));
-		} catch (Exception e) {
-			LOG.error("{} Command failed.", ERROR_MESSAGE, e);
-			publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e)));
-		} finally {
-			userService.resetSecurityContext(prevContext);
-		}
-	}
-
-	void publishEvent(ApplicationEvent event) {
-		eventPublisher.publishEvent(event);
-	}
-
-	String buildErrorMessage(Exception e) {
-		try {
-			StringBuilder sb = new StringBuilder(ERROR_MESSAGE);
-
-			if (Objects.nonNull(e.getCause()) && StringUtils.isNotBlank(e.getCause().getMessage())) {
-				sb.append(" Cause: " + e.getCause().getMessage());
-			}
-
-			if (e instanceof TechnicalException techException) {
-				sb.append(" ExceptionId: " + techException);
-			}
-
-			return sb.toString();
-		} catch (Exception e2) {
-			LOG.error("Error in building Error Message (sick).", e2);
-			return ERROR_MESSAGE;
-		}
-	}
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
deleted file mode 100644
index 673935d696777f3708fafbe134a8a496541b0d02..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
+++ /dev/null
@@ -1,48 +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 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
deleted file mode 100644
index a0e8848a34a11b3f1f1a12c961b178563d935647..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
+++ /dev/null
@@ -1,58 +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 org.apache.commons.collections.MapUtils;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.NullValueCheckStrategy;
-
-import de.ozgcloud.common.attached_item.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
deleted file mode 100644
index 0a4d0f0660902d0e74d1b93db4a5ac09d877ddda..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
+++ /dev/null
@@ -1,129 +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 java.util.Objects.*;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-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.Bescheid;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.BescheidResponse;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-
-@Service
-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";
-	public static final String FIELD_DOCUMENT_TYPE = "type";
-	public static final String FIELD_DOCUMENT_FILE = "documentFile";
-	public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
-
-	@Autowired
-	private AttachedItemService attachedItemService;
-	@Autowired
-	@Qualifier("bescheid_OzgCloudCommandService")
-	private OzgCloudCommandService commandService;
-	@Autowired
-	private CommandMapper commandMapper;
-	@Autowired
-	private DocumentMapper documentMapper;
-
-	public String createBescheidDocument(Command command) {
-		return createBescheidDocument(command, buildItemMap(command));
-	}
-
-	public String createBescheidDocument(Command command, BescheidResponse bescheid) {
-		return createBescheidDocument(command, buildItemMap(bescheid));
-	}
-
-	String createBescheidDocument(Command command, Map<String, Object> itemMap) {
-		validateBescheidItem(command.getRelationId());
-		var ozgCloudCommand = buildCreateDocumentOzgCommand(command, buildAttachedItem(command, itemMap));
-		var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand);
-		return executedCommand.getCreatedResource();
-	}
-
-	void validateBescheidItem(String bescheidId) {
-		var bescheidData = attachedItemService.getItem(bescheidId).getItem();
-		var status = MapUtils.getString(bescheidData, Bescheid.FIELD_STATUS);
-		if (Bescheid.Status.DRAFT.not(status)) {
-			throw new TechnicalException("Bescheid is not in draft status");
-		}
-	}
-
-	OzgCloudCommand buildCreateDocumentOzgCommand(Command command, Map<String, Object> bodyObject) {
-		return OzgCloudCommand.builder()
-				.order(CREATE_ATTACHED_ITEM_ORDER)
-				.vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId()))
-				.relationId(commandMapper.mapRelationId(command.getVorgangId()))
-				.bodyObject(bodyObject)
-				.build();
-	}
-
-	Map<String, Object> buildAttachedItem(Command command, Map<String, Object> itemMap) {
-		var result = new HashMap<String, Object>();
-		result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId());
-		result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		result.put(AttachedItem.PROPERTY_ITEM_NAME, DOCUMENT_ITEM_NAME);
-		result.put(AttachedItem.PROPERTY_ITEM, itemMap);
-		return result;
-	}
-
-	Map<String, Object> buildItemMap(Command command) {
-		var fileId = Optional.ofNullable(command.getBodyObject().get(FIELD_DOCUMENT_FILE)).map(String::valueOf)
-				.orElseThrow(() -> new TechnicalException("Document file is missing"));
-		return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId);
-	}
-
-	Map<String, Object> buildItemMap(BescheidResponse bescheid) {
-		if (isNull(bescheid.getBescheidFileId())) {
-			throw new TechnicalException("Bescheid file id is missing.");
-		}
-		return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE,
-				FIELD_DOCUMENT_FILE, bescheid.getBescheidFileId().toString(),
-				FIELD_NACHRICHT_TEXT, bescheid.getNachrichtText().orElse(StringUtils.EMPTY));
-	}
-
-	public Document getDocument(String id) {
-		return documentMapper.fromAttachedItem(attachedItemService.getItem(id));
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
deleted file mode 100644
index 66403e2e7b83b2ac4ce30cb2b532cbdca881da64..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static org.mockito.ArgumentMatchers.*;
-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.Mock;
-import org.springframework.beans.factory.annotation.Autowired;
-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.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEventTestFactory;
-import de.ozgcloud.command.CommandExecutedEvent;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.test.ITCase;
-
-@ITCase
-class BescheidEventListenerITCase {
-
-	private static final Command COMMAND_WITH_OTHER_ORDER = CommandTestFactory.createBuilder().order("OTHER").build();
-
-	@Autowired
-	private ApplicationEventPublisher publisher;
-	@SpyBean
-	private BescheidEventListener listener;
-
-	@MockBean
-	private BescheidService service;
-	@MockBean
-	private CurrentUserService userService;
-	@MockBean
-	private UserProfileService userProfileService;
-	@MockBean
-	private OzgCloudCommandService commandService;
-	@MockBean
-	private CommandMapper commandMapper;
-	@MockBean
-	private AttachedItemService attachedItemService;
-
-	@Mock
-	private UserProfile userProfile;
-
-	@BeforeEach
-	void init() {
-		when(userProfileService.getUserProfile()).thenReturn(userProfile);
-	}
-
-	@Nested
-	class TestCreateBescheid {
-
-		private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.CREATE_BESCHEID_ORDER).build();
-
-		@Test
-		void shouldCallService() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(service).createBescheidDraft(command);
-		}
-
-		@Test
-		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER));
-
-			verifyNoInteractions(service);
-		}
-	}
-
-	@Nested
-	class TestDeleteBescheid {
-
-		private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.DELETE_BESCHEID_ORDER).build();
-
-		@Test
-		void shouldCallService() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(attachedItemService).deleteBescheidDraft(command);
-		}
-
-		@Test
-		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER));
-
-			verifyNoInteractions(attachedItemService);
-		}
-	}
-
-	@Nested
-	class TestUpdateBescheid {
-
-		private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.UPDATE_BESCHEID_ORDER).build();
-
-		@Test
-		void shouldCallService() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(attachedItemService).updateBescheidDraft(any(), any());
-		}
-
-		@Test
-		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER));
-
-			verifyNoInteractions(attachedItemService);
-		}
-	}
-
-	@Nested
-	class TestBescheidSent {
-
-		private static final Command COMMAND = CommandTestFactory.createBuilder().order(BescheidEventListener.SEND_BESCHEID_ORDER).build();
-
-		@Test
-		void shouldCallMethod() {
-			publisher.publishEvent(new CommandExecutedEvent(COMMAND));
-
-			verify(listener).setAntragBewilligung(COMMAND);
-		}
-
-		@Test
-		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(new CommandExecutedEvent(COMMAND_WITH_OTHER_ORDER));
-
-			verifyNoInteractions(listener);
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
deleted file mode 100644
index a3734e17d99a07d77410d213ebbe30415424cb1f..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
+++ /dev/null
@@ -1,669 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static de.ozgcloud.bescheid.BescheidEventListener.*;
-import static de.ozgcloud.bescheid.BescheidRequestTestFactory.*;
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.Consumer;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.security.core.context.SecurityContext;
-
-import de.ozgcloud.bescheid.Bescheid.SendBy;
-import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEventTestFactory;
-import de.ozgcloud.command.CommandExecutedEvent;
-import de.ozgcloud.command.CommandFailedEvent;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.BescheidDocumentCreatedEvent;
-import de.ozgcloud.document.Document;
-import de.ozgcloud.document.DocumentService;
-import de.ozgcloud.document.DocumentTestFactory;
-
-class BescheidEventListenerTest {
-
-	@Spy
-	@InjectMocks
-	private BescheidEventListener listener;
-
-	@Mock
-	private BescheidService service;
-	@Mock
-	private BinaryFileService fileService;
-	@Mock
-	private AttachedItemService attachedItemService;
-	@Mock
-	private DocumentService documentService;
-
-	@Mock
-	private ApplicationEventPublisher eventPublisher;
-	@Mock
-	private CurrentUserService userService;
-	@Mock
-	private UserProfileService userProfileService;
-	@Mock
-	private TemplateHandler templateHandler;
-
-	@Nested
-	class TestOnCreateBescheidCommand {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).runWithSecurityContext(eq(command), any());
-		}
-
-		@Test
-		void shouldExecuteCreateBescheid() {
-			listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).doCreateBescheid(command);
-		}
-	}
-
-	@Nested
-	class TestDoCreateBescheid {
-
-		private static final Command COMMAND = CommandTestFactory.createBuilder()
-				.bodyObject(
-						Map.of(VORGANG_ID_BODY_KEY, VORGANG_ID.toString(),
-								BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING,
-								GENEHMIGT_BODY_KEY, GENEHMIGT))
-				.build();
-
-		@Captor
-		private ArgumentCaptor<BescheidCreatedEvent> eventCaptor;
-
-		@Test
-		void shouldCallCreateBescheidDraft() {
-			listener.doCreateBescheid(COMMAND);
-
-			verify(service).createBescheidDraft(COMMAND);
-		}
-
-		@Test
-		@DisplayName("should publish BescheidCreatedEvent after creating BescheidDraft")
-		void shouldPublishBescheidCreatedEventWithCommand() {
-			var createdResource = "item-id";
-			when(service.createBescheidDraft(any())).thenReturn(createdResource);
-
-			listener.doCreateBescheid(COMMAND);
-
-			verify(eventPublisher).publishEvent(eventCaptor.capture());
-			assertThat(eventCaptor.getValue().getCommand()).isSameAs(COMMAND);
-		}
-
-		@Test
-		@DisplayName("should publish BescheidCreatedEvent with created resource")
-		void shouldPublishBescheidCreatedEventWithCreatedResource() {
-			var createdResource = "item-id";
-			when(service.createBescheidDraft(any())).thenReturn(createdResource);
-
-			listener.doCreateBescheid(COMMAND);
-
-			verify(eventPublisher).publishEvent(eventCaptor.capture());
-			assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(createdResource);
-		}
-	}
-
-	@Nested
-	class TestCreateBescheidRequest {
-
-		private static final Command COMMAND = CommandTestFactory.createBuilder()
-				.vorgangId(VORGANG_ID.toString())
-				.bodyObject(
-						Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING,
-								GENEHMIGT_BODY_KEY, false))
-				.build();
-
-		@Test
-		void shouldSetVorgangId() {
-			var request = createBescheidRequest();
-
-			assertThat(request.getVorgangId()).isEqualTo(VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetBescheidVom() {
-			var request = createBescheidRequest();
-
-			assertThat(request.getBescheidVom()).isEqualTo(BESCHEID_VOM);
-		}
-
-		@Test
-		void shouldSetGenehmigt() {
-			var request = createBescheidRequest();
-
-			assertThat(request.isGenehmigt()).isFalse();
-		}
-
-		@Test
-		void shouldSetDefaultGenehmigt() {
-			Command command = CommandTestFactory.createBuilder()
-					.vorgangId(VORGANG_ID.toString())
-					.bodyObject(
-							Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING))
-					.build();
-
-			var request = listener.createRequest(command);
-
-			assertThat(request.isGenehmigt()).isTrue();
-		}
-
-		@Test
-		void shouldContainUserProfile() {
-			UserProfile user = UserProfileTestFactory.create();
-			when(userProfileService.getUserProfile()).thenReturn(user);
-
-			var request = listener.createRequest(COMMAND);
-
-			assertThat(request.getCreateFor()).isSameAs(user);
-		}
-
-		private BescheidRequest createBescheidRequest() {
-			return listener.createRequest(COMMAND);
-		}
-	}
-
-	@Nested
-	class TestOnDeleteBescheid {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).runWithSecurityContext(eq(command), any());
-		}
-
-		@Test
-		void shouldExecuteCreateBescheid() {
-			listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).doDeleteBescheid(command);
-		}
-	}
-
-	@Nested
-	class TestDoDeleteBescheid {
-
-		@Captor
-		private ArgumentCaptor<BescheidDeletedEvent> bescheidDeletedEventCaptor;
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallAttachedItemService() {
-			listener.doDeleteBescheid(command);
-
-			verify(attachedItemService).deleteBescheidDraft(command);
-		}
-
-		@Test
-		void shouldPublishCommandExecutedEvent() {
-			listener.doDeleteBescheid(command);
-
-			verify(eventPublisher).publishEvent(bescheidDeletedEventCaptor.capture());
-			assertThat(bescheidDeletedEventCaptor.getValue().getCommand()).isSameAs(command);
-		}
-
-	}
-
-	@Nested
-	class TestOnUpdateBescheid {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).runWithSecurityContext(eq(command), any());
-		}
-
-		@Test
-		void shouldExecuteCreateBescheid() {
-			listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).doUpdateBescheid(command);
-		}
-
-	}
-
-	@Nested
-	class TestDoUpdateBescheid {
-
-		@Captor
-		private ArgumentCaptor<BescheidUpdatedEvent> bescheidUpdatedEventCaptor;
-
-		private final Command command = CommandTestFactory.createBuilder().build();
-		private final Document document = DocumentTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			doReturn(Optional.of(document)).when(listener).getDocument(command);
-		}
-
-		@Test
-		void shouldGetDocument() {
-			listener.doUpdateBescheid(command);
-
-			verify(listener).getDocument(command);
-		}
-
-		@Test
-		void shouldCallUpdateBescheidDraft() {
-			listener.doUpdateBescheid(command);
-
-			verify(attachedItemService).updateBescheidDraft(command, Optional.of(document));
-		}
-
-		@Test
-		void shouldPublishBescheidUpdatedEvent() {
-			listener.doUpdateBescheid(command);
-
-			verify(eventPublisher).publishEvent(bescheidUpdatedEventCaptor.capture());
-			assertThat(bescheidUpdatedEventCaptor.getValue().getCommand()).isSameAs(command);
-		}
-	}
-
-	@DisplayName("Get document")
-	@Nested
-	class TestGetDocument {
-
-		@DisplayName("if exists")
-		@Nested
-		class TestIfExists {
-
-			private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-			@BeforeEach
-			void mock() {
-				when(documentService.getDocument(any())).thenReturn(DocumentTestFactory.create());
-			}
-
-			@Test
-			void shouldCallService() {
-				listener.getDocument(command);
-
-				verify(documentService).getDocument(DocumentTestFactory.ID);
-			}
-
-			@Test
-			void shouldReturnValue() {
-				var document = listener.getDocument(command);
-
-				assertThat(document.get()).usingRecursiveComparison().isEqualTo(DocumentTestFactory.create());
-			}
-		}
-
-		@Test
-		void shouldReturnEmptyIfNoDocumentExists() {
-			var document = listener.getDocument(createCommandWithoutDocument());
-
-			assertThat(document).isEmpty();
-		}
-
-		private Command createCommandWithoutDocument() {
-			var bescheidItemMap = AttachedItemTestFactory.createBescheidItem();
-			bescheidItemMap.remove(DocumentTestFactory.ID);
-			return CommandTestFactory.createBuilder().bodyObject(bescheidItemMap).build();
-		}
-	}
-
-	@Nested
-	class TestOnCreateBescheidDocument {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).runWithSecurityContext(eq(command), any());
-		}
-
-		@Test
-		void shouldExecuteCreateBescheidDocument() {
-			listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).doCreateBescheidDocument(command);
-		}
-	}
-
-	@Nested
-	class TestDoCreateBescheidDocument {
-
-		private static final Command COMMAND = CommandTestFactory.create();
-		private static final BescheidResponse BESCHEID = BescheidResponseTestFactory.create();
-
-		@Captor
-		private ArgumentCaptor<BescheidDocumentCreatedEvent> eventCaptor;
-
-		@BeforeEach
-		void init() {
-			doReturn(BESCHEID).when(listener).doCreateBescheidBiz(any());
-		}
-
-		@Test
-		void shouldCallCreateBescheidBiz() {
-			listener.doCreateBescheidDocument(COMMAND);
-
-			verify(listener).doCreateBescheidBiz(COMMAND);
-		}
-
-		@Test
-		void shouldCallCreateBescheidDocument() {
-			listener.doCreateBescheidDocument(COMMAND);
-
-			verify(documentService).createBescheidDocument(COMMAND, BESCHEID);
-		}
-
-		@Test
-		@DisplayName("should publish BescheidDocumentCreatedEvent with command")
-		void shouldPublishEventWithCommand() {
-			listener.doCreateBescheidDocument(COMMAND);
-
-			verify(eventPublisher).publishEvent(eventCaptor.capture());
-			assertThat(eventCaptor.getValue().getCommand()).isEqualTo(COMMAND);
-		}
-
-		@Test
-		@DisplayName("should publish BescheidDocumentCreatedEvent with createdResource")
-		void shouldPublishEventWithCreatedResource() {
-			var bescheidDocument = "document-id";
-			when(documentService.createBescheidDocument(any(), any(BescheidResponse.class))).thenReturn(bescheidDocument);
-
-			listener.doCreateBescheidDocument(COMMAND);
-
-			verify(eventPublisher).publishEvent(eventCaptor.capture());
-			assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(bescheidDocument);
-		}
-	}
-
-	@Nested
-	class TestCreateBescheidBiz {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallCreateRequest() {
-			listener.doCreateBescheidBiz(command);
-
-			verify(listener).createRequest(command);
-		}
-
-		@Test
-		void shouldCallBescheidService() {
-			var bescheidRequest = BescheidRequestTestFactory.create();
-			doReturn(bescheidRequest).when(listener).createRequest(any());
-
-			listener.doCreateBescheidBiz(command);
-
-			verify(service).createBescheid(bescheidRequest);
-		}
-
-		@Test
-		void shouldCallFileService() {
-			var bescheid = BescheidResponseTestFactory.create();
-			when(service.createBescheid(any())).thenReturn(bescheid);
-
-			listener.doCreateBescheidBiz(command);
-
-			verify(fileService).uploadBescheidFile(bescheid);
-		}
-
-		@Test
-		void shouldReturnBescheid() {
-			var bescheid = BescheidResponseTestFactory.create();
-			when(fileService.uploadBescheidFile(any())).thenReturn(bescheid);
-
-			var result = listener.doCreateBescheidBiz(command);
-
-			assertThat(result).isSameAs(bescheid);
-		}
-	}
-
-	@Nested
-	class TestOnSendBescheidCommand {
-
-		private final Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).runWithSecurityContext(eq(command), any());
-		}
-
-		@Test
-		void shouldExecuteDoSendBescheid() {
-			listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(listener).doSendBescheid(command);
-		}
-	}
-
-	@Nested
-	class TestDoSendBescheid {
-
-		@Captor
-		private ArgumentCaptor<BescheidSentEvent> bescheidSentEventCaptor;
-
-		@Test
-		void shouldThrowExceptionIfUnkonwnSendBy() {
-			var item = AttachedItemTestFactory.createBescheidItem();
-			item.put(Bescheid.FIELD_SEND_BY, "unknown");
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build();
-			when(attachedItemService.getItem(any())).thenReturn(bescheidItem);
-			var command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build();
-
-			Assertions.assertThrows(TechnicalException.class, () -> listener.doSendBescheid(command));
-		}
-
-		@DisplayName("manually")
-		@Nested
-		class TestManually {
-
-			private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID)
-					.relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-			private final AttachedItem bescheidItem = createManuallyBescheidItem();
-
-			private AttachedItem createManuallyBescheidItem() {
-				var attachedItem = AttachedItemTestFactory.createBescheid();
-				var item = new HashMap<>(attachedItem.getItem());
-
-				item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL);
-
-				return attachedItem.toBuilder().item(item).build();
-			}
-
-			@BeforeEach
-			void init() {
-				when(attachedItemService.getItem(any())).thenReturn(bescheidItem);
-			}
-
-			@Test
-			void shouldCallSendBescheid() {
-				listener.doSendBescheid(COMMAND);
-
-				verify(service).sendBescheidManually(bescheidItem, COMMAND);
-				verify(service, never()).sendBescheidPostfachMail(any(), any());
-			}
-
-			@Test
-			void shouldPublishEvent() {
-				listener.doSendBescheid(COMMAND);
-
-				verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture());
-				assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND);
-			}
-		}
-
-		@DisplayName("per postfach mail")
-		@Nested
-		class TestPostfachMail {
-
-			private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID)
-					.relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-			private AttachedItem bescheidItem;
-
-			@BeforeEach
-			void init() {
-				var item = AttachedItemTestFactory.createBescheidItem();
-				item.put(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name());
-				bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build();
-				when(attachedItemService.getItem(any())).thenReturn(bescheidItem);
-			}
-
-			@Test
-			void shouldCallBescheidService() {
-				listener.doSendBescheid(COMMAND);
-
-				verify(service).sendBescheidPostfachMail(bescheidItem, COMMAND);
-				verify(service, never()).sendBescheidManually(any(), any());
-			}
-
-			@Test
-			void shouldPublishEvent() {
-				listener.doSendBescheid(COMMAND);
-
-				verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture());
-				assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND);
-			}
-		}
-	}
-
-	@Nested
-	class TestOnBescheidSent {
-
-		private static final Command COMMAND = CommandTestFactory.create();
-
-		@Test
-		void shouldCallRunWithSecurityContext() {
-			listener.onBescheidSent(new CommandExecutedEvent(COMMAND));
-
-			verify(listener).runWithSecurityContext(eq(COMMAND), any());
-		}
-
-		@Test
-		void shouldExecuteSetAntragBewilligung() {
-			listener.onBescheidSent(new CommandExecutedEvent(COMMAND));
-
-			verify(listener).setAntragBewilligung(COMMAND);
-		}
-	}
-
-	@Nested
-	class TestSetAntragBewilligung {
-
-		private static final Command COMMAND = CommandTestFactory.create();
-
-		@Test
-		void shouldCallGetItem() {
-			listener.setAntragBewilligung(COMMAND);
-
-			verify(attachedItemService).getItem(CommandTestFactory.RELATION_ID);
-		}
-
-		@Test
-		void shouldCallSetAntragBewilligung() {
-			var item = AttachedItemTestFactory.createBescheid();
-			when(attachedItemService.getItem(any())).thenReturn(item);
-
-			listener.setAntragBewilligung(COMMAND);
-
-			verify(service).setAntragBewilligung(item);
-		}
-	}
-
-	@Nested
-	class TestRunWithSecurityContext {
-
-		private final Command command = CommandTestFactory.createBuilder().build();
-
-		@Mock
-		private Consumer<Command> commandExecutor;
-		@Mock
-		private SecurityContext secContext;
-		@Captor
-		private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
-
-		@BeforeEach
-		void init() {
-			when(userService.startSecurityContext(any())).thenReturn(secContext);
-		}
-
-		@Test
-		void shouldStartSecurityContext() {
-			listener.runWithSecurityContext(command, commandExecutor);
-
-			verify(userService).startSecurityContext(command);
-		}
-
-		@Test
-		void shouldExecuteCommand() {
-			listener.runWithSecurityContext(command, commandExecutor);
-
-			verify(commandExecutor).accept(command);
-		}
-
-		@Test
-		void shouldResetSecurityContext() {
-			listener.runWithSecurityContext(command, commandExecutor);
-
-			verify(userService).resetSecurityContext(secContext);
-		}
-
-		@Test
-		void shouldResetSecurityContextAfterException() {
-			doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any());
-
-			listener.runWithSecurityContext(command, commandExecutor);
-
-			verify(userService).resetSecurityContext(secContext);
-		}
-
-		@Test
-		void shouldPublishCommandFailedEvent() {
-			doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any());
-
-			listener.runWithSecurityContext(command, commandExecutor);
-
-			verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture());
-			assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
-			assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isNotEmpty();
-		}
-	}
-}
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 04871bb15ac3d213da2197b73610bd3660bd410e..311d893f13c7e541cd15f8763e33d2736d7b3f59 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
@@ -17,11 +17,13 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItemMapper;
-import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.BescheidService;
+import de.ozgcloud.document.bescheid.vorgang.VorgangId;
+import de.ozgcloud.document.common.attached_item.AttachedItemMapper;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 import io.grpc.stub.StreamObserver;
 
 class BescheidGrpcServiceTest {
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java
index cdd3c20e856282db187f1f101422e449e2ecd354..58d8b89820838aba7b2f76a916c3ce1da3d91b1b 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java
@@ -23,8 +23,9 @@
  */
 package de.ozgcloud.bescheid;
 
-import de.ozgcloud.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder;
-import de.ozgcloud.bescheid.BescheidManagerConfig.Features;
+import de.ozgcloud.document.bescheid.BescheidManagerConfig;
+import de.ozgcloud.document.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder;
+import de.ozgcloud.document.bescheid.BescheidManagerConfig.Features;
 
 public class BescheidManagerConfigTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java
index 4e867c490dcc6bdcecd99e3b26cbc221caf686be..feabd948c1bd5f5233bcc69761dd1fc5eb040bd7 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java
@@ -19,9 +19,11 @@ import org.mockito.Spy;
 
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.document.DocumentTestFactory;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 
 class BescheidMapperTest {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
deleted file mode 100644
index dbe4f9e43deb4fbcd43ea0b8b960bc3861570174..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.time.LocalDate;
-
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-
-public class BescheidRequestTestFactory {
-
-	static final VorgangId VORGANG_ID = VorgangTestFactory.ID;
-	static final String BESCHEID_VOM_STRING = "2023-01-04";
-	static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING);
-	static final boolean GENEHMIGT = true;
-
-	public static BescheidRequest create() {
-		return createBuilder().build();
-	}
-
-	public static BescheidRequest.BescheidRequestBuilder createBuilder() {
-		return BescheidRequest.builder()
-				.vorgangId(VORGANG_ID)
-				.bescheidVom(BESCHEID_VOM)
-				.genehmigt(GENEHMIGT)
-				.createFor(UserProfileTestFactory.create());
-
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java
deleted file mode 100644
index 94581c9fe21016dfb70cdb0b7f5279b42f877b94..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.io.File;
-import java.util.Optional;
-
-import org.springframework.http.MediaType;
-
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.binaryfile.TempFileUtils;
-import de.ozgcloud.document.DocumentTestFactory;
-
-public class BescheidResponseTestFactory {
-
-	public static final String BESCHEID_FILE_NAME = "testbescheid";
-	public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(BESCHEID_FILE_NAME.getBytes());
-	public static final int BESCHEID_FILE_SIZE = BESCHEID_FILE_NAME.getBytes().length;
-
-	public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE;
-
-	public static BescheidResponse create() {
-		return createBuilder().build();
-	}
-
-	public static BescheidResponse.BescheidResponseBuilder createBuilder() {
-		return BescheidResponse.builder()
-				.createdBy(UserProfileTestFactory.ID)
-				.vorgangId(VorgangTestFactory.ID)
-				.contentType(CONTENT_TYPE)
-				.bescheidFileName(BESCHEID_FILE_NAME)
-				.bescheidFile(BESCHEID_FILE)
-				.bescheidFileId(FileId.from(DocumentTestFactory.ID))
-				.nachrichtSubject(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT))
-				.nachrichtText(Optional.of(BescheidTestFactory.NACHRICHT_TEXT))
-				.bewilligt(BescheidTestFactory.BEWILLIGT)
-				.size(BESCHEID_FILE_SIZE)
-				.attachments(BescheidTestFactory.ATTACHMENTS)
-				.serviceKonto(ServiceKontoTestFactory.create());
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
deleted file mode 100644
index e593e429c550d90454013369ab01640091b5afef..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
+++ /dev/null
@@ -1,1599 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.EnumSource;
-import org.junit.jupiter.params.provider.NullSource;
-import org.junit.jupiter.params.provider.ValueSource;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.springframework.boot.info.BuildProperties;
-import org.springframework.test.util.ReflectionTestUtils;
-
-import de.ozgcloud.apilib.common.command.OzgCloudCommand;
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.apilib.common.datatypes.GenericId;
-import de.ozgcloud.apilib.user.OzgCloudUserId;
-import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
-import de.ozgcloud.bescheid.Bescheid.SendBy;
-import de.ozgcloud.bescheid.administration.AdministrationService;
-import de.ozgcloud.bescheid.attributes.ClientAttributeService;
-import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory;
-import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.bescheid.vorgang.VorgangService;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.datatype.StringBasedValue;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.DocumentTestFactory;
-
-class BescheidServiceTest {
-
-	@Spy
-	@InjectMocks
-	private BescheidService service;
-
-	@Mock
-	private VorgangService vorgangService;
-	@Mock
-	private AttachedItemService attachedItemService;
-	@Mock
-	private UserProfileService userProfileService;
-	@Mock
-	private OzgCloudCommandService commandService;
-	@Mock
-	private CommandMapper commandMapper;
-	@Mock
-	private ClientAttributeService clientAttributeService;
-	@Mock
-	private BuildProperties buildProperties;
-	@Mock
-	private BescheidRemoteService remoteService;
-	@Mock
-	private BescheidMapper mapper;
-	@Mock
-	private AdministrationService administrationService;
-	@Mock
-	private TemplateHandler templateHandler;
-
-	@BeforeEach
-	void init() {
-		ReflectionTestUtils.setField(service, "remoteService", Optional.of(remoteService));
-	}
-
-	@Nested
-	class TestFindDraft {
-
-		private final AttachedItem vorgangAttachedItem = AttachedItemTestFactory.create();
-
-		private final Bescheid bescheid = BescheidTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(vorgangAttachedItem));
-			when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid);
-		}
-
-		@Test
-		void shouldCallVorgangAttachedItemRemoteService() {
-			service.findDraft(VorgangTestFactory.ID_STR);
-
-			verify(attachedItemService).findBescheidItem(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallMapper() {
-			service.findDraft(VorgangTestFactory.ID_STR);
-
-			verify(mapper).mapFromAttachedItem(vorgangAttachedItem);
-		}
-
-		@Test
-		void shouldReturnValue() {
-			var draft = service.findDraft(VorgangTestFactory.ID_STR);
-
-			assertThat(draft).hasValue(bescheid);
-		}
-	}
-
-	@DisplayName("Find all")
-	@Nested
-	class TestFindAll {
-
-		private final AttachedItem attachedItem = AttachedItemTestFactory.create();
-		private final Bescheid bescheid = BescheidTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			when(attachedItemService.findAllBescheid(any())).thenReturn(Collections.singleton(attachedItem));
-			when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid);
-		}
-
-		@Test
-		void shouldCallVorgangAttachedItemService() {
-			findAll();
-
-			verify(attachedItemService).findAllBescheid(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallMapper() {
-			findAll();
-
-			verify(mapper).mapFromAttachedItem(attachedItem);
-		}
-
-		@Test
-		void shouldReturnValue() {
-			var bescheide = findAll();
-
-			assertThat(bescheide).containsExactly(bescheid);
-		}
-
-		private List<Bescheid> findAll() {
-			return service.findAll(VorgangTestFactory.ID).toList();
-		}
-	}
-
-	@Nested
-	class TestCreateBescheidDraft {
-
-		private static final Map<String, Object> COMMAND_BODY = Map.of("key", "value");
-		private static final Command COMMAND = CommandTestFactory.createBuilder().bodyObject(COMMAND_BODY).build();
-		private static final Bescheid BESCHEID_DRAFT = BescheidTestFactory.create();
-
-		@BeforeEach
-		void init() {
-			doNothing().when(service).validateBescheidData(any());
-			doReturn(BESCHEID_DRAFT).when(service).buildBescheidDraft(any());
-		}
-
-		@Test
-		void shouldCallValidateBescheidData() {
-			service.createBescheidDraft(COMMAND);
-
-			verify(service).validateBescheidData(COMMAND_BODY);
-		}
-
-		@Test
-		void shouldCallAttachedItemService() {
-			service.createBescheidDraft(COMMAND);
-
-			verify(attachedItemService).createBescheidDraft(BESCHEID_DRAFT);
-		}
-
-		@Test
-		void shouldReturnResult() {
-			var createdBescheidId = "created-bescheid-id";
-			when(attachedItemService.createBescheidDraft(any(Bescheid.class))).thenReturn(createdBescheidId);
-
-			var result = service.createBescheidDraft(COMMAND);
-
-			assertThat(result).isEqualTo(createdBescheidId);
-		}
-	}
-
-	@Nested
-	class TestValidateBescheidData {
-
-		private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder()
-				.bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-		@Test
-		void shouldValidate() {
-			assertDoesNotThrow(() -> service.validateBescheidData(CREATE_BESCHEID_DRAFT_COMMAND.getBodyObject()));
-		}
-
-		@DisplayName("should fail if bescheidAm is missing")
-		@Test
-		void shouldThrowExceptionByBescheidAm() {
-			var map = Map.<String, Object>of(Bescheid.FIELD_BEWILLIGT, true);
-
-			assertThrows(TechnicalException.class, () -> service.validateBescheidData(map));
-		}
-
-		@DisplayName("should fail if bewilligt is missing")
-		@Test
-		void shouldThrowExceptionByBewilligt() {
-			var map = Map.<String, Object>of(Bescheid.FIELD_BESCHIEDEN_AM, "2021-01-01");
-
-			assertThrows(TechnicalException.class, () -> service.validateBescheidData(map));
-		}
-
-		@Test
-		void shouldValidateSendBy() {
-			var bodyObject = Map.<String, Object>of(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name());
-			doNothing().when(service).validateBescheidField(any(), any());
-
-			service.validateBescheidData(bodyObject);
-
-			verify(service).validateSendBy(SendBy.MANUAL.name());
-		}
-
-		@DisplayName("validate sendBy")
-		@Nested
-		class TestValidateSendBy {
-
-			@ValueSource(strings = { "not-exist", "" })
-			@ParameterizedTest
-			void shouldThrowExceptionOnNonExistingSendByValue(String sendBy) {
-				assertThrows(TechnicalException.class, () -> service.validateSendBy(sendBy));
-			}
-
-			@EnumSource(names = { "NACHRICHT", "MANUAL" })
-			@ParameterizedTest
-			void shouldNotThrowAnyExceptionOnExistingSendByValue(SendBy sendBy) {
-				assertDoesNotThrow(() -> service.validateSendBy(sendBy.name()));
-			}
-		}
-	}
-
-	@Nested
-	class TestBuildBescheidDraft {
-
-		private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder()
-				.bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-		private final Bescheid bescheid = BescheidTestFactory.createBuilder().status(Bescheid.Status.SENT).build();
-
-		@BeforeEach
-		void init() {
-			when(mapper.mapFromCommand(any())).thenReturn(bescheid);
-		}
-
-		@Test
-		void shouldCallMapFromCommand() {
-			buildBescheidDraft();
-
-			verify(mapper).mapFromCommand(CREATE_BESCHEID_DRAFT_COMMAND);
-		}
-
-		@Test
-		void shouldResetId() {
-			var result = buildBescheidDraft();
-
-			assertThat(result.getId()).isNull();
-		}
-
-		@Test
-		void shouldResetVersion() {
-			var result = buildBescheidDraft();
-
-			assertThat(result.getVersion()).isZero();
-		}
-
-		@Test
-		void shouldSetStatus() {
-			var result = buildBescheidDraft();
-
-			assertThat(result.getStatus()).isEqualTo(Bescheid.Status.DRAFT);
-		}
-
-		@Test
-		void shouldNotOverrideNachrichtSubject() {
-			var result = buildBescheidDraft();
-
-			assertThat(result.getNachrichtSubject()).contains(BescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldSetNachrichtSubject() {
-			var bescheid = BescheidTestFactory.createBuilder().nachrichtSubject(Optional.empty()).build();
-			when(mapper.mapFromCommand(any())).thenReturn(bescheid);
-
-			var result = buildBescheidDraft();
-
-			assertThat(result.getNachrichtSubject()).contains(BescheidService.SUBJECT);
-		}
-
-		@Test
-		void shouldNotOverrideNachrichtText() {
-			var result = buildBescheidDraft();
-
-			assertThat(result.getNachrichtText()).contains(BescheidTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldCallCreateNachrichtText() {
-			var createdText = "created text";
-			doReturn(createdText).when(service).createNachrichtText();
-			var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build();
-			when(mapper.mapFromCommand(any())).thenReturn(bescheid);
-
-			buildBescheidDraft();
-
-			verify(service).createNachrichtText();
-		}
-
-		@Test
-		void shouldSetNachrichtText() {
-			var createdText = "created text";
-			doReturn(createdText).when(service).createNachrichtText();
-			var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build();
-			when(mapper.mapFromCommand(any())).thenReturn(bescheid);
-
-			var result = buildBescheidDraft();
-
-			assertThat(result.getNachrichtText()).contains(createdText);
-		}
-
-		private Bescheid buildBescheidDraft() {
-			return service.buildBescheidDraft(CREATE_BESCHEID_DRAFT_COMMAND);
-		}
-	}
-
-	@Nested
-	class TestCreateNachrichtText {
-
-		@Captor
-		private ArgumentCaptor<Map<String, Object>> signatureCaptor;
-
-		@Test
-		void shouldCallGetTemplateParameters() {
-			service.createNachrichtText();
-
-			verify(service).getTemplateParameters();
-		}
-
-		@Test
-		void shouldCallFillTemplate() {
-			var parameterMap = Map.<String, Object>of("key", "value");
-			doReturn(parameterMap).when(service).getTemplateParameters();
-
-			service.createNachrichtText();
-
-			verify(templateHandler).fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, parameterMap);
-		}
-
-		@Test
-		void shouldReturnNachricht() {
-			when(templateHandler.fillTemplate(any(), any())).thenReturn(BescheidTestFactory.NACHRICHT_TEXT);
-
-			var result = service.createNachrichtText();
-
-			assertThat(result).isEqualTo(BescheidTestFactory.NACHRICHT_TEXT);
-		}
-	}
-
-	@Nested
-	class TestGetTemplateParameters {
-
-		@Test
-		void shouldCallAdministrationService() {
-			service.createNachrichtText();
-
-			verify(administrationService).getNachrichtSignature();
-		}
-
-		@Test
-		void shouldReturnParameters() {
-			var signature = "signature";
-			when(administrationService.getNachrichtSignature()).thenReturn(Optional.of(signature));
-
-			var result = service.getTemplateParameters();
-
-			assertThat(result).containsEntry(BescheidService.KEY_TEMPLATE_SIGNATURE, signature);
-		}
-
-		@Test
-		void shouldReturnEmptyMap() {
-			var result = service.getTemplateParameters();
-
-			assertThat(result).isEmpty();
-		}
-	}
-
-	@Nested
-	class TestCreateBescheid {
-
-		private final Vorgang vorgang = VorgangTestFactory.create();
-		private final BescheidResponse bescheid = BescheidResponseTestFactory.createBuilder().vorgangId(null).build();
-
-		@BeforeEach
-		void initMocks() {
-			when(vorgangService.getById(any())).thenReturn(vorgang);
-			when(remoteService.create(any(), any())).thenReturn(bescheid);
-		}
-
-		@Test
-		void shouldLoadVorgang() {
-			service.createBescheid(BescheidRequestTestFactory.create());
-
-			verify(vorgangService).getById(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldCreateBescheid() {
-			BescheidRequest request = BescheidRequestTestFactory.create();
-
-			service.createBescheid(request);
-
-			verify(remoteService).create(request, vorgang);
-		}
-
-		@Test
-		void shouldReturnCreatedBescheid() {
-			var result = service.createBescheid(BescheidRequestTestFactory.create());
-
-			assertThat(result).usingRecursiveComparison().isEqualTo(BescheidResponseTestFactory.create());
-		}
-	}
-
-	@Nested
-	class TestSendBescheidManually {
-
-		private static final Vorgang VORGANG = VorgangTestFactory.create();
-
-		@Mock
-		private OzgCloudCommand subCommand;
-
-		@Captor
-		private ArgumentCaptor<VorgangId> vorgangIdCaptor;
-
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
-
-		@BeforeEach
-		void init() {
-			doNothing().when(service).validateBescheidSendManually(any(), anyLong());
-			doNothing().when(service).addSubCommands(any(), any());
-			doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId();
-			doReturn(List.of(subCommand)).when(service).buildSetBescheidSentSubCommands(any(), any(), any());
-			when(vorgangService.getById(any())).thenReturn(VORGANG);
-		}
-
-		@Test
-		void shouldCallValidateBescheid() {
-			sendBescheid();
-
-			verify(service).validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldCallGetVorgang() {
-			sendBescheid();
-
-			verify(vorgangService).getById(vorgangIdCaptor.capture());
-			assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallGetUserId() {
-			sendBescheid();
-
-			verify(service).getUserId();
-		}
-
-		@Test
-		void shouldCallBuildSetBescheidSentSubCommands() {
-			sendBescheid();
-
-			verify(service).buildSetBescheidSentSubCommands(bescheidItem, VORGANG, UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldCallAddSubCommands() {
-			sendBescheid();
-
-			verify(service).addSubCommands(CommandTestFactory.ID, List.of(subCommand));
-		}
-
-		private void sendBescheid() {
-			var parentCommand = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build();
-			service.sendBescheidManually(bescheidItem, parentCommand);
-		}
-	}
-
-	@Nested
-	class TestValidateBescheidSendManually {
-
-		private final AttachedItem attachedItem = createManuallySendBescheid();
-
-		private AttachedItem createManuallySendBescheid() {
-			var bescheidItem = AttachedItemTestFactory.createBescheid();
-			var item = new HashMap<>(bescheidItem.getItem());
-
-			item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name());
-
-			return bescheidItem.toBuilder().item(item).build();
-		}
-
-		@Test
-		void shouldCallValidateBescheid() {
-			service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION);
-
-			verify(service).validateBescheid(attachedItem, AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldValidate() {
-			doNothing().when(service).validateBescheid(any(), anyLong());
-
-			assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION));
-		}
-
-		@DisplayName("should decline when")
-		@ParameterizedTest(name = "sendBy = {0}")
-		@EnumSource(value = Bescheid.SendBy.class, names = "MANUAL", mode = EnumSource.Mode.EXCLUDE)
-		void shouldDeclineSendByNotManual(Bescheid.SendBy sendBy) {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("sendBy");
-		}
-	}
-
-	@Nested
-	class TestSendBescheidPostfachMail {
-
-		private static final Command PARENT_COMMAND = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build();
-		private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create();
-		private static final Vorgang VORGANG = VorgangTestFactory.createBuilder().serviceKonto(SERVICE_KONTO).build();
-
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-		@Mock
-		private OzgCloudCommand setBescheidSentSubCommand;
-		@Mock
-		private OzgCloudCommand sendPostfachNachrichtSubCommand;
-		@Captor
-		private ArgumentCaptor<VorgangId> vorgangIdCaptor;
-		@Captor
-		private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor;
-
-		@BeforeEach
-		void init() {
-			doNothing().when(service).validateBescheidSendPostfach(any(), anyLong());
-			doNothing().when(service).addSubCommands(any(), any());
-			doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId();
-			var subCommands = new ArrayList<OzgCloudCommand>();
-			subCommands.add(setBescheidSentSubCommand);
-			doReturn(subCommands).when(service).buildSetBescheidSentSubCommands(any(), any(), any());
-			doReturn(sendPostfachNachrichtSubCommand).when(service).buildSendPostfachNachrichtCommand(any(), any(), any());
-			when(vorgangService.getById(any())).thenReturn(VORGANG);
-		}
-
-		@Test
-		void shouldCallValidateBescheid() {
-			sendBescheid();
-
-			verify(service).validateBescheidSendPostfach(BESCHEID_ITEM, AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldCallVorgangService() {
-			sendBescheid();
-
-			verify(vorgangService).getById(vorgangIdCaptor.capture());
-			assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallGetUserId() {
-			sendBescheid();
-
-			verify(service).getUserId();
-		}
-
-		@Test
-		void shouldCallBuildSetBescheidSentSubCommands() {
-			sendBescheid();
-
-			verify(service).buildSetBescheidSentSubCommands(BESCHEID_ITEM, VORGANG, UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldCallBuildSendPostfachNachrichtCommand() {
-			sendBescheid();
-
-			verify(service).buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldCallAddSubCommands() {
-			sendBescheid();
-
-			verify(service).addSubCommands(eq(CommandTestFactory.ID), subCommandsCaptor.capture());
-			assertThat(subCommandsCaptor.getValue()).containsExactly(setBescheidSentSubCommand, sendPostfachNachrichtSubCommand);
-		}
-
-		private void sendBescheid() {
-			service.sendBescheidPostfachMail(BESCHEID_ITEM, PARENT_COMMAND);
-		}
-	}
-
-	@Nested
-	class TestValidateBescheidSendPostfach {
-
-		@Test
-		void shouldCallValidateBescheid() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
-
-			service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION);
-
-			verify(service).validateBescheid(bescheidItem, AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldValidate() {
-			doNothing().when(service).validateBescheid(any(), anyLong());
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
-
-			assertDoesNotThrow(() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION));
-		}
-
-		@DisplayName("should decline when")
-		@ParameterizedTest(name = "sendBy = {0}")
-		@EnumSource(value = Bescheid.SendBy.class, names = "NACHRICHT", mode = EnumSource.Mode.EXCLUDE)
-		void shouldDeclineSendByNotPostfach(Bescheid.SendBy sendBy) {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("sendBy");
-		}
-
-		@Test
-		void shouldDeclineWhenNoSubject() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, null)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("nachricht subject");
-		}
-
-		@Test
-		void shouldDeclineWhenNoText() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, null).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("nachricht text");
-		}
-	}
-
-	@Nested
-	class TestValidateBescheid {
-
-		private final AttachedItem attachedItem = createManuallySendBescheid();
-
-		private AttachedItem createManuallySendBescheid() {
-			var bescheidItem = AttachedItemTestFactory.createBescheid();
-			var item = new HashMap<>(bescheidItem.getItem());
-
-			item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name());
-
-			return bescheidItem.toBuilder().item(item).build();
-		}
-
-		@Test
-		void shouldValidateBescheid() {
-			assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION));
-		}
-
-		@DisplayName("should decline when")
-		@ParameterizedTest(name = "status = {0}")
-		@EnumSource(value = Bescheid.Status.class, names = "DRAFT", mode = EnumSource.Mode.EXCLUDE)
-		void shouldDeclineNotDraft(Bescheid.Status status) {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_STATUS, status.name()).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("has status");
-		}
-
-		@Test
-		void shouldDeclineWhenNoDocument() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, null).build();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
-			assertThat(message).contains("document");
-		}
-
-		@Test
-		void shouldDeclineWhenVersionMismatch() {
-			var bescheidItem = AttachedItemTestFactory.createBescheid();
-
-			var message = assertThrows(TechnicalException.class,
-					() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION + 1)).getMessage();
-			assertThat(message).contains("version");
-		}
-	}
-
-	@Nested
-	class TestGetAttachments {
-
-		@Test
-		void shouldReturnEmptyList() {
-			var result = service.getAttachments(AttachedItemTestFactory.createBescheidBuilder().clearItem().build());
-
-			assertThat(result).isEmpty();
-		}
-
-		@Nested
-		class TestWithCollection {
-
-			@Test
-			void shouldReturnAttachments() {
-				var result = service.getAttachments(AttachedItemTestFactory.createBescheid());
-
-				assertThat(result).containsExactly(BescheidTestFactory.ATTACHMENT, BescheidTestFactory.ATTACHMENT);
-			}
-
-			@Test
-			void shouldReturnEmpty() {
-				var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem()
-						.itemEntry(Bescheid.FIELD_ATTACHMENTS, Collections.emptyList()).build();
-
-				var result = service.getAttachments(bescheidItem);
-
-				assertThat(result).isEmpty();
-			}
-
-		}
-
-		@Nested
-		class TestSingleAttachment {
-
-			private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem()
-					.itemEntry(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENT).build();
-
-			@Test
-			void shouldCallGetStringAsList() {
-				service.getAttachments(bescheidItem);
-
-				verify(service).getStringAsList(BescheidTestFactory.ATTACHMENT);
-			}
-
-			@Test
-			void shouldReturnBescheidFileIdList() {
-				var expectedResult = List.of(BescheidTestFactory.ATTACHMENT);
-				doReturn(expectedResult).when(service).getStringAsList(any());
-
-				var result = service.getAttachments(bescheidItem);
-
-				assertThat(result).isSameAs(expectedResult);
-			}
-		}
-	}
-
-	@Nested
-	class TestGetStringAsList {
-
-		@DisplayName("should return empty list when")
-		@ParameterizedTest(name = "value = \"{0}\"")
-		@NullSource
-		@ValueSource(strings = { "", " " })
-		void shouldReturnEmptyListOnBlankValue(String value) {
-			var result = service.getStringAsList(value);
-
-			assertThat(result).isEmpty();
-		}
-
-		@Test
-		void shouldReturnEmptyListOnUnexpectedType() {
-			var result = service.getStringAsList(0);
-
-			assertThat(result).isEmpty();
-		}
-	}
-
-	@Nested
-	class TestAddSubCommands {
-
-		@Mock
-		private OzgCloudCommand subCommand;
-		@Mock
-		private OzgCloudCreateSubCommandsRequest createSubCommandsRequest;
-
-		@Test
-		void shouldCallBuildCreateSubCommandsRequest() {
-			var subCommands = List.of(subCommand);
-
-			service.addSubCommands(CommandTestFactory.ID, subCommands);
-
-			verify(service).buildCreateSubCommandsRequest(CommandTestFactory.ID, subCommands);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(createSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any());
-
-			service.addSubCommands(CommandTestFactory.ID, List.of(subCommand));
-
-			verify(commandService).addSubCommands(createSubCommandsRequest);
-		}
-	}
-
-	@Nested
-	class TestGetBescheidFileId {
-
-		@BeforeEach
-		void init() {
-			when(attachedItemService.getItem(anyString())).thenReturn(AttachedItemTestFactory.createDocument());
-		}
-
-		@Test
-		void shouldCallGetItem() {
-			service.getBescheidFileId(AttachedItemTestFactory.createBescheid());
-
-			verify(attachedItemService).getItem(DocumentTestFactory.ID);
-		}
-
-		@Test
-		void shouldReturnBescheidFileId() {
-			var result = service.getBescheidFileId(AttachedItemTestFactory.createBescheid());
-
-			assertThat(result).hasToString(DocumentTestFactory.DOCUMENT_FILE);
-		}
-	}
-
-	@Nested
-	class TestGetNachrichtSubject {
-
-		@Test
-		void shouldReturnSubject() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_SUBJECT,
-					BescheidTestFactory.NACHRICHT_SUBJECT)).build();
-
-			var result = service.getNachrichtSubject(bescheidItem);
-
-			assertThat(result).contains(BescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-	}
-
-	@Nested
-	class TestGetNachrichtText {
-
-		@Test
-		void shouldReturnText() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_TEXT,
-					BescheidTestFactory.NACHRICHT_TEXT)).build();
-
-			var result = service.getNachrichtText(bescheidItem);
-
-			assertThat(result).contains(BescheidTestFactory.NACHRICHT_TEXT);
-		}
-	}
-
-	@Nested
-	class TestGetUserId {
-
-		@Mock
-		private UserProfile userProfile;
-
-		@BeforeEach
-		void init() {
-			when(userProfileService.getUserProfile()).thenReturn(userProfile);
-			when(userProfile.getId()).thenReturn(UserProfileTestFactory.ID);
-
-		}
-
-		@Test
-		void shouldCallGetUserProfile() {
-			service.getUserId();
-
-			verify(userProfileService).getUserProfile();
-		}
-
-		@Test
-		void shouldReturnUserId() {
-			var result = service.getUserId();
-
-			assertThat(result).isEqualTo(UserProfileTestFactory.ID_STR);
-		}
-	}
-
-	@Nested
-	class TestBuildSetBescheidSentCommands {
-
-		@Mock
-		private AttachedItem bescheidItem;
-		@Mock
-		private Vorgang vorgang;
-		@Mock
-		private OzgCloudCommand vorgangBescheidenCommand;
-		@Mock
-		private OzgCloudCommand setBescheidSentStatusCommand;
-
-		@BeforeEach
-		void inti() {
-			doReturn(vorgangBescheidenCommand).when(service).buildVorgangBescheidenCommand(any());
-			doReturn(setBescheidSentStatusCommand).when(service).buildSetBescheidSentStatusCommand(any(), any());
-		}
-
-		@Test
-		void shouldCallBuildVorgangBescheidenCommand() {
-			buildSetBescheidSentCommands();
-
-			verify(service).buildVorgangBescheidenCommand(vorgang);
-		}
-
-		@Test
-		void shouldCallBuildSetBescheidSentStatusCommand() {
-			buildSetBescheidSentCommands();
-
-			verify(service).buildSetBescheidSentStatusCommand(bescheidItem, UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldReturnResult() {
-			var result = buildSetBescheidSentCommands();
-
-			assertThat(result).containsExactly(vorgangBescheidenCommand, setBescheidSentStatusCommand);
-		}
-
-		private List<OzgCloudCommand> buildSetBescheidSentCommands() {
-			return service.buildSetBescheidSentSubCommands(bescheidItem, vorgang, UserProfileTestFactory.ID_STR);
-		}
-	}
-
-	@Nested
-	class TestBuildVorgangBescheidenCommand {
-
-		private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString());
-		private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString());
-
-		@BeforeEach
-		void init() {
-			when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID);
-			when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID);
-		}
-
-		@Test
-		void shouldCallMapVorgangId() {
-			buildVorgangBescheidenCommand();
-
-			verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var result = buildVorgangBescheidenCommand();
-
-			assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallMapRelationId() {
-			buildVorgangBescheidenCommand();
-
-			verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var result = buildVorgangBescheidenCommand();
-
-			assertThat(result.getRelationId()).isEqualTo(RELATION_ID);
-		}
-
-		@Test
-		void shouldSetRelationVersion() {
-			var result = buildVorgangBescheidenCommand();
-
-			assertThat(result.getRelationVersion()).isEqualTo(VorgangTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = buildVorgangBescheidenCommand();
-
-			assertThat(result.getOrder()).isEqualTo(BescheidService.VORGANG_BESCHEIDEN_ORDER);
-		}
-
-		private OzgCloudCommand buildVorgangBescheidenCommand() {
-			return service.buildVorgangBescheidenCommand(VorgangTestFactory.create());
-		}
-	}
-
-	@Nested
-	class TestBuildSetBescheidSentStatusCommand {
-
-		private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString());
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-		@BeforeEach
-		void init() {
-			when(commandMapper.mapRelationId(any())).thenReturn(RELATION_ID);
-		}
-
-		@Test
-		void shouldCallMapRelationId() {
-			buildSetBescheidSentStatusCommand();
-
-			verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var result = buildSetBescheidSentStatusCommand();
-
-			assertThat(result.getRelationId()).isEqualTo(RELATION_ID);
-		}
-
-		@Test
-		void shouldSetRelationVersion() {
-			var result = buildSetBescheidSentStatusCommand();
-
-			assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = buildSetBescheidSentStatusCommand();
-
-			assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM);
-		}
-
-		@Test
-		void shouldSetPropertyId() {
-			var result = buildSetBescheidSentStatusCommand();
-
-			assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallBuildBescheidSentStatusItem() {
-			buildSetBescheidSentStatusCommand();
-
-			verify(service).buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldSetPropertyItem() {
-			var itemMap = Map.of("key", "value");
-			doReturn(itemMap).when(service).buildBescheidSentStatusItem(any());
-
-			var result = buildSetBescheidSentStatusCommand();
-
-			assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ITEM, itemMap);
-		}
-
-		private OzgCloudCommand buildSetBescheidSentStatusCommand() {
-			return service.buildSetBescheidSentStatusCommand(BESCHEID_ITEM, UserProfileTestFactory.ID_STR);
-		}
-	}
-
-	@Nested
-	class TestBuildBescheidSentStatusItem {
-
-		@Test
-		void shouldSetStatus() {
-			var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR);
-
-			assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name());
-		}
-
-		@Test
-		void shouldCallBuildSentInfoMap() {
-			service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR);
-
-			verify(service).buildSentInfoMap(UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldSetSentInfo() {
-			var sentInfoMap = Map.of("key", "value");
-			doReturn(sentInfoMap).when(service).buildSentInfoMap(any());
-
-			var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR);
-
-			assertThat(result).containsEntry(Bescheid.FIELD_SENT_INFO, sentInfoMap);
-		}
-	}
-
-	@Nested
-	class TestBuildSentInfoMap {
-
-		@Test
-		void shouldSetSentAt() {
-			var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR);
-
-			assertThat(getSentAt(result)).isCloseTo(ZonedDateTime.now(), within(1, ChronoUnit.SECONDS));
-		}
-
-		@Test
-		void shouldSetSentBy() {
-			var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR);
-
-			assertThat(result).containsEntry(SentInfo.FIELD_SENT_BY, UserProfileTestFactory.ID_STR);
-		}
-
-		private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) {
-			return ZonedDateTime.parse((String) sentInfoMap.get(SentInfo.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME);
-		}
-	}
-
-	@Nested
-	class TestBuildSendPostfachNachrichtCommand {
-
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-		private static final Vorgang.PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create();
-		private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.createBuilder().clearPostfachAddresses()
-				.postfachAddress(POSTFACH_ADDRESS).build();
-		private static final OzgCloudUserId OZG_CLOUD_ID = OzgCloudUserId.from(UserProfileTestFactory.ID_STR);
-		private static final Map<String, Object> OBJECT_MAP = Map.of("key", "value");
-		private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString());
-		private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString());
-
-		@BeforeEach
-		void init() {
-			when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID);
-			when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID);
-			when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(OZG_CLOUD_ID);
-			doReturn(OBJECT_MAP).when(service).buildSendNachrichtCommandBody(any(), any());
-		}
-
-		@Test
-		void shouldCallBuildPostfachAddress() {
-			buildSendPostfachNachrichtCommand();
-
-			verify(service).buildPostfachAddress(POSTFACH_ADDRESS, ServiceKontoTestFactory.TYPE);
-		}
-
-		@Test
-		void shouldCallBuildSenNachrichtCommandBody() {
-			var postfachAddressMap = Map.<String, Object>of("key", "value");
-			doReturn(postfachAddressMap).when(service).buildPostfachAddress(any(), any());
-
-			buildSendPostfachNachrichtCommand();
-
-			verify(service).buildSendNachrichtCommandBody(BESCHEID_ITEM, postfachAddressMap);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var result = buildSendPostfachNachrichtCommand();
-
-			assertThat(result.getBodyObject()).isSameAs(OBJECT_MAP);
-		}
-
-		@Test
-		void shouldCallMapVorgangId() {
-			buildSendPostfachNachrichtCommand();
-
-			verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var result = buildSendPostfachNachrichtCommand();
-
-			assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallMapRelationId() {
-			buildSendPostfachNachrichtCommand();
-
-			verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var result = buildSendPostfachNachrichtCommand();
-
-			assertThat(result.getRelationId()).isEqualTo(RELATION_ID);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = buildSendPostfachNachrichtCommand();
-
-			assertThat(result.getOrder()).isEqualTo(BescheidService.SEND_POSTFACH_NACHRICHT_ORDER);
-		}
-
-		@Test
-		void shouldCallMapToOzgCloudUserId() {
-			buildSendPostfachNachrichtCommand();
-
-			verify(commandMapper).toOzgCloudUserId(UserProfileTestFactory.ID_STR);
-		}
-
-		@Test
-		void shouldSetCreatedBy() {
-			var result = buildSendPostfachNachrichtCommand();
-
-			assertThat(result.getCreatedBy()).isEqualTo(OZG_CLOUD_ID);
-		}
-
-		private OzgCloudCommand buildSendPostfachNachrichtCommand() {
-			return service.buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR);
-		}
-	}
-
-	@Nested
-	class TestBuildPostfachAddress {
-
-		@Test
-		void shouldSetType() {
-			var result = buildPostfachAddress();
-
-			assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE);
-		}
-
-		@Test
-		void shouldSetVersion() {
-			var result = buildPostfachAddress();
-
-			assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetIdentifier() {
-			var result = buildPostfachAddress();
-
-			assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP)
-					.containsEntry(BescheidService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID);
-		}
-
-		@Test
-		void shouldSetServicekontoType() {
-			var result = buildPostfachAddress();
-
-			assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, ServiceKontoTestFactory.TYPE);
-		}
-
-		private Map<String, Object> buildPostfachAddress() {
-			return service.buildPostfachAddress(PostfachAddressTestFactory.create(), ServiceKontoTestFactory.TYPE);
-		}
-	}
-
-	@Nested
-	class TestBuildSendNachrichtCommandBody {
-
-		private static final Map<String, Object> SERVICE_KONTO_MAP = Map.of("key", "value");
-
-		@Mock
-		private AttachedItem bescheidItem;
-
-		private Map<String, Object> buildSendNachrichtCommandBody() {
-			return service.buildSendNachrichtCommandBody(bescheidItem, SERVICE_KONTO_MAP);
-		}
-
-		@Nested
-		class TestWithValuesFromBescheidItem {
-
-			@BeforeEach
-			void init() {
-				doReturn(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any());
-				doReturn(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any());
-				doReturn(List.of(BescheidTestFactory.ATTACHMENT)).when(service).buildAttachments(any());
-			}
-
-			@Test
-			void shouldSetReplyOption() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(BescheidService.FIELD_REPLY_OPTION, BescheidService.REPLY_OPTION);
-			}
-
-			@Test
-			void shouldCallGetNachrichtSubject() {
-				buildSendNachrichtCommandBody();
-
-				verify(service).getNachrichtSubject(bescheidItem);
-			}
-
-			@Test
-			void shouldSetSubject() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
-			}
-
-			@Test
-			void shouldCallGetNachrichtText() {
-				buildSendNachrichtCommandBody();
-
-				verify(service).getNachrichtText(bescheidItem);
-			}
-
-			@Test
-			void shouldSetMailBody() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT);
-			}
-
-			@Test
-			void shouldCallBuildAttachments() {
-				buildSendNachrichtCommandBody();
-
-				verify(service).buildAttachments(bescheidItem);
-			}
-
-			@Test
-			void shouldSetAttachments() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(BescheidTestFactory.ATTACHMENT);
-			}
-
-			@Test
-			void shouldSetPostfachAddress() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, SERVICE_KONTO_MAP);
-			}
-		}
-
-		@Nested
-		class TestWithDefaultValues {
-
-			@BeforeEach
-			void init() {
-				doReturn(Optional.empty()).when(service).getNachrichtSubject(any());
-				doReturn(Optional.empty()).when(service).getNachrichtText(any());
-				doReturn(Collections.emptyList()).when(service).buildAttachments(any());
-			}
-
-			@Test
-			void shouldSetSubject() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidService.SUBJECT);
-			}
-
-			@Test
-			void shouldSetMailBody() {
-				var result = buildSendNachrichtCommandBody();
-
-				assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, StringUtils.EMPTY);
-			}
-		}
-	}
-
-	@Nested
-	class TestBuildAttachments {
-
-		private static final String BESCHEID_FILE_ID = "bescheid-file-id";
-		private static final String ATTACHMENT_FILE_ID = "attachment-file-id";
-
-		@Mock
-		private AttachedItem bescheidItem;
-
-		@BeforeEach
-		void init() {
-			doReturn(FileId.from(BESCHEID_FILE_ID)).when(service).getBescheidFileId(any());
-			doReturn(List.of(FileId.from(ATTACHMENT_FILE_ID))).when(service).getAttachments(any());
-		}
-
-		@Test
-		void shouldCallGetBescheidFileId() {
-			buildAttachments();
-
-			verify(service).getBescheidFileId(bescheidItem);
-		}
-
-		@Test
-		void shouldCallGetAttachments() {
-			buildAttachments();
-
-			verify(service).getAttachments(bescheidItem);
-		}
-
-		@Test
-		void shouldReturnAllAttachments() {
-			var result = buildAttachments();
-
-			assertThat(result).containsExactly(BESCHEID_FILE_ID, ATTACHMENT_FILE_ID);
-		}
-
-		private List<String> buildAttachments() {
-			return service.buildAttachments(bescheidItem);
-		}
-	}
-
-	@Nested
-	class TestSetAntragResult {
-
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
-
-		@Test
-		void shouldCallGetBewilligt() {
-			service.setAntragBewilligung(bescheidItem);
-
-			verify(service).getBewilligt(bescheidItem);
-		}
-
-		@Test
-		void shouldCallClientAttributeService() {
-			doReturn(true).when(service).getBewilligt(any());
-
-			service.setAntragBewilligung(bescheidItem);
-
-			verify(clientAttributeService).setAntragResult(CommandTestFactory.VORGANG_ID, true);
-		}
-
-		@Test
-		void shouldCatchException() {
-			doThrow(new TechnicalException("error")).when(clientAttributeService).setAntragResult(anyString(), anyBoolean());
-
-			assertDoesNotThrow(() -> service.setAntragBewilligung(bescheidItem));
-		}
-	}
-
-	@Nested
-	class TestGetBewilligt {
-
-		@Test
-		void shouldReturnBewilligt() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BEWILLIGT, true).build();
-
-			var result = service.getBewilligt(bescheidItem);
-
-			assertThat(result).isTrue();
-		}
-
-		@Test
-		void shouldReturnDefault() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build();
-
-			var result = service.getBewilligt(bescheidItem);
-
-			assertThat(result).isFalse();
-		}
-	}
-
-	@Nested
-	class TestGetConfig {
-
-		@Test
-		void shouldCallGetVersion() {
-			service.getConfig();
-
-			verify(buildProperties).getVersion();
-		}
-
-		@Test
-		void shouldSetBescheidManagerVersion() {
-			when(buildProperties.getVersion()).thenReturn(BescheidManagerConfigTestFactory.VERSION);
-
-			var result = service.getConfig();
-
-			assertThat(result.getVersion()).isEqualTo(BescheidManagerConfigTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldCallGetJavaVersion() {
-			service.getConfig();
-
-			verify(service).getJavaVersion();
-		}
-
-		@Test
-		void shouldSetJavaVersion() {
-			when(service.getJavaVersion()).thenReturn(BescheidManagerConfigTestFactory.JAVA_VERSION);
-
-			var result = service.getConfig();
-
-			assertThat(result.getJavaVersion()).isEqualTo(BescheidManagerConfigTestFactory.JAVA_VERSION);
-		}
-
-		@Test
-		void shouldCallBuildFeatures() {
-			service.getConfig();
-
-			verify(service).buildFeatures();
-		}
-
-		@Test
-		void shouldSetFeatures() {
-			var features = BescheidManagerConfig.Features.builder().build();
-			when(service.buildFeatures()).thenReturn(features);
-
-			var result = service.getConfig();
-
-			assertThat(result.getFeatures()).isSameAs(features);
-		}
-
-	}
-
-	@Nested
-	class TestBuildFeatures {
-
-		@Test
-		void shouldSetCannotCreateBescheidDocument() {
-			ReflectionTestUtils.setField(service, "remoteService", Optional.empty());
-
-			var result = service.buildFeatures();
-
-			assertThat(result.isCanCreateBescheidDocument()).isFalse();
-		}
-
-		@Test
-		void shouldSetCanCreateBescheidDocument() {
-			var result = service.buildFeatures();
-
-			assertThat(result.isCanCreateBescheidDocument()).isTrue();
-		}
-
-	}
-
-	@DisplayName("Get bescheid")
-	@Nested
-	class TestGetBescheid {
-
-		private final AttachedItem attachedItem = AttachedItemTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			when(attachedItemService.getItem(any())).thenReturn(attachedItem);
-			when(mapper.mapFromAttachedItem(any())).thenReturn(BescheidTestFactory.create());
-		}
-
-		@Test
-		void shouldCallVorgangAttachedItemService() {
-			service.getBescheid(AttachedItemTestFactory.ID);
-
-			verify(attachedItemService).getItem(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallMapper() {
-			service.getBescheid(AttachedItemTestFactory.ID);
-
-			verify(mapper).mapFromAttachedItem(attachedItem);
-		}
-
-		@Test
-		void shouldReturnValue() {
-			var bescheid = service.getBescheid(AttachedItemTestFactory.ID);
-
-			assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create());
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java
deleted file mode 100644
index b04cada3828d9fae6a85c5217c97df420972f353..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.info.BuildProperties;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.cloud.endpoint.RefreshEndpoint;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.security.authentication.AuthenticationTrustResolver;
-import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
-
-@SpringBootApplication
-@ComponentScan({ "de.ozgcloud.*" })
-public class BescheidTestApplication {
-
-	@MockBean
-	private BuildProperties buildProperties;
-	@MockBean
-	private RefreshEndpoint refreshEndpoint;
-
-	@Bean
-	AuthenticationTrustResolver trustResolver() {
-		return new AuthenticationTrustResolverImpl();
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
index 7b90a2215cbddb56900ea293d7bbfd5cb9f44363..ecfb19190b19c471a553c02f09b6d7abbd6ae7b8 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
@@ -7,13 +7,16 @@ import java.util.UUID;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.ozgcloud.bescheid.Bescheid.SendBy;
-import de.ozgcloud.bescheid.Bescheid.Status;
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.document.DocumentTestFactory;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.Bescheid.SendBy;
+import de.ozgcloud.document.bescheid.Bescheid.Status;
+import de.ozgcloud.document.bescheid.BescheidId;
+import de.ozgcloud.document.bescheid.SentInfo;
+import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory;
 
 public class BescheidTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
index 8361e82f8c1459da781d70b4603f5e673ec77c81..9f37996adcc11a39d9710cd5b14c6ccdffc75d16 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
@@ -26,7 +26,8 @@ package de.ozgcloud.bescheid;
 import java.time.ZonedDateTime;
 import java.util.Map;
 
-import de.ozgcloud.bescheid.SentInfo.SentInfoBuilder;
+import de.ozgcloud.document.bescheid.SentInfo;
+import de.ozgcloud.document.bescheid.SentInfo.SentInfoBuilder;
 
 public class SentInfoTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java
deleted file mode 100644
index 13e64879f85860b95b1e2a71154e56dced290343..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java
+++ /dev/null
@@ -1,78 +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.bescheid.administration;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Optional;
-
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.springframework.cloud.endpoint.RefreshEndpoint;
-
-class AdministrationServiceTest {
-
-	@InjectMocks
-	private AdministrationService service;
-
-	@Mock
-	private AdministrationProperties properties;
-	@Mock
-	private RefreshEndpoint refreshEndpoint;
-
-	@Nested
-	class GetNachrichtSignature {
-
-		@Test
-		void shouldCallGetSignature() {
-			service.getNachrichtSignature();
-
-			verify(properties).getSignatur();
-		}
-
-		@Test
-		void shouldReturnSignature() {
-			var signature = "signature";
-			when(properties.getSignatur()).thenReturn(Optional.of(signature));
-
-			var result = service.getNachrichtSignature();
-
-			assertThat(result).contains(signature);
-		}
-	}
-
-	@Nested
-	class TestRefreshConfig {
-
-		@Test
-		void shouldCallRefresh() {
-			service.refreshConfig();
-
-			verify(refreshEndpoint).refresh();
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java
deleted file mode 100644
index cfa18131b58c3ccc123ba07d4848625fcbddfdfb..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java
+++ /dev/null
@@ -1,161 +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.bescheid.attributes;
-
-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.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
-import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
-
-class ClientAttributeRemoteServiceTest {
-
-	private static final String VORGANG_ID = "vorgangId";
-	private static final String ATTRIBUTE_NAME = "attributeName";
-
-	@Spy
-	@InjectMocks
-	private ClientAttributeRemoteService service;
-
-	@Mock
-	private ClientAttributeServiceBlockingStub serviceBlockingStub;
-	@Mock
-	private BescheidCallContextAttachingInterceptor bescheidCallContextInterceptor;
-
-	@Nested
-	class TestSetBooleanReadOnlyClientAttribute {
-
-		@Captor
-		private ArgumentCaptor<BescheidCallContextAttachingInterceptor> interceptorCaptor;
-
-		@BeforeEach
-		void setUp() {
-			when(serviceBlockingStub.withInterceptors(any())).thenReturn(serviceBlockingStub);
-		}
-
-		@Test
-		void shouldSetInterceptors() {
-			service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
-
-			verify(serviceBlockingStub).withInterceptors(interceptorCaptor.capture());
-			assertThat(interceptorCaptor.getValue()).isEqualTo(bescheidCallContextInterceptor);
-		}
-
-		@Test
-		void shouldCallBuildRequest() {
-			service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
-
-			verify(service).buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true);
-		}
-
-		@Test
-		void shouldCallSetMethod() {
-			var request = GrpcSetClientAttributeRequest.newBuilder().build();
-			doReturn(request).when(service).buildRequest(any(), any(), anyBoolean());
-
-			service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
-
-			verify(serviceBlockingStub).set(request);
-
-		}
-	}
-
-	@Nested
-	class TestBuildRequest {
-
-		@Mock
-		private GrpcClientAttribute clientAttribute;
-
-		@Test
-		void shouldSetVorgangId() {
-			var result = buildRequest();
-
-			assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallBuildClientAttribute() {
-			buildRequest();
-
-			verify(service).buildClientAttribute(ATTRIBUTE_NAME, true);
-		}
-
-		@Test
-		void shouldSetClientAttribute() {
-			doReturn(clientAttribute).when(service).buildClientAttribute(any(), anyBoolean());
-
-			var result = buildRequest();
-
-			assertThat(result.getAttribute()).isEqualTo(clientAttribute);
-		}
-
-		private GrpcSetClientAttributeRequest buildRequest() {
-			return service.buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true);
-		}
-	}
-
-	@Nested
-	class TestBuildClientAttribute {
-
-		@Test
-		void shouldSetClientName() {
-			var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
-
-			assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		}
-
-		@Test
-		void shouldSetAccess() {
-			var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
-
-			assertThat(result.getAccess()).isEqualTo(GrpcAccessPermission.READ_ONLY);
-		}
-
-		@Test
-		void shouldSetAttributeName() {
-			var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
-
-			assertThat(result.getAttributeName()).isEqualTo(ATTRIBUTE_NAME);
-		}
-
-		@Test
-		void shouldSetValue() {
-			var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
-
-			assertThat(result.getValue().getBoolValue()).isTrue();
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java
deleted file mode 100644
index 03d31e54d9df4e505ac172fff010acf8f94f996a..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java
+++ /dev/null
@@ -1,48 +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.bescheid.attributes;
-
-import static org.mockito.Mockito.*;
-
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-
-class ClientAttributeServiceTest {
-
-	@InjectMocks
-	private ClientAttributeService service;
-
-	@Mock
-	private ClientAttributeRemoteService remoteService;
-
-	@Test
-	void shouldCallRemoteService() {
-		var vorgangId = "vorgangId";
-
-		service.setAntragResult(vorgangId, true);
-
-		verify(remoteService).setBooleanReadOnlyClientAttribute(vorgangId, ClientAttributeService.ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, true);
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java
deleted file mode 100644
index ec9d3dee4685bb202d88fe617c8235ad2270b717..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java
+++ /dev/null
@@ -1,104 +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.bescheid.common.callcontext;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Optional;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.apilib.user.OzgCloudUserId;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-
-class BescheidManagerCallContextProviderTest {
-
-	@Spy
-	@InjectMocks
-	private BescheidManagerCallContextProvider provider;
-
-	@Mock
-	private CurrentUserService currentUserService;
-	@Mock
-	private CallContextUser contextUser;
-	@Mock
-	private OzgCloudUserId userId;
-
-	@Nested
-	class TestProvideContext {
-
-		@BeforeEach
-		void init() {
-			doReturn(Optional.of(userId)).when(provider).getUserId();
-		}
-
-		@Test
-		void shouldCallGetUserId() {
-			provider.provideContext();
-
-			verify(provider).getUserId();
-		}
-
-		@Test
-		void shouldSetUserId() {
-			var result = provider.provideContext();
-
-			assertThat(result.getUserId()).isSameAs(userId);
-		}
-
-		@Test
-		void shouldSetClientName() {
-			var result = provider.provideContext();
-
-			assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		}
-	}
-
-	@Nested
-	class TestGetUserId {
-
-		private static final String USER_ID = "userId";
-
-		@BeforeEach
-		void init() {
-			when(currentUserService.getUser()).thenReturn(contextUser);
-		}
-
-		@Test
-		void shouldReturnUserId() {
-			when(contextUser.getUserId()).thenReturn(Optional.of(USER_ID));
-
-			var result = provider.getUserId();
-
-			assertThat(result).isPresent().get().hasToString(USER_ID);
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java
deleted file mode 100644
index 656b191e256f1aef75cd7def1971953b260327aa..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package de.ozgcloud.bescheid.common.callcontext;
-
-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.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.springframework.security.authentication.AuthenticationTrustResolver;
-
-import de.ozgcloud.command.CommandTestFactory;
-
-class CurrentUserServiceTest {
-
-	@InjectMocks
-	private CurrentUserService service;
-	@Mock
-	private AuthenticationTrustResolver trustResolver;
-
-	@DisplayName("Create user")
-	@Nested
-	class TestCreateUser {
-
-		// FIXME read client name from command
-		@Test
-		void shouldContainsClientName() {
-			var user = service.createUser(CommandTestFactory.create());
-
-			assertThat(user.getClientName()).isEqualTo("Alfa");
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java
deleted file mode 100644
index eeca8c0c770782be6364a6f9ae130e440a1168d7..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package de.ozgcloud.bescheid.common.freemarker;
-
-import static org.assertj.core.api.Assertions.*;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.mock.mockito.MockBean;
-
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.BescheidService;
-import de.ozgcloud.common.test.ITCase;
-
-@ITCase
-class TemplateHandlerITCase {
-
-	private static final String BESCHEID_TEMPLATE = "dummy.template.txt.ftlh";
-
-	@Autowired
-	private TemplateHandler handler;
-	@MockBean
-	private OzgCloudCommandService commandService;
-	@MockBean
-	private CommandMapper commandMapper;
-
-	@DisplayName("Get raw template")
-	@Nested
-	class TestGetRawTemplate {
-
-		@Test
-		void shouldReturnTemplateAsString() {
-			var content = handler.getRawTemplate(BESCHEID_TEMPLATE);
-
-			assertThat(content)
-					.contains("Sehr geehrte/r Antragsteller/in")
-					.contains("im folgenden wird evtl was ersetzt")
-					.contains("valueToReplace")
-					.contains("Mit freundlichen Grüßen");
-		}
-	}
-
-	@DisplayName("Fill template")
-	@Nested
-	class TestFillTemplate {
-
-		@Test
-		void shouldReturnFilledTemplate() {
-			var signatur = "ganz andere Signatur";
-			var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE,
-					Map.of(BescheidService.KEY_TEMPLATE_SIGNATURE, signatur));
-
-			assertThat(content)
-					.contains("Sehr geehrte/r Antragsteller/in")
-					.contains("im Folgenden erhalten Sie Ihren Bescheid.")
-					.contains(signatur);
-		}
-
-		@Test
-		void shouldReturnWithDefaultValue() {
-			var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, Collections.emptyMap());
-
-			assertThat(content)
-					.contains("Sehr geehrte/r Antragsteller/in")
-					.contains("im Folgenden erhalten Sie Ihren Bescheid.")
-					.contains("Mit freundlichen Grüßen")
-					.contains("Ihre Verwaltung");
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java
deleted file mode 100644
index 764fc28f4882f0f160b07deef03f080c4c8b975d..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import static org.assertj.core.api.Assertions.*;
-
-import java.io.File;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.test.context.ActiveProfiles;
-
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.BescheidRequestTestFactory;
-import de.ozgcloud.bescheid.BescheidTestApplication;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.common.binaryfile.TempFileUtils;
-import de.ozgcloud.common.test.ITCase;
-import de.ozgcloud.common.test.TestUtils;
-
-@SpringBootTest(classes = BescheidTestApplication.class)
-@ITCase
-@ActiveProfiles({ "itcase", "local" })
-class SmartDocumentsBescheidRemoteServiceITCase {
-
-	@Autowired
-	private SmartDocumentsBescheidRemoteService remoteService;
-	@MockBean
-	private OzgCloudCommandService ozgCloudCommandService;
-	@MockBean
-	private CommandMapper commandMapper;
-
-	@Disabled("This test request SmartDocuments service")
-	@Test
-	void createBescheid() {
-		var bescheid = remoteService.create(BescheidRequestTestFactory.create(), VorgangTestFactory.create());
-
-		System.out.println(bescheid.getBescheidFileName());
-		System.out.println(bescheid.getBescheidFile().getAbsolutePath());
-		assertThat(bescheid.getBescheidFileName()).isNotEmpty();
-	}
-
-	@Nested
-	class TestGetNachrichtenText {
-
-		private static final String NACHRICHTEN_TEXT = "Nachrichtentext";
-		private static final String FIELD_TEMPLATE_TEXT = "Nachrichten Field Text";
-
-		@Test
-		void shouldGetNachrichtenText() {
-			var nachrichtenText = remoteService.extractTextFromXmlFile(loadFile("SD_answer.xml"));
-
-			assertThat(nachrichtenText).contains(NACHRICHTEN_TEXT);
-		}
-
-		@Test
-		void shouldGetFieldTemplateText() {
-			var fieldTemplateText = remoteService.extractTextFromXmlFile(loadFile("SD_answer_field_template.xml"));
-
-			assertThat(fieldTemplateText).contains(FIELD_TEMPLATE_TEXT);
-		}
-
-		@Test
-		void shouldExpectMissingTextNode() {
-			File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml"));
-
-			var text = remoteService.extractTextFromXmlFile(xmlFileWithoutText);
-
-			assertThat(text).isEmpty();
-		}
-
-		private File loadFile(String fileName) {
-			return TempFileUtils.writeTmpFile(TestUtils.loadFile(fileName));
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
deleted file mode 100644
index 86bc7f747b0e95edb9f633b95ba93879124f71ca..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.io.File;
-import java.util.Optional;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.w3c.dom.Document;
-import org.w3c.dom.Text;
-
-import de.ozgcloud.bescheid.BescheidRequestTestFactory;
-import de.ozgcloud.bescheid.BescheidResponseTestFactory;
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import lombok.SneakyThrows;
-
-class SmartDocumentsBescheidRemoteServiceTest {
-
-	@Spy
-	@InjectMocks
-	private SmartDocumentsBescheidRemoteService service;
-
-	@Mock
-	private SmartDocumentsProperties properties;
-	@Mock
-	private Text xmlText;
-	@Mock
-	private File xmlFile;
-
-	@Nested
-	class TestBuildBescheid {
-
-		@Test
-		void shouldFillBescheid() {
-			var bescheid = service.buildBescheid(BescheidRequestTestFactory.create(), SmartDocumentsResponseTestFactory.create());
-
-			assertThat(bescheid).usingRecursiveComparison().ignoringFields("serviceKonto", "nachrichtSubject", "bescheidFileId", "attachments")
-					.isEqualTo(BescheidResponseTestFactory.createBuilder().nachrichtText(Optional.empty()).build());
-		}
-	}
-
-	@Nested
-	class TestCreateRequest {
-
-		@Test
-		void shouldFillUserData() {
-			var request = service.createRequest(BescheidRequestTestFactory.create(), VorgangTestFactory.create());
-
-			assertThat(request.getCustomerData().getUserData()).isNotNull()
-					.extracting(UserData::getEmail).isEqualTo(UserProfileTestFactory.EMAIL);
-		}
-	}
-
-	@Nested
-	class TestGetNachrichtText {
-
-		@Test
-		void shouldCallGetXMLFile() {
-			var response = SmartDocumentsResponseTestFactory.create();
-
-			service.getNachrichtText(response);
-
-			verify(service).getXMLFile(response);
-		}
-
-		@Test
-		void shouldCallExtractText() {
-			doReturn(Optional.of(xmlFile)).when(service).getXMLFile(any());
-
-			service.getNachrichtText(SmartDocumentsResponseTestFactory.create());
-
-			verify(service).extractTextFromXmlFile(xmlFile);
-		}
-	}
-
-	@Nested
-	class TestExtractTextFromXmlFileSuccessfully {
-
-		private static final String NACHRICHT_TEXT = "NachrichtText";
-
-		@Mock
-		private Document document;
-
-		@SneakyThrows
-		@BeforeEach
-		void init() {
-			doReturn(Optional.of(document)).when(service).parseXml(any());
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldCallParseXml() {
-			service.extractTextFromXmlFile(xmlFile);
-
-			verify(service).parseXml(xmlFile);
-		}
-
-		@Test
-		void shouldCallGetNachrichtenText() {
-			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
-
-			service.extractTextFromXmlFile(xmlFile);
-
-			verify(service).getNachrichtenText(document);
-		}
-
-		@Test
-		void shouldReturnNachrichtenText() {
-			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
-			when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT);
-
-			var text = service.extractTextFromXmlFile(xmlFile);
-
-			assertThat(text).contains(NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldNotCallGetFieldTemplateText() {
-			doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any());
-
-			service.extractTextFromXmlFile(xmlFile);
-
-			verify(service, never()).getFieldTemplateText(document);
-		}
-
-		@Test
-		void shouldCallGetFieldTemplateText() {
-			doReturn(Optional.empty()).when(service).getNachrichtenText(any());
-			doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any());
-
-			service.extractTextFromXmlFile(xmlFile);
-
-			verify(service).getFieldTemplateText(document);
-		}
-
-		@Test
-		void shouldReturnFieldTemplateText() {
-			doReturn(Optional.empty()).when(service).getNachrichtenText(any());
-			doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any());
-			when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT);
-
-			var text = service.extractTextFromXmlFile(xmlFile);
-
-			assertThat(text).contains(NACHRICHT_TEXT);
-		}
-	}
-
-	@Nested
-	class TestExtractTextFormXmlFileFails {
-
-		@Mock
-		private Document document;
-
-		@SneakyThrows
-		@Test
-		void shouldHandleMissingXmlDocument() {
-			doReturn(Optional.empty()).when(service).parseXml(any());
-
-			var text = service.extractTextFromXmlFile(xmlFile);
-
-			assertThat(text).isEmpty();
-		}
-
-		@Test
-		@SneakyThrows
-		void shouldExpectMissingTextNode() {
-			doReturn(Optional.of(document)).when(service).parseXml(any());
-			doReturn(Optional.empty()).when(service).getFieldTemplateText(any());
-
-			var text = service.extractTextFromXmlFile(xmlFile);
-
-			assertThat(text).isEmpty();
-		}
-	}
-
-	@Nested
-	class TestGetNachrichtenText {
-
-		@Mock
-		private Text text;
-		@Mock
-		private Document document;
-
-		@BeforeEach
-		void init() {
-			doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any());
-		}
-
-		@Test
-		void shouldCallEvaluatePath() {
-			getNachrichtenText();
-
-			verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.NACHRICHTEN_TEXT_EXPRESSION);
-		}
-
-		@Test
-		void shouldReturnText() {
-			var result = getNachrichtenText();
-
-			assertThat(result).contains(text);
-		}
-
-		private Optional<Text> getNachrichtenText() {
-			return service.getNachrichtenText(document);
-		}
-	}
-
-	@Nested
-	class TestGetFieldTemplateText {
-
-		@Mock
-		private Text text;
-		@Mock
-		private Document document;
-
-		@BeforeEach
-		void init() {
-			doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any());
-		}
-
-		@Test
-		void shouldCallEvaluatePath() {
-			getFieldTemplateText();
-
-			verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.FIELD_TEMPLATE_EXPRESSION);
-		}
-
-		@Test
-		void shouldReturnText() {
-			var result = getFieldTemplateText();
-
-			assertThat(result).contains(text);
-		}
-
-		private Optional<Text> getFieldTemplateText() {
-			return service.getFieldTemplateText(document);
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java
deleted file mode 100644
index 32a0b3ac98768e565da86a25437605fa7c37cd60..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.ozgcloud.bescheid.smartdocuments;
-
-import java.util.List;
-
-import de.ozgcloud.bescheid.BescheidResponseTestFactory;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument;
-import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile;
-
-public class SmartDocumentsResponseTestFactory {
-
-	static final String OUTPUT_FORMAT = "PDF";
-
-	static SmartDocumentsResponse create() {
-		return createBuilder().build();
-	}
-
-	static SmartDocumentsResponse.SmartDocumentsResponseBuilder createBuilder() {
-		return SmartDocumentsResponse.builder()
-				.file(List.of(SmartDocumentFile.builder()
-						.filename(BescheidResponseTestFactory.BESCHEID_FILE_NAME)
-						.outputFormat(OUTPUT_FORMAT)
-						.document(SmartDocumentDocument.builder()
-								.data(BescheidResponseTestFactory.BESCHEID_FILE)
-								.build())
-						.build()));
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java
deleted file mode 100644
index 6f64a48933ed0351295ef3415111f149ca3f6c7d..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-
-class BescheidVorgangMapperTest {
-
-	@InjectMocks
-	private BescheidVorgangMapperImpl mapper;
-
-	@Nested
-	class TestMapVorgang {
-
-		@Test
-		void shouldMapEingang() {
-			var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
-
-			assertThat(result.getEingang()).isNotNull();
-		}
-
-		@Test
-		void shouldMapVorgangId() {
-			var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
-
-			assertThat(result.getId()).isEqualTo(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldMapVersion() {
-			var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
-
-			assertThat(result.getVersion()).isEqualTo(VorgangTestFactory.VERSION);
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java
deleted file mode 100644
index d647a90200e8c47fd8a08465fa5fa2048ad35de5..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField;
-import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm;
-import de.ozgcloud.bescheid.vorgang.Vorgang.Eingang;
-import lombok.SneakyThrows;
-
-class FormDataEntrySerializerTest {
-
-	private ObjectMapper mapper = new ObjectMapper();
-
-	@Test
-	void schouldSerializeFormDataWithSingleField() throws JsonProcessingException {
-		var eingang = Eingang.builder()
-				.formData(FormField.builder().name("name").value("Thea").build())
-				.build();
-
-		var json = mapper.writeValueAsString(eingang);
-
-		assertThat(json).contains("\"formData\":{\"name\":\"Thea\"}");
-	}
-
-	@Test
-	@SneakyThrows
-	void sohludSerializeFormDataWithSubForm() {
-		var eingang = Eingang.builder()
-				.formData(SubForm.builder().name("address")
-						.entry(FormField.builder().name("name").value("Thea").build())
-						.build())
-				.build();
-
-		var json = mapper.writeValueAsString(eingang);
-
-		assertThat(json).contains("\"formData\":{\"address\":{\"name\":\"Thea\"}}");
-	}
-
-	@Test
-	@SneakyThrows
-	void shouldSerializeFormDataWithSubSubForm() {
-		var eingang = Eingang.builder()
-				.formData(SubForm.builder().name("address")
-						.entry(SubForm.builder().name("person")
-								.entry(FormField.builder().name("name").value("Thea").build())
-								.build())
-						.build())
-				.build();
-
-		var json = mapper.writeValueAsString(eingang);
-
-		assertThat(json).contains("\"formData\":{\"address\":{\"person\":{\"name\":\"Thea\"}}}");
-	}
-
-	@Test
-	@SneakyThrows
-	void shouldSerializeFormWithTwoFields() {
-		var eingang = Eingang.builder()
-				.formData(FormField.builder().name("firstname").value("Thea").build())
-				.formData(FormField.builder().name("lastname").value("Test").build())
-				.build();
-
-		var json = mapper.writeValueAsString(eingang);
-
-		assertThat(json).contains("\"formData\":{\"firstname\":\"Thea\",\"lastname\":\"Test\"}");
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java
deleted file mode 100644
index 8c9dfc0daf02960be0d45ecb6ddd9a515552353c..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import de.ozgcloud.vorgang.vorgang.GrpcEingang;
-
-public class GrpcEingangTestFactory {
-
-	static GrpcEingang create() {
-		return createBuilder().build();
-	}
-
-	static GrpcEingang.Builder createBuilder() {
-		return GrpcEingang.newBuilder();
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java
deleted file mode 100644
index 63c8a880f63c6d9ceffc9f2a8a5028cce949ed34..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import static de.ozgcloud.bescheid.vorgang.VorgangTestFactory.*;
-
-import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangResponse;
-import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang;
-
-class GrpcVorgangWithEingangTestFactory {
-
-	static GrpcVorgangWithEingang create() {
-		return createBuilder().build();
-	}
-
-	static GrpcVorgangWithEingang.Builder createBuilder() {
-		return GrpcVorgangWithEingang.newBuilder()
-				.setId(ID.toString())
-				.setVersion(VERSION)
-				.setEingang(GrpcEingangTestFactory.create());
-	}
-
-	static GrpcFindVorgangWithEingangResponse createResponse() {
-		return GrpcFindVorgangWithEingangResponse.newBuilder()
-				.setVorgangWithEingang(create())
-				.build();
-	}
-
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java
index 5d01a8b7573c16643a61e602ff06bc94aa0cd155..8543f3cccb05ecdd58bbaf72323f09768ea8487f 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java
@@ -26,7 +26,8 @@ package de.ozgcloud.bescheid.vorgang;
 import java.util.Map;
 import java.util.UUID;
 
-import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder;
+import de.ozgcloud.document.bescheid.vorgang.Vorgang;
+import de.ozgcloud.document.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder;
 
 public class PostfachAddressTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java
index 2a30ada99a63098c255b97822a151a02558fd950..6cbdc9b13cf227ade4565d8445c6644c817335a4 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.bescheid.vorgang;
 
-import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto;
+import de.ozgcloud.document.bescheid.vorgang.Vorgang.ServiceKonto;
 
 public class ServiceKontoTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java
deleted file mode 100644
index 823dc761a8c5efcab9930fafde166d518d79b9ef..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-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.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest;
-import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
-
-class VorgangRemoteServiceTest {
-
-	@Spy
-	@InjectMocks
-	private VorgangRemoteService service;
-
-	@Mock
-	private VorgangServiceBlockingStub serviceStub;
-	@Mock
-	private BescheidVorgangMapper mapper;
-
-	@Nested
-	class TestGetById {
-		@Captor
-		private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor;
-
-		@BeforeEach
-		void prepareGrpc() {
-			when(serviceStub.withInterceptors(any())).thenReturn(serviceStub);
-			when(serviceStub.findVorgangWithEingang(any())).thenReturn(GrpcVorgangWithEingangTestFactory.createResponse());
-			
-		}
-
-		@BeforeEach
-		void init() {
-			when(mapper.mapVorgang(any())).thenReturn(VorgangTestFactory.create());
-		}
-
-		@Test
-		void shouldCallStubWithId() {
-			service.getById(VorgangTestFactory.ID);
-
-			verify(serviceStub).findVorgangWithEingang(requestCaptor.capture());
-			assertThat(requestCaptor.getValue()).extracting(GrpcFindVorgangWithEingangRequest::getId).isEqualTo(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldCallMapper() {
-			service.getById(VorgangTestFactory.ID);
-
-			verify(mapper).mapVorgang(any());
-		}
-
-		@Test
-		void shouldReturnVorgang() {
-			var vorgang = service.getById(VorgangTestFactory.ID);
-
-			assertThat(vorgang).usingRecursiveComparison().isEqualTo(VorgangTestFactory.create());
-		}
-
-	}
-
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java
deleted file mode 100644
index cc93692c7831628dd87ada5bf0cf21f2250b5bb4..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package de.ozgcloud.bescheid.vorgang;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-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;
-
-class VorgangServiceTest {
-
-	@Spy
-	@InjectMocks
-	private VorgangService service;
-
-	@Mock
-	private VorgangRemoteService remoteService;
-
-	@Nested
-	class TestGetById {
-
-		private final Vorgang vorgang = VorgangTestFactory.create();
-
-		@BeforeEach
-		void init() {
-			when(remoteService.getById(any())).thenReturn(vorgang);
-		}
-
-		@Test
-		void shouldCallRemoteService() {
-			service.getById(VorgangTestFactory.ID);
-
-			verify(remoteService).getById(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldReturnResult() {
-			var result = service.getById(VorgangTestFactory.ID);
-
-			assertThat(result).isEqualTo(vorgang);
-		}
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
index 000bc28d0aea983e85485a76638fbb0e33727ba2..bcef17e937da2ba1ef8ce848448a2658ff549d8a 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
@@ -2,6 +2,9 @@ package de.ozgcloud.bescheid.vorgang;
 
 import java.util.UUID;
 
+import de.ozgcloud.document.bescheid.vorgang.Vorgang;
+import de.ozgcloud.document.bescheid.vorgang.VorgangId;
+
 public class VorgangTestFactory {
 
 	public static final String ID_STR = UUID.randomUUID().toString();
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java
deleted file mode 100644
index 25998524cc118900d7f705f2ff8c7268e2007b7b..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java
+++ /dev/null
@@ -1,108 +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.common.attached_item;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-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.mapstruct.factory.Mappers;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.bescheid.SentInfoMapper;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.document.DocumentService;
-import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-
-class AttachedItemMapperTest {
-
-	@Spy
-	@InjectMocks
-	private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class);
-
-	@Mock
-	private GrpcObjectMapper grpcObjectMapper;
-	@Mock
-	private SentInfoMapper sentInfoMapper;
-
-	@Nested
-	class TestMapFromVorgangAttachedItem {
-
-		@BeforeEach
-		void init() {
-			when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem());
-		}
-
-		@Test
-		void shouldMapFromVorgangAttachedItem() {
-			var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME).build();
-
-			var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
-
-			assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument());
-		}
-	}
-
-	@Nested
-	class TestAsMap {
-
-		@Test
-		void shouldSetVorgangId() {
-			var result = mapper.toMap(AttachedItemTestFactory.createBescheid());
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetClient() {
-			var result = mapper.toMap(AttachedItemTestFactory.createBescheid());
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_CLIENT, AttachedItemTestFactory.CLIENT);
-		}
-
-		@Test
-		void shouldSetItemName() {
-			var result = mapper.toMap(AttachedItemTestFactory.createBescheid());
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME);
-		}
-
-		@Test
-		void shouldSetItem() {
-			var item = Map.<String, Object>of("key", "value");
-			var attachedItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(item).build();
-
-			var result = mapper.toMap(attachedItem);
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, item);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java
deleted file mode 100644
index aaa9b15a805e2c989b97f0d77577c2499ec18a56..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java
+++ /dev/null
@@ -1,928 +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.common.attached_item;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.apilib.common.command.OzgCloudCommand;
-import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
-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.Bescheid;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.BescheidMapper;
-import de.ozgcloud.bescheid.BescheidTestFactory;
-import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.document.Document;
-import de.ozgcloud.document.DocumentTestFactory;
-import io.grpc.StatusRuntimeException;
-
-class AttachedItemServiceTest {
-
-	@Spy
-	@InjectMocks
-	private AttachedItemService service;
-	@Mock
-	private AttachedItemMapper mapper;
-	@Mock
-	private VorgangAttachedItemRemoteService remoteService;
-
-	@Mock
-	private OzgCloudCommandService commandService;
-	@Mock
-	private CommandMapper commandMapper;
-	@Mock
-	private BescheidMapper bescheidMapper;
-
-	@Nested
-	class TestFindBescheidItem {
-
-		@Test
-		void shouldCallGetBescheidDraft() {
-			service.findBescheidItem(VorgangTestFactory.ID);
-
-			verify(remoteService).findBescheidDraft(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldReturnBescheidItem() {
-			var expected = AttachedItemTestFactory.createBescheid();
-			when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(expected));
-
-			var actual = service.findBescheidItem(VorgangTestFactory.ID);
-
-			assertThat(actual).contains(expected);
-		}
-	}
-
-	@Nested
-	class TestCreateBescheidDraft {
-
-		private static final String CREATED_ATTACHED_ITEM_ID = "attached-item-id";
-		private static final Bescheid BESCHEID = BescheidTestFactory.create();
-
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
-
-		@Mock
-		private AttachedItem updatedBescheidItem;
-
-		@Test
-		void shouldCallGetBescheidDraft() {
-			doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any());
-
-			service.createBescheidDraft(BESCHEID);
-
-			verify(remoteService).findBescheidDraft(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallMergeBescheidDrafts() {
-			doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any());
-			when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem));
-
-			service.createBescheidDraft(BESCHEID);
-
-			verify(service).mergeBescheidDrafts(bescheidItem, BESCHEID);
-		}
-
-		@Test
-		void shouldCallOverrideAttachedItem() {
-			doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any());
-			when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem));
-			doReturn(updatedBescheidItem).when(service).mergeBescheidDrafts(any(), any());
-
-			service.createBescheidDraft(BESCHEID);
-
-			verify(service).overrideAttachedItem(updatedBescheidItem);
-		}
-
-		@Test
-		void shouldCallCreateBescheidDraft() {
-			doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any());
-
-			service.createBescheidDraft(BESCHEID);
-
-			verify(service).createBescheidDraft(BESCHEID);
-		}
-
-	}
-
-	@Nested
-	class TestCreateAttachedItem {
-
-		private static final Bescheid BESCHEID = BescheidTestFactory.create();
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-		@Mock
-		private OzgCloudCommand createAttachedItemCommand;
-		@Mock
-		private OzgCloudCommand finishedOzgCloudCommand;
-
-		@BeforeEach
-		void init() {
-			when(commandService.createAndWaitUntilDone(any())).thenReturn(finishedOzgCloudCommand);
-			when(finishedOzgCloudCommand.getCreatedResource()).thenReturn(AttachedItemTestFactory.ID);
-			when(bescheidMapper.mapFromBescheid(any())).thenReturn(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldCallMapFromBescheid() {
-			createAttachedItem();
-
-			verify(bescheidMapper).mapFromBescheid(BESCHEID);
-		}
-
-		@Test
-		void shouldCallBuildCreateAttachedItemCommand() {
-			doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any());
-
-			createAttachedItem();
-
-			verify(service).buildCreateAttachedItemCommand(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any());
-
-			createAttachedItem();
-
-			verify(commandService).createAndWaitUntilDone(createAttachedItemCommand);
-		}
-
-		@Test
-		void shouldReturnCreatedResource() {
-			var result = createAttachedItem();
-
-			assertThat(result).isEqualTo(AttachedItemTestFactory.ID);
-		}
-
-		private String createAttachedItem() {
-			return service.createAttachedItem(BESCHEID);
-		}
-	}
-
-	@Nested
-	class TestBuildCreateAttachedItemCommand {
-
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-		@Test
-		void shouldCallVorgangIdMapper() {
-			service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID);
-			when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId);
-
-			var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId);
-		}
-
-		@Test
-		void shouldCallRelationIdMapper() {
-			service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var expectedRelationId = "relationId";
-			when(commandMapper.mapRelationId(any())).thenReturn(GenericId.from(expectedRelationId));
-
-			var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			assertThat(result.getRelationId()).hasToString(expectedRelationId);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			assertThat(result.getOrder()).isEqualTo(AttachedItemService.CREATE_ATTACHED_ITEM_ORDER);
-		}
-
-		@Test
-		void shouldCallAttachedItemMapper() {
-			service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			verify(mapper).toMap(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var itemMap = Map.<String, Object>of("key", "value");
-			when(mapper.toMap(any())).thenReturn(itemMap);
-
-			var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM);
-
-			assertThat(result.getBodyObject()).containsAllEntriesOf(itemMap);
-		}
-	}
-
-	@Nested
-	class TestUpdateBescheidDraft {
-
-		@Mock
-		private OzgCloudCommand updateAttachedItemCommand;
-
-		private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build();
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
-		private final Optional<Document> document = Optional.of(DocumentTestFactory.create());
-
-		@BeforeEach
-		void init() {
-			when(remoteService.getItem(any())).thenReturn(bescheidItem);
-		}
-
-		@Test
-		void shouldCallGetBescheid() {
-			doUpdateBescheidDraft();
-
-			verify(remoteService, times(2)).getItem(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallValidateBescheidStatus() {
-			doUpdateBescheidDraft();
-
-			verify(service).validateBescheidStatus(bescheidItem);
-		}
-
-		@Test
-		void shouldCallBuildUpdateBescheidItemMap() {
-			doUpdateBescheidDraft();
-
-			verify(service).buildBescheidItemAsMap(command, document);
-		}
-
-		@Test
-		void shouldCallBuildAttachedItemAsMap() {
-			var itemMap = Map.<String, Object>of("key", "value");
-			doReturn(itemMap).when(service).buildBescheidItemAsMap(any(), any());
-
-			doUpdateBescheidDraft();
-
-			verify(service).buildAttachedItemAsMap(command, itemMap);
-		}
-
-		@Test
-		void shouldCallBuildUpdateAttachedItemCommand() {
-			var expectedBodyObject = Map.<String, Object>of("key", "value");
-			doReturn(expectedBodyObject).when(service).buildAttachedItemAsMap(any(), any());
-
-			doUpdateBescheidDraft();
-
-			verify(service).buildPatchAttachedItemCommand(bescheidItem, expectedBodyObject);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(updateAttachedItemCommand).when(service).buildPatchAttachedItemCommand(any(), any());
-
-			doUpdateBescheidDraft();
-
-			verify(commandService).createAndWaitUntilDone(updateAttachedItemCommand);
-		}
-
-		@Test
-		void shouldThrowExceptionWhenNotFound() {
-			when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class);
-
-			assertThrows(StatusRuntimeException.class, this::doUpdateBescheidDraft);
-		}
-
-		private void doUpdateBescheidDraft() {
-			service.updateBescheidDraft(command, document);
-		}
-	}
-
-	@DisplayName("Build bescheid item")
-	@Nested
-	class TestBuildBescheidItemAsMap {
-
-		private final Optional<Document> document = Optional.of(DocumentTestFactory.create());
-		private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-		private final AttachedItem bescheidAttachedItem = AttachedItemTestFactory.createBescheid();
-
-		@BeforeEach
-		void mock() {
-			doReturn(bescheidAttachedItem).when(service).getItem(any());
-		}
-
-		@Test
-		void shouldBuildItemMapWithExistingBescheidFields() {
-			service.buildBescheidItemAsMap(command, document);
-
-			verify(service).buildItemMapWithExistingBescheidFields(command);
-		}
-
-		@Test
-		void shouldGetItem() {
-			service.buildBescheidItemAsMap(command, document);
-
-			verify(service).getItem(CommandTestFactory.RELATION_ID);
-		}
-
-		@Test
-		void shouldCallGetNewNachrichtText() {
-			service.buildBescheidItemAsMap(command, document);
-
-			verify(service).getNewNachrichtText(bescheidAttachedItem, document);
-		}
-
-		@Test
-		void shouldOverrideIfNewNachrichtText() {
-			doReturn(Optional.of(DocumentTestFactory.NACHRICHT_TEXT)).when(service).getNewNachrichtText(any(), any());
-
-			var bescheidItem = service.buildBescheidItemAsMap(command, document);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldKeepNachrichtTextIfNotNew() {
-			doReturn(Optional.empty()).when(service).getNewNachrichtText(any(), any());
-
-			var bescheidItem = service.buildBescheidItemAsMap(command, document);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
-		}
-	}
-
-	@DisplayName("Get new nachrichtText")
-	@Nested
-	class TestGetNewNachrichtText {
-
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
-
-		@DisplayName("with filled new document")
-		@Nested
-		class TestFilledDocument {
-
-			private final Document document = DocumentTestFactory.create();
-			private final Optional<Document> documentOpt = Optional.of(document);
-
-			@Test
-			void shouldCheckIfIsDifferentDocument() {
-				service.getNewNachrichtText(bescheidItem, documentOpt);
-
-				verify(service).isDifferentDocument(document, bescheidItem);
-			}
-
-			@DisplayName("and different documentId")
-			@Nested
-			class TestAndDifferentDocumentId {
-
-				@BeforeEach
-				void mock() {
-					doReturn(true).when(service).isDifferentDocument(any(), any());
-				}
-
-				@Test
-				void shouldReturnNachrichtTextFromDocument() {
-					var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt);
-
-					assertThat(nachrichtText).hasValue(DocumentTestFactory.NACHRICHT_TEXT);
-				}
-			}
-
-			@DisplayName("and same documentId")
-			@Nested
-			class TestAndSameDocumentId {
-
-				@BeforeEach
-				void mock() {
-					doReturn(false).when(service).isDifferentDocument(any(), any());
-				}
-
-				@Test
-				void shouldReturnNachrichtTextFromDocument() {
-					var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt);
-
-					assertThat(nachrichtText).isEmpty();
-				}
-			}
-		}
-
-		@DisplayName("with empty document")
-		@Nested
-		class TestWithEmptyDocument {
-
-			@Test
-			void shouldReturnEmpty() {
-				var nachrichtText = service.getNewNachrichtText(bescheidItem, Optional.empty());
-
-				assertThat(nachrichtText).isEmpty();
-			}
-		}
-	}
-
-	@Nested
-	class TestBuildAttachedItemAsMap {
-
-		private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-		@Test
-		void shouldSetVorgangId() {
-			var map = service.buildAttachedItemAsMap(command, Map.of());
-
-			assertThat(map).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId());
-		}
-
-		@Test
-		void shouldSetClient() {
-			var map = service.buildAttachedItemAsMap(command, Map.of());
-
-			assertThat(map).containsEntry(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		}
-
-		@Test
-		void shouldSetItemName() {
-			var map = service.buildAttachedItemAsMap(command, Map.of());
-
-			assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME);
-		}
-
-		@Test
-		void shouldSetItem() {
-			var expectedMap = Map.<String, Object>of("key", "value");
-
-			var map = service.buildAttachedItemAsMap(command, expectedMap);
-
-			assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM, expectedMap);
-		}
-	}
-
-	@Nested
-	class TestOverrideAttachedItem {
-
-		private static final String CREATED_RESOURCE = "created-resource";
-
-		@Mock
-		private OzgCloudCommand updateItemCommand;
-
-		@BeforeEach
-		void init() {
-			when(commandService.createAndWaitUntilDone(any())).thenReturn(updateItemCommand);
-			when(updateItemCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE);
-		}
-
-		@Test
-		void shouldCallBuildUpdateAttachedItemCommand() {
-			var bodyObject = Map.<String, Object>of("key", "value");
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(bodyObject).build();
-
-			service.overrideAttachedItem(bescheidItem);
-
-			verify(service).buildPatchAttachedItemCommand(bescheidItem, bodyObject);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(updateItemCommand).when(service).buildPatchAttachedItemCommand(any(), any());
-
-			service.overrideAttachedItem(AttachedItemTestFactory.createBescheid());
-
-			verify(commandService).createAndWaitUntilDone(updateItemCommand);
-		}
-
-		@Test
-		void shouldReturnCreatedResource() {
-			var result = service.overrideAttachedItem(AttachedItemTestFactory.createBescheid());
-
-			assertThat(result).isEqualTo(CREATED_RESOURCE);
-		}
-	}
-
-	@DisplayName("Build map with all bescheid fields")
-	@Nested
-	class TestBuildMapWithAllBescheidFields {
-
-		private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-		@Test
-		void shouldHaveSetBescheidenAm() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR);
-		}
-
-		@Test
-		void shouldHaveSetBewilligt() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT);
-		}
-
-		@Test
-		void shouldHaveSetBescheidDocument() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID);
-		}
-
-		@Test
-		void shouldHaveSetSendBy() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
-		}
-
-		@Test
-		void shouldHaveSetNachrichtText() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldHaveSetNachrichtSubject() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldHaveSetAttachments() {
-			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
-
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS,
-					List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR));
-		}
-	}
-
-	@Nested
-	class TestAddValueFromMapIfExists {
-
-		private static final String KEY = "key";
-
-		@Test
-		void shouldAddValue() {
-			var targetMap = new HashMap<String, Object>();
-			var expectedValue = "value";
-			Map<String, Object> sourceMap = Map.of(KEY, expectedValue);
-
-			service.addValueFromMapIfExists(sourceMap, KEY, targetMap);
-
-			assertThat(targetMap).containsEntry(KEY, expectedValue);
-		}
-
-		@Test
-		void shouldNotAddValueIfKeyNotExists() {
-			var targetMap = new HashMap<String, Object>();
-			var expectedValue = "value";
-			Map<String, Object> sourceMap = Map.of(KEY, expectedValue);
-
-			service.addValueFromMapIfExists(sourceMap, "notExists", targetMap);
-
-			assertThat(targetMap).isEmpty();
-		}
-
-		@Test
-		void shouldAddNullValues() {
-			var targetMap = new HashMap<String, Object>();
-			Map<String, Object> sourceMap = Collections.singletonMap(KEY, null);
-
-			service.addValueFromMapIfExists(sourceMap, KEY, targetMap);
-
-			assertThat(targetMap).containsEntry(KEY, null);
-		}
-	}
-
-	@Nested
-	class TestBuildBescheidMap {
-
-		private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
-
-		@Test
-		void shouldSetStatus() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name());
-		}
-
-		@Test
-		void shouldSetBeschiedenAm() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR);
-		}
-
-		@Test
-		void shouldSetBewilligt() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BEWILLIGT, true);
-		}
-
-		@Test
-		void shouldSetBescheidDocument() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID);
-		}
-
-		@Test
-		void shouldSetSendBy() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
-		}
-
-		@Test
-		void shouldSetNachrichtText() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldSetNachrichtSubject() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldSetAttachments() {
-			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
-
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS,
-					List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR));
-		}
-	}
-
-	@Nested
-	class TestBuildUpdateAttachedItemCommand {
-
-		@Test
-		void shouldCallVorgangIdMapper() {
-			service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID);
-			when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId);
-
-			var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId);
-		}
-
-		@Test
-		void shouldCallRelationIdMapper() {
-			service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var expectedId = GenericId.from("relationId");
-			when(commandMapper.mapRelationId(any())).thenReturn(expectedId);
-
-			var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			assertThat(result.getRelationId()).isEqualTo(expectedId);
-		}
-
-		@Test
-		void shouldSetRelationVersion() {
-			var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of());
-
-			assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var bodyObject = Map.<String, Object>of("key", "value");
-
-			var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), bodyObject);
-
-			assertThat(result.getBodyObject()).containsAllEntriesOf(bodyObject);
-		}
-
-	}
-
-	@Nested
-	class TestDeleteBescheidDraft {
-
-		@Mock
-		private OzgCloudCommand deleteItemOzgCloudCommand;
-
-		private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build();
-
-		@Test
-		void shouldCallGetBescheid() {
-			when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid());
-
-			deleteBescheidDraft();
-
-			verify(remoteService).getItem(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(deleteItemOzgCloudCommand).when(service).buildDeleteItemCommand(any(), any());
-			when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid());
-
-			deleteBescheidDraft();
-
-			verify(commandService).createAndWaitUntilDone(deleteItemOzgCloudCommand);
-		}
-
-		@Test
-		void shouldThrowExceptionIfBescheidNotFound() {
-			when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class);
-
-			assertThrows(StatusRuntimeException.class, this::deleteBescheidDraft);
-		}
-
-		private void deleteBescheidDraft() {
-			service.deleteBescheidDraft(command);
-		}
-
-		@Nested
-		class TestBuildDeleteItemCommand {
-
-			@Test
-			void shouldCallCommandMapperWithVorgangId() {
-				service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID);
-			}
-
-			@Test
-			void shouldSetVorgangId() {
-				var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID);
-				when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId);
-
-				var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				assertThat(ozgCloudCommand.getVorgangId()).isEqualTo(expectedVorgangId);
-			}
-
-			@Test
-			void shouldCallCommandMapperWithRelationId() {
-				service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID);
-			}
-
-			@Test
-			void shouldSetRelationId() {
-				var expectedId = GenericId.from(AttachedItemTestFactory.ID);
-				when(commandMapper.mapRelationId(any())).thenReturn(expectedId);
-
-				var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				assertThat(ozgCloudCommand.getRelationId()).isEqualTo(expectedId);
-			}
-
-			@Test
-			void shouldSetRelationVersion() {
-				var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				assertThat(ozgCloudCommand.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION);
-			}
-
-			@Test
-			void shouldSetOrder() {
-				var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid());
-
-				assertThat(ozgCloudCommand.getOrder()).isEqualTo(AttachedItemService.DELETE_ATTACHED_ITEM);
-			}
-		}
-	}
-
-	@Nested
-	class TestValidateBescheid {
-
-		@Test
-		void shouldFilterDraftStatus() {
-			assertDoesNotThrow(() -> service.validateBescheidStatus(AttachedItemTestFactory.createBescheid()));
-		}
-
-		@Test
-		void shouldThrowExceptionIfBescheidIsNotDraft() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus")
-					.build();
-
-			assertThrows(TechnicalException.class, () -> service.validateBescheidStatus(bescheidItem));
-		}
-
-	}
-
-	@Nested
-	class TestGetItem {
-
-		@Test
-		void shouldCallRemoteService() {
-			service.getItem(AttachedItemTestFactory.ID);
-
-			verify(service).getItem(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldReturnValue() {
-			var expectedItem = AttachedItemTestFactory.createDocument();
-			doReturn(expectedItem).when(remoteService).getItem(any());
-
-			var result = service.getItem(AttachedItemTestFactory.ID);
-
-			assertThat(result).isEqualTo(expectedItem);
-		}
-	}
-
-	@Nested
-	class TestBuildItemMap {
-
-		@Test
-		void shouldSetStatus() {
-			var result = service.buildItemMap(Bescheid.Status.DRAFT);
-
-			assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name());
-		}
-	}
-
-	@Nested
-	class TestFindAllBescheid {
-
-		@Test
-		void shouldCallRemoteService() {
-			service.findAllBescheid(VorgangTestFactory.ID);
-
-			verify(remoteService).findAllBescheid(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldReturnResult() {
-			var expectedBescheidItem = AttachedItemTestFactory.createBescheid();
-			when(remoteService.findAllBescheid(any(VorgangId.class))).thenReturn(Collections.singletonList(expectedBescheidItem));
-
-			var result = service.findAllBescheid(VorgangTestFactory.ID);
-
-			assertThat(result).containsExactly(expectedBescheidItem);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
index 9b3ac12ebfa3c1f1385bedaab9d8383c25c750a8..1af82ad13421912cc88260d356d24a5eb3e1acbb 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
@@ -30,18 +30,20 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.BescheidTestFactory;
-import de.ozgcloud.bescheid.SentInfo;
 import de.ozgcloud.bescheid.SentInfoTestFactory;
-import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItem.AttachedItemBuilder;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.document.Document;
 import de.ozgcloud.document.DocumentService;
 import de.ozgcloud.document.DocumentTestFactory;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.SentInfo;
+import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory;
+import de.ozgcloud.document.common.attached_item.AttachedItem;
+import de.ozgcloud.document.common.attached_item.AttachedItem.AttachedItemBuilder;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 
 public class AttachedItemTestFactory {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java
deleted file mode 100644
index 6a1ebaafcff9eb040990d3d2809fd1cc7ba8194a..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java
+++ /dev/null
@@ -1,38 +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.common.attached_item;
-
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse;
-
-public class GrpcFindVorgangAttachedItemResponseTestFactory {
-
-	public static GrpcFindVorgangAttachedItemResponse create() {
-		return createBuilder().build();
-	}
-
-	public static GrpcFindVorgangAttachedItemResponse.Builder createBuilder() {
-		return GrpcFindVorgangAttachedItemResponse.newBuilder()
-				.addVorgangAttachedItems(GrpcVorgangAttachedItemTestFactory.create());
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java
deleted file mode 100644
index daa37d39f9417cb153ae0d83361be572634698e2..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java
+++ /dev/null
@@ -1,51 +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.
- */
-package de.ozgcloud.common.attached_item;
-
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.vorgang.common.GrpcObject;
-import de.ozgcloud.vorgang.common.GrpcProperty;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
-
-public class GrpcVorgangAttachedItemTestFactory {
-
-	public static final String PROPERTY_NAME = "propertyName";
-	public static final String PROPERTY_NAME_VALUE = "propertyNameValue";
-	public static final GrpcObject OBJECT = GrpcObject.newBuilder()
-			.addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE)).build();
-
-	static GrpcVorgangAttachedItem create() {
-		return createBuilder().build();
-	}
-
-	static GrpcVorgangAttachedItem.Builder createBuilder() {
-		return GrpcVorgangAttachedItem.newBuilder()
-				.setId(AttachedItemTestFactory.ID)
-				.setVersion(AttachedItemTestFactory.VERSION)
-				.setVorgangId(CommandTestFactory.VORGANG_ID)
-				.setClient(AttachedItemTestFactory.CLIENT)
-				.setItemName(AttachedItemService.BESCHEID_ITEM_NAME)
-				.setItem(OBJECT);
-	}
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java
deleted file mode 100644
index 104ace168b6b7486c39adf39df9657a825b8d577..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java
+++ /dev/null
@@ -1,490 +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.common.attached_item;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.vorgang.common.GrpcObject;
-import de.ozgcloud.vorgang.common.GrpcProperty;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse;
-import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub;
-import io.grpc.ClientInterceptor;
-
-class VorgangAttachedItemRemoteServiceTest {
-
-	@Spy
-	@InjectMocks
-	private VorgangAttachedItemRemoteService service;
-
-	@Mock
-	private VorgangAttachedItemServiceBlockingStub serviceStub;
-	@Mock
-	private ClientInterceptor bescheidCallContextInterceptor;
-	@Mock
-	private AttachedItemMapper attachedItemMapper;
-
-	@Nested
-	class TestFindBescheidDraft {
-
-		@Mock
-		private GrpcFindVorgangAttachedItemRequest request;
-
-		@Nested
-		class TestFindByVorgangId {
-
-			private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-			@BeforeEach
-			void init() {
-				doReturn(request).when(service).buildFindRequest(any());
-				doReturn(Optional.of(BESCHEID_ITEM)).when(service).findBescheidDraft(any(GrpcFindVorgangAttachedItemRequest.class));
-			}
-
-			@Test
-			void shouldCallCreateFindRequestBuilder() {
-				service.findBescheidDraft(VorgangTestFactory.ID);
-
-				verify(service).buildFindRequest(VorgangTestFactory.ID_STR);
-			}
-
-			@Test
-			void shouldCallGetBescheidDraft() {
-				service.findBescheidDraft(VorgangTestFactory.ID);
-
-				verify(service).findBescheidDraft(request);
-			}
-
-			@Test
-			void shouldReturnResult() {
-				var result = service.findBescheidDraft(VorgangTestFactory.ID);
-
-				assertThat(result).contains(BESCHEID_ITEM);
-			}
-		}
-
-		@Nested
-		@DisplayName("by grpc request")
-		class TestByGrpcRequest {
-
-			private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-			@Mock
-			private GrpcFindVorgangAttachedItemResponse response;
-
-			@BeforeEach
-			void init() {
-			}
-
-			@Test
-			void shouldCallFindAllBescheid() {
-				doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-
-				service.findBescheidDraft(request);
-
-				verify(service).findAllBescheid(request);
-			}
-
-			@Test
-			void shouldCallHasStatusDraft() {
-				doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-
-				service.findBescheidDraft(request);
-
-				verify(service).hasStatusDraft(BESCHEID_ITEM);
-			}
-
-			@Test
-			void shouldFilterDraftItems() {
-				doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-				doReturn(true).when(service).hasStatusDraft(any());
-
-				var result = service.findBescheidDraft(request);
-
-				assertThat(result).contains(BESCHEID_ITEM);
-			}
-
-			@Test
-			void shouldReturnEmptyWhenNotFound() {
-				doReturn(Stream.empty()).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-
-				var result = service.findBescheidDraft(request);
-
-				assertThat(result).isEmpty();
-			}
-
-			@Test
-			void shouldReturnEmptyWhenNotDraft() {
-				doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-				doReturn(false).when(service).hasStatusDraft(any());
-
-				var result = service.findBescheidDraft(request);
-
-				assertThat(result).isEmpty();
-			}
-
-		}
-
-	}
-
-	@Nested
-	class TestFindAllBescheid {
-
-		private static final AttachedItem RESULT_BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-
-		@Mock
-		private GrpcFindVorgangAttachedItemRequest request;
-
-		@BeforeEach
-		void init() {
-			doReturn(Stream.of(RESULT_BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class));
-		}
-
-		@Test
-		void shouldCallBuildFindRequest() {
-			service.findAllBescheid(VorgangTestFactory.ID);
-
-			verify(service).buildFindRequest(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldCallFindAllBescheid() {
-			doReturn(request).when(service).buildFindRequest(any());
-
-			service.findAllBescheid(VorgangTestFactory.ID);
-
-			verify(service).findAllBescheid(request);
-		}
-
-		@Test
-		void shouldReturnResult() {
-			var result = service.findAllBescheid(VorgangTestFactory.ID);
-
-			assertThat(result).containsExactly(RESULT_BESCHEID_ITEM);
-		}
-	}
-
-	@Nested
-	class TestBuildFindRequest {
-
-		@Test
-		void shouldBuildRequest() {
-			var request = buildFindRequest();
-
-			assertThat(request.getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetItemName() {
-			var request = buildFindRequest();
-
-			assertThat(request.getItemName()).isEqualTo(AttachedItemService.BESCHEID_ITEM_NAME);
-		}
-
-		@Test
-		void shouldSetClient() {
-			var request = buildFindRequest();
-
-			assertThat(request.getClient()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		}
-
-		private GrpcFindVorgangAttachedItemRequest buildFindRequest() {
-			return service.buildFindRequest(CommandTestFactory.VORGANG_ID);
-		}
-	}
-
-	@Nested
-	class TestFindAllBescheidWithGrpcRequest {
-
-		@Mock
-		private GrpcFindVorgangAttachedItemRequest request;
-		@Mock
-		private GrpcFindVorgangAttachedItemResponse response;
-		@Mock
-		private GrpcVorgangAttachedItem grpcVorgangAttachedItem;
-
-		@BeforeEach
-		void init() {
-			doReturn(serviceStub).when(service).getServiceStub();
-			when(serviceStub.find(any())).thenReturn(response);
-		}
-
-		@Test
-		void shouldCallGetServiceStub() {
-			service.findAllBescheid(request);
-
-			verify(service).getServiceStub();
-		}
-
-		@Test
-		void shouldCallMapper() {
-			when(response.getVorgangAttachedItemsList()).thenReturn(Collections.singletonList(grpcVorgangAttachedItem));
-
-			service.findAllBescheid(request).toList();
-
-			verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
-		}
-
-		@Test
-		void shouldReturnSortedResult() {
-			var beschiedenAmFirst = "2021-01-01";
-			var beschiedenAmLast = "2024-01-01";
-			createItems(beschiedenAmFirst, beschiedenAmLast);
-
-			var result = service.findAllBescheid(request).toList();
-
-			assertThat(result).hasSize(2);
-			assertThat(result.get(0).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmLast);
-			assertThat(result.get(1).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmFirst);
-		}
-
-		private void createItems(String beschiedenAmFirst, String beschiedenAmLast) {
-			var itemBeschiedenFirst = createGrpcAttachedItem(beschiedenAmLast);
-			when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenFirst)).thenReturn(createAttachedItem(beschiedenAmLast));
-			var itemBeschiedenLast = createGrpcAttachedItem(beschiedenAmFirst);
-			when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenLast)).thenReturn(createAttachedItem(beschiedenAmFirst));
-			when(response.getVorgangAttachedItemsList()).thenReturn(List.of(itemBeschiedenFirst, itemBeschiedenLast));
-		}
-
-		private GrpcVorgangAttachedItem createGrpcAttachedItem(String beschiedenAm) {
-			return GrpcVorgangAttachedItemTestFactory.createBuilder().clearItem().setItem(GrpcObject.newBuilder().addProperty(
-					GrpcProperty.newBuilder().setName(Bescheid.FIELD_BESCHIEDEN_AM).addValue(beschiedenAm))).build();
-		}
-
-		private AttachedItem createAttachedItem(String beschiedenAm) {
-			return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm)
-					.build();
-		}
-	}
-
-	@Nested
-	class TestHasStatusDraft {
-
-		@Test
-		void shouldReturnTrueIfDraft() {
-			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem()
-					.itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name())
-					.build();
-
-			var result = service.hasStatusDraft(item);
-
-			assertThat(result).isTrue();
-		}
-
-		@Test
-		void shouldReturnFalseIfNotDraft() {
-			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem()
-					.itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name())
-					.build();
-
-			var result = service.hasStatusDraft(item);
-
-			assertThat(result).isFalse();
-		}
-	}
-
-	@Nested
-	class TestGetBescheid {
-
-		@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 shouldCallGetServiceStab() {
-			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
-
-			getItem();
-
-			verify(service).getServiceStub();
-		}
-
-		@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 expectedBescheid = AttachedItemTestFactory.createBescheid();
-			when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedBescheid);
-			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
-
-			var result = getItem();
-
-			assertThat(result).isEqualTo(expectedBescheid);
-		}
-
-		private AttachedItem getItem() {
-			return service.getItem(AttachedItemTestFactory.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 shouldCallGetServiceStab() {
-			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
-
-			getItem();
-
-			verify(service).getServiceStub();
-		}
-
-		@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(AttachedItemTestFactory.ID);
-		}
-	}
-
-	@Nested
-	class TestBuildGetByIdRequest {
-
-		@Test
-		void shouldSetBescheidId() {
-			var request = service.buildGetByIdRequest(AttachedItemTestFactory.ID);
-
-			assertThat(request.getId()).isEqualTo(AttachedItemTestFactory.ID);
-		}
-	}
-
-	@Nested
-	class TestGetServiceStub {
-
-		@Test
-		void shouldCallWithInterceptors() {
-			service.getServiceStub();
-
-			verify(serviceStub).withInterceptors(bescheidCallContextInterceptor);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java
deleted file mode 100644
index b95890c8ea0e39afabade13339e3790d947137f1..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java
+++ /dev/null
@@ -1,166 +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.ArgumentMatchers.*;
-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.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.security.core.context.SecurityContext;
-
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandCreatedEventTestFactory;
-import de.ozgcloud.command.CommandFailedEvent;
-import de.ozgcloud.command.CommandTestFactory;
-
-class DocumentEventListenerTest {
-
-	@Spy
-	@InjectMocks
-	private DocumentEventListener listener;
-
-	@Mock
-	private DocumentService documentService;
-	@Mock
-	private ApplicationEventPublisher eventPublisher;
-	@Mock
-	private CurrentUserService userService;
-
-	@Nested
-	class TestOnCreateBescheidDocumentFromFile {
-
-		@Captor
-		private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor;
-		private Command command = CommandTestFactory.create();
-
-		@Test
-		void shouldCallDocumentService() {
-			listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(documentService).createBescheidDocument(command);
-		}
-
-		@Test
-		void shouldPublishCommandFinishedEvent() {
-			var createdResourceId = "createdResourceId";
-			when(documentService.createBescheidDocument(any())).thenReturn(createdResourceId);
-
-			listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(eventPublisher).publishEvent(documentCreatedEventCaptor.capture());
-			assertThat(documentCreatedEventCaptor.getValue().getCreatedResource()).isEqualTo(createdResourceId);
-			assertThat(documentCreatedEventCaptor.getValue().getCommand()).isEqualTo(command);
-		}
-
-		@Test
-		void shouldNotPublishCommandFailedEvent() {
-			listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-			verify(eventPublisher, never()).publishEvent(any(CommandFailedEvent.class));
-		}
-
-		@Nested
-		class TestHandleException {
-
-			@Captor
-			private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
-
-			@BeforeEach
-			void init() {
-				doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any());
-			}
-
-			@Test
-			void shouldCallBuildErrorMessage() {
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(listener).buildErrorMessage(any());
-			}
-
-			@Test
-			void shouldPublishCommandFailedEvent() {
-				var expectedErrorMessage = "expected error message";
-				doReturn(expectedErrorMessage).when(listener).buildErrorMessage(any());
-
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture());
-				assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
-				assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isEqualTo(expectedErrorMessage);
-			}
-
-			@Test
-			void shouldNotPublishFinishedEvent() {
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(eventPublisher, never()).publishEvent(any(BescheidDocumentCreatedEvent.class));
-			}
-		}
-
-		@Nested
-		class HandleSecurityContext {
-
-			@Mock
-			private SecurityContext secContext;
-
-			@BeforeEach
-			void init() {
-				when(userService.startSecurityContext(any())).thenReturn(secContext);
-			}
-
-			@Test
-			void shouldStartSecurityContext() {
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(userService).startSecurityContext(command);
-			}
-
-			@Test
-			void shouldResetSecurityContext() {
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(userService).resetSecurityContext(secContext);
-			}
-
-			@Test
-			void shouldResetSecurityContextAfterException() {
-				doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any());
-
-				listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command));
-
-				verify(userService).resetSecurityContext(secContext);
-			}
-		}
-	}
-}
\ 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
deleted file mode 100644
index e2157ed90a4161e3e67bfd1dcc30f0010c5ca390..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java
+++ /dev/null
@@ -1,120 +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 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
deleted file mode 100644
index 50405df503f49f1a8ef42d20921d9cb0dbc62e99..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
+++ /dev/null
@@ -1,107 +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 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.common.attached_item.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
deleted file mode 100644
index 9a059e860e5fd527fdc18b6e236f5363ce7311e4..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
+++ /dev/null
@@ -1,452 +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.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.springframework.web.server.ResponseStatusException;
-
-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.apilib.common.datatypes.GenericId;
-import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
-import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.BescheidTestFactory;
-import de.ozgcloud.bescheid.BescheidResponse;
-import de.ozgcloud.bescheid.BescheidResponseTestFactory;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandTestFactory;
-import de.ozgcloud.common.attached_item.AttachedItem;
-import de.ozgcloud.common.attached_item.AttachedItemService;
-import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.errorhandling.TechnicalException;
-
-class DocumentServiceTest {
-
-	private static final String FILE_ID = "file-id";
-	private static final String RELATION_ID = "relation-id";
-
-	@Spy
-	@InjectMocks
-	private DocumentService service;
-
-	@Mock
-	private OzgCloudCommandService commandService;
-	@Mock
-	private CommandMapper commandMapper;
-	@Mock
-	private AttachedItemService attachedItemService;
-	@Mock
-	private DocumentMapper documentMapper;
-
-	private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID).build();
-
-	@Nested
-	class TestCreateBescheidDocument {
-
-		private static final String CREATED_ATTACHED_ITEM_ID = "document-id";
-
-		@Mock
-		private OzgCloudCommand ozgCommand;
-
-		@Nested
-		class TestWithCommand {
-
-			private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID)
-					.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build();
-
-			@BeforeEach
-			void init() {
-				doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap());
-			}
-
-			@Test
-			void shouldCallBuildItemMap() {
-				service.createBescheidDocument(command);
-
-				verify(service).buildItemMap(command);
-			}
-
-			@Test
-			void shouldCallCreateBescheidDocument() {
-				var itemMap = Map.of("key", (Object) "value");
-				doReturn(itemMap).when(service).buildItemMap(any(Command.class));
-
-				service.createBescheidDocument(command);
-
-				verify(service).createBescheidDocument(command, itemMap);
-			}
-
-			@Test
-			void shouldReturnDocumentId() {
-				String result = service.createBescheidDocument(command);
-
-				assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID);
-			}
-		}
-
-		@Nested
-		class TestWithBescheid {
-
-			private final BescheidResponse bescheid = BescheidResponseTestFactory.create()
-					.withBescheidFileId(FileId.from(DocumentTestFactory.ID));
-
-			@BeforeEach
-			void init() {
-				doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap());
-			}
-
-			@Test
-			void shouldCallBuildItemMap() {
-				service.createBescheidDocument(command, bescheid);
-
-				verify(service).buildItemMap(bescheid);
-			}
-
-			@Test
-			void shouldCallCreateBescheidDocument() {
-				var itemMap = Map.of("key", (Object) "value");
-				doReturn(itemMap).when(service).buildItemMap(any(BescheidResponse.class));
-
-				service.createBescheidDocument(command, bescheid);
-
-				verify(service).createBescheidDocument(command, itemMap);
-			}
-
-			@Test
-			void shouldReturnDocumentId() {
-				String result = service.createBescheidDocument(command, bescheid);
-
-				assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID);
-			}
-		}
-
-		@Nested
-		class TestWithCommandAndItemMap {
-
-			private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID);
-
-			@BeforeEach
-			void init() {
-				when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand);
-				doNothing().when(service).validateBescheidItem(any());
-			}
-
-			@Test
-			void shouldCallValidateBescheidItem() {
-				service.createBescheidDocument(command, BODY_OBJECT);
-
-				verify(service).validateBescheidItem(RELATION_ID);
-			}
-
-			@Test
-			void shouldCallCommandService() {
-				doReturn(ozgCommand).when(service).buildCreateDocumentOzgCommand(any(), anyMap());
-
-				service.createBescheidDocument(command, BODY_OBJECT);
-
-				verify(commandService).createAndWaitUntilDone(ozgCommand);
-			}
-
-			@Test
-			void shouldReturnDocumentId() {
-				when(ozgCommand.getCreatedResource()).thenReturn(CREATED_ATTACHED_ITEM_ID);
-
-				String documentId = service.createBescheidDocument(command, BODY_OBJECT);
-
-				assertThat(documentId).isEqualTo(CREATED_ATTACHED_ITEM_ID);
-			}
-		}
-	}
-
-	@Nested
-	class TestValidateBescheidItem {
-
-		@Test
-		void shouldCallGetBescheidItem() {
-			when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid());
-
-			validateBescheidItem();
-
-			verify(attachedItemService).getItem(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldThrowExceptionWhenNoBescheidDraft() {
-			when(attachedItemService.getItem(any())).thenThrow(ResponseStatusException.class);
-
-			assertThrows(ResponseStatusException.class, this::validateBescheidItem);
-		}
-
-		@Test
-		void shouldNotThrowExceptionIfNotDraft() {
-			when(attachedItemService.getItem(any())).thenReturn(
-					AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "not-draft").build());
-
-			assertThrows(TechnicalException.class, this::validateBescheidItem);
-		}
-
-		@Test
-		void shouldValidateBescheidItem() {
-			when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid());
-
-			assertDoesNotThrow(this::validateBescheidItem);
-		}
-
-		void validateBescheidItem() {
-			service.validateBescheidItem(AttachedItemTestFactory.ID);
-		}
-	}
-
-	@Nested
-	class TestBuildCreateDocumentOzgCommand {
-
-		private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID);
-
-		@Test
-		void shouldSetOrder() {
-			var ozgCommand = service.buildCreateDocumentOzgCommand(command, BODY_OBJECT);
-
-			assertThat(ozgCommand.getOrder()).isEqualTo(DocumentService.CREATE_ATTACHED_ITEM_ORDER);
-		}
-
-		@Test
-		void shouldCallVorgangIdMapper() {
-			service.buildCreateDocumentOzgCommand(command, BODY_OBJECT);
-
-			verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var expectedVorgangId = OzgCloudVorgangId.from("vorgang-id");
-			when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId);
-
-			var ozgCommand = buildCreateDocumentOzgCommand();
-
-			assertThat(ozgCommand.getVorgangId()).isEqualTo(expectedVorgangId);
-		}
-
-		@Test
-		void shouldCallRelationIdMapper() {
-			buildCreateDocumentOzgCommand();
-
-			verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var expectedRelationId = GenericId.from("relation-id");
-			when(commandMapper.mapRelationId(any())).thenReturn(expectedRelationId);
-
-			var ozgCommand = buildCreateDocumentOzgCommand();
-
-			assertThat(ozgCommand.getRelationId()).isEqualTo(expectedRelationId);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var ozgCommand = buildCreateDocumentOzgCommand();
-
-			assertThat(ozgCommand.getBodyObject()).isEqualTo(BODY_OBJECT);
-		}
-
-		private OzgCloudCommand buildCreateDocumentOzgCommand() {
-			return service.buildCreateDocumentOzgCommand(command, BODY_OBJECT);
-		}
-	}
-
-	@Nested
-	class TestBuildAttachedItem {
-
-		private static final Map<String, Object> ITEM_MAP = Map.of("key", "value");
-
-		@Test
-		void shouldSetVorgangId() {
-			var attachedItem = buildAttachedItem();
-
-			assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldSetClient() {
-			var attachedItem = buildAttachedItem();
-
-			assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_CLIENT,
-					BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
-		}
-
-		@Test
-		void shouldSetItemName() {
-			var attachedItem = buildAttachedItem();
-
-			assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, DocumentService.DOCUMENT_ITEM_NAME);
-		}
-
-		@Test
-		void shouldSetItem() {
-			var attachedItem = buildAttachedItem();
-
-			assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM, ITEM_MAP);
-		}
-
-		private Map<String, Object> buildAttachedItem() {
-			return service.buildAttachedItem(command, ITEM_MAP);
-		}
-	}
-
-	@Nested
-	class TestBuildItemMap {
-
-		@Nested
-		class TestBuildFromCommand {
-
-			private Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID)
-					.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build();
-
-			@Test
-			void shouldDetDocumentType() {
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE);
-			}
-
-			@Test
-			void shouldSetDocumentFile() {
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID);
-			}
-
-			@Test
-			void shouldThrowExceptionIfDocumentFileIsMissing() {
-				command = CommandTestFactory.createBuilder().bodyObject(Map.of()).build();
-
-				assertThrows(TechnicalException.class, () -> service.buildItemMap(command));
-			}
-
-			private Map<String, Object> buildItemMap() {
-				return service.buildItemMap(command);
-			}
-		}
-
-		@Nested
-		class TestBuildFromBescheid {
-
-			private BescheidResponse bescheid = BescheidResponseTestFactory.create()
-					.withBescheidFileId(FileId.from(DocumentTestFactory.ID));
-
-			@Test
-			void shouldDetDocumentType() {
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE);
-			}
-
-			@Test
-			void shouldSetDocumentFile() {
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, DocumentTestFactory.ID);
-			}
-
-			@Test
-			void shouldSetNachrichtText() {
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
-			}
-
-			@Test
-			void shouldSetEmptyNachrichtText() {
-				bescheid = BescheidResponseTestFactory.createBuilder()
-						.bescheidFileId(FileId.from(DocumentTestFactory.ID))
-						.nachrichtText(Optional.empty()).build();
-
-				var itemMap = buildItemMap();
-
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, StringUtils.EMPTY);
-			}
-
-			@Test
-			void shouldThrowExceptionIfFileIdMissing() {
-				bescheid = BescheidResponseTestFactory.createBuilder().bescheidFileId(null).build();
-
-				assertThrows(TechnicalException.class, () -> service.buildItemMap(bescheid));
-
-			}
-
-			private Map<String, Object> buildItemMap() {
-				return service.buildItemMap(bescheid);
-			}
-		}
-	}
-
-	@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/DocumentTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java
deleted file mode 100644
index 17cd3a9c6e7af0044f5417041e992cc3e38adb0e..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.ozgcloud.document;
-
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class DocumentTestApplication {
-
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
deleted file mode 100644
index 5c56530f7b13a986c3cd6fd0914bfc9201d152b7..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
+++ /dev/null
@@ -1,40 +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;
-
-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/pom.xml b/pom.xml
index f27c49331eda7a4c8073d28ce417fb5b8ad22162..c97114c1769e782e6a83e7f6f66ea68009d73a48 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager</name>
 	<packaging>pom</packaging>
diff --git a/run_helm_test.sh b/run_helm_test.sh
index 2bae426e6327e0d169891a6cd4eec42cd5377d87..06fd77ba50697dea2885a278ba44350ac3ab6bef 100755
--- a/run_helm_test.sh
+++ b/run_helm_test.sh
@@ -5,4 +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'  .
\ No newline at end of file
+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 d3319d470a404cdc82ea1f46d66de742c7b4662b..fe0cc4a15bb047e47330a3fc52f17f187e45d67c 100644
--- a/src/main/helm/templates/_helpers.tpl
+++ b/src/main/helm/templates/_helpers.tpl
@@ -50,7 +50,7 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }}
 {{- end -}}
 
 {{- define "app.ozgcloudEnvironment" -}}
-{{- required "ozgcloud.environment muss angegeben sein" (.Values.ozgcloud).environment -}}
+{{- required "ozgcloud.environment must be set" (.Values.ozgcloud).environment -}}
 {{- end -}}
 
 {{- define "app.vorgangManagerDatabase" -}}
@@ -77,6 +77,22 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }}
 {{ printf "http://%s.%s:8080" .Values.administrationName .Release.Namespace }}
 {{- end -}}
 
+{{- define "app.getApplicationAddress" -}}
+{{- if .Values.applicationAddress -}}
+{{  .Values.applicationAddress }}
+{{- else -}}
+{{ printf "dns:///%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.getNachrichtenManagerAddress" -}}
+{{- if .Values.nachrichtenManagerAddress -}}
+{{  .Values.nachrichtenManagerAddress }}
+{{- else -}}
+{{ printf "%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }}
+{{- end -}}
+{{- end -}}
+
 {{- define "app.databaseSecretName" -}}
 {{- if (.Values.database).secretName -}}
 {{  .Values.database.secretName }}
@@ -130,4 +146,20 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }}
 
 {{- define "app.elsterTransferOperatorNamespace" -}}
 {{- required "elsterTransferOperator.namespace must be set" (.Values.elsterTransferOperator).namespace -}}
-{{- end -}}
\ No newline at end of file
+{{- end -}}
+
+{{- define "app.ozgcloudBezeichner" -}}
+{{- required "ozgcloud.bezeichner must be set" (.Values.ozgcloud).bezeichner -}}
+{{- end -}}
+
+{{- define "app.baseUrl" -}}
+{{- required "baseUrl must be set" .Values.baseUrl }}
+{{- end -}}
+
+{{- define "app.alfaHost" -}}
+{{- if .Values.alfaHost -}}
+{{ .Values.alfaHost | quote }}
+{{- else -}}
+{{ printf "https://%s.%s" (include "app.ozgcloudBezeichner" .) (include "app.baseUrl" .) }}
+{{- end -}}
+{{- end -}}
diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml
index ba379a93e17e623cf46bbc3f6e05aa8750eacff8..52451fef26129625132235fbbe47dae80958b930 100644
--- a/src/main/helm/templates/deployment.yaml
+++ b/src/main/helm/templates/deployment.yaml
@@ -64,9 +64,9 @@ spec:
           - name: spring_profiles_active
             value: {{ include "app.envSpringProfiles" . }}
           - name: ozgcloud_application_address
-            value: {{ include "app.ozgcloud_vorgangmanager_address" . }}
+            value: {{ include "app.getApplicationAddress" . }}
           - name: ozgcloud_nachrichten-manager_address
-            value: {{ include "app.ozgcloud_vorgangmanager_address" . }}
+            value: {{ include "app.getNachrichtenManagerAddress" . }}
           {{- if .Values.env.ozgcloudAktenzeichen.enabled }}
           - name: ozgcloud_aktenzeichen
             value: {{ .Values.env.ozgcloudAktenzeichen.value | default "de.ozgcloud.vorgang.vorgang.AktenzeichenProviderEA" }}
@@ -263,6 +263,11 @@ spec:
             value: "false"
           {{- end }}
 
+          - name: ozgcloud_alfa_host
+            value: {{ include "app.alfaHost" . }}
+          - name: ozgcloud_vorgangManager_serviceAddress
+            value: {{ include "app.ozgcloud_vorgangmanager_address" . }}
+
         {{- if or (.Values.database).useExternal (.Values.ozgcloudProxyApi).apikey }}
         envFrom:
           {{- if (.Values.database).useExternal }}
diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml
index e5b2c533cc56546800a78f562d1d17fefe4403f9..b49c282354091844db32a2ab99d7e25d93ccba78 100644
--- a/src/main/helm/templates/network_policy.yaml
+++ b/src/main/helm/templates/network_policy.yaml
@@ -59,10 +59,10 @@ spec:
   - from:
     - namespaceSelector:
         matchLabels:
-          kubernetes.io/metadata.name: {{((.Values.ozgcloud).antragraum).antragsraumProxyNamespace | default "antragsraum-proxy"}}
+          kubernetes.io/metadata.name: {{((.Values.ozgcloud).antragraum).antragraumProxyNamespace | default "antragraum-proxy"}}
       podSelector: 
         matchLabels:
-          component: antragsraum-proxy
+          component: antragraum-proxy
 {{- end }}
 
   - from:
diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml
index 6a380e033dcf8986792b1e8b8ca9f92a4ab81a0c..e5d0d6e271c3ad94a4be75ee045b192fe42e2a3a 100644
--- a/src/main/helm/values.yaml
+++ b/src/main/helm/values.yaml
@@ -24,8 +24,6 @@
 
 cluster_env: ""
 
-baseUrl: test.sh.ozg-cloud.de
-
 replicaCount: 2
 
 # ozgcloud:
diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml
index 4ee02232ecd2a9c111ed1a6f0eaf7295f075700c..391e123d4eb232ee6dc4b036130c02bdb5a7bc8e 100644
--- a/src/test/helm-linter-values.yaml
+++ b/src/test/helm-linter-values.yaml
@@ -22,8 +22,12 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
+
+baseUrl: test.sh.ozg-cloud.de
+
 ozgcloud:
   environment: test
+  bezeichner: helm
   infoManager:
     address: https://info-manager.my-wonderful-domain.local:9000
 
diff --git a/src/test/helm/deployment_63_chars_test.yaml b/src/test/helm/deployment_63_chars_test.yaml
index a84ec6d6698acc0c874b72e9d5c76f425de07b7e..4ce95b672dfe95bd63951cdc2cca52f2e7d17c45 100644
--- a/src/test/helm/deployment_63_chars_test.yaml
+++ b/src/test/helm/deployment_63_chars_test.yaml
@@ -33,8 +33,10 @@ chart:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 
 tests:
diff --git a/src/test/helm/deployment_actuator_test.yaml b/src/test/helm/deployment_actuator_test.yaml
index b01fbbe154949e3b3198fc648fab4b1ce605c87a..25cad19b0f2237aa8a42b93cc675dfac12c0b65a 100644
--- a/src/test/helm/deployment_actuator_test.yaml
+++ b/src/test/helm/deployment_actuator_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check readiness and startup probe
diff --git a/src/test/helm/deployment_administration_address_env_test.yaml b/src/test/helm/deployment_administration_address_env_test.yaml
index b2bf2db3eed725512711a2f11cf87727c94e78bd..e146aebc75545a2111517f1d96f1d01c195f3521 100644
--- a/src/test/helm/deployment_administration_address_env_test.yaml
+++ b/src/test/helm/deployment_administration_address_env_test.yaml
@@ -29,9 +29,11 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
-  imagePullSecret: image-pull-secret
+    bezeichner: helm
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should have set administration server address
     set:
diff --git a/src/test/helm/deployment_alfa_host_test.yaml b/src/test/helm/deployment_alfa_host_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2a17d3aafa95c7a6ed3bfad0b884ada19d0c4421
--- /dev/null
+++ b/src/test/helm/deployment_alfa_host_test.yaml
@@ -0,0 +1,71 @@
+#
+# 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 alfa host
+release:
+  name: vorgang-manager
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: test-image-pull-secret
+tests:
+  - it: should set the alfa host
+    set:
+      baseUrl: test.sh.ozg-cloud.de
+      ozgcloud:
+        bezeichner: helm
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_alfa_host
+            value: https://helm.test.sh.ozg-cloud.de
+  - it: should use alfa host from values
+    set:
+      baseUrl: test.sh.ozg-cloud.de
+      ozgcloud:
+        bezeichner: helm
+      alfaHost: https://hamburg.mein-kreis.de
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_alfa_host
+            value: https://hamburg.mein-kreis.de
+  - it: should fail if bezeichner is not set
+    set:
+      baseUrl: test.sh.ozg-cloud.de
+    asserts:
+      - failedTemplate:
+          errorMessage: "ozgcloud.bezeichner must be set"
+  - it: should fail if base url is not set
+    set:
+      ozgcloud:
+        bezeichner: helm
+    asserts:
+      - failedTemplate:
+          errorMessage: "baseUrl must be set"
diff --git a/src/test/helm/deployment_antragraum_test.yaml b/src/test/helm/deployment_antragraum_test.yaml
index 0def5958d58429a5889774f8dc0c3cd49daff8cd..4502b67d7001df5d768cb105168a6681f2c8917c 100644
--- a/src/test/helm/deployment_antragraum_test.yaml
+++ b/src/test/helm/deployment_antragraum_test.yaml
@@ -29,11 +29,13 @@ release:
 templates:
   - templates/deployment.yaml
 set:
-  imagePullSecret: image-pull-secret
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
+  imagePullSecret: test-image-pull-secret
 tests:
-  - it: should set antragsraum values
+  - it: should set antragraum values
     set:
       ozgcloud:
         antragraum:
@@ -67,7 +69,7 @@ tests:
             name: ozgcloud_antragraum_decryptionCertificate
             value: "file:/keystore/bayernid/bayern-id.crt"
 
-  - it: should not generate antragsraum config if disabled
+  - it: should not generate antragraum config if disabled
     set:
       ozgcloud.antragraum.enabled: false
     asserts:
@@ -112,7 +114,7 @@ tests:
             name: bayernid-certificate
             mountPath: "/keystore/bayernid"
             readOnly: true
-  - it: should not set volumeMounts if antragsraum is disabled
+  - it: should not set volumeMounts if antragraum is disabled
     set:
       ozgcloud.antragraum.enabled: false
     asserts:
@@ -138,7 +140,7 @@ tests:
             secret:
               secretName: bayernid-certificate
               optional: false
-  - it: should not have volumes if antragsraum is disabled
+  - it: should not have volumes if antragraum is disabled
     set:
       ozgcloud.antragraum.enabled: false
     asserts:
diff --git a/src/test/helm/deployment_bayernid_test.yaml b/src/test/helm/deployment_bayernid_test.yaml
index 5b4837870b547f1c80384011bbf8dce8305eacc4..c11412aa8d089a95339f877ec6ee9b886dca25a9 100644
--- a/src/test/helm/deployment_bayernid_test.yaml
+++ b/src/test/helm/deployment_bayernid_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should set bayernid values
diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml
index d4fa53ca7d43e4998315ec2cfb4f42bc5bd5e3de..51add5e564c008fd62e45d1837f0980bbf415edc 100644
--- a/src/test/helm/deployment_bindings_test.yaml
+++ b/src/test/helm/deployment_bindings_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should have volumes
diff --git a/src/test/helm/deployment_container_basic_test.yaml b/src/test/helm/deployment_container_basic_test.yaml
index 876b4714aafe538e7c080057c54abd65bfac478d..2a36ac446ce27bebc8cf263c8cae80f677ed92cf 100644
--- a/src/test/helm/deployment_container_basic_test.yaml
+++ b/src/test/helm/deployment_container_basic_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should have correct values for container image, name, imagePullPolicy
diff --git a/src/test/helm/deployment_container_security_context_test.yaml b/src/test/helm/deployment_container_security_context_test.yaml
index 11aef905bd2c4cbfe7fbcdd88ddaab437f0d4d4a..314103487abfd694e2d7b0bfd926cc3406da219e 100644
--- a/src/test/helm/deployment_container_security_context_test.yaml
+++ b/src/test/helm/deployment_container_security_context_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check default values
diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml
index 2cf86a63ea9c342d7c5f6553cbba061eb8e367af..7f7b80734a19b8d42384b5514cce435d853c2049 100644
--- a/src/test/helm/deployment_defaults_labels_test.yaml
+++ b/src/test/helm/deployment_defaults_labels_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check default labels
diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml
index b5e90a80698041766edbf65b61e54943b2a8f032..1a0ee0a3471584e577346c80cddc64b8417ab010 100644
--- a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml
+++ b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml
@@ -28,9 +28,11 @@ release:
   namespace: sh-helm-test
 templates:
   - templates/deployment.yaml
-set:  
+set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
-    environment: test
+    environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
  
 tests:
diff --git a/src/test/helm/deployment_dummy_bescheid_document_test.yaml b/src/test/helm/deployment_dummy_bescheid_document_test.yaml
index 8863f522e03eb89a1967528f116e5195ac42a473..74adfb830793a2a526fd820fee686f5334e2fab6 100644
--- a/src/test/helm/deployment_dummy_bescheid_document_test.yaml
+++ b/src/test/helm/deployment_dummy_bescheid_document_test.yaml
@@ -29,12 +29,14 @@ release:
 templates:
   - templates/deployment.yaml
 set:
-  imagePullSecret: image-pull-secret
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
     feature:
       bescheid:
         enableDummyDocumentProcessor: true
+  imagePullSecret: image-pull-secret
 tests:
   - it: should enable dummy bescheid document processor
     asserts:
diff --git a/src/test/helm/deployment_elasticsearch_test.yaml b/src/test/helm/deployment_elasticsearch_test.yaml
index 2da7a513b36639efde128078b9fd5c0d0876c30e..453e2cc5ab01355042dd25ea6a3c8417023a563d 100644
--- a/src/test/helm/deployment_elasticsearch_test.yaml
+++ b/src/test/helm/deployment_elasticsearch_test.yaml
@@ -26,8 +26,10 @@ suite: elasticsearch tests
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check if elastic credentials are disabled by default
diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml
index 4d71e36a71fcb5da19e5c6b55afd44ad528bcbd8..2a98ced7a604f37a24d566fc1de958738e3feef7 100644
--- a/src/test/helm/deployment_env_test.yaml
+++ b/src/test/helm/deployment_env_test.yaml
@@ -26,8 +26,10 @@ suite: test environments
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check customList as list
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 763578ba556ba1c456cdfa7f9d5969b818d13119..81185b9711dc253c84c8bdd895cea61418fc8a77 100644
--- a/src/test/helm/deployment_grpc_info_manager_address_test.yaml
+++ b/src/test/helm/deployment_grpc_info_manager_address_test.yaml
@@ -28,14 +28,18 @@ release:
   namespace: sh-helm-test
 templates:
   - templates/deployment.yaml
+set:
+  baseUrl: test.sh.ozg-cloud.de
+  ozgcloud:
+    environment: dev
+    bezeichner: helm
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should set the grpc info-manager client address
     set:
       ozgcloud:
-        environment: dev
-        infoManager: 
+        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_tls_test.yaml b/src/test/helm/deployment_grpc_tls_test.yaml
index 120c32436acb99bf04891c2911f0804077b7b862..fdcbab138b368b6ca8fbf56cc1aaa72a2ebec1bb 100644
--- a/src/test/helm/deployment_grpc_tls_test.yaml
+++ b/src/test/helm/deployment_grpc_tls_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
-    environment: test
+    environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should have volume for grpc-tls-cert
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 a26e7cb0ceed7622dd361937c32f5074b6e60567..12938cc05dd26ac4ec1112d1558469378329ed64 100644
--- a/src/test/helm/deployment_grpc_user_manager_address_test.yaml
+++ b/src/test/helm/deployment_grpc_user_manager_address_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should set the grpc user-manager client address
diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml
index 549c387c725ba385235a1a6389da8d67a4e22520..89fa7000ad445c84548af1eda4dde6442cd67e6a 100644
--- a/src/test/helm/deployment_host_aliases_test.yaml
+++ b/src/test/helm/deployment_host_aliases_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should not set hostAliases
diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml
index a509da8e68281789a9454d33c4c5e018a63698b4..bb794eb01101266269021e9624eed213be892544 100644
--- a/src/test/helm/deployment_imagepull_secret_test.yaml
+++ b/src/test/helm/deployment_imagepull_secret_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
 tests:
   - it: should set the imagePull secret
     set:
diff --git a/src/test/helm/deployment_kiel_hackathon_route_test.yaml b/src/test/helm/deployment_kiel_hackathon_route_test.yaml
index f7879e4739ff4b8a6c67770701492f7210790ce7..1c896feef4e68b7990b6356956f5c060163a6f3a 100644
--- a/src/test/helm/deployment_kiel_hackathon_route_test.yaml
+++ b/src/test/helm/deployment_kiel_hackathon_route_test.yaml
@@ -29,12 +29,14 @@ release:
 templates:
   - templates/deployment.yaml
 set:
-  imagePullSecret: image-pull-secret
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
     feature:
       bescheid:
         kielHackathonRoute: true
+  imagePullSecret: test-image-pull-secret
 tests:
   - it: should enable kiel hackathon toggle
     asserts:
diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml
index 6eb925f2db9adf6854a03cded85538fccb066d1f..9a5dddc4594e187c4d3f79bde205a828cee1f5d5 100644
--- a/src/test/helm/deployment_liveness_probe_test.yaml
+++ b/src/test/helm/deployment_liveness_probe_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: livenessProbe should be disabled by default
diff --git a/src/test/helm/deployment_mongodb_test.yaml b/src/test/helm/deployment_mongodb_test.yaml
index ad8a4cb17c47cdca0b5cc89daf2055ec9a24109e..5fa9fa8f938cba2b8372a3921dbd294de98d7519 100644
--- a/src/test/helm/deployment_mongodb_test.yaml
+++ b/src/test/helm/deployment_mongodb_test.yaml
@@ -26,8 +26,10 @@ suite: deployment test mongodb environments
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check mongodb default env
diff --git a/src/test/helm/deployment_muk_test.yaml b/src/test/helm/deployment_muk_test.yaml
index aeb0cd59e88df0196712fb836088d1faa2b468ff..bcc31dc748cb40fd1cbce571313b0439371222aa 100644
--- a/src/test/helm/deployment_muk_test.yaml
+++ b/src/test/helm/deployment_muk_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should set muk values
diff --git a/src/test/helm/deployment_nachrichten_manager_address_test.yaml b/src/test/helm/deployment_nachrichten_manager_address_test.yaml
index 67887800a93d5637f079a8aaed0ffa08e588a8af..38907692a6e2e70500eb9ca3f9d2d2717bc2cef8 100644
--- a/src/test/helm/deployment_nachrichten_manager_address_test.yaml
+++ b/src/test/helm/deployment_nachrichten_manager_address_test.yaml
@@ -22,21 +22,34 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 #
 
-suite: test environments nachrichten-manager_url
+suite: deployment nachrichten-manager_url
 release:
   name: vorgang-manager
-  namespace: sh-helm-test
+  namespace: by-helm-test
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.by.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
-  - it: check if nachrichten-manager address is correct
+  - it: should generate nachrichten-manager address if not exists
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
           content:
             name: ozgcloud_nachrichten-manager_address
-            value:  dns:///vorgang-manager.sh-helm-test:9090
+            value:  vorgang-manager.by-helm-test:9090
+
+  - it: should have set nachrichten-manager address
+    set:
+      nachrichtenManagerAddress: localSettedAddress
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_nachrichten-manager_address
+            value:  localSettedAddress
+  
\ No newline at end of file
diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml
index 42f5e0771bff080656d567edd16939ab9a99c79a..8e541d2fadf893072a380985246cd306c344aed0 100644
--- a/src/test/helm/deployment_pod_default_spec_values_test.yaml
+++ b/src/test/helm/deployment_pod_default_spec_values_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
  - it: should have correct pod template values
diff --git a/src/test/helm/deployment_rabbitmq_env_test.yaml b/src/test/helm/deployment_rabbitmq_env_test.yaml
index 3adaadfd0c5356fca70a79477c7dfd801751512b..c1e4acfee0ffff9bf5994ae1fde5e8113698d027 100644
--- a/src/test/helm/deployment_rabbitmq_env_test.yaml
+++ b/src/test/helm/deployment_rabbitmq_env_test.yaml
@@ -26,8 +26,10 @@ suite: deployment test rabbitmq environments
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check rabbitmq spring env
diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml
index 7a545c8e7563e05cf5b7853bc87718f4b90c2240..9f42d2ff6aaf4f2f30852ee60323d95ad9ab125c 100644
--- a/src/test/helm/deployment_resources_test.yaml
+++ b/src/test/helm/deployment_resources_test.yaml
@@ -28,8 +28,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: test resources
diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml
index ad44c8d08f82196b65ff240d7db8bde467185be6..8a9de29bc8720fc291bc9a30b00f96415dd41f75 100644
--- a/src/test/helm/deployment_service_account_test.yaml
+++ b/src/test/helm/deployment_service_account_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should use service account with default name
diff --git a/src/test/helm/deployment_springProfile_env_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml
index 7b24e13faf86d6f0adb38838aac3f548522724f3..f4cc5923d387f4a32d70c987b177a4eeca8f3fc4 100644
--- a/src/test/helm/deployment_springProfile_env_test.yaml
+++ b/src/test/helm/deployment_springProfile_env_test.yaml
@@ -28,8 +28,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: should override spring profiles
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 e39659efbe0ffbbcfca957884cca18d73810f6e4..1b1e5f48bfd4a6d2d614387823f8cfee010bc7e7 100644
--- a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml
+++ b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml
@@ -28,14 +28,17 @@ release:
   namespace: sh-helm-test
 templates:
   - templates/deployment.yaml
-
+set:
+  baseUrl: test.sh.ozg-cloud.de
+  ozgcloud:
+    bezeichner: helm
 tests:
   - it: should fail on missing environment
-    set: 
+    set:
       imagePullSecret: test-image-pull-secret
     asserts:
       - failedTemplate:
-          errorMessage: ozgcloud.environment muss angegeben sein
+          errorMessage: ozgcloud.environment must be set
   - it: should not fail on not missing environment and not missing imagepullsecret
     set:
       ozgcloud:
diff --git a/src/test/helm/deployment_usermanager_url_env_test.yaml b/src/test/helm/deployment_usermanager_url_env_test.yaml
index 5a2ac4d9af36586647ccaa20b863a38a735ff3d5..c0bcda1089f313b2ef38d9b4b443496b1ae5ffc6 100644
--- a/src/test/helm/deployment_usermanager_url_env_test.yaml
+++ b/src/test/helm/deployment_usermanager_url_env_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check if user-manager url is correct
diff --git a/src/test/helm/deployment_vorgang_manager_env_test.yaml b/src/test/helm/deployment_vorgang_manager_env_test.yaml
index 4626fa9296378d85086ac3e15513241aa785e23d..88948502dad997927c922bc115460bfff741dfc4 100644
--- a/src/test/helm/deployment_vorgang_manager_env_test.yaml
+++ b/src/test/helm/deployment_vorgang_manager_env_test.yaml
@@ -29,14 +29,26 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
-  - it: check if application address is set
+  - it: should generate application address if its not set
     asserts:
       - contains:
           path: spec.template.spec.containers[0].env
           content:
             name: ozgcloud_application_address
-            value: dns:///vorgang-manager.by-helm-test:9090
\ No newline at end of file
+            value: dns:///vorgang-manager.by-helm-test:9090
+            
+  - it: should keep application address if its set
+    set:
+      applicationAddress: localSettedAddress
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_application_address
+            value: localSettedAddress
\ No newline at end of file
diff --git a/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml b/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..394dd179f926357fd825f8f16a08c0c252c6b658
--- /dev/null
+++ b/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml
@@ -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.
+#
+
+suite: deployment vorgang manager service address environment
+release:
+  name: vorgang-manager
+  namespace: by-helm-test
+templates:
+  - templates/deployment.yaml
+set:
+  baseUrl: test.sh.ozg-cloud.de
+  ozgcloud:
+    environment: dev
+    bezeichner: helm
+  imagePullSecret: test-image-pull-secret
+tests:
+  - it: check if service address of vorgang manager is set
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: ozgcloud_vorgangManager_serviceAddress
+            value: dns:///vorgang-manager.by-helm-test:9090
\ No newline at end of file
diff --git a/src/test/helm/deployment_zufimanager_address_env_test.yaml b/src/test/helm/deployment_zufimanager_address_env_test.yaml
index d73c2e5b39e192cfe0f30908ccaa4c2d5d22fe1c..103ab80b241453c69e9cda99337afe387c36b898 100644
--- a/src/test/helm/deployment_zufimanager_address_env_test.yaml
+++ b/src/test/helm/deployment_zufimanager_address_env_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 tests:
   - it: check default zufi-manager address
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
index 76331e120081a0f27ce4b20a88ecb4d007ce3635..0a3a2db660c001fd8fe29ad37ae06310466f41bb 100644
--- a/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml
+++ b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml
@@ -29,8 +29,10 @@ release:
 templates:
   - templates/deployment.yaml
 set:
+  baseUrl: test.sh.ozg-cloud.de
   ozgcloud:
     environment: dev
+    bezeichner: helm
   imagePullSecret: test-image-pull-secret
 
 tests:
diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml
index 8c72186be1545a2ce6c85d8df72f4d8d1e73838a..618dba7961d5776726e0c51387ae466a5036a409 100644
--- a/src/test/helm/network_policy_test.yaml
+++ b/src/test/helm/network_policy_test.yaml
@@ -154,10 +154,10 @@ tests:
           from:
             - namespaceSelector:
                 matchLabels:
-                  kubernetes.io/metadata.name: antragsraum-proxy
+                  kubernetes.io/metadata.name: antragraum-proxy
               podSelector: 
                 matchLabels:
-                  component: antragsraum-proxy
+                  component: antragraum-proxy
 
   - it: should set ingress rule for antragraum-proxy if antragraum is enabled
     set:
@@ -166,7 +166,7 @@ tests:
       ozgcloud:
         antragraum:
           enabled: true
-          antragsraumProxyNamespace: antragsraum-proxy
+          antragraumProxyNamespace: antragraum-proxy
     asserts:
     - contains:
         path: spec.ingress
@@ -174,10 +174,10 @@ tests:
           from:
             - namespaceSelector:
                 matchLabels:
-                  kubernetes.io/metadata.name: antragsraum-proxy
+                  kubernetes.io/metadata.name: antragraum-proxy
               podSelector: 
                 matchLabels:
-                  component: antragsraum-proxy
+                  component: antragraum-proxy
 
 
   - it: should not add ingress rule for antragraum if antragraum is disabled
diff --git a/vorgang-manager-base/pom.xml b/vorgang-manager-base/pom.xml
index 331f7056cbc8068b819e5b811b36fa514f045329..db152d8923a1de637292afad1c0b259fd35685a4 100644
--- a/vorgang-manager-base/pom.xml
+++ b/vorgang-manager-base/pom.xml
@@ -12,7 +12,7 @@
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-base</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager Base</name>
 
diff --git a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java
index 56e9cdb76596b9f4132f18412dd9e15ee981161c..b1d1284370c5c43bc3d8430634efd86acd627238 100644
--- a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java
+++ b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java
@@ -95,7 +95,7 @@ class CallContextHandleInterceptor implements ServerInterceptor {
 		}
 
 		void doSurroundOn(Runnable runnable) {
-			try (CloseableThreadContext.Instance ctc = CloseableThreadContext.put(REQUEST_ID_KEY, requestId)) {
+			try (var ctc = CloseableThreadContext.put(REQUEST_ID_KEY, requestId)) {
 				startSecurityContext();
 				runnable.run();
 			} finally {
diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java
index a51e03e3c90e2a91f798d3afd15c06c0a35739ca..416274956e461d0d905b68ee9064b60cf072cd76 100644
--- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java
+++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java
@@ -26,8 +26,6 @@ package de.ozgcloud.vorgang.callcontext;
 import static de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.*;
 import static de.ozgcloud.vorgang.callcontext.UserTestFactory.*;
 
-import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
 
 import de.ozgcloud.common.grpc.GrpcUtil;
@@ -51,16 +49,6 @@ public class CallContextTestFactory {
 				.client(CLIENT);
 	}
 
-	// TODO Pruefen, ob die Methode noch gebraucht wird
-	public static Map<String, Object> createContextMap() {
-		return Map.of(
-				KEY_USER_ID, UserTestFactory.ID,
-				KEY_USER_NAME, UserTestFactory.NAME,
-				KEY_CLIENT_NAME, CLIENT,
-				KEY_ACCESS_LIMITED_ORGAID, Set.of(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID),
-				KEY_REQUEST_ID, REQUEST_ID);
-	}
-
 	public static Metadata createMetadata() {
 		var result = new Metadata();
 		result.put(GrpcUtil.HEADER_KEY_USER_ID, ID.getBytes());
diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java
index 518fc07f0a7a81f2a930d357184230ead2c04d43..33bb5dda35074ead65218e2891ba93b5c8e49cde 100644
--- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java
+++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java
@@ -47,7 +47,7 @@ public class TestCallContextAttachingInterceptor implements ClientInterceptor {
 
 	final class TestCallContextAttachingClientCall<ReqT, RespT> extends SimpleForwardingClientCall<ReqT, RespT> {
 
-		protected TestCallContextAttachingClientCall(ClientCall<ReqT, RespT> delegate) {
+		private TestCallContextAttachingClientCall(ClientCall<ReqT, RespT> delegate) {
 			super(delegate);
 		}
 
diff --git a/vorgang-manager-command/pom.xml b/vorgang-manager-command/pom.xml
index 0356ef538d644aa231f87c7a724eff3cadde1f3e..cccafe587a84f6e9c367e1e6c7099b95a1fc8159 100644
--- a/vorgang-manager-command/pom.xml
+++ b/vorgang-manager-command/pom.xml
@@ -10,7 +10,7 @@
 	
 	<groupId>de.ozgcloud.command</groupId>
 	<artifactId>command-manager</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 	<name>OZG-Cloud Command Manager</name>
 
 	<properties>
diff --git a/vorgang-manager-interface/pom.xml b/vorgang-manager-interface/pom.xml
index e5008b91fd7e905b73a74f1419421e22b373597a..bd9fbd52d6c465fd7fb59d62c5a320d96cfadbef 100644
--- a/vorgang-manager-interface/pom.xml
+++ b/vorgang-manager-interface/pom.xml
@@ -36,7 +36,7 @@
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-interface</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager gRPC Interface</name>
 	<description>Interface (gRPC) for Vorgang Manager Server</description>
diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
index 3c6990c88bbc2b9194a1927b3347dc12902fe867..5cccab4c813af190aaf8f3429704c9a4e0c189d4 100644
--- a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
+++ b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
@@ -30,22 +30,27 @@ option java_package = "de.ozgcloud.bescheid";
 option java_outer_classname = "BescheidModelProto";
 
 message GrpcGetBescheidDraftRequest {
+  option deprecated = true;
   string vorgangId = 1;
 }
 
 message GrpcGetBescheidDraftResponse {
+  option deprecated = true;
   GrpcBescheid bescheid = 1;
 }
 
 message GrpcGetAllBescheidRequest {
+  option deprecated = true;
   string vorgangId = 1;
 }
 
 message GrpcGetAllBescheidResponse {
+  option deprecated = true;
   repeated GrpcBescheid bescheid = 1;
 }
 
 message GrpcBescheid {
+  option deprecated = true;
   string beschiedenAm = 1;
   bool bewilligt = 2;
   string bescheidDocument = 3;
@@ -60,26 +65,33 @@ message GrpcBescheid {
 }
 
 message GrpcSentInfo {
+  option deprecated = true;
   string sentBy = 1;
   string sentAt = 2;
 }
 
-message GrpcBescheidManagerConfigRequest {}
+message GrpcBescheidManagerConfigRequest {
+  option deprecated = true;
+}
 
 message GrpcBescheidManagerConfigResponse {
+  option deprecated = true;
   string version = 1;
   string javaVersion = 2;
   GrpcBescheidManagerFeatures features = 3;
 }
 
 message GrpcBescheidManagerFeatures {
+  option deprecated = true;
   bool canCreateBescheidDocument = 1;
 }
 
 message GrpcGetBescheidRequest {
+  option deprecated = true;
   string id = 1;
-} 
+}
 
 message GrpcGetBescheidResponse {
+  option deprecated = true;
   GrpcBescheid bescheid = 1;
 }
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.proto
index e99d06390e5aab694b512cac8cd4edd8b5a72f2f..db6ad30aa7723cba7d43d2981399c8119f31a033 100644
--- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto
+++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto
@@ -32,6 +32,7 @@ option java_package = "de.ozgcloud.bescheid";
 option java_outer_classname = "BescheidProto";
 
 service BescheidService {
+  option deprecated = true;
   rpc getBescheidDraft(GrpcGetBescheidDraftRequest) returns (GrpcGetBescheidDraftResponse) {
   }
 
@@ -40,7 +41,7 @@ service BescheidService {
 
   rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) {
   }
-  
+
   rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) {
   }
 }
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto
deleted file mode 100644
index ff0025a2197b3ba328547cd595f741ea95852310..0000000000000000000000000000000000000000
--- a/vorgang-manager-interface/src/main/protobuf/document.model.proto
+++ /dev/null
@@ -1,46 +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.
- */
- 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
deleted file mode 100644
index c2a903373b229e3461932fa15e50706a9e5b41af..0000000000000000000000000000000000000000
--- a/vorgang-manager-interface/src/main/protobuf/document.proto
+++ /dev/null
@@ -1,36 +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.
- */
-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 76157a12e40b638a00ca020bfde221706b1cc3ef..b1c4bad8c989562a34bd0f821ed472b28a0cebcf 100644
--- a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto
+++ b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto
@@ -199,11 +199,11 @@ message GrpcVorgangQueryExpression {
 
 message GrpcCreateCollaborationVorgangRequest {
   oneof request {
-    GrpcCollaborationRequest collaborationRequest = 1;
+    GrpcCreateCollaborationRequestData requestData = 1;
   }
 }
 
-message GrpcCollaborationRequest {
+message GrpcCreateCollaborationRequestData {
   string vorgangId = 1;
   int32 collaborationLevel = 2;
   string zustaendigeStelle = 3;
diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml
index 96349c52987bc512a68274fb7cf72536b0451cc2..30f47b69d40c30e0f50a78b1818d1991618319eb 100644
--- a/vorgang-manager-server/pom.xml
+++ b/vorgang-manager-server/pom.xml
@@ -32,13 +32,13 @@
 	<parent>
 		<groupId>de.ozgcloud.common</groupId>
 		<artifactId>ozgcloud-common-parent</artifactId>
-		<version>4.4.0-SNAPSHOT</version>
+		<version>4.5.0-SNAPSHOT</version>
 		<relativePath />
 	</parent>
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-server</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 
 	<name>OZG-Cloud Vorgang Manager Server</name>
 	<description>Server Implementierung des VorgangManagers</description>
@@ -50,15 +50,15 @@
 		<spring-boot.build-image.imageName>docker.ozg-sh.de/vorgang-manager:build-latest</spring-boot.build-image.imageName>
 
 		<ozgcloud.license.version>1.3.0</ozgcloud.license.version>
-		<zufi-manager-interface.version>1.4.0-SNAPSHOT</zufi-manager-interface.version>
+		<zufi-manager-interface.version>1.4.0</zufi-manager-interface.version>
 
-		<user-manager-interface.version>2.1.0</user-manager-interface.version>
-		<bescheid-manager.version>1.18.0-SNAPSHOT</bescheid-manager.version>
+		<user-manager-interface.version>2.9.0</user-manager-interface.version>
+		<bescheid-manager.version>1.20.0-SNAPSHOT</bescheid-manager.version>
 		<processor-manager.version>0.5.0-PR-14-SNAPSHOT</processor-manager.version>
-		<nachrichten-manager.version>2.12.0-PR-31-SNAPSHOT</nachrichten-manager.version>
+		<nachrichten-manager.version>2.14.0-PR-31-SNAPSHOT</nachrichten-manager.version>
 		<ozgcloud-starter.version>0.13.0-PR-31-SNAPSHOT</ozgcloud-starter.version>
-		<notification-manager.version>2.11.0-PR-7-SNAPSHOT</notification-manager.version>
-		<collaboration-manager.version>0.3.0-PR-6-SNAPSHOT</collaboration-manager.version>
+		<notification-manager.version>2.12.0-PR-7-SNAPSHOT</notification-manager.version>
+		<collaboration-manager.version>0.4.0-PR-6-SNAPSHOT</collaboration-manager.version>
 
 		<zip.version>2.11.1</zip.version>
 		<jsoup.version>1.15.3</jsoup.version>
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
index ce8c2dfd120901ce2e599a0c66c0f2d1ac108d5f..ef0d12da9202197c9c16570fe7005f8052f7a178 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java
@@ -187,7 +187,7 @@ public class VorgangAttachedItemService {
 	}
 
 	public void revokeCreate(Command command) {
-		handleRevoke(command, () -> delete(command.getRelationId(), command.getRelationVersion()));
+		handleRevoke(command, () -> delete(command.getCreatedResource(), command.getRelationVersion() + 1));
 	}
 
 	void delete(String id, long version) {
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java
index 28c23c3d257a9bc371fcd54dd1eaed57cd2166a7..e7d98214f47767f8e504319062e735e1f1542162 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java
@@ -27,11 +27,11 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
 
-import de.ozgcloud.vorgang.vorgang.GrpcCollaborationRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcCreateCollaborationRequestData;
 
 @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN)
 public interface CreateCollaborationVorgangRequestMapper {
 
 	@Mapping(target = "vorgang", ignore = true)
-	CreateCollaborationVorgangRequest mapFrom(GrpcCollaborationRequest grpcCollaborationRequest);
+	CreateCollaborationVorgangRequest mapFrom(GrpcCreateCollaborationRequestData grpcCollaborationRequest);
 }
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
index a9f57bac1d65ca9aba3af9671ab6d2efb2948558..dce3ec92f0c506bcabce138f6104003737adff39 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java
@@ -36,11 +36,13 @@ import java.util.stream.Stream;
 
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.FindAndModifyOptions;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.data.mongodb.core.aggregation.Aggregation;
 import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq;
+import org.springframework.data.mongodb.core.aggregation.ConditionalOperators;
 import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch;
 import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch.CaseOperator;
 import org.springframework.data.mongodb.core.aggregation.SetOperation;
@@ -261,17 +263,30 @@ class CommandRepository {
 		return query;
 	}
 
-	public Command setRevokeStatus(String id) {
-		return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(), FindAndModifyOptions.options().returnNew(true), Command.class);
+	public Command setRevokeStatus(String id, String createdResource) {
+		return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(createdResource), FindAndModifyOptions.options().returnNew(true),
+				Command.class);
 	}
 
-	private UpdateDefinition buildUpdateStatusRevoke() {
-		var switchOperation = Switch.switchCases(
-				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED),
-				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING),
-				CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING))
+	private UpdateDefinition buildUpdateStatusRevoke(String createdResource) {
+		var setOperation = SetOperation.set(MONGODB_STATUS).toValue(buildSetStatusCondition());
+		if (StringUtils.isNotBlank(createdResource)) {
+			setOperation = setOperation.and().set(MONGODB_CREATED_RESOURCE).toValue(buildSetCreatedResourceCondition(createdResource));
+		}
+		return Aggregation.newUpdate(setOperation);
+	}
+
+	private Switch buildSetStatusCondition() {
+		return Switch.switchCases(
+						CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED),
+						CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING),
+						CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING))
 				.defaultTo(MONGODB_REFERENCE_STATUS);
-		return Aggregation.newUpdate(SetOperation.set(MONGODB_STATUS).toValue(switchOperation));
+	}
+
+	private ConditionalOperators.Cond buildSetCreatedResourceCondition(String createdResource) {
+		return ConditionalOperators.Cond.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(createdResource)
+				.otherwiseValueOf(MONGODB_CREATED_RESOURCE);
 	}
 
 	public Optional<Command> setRevokeStatusIfNotPending(String id) {
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
index 2f661a37b47f0da8143fdd5332e8385da4ecb1e5..ff7653e640230c195b26595b3b50c0589f305303 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java
@@ -117,7 +117,7 @@ public class CommandService {
 	public void setCommandFinished(String commandId, String createdResource) {
 		var command = getById(commandId);
 		if (shouldRevoke(command)) {
-			repository.setRevokeStatus(commandId);
+			command = repository.setRevokeStatus(commandId, createdResource);
 			publishRevokeCommandEvent(command);
 			return;
 		}
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
index 11318a0cf33d16cc95296cef55b61c1f08a878b8..bb28f0f25b66a1cc2d6065009c4df9b259270fa4 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
@@ -33,6 +33,7 @@ import io.grpc.Metadata;
 import io.grpc.Metadata.Key;
 import io.grpc.Status;
 import io.grpc.StatusException;
+import io.grpc.StatusRuntimeException;
 import lombok.extern.log4j.Log4j2;
 import net.devh.boot.grpc.server.advice.GrpcAdvice;
 import net.devh.boot.grpc.server.advice.GrpcExceptionHandler;
@@ -89,6 +90,11 @@ public class ExceptionHandler {
 		return Status.INTERNAL.withDescription(e.getMessage()).withCause(e.getCause());
 	}
 
+	@GrpcExceptionHandler
+	public StatusRuntimeException passThroughStatusRuntimeException(StatusRuntimeException e) {
+		return e;
+	}
+
 	@GrpcExceptionHandler
 	public StatusException handleRuntimeException(RuntimeException e) {
 		var exceptionId = createExceptionId();
@@ -102,6 +108,16 @@ public class ExceptionHandler {
 		return Status.INTERNAL.withDescription(message).withCause(e.getCause());
 	}
 
+	@GrpcExceptionHandler
+	public StatusException handleNotFoundException(de.ozgcloud.apilib.common.errorhandling.NotFoundException e) {
+		var exceptionId = createExceptionId();
+		var messageWithExceptionId = ExceptionUtil.formatMessageWithExceptionId(e.getMessage(), exceptionId);
+		LOG.error("Grpc internal server error: {}", messageWithExceptionId, e);
+
+		var status = Status.NOT_FOUND.withDescription(messageWithExceptionId).withCause(e.getCause());
+		return createStatusException(status, buildMetadata(exceptionId));
+	}
+
 	private Metadata buildMetadata(String exceptionId) {
 		var metadata = new Metadata();
 		addExceptionId(metadata, exceptionId);
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
index 3adf3dcf4bf4b7d352039c64292abffdfe1068dc..986a7ce668c786d3612d7bdbe1267013bc24aadc 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
@@ -116,8 +116,8 @@ class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase {
 	public void createCollaborationVorgang(GrpcCreateCollaborationVorgangRequest request,
 			StreamObserver<GrpcCreateCollaborationVorgangResponse> responseObserver) {
 		GrpcCreateCollaborationVorgangResponse response;
-		if (request.hasCollaborationRequest()) {
-			response = createCollaborationVorgang(request.getCollaborationRequest());
+		if (request.hasRequestData()) {
+			response = createCollaborationVorgang(request.getRequestData());
 		} else {
 			throw new CreateCollaborationVorgangBadRequestException("Cannot create collaboration vorgang. Collaboration request is empty.");
 		}
@@ -125,12 +125,12 @@ class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase {
 		responseObserver.onCompleted();
 	}
 
-	GrpcCreateCollaborationVorgangResponse createCollaborationVorgang(GrpcCollaborationRequest request) {
+	GrpcCreateCollaborationVorgangResponse createCollaborationVorgang(GrpcCreateCollaborationRequestData request) {
 		var collaborationVorgang = collaborationService.createCollaborationVorgang(buildCreateCollaborationVorgangRequest(request));
 		return buildCreateCollaborationVorgangResponse(collaborationVorgang);
 	}
 
-	CreateCollaborationVorgangRequest buildCreateCollaborationVorgangRequest(GrpcCollaborationRequest request) {
+	CreateCollaborationVorgangRequest buildCreateCollaborationVorgangRequest(GrpcCreateCollaborationRequestData request) {
 		var vorgang = vorgangService.getById(request.getVorgangId());
 		return createCollaborationVorgangRequestMapper.mapFrom(request).toBuilder().vorgang(vorgang).build();
 	}
diff --git a/vorgang-manager-server/src/main/resources/application.yml b/vorgang-manager-server/src/main/resources/application.yml
index 14efedc146c86e36e8dff4ebdf7c3f66ea544275..7bf48c56cfe7b1d089dd2dc367d1b6bcdd25d09c 100644
--- a/vorgang-manager-server/src/main/resources/application.yml
+++ b/vorgang-manager-server/src/main/resources/application.yml
@@ -5,7 +5,7 @@ logging:
 
 mongock:
   runner-type: initializingbean
-  migration-scan-package: 
+  migration-scan-package:
     - de.ozgcloud.vorgang.common.migration
   enabled: true
   transactionEnabled: false
@@ -30,7 +30,7 @@ grpc:
       address: self:self
       negotiationType: TLS
     user-manager:
-      negotiationType: TLS  
+      negotiationType: TLS
     email:
       address: self:self
       negotiationType: TLS
@@ -91,6 +91,8 @@ ozgcloud:
     mail-from: EA-Poststelle@itvsh.de
   notification:
     mail-from: hilfe@ozgcloud.support
+    wiedervorlageDueToday:
+      cron: "0 15 0 * * *"
   nachrichten-manager:
     address: self:self
     negotiation-type: plaintext
@@ -107,4 +109,4 @@ ozgcloud:
   user-manager:
     address: ${grpc.client.user-manager.address:false}
     negotiation-type: ${grpc.client.user-manager.negotiationType}
-    
+
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..8344f50af2c30364a65462793f2532152c1f2a85
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java
@@ -0,0 +1,163 @@
+/*
+ * 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;
+
+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.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.BescheidServiceGrpc.BescheidServiceBlockingStub;
+import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.document.bescheid.Bescheid;
+import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.document.bescheid.SentInfo;
+import de.ozgcloud.document.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService;
+import de.ozgcloud.document.bescheid.common.user.UserProfile;
+import de.ozgcloud.document.bescheid.common.user.UserProfileService;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
+import de.ozgcloud.vorgang.VorgangManagerServerApplication;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
+import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory;
+import de.ozgcloud.vorgang.vorgang.Vorgang;
+import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = {
+		"grpc.server.inProcessName=test",
+		"grpc.server.port=-1",
+		"grpc.client.inProzess.address=in-process:test",
+		"grpc.client.vorgang-manager.address=in-process:test",
+})
+@DataITCase
+@DirtiesContext
+@Deprecated
+class DeprecatedBescheidGrpcServiceITCase {
+
+	@GrpcClient("inProzess")
+	private BescheidServiceBlockingStub bescheidServiceBlockingStub;
+
+	@Autowired
+	private MongoOperations mongoOperations;
+
+	@MockBean
+	private CurrentUserService currentUserService;
+	@MockBean
+	private UserProfileService userProfileService;
+	@Mock
+	private CallContextUser callContextUser;
+	@Mock
+	private UserProfile userProfile;
+
+	@Nested
+	class TestFindAll {
+
+		@BeforeEach
+		void init() {
+			mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+			mongoOperations.dropCollection(Vorgang.COLLECTION_NAME);
+			when(currentUserService.getUser()).thenReturn(callContextUser);
+			when(userProfileService.getUserProfile()).thenReturn(userProfile);
+		}
+
+		@Test
+		void shouldReturnSortedResult() {
+			var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
+			var bescheidItemFirstId = mongoOperations.save(createBescheidAttachedItem(vorgangId, "2022-10-01")).getId();
+			var bescheidItemLastId = mongoOperations.save(createBescheidAttachedItem(vorgangId, "2024-01-01")).getId();
+
+			var response = bescheidServiceBlockingStub.getAll(GrpcGetAllBescheidRequest.newBuilder().setVorgangId(vorgangId).build());
+
+			assertThat(response.getBescheidList()).hasSize(2);
+			assertThat(response.getBescheidList().get(0).getId()).isEqualTo(bescheidItemLastId);
+			assertThat(response.getBescheidList().get(1).getId()).isEqualTo(bescheidItemFirstId);
+		}
+
+		@Test
+		void shouldReturnSentInfo() {
+			var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
+			var itemMap = createItemWithSentInfo();
+			mongoOperations.save(createBescheidAttachedItem(vorgangId, itemMap));
+
+			var response = bescheidServiceBlockingStub.getAll(GrpcGetAllBescheidRequest.newBuilder().setVorgangId(vorgangId).build());
+
+			assertThat(response.getBescheidList()).hasSize(1).first().extracting(GrpcBescheid::getSentInfo)
+					.isEqualTo(DeprecatedGrpcSentInfoTestFactory.create());
+		}
+
+		private Map<String, Object> createItemWithSentInfo() {
+			return Map.of(
+					Bescheid.FIELD_BEWILLIGT, "true",
+					Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(),
+					Bescheid.FIELD_BESCHIEDEN_AM, "2022-10-01",
+					Bescheid.FIELD_SENT_INFO, Map.of(
+							SentInfo.FIELD_SENT_AT, DeprecatedGrpcSentInfoTestFactory.SENT_AT_STR,
+							SentInfo.FIELD_SENT_BY, CallContextUserTestFactory.ID));
+		}
+
+		private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, String beschiedenAm) {
+			var itemMap = Map.<String, Object>of(
+					Bescheid.FIELD_BEWILLIGT, "true",
+					Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name(),
+					Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm);
+			return createBescheidAttachedItem(vorgangId, itemMap);
+		}
+
+		private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, Map<String, Object> itemMap) {
+			return VorgangAttachedItemTestFactory.createBuilder()
+					.id(null)
+					.version(0L)
+					.vorgangId(vorgangId)
+					.itemName(AttachedItemService.BESCHEID_ITEM_NAME)
+					.client(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME)
+					.item(itemMap)
+					.build();
+		}
+	}
+
+	@Nested
+	class TestGetConfig {
+
+		@Test
+		void shouldReturnBescheidManagerConfig() {
+			var config = bescheidServiceBlockingStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build());
+
+			assertThat(config.getVersion()).isNotEmpty();
+			assertThat(config.getJavaVersion()).isEqualTo(System.getProperty("java.version"));
+			assertThat(config.getFeatures().getCanCreateBescheidDocument()).isFalse();
+		}
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java
similarity index 66%
rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java
index a3e1fb0389b3612d212fa0678aedfd11ecf950e4..74dee37110b10e19d0dd9b0617f5b5e2c5c4dd3e 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java
@@ -25,17 +25,21 @@ package de.ozgcloud.bescheid;
 
 import java.time.ZonedDateTime;
 
-import lombok.Builder;
-import lombok.Getter;
+import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory;
 
-@Builder
-@Getter
-public class SentInfo {
+@Deprecated
+public class DeprecatedGrpcSentInfoTestFactory {
 
-	public static final String FIELD_SENT_BY = "sentBy";
-	public static final String FIELD_SENT_AT = "sentAt";
+	public static final String SENT_AT_STR = "2024-01-01T00:00:00Z";
+	public static final ZonedDateTime SENT_AT = ZonedDateTime.parse(SENT_AT_STR);
 
-	private String sentBy;
-	private ZonedDateTime sentAt;
+	public static GrpcSentInfo create() {
+		return createBuilder().build();
+	}
 
+	private static GrpcSentInfo.Builder createBuilder() {
+		return GrpcSentInfo.newBuilder()
+				.setSentAt(SENT_AT_STR)
+				.setSentBy(CallContextUserTestFactory.ID);
+	}
 }
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
index 95720de7ca399b35508f54d47da2550cb858dadd..b3d2b041d8f6141127c1902600cf3d0c4c47ed65 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
@@ -39,10 +39,10 @@ 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.document.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
@@ -95,15 +95,15 @@ class DocumentGrpcServiceITCase {
 	}
 
 	private String saveDocument() {
-		var document  = VorgangAttachedItemTestFactory.createBuilder()
+		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"))
+						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/bescheid/BescheidDocumentITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java
similarity index 94%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidDocumentITCase.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java
index 9a57cb6a5f7b082ba783569f1daf7c765b183d5c..cea527a2cb90329c75ba95f9d1a36affc7ff662f 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidDocumentITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid;
+package de.ozgcloud.document.bescheid;
 
-import static de.ozgcloud.bescheid.BescheidEventListener.*;
+import static de.ozgcloud.document.bescheid.BescheidEventListener.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
@@ -42,11 +42,11 @@ import org.springframework.boot.test.mock.mockito.SpyBean;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.annotation.DirtiesContext;
 
-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.ITCase;
+import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java
similarity index 92%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java
index b0526dd894a7583fd5c89e06e8fd05af4941d872..272675aedf6da371f91674d548adefbb3df7176c 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid;
+package de.ozgcloud.document.bescheid;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
@@ -38,13 +38,13 @@ 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.BescheidServiceGrpc.BescheidServiceBlockingStub;
-import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
-import de.ozgcloud.bescheid.common.user.UserProfile;
-import de.ozgcloud.bescheid.common.user.UserProfileService;
-import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.document.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
+import de.ozgcloud.document.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService;
+import de.ozgcloud.document.bescheid.common.user.UserProfile;
+import de.ozgcloud.document.bescheid.common.user.UserProfileService;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java
similarity index 97%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java
index 87fe08890aa9295fbda6a51d5a63f054845f907b..a376c15ff6b445389fec85a2e0c42e058d136174 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid;
+package de.ozgcloud.document.bescheid;
 
-import static de.ozgcloud.bescheid.BescheidEventListener.*;
+import static de.ozgcloud.document.bescheid.BescheidEventListener.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.awaitility.Awaitility.*;
 import static org.mockito.ArgumentMatchers.*;
@@ -59,11 +59,11 @@ import de.ozgcloud.apilib.user.OzgCloudUserProfile;
 import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandStatus;
-import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
 import de.ozgcloud.document.Document;
 import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.document.common.attached_item.AttachedItemService;
 import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachRemoteService;
@@ -87,6 +87,7 @@ import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 		"grpc.client.vorgang-manager.address=in-process:test",
 		"grpc.client.nachrichten-manager.address=in-process:test",
 		"grpc.client.command-manager.address=in-process:test",
+		"grpc.client.pluto.address=in-process:test",
 		"ozgcloud.feature.bescheid.enable-dummy-document-processor=true",
 })
 @DataITCase
@@ -118,7 +119,7 @@ class BescheidITCase {
 	void init() {
 		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
 		mongoOperations.dropCollection(Vorgang.COLLECTION_NAME);
-		when(postfachRemoteService.getPostfachType()).thenReturn("dummy");
+		when(postfachRemoteService.getPostfachType()).thenReturn(ServiceKontoTestFactory.TYPE);
 		when(userProfileService.getById(any())).thenReturn(OzgCloudUserProfile.builder().id(OzgCloudUserId.from(USER_ID)).build());
 	}
 
@@ -191,7 +192,7 @@ class BescheidITCase {
 		@Captor
 		private ArgumentCaptor<StatusChangedEvent> statusChangedEventCaptor;
 
-		private VorgangAttachedItem bescheidItem;;
+		private VorgangAttachedItem bescheidItem;
 		private String vorgangId;
 
 		@BeforeEach
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java
similarity index 97%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java
index e18330fe1fde5e1c0cff7d461ef3452e96054f27..626a3482f2b467872d5238d851582f91b4d70879 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid;
+package de.ozgcloud.document.bescheid;
 
 import java.time.ZonedDateTime;
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java
similarity index 97%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java
index 1968b51b907dede97a4580038ac49b352729283d..9267814b32ebf1dda948e57989fb958f3f5a00db 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid;
+package de.ozgcloud.document.bescheid;
 
 import org.springframework.context.event.EventListener;
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java
index 1488e8f8dd4f1baef4b2831081ccd6a078a6ef36..3424a6f908f5386f5c98f0fab87a926b5a6bf3d4 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java
@@ -24,6 +24,7 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.annotation.DirtiesContext;
 
+import de.ozgcloud.apilib.common.errorhandling.NotFoundException;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.common.test.TestUtils;
 import de.ozgcloud.nachrichten.postfach.PostfachAddress;
@@ -186,6 +187,58 @@ class AntragraumITCase {
 		}
 	}
 
+	@DisplayName("Ger rueckfrage")
+	@Nested
+	class TestGetRueckfrage {
+
+		@Mock
+		private StreamObserver<GrpcGetRueckfrageResponse> responseObserver;
+
+		@Captor
+		private ArgumentCaptor<GrpcGetRueckfrageResponse> captor;
+
+		private Vorgang savedVorgang;
+		private VorgangAttachedItem vorgangAttachedItem;
+
+		@BeforeEach
+		void prepareDatabase() {
+			savedVorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build(), Vorgang.COLLECTION_NAME);
+			vorgangAttachedItem = mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(savedVorgang.getId()),
+					VorgangAttachedItem.COLLECTION_NAME);
+
+			when(verifier.verify(any())).thenReturn(Collections.emptyList());
+			when(decrypter.decryptTrustLevel(any())).thenReturn("STORK-QAA-Level-1");
+		}
+
+		@Test
+		void shouldReturnOnMatchingPostfachId() {
+			when(decrypter.decryptPostfachId(any())).thenReturn(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+			var request = GrpcGetRueckfrageRequestTestFactory.createBuilder()
+					.setId(vorgangAttachedItem.getId())
+					.setSamlToken(TestUtils.loadTextFile("SamlResponse.xml"))
+					.build();
+
+			grpcService.getRueckfrage(request, responseObserver);
+
+			verify(responseObserver, timeout(30000)).onNext(captor.capture());
+			assertThat(captor.getValue().getRueckfrage()).isNotNull();
+		}
+
+		@Test
+		void shouldThrowExceptionOnMismatchingPostfachId() {
+			when(decrypter.decryptPostfachId(any())).thenReturn("not-match-postfach-id");
+
+			var request = GrpcGetRueckfrageRequestTestFactory.createBuilder()
+					.setId(vorgangAttachedItem.getId())
+					.setSamlToken(TestUtils.loadTextFile("SamlResponse.xml"))
+					.build();
+			assertThatThrownBy(() -> grpcService.getRueckfrage(request, responseObserver))
+					.isInstanceOf(NotFoundException.class)
+					.hasMessageContaining("PostfachNachricht")
+					.hasMessageContaining(vorgangAttachedItem.getId());
+		}
+	}
+
 	private Vorgang createVorgang(TrustLevel trustLevel) {
 		return VorgangTestFactory.createBuilder()
 				.id(null)
@@ -214,12 +267,11 @@ class AntragraumITCase {
 		nachrichtItem.put(PostfachNachricht.FIELD_DIRECTION, DIRECTION.OUT.name());
 		nachrichtItem.put(PostfachNachricht.FIELD_REPLY_OPTION, ReplyOption.POSSIBLE);
 		nachrichtItem.put(PostfachNachricht.FIELD_VORGANG_ID, vorgangId);
-		nachrichtItem.put(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
 		nachrichtItem.put(PostfachNachricht.POSTFACH_ADDRESS_FIELD, Map.of(
 				PostfachAddress.TYPE_FIELD, 0,
 				PostfachAddress.VERSION_FIELD, 1,
 				PostfachAddress.IDENTIFIER_FIELD,
-				Map.of(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE),
+				Map.of(PostfachAddress.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE),
 				PostfachAddress.SERVICEKONTO_TYPE_FIELD, "BAYERN_ID"));
 		return nachrichtItem;
 	}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
index 566a427a59914c63bce1077851710e205be84baa..c609c9f7e9df3ea1e1ff757b819d6dcce45169a7 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java
@@ -48,6 +48,7 @@ import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEvent;
 import de.ozgcloud.command.VorgangAttachedItemCreatedEvent;
 import de.ozgcloud.common.test.ITCase;
+import de.ozgcloud.notification.user.UserNotificationEventListener;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
 import de.ozgcloud.vorgang.command.CommandService;
@@ -74,6 +75,9 @@ class PostfachEventListenerITCase {
 	@MockBean
 	private CommandService commandService;
 
+	@MockBean
+	private UserNotificationEventListener userNotificationEventListener;
+
 	@Nested
 	class TestSendPostfachNachricht {
 
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 8c657211a40fd0c72b8e13aeff1de606304a4601..45c4d3a7ddba762f9f86c7571ed3755b29848c86 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
@@ -56,29 +56,32 @@ import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
 
 import de.ozgcloud.common.test.DataITCase;
-import de.ozgcloud.nachrichten.attributes.ClientAttributeService;
+import de.ozgcloud.nachrichten.common.grpc.NachrichtenCallContextAttachingInterceptor;
 import de.ozgcloud.nachrichten.postfach.osi.MessageAttachmentTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.MessageJsonReplyTestFactory;
-import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.OsiPostfachProperties;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.clientattribute.ClientAttribute;
+import de.ozgcloud.vorgang.clientattribute.ClientAttributeMap;
 import de.ozgcloud.vorgang.command.CommandService;
 import de.ozgcloud.vorgang.common.security.PolicyService;
 import de.ozgcloud.vorgang.files.FileId;
 import de.ozgcloud.vorgang.files.FileService;
 import de.ozgcloud.vorgang.files.OzgFile;
+import de.ozgcloud.vorgang.vorgang.Vorgang;
+import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import io.grpc.stub.StreamObserver;
 
 @SpringBootTest(classes = { VorgangManagerServerApplication.class, OsiPostfachProperties.class }, properties = {
 		"grpc.server.in-process-name=postfachitcase",
+		"grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase",
+		"grpc.client.command-manager.address=in-process:postfachitcase",
+		"grpc.client.pluto.address=in-process:postfachitcase",
 		"ozgcloud.osi.postfach.proxyapi.url=http://localhost/ApiProxy/V1/Message",
 		"ozgcloud.osi.postfach.proxyapi.key=1234",
 		"ozgcloud.osi.postfach.proxyapi.realm=test-realm",
 		"ozgcloud.osi.postfach.notification.mail-from=test@local.host",
-		"grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase",
-		"grpc.client.command-manager.address=in-process:postfachitcase",
-
 })
 @WithMockUser
 @DataITCase
@@ -94,6 +97,9 @@ class PostfachMailITCase {
 	private MongoOperations mongoOperations;
 	@Autowired
 	private RestTemplate restTemplate;
+	@Autowired
+	private FileService fileService;
+
 	@MockBean
 	private PolicyService policyService;
 
@@ -102,17 +108,19 @@ class PostfachMailITCase {
 	@Captor
 	private ArgumentCaptor<GrpcFindPostfachMailsResponse> responseCaptor;
 
-	@MockBean
-	private ClientAttributeService clientAttributeService;
-
 	@SpyBean
 	private CommandService commandService;
 	private MockRestServiceServer mockServer;
 
+	private Vorgang vorgang;
+
 	@BeforeEach
 	void prepareDatabase() {
+		mongoOperations.dropCollection(Vorgang.COLLECTION_NAME);
 		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+		vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build());
 
+		doNothing().when(policyService).checkPermission(anySet());
 		when(policyService.hasOrganisationEinheitenId(any())).thenReturn(true);
 		when(policyService.hasOrganisationEinheitenIdByVorgangAttachedItem(any())).thenReturn(true);
 	}
@@ -122,6 +130,14 @@ class PostfachMailITCase {
 		mockServer = MockRestServiceServer.createServer(restTemplate);
 	}
 
+	private List<GrpcPostfachMail> callGrpcListEndpoint() {
+		grpcService.findPostfachMails(GrpcFindPostfachMailsRequest.newBuilder().setVorgangId(vorgang.getId()).build(),
+				responseObserver);
+
+		verify(responseObserver, atLeastOnce()).onNext(responseCaptor.capture());
+		return responseCaptor.getValue().getMailsList();
+	}
+
 	@Nested
 	class TestSendingMail {
 
@@ -151,14 +167,66 @@ class PostfachMailITCase {
 				var mails = await().atMost(60, TimeUnit.SECONDS)
 						.until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement);
 
-				assertThat(mails.get(0).getCreatedAt()).isNotNull();
-				assertThat(mails.get(0).getDirection()).isEqualTo(GrpcDirection.OUT);
-				assertThat(mails.get(0).getSentAt()).isNotNull();
-				assertThat(ZonedDateTime.parse(mails.get(0).getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS));
-				assertThat(mails.get(0).getSentSuccessful()).isTrue();
+				assertThat(mails).hasSize(1).first().satisfies(mail -> {
+					assertThat(mail.getCreatedAt()).isNotNull();
+					assertThat(mail.getDirection()).isEqualTo(GrpcDirection.OUT);
+					assertThat(mail.getSentAt()).isNotNull();
+					assertThat(ZonedDateTime.parse(mail.getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS));
+					assertThat(mail.getSentSuccessful()).isTrue();
+
+				});
 			}
 		}
 
+		@Test
+		void shouldSetHasNachrichtAttribute() {
+			mockServerSendSuccess();
+
+			callGrpcEndpoint();
+			await().atMost(60, TimeUnit.SECONDS)
+					.until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement);
+
+			assertThat(getHasNachrichtAttribute().getBoolValue()).hasValue(true);
+		}
+
+		private void mockServerSendFailed() {
+			mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
+					.andExpect(method(HttpMethod.POST))
+					.andRespond(withSuccess("false", MediaType.APPLICATION_JSON));
+		}
+
+		private void mockServerSendSuccess() {
+			mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
+					.andExpect(method(HttpMethod.POST))
+					.andRespond(withSuccess());
+		}
+
+		private void callGrpcEndpoint() {
+			callGrpcEndpoint("OSI");
+		}
+
+		private void callResendGrpcEndpoint(String mailId) {
+			grpcService.resendPostfachMail(GrpcResendPostfachMailRequestTestFactory.createBuilder().setPostfachMailId(mailId).build(),
+					resendResponseObserver);
+		}
+
+		private void callGrpcEndpoint(String postfachType) {
+			grpcService.sendPostfachMail(buildSendPostfachMailRequestWithoutAttachments(postfachType), responseObserver);
+		}
+
+		private GrpcSendPostfachMailRequest buildSendPostfachMailRequestWithoutAttachments(String postfachType) {
+			var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection()
+					.setPostfachAddress(GrpcPostfachAddressTestFactory.createBuilder().setServiceKontoType(postfachType).build())
+					.setVorgangId(vorgang.getId()).build();
+			return GrpcSendPostfachMailRequestTestFactory.createBuilder().setMail(grpcPostfachMail).build();
+		}
+
+		private ClientAttribute getHasNachrichtAttribute() {
+			return mongoOperations.findById(vorgang.getId(), Vorgang.class).getClientAttributes()
+					.getOrDefault(NachrichtenCallContextAttachingInterceptor.NACHRICHTEN_MANAGER_CLIENT_NAME, new ClientAttributeMap())
+					.getOrDefault("hasPostfachNachricht", ClientAttribute.builder().build());
+		}
+
 		@Nested
 		class TestSendingFailed {
 
@@ -174,13 +242,14 @@ class PostfachMailITCase {
 
 				callGrpcEndpoint();
 
-				await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
-					assertThat(callGrpcListEndpoint()).hasSize(1).first().satisfies(mail -> {
-						assertThat(mail.getSentAt()).isNotNull();
-						assertThat(ZonedDateTime.parse(mail.getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS));
-						assertThat(mail.getSentSuccessful()).isFalse();
-					});
-				});
+				await().atMost(60, TimeUnit.SECONDS).untilAsserted(() ->
+						assertThat(callGrpcListEndpoint()).hasSize(1).first().satisfies(postfachNachricht -> {
+							assertThat(postfachNachricht.getSentAt()).isNotNull();
+							assertThat(ZonedDateTime.parse(postfachNachricht.getSentAt())).isCloseTo(ZonedDateTime.now(),
+									within(61, ChronoUnit.SECONDS));
+							assertThat(postfachNachricht.getSentSuccessful()).isFalse();
+						})
+				);
 			}
 
 			@Test
@@ -191,9 +260,8 @@ class PostfachMailITCase {
 
 				var mails = await().atMost(60, TimeUnit.SECONDS)
 						.until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement);
-				var mailId = mails.get(0).getId();
 
-				callResendGrpcEndpoint(mailId);
+				callResendGrpcEndpoint(mails.getFirst().getId());
 				await().atMost(60, TimeUnit.SECONDS).untilAsserted(
 						() -> assertThat(callGrpcListEndpoint()).hasSize(1).first().extracting(GrpcPostfachMail::getSentSuccessful).isEqualTo(true));
 			}
@@ -206,42 +274,18 @@ class PostfachMailITCase {
 				callGrpcEndpoint();
 				var mails = await().atMost(60, TimeUnit.SECONDS)
 						.until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement);
-				var mailId = mails.get(0).getId();
+				assertThat(mails).hasSize(1);
 
-				callResendGrpcEndpoint(mailId);
+				callResendGrpcEndpoint(mails.getFirst().getId());
 
 				mails = callGrpcListEndpoint();
-				assertThat(mails.get(0).getSentSuccessful()).isFalse();
-				assertThat(mails.get(0).getMessageCode()).isEqualTo(PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE.getMessageCode());
+				assertThat(mails).hasSize(1).first().satisfies(mail -> {
+					assertThat(mail.getSentSuccessful()).isFalse();
+					assertThat(mail.getMessageCode()).isEqualTo(PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE.getMessageCode());
+				});
 			}
 		}
 
-		private void mockServerSendFailed() {
-			mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
-					.andExpect(method(HttpMethod.POST))
-					.andRespond(withSuccess("false", MediaType.APPLICATION_JSON));
-		}
-
-		private void mockServerSendSuccess() {
-			mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
-					.andExpect(method(HttpMethod.POST))
-					.andRespond(withSuccess());
-		}
-
-		private void callGrpcEndpoint() {
-			grpcService.sendPostfachMail(buildSendPostfachMailRequestWithoutAttachments(), responseObserver);
-		}
-
-		private GrpcSendPostfachMailRequest buildSendPostfachMailRequestWithoutAttachments() {
-			var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection()
-					.setVorgangId(MessageTestFactory.VORGANG_ID).build();
-			return GrpcSendPostfachMailRequestTestFactory.createBuilder().setMail(grpcPostfachMail).build();
-		}
-
-		private void callResendGrpcEndpoint(String mailId) {
-			grpcService.resendPostfachMail(GrpcResendPostfachMailRequestTestFactory.createBuilder().setPostfachMailId(mailId).build(),
-					resendResponseObserver);
-		}
 	}
 
 	@Nested
@@ -250,37 +294,26 @@ class PostfachMailITCase {
 		@Autowired
 		private PostfachService service;
 
-		private void mockServerReceiveReply(String replyJson) {
-			mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
-					.andExpect(method(HttpMethod.GET))
-					.andRespond(withSuccess(replyJson, MediaType.APPLICATION_JSON));
-
-			mockServer.expect(ExpectedCount.once(), method(HttpMethod.DELETE)).andRespond(withSuccess());
-		}
-
 		@Nested
 		class TestFetchAndListReply {
 
-			@Autowired
-			private FileService fileService;
-
 			@Test
 			void shouldListNachrichten() {
-				mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson());
+				mockServerReceiveReply();
 
 				fetchAndPersistReplies();
 
 				var mails = callGrpcListEndpoint();
-				assertThat(mails).hasSize(1);
-				assertThat(mails.get(0).getCreatedAt()).isNotNull();
-				assertThat(mails.get(0).getDirection()).isEqualTo(GrpcDirection.IN);
-
+				assertThat(mails).hasSize(1).first().satisfies(mail -> {
+					assertThat(mail.getCreatedAt()).isNotNull();
+					assertThat(mail.getDirection()).isEqualTo(GrpcDirection.IN);
+				});
 				mockServer.verify();
 			}
 
 			@Test
 			void shouldContainAttachment() {
-				mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson());
+				mockServerReceiveReply();
 
 				fetchAndPersistReplies();
 
@@ -291,16 +324,39 @@ class PostfachMailITCase {
 
 			@Test
 			void shouldHaveContentTypeDOCX() {
-				var attachment = MessageAttachmentTestFactory.createBuilder().fileName("wort-datei.docx").build();
-				mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson(MessageTestFactory.create(), attachment));
+				var messageJsonReply = MessageJsonReplyTestFactory.createBuilder().vorgangId(vorgang.getId()).clearAttachments()
+						.attachment(MessageAttachmentTestFactory.createBuilder().fileName("wort-datei.docx").build())
+						.build();
+				mockServerReceiveReply(messageJsonReply);
 
 				fetchAndPersistReplies();
 
 				var mails = callGrpcListEndpoint();
 				assertThat(mails).hasSize(1);
-				var binaryFile = fileService.findFilesMetaData(List.of(FileId.from(mails.get(0).getAttachmentList().get(0)))).findFirst()
-						.orElse(OzgFile.builder().build());
-				assertThat(binaryFile.getContentType()).isEqualTo("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+				var binaryFiles = loadAttachments(mails.getFirst());
+				assertThat(binaryFiles).hasSize(1).first().extracting(OzgFile::getContentType)
+						.isEqualTo("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+			}
+
+			@Test
+			void shouldSetHasNewPostfachNachricht() {
+				mockServerReceiveReply();
+
+				fetchAndPersistReplies();
+
+				assertThat(getHasNewNachrichtAttribute().getBoolValue()).hasValue(true);
+			}
+
+			private void mockServerReceiveReply() {
+				mockServerReceiveReply(MessageJsonReplyTestFactory.createBuilder().vorgangId(vorgang.getId()).build());
+			}
+
+			private void mockServerReceiveReply(String replyJson) {
+				mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI))
+						.andExpect(method(HttpMethod.GET))
+						.andRespond(withSuccess(replyJson, MediaType.APPLICATION_JSON));
+
+				mockServer.expect(ExpectedCount.once(), method(HttpMethod.DELETE)).andRespond(withSuccess());
 			}
 
 			private void fetchAndPersistReplies() {
@@ -308,16 +364,19 @@ class PostfachMailITCase {
 
 				verify(commandService, timeout(60000)).setCommandFinished(any(), any());
 			}
-		}
 
-	}
+			private List<OzgFile> loadAttachments(GrpcPostfachMail mail) {
+				assertThat(mail.getAttachmentList()).hasSize(1);
+				return fileService.findFilesMetaData((mail.getAttachmentList().stream().map(FileId::from).toList())).toList();
+			}
 
-	private List<GrpcPostfachMail> callGrpcListEndpoint() {
-		grpcService.findPostfachMails(GrpcFindPostfachMailsRequest.newBuilder().setVorgangId(MessageTestFactory.VORGANG_ID).build(),
-				responseObserver);
+			private ClientAttribute getHasNewNachrichtAttribute() {
+				return mongoOperations.findById(vorgang.getId(), Vorgang.class).getClientAttributes()
+						.get(NachrichtenCallContextAttachingInterceptor.NACHRICHTEN_MANAGER_CLIENT_NAME)
+						.get("hasNewPostfachNachricht");
+			}
+		}
 
-		verify(responseObserver, atLeastOnce()).onNext(responseCaptor.capture());
-		return responseCaptor.getValue().getMailsList();
 	}
 
 	private boolean hasAtLeastOneElement(Collection<GrpcPostfachMail> mails) {
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java
similarity index 81%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java
index 6a6c7dacd4c1b5dae5e83912b382e5155d2b603d..7e63f3d048e74019c36a4c49b2f546462979c077 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java
@@ -34,8 +34,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import de.ozgcloud.common.test.ITCase;
+import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifier;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 
 @Disabled("Echter Test für OSI Postfach mit echtem Zugriff. Unbedingt defaultmäßig deaktivieren!!")
@@ -48,13 +50,13 @@ import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 				"ozgcloud.osi.postfach.scheduler.enabled=false"
 		})
 @ITCase
-class OsiPostfachApiTestCase {
+class OsiPostfachITCase {
 
 	@Autowired
 	private OsiPostfachRemoteService service;
 
 	@Test
-	void testGetAllMessages() {
+	void shouldGetAllMessages() {
 		Stream<PostfachNachricht> messages = service.getAllMessages();
 
 		assertThat(messages).hasSizeGreaterThan(0);
@@ -62,13 +64,16 @@ class OsiPostfachApiTestCase {
 
 	@Test
 	@Disabled("Echter Test für OSI Postfach mit echtem Zugriff. Unbedingt defaultmäßig deaktivieren!!")
-	void testSendMessage() {
+	void shouldSendMessage() {
 
 		PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder()
-				.postfachId("2f5c78f8-4891-456f-269b-08d937ab9a72").vorgangId("98877665544").build();
+				.postfachAddress(PostfachAddressTestFactory.createBuilder()
+						.serviceKontoType(OsiPostfachRemoteService.POSTFACH_TYPE)
+						.identifier(StringBasedIdentifier.builder().postfachId("2f5c78f8-4891-456f-269b-08d937ab9a72").build())
+						.build()
+				)
+				.vorgangId("98877665544").build();
 
-		assertDoesNotThrow(() -> {
-			service.sendMessage(nachricht);
-		});
+		assertDoesNotThrow(() -> service.sendMessage(nachricht));
 	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
index cfaf9ff74c00daa0d1405a656fb898ce181a0256..ef465103f6ad9e81c6a4741bd581d40179b1d6aa 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java
@@ -289,7 +289,8 @@ class VorgangAttachedItemITCase {
 		private Command createRevokeCommand() {
 			return CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name())
 					.relationId(persistedItem.getId())
-					.relationVersion(persistedItem.getVersion())
+					.relationVersion(persistedItem.getVersion() - 1)
+					.createdResource(persistedItem.getId())
 					.bodyObject(VorgangAttachedItemTestFactory.asMap()).build();
 		}
 	}
@@ -298,11 +299,11 @@ class VorgangAttachedItemITCase {
 	@Nested
 	class TestRevokeUpdateItem {
 
-		private final Map<String, Object> createItem = Map.<String, Object>of("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue",
+		private final Map<String, Object> createItem = Map.of("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue",
 				VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
 		private VorgangAttachedItem persistedItem;
 
-		private final Map<String, Object> updateItem = Map.<String, Object>of(
+		private final Map<String, Object> updateItem = Map.of(
 				VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "RevertByRevokeValue",
 				"NewToRemoveByRevokeKey", "NewToRemoveByRevokeValue");
 		private Command updatedCommand;
@@ -391,11 +392,11 @@ class VorgangAttachedItemITCase {
 	@Nested
 	class TestRevokePatchItem {
 
-		private final Map<String, Object> createItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
+		private final Map<String, Object> createItem = Map.of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME,
 				VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE);
 		private VorgangAttachedItem persistedItem;
 
-		private final Map<String, Object> patchItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue");
+		private final Map<String, Object> patchItem = Map.of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue");
 		private Command patchedCommand;
 		private String vorgangId;
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
index fcb9657c560845ce3a0b4e61cf3a7d003585db08..7447aa18488ebd0ed7406989214afbda377580da 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java
@@ -516,7 +516,7 @@ class VorgangAttachedItemServiceTest {
 	@Nested
 	class TestRevokeCreate {
 
-		private final Command command = CommandTestFactory.create();
+		private final Command command = CommandTestFactory.createBuilder().createdResource(CommandTestFactory.CREATED_RESOURCE).build();
 
 		@Test
 		void shouldCallHandleRevoke() {
@@ -529,7 +529,7 @@ class VorgangAttachedItemServiceTest {
 		void shouldCallDelete() {
 			service.revokeCreate(command);
 
-			verify(service).delete(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION);
+			verify(service).delete(CommandTestFactory.CREATED_RESOURCE, CommandTestFactory.RELATION_VERSION + 1);
 		}
 	}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
index 32db2a67bebf61625a2e5eea835a61eaa5c87665..2a9d8659032b1ea7aa719ebab32e5f1570c3d361 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
@@ -34,13 +34,17 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import org.bson.types.ObjectId;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 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.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -52,16 +56,27 @@ import org.springframework.data.mongodb.gridfs.GridFsTemplate;
 import org.springframework.test.annotation.DirtiesContext;
 
 import com.google.protobuf.ByteString;
+import com.thedeanda.lorem.LoremIpsum;
 
 import de.ozgcloud.apilib.user.OzgCloudUserId;
 import de.ozgcloud.apilib.user.OzgCloudUserProfile;
 import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
+import de.ozgcloud.collaboration.CollaborationRequest;
 import de.ozgcloud.collaboration.CollaborationServiceGrpc.CollaborationServiceBlockingStub;
 import de.ozgcloud.collaboration.GrpcGetFileContentRequest;
+import de.ozgcloud.collaboration.request.CollaborationRequestId;
+import de.ozgcloud.collaboration.request.CollaborationRequestServiceGrpc.CollaborationRequestServiceBlockingStub;
+import de.ozgcloud.collaboration.request.GrpcFindRequestsRequest;
+import de.ozgcloud.collaboration.request.GrpcGetRequestRequest;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandStatus;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.nachrichten.postfach.PostfachAddress;
+import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
+import de.ozgcloud.nachrichten.postfach.PostfachRemoteService;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
 import de.ozgcloud.vorgang.callcontext.CallContext;
 import de.ozgcloud.vorgang.callcontext.TestCallContextAttachingInterceptor;
 import de.ozgcloud.vorgang.callcontext.WithMockCustomUser;
@@ -71,10 +86,15 @@ import de.ozgcloud.vorgang.command.CreateCommandRequest;
 import de.ozgcloud.vorgang.files.FileService;
 import de.ozgcloud.vorgang.files.GridFsTestFactory;
 import de.ozgcloud.vorgang.files.OzgFileTestFactory;
+import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory;
+import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory;
+import de.ozgcloud.vorgang.vorgang.EingangTestFactory;
 import de.ozgcloud.vorgang.vorgang.Vorgang;
 import de.ozgcloud.vorgang.vorgang.VorgangHead;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory;
+import io.grpc.Status;
+import io.grpc.StatusRuntimeException;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @SpringBootTest(properties = {
@@ -82,13 +102,19 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
 		"grpc.client.vorgang-manager.address=in-process:test",
 		"grpc.client.ozgcloud-command-manager.address=in-process:test",
 		"grpc.client.file-manager.address=in-process:test",
-		"grpc.client.inProcess.address=in-process:test"
+		"grpc.client.vorgang-attached-item.address=in-process:test",
+		"grpc.client.inProcess.address=in-process:test",
+		"grpc.client.pluto.address=in-process:test"
 })
 @DataITCase
 @WithMockCustomUser
 @DirtiesContext
 class CollaborationITCase {
 
+	private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId";
+	private static final String TITEL = "Collaboration Vorgang";
+	private static final String BESCHREIBUNG = "Beschreibung der Anfrage";
+
 	@Autowired
 	private CommandService commandService;
 
@@ -97,85 +123,22 @@ class CollaborationITCase {
 
 	@MockBean
 	private OzgCloudUserProfileService ozgCloudUserProfileService;
+	@MockBean
+	private PostfachRemoteService postfachRemoteService;
 
 	@Mock
 	private OzgCloudUserProfile ozgCloudUserProfile;
 
-	@Nested
-	class TestCreateCollaborationVorgang {
-
-		@BeforeEach
-		void init() {
-			mongoOperations.dropCollection(Command.class);
-			mongoOperations.dropCollection(Vorgang.class);
-			mongoOperations.dropCollection(VorgangAttachedItem.class);
-			when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY));
-			when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile);
+	private String vorgangId;
 
-			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId();
-		}
-
-		private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId";
-		private static final String TITEL = "Collaboration Vorgang";
-		private static final String ANFRAGE = "Anfrage";
-
-		private String vorgangId;
-
-		@Test
-		void shouldSetCollaborationVorgangId() {
-			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId));
-
-			waitUntilCommandFinished(command.getId());
-
-			var collaborationRequests = loadCollaborationRequest(vorgangId);
-			assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP)
-					.containsKey(FIELD_COLLABORATION_VORGANG_ID);
-		}
-
-		@Test
-		void shouldCreateCollaborationVorgang() {
-			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId));
-
-			waitUntilCommandFinished(command.getId());
-
-			var collaborationVorgang = loadCollaborationVorgang(vorgangId);
-			assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getCollaborationLevel)
-					.isEqualTo(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL);
-			assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getOrganisationsEinheitId)
-					.isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID);
-			assertThat(collaborationVorgang.getClientAttributes()).isEmpty();
-		}
-
-		private CreateCommandRequest buildCreateCollaborationVorgangCommand(String vorgangId) {
-			return CreateCommandRequest.builder()
-					.callContext(CallContext.builder().client("test").build())
-					.vorgangId(vorgangId)
-					.relationId(vorgangId)
-					.order("CREATE_COLLABORATION_REQUEST")
-					.bodyObject(Map.of(
-							"titel", TITEL,
-							"anfrage", ANFRAGE,
-							"zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID))
-					.build();
-		}
-
-		private void waitUntilCommandFinished(String commandId) {
-			await().atMost(60, TimeUnit.SECONDS).until(
-					() -> mongoOperations.findById(commandId, Command.class),
-					command -> command.getStatus() == CommandStatus.FINISHED);
-		}
+	@BeforeEach
+	void init() {
+		when(postfachRemoteService.getPostfachType()).thenReturn(ServiceKontoTestFactory.TYPE);
+		mongoOperations.dropCollection(Command.class);
+		mongoOperations.dropCollection(Vorgang.class);
+		mongoOperations.dropCollection(VorgangAttachedItem.class);
 
-		private Vorgang loadCollaborationVorgang(String sourceVorgangId) {
-			var collaborationVorgangId = loadCollaborationRequest(sourceVorgangId).getFirst().getItem().get(FIELD_COLLABORATION_VORGANG_ID);
-			return mongoOperations.findById(collaborationVorgangId, Vorgang.class);
-		}
-
-		private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) {
-			var query = new Query(new Criteria().andOperator(
-					Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId),
-					Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest")));
-			return mongoOperations.find(query, VorgangAttachedItem.class);
-		}
+		vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId();
 	}
 
 	@DisplayName("Get file content")
@@ -226,7 +189,7 @@ class CollaborationITCase {
 		private byte[] downloadBinaryFile(ObjectId fileId) {
 			var request = GrpcGetFileContentRequest.newBuilder()
 					.setId(fileId.toHexString()).build();
-			var it = prepareBinaryFileServiceBlockingStub().getFileContent(request);
+			var it = getServiceStub().getFileContent(request);
 			var content = new ByteArrayOutputStream();
 			while (it.hasNext()) {
 				ByteString chunkContent = it.next().getFileContent();
@@ -240,8 +203,247 @@ class CollaborationITCase {
 			return content.toByteArray();
 		}
 
-		private CollaborationServiceBlockingStub prepareBinaryFileServiceBlockingStub() {
+		private CollaborationServiceBlockingStub getServiceStub() {
 			return collaborationStub.withInterceptors(new TestCallContextAttachingInterceptor());
 		}
 	}
+
+	private CreateCommandRequest buildCreateCollaborationVorgangCommand(String vorgangId, int collaborationLevel) {
+		return CreateCommandRequest.builder()
+				.callContext(CallContext.builder().client("test").build())
+				.vorgangId(vorgangId)
+				.relationId(vorgangId)
+				.order("CREATE_COLLABORATION_REQUEST")
+				.bodyObject(Map.of(
+						"titel", TITEL,
+						"beschreibung", BESCHREIBUNG,
+						"collaborationLevel", collaborationLevel,
+						"zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID))
+				.build();
+	}
+
+	private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) {
+		var query = new Query(new Criteria().andOperator(
+				Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId),
+				Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest")));
+		return mongoOperations.find(query, VorgangAttachedItem.class);
+	}
+
+	private void waitUntilCommandHasStatus(String commandId, CommandStatus status) {
+		await().atMost(600, TimeUnit.SECONDS).until(
+				() -> mongoOperations.findById(commandId, Command.class),
+				command -> command.getStatus() == status);
+	}
+
+	@Nested
+	class TestCreateCollaborationVorgang {
+
+		@BeforeEach
+		void init() {
+			when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY));
+			when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile);
+		}
+
+		@Test
+		void shouldSetCollaborationVorgangId() {
+			var command = commandService.createCommand(
+					buildCreateCollaborationVorgangCommand(vorgangId, CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL));
+
+			waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED);
+
+			var collaborationRequests = loadCollaborationRequest(vorgangId);
+			assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP)
+					.containsKey(FIELD_COLLABORATION_VORGANG_ID);
+		}
+
+		@Test
+		void shouldCreateCollaborationVorgang() {
+			var command = commandService.createCommand(
+					buildCreateCollaborationVorgangCommand(vorgangId, CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL));
+
+			waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED);
+
+			var collaborationVorgang = loadCollaborationVorgang(vorgangId);
+			assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getCollaborationLevel)
+					.isEqualTo(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL);
+			assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getOrganisationsEinheitId)
+					.isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID);
+			assertThat(collaborationVorgang.getClientAttributes()).isEmpty();
+		}
+
+		private Vorgang loadCollaborationVorgang(String sourceVorgangId) {
+			var collaborationVorgangId = loadCollaborationRequest(sourceVorgangId).getFirst().getItem().get(FIELD_COLLABORATION_VORGANG_ID);
+			return mongoOperations.findById(collaborationVorgangId, Vorgang.class);
+		}
+
+	}
+
+	@Nested
+	class TestCreateFachstellenBeteiligungRequest {
+
+		private static final int COLLABORATION_LEVEL = 4;
+
+		@Captor
+		private ArgumentCaptor<PostfachNachricht> postfachNachrichtCaptor;
+
+		@BeforeEach
+		void init() {
+			when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY));
+			when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile);
+		}
+
+		@Test
+		void shouldCreateCollaborationRequest() {
+			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL));
+
+			waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED);
+
+			var collaborationRequests = loadCollaborationRequest(vorgangId);
+			assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP)
+					.containsEntry(FIELD_COLLABORATION_VORGANG_ID, vorgangId);
+		}
+
+		@Test
+		void shouldSendPostfachNachricht() {
+			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL));
+
+			waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED);
+
+			verify(postfachRemoteService).sendMessage(postfachNachrichtCaptor.capture());
+			assertThat(postfachNachrichtCaptor.getValue().getPostfachAddress()).extracting(PostfachAddress::getIdentifier)
+					.hasToString(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+		}
+
+		@Test
+		void shouldDeleteCollaborationRequest() {
+			doThrow(TechnicalException.class).when(postfachRemoteService).sendMessage(any());
+			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL));
+
+			waitUntilCommandHasStatus(command.getId(), CommandStatus.ERROR);
+
+			assertThat(loadCollaborationRequest(vorgangId)).isEmpty();
+		}
+	}
+
+	@DisplayName("Collaboration requests")
+	@Nested
+	class TestCollaborationRequests {
+
+		@GrpcClient("inProcess")
+		private CollaborationRequestServiceBlockingStub collaborationRequestStub;
+
+		public static final String ID_STR = UUID.randomUUID().toString();
+		public static final CollaborationRequestId ID = CollaborationRequestId.from(ID_STR);
+
+		public static final String TITEL = LoremIpsum.getInstance().getWords(5);
+		public static final String BESCHREIBUNG = LoremIpsum.getInstance().getWords(10);
+		public static final String ZUSTAENDIGE_STELLE = UUID.randomUUID().toString();
+		public static final String COLLABORATION_VORGANG_ID = UUID.randomUUID().toString();
+		public static final int COLLABORATION_lEVEL = 1;
+
+		private final Vorgang vorgang = VorgangTestFactory.create();
+
+		private final Map<String, Object> collaborationRequestItem = Map.of(CollaborationRequest.PROPERTY_ID, ID_STR,
+				CollaborationRequest.PROPERTY_COMMAND_ID, CommandTestFactory.ID,
+				CollaborationRequest.PROPERTY_VORGANG_ID, VorgangTestFactory.ID,
+				CollaborationRequest.PROPERTY_COLLABORATION_VORGANG_ID, COLLABORATION_VORGANG_ID,
+				CollaborationRequest.PROPERTY_COLLABORATION_LEVEL, String.valueOf(COLLABORATION_lEVEL),
+				CollaborationRequest.PROPERTY_CREATED_BY, CommandTestFactory.CREATED_BY,
+				CollaborationRequest.PROPERTY_TITEL, TITEL,
+				CollaborationRequest.PROPERTY_BESCHREIBUNG, BESCHREIBUNG,
+				CollaborationRequest.PROPERTY_ZUSTAENDIGE_STELLE, ZUSTAENDIGE_STELLE);
+
+		private final VorgangAttachedItem vorgangAttachedItem = VorgangAttachedItemTestFactory.createBuilder()
+				.id(null)
+				.vorgangId(VorgangTestFactory.ID)
+				.version(0)
+				.client("AlfaTestClient")
+				.itemName("CollaborationRequest")
+				.deleted(false)
+				.item(collaborationRequestItem)
+				.build();
+
+		private VorgangAttachedItem savedCollaborationRequest;
+
+		@BeforeEach
+		void init() {
+			mongoOperations.save(vorgang);
+			savedCollaborationRequest = mongoOperations.save(vorgangAttachedItem);
+		}
+
+		@DisplayName("Get Request")
+		@Nested
+		class TestGetRequest {
+
+			@Test
+			void shouldReturnNotFoundExceptionOnNonExisting() {
+				var id = UUID.randomUUID().toString();
+				var request = GrpcGetRequestRequest.newBuilder().setId(id).build();
+				var serviceStub = getServiceStub();
+
+				assertThatThrownBy(() -> serviceStub.getRequest(request))
+						.isInstanceOf(StatusRuntimeException.class)
+						.hasMessageContaining("NOT_FOUND")
+						.hasMessageContaining(id);
+			}
+
+			@Test
+			void shouldReturnExistingCollaborationRequest() {
+				var response = getServiceStub().getRequest(GrpcGetRequestRequest.newBuilder().setId(savedCollaborationRequest.getId()).build());
+
+				assertThat(response.getRequest()).satisfies(grpcCollaborationRequest -> {
+					assertThat(grpcCollaborationRequest.getId()).isEqualTo(savedCollaborationRequest.getId());
+					assertThat(grpcCollaborationRequest.getTitel()).isEqualTo(TITEL);
+					assertThat(grpcCollaborationRequest.getBeschreibung()).isEqualTo(BESCHREIBUNG);
+					assertThat(grpcCollaborationRequest.getZustaendigeStelle()).isEqualTo(ZUSTAENDIGE_STELLE);
+					assertThat(grpcCollaborationRequest.getCollaborationLevel()).isEqualTo(COLLABORATION_lEVEL);
+					assertThat(grpcCollaborationRequest.getCreatedBy()).isEqualTo(CommandTestFactory.CREATED_BY);
+				});
+			}
+
+			@DisplayName("Should throw access denied exception on non matching organisationsEinheitId")
+			@Test
+			void shouldThrowAccessDeniedException() {
+				var vorgangId = mongoOperations.save(buildVorgang()).getId();
+				savedCollaborationRequest = mongoOperations.save(vorgangAttachedItem.toBuilder().vorgangId(vorgangId).build());
+				var request = GrpcGetRequestRequest.newBuilder().setId(savedCollaborationRequest.getId()).build();
+				var serviceStub = getServiceStub();
+
+				var exception = Assertions.assertThrows(StatusRuntimeException.class, () -> serviceStub.getRequest(request));
+				assertThat(exception.getStatus().getCode()).isEqualTo(Status.Code.PERMISSION_DENIED);
+			}
+
+			private Vorgang buildVorgang() {
+				return VorgangTestFactory.createBuilder().id(null).version(0).clearEingangs()
+						.eingang(EingangTestFactory.createBuilder()
+								.zustaendigeStelle(ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId("other").build())
+								.build())
+						.build();
+			}
+		}
+
+		@DisplayName("Find requests")
+		@Nested
+		class TestFindRequests {
+
+			@Test
+			void shouldReturnExistingCollaborationRequests() {
+				var response = getServiceStub().findRequests(GrpcFindRequestsRequest.newBuilder().setVorgangId(VorgangTestFactory.ID).build());
+
+				assertThat(response.getRequestsList()).hasSize(1);
+				assertThat(response.getRequestsList().getFirst().getId()).isEqualTo(savedCollaborationRequest.getId());
+			}
+
+			@Test
+			void shouldReturnEmptyListOnNotMatchingVorgangId() {
+				var response = getServiceStub().findRequests(GrpcFindRequestsRequest.newBuilder().setVorgangId(vorgangId).build());
+
+				assertThat(response.getRequestsList()).isEmpty();
+			}
+		}
+
+		private CollaborationRequestServiceBlockingStub getServiceStub() {
+			return collaborationRequestStub.withInterceptors(new TestCallContextAttachingInterceptor());
+		}
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java
index 45e76253f7a9e06bd7c221d1a7e4c0a56e46ae32..813820f57598e988451867b6f263cf84da1c5d45 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java
@@ -34,7 +34,7 @@ class CreateCollaborationVorgangRequestMapperTest {
 
 	@Test
 	void shouldMapFromGrpc() {
-		var result = mapper.mapFrom(GrpcCollaborationRequestTestFactory.create());
+		var result = mapper.mapFrom(GrpcCreateCollaborationRequestDataTestFactory.create());
 
 		assertThat(result).usingRecursiveComparison().ignoringFields("vorgang").isEqualTo(CreateCollaborationVorgangRequestTestFactory.create());
 	}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java
similarity index 80%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java
index e46337e88b4364406238abb4ae3bfa0cece7ecae..139b28a5ce95adaf82e99e464cc31c36bb67424f 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java
@@ -23,18 +23,18 @@
  */
 package de.ozgcloud.vorgang.collaboration;
 
-import de.ozgcloud.vorgang.vorgang.GrpcCollaborationRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcCreateCollaborationRequestData;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory;
 
-public class GrpcCollaborationRequestTestFactory {
+public class GrpcCreateCollaborationRequestDataTestFactory {
 
-	public static GrpcCollaborationRequest create() {
+	public static GrpcCreateCollaborationRequestData create() {
 		return createBuilder().build();
 	}
 
-	public static GrpcCollaborationRequest.Builder createBuilder() {
-		return GrpcCollaborationRequest.newBuilder()
+	public static GrpcCreateCollaborationRequestData.Builder createBuilder() {
+		return GrpcCreateCollaborationRequestData.newBuilder()
 				.setVorgangId(VorgangTestFactory.ID)
 				.setZustaendigeStelle(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)
 				.setCollaborationLevel(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL);
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
index 6f99e9b91bef7f1664e80194b2755173a0c1da37..106c571385c18760a91d1198d34993944a08704d 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java
@@ -92,21 +92,20 @@ class CommandRepositoryITCase {
 	@Nested
 	class TestFinishCommand {
 
-		@BeforeEach
-		void init() {
-			mongoOperations.dropCollection(PersistedCommand.COLLECTION_NAME);
-		}
-
 		@DisplayName("should update status to finished")
 		@ParameterizedTest(name = "with status {0}")
 		@EnumSource(value = CommandStatus.class, names = { "PENDING", "REVOKE_PENDING" })
 		void shouldUpdateStatusToFinished(CommandStatus commandStatus) {
-			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus).build());
+			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus)
+					.createdResource(CommandTestFactory.CREATED_RESOURCE).build());
 
 			repository.finishCommand(command.getId());
 
 			var result = repository.findById(command.getId());
-			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.FINISHED);
+			assertThat(result).isPresent().get().satisfies(cmd -> {
+				assertThat(cmd.getStatus()).isEqualTo(CommandStatus.FINISHED);
+				assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
+			});
 		}
 
 		@DisplayName("should update status to finished")
@@ -322,7 +321,7 @@ class CommandRepositoryITCase {
 			}
 
 			@Test
-			// TODO schreibe ein Testcase für Order, Status und Zeit
+				// TODO schreibe ein Testcase für Order, Status und Zeit
 			void shouldFindCommand() {
 				var command = repository.save(createCommandBuilder()
 						.status(CommandStatus.FINISHED)
@@ -483,7 +482,7 @@ class CommandRepositoryITCase {
 		@Test
 		void shouldReturnParentId() {
 			var commandId = mongoOperations.save(
-					CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build())
+							CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build())
 					.getId();
 
 			var parentId = repository.getParentId(commandId);
@@ -615,30 +614,39 @@ class CommandRepositoryITCase {
 		void shouldSetCanceled() {
 			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.NEW).build());
 
-			repository.setRevokeStatus(command.getId());
+			setRevokeStatus(command.getId());
 
 			var result = repository.findById(command.getId());
-			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.CANCELED);
+			assertThat(result).isPresent().get().satisfies(cmd -> {
+				assertThat(cmd.getStatus()).isEqualTo(CommandStatus.CANCELED);
+				assertThat(cmd.getCreatedResource()).isBlank();
+			});
 		}
 
 		@Test
 		void shouldSetRevokePendingWhenPending() {
 			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).build());
 
-			repository.setRevokeStatus(command.getId());
+			setRevokeStatus(command.getId());
 
 			var result = repository.findById(command.getId());
-			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
+			assertThat(result).isPresent().get().satisfies(cmd -> {
+				assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING);
+				assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
+			});
 		}
 
 		@Test
 		void shouldSetRevokePendingWhenFinished() {
 			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.FINISHED).build());
 
-			repository.setRevokeStatus(command.getId());
+			setRevokeStatus(command.getId());
 
 			var result = repository.findById(command.getId());
-			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
+			assertThat(result).isPresent().get().satisfies(cmd -> {
+				assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING);
+				assertThat(cmd.getCreatedResource()).isBlank();
+			});
 		}
 
 		@DisplayName("should not update when")
@@ -647,10 +655,17 @@ class CommandRepositoryITCase {
 		void shouldNotUpdate(CommandStatus status) {
 			var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(status).build());
 
-			repository.setRevokeStatus(command.getId());
+			setRevokeStatus(command.getId());
 
 			var result = repository.findById(command.getId());
-			assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(status);
+			assertThat(result).isPresent().get().satisfies(cmd -> {
+				assertThat(cmd.getStatus()).isEqualTo(status);
+				assertThat(cmd.getCreatedResource()).isNull();
+			});
+		}
+
+		private void setRevokeStatus(String commandId) {
+			repository.setRevokeStatus(commandId, CommandTestFactory.CREATED_RESOURCE);
 		}
 	}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
index 85714d30f81e92ba77ce0c7f575e89dcc04343fa..3f4d68d90efa91280762ec75d49a7692d352a175 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java
@@ -214,10 +214,12 @@ class CommandServiceTest {
 		@Nested
 		class TestRevokePendingCommand {
 
-			private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING).build();
+			private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING)
+					.createdResource(CommandTestFactory.CREATED_RESOURCE).build();
 
 			@BeforeEach
 			void init() {
+				when(repository.setRevokeStatus(anyString(), anyString())).thenReturn(REVOKE_PENDING_COMMAND);
 				doReturn(true).when(service).shouldRevoke(any());
 				doReturn(REVOKE_PENDING_COMMAND).when(service).getById(anyString());
 			}
@@ -233,7 +235,7 @@ class CommandServiceTest {
 			void shouldCallRepository() {
 				setCommandFinished();
 
-				verify(repository).setRevokeStatus(CommandTestFactory.ID);
+				verify(repository).setRevokeStatus(CommandTestFactory.ID, CommandTestFactory.CREATED_RESOURCE);
 			}
 
 			@Test
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java
index 7df40567d8e858171053fe352454a7e67decde01..e890e4ea2097781bba11e16db414d51370c90562 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java
@@ -168,7 +168,7 @@ class GrpcCommandServiceITCase {
 			mongoOperations.dropCollection(Command.COLLECTION_NAME);
 			mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
 
-			vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build());
+			vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build());
 			when(readIsPermitted.test(any())).thenReturn(true);
 
 			parentCommand = createParentCommand();
@@ -259,9 +259,5 @@ class GrpcCommandServiceITCase {
 			return mongoOperations.findById(grpcCommand.getId(), Command.class);
 		}
 
-		private void assertCommandIsFinished(GrpcCommand grpcCommand) {
-			var command = mongoOperations.findById(grpcCommand.getId(), Command.class);
-			assertThat(command.getStatus()).isEqualTo(CommandStatus.FINISHED);
-		}
 	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
index 5988d1bde47af660ad42c7ee6d613ad9aff7c3f5..5387ed1efef766385e8a769883af4c31c8c30189 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
@@ -29,12 +29,14 @@ import static org.mockito.Mockito.*;
 import java.util.Map;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
 import org.springframework.security.access.AccessDeniedException;
 
+import de.ozgcloud.apilib.common.datatypes.GenericId;
 import de.ozgcloud.common.errorhandling.FunctionalErrorCode;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.vorgang.vorgang.Vorgang;
@@ -308,4 +310,55 @@ class ExceptionHandlerTest {
 			return handler.handleSearchServiceUnavailableException(exception);
 		}
 	}
+
+	@DisplayName("Handle not found exception (from api lib)")
+	@Nested
+	class TestHandleNotFoundExceptionFromApiLib {
+
+		private final String exceptionId = "42";
+		private final GenericId id = GenericId.from(VorgangTestFactory.ID);
+		private final String entityName = Vorgang.class.toString();
+
+		@BeforeEach
+		void mockExceptionId() {
+			doReturn(exceptionId).when(handler).createExceptionId();
+		}
+
+		@Test
+		void shouldHaveStatusCode() {
+			var status = handleException().getStatus();
+
+			assertThat(status.getCode()).isEqualTo(Code.NOT_FOUND);
+		}
+
+		@Test
+		void shouldHaveMessage() {
+			var statusException = handleException();
+
+			assertThat(statusException.getMessage()).contains(id.toString());
+			assertThat(statusException.getMessage()).contains(entityName);
+			assertThat(statusException.getMessage()).contains(exceptionId);
+		}
+
+		@Test
+		void shouldHaveStatusDescription() {
+			var status = handleException().getStatus();
+
+			assertThat(status.getDescription()).contains(id.toString());
+			assertThat(status.getDescription()).contains(entityName);
+			assertThat(status.getDescription()).contains(exceptionId);
+		}
+
+		@Test
+		void shouldHaveExceptionId() {
+			var metaData = handleException().getTrailers();
+
+			assertThat(metaData.get(createExceptionIdKey())).isEqualTo(exceptionId);
+		}
+
+		private StatusException handleException() {
+			return handler.handleNotFoundException(
+					new de.ozgcloud.apilib.common.errorhandling.NotFoundException(id, entityName));
+		}
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java
index dd53e295f92b52ceec3d8c84936d367a8cc8efd7..269f31f0df733254ec0f7a6de31b87c1b9fe3c3f 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java
@@ -10,6 +10,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.SpyBean;
@@ -32,10 +33,10 @@ import de.ozgcloud.vorgang.files.FileService;
 
 @ITCase
 @SpringBootTest(properties = {
-		"ozgcloud.processors[0].address: http://test1",
-		"ozgcloud.processors[0].name: processor1",
-		"ozgcloud.processors[0].forms[0].formEngineName: formEngineTest1",
-		"ozgcloud.processors[0].forms[0].formId: ID1"
+		"ozgcloud.processors[0].address=http://test1",
+		"ozgcloud.processors[0].name=processor1",
+		"ozgcloud.processors[0].forms[0].formEngineName=formEngineTest1",
+		"ozgcloud.processors[0].forms[0].formId=ID1"
 })
 class VorgangEventListenerITCase {
 
@@ -61,6 +62,7 @@ class VorgangEventListenerITCase {
 	@MockBean
 	private ProcessorService vorgagnProcessorService;
 	@MockBean
+	@Qualifier("processorManager_OzgCloudCommandService")
 	private OzgCloudVorgangService ozgCloudVorgangService;
 	@MockBean
 	private ProcessorVorgangMapper processorVorgangMapper;
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
index e555f66338c6679e81c68b4aa0a2dbcdb483f2b4..124e90200536ff3aabcd41325efa75b5ac4afdd8 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
@@ -47,7 +47,7 @@ import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangBadRequestExc
 import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequest;
 import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequestMapper;
 import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequestTestFactory;
-import de.ozgcloud.vorgang.collaboration.GrpcCollaborationRequestTestFactory;
+import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationRequestDataTestFactory;
 import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationVorgangResponseTestFactory;
 import io.grpc.stub.StreamObserver;
 
@@ -349,11 +349,11 @@ class VorgangGrpcServiceTest {
 		@Nested
 		class TestCollaborationRequest {
 
-			private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create();
+			private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create();
 			private static final GrpcCreateCollaborationVorgangRequest REQUEST = GrpcCreateCollaborationVorgangRequest.newBuilder()
-					.setCollaborationRequest(GRPC_COLLABORATION_REQUEST).build();
-			private static final GrpcCreateCollaborationVorgangResponse GRPC_COLLABORATION_RESPONSE =
-					GrpcCreateCollaborationVorgangResponseTestFactory.create();
+					.setRequestData(GRPC_COLLABORATION_REQUEST).build();
+			private static final GrpcCreateCollaborationVorgangResponse GRPC_COLLABORATION_RESPONSE = GrpcCreateCollaborationVorgangResponseTestFactory
+					.create();
 
 			@Mock
 			private StreamObserver<GrpcCreateCollaborationVorgangResponse> responseObserver;
@@ -413,8 +413,9 @@ class VorgangGrpcServiceTest {
 	@Nested
 	class TestCreateCollaborationVorgang {
 
-		private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create();
-		private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory.create();
+		private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create();
+		private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory
+				.create();
 		private static final Vorgang COLLABORATION_VORGANG = VorgangTestFactory.create();
 
 		@BeforeEach
@@ -462,8 +463,9 @@ class VorgangGrpcServiceTest {
 	@Nested
 	class TestBuildCreateCollaborationVorgangRequest {
 
-		private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create();
-		private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory.create();
+		private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create();
+		private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory
+				.create();
 		private static final Vorgang VORGANG = VorgangTestFactory.create();
 
 		@BeforeEach
diff --git a/vorgang-manager-server/src/test/resources/application-itcase.yml b/vorgang-manager-server/src/test/resources/application-itcase.yml
index a9ac195ac3ed2a031ad421adb61d574b2504519c..2ab5f3470287edaf719a5db27b0cba4480042d0b 100644
--- a/vorgang-manager-server/src/test/resources/application-itcase.yml
+++ b/vorgang-manager-server/src/test/resources/application-itcase.yml
@@ -17,6 +17,9 @@ ozgcloud:
   application:
     address: localhost
   aktenzeichen: de.ozgcloud.vorgang.vorgang.AktenzeichenProviderEA
+  notification:
+    scheduling:
+      enabled: false
 
 mongock:
   enabled: false
diff --git a/vorgang-manager-utils/pom.xml b/vorgang-manager-utils/pom.xml
index 0dce87a6de03cd3cee36e7802e9ebf2b313e9412..e152aac5fa8b76246a3b88334125a5390cd25d67 100644
--- a/vorgang-manager-utils/pom.xml
+++ b/vorgang-manager-utils/pom.xml
@@ -30,14 +30,14 @@
 	<parent>
 		<groupId>de.ozgcloud.common</groupId>
 		<artifactId>ozgcloud-common-dependencies</artifactId>
-		<version>4.4.0-SNAPSHOT</version>
+		<version>4.5.0-SNAPSHOT</version>
 		<relativePath/>
 	</parent>
 
 	<groupId>de.ozgcloud.vorgang</groupId>
 	<artifactId>vorgang-manager-utils</artifactId>
 	<name>OZG-Cloud Vorgang Manager Utils</name>
-	<version>2.15.0-PR-458-SNAPSHOT</version>
+	<version>2.17.0-SNAPSHOT</version>
 
 	<properties>
 		<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>