diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
index 0d576aabd573e0bce86a53334a0914068b0a842a..f0c954007b2aabfa4ed9c3af1e3a3499bb323a04 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
@@ -84,6 +84,7 @@ interface AntragraumNachrichtMapper {
 		return ZonedDateTime.parse(sentAt);
 	}
 
+	@Mapping(target = "sentAtBytes", ignore = true)
 	@Mapping(target = "mergeFrom", ignore = true)
 	@Mapping(target = "clearField", ignore = true)
 	@Mapping(target = "clearOneof", ignore = true)
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/NachrichtId.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/NachrichtId.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbba4ee93f6c56f350c6968a78f122b5231e8477
--- /dev/null
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/NachrichtId.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.nachrichten.postfach;
+
+import org.mapstruct.ObjectFactory;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+class NachrichtId extends StringBasedValue {
+
+	NachrichtId(String vorgangId) {
+		super(vorgangId);
+	}
+
+	@ObjectFactory
+	public static NachrichtId from(String vorgangId) {
+		return new NachrichtId(vorgangId);
+	}
+}
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java
index 260983f3386173286bddb7641b19d7ab1e7b8df6..033d930b45919ce4b21913e936fdae33ccd4c7eb 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImpl.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.commons.codec.binary.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
@@ -37,19 +37,24 @@ import org.springframework.stereotype.Service;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
+import de.ozgcloud.apilib.user.OzgCloudUserId;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.nachrichten.NachrichtenManagerConfiguration;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangService;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @Service
 @Primary
 public class PersistPostfachNachrichtServiceImpl implements PersistPostfachNachrichtService {
 
 	private static final String NOT_IMPLEMENTED_MESSAGE = "Not implemented. Use gRPC API instead.";
+
 	static final String CLIENT = "OzgCloud_NachrichtenManager";
 	static final String ITEM_NAME = "PostfachMail";
 
 	static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
+	static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM";
 
 	static final String CLIENT_FIELD = "client";
 	static final String VORGANG_ID_FIELD = "vorgangId";
@@ -75,11 +80,49 @@ public class PersistPostfachNachrichtServiceImpl implements PersistPostfachNachr
 
 	@Override
 	public void persistNachricht(Optional<String> userId, PostfachNachricht nachricht) {
-		if (vorgangManagerNachrichtService != null) {
-			vorgangManagerNachrichtService.persistNachricht(userId, nachricht);
-			return;
-		}
-		throw new UnsupportedOperationException(NOT_IMPLEMENTED_MESSAGE);
+		var commandBuilder = createBaseCommandBuilder(userId, nachricht);
+		commandService.create(buildNachrichtCommand(commandBuilder, nachricht));
+	}
+
+	OzgCloudCommand.OzgCloudCommandBuilder createBaseCommandBuilder(Optional<String> userId, PostfachNachricht nachricht) {
+		var commandBuilder = OzgCloudCommand.builder().vorgangId(OzgCloudVorgangId.from(nachricht.getVorgangId()));
+
+		userId.map(OzgCloudUserId::from).ifPresent(commandBuilder::createdBy);
+
+		return commandBuilder;
+	}
+
+	OzgCloudCommand buildNachrichtCommand(OzgCloudCommand.OzgCloudCommandBuilder commandBuilder, PostfachNachricht nachricht) {
+		return StringUtils.isBlank(nachricht.getId()) ? buildCreateCommand(commandBuilder, nachricht) : buildUpdateCommand(commandBuilder, nachricht);
+	}
+
+	OzgCloudCommand buildCreateCommand(OzgCloudCommand.OzgCloudCommandBuilder builder, PostfachNachricht nachricht) {
+		return builder.order(CREATE_ATTACHED_ITEM_ORDER)
+				.relationId(OzgCloudVorgangId.from(nachricht.getVorgangId()))
+				.bodyObject(buildCreateItem(nachricht))
+				.build();
+	}
+
+	private Map<String, Object> buildCreateItem(PostfachNachricht nachricht) {
+		return Map.of(
+				CLIENT_FIELD, CLIENT,
+				VORGANG_ID_FIELD, nachricht.getVorgangId(),
+				ITEM_NAME_FIELD, ITEM_NAME,
+				ITEM_FIELD, postfachNachrichtMapper.mapToMap(nachricht));
+	}
+
+	OzgCloudCommand buildUpdateCommand(OzgCloudCommand.OzgCloudCommandBuilder builder, PostfachNachricht nachricht) {
+		return builder
+				.order(UPDATE_ATTACHED_ITEM_ORDER)// TOCHECK: Auf Patch umstellen
+				.relationId(NachrichtId.from(nachricht.getId()))
+				.bodyObject(buildUpdateItem(nachricht))
+				.build();
+	}
+
+	private Map<String, Object> buildUpdateItem(PostfachNachricht nachricht) {
+		return Map.of(
+				CLIENT_FIELD, CLIENT,
+				ITEM_FIELD, postfachNachrichtMapper.mapToMap(nachricht));
 	}
 
 	@Override
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
index c2783a9fbe16fea8bf94b4740b5f304e937d3547..7c9ce56fee998de321c44bb1b0ee9348a33466cc 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
@@ -104,6 +104,7 @@ public abstract class PostfachNachrichtMapper {
 		return (attachments instanceof String attachment && StringUtils.isNotBlank(attachment)) || attachments instanceof Collection;
 	}
 
+	@SuppressWarnings("unchecked")
 	private Iterable<String> getAttachments(Object attachments) {
 		if (attachments instanceof String attachment) {
 			return Collections.singletonList(attachment);
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
index 02d2d73f90b8d8147e58adcb2c19a5117aa37c0f..3d19a893a3b690daa91f8548bc9809e6260342b4 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
@@ -5,6 +5,7 @@ import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
 
@@ -38,6 +39,276 @@ class PersistPostfachNachrichtServiceImplTest {
 	@Mock
 	private PostfachNachrichtMapper postfachNachrichtMapper;
 
+	@DisplayName("Persist nachricht")
+	@Nested
+	class TestPersistNachricht {
+
+		private final String userId = UUID.randomUUID().toString();
+		private final Optional<String> userIdOpt = Optional.of(userId);
+
+		private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder().id(null).build();
+
+		private final OzgCloudCommand.OzgCloudCommandBuilder commandBuilder = OzgCloudCommand.builder();
+		private final OzgCloudCommand command = OzgCloudCommand.builder().build();
+
+		@BeforeEach
+		void mock() {
+			doReturn(commandBuilder).when(service).createBaseCommandBuilder(any(), any());
+			doReturn(command).when(service).buildNachrichtCommand(any(), any());
+		}
+
+		@Test
+		void shouldCreateBaseCommandBuilder() {
+			service.persistNachricht(userIdOpt, nachricht);
+
+			verify(service).createBaseCommandBuilder(userIdOpt, nachricht);
+		}
+
+		@Test
+		void shouldBuildNachrichtCommand() {
+			service.persistNachricht(userIdOpt, nachricht);
+
+			verify(service).buildNachrichtCommand(commandBuilder, nachricht);
+		}
+
+		@Test
+		void shouldCallCommandService() {
+			service.persistNachricht(userIdOpt, nachricht);
+
+			verify(commandService).create(command);
+		}
+	}
+
+	@DisplayName("Create base command builder")
+	@Nested
+	class TestCreateBaseComandBuilder {
+
+		private final String userId = UUID.randomUUID().toString();
+		private final Optional<String> userIdOpt = Optional.of(userId);
+
+		private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder().id(null).build();
+
+		@Test
+		void shouldContainVorgangId() {
+			var command = service.createBaseCommandBuilder(userIdOpt, nachricht).build();
+
+			assertThat(command.getVorgangId()).hasToString(MessageTestFactory.VORGANG_ID);
+		}
+
+		@DisplayName("created by")
+		@Nested
+		class TestCreatedBy {
+
+			@Test
+			void shouldBeAddIfIsPresent() {
+				var command = service.createBaseCommandBuilder(userIdOpt, nachricht).build();
+
+				assertThat(command.getCreatedBy()).hasToString(userId);
+			}
+
+			@Test
+			void shouldNotBeAddIfMissing() {
+				var command = service.createBaseCommandBuilder(Optional.empty(), nachricht).build();
+
+				assertThat(command.getCreatedBy()).isNull();
+			}
+		}
+	}
+
+	@DisplayName("Build nachricht command")
+	@Nested
+	class TestBuildNachrichtCommand {
+
+		private final OzgCloudCommand.OzgCloudCommandBuilder commandBuilder = OzgCloudCommand.builder();
+		private final OzgCloudCommand command = OzgCloudCommand.builder().build();
+
+		@DisplayName("on present id")
+		@Nested
+		class TestOnPresentId {
+
+			private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.create();
+
+			@BeforeEach
+			void mock() {
+				doReturn(command).when(service).buildUpdateCommand(any(), any());
+			}
+
+			@Test
+			void shouldBuildUpdateCommand() {
+				service.buildNachrichtCommand(commandBuilder, nachricht);
+
+				verify(service).buildUpdateCommand(commandBuilder, nachricht);
+			}
+
+			@Test
+			void shouldReturnValue() {
+				var nachrichtCommand = service.buildNachrichtCommand(commandBuilder, nachricht);
+
+				assertThat(nachrichtCommand).isEqualTo(command);
+			}
+		}
+
+		@DisplayName("on missing id")
+		@Nested
+		class TestOnMissingId {
+
+			private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder().id(null).build();
+
+			@BeforeEach
+			void mock() {
+				doReturn(command).when(service).buildCreateCommand(any(), any());
+			}
+
+			@Test
+			void shouldBuildCreateCommand() {
+				service.buildNachrichtCommand(commandBuilder, nachricht);
+
+				verify(service).buildCreateCommand(commandBuilder, nachricht);
+			}
+
+			@Test
+			void shouldReturnValue() {
+				var nachrichtCommand = service.buildNachrichtCommand(commandBuilder, nachricht);
+
+				assertThat(nachrichtCommand).isEqualTo(command);
+			}
+		}
+
+		@DisplayName("for creation")
+		@Nested
+		class TestBuildCreateCommand {
+
+			private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder().id(null).build();
+
+			@Test
+			void shouldContainOrder() {
+				var command = buildCreateCommand();
+
+				assertThat(command.getOrder()).isEqualTo(PersistPostfachNachrichtServiceImpl.CREATE_ATTACHED_ITEM_ORDER);
+			}
+
+			@Test
+			void shouldContainRelationId() {
+				var command = buildCreateCommand();
+
+				assertThat(command.getRelationId()).hasToString(MessageTestFactory.VORGANG_ID);
+			}
+
+			@DisplayName("bodyObject")
+			@Nested
+			class TestBodyObject {
+
+				private final Map<String, Object> itemMap = Map.of("dummyKey", "dummyValue");
+
+				@BeforeEach
+				void mock() {
+					when(postfachNachrichtMapper.mapToMap(any())).thenReturn(itemMap);
+				}
+
+				@Test
+				void shouldContainClient() {
+					var command = buildCreateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.CLIENT_FIELD,
+							PersistPostfachNachrichtServiceImpl.CLIENT);
+				}
+
+				@Test
+				void shouldContainVorgangId() {
+					var command = buildCreateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.VORGANG_ID_FIELD,
+							MessageTestFactory.VORGANG_ID);
+				}
+
+				@Test
+				void shouldContainItemName() {
+					var command = buildCreateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.ITEM_NAME_FIELD,
+							PersistPostfachNachrichtServiceImpl.ITEM_NAME);
+				}
+
+				@Test
+				void shouldCallMapper() {
+					buildCreateCommand();
+
+					verify(postfachNachrichtMapper).mapToMap(nachricht);
+				}
+
+				@Test
+				void shouldContainItem() {
+					var command = buildCreateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.ITEM_FIELD, itemMap);
+				}
+			}
+
+			private OzgCloudCommand buildCreateCommand() {
+				return service.buildCreateCommand(commandBuilder, nachricht);
+			}
+		}
+
+		@DisplayName("for update")
+		@Nested
+		class TestBuildUpdateCommand {
+
+			private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.create();
+
+			@Test
+			void shouldContainOrder() {
+				var command = buildUpdateCommand();
+
+				assertThat(command.getOrder()).isEqualTo(PersistPostfachNachrichtServiceImpl.UPDATE_ATTACHED_ITEM_ORDER);
+			}
+
+			@Test
+			void shouldContainRelationId() {
+				var command = buildUpdateCommand();
+
+				assertThat(command.getRelationId()).hasToString(PostfachNachrichtTestFactory.ID);
+			}
+
+			@DisplayName("bodyObject")
+			@Nested
+			class TestBodyObject {
+
+				private final Map<String, Object> itemMap = Map.of("dummyKey", "dummyValue");
+
+				@BeforeEach
+				void mock() {
+					when(postfachNachrichtMapper.mapToMap(any())).thenReturn(itemMap);
+				}
+
+				@Test
+				void shouldContainClient() {
+					var command = buildUpdateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.CLIENT_FIELD,
+							PersistPostfachNachrichtServiceImpl.CLIENT);
+				}
+
+				@Test
+				void shouldCallMapper() {
+					buildUpdateCommand();
+
+					verify(postfachNachrichtMapper).mapToMap(nachricht);
+				}
+
+				@Test
+				void shouldContainItem() {
+					var command = buildUpdateCommand();
+
+					assertThat(command.getBodyObject()).containsEntry(PersistPostfachNachrichtServiceImpl.ITEM_FIELD, itemMap);
+				}
+			}
+
+			private OzgCloudCommand buildUpdateCommand() {
+				return service.buildUpdateCommand(commandBuilder, nachricht);
+			}
+		}
+	}
+
 	@DisplayName("Persist answer")
 	@Nested
 	class TestPersistAnswer {