diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 92f4733ef37f28f8407b433b8497fc6d745c81ff..8336c8654864b18f5008430308e67e9a4d5298de 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -39,6 +39,10 @@
 			<artifactId>kop-common-lib</artifactId>
 		</dependency>
 		
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-freemarker</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>net.devh</groupId>
 			<artifactId>grpc-client-spring-boot-starter</artifactId>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
index 23117b0b8d641d68b832f89a7ad7372ce3e9baea..6e1207d0ec3d17322995e31e88038004bb207891 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
@@ -14,12 +14,15 @@ public class Bescheid {
 
 	private VorgangId vorgangId;
 
-	private String bescheidFileName;
+	private boolean genehmigt;
+	private UserId createdBy;
 
+	private String bescheidFileName;
 	private File bescheidFile;
 	@With
 	private FileId bescheidFileId;
 
 	private String contentType;
 	private long size;
+
 }
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 3a32abf022a00b9b38e7204a7b25ac16056cc91f..d8a5b2a91d186116dfcf6c1ec45f964970fe72a4 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
@@ -1,7 +1,6 @@
 package de.ozgcloud.bescheid;
 
 import java.time.LocalDate;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Predicate;
@@ -58,6 +57,25 @@ class BescheidEventListener {
 		}
 	}
 
+	public void doCreateBescheidBiz(@NonNull Command command) {
+		var bescheid = service.createBescheid(createRequest(command));
+		bescheid = fileService.uploadBescheidFile(bescheid);
+
+		nachrichtService.createNachrichtDraft(bescheid);
+	}
+
+	private BescheidRequest createRequest(Command command) {
+		var eventBody = command.getBodyObject();
+		var builder = BescheidRequest.builder();
+
+		Optional.ofNullable(eventBody.get(VORGANG_ID_BODYKEY)).map(String.class::cast).map(VorgangId::from).ifPresent(builder::vorgangId);
+		Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom);
+		Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt);
+		builder.createFor(UserId.from(command.getCreatedBy()));
+
+		return builder.build();
+	}
+
 	private String buildErrorMessage(Exception e) {
 		try {
 			StringBuilder sb = new StringBuilder(ERROR_MESSAGE);
@@ -76,22 +94,4 @@ class BescheidEventListener {
 			return ERROR_MESSAGE;
 		}
 	}
-
-	public void doCreateBescheidBiz(@NonNull Command command) {
-		// TODO handle exception -> set command to error
-		var bescheid = service.createBescheid(createRequest(command.getBodyObject()));
-		bescheid = fileService.uploadBescheidFile(bescheid);
-
-		nachrichtService.createNachrichtDraft(bescheid);
-	}
-
-	private BescheidRequest createRequest(Map<String, Object> eventBody) {
-		var builder = BescheidRequest.builder();
-
-		Optional.ofNullable(eventBody.get(VORGANG_ID_BODYKEY)).map(String.class::cast).map(VorgangId::from).ifPresent(builder::vorgangId);
-		Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom);
-		Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt);
-
-		return builder.build();
-	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
index 584ab431f885a54133b11c9379104b942bd95071..81b8750a77d9947c80ea10ed7938e844572fb670 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
@@ -14,4 +14,6 @@ public class BescheidRequest {
 
 	private LocalDate bescheidVom;
 	private boolean genehmigt;
+
+	private UserId createFor;
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java
index 5b8f808f602e2c96592db0b220e84174b1b79d2b..825a14ba26d42ae22648ca11592c53e04a6b02b9 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java
@@ -1,5 +1,7 @@
 package de.ozgcloud.bescheid;
 
+import java.util.Objects;
+
 import de.itvsh.kop.common.datatype.StringBasedValue;
 import lombok.EqualsAndHashCode;
 
@@ -11,6 +13,9 @@ public class UserId extends StringBasedValue {
 	}
 
 	public static UserId from(String userId) {
-		return new UserId(userId);
+		if (Objects.nonNull(userId)) {
+			return new UserId(userId);
+		}
+		return null;
 	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
index 50587cb1c2d0a10d270a1266a248f554979513a8..f743ddebf8f7f02f40eb31d1562aa10342448b27 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
@@ -10,6 +10,8 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.springframework.stereotype.Service;
+
 import com.google.protobuf.ByteString;
 
 import de.itvsh.kop.common.binaryfile.FileId;
@@ -25,6 +27,7 @@ import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
+@Service
 class BinaryFileRemoteService {
 
 	private static final String CALL_CONTEXT_CLIENT = "bescheid-manager";
@@ -57,7 +60,7 @@ class BinaryFileRemoteService {
 	private GrpcUploadBinaryFileRequest buildMetaDataRequest(Bescheid bescheid) {
 		return GrpcUploadBinaryFileRequest.newBuilder()
 				.setMetadata(GrpcUploadBinaryFileMetaData.newBuilder()
-						// TODO remove context - check wy needed!
+						// TODO remove context - check why needed!
 						.setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build())
 						.setVorgangId(bescheid.getVorgangId().toString())
 						.setField(VORGANG_ATTACHMENT_FIELD)
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
index fe8ad8ac79c793cba32dffff2157cd19dfa8c1e1..f21fed3245d56ba40fb75f526f872122cea00e82 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
@@ -1,9 +1,11 @@
 package de.ozgcloud.bescheid.binaryfile;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 import de.ozgcloud.bescheid.Bescheid;
 
+@Service
 public class BinaryFileService {
 
 	@Autowired
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
index f4c7b0015a362dd68b004251d0a6c5890e1fc6ac..bf689b4f672e86d057079629fee1145c543e5411 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
@@ -24,6 +24,7 @@ class DummyBescheidRemoteService implements BescheidRemoteService {
 				.bescheidFile(file)
 				.contentType(DUMMY_BESCHEID_CONTENT_TYPE)
 				.size(file.length())
+				.createdBy(request.getCreateFor())
 				.build();
 	}
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java
index 204319d6c67e679992ea6e2b1d58a00ecc4d6c45..d067117749aee4d1b82d5faae5cdf9b6605d80da 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java
@@ -1,7 +1,6 @@
 package de.ozgcloud.bescheid.nachricht;
 
-import java.io.File;
-
+import de.itvsh.kop.common.binaryfile.FileId;
 import de.ozgcloud.bescheid.UserId;
 import lombok.Builder;
 import lombok.Getter;
@@ -18,8 +17,7 @@ public class Nachricht {
 	@NonNull
 	private String mailBody;
 
-	private File bescheid;
-	private String bescheidFileId;
+	private FileId bescheidFileId;
 
 	@NonNull
 	private UserId createdBy;
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java
index 1007d16d85277b555b8f7dc60ff016c1fc8123d5..63e8d63c009c11147027ab1cf8b2620531165678 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java
@@ -5,6 +5,7 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.NullValueCheckStrategy;
 
+import de.itvsh.kop.common.binaryfile.FileId;
 import de.itvsh.ozg.mail.postfach.GrpcPostfachNachricht;
 
 @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, //
@@ -27,4 +28,7 @@ public interface NachrichtMapper {
 	@Mapping(target = "replyOption", constant = "FORBIDDEN")
 	GrpcPostfachNachricht mapToGrpc(Nachricht nachricht);
 
+	default String mapToSTring(FileId fileId) {
+		return fileId.toString();
+	}
 }
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 46a4c7d6228e6c76ed8a27b9f3c00bfe63fa38ca..8f79e54f5f1ffa2eadb57a9eadfeb0713644ef75 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,10 +1,16 @@
 package de.ozgcloud.bescheid.nachricht;
 
+import java.io.IOException;
+import java.io.StringWriter;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.UserId;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
 
 @Service
 public class NachrichtService {
@@ -12,8 +18,13 @@ public class NachrichtService {
 	@Autowired
 	private NachrichtRemoteService remoteService;
 
+	@Autowired
+	private Configuration freemarkerCfg;
+
 	static final String SUBJECT = "Ihr Antrag";
 
+	private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh";
+
 	public void createNachrichtDraft(Bescheid bescheid) {
 		remoteService.saveDraft(buildNachricht(bescheid));
 	}
@@ -21,13 +32,33 @@ public class NachrichtService {
 	Nachricht buildNachricht(Bescheid bescheid) {
 		return Nachricht.builder()
 				.subject(SUBJECT)
-				.mailBody(buildMessage())
-				.createdBy(UserId.from("TODO"))
+				.mailBody(buildMessage(bescheid))
+				.createdBy(bescheid.getCreatedBy())
+				.bescheidFileId(bescheid.getBescheidFileId())
 				.build();
 	}
 
-	String buildMessage() {
-		// TODO
-		return "eine Nachricht";
+	String buildMessage(Bescheid bescheid) {
+		return fillTemplate(TEMPLATE_FILE, bescheid);
+	}
+
+	private String fillTemplate(String templateName, Object dataModel) {
+		try {
+			Template template = getTemplate(templateName);
+			StringWriter stringWriter = new StringWriter();
+			template.process(dataModel, stringWriter);
+			return stringWriter.toString();
+
+		} catch (IOException | TemplateException e) {
+			throw new TechnicalException("Error filling template", e);
+		}
+	}
+
+	Template getTemplate(String templateName) {
+		try {
+			return freemarkerCfg.getTemplate(templateName);
+		} catch (IOException e) {
+			throw new TechnicalException("Error loading mail template", e);
+		}
 	}
 }
diff --git a/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh b/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh
new file mode 100644
index 0000000000000000000000000000000000000000..861bcc67d7f7cffdd9fc2608a6378b8baf23454b
--- /dev/null
+++ b/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh
@@ -0,0 +1,8 @@
+Sehr geehrte/r Antragstellende/r,
+
+ihr Antrag wurde <#if genehmigt>genehmigt<#else>abgelehnt</#if>.
+
+Sie können innerhalb von vier Wochen Einspruch einlegen.
+
+Mit freundlichen Grüßen,
+Ihre Verwaltung
\ No newline at end of file
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 b1ce78f231cea6aa2bba69034f6ce9da00af99da..d581de4ab39c9433606ef73cf9c9b538bde11ad9 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
@@ -24,7 +24,7 @@ class BescheidEventListenerITCase {
 	private BescheidService service;
 
 	@Nested
-	class TestCreateBesched {
+	class TestCreateBescheid {
 
 		private Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.ORDER).build();
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
index 192ce4bc4a8569976ad5b094ec82581154302e6c..3f5907b1cb0c0ac7c7eb386c3aa979e280fef1f2 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
@@ -2,6 +2,7 @@ package de.ozgcloud.bescheid;
 
 import java.time.LocalDate;
 
+import de.itvsh.ozg.pluto.command.CommandTestFactory;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 
@@ -20,7 +21,8 @@ public class BescheidRequestTestFactory {
 		return BescheidRequest.builder()
 				.vorgangId(VORGANG_ID)
 				.bescheidVom(BESCHEID_VOM)
-				.genehmigt(GENEHMIGT);
+				.genehmigt(GENEHMIGT)
+				.createFor(UserId.from(CommandTestFactory.CREATED_BY));
 
 	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..79fa8c20435c05640b889adc3fc647e4a6c344dd
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java
@@ -0,0 +1,42 @@
+package de.ozgcloud.bescheid.nachricht;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import de.itvsh.kop.common.test.ITCase;
+import de.ozgcloud.bescheid.BescheidTestFactory;
+
+@ITCase
+class NachrichtServiceITCase {
+
+	@Autowired
+	private NachrichtService service;
+
+	@Nested
+	class TestBuildMessage {
+		@Test
+		void shouldBuildMessage() {
+			var message = service.buildMessage(BescheidTestFactory.create());
+
+			assertThat(message).isNotBlank();
+		}
+
+		@Test
+		void shouldBeGenehmigt() {
+			var message = service.buildMessage(BescheidTestFactory.createBuilder().genehmigt(true).build());
+
+			assertThat(message).contains("genehmigt").doesNotContain("abgelehnt");
+		}
+
+		@Test
+		void shouldBeAbgelehnt() {
+			var message = service.buildMessage(BescheidTestFactory.createBuilder().genehmigt(false).build());
+
+			assertThat(message).contains("abgelehnt").doesNotContain("genehmigt");
+		}
+	}
+
+}
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 0191988327e7f7ff1a32680eaee758fca138c9bf..e2e490eeeab671179a16085e151b7ec40b8b9b06 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
@@ -35,16 +35,11 @@ class NachrichtServiceTest {
 			verify(remoteService).saveDraft(nachricht);
 		}
 
-		@Test
-		void shouldSaveBescheid() {
-
-		}
-
 		@Nested
 		class BuildNachricht {
 			@Test
 			void shouldFillMailBody() {
-				doReturn(NachrichtTestFactory.MAIL_BODY).when(service).buildMessage();
+				doReturn(NachrichtTestFactory.MAIL_BODY).when(service).buildMessage(any());
 
 				var nachricht = service.buildNachricht(BescheidTestFactory.create());
 
@@ -58,6 +53,22 @@ class NachrichtServiceTest {
 				assertThat(nachricht.getSubject()).isEqualTo(NachrichtService.SUBJECT);
 			}
 
+			@Test
+			void shouldSetUser() {
+				var nachricht = service.buildNachricht(BescheidTestFactory.create());
+
+				assertThat(nachricht.getCreatedBy()).isEqualTo(CallContextUserTestFactory.create());
+			}
+		}
+
+		@Nested
+		class BuildMessage {
+			@Test
+			void shouldBuildText() {
+				var message = service.buildMessage(BescheidTestFactory.create());
+
+				assertThat(message).isNotBlank();
+			}
 		}
 	}
 
diff --git a/bescheid-manager/src/test/resources/application-itcase.yml b/bescheid-manager/src/test/resources/application-itcase.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bfbaab098a95ddf70342dd2fdc2835404d2d902c
--- /dev/null
+++ b/bescheid-manager/src/test/resources/application-itcase.yml
@@ -0,0 +1,6 @@
+logging:
+  level:
+    ROOT: WARN,
+    '[org.springframework]': ERROR
+    '[de.itvsh]': WARN
+  config: classpath:log4j2-local.xml
\ No newline at end of file
diff --git a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
index 27cc8180b81893cfca3469feb09c833ee4527c87..08c9594a95b697ba14027c5e9c7e45722a9b0a77 100644
--- a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
+++ b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
@@ -8,6 +8,8 @@ public class CommandTestFactory {
 	public static final String ID = UUID.randomUUID().toString();
 	public static final String ORDER = "DO_TEST";
 
+	public static final String CREATED_BY = UUID.randomUUID().toString();
+
 	public static Command create() {
 		return createBuilder().build();
 	}
@@ -16,6 +18,7 @@ public class CommandTestFactory {
 		return TestCommand.builder()
 				.id(ID)
 				.body(Map.of())
-				.bodyObject(Map.of());
+				.bodyObject(Map.of())
+				.createdBy(CREATED_BY);
 	}
 }