diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
index aa57359b25c945a65d89d10106ebb798e1f1b294..63790fb84e15e94d2e2af47edb46d4b34db592b9 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
@@ -162,23 +162,4 @@ describe('Bescheid Wizard', () => {
       contains(bescheidWizard.getStatusText(), bewilligtText);
      })
   });
-
-  describe('Save entries after Weiter', () => {
-    it ('should NOT save entries without click on Weiter', () => {
-      bescheidWizard.getAbgelehntButton().click();
-      bescheidWizard.getCloseButton().click();
-      vorgangFormularButtons.getBescheidenButton().click();
-      contains(bescheidWizard.getStatusText(), bewilligtText);
-    })
-
-    it ('should save entries after click on Weiter', () => {
-      cy.wait(1000);
-      bescheidWizard.getAbgelehntButton().click();
-      bescheidWizard.getWeiterButton().click();
-      cy.wait(2000);
-      bescheidWizard.getCloseButton().click();
-      vorgangFormularButtons.getBescheidenButton().click();
-      contains(bescheidWizard.getStatusText(), abgelehntText);
-    })
-  })
 });
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts
index 7c24cf66f97dd2c37b98288fbe9bc481c5172aa9..e080573972a6bf55f8534238372e44a408f7d904 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts
@@ -98,21 +98,21 @@ describe('Vorgang abschliessen', () => {
         notExist(snackBar.getMessage());
       });
 
-      it('should have status Abgeschlossen', () => {
+      it('FIXME: should have status Abgeschlossen', () => {
         haveText(
           vorgangPage.getVorgangDetailHeader().getStatus(),
           vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN],
         );
       });
 
-      it('back to vorgang list', () => {
+      it('FIXME: back to vorgang list', () => {
         vorgangPage.getSubnavigation().getBackButton().click();
         waitForSpinnerToDisappear();
 
         exist(vorgangList.getRoot());
       });
 
-      it('should have status Abgeschlossen', () => {
+      it('FIXME: should have status Abgeschlossen', () => {
         haveText(
           vorgangList.getListItem(vorgangAbschliessen.name).getStatus(),
           vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN],
diff --git a/alfa-client/libs/bescheid-shared/src/index.ts b/alfa-client/libs/bescheid-shared/src/index.ts
index 16fde03966472be2f75f8d5f4a47fa8a21d4aa44..8a8af5864bd07257774992c864fd03fc821143b8 100644
--- a/alfa-client/libs/bescheid-shared/src/index.ts
+++ b/alfa-client/libs/bescheid-shared/src/index.ts
@@ -2,3 +2,4 @@ export * from './lib/bescheid-shared.module';
 export * from './lib/bescheid.linkrel';
 export * from './lib/bescheid.model';
 export * from './lib/bescheid.service';
+export * from './lib/document.model';
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts
index d10b73f178585ebb0fa151c3deaed33317cdc87b..e964530ec152d458c7c979b460358c81476df685 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts
@@ -3,7 +3,8 @@ export enum BescheidLinkRel {
   UPLOAD_BESCHEID_FILE = 'uploadBescheidFile',
   UPLOAD_ATTACHMENT = 'uploadAttachment',
   UPDATE = 'update',
-  CREATE_BESCHEID_DOCUMENT = 'createBescheidDocument',
+  CREATE_DOCUMENT = 'createDocument',
+  CREATE_DOCUMENT_FROM_FILE = 'createDocumentFromFile',
   ATTACHMENTS = 'attachments',
   BESCHEID_DOCUMENT = 'bescheidDocument',
   SEND = 'send',
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts
index f766bcf0d702f14714ca817ed7dbb80ae3101823..554a859838cc2b78c2651e28eeaa32072f51d40c 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts
@@ -1,3 +1,4 @@
+import { HttpError } from '@alfa-client/tech-shared';
 import { Resource } from '@ngxp/rest';
 
 export interface Bescheid {
@@ -16,3 +17,9 @@ export enum BescheidSendBy {
   MANUAL = 'MANUAL',
   NACHRICHT = 'NACHRICHT',
 }
+
+export interface UploadFileInProgress {
+  loading: boolean;
+  fileName?: string;
+  error?: HttpError;
+}
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
index 8fae422705bbf0aa4f92662742812add234c1dfe..da86ebb7e3c336964c3fd85aed986db3f8662a54 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
@@ -10,6 +10,7 @@ import {
   CreateCommandProps,
 } from '@alfa-client/command-shared';
 import {
+  ApiError,
   EMPTY_STRING,
   HttpError,
   StateResource,
@@ -20,6 +21,7 @@ import {
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import {
   VorgangCommandService,
+  VorgangHeaderLinkRel,
   VorgangService,
   VorgangWithEingangLinkRel,
   VorgangWithEingangResource,
@@ -48,16 +50,17 @@ import {
   createBescheid,
   createBescheidResource,
   createBescheidStateResource,
+  createUploadFileInProgress,
 } from '../test/bescheid';
 import { createDocumentResource } from '../test/document';
 import { BescheidFacade } from './+state/bescheid.facade';
 import { BescheidLinkRel } from './bescheid.linkrel';
-import { Bescheid, BescheidResource } from './bescheid.model';
+import { Bescheid, BescheidResource, UploadFileInProgress } from './bescheid.model';
 import { BescheidService } from './bescheid.service';
+import { DocumentLinkRel } from './document.linkrel';
 import { DocumentResource } from './document.model';
 
 import * as BescheidUtil from './bescheid.util';
-import { DocumentLinkRel } from './document.linkrel';
 
 describe('BescheidService', () => {
   let service: BescheidService;
@@ -255,7 +258,8 @@ describe('BescheidService', () => {
     });
 
     it('should emit state resources', () => {
-      const bescheid$ = service.getBescheidDraftIfExists();
+      const bescheid$: Observable<StateResource<BescheidResource>> =
+        service.getBescheidDraftIfExists();
 
       expect(bescheid$).toBeObservable(
         cold('(ab|)', { a: createEmptyStateResource(), b: bescheidStateResource }),
@@ -407,6 +411,7 @@ describe('BescheidService', () => {
         .mockReturnValue(createCommandProps);
       service.resourceService.stateResource.next(createStateResource(bescheidResource));
       commandService.createCommandByProps.mockReturnValue(of(commandStateResource));
+      service.resourceService.setResourceByUri = jest.fn();
     });
 
     it('should build update bescheid command props', () => {
@@ -425,8 +430,6 @@ describe('BescheidService', () => {
     });
 
     it('should return command', () => {
-      service.resourceService.setResourceByUri = jest.fn();
-
       const updateBescheid$: Observable<StateResource<CommandResource>> =
         service.updateBescheid(bescheid);
 
@@ -434,8 +437,6 @@ describe('BescheidService', () => {
     });
 
     it('should set resource by uri', (done) => {
-      service.resourceService.setResourceByUri = jest.fn();
-
       service
         .updateBescheid(bescheid)
         .pipe(first())
@@ -447,12 +448,20 @@ describe('BescheidService', () => {
         });
     });
 
-    it('should remove error from bescheid document file', (done) => {
-      service.resourceService.setResourceByUri = jest.fn();
-      service.bescheidDocumentFile$.next(createErrorStateResource(createApiError()));
+    it('should clear create bescheid document in progress', (done) => {
+      service.createBescheidDocumentInProgress$.next(createUploadFileInProgress());
+
+      service.updateBescheid(bescheid).subscribe(() => {
+        expect(service.createBescheidDocumentInProgress$.value).toEqual({ loading: false });
+        done();
+      });
+    });
+
+    it('should clear upload bescheid document in progress', (done) => {
+      service.uploadBescheidDocumentInProgress$.next(createUploadFileInProgress());
 
       service.updateBescheid(bescheid).subscribe(() => {
-        expect(service.bescheidDocumentFile$.value.error).toBeUndefined();
+        expect(service.uploadBescheidDocumentInProgress$.value).toEqual({ loading: false });
         done();
       });
     });
@@ -554,7 +563,7 @@ describe('BescheidService', () => {
     });
 
     it('should return embedded resources', () => {
-      const attachments$ = service.getAttachments();
+      const attachments$: Observable<BinaryFileResource[]> = service.getAttachments();
 
       expect(attachments$).toBeObservable(singleColdCompleted([binaryFileResource]));
     });
@@ -582,7 +591,7 @@ describe('BescheidService', () => {
         createStateResource(binaryFile);
       service.bescheidDocumentFile$.next(binaryFileStateResource);
 
-      service.getBescheidDocumentFile().subscribe((result) => {
+      service.getBescheidDocumentFile().subscribe((result: StateResource<BinaryFileResource>) => {
         expect(result).toBe(binaryFileStateResource);
         done();
       });
@@ -594,20 +603,29 @@ describe('BescheidService', () => {
     const file: File = createFile();
 
     beforeEach(() => {
-      service.initBescheidDocumentUpload = jest.fn();
       service.doUploadBescheidDocument = jest.fn();
     });
 
-    it('should call init bescheid document upload', () => {
+    it('should call init upload bescheid document in progress', () => {
       service.uploadBescheidDocument(bescheid, file);
 
-      expect(service.initBescheidDocumentUpload).toHaveBeenCalledWith(file.name);
+      expect(service.uploadBescheidDocumentInProgress$.value).toEqual({
+        loading: true,
+        fileName: file.name,
+      });
     });
 
-    it('should set load bescheid document in progresss', () => {
+    it('should clear create bescheid document', () => {
+      service.createBescheidDocumentInProgress$.next({
+        loading: true,
+        fileName: 'Dummy',
+        error: createApiError(),
+      });
       service.uploadBescheidDocument(bescheid, file);
 
-      expect(service.uploadBescheidDocumentInProgress$.value).toBeTruthy();
+      expect(service.createBescheidDocumentInProgress$.value).toEqual({
+        loading: false,
+      });
     });
 
     it('should call do upload bescheid document', () => {
@@ -617,32 +635,13 @@ describe('BescheidService', () => {
     });
 
     it('should return bescheid document file', (done) => {
-      service.uploadBescheidDocument(bescheid, file).subscribe((value) => {
-        expect(value).toBeTruthy();
-        done();
-      });
-    });
-  });
-
-  describe('init bescheid document upload', () => {
-    const fileName: string = faker.name.firstName();
-
-    it('should set loading flag', () => {
-      service.initBescheidDocumentUpload();
-
-      expect(service.bescheidDocumentFile$.value.loading).toBeTruthy();
-    });
-
-    it('should set binaryFile with name as resource', () => {
-      service.initBescheidDocumentUpload(fileName);
-
-      expect(service.bescheidDocumentFile$.value.resource.name).toBe(fileName);
-    });
-
-    it('should set binaryFile with undefined as resource', () => {
-      service.initBescheidDocumentUpload();
-
-      expect(service.bescheidDocumentFile$.value.resource.name).toBeUndefined();
+      service
+        .uploadBescheidDocument(bescheid, file)
+        .subscribe((uploadFileInProgress: UploadFileInProgress) => {
+          expect(uploadFileInProgress.fileName).toBe(file.name);
+          expect(uploadFileInProgress.loading).toBeTruthy();
+          done();
+        });
     });
   });
 
@@ -685,12 +684,13 @@ describe('BescheidService', () => {
     const bescheid: BescheidResource = createBescheidResource();
 
     const binaryFile: BinaryFileResource = createBinaryFileResource();
+    const apiError: ApiError = createApiError();
     const binaryFileErrorStateResource: StateResource<BinaryFileResource> =
-      createErrorStateResource(createApiError());
+      createErrorStateResource(apiError);
     const binaryFileStateResource: StateResource<BinaryFileResource> =
       createStateResource(binaryFile);
 
-    it('should call create bescheid document from file', () => {
+    it('should call create bescheid document from file on success', () => {
       service.createBescheidDocumentFromFile = jest.fn();
 
       service.handleUploadBescheidDocumentResponse(bescheid, binaryFileStateResource);
@@ -699,21 +699,20 @@ describe('BescheidService', () => {
     });
 
     describe('on no error', () => {
-      it('should handle error on error stateResource', () => {
-        service.bescheidDocumentFile$.next(createEmptyStateResource());
+      it('should set error', () => {
+        service.uploadBescheidDocumentInProgress$.next({ loading: false });
 
         service.handleUploadBescheidDocumentResponse(bescheid, binaryFileErrorStateResource);
 
-        expect(service.bescheidDocumentFile$.value).toBe(binaryFileErrorStateResource);
+        expect(service.uploadBescheidDocumentInProgress$.value.error).toBe(apiError);
       });
 
-      it('should set upload bescheid document in progress done', () => {
-        service.uploadBescheidDocumentInProgress$.next(true);
-        service.createBescheidDocumentFromFile = jest.fn();
+      it('should set loading to false', () => {
+        service.uploadBescheidDocumentInProgress$.next({ loading: true });
 
         service.handleUploadBescheidDocumentResponse(bescheid, binaryFileErrorStateResource);
 
-        expect(service.uploadBescheidDocumentInProgress$.value).toBeFalsy();
+        expect(service.uploadBescheidDocumentInProgress$.value.loading).toBeFalsy();
       });
     });
   });
@@ -778,14 +777,24 @@ describe('BescheidService', () => {
     });
 
     describe('on error', () => {
-      it('should set document file', () => {
+      it('should set upload bescheid in progress error', () => {
         const httpError: HttpError = createApiError();
         const errorStateResource: StateResource<CommandResource> =
           createErrorStateResource(httpError);
 
         service.handleCreateBescheidDocumentFromFileResponse(errorStateResource, binaryFile);
 
-        expect(service.bescheidDocumentFile$.value).toEqual(createErrorStateResource(httpError));
+        expect(service.uploadBescheidDocumentInProgress$.value.error).toBe(httpError);
+      });
+
+      it('should set upload bescheid in progress loading false', () => {
+        const httpError: HttpError = createApiError();
+        const errorStateResource: StateResource<CommandResource> =
+          createErrorStateResource(httpError);
+
+        service.handleCreateBescheidDocumentFromFileResponse(errorStateResource, binaryFile);
+
+        expect(service.uploadBescheidDocumentInProgress$.value.loading).toBeFalsy();
       });
     });
 
@@ -875,7 +884,19 @@ describe('BescheidService', () => {
     it('should set create beschied document in progress', () => {
       service.createBescheidDocument();
 
-      expect(service.createBescheidDocumentInProgress$.value).toBeTruthy();
+      expect(service.createBescheidDocumentInProgress$.value.loading).toBeTruthy();
+    });
+
+    it('should set upload beschied document in progress loading false', () => {
+      service.uploadBescheidDocumentInProgress$.next({
+        loading: true,
+        error: createApiError(),
+        fileName: 'Dummy',
+      });
+
+      service.createBescheidDocument();
+
+      expect(service.uploadBescheidDocumentInProgress$.value).toEqual({ loading: false });
     });
 
     describe('on successfully done command', () => {
@@ -907,21 +928,21 @@ describe('BescheidService', () => {
       const commandErrorStateResource: StateResource<CommandResource> =
         createErrorStateResource(apiError);
 
-      it('should set error on state resource', () => {
+      it('should set error ', () => {
         commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource));
 
         service.createBescheidDocument();
 
-        expect(service.bescheidDocumentFile$.value).toEqual(createErrorStateResource(apiError));
+        expect(service.createBescheidDocumentInProgress$.value.error).toBe(apiError);
       });
 
-      it('should set create bescheid document in progress done', () => {
-        service.createBescheidDocumentInProgress$.next(true);
+      it('should set create bescheid document in progress loading false', () => {
+        service.createBescheidDocumentInProgress$.next({ loading: true });
         commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource));
 
         service.createBescheidDocument();
 
-        expect(service.createBescheidDocumentInProgress$.value).toBeFalsy();
+        expect(service.createBescheidDocumentInProgress$.value.loading).toBeFalsy();
       });
     });
   });
@@ -1006,10 +1027,10 @@ describe('BescheidService', () => {
     });
 
     it('should return command', () => {
-      const command = createCommandStateResource();
+      const command: StateResource<CommandResource> = createCommandStateResource();
       service.deleteBescheid = jest.fn().mockReturnValue(singleCold(command));
 
-      const command$ = service.bescheidVerwerfen();
+      const command$: Observable<StateResource<CommandResource>> = service.bescheidVerwerfen();
 
       expect(command$).toBeObservable(singleCold(command));
     });
@@ -1039,12 +1060,69 @@ describe('BescheidService', () => {
       expect(service.bescheidDocumentFile$.value).toBe(binaryFileStateResource);
     });
 
-    it('should set create bescheid document in progress done', () => {
-      service.createBescheidDocumentInProgress$.next(true);
+    it('should set create bescheid document in progress loading false', () => {
+      service.createBescheidDocumentInProgress$.next({ loading: true });
 
       service.loadBescheidDocumentFile(document);
 
-      expect(service.createBescheidDocumentInProgress$.value).toBeFalsy();
+      expect(service.createBescheidDocumentInProgress$.value.loading).toBeFalsy();
+    });
+  });
+
+  describe('getBescheidDocument', () => {
+    it('should return bescheid document', () => {
+      const documentStateResource: StateResource<DocumentResource> =
+        createStateResource(createDocumentResource());
+      service.bescheidDocument$.next(documentStateResource);
+
+      const bescheidDocument$: Observable<StateResource<DocumentResource>> =
+        service.getBescheidDocument();
+
+      expect(bescheidDocument$).toBeObservable(singleCold(documentStateResource));
+    });
+  });
+
+  describe('getEmpfaenger', () => {
+    it('should return Empfänger', () => {
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createVorgangWithEingangResource();
+      const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> =
+        createStateResource(vorgangWithEingangResource);
+      vorgangService.getVorgangWithEingang.mockReturnValue(of(vorgangWithEingangStateResource));
+
+      const empfaenger$: Observable<string> = service.getEmpfaenger();
+
+      expect(empfaenger$).toBeObservable(
+        singleColdCompleted(
+          `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`,
+        ),
+      );
+    });
+  });
+
+  describe('isPostfachConfigured', () => {
+    it('should return true', () => {
+      vorgangService.getVorgangWithEingang.mockReturnValue(
+        of(
+          createStateResource(
+            createVorgangWithEingangResource([VorgangHeaderLinkRel.POSTFACH_MAILS]),
+          ),
+        ),
+      );
+
+      const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured();
+
+      expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(true));
+    });
+
+    it('should return false', () => {
+      vorgangService.getVorgangWithEingang.mockReturnValue(
+        of(createStateResource(createVorgangWithEingangResource())),
+      );
+
+      const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured();
+
+      expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(false));
     });
   });
 });
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
index 4991aee1230dd17fa5812f4df091d750b219af65..2474203852ea6c55a58eb19c3844b6ce1bf43c3b 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
@@ -11,9 +11,9 @@ import {
   tapOnCommandSuccessfullyDone,
 } from '@alfa-client/command-shared';
 import {
+  HttpError,
   StateResource,
   createEmptyStateResource,
-  createErrorStateResource,
   createStateResource,
   filterIsLoadedOrHasError,
   getEmbeddedResources,
@@ -23,10 +23,12 @@ import {
 } from '@alfa-client/tech-shared';
 import {
   VorgangCommandService,
+  VorgangHeaderLinkRel,
   VorgangService,
   VorgangWithEingangLinkRel,
   VorgangWithEingangResource,
 } from '@alfa-client/vorgang-shared';
+import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui';
 import { Injectable } from '@angular/core';
 import { ResourceUri, getUrl, hasLink } from '@ngxp/rest';
 import {
@@ -44,7 +46,7 @@ import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resour
 import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service';
 import { BescheidFacade } from './+state/bescheid.facade';
 import { BescheidLinkRel } from './bescheid.linkrel';
-import { Bescheid, BescheidResource } from './bescheid.model';
+import { Bescheid, BescheidResource, UploadFileInProgress } from './bescheid.model';
 import {
   buildCreateBescheidCommand,
   buildCreateBescheidDocumentCommandProps,
@@ -70,11 +72,11 @@ export class BescheidService {
   readonly bescheidDocument$: BehaviorSubject<StateResource<DocumentResource>> =
     new BehaviorSubject<StateResource<DocumentResource>>(createEmptyStateResource());
 
-  readonly createBescheidDocumentInProgress$: BehaviorSubject<boolean> =
-    new BehaviorSubject<boolean>(false);
+  readonly createBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> =
+    new BehaviorSubject<UploadFileInProgress>({ loading: false });
 
-  readonly uploadBescheidDocumentInProgress$: BehaviorSubject<boolean> =
-    new BehaviorSubject<boolean>(false);
+  readonly uploadBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> =
+    new BehaviorSubject<UploadFileInProgress>({ loading: false });
 
   loadBescheidDocumentSubscription: Subscription;
 
@@ -173,7 +175,8 @@ export class BescheidService {
     return this.doUpdateBescheid(this.resourceService.getResource(), bescheid).pipe(
       tapOnCommandSuccessfullyDone((commandStateResource: StateResource<CommandResource>) => {
         this.updateBescheidDraft(commandStateResource.resource);
-        this.removeErrorFromBescheidDocumentFile();
+        this.clearCreateBescheidDocumentInProgress();
+        this.clearUploadBescheidDocumentInProgress();
       }),
     );
   }
@@ -204,10 +207,6 @@ export class BescheidService {
     this.resourceService.setResourceByUri(getEffectedResourceUrl(command));
   }
 
-  private removeErrorFromBescheidDocumentFile(): void {
-    this.bescheidDocumentFile$.next({ ...this.bescheidDocumentFile$.value, error: undefined });
-  }
-
   public getAttachments(): Observable<BinaryFileResource[]> {
     return this.getBescheidDraft().pipe(
       filter(isLoaded),
@@ -239,6 +238,10 @@ export class BescheidService {
     return this.bescheidDocumentFile$.asObservable();
   }
 
+  public getBescheidDocument(): Observable<StateResource<DocumentResource>> {
+    return this.bescheidDocument$.asObservable();
+  }
+
   public loadBescheidDocument(resourceUri: ResourceUri): void {
     this.setBescheidDocumentFileLoading();
     this.loadBescheidDocumentSubscription = this.repository
@@ -255,15 +258,25 @@ export class BescheidService {
     this.bescheidDocumentFile$.next({ ...this.bescheidDocumentFile$.value, loading: true });
   }
 
-  public uploadBescheidDocument(bescheid: BescheidResource, file: File): Observable<boolean> {
-    this.initBescheidDocumentUpload(file.name);
-    this.initUploadBescheidDocumentInProgress();
+  public uploadBescheidDocument(
+    bescheid: BescheidResource,
+    file: File,
+  ): Observable<UploadFileInProgress> {
+    this.clearCreateBescheidDocumentInProgress();
+    this.initUploadBescheidDocumentInProgress(file.name);
     this.doUploadBescheidDocument(bescheid, file);
-    return this.uploadBescheidDocumentInProgress$.asObservable();
+    return this.getUploadBescheidDocumentInProgress();
   }
 
-  private initUploadBescheidDocumentInProgress(): void {
-    this.uploadBescheidDocumentInProgress$.next(true);
+  private clearCreateBescheidDocumentInProgress(): void {
+    this.createBescheidDocumentInProgress$.next({ loading: false });
+  }
+
+  private initUploadBescheidDocumentInProgress(fileName: string): void {
+    this.uploadBescheidDocumentInProgress$.next({ fileName, loading: true });
+  }
+  public getUploadBescheidDocumentInProgress(): Observable<UploadFileInProgress> {
+    return this.uploadBescheidDocumentInProgress$.asObservable();
   }
 
   doUploadBescheidDocument(bescheid: BescheidResource, file: File): void {
@@ -280,8 +293,7 @@ export class BescheidService {
     binaryFileStateResource: StateResource<BinaryFileResource>,
   ): void {
     if (hasError(binaryFileStateResource)) {
-      this.bescheidDocumentFile$.next(binaryFileStateResource);
-      this.setUploadBescheidDocumentInProgressDone();
+      this.setUploadBescheidDocumentInProgressError(binaryFileStateResource.error);
     } else {
       this.createBescheidDocumentFromFile(bescheid, binaryFileStateResource.resource);
     }
@@ -301,16 +313,16 @@ export class BescheidService {
     binaryFile: BinaryFileResource,
   ): void {
     if (hasError(commandStateResource)) {
-      this.bescheidDocumentFile$.next(createErrorStateResource(commandStateResource.error));
+      this.setUploadBescheidDocumentInProgressError(commandStateResource.error);
     } else {
       this.bescheidDocumentFile$.next(createStateResource(binaryFile));
       this.bescheidDocumentUri$.next(getEffectedResourceUrl(commandStateResource.resource));
+      this.clearUploadBescheidDocumentInProgress();
     }
-    this.setUploadBescheidDocumentInProgressDone();
   }
 
-  private setUploadBescheidDocumentInProgressDone(): void {
-    this.uploadBescheidDocumentInProgress$.next(false);
+  private setUploadBescheidDocumentInProgressError(error: HttpError): void {
+    this.uploadBescheidDocumentInProgress$.next({ loading: false, error });
   }
 
   public deleteBescheidDocument(): void {
@@ -318,19 +330,27 @@ export class BescheidService {
     this.bescheidDocumentFile$.next(createEmptyStateResource());
   }
 
-  public createBescheidDocument(): Observable<boolean> {
-    this.initBescheidDocumentUpload();
+  public createBescheidDocument(): Observable<UploadFileInProgress> {
+    this.clearUploadBescheidDocumentInProgress();
     this.setCreateBescheidDocumenInProgress();
     this.doCreateBescheidDocument()
       .pipe(filterIsLoadedOrHasError(), first())
       .subscribe((commandStateResource: StateResource<CommandResource>) =>
         this.handleCreateBescheidDocumentResponse(commandStateResource),
       );
+    return this.getCreateBescheidDocumentInProgress();
+  }
+
+  private clearUploadBescheidDocumentInProgress(): void {
+    this.uploadBescheidDocumentInProgress$.next({ loading: false });
+  }
+
+  public getCreateBescheidDocumentInProgress(): Observable<UploadFileInProgress> {
     return this.createBescheidDocumentInProgress$.asObservable();
   }
 
   private setCreateBescheidDocumenInProgress(): void {
-    this.createBescheidDocumentInProgress$.next(true);
+    this.createBescheidDocumentInProgress$.next({ loading: true });
   }
 
   doCreateBescheidDocument(): Observable<StateResource<CommandResource>> {
@@ -343,33 +363,29 @@ export class BescheidService {
     commandStateResource: StateResource<CommandResource>,
   ): void {
     if (hasError(commandStateResource)) {
-      this.bescheidDocumentFile$.next(createErrorStateResource(commandStateResource.error));
-      this.setCreateBescheidDocumentInProgressDone();
+      this.setCreateBescheidDocumentInProgressError(commandStateResource.error);
     } else {
       const documentUri: ResourceUri = getEffectedResourceUrl(commandStateResource.resource);
-      this.loadBescheidDocument(documentUri);
       this.bescheidDocumentUri$.next(documentUri);
+      this.loadBescheidDocument(documentUri);
     }
   }
 
-  initBescheidDocumentUpload(fileName?: string): void {
-    this.bescheidDocumentFile$.next(
-      createStateResource(<BinaryFileResource>{ name: fileName }, true),
-    );
-  }
-
   loadBescheidDocumentFile(document: DocumentResource): void {
     this.binaryFileService
       .getFile(getUrl(document, DocumentLinkRel.FILE))
       .pipe(filterIsLoadedOrHasError(), first())
       .subscribe((binaryFile) => {
         this.bescheidDocumentFile$.next(binaryFile);
-        this.setCreateBescheidDocumentInProgressDone();
+        this.createBescheidDocumentInProgress$.next({ loading: false });
       });
   }
 
-  private setCreateBescheidDocumentInProgressDone(): void {
-    this.createBescheidDocumentInProgress$.next(false);
+  private setCreateBescheidDocumentInProgressError(error: HttpError): void {
+    this.createBescheidDocumentInProgress$.next({
+      error,
+      loading: false,
+    });
   }
 
   public getBescheidDocumentCommand(): Observable<StateResource<CommandResource>> {
@@ -393,4 +409,19 @@ export class BescheidService {
   public reloadCurrentVorgang(): void {
     this.vorgangService.reloadCurrentVorgang();
   }
+
+  public getEmpfaenger(): Observable<string> {
+    return this.vorgangService.getVorgangWithEingang().pipe(
+      filter(isLoaded),
+      map((stateResource) => stateResource.resource),
+      map(getEmpfaenger),
+    );
+  }
+
+  public isPostfachConfigured(): Observable<boolean> {
+    return this.vorgangService.getVorgangWithEingang().pipe(
+      filter(isLoaded),
+      map((stateResource) => hasLink(stateResource.resource, VorgangHeaderLinkRel.POSTFACH_MAILS)),
+    );
+  }
 }
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts
index 755f071d49ee06d084e0f352723b14e585ba6756..a6ba05191512ec2c4ad936eb85d756dd2836dd51 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts
@@ -66,7 +66,7 @@ describe('BescheidUtil', () => {
         binaryFileResource,
       );
 
-      expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT);
+      expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE);
     });
 
     describe('command', () => {
@@ -195,7 +195,7 @@ describe('BescheidUtil', () => {
     it('should have linkRel', () => {
       const props: CreateCommandProps = buildCreateBescheidDocumentCommandProps(bescheidResource);
 
-      expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT);
+      expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT);
     });
 
     describe('command', () => {
diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts
index e3cd07a88f6b2be5932030f5ee0057fc3aec537f..ee496fe13667e8281da29458f5a698391bfc0497 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts
@@ -28,7 +28,7 @@ export function buildCreateBescheidDocumentFromFileProps(
 ): CreateCommandProps {
   return {
     resource: bescheid,
-    linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT,
+    linkRel: BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE,
     command: buildCreateBescheidDocumentFromFileCommand(binaryFile),
     snackBarMessage: EMPTY_STRING,
   };
@@ -67,7 +67,7 @@ export function buildCreateBescheidDocumentCommandProps(
 ): CreateCommandProps {
   return {
     resource,
-    linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT,
+    linkRel: BescheidLinkRel.CREATE_DOCUMENT,
     command: {
       order: CommandOrder.CREATE_BESCHEID_DOCUMENT,
       body: null,
diff --git a/alfa-client/libs/bescheid-shared/src/test/bescheid.ts b/alfa-client/libs/bescheid-shared/src/test/bescheid.ts
index 2d791e3ec7a962ca9cc1dadf1fa5a7a1d53238e4..87b026957ac62dbd239308663ac94be788110486 100644
--- a/alfa-client/libs/bescheid-shared/src/test/bescheid.ts
+++ b/alfa-client/libs/bescheid-shared/src/test/bescheid.ts
@@ -1,7 +1,13 @@
 import { createStateResource, StateResource } from '@alfa-client/tech-shared';
 import faker from '@faker-js/faker';
 import { toResource } from 'libs/tech-shared/test/resource';
-import { Bescheid, BescheidResource, BescheidSendBy } from '../lib/bescheid.model';
+import { createApiError } from '../../../tech-shared/test/error';
+import {
+  Bescheid,
+  BescheidResource,
+  BescheidSendBy,
+  UploadFileInProgress,
+} from '../lib/bescheid.model';
 
 export function createBescheid(): Bescheid {
   return {
@@ -21,3 +27,7 @@ export function createBescheidStateResource(
 ): StateResource<BescheidResource> {
   return createStateResource(createBescheidResource(linkRel));
 }
+
+export function createUploadFileInProgress(): UploadFileInProgress {
+  return { loading: true, fileName: faker.name.firstName(), error: createApiError() };
+}
diff --git a/alfa-client/libs/bescheid-shared/src/test/document.ts b/alfa-client/libs/bescheid-shared/src/test/document.ts
index 1c88004f87bcc6b198a9ac3a453a3c9839326e1e..38fa7d022856d8c7ad33c9a5ba88ba4f0b4a3737 100644
--- a/alfa-client/libs/bescheid-shared/src/test/document.ts
+++ b/alfa-client/libs/bescheid-shared/src/test/document.ts
@@ -1,6 +1,16 @@
+import faker from '@faker-js/faker';
 import { toResource } from 'libs/tech-shared/test/resource';
-import { DocumentResource } from '../lib/document.model';
+import { Document, DocumentResource } from '../lib/document.model';
+
+export function createDocument(): Document {
+  return {
+    type: 'Bescheid',
+    fileId: faker.internet.url(),
+    nachrichtSubject: faker.datatype.string(10),
+    nachrichtText: faker.lorem.text(),
+  };
+}
 
 export function createDocumentResource(linkRel: string[] = []): DocumentResource {
-  return toResource({}, linkRel);
+  return toResource(createDocument(), linkRel);
 }
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts
index 81dbf91bfdc2657a53bbcdbc6e10089f0ffa4f24..ff10996f5a08bcb16c51b9fafc0a0b5ec736e549 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts
@@ -21,8 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { PostfachMailListResource, PostfachService } from '@alfa-client/postfach-shared';
+import { PostfachMailFormComponent } from '@alfa-client/postfach';
+import {
+  PostfachMailFormDialogData,
+  PostfachMailListResource,
+  PostfachService,
+} from '@alfa-client/postfach-shared';
 import {
   HasLinkPipe,
   StateResource,
@@ -32,6 +36,9 @@ import {
 import { mock } from '@alfa-client/test-utils';
 import { DialogService } from '@alfa-client/ui';
 import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import faker from '@faker-js/faker';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach';
 import { createApiError } from 'libs/tech-shared/test/error';
@@ -41,6 +48,9 @@ import { of } from 'rxjs';
 import { PostfachMailButtonContainerComponent } from './postfach-mail-button-container.component';
 import { PostfachMailButtonComponent } from './postfach-mail-button/postfach-mail-button.component';
 
+jest.mock('@alfa-client/vorgang-shared-ui');
+const getEmpfaengerMock = getEmpfaenger as jest.Mock;
+
 describe('PostfachMailButtonContainerComponent', () => {
   let component: PostfachMailButtonContainerComponent;
   let fixture: ComponentFixture<PostfachMailButtonContainerComponent>;
@@ -173,13 +183,45 @@ describe('PostfachMailButtonContainerComponent', () => {
     });
   });
 
-  describe('getEmpfaenger', () => {
-    it('should return antragsteller name', () => {
-      const antragsteller = component.getEmpfaenger();
+  describe('buildDialogData', () => {
+    const postfachMailListStateResource: StateResource<PostfachMailListResource> =
+      createStateResource(createPostfachMailListResource());
 
-      expect(antragsteller).toEqual(
-        `${vorgang.eingang.antragsteller.vorname} ${vorgang.eingang.antragsteller.nachname}`,
+    it('should get empfänger', () => {
+      component.buildDialogData(postfachMailListStateResource);
+
+      expect(getEmpfaengerMock).toHaveBeenCalled();
+    });
+
+    it('should set empfänger', () => {
+      const empfanger: string = faker.name.firstName();
+      getEmpfaengerMock.mockReturnValue(empfanger);
+
+      const dialogData: PostfachMailFormDialogData = component.buildDialogData(
+        postfachMailListStateResource,
       );
+
+      expect(dialogData.empfaenger).toEqual(empfanger);
+    });
+
+    it('should set component', () => {
+      const dialogData = component.buildDialogData(postfachMailListStateResource);
+
+      expect(dialogData.component).toBe(PostfachMailFormComponent);
+    });
+
+    it('should set title', () => {
+      const dialogData: PostfachMailFormDialogData = component.buildDialogData(
+        postfachMailListStateResource,
+      );
+
+      expect(dialogData.title).toEqual(PostfachMailButtonContainerComponent.TITLE);
+    });
+
+    it('should set state resource', () => {
+      const dialogData = component.buildDialogData(postfachMailListStateResource);
+
+      expect(dialogData.postfachMailListStateResource).toEqual(postfachMailListStateResource);
     });
   });
 });
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
index dde104c79cf00b344d836312072bf0963f96bbf1..6a4d16d49caa38d8901b8f352fded1be89bd7b59 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts
@@ -21,8 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Input } from '@angular/core';
-import { MatDialogRef } from '@angular/material/dialog';
 import { CommandResource } from '@alfa-client/command-shared';
 import {
   PostfachMailFormDialogData,
@@ -30,15 +28,12 @@ import {
   PostfachMailListResource,
   PostfachService,
 } from '@alfa-client/postfach-shared';
-import {
-  EMPTY_STRING,
-  StateResource,
-  hasError,
-  isNotNull,
-  isNotUndefined,
-} from '@alfa-client/tech-shared';
+import { StateResource, hasError, isNotNull, isNotUndefined } from '@alfa-client/tech-shared';
 import { DialogService, FixedDialogComponent } from '@alfa-client/ui';
 import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui';
+import { Component, Input } from '@angular/core';
+import { MatDialogRef } from '@angular/material/dialog';
 import { hasLink } from '@ngxp/rest';
 import { Observable } from 'rxjs';
 import { tap } from 'rxjs/operators';
@@ -50,6 +45,8 @@ import { PostfachMailFormComponent } from '../postfach-mail-form/postfach-mail-f
   styleUrls: ['./postfach-mail-button-container.component.scss'],
 })
 export class PostfachMailButtonContainerComponent {
+  static readonly TITLE = 'Neue Nachricht';
+
   private _vorgang: VorgangWithEingangResource;
   public get vorgang(): VorgangWithEingangResource {
     return this._vorgang;
@@ -108,24 +105,14 @@ export class PostfachMailButtonContainerComponent {
     );
   }
 
-  private buildDialogData(
+  buildDialogData(
     postfachMailListStateResource: StateResource<PostfachMailListResource>,
   ): PostfachMailFormDialogData {
     return {
       component: PostfachMailFormComponent,
-      title: 'Neue Nachricht',
-      empfaenger: this.getEmpfaenger(),
+      title: PostfachMailButtonContainerComponent.TITLE,
+      empfaenger: getEmpfaenger(this.vorgang),
       postfachMailListStateResource: postfachMailListStateResource,
     };
   }
-
-  getEmpfaenger(): string {
-    return this.existsAntragsteller() ?
-        `${this.vorgang.eingang.antragsteller.vorname} ${this.vorgang.eingang.antragsteller.nachname}`
-      : EMPTY_STRING;
-  }
-
-  private existsAntragsteller(): boolean {
-    return !!this.vorgang.eingang.antragsteller;
-  }
 }
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts
index 9eb44a2c48f63bd3a8779a830445df2369eb1725..68f51e677db01f0005da3029089197ba2e37f4a6 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts
@@ -21,10 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject, Input } from '@angular/core';
 import { ON_PAGE, PostfachMailLinkRel, PostfachMailResource } from '@alfa-client/postfach-shared';
 import { StateResource } from '@alfa-client/tech-shared';
-import { VorgangResource } from '@alfa-client/vorgang-shared';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Inject, Input } from '@angular/core';
 
 @Component({
   selector: 'alfa-outgoing-mail',
@@ -33,7 +33,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared';
 })
 export class OutgoingMailComponent {
   @Input() postfachMail: PostfachMailResource;
-  @Input() vorgangStateResource: StateResource<VorgangResource>;
+  @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>;
 
   readonly postfachNachrichtLinkRel = PostfachMailLinkRel;
 
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts
index 58fb157e90d1021e84023f057cf096017b11d4b4..a7eaeaab39408e2db221bf4156d3b812cbcfd8b6 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts
@@ -1,20 +1,20 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared';
-import { EMPTY_STRING, createStateResource } from '@alfa-client/tech-shared';
+import { createStateResource } from '@alfa-client/tech-shared';
 import { Mock, dispatchEventFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
 import { DialogService, OzgcloudIconComponent } from '@alfa-client/ui';
-import { Antragsteller, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import faker from '@faker-js/faker';
 import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach';
 import { PostfachMailFormComponent } from 'libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import {
-  createAntragsteller,
-  createEingang,
-  createVorgangWithEingangResource,
-} from 'libs/vorgang-shared/test/vorgang';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
 import { PostfachNachrichtEditButtonContainerComponent } from './postfach-nachricht-edit-button-container.component';
 
+jest.mock('@alfa-client/vorgang-shared-ui');
+const getEmpfaengerMock = getEmpfaenger as jest.Mock;
+
 describe('PostfachNachrichtEditButtonContainerComponent', () => {
   let component: PostfachNachrichtEditButtonContainerComponent;
   let fixture: ComponentFixture<PostfachNachrichtEditButtonContainerComponent>;
@@ -96,63 +96,19 @@ describe('PostfachNachrichtEditButtonContainerComponent', () => {
       expect(dialogData.postfachNachricht).toBe(postfachNachricht);
     });
 
-    it('should get Empfaenger', () => {
-      component.getEmpfaenger = jest.fn();
-
+    it('should get empfänger', () => {
       component.buildDialogData();
 
-      expect(component.getEmpfaenger).toHaveBeenCalled();
-    });
-  });
-
-  describe('getEmpfaenger', () => {
-    it('should return nachname only if exists', () => {
-      const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined };
-      component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller));
-
-      const empfaenger: string = component.getEmpfaenger();
-
-      expect(empfaenger).toEqual(antragsteller.nachname);
-    });
-
-    it('should return vorname only if exists', () => {
-      const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined };
-      component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller));
-
-      const empfaenger: string = component.getEmpfaenger();
-
-      expect(empfaenger).toEqual(antragsteller.vorname);
-    });
-
-    it('should return name and vorname if exists', () => {
-      const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
-      component.vorgangStateResource = createStateResource(vorgangWithEingang);
-
-      const empfaenger: string = component.getEmpfaenger();
-
-      expect(empfaenger).toEqual(
-        `${vorgangWithEingang.eingang.antragsteller.vorname} ${vorgangWithEingang.eingang.antragsteller.nachname}`,
-      );
+      expect(getEmpfaengerMock).toHaveBeenCalled();
     });
 
-    it('should return empty string if none exists', () => {
-      const antragsteller: Antragsteller = {
-        ...createAntragsteller(),
-        nachname: undefined,
-        vorname: undefined,
-      };
-      component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller));
+    it('should set empfänger', () => {
+      const empfanger: string = faker.name.firstName();
+      getEmpfaengerMock.mockReturnValue(empfanger);
 
-      const empfaenger: string = component.getEmpfaenger();
+      const dialogData: PostfachMailFormDialogData = component.buildDialogData();
 
-      expect(empfaenger).toEqual(EMPTY_STRING);
+      expect(dialogData.empfaenger).toEqual(empfanger);
     });
-
-    function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource {
-      return {
-        ...createVorgangWithEingangResource(),
-        eingang: { ...createEingang(), antragsteller },
-      };
-    }
   });
 });
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts
index 7d1aad74943eb34874ef94577135ba5a7dd8a13c..a7ee3b38e083aa4d9a800a7420a6e7e9dfed393d 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts
@@ -1,7 +1,8 @@
 import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared';
-import { EMPTY_STRING, StateResource, isNotNil } from '@alfa-client/tech-shared';
+import { StateResource } from '@alfa-client/tech-shared';
 import { DialogService } from '@alfa-client/ui';
-import { Antragsteller, VorgangWithEingang } from '@alfa-client/vorgang-shared';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui';
 import { Component, Input } from '@angular/core';
 import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/postfach-mail-form.component';
 
@@ -12,7 +13,7 @@ import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/pos
 })
 export class PostfachNachrichtEditButtonContainerComponent {
   @Input() postfachNachricht: PostfachMailResource;
-  @Input() vorgangStateResource: StateResource<VorgangWithEingang>;
+  @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>;
 
   constructor(private dialogService: DialogService) {}
 
@@ -25,27 +26,7 @@ export class PostfachNachrichtEditButtonContainerComponent {
       title: 'Nachricht bearbeiten',
       component: PostfachMailFormComponent,
       postfachNachricht: this.postfachNachricht,
-      empfaenger: this.getEmpfaenger(),
+      empfaenger: getEmpfaenger(this.vorgangStateResource.resource),
     };
   }
-
-  getEmpfaenger(): string {
-    return `${this.getVorname()} ${this.getNachname()}`.trim();
-  }
-
-  private getVorname(): string {
-    return isNotNil(this.getAntragsteller()?.vorname) ?
-        this.getAntragsteller().vorname
-      : EMPTY_STRING;
-  }
-
-  private getNachname(): string {
-    return isNotNil(this.getAntragsteller()?.nachname) ?
-        this.getAntragsteller().nachname
-      : EMPTY_STRING;
-  }
-
-  private getAntragsteller(): Antragsteller {
-    return this.vorgangStateResource.resource.eingang.antragsteller;
-  }
 }
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts
index 41f9e4879ce3133551800f72fc1eabc05d7966a4..51b14d26cd1aaca7c3b93a4ed8e1bbda2d482d16 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts
@@ -21,7 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject, Input } from '@angular/core';
 import {
   ON_PAGE,
   PostfachMailLinkRel,
@@ -29,7 +28,8 @@ import {
   isIncomingMail,
 } from '@alfa-client/postfach-shared';
 import { StateResource } from '@alfa-client/tech-shared';
-import { VorgangResource } from '@alfa-client/vorgang-shared';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Inject, Input } from '@angular/core';
 
 @Component({
   selector: 'alfa-postfach-mail',
@@ -38,7 +38,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared';
 })
 export class PostfachMailComponent {
   @Input() postfachMail: PostfachMailResource;
-  @Input() vorgangStateResource: StateResource<VorgangResource>;
+  @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>;
 
   readonly postfachNachrichtLinkRel = PostfachMailLinkRel;
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
index 1dd2e6701baba2c50028dbfdfa9c215359e7ef06..2a96a3b53a7329a7ef6536c2e184cf5d1be096a9 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts
@@ -21,19 +21,25 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { HasLinkPipe, createStateResource } from '@alfa-client/tech-shared';
+import { CommandResource } from '@alfa-client/command-shared';
+import {
+  HasLinkPipe,
+  StateResource,
+  createEmptyStateResource,
+  createStateResource,
+} from '@alfa-client/tech-shared';
 import { mock } from '@alfa-client/test-utils';
 import {
   IconButtonWithSpinnerComponent,
   OzgcloudStrokedButtonWithSpinnerComponent,
 } from '@alfa-client/ui';
 import { VorgangCommandService, VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
-import { of } from 'rxjs';
+import { Observable, of } from 'rxjs';
 import { AbschliessenButtonComponent } from './abschliessen-button.component';
 
 describe('AbschliessenButtonComponent', () => {
@@ -84,11 +90,28 @@ describe('AbschliessenButtonComponent', () => {
   });
 
   describe('abschliessen', () => {
+    const command: CommandResource = createCommandResource();
+    const comandStateResource$: Observable<StateResource<CommandResource>> = of(
+      createStateResource(command),
+    );
+
+    beforeEach(() => {
+      vorgangCommandService.abschliessen.mockReturnValue(comandStateResource$);
+    });
+
     it('should call vorgang service', () => {
       component.abschliessen();
 
       expect(vorgangCommandService.abschliessen).toHaveBeenCalled();
     });
+
+    it('should assign response', () => {
+      component.commandStateResource$ = of(createEmptyStateResource<CommandResource>());
+
+      component.abschliessen();
+
+      expect(component.commandStateResource$).toBe(comandStateResource$);
+    });
   });
 
   describe('abschliessen button', () => {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts
index f4dafed5cdc6da7afcec0f200722405e281d1e17..15df48ad2b497eed92ec4dfd36278e18fd3e506f 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts
@@ -21,7 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Input, OnInit } from '@angular/core';
 import { CommandResource } from '@alfa-client/command-shared';
 import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
 import {
@@ -29,6 +28,7 @@ import {
   VorgangWithEingangLinkRel,
   VorgangWithEingangResource,
 } from '@alfa-client/vorgang-shared';
+import { Component, Input, OnInit } from '@angular/core';
 import { Observable, of } from 'rxjs';
 
 @Component({
@@ -53,6 +53,6 @@ export class AbschliessenButtonComponent implements OnInit {
   }
 
   public abschliessen(): void {
-    this.vorgangCommandService.abschliessen(this.vorgang);
+    this.commandStateResource$ = this.vorgangCommandService.abschliessen(this.vorgang);
   }
 }
diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
index 0f2ccfe5b42b0c78b073e968ebd9a0821d26828b..d6251e13d63c817db05ef4b8a744e5d100d88b82 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts
@@ -22,6 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import { CommandResource } from '@alfa-client/command-shared';
 import {
   HasLinkPipe,
   StateResource,
@@ -41,10 +42,11 @@ import {
 } from '@alfa-client/vorgang-shared';
 import { DialogRef } from '@angular/cdk/dialog';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
-import { of } from 'rxjs';
+import { Observable, of } from 'rxjs';
 import { createBescheidResource } from '../../../../../bescheid-shared/src/test/bescheid';
 import { BescheidenDialogData } from '../../vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model';
 import { VorgangDetailBescheidenComponent } from '../../vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component';
@@ -171,32 +173,50 @@ describe('BescheidenButtonComponent', () => {
   });
 
   describe('onClick', () => {
-    it('should open bescheid wizard when create bescheid draft link exists', () => {
-      component.openBescheidenWizard = jest.fn();
-      component.vorgang = createVorgangWithEingangResource([
-        VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT,
-      ]);
+    describe('should open bescheid wizard', () => {
+      beforeEach(() => {
+        component.openBescheidenWizard = jest.fn();
+        component.vorgang = createVorgangWithEingangResource([
+          VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT,
+        ]);
+      });
 
-      component.onClick();
+      it('should open bescheid wizard when create bescheid draft link exists', () => {
+        component.onClick();
+
+        expect(component.openBescheidenWizard).toHaveBeenCalled();
+      });
 
-      expect(component.openBescheidenWizard).toHaveBeenCalled();
+      it('should open bescheid wizard when bescheid draft exists', () => {
+        component.onClick();
+
+        expect(component.openBescheidenWizard).toHaveBeenCalled();
+      });
     });
 
-    it('should open bescheid wizard when bescheid draft exists', () => {
-      component.openBescheidenWizard = jest.fn();
-      component.vorgang = createVorgangWithEingangResource([
-        VorgangWithEingangLinkRel.BESCHEID_DRAFT,
-      ]);
+    describe('should do bescheiden', () => {
+      const command: CommandResource = createCommandResource();
+      const comandStateResource$: Observable<StateResource<CommandResource>> = of(
+        createStateResource(command),
+      );
 
-      component.onClick();
+      beforeEach(() => {
+        vorgangCommandService.bescheiden.mockReturnValue(comandStateResource$);
+      });
 
-      expect(component.openBescheidenWizard).toHaveBeenCalled();
-    });
+      it('should call vorgangCommandService.bescheiden', () => {
+        component.onClick();
 
-    it('should call vorgangCommandService.bescheiden', () => {
-      component.onClick();
+        expect(vorgangCommandService.bescheiden).toHaveBeenCalled();
+      });
+
+      it('should assign response', () => {
+        component.commandStateResource$ = of(createEmptyStateResource<CommandResource>());
 
-      expect(vorgangCommandService.bescheiden).toHaveBeenCalled();
+        component.onClick();
+
+        expect(component.commandStateResource$).toBe(comandStateResource$);
+      });
     });
   });
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts
index 57fb4b05366bdd752b98c8b3cfc20f8a372f1bae..d76a5cf53225299d7f63695281c06c13bba00cc0 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts
@@ -76,7 +76,7 @@ export class BescheidenButtonComponent implements OnInit {
     if (this.shouldOpenBescheidenWizard()) {
       this.openBescheidenWizard();
     } else {
-      this.vorgangCommandService.bescheiden(this.vorgang);
+      this.commandStateResource$ = this.vorgangCommandService.bescheiden(this.vorgang);
     }
   }
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts
index 0b1990b314cf37d4afefdeed405b889a38b456a2..5b082c9a1a664ffc1aa4c5e37979a2834b24f520 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts
@@ -4,22 +4,31 @@ import {
   BescheidResource,
   BescheidSendBy,
   BescheidService,
+  DocumentResource,
 } from '@alfa-client/bescheid-shared';
+import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import { CommandResource } from '@alfa-client/command-shared';
-import { StateResource, createStateResource, formatForDatabase } from '@alfa-client/tech-shared';
+import {
+  EMPTY_STRING,
+  StateResource,
+  createStateResource,
+  formatForDatabase,
+} from '@alfa-client/tech-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { registerLocaleData } from '@angular/common';
 import localeDe from '@angular/common/locales/de';
 import { fakeAsync, tick } from '@angular/core/testing';
 import { UntypedFormBuilder } from '@angular/forms';
 import faker from '@faker-js/faker';
-import { Resource } from '@ngxp/rest';
+import { Resource, ResourceUri } from '@ngxp/rest';
 import { cold } from 'jest-marbles';
 import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { toResource } from 'libs/tech-shared/test/resource';
 import { of } from 'rxjs';
 import { createBescheidResource } from '../../../../../bescheid-shared/src/test/bescheid';
+import { createDocumentResource } from '../../../../../bescheid-shared/src/test/document';
 import { createBinaryFileResource } from '../../../../../binary-file-shared/test/binary-file';
 import { singleCold } from '../../../../../tech-shared/src/lib/resource/marbles';
 import { createVorgangWithEingangResource } from '../../../../../vorgang-shared/test/vorgang';
@@ -30,7 +39,7 @@ registerLocaleData(localeDe);
 describe('BescheidenFormService', () => {
   let service: BescheidenFormService;
   let bescheidService: Mock<BescheidService>;
-  const now = new Date();
+  const now: Date = new Date();
   Date.now = jest.fn().mockReturnValue(now);
 
   beforeEach(() => {
@@ -82,6 +91,8 @@ describe('BescheidenFormService', () => {
             attachments: [],
             bescheidDocument: null,
             sendBy: BescheidSendBy.NACHRICHT,
+            nachrichtSubject: '',
+            nachrichtText: '',
           },
         }),
       );
@@ -89,7 +100,7 @@ describe('BescheidenFormService', () => {
   });
 
   describe('getValue', () => {
-    let getFormValue;
+    let getFormValue: jest.Mock;
 
     beforeEach(() => {
       getFormValue = service.getFormValue = jest.fn();
@@ -103,7 +114,7 @@ describe('BescheidenFormService', () => {
     });
 
     it('should return bescheid', () => {
-      const value = service.getValue();
+      const value: Bescheid = service.getValue();
 
       expect(value).toEqual({ bewilligt: true, beschiedenAm: formatForDatabase(now) } as Bescheid);
     });
@@ -118,6 +129,8 @@ describe('BescheidenFormService', () => {
           attachments: [],
           bescheidDocument: null,
           sendBy: BescheidSendBy.NACHRICHT,
+          nachrichtSubject: '',
+          nachrichtText: '',
         }),
       );
     });
@@ -144,7 +157,7 @@ describe('BescheidenFormService', () => {
     });
 
     it('should call patch with undefined sendBy', () => {
-      const bescheidDocumentUri = faker.internet.url();
+      const bescheidDocumentUri: ResourceUri = faker.internet.url();
       service.patchValues({
         ...bescheidResource,
         sendBy: undefined,
@@ -159,6 +172,8 @@ describe('BescheidenFormService', () => {
         [BescheidenFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt),
         [BescheidenFormService.FIELD_SEND_BY]: BescheidSendBy.NACHRICHT,
         [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri,
+        [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject,
+        [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtSubject,
       });
     });
 
@@ -242,7 +257,8 @@ describe('BescheidenFormService', () => {
 
   describe('setVorgangWithEingangResource', () => {
     it('should set vorgangWithEingangResource', () => {
-      const vorgangWithEingangResource = createVorgangWithEingangResource();
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createVorgangWithEingangResource();
 
       service.setVorgangWithEingangResource(vorgangWithEingangResource);
 
@@ -252,10 +268,11 @@ describe('BescheidenFormService', () => {
 
   describe('getVorgangWithEingangResource', () => {
     it('should reutrn vorgangWithEingangResource', () => {
-      const vorgangWithEingangResource = createVorgangWithEingangResource();
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createVorgangWithEingangResource();
       service.vorgangWithEingangResource = vorgangWithEingangResource;
 
-      const vorang = service.getVorgangWithEingangResource();
+      const vorang: VorgangWithEingangResource = service.getVorgangWithEingangResource();
 
       expect(vorang).toBe(vorgangWithEingangResource);
     });
@@ -263,9 +280,9 @@ describe('BescheidenFormService', () => {
 
   describe('deleteFile', () => {
     it('should emit binary file resource', (done) => {
-      const file = createBinaryFileResource();
+      const file: BinaryFileResource = createBinaryFileResource();
 
-      service.getFileDelete().subscribe((deletedFile) => {
+      service.getFileDelete().subscribe((deletedFile: BinaryFileResource) => {
         expect(deletedFile).toEqual(file);
         done();
       });
@@ -273,4 +290,35 @@ describe('BescheidenFormService', () => {
       service.deleteFile(file);
     });
   });
+
+  describe('setActiveStep', () => {
+    it('should emit step', () => {
+      service.setActiveStep(3);
+
+      expect(service.getActiveStep()).toBeObservable(singleCold(3));
+    });
+  });
+
+  describe('patchNachricht', () => {
+    it('should patch values', () => {
+      const documentResource: DocumentResource = createDocumentResource();
+
+      service.patchNachricht(documentResource);
+
+      expect(service.getValue().nachrichtSubject).toEqual(documentResource.nachrichtSubject);
+      expect(service.getValue().nachrichtText).toEqual(documentResource.nachrichtText);
+    });
+  });
+
+  describe('clearNachricht', () => {
+    it('should patch values', () => {
+      const documentResource: DocumentResource = createDocumentResource();
+
+      service.patchNachricht(documentResource);
+      service.clearNachricht();
+
+      expect(service.getValue().nachrichtSubject).toEqual(EMPTY_STRING);
+      expect(service.getValue().nachrichtText).toEqual(EMPTY_STRING);
+    });
+  });
 });
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts
index b044ee37f0ebced6f2c78b77780118210f1bb481..4780976bf07b0e69ee852dc317b19f6c785c1b7e 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts
@@ -4,11 +4,13 @@ import {
   BescheidResource,
   BescheidSendBy,
   BescheidService,
+  DocumentResource,
 } from '@alfa-client/bescheid-shared';
 import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import { tapOnCommandSuccessfullyDone } from '@alfa-client/command-shared';
 import {
   AbstractFormService,
+  EMPTY_STRING,
   HttpError,
   StateResource,
   asBoolean,
@@ -36,15 +38,17 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   static readonly FIELD_BESCHEID_DOCUMENT = 'bescheidDocument';
   static readonly FIELD_ATTACHMENTS = 'attachments';
   public static readonly FIELD_SEND_BY = 'sendBy';
+  static readonly FIELD_NACHRICHT_SUBJECT = 'nachrichtSubject';
+  static readonly FIELD_NACHRICHT_TEXT = 'nachrichtText';
 
   static readonly FIELD_PATH_PREFIX = 'command.body';
 
   private readonly bescheidChanges$: BehaviorSubject<Bescheid>;
-  private attachmentUpload$: Subject<StateResource<BinaryFileResource>>;
+  private attachmentUpload$: BehaviorSubject<StateResource<BinaryFileResource>>;
   private bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>;
   private readonly fileDelete$: Subject<BinaryFileResource>;
 
-  private readonly activeStep: BehaviorSubject<number> = new BehaviorSubject(1);
+  private readonly activeStep$: BehaviorSubject<number> = new BehaviorSubject(1);
   readonly sendByManual: BehaviorSubject<boolean> = new BehaviorSubject(false);
 
   vorgangWithEingangResource: VorgangWithEingangResource;
@@ -67,7 +71,9 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   init(): void {
     this.formControlSubscriptions = this.subscribeToSendBy();
     this.bescheidFileUpload$ = of(createEmptyStateResource<BinaryFileResource>());
-    this.attachmentUpload$ = new Subject<StateResource<BinaryFileResource>>();
+    this.attachmentUpload$ = new BehaviorSubject<StateResource<BinaryFileResource>>(
+      createEmptyStateResource(),
+    );
     this.initializeFormChanges();
   }
 
@@ -116,6 +122,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
       [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri,
       [BescheidenFormService.FIELD_SEND_BY]:
         isUndefined(bescheid.sendBy) ? BescheidSendBy.NACHRICHT : bescheid.sendBy,
+      [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheid.nachrichtSubject,
+      [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheid.nachrichtText,
     });
     bescheid.attachments.forEach((attachmentLink) =>
       (this.form.controls[BescheidenFormService.FIELD_ATTACHMENTS] as UntypedFormArray).push(
@@ -138,6 +146,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
       [BescheidenFormService.FIELD_SEND_BY]: new UntypedFormControl(BescheidSendBy.NACHRICHT),
       [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: new UntypedFormControl(null),
       [BescheidenFormService.FIELD_ATTACHMENTS]: new UntypedFormArray([]),
+      [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: new UntypedFormControl(''),
+      [BescheidenFormService.FIELD_NACHRICHT_TEXT]: new UntypedFormControl(''),
     });
   }
 
@@ -208,11 +218,11 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   }
 
   public setActiveStep(step: number) {
-    this.activeStep.next(step);
+    this.activeStep$.next(step);
   }
 
   public getActiveStep(): Observable<number> {
-    return this.activeStep.asObservable();
+    return this.activeStep$.asObservable();
   }
 
   public clearBescheidDocumentFile(): void {
@@ -230,4 +240,21 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   public isSendByManual(): Observable<boolean> {
     return this.sendByManual.asObservable();
   }
+
+  public patchNachricht(documentResource: DocumentResource): void {
+    this.setNachrichtSubject(documentResource.nachrichtSubject);
+    this.setNachrichtText(documentResource.nachrichtText);
+  }
+
+  public clearNachricht(): void {
+    this.setNachrichtSubject(EMPTY_STRING);
+    this.setNachrichtText(EMPTY_STRING);
+  }
+
+  private setNachrichtSubject(value: string): void {
+    this.form.controls[BescheidenFormService.FIELD_NACHRICHT_SUBJECT].patchValue(value);
+  }
+  private setNachrichtText(value: string): void {
+    this.form.controls[BescheidenFormService.FIELD_NACHRICHT_TEXT].patchValue(value);
+  }
 }
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts
index 7f2dfcf065308069b95c77fd4a2a8dc1164482cf..ba48a240982fb6f74a545cdf7b799a4c439277da 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts
@@ -126,6 +126,14 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
 
       expect(component.existingAttachments).toEqual([attachment]);
     });
+
+    it('should reset uploaded attachments', () => {
+      component.uploadedAttachments = [createStateResource(createBinaryFileResource())];
+
+      component.loadExistingAttachments();
+
+      expect(component.uploadedAttachments).toEqual([]);
+    });
   });
 
   describe('subscribeToAttachmentUpload', () => {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts
index f4a2d246c43ae2a45efcdf5e5d21ffca38793f72..4fb7941eaf9e917d802f20e051e51194e8a88001 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts
@@ -43,7 +43,10 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
     this.bescheidService
       .getAttachments()
       .pipe(first())
-      .subscribe((attachments) => (this.existingAttachments = attachments));
+      .subscribe((attachments) => {
+        this.uploadedAttachments = [];
+        this.existingAttachments = attachments;
+      });
   }
 
   subscribeToAttachmentUpload() {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html
index 865686862a5e76ce5f2874b80b8375c20bff151d..e6fc88be75711bd7be2bd368b7e1dc5c578cf3c6 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html
@@ -1,7 +1,3 @@
-<!--REPLACENME: Durch Neue UI/UX Componente ersetzten
-      @Input() stateResource: StateResource<BinaryFileResource> =# bescheidDocumentFile
-      @Output() delete: EventEmitter<BinaryFileResource>
--->
 <ng-container *ngIf="bescheidDocumentFile.resource">
   <alfa-binary-file2-container
     *ngIf="!bescheidDocumentFile.loading"
@@ -11,12 +7,17 @@
   >
   </alfa-binary-file2-container>
 </ng-container>
-<ng-container *ngIf="bescheidDocumentFile.loading">
-  <span *ngIf="bescheidDocumentFile.resource">{{ bescheidDocumentFile.resource.name }}</span>
+<ng-container *ngIf="uploadBescheidDocumentInProgress.loading">
+  <span *ngIf="bescheidDocumentFile.resource">{{ uploadBescheidDocumentInProgress.fileName }}</span>
   <ods-spinner-icon spinner class="mr-3 flex size-10" />
 </ng-container>
+<!-- REPLACEME: UI/UX Componente für den Fehler anzeigen-->
+<ng-container *ngIf="createBescheidDocumentInProgress.error">
+  <span data-test-id="create-bescheid-document-error">Fehler beim automatischen Erstellen.</span>
+</ng-container>
+<!-- -->
 <alfa-vorgang-detail-bescheiden-form-error
-  *ngIf="bescheidDocumentFile.error && !bescheidDocumentFile.loading"
-  [error]="bescheidDocumentFile.error"
+  *ngIf="uploadBescheidDocumentInProgress.error && !bescheidDocumentFile.loading"
+  data-test-id="upload-bescheid-document-error"
+  [error]="uploadBescheidDocumentInProgress.error"
 ></alfa-vorgang-detail-bescheiden-form-error>
-<!-- -->
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts
index 275bac1d9998a0ccfdfb94bd934c05a5b344dde2..08fc89135573aca9a8ac8218a357232c3e58deef 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts
@@ -1,11 +1,13 @@
 import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
 import { BinaryFile2ContainerComponent } from '@alfa-client/binary-file';
 import { createStateResource } from '@alfa-client/tech-shared';
-import { Mock, mock } from '@alfa-client/test-utils';
+import { Mock, existsAsHtmlElement, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { getUrl } from '@ngxp/rest';
 import { createBescheidResource } from 'libs/bescheid-shared/src/test/bescheid';
 import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createApiError } from 'libs/tech-shared/test/error';
 import { MockComponent } from 'ng-mocks';
 import { VorgangDetailBescheidenFormErrorComponent } from '../vorgang-detail-bescheiden-form-error/vorgang-detail-bescheiden-form-error.component';
 import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument.component';
@@ -14,6 +16,9 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => {
   let component: VorgangDetailBescheidenResultDokumentComponent;
   let fixture: ComponentFixture<VorgangDetailBescheidenResultDokumentComponent>;
 
+  const createBescheidDocumentError: string = getDataTestIdOf('create-bescheid-document-error');
+  const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error');
+
   let bescheidService: Mock<BescheidService>;
 
   beforeEach(async () => {
@@ -62,4 +67,40 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => {
       expect(bescheidService.loadBescheidDocument).not.toHaveBeenCalled();
     });
   });
+
+  describe('upload bescheid document error', () => {
+    it('should be shown if error exists', () => {
+      component.uploadBescheidDocumentInProgress = { loading: false, error: createApiError() };
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, uploadBescheidDocumentError);
+    });
+
+    it('should be hidden on non error', () => {
+      component.uploadBescheidDocumentInProgress = { loading: false };
+
+      fixture.detectChanges();
+
+      notExistsAsHtmlElement(fixture, uploadBescheidDocumentError);
+    });
+  });
+
+  describe('create bescheid document error', () => {
+    it('should be shown if error exists', () => {
+      component.createBescheidDocumentInProgress = { loading: false, error: createApiError() };
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, createBescheidDocumentError);
+    });
+
+    it('should be hidden on non error', () => {
+      component.createBescheidDocumentInProgress = { loading: false };
+
+      fixture.detectChanges();
+
+      notExistsAsHtmlElement(fixture, createBescheidDocumentError);
+    });
+  });
 });
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts
index de533509bbef42e139f9502f0694f2aff68a9b7c..b8349745f2f0c67b699f0c0f7512674c0969a13d 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts
@@ -1,4 +1,9 @@
-import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import {
+  BescheidLinkRel,
+  BescheidResource,
+  BescheidService,
+  UploadFileInProgress,
+} from '@alfa-client/bescheid-shared';
 import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import { StateResource } from '@alfa-client/tech-shared';
 import { Component, EventEmitter, Input, Output } from '@angular/core';
@@ -10,6 +15,8 @@ import { getUrl, hasLink } from '@ngxp/rest';
 })
 export class VorgangDetailBescheidenResultDokumentComponent {
   @Input() bescheidDocumentFile: StateResource<BinaryFileResource>;
+  @Input() uploadBescheidDocumentInProgress: UploadFileInProgress = { loading: false };
+  @Input() createBescheidDocumentInProgress: UploadFileInProgress = { loading: false };
   @Input() set bescheidDraftStateResource(bescheidStateResource: StateResource<BescheidResource>) {
     this.handleBescheiDocument(bescheidStateResource.resource);
   }
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..44cf270aac5fb6dbb0e7fcef8505e1af8c43a68d
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html
@@ -0,0 +1,20 @@
+<h1>Neue Nachricht</h1>
+<p *ngIf="empfaenger$ | async as empfaenger" data-test-id="bescheid-nachricht-empfaenger">
+  An: {{ empfaenger }}
+</p>
+<div [formGroup]="form">
+  <!-- TODO: neue Komponente oder stylen? -->
+  <ozgcloud-text-editor
+    [formControlName]="formServiceClass.FIELD_NACHRICHT_SUBJECT"
+    label="Betreff"
+  >
+  </ozgcloud-text-editor>
+
+  <!-- TODO: neue Komponente oder stylen? -->
+  <ozgcloud-textarea-editor
+    [formControlName]="formServiceClass.FIELD_NACHRICHT_TEXT"
+    label="Text"
+    class="message-editor"
+  >
+  </ozgcloud-textarea-editor>
+</div>
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f6e11aa735e90c470e1f8e7a0a334ffe1f7e464
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts
@@ -0,0 +1,135 @@
+import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared';
+import {
+  createEmptyStateResource,
+  createErrorStateResource,
+  createStateResource,
+  StateResource,
+} from '@alfa-client/tech-shared';
+import { getElementFromFixture } from '@alfa-client/test-utils';
+import { TextAreaEditorComponent, TextEditorComponent } from '@alfa-client/ui';
+import { registerLocaleData } from '@angular/common';
+import localeDe from '@angular/common/locales/de';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
+import { MatIconTestingModule } from '@angular/material/icon/testing';
+import faker from '@faker-js/faker';
+import { Mock, mock, useFromMock } from 'libs/test-utils/src/lib/mocking';
+import { OzgcloudSvgIconComponent } from 'libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component';
+import { MockComponent } from 'ng-mocks';
+import { EMPTY, of } from 'rxjs';
+import { createDocumentResource } from '../../../../../../../bescheid-shared/src/test/document';
+import { singleColdCompleted } from '../../../../../../../tech-shared/src/lib/resource/marbles';
+import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test';
+import { createApiError } from '../../../../../../../tech-shared/test/error';
+import { BescheidenFormService } from '../../bescheiden.formservice';
+import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht.component';
+
+registerLocaleData(localeDe);
+
+describe('VorgangDetailBescheidenResultNachrichtComponent', () => {
+  let component: VorgangDetailBescheidenResultNachrichtComponent;
+  let fixture: ComponentFixture<VorgangDetailBescheidenResultNachrichtComponent>;
+
+  let bescheidService: Mock<BescheidService>;
+  let formService: BescheidenFormService;
+
+  const bescheidNachrichtEmpfaengerElement: string = getDataTestIdOf(
+    'bescheid-nachricht-empfaenger',
+  );
+
+  beforeEach(async () => {
+    bescheidService = mock(BescheidService);
+    formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService));
+
+    await TestBed.configureTestingModule({
+      imports: [ReactiveFormsModule, MatIconTestingModule],
+      declarations: [
+        VorgangDetailBescheidenResultNachrichtComponent,
+        MatIcon,
+        MockComponent(OzgcloudSvgIconComponent),
+        MockComponent(TextEditorComponent),
+        MockComponent(TextAreaEditorComponent),
+      ],
+      providers: [
+        {
+          provide: BescheidService,
+          useValue: bescheidService,
+        },
+        {
+          provide: BescheidenFormService,
+          useValue: formService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(VorgangDetailBescheidenResultNachrichtComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('render', () => {
+    it('should render Nachrichtenempfänger', () => {
+      const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`;
+      bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger));
+      component.ngOnInit();
+
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement);
+      expect(element).toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not render Nachrichtenempfänger', () => {
+      bescheidService.getEmpfaenger.mockReturnValue(EMPTY);
+      component.ngOnInit();
+
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement);
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+  });
+
+  describe('ngOnInit', () => {
+    it('should set Nachrichtenempfänger', () => {
+      const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`;
+      bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger));
+
+      component.ngOnInit();
+
+      expect(component.empfaenger$).toBeObservable(singleColdCompleted(empfaenger));
+    });
+  });
+
+  describe('set bescheidDocumentStateResource', () => {
+    beforeEach(() => {
+      formService.patchNachricht = jest.fn();
+    });
+
+    it('should patch form', () => {
+      const documentStateResource: StateResource<DocumentResource> =
+        createStateResource(createDocumentResource());
+
+      component.bescheidDocumentStateResource = documentStateResource;
+
+      expect(formService.patchNachricht).toHaveBeenCalledWith(documentStateResource.resource);
+    });
+
+    it('should not patch form if document not loaded', () => {
+      component.bescheidDocumentStateResource = createEmptyStateResource();
+
+      expect(formService.patchNachricht).not.toHaveBeenCalled();
+    });
+
+    it('should not patch form if document loaded with error', () => {
+      component.bescheidDocumentStateResource = createErrorStateResource(createApiError());
+
+      expect(formService.patchNachricht).not.toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cddc36969c17d7bf279a4fbc21a329184f6697a1
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts
@@ -0,0 +1,33 @@
+import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared';
+import { StateResource } from '@alfa-client/tech-shared';
+import { Component, Input, OnInit } from '@angular/core';
+import { FormGroup } from '@angular/forms';
+import { Observable } from 'rxjs';
+import { BescheidenFormService } from '../../bescheiden.formservice';
+
+@Component({
+  selector: 'alfa-vorgang-detail-bescheiden-result-nachricht',
+  templateUrl: './vorgang-detail-bescheiden-result-nachricht.component.html',
+})
+export class VorgangDetailBescheidenResultNachrichtComponent implements OnInit {
+  @Input() set bescheidDocumentStateResource(stateResource: StateResource<DocumentResource>) {
+    if (stateResource.loaded && !stateResource.error) {
+      this.formService.patchNachricht(stateResource.resource);
+    }
+  }
+
+  empfaenger$: Observable<string>;
+  form: FormGroup;
+
+  readonly formServiceClass = BescheidenFormService;
+
+  constructor(
+    private readonly bescheidService: BescheidService,
+    private readonly formService: BescheidenFormService,
+  ) {}
+
+  ngOnInit(): void {
+    this.empfaenger$ = this.bescheidService.getEmpfaenger();
+    this.form = this.formService.form;
+  }
+}
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html
index b5c96a727291d98ec4488b42d60bcc273374b3ed..73a4f5ecf28582a26586bed9eb2f36928ad14635 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html
@@ -1,58 +1,85 @@
 <section
-  class="flex w-full flex-col justify-between overflow-auto rounded-xl bg-background-100 p-4"
-  *ngIf="{ activeStep: activeStep$ | async, sendByManual: sendByManual$ | async } as wizardData"
+  class="w-full overflow-auto rounded-xl bg-background-100"
+  *ngIf="{
+    activeStep: activeStep$ | async,
+    sendByManual: sendByManual$ | async,
+    isPostfachConfigured: isPostfachConfigured$ | async
+  } as wizardData"
 >
-  <div class="flex-1">
-    <div class="mb-4 text-base font-bold text-primary-600">Bescheid</div>
-    <div class="my-6" data-test-id="bescheid-status-text">
-      <alfa-vorgang-detail-bescheiden-result-status
-        *ngIf="
-          wizardData.activeStep === 1 ||
-          wizardData.activeStep === 2 ||
-          (wizardData.activeStep === 3 && wizardData.sendByManual)
-        "
-        data-test-id="bescheid-status"
-        [bescheid]="bescheid$ | async"
-      ></alfa-vorgang-detail-bescheiden-result-status>
-    </div>
+  <div class="p-4 text-base font-bold text-primary-600">Bescheid</div>
+  <div class="p-4" data-test-id="bescheid-status-text">
+    <alfa-vorgang-detail-bescheiden-result-status
+      *ngIf="
+        wizardData.activeStep === 1 || (wizardData.activeStep === 3 && wizardData.sendByManual)
+      "
+      data-test-id="bescheid-status"
+      [bescheid]="bescheid$ | async"
+    ></alfa-vorgang-detail-bescheiden-result-status>
+  </div>
+
+  <div class="p-4">
+    <alfa-vorgang-detail-bescheiden-result-nachricht
+      *ngIf="
+        !wizardData.sendByManual && wizardData.activeStep === 3 && wizardData.isPostfachConfigured
+      "
+      [bescheidDocumentStateResource]="bescheidDocument$ | async"
+      data-test-id="bescheid-nachricht-an-antragsteller"
+    ></alfa-vorgang-detail-bescheiden-result-nachricht>
+  </div>
 
-    <div class="my-4" data-test-id="bescheid-status-dokument">
-      <alfa-vorgang-detail-bescheiden-result-dokument
-        *ngIf="
-          wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual)
-        "
-        data-test-id="bescheid-document"
-        [bescheidDraftStateResource]="bescheidDraftStateResource$ | async"
-        [bescheidDocumentFile]="bescheidDocumentFile$ | async"
-        (deleteFile)="deleteBescheidDocument()"
-      ></alfa-vorgang-detail-bescheiden-result-dokument>
-    </div>
+  <div class="p-4" data-test-id="bescheid-status-dokument">
+    <alfa-vorgang-detail-bescheiden-result-dokument
+      *ngIf="
+        wizardData.activeStep === 2 ||
+        (wizardData.activeStep === 3 &&
+          (wizardData.sendByManual || wizardData.isPostfachConfigured))
+      "
+      data-test-id="bescheid-document"
+      [bescheidDraftStateResource]="bescheidDraftStateResource$ | async"
+      [uploadBescheidDocumentInProgress]="uploadBescheidDocumentInProgress$ | async"
+      [createBescheidDocumentInProgress]="createBescheidDocumentInProgress$ | async"
+      [bescheidDocumentFile]="bescheidDocumentFile$ | async"
+      (deleteFile)="deleteBescheidDocument()"
+    ></alfa-vorgang-detail-bescheiden-result-dokument>
+  </div>
 
-    <div class="my-4" data-test-id="bescheid-status-attachments">
-      <alfa-vorgang-detail-bescheiden-result-attachments
-        *ngIf="
-          wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual)
-        "
-        data-test-id="bescheid-attachments"
-      ></alfa-vorgang-detail-bescheiden-result-attachments>
-    </div>
+  <div class="p-4" data-test-id="bescheid-status-attachments">
+    <alfa-vorgang-detail-bescheiden-result-attachments
+      *ngIf="
+        wizardData.activeStep === 2 ||
+        (wizardData.activeStep === 3 &&
+          (wizardData.sendByManual || wizardData.isPostfachConfigured))
+      "
+      data-test-id="bescheid-attachments"
+    ></alfa-vorgang-detail-bescheiden-result-attachments>
   </div>
-  <div class="flex-none">
-    <div
-      class="flex flex-col align-bottom"
-      *ngIf="wizardData.sendByManual && wizardData.activeStep === 3"
-    >
-      <span>Der Bescheid muss manuell versendet werden</span>
-      <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource">
-        <button
-          (click)="saveAndSend(bescheidDraftStateResource.resource)"
-          type="button"
-          class="mt-8 self-end rounded-md bg-primary-600 px-8 py-2 text-sm text-white shadow-sm hover:bg-ozgblue-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ozgblue-800"
-          data-test-id="save-and-send-button"
-        >
-          Antrag bescheiden und speichern
-        </button>
-      </ng-container>
-    </div>
+
+  <div *ngIf="wizardData.sendByManual && wizardData.activeStep === 3">
+    <span>Der Bescheid muss manuell versendet werden.</span>
+
+    <!-- REPLACEME: Durch UI/UX Componenten ersetzen -->
+    <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource">
+      <ozgcloud-button-with-spinner
+        data-test-id="save-and-send-button"
+        [stateResource]="saveAndSendInProgress$ | async"
+        text="Antrag bescheiden und speichern"
+        (clickEmitter)="saveAndSendManually(bescheidDraftStateResource.resource)"
+      ></ozgcloud-button-with-spinner>
+    </ng-container>
+    <!-- -->
   </div>
+  <ng-container
+    *ngIf="
+      wizardData.activeStep === 3 && !wizardData.sendByManual && wizardData.isPostfachConfigured
+    "
+  >
+    <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource">
+      <ozgcloud-button-with-spinner
+        data-test-id="send-button"
+        [stateResource]="saveAndSendInProgress$ | async"
+        text="Bescheid senden"
+        (clickEmitter)="saveAndSendWithNachricht(bescheidDraftStateResource.resource)"
+      ></ozgcloud-button-with-spinner>
+    </ng-container>
+  </ng-container>
 </section>
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts
index d2123e02d3d960effac6f42e7d1e5e4f140c8974..74a8ae7f0bcc486b2c72dd94c5da91c2f5fab12f 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts
@@ -4,6 +4,8 @@ import { StateResource, createStateResource } from '@alfa-client/tech-shared';
 import {
   Mock,
   dispatchEventFromFixture,
+  existsAsHtmlElement,
+  getElementFromFixture,
   mock,
   notExistsAsHtmlElement,
 } from '@alfa-client/test-utils';
@@ -18,6 +20,7 @@ import { BehaviorSubject, first, of } from 'rxjs';
 import { BescheidenFormService } from '../bescheiden.formservice';
 import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component';
 import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component';
+import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component';
 import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component';
 import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-bescheiden-result.component';
 
@@ -32,6 +35,8 @@ describe('VorgangDetailBescheidenResultComponent', () => {
   const bescheidDocument: string = getDataTestIdOf('bescheid-document');
   const bescheidAttachments: string = getDataTestIdOf('bescheid-attachments');
   const saveAndSendButton: string = getDataTestIdOf('save-and-send-button');
+  const sendButton: string = getDataTestIdOf('send-button');
+  const nachrichtAntragstellerComponent = getDataTestIdOf('bescheid-nachricht-an-antragsteller');
 
   beforeEach(async () => {
     bescheidService = mock(BescheidService);
@@ -46,6 +51,7 @@ describe('VorgangDetailBescheidenResultComponent', () => {
         MockComponent(VorgangDetailBescheidenResultDokumentComponent),
         MockComponent(VorgangDetailBescheidenResultAttachmentsComponent),
         MockComponent(OzgcloudButtonWithSpinnerComponent),
+        MockComponent(VorgangDetailBescheidenResultNachrichtComponent),
       ],
       providers: [
         {
@@ -68,6 +74,109 @@ describe('VorgangDetailBescheidenResultComponent', () => {
     expect(component).toBeTruthy();
   });
 
+  describe('render Nachricht component', () => {
+    it('should render', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent);
+
+      expect(element).toBeInstanceOf(HTMLElement);
+    });
+
+    it.each([1, 2])('should not render in step %d', (step) => {
+      formService.getActiveStep.mockReturnValue(of(step));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not render if send by manual', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(true));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not render if postfach not configured', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(false));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+  });
+
+  describe('render send button', () => {
+    it('should render', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      bescheidService.getBescheidDraft.mockReturnValue(
+        of(createStateResource(createBescheidResource())),
+      );
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, sendButton);
+
+      expect(element).toBeInstanceOf(HTMLElement);
+    });
+
+    it.each([1, 2])('should not render in step %d', (step) => {
+      formService.getActiveStep.mockReturnValue(of(step));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, sendButton);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not render if send by manual', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(true));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(true));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, sendButton);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not render if postfach not configured', () => {
+      formService.getActiveStep.mockReturnValue(of(3));
+      formService.isSendByManual.mockReturnValue(of(false));
+      bescheidService.isPostfachConfigured.mockReturnValue(of(false));
+      component.ngOnInit();
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, sendButton);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+  });
+
   describe('ngOnInit', () => {
     it('should call service to get bescheid document file', () => {
       component.ngOnInit();
@@ -81,6 +190,12 @@ describe('VorgangDetailBescheidenResultComponent', () => {
       expect(bescheidService.getBescheidDraft).toHaveBeenCalled();
     });
 
+    it('should call service to get bescheid document', () => {
+      component.ngOnInit();
+
+      expect(bescheidService.getBescheidDocument).toHaveBeenCalled();
+    });
+
     it('should call formservice to get active step', () => {
       component.ngOnInit();
 
@@ -98,6 +213,24 @@ describe('VorgangDetailBescheidenResultComponent', () => {
 
       expect(formService.isSendByManual).toHaveBeenCalled();
     });
+
+    it('should call service to get upload bescheid document in progress', () => {
+      component.ngOnInit();
+
+      expect(bescheidService.getUploadBescheidDocumentInProgress).toHaveBeenCalled();
+    });
+
+    it('should call service to get create bescheid document in progress', () => {
+      component.ngOnInit();
+
+      expect(bescheidService.getCreateBescheidDocumentInProgress).toHaveBeenCalled();
+    });
+
+    it('should should call service to check if postfach is configured', () => {
+      component.ngOnInit();
+
+      expect(bescheidService.isPostfachConfigured).toHaveBeenCalled();
+    });
   });
 
   describe('deleteBescheidDocument', () => {
@@ -108,7 +241,7 @@ describe('VorgangDetailBescheidenResultComponent', () => {
     });
   });
 
-  describe('save and send', () => {
+  describe('save and send manually', () => {
     const bescheidDraft: BescheidResource = createBescheidResource();
     const bescheidStateResource: StateResource<BescheidResource> =
       createStateResource(bescheidDraft);
@@ -119,20 +252,48 @@ describe('VorgangDetailBescheidenResultComponent', () => {
       component.activeStep$ = of(3);
     });
 
+    it('should clear nachricht', () => {
+      component.doSaveAndSend = jest.fn();
+
+      component.saveAndSendManually(bescheidDraft);
+
+      expect(formService.clearNachricht).toHaveBeenCalled();
+    });
+
     it('should call component on event dispatch', () => {
-      component.saveAndSend = jest.fn();
+      component.saveAndSendManually = jest.fn();
 
       fixture.detectChanges();
 
       dispatchEventFromFixture(fixture, saveAndSendButton, 'click');
 
-      expect(component.saveAndSend).toHaveBeenCalledWith(bescheidDraft);
+      expect(component.saveAndSendManually).toHaveBeenCalledWith(bescheidDraft);
     });
 
     it('should call do save and send', () => {
       component.doSaveAndSend = jest.fn();
 
-      component.saveAndSend(bescheidDraft);
+      component.saveAndSendManually(bescheidDraft);
+
+      expect(component.doSaveAndSend).toHaveBeenCalled();
+    });
+  });
+
+  describe('save and send with Nachricht', () => {
+    const bescheidDraft: BescheidResource = createBescheidResource();
+    const bescheidStateResource: StateResource<BescheidResource> =
+      createStateResource(bescheidDraft);
+
+    beforeEach(() => {
+      component.bescheidDraftStateResource$ = of(bescheidStateResource);
+      component.sendByManual$ = of(true);
+      component.activeStep$ = of(3);
+    });
+
+    it('should call do save and send', () => {
+      component.doSaveAndSend = jest.fn();
+
+      component.saveAndSendWithNachricht(bescheidDraft);
 
       expect(component.doSaveAndSend).toHaveBeenCalled();
     });
@@ -215,6 +376,16 @@ describe('VorgangDetailBescheidenResultComponent', () => {
 
       notExistsAsHtmlElement(fixture, bescheidDocument);
     });
+
+    it('should be visible in step 3 when postfach is configured', () => {
+      component.sendByManual$ = of(false);
+      component.activeStep$ = of(3);
+      component.isPostfachConfigured$ = of(true);
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, bescheidDocument);
+    });
   });
 
   describe('bescheid attachments', () => {
@@ -243,6 +414,16 @@ describe('VorgangDetailBescheidenResultComponent', () => {
 
       notExistsAsHtmlElement(fixture, bescheidAttachments);
     });
+
+    it('should be visible in step 3 when postfach is configured', () => {
+      component.sendByManual$ = of(false);
+      component.activeStep$ = of(3);
+      component.isPostfachConfigured$ = of(true);
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, bescheidAttachments);
+    });
   });
 
   describe('update and bescheiden', () => {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts
index b566e499b1ee6f592e35980d099e6518b65261f8..fdc71f20a21b61d3a14f5942f3eebca547b02214 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts
@@ -1,8 +1,9 @@
 import {
   Bescheid,
   BescheidResource,
-  BescheidSendBy,
   BescheidService,
+  DocumentResource,
+  UploadFileInProgress,
 } from '@alfa-client/bescheid-shared';
 import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import {
@@ -33,12 +34,22 @@ export class VorgangDetailBescheidenResultComponent implements OnInit {
   public bescheidDocumentFile$: Observable<StateResource<BinaryFileResource>> = of(
     createEmptyStateResource<BinaryFileResource>(),
   );
+  public bescheidDocument$: Observable<StateResource<DocumentResource>> = of(
+    createEmptyStateResource<DocumentResource>(),
+  );
+  public isPostfachConfigured$: Observable<boolean>;
 
   public saveAndSendInProgress$: Observable<StateResource<CommandResource>> = of(
     createEmptyStateResource<CommandResource>(),
   );
 
-  public readonly bescheidSendBy = BescheidSendBy;
+  public uploadBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({
+    loading: false,
+  });
+
+  public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({
+    loading: false,
+  });
 
   constructor(
     private bescheidService: BescheidService,
@@ -48,6 +59,12 @@ export class VorgangDetailBescheidenResultComponent implements OnInit {
   ngOnInit(): void {
     this.bescheidDraftStateResource$ = this.bescheidService.getBescheidDraft();
     this.bescheidDocumentFile$ = this.bescheidService.getBescheidDocumentFile();
+    this.uploadBescheidDocumentInProgress$ =
+      this.bescheidService.getUploadBescheidDocumentInProgress();
+    this.createBescheidDocumentInProgress$ =
+      this.bescheidService.getCreateBescheidDocumentInProgress();
+    this.bescheidDocument$ = this.bescheidService.getBescheidDocument();
+    this.isPostfachConfigured$ = this.bescheidService.isPostfachConfigured();
 
     this.activeStep$ = this.formService.getActiveStep();
     this.bescheid$ = this.formService.getBescheidChanges();
@@ -58,7 +75,12 @@ export class VorgangDetailBescheidenResultComponent implements OnInit {
     this.bescheidService.deleteBescheidDocument();
   }
 
-  public saveAndSend(bescheidDraft: BescheidResource): void {
+  public saveAndSendManually(bescheidDraft: BescheidResource): void {
+    this.formService.clearNachricht();
+    this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft);
+  }
+
+  public saveAndSendWithNachricht(bescheidDraft: BescheidResource): void {
     this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft);
   }
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html
index beceda0d3be96d70591eb81f22ae37fe787ea855..0755d974036beed033db585e4fd65985ee013ce9 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html
@@ -1,9 +1,9 @@
 <ng-container *ngIf="bescheidDraftStateResource.resource as bescheidDraft">
   <div class="mt-4">
     <ods-button
-      *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_BESCHEID_DOCUMENT"
+      *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_DOCUMENT"
       class="w-72"
-      [isLoading]="createBescheidDocumentInProgress$ | async"
+      [isLoading]="(createBescheidDocumentInProgress$ | async).loading"
       (click)="createBescheidDocument()"
       data-test-id="create-bescheid-document-button"
     >
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts
index 36b7f53498bcb23a40cbb3aecb91a618533c0f92..79731c5661bc0d85b66cb78fd6eaabdfa2c6f839 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts
@@ -60,7 +60,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => {
   describe('create bescheid document button', () => {
     beforeEach(() => {
       component.bescheidDraftStateResource = createStateResource(
-        createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]),
+        createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]),
       );
 
       fixture.detectChanges();
@@ -81,7 +81,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => {
 
     it('should be visible if link is present', () => {
       component.bescheidDraftStateResource = createStateResource(
-        createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]),
+        createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]),
       );
       fixture.detectChanges();
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts
index d0d0173bce7b54596f033a708a0eaab4b0a1c2f9..1fba2f97430d7795157fa9d632d44acf0e7d17ac 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts
@@ -1,4 +1,9 @@
-import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import {
+  BescheidLinkRel,
+  BescheidResource,
+  BescheidService,
+  UploadFileInProgress,
+} from '@alfa-client/bescheid-shared';
 import { StateResource } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
 import { Observable, of } from 'rxjs';
@@ -10,7 +15,9 @@ import { Observable, of } from 'rxjs';
 export class VorgangDetailBescheidenBescheidAutomatischErstellenComponent {
   @Input() public bescheidDraftStateResource: StateResource<BescheidResource>;
 
-  public createBescheidDocumentInProgress$: Observable<boolean> = of(false);
+  public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({
+    loading: false,
+  });
 
   public readonly bescheidLinkRel = BescheidLinkRel;
 
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html
index 7f70f0144fdb33feb761e3b7465571e6f3b10ecd..3f8d987a08ba92b5140bba08a7f7012c1ecb9df5 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html
@@ -1,7 +1,7 @@
 <div [formGroup]="formService.form">
   <ozgcloud-single-file-upload-editor
     *ngIf="bescheidDraftStateResource.resource | hasLink: bescheidLinkRel.UPLOAD_BESCHEID_FILE"
-    [uploadInProgress]="uploadDocumentFileInProgress$ | async"
+    [uploadInProgress]="(uploadDocumentFileInProgress$ | async).loading"
     class="w-72"
     attr.data-test-id="vorgang-bescheiden-upload-editor"
     [formControlName]="formServiceClass.FIELD_BESCHEID_DOCUMENT"
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts
index 775b3923baff50eff59275b2abb6bf9cd2446ca3..5393ff9750ee988022d563db57a7b5691d4ed77f 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts
@@ -1,4 +1,9 @@
-import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import {
+  BescheidLinkRel,
+  BescheidResource,
+  BescheidService,
+  UploadFileInProgress,
+} from '@alfa-client/bescheid-shared';
 import { StateResource, isNotNil } from '@alfa-client/tech-shared';
 import { Component, Input, OnDestroy, OnInit } from '@angular/core';
 import { ResourceUri } from '@ngxp/rest';
@@ -14,7 +19,7 @@ import { BescheidenFormService } from '../../../../bescheiden.formservice';
 export class VorgangDetailBescheidenDokumentHochladenComponent implements OnInit, OnDestroy {
   @Input() bescheidDraftStateResource: StateResource<BescheidResource>;
 
-  public uploadDocumentFileInProgress$: Observable<boolean> = of(false);
+  public uploadDocumentFileInProgress$: Observable<UploadFileInProgress> = of({ loading: false });
 
   public readonly formServiceClass = BescheidenFormService;
   public readonly bescheidLinkRel = BescheidLinkRel;
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
index e766aa38002e0187f7f03fda8841d6fc603dda4e..837545e68b34902a10953df5d1b9961e71ce504d 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
@@ -76,6 +76,7 @@ import { VorgangDetailBackButtonComponent } from './vorgang-detail-page/vorgang-
 import { VorgangDetailBescheidenFormErrorComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-form-error/vorgang-detail-bescheiden-form-error.component';
 import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component';
 import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component';
+import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component';
 import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component';
 import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component';
 import { VorgangDetailBescheidenStepButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-button/vorgang-detail-bescheiden-step-button.component';
@@ -188,6 +189,7 @@ const routes: Routes = [
     VorgangDetailBescheidenResultAttachmentsComponent,
     VorgangDetailBescheidenFormErrorComponent,
     VorgangDetailBescheidenBescheidVersendenComponent,
+    VorgangDetailBescheidenResultNachrichtComponent,
   ],
   exports: [
     VorgangDetailAntragstellerComponent,
diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts
index 4501f9dd24a6281055e309eb04f5c211161f2e8e..41d1e94862b57a486bf7129415a25a1906781dc3 100644
--- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts
+++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts
@@ -21,9 +21,19 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Vorgang } from '@alfa-client/vorgang-shared';
-import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
-import { getAktenzeichenText, VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN } from './vorgang-util';
+import { EMPTY_STRING } from '@alfa-client/tech-shared';
+import { Antragsteller, Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import {
+  createAntragsteller,
+  createEingang,
+  createVorgangResource,
+  createVorgangWithEingangResource,
+} from 'libs/vorgang-shared/test/vorgang';
+import {
+  VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN,
+  getAktenzeichenText,
+  getEmpfaenger,
+} from './vorgang-util';
 
 describe('Vorgang Util', () => {
   describe('getAktenzeichenText', () => {
@@ -43,4 +53,58 @@ describe('Vorgang Util', () => {
       expect(result).toEqual(VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN);
     });
   });
+
+  describe('getEmpfaenger', () => {
+    it('should return nachname only if exists', () => {
+      const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined };
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createWithAntragsteller(antragsteller);
+
+      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);
+
+      expect(empfaenger).toEqual(antragsteller.nachname);
+    });
+
+    it('should return vorname only if exists', () => {
+      const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined };
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createWithAntragsteller(antragsteller);
+
+      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);
+
+      expect(empfaenger).toEqual(antragsteller.vorname);
+    });
+
+    it('should return name and vorname if exists', () => {
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createVorgangWithEingangResource();
+
+      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);
+
+      expect(empfaenger).toEqual(
+        `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`,
+      );
+    });
+
+    it('should return empty string if none exists', () => {
+      const antragsteller: Antragsteller = {
+        ...createAntragsteller(),
+        nachname: undefined,
+        vorname: undefined,
+      };
+      const vorgangWithEingangResource: VorgangWithEingangResource =
+        createWithAntragsteller(antragsteller);
+
+      const empfaenger: string = getEmpfaenger(vorgangWithEingangResource);
+
+      expect(empfaenger).toEqual(EMPTY_STRING);
+    });
+
+    function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource {
+      return {
+        ...createVorgangWithEingangResource(),
+        eingang: { ...createEingang(), antragsteller },
+      };
+    }
+  });
 });
diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts
index 97b7913c19a9f5b76b209c105dcb9934a797ff52..5d90f07fe9a46e9c19ab44294aab7ffb32f7138b 100644
--- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts
+++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts
@@ -21,10 +21,23 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Vorgang } from '@alfa-client/vorgang-shared';
+import { EMPTY_STRING } from '@alfa-client/tech-shared';
+import { Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 
 export const VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN = 'kein Aktenzeichen';
 
 export function getAktenzeichenText(vorgang: Vorgang): string {
   return vorgang.aktenzeichen || VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN;
 }
+
+export function getEmpfaenger(vorgangWithEingangResource: VorgangWithEingangResource): string {
+  return `${getVorname(vorgangWithEingangResource)} ${getNachname(vorgangWithEingangResource)}`.trim();
+}
+
+function getVorname(vorgangWithEingangResource: VorgangWithEingangResource): string {
+  return vorgangWithEingangResource.eingang.antragsteller?.vorname ?? EMPTY_STRING;
+}
+
+function getNachname(vorgangWithEingangResource: VorgangWithEingangResource): string {
+  return vorgangWithEingangResource.eingang.antragsteller?.nachname ?? EMPTY_STRING;
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
index 365d7e268306e05d8025a8a9e7c6937186804d53..8ebf3d388dd200bb2d9ee9a5d57f817ab4a3817a 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java
@@ -23,12 +23,15 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc
 	static final String REL_UPLOAD_ATTACHMENT = "uploadAttachment";
 	static final String REL_ATTACHMENTS = "attachments";
 	static final String REL_UPDATE = "update";
-	static final String REL_CREATE_BESCHEID_DOCUMENT = "createBescheidDocument";
+	static final String REL_CREATE_DOCUMENT = "createDocument";
+	static final String REL_CREATE_DOCUMENT_FROM_FILE = "createDocumentFromFile";
 	static final String REL_BESCHEID_DOCUMENT = "bescheidDocument";
 	static final String REL_SEND = "send";
 
 	private static final Predicate<Bescheid> HAS_ATTACHMENTS = bescheid -> !bescheid.getAttachments().isEmpty();
 
+	private final BescheidService bescheidService;
+
 	@Override
 	public EntityModel<Bescheid> toModel(Bescheid bescheid) {
 		var selfLink = linkTo(methodOn(BescheidController.class).getDraft(bescheid.getVorgangId()));
@@ -49,7 +52,9 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc
 				.ifMatch(HAS_ATTACHMENTS)
 				.addLink(attachmentsLink.withRel(REL_ATTACHMENTS))
 				.addLink(createCommandLink.withRel(REL_UPDATE))
-				.addLink(createCommandLink.withRel(REL_CREATE_BESCHEID_DOCUMENT))
+				.ifMatch(bescheidService::canCreateBescheidDocumentAutomatically)
+				.addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT))
+				.addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE))
 				.addLink(createCommandLink.withRel(REL_SEND))
 				.buildModel();
 	}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
index c68d00855d06ecfe745b0d0d63f6c0435eea804d..52a882303b0466a417fa37894702a4a49bf655e8 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java
@@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
 import de.ozgcloud.alfa.common.GrpcUtil;
 import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
 import de.ozgcloud.bescheid.GrpcBescheid;
+import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
 import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest;
 import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse;
 import net.devh.boot.grpc.client.inject.GrpcClient;
@@ -35,4 +36,9 @@ class BescheidRemoteService {
 	Optional<GrpcBescheid> getBescheidFromResponse(GrpcGetBescheidDraftResponse response) {
 		return response.hasBescheid() ? Optional.of(response.getBescheid()) : Optional.empty();
 	}
+
+	public boolean canCreateBescheidDocument() {
+		var response = bescheidServiceStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build());
+		return response.hasFeatures() && response.getFeatures().getCanCreateBescheidDocument();
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
index 67bef19968599583c09c5ab5ecde6b241aed3a4d..5d8bbe22a333e181203dd2b445c5d38a0f51da2a 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java
@@ -15,4 +15,8 @@ public class BescheidService {
 	public Optional<Bescheid> getBescheidDraft(String vorgangId) {
 		return remoteService.getBescheidDraft(vorgangId);
 	}
+
+	public boolean canCreateBescheidDocumentAutomatically() {
+		return remoteService.canCreateBescheidDocument();
+	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java
index bcc71eaf47a9f1d83bcd198df36b3dbe908587ed..34d8fd74dc506dd00b6222584b6674ce934a6259 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java
@@ -1,18 +1,13 @@
 package de.ozgcloud.alfa.historie;
 
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import org.springframework.stereotype.Service;
-
 import de.ozgcloud.alfa.common.command.Command;
 import de.ozgcloud.alfa.common.command.CommandService;
 import de.ozgcloud.alfa.common.user.UserService;
-import de.ozgcloud.alfa.vorgang.Eingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.ozgcloud.alfa.vorgang.ZustaendigeStelle;
+import java.util.List;
+import java.util.stream.Stream;
 import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
 
 @Service
 @RequiredArgsConstructor
@@ -34,27 +29,24 @@ public class VorgangChangeHistoryService {
 	Stream<VorgangChange> createStatusChangeHistory(VorgangWithEingang vorgang, List<Command> commands) {
 		return StatusChangeHistoryBuilder.builder()
 				.withCommands(commands)
-				.withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang))
+				.withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID())
 				.build();
 	}
 
 	Stream<VorgangChange> createAktenzeichenChangeHistory(VorgangWithEingang vorgang, List<Command> commands) {
 		return AktenzeichenChangeHistoryBuilder.builder()
 				.withCommands(commands)
-				.withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang))
+				.withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID())
 				.build();
 	}
 
 	Stream<VorgangChange> createAssignedUserChangeHistory(VorgangWithEingang vorgang, List<Command> commands) {
 		return AssignedUserChangeHistoryBuilder.builder()
 				.withCommands(commands)
-				.withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang))
+				.withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID())
 				.withUserProfileCache(UserProfileCache.create(userService::getById))
 				.build();
 	}
 
-	String getOrganisationseinheitenID(VorgangWithEingang vorgang) {
-		return Optional.ofNullable(vorgang.getEingang()).map(Eingang::getZustaendigeStelle).map(ZustaendigeStelle::getOrganisationseinheitenId)
-				.orElse(null);
-	}
+
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java
index 68d549f5613eaba7386d048e0759e69c4a6cf41c..5c61d0f5d75baed860c3abffbc4cd793bd6509df 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java
@@ -23,12 +23,14 @@
  */
 package de.ozgcloud.alfa.vorgang;
 
+import jakarta.annotation.Nullable;
 import java.time.ZonedDateTime;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import de.ozgcloud.alfa.common.LinkedUserProfileResource;
 import de.ozgcloud.alfa.common.user.UserId;
+import java.util.Optional;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -59,4 +61,13 @@ public class VorgangWithEingang implements Vorgang {
 	private VorgangHead header;
 
 	private Eingang eingang;
+
+	@JsonIgnore
+	@Nullable
+	public String getOrganisationseinheitenID() {
+		return Optional.ofNullable(getEingang())
+				.map(Eingang::getZustaendigeStelle)
+				.map(ZustaendigeStelle::getOrganisationseinheitenId)
+				.orElse(null);
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
index 78d288a3afb3324f1a9c60a9cc9ab07608f5e4df..450d840af3c37898c155029886b6241e1220f679 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java
@@ -2,6 +2,7 @@ package de.ozgcloud.alfa.bescheid;
 
 import static de.ozgcloud.alfa.bescheid.BescheidModelAssembler.*;
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
 
 import java.util.Collections;
 
@@ -9,11 +10,12 @@ 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.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.mockito.Spy;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.IanaLinkRelations;
 import org.springframework.hateoas.Link;
-import org.springframework.hateoas.LinkRelation;
 import org.springframework.web.util.UriTemplate;
 
 import de.ozgcloud.alfa.common.command.CommandController;
@@ -22,8 +24,12 @@ import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 class BescheidModelAssemblerTest {
 
 	@Spy
+	@InjectMocks
 	private BescheidModelAssembler assembler;
 
+	@Mock
+	private BescheidService bescheidService;
+
 	@Nested
 	class TestToModel {
 
@@ -88,10 +94,29 @@ class BescheidModelAssemblerTest {
 		}
 
 		@Test
-		void shouldHaveCreateBescheidDocumentLink() {
+		void shouldHaveCreateDocumentLink() {
+			when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true);
+
 			var model = callToModel();
 
-			assertThat(model.getLink(REL_CREATE_BESCHEID_DOCUMENT)).isPresent().get().extracting(Link::getHref)
+			assertThat(model.getLink(REL_CREATE_DOCUMENT)).isPresent().get().extracting(Link::getHref)
+					.isEqualTo(createCommandLink());
+		}
+
+		@Test
+		void shoulNotdHaveCreateDocumentLink() {
+			when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(false);
+
+			var model = callToModel();
+
+			assertThat(model.getLink(REL_CREATE_DOCUMENT)).isEmpty();
+		}
+
+		@Test
+		void shouldHaveCreateDocumentFromFileLink() {
+			var model = callToModel();
+
+			assertThat(model.getLink(REL_CREATE_DOCUMENT_FROM_FILE)).isPresent().get().extracting(Link::getHref)
 					.isEqualTo(createCommandLink());
 		}
 
@@ -111,16 +136,6 @@ class BescheidModelAssemblerTest {
 					.isEqualTo(String.format("%s/%s", DocumentController.PATH, BescheidTestFactory.BESCHEID_DOCUMENT));
 		}
 
-		@Test
-		void shouldHaveOnlyExpectedLinks() {
-			var model = callToModel();
-
-			assertThat(model.getLinks()).extracting(Link::getRel).containsExactlyInAnyOrder(
-					IanaLinkRelations.SELF, LinkRelation.of(REL_DELETE), LinkRelation.of(REL_UPLOAD_BESCHEID_FILE),
-					LinkRelation.of(REL_UPLOAD_ATTACHMENT), LinkRelation.of(REL_ATTACHMENTS), LinkRelation.of(REL_UPDATE),
-					LinkRelation.of(REL_CREATE_BESCHEID_DOCUMENT), LinkRelation.of(REL_BESCHEID_DOCUMENT), LinkRelation.of(REL_SEND));
-		}
-
 		@Test
 		void shouldHaveSendLink() {
 			var model = callToModel();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
index 8c06cc6275761009a474a91a10488a3aa9ac6143..1a60e85c321546fc174228b0be968448b882e74e 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java
@@ -14,6 +14,8 @@ import org.mockito.Spy;
 
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub;
+import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
+import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse;
 import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest;
 import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse;
 
@@ -119,4 +121,53 @@ class BescheidRemoteServiceTest {
 		}
 	}
 
+	@Nested
+	class TestCanCreateBescheidDocument {
+
+		private final GrpcBescheidManagerConfigRequest request = GrpcBescheidManagerConfigRequestTestFactory.create();
+		private final GrpcBescheidManagerConfigResponse respone = GrpcBescheidManagerConfigResponseTestFactory.create();
+
+		@BeforeEach
+		void setUp() {
+			when(bescheidServiceStub.getConfig(request)).thenReturn(respone);
+		}
+
+		@Test
+		void shouldCallRemoteService() {
+			service.canCreateBescheidDocument();
+
+			verify(bescheidServiceStub).getConfig(request);
+		}
+
+		@Test
+		void shouldReturnTrue() {
+			var canCreate = service.canCreateBescheidDocument();
+
+			assertThat(canCreate).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalseIfNoFeaturesAvailable() {
+			when(bescheidServiceStub.getConfig(request)).thenReturn(GrpcBescheidManagerConfigResponse.newBuilder().build());
+
+			var canCreate = service.canCreateBescheidDocument();
+
+			assertThat(canCreate).isFalse();
+		}
+
+		@Test
+		void shouldReturnFalseIfFeatureDisabled() {
+			var respones = GrpcBescheidManagerConfigResponseTestFactory.createBuilder()
+					.setFeatures(GrpcBescheidManagerFeaturesTestFactory.createBuilder()
+							.setCanCreateBescheidDocument(false)
+							.build())
+					.build();
+			when(bescheidServiceStub.getConfig(request)).thenReturn(respones);
+
+			var canCreate = service.canCreateBescheidDocument();
+
+			assertThat(canCreate).isFalse();
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
index 6241bdce4c6a7c514c9e6273a7235d11736156ba..53b89afb965f0068dc6559753069634a0bac69ee 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java
@@ -7,6 +7,8 @@ import java.util.Optional;
 
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -41,4 +43,25 @@ class BescheidServiceTest {
 			assertThat(result).isEqualTo(remoteServiceResult);
 		}
 	}
+
+	@Nested
+	class TestCanCreateBescheidDocumentAutomatically {
+
+		@Test
+		void shouldCallRemoteService() {
+			service.canCreateBescheidDocumentAutomatically();
+
+			verify(remoteService).canCreateBescheidDocument();
+		}
+
+		@ParameterizedTest
+		@ValueSource(booleans = { true, false })
+		void shouldRetrun(boolean canCreateBescheidDocument) {
+			when(remoteService.canCreateBescheidDocument()).thenReturn(canCreateBescheidDocument);
+
+			var canCreateAutomatically = service.canCreateBescheidDocumentAutomatically();
+
+			assertThat(canCreateAutomatically).isEqualTo(canCreateBescheidDocument);
+		}
+	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3b7518632401a74dadba71ea91a0da1b09bfd61
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.alfa.bescheid;
+
+import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest;
+
+public class GrpcBescheidManagerConfigRequestTestFactory {
+
+	public static GrpcBescheidManagerConfigRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcBescheidManagerConfigRequest.Builder createBuilder() {
+		return GrpcBescheidManagerConfigRequest.newBuilder();
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..72a9bcb5fe4267782c78acf48703c9f580e66a5c
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.alfa.bescheid;
+
+import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse;
+
+public class GrpcBescheidManagerConfigResponseTestFactory {
+
+	public static GrpcBescheidManagerConfigResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcBescheidManagerConfigResponse.Builder createBuilder() {
+		return GrpcBescheidManagerConfigResponse.newBuilder().setFeatures(GrpcBescheidManagerFeaturesTestFactory.create());
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc745ca20b8507af338b860735958df1e828640a
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java
@@ -0,0 +1,16 @@
+package de.ozgcloud.alfa.bescheid;
+
+import de.ozgcloud.bescheid.GrpcBescheidManagerFeatures;
+
+public class GrpcBescheidManagerFeaturesTestFactory {
+
+	public static final boolean CAN_CREATE_BESCHEID = true;
+
+	public static GrpcBescheidManagerFeatures create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcBescheidManagerFeatures.Builder createBuilder() {
+		return GrpcBescheidManagerFeatures.newBuilder().setCanCreateBescheidDocument(CAN_CREATE_BESCHEID);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java
index f582a35ec8ec508c9219aa47705eed47070709a2..451b3e9b0d1fceb0cfcced85d257679f7466b837 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java
@@ -6,7 +6,6 @@ import static org.mockito.Mockito.*;
 
 import java.time.LocalDateTime;
 import java.util.List;
-import java.util.UUID;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
@@ -29,14 +28,13 @@ import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserProfile;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.common.user.UserService;
-import de.ozgcloud.alfa.vorgang.EingangTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory;
 
 public class VorgangChangeHistoryServiceTest {
 
-	private static final String ORGANISATIONSEINHEITEN_ID = UUID.randomUUID().toString();
+	private static final String ORGANISATIONSEINHEITEN_ID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID;
 
 	private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 	private final Command command0105 = ChangeHistoryBuilderTest.commandFinishedAt(LocalDateTime.of(2023, 5, 1, 12, 0));
@@ -122,7 +120,6 @@ public class VorgangChangeHistoryServiceTest {
 		void init() {
 			mockBuilderFactoryMethod();
 			mockBuilderWiths();
-			mockGetOrganisationseinheitenID();
 		}
 
 		private void mockBuilderFactoryMethod() {
@@ -179,7 +176,6 @@ public class VorgangChangeHistoryServiceTest {
 		void init() {
 			mockBuilderFactoryMethod();
 			mockBuilderWiths();
-			mockGetOrganisationseinheitenID();
 		}
 
 		private void mockBuilderFactoryMethod() {
@@ -244,7 +240,6 @@ public class VorgangChangeHistoryServiceTest {
 			mockBuilderFactoryMethod();
 			mockBuilderWiths();
 			mockUserProfileCacheFactoryMethod();
-			mockGetOrganisationseinheitenID();
 		}
 
 		private void mockBuilderFactoryMethod() {
@@ -318,37 +313,4 @@ public class VorgangChangeHistoryServiceTest {
 		}
 	}
 
-	@Nested
-	class TestGetOrganisationseinheitenID {
-
-		@Test
-		void shouldReturnNullWhenEingangIsNull() {
-			var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(null).build();
-
-			var id = service.getOrganisationseinheitenID(vorgang);
-
-			assertThat(id).isNull();
-		}
-
-		@Test
-		void shouldReturnNullIfZustaendigeStelleIsNull() {
-			var eingang = EingangTestFactory.createBuilder().zustaendigeStelle(null).build();
-			var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build();
-
-			var id = service.getOrganisationseinheitenID(vorgang);
-
-			assertThat(id).isNull();
-		}
-
-		@Test
-		void shouldReturnOrganisationseinheitenID() {
-			var id = service.getOrganisationseinheitenID(vorgang);
-
-			assertThat(id).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
-		}
-	}
-
-	private void mockGetOrganisationseinheitenID() {
-		when(service.getOrganisationseinheitenID(vorgang)).thenReturn(ORGANISATIONSEINHEITEN_ID);
-	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java
index db4252d5187923d1f7b22b194767a3d04738db1c..dc82e3ab1ca130feea7c764a1685e10d5f18c7c1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java
@@ -27,11 +27,11 @@ import java.time.ZonedDateTime;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
 import com.thedeanda.lorem.Lorem;
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.ozgcloud.alfa.common.TestUtils;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory;
 import de.ozgcloud.alfa.common.binaryfile.FileId;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
@@ -41,7 +41,7 @@ public class KommentarTestFactory {
 
 	private static Lorem lorem = LoremIpsum.getInstance();
 
-	public static final String ID = UUID.randomUUID().toString();
+	public static final String ID = TestUtils.createMongoDbObjectId();
 	public static final long VERSION = 73;
 
 	public static final String CREATED_BY = UserProfileTestFactory.ID.toString();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e08ec5e72558100a51e8ea645dabb2fb0492adb1
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java
@@ -0,0 +1,66 @@
+package de.ozgcloud.alfa.vorgang;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+class VorgangWithEingangTest {
+
+	@Test
+	void shouldGetOrganisationseinheitWhenSet() {
+		VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		String organisationseinheitenID = vorgang.getOrganisationseinheitenID();
+
+		assertThat(organisationseinheitenID).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
+	}
+
+	@Test
+	void shouldNotGetOrganisationseinheitWithEingangUnset() {
+		VorgangWithEingang vorgang = createVorgangWithNullEingang();
+
+		String organisationseinheitenID = vorgang.getOrganisationseinheitenID();
+
+		assertThat(organisationseinheitenID).isNull();
+	}
+
+	@Test
+	void shouldNotGetOrganisationseinheitWithZustaendigeStelleUnset() {
+		VorgangWithEingang vorgang = createVorgangWithNullZustaendigeStelle();
+
+		String organisationseinheitenID = vorgang.getOrganisationseinheitenID();
+
+		assertThat(organisationseinheitenID).isNull();
+	}
+
+	@Test
+	void shouldNotGetOrganisationseinheitWithOrganisationseinheitUnset() {
+		VorgangWithEingang vorgang = createVorgangWithNullOrganisationseinheit();
+
+		String organisationseinheitenID = vorgang.getOrganisationseinheitenID();
+
+		assertThat(organisationseinheitenID).isNull();
+	}
+
+	private VorgangWithEingang createVorgangWithNullEingang() {
+		return createVorgangWithEingang(null);
+	}
+
+	private VorgangWithEingang createVorgangWithNullZustaendigeStelle() {
+		Eingang eingang = EingangTestFactory.createBuilder().zustaendigeStelle(null).build();
+
+		return createVorgangWithEingang(eingang);
+	}
+
+	private VorgangWithEingang createVorgangWithNullOrganisationseinheit() {
+		ZustaendigeStelle zustaendigeStelle = ZustaendigeStelle.builder().organisationseinheitenId(null).build();
+		Eingang eingang = EingangTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build();
+
+		return createVorgangWithEingang(eingang);
+	}
+
+	private VorgangWithEingang createVorgangWithEingang(Eingang eingang) {
+		return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build();
+	}
+
+}
\ No newline at end of file
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java
index 146d1199194d1f86a9070058161b5d8a6127dac7..2e36dd77eb1da1e8f721b66d5e2d74c86484ee2a 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java
@@ -1,5 +1,8 @@
 package de.ozgcloud.alfa.kommentar;
 
+import de.ozgcloud.alfa.common.DateConverter;
+import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder;
+import de.ozgcloud.alfa.common.UUIDConverter;
 import java.util.Collections;
 import java.util.List;
 
@@ -8,16 +11,27 @@ import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.xoev.xdomea.AnlageDokumentType;
 import de.xoev.xdomea.DokumentType;
+import de.xoev.xdomea.FormatType;
+import de.xoev.xdomea.HistorienProtokollInformationType;
+import de.xoev.xdomea.IdentifikationObjektType;
+import de.xoev.xdomea.VersionType;
+import java.util.Collections;
+import java.util.List;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 class DokumentTypeBuilder {
 
 	static final String TYP = "Notiz";
+	static final String AKTION = "CREATE_KOMMENTAR";
 
 	private Kommentar kommentar;
 	private List<OzgFile> kommentarAttachments = Collections.emptyList();
+	private String authorFullName;
+	private String organisationseinheitenID;
 
 	public static DokumentTypeBuilder builder() {
 		return new DokumentTypeBuilder();
@@ -33,12 +47,23 @@ class DokumentTypeBuilder {
 		return this;
 	}
 
+	public DokumentTypeBuilder withAuthorFullName(String authorFullName) {
+		this.authorFullName = authorFullName;
+		return this;
+	}
+
+	public DokumentTypeBuilder withOrganisationseinheitenID(String organisationseinheitenID) {
+		this.organisationseinheitenID = organisationseinheitenID;
+		return this;
+	}
+
 	public DokumentType build() {
 		var dokumentType = new DokumentType();
 		dokumentType.setIdentifikation(IdentifikationObjektTypeBuilder.builder()
 				.withObjectID(kommentar.getId())
 				.build());
 		dokumentType.setTyp(TYP);
+		dokumentType.getHistorienProtokollInformation().add(createHistorie());
 		kommentarAttachments.stream().map(this::createAnlage).forEach(dokumentType.getAnlage()::add);
 		return dokumentType;
 	}
@@ -47,4 +72,18 @@ class DokumentTypeBuilder {
 		return AnlageDokumentTypeBuilder.builder().withOzgFile(ozgFile).build();
 	}
 
+	HistorienProtokollInformationType createHistorie() {
+		var historienProtokollInformationType = new HistorienProtokollInformationType();
+		historienProtokollInformationType.setMetadatumName(kommentar.getText());
+		historienProtokollInformationType.setAkteur(createAkteur());
+		historienProtokollInformationType.setDatumUhrzeit(DateConverter.toXmlGregorianCalendar(kommentar.getCreatedAt()));
+		historienProtokollInformationType.setAktion(AKTION);
+		return historienProtokollInformationType;
+	}
+
+	String createAkteur() {
+		return this.authorFullName + "; " + this.organisationseinheitenID;
+	}
+
+
 }
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java
index a300e4dcfd3e9d22078efb2786779af3d30427ca..1d4d9e209314cb629342e45e5c0ca18ab9e57fb1 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java
@@ -1,14 +1,16 @@
 package de.ozgcloud.alfa.kommentar;
 
 import java.util.List;
+import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
 import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.user.UserId;
+import de.ozgcloud.alfa.common.user.UserService;
 import de.ozgcloud.alfa.kommentar.KommentarsExportData.KommentarsExportDataBuilder;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
-import de.xoev.xdomea.DokumentType;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
@@ -17,24 +19,49 @@ public class ExportKommentarService {
 
 	private final KommentarService kommentarService;
 	private final BinaryFileService binaryFileService;
+	private final UserService userService;
 
 	public KommentarsExportData createExportData(VorgangWithEingang vorgang) {
-		var exportDataBuilder = KommentarsExportData.builder();
-		kommentarService.findByVorgangId(vorgang.getId())
-				.forEach(kommentar -> addKommentarToBuilder(kommentar, exportDataBuilder));
-		return exportDataBuilder.build();
+		KommentarsExportDataBuilder builder = KommentarsExportData.builder();
+		getKommentare(vorgang)
+				.map(kommentar -> createKommentarExportData(vorgang, kommentar))
+				.forEach(kommentarExportData -> addKommentarExportData(kommentarExportData, builder));
+		return builder.build();
 	}
 
-	void addKommentarToBuilder(Kommentar kommentar, KommentarsExportDataBuilder builder) {
-		var attachments = binaryFileService.getFiles(kommentar.getAttachments()).toList();
-		builder.dokumentType(buildDokumentType(kommentar, attachments));
-		builder.attachments(attachments);
+	KommentarExportData createKommentarExportData(VorgangWithEingang vorgang, Kommentar kommentar){
+		return new KommentarExportData(vorgang.getOrganisationseinheitenID(), kommentar);
 	}
 
-	DokumentType buildDokumentType(Kommentar kommentar, List<OzgFile> attachments) {
-		return DokumentTypeBuilder.builder()
+	void addKommentarExportData(KommentarExportData kommentarExportData, KommentarsExportDataBuilder builder) {
+		List<OzgFile> attachments = getAttachments(kommentarExportData.kommentar);
+
+		var dokumentType = DokumentTypeBuilder.builder()
 				.withKommentarAttachments(attachments)
-				.withKommentar(kommentar)
+				.withKommentar(kommentarExportData.kommentar)
+				.withOrganisationseinheitenID(kommentarExportData.organisationsEinheitenID)
+				.withAuthorFullName(getAuthorFullName(kommentarExportData.kommentar))
 				.build();
+
+		builder.dokumentType(dokumentType);
+		builder.attachments(attachments);
+	}
+
+	List<OzgFile> getAttachments(Kommentar kommentar) {
+		return binaryFileService.getFiles(kommentar.getAttachments()).toList();
+	}
+
+	String getAuthorFullName(Kommentar kommentar) {
+		return userService.getById(UserId.from(kommentar.getCreatedBy())).getFullName();
+	}
+
+	Stream<Kommentar> getKommentare(VorgangWithEingang vorgang) {
+		return kommentarService.findByVorgangId(vorgang.getId());
+	}
+
+	record KommentarExportData(
+			String organisationsEinheitenID,
+			Kommentar kommentar
+	) {
 	}
 }
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java
similarity index 87%
rename from alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java
rename to alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java
index ddf72dde4fcb9a47ddd3e1275794826552a6e2ac..425a9731e62f3055a703ef2aecd623ba5603ea83 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java
@@ -1,4 +1,4 @@
-package de.ozgcloud.alfa.export;
+package de.ozgcloud.alfa.common;
 
 import de.xoev.xdomea.HistorienProtokollInformationType;
 
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java
index 567c55f91a45a5929001e4492dad0fe6951732d9..60f57250052a7d1f28655002f3fff6324fbe9f93 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java
@@ -27,6 +27,7 @@ import org.mockito.MockedStatic;
 import org.mockito.Spy;
 
 import de.ozgcloud.alfa.common.ExportFilenameGenerator;
+import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.common.TestUtils;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java
index d7fa4e55e249cc9e0539588c739baf8da631909c..f7fda37ca90273d24630868b4b1a940ec32b9e31 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java
@@ -6,6 +6,7 @@ import java.util.List;
 
 import org.junit.jupiter.api.Test;
 
+import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangTypeTestFactory;
 import de.xoev.xdomea.DokumentType;
 import de.xoev.xdomea.HistorienProtokollInformationType;
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java
index 3482a58b25c0efd0a7f43d438d137555cbae9a76..60f66c5e2cdfff4024892a451d0aaa48abd73b4f 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java
@@ -18,7 +18,7 @@ import com.thedeanda.lorem.LoremIpsum;
 
 import de.ozgcloud.alfa.common.DateConverter;
 import de.ozgcloud.alfa.common.command.CommandOrder;
-import de.ozgcloud.alfa.export.HistorienProtokollInformationTypeTestFactory;
+import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 import de.xoev.xdomea.HistorienProtokollInformationType;
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java
index 9f05b1bc42cf44880d831bf8915a4ab513bc601b..e09747b371014cfb5b9b776f8fed4a533649421e 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java
@@ -5,6 +5,8 @@ import static org.mockito.Mockito.*;
 
 import java.util.List;
 
+import javax.xml.datatype.XMLGregorianCalendar;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -13,13 +15,21 @@ import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.Spy;
 
+import com.thedeanda.lorem.LoremIpsum;
+
 import de.ozgcloud.alfa.common.AnlageDokumentTypeBuilder;
 import de.ozgcloud.alfa.common.AnlageDokumentTypeTestFactory;
+import de.ozgcloud.alfa.common.DateConverter;
+import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
+import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.export.IdentifikationObjektTypeTestFactory;
+import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory;
 import de.xoev.xdomea.AnlageDokumentType;
+import de.xoev.xdomea.DokumentType;
+import de.xoev.xdomea.HistorienProtokollInformationType;
 import de.xoev.xdomea.IdentifikationObjektType;
 
 class DokumentTypeBuilderTest {
@@ -38,12 +48,15 @@ class DokumentTypeBuilderTest {
 		private final OzgFile ozgFile = OzgFileTestFactory.create();
 		private final AnlageDokumentType anlageDokumentType = AnlageDokumentTypeTestFactory.create();
 
+		private final HistorienProtokollInformationType historienProtokollInformationType = HistorienProtokollInformationTypeTestFactory.create();
+
 		@BeforeEach
 		void setUp() {
 			identifikationObjektTypeBuilderMockedStatic = mockStatic(IdentifikationObjektTypeBuilder.class);
 			identifikationObjektTypeBuilderMockedStatic.when(IdentifikationObjektTypeBuilder::builder).thenReturn(identifikationObjektTypeBuilder);
 			when(identifikationObjektTypeBuilder.withObjectID(KommentarTestFactory.ID)).thenReturn(identifikationObjektTypeBuilder);
 			when(identifikationObjektTypeBuilder.build()).thenReturn(identifikationObjektType);
+			doReturn(historienProtokollInformationType).when(builder).createHistorie();
 		}
 
 		@AfterEach
@@ -105,6 +118,28 @@ class DokumentTypeBuilderTest {
 				assertThat(dokumentType.getAnlage()).contains(anlageDokumentType);
 			}
 		}
+
+		@Test
+		void shouldHaveHistorienProtokoll() {
+			DokumentType dokumentType = builder.build();
+
+			assertThat(dokumentType.getHistorienProtokollInformation().get(0)).isEqualTo(historienProtokollInformationType);
+		}
+
+		@Test
+		void shouldHaveOneHistorienProtokoll() {
+			DokumentType dokumentType = builder.build();
+
+			assertThat(dokumentType.getHistorienProtokollInformation()).size().isEqualTo(1);
+		}
+
+		@Test
+		void shouldCreateHistorienProtokoll() {
+			builder.build();
+
+			verify(builder).createHistorie();
+		}
+
 	}
 
 	@Nested
@@ -156,4 +191,88 @@ class DokumentTypeBuilderTest {
 		}
 	}
 
+	@Nested
+	class TestWithOrganisationseinheitenID {
+		@Test
+		void shouldReturnBuilder() {
+			var result = builder.withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
+
+			assertThat(result).isNotNull();
+		}
+	}
+
+	@Nested
+	class TestWithAuthorFullName {
+		@Test
+		void shouldReturnBuilder() {
+			var result = builder.withAuthorFullName(UserProfileTestFactory.FULLNAME);
+
+			assertThat(result).isNotNull();
+		}
+	}
+
+	@Nested
+	class TestCreateHistorie {
+
+		Kommentar kommentar = KommentarTestFactory.create();
+
+		@BeforeEach
+		void setupBuilder() {
+			builder.withKommentar(kommentar);
+		}
+
+		@Test
+		void shouldHaveMetadatumName() {
+			var historie = builder.createHistorie();
+
+			assertThat(historie.getMetadatumName()).isEqualTo(KommentarTestFactory.TEXT);
+		}
+
+		@Test
+		void shouldHaveAkteur() {
+			String expectedAkteurName = LoremIpsum.getInstance().getWords(5);
+			doReturn(expectedAkteurName).when(builder).createAkteur();
+
+			var historie = builder.createHistorie();
+
+			assertThat(historie.getAkteur()).isEqualTo(expectedAkteurName);
+		}
+
+		@Test
+		void shouldHaveDatumUhrzeit() {
+			var historie = builder.createHistorie();
+
+			assertThat(historie.getDatumUhrzeit()).isEqualTo(createExpectedDatumUhrzeit());
+		}
+
+		@Test
+		void shouldHaveAktion() {
+			var historie = builder.createHistorie();
+
+			assertThat(historie).hasFieldOrPropertyWithValue("aktion", DokumentTypeBuilder.AKTION);
+		}
+
+		private XMLGregorianCalendar createExpectedDatumUhrzeit() {
+			return DateConverter.toXmlGregorianCalendar(kommentar.getCreatedAt());
+		}
+	}
+
+	@Nested
+	class TestCreateAkteur {
+		@Test
+		void shouldCreateName() {
+			builder.withAuthorFullName(UserProfileTestFactory.FULLNAME);
+			builder.withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
+
+			String akteur = builder.createAkteur();
+
+			assertThat(akteur).isEqualTo(createExpectedAkteurName());
+		}
+
+		private String createExpectedAkteurName() {
+			return UserProfileTestFactory.FULLNAME + "; " + ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID;
+		}
+
+	}
+
 }
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java
index 249e6637f797caf542e5576fe7978a894db562d9..66d5b18b2bb00cf80d1747fc2fa4804fba28dd48 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java
@@ -1,6 +1,5 @@
 package de.ozgcloud.alfa.kommentar;
 
-import static de.ozgcloud.alfa.common.TestUtils.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
@@ -18,10 +17,15 @@ import org.mockito.Spy;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
 import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.user.UserId;
+import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
+import de.ozgcloud.alfa.common.user.UserService;
 import de.ozgcloud.alfa.export.DokumentTypeTestFactory;
 import de.ozgcloud.alfa.kommentar.KommentarsExportData.KommentarsExportDataBuilder;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory;
 import de.xoev.xdomea.DokumentType;
 
 class ExportKommentarServiceTest {
@@ -35,12 +39,20 @@ class ExportKommentarServiceTest {
 	@Mock
 	private BinaryFileService binaryFileService;
 
+	@Mock
+	private UserService userService;
+
+	private final Kommentar kommentar = KommentarTestFactory.create();
+
 	@Nested
 	class TestCreateExportData {
 
-		private final Kommentar kommentar = KommentarTestFactory.create();
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 		private final KommentarsExportData exportData = KommentarsExportDataTestFactory.create();
 
+		private final ExportKommentarService.KommentarExportData kommentarExportData = new ExportKommentarService.KommentarExportData(
+				ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID, kommentar);
+
 		private MockedStatic<KommentarsExportData> kommentarsExportDataMockedStatic;
 		@Mock
 		private KommentarsExportDataBuilder exportDataBuilder;
@@ -49,8 +61,9 @@ class ExportKommentarServiceTest {
 		void setUp() {
 			kommentarsExportDataMockedStatic = mockStatic(KommentarsExportData.class);
 			kommentarsExportDataMockedStatic.when(KommentarsExportData::builder).thenReturn(exportDataBuilder);
-			when(kommentarService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(kommentar));
-			doNothing().when(service).addKommentarToBuilder(kommentar, exportDataBuilder);
+			when(service.getKommentare(vorgang)).thenReturn(Stream.of(kommentar));
+			when(service.createKommentarExportData(vorgang, kommentar)).thenReturn(kommentarExportData);
+			doNothing().when(service).addKommentarExportData(kommentarExportData, exportDataBuilder);
 			when(exportDataBuilder.build()).thenReturn(exportData);
 		}
 
@@ -60,17 +73,10 @@ class ExportKommentarServiceTest {
 		}
 
 		@Test
-		void shouldLoadKommentare() {
-			callService();
-
-			verify(kommentarService).findByVorgangId(VorgangHeaderTestFactory.ID);
-		}
-
-		@Test
-		void shouldAddKommentarToBuilder() {
+		void shouldAddKommentarExportData() {
 			callService();
 
-			verify(service).addKommentarToBuilder(kommentar, exportDataBuilder);
+			verify(service).addKommentarExportData(eq(kommentarExportData), eq(exportDataBuilder));
 		}
 
 		@Test
@@ -88,31 +94,46 @@ class ExportKommentarServiceTest {
 		}
 
 		private KommentarsExportData callService() {
-			return service.createExportData(VorgangWithEingangTestFactory.create());
+			return service.createExportData(vorgang);
 		}
 	}
 
 	@Nested
-	class TestAddKommentarToBuilder {
+	class TestAddKommentarExportData {
 
-		private final Kommentar kommentar = KommentarTestFactory.create();
+		private final String authorFullName = UserProfileTestFactory.FULLNAME;
 		private final List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE);
 		private final DokumentType dokumentType = DokumentTypeTestFactory.create();
-
+		private final String organisationsEinheitenID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID;
+		private final ExportKommentarService.KommentarExportData kommentarExportData = new ExportKommentarService.KommentarExportData(
+				organisationsEinheitenID,
+				kommentar
+		);
+		private MockedStatic<DokumentTypeBuilder> dokumentTypeBuilderMockedStatic;
+		@Mock
+		private DokumentTypeBuilder dokumentTypeBuilder;
 		@Mock
 		private KommentarsExportDataBuilder exportDataBuilder;
 
 		@BeforeEach
 		void setUp() {
-			mockStreamToList(attachments, stream -> when(binaryFileService.getFiles(KommentarTestFactory.ATTACHMENTS)).thenReturn(stream));
-			doReturn(dokumentType).when(service).buildDokumentType(kommentar, attachments);
-		}
+			doReturn(attachments).when(service).getAttachments(kommentar);
+			doReturn(authorFullName).when(service).getAuthorFullName(kommentar);
 
-		@Test
-		void shouldLoadOzgFilesForKommentareAttachments() {
-			callService();
+			dokumentTypeBuilderMockedStatic = mockStatic(DokumentTypeBuilder.class);
+			dokumentTypeBuilderMockedStatic.when(() -> DokumentTypeBuilder.builder()).thenReturn(dokumentTypeBuilder);
+
+			doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withKommentarAttachments(attachments);
+			doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withKommentar(kommentar);
+			doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder)
+					.withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
+			doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withAuthorFullName(authorFullName);
+			doReturn(dokumentType).when(dokumentTypeBuilder).build();
+		}
 
-			verify(binaryFileService).getFiles(KommentarTestFactory.ATTACHMENTS);
+		@AfterEach
+		void tearDown() {
+			dokumentTypeBuilderMockedStatic.close();
 		}
 
 		@Test
@@ -129,58 +150,110 @@ class ExportKommentarServiceTest {
 			verify(exportDataBuilder).attachments(attachments);
 		}
 
+		@Test
+		void shouldSetOzgFile() {
+			callService();
+
+			verify(dokumentTypeBuilder).withKommentarAttachments(attachments);
+		}
+
+		@Test
+		void shouldSetKommentar() {
+			callService();
+
+			verify(dokumentTypeBuilder).withKommentar(kommentar);
+		}
+
+		@Test
+		void shouldSetOrganisationseinheitID() {
+			callService();
+
+			verify(dokumentTypeBuilder).withOrganisationseinheitenID(organisationsEinheitenID);
+		}
+
+		@Test
+		void shouldReturnAuthorFullName() {
+			callService();
+
+			verify(dokumentTypeBuilder).withAuthorFullName(authorFullName);
+		}
+
+		@Test
+		void shouldBuildDokumentType() {
+			callService();
+
+			verify(dokumentTypeBuilder).build();
+		}
+
 		private void callService() {
-			service.addKommentarToBuilder(kommentar, exportDataBuilder);
+			service.addKommentarExportData(kommentarExportData, exportDataBuilder);
 		}
 	}
 
 	@Nested
-	class TestbBuildDokumentType {
+	class TestGetAttachments {
 
-		private final Kommentar kommentar = KommentarTestFactory.create();
-		private final List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE);
+		@Test
+		void shouldGetFiles() {
+			service.getAttachments(kommentar);
 
-		private MockedStatic<DokumentTypeBuilder> dokumentTypeBuilderMockedStatic;
-		@Mock
-		private DokumentTypeBuilder dokumentTypeBuilder;
+			verify(binaryFileService).getFiles(KommentarTestFactory.ATTACHMENTS);
+		}
 
-		@BeforeEach
-		void setUp() {
-			dokumentTypeBuilderMockedStatic = mockStatic(DokumentTypeBuilder.class);
-			dokumentTypeBuilderMockedStatic.when(DokumentTypeBuilder::builder).thenReturn(dokumentTypeBuilder);
-			when(dokumentTypeBuilder.withKommentarAttachments(attachments)).thenReturn(dokumentTypeBuilder);
-			when(dokumentTypeBuilder.withKommentar(kommentar)).thenReturn(dokumentTypeBuilder);
-			when(dokumentTypeBuilder.build()).thenReturn(KommentarsExportDataTestFactory.DOKUMENT_TYPE);
+		@Test
+		void shouldReturnAttachments() {
+			List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE);
+			when(binaryFileService.getFiles(KommentarTestFactory.ATTACHMENTS)).thenReturn(attachments.stream());
+
+			var result = service.getAttachments(kommentar);
+
+			assertThat(result).isEqualTo(attachments);
 		}
+	}
 
-		@AfterEach
-		void tearDown() {
-			dokumentTypeBuilderMockedStatic.close();
+	@Nested
+	class TestGetAuthorFullName {
+
+		@BeforeEach
+		void init() {
+			when(userService.getById(UserProfileTestFactory.ID)).thenReturn(UserProfileTestFactory.create());
 		}
 
 		@Test
-		void shouldSetOzgFile() {
-			callService();
+		void shouldGetUser() {
+			service.getAuthorFullName(KommentarTestFactory.create());
 
-			verify(dokumentTypeBuilder).withKommentarAttachments(attachments);
+			verify(userService).getById(eq(UserId.from(KommentarTestFactory.CREATED_BY)));
 		}
 
 		@Test
-		void shouldSetKommentar() {
-			callService();
+		void shouldReturnAuthorsFullName() {
+			var authorFullName = service.getAuthorFullName(KommentarTestFactory.create());
 
-			verify(dokumentTypeBuilder).withKommentar(kommentar);
+			assertThat(authorFullName).isEqualTo(UserProfileTestFactory.FULLNAME);
 		}
+	}
+
+	@Nested
+	class TestGetKommentare {
+
+		private VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 
 		@Test
-		void shouldBuildDokumentType() {
-			callService();
+		void shouldFindKommentareByVorgang() {
+			service.getKommentare(vorgang);
 
-			verify(dokumentTypeBuilder).build();
+			verify(kommentarService).findByVorgangId(VorgangHeaderTestFactory.ID);
 		}
 
-		private void callService() {
-			service.buildDokumentType(kommentar, attachments);
+		@Test
+		void shouldReturnKommentare() {
+			when(kommentarService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(kommentar));
+
+			var result = service.getKommentare(vorgang);
+
+			assertThat(result).containsExactly(kommentar);
 		}
 	}
+
 }
\ No newline at end of file
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java
index 0cce8df618915d5214ef4543103b2cbb8cc28f3f..92f88ef542e125d0c0054564bfca590d0b0d5b32 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java
@@ -19,13 +19,13 @@ import org.mockito.Spy;
 import de.ozgcloud.alfa.common.AnlageDokumentTypeBuilder;
 import de.ozgcloud.alfa.common.AnlageDokumentTypeTestFactory;
 import de.ozgcloud.alfa.common.DateConverter;
+import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
 import de.ozgcloud.alfa.common.user.UserProfile;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
-import de.ozgcloud.alfa.export.HistorienProtokollInformationTypeTestFactory;
 import de.ozgcloud.alfa.export.IdentifikationObjektTypeTestFactory;
 import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
 import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory;
diff --git a/pom.xml b/pom.xml
index b061f02e10eb46999380c84b53b3fcc1aedeb8ba..7986fc9ca35ec07cbd7a20e207f108f2cec4274e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
-		<vorgang-manager.version>2.6.0</vorgang-manager.version>
+		<vorgang-manager.version>2.7.0-SNAPSHOT</vorgang-manager.version>
 		<ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version>
 		<user-manager.version>2.2.0</user-manager.version>
 
diff --git a/src/main/helm/templates/keycloak_crd.yaml b/src/main/helm/templates/keycloak_crd.yaml
index b439bc8a6227a7d42b950618ed3548b0f37afd7b..9d55120f30d540c75bb0430a1e24cca8ffb26228 100644
--- a/src/main/helm/templates/keycloak_crd.yaml
+++ b/src/main/helm/templates/keycloak_crd.yaml
@@ -6,9 +6,14 @@ metadata:
   namespace: {{ include "app.namespace" . }}
 spec:
   keep_after_delete: {{ (.Values.sso).keep_after_delete | default false }}
-  displayName: {{ include "app.ssoRealmDisplayName" . }}
-  {{- with .Values.smtpServer }}
+  displayName: {{ include "app.ssoRealmDisplayName" . }}  
+  {{- with ((.Values.sso).keycloak_realm).roles }}
+  realmRoles: 
+{{ toYaml . | indent 4}}
+  {{- end }}
+  {{- with ((.Values.sso).keycloak_realm).smtpServer }}
   smtpServer:
-{{ toYaml . | indent 4 }}
+{{ toYaml . | indent 4}}
   {{- end }}
-{{- end }}
\ No newline at end of file
+{{- end }}
+
diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml
index 6c2e839f4345272a03c3290f870ed91e72d7f153..0e84c312bbfbcf0e243f8b32f2da91f815f353fe 100644
--- a/src/main/helm/values.yaml
+++ b/src/main/helm/values.yaml
@@ -32,6 +32,7 @@ replicaCount: 2 # [default: 2]
 usermanagerName: user-manager
 
 
+
 # env:
 #   overrideSpringProfiles: "oc,prod"
 #   customList: # add name value pair for additional environments
@@ -60,3 +61,5 @@ usermanagerName: user-manager
 #   bundesland: sh
 #   bezeichner: kiel
 #   environment: dev
+
+
diff --git a/src/test/helm/keycloak_crd_test.yaml b/src/test/helm/keycloak_crd_test.yaml
index ffe8329acfa1adf3c622f6e459009a061868d1a2..f3eb4d388fe05c8ca0a4de12eadcd72c621875d2 100644
--- a/src/test/helm/keycloak_crd_test.yaml
+++ b/src/test/helm/keycloak_crd_test.yaml
@@ -80,15 +80,17 @@ tests:
 
   - it: should have smtp server Values 
     set:
-      smtpServer:
-        user: user0
-        from: user0@test.de
-        password: psw
-        fromDisplayName: displayed name
-        starttls: true
-        auth: true
-        port: 587
-        host: host0
+      sso:
+        keycloak_realm:
+          smtpServer:
+            user: user0
+            from: user0@test.de
+            password: psw
+            fromDisplayName: displayed name
+            starttls: true
+            auth: true
+            port: 587
+            host: host0
     asserts:
       - equal:
           path: spec.smtpServer.host
@@ -114,4 +116,24 @@ tests:
       - equal:
           path: spec.smtpServer.fromDisplayName
           value: displayed name
-  
\ No newline at end of file
+  
+  - it: should create realm roles if set
+    set:
+      sso:
+        keycloak_realm:
+          roles:
+            - name: role1
+            - name: role0
+    asserts:
+      - contains:
+          path: spec.realmRoles
+          content: 
+            name: role0
+      - contains:
+          path: spec.realmRoles
+          content: 
+            name: role1
+  - it: should not create realm roles by default
+    asserts:
+      - isNull:
+          path: spec.realmRoles
\ No newline at end of file