diff --git a/Jenkinsfile b/Jenkinsfile
index 68d5ff909746390e066b0536415c8385e7c263c4..b76916e3910566d713e0e2f32087aa3349dd9dc5 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -57,15 +57,15 @@ pipeline {
           steps {
                 script {
                     FAILED_STAGE=env.STAGE_NAME
-                    JAR_TAG = getPomVersion('pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT")
+                    VORGANG_MANAGER_TAG = getPomVersion('pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT");
                     BESCHEID_MANAGER_TAG = getPomVersion('bescheid-manager/pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT")
-                    updateBescheidManagerDependencyVersion(BESCHEID_MANAGER_TAG)
                     
+                    updateDependencyVersions(BESCHEID_MANAGER_TAG, VORGANG_MANAGER_TAG)
                 }
                 configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
-                    sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${JAR_TAG} -DprocessAllModules=true"
+                    sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${VORGANG_MANAGER_TAG} -DprocessAllModules=true -X"
                     dir('bescheid-manager') {
-                        sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${BESCHEID_MANAGER_TAG}"
+                        sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${BESCHEID_MANAGER_TAG} -X"
                     }
                 }
           }
@@ -297,11 +297,16 @@ String getPomVersion(String pomFile){
     return pom.version
 }
 
-void updateBescheidManagerDependencyVersion(String snapshotVersion) {
+void updateDependencyVersions(String bescheidManagerSnapshotVersion, String vorgangManagerSnapshotVersion) {
     def vorgangManagerServerPom = readMavenPom file: 'vorgang-manager-server/pom.xml'
     if ( vorgangManagerServerPom.properties['bescheid-manager.version'] ==~ SNAPSHOT_REGEX ) {
-        vorgangManagerServerPom.properties['bescheid-manager.version'] = snapshotVersion
+        vorgangManagerServerPom.properties['bescheid-manager.version'] = bescheidManagerSnapshotVersion
         writeMavenPom model: vorgangManagerServerPom, file: 'vorgang-manager-server/pom.xml'
+	}
+	def bescheidManagerServerPom = readMavenPom file: 'bescheid-manager/pom.xml'
+    if ( bescheidManagerServerPom.properties['vorgang-manager.version'] ==~ SNAPSHOT_REGEX ) {        
+		bescheidManagerServerPom.properties['vorgang-manager.version'] = vorgangManagerSnapshotVersion
+        writeMavenPom model: bescheidManagerServerPom, file: 'bescheid-manager/pom.xml' 
     }
 }
 
diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml
index 1ad2f48abe90b5e1adb825e420486d79b16df89c..e3189111b7a0c25fa59215dfbcbfebce985fd65b 100644
--- a/bescheid-manager/pom.xml
+++ b/bescheid-manager/pom.xml
@@ -15,7 +15,7 @@
 	<version>1.17.0-SNAPSHOT</version>
 
 	<properties>
-		<vorgang-manager.version>2.9.0</vorgang-manager.version>
+		<vorgang-manager.version>2.13.0-SNAPSHOT</vorgang-manager.version>
 		<nachrichten-manager.version>2.9.0</nachrichten-manager.version>
 		<api-lib.version>0.11.0</api-lib.version>
 	</properties>
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
index 1b6db89f94dfb7bb2162a66fa694c598f9a6b20c..d181389e9cba0ebc0b7fa4f0ae3eecf9a1df3e3b 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java
@@ -1,44 +1,46 @@
 package de.ozgcloud.bescheid;
 
-import java.io.File;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Optional;
 
-import de.ozgcloud.bescheid.vorgang.Vorgang;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.common.binaryfile.FileId;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.Singular;
-import lombok.With;
 
-@Builder(toBuilder = true)
+@Builder
 @Getter
 public class Bescheid {
 
-	public static final String FIELD_STATUS = "status";
-	public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm";
+	public static final String FIELD_VORGANG_ID = "vorgangId";
+	public static final String FIELD_CREATED_BY = "createdBy";
+
 	public static final String FIELD_BEWILLIGT = "bewilligt";
+	public static final String FIELD_STATUS = "status";
 	public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument";
-	public static final String FIELD_ATTACHMENTS = "attachments";
+	public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm";
 	public static final String FIELD_SEND_BY = "sendBy";
+
 	public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
 	public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject";
+	public static final String FIELD_ATTACHMENTS = "attachments";
 	public static final String FIELD_SENT_INFO = "sentInfo";
-	public static final String FIELD_SENT_BY = "sentBy";
-	public static final String FIELD_SENT_AT = "sentAt";
 
-	private VorgangId vorgangId;
+	private BescheidId id;
+	private long version;
 
-	private boolean genehmigt;
+	private VorgangId vorgangId;
 	private UserId createdBy;
 
-	private String bescheidFileName;
-	private File bescheidFile;
-	@With
-	private FileId bescheidFileId;
-	private String contentType;
-	private long size;
+	private boolean bewilligt;
+	private Status status;
+	private FileId bescheidDocument;
+	private LocalDate beschiedenAm;
+	private SendBy sendBy;
+
+	private SentInfo sentInfo;
 
 	@Builder.Default
 	private Optional<String> nachrichtSubject = Optional.empty();
@@ -48,8 +50,6 @@ public class Bescheid {
 	@Singular
 	private List<FileId> attachments;
 
-	private Vorgang.ServiceKonto serviceKonto;
-
 	public enum Status {
 		DRAFT, SENT;
 
@@ -74,4 +74,4 @@ public class Bescheid {
 		}
 
 	}
-}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
index ada68e5d7b3dcc83dd1aeacc8998ba32b8702820..6e6cdaf0d38f5e31d8ec32b6e6353ceb23b357ee 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java
@@ -40,7 +40,6 @@ import org.springframework.security.core.context.SecurityContext;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.bescheid.Bescheid.SendBy;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
 import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.user.UserProfileService;
@@ -49,6 +48,7 @@ import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEvent;
 import de.ozgcloud.command.CommandExecutedEvent;
 import de.ozgcloud.command.CommandFailedEvent;
+import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
 import de.ozgcloud.document.Document;
@@ -147,7 +147,7 @@ class BescheidEventListener {
 		eventPublisher.publishEvent(new BescheidDocumentCreatedEvent(command, bescheidDocument));
 	}
 
-	Bescheid doCreateBescheidBiz(@NonNull Command command) {
+	BescheidResponse doCreateBescheidBiz(@NonNull Command command) {
 		var bescheid = service.createBescheid(createRequest(command));
 		return fileService.uploadBescheidFile(bescheid);
 	}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
index d7d033e480e6259f3a08eeda83fa4e7548d23b66..a4636f96286f70d63b1edc7c45ea6d317744cc2f 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java
@@ -1,12 +1,9 @@
 package de.ozgcloud.bescheid;
 
-import java.util.Collection;
-import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
 
 import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemMapper;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import io.grpc.stub.StreamObserver;
 import lombok.RequiredArgsConstructor;
@@ -16,45 +13,44 @@ import net.devh.boot.grpc.server.service.GrpcService;
 @RequiredArgsConstructor
 class BescheidGrpcService extends BescheidServiceImplBase {
 
-	private final AttachedItemService attachedItemService;
-	private final AttachedItemMapper attachedItemMapper;
-	private final BescheidService bescheidService;
-	private final GrpcBescheidMapper grpcBescheidMapper;
+	private final BescheidService service;
+	private final BescheidMapper mapper;
 
 	@Override
 	public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) {
-		var response = attachedItemService.findBescheidItem(request.getVorgangId())
-				.map(this::buildGetBescheidDraftResponse)
-				.orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance);
+		var bescheidDraft = service.findDraft(request.getVorgangId());
 
-		responseObserver.onNext(response);
+		responseObserver.onNext(buildGetBescheidDraftResponse(bescheidDraft));
 		responseObserver.onCompleted();
-
 	}
 
-	GrpcGetBescheidDraftResponse buildGetBescheidDraftResponse(AttachedItem bescheidItem) {
-		return GrpcGetBescheidDraftResponse.newBuilder()
-				.setBescheid(attachedItemMapper.toBescheid(bescheidItem))
-				.build();
+	private GrpcGetBescheidDraftResponse buildGetBescheidDraftResponse(Optional<Bescheid> bescheidDraft) {
+		return bescheidDraft.map(mapper::toGetBescheidDraftResponse).orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance);
 	}
 
 	@Override
 	public void getConfig(GrpcBescheidManagerConfigRequest request, StreamObserver<GrpcBescheidManagerConfigResponse> responseObserver) {
-		responseObserver.onNext(grpcBescheidMapper.fromBescheidManagerConfig(bescheidService.getConfig()));
+		responseObserver.onNext(mapper.fromBescheidManagerConfig(service.getConfig()));
 		responseObserver.onCompleted();
 	}
 
 	@Override
 	public void getAll(GrpcGetAllBescheidRequest request, StreamObserver<GrpcGetAllBescheidResponse> responseObserver) {
-		responseObserver.onNext(buildGetAllBescheidResponse(attachedItemService.findAllBescheid(VorgangId.from(request.getVorgangId()))));
+		var bescheide = service.findAll(VorgangId.from(request.getVorgangId()));
+
+		responseObserver.onNext(buildGetAllBescheidResponse(bescheide));
 		responseObserver.onCompleted();
 	}
 
-	GrpcGetAllBescheidResponse buildGetAllBescheidResponse(Collection<AttachedItem> bescheidItems) {
-		return GrpcGetAllBescheidResponse.newBuilder().addAllBescheid(mapBescheid(bescheidItems)).build();
+	GrpcGetAllBescheidResponse buildGetAllBescheidResponse(Stream<Bescheid> bescheidItems) {
+		return GrpcGetAllBescheidResponse.newBuilder().addAllBescheid(bescheidItems.map(mapper::toBescheid).toList()).build();
 	}
 
-	List<GrpcBescheid> mapBescheid(Collection<AttachedItem> bescheidItems) {
-		return bescheidItems.stream().map(attachedItemMapper::toBescheid).toList();
+	@Override
+	public void getBescheid(GrpcGetBescheidRequest request, StreamObserver<GrpcGetBescheidResponse> responseObserver) {
+		var bescheid = service.getBescheid(request.getId());
+
+		responseObserver.onNext(mapper.toGetBescheidResponse(bescheid));
+		responseObserver.onCompleted();
 	}
-}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c0f60434f23ebdc201ed906cdc5eb80f9a363cd
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class BescheidId extends StringBasedValue {
+
+	BescheidId(String id) {
+		super(id);
+	}
+
+	public static BescheidId from(String id) {
+		return new BescheidId(id);
+	}
+}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..8abe425a3a1187b737bb41c851c1578a8db3e12c
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java
@@ -0,0 +1,148 @@
+package de.ozgcloud.bescheid;
+
+import java.time.LocalDate;
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.CollectionMappingStrategy;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import de.ozgcloud.bescheid.Bescheid.SendBy;
+import de.ozgcloud.bescheid.Bescheid.Status;
+import de.ozgcloud.bescheid.vorgang.VorgangId;
+import de.ozgcloud.common.attached_item.AttachedItem;
+import de.ozgcloud.common.binaryfile.FileId;
+
+@Mapper(uses = { SentInfoMapper.class }, //
+		unmappedTargetPolicy = ReportingPolicy.WARN, //
+		collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, //
+		nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, //
+		nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) //
+public interface BescheidMapper {
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeSentInfo", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "bescheidDocumentBytes", ignore = true)
+	@Mapping(target = "beschiedenAmBytes", ignore = true)
+	@Mapping(target = "idBytes", ignore = true)
+	@Mapping(target = "nachrichtSubjectBytes", ignore = true)
+	@Mapping(target = "nachrichtTextBytes", ignore = true)
+	@Mapping(target = "sendByBytes", ignore = true)
+	@Mapping(target = "statusBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "beschiedenAm", source = "beschiedenAm", dateFormat = "yyyy-MM-dd")
+	@Mapping(target = "nachrichtText", expression = "java(fromOptional(bescheid.getNachrichtText()))")
+	@Mapping(target = "nachrichtSubject", expression = "java(fromOptional(bescheid.getNachrichtSubject()))")
+	@Mapping(target = "attachmentsList", source = "attachments")
+	GrpcBescheid toBescheid(Bescheid bescheid);
+
+	default String toString(FileId fileId) {
+		return fileId.toString();
+	}
+
+	default String toString(BescheidId bescheidId) {
+		return bescheidId.toString();
+	}
+
+	default String fromOptional(Optional<String> optionalString) {
+		return optionalString.orElse(StringUtils.EMPTY);
+	}
+
+	default Bescheid mapFromAttachedItem(AttachedItem item) {
+		var itemMap = item.getItem();
+		var builder = Bescheid.builder()
+				.id(BescheidId.from(item.getId()))
+				.version(item.getVersion())
+				.vorgangId(VorgangId.from(item.getVorgangId()))
+				.createdBy(UserId.from(MapUtils.getString(itemMap, Bescheid.FIELD_CREATED_BY)))
+				.bewilligt(MapUtils.getBoolean(itemMap, Bescheid.FIELD_BEWILLIGT))
+				.nachrichtText(Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_NACHRICHT_TEXT)))
+				.nachrichtSubject(Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_NACHRICHT_SUBJECT)))
+				.status(Status.valueOf(MapUtils.getString(itemMap, Bescheid.FIELD_STATUS)))
+				.beschiedenAm(LocalDate.parse(MapUtils.getString(itemMap, Bescheid.FIELD_BESCHIEDEN_AM)));
+
+		getBescheidDocument(itemMap).ifPresent(builder::bescheidDocument);
+		getAttachments(itemMap).ifPresent(builder::attachments);
+		getSendBy(itemMap).ifPresent(builder::sendBy);
+		getSentInfo(itemMap).ifPresent(builder::sentInfo);
+
+		return builder.build();
+	}
+
+	default Optional<FileId> getBescheidDocument(Map<String, Object> itemMap) {
+		return Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_BESCHEID_DOCUMENT)).map(FileId::from);
+	}
+
+	default Optional<List<FileId>> getAttachments(Map<String, Object> itemMap) {
+		return mapToAttachments(MapUtils.getObject(itemMap, Bescheid.FIELD_ATTACHMENTS));
+	}
+
+	default Optional<List<FileId>> mapToAttachments(Object attachments) {
+		if (Objects.isNull(attachments) || StringUtils.isEmpty(String.valueOf(attachments))) {
+			return Optional.empty();
+		}
+		if (attachments instanceof Collection<?> attachmentList) {
+			return Optional.of(attachmentList.stream().map(String::valueOf).map(FileId::from).toList());
+		}
+		return Optional.of(Collections.singletonList(FileId.from((String) attachments)));
+	}
+
+	default Optional<SendBy> getSendBy(Map<String, Object> itemMap) {
+		return Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_SEND_BY)).map(SendBy::valueOf);
+	}
+
+	default Optional<SentInfo> getSentInfo(Map<String, Object> itemMap) {
+		return Optional.ofNullable(MapUtils.getMap(itemMap, Bescheid.FIELD_SENT_INFO)).map(this::toSentInfo);
+	}
+
+	default SentInfo toSentInfo(Map<String, Object> sentInfoMap) {
+		return SentInfo.builder()
+				.sentBy(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_BY))
+				.sentAt(ZonedDateTime.parse(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_AT)))
+				.build();
+	}
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeFeatures", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "javaVersionBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "versionBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	GrpcBescheidManagerConfigResponse fromBescheidManagerConfig(BescheidManagerConfig bescheidManagerConfig);
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeBescheid", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	GrpcGetBescheidResponse toGetBescheidResponse(Bescheid bescheid);
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeBescheid", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	GrpcGetBescheidDraftResponse toGetBescheidDraftResponse(Bescheid bescheid);
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
index 61d871a9202649eb02dc1208b9e2a08127cdebc1..3110e878975886da00f8989e378afc465415f67c 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java
@@ -4,5 +4,5 @@ import de.ozgcloud.bescheid.vorgang.Vorgang;
 
 public interface BescheidRemoteService {
 
-	Bescheid create(BescheidRequest request, Vorgang vorgang);
+	BescheidResponse create(BescheidRequest request, Vorgang vorgang);
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..234aec472536d4d2b549abda4606d2368f2bbd74
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java
@@ -0,0 +1,40 @@
+package de.ozgcloud.bescheid;
+
+import java.io.File;
+import java.util.List;
+import java.util.Optional;
+
+import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto;
+import de.ozgcloud.bescheid.vorgang.VorgangId;
+import de.ozgcloud.common.binaryfile.FileId;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.With;
+
+@Builder(toBuilder = true)
+@Getter
+public class BescheidResponse {
+
+	private VorgangId vorgangId;
+
+	private boolean bewilligt;
+	private UserId createdBy;
+
+	private String bescheidFileName;
+	private File bescheidFile;
+	@With
+	private FileId bescheidFileId;
+	private String contentType;
+	private long size;
+
+	@Builder.Default
+	private Optional<String> nachrichtSubject = Optional.empty();
+	@Builder.Default
+	private Optional<String> nachrichtText = Optional.empty();
+
+	@Singular
+	private List<FileId> attachments;
+
+	private ServiceKonto serviceKonto;
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
index fb010f5dff17f3406354455944fab3a4f168be2c..372e07eb95400196f7cb1d540716314f5994ef44 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java
@@ -22,14 +22,14 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
 import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.attributes.ClientAttributeService;
 import de.ozgcloud.bescheid.common.user.UserProfileService;
 import de.ozgcloud.bescheid.vorgang.Vorgang;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.bescheid.vorgang.VorgangService;
 import de.ozgcloud.command.Command;
+import de.ozgcloud.common.attached_item.AttachedItem;
+import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.Document;
@@ -64,6 +64,7 @@ class BescheidService {
 	private final ClientAttributeService bescheidClientAttributeService;
 	private final BuildProperties buildProperties;
 	private final Optional<BescheidRemoteService> remoteService;
+	private final BescheidMapper mapper;
 
 	@PostConstruct
 	void logStatus() {
@@ -72,20 +73,28 @@ class BescheidService {
 				() -> LOG.info("No BescheidRemoteService configured - Bescheid creation is not possible."));
 	}
 
-	public Bescheid createBescheid(BescheidRequest request) {
+	public Optional<Bescheid> findDraft(String vorgangId) {
+		return attachedItemService.findBescheidItem(vorgangId).map(mapper::mapFromAttachedItem);
+	}
+
+	public Stream<Bescheid> findAll(VorgangId vorgangId) {
+		return attachedItemService.findAllBescheid(vorgangId).stream().map(mapper::mapFromAttachedItem);
+	}
+
+	public BescheidResponse createBescheid(BescheidRequest request) {
 		checkRemoteService();
 
 		return doCreateBescheid(request);
 	}
 
-	private Bescheid doCreateBescheid(BescheidRequest request) {
+	private BescheidResponse doCreateBescheid(BescheidRequest request) {
 		var vorgang = vorgangService.getById(request.getVorgangId());
 		return remoteService.map(service -> service.create(request, vorgang))
 				.map(bescheid -> updateBescheid(bescheid, vorgang))
 				.orElseThrow(() -> new TechnicalException(ERROR_MESSAGE_NO_SERVICE));
 	}
 
-	private Bescheid updateBescheid(Bescheid bescheid, Vorgang vorgang) {
+	private BescheidResponse updateBescheid(BescheidResponse bescheid, Vorgang vorgang) {
 		return bescheid.toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()).build();
 	}
 
@@ -106,7 +115,8 @@ class BescheidService {
 		validateBescheid(bescheidItem, version);
 		var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY);
 		if (Bescheid.SendBy.MANUAL.notValue(sendBy)) {
-			throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL));
+			throw new TechnicalException(
+					"Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL));
 		}
 	}
 
@@ -123,7 +133,8 @@ class BescheidService {
 		validateBescheid(bescheidItem, version);
 		var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY);
 		if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) {
-			throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT));
+			throw new TechnicalException(
+					"Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT));
 		}
 		if (getNachrichtSubject(bescheidItem).isEmpty()) {
 			throw new TechnicalException("Bescheid has no nachricht subject");
@@ -147,11 +158,13 @@ class BescheidService {
 	}
 
 	Optional<String> getNachrichtSubject(AttachedItem bescheidItem) {
-		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull);
+		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT))
+				.map(StringUtils::trimToNull);
 	}
 
 	Optional<String> getNachrichtText(AttachedItem bescheidItem) {
-		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT)).map(StringUtils::trimToNull);
+		return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT))
+				.map(StringUtils::trimToNull);
 	}
 
 	String getUserId() {
@@ -193,8 +206,8 @@ class BescheidService {
 
 	Map<String, Object> buildSentInfoMap(String userId) {
 		return Map.of(
-				Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),
-				Bescheid.FIELD_SENT_BY, userId);
+				SentInfo.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),
+				SentInfo.FIELD_SENT_BY, userId);
 	}
 
 	OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) {
@@ -292,4 +305,8 @@ class BescheidService {
 				.canCreateBescheidDocument(remoteService.isPresent())
 				.build();
 	}
+
+	public Bescheid getBescheid(String id) {
+		return mapper.mapFromAttachedItem(attachedItemService.getItem(id));
+	}
 }
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java
deleted file mode 100644
index 7a8ee52f6ed2cee71cf8bffd38763b7fa9e58b48..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import java.util.Optional;
-
-import org.apache.commons.lang3.StringUtils;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-
-@Mapper
-public interface GrpcBescheidMapper {
-
-	@Mapping(target = "mergeFrom", ignore = true)
-	@Mapping(target = "clearField", ignore = true)
-	@Mapping(target = "clearOneof", ignore = true)
-	@Mapping(target = "mergeUnknownFields", ignore = true)
-	@Mapping(target = "bescheidDocument", ignore = true)
-	@Mapping(target = "bescheidDocumentBytes", ignore = true)
-	@Mapping(target = "beschiedenAm", ignore = true)
-	@Mapping(target = "beschiedenAmBytes", ignore = true)
-	@Mapping(target = "nachrichtSubject", ignore = true)
-	@Mapping(target = "nachrichtSubjectBytes", ignore = true)
-	@Mapping(target = "nachrichtTextBytes", ignore = true)
-	@Mapping(target = "sendBy", ignore = true)
-	@Mapping(target = "sendByBytes", ignore = true)
-	@Mapping(target = "unknownFields", ignore = true)
-	@Mapping(target = "allFields", ignore = true)
-	@Mapping(target = "attachmentsList", ignore = true)
-
-	@Mapping(target = "nachrichtText", source = "nachrichtText")
-	@Mapping(target = "bewilligt", source = "genehmigt")
-	GrpcBescheid fromBescheid(Bescheid bescheid);
-
-	default String fromOptional(Optional<String> optionalString) {
-		return optionalString.orElse(StringUtils.EMPTY);
-	}
-
-	@Mapping(target = "versionBytes", ignore = true)
-	@Mapping(target = "unknownFields", ignore = true)
-	@Mapping(target = "mergeUnknownFields", ignore = true)
-	@Mapping(target = "mergeFrom", ignore = true)
-	@Mapping(target = "mergeFeatures", ignore = true)
-	@Mapping(target = "javaVersionBytes", ignore = true)
-	@Mapping(target = "clearOneof", ignore = true)
-	@Mapping(target = "clearField", ignore = true)
-	GrpcBescheidManagerConfigResponse fromBescheidManagerConfig(BescheidManagerConfig bescheidManagerConfig);
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
index b65c69e4715a8704ae2275299a2f398d64b95a93..a3e1fb0389b3612d212fa0678aedfd11ecf950e4 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java
@@ -32,6 +32,9 @@ import lombok.Getter;
 @Getter
 public class SentInfo {
 
+	public static final String FIELD_SENT_BY = "sentBy";
+	public static final String FIELD_SENT_AT = "sentAt";
+
 	private String sentBy;
 	private ZonedDateTime sentAt;
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..a16e4a4aa3a7717c0c74905602962de176537df4
--- /dev/null
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.bescheid;
+
+import org.mapstruct.CollectionMappingStrategy;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
+public interface SentInfoMapper {
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "sentAtBytes", ignore = true)
+	@Mapping(target = "sentByBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "sentAt", source = "sentAt", dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'")
+	GrpcSentInfo mapTo(SentInfo sentInfo);
+}
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
deleted file mode 100644
index 9e546d2b97dc8edaefd121f3a2bad3502b386d59..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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 java.util.Objects.*;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.mapstruct.Mapper;
-
-import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcSentInfo;
-import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
-
-@Mapper(uses = { GrpcObjectMapper.class })
-public interface AttachedItemMapper {
-
-	AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item);
-
-	default GrpcBescheid toBescheid(AttachedItem bescheidItem) {
-		var bescheidBuilder = GrpcBescheid.newBuilder().setVersion(bescheidItem.getVersion());
-		Optional.ofNullable(bescheidItem.getId()).ifPresent(bescheidBuilder::setId);
-		var bescheidData = bescheidItem.getItem();
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_BESCHIEDEN_AM)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setBeschiedenAm);
-		Optional.ofNullable(MapUtils.getBoolean(bescheidData, Bescheid.FIELD_BEWILLIGT)).ifPresent(bescheidBuilder::setBewilligt);
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_BESCHEID_DOCUMENT)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setBescheidDocument);
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_SEND_BY)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setSendBy);
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_NACHRICHT_TEXT)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setNachrichtText);
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setNachrichtSubject);
-		Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_STATUS)).map(StringUtils::trimToNull)
-				.ifPresent(bescheidBuilder::setStatus);
-		Optional.ofNullable(bescheidData.get(Bescheid.FIELD_ATTACHMENTS)).map(this::toAttachments).ifPresent(bescheidBuilder::addAllAttachments);
-		Optional.ofNullable(MapUtils.getMap(bescheidData, Bescheid.FIELD_SENT_INFO)).map(this::toSentInfo).ifPresent(bescheidBuilder::setSentInfo);
-		return bescheidBuilder.build();
-	}
-
-	@SuppressWarnings("unchecked")
-	default Collection<String> toAttachments(Object attachmentsObject) {
-		if (attachmentsObject instanceof Collection<?> attachments) {
-			return (Collection<String>) attachments;
-		}
-		if (attachmentsObject instanceof String attachment) {
-			attachment = StringUtils.trimToNull(attachment);
-			if (nonNull(attachment)) {
-				return List.of(attachment);
-			}
-		} else if (nonNull(attachmentsObject)) {
-			return List.of(String.valueOf(attachmentsObject));
-		}
-		return null; //NOSONAR
-	}
-
-	default GrpcSentInfo toSentInfo(Map<String, Object> sentInfoData) {
-		return GrpcSentInfo.newBuilder()
-				.setSentBy(MapUtils.getString(sentInfoData, Bescheid.FIELD_SENT_BY))
-				.setSentAt(MapUtils.getString(sentInfoData, Bescheid.FIELD_SENT_AT)).build();
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java
deleted file mode 100644
index d8d3d59256d47d46f24f0c6521ff35d74367b220..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.apache.commons.collections.MapUtils;
-
-import de.ozgcloud.command.Command;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-class Utils {
-
-	public static String extractClient(Command command) {
-		return MapUtils.getString(command.getBodyObject(), AttachedItem.PROPERTY_CLIENT);
-	}
-
-}
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
index 8b65837276138c6f93a0b2b9d351a4f0c9db78f4..08cac0cfb0bb41e32c4c71b4ad88556326607c4f 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java
@@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
 
 import com.google.protobuf.ByteString;
 
-import de.ozgcloud.bescheid.Bescheid;
+import de.ozgcloud.bescheid.BescheidResponse;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils;
 import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender;
@@ -38,7 +38,7 @@ class BinaryFileRemoteService {
 	@GrpcClient("vorgang-manager")
 	private BinaryFileServiceStub binaryFileRemoteStub;
 
-	public FileId uploadBescheidFile(@NonNull Bescheid bescheid) {
+	public FileId uploadBescheidFile(@NonNull BescheidResponse bescheid) {
 		try (var in = openFile(bescheid.getBescheidFile())) {
 			var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, in,
 					this::buildCallStreamObserver)
@@ -59,7 +59,7 @@ class BinaryFileRemoteService {
 		}
 	}
 
-	private GrpcUploadBinaryFileRequest buildMetaDataRequest(Bescheid bescheid) {
+	private GrpcUploadBinaryFileRequest buildMetaDataRequest(BescheidResponse bescheid) {
 		return GrpcUploadBinaryFileRequest.newBuilder()
 				.setMetadata(GrpcUploadBinaryFileMetaData.newBuilder()
 						// TODO remove context - check why needed!
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
index 68f3a7b068e819c3a517535216cafe40a87d729a..11ddd6e95554acaf4a7839057a92489f373fa1c2 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java
@@ -3,7 +3,7 @@ package de.ozgcloud.bescheid.binaryfile;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import de.ozgcloud.bescheid.Bescheid;
+import de.ozgcloud.bescheid.BescheidResponse;
 import lombok.NonNull;
 
 @Service
@@ -12,7 +12,7 @@ public class BinaryFileService {
 	@Autowired
 	private BinaryFileRemoteService remoteService;
 
-	public Bescheid uploadBescheidFile(@NonNull Bescheid bescheid) {
+	public BescheidResponse uploadBescheidFile(@NonNull BescheidResponse bescheid) {
 		var fileId = remoteService.uploadBescheidFile(bescheid);
 
 		return bescheid.withBescheidFileId(fileId);
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
index 7a1152e6663a98cb91510d776b920aa3d12fa725..ef9589219948ef6c2db265e1d6653b1f06403ba3 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java
@@ -7,7 +7,7 @@ import org.springframework.stereotype.Service;
 
 import com.google.common.net.MediaType;
 
-import de.ozgcloud.bescheid.Bescheid;
+import de.ozgcloud.bescheid.BescheidResponse;
 import de.ozgcloud.bescheid.BescheidRemoteService;
 import de.ozgcloud.bescheid.BescheidRequest;
 import de.ozgcloud.bescheid.vorgang.Vorgang;
@@ -21,10 +21,10 @@ class DummyBescheidRemoteService implements BescheidRemoteService {
 	private static final String DUMMY_BESCHEID_CONTENT_TYPE = MediaType.PDF.toString();
 
 	@Override
-	public Bescheid create(BescheidRequest request, Vorgang vorgang) {
+	public BescheidResponse create(BescheidRequest request, Vorgang vorgang) {
 		var file = TempFileUtils.writeTmpFile(this.getClass().getClassLoader().getResourceAsStream(DUMMY_BESCHEID_FILE_NAME));
 
-		return Bescheid.builder()
+		return BescheidResponse.builder()
 				.bescheidFile(file)
 				.bescheidFileName(DUMMY_BESCHEID_FILE_NAME)
 				.contentType(DUMMY_BESCHEID_CONTENT_TYPE)
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
index 651017599265902ee54a2e1c153ecfe5dd744f57..b93412e26623f5b7f04b7f96a1e38a51b56018d2 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java
@@ -11,7 +11,6 @@ import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.http.HttpStatusCode;
@@ -28,7 +27,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-import de.ozgcloud.bescheid.Bescheid;
+import de.ozgcloud.bescheid.BescheidResponse;
 import de.ozgcloud.bescheid.BescheidRemoteService;
 import de.ozgcloud.bescheid.BescheidRequest;
 import de.ozgcloud.bescheid.common.user.UserProfile;
@@ -45,11 +44,13 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 import reactor.core.publisher.Mono;
 
 @Log4j2
 @Service
+@RequiredArgsConstructor
 @ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url")
 class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 
@@ -57,20 +58,18 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 	private static final String FILE_TYPE_XML = "XML";
 
 	static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR
-	static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; //NOSONAR
+	static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; // NOSONAR
 
 	@SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding
 	private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8;
 
-	@Autowired
 	@Qualifier("smartDocuments")
-	private WebClient smartDocumentsWebClient;
+	private final WebClient smartDocumentsWebClient;
 
-	@Autowired
-	private SmartDocumentsProperties properties;
+	private final SmartDocumentsProperties properties;
 
 	@Override
-	public Bescheid create(BescheidRequest request, Vorgang vorgang) {
+	public BescheidResponse create(BescheidRequest request, Vorgang vorgang) {
 		var sdRequest = createRequest(request, vorgang);
 		LOG.debug(() -> buildLogRequest(sdRequest));
 
@@ -99,16 +98,16 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 		}
 	}
 
-	Bescheid buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) {
+	BescheidResponse buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) {
 		var smartDocumentsFile = getSmartDocumentsFile(smartDocumentsResponse);
 
-		return Bescheid.builder()
+		return BescheidResponse.builder()
 				.bescheidFile(smartDocumentsFile.getDocument().getData())
 				.bescheidFileName(smartDocumentsFile.getFilename())
 				.size(smartDocumentsFile.getDocument().getData().length())
 				.contentType(MediaType.APPLICATION_PDF_VALUE)
 				.nachrichtText(getNachrichtText(smartDocumentsResponse))
-				.genehmigt(request.isGenehmigt())
+				.bewilligt(request.isGenehmigt())
 				.createdBy(request.getCreateFor().getId())
 				.vorgangId(request.getVorgangId())
 				.build();
@@ -199,9 +198,9 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService {
 
 	private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) {
 		return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder()
-						.templateGroup(properties.getTemplateGroup())
-						.template(vorgang.getVorgangName())
-						.build())
+				.templateGroup(properties.getTemplateGroup())
+				.template(vorgang.getVorgangName())
+				.build())
 				.build();
 	}
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java
similarity index 97%
rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java
index c3407d72ea4d4a13e26d68571dc329ad174dcdbd..f47223bc22488d80380ad986dd37ebf79e4c27db 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import java.util.Map;
 
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java
similarity index 73%
rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java
rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java
index 27fc9bdb61c5a392ef4f9eca0851082cefa6a66a..73d20952c8b05bf3fa0dd93c8d284c7583c319a5 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java
@@ -21,14 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
-import lombok.Builder;
-import lombok.Getter;
+import org.mapstruct.Mapper;
 
-@Builder
-@Getter
-class FieldId {
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
 
-	private String id;
-}
+@Mapper(uses = { GrpcObjectMapper.class })
+public interface AttachedItemMapper {
+
+	AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item);
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java
similarity index 94%
rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java
index 24a67a215b953478b6bf2518432c37469eb94e42..551279332894c5c12395a7a43a2a93de52c180dc 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import static java.util.Objects.*;
 
@@ -42,6 +42,7 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.bescheid.Bescheid;
+import de.ozgcloud.bescheid.Bescheid.Status;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
 import de.ozgcloud.bescheid.BescheidManagerConfiguration;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
@@ -50,9 +51,7 @@ import de.ozgcloud.command.Command;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.Document;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
 
-@Log4j2
 @Service
 @RequiredArgsConstructor
 public class AttachedItemService {
@@ -100,8 +99,10 @@ public class AttachedItemService {
 
 	void validateSendBy(String sendBy) {
 		if (isUnknownSendByValue(sendBy)) {
-			var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name).collect(Collectors.joining(","));
-			var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy, possibleSendByValues);
+			var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name)
+					.collect(Collectors.joining(","));
+			var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy,
+					possibleSendByValues);
 			throw new TechnicalException(message);
 		}
 	}
@@ -120,10 +121,12 @@ public class AttachedItemService {
 		var result = new HashMap<String, Object>();
 		result.put(Bescheid.FIELD_BESCHIEDEN_AM, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM));
 		result.put(Bescheid.FIELD_BEWILLIGT, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT));
-		result.put(Bescheid.FIELD_BESCHEID_DOCUMENT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT));
+		result.put(Bescheid.FIELD_BESCHEID_DOCUMENT,
+				MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT));
 		result.put(Bescheid.FIELD_SEND_BY, getSendBy(command.getBodyObject()));
 		result.put(Bescheid.FIELD_NACHRICHT_TEXT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT));
-		result.put(Bescheid.FIELD_NACHRICHT_SUBJECT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT));
+		result.put(Bescheid.FIELD_NACHRICHT_SUBJECT,
+				MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT));
 		result.put(Bescheid.FIELD_ATTACHMENTS, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS));
 		return result;
 	}
@@ -144,7 +147,8 @@ public class AttachedItemService {
 		var itemMap = buildItemMapWithExistingBescheidFields(command);
 		var savedBescheid = getItem(command.getRelationId());
 
-		getNewNachrichtText(savedBescheid, newDocument).ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText));
+		getNewNachrichtText(savedBescheid, newDocument)
+				.ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText));
 
 		return itemMap;
 	}
@@ -258,7 +262,7 @@ public class AttachedItemService {
 				.build();
 	}
 
-	Map<String, Object> buildItemMap(Bescheid.Status status) {
+	Map<String, Object> buildItemMap(Status status) {
 		var itemMap = new HashMap<String, Object>();
 		itemMap.put(Bescheid.FIELD_STATUS, status.name());
 		return itemMap;
@@ -267,4 +271,4 @@ public class AttachedItemService {
 	public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) {
 		return remoteService.findAllBescheid(vorgangId);
 	}
-}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java
similarity index 97%
rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java
index 418361772a1446dfe7923822906111ae4b5c46a3..6bc59454c9bd380608d7594e82a4df4f48174101 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
-import static de.ozgcloud.bescheid.attacheditem.AttachedItemService.*;
+import static de.ozgcloud.common.attached_item.AttachedItemService.*;
 
 import java.time.LocalDate;
 import java.util.Comparator;
diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
index 41180bab88ef3c302300bd1e51ca34e3ed89619b..a0e8848a34a11b3f1f1a12c961b178563d935647 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java
@@ -28,7 +28,7 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.NullValueCheckStrategy;
 
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
+import de.ozgcloud.common.attached_item.AttachedItem;
 
 @Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
 interface DocumentMapper {
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 a49c8581074b511f05bc5c13b0666933753a457e..0a4d0f0660902d0e74d1b93db4a5ac09d877ddda 100644
--- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
+++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java
@@ -40,9 +40,10 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
+import de.ozgcloud.bescheid.BescheidResponse;
 import de.ozgcloud.command.Command;
+import de.ozgcloud.common.attached_item.AttachedItemService;
+import de.ozgcloud.common.attached_item.AttachedItem;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 
 @Service
@@ -70,7 +71,7 @@ public class DocumentService {
 		return createBescheidDocument(command, buildItemMap(command));
 	}
 
-	public String createBescheidDocument(Command command, Bescheid bescheid) {
+	public String createBescheidDocument(Command command, BescheidResponse bescheid) {
 		return createBescheidDocument(command, buildItemMap(bescheid));
 	}
 
@@ -113,7 +114,7 @@ public class DocumentService {
 		return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId);
 	}
 
-	Map<String, Object> buildItemMap(Bescheid bescheid) {
+	Map<String, Object> buildItemMap(BescheidResponse bescheid) {
 		if (isNull(bescheid.getBescheidFileId())) {
 			throw new TechnicalException("Bescheid file id is missing.");
 		}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
index a4c77b54a873cf167eb1ce027467114391322744..2700586f2f8dd27bd9940ad790f6d2cc395370df 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java
@@ -14,7 +14,6 @@ import org.springframework.context.ApplicationEventPublisher;
 
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.user.UserProfile;
 import de.ozgcloud.bescheid.common.user.UserProfileService;
@@ -22,6 +21,7 @@ import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEventTestFactory;
 import de.ozgcloud.command.CommandExecutedEvent;
 import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.test.ITCase;
 
 @ITCase
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
index ba29a266aeb99969217d43cee2a15a485b12718a..5d2d0689225962c1127644fe1f38063cb1e13c01 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java
@@ -6,6 +6,7 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Consumer;
@@ -23,9 +24,7 @@ import org.mockito.Spy;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.security.core.context.SecurityContext;
 
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+import de.ozgcloud.bescheid.Bescheid.SendBy;
 import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
 import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
@@ -37,6 +36,9 @@ import de.ozgcloud.command.CommandCreatedEventTestFactory;
 import de.ozgcloud.command.CommandExecutedEvent;
 import de.ozgcloud.command.CommandFailedEvent;
 import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItem;
+import de.ozgcloud.common.attached_item.AttachedItemService;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
 import de.ozgcloud.document.Document;
@@ -313,7 +315,7 @@ class BescheidEventListenerTest {
 			void shouldCallService() {
 				listener.getDocument(command);
 
-				verify(documentService).getDocument(AttachedItemTestFactory.BESCHEID_DOCUMENT);
+				verify(documentService).getDocument(DocumentTestFactory.ID);
 			}
 
 			@Test
@@ -333,7 +335,7 @@ class BescheidEventListenerTest {
 
 		private Command createCommandWithoutDocument() {
 			var bescheidItemMap = AttachedItemTestFactory.createBescheidItem();
-			bescheidItemMap.remove(AttachedItemTestFactory.BESCHEID_DOCUMENT);
+			bescheidItemMap.remove(DocumentTestFactory.ID);
 			return CommandTestFactory.createBuilder().bodyObject(bescheidItemMap).build();
 		}
 	}
@@ -362,7 +364,7 @@ class BescheidEventListenerTest {
 	class TestDoCreateBescheidDocument {
 
 		private static final Command COMMAND = CommandTestFactory.create();
-		private static final Bescheid BESCHEID = BescheidTestFactory.create();
+		private static final BescheidResponse BESCHEID = BescheidResponseTestFactory.create();
 
 		@Captor
 		private ArgumentCaptor<BescheidDocumentCreatedEvent> eventCaptor;
@@ -399,7 +401,7 @@ class BescheidEventListenerTest {
 		@DisplayName("should publish BescheidDocumentCreatedEvent with createdResource")
 		void shouldPublishEventWithCreatedResource() {
 			var bescheidDocument = "document-id";
-			when(documentService.createBescheidDocument(any(), any(Bescheid.class))).thenReturn(bescheidDocument);
+			when(documentService.createBescheidDocument(any(), any(BescheidResponse.class))).thenReturn(bescheidDocument);
 
 			listener.doCreateBescheidDocument(COMMAND);
 
@@ -432,7 +434,7 @@ class BescheidEventListenerTest {
 
 		@Test
 		void shouldCallFileService() {
-			var bescheid = BescheidTestFactory.create();
+			var bescheid = BescheidResponseTestFactory.create();
 			when(service.createBescheid(any())).thenReturn(bescheid);
 
 			listener.doCreateBescheidBiz(command);
@@ -442,7 +444,7 @@ class BescheidEventListenerTest {
 
 		@Test
 		void shouldReturnBescheid() {
-			var bescheid = BescheidTestFactory.create();
+			var bescheid = BescheidResponseTestFactory.create();
 			when(fileService.uploadBescheidFile(any())).thenReturn(bescheid);
 
 			var result = listener.doCreateBescheidBiz(command);
@@ -495,7 +497,16 @@ class BescheidEventListenerTest {
 			private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID)
 					.relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build();
 
-			private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid();
+			private AttachedItem bescheidItem = createManuallyBescheidItem();
+
+			private AttachedItem createManuallyBescheidItem() {
+				var attachedItem = AttachedItemTestFactory.createBescheid();
+				var item = new HashMap<>(attachedItem.getItem());
+
+				item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL);
+
+				return attachedItem.toBuilder().item(item).build();
+			}
 
 			@BeforeEach
 			void init() {
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
index d5add97a8f5ac99853f9e90a44534a8174f4d76a..04871bb15ac3d213da2197b73610bd3660bd410e 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java
@@ -4,11 +4,11 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.util.Collections;
-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;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
@@ -17,101 +17,95 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemMapper;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
-import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItemMapper;
+import de.ozgcloud.common.attached_item.AttachedItemService;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import io.grpc.stub.StreamObserver;
 
 class BescheidGrpcServiceTest {
 
 	@Spy
 	@InjectMocks
-	private BescheidGrpcService service;
+	private BescheidGrpcService grpcService;
 
 	@Mock
 	private AttachedItemService attachedItemService;
 	@Mock
 	private AttachedItemMapper attachedItemMapper;
 	@Mock
-	private BescheidService bescheidService;
+	private BescheidService service;
 	@Mock
-	private GrpcBescheidMapper grpcBescheidMapper;
+	private BescheidMapper mapper;
 
+	@DisplayName("Get bescheid draft")
 	@Nested
 	class TestGetBescheidDraft {
 
-		@Mock
-		private GrpcGetBescheidDraftRequest request;
 		@Mock
 		private StreamObserver<GrpcGetBescheidDraftResponse> responseObserver;
 		@Captor
 		private ArgumentCaptor<GrpcGetBescheidDraftResponse> responseCaptor;
 
-		private static final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponse.newBuilder().build();
+		private final GrpcGetBescheidDraftRequest request = GrpcGetBescheidDraftRequestTestFactory.create();
 
-		@Test
-		void shouldBuildResponse() {
-			when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
-			var bescheidItem = AttachedItemTestFactory.createBescheid();
-			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(bescheidItem));
+		private final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponseTestFactory.create();
 
-			service.getBescheidDraft(request, responseObserver);
+		private final Bescheid bescheid = BescheidTestFactory.create();
 
-			verify(service).buildGetBescheidDraftResponse(bescheidItem);
-		}
+		@DisplayName("on existing draft")
+		@Nested
+		class TestOnExistingDraft {
 
-		@Test
-		void shouldCallNext() {
-			when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
-			when(service.buildGetBescheidDraftResponse(any())).thenReturn(response);
-			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(AttachedItemTestFactory.createBescheid()));
+			@BeforeEach
+			void mock() {
+				when(service.findDraft(any())).thenReturn(Optional.of(bescheid));
+				when(mapper.toGetBescheidDraftResponse(any())).thenReturn(response);
+			}
 
-			service.getBescheidDraft(request, responseObserver);
+			@Test
+			void shouldCallService() {
+				grpcService.getBescheidDraft(request, responseObserver);
 
-			verify(responseObserver).onNext(response);
-		}
+				verify(service).findDraft(VorgangTestFactory.ID_STR);
+			}
 
-		@Test
-		void shouldCallNextWhenNoBescheid() {
-			service.getBescheidDraft(request, responseObserver);
+			@Test
+			void shouldCallMapper() {
+				grpcService.getBescheidDraft(request, responseObserver);
 
-			verify(responseObserver).onNext(responseCaptor.capture());
-			assertThat(responseCaptor.getValue().hasBescheid()).isFalse();
-		}
+				verify(mapper).toGetBescheidDraftResponse(bescheid);
+			}
 
-		@Test
-		void shouldCallCompleted() {
-			service.getBescheidDraft(request, responseObserver);
+			@Test
+			void shouldCallNext() {
+				grpcService.getBescheidDraft(request, responseObserver);
 
-			verify(responseObserver).onCompleted();
-		}
+				verify(responseObserver).onNext(response);
+			}
 
-	}
-
-	@Nested
-	class TestBuildGetBescheidDraftResponse {
-
-		@Test
-		void shouldCallMapper() {
-			when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
-			var bescheid = AttachedItemTestFactory.createBescheid();
+			@Test
+			void shouldCallCompleted() {
+				grpcService.getBescheidDraft(request, responseObserver);
 
-			service.buildGetBescheidDraftResponse(bescheid);
-
-			verify(attachedItemMapper).toBescheid(bescheid);
+				verify(responseObserver).onCompleted();
+			}
 		}
 
-		@Test
-		void shouldSetBescheid() {
-			var grpcBescheid = GrpcBescheidTestFactory.create();
-			when(attachedItemMapper.toBescheid(any())).thenReturn(grpcBescheid);
+		@DisplayName("on missing draft")
+		@Nested
+		class TestOnMissingDraft {
+
+			@Test
+			void shouldCallNextWhenNoBescheid() {
+				when(service.findDraft(any())).thenReturn(Optional.empty());
 
-			var response = service.buildGetBescheidDraftResponse(AttachedItemTestFactory.createBescheid());
+				grpcService.getBescheidDraft(request, responseObserver);
 
-			assertThat(response.getBescheid()).isEqualTo(grpcBescheid);
+				verify(responseObserver).onNext(responseCaptor.capture());
+				assertThat(responseCaptor.getValue().hasBescheid()).isFalse();
+			}
 		}
 	}
 
@@ -131,22 +125,22 @@ class BescheidGrpcServiceTest {
 		void shouldCallBescheidService() {
 			getConfig();
 
-			verify(bescheidService).getConfig();
+			verify(service).getConfig();
 		}
 
 		@Test
 		void shouldCallGrpcBescheidMapper() {
 			var config = BescheidManagerConfigTestFactory.create();
-			when(bescheidService.getConfig()).thenReturn(config);
+			when(service.getConfig()).thenReturn(config);
 
 			getConfig();
 
-			verify(grpcBescheidMapper).fromBescheidManagerConfig(config);
+			verify(mapper).fromBescheidManagerConfig(config);
 		}
 
 		@Test
 		void shouldCallNext() {
-			when(grpcBescheidMapper.fromBescheidManagerConfig(any())).thenReturn(RESPONSE);
+			when(mapper.fromBescheidManagerConfig(any())).thenReturn(RESPONSE);
 
 			getConfig();
 
@@ -161,16 +155,17 @@ class BescheidGrpcServiceTest {
 		}
 
 		private void getConfig() {
-			service.getConfig(request, responseObserver);
+			grpcService.getConfig(request, responseObserver);
 		}
 	}
 
 	@Nested
 	class TestGetAll {
 
-		private static final GrpcGetAllBescheidResponse RESPONSE = GrpcGetAllBescheidResponse.newBuilder().build();
-		@Mock
-		private GrpcGetAllBescheidRequest request;
+		private final GrpcGetAllBescheidResponse response = GrpcGetAllBescheidResponse.newBuilder().build();
+
+		private final GrpcGetAllBescheidRequest request = GrpcGetAllBescheidRequestTestFactory.create();
+
 		@Mock
 		private StreamObserver<GrpcGetAllBescheidResponse> responseObserver;
 		@Captor
@@ -178,103 +173,121 @@ class BescheidGrpcServiceTest {
 		@Captor
 		private ArgumentCaptor<VorgangId> vorgangIdCaptor;
 
+		private final Stream<Bescheid> bescheide = Stream.of(BescheidTestFactory.create());
+
 		@BeforeEach
 		void init() {
-			when(request.getVorgangId()).thenReturn(CommandTestFactory.VORGANG_ID);
-			doReturn(RESPONSE).when(service).buildGetAllBescheidResponse(anyCollection());
+			when(service.findAll(any())).thenReturn(bescheide);
+			doReturn(response).when(grpcService).buildGetAllBescheidResponse(any());
 		}
 
 		@Test
 		void shouldCallFindAllBescheid() {
-			service.getAll(request, responseObserver);
+			getAll();
 
-			verify(attachedItemService).findAllBescheid(vorgangIdCaptor.capture());
-			assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID);
+			verify(service).findAll(VorgangTestFactory.ID);
 		}
 
 		@Test
 		void shouldCallBuildResponse() {
-			var expectedBescheidItem = AttachedItemTestFactory.createBescheid();
-			when(attachedItemService.findAllBescheid(any())).thenReturn(List.of(expectedBescheidItem));
-
-			service.getAll(request, responseObserver);
+			getAll();
 
-			verify(service).buildGetAllBescheidResponse(List.of(expectedBescheidItem));
+			verify(grpcService).buildGetAllBescheidResponse(bescheide);
 		}
 
 		@Test
 		void shouldCallOnNext() {
-			service.getAll(request, responseObserver);
+			getAll();
 
-			verify(responseObserver).onNext(RESPONSE);
+			verify(responseObserver).onNext(response);
 		}
 
 		@Test
 		void shouldCallOnCompleted() {
-			service.getAll(request, responseObserver);
+			getAll();
 
 			verify(responseObserver).onCompleted();
 		}
+
+		private void getAll() {
+			grpcService.getAll(request, responseObserver);
+		}
 	}
 
 	@Nested
 	class TestBuildResponseAllBescheid {
 
-		private static final GrpcBescheid GRPC_BESCHEID = GrpcBescheidTestFactory.create();
+		private final Bescheid bescheid = BescheidTestFactory.create();
+		private final Stream<Bescheid> bescheide = Stream.of(bescheid);
 
-		@Mock
-		private AttachedItem attachedItem;
+		private final GrpcBescheid grpcBescheid = GrpcBescheidTestFactory.create();
 
 		@BeforeEach
 		void init() {
-			doReturn(Collections.singletonList(GRPC_BESCHEID)).when(service).mapBescheid(anyCollection());
+			when(mapper.toBescheid(any())).thenReturn(grpcBescheid);
 		}
 
 		@Test
-		void shouldCallMapBescheid() {
-			var bescheidItems = Collections.singleton(attachedItem);
-
-			service.buildGetAllBescheidResponse(bescheidItems);
+		void shouldCallMapper() {
+			grpcService.buildGetAllBescheidResponse(bescheide);
 
-			verify(service).mapBescheid(bescheidItems);
+			verify(mapper).toBescheid(bescheid);
 		}
 
 		@Test
 		void shouldReturnResponse() {
-			var bescheidItems = Collections.singleton(attachedItem);
+			var response = grpcService.buildGetAllBescheidResponse(bescheide);
 
-			var response = service.buildGetAllBescheidResponse(bescheidItems);
-
-			assertThat(response.getBescheidList()).containsExactly(GRPC_BESCHEID);
+			assertThat(response.getBescheidList()).containsExactly(grpcBescheid);
 		}
 	}
 
+	@DisplayName("Get bescheid")
 	@Nested
-	class TestMapBescheid {
+	class TestGetBescheid {
 
-		private static final GrpcBescheid GRPC_BESCHEID = GrpcBescheidTestFactory.create();
+		private final Bescheid bescheid = BescheidTestFactory.create();
+		private final GrpcGetBescheidResponse response = GrpcGetBescheidResponseTestFactory.create();
 
 		@Mock
-		private AttachedItem attachedItem;
+		private StreamObserver<GrpcGetBescheidResponse> responseObserver;
 
 		@BeforeEach
-		void init() {
-			when(attachedItemMapper.toBescheid(attachedItem)).thenReturn(GRPC_BESCHEID);
+		void mock() {
+			when(service.getBescheid(any())).thenReturn(bescheid);
+			when(mapper.toGetBescheidResponse(any())).thenReturn(response);
+		}
+
+		@Test
+		void shouldCallService() {
+			getBescheid();
+
+			verify(service).getBescheid(AttachedItemTestFactory.ID);
 		}
 
 		@Test
 		void shouldCallMapper() {
-			service.mapBescheid(Collections.singleton(attachedItem));
+			getBescheid();
+
+			verify(mapper).toGetBescheidResponse(bescheid);
+		}
+
+		@Test
+		void shouldCallOnNext() {
+			getBescheid();
 
-			verify(attachedItemMapper).toBescheid(attachedItem);
+			verify(responseObserver).onNext(response);
 		}
 
 		@Test
-		void shouldSetBescheid() {
-			var result = service.mapBescheid(Collections.singleton(attachedItem));
+		void shouldCallCompleted() {
+			getBescheid();
 
-			assertThat(result).containsExactly(GRPC_BESCHEID);
+			verify(responseObserver).onCompleted();
 		}
 
+		private void getBescheid() {
+			grpcService.getBescheid(GrpcGetBescheidRequestTestFactory.create(), responseObserver);
+		}
 	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8feda3dfe1ac673133247f758d71d3a413fa4a52
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java
@@ -0,0 +1,123 @@
+package de.ozgcloud.bescheid;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
+
+class BescheidMapperTest {
+
+	@InjectMocks
+	private final BescheidMapper mapper = Mappers.getMapper(BescheidMapper.class);
+	@Spy
+	private final SentInfoMapper sentInfoMapper = Mappers.getMapper(SentInfoMapper.class);
+
+	@Nested
+	class TestToBescheid {
+
+		@BeforeEach
+		void mock() {
+			when(sentInfoMapper.mapTo(any())).thenReturn(GrpcSentInfoTestFactory.create());
+		}
+
+		@Test
+		void shouldCallSentInfoMapper() {
+			mapper.toBescheid(BescheidTestFactory.create());
+
+			verify(sentInfoMapper).mapTo(BescheidTestFactory.SENT_INFO);
+		}
+
+		@Test
+		void shouldMapAllFields() {
+			var result = mapper.toBescheid(BescheidTestFactory.create());
+
+			assertThat(result).usingRecursiveComparison()
+					.ignoringFields("memoizedHashCode", "sentInfo_")
+					.isEqualTo(GrpcBescheidWithoutDocumentTestFactory.create());
+		}
+	}
+
+	@Nested
+	class TestFromBescheidManagerConfig {
+
+		@Test
+		void shouldMapAllFields() {
+			var result = mapper.fromBescheidManagerConfig(BescheidManagerConfigTestFactory.create());
+
+			assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidManagerConfigResponseTestFactory.create());
+		}
+	}
+
+	@DisplayName("Map from attachedItem ")
+	@Nested
+	class TestMapFromAttachItem {
+
+		@Test
+		void shouldMapItem() {
+			var bescheidWithoutDocument = AttachedItemTestFactory.createBescheidWithoutDocumentBuilder().vorgangId(VorgangTestFactory.ID_STR).build();
+
+			var bescheid = mapper.mapFromAttachedItem(bescheidWithoutDocument);
+
+			assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create());
+		}
+	}
+
+	@DisplayName("Map to attachments")
+	@Nested
+	class TestMapToAttachments {
+
+		@Test
+		void shouldMapAttachmentsToEmptyList() {
+			var attachments = mapper.mapToAttachments(null);
+
+			assertThat(attachments).isEmpty();
+		}
+
+		@Test
+		void shouldMapAttachmentsToList() {
+			var attachments = mapper.mapToAttachments(BescheidTestFactory.ATTACHMENTS);
+
+			assertThat(attachments).hasValue(BescheidTestFactory.ATTACHMENTS);
+		}
+
+		@Test
+		void shouldMapOneElementToList() {
+			var attachments = mapper.mapToAttachments(List.of(BescheidTestFactory.ATTACHMENT));
+
+			assertThat(attachments).hasValue(Collections.singletonList(BescheidTestFactory.ATTACHMENT));
+		}
+
+		@Test
+		void shouldMapEmptyStringToEmptyList() {
+			var attachments = mapper.mapToAttachments(StringUtils.EMPTY);
+
+			assertThat(attachments).isEmpty();
+		}
+	}
+
+	@DisplayName("To get bescheid draft response")
+	@Nested
+	class TestToGetBescheidDraftResponse {
+
+		@Test
+		void shouldMap() {
+			var response = mapper.toGetBescheidDraftResponse(BescheidTestFactory.create());
+
+			assertThat(response).usingRecursiveComparison().isEqualTo(GrpcGetBescheidDraftResponseTestFactory.create());
+		}
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..94581c9fe21016dfb70cdb0b7f5279b42f877b94
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java
@@ -0,0 +1,42 @@
+package de.ozgcloud.bescheid;
+
+import java.io.File;
+import java.util.Optional;
+
+import org.springframework.http.MediaType;
+
+import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
+import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+import de.ozgcloud.common.binaryfile.FileId;
+import de.ozgcloud.common.binaryfile.TempFileUtils;
+import de.ozgcloud.document.DocumentTestFactory;
+
+public class BescheidResponseTestFactory {
+
+	public static final String BESCHEID_FILE_NAME = "testbescheid";
+	public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(BESCHEID_FILE_NAME.getBytes());
+	public static final int BESCHEID_FILE_SIZE = BESCHEID_FILE_NAME.getBytes().length;
+
+	public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE;
+
+	public static BescheidResponse create() {
+		return createBuilder().build();
+	}
+
+	public static BescheidResponse.BescheidResponseBuilder createBuilder() {
+		return BescheidResponse.builder()
+				.createdBy(UserProfileTestFactory.ID)
+				.vorgangId(VorgangTestFactory.ID)
+				.contentType(CONTENT_TYPE)
+				.bescheidFileName(BESCHEID_FILE_NAME)
+				.bescheidFile(BESCHEID_FILE)
+				.bescheidFileId(FileId.from(DocumentTestFactory.ID))
+				.nachrichtSubject(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT))
+				.nachrichtText(Optional.of(BescheidTestFactory.NACHRICHT_TEXT))
+				.bewilligt(BescheidTestFactory.BEWILLIGT)
+				.size(BESCHEID_FILE_SIZE)
+				.attachments(BescheidTestFactory.ATTACHMENTS)
+				.serviceKonto(ServiceKontoTestFactory.create());
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
index c810b402d1b51e1b1cea5017f3fcaf7530c1d690..1bfa29f025365178aa5a66816db937b5670b2536 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java
@@ -11,6 +11,7 @@ import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -39,9 +40,7 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
 import de.ozgcloud.apilib.common.datatypes.GenericId;
 import de.ozgcloud.apilib.user.OzgCloudUserId;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+import de.ozgcloud.bescheid.Bescheid.SendBy;
 import de.ozgcloud.bescheid.attributes.ClientAttributeService;
 import de.ozgcloud.bescheid.common.user.UserProfile;
 import de.ozgcloud.bescheid.common.user.UserProfileService;
@@ -54,6 +53,9 @@ import de.ozgcloud.bescheid.vorgang.VorgangService;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItem;
+import de.ozgcloud.common.attached_item.AttachedItemService;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.common.datatype.StringBasedValue;
 import de.ozgcloud.common.errorhandling.TechnicalException;
@@ -81,17 +83,93 @@ class BescheidServiceTest {
 	private BuildProperties buildProperties;
 	@Mock
 	private BescheidRemoteService remoteService;
+	@Mock
+	private BescheidMapper mapper;
 
 	@BeforeEach
 	void init() {
 		ReflectionTestUtils.setField(service, "remoteService", Optional.of(remoteService));
 	}
 
+	@Nested
+	class TestFindDraft {
+
+		private final AttachedItem vorgangAttachedItem = AttachedItemTestFactory.create();
+
+		private final Bescheid bescheid = BescheidTestFactory.create();
+
+		@BeforeEach
+		void mock() {
+			when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(vorgangAttachedItem));
+			when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid);
+		}
+
+		@Test
+		void shouldCallVorgangAttachedItemRemoteService() {
+			service.findDraft(VorgangTestFactory.ID_STR);
+
+			verify(attachedItemService).findBescheidItem(VorgangTestFactory.ID_STR);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.findDraft(VorgangTestFactory.ID_STR);
+
+			verify(mapper).mapFromAttachedItem(vorgangAttachedItem);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var draft = service.findDraft(VorgangTestFactory.ID_STR);
+
+			assertThat(draft).hasValue(bescheid);
+		}
+	}
+
+	@DisplayName("Find all")
+	@Nested
+	class TestFindAll {
+
+		private final AttachedItem attachedItem = AttachedItemTestFactory.create();
+		private final Bescheid bescheid = BescheidTestFactory.create();
+
+		@BeforeEach
+		void mock() {
+			when(attachedItemService.findAllBescheid(any())).thenReturn(Collections.singleton(attachedItem));
+			when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid);
+		}
+
+		@Test
+		void shouldCallVorgangAttachedItemService() {
+			findAll();
+
+			verify(attachedItemService).findAllBescheid(VorgangTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			findAll();
+
+			verify(mapper).mapFromAttachedItem(attachedItem);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var bescheide = findAll();
+
+			assertThat(bescheide).containsExactly(bescheid);
+		}
+
+		private List<Bescheid> findAll() {
+			return service.findAll(VorgangTestFactory.ID).toList();
+		}
+	}
+
 	@Nested
 	class TestCreateBescheid {
 
 		private final Vorgang vorgang = VorgangTestFactory.create();
-		private final Bescheid bescheid = BescheidTestFactory.createBuilder().vorgangId(null).build();
+		private final BescheidResponse bescheid = BescheidResponseTestFactory.createBuilder().vorgangId(null).build();
 
 		@BeforeEach
 		void initMocks() {
@@ -119,7 +197,7 @@ class BescheidServiceTest {
 		void shouldReturnCreatedBescheid() {
 			var result = service.createBescheid(BescheidRequestTestFactory.create());
 
-			assertThat(result).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create());
+			assertThat(result).usingRecursiveComparison().isEqualTo(BescheidResponseTestFactory.create());
 		}
 	}
 
@@ -190,21 +268,29 @@ class BescheidServiceTest {
 	@Nested
 	class TestValidateBescheidSendManually {
 
-		@Test
-		void shouldCallValidateBescheid() {
+		private final AttachedItem attachedItem = createManuallySendBescheid();
+
+		private AttachedItem createManuallySendBescheid() {
 			var bescheidItem = AttachedItemTestFactory.createBescheid();
+			var item = new HashMap<>(bescheidItem.getItem());
 
-			service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION);
+			item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name());
 
-			verify(service).validateBescheid(bescheidItem, AttachedItemTestFactory.VERSION);
+			return bescheidItem.toBuilder().item(item).build();
+		}
+
+		@Test
+		void shouldCallValidateBescheid() {
+			service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION);
+
+			verify(service).validateBescheid(attachedItem, AttachedItemTestFactory.VERSION);
 		}
 
 		@Test
 		void shouldValidate() {
 			doNothing().when(service).validateBescheid(any(), anyLong());
-			var bescheidItem = AttachedItemTestFactory.createBescheid();
 
-			assertDoesNotThrow(() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION));
+			assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION));
 		}
 
 		@DisplayName("should decline when")
@@ -305,8 +391,8 @@ class BescheidServiceTest {
 		void shouldCallValidateBescheid() {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
 					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build();
+					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
+					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
 
 			service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION);
 
@@ -318,8 +404,8 @@ class BescheidServiceTest {
 			doNothing().when(service).validateBescheid(any(), anyLong());
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
 					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build();
+					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
+					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
 
 			assertDoesNotThrow(() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION));
 		}
@@ -330,8 +416,8 @@ class BescheidServiceTest {
 		void shouldDeclineSendByNotPostfach(Bescheid.SendBy sendBy) {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
 					.itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build();
+					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
+					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
 
 			var message = assertThrows(TechnicalException.class,
 					() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
@@ -343,7 +429,7 @@ class BescheidServiceTest {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
 					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
 					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, null)
-					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build();
+					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build();
 
 			var message = assertThrows(TechnicalException.class,
 					() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage();
@@ -354,7 +440,7 @@ class BescheidServiceTest {
 		void shouldDeclineWhenNoText() {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
 					.itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name())
-					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT)
+					.itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT)
 					.itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, null).build();
 
 			var message = assertThrows(TechnicalException.class,
@@ -366,11 +452,20 @@ class BescheidServiceTest {
 	@Nested
 	class TestValidateBescheid {
 
-		@Test
-		void shouldValidateBescheid() {
+		private final AttachedItem attachedItem = createManuallySendBescheid();
+
+		private AttachedItem createManuallySendBescheid() {
 			var bescheidItem = AttachedItemTestFactory.createBescheid();
+			var item = new HashMap<>(bescheidItem.getItem());
 
-			assertDoesNotThrow(() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION));
+			item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name());
+
+			return bescheidItem.toBuilder().item(item).build();
+		}
+
+		@Test
+		void shouldValidateBescheid() {
+			assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION));
 		}
 
 		@DisplayName("should decline when")
@@ -406,8 +501,6 @@ class BescheidServiceTest {
 	@Nested
 	class TestGetAttachments {
 
-		private static final FileId ATTACHMENT_FILE_ID = FileId.from(AttachedItemTestFactory.ATTACHMENT);
-
 		@Test
 		void shouldReturnEmptyList() {
 			var result = service.getAttachments(AttachedItemTestFactory.createBescheidBuilder().clearItem().build());
@@ -422,7 +515,7 @@ class BescheidServiceTest {
 			void shouldReturnAttachments() {
 				var result = service.getAttachments(AttachedItemTestFactory.createBescheid());
 
-				assertThat(result).containsExactly(ATTACHMENT_FILE_ID);
+				assertThat(result).containsExactly(BescheidTestFactory.ATTACHMENT, BescheidTestFactory.ATTACHMENT);
 			}
 
 			@Test
@@ -441,18 +534,18 @@ class BescheidServiceTest {
 		class TestSingleAttachment {
 
 			private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem()
-					.itemEntry(Bescheid.FIELD_ATTACHMENTS, AttachedItemTestFactory.ATTACHMENT).build();
+					.itemEntry(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENT).build();
 
 			@Test
 			void shouldCallGetStringAsList() {
 				service.getAttachments(bescheidItem);
 
-				verify(service).getStringAsList(AttachedItemTestFactory.ATTACHMENT);
+				verify(service).getStringAsList(BescheidTestFactory.ATTACHMENT);
 			}
 
 			@Test
 			void shouldReturnBescheidFileIdList() {
-				var expectedResult = List.of(ATTACHMENT_FILE_ID);
+				var expectedResult = List.of(BescheidTestFactory.ATTACHMENT);
 				doReturn(expectedResult).when(service).getStringAsList(any());
 
 				var result = service.getAttachments(bescheidItem);
@@ -522,7 +615,7 @@ class BescheidServiceTest {
 		void shouldCallGetItem() {
 			service.getBescheidFileId(AttachedItemTestFactory.createBescheid());
 
-			verify(attachedItemService).getItem(AttachedItemTestFactory.BESCHEID_DOCUMENT);
+			verify(attachedItemService).getItem(DocumentTestFactory.ID);
 		}
 
 		@Test
@@ -539,11 +632,11 @@ class BescheidServiceTest {
 		@Test
 		void shouldReturnSubject() {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_SUBJECT,
-					AttachedItemTestFactory.NACHRICHT_SUBJECT)).build();
+					BescheidTestFactory.NACHRICHT_SUBJECT)).build();
 
 			var result = service.getNachrichtSubject(bescheidItem);
 
-			assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT);
+			assertThat(result).contains(BescheidTestFactory.NACHRICHT_SUBJECT);
 		}
 	}
 
@@ -553,11 +646,11 @@ class BescheidServiceTest {
 		@Test
 		void shouldReturnText() {
 			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_TEXT,
-					AttachedItemTestFactory.NACHRICHT_TEXT)).build();
+					BescheidTestFactory.NACHRICHT_TEXT)).build();
 
 			var result = service.getNachrichtText(bescheidItem);
 
-			assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_TEXT);
+			assertThat(result).contains(BescheidTestFactory.NACHRICHT_TEXT);
 		}
 	}
 
@@ -802,11 +895,11 @@ class BescheidServiceTest {
 		void shouldSetSentBy() {
 			var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR);
 
-			assertThat(result).containsEntry(Bescheid.FIELD_SENT_BY, UserProfileTestFactory.ID_STR);
+			assertThat(result).containsEntry(SentInfo.FIELD_SENT_BY, UserProfileTestFactory.ID_STR);
 		}
 
 		private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) {
-			return ZonedDateTime.parse((String) sentInfoMap.get(Bescheid.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME);
+			return ZonedDateTime.parse((String) sentInfoMap.get(SentInfo.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME);
 		}
 	}
 
@@ -962,9 +1055,9 @@ class BescheidServiceTest {
 
 			@BeforeEach
 			void init() {
-				doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any());
-				doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any());
-				doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(service).buildAttachments(any());
+				doReturn(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any());
+				doReturn(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any());
+				doReturn(List.of(BescheidTestFactory.ATTACHMENT)).when(service).buildAttachments(any());
 			}
 
 			@Test
@@ -985,7 +1078,7 @@ class BescheidServiceTest {
 			void shouldSetSubject() {
 				var result = buildSendNachrichtCommandBody();
 
-				assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT);
+				assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
 			}
 
 			@Test
@@ -999,7 +1092,7 @@ class BescheidServiceTest {
 			void shouldSetMailBody() {
 				var result = buildSendNachrichtCommandBody();
 
-				assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT);
+				assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT);
 			}
 
 			@Test
@@ -1013,7 +1106,7 @@ class BescheidServiceTest {
 			void shouldSetAttachments() {
 				var result = buildSendNachrichtCommandBody();
 
-				assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.ATTACHMENT);
+				assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(BescheidTestFactory.ATTACHMENT);
 			}
 
 			@Test
@@ -1216,4 +1309,38 @@ class BescheidServiceTest {
 		}
 
 	}
+
+	@DisplayName("Get bescheid")
+	@Nested
+	class TestGetBescheid {
+
+		private final AttachedItem attachedItem = AttachedItemTestFactory.create();
+
+		@BeforeEach
+		void mock() {
+			when(attachedItemService.getItem(any())).thenReturn(attachedItem);
+			when(mapper.mapFromAttachedItem(any())).thenReturn(BescheidTestFactory.create());
+		}
+
+		@Test
+		void shouldCallVorgangAttachedItemService() {
+			service.getBescheid(AttachedItemTestFactory.ID);
+
+			verify(attachedItemService).getItem(AttachedItemTestFactory.ID);
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.getBescheid(AttachedItemTestFactory.ID);
+
+			verify(mapper).mapFromAttachedItem(attachedItem);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var bescheid = service.getBescheid(AttachedItemTestFactory.ID);
+
+			assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create());
+		}
+	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
index f21274060c920a959b90d9ab51cd9d52d852b4f2..326882334bbe54cd6987bf3eb812f1e086639642 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java
@@ -1,32 +1,37 @@
 package de.ozgcloud.bescheid;
 
-import java.io.File;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Optional;
-
-import org.springframework.http.MediaType;
+import java.util.UUID;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+import de.ozgcloud.bescheid.Bescheid.SendBy;
+import de.ozgcloud.bescheid.Bescheid.Status;
 import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
-import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.common.binaryfile.FileId;
-import de.ozgcloud.common.binaryfile.TempFileUtils;
+import de.ozgcloud.document.DocumentTestFactory;
 
 public class BescheidTestFactory {
 
-	public static final UserId CREATED_BY = UserProfileTestFactory.ID;
-	public static final String FILE_NAME = "bescheid.pdf";
+	public final static boolean BEWILLIGT = true;
+
+	public final static Status STATUS = Status.DRAFT;
+	public final static String BESCHIEDEN_AM_STR = "2021-01-10";
+	public final static LocalDate BESCHIEDEN_AM = LocalDate.parse(BESCHIEDEN_AM_STR);
+	public final static SendBy SEND_BY = SendBy.NACHRICHT;
+
+	public final static String NACHRICHT_TEXT = LoremIpsum.getInstance().getWords(5);
+	public final static String NACHRICHT_SUBJECT = LoremIpsum.getInstance().getWords(5);
 
-	public static final byte[] TEST_BESCHEID = "testbescheid".getBytes();
-	public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(TEST_BESCHEID);
-	public static final String BESCHEID_FILE_ID = "bescheid-file-id";
+	public final static String ATTACHMENT_STR = UUID.randomUUID().toString();
+	public final static FileId ATTACHMENT = FileId.from(ATTACHMENT_STR);
+	public final static List<FileId> ATTACHMENTS = List.of(ATTACHMENT, ATTACHMENT);
 
-	public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE;
-	public static final String NACHRICHT_SUBJECT = LoremIpsum.getInstance().getWords(5);
-	public static final String NACHRICHT_TEXT = LoremIpsum.getInstance().getWords(5);
+	public final static SentInfo SENT_INFO = SentInfoTestFactory.create();
 
 	public static Bescheid create() {
 		return createBuilder().build();
@@ -34,17 +39,18 @@ public class BescheidTestFactory {
 
 	public static Bescheid.BescheidBuilder createBuilder() {
 		return Bescheid.builder()
-				.createdBy(CREATED_BY)
+				.id(BescheidId.from(AttachedItemTestFactory.ID))
+				.version(AttachedItemTestFactory.VERSION)
 				.vorgangId(VorgangTestFactory.ID)
-				.contentType(CONTENT_TYPE)
-				.bescheidFileName(FILE_NAME)
-				.bescheidFile(BESCHEID_FILE)
-				.bescheidFileId(FileId.from(BESCHEID_FILE_ID))
+				.createdBy(UserProfileTestFactory.ID)
+				.bewilligt(BEWILLIGT)
+				.status(STATUS)
+				.bescheidDocument(FileId.from(DocumentTestFactory.ID))
+				.beschiedenAm(BESCHIEDEN_AM)
+				.sendBy(SEND_BY)
+				.sentInfo(SENT_INFO)
 				.nachrichtSubject(Optional.of(NACHRICHT_SUBJECT))
 				.nachrichtText(Optional.of(NACHRICHT_TEXT))
-				.genehmigt(true)
-				.size(TEST_BESCHEID.length)
-				.attachments(List.of(FileId.from(AttachedItemTestFactory.ATTACHMENT)))
-				.serviceKonto(ServiceKontoTestFactory.create());
+				.attachments(ATTACHMENTS);
 	}
-}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java
deleted file mode 100644
index 169c80a19cc0c8251b93f846f72c40269dab08aa..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package de.ozgcloud.bescheid;
-
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mapstruct.factory.Mappers;
-
-class GrpcBescheidItemMapperTest {
-
-	private final GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class);
-
-	@Nested
-	class TestFromBescheid {
-
-		@Test
-		void shouldMapAllFields() {
-			var result = mapper.fromBescheid(BescheidTestFactory.create());
-
-			assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidTestFactory.create());
-		}
-	}
-
-	@Nested
-	class TestFromBescheidManagerConfig {
-
-		@Test
-		void shouldMapAllFields() {
-			var result = mapper.fromBescheidManagerConfig(BescheidManagerConfigTestFactory.create());
-
-			assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidManagerConfigResponseTestFactory.create());
-		}
-	}
-
-}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java
index 1b348feafd596790ed9a3a9138d512aa93bd57a9..e3781092bf7bf1ea93256e5297715f0a89d6b07a 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java
@@ -8,7 +8,7 @@ class GrpcBescheidTestFactory {
 
 	public static GrpcBescheid.Builder createBuilder() {
 		return GrpcBescheid.newBuilder()
-				.setBewilligt(true)
+				.setBewilligt(BescheidTestFactory.BEWILLIGT)
 				.setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT);
 	}
 }
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..532945af74f9f78d30741021b1362b51b6c4ce73
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java
@@ -0,0 +1,27 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
+import de.ozgcloud.common.binaryfile.FileId;
+import de.ozgcloud.document.DocumentTestFactory;
+
+public class GrpcBescheidWithoutDocumentTestFactory {
+
+	public static GrpcBescheid create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcBescheid.Builder createBuilder() {
+		return GrpcBescheid.newBuilder()
+				.setId(AttachedItemTestFactory.ID)
+				.setVersion(AttachedItemTestFactory.VERSION)
+				.setStatus(BescheidTestFactory.STATUS.name())
+				.setBeschiedenAm(BescheidTestFactory.BESCHIEDEN_AM_STR)
+				.setBewilligt(BescheidTestFactory.BEWILLIGT)
+				.setBescheidDocument(DocumentTestFactory.ID)
+				.addAllAttachments(BescheidTestFactory.ATTACHMENTS.stream().map(FileId::toString).toList())
+				.setSendBy(BescheidTestFactory.SEND_BY.name())
+				.setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT)
+				.setNachrichtSubject(BescheidTestFactory.NACHRICHT_SUBJECT)
+				.setSentInfo(GrpcSentInfoTestFactory.create());
+	}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..af6362a99396ebfb72a8eac0ba14121e387f1a9c
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+
+public class GrpcGetAllBescheidRequestTestFactory {
+
+	public static GrpcGetAllBescheidRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetAllBescheidRequest.Builder createBuilder() {
+		return GrpcGetAllBescheidRequest.newBuilder()
+				.setVorgangId(VorgangTestFactory.ID_STR);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..290201a2f409bdd8462e4b6dbdd3a1f5768a1add
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
+
+public class GrpcGetBescheidDraftRequestTestFactory {
+
+	public static GrpcGetBescheidDraftRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidDraftRequest.Builder createBuilder() {
+		return GrpcGetBescheidDraftRequest.newBuilder()
+				.setVorgangId(VorgangTestFactory.ID_STR);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2e3d5d8ca5a1d1bbf74211ebd20de9b674ee7f6f
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.bescheid;
+
+public class GrpcGetBescheidDraftResponseTestFactory {
+
+	public static GrpcGetBescheidDraftResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidDraftResponse.Builder createBuilder() {
+		return GrpcGetBescheidDraftResponse.newBuilder()
+				.setBescheid(GrpcBescheidWithoutDocumentTestFactory.create());
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..43f93b3eddbfc345130af34f26e6b9d6c85cfc0c
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.bescheid;
+
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
+
+public class GrpcGetBescheidRequestTestFactory {
+
+	public static GrpcGetBescheidRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidRequest.Builder createBuilder() {
+		return GrpcGetBescheidRequest.newBuilder()
+				.setId(AttachedItemTestFactory.ID);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b87d8e4924566bd6028982f1760b86d5362468b
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.bescheid;
+
+public class GrpcGetBescheidResponseTestFactory {
+
+	public static GrpcGetBescheidResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetBescheidResponse.Builder createBuilder() {
+		return GrpcGetBescheidResponse.newBuilder()
+				.setBescheid(GrpcBescheidWithoutDocumentTestFactory.create());
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..86fd1c8373f7d09940ade469b09ba9bdfebb437c
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.bescheid;
+
+public class GrpcSentInfoTestFactory {
+
+	public static GrpcSentInfo create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcSentInfo.Builder createBuilder() {
+		return GrpcSentInfo.newBuilder()
+				.setSentAt(SentInfoTestFactory.SENT_AT_STR)
+				.setSentBy(SentInfoTestFactory.SENT_BY);
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fa8f14b830b3c980e207d41ef1af3cafe69d00b
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.bescheid;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+class SentInfoMapperTest {
+
+	private SentInfoMapper mapper = Mappers.getMapper(SentInfoMapper.class);
+
+	@DisplayName("Map to")
+	@Nested
+	class TestMapTo {
+
+		@Test
+		void shouldMap() {
+			var mappedSentInfo = mapper.mapTo(SentInfoTestFactory.create());
+
+			assertThat(mappedSentInfo).usingRecursiveComparison().isEqualTo(GrpcSentInfoTestFactory.create());
+		}
+	}
+}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
index 90253c5ec4e2ff14504ae04ade55645f73bd7b43..8361e82f8c1459da781d70b4603f5e673ec77c81 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java
@@ -46,7 +46,7 @@ public class SentInfoTestFactory {
 
 	public static Map<String, Object> asMap() {
 		return Map.of(
-				Bescheid.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY,
-				Bescheid.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR);
+				SentInfo.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY,
+				SentInfo.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR);
 	}
 }
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
deleted file mode 100644
index a2da15ff9475d6fed63b149dcb2a496d85caf79d..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 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 java.util.List;
-import java.util.Map;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-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.mapstruct.factory.Mappers;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.GrpcBescheid;
-import de.ozgcloud.bescheid.GrpcSentInfo;
-import de.ozgcloud.bescheid.SentInfoTestFactory;
-import de.ozgcloud.document.DocumentService;
-import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-
-class AttachedItemMapperTest {
-
-	@Spy
-	@InjectMocks
-	private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class);
-
-	@Mock
-	private GrpcObjectMapper grpcObjectMapper;
-
-	@Nested
-	class TestMapFromVorgangAttachedItem {
-
-		@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());
-		}
-	}
-
-	@Nested
-	class TestToBescheid {
-
-		@Mock
-		private GrpcSentInfo grpcSentInfo;
-
-		@Test
-		void shouldSetBeschiedenAm() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getBeschiedenAm()).isEqualTo(AttachedItemTestFactory.BESCHEIDEN_AM);
-		}
-
-		@Test
-		void shouldSetBewilligt() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getBewilligt()).isTrue();
-		}
-
-		@Test
-		void shouldSetBescheidDocument() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getBescheidDocument()).isEqualTo(AttachedItemTestFactory.BESCHEID_DOCUMENT);
-		}
-
-		@Test
-		void shouldSetSendBy() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getSendBy()).isEqualTo(AttachedItemTestFactory.SEND_BY.name());
-		}
-
-		@Test
-		void shouldSetNachrichtText() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getNachrichtText()).isEqualTo(AttachedItemTestFactory.NACHRICHT_TEXT);
-		}
-
-		@Test
-		void shouldSetNachrichtSubject() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getNachrichtSubject()).isEqualTo(AttachedItemTestFactory.NACHRICHT_SUBJECT);
-		}
-
-		@Test
-		void shouldCallToAttachments() {
-			var expectedAttachments = List.of(AttachedItemTestFactory.ATTACHMENT);
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder()
-					.item(Map.of(Bescheid.FIELD_ATTACHMENTS, expectedAttachments)).build();
-
-			mapper.toBescheid(bescheidItem);
-
-			verify(mapper).toAttachments(expectedAttachments);
-		}
-
-		@Test
-		void shouldNotCallToAttachments() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build();
-
-			mapper.toBescheid(bescheidItem);
-
-			verify(mapper, never()).toAttachments(any());
-		}
-
-		@Test
-		void shouldSetAttachments() {
-			doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(mapper).toAttachments(any());
-
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getAttachmentsList()).containsExactly(AttachedItemTestFactory.ATTACHMENT);
-		}
-
-		@Test
-		void shouldSetId() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getId()).isEqualTo(AttachedItemTestFactory.ID);
-		}
-
-		@Test
-		void shouldSetVersion() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getVersion()).isEqualTo(AttachedItemTestFactory.VERSION);
-		}
-
-		@Test
-		void shouldSetStatus() {
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getStatus()).isEqualTo(Bescheid.Status.DRAFT.name());
-		}
-
-		@Test
-		void shouldCallToSentInfo() {
-			var sentInfoMap = SentInfoTestFactory.asMap();
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_SENT_INFO, sentInfoMap).build();
-
-			mapper.toBescheid(bescheidItem);
-
-			verify(mapper).toSentInfo(sentInfoMap);
-		}
-
-		@Test
-		void shouldSetSentInfo() {
-			doReturn(grpcSentInfo).when(mapper).toSentInfo(any());
-
-			var bescheid = mapBescheid();
-
-			assertThat(bescheid.getSentInfo()).isSameAs(grpcSentInfo);
-		}
-
-		private GrpcBescheid mapBescheid() {
-			return mapper.toBescheid(AttachedItemTestFactory.createBescheid());
-		}
-	}
-
-	@Nested
-	class TestToAttachments {
-
-		@Test
-		void shouldMapCollection() {
-			var result = mapper.toAttachments(List.of(AttachedItemTestFactory.ATTACHMENT));
-
-			assertThat(result).containsExactly(AttachedItemTestFactory.ATTACHMENT);
-		}
-
-		@Test
-		void shouldMapSingleValue() {
-			var result = mapper.toAttachments(AttachedItemTestFactory.ATTACHMENT);
-
-			assertThat(result).containsExactly(AttachedItemTestFactory.ATTACHMENT);
-		}
-
-		@DisplayName("should return null")
-		@ParameterizedTest(name = "when attachmentsObject is \"{0}\"")
-		@NullAndEmptySource
-		void shouldReturnNull(String attachmentsObject) {
-			var result = mapper.toAttachments(attachmentsObject);
-
-			assertThat(result).isNull();
-		}
-	}
-
-	@Nested
-	class TestToSentInfo {
-
-		private static final Map<String, Object> SENT_INFO_MAP = Map.of(
-				Bescheid.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY,
-				Bescheid.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR);
-
-		@Test
-		void shouldSetSentBy() {
-			var sentInfo = mapper.toSentInfo(SENT_INFO_MAP);
-
-			assertThat(sentInfo.getSentBy()).isEqualTo(SentInfoTestFactory.SENT_BY);
-		}
-
-		@Test
-		void shouldSetSentAt() {
-			var sentInfo = mapper.toSentInfo(SENT_INFO_MAP);
-
-			assertThat(sentInfo.getSentAt()).isEqualTo(SentInfoTestFactory.SENT_AT_STR);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java
deleted file mode 100644
index c6ba16773eaf8c543412d378709d506d7996cd3a..0000000000000000000000000000000000000000
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 java.util.Map;
-
-import org.junit.jupiter.api.Test;
-
-import de.ozgcloud.command.CommandTestFactory;
-
-class UtilsTest {
-
-	@Test
-	void shouldReturnClient() {
-		var command = CommandTestFactory.createBuilder().bodyObject(Map.of(AttachedItem.PROPERTY_CLIENT, AttachedItemTestFactory.CLIENT)).build();
-
-		var client = Utils.extractClient(command);
-
-		assertThat(client).isEqualTo(AttachedItemTestFactory.CLIENT);
-	}
-}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
index 4db4b0e81338307b7af8df53bf85667096e738e3..86bc7f747b0e95edb9f633b95ba93879124f71ca 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java
@@ -17,7 +17,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Text;
 
 import de.ozgcloud.bescheid.BescheidRequestTestFactory;
-import de.ozgcloud.bescheid.BescheidTestFactory;
+import de.ozgcloud.bescheid.BescheidResponseTestFactory;
 import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
 import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
@@ -44,7 +44,7 @@ class SmartDocumentsBescheidRemoteServiceTest {
 			var bescheid = service.buildBescheid(BescheidRequestTestFactory.create(), SmartDocumentsResponseTestFactory.create());
 
 			assertThat(bescheid).usingRecursiveComparison().ignoringFields("serviceKonto", "nachrichtSubject", "bescheidFileId", "attachments")
-					.isEqualTo(BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build());
+					.isEqualTo(BescheidResponseTestFactory.createBuilder().nachrichtText(Optional.empty()).build());
 		}
 	}
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java
index 1d4a46cc0b786f81f6c6255558696c3f5074e14c..32a0b3ac98768e565da86a25437605fa7c37cd60 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java
@@ -2,7 +2,7 @@ package de.ozgcloud.bescheid.smartdocuments;
 
 import java.util.List;
 
-import de.ozgcloud.bescheid.BescheidTestFactory;
+import de.ozgcloud.bescheid.BescheidResponseTestFactory;
 import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse;
 import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument;
 import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile;
@@ -18,10 +18,10 @@ public class SmartDocumentsResponseTestFactory {
 	static SmartDocumentsResponse.SmartDocumentsResponseBuilder createBuilder() {
 		return SmartDocumentsResponse.builder()
 				.file(List.of(SmartDocumentFile.builder()
-						.filename(BescheidTestFactory.FILE_NAME)
+						.filename(BescheidResponseTestFactory.BESCHEID_FILE_NAME)
 						.outputFormat(OUTPUT_FORMAT)
 						.document(SmartDocumentDocument.builder()
-								.data(BescheidTestFactory.BESCHEID_FILE)
+								.data(BescheidResponseTestFactory.BESCHEID_FILE)
 								.build())
 						.build()));
 	}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
index 62009fca650eef4534876936e5ec328f0ddd593c..000bc28d0aea983e85485a76638fbb0e33727ba2 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java
@@ -4,7 +4,8 @@ import java.util.UUID;
 
 public class VorgangTestFactory {
 
-	public static final VorgangId ID = VorgangId.from(UUID.randomUUID().toString());
+	public static final String ID_STR = UUID.randomUUID().toString();
+	public static final VorgangId ID = VorgangId.from(ID_STR);
 	public static final long VERSION = 1L;
 
 	public static Vorgang create() {
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..986f208f2f4ab75effbf1a4c42744624a2f8f202
--- /dev/null
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.common.attached_item;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.document.DocumentService;
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+
+class AttachedItemMapperTest {
+
+	@Spy
+	@InjectMocks
+	private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class);
+
+	@Mock
+	private GrpcObjectMapper grpcObjectMapper;
+
+	@Nested
+	class TestMapFromVorgangAttachedItem {
+
+		@BeforeEach
+		void init() {
+			when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem());
+		}
+
+		@Test
+		void shouldMapFromVorgangAttachedItem() {
+			var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME).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/common/attached_item/AttachedItemServiceTest.java
similarity index 97%
rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java
index 9f4272fed782bba1aef9ea7236c4430752002e88..1c2e8557104da84c83ebc6d37565bc357c5461e9 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
@@ -58,6 +58,7 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.Bescheid.SendBy;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
+import de.ozgcloud.bescheid.BescheidTestFactory;
 import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
 import de.ozgcloud.bescheid.vorgang.VorgangId;
 import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
@@ -73,14 +74,17 @@ class AttachedItemServiceTest {
 	@Spy
 	@InjectMocks
 	private AttachedItemService service;
+	@Mock
+	private AttachedItemMapper mapper;
+	@Mock
+	private VorgangAttachedItemRemoteService remoteService;
 
 	@Mock
 	private OzgCloudCommandService commandService;
 	@Mock
 	private CommandMapper commandMapper;
 	@Mock
-	private VorgangAttachedItemRemoteService remoteService;
-	@Mock
+
 	private TemplateHandler templateHandler;
 
 	@Nested
@@ -517,7 +521,7 @@ class AttachedItemServiceTest {
 
 			var bescheidItem = service.buildBescheidItemAsMap(command, document);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
 		}
 	}
 
@@ -695,49 +699,50 @@ class AttachedItemServiceTest {
 		void shouldHaveSetBescheidenAm() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, AttachedItemTestFactory.BESCHEIDEN_AM);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR);
 		}
 
 		@Test
 		void shouldHaveSetBewilligt() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, AttachedItemTestFactory.BEWILLIGT);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT);
 		}
 
 		@Test
 		void shouldHaveSetBescheidDocument() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, AttachedItemTestFactory.BESCHEID_DOCUMENT);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID);
 		}
 
 		@Test
 		void shouldHaveSetSendBy() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, AttachedItemTestFactory.SEND_BY.name());
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
 		}
 
 		@Test
 		void shouldHaveSetNachrichtText() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
 		}
 
 		@Test
 		void shouldHaveSetNachrichtSubject() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT);
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
 		}
 
 		@Test
 		void shouldHaveSetAttachments() {
 			var bescheidItem = service.buildItemMapWithAllBescheidFields(command);
 
-			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS, List.of(AttachedItemTestFactory.ATTACHMENT));
+			assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS,
+					List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR));
 		}
 	}
 
@@ -795,7 +800,7 @@ class AttachedItemServiceTest {
 		void shouldSetBeschiedenAm() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, AttachedItemTestFactory.BESCHEIDEN_AM);
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR);
 		}
 
 		@Test
@@ -809,35 +814,36 @@ class AttachedItemServiceTest {
 		void shouldSetBescheidDocument() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, AttachedItemTestFactory.BESCHEID_DOCUMENT);
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID);
 		}
 
 		@Test
 		void shouldSetSendBy() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, AttachedItemTestFactory.SEND_BY.name());
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
 		}
 
 		@Test
 		void shouldSetNachrichtText() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT);
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
 		}
 
 		@Test
 		void shouldSetNachrichtSubject() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT);
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
 		}
 
 		@Test
 		void shouldSetAttachments() {
 			var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
 
-			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS, List.of(AttachedItemTestFactory.ATTACHMENT));
+			assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS,
+					List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR));
 		}
 	}
 
@@ -1004,7 +1010,8 @@ class AttachedItemServiceTest {
 
 		@Test
 		void shouldThrowExceptionIfBescheidIsNotDraft() {
-			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus").build();
+			var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus")
+					.build();
 
 			assertThrows(TechnicalException.class, () -> service.validateBescheidStatus(bescheidItem));
 		}
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
similarity index 50%
rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
index 201fd3f6444931b06f9c1ffec5baab3a90771a6c..6f95bc5930e980d4818394d9cf83cafcae4ab65f 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java
@@ -21,18 +21,23 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import static de.ozgcloud.bescheid.SentInfoTestFactory.*;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import de.ozgcloud.bescheid.Bescheid;
-import de.ozgcloud.bescheid.Bescheid.Status;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem.AttachedItemBuilder;
+import de.ozgcloud.bescheid.BescheidTestFactory;
+import de.ozgcloud.bescheid.SentInfo;
+import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
+import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
 import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItem.AttachedItemBuilder;
+import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.document.Document;
 import de.ozgcloud.document.DocumentService;
 import de.ozgcloud.document.DocumentTestFactory;
@@ -43,13 +48,9 @@ public class AttachedItemTestFactory {
 	public static final long VERSION = 10L;
 	public static final String CLIENT = "client";
 
-	public static final String BESCHEIDEN_AM = "2024-01-01";
-	public static final boolean BEWILLIGT = true;
-	public static final String BESCHEID_DOCUMENT = "bescheid-document";
-	public static final String ATTACHMENT = "attachment-id";
-	public static final Bescheid.SendBy SEND_BY = Bescheid.SendBy.MANUAL;
-	public static final String NACHRICHT_TEXT = "nachricht-text";
-	public static final String NACHRICHT_SUBJECT = "nachricht-subject";
+	public static AttachedItem create() {
+		return createBuilder().build();
+	}
 
 	public static AttachedItem createBescheid() {
 		return createBescheidBuilder().build();
@@ -63,17 +64,48 @@ public class AttachedItemTestFactory {
 
 	public static Map<String, Object> createBescheidItem() {
 		var item = new HashMap<String, Object>();
-		item.put(Bescheid.FIELD_STATUS, Status.DRAFT);
-		item.put(Bescheid.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM);
-		item.put(Bescheid.FIELD_BEWILLIGT, BEWILLIGT);
-		item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT);
-		item.put(Bescheid.FIELD_ATTACHMENTS, List.of(ATTACHMENT));
-		item.put(Bescheid.FIELD_SEND_BY, SEND_BY.name());
-		item.put(Bescheid.FIELD_NACHRICHT_TEXT, NACHRICHT_TEXT);
-		item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, NACHRICHT_SUBJECT);
+		item.put(AttachedItem.PROPERTY_VORGANG_ID, VorgangTestFactory.ID);
+		item.put(Bescheid.FIELD_STATUS, BescheidTestFactory.STATUS.name());
+		item.put(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR);
+		item.put(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT);
+		item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID);
+		item.put(Bescheid.FIELD_ATTACHMENTS, new ArrayList<>(List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)));
+		item.put(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
+		item.put(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
+		item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
 		item.put(Bescheid.FIELD_SENT_INFO, Map.of(
-				Bescheid.FIELD_SENT_BY, SENT_BY,
-				Bescheid.FIELD_SENT_AT, SENT_AT_STR));
+				SentInfo.FIELD_SENT_BY, SENT_BY,
+				SentInfo.FIELD_SENT_AT, SENT_AT_STR));
+		return item;
+	}
+
+	public static AttachedItem createBescheidWithoutDocument() {
+		return createBescheidWithoutDocumentBuilder().build();
+	}
+
+	public static AttachedItem.AttachedItemBuilder createBescheidWithoutDocumentBuilder() {
+		return createBuilder()
+				.itemName(AttachedItemService.BESCHEID_ITEM_NAME)
+				.item(createBescheidItemWithoutDocument());
+	}
+
+	private static Map<String, Object> createBescheidItemWithoutDocument() {
+		var item = new HashMap<String, Object>();
+		item.put(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID);
+		item.put(AttachedItem.PROPERTY_VERSION, AttachedItemTestFactory.VERSION);
+		item.put(Bescheid.FIELD_VORGANG_ID, VorgangTestFactory.ID);
+		item.put(Bescheid.FIELD_CREATED_BY, UserProfileTestFactory.ID);
+		item.put(Bescheid.FIELD_STATUS, BescheidTestFactory.STATUS.name());
+		item.put(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM);
+		item.put(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT);
+		item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, FileId.from(DocumentTestFactory.ID));
+		item.put(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENTS);
+		item.put(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name());
+		item.put(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT);
+		item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT);
+		item.put(Bescheid.FIELD_SENT_INFO, Map.of(
+				SentInfo.FIELD_SENT_BY, SENT_BY,
+				SentInfo.FIELD_SENT_AT, SENT_AT_STR));
 		return item;
 	}
 
@@ -103,5 +135,4 @@ public class AttachedItemTestFactory {
 				.client(CLIENT)
 				.vorgangId(CommandTestFactory.VORGANG_ID);
 	}
-
-}
+}
\ No newline at end of file
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java
similarity index 97%
rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java
rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java
index da539078f64cab22747c341af6758453d56d633a..6a1ebaafcff9eb040990d3d2809fd1cc7ba8194a 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse;
 
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java
similarity index 95%
rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java
rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java
index fa3431732af5d052b593ed5b8827d0565741f44c..daa37d39f9417cb153ae0d83361be572634698e2 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import de.ozgcloud.command.CommandTestFactory;
 import de.ozgcloud.vorgang.common.GrpcObject;
@@ -29,12 +29,12 @@ import de.ozgcloud.vorgang.common.GrpcProperty;
 import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
 
 public class GrpcVorgangAttachedItemTestFactory {
+
 	public static final String PROPERTY_NAME = "propertyName";
 	public static final String PROPERTY_NAME_VALUE = "propertyNameValue";
 	public static final GrpcObject OBJECT = GrpcObject.newBuilder()
 			.addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE)).build();
 
-
 	static GrpcVorgangAttachedItem create() {
 		return createBuilder().build();
 	}
@@ -42,6 +42,7 @@ public class GrpcVorgangAttachedItemTestFactory {
 	static GrpcVorgangAttachedItem.Builder createBuilder() {
 		return GrpcVorgangAttachedItem.newBuilder()
 				.setId(AttachedItemTestFactory.ID)
+				.setVersion(AttachedItemTestFactory.VERSION)
 				.setVorgangId(CommandTestFactory.VORGANG_ID)
 				.setClient(AttachedItemTestFactory.CLIENT)
 				.setItemName(AttachedItemService.BESCHEID_ITEM_NAME)
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java
similarity index 98%
rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java
index 0fc0a06502b2896cdfb67125649c1ede7c047926..7e1a5140b048e87f07aa2c005f6595234a5ea669 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java
@@ -23,7 +23,7 @@
  *  unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.bescheid.attacheditem;
+package de.ozgcloud.common.attached_item;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
@@ -300,7 +300,8 @@ class VorgangAttachedItemRemoteServiceTest {
 		}
 
 		private AttachedItem createAttachedItem(String beschiedenAm) {
-			return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm).build();
+			return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm)
+					.build();
 		}
 	}
 
@@ -309,7 +310,8 @@ class VorgangAttachedItemRemoteServiceTest {
 
 		@Test
 		void shouldReturnTrueIfDraft() {
-			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name())
+			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem()
+					.itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name())
 					.build();
 
 			var result = service.hasStatusDraft(item);
@@ -319,7 +321,8 @@ class VorgangAttachedItemRemoteServiceTest {
 
 		@Test
 		void shouldReturnFalseIfNotDraft() {
-			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name())
+			var item = AttachedItemTestFactory.createBescheidBuilder().clearItem()
+					.itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name())
 					.build();
 
 			var result = service.hasStatusDraft(item);
diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
index 9ba02e1e11c796f19fc771e9ed29000f911690cd..50405df503f49f1a8ef42d20921d9cb0dbc62e99 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
 
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 
 class DocumentMapperTest {
 
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 d9666c6f3edcccc48c5ce830547086ab2f9f8d30..9a059e860e5fd527fdc18b6e236f5363ce7311e4 100644
--- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
+++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java
@@ -48,11 +48,13 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.bescheid.Bescheid;
 import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
 import de.ozgcloud.bescheid.BescheidTestFactory;
-import de.ozgcloud.bescheid.attacheditem.AttachedItem;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
+import de.ozgcloud.bescheid.BescheidResponse;
+import de.ozgcloud.bescheid.BescheidResponseTestFactory;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.attached_item.AttachedItem;
+import de.ozgcloud.common.attached_item.AttachedItemService;
+import de.ozgcloud.common.attached_item.AttachedItemTestFactory;
 import de.ozgcloud.common.binaryfile.FileId;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 
@@ -123,7 +125,8 @@ class DocumentServiceTest {
 		@Nested
 		class TestWithBescheid {
 
-			private final Bescheid bescheid = BescheidTestFactory.create().withBescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID));
+			private final BescheidResponse bescheid = BescheidResponseTestFactory.create()
+					.withBescheidFileId(FileId.from(DocumentTestFactory.ID));
 
 			@BeforeEach
 			void init() {
@@ -140,7 +143,7 @@ class DocumentServiceTest {
 			@Test
 			void shouldCallCreateBescheidDocument() {
 				var itemMap = Map.of("key", (Object) "value");
-				doReturn(itemMap).when(service).buildItemMap(any(Bescheid.class));
+				doReturn(itemMap).when(service).buildItemMap(any(BescheidResponse.class));
 
 				service.createBescheidDocument(command, bescheid);
 
@@ -367,7 +370,8 @@ class DocumentServiceTest {
 		@Nested
 		class TestBuildFromBescheid {
 
-			private Bescheid bescheid = BescheidTestFactory.create().withBescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID));
+			private BescheidResponse bescheid = BescheidResponseTestFactory.create()
+					.withBescheidFileId(FileId.from(DocumentTestFactory.ID));
 
 			@Test
 			void shouldDetDocumentType() {
@@ -380,7 +384,7 @@ class DocumentServiceTest {
 			void shouldSetDocumentFile() {
 				var itemMap = buildItemMap();
 
-				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, BescheidTestFactory.BESCHEID_FILE_ID);
+				assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, DocumentTestFactory.ID);
 			}
 
 			@Test
@@ -392,7 +396,8 @@ class DocumentServiceTest {
 
 			@Test
 			void shouldSetEmptyNachrichtText() {
-				bescheid = BescheidTestFactory.createBuilder().bescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID))
+				bescheid = BescheidResponseTestFactory.createBuilder()
+						.bescheidFileId(FileId.from(DocumentTestFactory.ID))
 						.nachrichtText(Optional.empty()).build();
 
 				var itemMap = buildItemMap();
@@ -402,7 +407,7 @@ class DocumentServiceTest {
 
 			@Test
 			void shouldThrowExceptionIfFileIdMissing() {
-				bescheid = BescheidTestFactory.createBuilder().bescheidFileId(null).build();
+				bescheid = BescheidResponseTestFactory.createBuilder().bescheidFileId(null).build();
 
 				assertThrows(TechnicalException.class, () -> service.buildItemMap(bescheid));
 
diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
index 920fdd91d321c9c811b380b19a2c4eca8b518e18..3c6990c88bbc2b9194a1927b3347dc12902fe867 100644
--- a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
+++ b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto
@@ -74,4 +74,12 @@ message GrpcBescheidManagerConfigResponse {
 
 message GrpcBescheidManagerFeatures {
   bool canCreateBescheidDocument = 1;
+}
+
+message GrpcGetBescheidRequest {
+  string id = 1;
+} 
+
+message GrpcGetBescheidResponse {
+  GrpcBescheid bescheid = 1;
 }
\ No newline at end of file
diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.proto
index 49d355a435c9cad12c457229967db728b886053e..e99d06390e5aab694b512cac8cd4edd8b5a72f2f 100644
--- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto
+++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto
@@ -40,4 +40,7 @@ service BescheidService {
 
   rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) {
   }
+  
+  rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) {
+  }
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
index c65e33018262555e9b38727cf434e221ec3ac4eb..1b932d19d2a567520bbdc4d0b0b3b0e73730f5ce 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java
@@ -3,13 +3,17 @@ package de.ozgcloud.vorgang.servicekonto;
 import java.util.List;
 import java.util.Set;
 
+import jakarta.validation.constraints.NotEmpty;
+
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
 
 import lombok.Builder;
 import lombok.Getter;
 import lombok.Singular;
 import lombok.extern.log4j.Log4j2;
 
+@Validated
 @Getter
 @Builder
 @Log4j2
@@ -21,6 +25,8 @@ public class ServiceKonto {
 
 	private String type;
 	private String trustLevel;
+
+	@NotEmpty
 	@Singular
 	private List<PostfachAddress> postfachAddresses;
 
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java
index d8c1ab65d0365d32fed233f872c76569ecc36dfc..4c564cad1b2a2455c0a345371ef0a511c3df13d7 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java
@@ -26,11 +26,16 @@ package de.ozgcloud.vorgang.vorgang;
 import java.util.List;
 import java.util.Map;
 
+import jakarta.validation.Valid;
+
+import org.springframework.validation.annotation.Validated;
+
 import lombok.Builder;
 import lombok.Getter;
 import lombok.Singular;
 import lombok.ToString;
 
+@Validated
 @ToString(onlyExplicitlyIncluded = true)
 @Getter
 @Builder(toBuilder = true)
@@ -39,6 +44,7 @@ public class Eingang {
 	@ToString.Include
 	private String id;
 
+	@Valid
 	@ToString.Include
 	private EingangHeader header;
 	private Antragsteller antragsteller;
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java
index d092cc381f65bc11bc918bf1e3a157ceda3cb492..ac8a3dc88ce4437216d904438e3a53254d418003 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java
@@ -25,11 +25,16 @@ package de.ozgcloud.vorgang.vorgang;
 
 import java.time.ZonedDateTime;
 
+import jakarta.validation.Valid;
+
+import org.springframework.validation.annotation.Validated;
+
 import de.ozgcloud.vorgang.servicekonto.ServiceKonto;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
 
+@Validated
 @ToString
 @Getter
 @Builder
@@ -44,5 +49,6 @@ public class EingangHeader {
 	private String vorgangNummer;
 
 	private String sender;
+	@Valid
 	private ServiceKonto serviceKonto;
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
similarity index 98%
rename from vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java
rename to vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
index 647303f1968fcf6ae80edad3dbe42e87497e6579..3adf3dcf4bf4b7d352039c64292abffdfe1068dc 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java
@@ -35,7 +35,7 @@ import net.devh.boot.grpc.server.service.GrpcService;
 
 @GrpcService
 @RequiredArgsConstructor
-class GrpcVorgangService extends VorgangServiceGrpc.VorgangServiceImplBase {
+class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase {
 
 	private final VorgangService vorgangService;
 	private final VorgangHeaderService vorgangHeaderService;
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java
index 3b69aa9e535b41598d1f2d76f9645436e3c8e75c..51e2ba9baad098db8ba6c73cd84f6ee75ddd8d1a 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java
@@ -30,6 +30,8 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import jakarta.validation.Valid;
+
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
 
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.VorgangCreatedEvent;
@@ -47,6 +50,7 @@ import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
 import de.ozgcloud.vorgang.servicekonto.ServiceKonto;
 import lombok.NonNull;
 
+@Validated
 @Service
 public class VorgangService {
 
@@ -72,7 +76,7 @@ public class VorgangService {
 	@Autowired
 	private VorgangStubMapper stubMapper;
 
-	public Vorgang startCreation(Eingang eingang) {
+	public Vorgang startCreation(@Valid Eingang eingang) {
 		var mappedEingang = kopControlDataMapper.moveLabelsToControlData(eingang);
 
 		return repository.save(buildVorgang(mappedEingang, true));
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java
index b0aacf0b8b577f54891934831ce0ebf7d71ae466..b0526dd894a7583fd5c89e06e8fd05af4941d872 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java
@@ -39,11 +39,11 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.test.annotation.DirtiesContext;
 
 import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
 import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
 import de.ozgcloud.bescheid.common.user.UserProfile;
 import de.ozgcloud.bescheid.common.user.UserProfileService;
+import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.vorgang.VorgangManagerServerApplication;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
@@ -116,20 +116,19 @@ class BescheidGrpcServiceITCase {
 
 		private Map<String, Object> createItemWithSentInfo() {
 			return Map.of(
+					Bescheid.FIELD_BEWILLIGT, "true",
 					Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(),
 					Bescheid.FIELD_BESCHIEDEN_AM, "2022-10-01",
 					Bescheid.FIELD_SENT_INFO, Map.of(
-							Bescheid.FIELD_SENT_AT, GrpcSentInfoTestFactory.SENT_AT_STR,
-							Bescheid.FIELD_SENT_BY, CallContextUserTestFactory.ID
-					)
-			);
+							SentInfo.FIELD_SENT_AT, GrpcSentInfoTestFactory.SENT_AT_STR,
+							SentInfo.FIELD_SENT_BY, CallContextUserTestFactory.ID));
 		}
 
 		private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, String beschiedenAm) {
-			var itemMap = Map.of(
+			var itemMap = Map.<String, Object>of(
+					Bescheid.FIELD_BEWILLIGT, "true",
 					Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name(),
-					Bescheid.FIELD_BESCHIEDEN_AM, (Object) beschiedenAm
-			);
+					Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm);
 			return createBescheidAttachedItem(vorgangId, itemMap);
 		}
 
@@ -143,7 +142,6 @@ class BescheidGrpcServiceITCase {
 					.item(itemMap)
 					.build();
 		}
-
 	}
 
 	@Nested
@@ -158,5 +156,4 @@ class BescheidGrpcServiceITCase {
 			assertThat(config.getFeatures().getCanCreateBescheidDocument()).isFalse();
 		}
 	}
-
-}
+}
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
index deabb903e2e37c99c2e45d41c8d88006e0077764..87fe08890aa9295fbda6a51d5a63f054845f907b 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java
@@ -57,9 +57,9 @@ import com.mongodb.client.gridfs.model.GridFSFile;
 import de.ozgcloud.apilib.user.OzgCloudUserId;
 import de.ozgcloud.apilib.user.OzgCloudUserProfile;
 import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
-import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandStatus;
+import de.ozgcloud.common.attached_item.AttachedItemService;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.document.BescheidDocumentCreatedEvent;
 import de.ozgcloud.document.Document;
@@ -311,7 +311,7 @@ class BescheidITCase {
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
 				verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
 				var sentInfoMap = MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO);
-				assertThat(MapUtils.getString(sentInfoMap, Bescheid.FIELD_SENT_BY)).isNotBlank();
+				assertThat(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_BY)).isNotBlank();
 			});
 		}
 
@@ -322,7 +322,7 @@ class BescheidITCase {
 			await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
 				verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
 				var sentAtStr = MapUtils.getString(
-						MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO), Bescheid.FIELD_SENT_AT);
+						MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO), SentInfo.FIELD_SENT_AT);
 				assertThat(ZonedDateTime.parse(sentAtStr)).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS));
 			});
 		}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
index acd60e5393d455769e639db9f61e24cf23e11f2a..32db2a67bebf61625a2e5eea835a61eaa5c87665 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java
@@ -24,14 +24,21 @@
 package de.ozgcloud.vorgang.collaboration;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.assertj.core.api.InstanceOfAssertFactories.*;
 import static org.awaitility.Awaitility.*;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
@@ -41,29 +48,41 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.gridfs.GridFsTemplate;
 import org.springframework.test.annotation.DirtiesContext;
 
+import com.google.protobuf.ByteString;
+
 import de.ozgcloud.apilib.user.OzgCloudUserId;
 import de.ozgcloud.apilib.user.OzgCloudUserProfile;
 import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
+import de.ozgcloud.collaboration.CollaborationServiceGrpc.CollaborationServiceBlockingStub;
+import de.ozgcloud.collaboration.GrpcGetFileContentRequest;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandStatus;
 import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
 import de.ozgcloud.vorgang.callcontext.CallContext;
+import de.ozgcloud.vorgang.callcontext.TestCallContextAttachingInterceptor;
 import de.ozgcloud.vorgang.callcontext.WithMockCustomUser;
 import de.ozgcloud.vorgang.command.CommandService;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
 import de.ozgcloud.vorgang.command.CreateCommandRequest;
+import de.ozgcloud.vorgang.files.FileService;
+import de.ozgcloud.vorgang.files.GridFsTestFactory;
+import de.ozgcloud.vorgang.files.OzgFileTestFactory;
 import de.ozgcloud.vorgang.vorgang.Vorgang;
 import de.ozgcloud.vorgang.vorgang.VorgangHead;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory;
+import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @SpringBootTest(properties = {
 		"grpc.server.inProcessName=test",
 		"grpc.client.vorgang-manager.address=in-process:test",
 		"grpc.client.ozgcloud-command-manager.address=in-process:test",
+		"grpc.client.file-manager.address=in-process:test",
+		"grpc.client.inProcess.address=in-process:test"
 })
 @DataITCase
 @WithMockCustomUser
@@ -78,32 +97,30 @@ class CollaborationITCase {
 
 	@MockBean
 	private OzgCloudUserProfileService ozgCloudUserProfileService;
+
 	@Mock
 	private OzgCloudUserProfile ozgCloudUserProfile;
 
-	@BeforeEach
-	void init() {
-		mongoOperations.dropCollection(Command.class);
-		mongoOperations.dropCollection(Vorgang.class);
-		mongoOperations.dropCollection(VorgangAttachedItem.class);
-		when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY));
-		when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile);
-	}
-
 	@Nested
 	class TestCreateCollaborationVorgang {
 
+		@BeforeEach
+		void init() {
+			mongoOperations.dropCollection(Command.class);
+			mongoOperations.dropCollection(Vorgang.class);
+			mongoOperations.dropCollection(VorgangAttachedItem.class);
+			when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY));
+			when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile);
+
+			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId();
+		}
+
 		private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId";
 		private static final String TITEL = "Collaboration Vorgang";
 		private static final String ANFRAGE = "Anfrage";
 
 		private String vorgangId;
 
-		@BeforeEach
-		void init() {
-			vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId();
-		}
-
 		@Test
 		void shouldSetCollaborationVorgangId() {
 			var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId));
@@ -138,16 +155,14 @@ class CollaborationITCase {
 					.bodyObject(Map.of(
 							"titel", TITEL,
 							"anfrage", ANFRAGE,
-							"zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID
-					))
+							"zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID))
 					.build();
 		}
 
 		private void waitUntilCommandFinished(String commandId) {
 			await().atMost(60, TimeUnit.SECONDS).until(
 					() -> mongoOperations.findById(commandId, Command.class),
-					command -> command.getStatus() == CommandStatus.FINISHED
-			);
+					command -> command.getStatus() == CommandStatus.FINISHED);
 		}
 
 		private Vorgang loadCollaborationVorgang(String sourceVorgangId) {
@@ -158,10 +173,75 @@ class CollaborationITCase {
 		private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) {
 			var query = new Query(new Criteria().andOperator(
 					Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId),
-					Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest")
-			));
+					Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest")));
 			return mongoOperations.find(query, VorgangAttachedItem.class);
 		}
 	}
 
+	@DisplayName("Get file content")
+	@Nested
+	class TestGetFileContent {
+
+		@GrpcClient("inProcess")
+		private CollaborationServiceBlockingStub collaborationStub;
+
+		@Autowired
+		private GridFsTemplate gridFsTemplate;
+
+		@BeforeEach
+		void initDatabase() {
+			gridFsTemplate.delete(new Query());
+		}
+
+		@Test
+		void shouldReturnStoredSmallFile() {
+			var fileId = gridFsTemplate.store(GridFsTestFactory.createUpload());
+
+			var file = downloadBinaryFile(fileId);
+
+			assertThat(file).hasSameSizeAs(OzgFileTestFactory.CONTENT).isEqualTo(OzgFileTestFactory.CONTENT);
+		}
+
+		@Test
+		void shouldReturnStoredFileWithSizeEqualChunkSize() {
+			var content = OzgFileTestFactory.createContentInByte(FileService.CHUNK_SIZE);
+			var fileId = gridFsTemplate.store(GridFsTestFactory.createUpload(content));
+
+			var file = downloadBinaryFile(fileId);
+
+			assertThat(file).hasSameSizeAs(content).isEqualTo(content);
+		}
+
+		@Test
+		void shouldReturnStoredLargeFile() {
+			var input = OzgFileTestFactory.createContentInMiB(5);
+			var fileId = gridFsTemplate
+					.store(GridFsTestFactory.createUpload(input));
+
+			var downloadedFile = downloadBinaryFile(fileId);
+
+			assertThat(downloadedFile).hasSameSizeAs(input).isEqualTo(input);
+		}
+
+		private byte[] downloadBinaryFile(ObjectId fileId) {
+			var request = GrpcGetFileContentRequest.newBuilder()
+					.setId(fileId.toHexString()).build();
+			var it = prepareBinaryFileServiceBlockingStub().getFileContent(request);
+			var content = new ByteArrayOutputStream();
+			while (it.hasNext()) {
+				ByteString chunkContent = it.next().getFileContent();
+				try {
+					content.write(chunkContent.toByteArray());
+				} catch (IOException e) {
+					fail(e);
+				}
+			}
+
+			return content.toByteArray();
+		}
+
+		private CollaborationServiceBlockingStub prepareBinaryFileServiceBlockingStub() {
+			return collaborationStub.withInterceptors(new TestCallContextAttachingInterceptor());
+		}
+	}
 }
\ No newline at end of file
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java
similarity index 86%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java
index 64f5d92f697a27617174aa251c471232b00423ad..c2984475269832306c7462326caffeaadab6f276 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java
@@ -27,14 +27,11 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 
-import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -42,32 +39,17 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 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.security.test.context.support.WithMockUser;
-import org.springframework.test.annotation.DirtiesContext;
 
-import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.common.test.ITCase;
-import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory;
-import de.ozgcloud.vorgang.callcontext.CurrentUserService;
-import de.ozgcloud.vorgang.clientattribute.ClientAttribute;
-import de.ozgcloud.vorgang.clientattribute.ClientAttributeTestFactory;
-import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap;
-import de.ozgcloud.vorgang.clientattribute.ClientAttributesMapTestFactory;
-import de.ozgcloud.vorgang.common.GrpcQueryOperator;
-import de.ozgcloud.vorgang.common.db.CriteriaUtil;
 import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory;
 import de.ozgcloud.vorgang.common.grpc.GrpcFormFieldTestFactory;
 import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory;
-import de.ozgcloud.vorgang.common.operator.OperatorBuilder;
-import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
 import io.grpc.stub.StreamObserver;
-import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @ITCase
-class GrpcVorgangServiceITCase {
+class VorgangGrpcServiceITCase {
 
 	static final String VALUE_KEY = "value";
 	static final String LABEL_KEY = "label";
@@ -97,7 +79,7 @@ class GrpcVorgangServiceITCase {
 	private static final String TITLE_SUBFORM_3 = "SUBFORM_3";
 
 	@Autowired
-	private GrpcVorgangService grpcVorgangService;
+	private VorgangGrpcService grpcVorgangService;
 	@MockBean
 	private VorgangService service;
 
@@ -117,7 +99,7 @@ class GrpcVorgangServiceITCase {
 		void shouldKeepFieldsOrder() {
 			var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).build();
 
-			Map<String, Object> formData = startCreation(grpcFormData);
+			var formData = startCreation(grpcFormData);
 
 			assertThat(removeControlData(formData)).containsExactly(
 					entry(NAME_FIELD_1, FIELD_1),
@@ -131,7 +113,7 @@ class GrpcVorgangServiceITCase {
 					.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2))
 					.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build();
 
-			Map<String, Object> formData = startCreation(grpcFormData);
+			var formData = startCreation(grpcFormData);
 
 			verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3);
 		}
@@ -140,7 +122,7 @@ class GrpcVorgangServiceITCase {
 		@Test
 		void shouldKeepFieldsOrderInSubForm() {
 			var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm(
-							GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields))
+					GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields))
 					.build();
 
 			var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1);
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
similarity index 99%
rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java
rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
index 3b78df2424dfa62ae1048907e663065de5110e27..e555f66338c6679e81c68b4aa0a2dbcdb483f2b4 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java
@@ -51,7 +51,7 @@ import de.ozgcloud.vorgang.collaboration.GrpcCollaborationRequestTestFactory;
 import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationVorgangResponseTestFactory;
 import io.grpc.stub.StreamObserver;
 
-class GrpcVorgangServiceTest {
+class VorgangGrpcServiceTest {
 
 	private static final int LIMIT = 10;
 	private static final int OFFSET = 0;
@@ -59,7 +59,7 @@ class GrpcVorgangServiceTest {
 
 	@Spy
 	@InjectMocks
-	private GrpcVorgangService service;
+	private VorgangGrpcService service;
 	@Mock
 	private VorgangService vorgangService;
 	@Mock
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java
index c15c4a2244378fdedae6b7608784aed4876aeb9a..1daf6ec91d576e4022724eda11620c3dfedb04fe 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java
@@ -52,7 +52,7 @@ import io.grpc.stub.StreamObserver;
 class VorgangITCase {
 
 	@Autowired
-	private GrpcVorgangService service;
+	private VorgangGrpcService service;
 	@Autowired
 	private MongoOperations mongoOperations;
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java
index 443303a1c8212f534df06dfb03c17def5d0c6ca3..5835a656a9cd2ed08c8002665bbc679e6439691f 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java
@@ -29,6 +29,8 @@ import static org.mockito.Mockito.*;
 
 import java.util.List;
 
+import jakarta.validation.ConstraintViolationException;
+
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -40,6 +42,7 @@ import de.ozgcloud.common.test.DataITCase;
 import de.ozgcloud.notification.antragsteller.AntragstellerNotificationEventListener;
 import de.ozgcloud.notification.user.UserNotificationEventListener;
 import de.ozgcloud.vorgang.command.CommandService;
+import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory;
 
 @DataITCase
 @WithMockUser
@@ -80,5 +83,20 @@ class VorgangServiceITCase {
 			verify(antragstellerNotificationEventListener, timeout(60000)).onVorgangCreated(any());
 			verify(userNotificationEventListener, timeout(60000)).onVorgangCreated(any());
 		}
+
+		@DisplayName("validation")
+		@Nested
+		class TestValidation {
+
+			@DisplayName("should be invalid on missing postfachAddress in serviceKonto")
+			@Test
+			void shouldBeInvalidOnMissingPostfachAddress() {
+				var eingang = EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder()
+						.serviceKonto(ServiceKontoTestFactory.createBuilder().clearPostfachAddresses().build()).build())
+						.build();
+
+				assertThatThrownBy(() -> vorgangService.startCreation(eingang)).isInstanceOf(ConstraintViolationException.class);
+			}
+		}
 	}
 }
\ No newline at end of file