diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 601a3a2355a876358628c8def1f027f52f90aa24..79834a9e3ffd33f6befb3148c3305175b2c758ef 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -15,7 +15,7 @@
 	<version>1.8.0-SNAPSHOT</version>
 
 	<properties>
-		<vorgang-manager.version>2.2.1</vorgang-manager.version>
+		<vorgang-manager.version>2.4.0-SNAPSHOT</vorgang-manager.version>
 		<api-lib.version>0.5.0</api-lib.version>
 	</properties>
 
@@ -57,6 +57,10 @@
 			<groupId>net.devh</groupId>
 			<artifactId>grpc-client-spring-boot-starter</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>net.devh</groupId>
+			<artifactId>grpc-server-spring-boot-starter</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-freemarker</artifactId>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4618c11c3619087bce4460850047e3f476fa530
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
@@ -0,0 +1,30 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase;
+import io.grpc.stub.StreamObserver;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.server.service.GrpcService;
+
+@GrpcService
+@RequiredArgsConstructor
+class BescheidGrpcService extends BescheidServiceImplBase {
+
+	private final GrpcBescheidMapper mapper;
+
+	@Override
+	public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) {
+		// dummy implementation
+		// TODO OZG-5099 du real implementation - load Bescheid
+		var bescheid = Bescheid.builder().build();
+
+		responseObserver.onNext(buildResponse(bescheid));
+		responseObserver.onCompleted();
+
+	}
+
+	GrpcGetBescheidDraftResponse buildResponse(Bescheid bescheid) {
+		return GrpcGetBescheidDraftResponse.newBuilder()
+				.setBescheid(mapper.fromBescheid(bescheid))
+				.build();
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..371bf37a8d7262e6e46857b6b4b6853a7a033194
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java
@@ -0,0 +1,36 @@
+package de.ozgcloud.bescheid;
+
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+@Mapper
+public interface GrpcBescheidMapper {
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "bescheidDocument", ignore = true)
+	@Mapping(target = "bescheidDocumentBytes", ignore = true)
+	@Mapping(target = "beschiedenAm", ignore = true)
+	@Mapping(target = "beschiedenAmBytes", ignore = true)
+	@Mapping(target = "nachrichtSubject", ignore = true)
+	@Mapping(target = "nachrichtSubjectBytes", ignore = true)
+	@Mapping(target = "nachrichtTextBytes", ignore = true)
+	@Mapping(target = "sendBy", ignore = true)
+	@Mapping(target = "sendByBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "attachmentsList", ignore = true)
+
+	@Mapping(target = "nachrichtText", source = "nachrichtText")
+	@Mapping(target = "bewilligt", source = "genehmigt")
+	GrpcBescheid fromBescheid(Bescheid bescheid);
+
+	default String fromOptional(Optional<String> optionalString) {
+		return optionalString.orElse(StringUtils.EMPTY);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..57c05af52506e9d033711af9fc4744d88ba1438e
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
@@ -0,0 +1,80 @@
+package de.ozgcloud.bescheid;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import io.grpc.stub.StreamObserver;
+
+class BescheidGrpcServiceTest {
+
+	@Spy
+	@InjectMocks
+	private BescheidGrpcService service;
+
+	@Mock
+	private GrpcBescheidMapper mapper;
+
+	@BeforeEach
+	void initMapperMock() {
+		when(mapper.fromBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
+	}
+
+	@Nested
+	class TestGetBescheidDraft {
+
+		@Mock
+		private GrpcGetBescheidDraftRequest request;
+		@Mock
+		private StreamObserver<GrpcGetBescheidDraftResponse> responseObserver;
+
+		private static final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponse.newBuilder().build();
+
+		@BeforeEach
+		void initMocks() {
+			when(service.buildResponse(any())).thenReturn(response);
+		}
+
+		@Test
+		void shouldBuildResponse() {
+			service.getBescheidDraft(request, responseObserver);
+
+			verify(service).buildResponse(any());
+		}
+
+		@Test
+		void shouldCallNext() {
+			service.getBescheidDraft(request, responseObserver);
+
+			verify(responseObserver).onNext(response);
+		}
+
+		@Test
+		void shouldCallCompleted() {
+			service.getBescheidDraft(request, responseObserver);
+
+			verify(responseObserver).onCompleted();
+		}
+
+	}
+
+	@Nested
+	class TestBuildResponse {
+
+		@Test
+		void shouldCallMapper() {
+			Bescheid bescheid = BescheidTestFactory.create();
+
+			service.buildResponse(bescheid);
+
+			verify(mapper).fromBescheid(bescheid);
+		}
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f58b9c2405f1d1ad4cc57c38425d800b08fe7bda
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.bescheid;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+class GrpcBescheidMapperTest {
+
+	private GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class);
+
+	@Nested
+	class TestFromBescheid {
+
+		@Test
+		void shouldMapAllFields() {
+			var result = mapper.fromBescheid(BescheidTestFactory.create());
+
+			assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidTestFactory.create());
+		}
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b348feafd596790ed9a3a9138d512aa93bd57a9
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.bescheid;
+
+class GrpcBescheidTestFactory {
+
+	public static GrpcBescheid create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcBescheid.Builder createBuilder() {
+		return GrpcBescheid.newBuilder()
+				.setBewilligt(true)
+				.setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT);
+	}
+}