diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index fa1466b7ef0d476c42fbef9ce64e2cf96e00ad05..c1d3c249f2ab9f56d1cf882a731ad625656ebf9d 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -28,7 +28,23 @@
 			<artifactId>pluto-command</artifactId>
 			<version>${pluto.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>de.itvsh.ozg.pluto</groupId>
+			<artifactId>pluto-interface</artifactId>
+			<version>${pluto.version}</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>net.devh</groupId>
+			<artifactId>grpc-client-spring-boot-starter</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct</artifactId>
+		</dependency>
 
+		<!--TEST-->
 		<dependency>
 			<groupId>de.itvsh.ozg.pluto</groupId>
 			<artifactId>pluto-command</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
new file mode 100644
index 0000000000000000000000000000000000000000..698da21850bbc1e7761bbeb88f89b45e4857c7a3
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
@@ -0,0 +1,5 @@
+package de.ozgcloud.bescheid;
+
+public class Bescheid {
+
+}
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 9b05e714cdf1a1b1bffaeb21aa819040f7df1959..6d6ad23a5b8b64764919f243f15e0c80f689e2af 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
 
 import de.itvsh.ozg.pluto.command.Command;
 import de.itvsh.ozg.pluto.command.CommandCreatedEvent;
+import de.ozgcloud.bescheid.vorgang.VorgangId;
 
 @Component
 class BescheidEventListener {
@@ -21,6 +22,7 @@ class BescheidEventListener {
 
 	public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> command.getOrder().equals(ORDER);
 
+	static final String VORGANG_ID_BODYKEY = "vorgangId";
 	static final String BESCHEID_VOM_BODYKEY = "bescheidVom";
 	static final String GENEHMIGT_BODYKEY = "genehmigt";
 
@@ -35,6 +37,7 @@ class BescheidEventListener {
 	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);
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..61d871a9202649eb02dc1208b9e2a08127cdebc1
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
@@ -0,0 +1,8 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.bescheid.vorgang.Vorgang;
+
+public interface BescheidRemoteService {
+
+	Bescheid create(BescheidRequest request, Vorgang vorgang);
+}
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 d5aa5798e6a60d6c0cd9252ddb00805c32e699c4..584ab431f885a54133b11c9379104b942bd95071 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java
@@ -2,6 +2,7 @@ package de.ozgcloud.bescheid;
 
 import java.time.LocalDate;
 
+import de.ozgcloud.bescheid.vorgang.VorgangId;
 import lombok.Builder;
 import lombok.Getter;
 
@@ -9,6 +10,8 @@ import lombok.Getter;
 @Getter
 public class BescheidRequest {
 
+	private VorgangId vorgangId;
+
 	private LocalDate bescheidVom;
 	private boolean genehmigt;
 }
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 ae4f6ca50ae5c77d989b05274e064f0330e265d3..43cf025cf7f69e4467723ac25d873ae05c4dc616 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
@@ -1,11 +1,18 @@
 package de.ozgcloud.bescheid;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.bescheid.vorgang.VorgangService;
+
 @Service
 class BescheidService {
 
+	@Autowired
+	private VorgangService vorgangService;
+
 	public void createBescheid(BescheidRequest request) {
+		var vorgang = vorgangService.getById(request.getVorgangId());
 		// TODO Auto-generated method stub
 
 	}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..326c007d02dacfc11d117fef3a3cad48dc8505d0
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java
@@ -0,0 +1,52 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+public interface FormDataEntry {
+
+	String getName();
+	String getLabel();
+
+	default boolean isSubForm() {
+		return false;
+	}
+
+	default boolean isFormEntry() {
+		return false;
+	}
+
+	@Builder
+	@Getter
+	static class SubForm implements FormDataEntry {
+
+		private String name;
+		private String label;
+
+		@Singular
+		private List<FormDataEntry> entries;
+
+		@Override
+		public boolean isSubForm() {
+			return true;
+		}
+	}
+
+	@Builder
+	@Getter
+	static class FormField implements FormDataEntry {
+
+		private String name;
+		private String label;
+
+		private Object value;
+
+		@Override
+		public boolean isFormEntry() {
+			return true;
+		}
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..debcd9c8887e1abf0d5fa491e8b1e753612ad53a
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcFormField;
+import de.itvsh.ozg.pluto.vorgang.GrpcSubForm;
+import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField;
+import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
+public interface FormDataEntryMapper {
+
+	@Mapping(target = "entries", source = "fieldList")
+	@Mapping(target = "entry", ignore = true)
+	@Mapping(target = "name", source = "title")
+	SubForm fromGrpc(GrpcSubForm subForm);
+
+	FormField fromGrpc(GrpcFormField field);
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java
new file mode 100644
index 0000000000000000000000000000000000000000..00a35140b61e9249e25b79b669a17b0a7ba6d6ef
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java
@@ -0,0 +1,56 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+@Builder
+@Getter
+public class Vorgang {
+
+	private VorgangId id;
+
+	private String name;
+
+	private String vorgangNummer;
+	private String aktenzeichen;
+
+	private Eingang eingang;
+
+	@Builder
+	@Getter
+	static class Eingang {
+		private Antragsteller antragsteller;
+		private ZustaendigeStelle zustaendigeStelle;
+
+		@Singular
+		private List<FormDataEntry> formEntries;
+	}
+
+	@Builder
+	@Getter
+	static class Antragsteller {
+		private String anrede;
+		private String nachname;
+		private String vorname;
+		private String geburtsdatum;
+		private String geburtsort;
+		private String geburtsname;
+		private String email;
+		private String telefon;
+		private String strasse;
+		private String hausnummer;
+		private String plz;
+		private String ort;
+	}
+
+	@Builder
+	@Getter
+	static class ZustaendigeStelle {
+		private String organisationseinheitenId;
+		private String email;
+	}
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java
new file mode 100644
index 0000000000000000000000000000000000000000..368cdff21a37f29ae4237f4a71722d3f762ff386
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import de.itvsh.kop.common.datatype.StringBasedValue;
+
+public class VorgangId extends StringBasedValue {
+
+	VorgangId(String vorgangId) {
+		super(vorgangId);
+	}
+
+	public static VorgangId from(String vorgangId) {
+		return new VorgangId(vorgangId);
+	}
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..27c14d88bf0ef92d01823338b460a567f180f150
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangMapper.java
@@ -0,0 +1,38 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcEingang;
+import de.itvsh.ozg.pluto.vorgang.GrpcFormData;
+import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, //
+		uses = FormDataEntryMapper.class)
+interface VorgangMapper {
+
+	@Mapping(target = "vorgangNummer", source = "nummer")
+	Vorgang mapVorgang(GrpcVorgangWithEingang vorgang);
+
+	VorgangId mapVorgangId(String vorgangId);
+
+	@Mapping(target = "formEntries", source = "formData")
+	@Mapping(target = "formEntry", ignore = true)
+	Vorgang.Eingang mapEingang(GrpcEingang eingang);
+
+	default Collection<FormDataEntry> mapFormData(GrpcFormData value) {
+		var result = new ArrayList<FormDataEntry>();
+		var entryMapper = Mappers.getMapper(FormDataEntryMapper.class);
+
+		result.addAll(value.getFieldList().stream().map(entryMapper::fromGrpc).toList());
+		result.addAll(value.getFormList().stream().map(entryMapper::fromGrpc).toList());
+
+		return Collections.unmodifiableList(result);
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a861345664f23f14bf21c42f5ee4cacefccb27a
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangRequest;
+import de.itvsh.ozg.pluto.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+import lombok.NonNull;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@Service
+class VorgangRemoteService {
+
+	@GrpcClient("pluto")
+	private VorgangServiceBlockingStub vorgangServiceStub;
+	@Autowired
+	private VorgangMapper mapper;
+
+	public Vorgang getById(@NonNull VorgangId vorgangId) {
+		var request = GrpcFindVorgangWithEingangRequest.newBuilder().setId(vorgangId.toString()).build();
+
+		var response = vorgangServiceStub.findVorgangWithEingang(request);
+		return mapper.mapVorgang(response.getVorgangWithEingang());
+	}
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..0138aaa7b8cd438281a9ed627f70c04207a43f74
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class VorgangService {
+
+	@Autowired
+	public VorgangRemoteService remoteService;
+
+	public Vorgang getById(VorgangId id) {
+		return remoteService.getById(id);
+	}
+}
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 fbe026513714e7e4ff751aa441c050a797432997..8b7f285b868b9084826821be9daab2eb7bc20215 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
@@ -32,7 +32,10 @@ class BescheidEventListenerTest {
 		@Captor
 		private ArgumentCaptor<BescheidRequest> requestCaptor;
 		private Command command = CommandTestFactory.createBuilder()
-				.bodyObject(Map.of(BESCHEID_VOM_BODYKEY, BESCHEID_VOM, GENEHMIGT_BODYKEY, GENEHMIGT))
+				.bodyObject(
+						Map.of(VORGANG_ID_BODYKEY, VORGANG_ID.toString(),
+								BESCHEID_VOM_BODYKEY, BESCHEID_VOM,
+								GENEHMIGT_BODYKEY, GENEHMIGT))
 				.build();
 
 		@Test
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 09b4686cedaf3d7713e555b9185d4af8a3056221..192ce4bc4a8569976ad5b094ec82581154302e6c 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java
@@ -2,8 +2,12 @@ package de.ozgcloud.bescheid;
 
 import java.time.LocalDate;
 
+import de.ozgcloud.bescheid.vorgang.VorgangId;
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+
 public class BescheidRequestTestFactory {
 
+	static final VorgangId VORGANG_ID = VorgangTestFactory.ID;
 	static final String BESCHEID_VOM_STRING = "2023-01-04";
 	static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING);
 	static final boolean GENEHMIGT = true;
@@ -14,6 +18,7 @@ public class BescheidRequestTestFactory {
 
 	static BescheidRequest.BescheidRequestBuilder createBuilder() {
 		return BescheidRequest.builder()
+				.vorgangId(VORGANG_ID)
 				.bescheidVom(BESCHEID_VOM)
 				.genehmigt(GENEHMIGT);
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9df3743af6aa63d49db308e095b9a8ee15e3dcb
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.bescheid;
+
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.bescheid.vorgang.VorgangService;
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+
+class BescheidServiceTest {
+
+	@InjectMocks
+	private BescheidService service;
+
+	@Mock
+	private VorgangService vorgangService;
+
+	@Nested
+	class TestCreateBescheid {
+
+		@Test
+		void shouldLoadVorgang() {
+			service.createBescheid(BescheidRequestTestFactory.create());
+
+			verify(vorgangService).getById(VorgangTestFactory.ID);
+		}
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca01142e4240b0b73ea065e9b39d23f2304bb24f
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcEingang;
+
+public class GrpcEingangTestFactory {
+
+	static GrpcEingang create() {
+		return createBuilder().build();
+	}
+
+	static GrpcEingang.Builder createBuilder() {
+		return GrpcEingang.newBuilder();
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..59021e95724ee6c1783069375c7fe1b0eab57a51
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java
@@ -0,0 +1,26 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import static de.ozgcloud.bescheid.vorgang.VorgangTestFactory.*;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangResponse;
+import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang;
+
+class GrpcVorgangWithEingangTestFactory {
+
+	static GrpcVorgangWithEingang create() {
+		return createBuilder().build();
+	}
+
+	static GrpcVorgangWithEingang.Builder createBuilder() {
+		return GrpcVorgangWithEingang.newBuilder()
+				.setId(ID.toString())
+				.setEingang(GrpcEingangTestFactory.create());
+	}
+
+	static GrpcFindVorgangWithEingangResponse createResponse() {
+		return GrpcFindVorgangWithEingangResponse.newBuilder()
+				.setVorgangWithEingang(create())
+				.build();
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..69ee79e2b5fdf79296f15f1ef8214f422105d864
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangMapperTest.java
@@ -0,0 +1,31 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+class VorgangMapperTest {
+
+	@InjectMocks
+	private VorgangMapperImpl mapper;
+
+	@Nested
+	class TestMapVorgang {
+
+		@Test
+		void shouldMapEingang() {
+			var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
+
+			assertThat(result.getEingang()).isNotNull();
+		}
+
+		@Test
+		void shouldMapVorgangId() {
+			var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
+
+			assertThat(result.getId()).isEqualTo(VorgangTestFactory.ID);
+		}
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..99a7dadc627dcc8da12e1f7948ba50f09217fa22
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java
@@ -0,0 +1,65 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import static org.assertj.core.api.Assertions.*;
+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.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangRequest;
+import de.itvsh.ozg.pluto.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+
+class VorgangRemoteServiceTest {
+
+	@Spy
+	@InjectMocks
+	private VorgangRemoteService service;
+
+	@Mock
+	private VorgangServiceBlockingStub serviceStub;
+	@Mock
+	private VorgangMapper mapper;
+
+	@Nested
+	class TestGetById {
+		@Captor
+		private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor;
+
+		@BeforeEach
+		void init() {
+			when(mapper.mapVorgang(any())).thenReturn(VorgangTestFactory.create());
+			when(serviceStub.findVorgangWithEingang(any())).thenReturn(GrpcVorgangWithEingangTestFactory.createResponse());
+		}
+
+		@Test
+		void shouldCallStubWithId() {
+			service.getById(VorgangTestFactory.ID);
+
+			verify(serviceStub).findVorgangWithEingang(requestCaptor.capture());
+			assertThat(requestCaptor.getValue()).extracting(GrpcFindVorgangWithEingangRequest::getId).isEqualTo(VorgangTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.getById(VorgangTestFactory.ID);
+
+			verify(mapper).mapVorgang(any());
+		}
+
+		@Test
+		void shouldReturnVorgang() {
+			var vorgang = service.getById(VorgangTestFactory.ID);
+
+			assertThat(vorgang).usingRecursiveComparison().isEqualTo(VorgangTestFactory.create());
+		}
+
+	}
+
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..375bd58887096ea7f101b9d07a0c1e1579ce75b1
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java
@@ -0,0 +1,46 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import static org.assertj.core.api.Assertions.*;
+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;
+
+class VorgangServiceTest {
+
+	@InjectMocks
+	private VorgangService service;
+
+	@Mock
+	private VorgangRemoteService remoteService;
+
+	@Nested
+	class TestGetById {
+
+		private Vorgang vorgang = VorgangTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(remoteService.getById(any())).thenReturn(vorgang);
+		}
+
+		@Test
+		void shouldCallRemoteService() {
+			service.getById(VorgangTestFactory.ID);
+
+			verify(remoteService).getById(VorgangTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnResult() {
+			var result = service.getById(VorgangTestFactory.ID);
+
+			assertThat(result).isEqualTo(vorgang);
+		}
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2393a6be6404e986943afc4725d0071cfe2ef9bd
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
@@ -0,0 +1,18 @@
+package de.ozgcloud.bescheid.vorgang;
+
+import java.util.UUID;
+
+public class VorgangTestFactory {
+
+	public static final VorgangId ID = VorgangId.from(UUID.randomUUID().toString());
+
+	public static Vorgang create() {
+		return createBuilder().build();
+	}
+
+	public static Vorgang.VorgangBuilder createBuilder() {
+		return Vorgang.builder()
+				.id(ID);
+	}
+
+}
diff --git a/bescheid-manager/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/bescheid-manager/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000000000000000000000000000000000000..ca6ee9cea8ec189a088d50559325d4e84ff8ad09
--- /dev/null
+++ b/bescheid-manager/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline
\ No newline at end of file