diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 5f5e43c0d1204185e1f1473897ea2e7d76babb0e..07ca67426a2042ed3f702a4c3ef65e621c984e13 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -15,7 +15,7 @@
 	<version>1.10.0-SNAPSHOT</version>
 
 	<properties>
-		<vorgang-manager.version>2.5.0</vorgang-manager.version>
+		<vorgang-manager.version>2.6.0-SNAPSHOT</vorgang-manager.version>
 		<api-lib.version>0.7.0-SNAPSHOT</api-lib.version>
 	</properties>
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2ba902117c7b2b566957955d9c0a1591cbc5e0f
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import java.util.Map;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class AttachedItem {
+
+	public static final String PROPERTY_ID = "id";
+	public static final String PROPERTY_CLIENT = "client";
+	public static final String PROPERTY_VORGANG_ID = "vorgangId";
+	public static final String PROPERTY_ITEM_NAME = "itemName";
+	public static final String PROPERTY_VERSION = "version";
+	public static final String PROPERTY_ITEM = "item";
+
+	private String id;
+	@Builder.Default
+	private long version = 0L;
+
+	private String client;
+	private String vorgangId;
+	private String itemName;
+
+	private Map<String, Object> item;
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2b373a33138cc4df45ea98c5f516921713f4863
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import org.mapstruct.Mapper;
+
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
+
+@Mapper(uses = { GrpcObjectMapper.class})
+interface AttachedItemMapper {
+
+	AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item);
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
index cf8d8bf0e80e6a905b5e2c5097382462744acf74..53e246ff9d1e9d293badd27fdca83e97771977ae 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
@@ -185,4 +185,7 @@ public class AttachedItemService {
 				.build();
 	}
 
+	public AttachedItem getItem(String id) {
+		return remoteService.getItem(id);
+	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
index 84b6f8aff6a040ab619ccaed13d19c08c7d3b4f7..4bc85092889c6449e0ed12193079734cc6e78459 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java
@@ -31,6 +31,7 @@ import lombok.Getter;
 
 @Builder(toBuilder = true)
 @Getter
+@Deprecated(since = "2.6.0")
 public class BescheidItem {
 
 	static final Set<String> ACCEPTED_SEND_BY_VALUES = Set.of("POSTFACH", "MANUAL");
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
index ff92f8c2f43b6525dbac9a44db3e573c4931e62e..2c915d65d934abab2636433b02e30a1eaf8e764d 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java
@@ -42,6 +42,7 @@ import lombok.RequiredArgsConstructor;
 
 @Component
 @RequiredArgsConstructor
+@Deprecated(since = "2.6.0")
 public class BescheidItemMapper {
 
 	private final GrpcObjectMapper grpcObjectMapper;
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
index e0ee53970c6e8b22f1e66b9060e7cd505847b987..aa6709149d8d968e263c86e0197e281ff99c3a8e 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
@@ -57,6 +57,8 @@ class VorgangAttachedItemRemoteService {
 	private ClientInterceptor bescheidCallContextInterceptor;
 	@Autowired
 	private BescheidItemMapper bescheidItemMapper;
+	@Autowired
+	private AttachedItemMapper attachedItemMapper;
 
 	public Optional<BescheidItem> findBescheidDraft(String vorgangId) {
 		return findBescheidDraft(buildFindRequest(vorgangId));
@@ -90,6 +92,11 @@ class VorgangAttachedItemRemoteService {
 		return bescheidItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem());
 	}
 
+	public AttachedItem getItem(String id) {
+		var grpcVorgangAttachedItemResponse = getServiceStub().getById(buildGetByIdRequest(id));
+		return attachedItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem());
+	}
+
 	GrpcVorgangAttachedItemRequest buildGetByIdRequest(String bescheidId) {
 		return GrpcVorgangAttachedItemRequest.newBuilder().setId(bescheidId).build();
 	}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class Document {
+
+	public static final String FIELD_DOCUMENT_TYPE = "type";
+	public static final String FIELD_DOCUMENT_FILE = "documentFile";
+	public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
+	public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject";
+
+	private String id;
+	private String type;
+	private String fileId;
+	private String nachrichtSubject;
+	private String nachrichtText;
+
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
new file mode 100644
index 0000000000000000000000000000000000000000..673935d696777f3708fafbe134a8a496541b0d02
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceImplBase;
+import io.grpc.stub.StreamObserver;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.server.service.GrpcService;
+
+@GrpcService
+@RequiredArgsConstructor
+public class DocumentGrpcService extends DocumentServiceImplBase {
+
+	private final DocumentService documentService;
+	private final DocumentMapper documentMapper;
+
+	@Override
+	public void getDocument(GrpcGetDocumentRequest request, StreamObserver<GrpcGetDocumentResponse> responseObserver) {
+		var document = documentService.getDocument(request.getId());
+		responseObserver.onNext(buildGetDocumentResponse(document));
+		responseObserver.onCompleted();
+	}
+
+	GrpcGetDocumentResponse buildGetDocumentResponse(Document document) {
+		return GrpcGetDocumentResponse.newBuilder().setDocument(documentMapper.toGrpcDocument(document)).build();
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..85b43ea2c05fe716168026578a7a2071cd937ee1
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import org.apache.commons.collections.MapUtils;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.bescheid.attacheditem.AttachedItem;
+
+@Mapper
+interface DocumentMapper {
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "typeBytes", ignore = true)
+	@Mapping(target = "nachrichtTextBytes", ignore = true)
+	@Mapping(target = "nachrichtSubjectBytes", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "idBytes", ignore = true)
+	@Mapping(target = "fileIdBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	GrpcDocument toGrpcDocument(Document document);
+
+	default Document fromAttacheItem(AttachedItem attachedItem) {
+		return Document.builder()
+				.id(attachedItem.getId())
+				.type(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_TYPE))
+				.fileId(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_FILE))
+				.nachrichtText(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_TEXT))
+				.nachrichtSubject(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_SUBJECT))
+				.build();
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
index 0a4e4090ec4f656f47d34d612a1cd72ef3474c56..6400a8c11d2713b1b133d06c094ceb341210201b 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
@@ -44,15 +44,17 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class DocumentService {
 
+	public static final String DOCUMENT_ITEM_NAME = "Document";
+	public static final String DOCUMENT_TYPE = "BESCHEID";
+
 	static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
-	static final String DOCUMENT_ITEM_NAME = "Document";
 	static final String FIELD_DOCUMENT_TYPE = "type";
-	static final String DOCUMENT_TYPE = "BESCHEID";
 	static final String FIELD_DOCUMENT_FILE = "documentFile";
 
 	private final AttachedItemService attachedItemService;
 	private final OzgCloudCommandService commandService;
 	private final CommandMapper commandMapper;
+	private final DocumentMapper documentMapper;
 
 	public String createBescheidDocument(Command command) {
 		validateBescheidItem(command.getRelationId());
@@ -93,4 +95,7 @@ public class DocumentService {
 		return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId);
 	}
 
+	public Document getDocument(String id) {
+		return documentMapper.fromAttacheItem(attachedItemService.getItem(id));
+	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..782c98d8cc4bc4066b43d34e9a45334d724ca7d5
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+
+class AttachedItemMapperTest {
+
+	@InjectMocks
+	private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class);
+
+	@Mock
+	private GrpcObjectMapper grpcObjectMapper;
+
+	@BeforeEach
+	void init() {
+		when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem());
+	}
+
+	@Test
+	void shouldMapFromVorgangAttachedItem() {
+		var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.setVersion(AttachedItemTestFactory.VERSION).build();
+
+		var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument());
+	}
+
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
index 3c10b5cdb070f9c0cbd60590cf805170c0491632..107f4e3caa00e1fde61ad8d7b14bad6e0e62eb79 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
@@ -727,4 +727,25 @@ class AttachedItemServiceTest {
 		}
 
 	}
+
+	@Nested
+	class TestGetItem {
+
+		@Test
+		void shouldCallRemoteService() {
+			service.getItem(BescheidItemTestFactory.ID);
+
+			verify(service).getItem(BescheidItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var expectedItem = AttachedItemTestFactory.createDocument();
+			doReturn(expectedItem).when(remoteService).getItem(any());
+
+			var result = service.getItem(BescheidItemTestFactory.ID);
+
+			assertThat(result).isEqualTo(expectedItem);
+		}
+	}
 }
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..18fa5737493cae7b9fc7907e643844f661a4d2dc
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.bescheid.attacheditem;
+
+import java.util.List;
+import java.util.Map;
+
+import de.ozgcloud.bescheid.attacheditem.AttachedItem.AttachedItemBuilder;
+import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.document.Document;
+import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.document.DocumentTestFactory;
+
+public class AttachedItemTestFactory {
+
+	public static final String ID = "bescheid-item-id";
+	public static final long VERSION = 10L;
+	public static final String CLIENT = "client";
+
+	public static final String BESCHEIDEN_AM = "2024-01-01";
+	public static final String BESCHEID_DOCUMENT = "bescheid-document";
+	public static final String ATTACHMENT = "attachment-id";
+	public static final String SEND_BY = "POSTFACH";
+	public static final String NACHRICHT_TEXT = "nachricht-text";
+	public static final String NACHRICHT_SUBJECT = "nachricht-subject";
+
+	public static AttachedItem createBescheid() {
+		return createBuilder()
+				.itemName(AttachedItemService.BESCHEID_ITEM_NAME)
+				.item(createBescheidItem())
+				.build();
+	}
+
+	public static Map<String,  Object> createBescheidItem() {
+		return Map.of(
+				BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT,
+				BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM,
+				BescheidItem.FIELD_BEWILLIGT, true,
+				BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT,
+				BescheidItem.FIELD_ATTACHMENTS, List.of(ATTACHMENT),
+				BescheidItem.FIELD_SEND_BY, SEND_BY,
+				BescheidItem.FIELD_NACHRICHT_TEXT, NACHRICHT_TEXT,
+				BescheidItem.FIELD_NACHRICHT_SUBJECT, NACHRICHT_SUBJECT);
+	}
+
+	public static AttachedItem createDocument() {
+		return createBuilder()
+				.itemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.item(createDocumentItem())
+				.build();
+	}
+
+	public static Map<String, Object> createDocumentItem() {
+		return Map.of(
+				Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE,
+				Document.FIELD_DOCUMENT_FILE, DocumentTestFactory.DOCUMENT_FILE,
+				Document.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT,
+				Document.FIELD_NACHRICHT_SUBJECT, DocumentTestFactory.NACHRICHT_SUBJECT
+		);
+	}
+
+	public static AttachedItemBuilder createBuilder() {
+		return AttachedItem.builder()
+				.id(ID)
+				.version(VERSION)
+				.client(CLIENT)
+				.vorgangId(CommandTestFactory.VORGANG_ID);
+	}
+
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
index 88259ab1300ec4b86712144b5c196f761c7a231a..444249e06cc391cd8b6d05304ab33f93134cb899 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
@@ -26,7 +26,6 @@
 package de.ozgcloud.bescheid.attacheditem;
 
 import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Map;
@@ -51,7 +50,6 @@ import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest;
 import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse;
 import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub;
 import io.grpc.ClientInterceptor;
-import io.grpc.StatusRuntimeException;
 
 class VorgangAttachedItemRemoteServiceTest {
 
@@ -67,6 +65,8 @@ class VorgangAttachedItemRemoteServiceTest {
 	private ClientInterceptor bescheidCallContextInterceptor;
 	@Mock
 	private BescheidItemMapper bescheidItemMapper;
+	@Mock
+	private AttachedItemMapper attachedItemMapper;
 
 	@Nested
 	class TestFindBescheidDraft {
@@ -308,15 +308,77 @@ class VorgangAttachedItemRemoteServiceTest {
 			assertThat(result).isEqualTo(expectedBescheid);
 		}
 
+		private BescheidItem getBescheid() {
+			return service.getBescheid(BescheidItemTestFactory.ID);
+		}
+	}
+
+	@Nested
+	class TestGetItem {
+
+		@Mock
+		private GrpcVorgangAttachedItemRequest grpcVorgangAttachedItemRequest;
+		@Mock
+		private GrpcVorgangAttachedItemResponse grpcVorgangAttachedItemResponse;
+		@Mock
+		private GrpcVorgangAttachedItem grpcVorgangAttachedItem;
+
+		@BeforeEach
+		void init() {
+			when(serviceStub.getById(any())).thenReturn(grpcVorgangAttachedItemResponse);
+			doReturn(serviceStub).when(service).getServiceStub();
+		}
+
 		@Test
-		void shouldThrowExceptionIfNotFound() {
-			when(serviceStub.getById(any())).thenThrow(StatusRuntimeException.class);
+		void shouldCallGetServiceStab() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
 
-			assertThrows(StatusRuntimeException.class, this::getBescheid);
+			verify(service).getServiceStub();
 		}
 
-		private BescheidItem getBescheid() {
-			return service.getBescheid(BescheidItemTestFactory.ID);
+		@Test
+		void shouldCallBuildRequest() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
+
+			verify(service).buildGetByIdRequest(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallGetById() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+			doReturn(grpcVorgangAttachedItemRequest).when(service).buildGetByIdRequest(any());
+
+			getItem();
+
+			verify(serviceStub).getById(grpcVorgangAttachedItemRequest);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			getItem();
+
+			verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem);
+		}
+
+		@Test
+		void shouldReturnFoundBescheid() {
+			var expectedItem = AttachedItemTestFactory.createDocument();
+			when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedItem);
+			when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem);
+
+			var result = getItem();
+
+			assertThat(result).isEqualTo(expectedItem);
+		}
+
+		private AttachedItem getItem() {
+			return service.getItem(BescheidItemTestFactory.ID);
 		}
 	}
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2157ed90a4161e3e67bfd1dcc30f0010c5ca390
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+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 DocumentGrpcServiceTest {
+
+	@Spy
+	@InjectMocks
+	private DocumentGrpcService service;
+
+	@Mock
+	private DocumentService documentService;
+	@Mock
+	private DocumentMapper documentMapper;
+
+	@Nested
+	class TestGetDocument {
+
+		private final static GrpcGetDocumentRequest REQUEST = GrpcGetDocumentRequest.newBuilder().setId(DocumentTestFactory.ID).build();
+
+		@Mock
+		private GrpcGetDocumentResponse response;
+		@Mock
+		private StreamObserver<GrpcGetDocumentResponse> responseObserver;
+
+		@BeforeEach
+		void init() {
+			doReturn(response).when(service).buildGetDocumentResponse(any());
+		}
+
+		@Test
+		void shouldCallDocumentService() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(documentService).getDocument(DocumentTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallBuildResponse() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(service).buildGetDocumentResponse(any());
+		}
+
+		@Test
+		void shouldCallOnNext() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(responseObserver).onNext(response);
+		}
+
+		@Test
+		void shouldCallOnCompleted() {
+			service.getDocument(REQUEST, responseObserver);
+
+			verify(responseObserver).onCompleted();
+		}
+	}
+
+	@Nested
+	class TestBuildGetDocumentResponse {
+
+		@Mock
+		private GrpcDocument grpcDocument;
+
+		@BeforeEach
+		void init() {
+			when(documentMapper.toGrpcDocument(any())).thenReturn(grpcDocument);
+		}
+
+		@Test
+		void shouldCallDocumentMapper() {
+			var document = DocumentTestFactory.create();
+
+			service.buildGetDocumentResponse(document);
+
+			verify(documentMapper).toGrpcDocument(document);
+		}
+
+		@Test
+		void shouldSetDocument() {
+			var result = service.buildGetDocumentResponse(DocumentTestFactory.create());
+
+			assertThat(result.getDocument()).isEqualTo(grpcDocument);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..889c1d5609d248320868317704b5b553ffd9bab6
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+class DocumentMapperTest {
+
+	private DocumentMapper mapper = Mappers.getMapper(DocumentMapper.class);
+
+	@Test
+	void shouldMapDocument() {
+		var result = mapper.toGrpcDocument(DocumentTestFactory.create());
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(GrpcDocumentTestFactory.create());
+	}
+
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
index 9ade6417382b7da3c7968fb1b994f2c568fd51eb..d97c1176e3ba0e435914364ed92a077d00f2ddc5 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
@@ -44,6 +44,7 @@ import de.ozgcloud.apilib.common.datatypes.GenericId;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
 import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
+import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
 import de.ozgcloud.bescheid.attacheditem.BescheidItem;
 import de.ozgcloud.bescheid.attacheditem.BescheidItemTestFactory;
 import de.ozgcloud.command.Command;
@@ -65,6 +66,8 @@ class DocumentServiceTest {
 	private CommandMapper commandMapper;
 	@Mock
 	private AttachedItemService attachedItemService;
+	@Mock
+	private DocumentMapper documentMapper;
 
 	private Command command = CommandTestFactory.createBuilder()
 			.relationId(RELATION_ID)
@@ -293,4 +296,34 @@ class DocumentServiceTest {
 		}
 	}
 
+	@Nested
+	class TestGetDocument {
+
+		@Test
+		void shouldCallAttachedItemService() {
+			service.getDocument(AttachedItemTestFactory.ID);
+
+			verify(attachedItemService).getItem(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallDocumentMapper() {
+			var expectedItem  = AttachedItemTestFactory.createDocument();
+			when(attachedItemService.getItem(any())).thenReturn(expectedItem);
+
+			service.getDocument(AttachedItemTestFactory.ID);
+
+			verify(documentMapper).fromAttacheItem(expectedItem);
+		}
+
+		@Test
+		void shouldReturnDocument() {
+			var expectedDocument = DocumentTestFactory.create();
+			when(documentMapper.fromAttacheItem(any())).thenReturn(expectedDocument);
+
+			Document document = service.getDocument(AttachedItemTestFactory.ID);
+
+			assertThat(document).isEqualTo(expectedDocument);
+		}
+	}
 }
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..0484d6f5492a0b4fe72bbd87b6980797c9bb6110
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import de.ozgcloud.document.Document.DocumentBuilder;
+
+public class DocumentTestFactory {
+
+	public static final String ID = "documentId";
+	public static final String TYPE = "type";
+	public static final String DOCUMENT_FILE = "file-id";
+	public static final String NACHRICHT_SUBJECT = "subject";
+	public static final String NACHRICHT_TEXT = "text";
+
+	public static Document create() {
+		return createBuilder().build();
+	}
+
+	public static DocumentBuilder createBuilder() {
+		return Document.builder()
+				.id(ID)
+				.type(TYPE)
+				.fileId(DOCUMENT_FILE)
+				.nachrichtSubject(NACHRICHT_SUBJECT)
+				.nachrichtText(NACHRICHT_TEXT);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c56530f7b13a986c3cd6fd0914bfc9201d152b7
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+public class GrpcDocumentTestFactory {
+
+	public static GrpcDocument create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcDocument.Builder createBuilder() {
+		return GrpcDocument.newBuilder()
+				.setId(DocumentTestFactory.ID)
+				.setType(DocumentTestFactory.TYPE)
+				.setFileId(DocumentTestFactory.DOCUMENT_FILE)
+				.setNachrichtSubject(DocumentTestFactory.NACHRICHT_SUBJECT)
+				.setNachrichtText(DocumentTestFactory.NACHRICHT_TEXT);
+	}
+}
diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto
new file mode 100644
index 0000000000000000000000000000000000000000..ff0025a2197b3ba328547cd595f741ea95852310
--- /dev/null
+++ b/vorgang-manager-interface/src/main/protobuf/document.model.proto
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+ syntax = "proto3";
+
+ package de.ozgcloud.document;
+
+ option java_multiple_files = true;
+ option java_package = "de.ozgcloud.document";
+ option java_outer_classname = "DocumentModelProto";
+
+message GrpcGetDocumentRequest {
+	string id = 1;
+}
+
+message GrpcGetDocumentResponse {
+	GrpcDocument document = 1;
+}
+
+message GrpcDocument {
+	string id = 1;
+	string type = 2;
+	string fileId = 3;
+	string nachrichtSubject = 4;
+	string nachrichtText = 5;
+}
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/document.proto b/vorgang-manager-interface/src/main/protobuf/document.proto
new file mode 100644
index 0000000000000000000000000000000000000000..c2a903373b229e3461932fa15e50706a9e5b41af
--- /dev/null
+++ b/vorgang-manager-interface/src/main/protobuf/document.proto
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+syntax = "proto3";
+
+package de.ozgcloud.document;
+
+import "document.model.proto";
+
+option java_multiple_files = true;
+option java_package = "de.ozgcloud.document";
+option java_outer_classname = "DocumentProto";
+
+service DocumentService {
+  rpc GetDocument(GrpcGetDocumentRequest) returns (GrpcGetDocumentResponse) {}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..95720de7ca399b35508f54d47da2550cb858dadd
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.document;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.test.annotation.DirtiesContext;
+
+import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
+import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
+import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceBlockingStub;
+import de.ozgcloud.vorgang.VorgangManagerServerApplication;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
+import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
+import io.grpc.StatusRuntimeException;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = {
+		"grpc.server.inProcessName=test",
+		"grpc.server.port=-1",
+		"grpc.client.vorgang-manager.address=in-process:test",
+		"grpc.client.inProcess.address=in-process:test",
+})
+@DataITCase
+@DirtiesContext
+class DocumentGrpcServiceITCase {
+
+	@GrpcClient("inProcess")
+	private DocumentServiceBlockingStub documentServiceStub;
+
+	@Autowired
+	private MongoOperations mongoOperations;
+
+	@MockBean
+	private CurrentUserService currentUserService;
+	@Mock
+	private CallContextUser callContextUser;
+
+	@BeforeEach
+	void init() {
+		mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
+		when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser));
+		when(currentUserService.getUser()).thenReturn(callContextUser);
+	}
+
+	@Test
+	void shouldGetDocument() {
+		var documentId = saveDocument();
+
+		var response = documentServiceStub.getDocument(GrpcGetDocumentRequest.newBuilder().setId(documentId).build());
+
+		assertThat(response.hasDocument()).isTrue();
+	}
+
+	@Test
+	void shouldThrowExceptionWhenDocumentNotFound() {
+		saveDocument();
+		var request = GrpcGetDocumentRequest.newBuilder().setId("not-found").build();
+
+		Assertions.assertThrows(StatusRuntimeException.class, () -> documentServiceStub.getDocument(request));
+	}
+
+	private String saveDocument() {
+		var document  = VorgangAttachedItemTestFactory.createBuilder()
+				.id(null)
+				.version(0)
+				.itemName(DocumentService.DOCUMENT_ITEM_NAME)
+				.item(Map.of(
+								Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE,
+								Document.FIELD_DOCUMENT_FILE, "file-id",
+								Document.FIELD_NACHRICHT_TEXT, "nachricht-text",
+								Document.FIELD_NACHRICHT_SUBJECT, "nachricht-subject"))
+				.build();
+		return mongoOperations.save(document, VorgangAttachedItem.COLLECTION_NAME).getId();
+	}
+}