diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 27acb0c4ffd60cdf9acd3a905de168d91ac7417e..0f7d64c45be81fd4a74e0ccc903d3fd5a4a895d8 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -17,7 +17,7 @@
 	<properties>
 		<vorgang-manager.version>2.9.0</vorgang-manager.version>
 		<nachrichten-manager.version>2.9.0</nachrichten-manager.version>
-		<api-lib.version>0.10.0</api-lib.version>
+		<api-lib.version>0.11.0-SNAPSHOT</api-lib.version>
 	</properties>
 
 	<dependencies>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
index 49fbce9beef117e017788ae682323792bdb7478e..8fd50e588aabbf6f67f6af76b760657750e40f3f 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
@@ -23,6 +23,8 @@
  */
 package de.ozgcloud.bescheid;
 
+import static java.util.Objects.*;
+
 import java.time.LocalDate;
 import java.util.Arrays;
 import java.util.Optional;
@@ -46,6 +48,7 @@ import de.ozgcloud.bescheid.nachricht.NachrichtService;
 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.errorhandling.TechnicalException;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
@@ -78,8 +81,9 @@ class BescheidEventListener {
 	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 -> SEND_BESCHEID_ORDER.equals(command.getOrder());
+	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";
@@ -165,9 +169,9 @@ class BescheidEventListener {
 	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.getRelationVersion());
+			service.sendBescheidManually(bescheidItem, command);
 		} else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) {
-			service.sendBescheidPostfachMail(bescheidItem, command.getRelationVersion());
+			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),
@@ -190,6 +194,15 @@ class BescheidEventListener {
 		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 {
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
index ffc2ece833e690b658dd1689c38e5e28789d1689..aa027989797574f34930c1249e922d370029d2da 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
@@ -1,17 +1,27 @@
 package de.ozgcloud.bescheid;
 
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+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.attacheditem.AttachedItem;
 import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.attributes.ClientAttributeService;
@@ -20,6 +30,7 @@ import de.ozgcloud.bescheid.nachricht.NachrichtService;
 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.binaryfile.FileId;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.Document;
@@ -32,11 +43,16 @@ import lombok.extern.log4j.Log4j2;
 class BescheidService {
 
 	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";
 
 	private final VorgangService vorgangService;
 	private final AttachedItemService attachedItemService;
-	private final NachrichtService nachrichtService;
-	private final UserProfileService currentUserService;
+	private final UserProfileService userProfileService;
+	@Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME)
+	private final OzgCloudCommandService commandService;
+	private final CommandMapper commandMapper;
 	private final ClientAttributeService bescheidClientAttributeService;
 	private final BuildProperties buildProperties;
 	private final Optional<BescheidRemoteService> remoteService;
@@ -72,9 +88,10 @@ class BescheidService {
 		}
 	}
 
-	public void sendBescheidManually(AttachedItem bescheidItem, long version) {
-		validateBescheidSendManually(bescheidItem, version);
-		setBescheidSent(bescheidItem);
+	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) {
@@ -85,11 +102,13 @@ class BescheidService {
 		}
 	}
 
-	public void sendBescheidPostfachMail(AttachedItem bescheidItem, long version) {
-		validateBescheidSendPostfach(bescheidItem, version);
+	public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) {
+		validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion());
 		var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId()));
-		setBescheidSent(bescheidItem);
-		nachrichtService.sendNachricht(buildBescheid(bescheidItem, vorgang.getServiceKonto()));
+		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) {
@@ -98,10 +117,10 @@ class BescheidService {
 		if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) {
 			throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT));
 		}
-		if (StringUtils.isBlank(getNachrichtSubject(bescheidItem))) {
+		if (getNachrichtSubject(bescheidItem).isEmpty()) {
 			throw new TechnicalException("Bescheid has no nachricht subject");
 		}
-		if (StringUtils.isBlank(getNachrichtText(bescheidItem))) {
+		if (getNachrichtText(bescheidItem).isEmpty()) {
 			throw new TechnicalException("Bescheid has no nachricht text");
 		}
 	}
@@ -119,30 +138,93 @@ class BescheidService {
 		}
 	}
 
-	Bescheid buildBescheid(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto) {
-		return Bescheid.builder()
-				.vorgangId(VorgangId.from(bescheidItem.getVorgangId()))
-				.genehmigt(getBewilligt(bescheidItem))
-				.bescheidFileId(getBescheidFileId(bescheidItem))
-				.nachrichtSubject(Optional.ofNullable(getNachrichtSubject(bescheidItem)))
-				.nachrichtText(Optional.ofNullable(getNachrichtText(bescheidItem)))
-				.createdBy(currentUserService.getUserProfile().getId())
-				.serviceKonto(serviceKonto)
-				.attachments(getAttachments(bescheidItem))
+	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();
 	}
 
-	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));
+	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(
+				Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),
+				Bescheid.FIELD_SENT_BY, userId);
 	}
 
-	String getNachrichtSubject(AttachedItem bescheidItem) {
-		return MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT);
+	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();
 	}
 
-	String getNachrichtText(AttachedItem bescheidItem) {
-		return MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT);
+	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(
+				NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION,
+				NachrichtService.FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(NachrichtService.SUBJECT),
+				NachrichtService.FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY),
+				NachrichtService.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) {
@@ -160,18 +242,20 @@ class BescheidService {
 		return Collections.emptyList();
 	}
 
-	void setBescheidSent(AttachedItem bescheidItem) {
-		attachedItemService.setBescheidSentStatus(bescheidItem.getId(), bescheidItem.getVersion());
-		try {
-			vorgangService.bescheiden(bescheidItem.getVorgangId());
-		} catch (Exception e) {
-			attachedItemService.revertBescheidSendStatus(bescheidItem.getId(), bescheidItem.getVersion());
-			throw e;
-		}
-		setAntragBewilligung(bescheidItem);
+	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();
 	}
 
-	void setAntragBewilligung(AttachedItem bescheidItem) {
+	public void setAntragBewilligung(AttachedItem bescheidItem) {
 		try {
 			bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem));
 		} catch (Exception e) {
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
index 180d95031923d482c4f25f3f42f42ba0620b111d..24a67a215b953478b6bf2518432c37469eb94e42 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
@@ -25,8 +25,6 @@ package de.ozgcloud.bescheid.attacheditem;
 
 import static java.util.Objects.*;
 
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -37,7 +35,6 @@ import java.util.stream.Collectors;
 
 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;
 
@@ -47,39 +44,33 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
 import de.ozgcloud.bescheid.BescheidManagerConfiguration;
-import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
 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;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
 @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";
-	static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM";
 
 	static final String DEFAULT_SUBJECT = "Ihr Bescheid zum Antrag";
 	static final String DEFAULT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh";
 
 	@Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME)
-	@Autowired
-	private OzgCloudCommandService commandService;
-	@Autowired
-	private VorgangAttachedItemRemoteService remoteService;
-	@Autowired
-	private CommandMapper commandMapper;
-	@Autowired
-	private CurrentUserService currentUserService;
-	@Autowired
-	private TemplateHandler templateHandler;
+	private final OzgCloudCommandService commandService;
+	private final VorgangAttachedItemRemoteService remoteService;
+	private final CommandMapper commandMapper;
+	private final TemplateHandler templateHandler;
 
 	public Optional<AttachedItem> findBescheidItem(String vorgangId) {
 		return remoteService.findBescheidDraft(vorgangId);
@@ -267,65 +258,12 @@ public class AttachedItemService {
 				.build();
 	}
 
-	public void setBescheidSentStatus(String id, long version) {
-		createPatchCommand(id, version, buildBescheidSentStatusBodyObject(id));
-	}
-
-	Map<String, Object> buildBescheidSentStatusBodyObject(String bescheidId) {
-		return Map.of(AttachedItem.PROPERTY_ID, bescheidId,
-				AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem());
-	}
-
-	Map<String, Object> buildBescheidSentStatusItem() {
-		var itemMap = buildItemMap(Bescheid.Status.SENT);
-		itemMap.put(Bescheid.FIELD_SENT_INFO, buildSentInfoMap());
-		return itemMap;
-	}
-
-	Map<String, Object> buildSentInfoMap() {
-		return Map.of(
-				Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),
-				Bescheid.FIELD_SENT_BY, getUserId());
-	}
-
-	String getUserId() {
-		return currentUserService.findUser().flatMap(CallContextUser::getUserId).orElse(StringUtils.EMPTY);
-	}
-
-	public void revertBescheidSendStatus(String id, long version) {
-		createPatchCommand(id, version, buildRevertBescheidSentStatusBodyObject(id));
-	}
-
-	private void createPatchCommand(String id, long version, Map<String, Object> itemMap) {
-		commandService.createAndWaitUntilDone(buildPatchBescheidCommand(id, version, itemMap));
-	}
-
-	Map<String, Object> buildRevertBescheidSentStatusBodyObject(String bescheidId) {
-		return Map.of(AttachedItem.PROPERTY_ID, bescheidId,
-				AttachedItem.PROPERTY_ITEM, buildRevertBescheidSentStatusItem());
-	}
-
-	Map<String, Object> buildRevertBescheidSentStatusItem() {
-		var itemMap = buildItemMap(Bescheid.Status.DRAFT);
-		itemMap.put(Bescheid.FIELD_SENT_INFO, null);
-		return itemMap;
-	}
-
 	Map<String, Object> buildItemMap(Bescheid.Status status) {
 		var itemMap = new HashMap<String, Object>();
 		itemMap.put(Bescheid.FIELD_STATUS, status.name());
 		return itemMap;
 	}
 
-	OzgCloudCommand buildPatchBescheidCommand(String bescheidId, long bescheidVersion, Map<String, Object> bodyObject) {
-		return OzgCloudCommand.builder()
-				.relationId(commandMapper.mapRelationId(bescheidId))
-				.relationVersion(bescheidVersion)
-				.order(PATCH_ATTACHED_ITEM)
-				.bodyObject(bodyObject)
-				.build();
-	}
-
 	public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) {
 		return remoteService.findAllBescheid(vorgangId);
 	}
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
index 8b20aa41c65568e456538a45f3c363d1a18cbded..60949bbe87cf4d3b6c2a366dcc529d4be45c99bf 100644
--- 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
@@ -33,7 +33,8 @@ public class UserProfileTestFactory {
 
 	private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance();
 
-	public static final UserId ID = UserId.from(UUID.randomUUID().toString());
+	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();
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java
index ce261151ddaa6d682521e59cfbb806c21c033656..4c3655447451ffdd42a19676c0f9216259b16d3c 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java
@@ -1,38 +1,30 @@
 package de.ozgcloud.bescheid.nachricht;
 
-import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Stream;
 
-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.common.freemarker.TemplateHandler;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
 import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress;
-import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.errorhandling.TechnicalException;
 import lombok.extern.log4j.Log4j2;
 
 @Service
 @Log4j2
 public class NachrichtService {
 
-	public static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT";
 	public static final String FIELD_POSTFACH_ID = "postfachId";
-	static final String FIELD_REPLY_OPTION = "replyOption";
-	static final String REPLY_OPTION = "POSSIBLE";
-	static final String FIELD_SUBJECT = "subject";
-	static final String FIELD_MAIL_BODY = "mailBody";
-	static final String FIELD_ATTACHMENTS = "attachments";
+	public static final String FIELD_REPLY_OPTION = "replyOption";
+	public static final String REPLY_OPTION = "FORBIDDEN";
+	public static final String FIELD_SUBJECT = "subject";
+	public static final String FIELD_MAIL_BODY = "mailBody";
+	public static final String FIELD_ATTACHMENTS = "attachments";
+	public static final String SUBJECT = "Ihr Bescheid zum Antrag";
 
 	@Autowired
 	private NachrichtRemoteService remoteService;
@@ -44,7 +36,6 @@ public class NachrichtService {
 	@Autowired
 	private TemplateHandler templateHandler;
 
-	static final String SUBJECT = "Ihr Bescheid zum Antrag";
 
 	private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh";
 
@@ -68,43 +59,6 @@ public class NachrichtService {
 				.orElseGet(() -> templateHandler.fillTemplate(TEMPLATE_FILE, bescheid));
 	}
 
-	public void sendNachricht(Bescheid bescheid) {
-		commandService.createAndWaitUntilDone(buildSendBescheidCommand(bescheid));
-	}
-
-	OzgCloudCommand buildSendBescheidCommand(Bescheid bescheid) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(bescheid.getVorgangId().toString()))
-				.relationId(commandMapper.mapRelationId(bescheid.getVorgangId().toString()))
-				.order(SEND_POSTFACH_NACHRICHT_ORDER)
-				.createdBy(commandMapper.toOzgCloudUserId(bescheid.getCreatedBy().toString()))
-				.bodyObject(buildSendNachrichtCommandBody(bescheid))
-				.build();
-	}
-
-	Map<String, Object> buildSendNachrichtCommandBody(Bescheid bescheid) {
-		return Map.of(
-				FIELD_REPLY_OPTION, REPLY_OPTION,
-				FIELD_SUBJECT, bescheid.getNachrichtSubject().orElse(SUBJECT),
-				FIELD_MAIL_BODY, bescheid.getNachrichtText().orElse(StringUtils.EMPTY),
-				FIELD_ATTACHMENTS, buildAttachments(bescheid),
-				Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, buildPostfachAddress(bescheid));
-
-	}
-
-	List<String> buildAttachments(Bescheid bescheid) {
-		return Stream.concat(Stream.of(bescheid.getBescheidFileId()), bescheid.getAttachments().stream()).map(FileId::toString).toList();
-	}
-
-	Map<String, Object> buildPostfachAddress(Bescheid bescheid) {
-		var postfachAddress = getAddress(bescheid).orElseThrow(
-				() -> new TechnicalException("No ServiceKonto on Vorgang (id: %s)".formatted(bescheid.getVorgangId())));
-		return Map.of(PostfachAddress.FIELD_TYPE, postfachAddress.getType(),
-				PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(),
-				PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(),
-				Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, bescheid.getServiceKonto().getType());
-	}
-
 	Optional<PostfachAddress> getAddress(Bescheid bescheid) {
 		var serviceKonto = bescheid.getServiceKonto();
 		if (Objects.nonNull(serviceKonto)) {
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
index 09b366285262b009acc54f131611760025ef1c5d..98689c96ea25c66ffcfbe9cab54556b148b7fc65 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java
@@ -1,46 +1,18 @@
 package de.ozgcloud.bescheid.vorgang;
 
-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 lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 
 @Service("bescheid_VorgangService")
+@RequiredArgsConstructor
 public class VorgangService {
 
-	static final String VORGANG_BESCHEIDEN = "VORGANG_BESCHEIDEN";
-
-	@Autowired
-	private VorgangRemoteService remoteService;
-	@Autowired
-	@Qualifier("bescheid_OzgCloudCommandService")
-	private OzgCloudCommandService commandService;
-	@Autowired
-	private CommandMapper commandMapper;
+	private final VorgangRemoteService remoteService;
 
 	public Vorgang getById(@NonNull VorgangId id) {
 		return remoteService.getById(id);
 	}
 
-	public void bescheiden(String vorgangId) {
-		bescheiden(getById(VorgangId.from(vorgangId)));
-	}
-
-	private void bescheiden(Vorgang vorgang) {
-		commandService.createAndWaitUntilDone(buildBescheidenCommand(vorgang));
-	}
-
-	OzgCloudCommand buildBescheidenCommand(Vorgang vorgang) {
-		return OzgCloudCommand.builder()
-				.vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString()))
-				.relationId(commandMapper.mapRelationId(vorgang.getId().toString()))
-				.relationVersion(vorgang.getVersion())
-				.order(VORGANG_BESCHEIDEN)
-				.build();
-	}
-
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
index 96c5ef5dafcba70a2f79b18ae9d7aa8b24bf8670..6347a9570ea12e841e2c6231ed798394daf809d2 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
@@ -9,6 +9,7 @@ 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;
@@ -19,14 +20,19 @@ 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.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;
 	@Autowired
 	private BescheidFeatureProperties bescheidFeatureProperties;
 
@@ -70,7 +76,7 @@ class BescheidEventListenerITCase {
 
 		@Test
 		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build()));
+			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER));
 
 			verifyNoInteractions(service);
 		}
@@ -90,7 +96,7 @@ class BescheidEventListenerITCase {
 
 		@Test
 		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build()));
+			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER));
 
 			verifyNoInteractions(attachedItemService);
 		}
@@ -110,9 +116,29 @@ class BescheidEventListenerITCase {
 
 		@Test
 		void shouldNotReactOnOtherOrder() {
-			publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build()));
+			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
index 823d76cd45304b38173621fa521a6e3cbec6820e..1940fb2bf4294d0d48bfab82be1b5550d7986c00 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
@@ -35,6 +35,7 @@ import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
 import de.ozgcloud.bescheid.nachricht.NachrichtService;
 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.errorhandling.TechnicalException;
@@ -551,8 +552,8 @@ class BescheidEventListenerTest {
 			void shouldCallSendBescheid() {
 				listener.doSendBescheid(COMMAND);
 
-				verify(service).sendBescheidManually(bescheidItem, AttachedItemTestFactory.VERSION);
-				verify(service, never()).sendBescheidPostfachMail(any(), anyLong());
+				verify(service).sendBescheidManually(bescheidItem, COMMAND);
+				verify(service, never()).sendBescheidPostfachMail(any(), any());
 			}
 
 			@Test
@@ -585,8 +586,8 @@ class BescheidEventListenerTest {
 			void shouldCallBescheidService() {
 				listener.doSendBescheid(COMMAND);
 
-				verify(service).sendBescheidPostfachMail(bescheidItem, AttachedItemTestFactory.VERSION);
-				verify(service, never()).sendBescheidManually(any(), anyLong());
+				verify(service).sendBescheidPostfachMail(bescheidItem, COMMAND);
+				verify(service, never()).sendBescheidManually(any(), any());
 			}
 
 			@Test
@@ -599,6 +600,49 @@ class BescheidEventListenerTest {
 		}
 	}
 
+	@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 {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
index 6697f5fe8687a7524464e3a2fb01b1f86ff4cd62..6db0af2e5937ab0084001a0727e0be54689ddac6 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
@@ -5,11 +5,16 @@ 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.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;
@@ -26,20 +31,31 @@ 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.attacheditem.AttachedItem;
 import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
 import de.ozgcloud.bescheid.attributes.ClientAttributeService;
 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.nachricht.NachrichtService;
+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.binaryfile.FileId;
+import de.ozgcloud.common.datatype.StringBasedValue;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.DocumentTestFactory;
 
@@ -52,19 +68,19 @@ class BescheidServiceTest {
 	@Mock
 	private VorgangService vorgangService;
 	@Mock
-	private BescheidRemoteService remoteService;
-	@Mock
 	private AttachedItemService attachedItemService;
 	@Mock
-	private NachrichtService nachrichtService;
-	@Mock
 	private UserProfileService userProfileService;
 	@Mock
-	private UserProfile callContextUser;
+	private OzgCloudCommandService commandService;
+	@Mock
+	private CommandMapper commandMapper;
 	@Mock
 	private ClientAttributeService clientAttributeService;
 	@Mock
 	private BuildProperties buildProperties;
+	@Mock
+	private BescheidRemoteService remoteService;
 
 	@BeforeEach
 	void init() {
@@ -110,11 +126,23 @@ class BescheidServiceTest {
 	@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
@@ -125,14 +153,37 @@ class BescheidServiceTest {
 		}
 
 		@Test
-		void shouldCallSendBescheid() {
+		void shouldCallGetVorgang() {
 			sendBescheid();
 
-			verify(service).setBescheidSent(bescheidItem);
+			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() {
-			service.sendBescheidManually(bescheidItem, AttachedItemTestFactory.VERSION);
+			var parentCommand = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build();
+			service.sendBescheidManually(bescheidItem, parentCommand);
 		}
 	}
 
@@ -171,38 +222,42 @@ class BescheidServiceTest {
 	@Nested
 	class TestSendBescheidPostfachMail {
 
-		private AttachedItem bescheidItem;
+		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 AttachedItem bescheidSendItem;
+		private OzgCloudCommand setBescheidSentSubCommand;
+		@Mock
+		private OzgCloudCommand sendPostfachNachrichtSubCommand;
 		@Captor
 		private ArgumentCaptor<VorgangId> vorgangIdCaptor;
+		@Captor
+		private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor;
 
 		@BeforeEach
 		void init() {
-			var item = AttachedItemTestFactory.createBescheidItem();
-			item.put(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name());
-			bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build();
-
 			doNothing().when(service).validateBescheidSendPostfach(any(), anyLong());
-			lenient().when(callContextUser.getId()).thenReturn(UserId.from("user-id"));
-			lenient().when(userProfileService.getUserProfile()).thenReturn(callContextUser);
+			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() {
-			doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any());
-			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
-
 			sendBescheid();
 
-			verify(service).validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION);
+			verify(service).validateBescheidSendPostfach(BESCHEID_ITEM, AttachedItemTestFactory.VERSION);
 		}
 
 		@Test
 		void shouldCallVorgangService() {
-			doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any());
-			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
-
 			sendBescheid();
 
 			verify(vorgangService).getById(vorgangIdCaptor.capture());
@@ -210,40 +265,36 @@ class BescheidServiceTest {
 		}
 
 		@Test
-		void shouldCallBuildBescheid() {
-			doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any());
-			var serviceKonto = ServiceKontoTestFactory.create();
-			var vorgang = VorgangTestFactory.createBuilder().serviceKonto(serviceKonto).build();
-			doReturn(vorgang).when(vorgangService).getById(any());
-
+		void shouldCallGetUserId() {
 			sendBescheid();
 
-			verify(service).buildBescheid(bescheidItem, serviceKonto);
+			verify(service).getUserId();
 		}
 
 		@Test
-		void shouldCallNachrichtService() {
-			var bescheid = BescheidTestFactory.create();
-			doReturn(bescheid).when(service).buildBescheid(any(), any());
-			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
-
+		void shouldCallBuildSetBescheidSentSubCommands() {
 			sendBescheid();
 
-			verify(nachrichtService).sendNachricht(bescheid);
+			verify(service).buildSetBescheidSentSubCommands(BESCHEID_ITEM, VORGANG, UserProfileTestFactory.ID_STR);
 		}
 
 		@Test
-		void shouldCallSendBescheid() {
-			doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any());
-			when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create());
+		void shouldCallBuildSendPostfachNachrichtCommand() {
+			sendBescheid();
+
+			verify(service).buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR);
+		}
 
+		@Test
+		void shouldCallAddSubCommands() {
 			sendBescheid();
 
-			verify(service).setBescheidSent(bescheidItem);
+			verify(service).addSubCommands(eq(CommandTestFactory.ID), subCommandsCaptor.capture());
+			assertThat(subCommandsCaptor.getValue()).containsExactly(setBescheidSentSubCommand, sendPostfachNachrichtSubCommand);
 		}
 
 		private void sendBescheid() {
-			service.sendBescheidPostfachMail(bescheidItem, AttachedItemTestFactory.VERSION);
+			service.sendBescheidPostfachMail(BESCHEID_ITEM, PARENT_COMMAND);
 		}
 	}
 
@@ -352,114 +403,6 @@ class BescheidServiceTest {
 		}
 	}
 
-	@Nested
-	class TestBuildBescheid {
-
-		private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid();
-		private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create();
-		private static final String CREATED_BY = "user-id";
-
-		@BeforeEach
-		void init() {
-			when(callContextUser.getId()).thenReturn(UserId.from(CREATED_BY));
-			when(userProfileService.getUserProfile()).thenReturn(callContextUser);
-			doReturn(FileId.from(DocumentTestFactory.DOCUMENT_FILE)).when(service).getBescheidFileId(any());
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var result = buildBescheid();
-
-			assertThat(result.getVorgangId()).hasToString(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallGetBewilligt() {
-			buildBescheid();
-
-			verify(service).getBewilligt(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldSetGenehmigt() {
-			doReturn(true).when(service).getBewilligt(any());
-
-			var result = buildBescheid();
-
-			assertThat(result.isGenehmigt()).isTrue();
-		}
-
-		@Test
-		void shouldCallGetAttachments() {
-			buildBescheid();
-
-			verify(service).getAttachments(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldSetAttachments() {
-			var expectedAttachments = List.of(FileId.from(AttachedItemTestFactory.ATTACHMENT));
-			doReturn(expectedAttachments).when(service).getAttachments(any());
-
-			var result = buildBescheid();
-
-			assertThat(result.getAttachments()).containsExactlyElementsOf(expectedAttachments);
-		}
-
-		@Test
-		void shouldCallGetBescheidFileId() {
-			buildBescheid();
-
-			verify(service).getBescheidFileId(BESCHEID_ITEM);
-		}
-
-		@Test
-		void shouldSetBescheidFileId() {
-			var result = buildBescheid();
-
-			assertThat(result.getBescheidFileId()).hasToString(DocumentTestFactory.DOCUMENT_FILE);
-		}
-
-		@Test
-		void shouldSetNachrichtSubject() {
-			var result = buildBescheid();
-
-			assertThat(result.getNachrichtSubject()).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldSetNachrichtText() {
-			var result = buildBescheid();
-
-			assertThat(result.getNachrichtText()).contains(AttachedItemTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldCallCurrentUserService() {
-			buildBescheid();
-
-			verify(userProfileService).getUserProfile();
-		}
-
-		@Test
-		void shouldSetCreatedBy() {
-			var result = buildBescheid();
-
-			assertThat(result.getCreatedBy()).hasToString(CREATED_BY);
-		}
-
-		@Test
-		void shouldSetServiceKonto() {
-			var result = buildBescheid();
-
-			assertThat(result.getServiceKonto()).usingRecursiveComparison().isEqualTo(SERVICE_KONTO);
-		}
-
-		private Bescheid buildBescheid() {
-			return service.buildBescheid(BESCHEID_ITEM, SERVICE_KONTO);
-		}
-	}
-
 	@Nested
 	class TestGetAttachments {
 
@@ -540,6 +483,33 @@ class BescheidServiceTest {
 		}
 	}
 
+	@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 {
 
@@ -573,7 +543,7 @@ class BescheidServiceTest {
 
 			var result = service.getNachrichtSubject(bescheidItem);
 
-			assertThat(result).isEqualTo(AttachedItemTestFactory.NACHRICHT_SUBJECT);
+			assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT);
 		}
 	}
 
@@ -587,49 +557,537 @@ class BescheidServiceTest {
 
 			var result = service.getNachrichtText(bescheidItem);
 
-			assertThat(result).isEqualTo(AttachedItemTestFactory.NACHRICHT_TEXT);
+			assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_TEXT);
 		}
 	}
 
 	@Nested
-	class TestSendBescheid {
+	class TestGetUserId {
 
-		private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
 		@Mock
-		private AttachedItem bescheidSendItem;
+		private UserProfile userProfile;
+
+		@BeforeEach
+		void init() {
+			when(userProfileService.getUserProfile()).thenReturn(userProfile);
+			when(userProfile.getId()).thenReturn(UserProfileTestFactory.ID);
+
+		}
 
 		@Test
-		void shouldCallSetBescheidStatusSent() {
-			sendBescheid();
+		void shouldCallGetUserProfile() {
+			service.getUserId();
 
-			verify(attachedItemService).setBescheidSentStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION);
+			verify(userProfileService).getUserProfile();
 		}
 
 		@Test
-		void shouldCallBescheiden() {
-			sendBescheid();
+		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;
 
-			verify(vorgangService).bescheiden(CommandTestFactory.VORGANG_ID);
+		@BeforeEach
+		void inti() {
+			doReturn(vorgangBescheidenCommand).when(service).buildVorgangBescheidenCommand(any());
+			doReturn(setBescheidSentStatusCommand).when(service).buildSetBescheidSentStatusCommand(any(), any());
 		}
 
 		@Test
-		void shouldCallRevertBescheidStatusSent() {
-			doThrow(new TechnicalException("error")).when(vorgangService).bescheiden(anyString());
+		void shouldCallBuildVorgangBescheidenCommand() {
+			buildSetBescheidSentCommands();
 
-			assertThrows(TechnicalException.class, this::sendBescheid);
+			verify(service).buildVorgangBescheidenCommand(vorgang);
+		}
 
-			verify(attachedItemService).revertBescheidSendStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION);
+		@Test
+		void shouldCallBuildSetBescheidSentStatusCommand() {
+			buildSetBescheidSentCommands();
+
+			verify(service).buildSetBescheidSentStatusCommand(bescheidItem, UserProfileTestFactory.ID_STR);
 		}
 
 		@Test
-		void shouldCallSetAntragResult() {
-			sendBescheid();
+		void shouldReturnResult() {
+			var result = buildSetBescheidSentCommands();
 
-			verify(service).setAntragBewilligung(bescheidItem);
+			assertThat(result).containsExactly(vorgangBescheidenCommand, setBescheidSentStatusCommand);
 		}
 
-		private void sendBescheid() {
-			service.setBescheidSent(bescheidItem);
+		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(Bescheid.FIELD_SENT_BY, UserProfileTestFactory.ID_STR);
+		}
+
+		private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) {
+			return ZonedDateTime.parse((String) sentInfoMap.get(Bescheid.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(NachrichtService.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(AttachedItemTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any());
+				doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any());
+				doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(service).buildAttachments(any());
+			}
+
+			@Test
+			void shouldSetReplyOption() {
+				var result = buildSendNachrichtCommandBody();
+
+				assertThat(result).containsEntry(NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION);
+			}
+
+			@Test
+			void shouldCallGetNachrichtSubject() {
+				buildSendNachrichtCommandBody();
+
+				verify(service).getNachrichtSubject(bescheidItem);
+			}
+
+			@Test
+			void shouldSetSubject() {
+				var result = buildSendNachrichtCommandBody();
+
+				assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT);
+			}
+
+			@Test
+			void shouldCallGetNachrichtText() {
+				buildSendNachrichtCommandBody();
+
+				verify(service).getNachrichtText(bescheidItem);
+			}
+
+			@Test
+			void shouldSetMailBody() {
+				var result = buildSendNachrichtCommandBody();
+
+				assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT);
+			}
+
+			@Test
+			void shouldCallBuildAttachments() {
+				buildSendNachrichtCommandBody();
+
+				verify(service).buildAttachments(bescheidItem);
+			}
+
+			@Test
+			void shouldSetAttachments() {
+				var result = buildSendNachrichtCommandBody();
+
+				assertThat(result).extracting(NachrichtService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.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(NachrichtService.FIELD_SUBJECT, NachrichtService.SUBJECT);
+			}
+
+			@Test
+			void shouldSetMailBody() {
+				var result = buildSendNachrichtCommandBody();
+
+				assertThat(result).containsEntry(NachrichtService.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);
 		}
 	}
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
index 726edcf3e90a969633d5f3caf885298c65334776..9f4272fed782bba1aef9ea7236c4430752002e88 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
@@ -28,15 +28,12 @@ import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.time.ZonedDateTime;
-import java.time.temporal.ChronoUnit;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -61,8 +58,6 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.Bescheid.SendBy;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
-import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
@@ -86,8 +81,6 @@ class AttachedItemServiceTest {
 	@Mock
 	private VorgangAttachedItemRemoteService remoteService;
 	@Mock
-	private CurrentUserService currentUserService;
-	@Mock
 	private TemplateHandler templateHandler;
 
 	@Nested
@@ -1039,257 +1032,6 @@ class AttachedItemServiceTest {
 		}
 	}
 
-	@Nested
-	class TestSetBescheidSentStatus {
-
-		private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value");
-
-		@Mock
-		private OzgCloudCommand command;
-
-		@BeforeEach
-		void init() {
-			doReturn(BODY_OBJECT_MAP).when(service).buildBescheidSentStatusBodyObject(any());
-		}
-
-		@Test
-		void shouldCallBuildPatchBescheidCommand() {
-			setBescheidStatusSent();
-
-			verify(service).buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(command).when(service).buildPatchBescheidCommand(any(), anyLong(), any());
-
-			setBescheidStatusSent();
-
-			verify(commandService).createAndWaitUntilDone(command);
-		}
-
-		private void setBescheidStatusSent() {
-			service.setBescheidSentStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION);
-		}
-	}
-
-	@Nested
-	class TestBuildBescheidSentStatusBodyObject {
-
-		@Test
-		void shouldSetId() {
-			var result = service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallBuildBescheidSentStatusItem() {
-			service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			verify(service).buildBescheidSentStatusItem();
-		}
-
-		@Test
-		void shouldSetBescheidBodyObject() {
-			var expectedItemMap = Map.of("key", "value");
-			doReturn(expectedItemMap).when(service).buildBescheidSentStatusItem();
-
-			var result = service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, expectedItemMap);
-		}
-
-	}
-
-	@Nested
-	class TestBuildBescheidSentStatusItem {
-
-		@Test
-		void shouldSetStatus() {
-			var result = service.buildBescheidSentStatusItem();
-
-			assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name());
-		}
-	}
-
-	@Nested
-	class TestBuildSentInfoMap {
-
-		@Test
-		void shouldSetSentAt() {
-			var result = service.buildSentInfoMap();
-
-			assertThat(getSentAt(result)).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS));
-		}
-
-		@Test
-		void shouldCallGetUser() {
-			service.buildSentInfoMap();
-
-			verify(currentUserService).findUser();
-		}
-
-		@Test
-		void shouldSetSentBy() {
-			var userId = "user-id";
-			doReturn(userId).when(service).getUserId();
-
-			var result = service.buildSentInfoMap();
-
-			assertThat(result).containsEntry(Bescheid.FIELD_SENT_BY, userId);
-		}
-
-		private ZonedDateTime getSentAt(Map<String, Object> sentInfo) {
-			return ZonedDateTime.parse(MapUtils.getString(sentInfo, Bescheid.FIELD_SENT_AT));
-		}
-	}
-
-	@Nested
-	class TestGetUserId {
-
-		@Mock
-		private CallContextUser callContextUser;
-
-		@Test
-		void shouldCallFindUser() {
-			service.getUserId();
-
-			verify(currentUserService).findUser();
-		}
-
-		@Test
-		void shouldCallGetUserIdOnCallContexUser() {
-			when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser));
-
-			service.getUserId();
-
-			verify(callContextUser).getUserId();
-		}
-
-		@Test
-		void shouldReturnUserId() {
-			var expectedUserId = "user-id";
-			when(callContextUser.getUserId()).thenReturn(Optional.of(expectedUserId));
-			when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser));
-
-			var result = service.getUserId();
-
-			assertThat(result).isEqualTo(expectedUserId);
-		}
-
-		@Test
-		void shouldReturnEmptyWhenNoUserFound() {
-			var result = service.getUserId();
-
-			assertThat(result).isEmpty();
-		}
-
-		@Test
-		void shouldReturnEmptyWhenNoUserIdFound() {
-			when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser));
-
-			var result = service.getUserId();
-
-			assertThat(result).isEmpty();
-		}
-	}
-
-	@Nested
-	class TestRevertBescheidStatusSent {
-
-		private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value");
-
-		@Mock
-		private OzgCloudCommand command;
-
-		@Test
-		void shouldCallBuildRevertBescheidSentStatusBodyObject() {
-			revertBescheidStatusSent();
-
-			verify(service).buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallBuildPatchBescheidCommand() {
-			doReturn(BODY_OBJECT_MAP).when(service).buildRevertBescheidSentStatusBodyObject(any());
-
-			revertBescheidStatusSent();
-
-			verify(service).buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(command).when(service).buildPatchBescheidCommand(any(), anyLong(), any());
-
-			revertBescheidStatusSent();
-
-			verify(commandService).createAndWaitUntilDone(command);
-		}
-
-		private void revertBescheidStatusSent() {
-			service.revertBescheidSendStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION);
-		}
-
-	}
-
-	@Nested
-	class TestBuildRevertBescheidSentStatusBodyObject {
-
-		@Test
-		void shouldSetId() {
-			var result = service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallBuildRevertBescheidSentStatusItem() {
-			service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			verify(service).buildRevertBescheidSentStatusItem();
-		}
-
-		@Test
-		void shouldSetBescheidBodyObject() {
-			var expectedItemMap = Map.of("key", "value");
-			doReturn(expectedItemMap).when(service).buildRevertBescheidSentStatusItem();
-
-			var result = service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID);
-
-			assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, expectedItemMap);
-		}
-	}
-
-	@Nested
-	class TestBuildRevertBescheidSentStatusItem {
-
-		@Test
-		void shouldCallBuildItemMap() {
-			service.buildRevertBescheidSentStatusItem();
-
-			verify(service).buildItemMap(Bescheid.Status.DRAFT);
-		}
-
-		@Test
-		void shouldReturnResultsOfBuildItemMap() {
-			var expectedItemMap = new HashMap<String, Object>(Map.of("key", "value"));
-			doReturn(expectedItemMap).when(service).buildItemMap(any());
-
-			var result = service.buildRevertBescheidSentStatusItem();
-
-			assertThat(result).containsEntry("key", "value");
-		}
-
-		@Test
-		void shouldSetSentInfoNull() {
-			var result = service.buildRevertBescheidSentStatusItem();
-
-			assertThat(result).containsEntry(Bescheid.FIELD_SENT_INFO, null);
-		}
-	}
-
 	@Nested
 	class TestBuildItemMap {
 
@@ -1301,54 +1043,6 @@ class AttachedItemServiceTest {
 		}
 	}
 
-	@Nested
-	class TestBuildPatchBescheidCommand {
-
-		private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value");
-
-		@Test
-		void shouldCallRelationIdMapper() {
-			buildPatchBescheidCommand();
-
-			verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var expectedId = GenericId.from(AttachedItemTestFactory.ID);
-			when(commandMapper.mapRelationId(any())).thenReturn(expectedId);
-
-			var result = buildPatchBescheidCommand();
-
-			assertThat(result.getRelationId()).isEqualTo(expectedId);
-		}
-
-		@Test
-		void shouldSetRelationVersion() {
-			var result = buildPatchBescheidCommand();
-
-			assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = buildPatchBescheidCommand();
-
-			assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var result = buildPatchBescheidCommand();
-
-			assertThat(result.getBodyObject()).isSameAs(BODY_OBJECT_MAP);
-		}
-
-		private OzgCloudCommand buildPatchBescheidCommand() {
-			return service.buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP);
-		}
-	}
-
 	@Nested
 	class TestFindAllBescheid {
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java
index f18ffbc9d6851d39b9dfe8676d98f7676013dbe5..5974a286fb170a9c04db124f1b80220f84d66496 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java
@@ -1,12 +1,9 @@
 package de.ozgcloud.bescheid.nachricht;
 
 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.List;
-import java.util.Map;
 import java.util.Optional;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -16,21 +13,9 @@ 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.user.OzgCloudUserId;
-import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
-import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.BescheidTestFactory;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
-import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory;
-import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
-import de.ozgcloud.bescheid.vorgang.Vorgang;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
-import de.ozgcloud.common.errorhandling.TechnicalException;
 
 class NachrichtServiceTest {
 
@@ -41,10 +26,6 @@ class NachrichtServiceTest {
 	@Mock
 	private NachrichtRemoteService remoteService;
 	@Mock
-	private OzgCloudCommandService commandService;
-	@Mock
-	private CommandMapper commandMapper;
-	@Mock
 	private TemplateHandler templateHandler;
 
 	@Nested
@@ -126,225 +107,4 @@ class NachrichtServiceTest {
 			assertThat(message).isEqualTo("FROM_TEMPLATE");
 		}
 	}
-
-	@Nested
-	class TestSendNachricht {
-
-		@Mock
-		private OzgCloudCommand ozgCloudCommand;
-
-		@BeforeEach
-		void init() {
-			doReturn(ozgCloudCommand).when(service).buildSendBescheidCommand(any());
-		}
-
-		@Test
-		void shouldCallBuildBescheidCommand() {
-			var bescheid = BescheidTestFactory.create();
-
-			service.sendNachricht(bescheid);
-
-			verify(service).buildSendBescheidCommand(bescheid);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			service.sendNachricht(BescheidTestFactory.create());
-
-			verify(commandService).createAndWaitUntilDone(ozgCloudCommand);
-		}
-
-	}
-
-	@Nested
-	class TestBuildSendBescheidCommand {
-
-		private static final Map<String, Object> bodyObject = Map.of("key", "value");
-		private final Bescheid bescheid = BescheidTestFactory.create();
-
-		@BeforeEach
-		void init() {
-			doReturn(bodyObject).when(service).buildSendNachrichtCommandBody(any());
-		}
-
-		@Test
-		void shouldCallVorgangIdMapper() {
-			buildCommand();
-
-			verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var vorgangId = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString());
-			when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(vorgangId);
-
-			var result = buildCommand();
-
-			assertThat(result.getVorgangId()).isEqualTo(vorgangId);
-		}
-
-		@Test
-		void shouldCallMapRelationId() {
-			buildCommand();
-
-			verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var relationId = GenericId.from("relation-id");
-			when(commandMapper.mapRelationId(anyString())).thenReturn(relationId);
-
-			var result = buildCommand();
-
-			assertThat(result.getRelationId()).isEqualTo(relationId);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var result = buildCommand();
-
-			assertThat(result.getOrder()).isEqualTo(NachrichtService.SEND_POSTFACH_NACHRICHT_ORDER);
-		}
-
-		@Test
-		void shouldCallCreatedBy() {
-			buildCommand();
-
-			verify(commandMapper).toOzgCloudUserId(BescheidTestFactory.CREATED_BY.toString());
-		}
-
-		@Test
-		void shouldSetCreatedBy() {
-			var userId = OzgCloudUserId.from(BescheidTestFactory.CREATED_BY.toString());
-			when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(userId);
-
-			var result = buildCommand();
-
-			assertThat(result.getCreatedBy()).isEqualTo(userId);
-		}
-
-		@Test
-		void shouldCallBuildSendNachrichtCommandBody() {
-			buildCommand();
-
-			verify(service).buildSendNachrichtCommandBody(bescheid);
-		}
-
-		@Test
-		void shouldSetBodyObject() {
-			var result = buildCommand();
-
-			assertThat(result.getBodyObject()).isEqualTo(bodyObject);
-		}
-
-		private OzgCloudCommand buildCommand() {
-			return service.buildSendBescheidCommand(bescheid);
-		}
-	}
-
-	@Nested
-	class TestBuildSendNachrichtCommandBody {
-
-		private final Bescheid bescheid = BescheidTestFactory.create();
-
-		@Test
-		void shouldCallBuildPostfachAddress() {
-			service.buildSendNachrichtCommandBody(bescheid);
-
-			verify(service).buildPostfachAddress(bescheid);
-		}
-
-		@Test
-		void shouldSetPostfachAddress() {
-			var postfachAddressMap = Map.<String, Object>of("key", "value");
-			doReturn(postfachAddressMap).when(service).buildPostfachAddress(any());
-
-			var result = service.buildSendNachrichtCommandBody(bescheid);
-
-			assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddressMap);
-		}
-
-		@Test
-		void shouldSetReplyOption() {
-			var result = service.buildSendNachrichtCommandBody(bescheid);
-
-			assertThat(result).containsEntry(NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION);
-		}
-
-		@Test
-		void shouldSetSubject() {
-			var result = service.buildSendNachrichtCommandBody(bescheid);
-
-			assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldSetMailBody() {
-			var result = service.buildSendNachrichtCommandBody(bescheid);
-
-			assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldSetAttachments() {
-			var result = service.buildSendNachrichtCommandBody(bescheid);
-
-			assertThat(result).containsEntry(NachrichtService.FIELD_ATTACHMENTS,
-					List.of(BescheidTestFactory.BESCHEID_FILE_ID, AttachedItemTestFactory.ATTACHMENT));
-		}
-	}
-
-	@Nested
-	class TestBuildPostfachAddress {
-
-		@Test
-		void shouldCallGetAddress() {
-			var bescheid = BescheidTestFactory.create();
-
-			service.buildPostfachAddress(bescheid);
-
-			verify(service).getAddress(bescheid);
-		}
-
-		@Test
-		void shouldThrowExceptionIfNoServiceKonto() {
-			doReturn(Optional.empty()).when(service).getAddress(any());
-			var bescheid = BescheidTestFactory.create();
-
-			assertThrows(TechnicalException.class, () -> service.buildPostfachAddress(bescheid));
-		}
-
-		@Test
-		void shouldSetAddressType() {
-			var result = service.buildPostfachAddress(BescheidTestFactory.create());
-
-			assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE);
-		}
-
-		@Test
-		void shouldSetAddressVersion() {
-			var result = service.buildPostfachAddress(BescheidTestFactory.create());
-
-			assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetAddressIdentifier() {
-			var result = service.buildPostfachAddress(BescheidTestFactory.create());
-
-			assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP)
-					.containsEntry(NachrichtService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID);
-		}
-
-		@Test
-		void shouldSetServiceKontoType() {
-			var result = service.buildPostfachAddress(BescheidTestFactory.create());
-
-			assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, ServiceKontoTestFactory.TYPE);
-		}
-
-	}
-
 }
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
index 424a4330012bc1fd605dede82c56eac40c435f67..cc93692c7831628dd87ada5bf0cf21f2250b5bb4 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java
@@ -11,12 +11,6 @@ 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;
-
 class VorgangServiceTest {
 
 	@Spy
@@ -25,10 +19,6 @@ class VorgangServiceTest {
 
 	@Mock
 	private VorgangRemoteService remoteService;
-	@Mock
-	private OzgCloudCommandService commandService;
-	@Mock
-	private CommandMapper commandMapper;
 
 	@Nested
 	class TestGetById {
@@ -54,99 +44,4 @@ class VorgangServiceTest {
 			assertThat(result).isEqualTo(vorgang);
 		}
 	}
-
-	@Nested
-	class TestBescheiden {
-
-		private final static Vorgang VORGANG = VorgangTestFactory.create();
-
-		@Mock
-		private OzgCloudCommand ozgCloudCommand;
-
-		@BeforeEach
-		void init() {
-			doReturn(VORGANG).when(service).getById(any(VorgangId.class));
-		}
-
-		@Test
-		void shouldCallGetBeyId() {
-			service.bescheiden(VorgangTestFactory.ID.toString());
-
-			verify(service).getById(VorgangTestFactory.ID);
-		}
-
-		@Test
-		void shouldCallBuildBescheidenCommand() {
-			service.bescheiden(VorgangTestFactory.ID.toString());
-
-			verify(service).buildBescheidenCommand(VORGANG);
-		}
-
-		@Test
-		void shouldCallCommandService() {
-			doReturn(ozgCloudCommand).when(service).buildBescheidenCommand(any());
-
-			service.bescheiden(VorgangTestFactory.ID.toString());
-
-			verify(commandService).createAndWaitUntilDone(ozgCloudCommand);
-		}
-	}
-
-	@Nested
-	class TestBuildBescheidenCommand {
-
-		private final static Vorgang VORGANG = VorgangTestFactory.create();
-
-		@Test
-		void shouldCallCommandMapperToOzgCloudVorgangId() {
-			service.buildBescheidenCommand(VORGANG);
-
-			verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetVorgangId() {
-			var expectedId = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString());
-			when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedId);
-
-			var result = service.buildBescheidenCommand(VORGANG);
-
-			assertThat(result.getVorgangId()).isEqualTo(expectedId);
-		}
-
-		@Test
-		void shouldCallCommandMapperMapRelationId() {
-			service.buildBescheidenCommand(VORGANG);
-
-			verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString());
-		}
-
-		@Test
-		void shouldSetRelationId() {
-			var expectedId = GenericId.from(VorgangTestFactory.ID.toString());
-			when(commandMapper.mapRelationId(any())).thenReturn(expectedId);
-
-			var result = service.buildBescheidenCommand(VORGANG);
-
-			assertThat(result.getRelationId()).isEqualTo(expectedId);
-		}
-
-		@Test
-		void shouldSetRelationVersion() {
-			var expectedVersion = VORGANG.getVersion();
-
-			var result = service.buildBescheidenCommand(VORGANG);
-
-			assertThat(result.getRelationVersion()).isEqualTo(expectedVersion);
-		}
-
-		@Test
-		void shouldSetOrder() {
-			var expectedOrder = VorgangService.VORGANG_BESCHEIDEN;
-
-			var result = service.buildBescheidenCommand(VORGANG);
-
-			assertThat(result.getOrder()).isEqualTo(expectedOrder);
-		}
-	}
 }
diff --git a/lombok.config b/lombok.config
index d07dd9b0e2b0281fbf514a968b9451cb6af62f93..a06fa130e8af26b659f2d3a0cb1114cd966a9b0e 100644
--- a/lombok.config
+++ b/lombok.config
@@ -27,4 +27,5 @@ lombok.log.slf4j.flagUsage = ERROR
 lombok.log.log4j.flagUsage = ERROR
 lombok.data.flagUsage = ERROR
 lombok.nonNull.exceptionType = IllegalArgumentException
-lombok.addLombokGeneratedAnnotation = true
\ No newline at end of file
+lombok.addLombokGeneratedAnnotation = true
+lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
\ No newline at end of file
diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml
index a04e5464ba13ff4739cc6ad67e1d1990a861c8c0..1d0e1c0689976082d253db668465fb2f937c4972 100644
--- a/vorgang-manager-server/pom.xml
+++ b/vorgang-manager-server/pom.xml
@@ -53,7 +53,7 @@
 		<zufi-manager-interface.version>1.0.0</zufi-manager-interface.version>
 
 		<user-manager-interface.version>2.1.0</user-manager-interface.version>
-		<bescheid-manager.version>1.14.1</bescheid-manager.version>
+		<bescheid-manager.version>1.15.0-SNAPSHOT</bescheid-manager.version>
 		<processor-manager.version>0.4.1</processor-manager.version>
 		<nachrichten-manager.version>2.10.0-SNAPSHOT</nachrichten-manager.version>
 		<ozgcloud-starter.version>0.10.0</ozgcloud-starter.version>