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 d69aa225b87cbc83242e60f10776d5b36a3e26a4..3fb3aa6e717be3bd4cc608bc22f85401fbb5b878 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -17,12 +17,18 @@
 	<properties>
 		<vorgang-manager.version>2.13.0</vorgang-manager.version>
 		<nachrichten-manager.version>2.9.0</nachrichten-manager.version>
+		<document-manager.version>1.0.0-PR-1-SNAPSHOT</document-manager.version>
 		<api-lib.version>0.12.0</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>
@@ -109,7 +115,8 @@
 		</dependency>
 
 
-		<!--dev tools-->
+		<!--dev
+		tools-->
 		<dependency>
 			<groupId>org.mapstruct</groupId>
 			<artifactId>mapstruct</artifactId>
@@ -133,4 +140,4 @@
 			</plugin>
 		</plugins>
 	</build>
-</project>
+</project>
\ No newline at end of file
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..b544b196ca78f1ab9d85ea1b787d20657163b2ae 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
@@ -4,13 +4,16 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 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
 class BescheidGrpcService extends BescheidServiceImplBase {
 
 	private final BescheidService service;
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..c1330860cc92a7b38e9f81b9a30921613d121730 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;
@@ -21,18 +21,26 @@ import org.mapstruct.NullValuePropertyMappingStrategy;
 import org.mapstruct.ReportingPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 
-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) //
+@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/SentInfo.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
deleted file mode 100644
index a3e1fb0389b3612d212fa0678aedfd11ecf950e4..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
+++ /dev/null
@@ -1,41 +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 java.time.ZonedDateTime;
-
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class SentInfo {
-
-	public static final String FIELD_SENT_BY = "sentBy";
-	public static final String FIELD_SENT_AT = "sentAt";
-
-	private String sentBy;
-	private ZonedDateTime sentAt;
-
-}
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..138a5af62fa293d5b937c8e1c99230c7e5578200 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
@@ -12,7 +12,10 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
 
+import de.ozgcloud.document.bescheid.SentInfo;
+
 @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
+@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/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..651753870794b89cc0e13b8fcc1b719c0eccf957 100644
--- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto
+++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto
@@ -33,14 +33,18 @@ option java_outer_classname = "BescheidProto";
 
 service BescheidService {
   rpc getBescheidDraft(GrpcGetBescheidDraftRequest) returns (GrpcGetBescheidDraftResponse) {
+    option deprecated = true;
   }
 
   rpc getAll(GrpcGetAllBescheidRequest) returns (GrpcGetAllBescheidResponse) {
+    option deprecated = true;
   }
 
   rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) {
+    option deprecated = true;
   }
-  
+
   rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) {
+    option deprecated = true;
   }
 }
\ 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-server/pom.xml b/vorgang-manager-server/pom.xml
index 83502549b29c99a6e0fb61484d5a3a91f13d6911..115f3752120a42855fe6fade78fba0e1c6267d0c 100644
--- a/vorgang-manager-server/pom.xml
+++ b/vorgang-manager-server/pom.xml
@@ -54,6 +54,7 @@
 
 		<user-manager-interface.version>2.9.0</user-manager-interface.version>
 		<bescheid-manager.version>1.20.0-SNAPSHOT</bescheid-manager.version>
+		<document-manager.version>1.0.0-PR-1-SNAPSHOT</document-manager.version>
 		<processor-manager.version>0.4.1</processor-manager.version>
 		<nachrichten-manager.version>2.13.0-SNAPSHOT</nachrichten-manager.version>
 		<ozgcloud-starter.version>0.12.0</ozgcloud-starter.version>
@@ -91,6 +92,17 @@
 			<version>${nachrichten-manager.version}</version>
 		</dependency>
 
+		<dependency>
+			<groupId>de.ozgcloud.document</groupId>
+			<artifactId>document-manager-server</artifactId>
+			<version>${document-manager.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>de.ozgcloud.document</groupId>
+			<artifactId>document-manager-interface</artifactId>
+			<version>${document-manager.version}</version>
+		</dependency>
+
 		<dependency>
 			<groupId>de.ozgcloud.vorgang</groupId>
 			<artifactId>vorgang-manager-interface</artifactId>
@@ -454,4 +466,4 @@
 		</snapshotRepository>
 	</distributionManagement>
 
-</project>
+</project>
\ No newline at end of file