diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidController.java
index b1a5f192ba800117d29f3c76047b127e499915d0..f843a45a6e08222a6de6cfd2cdcea7d7b78f00d8 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidController.java
@@ -23,7 +23,6 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.hateoas.CollectionModel;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.http.ResponseEntity;
@@ -35,7 +34,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
 import de.ozgcloud.alfa.common.file.OzgFile;
-import de.ozgcloud.common.errorhandling.TechnicalException;
 import lombok.RequiredArgsConstructor;
 
 @RestController
@@ -54,23 +52,12 @@ public class BescheidController {
 		return ResponseEntity.of(bescheidService.getBescheidDraft(vorgangId).map(assembler::toModel));
 	}
 
-	// TODO Sobald Grpc Schnittstelle zum Laden eines einzelnen Bescheids existiert,
-	// den Endpoint auf bescheidId beschraenken und ueber den Service ->
-	// den Bescheid laden
 	@GetMapping("/{bescheidId}/attachments")
-	public CollectionModel<EntityModel<OzgFile>> getAttachments(@PathVariable String bescheidId, @RequestParam String vorgangId) {
-		var bescheid = getBescheid(bescheidId, vorgangId);
+	public CollectionModel<EntityModel<OzgFile>> getAttachments(@PathVariable String bescheidId) {
+		var bescheid = bescheidService.getBescheid(bescheidId);
 		return binaryFileController.getFiles(bescheid.getAttachments());
 	}
 
-	Bescheid getBescheid(String bescheidId, String vorgangId) {
-		var bescheid = bescheidService.findByVorgangId(vorgangId)
-				.filter(oneBescheid -> StringUtils.equals(oneBescheid.getId(), bescheidId))
-				.findFirst();
-		return bescheid.orElseThrow(() -> new TechnicalException(String.format("No Bescheid exists for id %s.", bescheidId)));
-	}
-	//
-
 	@RestController
 	@RequestMapping(BescheidByVorgangController.BESCHEID_BY_VORGANG_PATH)
 	@RequiredArgsConstructor
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeatures.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeatures.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c1663f589d71e666f93d3eed86a84759390d67f
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeatures.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2025 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.alfa.bescheid;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+class BescheidManagerFeatures {
+
+	private boolean canCreateBescheidDocument;
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..b36b752c17c1175534391c53b8e003e0162d97ca
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapper.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2025 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.alfa.bescheid;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerFeatures;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+interface BescheidManagerFeaturesMapper {
+
+	BescheidManagerFeatures fromGrpc(GrpcBescheidManagerFeatures grpcBescheidManagerFeatures);
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidMapper.java
index a28cc6972ff033c9c265e041c716b01ed300f28d..e24e7101b1606ee6bb86cc90a294744a69661b0b 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidMapper.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidMapper.java
@@ -35,15 +35,19 @@ import com.google.protobuf.ProtocolStringList;
 import de.ozgcloud.alfa.common.binaryfile.FileId;
 import de.ozgcloud.alfa.common.binaryfile.FileIdMapper;
 import de.ozgcloud.alfa.common.user.UserIdMapper;
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcSentInfo;
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcSentInfo;
 
 @Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = { FileIdMapper.class,
 		UserIdMapper.class })
 interface BescheidMapper {
 
+	@Mapping(target = "vorgangId", ignore = true)
 	@Mapping(target = "attachments", source = "grpcBescheid.attachmentsList")
-	Bescheid fromGrpc(GrpcBescheid grpcBescheid, String vorgangId);
+	Bescheid fromGrpc(GrpcBescheid grpcBescheid);
+
+	@Mapping(target = "attachments", source = "grpcBescheid.attachmentsList")
+	Bescheid fromGrpcAndVorgangId(GrpcBescheid grpcBescheid, String vorgangId);
 
 	List<FileId> fromProtocolStringList(ProtocolStringList value);
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
index f320773cd9955240468b3273446d15b44f1e502b..f02c1ae8594ce65d7791033112b4ed7f2fda297e 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
@@ -81,7 +81,7 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc
 				methodOn(CommandByRelationController.class).createCommand(bescheid.getVorgangId(), bescheid.getId(), bescheid.getVersion(), null));
 		var uploadBescheidFileLink = linkTo(methodOn(BinaryFileController.class).uploadFile(bescheid.getVorgangId(), "bescheidFile", null));
 		var uploadAttachmentLink = linkTo(methodOn(BinaryFileController.class).uploadFile(bescheid.getVorgangId(), "bescheidAttachment", null));
-		var attachmentsLink = linkTo(methodOn(BescheidController.class).getAttachments(bescheid.getId(), bescheid.getVorgangId()));
+		var attachmentsLink = linkTo(methodOn(BescheidController.class).getAttachments(bescheid.getId()));
 		var createCommandLink = buildCreateCommandLink(bescheid);
 		var vorgangWithEingang = vorgangController.getVorgang(bescheid.getVorgangId());
 		var bescheidenUndSendenLink = linkTo(
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
index f3c5443186be698d154bb7ed2f1097a2153b308a..61e2022de3c09c46d1b0ad6084f6402aa44575df 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
@@ -26,57 +26,74 @@ package de.ozgcloud.alfa.bescheid;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.alfa.common.GrpcUtil;
-import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
-import de.ozgcloud.bescheid.GrpcGetAllBescheidRequest;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse;
+import de.ozgcloud.document.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigRequest;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigResponse;
+import de.ozgcloud.document.bescheid.GrpcGetAllBescheidRequest;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftRequest;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftResponse;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidRequest;
+import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @Service
+@RequiredArgsConstructor
 class BescheidRemoteService {
 
 	@GrpcClient(GrpcUtil.VORGANG_MANAGER_GRPC_CLIENT)
-	private BescheidServiceBlockingStub bescheidServiceStub;
-	@Autowired
-	private BescheidMapper bescheidMapper;
+	private final BescheidServiceBlockingStub bescheidServiceStub;
+	private final BescheidMapper bescheidMapper;
+	private final BescheidManagerFeaturesMapper bescheidManagerFeaturesMapper;
 
 	public Optional<Bescheid> getBescheidDraft(String vorgangId) {
 		var request = buildGetBescheidDraftRequest(vorgangId);
 		var response = bescheidServiceStub.getBescheidDraft(request);
-		return getBescheidFromResponse(response).map(bescheid -> bescheidMapper.fromGrpc(bescheid, vorgangId));
+		return getBescheidFromResponse(response).map(bescheid -> bescheidMapper.fromGrpcAndVorgangId(bescheid, vorgangId));
 	}
 
 	GrpcGetBescheidDraftRequest buildGetBescheidDraftRequest(String vorgangId) {
-		return GrpcGetBescheidDraftRequest.newBuilder()
-				.setVorgangId(vorgangId)
-				.build();
+		return GrpcGetBescheidDraftRequest.newBuilder().setVorgangId(vorgangId).build();
 	}
 
 	Optional<GrpcBescheid> getBescheidFromResponse(GrpcGetBescheidDraftResponse response) {
 		return response.hasBescheid() ? Optional.of(response.getBescheid()) : Optional.empty();
 	}
 
+	public Bescheid getBescheid(String bescheidId) {
+		var request = buildGetBescheidRequest(bescheidId);
+		var response = bescheidServiceStub.getBescheid(request);
+		return bescheidMapper.fromGrpc(response.getBescheid());
+	}
+
+	GrpcGetBescheidRequest buildGetBescheidRequest(String bescheidId) {
+		return GrpcGetBescheidRequest.newBuilder().setId(bescheidId).build();
+	}
+
 	public Stream<Bescheid> findByVorgangId(String vorgangId) {
 		var request = buildGetAllBescheidRequest(vorgangId);
 
 		var response = bescheidServiceStub.getAll(request);
 
-		return response.getBescheidList().stream().map(grpcBescheid -> bescheidMapper.fromGrpc(grpcBescheid, vorgangId));
+		return response.getBescheidList().stream().map(grpcBescheid -> bescheidMapper.fromGrpcAndVorgangId(grpcBescheid, vorgangId));
 	}
 
 	GrpcGetAllBescheidRequest buildGetAllBescheidRequest(String vorgangId) {
 		return GrpcGetAllBescheidRequest.newBuilder().setVorgangId(vorgangId).build();
 	}
 
-	// TODO Logik in den Service verschieben
-	public boolean canCreateBescheidDocument() {
-		var response = bescheidServiceStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build());
-		return response.hasFeatures() && response.getFeatures().getCanCreateBescheidDocument();
+	public BescheidManagerFeatures getBescheidManagerFeatures() {
+		return getFeatures(getConfig());
+	}
+
+	private GrpcBescheidManagerConfigResponse getConfig() {
+		return bescheidServiceStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build());
+	}
+
+	private BescheidManagerFeatures getFeatures(GrpcBescheidManagerConfigResponse configResponse) {
+		return bescheidManagerFeaturesMapper.fromGrpc(configResponse.getFeatures());
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
index d08895f986fe673b8de45be743078b4b4b99e19d..347586b0793d1d1af3f9da2b2931c87031595b7b 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
@@ -42,6 +42,10 @@ public class BescheidService {
 		return remoteService.getBescheidDraft(vorgangId);
 	}
 
+	public Bescheid getBescheid(String bescheidId) {
+		return remoteService.getBescheid(bescheidId);
+	}
+
 	public Stream<Bescheid> findByVorgangId(String vorgangId) {
 		return remoteService.findByVorgangId(vorgangId);
 	}
@@ -55,7 +59,7 @@ public class BescheidService {
 	}
 
 	public boolean canCreateBescheidDocumentAutomatically() {
-		return remoteService.canCreateBescheidDocument();
+		return remoteService.getBescheidManagerFeatures().isCanCreateBescheidDocument();
 	}
 
 	public boolean existsBescheid(String vorgangId) {
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidControllerTest.java
index 458337f0fe6848e241ab6c7c702e95fe3f1c598b..4c2526a372c9e34ea40f98f36bdbda9881194179 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidControllerTest.java
@@ -23,14 +23,13 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
+import java.util.List;
 import java.util.Optional;
-import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -39,14 +38,15 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.hateoas.CollectionModel;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
+import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
-import de.ozgcloud.common.errorhandling.TechnicalException;
 import lombok.SneakyThrows;
 
 class BescheidControllerTest {
@@ -129,15 +129,16 @@ class BescheidControllerTest {
 
 		@BeforeEach
 		void mock() {
-			doReturn(BescheidTestFactory.create()).when(controller).getBescheid(anyString(), anyString());
+			when(bescheidService.getBescheid(any())).thenReturn(BescheidTestFactory.create());
+			when(binaryFileController.getFiles(any())).thenReturn(CollectionModel.of(List.of(EntityModel.of(OzgFileTestFactory.create()))));
 		}
 
 		@SneakyThrows
 		@Test
-		void shouldGetBescheid() {
+		void shouldCallBescheidService() {
 			doRequest();
 
-			verify(controller).getBescheid(BescheidTestFactory.ID, BescheidTestFactory.VORGANG_ID);
+			verify(bescheidService).getBescheid(BescheidTestFactory.ID);
 		}
 
 		@SneakyThrows
@@ -157,47 +158,34 @@ class BescheidControllerTest {
 		}
 
 		@SneakyThrows
-		private ResultActions doRequest() {
-			return mockMvc.perform(
-					get(BescheidController.PATH + "/{bescheidId}/attachments", BescheidTestFactory.ID).param("vorgangId",
-							BescheidTestFactory.VORGANG_ID));
-		}
-	}
-
-	@DisplayName("Get Bescheid")
-	@Nested
-	class TestGetBescheid {
-
-		private final Bescheid matchingBescheid = BescheidTestFactory.create();
-		private final Bescheid notMatchingBescheid = BescheidTestFactory.createBuilder().id("NOT_MATCH").build();
+		@Test
+		void shouldHaveAttachmentName() {
+			var response = doRequest();
 
-		@BeforeEach
-		void mock() {
-			when(bescheidService.findByVorgangId(anyString())).thenReturn(Stream.of(matchingBescheid, notMatchingBescheid));
+			response.andExpect(jsonPath("$.content[0].name").value(OzgFileTestFactory.NAME));
 		}
 
-		@DisplayName("should call service to find all bescheid by vorgang")
+		@SneakyThrows
 		@Test
-		void shouldCallFindByVorgangId() {
-			controller.getBescheid(BescheidTestFactory.ID, VorgangHeaderTestFactory.ID);
+		void shouldHaveAttachmentSize() {
+			var response = doRequest();
 
-			verify(bescheidService).findByVorgangId(VorgangHeaderTestFactory.ID);
+			response.andExpect(jsonPath("$.content[0].size").value(OzgFileTestFactory.SIZE));
 		}
 
+		@SneakyThrows
 		@Test
-		void shouldReturnMatchingEntry() {
-			var bescheid = controller.getBescheid(BescheidTestFactory.ID, VorgangHeaderTestFactory.ID);
+		void shouldHaveAttachmentContentType() {
+			var response = doRequest();
 
-			assertThat(bescheid).isEqualTo(matchingBescheid);
+			response.andExpect(jsonPath("$.content[0].contentType").value(OzgFileTestFactory.CONTENT_TYPE));
 		}
 
-		@Test
-		void shouldThrowExceptionIfNoBescheidExists() {
-			when(bescheidService.findByVorgangId(anyString())).thenReturn(Stream.empty());
-
-			assertThatThrownBy(() -> controller.getBescheid(BescheidTestFactory.ID, VorgangHeaderTestFactory.ID))
-					.isInstanceOf(TechnicalException.class)
-					.hasMessageContaining("No Bescheid exists for id " + BescheidTestFactory.ID);
+		@SneakyThrows
+		private ResultActions doRequest() {
+			return mockMvc.perform(
+					get(BescheidController.PATH + "/{bescheidId}/attachments", BescheidTestFactory.ID).param("vorgangId",
+							BescheidTestFactory.VORGANG_ID));
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7914a16b1499f53f956a804b25ec1e3f81771c2
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidManagerFeaturesMapperTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2025 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.alfa.bescheid;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mapstruct.factory.Mappers;
+
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerFeatures;
+
+class BescheidManagerFeaturesMapperTest {
+
+	private final BescheidManagerFeaturesMapper mapper = Mappers.getMapper(BescheidManagerFeaturesMapper.class);
+
+	@ParameterizedTest
+	@ValueSource(booleans = {true, false})
+	void shouldMapCanCreateBescheidDocument(boolean canCreate) {
+		var grpcFeatures = GrpcBescheidManagerFeatures.newBuilder().setCanCreateBescheidDocument(canCreate).build();
+
+		var features = mapper.fromGrpc(grpcFeatures);
+
+		assertThat(features.isCanCreateBescheidDocument()).isEqualTo(canCreate);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidMapperTest.java
index 2b93192a54784deb5eb7ea1a98f68f0933cb7924..8ddaddbedd9a0678fc2ec08a01fbbc58426697f1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidMapperTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidMapperTest.java
@@ -27,8 +27,8 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.time.ZonedDateTime;
-
+import org.assertj.core.api.recursive.comparison.*;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
@@ -36,7 +36,6 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
 import de.ozgcloud.alfa.common.binaryfile.FileIdMapper;
-import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserIdMapper;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 
@@ -49,100 +48,60 @@ class BescheidMapperTest {
 	@InjectMocks
 	private final BescheidMapper mapper = Mappers.getMapper(BescheidMapper.class);
 
+	@BeforeEach
+	void init() {
+		when(fileIdMapper.toFileId(any())).thenReturn(BescheidTestFactory.ATTACHMENT_ID);
+		when(userIdMapper.fromString(any())).thenReturn(BescheidTestFactory.SENT_INFO.getSentBy());
+	}
+
 	@Nested
 	class TestFromGrpc {
 
 		@Test
-		void shouldMapId() {
-			var bescheid = map();
-
-			assertThat(bescheid.getId()).isEqualTo(GrpcBescheidTestFactory.ID);
-		}
-
-		@Test
-		void shouldMapVorgangId() {
-			var bescheid = map();
+		void shouldMapAttachments() {
+			mapper.fromGrpc(GrpcBescheidTestFactory.create());
 
-			assertThat(bescheid.getVorgangId()).isEqualTo(VorgangHeaderTestFactory.ID);
+			verify(fileIdMapper).toFileId(GrpcBescheidTestFactory.ATTACHMENT_ID);
 		}
 
 		@Test
-		void shouldMapBewilligt() {
-			var bescheid = map();
+		void shouldMapSentBy() {
+			mapper.fromGrpc(GrpcBescheidTestFactory.create());
 
-			assertThat(bescheid.getBewilligt()).isEqualTo(GrpcBescheidTestFactory.BEWILLIGT);
+			verify(userIdMapper).fromString(GrpcSentInfoTestFactory.SENT_BY);
 		}
 
 		@Test
-		void shouldMapBeschiedenAm() {
-			var bescheid = map();
+		void shouldMapAllFields() {
+			var bescheid = mapper.fromGrpc(GrpcBescheidTestFactory.create());
 
-			assertThat(bescheid.getBeschiedenAm()).isEqualTo(GrpcBescheidTestFactory.BESCHIEDEN_AM);
+			assertThat(bescheid).usingRecursiveComparison(RecursiveComparisonConfiguration.builder().withIgnoredFields("vorgangId").build())
+					.isEqualTo(BescheidTestFactory.create());
 		}
+	}
 
-		@Test
-		void shouldMapBescheidDocument() {
-			var bescheid = map();
-
-			assertThat(bescheid.getBescheidDocument()).isEqualTo(GrpcBescheidTestFactory.BESCHEID_DOCUMENT);
-		}
+	@Nested
+	class TestFromGrpcAndVorgangId {
 
 		@Test
 		void shouldMapAttachments() {
-			when(fileIdMapper.toFileId(any())).thenCallRealMethod();
-
-			var bescheid = map();
+			mapper.fromGrpc(GrpcBescheidTestFactory.create());
 
-			assertThat(bescheid.getAttachments()).containsExactlyInAnyOrderElementsOf(BescheidTestFactory.ATTACHMENTS);
+			verify(fileIdMapper).toFileId(GrpcBescheidTestFactory.ATTACHMENT_ID);
 		}
 
 		@Test
-		void shouldMapNachrichtText() {
-			var bescheid = map();
+		void shouldMapSentBy() {
+			mapper.fromGrpc(GrpcBescheidTestFactory.create());
 
-			assertThat(bescheid.getNachrichtText()).isEqualTo(GrpcBescheidTestFactory.NACHRICHT_TEXT);
+			verify(userIdMapper).fromString(GrpcSentInfoTestFactory.SENT_BY);
 		}
 
 		@Test
-		void shouldMapNachrichtSubject() {
-			var bescheid = map();
-
-			assertThat(bescheid.getNachrichtSubject()).isEqualTo(GrpcBescheidTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldMapStatus() {
-			var bescheid = map();
-
-			assertThat(bescheid.getStatus()).isEqualTo(BescheidTestFactory.STATUS);
-		}
-
-		@Nested
-		class TestMapSentInfo {
-			private final SentInfo expectedSentInfo = SentInfoTestFactory.createBuilder()
-					.sentAt(ZonedDateTime.parse(GrpcSentInfoTestFactory.SENT_AT))
-					.sentBy(UserId.from(GrpcSentInfoTestFactory.SENT_BY))
-					.build();
-
-			@Test
-			void shouldMapSentBy() {
-				when(userIdMapper.fromString(GrpcSentInfoTestFactory.SENT_BY)).thenCallRealMethod();
-
-				var bescheid = map();
-
-				assertThat(bescheid.getSentInfo().getSentBy()).isEqualTo(expectedSentInfo.getSentBy());
-			}
-
-			@Test
-			void shouldMapSentAt() {
-				var bescheid = map();
-
-				assertThat(bescheid.getSentInfo().getSentAt()).isEqualTo(expectedSentInfo.getSentAt());
-			}
-		}
+		void shouldMapAllFields() {
+			var bescheid = mapper.fromGrpcAndVorgangId(GrpcBescheidTestFactory.create(), VorgangHeaderTestFactory.ID);
 
-		private Bescheid map() {
-			return mapper.fromGrpc(GrpcBescheidTestFactory.create(), VorgangHeaderTestFactory.ID);
+			assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create());
 		}
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
index 2db87cf5d2741de5cc3ad649dfb414c8b0e31d1c..8c207f58d05b16356cdafe1a05d45ac113ccf99f 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
@@ -137,8 +137,7 @@ class BescheidModelAssemblerTest {
 			var model = callToModel();
 
 			assertThat(model.getLink(REL_ATTACHMENTS)).isPresent().get().extracting(Link::getHref)
-					.isEqualTo(String.format("%s/%s/attachments?vorgangId=%s", BescheidController.PATH, BescheidTestFactory.ID,
-							BescheidTestFactory.VORGANG_ID));
+					.isEqualTo(String.format("%s/%s/attachments", BescheidController.PATH, BescheidTestFactory.ID));
 		}
 
 		@Test
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
index 3e74aac952c10febc3d53e6322c3eec505e337af..8b2de8c267d910580a8bf6f02fc0caad59a5be35 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
@@ -38,13 +38,15 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
-import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
-import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
-import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse;
-import de.ozgcloud.bescheid.GrpcGetAllBescheidRequest;
-import de.ozgcloud.bescheid.GrpcGetAllBescheidResponse;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse;
+import de.ozgcloud.document.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigRequest;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigResponse;
+import de.ozgcloud.document.bescheid.GrpcGetAllBescheidRequest;
+import de.ozgcloud.document.bescheid.GrpcGetAllBescheidResponse;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftRequest;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftResponse;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidRequest;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidResponse;
 
 class BescheidRemoteServiceTest {
 
@@ -55,6 +57,8 @@ class BescheidRemoteServiceTest {
 	private BescheidServiceBlockingStub bescheidServiceStub;
 	@Mock
 	private BescheidMapper bescheidMapper;
+	@Mock
+	private BescheidManagerFeaturesMapper featuresMapper;
 
 	@Nested
 	class TestGetBescheidDraft {
@@ -83,18 +87,25 @@ class BescheidRemoteServiceTest {
 			verify(bescheidServiceStub).getBescheidDraft(request);
 		}
 
+		@Test
+		void shouldGetBescheidFromResponse() {
+			service.getBescheidDraft(VorgangHeaderTestFactory.ID);
+
+			verify(service).getBescheidFromResponse(response);
+		}
+
 		@Test
 		void shouldCallMapper() {
 			doReturn(Optional.of(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID)).when(service).getBescheidFromResponse(response);
 
 			service.getBescheidDraft(VorgangHeaderTestFactory.ID);
 
-			verify(bescheidMapper).fromGrpc(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID);
+			verify(bescheidMapper).fromGrpcAndVorgangId(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID);
 		}
 
 		@Test
 		void shouldReturnBescheid() {
-			when(bescheidMapper.fromGrpc(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID)).thenReturn(
+			when(bescheidMapper.fromGrpcAndVorgangId(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID)).thenReturn(
 					bescheidDraft);
 
 			var bescheidDraft = service.getBescheidDraft(VorgangHeaderTestFactory.ID);
@@ -110,13 +121,6 @@ class BescheidRemoteServiceTest {
 
 			assertThat(bescheidDraft).isEmpty();
 		}
-
-		@Test
-		void shouldGetBescheidFromResponse() {
-			service.getBescheidDraft(VorgangHeaderTestFactory.ID);
-
-			verify(service).getBescheidFromResponse(response);
-		}
 	}
 
 	@Nested
@@ -149,51 +153,92 @@ class BescheidRemoteServiceTest {
 	}
 
 	@Nested
-	class TestCanCreateBescheidDocument {
+	class TestGetBescheid {
 
-		private final GrpcBescheidManagerConfigRequest request = GrpcBescheidManagerConfigRequestTestFactory.create();
-		private final GrpcBescheidManagerConfigResponse respone = GrpcBescheidManagerConfigResponseTestFactory.create();
+		private final GrpcGetBescheidRequest request = GrpcGetBescheidRequestTestFactory.create();
+		private final GrpcGetBescheidResponse response = GrpcGetBescheidResponseTestFactory.create();
 
 		@BeforeEach
 		void setUp() {
-			when(bescheidServiceStub.getConfig(request)).thenReturn(respone);
+			doReturn(request).when(service).buildGetBescheidRequest(any());
+			when(bescheidServiceStub.getBescheid(any())).thenReturn(response);
 		}
 
 		@Test
-		void shouldCallRemoteService() {
-			service.canCreateBescheidDocument();
+		void shouldBuildGetBescheidRequest() {
+			service.getBescheid(BescheidTestFactory.ID);
 
-			verify(bescheidServiceStub).getConfig(request);
+			verify(service).buildGetBescheidRequest(BescheidTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallGrpcService() {
+			service.getBescheid(BescheidTestFactory.ID);
+
+			verify(bescheidServiceStub).getBescheid(request);
 		}
 
 		@Test
-		void shouldReturnTrue() {
-			var canCreate = service.canCreateBescheidDocument();
+		void shouldCallMapper() {
+			service.getBescheid(BescheidTestFactory.ID);
 
-			assertThat(canCreate).isTrue();
+			verify(bescheidMapper).fromGrpc(GrpcGetBescheidResponseTestFactory.GRPC_BESCHEID);
 		}
 
 		@Test
-		void shouldReturnFalseIfNoFeaturesAvailable() {
-			when(bescheidServiceStub.getConfig(request)).thenReturn(GrpcBescheidManagerConfigResponse.newBuilder().build());
+		void shouldReturnBescheid() {
+			var mappedBescheid = BescheidTestFactory.create();
+			when(bescheidMapper.fromGrpc(GrpcGetBescheidDraftResponseTestFactory.GRPC_BESCHEID)).thenReturn(mappedBescheid);
 
-			var canCreate = service.canCreateBescheidDocument();
+			var bescheid = service.getBescheid(BescheidTestFactory.ID);
 
-			assertThat(canCreate).isFalse();
+			assertThat(bescheid).isEqualTo(mappedBescheid);
 		}
+	}
+
+	@Nested
+	class TestBuildGetBescheidRequest {
 
 		@Test
-		void shouldReturnFalseIfFeatureDisabled() {
-			var respones = GrpcBescheidManagerConfigResponseTestFactory.createBuilder()
-					.setFeatures(GrpcBescheidManagerFeaturesTestFactory.createBuilder()
-							.setCanCreateBescheidDocument(false)
-							.build())
-					.build();
-			when(bescheidServiceStub.getConfig(request)).thenReturn(respones);
+		void shouldHaveId() {
+			var request = service.buildGetBescheidRequest(BescheidTestFactory.ID);
+
+			assertThat(request.getId()).isEqualTo(BescheidTestFactory.ID);
+		}
+	}
+
+	@Nested
+	class TestGetBescheidManagerFeatures {
 
-			var canCreate = service.canCreateBescheidDocument();
+		private final GrpcBescheidManagerConfigRequest request = GrpcBescheidManagerConfigRequestTestFactory.create();
+		private final GrpcBescheidManagerConfigResponse respone = GrpcBescheidManagerConfigResponseTestFactory.create();
+		private final BescheidManagerFeatures mappedFeatures = BescheidManagerFeatures.builder().build();
+
+		@BeforeEach
+		void setUp() {
+			when(bescheidServiceStub.getConfig(request)).thenReturn(respone);
+			when(featuresMapper.fromGrpc(any())).thenReturn(mappedFeatures);
+		}
+
+		@Test
+		void shouldCallGrpcService() {
+			service.getBescheidManagerFeatures();
+
+			verify(bescheidServiceStub).getConfig(request);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.getBescheidManagerFeatures();
+
+			verify(featuresMapper).fromGrpc(GrpcBescheidManagerFeaturesTestFactory.create());
+		}
+
+		@Test
+		void shouldReturnMappedFeatures() {
+			var features = service.getBescheidManagerFeatures();
 
-			assertThat(canCreate).isFalse();
+			assertThat(features).isSameAs(mappedFeatures);
 		}
 	}
 
@@ -231,12 +276,12 @@ class BescheidRemoteServiceTest {
 		void shouldMapBescheid() {
 			service.findByVorgangId(VorgangHeaderTestFactory.ID).toList();
 
-			verify(bescheidMapper).fromGrpc(GrpcGetAllBescheidResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID);
+			verify(bescheidMapper).fromGrpcAndVorgangId(GrpcGetAllBescheidResponseTestFactory.GRPC_BESCHEID, VorgangHeaderTestFactory.ID);
 		}
 
 		@Test
 		void shouldReturnStreamOfBescheide() {
-			when(bescheidMapper.fromGrpc(any(), any())).thenReturn(bescheid);
+			when(bescheidMapper.fromGrpcAndVorgangId(any(), any())).thenReturn(bescheid);
 
 			var bescheide = service.findByVorgangId(VorgangHeaderTestFactory.ID);
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
index 07cb7f98e4ef1018673fb7fbb847c2082870bb28..64f4c2b236348edaf26714e88dd10e1f73a357bb 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
@@ -74,6 +74,27 @@ class BescheidServiceTest {
 		}
 	}
 
+	@Nested
+	class TestGetBescheid {
+
+		@Test
+		void shouldCallRemoteService() {
+			service.getBescheid(BescheidTestFactory.ID);
+
+			verify(remoteService).getBescheid(BescheidTestFactory.ID);
+		}
+
+		@Test
+		void shouldReturnResultFromRemoteService() {
+			var remoteServiceResult = BescheidTestFactory.create();
+			when(remoteService.getBescheid(BescheidTestFactory.ID)).thenReturn(remoteServiceResult);
+
+			var result = service.getBescheid(BescheidTestFactory.ID);
+
+			assertThat(result).isEqualTo(remoteServiceResult);
+		}
+	}
+
 	@Nested
 	class TestFindByVorgangId {
 		private final Stream<Bescheid> bescheidsUnsorted = Stream.of(BescheidTestFactory.create());
@@ -147,19 +168,22 @@ class BescheidServiceTest {
 
 		@Test
 		void shouldCallRemoteService() {
+			when(remoteService.getBescheidManagerFeatures()).thenReturn(BescheidManagerFeatures.builder().build());
+
 			service.canCreateBescheidDocumentAutomatically();
 
-			verify(remoteService).canCreateBescheidDocument();
+			verify(remoteService).getBescheidManagerFeatures();
 		}
 
 		@ParameterizedTest
 		@ValueSource(booleans = { true, false })
-		void shouldRetrun(boolean canCreateBescheidDocument) {
-			when(remoteService.canCreateBescheidDocument()).thenReturn(canCreateBescheidDocument);
+		void shouldReturnFeatureValue(boolean featureValue) {
+			when(remoteService.getBescheidManagerFeatures()).thenReturn(
+					BescheidManagerFeatures.builder().canCreateBescheidDocument(featureValue).build());
 
-			var canCreateAutomatically = service.canCreateBescheidDocumentAutomatically();
+			var canCreate = service.canCreateBescheidDocumentAutomatically();
 
-			assertThat(canCreateAutomatically).isEqualTo(canCreateBescheidDocument);
+			assertThat(canCreate).isEqualTo(featureValue);
 		}
 	}
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidTestFactory.java
index 2f84362023d62e5ee86f533280ec3b81abe689eb..c71d8b97b9dc54bca7afa98928a53fd16e0374f1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidTestFactory.java
@@ -42,7 +42,9 @@ public class BescheidTestFactory {
 	public static final String BESCHIEDEN_AM = "2024-05-27";
 	public static final boolean BEWILLIGT = true;
 	public static final String BESCHEID_DOCUMENT = UUID.randomUUID().toString();
-	public static final List<FileId> ATTACHMENTS = List.of(FileId.from(UUID.randomUUID().toString()), FileId.from(UUID.randomUUID().toString()));
+	public static final String ATTACHMENT_ID_VALUE = UUID.randomUUID().toString();
+	public static final FileId ATTACHMENT_ID = FileId.from(ATTACHMENT_ID_VALUE);
+	public static final List<FileId> ATTACHMENTS = List.of(ATTACHMENT_ID);
 	public static final String NACHRICHT_TEXT = LoremIpsum.getInstance().getWords(10);
 	public static final String NACHRICHT_SUBJECT = LoremIpsum.getInstance().getWords(3);
 	public static final SendBy SEND_BY = SendBy.MANUAL;
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java
index c2ddf5fe79fb1427bdb2151306c4cb1768ee59d9..931249f981d8e2acec3e96e031f0ca3f68a75ad8 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigRequest;
 
 public class GrpcBescheidManagerConfigRequestTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java
index d90b382a10cbac1872efab99746096d56339733b..e28d961a6537c0b43375425623cf8467796a08e4 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerConfigResponse;
 
 public class GrpcBescheidManagerConfigResponseTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java
index 1150827c0ea0ca58770a59fd7994e7a115b601ff..ace46f083aca7c0748d9161ec077dc6c71dce2f1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java
@@ -23,7 +23,7 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import de.ozgcloud.bescheid.GrpcBescheidManagerFeatures;
+import de.ozgcloud.document.bescheid.GrpcBescheidManagerFeatures;
 
 public class GrpcBescheidManagerFeaturesTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidTestFactory.java
index 7c05a12f621586e93b7a01b8966d356765d7c9a3..c902cf1899e195310837819ca0a4eacaf8db3034 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidTestFactory.java
@@ -25,19 +25,22 @@ package de.ozgcloud.alfa.bescheid;
 
 import java.util.List;
 
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcSentInfo;
-import de.ozgcloud.common.datatype.StringBasedValue;
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcSentInfo;
 
 public class GrpcBescheidTestFactory {
 
 	public static final String ID = BescheidTestFactory.ID;
+	public static final String STATUS = BescheidTestFactory.STATUS.toString();
+	public static final long VERSION = BescheidTestFactory.VERSION;
 	public static final boolean BEWILLIGT = BescheidTestFactory.BEWILLIGT;
 	public static final String BESCHIEDEN_AM = BescheidTestFactory.BESCHIEDEN_AM;
 	public static final String BESCHEID_DOCUMENT = BescheidTestFactory.BESCHEID_DOCUMENT;
-	public static final List<String> ATTACHMENTS = BescheidTestFactory.ATTACHMENTS.stream().map(StringBasedValue::toString).toList();
+	public static final String ATTACHMENT_ID = BescheidTestFactory.ATTACHMENT_ID_VALUE;
+	public static final List<String> ATTACHMENTS = List.of(ATTACHMENT_ID);
 	public static final String NACHRICHT_TEXT = BescheidTestFactory.NACHRICHT_TEXT;
 	public static final String NACHRICHT_SUBJECT = BescheidTestFactory.NACHRICHT_SUBJECT;
+	public static final String SEND_BY = BescheidTestFactory.SEND_BY.toString();
 	public static final GrpcSentInfo SENT_INFO = GrpcSentInfoTestFactory.create();
 
 	public static GrpcBescheid create() {
@@ -47,14 +50,15 @@ public class GrpcBescheidTestFactory {
 	public static GrpcBescheid.Builder createBuilder() {
 		return GrpcBescheid.newBuilder()
 				.setId(ID)
-				.setStatus(BescheidTestFactory.STATUS.toString())
+				.setStatus(STATUS)
+				.setVersion(VERSION)
 				.setBewilligt(BEWILLIGT)
 				.setBeschiedenAm(BESCHIEDEN_AM)
 				.setBescheidDocument(BESCHEID_DOCUMENT)
 				.addAllAttachments(ATTACHMENTS)
 				.setNachrichtText(NACHRICHT_TEXT)
 				.setNachrichtSubject(NACHRICHT_SUBJECT)
-				.setSendBy(BescheidTestFactory.SEND_BY.toString())
+				.setSendBy(SEND_BY)
 				.setSentInfo(SENT_INFO);
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidRequestTestFactory.java
index ced557a1071248f836947c199f470287913cd02f..3b0e75935aea57e14099e5c8071e54e5c06a8563 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidRequestTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidRequestTestFactory.java
@@ -24,7 +24,7 @@
 package de.ozgcloud.alfa.bescheid;
 
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
-import de.ozgcloud.bescheid.GrpcGetAllBescheidRequest;
+import de.ozgcloud.document.bescheid.GrpcGetAllBescheidRequest;
 
 public class GrpcGetAllBescheidRequestTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidResponseTestFactory.java
index 9beae7eedc1980f75f54b84b6b84a5b1673816f8..b55dac63003d1347c4517defe3807a07eb1b6d60 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidResponseTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetAllBescheidResponseTestFactory.java
@@ -23,8 +23,8 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcGetAllBescheidResponse;
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcGetAllBescheidResponse;
 
 public class GrpcGetAllBescheidResponseTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftRequestTestFactory.java
index 55b44b9f40c190644ace896510645a32c565d067..8fd8dcd3b17ae9c1df208afb637b455e11ce47a1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftRequestTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftRequestTestFactory.java
@@ -24,7 +24,7 @@
 package de.ozgcloud.alfa.bescheid;
 
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftRequest;
 
 public class GrpcGetBescheidDraftRequestTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftResponseTestFactory.java
index 491f4532579b798fe419c518148eabbe0eaebdbd..43db699ca9ebb17d7da3a4ff8378dacbb863435b 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftResponseTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidDraftResponseTestFactory.java
@@ -23,8 +23,8 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse;
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidDraftResponse;
 
 public class GrpcGetBescheidDraftResponseTestFactory {
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..a78c10c0dbdc058b890b9a9c4255431d0b05e794
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidRequestTestFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2025 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.alfa.bescheid;
+
+import de.ozgcloud.document.bescheid.GrpcGetBescheidRequest;
+
+class GrpcGetBescheidRequestTestFactory {
+
+	public static GrpcGetBescheidRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidRequest.Builder createBuilder() {
+		return GrpcGetBescheidRequest.newBuilder().setId(BescheidTestFactory.ID);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d073c1b466f3888c5007a1ebe162d5f7be3247b
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcGetBescheidResponseTestFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2025 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.alfa.bescheid;
+
+import de.ozgcloud.document.bescheid.GrpcBescheid;
+import de.ozgcloud.document.bescheid.GrpcGetBescheidResponse;
+
+class GrpcGetBescheidResponseTestFactory {
+
+	public static final GrpcBescheid GRPC_BESCHEID = GrpcBescheidTestFactory.create();
+
+	public static GrpcGetBescheidResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidResponse.Builder createBuilder() {
+		return GrpcGetBescheidResponse.newBuilder().setBescheid(GRPC_BESCHEID);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcSentInfoTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcSentInfoTestFactory.java
index 39f6fa51231bde4eff18d9becc2dc6fe1f9b34fa..32342f5e1348f4a5a6f80e920462ceb7f6a8f6fa 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcSentInfoTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcSentInfoTestFactory.java
@@ -23,15 +23,12 @@
  */
 package de.ozgcloud.alfa.bescheid;
 
-import java.time.ZonedDateTime;
-
-import de.ozgcloud.alfa.common.user.GrpcUserTestFactory;
-import de.ozgcloud.bescheid.GrpcSentInfo;
+import de.ozgcloud.document.bescheid.GrpcSentInfo;
 
 public class GrpcSentInfoTestFactory {
 
-	public static final String SENT_AT = ZonedDateTime.now().toString();
-	public static final String SENT_BY = GrpcUserTestFactory.ID;
+	public static final String SENT_AT = SentInfoTestFactory.SENT_AT.toString();
+	public static final String SENT_BY = SentInfoTestFactory.SENT_BY.toString();
 
 	public static GrpcSentInfo create() {
 		return createBuilder().build();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/FileIdMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/FileIdMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f84c544ebfe0982fe0fce33c4b7e97b2c68f924
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/FileIdMapperTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2025 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.alfa.common.binaryfile;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.UUID;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+class FileIdMapperTest {
+
+	private final FileIdMapper mapper = Mappers.getMapper(FileIdMapper.class);
+	private final String fileIdValue = UUID.randomUUID().toString();
+
+	@Nested
+	class TestToFileId {
+
+		@Test
+		void shouldReturnFileId() {
+			var fileId = mapper.toFileId(fileIdValue);
+
+			assertThat(fileId).isEqualTo(FileId.from(fileIdValue));
+		}
+	}
+
+	@Nested
+	class TestToString {
+
+		@Test
+		void shouldReturnFileIdValue() {
+			var fileIdString = mapper.toString(FileId.from(fileIdValue));
+
+			assertThat(fileIdString).isEqualTo(fileIdValue);
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/UserIdMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/UserIdMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..600ad9de19051d434b04b51cf641048f70db1469
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/UserIdMapperTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2025 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.alfa.common.user;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.UUID;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.NullAndEmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mapstruct.factory.Mappers;
+
+class UserIdMapperTest {
+
+	private final UserIdMapper mapper = Mappers.getMapper(UserIdMapper.class);
+	private final String userIdValue = UUID.randomUUID().toString();
+
+	@Nested
+	class TestFromString {
+
+		@ParameterizedTest
+		@NullAndEmptySource
+		@ValueSource(strings = {" "})
+		void shouldReturnNull(String str) {
+			var userId = mapper.fromString(str);
+
+			assertThat(userId).isNull();
+		}
+
+		@Test
+		void shouldReturnUserId() {
+			var userId = mapper.fromString(userIdValue);
+
+			assertThat(userId).isEqualTo(UserId.from(userIdValue));
+		}
+
+		@Test
+		void shouldTrimUserIdString() {
+			var userId = mapper.fromString(" " + userIdValue + " ");
+
+			assertThat(userId).isEqualTo(UserId.from(userIdValue));
+		}
+	}
+
+	@Nested
+	class TestToString {
+
+		@Test
+		void shouldReturnUserIdValue() {
+			var userIdString = mapper.toString(UserId.from(userIdValue));
+
+			assertThat(userIdString).isEqualTo(userIdValue);
+		}
+	}
+}
diff --git a/lombok.config b/lombok.config
index 32903abaf7760ff694e6cc45854316eb10f87137..d248ae3c4da552a1948c74ed6736e9e9d72655bd 100644
--- a/lombok.config
+++ b/lombok.config
@@ -27,4 +27,5 @@ lombok.log.slf4j.flagUsage = ERROR
 lombok.log.log4j.flagUsage = ERROR
 lombok.data.flagUsage = ERROR
 lombok.nonNull.exceptionType = IllegalArgumentException
-lombok.addLombokGeneratedAnnotation = true
\ No newline at end of file
+lombok.addLombokGeneratedAnnotation = true
+lombok.copyableAnnotations += net.devh.boot.grpc.client.inject.GrpcClient
\ No newline at end of file