diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
index 6977a57499fc8ab21257ee7ffa79ab19f62daf38..4921595ed99fe131abde54ebfccb4f42ad2a8d3e 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
@@ -50,7 +50,11 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB
 
 	@Override
 	public void sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequest request, StreamObserver<GrpcCommand> streamObserver) {
-		throw new NotImplementedException("sendRueckfrageAnswer not implemented yet");
-	}
+		var answer = request.getAnswer();
+
+		var commandId = antragraumService.sendRueckfrageAnswer(request.getSamlToken(), answer.getRueckfrageId(), mapper.toPostfachNachricht(answer));
 
+		streamObserver.onNext(GrpcCommand.newBuilder().setId(commandId).build());
+		streamObserver.onCompleted();
+	}
 }
diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
index 136b02ff864ec238cd4db5068f2ec40b4ccecc6f..da60d2b6bc163a0aed86cbcc191ce86215de38af 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
@@ -41,4 +41,21 @@ interface AntragraumNachrichtMapper {
 	@Mapping(source = "attachments", target = "attachmentFileIdList")
 	@Mapping(target = "status", constant = DEFAULT_STATUS)
 	GrpcRueckfrage toGrpc(PostfachNachricht postfachNachricht);
+
+	@Mapping(target = "mailBody", source = "answerText")
+	@Mapping(target = "attachments", source = "attachmentFileIdList")
+	@Mapping(target = "createdAt", ignore = true)
+	@Mapping(target = "createdBy", ignore = true)
+	@Mapping(target = "direction", ignore = true)
+	@Mapping(target = "id", ignore = true)
+	@Mapping(target = "messageCode", ignore = true)
+	@Mapping(target = "messageId", ignore = true)
+	@Mapping(target = "postfachAddress", ignore = true)
+	@Mapping(target = "postfachId", ignore = true)
+	@Mapping(target = "replyOption", ignore = true)
+	@Mapping(target = "sentAt", ignore = true)
+	@Mapping(target = "sentSuccessful", ignore = true)
+	@Mapping(target = "subject", ignore = true)
+	@Mapping(target = "vorgangId", ignore = true)
+	PostfachNachricht toPostfachNachricht(GrpcRueckfrageAnswer answer);
 }
diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
index 52ca34b72393453155420fbc8f345b229b134d49..3d9ea7abd01eaa507573d2614f599654e0e2bfbf 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
@@ -82,6 +82,16 @@ public class AntragraumService {
 		return postfachNachrichtService.findRueckfragen(postfachId);
 	}
 
+	public Stream<PostfachNachricht> findRueckfrageAnswers(String rueckfrageId) {
+		return postfachNachrichtService.findAnswers(rueckfrageId);
+	}
+
+	public String sendRueckfrageAnswer(String samlToken, String rueckfrageId, PostfachNachricht nachricht) {
+		verifyToken(samlToken);
+
+		return postfachNachrichtService.persistAnswer(rueckfrageId, nachricht);
+	}
+
 	void verifyToken(String token) {
 		var errors = verifier.verify(token);
 		if (CollectionUtils.isNotEmpty(errors)) {
diff --git a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
index e421e9f1e88b9333da6caa1427fa7a80c78dc98e..c4a452ee7608bea09b1b06e4822d0bfd890e388d 100644
--- a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
@@ -23,6 +23,7 @@ package de.ozgcloud.nachrichten.antragraum;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.UUID;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -34,6 +35,7 @@ import org.mockito.Spy;
 
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
 import io.grpc.stub.StreamObserver;
 
 class AntragraumGrpcServiceTest {
@@ -81,4 +83,39 @@ class AntragraumGrpcServiceTest {
 			}
 		}
 	}
+
+	@Nested
+	class TestSendAnswer {
+		@Mock
+		private StreamObserver<GrpcCommand> streamObserver;
+
+		@BeforeEach
+		void setup() {
+			when(antragraumService.sendRueckfrageAnswer(anyString(), anyString(), any(PostfachNachricht.class)))
+					.thenReturn(UUID.randomUUID().toString());
+			when(mapper.toPostfachNachricht(any(GrpcRueckfrageAnswer.class))).thenReturn(PostfachNachrichtTestFactory.create());
+		}
+
+		@Test
+		void shouldCallMapper() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(mapper).toPostfachNachricht(any(GrpcRueckfrageAnswer.class));
+		}
+
+		@Test
+		void shouldCallOnNext() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(streamObserver).onNext(any(GrpcCommand.class));
+		}
+
+		@Test
+		void shouldCallOnCompleted() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(streamObserver).onCompleted();
+		}
+
+	}
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
index d07db58ecf7c183b3afef36cdcf27d8d7e7cbded..2a92f616cc2a3af18d8eb252219aa47451310967 100644
--- a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
@@ -24,9 +24,11 @@ import static org.assertj.core.api.Assertions.*;
 
 import java.time.format.DateTimeFormatter;
 
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
 
+import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
 
@@ -34,57 +36,83 @@ class AntragraumNachrichtMapperTest {
 
 	AntragraumNachrichtMapper mapper = Mappers.getMapper(AntragraumNachrichtMapper.class);
 
-	@Test
-	void shouldMapVorgangId() {
-		var result = map();
+	@Nested
+	class TestMapRueckfrage {
 
-		assertThat(result.getVorgangId()).isEqualTo(MessageTestFactory.VORGANG_ID);
-	}
+		@Test
+		void shouldMapVorgangId() {
+			var result = map();
 
-	@Test
-	void shouldMapId() {
-		var result = map();
+			assertThat(result.getVorgangId()).isEqualTo(MessageTestFactory.VORGANG_ID);
+		}
 
-		assertThat(result.getId()).isEqualTo(PostfachNachrichtTestFactory.ID);
-	}
+		@Test
+		void shouldMapId() {
+			var result = map();
 
-	@Test
-	void shouldMapVorgangName() {
-		var result = map();
+			assertThat(result.getId()).isEqualTo(PostfachNachrichtTestFactory.ID);
+		}
 
-		assertThat(result.getVorgangName()).isEqualTo(MessageTestFactory.SUBJECT);
-	}
+		@Test
+		void shouldMapVorgangName() {
+			var result = map();
 
-	@Test
-	void shouldMapStatus() {
-		var result = map();
+			assertThat(result.getVorgangName()).isEqualTo(MessageTestFactory.SUBJECT);
+		}
 
-		assertThat(result.getStatus()).isEqualTo(AntragraumNachrichtMapper.DEFAULT_STATUS);
-	}
+		@Test
+		void shouldMapStatus() {
+			var result = map();
 
-	@Test
-	void shouldMapSentAt() {
-		var result = map();
+			assertThat(result.getStatus()).isEqualTo(AntragraumNachrichtMapper.DEFAULT_STATUS);
+		}
 
-		assertThat(result.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
-	}
+		@Test
+		void shouldMapSendAt() {
+			var result = map();
 
-	@Test
-	void shouldMapText() {
-		var result = map();
+			assertThat(result.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
+		}
 
-		assertThat(result.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
-	}
+		@Test
+		void shouldMapText() {
+			var result = map();
+
+			assertThat(result.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
+		}
 
-	@Test
-	void shouldMapAttachments() {
-		var result = map();
+		@Test
+		void shouldMapAttachments() {
+			var result = map();
+
+			assertThat(result.getAttachmentFileIdCount()).isEqualTo(1);
+			assertThat(result.getAttachmentFileId(0)).isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS.get(0));
+		}
+
+		private GrpcRueckfrage map() {
+			return mapper.toGrpc(PostfachNachrichtTestFactory.create());
+		}
 
-		assertThat(result.getAttachmentFileIdCount()).isEqualTo(1);
-		assertThat(result.getAttachmentFileId(0)).isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS.get(0));
 	}
 
-	private GrpcRueckfrage map() {
-		return mapper.toGrpc(PostfachNachrichtTestFactory.create());
+	@Nested
+	class TestMapAnswerToPostfachNachricht {
+		@Test
+		void shouldMapText() {
+			var result = map();
+
+			assertThat(result.getMailBody()).isEqualTo(GrpcRueckfrageAnswerTestFactory.TEXT);
+		}
+
+		@Test
+		void shouldMapAttachmentIds() {
+			var result = map();
+
+			assertThat(result.getAttachments()).isEqualTo(GrpcRueckfrageAnswerTestFactory.ATTACHMENT_ID_LIST);
+		}
+
+		private PostfachNachricht map() {
+			return mapper.toPostfachNachricht(GrpcRueckfrageAnswerTestFactory.create());
+		}
 	}
 }
\ No newline at end of file