diff --git a/alfa-client/apps/alfa-e2e/docker-compose.yml b/alfa-client/apps/alfa-e2e/docker-compose.yml
index c27955be603132e6ae731d4c2a8b6d1acd9341a6..154c8acf1c8bc8699222bda82de1282a1a3b8bd2 100644
--- a/alfa-client/apps/alfa-e2e/docker-compose.yml
+++ b/alfa-client/apps/alfa-e2e/docker-compose.yml
@@ -49,6 +49,13 @@ services:
       - SPRING_DATA_MONGODB_DATABASE=local
       - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE:-local,e2e}
       - LOGGING_CONFIG=classpath:log4j2-local.xml
+      - GRPC_CLIENT_PLUTO_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_CLIENT_VORGANG-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_CLIENT_EMAIL_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_CLIENT_NACHRICHTEN-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_CLIENT_INFO-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_CLIENT_COMMAND-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
+      - GRPC_SERVER_SECURITY_ENABLED=false
     ports:
       - 9091:9090
     depends_on:
@@ -64,6 +71,7 @@ services:
       - GRPC_CLIENT_USER-MANAGER_ADDRESS=static://user-manager:9000
       - GRPC_CLIENT_USER-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
       - GRPC_CLIENT_VORGANG-MANAGER_ADDRESS=static://vorgang-manager:9090
+      - GRPC_CLIENT_VORGANG-MANAGER_NEGOTIATIONTYPE=PLAINTEXT
       - KEYCLOAK_AUTH_SERVER_URL=https://sso.dev.by.ozg-cloud.de
       - KEYCLOAK_REALM=${KEYCLOAK_REALM:-by-e2e-tests-local-dev}
       - KEYCLOAK_RESOURCE=${KEYCLOAK_CLIENT:-alfa}
diff --git a/alfa-client/apps/demo/src/app/app.component.html b/alfa-client/apps/demo/src/app/app.component.html
index 6b8faecc400c23f08eb874d8a45386b27f9e455b..693f99b0c88cd5577c6d4b42c9cab445ab2554a8 100644
--- a/alfa-client/apps/demo/src/app/app.component.html
+++ b/alfa-client/apps/demo/src/app/app.component.html
@@ -149,7 +149,7 @@
           <ods-button-card
             class="w-72"
             [isLoading]="false"
-            text="Bescheid-Dokument"
+            text="Bescheiddokument"
             subText="automatisch erstellen"
           >
             <ods-bescheid-generate-icon icon />
@@ -160,7 +160,7 @@
           <ods-button-card
             class="w-72"
             [isLoading]="true"
-            text="Bescheid-Dokument"
+            text="Bescheiddokument"
             subText="automatisch erstellen"
           >
             <ods-bescheid-generate-icon icon />
@@ -171,7 +171,7 @@
           <ods-button-card
             class="w-72"
             [isLoading]="true"
-            text="Bescheid-Dokument"
+            text="Bescheiddokument"
             subText="automatisch erstellen"
           >
             <ods-bescheid-generate-icon icon />
@@ -182,7 +182,7 @@
           <ods-button-card
             class="w-96"
             [isLoading]="true"
-            text="Bescheid-Dokument und noch mehr"
+            text="Bescheiddokument und noch mehr"
             subText="Subtext in der 2ten Reihe"
           >
             <ods-bescheid-generate-icon icon />
@@ -190,7 +190,7 @@
         </div>
 
         <div class="mt-4">
-          <ods-button-card class="w-72" [isLoading]="true" text="Bescheid-Dokument">
+          <ods-button-card class="w-72" [isLoading]="true" text="Bescheiddokument">
             <ods-bescheid-generate-icon icon />
           </ods-button-card>
         </div>
@@ -199,14 +199,14 @@
           <ods-file-upload-button class="w-72" [isLoading]="false" id="upload117">
             <ods-bescheid-upload-icon icon />
             <ods-spinner-icon spinner size="extra-large" />
-            <p text class="text-center">Bescheid-Dokument<br />hochladen</p></ods-file-upload-button
+            <p text class="text-center">Bescheiddokument<br />hochladen</p></ods-file-upload-button
           >
         </div>
         <div class="mt-4">
           <ods-file-upload-button class="w-72" [isLoading]="true" id="upload117">
             <ods-bescheid-upload-icon icon />
             <ods-spinner-icon spinner size="extra-large" />
-            <p text class="text-center">Bescheid-Dokument<br />hochladen</p></ods-file-upload-button
+            <p text class="text-center">Bescheiddokument<br />hochladen</p></ods-file-upload-button
           >
         </div>
 
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 19cd002222b625f513309a5bf98a72aa9a982e7f..a120af6e0825c4a292affa1f14694eb0c3184411 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
@@ -927,6 +927,14 @@ describe('BescheidService', () => {
         singleCold(createEmptyStateResource()),
       );
     });
+
+    it('should emit empty state resource uploaded attachment', () => {
+      service.init();
+
+      expect(service.getUploadedAttachment()).toBeObservable(
+        singleCold(createEmptyStateResource()),
+      );
+    });
   });
 
   describe('create bescheid document', () => {
@@ -1351,4 +1359,98 @@ describe('BescheidService', () => {
       expect(service.bescheidListService.refresh).toHaveBeenCalled();
     });
   });
+
+  describe('uploadAttachment', () => {
+    const bescheidResource: BescheidResource = createBescheidResource([
+      BescheidLinkRel.UPLOAD_ATTACHMENT,
+    ]);
+    const file: File = createFile();
+    const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource(
+      createBinaryFileResource(),
+    );
+
+    beforeEach(() => {
+      binaryFileService.uploadFile.mockReturnValue(of(binaryFileStateResource));
+      service.handleAttachmentUpload = jest.fn();
+    });
+
+    it('should emit upload in progress', () => {
+      service.uploadAttachment(bescheidResource, file).subscribe();
+
+      expect(service.getUploadAttachmentInProgress()).toBeObservable(
+        singleCold({ fileName: file.name, loading: true } as UploadFileInProgress),
+      );
+    });
+
+    it('should upload file', (done) => {
+      service.uploadAttachment(bescheidResource, file).subscribe(() => {
+        expect(binaryFileService.uploadFile).toBeCalledWith(
+          bescheidResource,
+          BescheidLinkRel.UPLOAD_ATTACHMENT,
+          file,
+          false,
+        );
+        done();
+      });
+    });
+
+    it('should handle attachment upload', (done) => {
+      service.uploadAttachment(bescheidResource, file).subscribe(() => {
+        expect(service.handleAttachmentUpload).toBeCalledWith(binaryFileStateResource);
+        done();
+      });
+    });
+
+    it('should emit uploaded binary file', () => {
+      expect(service.uploadAttachment(bescheidResource, file)).toBeObservable(
+        singleColdCompleted(binaryFileStateResource),
+      );
+    });
+  });
+
+  describe('handleAttachmentUpload', () => {
+    describe('on error', () => {
+      const binaryFileStateResource: StateResource<BinaryFileResource> =
+        createErrorStateResource(createApiError());
+
+      it('should emit upload in progress', () => {
+        service.handleAttachmentUpload(binaryFileStateResource);
+
+        expect(service.getUploadAttachmentInProgress()).toBeObservable(
+          singleCold({
+            loading: false,
+            error: binaryFileStateResource.error,
+          } as UploadFileInProgress),
+        );
+      });
+
+      it('should emit binary file', () => {
+        service.handleAttachmentUpload(binaryFileStateResource);
+
+        expect(service.getUploadedAttachment()).toBeObservable(singleCold(binaryFileStateResource));
+      });
+    });
+
+    describe('on success', () => {
+      const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource(
+        createBinaryFileResource(),
+      );
+
+      it('should emit upload in progress', () => {
+        service.handleAttachmentUpload(binaryFileStateResource);
+
+        expect(service.getUploadAttachmentInProgress()).toBeObservable(
+          singleCold({
+            loading: false,
+          } as UploadFileInProgress),
+        );
+      });
+
+      it('should emit binary file', () => {
+        service.handleAttachmentUpload(binaryFileStateResource);
+
+        expect(service.getUploadedAttachment()).toBeObservable(singleCold(binaryFileStateResource));
+      });
+    });
+  });
 });
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 51939bd89281d0a5e4c2971c026cebf8f6ef34ce..05a83a1c4861aaf65fd48d1d90c9d4873f680175 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
@@ -19,7 +19,7 @@ import {
   createStateResource,
   filterIsLoadedOrHasError,
   getEmbeddedResources,
-  hasError,
+  hasStateResourceError,
   isLoaded,
   isNotEmpty,
   sortByGermanDateStr,
@@ -42,6 +42,7 @@ import {
   map,
   startWith,
   switchMap,
+  tap,
 } from 'rxjs';
 import {
   ListResourceServiceConfig,
@@ -97,6 +98,13 @@ export class BescheidService {
   readonly uploadBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> =
     new BehaviorSubject<UploadFileInProgress>({ loading: false });
 
+  readonly uploadAttachmentInProgress$: BehaviorSubject<UploadFileInProgress> = new BehaviorSubject(
+    { loading: false },
+  );
+
+  readonly uploadedAttachment$: BehaviorSubject<StateResource<BinaryFileResource>> =
+    new BehaviorSubject(createEmptyStateResource());
+
   loadBescheidDocumentSubscription: Subscription;
 
   constructor(
@@ -143,6 +151,7 @@ export class BescheidService {
     );
     this.bescheidDocumentFile$.next(createEmptyStateResource());
     this.bescheidDocumentUri$.next(null);
+    this.uploadedAttachment$.next(createEmptyStateResource());
   }
 
   public getBescheidDraft(): Observable<StateResource<BescheidResource>> {
@@ -323,10 +332,10 @@ export class BescheidService {
   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();
   }
@@ -344,7 +353,7 @@ export class BescheidService {
     bescheid: BescheidResource,
     binaryFileStateResource: StateResource<BinaryFileResource>,
   ): void {
-    if (hasError(binaryFileStateResource)) {
+    if (hasStateResourceError(binaryFileStateResource)) {
       this.setUploadBescheidDocumentInProgressError(binaryFileStateResource.error);
     } else {
       this.createBescheidDocumentFromFile(bescheid, binaryFileStateResource.resource);
@@ -364,7 +373,7 @@ export class BescheidService {
     commandStateResource: StateResource<CommandResource>,
     binaryFile: BinaryFileResource,
   ): void {
-    if (hasError(commandStateResource)) {
+    if (hasStateResourceError(commandStateResource)) {
       this.setUploadBescheidDocumentInProgressError(commandStateResource.error);
     } else {
       this.bescheidDocument$.next(createEmptyStateResource());
@@ -416,7 +425,7 @@ export class BescheidService {
   private handleCreateBescheidDocumentResponse(
     commandStateResource: StateResource<CommandResource>,
   ): void {
-    if (hasError(commandStateResource)) {
+    if (hasStateResourceError(commandStateResource)) {
       this.setCreateBescheidDocumentInProgressError(commandStateResource.error);
     } else {
       const documentUri: ResourceUri = getEffectedResourceUrl(commandStateResource.resource);
@@ -521,4 +530,41 @@ export class BescheidService {
   public refreshList(): void {
     this.bescheidListService.refresh();
   }
+
+  public uploadAttachment(
+    bescheidResource: BescheidResource,
+    file: File,
+  ): Observable<StateResource<BinaryFileResource>> {
+    this.uploadAttachmentInProgress$.next({ fileName: file.name, loading: true });
+    return this.binaryFileService
+      .uploadFile(bescheidResource, BescheidLinkRel.UPLOAD_ATTACHMENT, file, false)
+      .pipe(
+        tap((binaryFileStateResource: StateResource<BinaryFileResource>) =>
+          this.handleAttachmentUpload(binaryFileStateResource),
+        ),
+      );
+  }
+
+  handleAttachmentUpload(binaryFileStateResource: StateResource<BinaryFileResource>) {
+    if (hasStateResourceError(binaryFileStateResource)) {
+      this.uploadAttachmentInProgress$.next({
+        loading: false,
+        error: binaryFileStateResource.error,
+      });
+    } else {
+      this.uploadAttachmentInProgress$.next({
+        ...this.uploadAttachmentInProgress$.value,
+        loading: binaryFileStateResource.loading,
+      });
+    }
+    this.uploadedAttachment$.next(binaryFileStateResource);
+  }
+
+  public getUploadAttachmentInProgress(): Observable<UploadFileInProgress> {
+    return this.uploadAttachmentInProgress$.asObservable();
+  }
+
+  public getUploadedAttachment(): Observable<StateResource<BinaryFileResource>> {
+    return this.uploadedAttachment$.asObservable();
+  }
 }
diff --git a/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts b/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts
index d9521a3ab95f6879515b7b398392fb57f2095d7c..3d7151381f57a1c9843bf17179f320bd3c28022c 100644
--- a/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts
+++ b/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts
@@ -8,7 +8,7 @@ import { catchError, delay, map, mergeMap, switchMap, tap } from 'rxjs/operators
 import { COMMAND_ERROR_MESSAGES, CREATE_COMMAND_MESSAGE_BY_ORDER } from '../command.message';
 import { CommandListResource, CommandResource, CreateCommandProps } from '../command.model';
 import { CommandRepository } from '../command.repository';
-import { hasError, isConcurrentModification, isPending, isRevokeable } from '../command.util';
+import { hasCommandError, isConcurrentModification, isPending, isRevokeable } from '../command.util';
 import {
   CommandProps,
   LoadCommandListProps,
@@ -97,7 +97,7 @@ export class CommandEffects {
     if (isRevokeable(command)) {
       return [createCommandSuccess({ command }), showRevokeSnackbar({ command })];
     }
-    if (hasError(command) && isConcurrentModification(command.errorMessage)) {
+    if (hasCommandError(command) && isConcurrentModification(command.errorMessage)) {
       this.showError(command);
       return [createCommandSuccess({ command }), publishConcurrentModificationAction()];
     }
diff --git a/alfa-client/libs/command-shared/src/lib/command.util.spec.ts b/alfa-client/libs/command-shared/src/lib/command.util.spec.ts
index cd3f65d6bda037c9552175f7b5c81cdfc821b70c..7567dbc61f0de2a129af59416b91e373ace7e40d 100644
--- a/alfa-client/libs/command-shared/src/lib/command.util.spec.ts
+++ b/alfa-client/libs/command-shared/src/lib/command.util.spec.ts
@@ -31,7 +31,7 @@ import { CommandErrorMessage } from './command.message';
 import { CommandListResource, CommandResource } from './command.model';
 import {
   getPendingCommandByOrder,
-  hasError,
+  hasCommandError,
   isConcurrentModification,
   isDone,
   isPending,
@@ -81,19 +81,19 @@ describe('CommandUtil', () => {
 
   describe('hasError', () => {
     it('should be true if no update link is present and command has error message', () => {
-      const result = hasError(createCommandErrorResource());
+      const result = hasCommandError(createCommandErrorResource());
 
       expect(result).toBeTruthy();
     });
 
     it('should be false if update link is present', () => {
-      const result = hasError(createCommandResource([CommandLinkRel.UPDATE]));
+      const result = hasCommandError(createCommandResource([CommandLinkRel.UPDATE]));
 
       expect(result).toBeFalsy();
     });
 
     it('should be false if error message is not present', () => {
-      const result = hasError(createCommandResource());
+      const result = hasCommandError(createCommandResource());
 
       expect(result).toBeFalsy();
     });
diff --git a/alfa-client/libs/command-shared/src/lib/command.util.ts b/alfa-client/libs/command-shared/src/lib/command.util.ts
index 8132a7d316e04b69db6af9aa5360895f5b4ae406..2dc64f425d39048734607a64cc12b984a47f3c03 100644
--- a/alfa-client/libs/command-shared/src/lib/command.util.ts
+++ b/alfa-client/libs/command-shared/src/lib/command.util.ts
@@ -43,7 +43,7 @@ export function hasErrorMessage(commandResource: CommandResource): boolean {
   return !isNil(commandResource.errorMessage) && !isEmpty(commandResource.errorMessage);
 }
 
-export function hasError(commandResource: CommandResource): boolean {
+export function hasCommandError(commandResource: CommandResource): boolean {
   return hasErrorMessage(commandResource) && !isPending(commandResource);
 }
 
@@ -73,7 +73,7 @@ export function isConcurrentModification(errorMessage: string): boolean {
 }
 
 export function isSuccessfulDone(commandResource: CommandResource): boolean {
-  return isDone(commandResource) && !hasError(commandResource);
+  return isDone(commandResource) && !hasCommandError(commandResource);
 }
 
 export function getEffectedResourceUrl(command: CommandResource): ResourceUri {
diff --git a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts
index d7587434211166d8695269b96f639025a72a679e..26b8e0b77783d3dd5f6de9ef1eecbdc5c7db1220 100644
--- a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts
+++ b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts
@@ -24,9 +24,15 @@ import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.compone
       <ods-spinner-icon *ngIf="isLoading && !isError" size="large" />
     </div>
     <div class="flex grow flex-col items-start break-all text-start text-text">
-      <p class="text-sm" [ngClass]="isError && 'text-error'">
+      <p *ngIf="!isError && !isLoading && caption" class="text-sm">
         {{ caption }}
       </p>
+      <p *ngIf="isError && errorCaption" class="text-sm text-error">
+        {{ errorCaption }}
+      </p>
+      <p *ngIf="isLoading && loadingCaption" class="text-sm">
+        {{ loadingCaption }}
+      </p>
       <p *ngIf="description && !isError" class="text-xs text-text/65">
         {{ description }}
       </p>
@@ -38,7 +44,9 @@ import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.compone
   </button>`,
 })
 export class AttachmentComponent {
-  @Input({ required: true }) caption!: string;
+  @Input() caption: string = '';
+  @Input() errorCaption: string = '';
+  @Input() loadingCaption: string = '';
   @Input() fileType: string = '';
   @Input() description = '';
   @Input() isLoading: boolean = false;
diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts
index c425ea44e5bb2ef00586dd52fbf41cfb7af75e4b..21f33261b1d95be374068cd02b2fd9b3f063a075 100644
--- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts
+++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts
@@ -35,7 +35,7 @@ import {
   StateResource,
   createEmptyStateResource,
   createStateResource,
-  hasError,
+  hasStateResourceError,
 } from '@alfa-client/tech-shared';
 import {
   ForwardRequest,
@@ -162,7 +162,7 @@ export class ForwardingService implements OnDestroy {
   }
 
   reloadCurrentVorgang(command: StateResource<CommandResource>): void {
-    if (!hasError(command)) {
+    if (!hasStateResourceError(command)) {
       this.vorgangService.reloadCurrentVorgang();
     }
   }
diff --git a/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts b/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts
index dec067e551da7b7af88fdfdaf84bae1997f9b400..f4bc26e4687c2ce05b1cc7b3d36560b76a5a21df 100644
--- a/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts
+++ b/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts
@@ -31,7 +31,7 @@ import {
   CommandResource,
   CommandService,
   doIfCommandIsDone,
-  hasError,
+  hasCommandError,
   isDone,
   isPending,
 } from '@alfa-client/command-shared';
@@ -152,7 +152,7 @@ export class PostfachService {
   }
 
   private showSnackbar(commandResource: CommandResource): void {
-    if (hasError(commandResource)) {
+    if (hasCommandError(commandResource)) {
       this.snackbarService.showError(PostfachMessages.SEND_FAILED);
     } else {
       this.snackbarService.show(commandResource, PostfachMessages.SEND_SUCCESSFUL);
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 6a4d16d49caa38d8901b8f352fded1be89bd7b59..e52afef42b76c88e8ddc22ddad0d5c59f1ffd8d5 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
@@ -28,7 +28,7 @@ import {
   PostfachMailListResource,
   PostfachService,
 } from '@alfa-client/postfach-shared';
-import { StateResource, hasError, isNotNull, isNotUndefined } from '@alfa-client/tech-shared';
+import { StateResource, hasStateResourceError, 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';
@@ -89,7 +89,7 @@ export class PostfachMailButtonContainerComponent {
 
   closeDialog(commandStateResource: StateResource<CommandResource>): void {
     if (
-      !hasError(commandStateResource) &&
+      !hasStateResourceError(commandStateResource) &&
       commandStateResource.loaded &&
       isNotUndefined(this.dialogRef)
     ) {
diff --git a/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts
index fc5bc2c029bbaa651be5cbf7eac39bf2700a7a94..f9277c5ac4d3b76a1b15e66a0bc718c558c1b497 100644
--- a/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts
@@ -24,7 +24,7 @@
 import { formatDate, registerLocaleData } from '@angular/common';
 import localeDe from '@angular/common/locales/de';
 import {
-  fixPartialYear,
+  add2000Years,
   formatDateWithoutYearWithTime,
   formatForDatabase,
   formatFullDate,
@@ -209,12 +209,12 @@ describe('Date Util', () => {
     }
   });
 
-  describe('fixPartialYear', () => {
+  describe('add2000Years', () => {
     it('should return Date in the 2000 millennium for 2 digit year value', () => {
       const dateInput: Date = new Date('0023-10-22');
       const yearExpected: number = 2023;
 
-      const result: Date = fixPartialYear(dateInput);
+      const result: Date = add2000Years(dateInput);
 
       expect(result.getFullYear()).toBe(yearExpected);
     });
@@ -222,7 +222,7 @@ describe('Date Util', () => {
     it('should return Date unchanged for non 2 digit year value', () => {
       const dateInput: Date = new Date('2023-10-22');
 
-      const result: Date = fixPartialYear(dateInput);
+      const result: Date = add2000Years(dateInput);
 
       expect(result).toBe(dateInput);
     });
diff --git a/alfa-client/libs/tech-shared/src/lib/date.util.ts b/alfa-client/libs/tech-shared/src/lib/date.util.ts
index da5fe02a94d107c9c74e3b2b578da130aaf89fd9..5531d5cf09625ac35d85da39bddc6c5c57b42a19 100644
--- a/alfa-client/libs/tech-shared/src/lib/date.util.ts
+++ b/alfa-client/libs/tech-shared/src/lib/date.util.ts
@@ -102,7 +102,8 @@ function convertGermanDateString(dateStr: string): Date {
   return new Date(dateStr.replace(/(.*)\.(.*)\.(.*)/, '$3-$2-$1'));
 }
 
-export function fixPartialYear(date: Date) {
+// Workaround, solange MatDatepicker genutzt wird.
+export function add2000Years(date: Date): Date {
   const year: number = date.getFullYear();
   if (year.toString().length !== 2) {
     return date;
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts
index b7bc23b1732d5ce0f2e3c5a941acde157a18b0e5..c2d7bc185fefd6f2fa682076a278fb962b413ce1 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts
@@ -1,6 +1,6 @@
 import { Resource } from '@ngxp/rest';
 import { Observable, filter, map } from 'rxjs';
-import { StateResource, hasError, isLoaded } from './resource.util';
+import { StateResource, hasStateResourceError, isLoaded } from './resource.util';
 
 export function filterIsLoadedOrHasError<T>(): (
   source: Observable<StateResource<T>>,
@@ -8,7 +8,7 @@ export function filterIsLoadedOrHasError<T>(): (
   return (source: Observable<StateResource<T>>): Observable<StateResource<T>> => {
     return source.pipe(
       filter(
-        (stateResource: StateResource<T>) => hasError(stateResource) || isLoaded(stateResource),
+        (stateResource: StateResource<T>) => hasStateResourceError(stateResource) || isLoaded(stateResource),
       ),
     );
   };
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts
index deaa71132a606f656d62efd87deded4ba3e71f2b..17394d5b91f600d6882f82fca324a97cdb046449 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts
@@ -69,7 +69,7 @@ export function isLoaded<T>(stateResource: StateResource<T>): boolean {
   return !stateResource.loading && !stateResource.reload && isNotNull(stateResource.resource);
 }
 
-export function hasError(stateResource: StateResource<any>): boolean {
+export function hasStateResourceError(stateResource: StateResource<any>): boolean {
   return !isNil(stateResource.error);
 }
 
@@ -115,7 +115,7 @@ export function getSuccessfullyLoaded<T extends Resource>(
   stateResources: StateResource<T>[],
 ): StateResource<T>[] {
   return stateResources.filter(
-    (stateResource) => isLoaded(stateResource) && !hasError(stateResource),
+    (stateResource) => isLoaded(stateResource) && !hasStateResourceError(stateResource),
   );
 }
 
diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
index 753c7422643ab606489987684c13e1ee097ae31b..a02d2bab0a0eadcc998270d2d06adc277961d236 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
@@ -27,7 +27,7 @@ import { Resource } from '@ngxp/rest';
 import { isNil } from 'lodash-es';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
-import { StateResource, hasError } from '../resource/resource.util';
+import { StateResource, hasStateResourceError } from '../resource/resource.util';
 import { ApiError, HttpError, InvalidParam, Issue, ProblemDetail } from '../tech.model';
 import { isNotUndefined } from '../tech.util';
 import {
@@ -56,7 +56,7 @@ export abstract class AbstractFormService {
 
   handleResponse(result: StateResource<Resource | HttpError>): StateResource<Resource | HttpError> {
     if (result.loading) return result;
-    if (hasError(result)) {
+    if (hasStateResourceError(result)) {
       this.handleError(result.error);
     }
     return result;
diff --git a/alfa-client/libs/tech-shared/test/file.ts b/alfa-client/libs/tech-shared/test/file.ts
index 4664c7c07c48b29995dfbef49dc2a27b7ad9b0f9..3f0fd180a866e86a1f9c2747bfae8b876a19950c 100644
--- a/alfa-client/libs/tech-shared/test/file.ts
+++ b/alfa-client/libs/tech-shared/test/file.ts
@@ -1,3 +1,5 @@
+import { faker } from '@faker-js/faker';
+
 export function createFile(): File {
-  return <any>{};
-}
\ No newline at end of file
+  return <any>{ name: faker.datatype.string(10), type: 'image/png', size: 512 };
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
index af091ae59f8bb7dd15807ee95bc512cdd02379ce..24020a5412e79d4e0c21e5c016d3aa6804d613d9 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
@@ -84,14 +84,14 @@ describe('DateEditorComponent', () => {
   });
 
   describe('onBlur', () => {
-    it('should not call fixPartialYear if input value is not Date object', () => {
+    it('should not call add2000Years if input value is not Date object', () => {
       const inputValue: string = '12.12.2024';
       component.fieldControl.setValue(inputValue);
-      const fixPartialYear = jest.spyOn(dateUtil, 'fixPartialYear');
+      const add2000Years = jest.spyOn(dateUtil, 'add2000Years');
 
       component.onBlur();
 
-      expect(fixPartialYear).not.toHaveBeenCalled();
+      expect(add2000Years).not.toHaveBeenCalled();
     });
 
     describe('if input value is Date object', () => {
@@ -101,12 +101,12 @@ describe('DateEditorComponent', () => {
         component.fieldControl.setValue(inputValue);
       });
 
-      it('should call fixPartialYear', () => {
-        const fixPartialYear = jest.spyOn(dateUtil, 'fixPartialYear');
+      it('should call add2000Years', () => {
+        const add2000Years = jest.spyOn(dateUtil, 'add2000Years');
 
         component.onBlur();
 
-        expect(fixPartialYear).toHaveBeenCalledWith(inputValue);
+        expect(add2000Years).toHaveBeenCalledWith(inputValue);
       });
 
       it('should call fieldControl.patchValue', () => {
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
index a2f0076e75436e58d9538642cc00c6fe9bb6b7b9..b93828d71bece9019d6ce554f0e93709114b4bc6 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { fixPartialYear } from '@alfa-client/tech-shared';
+import { add2000Years } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
 import { MatDatepickerInputEvent } from '@angular/material/datepicker';
 import { isDate } from 'date-fns';
@@ -44,7 +44,7 @@ export class DateEditorComponent extends FormControlEditorAbstractComponent {
       return;
     }
 
-    const value: Date = fixPartialYear(this.fieldControl.value);
+    const value: Date = add2000Years(this.fieldControl.value);
 
     this.fieldControl.patchValue(value);
     this.onChange(value);
diff --git a/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts b/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts
index 78547141a5665a15799b97afc211cee0134f8d49..2a5c2244d1530041467669e723103a3f8925df02 100644
--- a/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts
+++ b/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts
@@ -25,7 +25,7 @@ import { Component, Input, SimpleChanges } from '@angular/core';
 import {
   ApiError,
   createEmptyStateResource,
-  hasError,
+  hasStateResourceError,
   MessageCode,
   StateResource,
 } from '@alfa-client/tech-shared';
@@ -61,7 +61,7 @@ export class UserIconComponent {
     if (this.userProfileStateResource.resource) {
       return this.getUserTooltip();
     }
-    if (hasError(this.userProfileStateResource)) {
+    if (hasStateResourceError(this.userProfileStateResource)) {
       return this.getErrorTooltip();
     }
     return userProfileMessage.UNASSIGNED;
diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts
index 4a93a23e00e7211c40a49c585acd73d78bba2ed7..1f150a1e04e1c8799556a595330e3a93afdb9514 100644
--- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts
+++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts
@@ -26,7 +26,7 @@ import {
   ApiError,
   StateResource,
   createEmptyStateResource,
-  hasError,
+  hasStateResourceError,
   isServiceUnavailableMessageCode,
 } from '@alfa-client/tech-shared';
 import { UserProfileResource } from '@alfa-client/user-profile-shared';
@@ -46,7 +46,7 @@ export class UserProfileInVorgangComponent {
   readonly vorgangLinkRel = VorgangWithEingangLinkRel;
 
   public isUserServiceAvailable(stateResource: StateResource<Resource>): boolean {
-    if (hasError(stateResource) && isServiceUnavailableMessageCode(<ApiError>stateResource.error)) {
+    if (hasStateResourceError(stateResource) && isServiceUnavailableMessageCode(<ApiError>stateResource.error)) {
       return false;
     }
     return true;
diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
index 9048ea218b5a838a57884121a7e6be9b35173dcc..161feeb6fa3e48c8280195b5f2bcf5b121030d3f 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
@@ -1,4 +1,4 @@
-import { AktenzeichenEditDialogComponent } from '@alfa-client/vorgang-detail';
+import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog.component';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { mock } from '@alfa-client/test-utils';
 import {
@@ -32,7 +32,7 @@ import {
 import {
   COMMAND_ERROR_MESSAGES,
   CommandErrorMessage,
-  hasError,
+  hasCommandError,
   isSuccessfulDone,
 } from '@alfa-client/command-shared';
 import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message';
@@ -41,7 +41,7 @@ import { AktenzeichenEditDialogFormservice } from './aktenzeichen-edit-dialog.fo
 jest.mock('@alfa-client/tech-shared');
 const isClipboardReadSupportedMock = isClipboardReadSupported as jest.Mock;
 jest.mock('@alfa-client/command-shared');
-const hasErrorMock = hasError as jest.Mock;
+const hasErrorMock = hasCommandError as jest.Mock;
 const isSuccessfulDoneMock = isSuccessfulDone as jest.Mock;
 const hasContentMock = hasContent as jest.Mock;
 const createEmptyStateResourceMock = createEmptyStateResource as jest.Mock;
diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
index 0ce392d5695903ef318c27c704c02b9c18eb8e16..d618bb16fbcb744d80cd6d8ae48ffd5523a2e2f5 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
@@ -1,7 +1,7 @@
 import {
   COMMAND_ERROR_MESSAGES,
   CommandResource,
-  hasError,
+  hasCommandError,
   isSuccessfulDone,
 } from '@alfa-client/command-shared';
 import {
@@ -73,7 +73,7 @@ export class AktenzeichenEditDialogComponent implements OnInit {
   }
 
   onResponse(commandResource: CommandResource) {
-    if (commandResource && hasError(commandResource)) {
+    if (commandResource && hasCommandError(commandResource)) {
       this.showSnackbar(commandResource);
     } else if (isSuccessfulDone(commandResource)) {
       this.vorgangService.reloadCurrentVorgang();
@@ -82,7 +82,7 @@ export class AktenzeichenEditDialogComponent implements OnInit {
   }
 
   showSnackbar(commandResource: CommandResource): void {
-    if (hasError(commandResource)) {
+    if (hasCommandError(commandResource)) {
       this.snackBarService.showError(this.getErrorMessage(commandResource));
     }
   }
diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
index 897a93130bf9e8d21b120f86de04796e564b7300..be0c599a5b7e04df8b03cbe0c51568aed474e709 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html
@@ -23,7 +23,7 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<ng-container *ngIf="!isVorgangInBearbeitung && vorgang | hasLink: linkRel.ABSCHLIESSEN">
+<ng-container *ngIf="vorgang | hasLink: linkRel.ABSCHLIESSEN">
   <ozgcloud-stroked-button-with-spinner
     *ngIf="!showAsIconButton"
     data-test-id="abschliessen-button"
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 ff72e924921e24b4de0a81d651dc2854ec06e266..4d98aa579e9927feab12c1474ebc7dfaddb8e926 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
@@ -134,18 +134,6 @@ describe('AbschliessenButtonComponent', () => {
       expect(buttonElement).not.toBeInstanceOf(HTMLElement);
     });
 
-    it('should be hidden if in bearbeitung', () => {
-      component.vorgang = {
-        ...createVorgangWithEingangResource([VorgangWithEingangLinkRel.ABSCHLIESSEN]),
-        status: VorgangStatus.IN_BEARBEITUNG,
-      };
-
-      fixture.detectChanges();
-      const buttonElement = fixture.nativeElement.querySelector(abschliessenButton);
-
-      expect(buttonElement).not.toBeInstanceOf(HTMLElement);
-    });
-
     it('should be visible', () => {
       component.vorgang = createVorgangWithEingangResource([
         VorgangWithEingangLinkRel.ABSCHLIESSEN,
@@ -173,17 +161,6 @@ describe('AbschliessenButtonComponent', () => {
       expect(buttonElement).not.toBeInstanceOf(HTMLElement);
     });
 
-    it('should be hidden if in bearbeitung', () => {
-      component.vorgang = {
-        ...createVorgangWithEingangResource([VorgangWithEingangLinkRel.ABSCHLIESSEN]),
-        status: VorgangStatus.IN_BEARBEITUNG,
-      };
-
-      fixture.detectChanges();
-      const buttonElement = fixture.nativeElement.querySelector(abschliessenIconButton);
-
-      expect(buttonElement).not.toBeInstanceOf(HTMLElement);
-    });
 
     it('should be visible', () => {
       component.vorgang = createVorgangWithEingangResource([
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 c8475e5aae551b7cfedeeea0d9a15e36c58219e6..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
@@ -55,8 +55,4 @@ export class AbschliessenButtonComponent implements OnInit {
   public abschliessen(): void {
     this.commandStateResource$ = this.vorgangCommandService.abschliessen(this.vorgang);
   }
-
-  get isVorgangInBearbeitung(): boolean {
-    return this.vorgang.status === 'IN_BEARBEITUNG';
-  }
 }
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 f7d6ea59813fa20881d5cb9d019aac71f81e6fef..dc987af324371fbc73cab82d955fa0cb935e9443 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
@@ -14,7 +14,6 @@ import {
   HttpError,
   StateResource,
   convertToBoolean,
-  createEmptyStateResource,
   formatForDatabase,
   isNotEmpty,
   isNotNil,
@@ -37,7 +36,6 @@ import {
   Subscription,
   combineLatest,
   map,
-  of,
   startWith,
 } from 'rxjs';
 
@@ -68,8 +66,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   ].join('\n\n');
 
   private readonly bescheidChanges$: BehaviorSubject<Bescheid>;
-  private attachmentUpload$: BehaviorSubject<StateResource<BinaryFileResource>>;
-  private bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>;
   private readonly fileDelete$: Subject<BinaryFileResource>;
   private readonly showMissingBescheidDocumentError$: BehaviorSubject<boolean> =
     new BehaviorSubject<boolean>(false);
@@ -80,7 +76,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
   vorgangWithEingangResource: VorgangWithEingangResource;
 
   private formControlSubscriptions: Subscription;
-
   private formChangesSubscription: Subscription;
 
   constructor(
@@ -96,10 +91,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
 
   init(): void {
     this.formControlSubscriptions = this.subscribeToSendBy();
-    this.bescheidFileUpload$ = of(createEmptyStateResource<BinaryFileResource>());
-    this.attachmentUpload$ = new BehaviorSubject<StateResource<BinaryFileResource>>(
-      createEmptyStateResource(),
-    );
     this.initializeFormChanges();
   }
 
@@ -219,22 +210,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest
     return this.vorgangWithEingangResource;
   }
 
-  public getAttachmentUpload(): Observable<StateResource<BinaryFileResource>> {
-    return this.attachmentUpload$.asObservable();
-  }
-
-  public uploadAttachment(attachment: StateResource<BinaryFileResource>): void {
-    this.attachmentUpload$.next(attachment);
-  }
-
-  public getBescheidFileUpload(): Observable<StateResource<BinaryFileResource>> {
-    return this.bescheidFileUpload$;
-  }
-
-  public setBescheidFileUpload(bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>) {
-    this.bescheidFileUpload$ = bescheidFileUpload$;
-  }
-
   public deleteFile(binaryFileResource: BinaryFileResource): void {
     this.fileDelete$.next(binaryFileResource);
   }
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.html 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.html
index 780524bd40f6a2dbba30fdeb83df3c133076bd47..fc9bcf1ed04f5df8d10a3a92d1c6d611d827574f 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.html
+++ 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.html
@@ -7,12 +7,6 @@
   >
   </alfa-binary-file2-container>
   <ng-container *ngFor="let attachment of uploadedAttachments">
-    <ods-attachment
-      *ngIf="attachment.error || attachment.loading"
-      [caption]="getAttachmentCaption(attachment)"
-      [error]="attachment.error"
-      [isLoading]="attachment.loading"
-    ></ods-attachment>
     <alfa-binary-file2-container
       *ngIf="!attachment.loading && attachment.resource"
       [file]="attachment.resource"
@@ -22,4 +16,15 @@
     >
     </alfa-binary-file2-container>
   </ng-container>
+  <ng-container *ngIf="uploadInProgress$ | async as uploadFileInProgress">
+    <ods-attachment
+      data-test-id="attachment-upload-in-progress"
+      *ngIf="uploadFileInProgress.loading || uploadFileInProgress.error"
+      [loadingCaption]="uploadFileInProgress.fileName"
+      errorCaption="Fehler beim Hochladen"
+      [error]="uploadFileInProgress.error"
+      description="Anhang wird hochgeladen"
+      [isLoading]="uploadFileInProgress.loading"
+    ></ods-attachment>
+  </ng-container>
 </ods-attachment-container>
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 b60bd2b3fdc6b623666f52ae0b6ef799e75300f3..1e9ed7dcaa08a8f3a261a01eaf31c317eb00d7ac 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
@@ -4,7 +4,6 @@ import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import {
   convertForDataTest,
   ConvertForDataTestPipe,
-  createEmptyStateResource,
   createErrorStateResource,
   createStateResource,
   FileSizePipe,
@@ -21,6 +20,7 @@ import {
 } from '@ods/system';
 import { MockComponent, MockPipe } from 'ng-mocks';
 import { BehaviorSubject, EMPTY, Observable, of, Subscription } from 'rxjs';
+import { createUploadFileInProgress } from '../../../../../../../bescheid-shared/src/test/bescheid';
 import {
   createBinaryFileResource,
   createLoadedBinaryFileResource,
@@ -41,13 +41,12 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
   beforeEach(async () => {
     bescheidService = mock(BescheidService);
     bescheidService.getAttachments.mockReturnValue(EMPTY);
+    bescheidService.getUploadedAttachment.mockReturnValue(EMPTY);
 
     formService = mock(BescheidenFormService);
     formService.getBescheidChanges.mockReturnValue(
       new BehaviorSubject({ beschiedenAm: new Date(), bewilligt: false }),
     );
-    formService.getAttachmentUpload.mockReturnValue(of(createEmptyStateResource()));
-    formService.getBescheidFileUpload.mockReturnValue(of(createEmptyStateResource()));
 
     await TestBed.configureTestingModule({
       declarations: [
@@ -88,6 +87,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
     const dataTestId = getDataTestIdOf(
       `${convertForDataTest(attachment.resource.name)}-file2-container`,
     );
+    const uploadInProgressDataTestId: string = getDataTestIdOf('attachment-upload-in-progress');
 
     beforeEach(() => {
       component.uploadedAttachments = [attachment];
@@ -115,6 +115,38 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
 
       notExistsAsHtmlElement(fixture, dataTestId);
     });
+
+    it('should render attachment in progress component when loading', () => {
+      component.uploadInProgress$ = of({ ...createUploadFileInProgress(), loading: true });
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, uploadInProgressDataTestId);
+    });
+
+    it('should render attachment in progress component on error', () => {
+      component.uploadInProgress$ = of({
+        ...createUploadFileInProgress(),
+        loading: false,
+        error: createApiError(),
+      });
+
+      fixture.detectChanges();
+
+      existsAsHtmlElement(fixture, uploadInProgressDataTestId);
+    });
+
+    it('should not render attachment in progress component when not loading and no error', () => {
+      component.uploadInProgress$ = of({
+        ...createUploadFileInProgress(),
+        loading: false,
+        error: null,
+      });
+
+      fixture.detectChanges();
+
+      notExistsAsHtmlElement(fixture, uploadInProgressDataTestId);
+    });
   });
 
   describe('ngOnInit', () => {
@@ -137,6 +169,12 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
 
       expect(subscribeToAttachmentUpload).toHaveBeenCalled();
     });
+
+    it('should get upload attachment in progress', () => {
+      component.ngOnInit();
+
+      expect(bescheidService.getUploadAttachmentInProgress).toHaveBeenCalled();
+    });
   });
 
   describe('ngOnDestroy', () => {
@@ -144,7 +182,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
       const subscription = mock(Subscription);
       const observable = mock(Observable);
       observable.subscribe.mockReturnValue(subscription);
-      formService.getAttachmentUpload.mockReturnValue(observable);
+      bescheidService.getUploadedAttachment.mockReturnValue(observable);
       component.ngOnInit();
 
       component.ngOnDestroy();
@@ -187,13 +225,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => {
 
     beforeEach(() => {
       attachment = createLoadedBinaryFileResource();
-      formService.getAttachmentUpload.mockReturnValue(of(attachment));
-    });
-
-    it('should get attachment upload', () => {
-      component.subscribeToAttachmentUpload();
-
-      expect(formService.getAttachmentUpload).toHaveBeenCalled();
+      bescheidService.getUploadedAttachment.mockReturnValue(of(attachment));
     });
 
     it('should should set uploaded attachments', () => {
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 f8497323adfe75ac2e4bc428775bc7e1c6bc5a0c..084a5361b9ec8460e5cc0f518aeacb535cb47cf9 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
@@ -1,16 +1,16 @@
-import { BescheidService } from '@alfa-client/bescheid-shared';
+import { BescheidService, UploadFileInProgress } from '@alfa-client/bescheid-shared';
 import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import {
   StateResource,
   containsLoading,
   getSuccessfullyLoaded,
-  hasError,
+  hasStateResourceError,
   isLoaded,
   isNotNil,
 } from '@alfa-client/tech-shared';
 import { Component, Input, OnDestroy, OnInit } from '@angular/core';
 import { getUrl } from '@ngxp/rest';
-import { Subscription, first } from 'rxjs';
+import { Observable, Subscription, first } from 'rxjs';
 import { BescheidenFormService } from '../../bescheiden.formservice';
 
 @Component({
@@ -23,6 +23,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
 
   existingAttachments: BinaryFileResource[] = [];
   uploadedAttachments: StateResource<BinaryFileResource>[] = [];
+  uploadInProgress$: Observable<UploadFileInProgress>;
 
   private attachmentUploadSubscription: Subscription;
 
@@ -32,6 +33,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
   ) {}
 
   ngOnInit(): void {
+    this.uploadInProgress$ = this.bescheidService.getUploadAttachmentInProgress();
     this.loadExistingAttachments();
     this.subscribeToAttachmentUpload();
   }
@@ -52,8 +54,8 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
   }
 
   subscribeToAttachmentUpload() {
-    this.attachmentUploadSubscription = this.formService
-      .getAttachmentUpload()
+    this.attachmentUploadSubscription = this.bescheidService
+      .getUploadedAttachment()
       .subscribe(
         (stateResource: StateResource<BinaryFileResource>) =>
           (this.uploadedAttachments = this.buildUploadedAttachments(stateResource)),
@@ -63,7 +65,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
   buildUploadedAttachments(
     uploadStateResource: StateResource<BinaryFileResource>,
   ): StateResource<BinaryFileResource>[] {
-    if (isLoaded(uploadStateResource) || hasError(uploadStateResource)) {
+    if (isLoaded(uploadStateResource) || hasStateResourceError(uploadStateResource)) {
       return [...getSuccessfullyLoaded(this.uploadedAttachments), uploadStateResource];
     } else if (uploadStateResource.loading && !containsLoading(this.uploadedAttachments)) {
       return [...getSuccessfullyLoaded(this.uploadedAttachments), uploadStateResource];
@@ -80,16 +82,4 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest
       (attachment) => getUrl(attachment) !== getUrl(file),
     );
   }
-
-  getAttachmentCaption(attachment: StateResource<BinaryFileResource>) {
-    if (attachment.loading) {
-      return 'Anhang wird hochgeladen';
-    }
-
-    if (attachment.error) {
-      return 'Fehler beim Hochladen';
-    }
-
-    return attachment.resource.name;
-  }
 }
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 3148cf1d0d907496b5b4f9164e7c1621a1aa3953..a89c65186da52532a6f73829e58afaaaf65703cd 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
@@ -17,8 +17,11 @@
   </ng-container>
   <ods-attachment
     *ngIf="uploadBescheidDocumentInProgress.loading || uploadBescheidDocumentInProgress.error"
-    [caption]="attachmentCaption"
-    [attr.data-test-id]="attachmentDataTestId"
+    errorCaption="Fehler beim Hochladen"
+    [loadingCaption]="uploadBescheidDocumentInProgress.fileName"
+    [attr.data-test-id]="
+      'upload-bescheid-document-error-' + !!uploadBescheidDocumentInProgress.error
+    "
     [isLoading]="uploadBescheidDocumentInProgress.loading"
     [error]="uploadBescheidDocumentInProgress.error"
   ></ods-attachment>
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 5bd0f8b68ece0d217355d957b040611c03259381..2f71e2de6a3ef57174f129655ba0dd7f1c8ddab5 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
@@ -17,7 +17,7 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => {
   let fixture: ComponentFixture<VorgangDetailBescheidenResultDokumentComponent>;
 
   const createBescheidDocumentError: string = getDataTestIdOf('create-bescheid-document-error');
-  const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error');
+  const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error-true');
   const missingBescheidDocumentErrorMessage: string = getDataTestIdOf(
     'missing-bescheid-document-error-message',
   );
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 f6fc855c98546cb0a9d29ac6dbc03f0ddfc62d41..f46d2cbd1d7aa2719a19b7f73ae55e1efb23945e 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
@@ -25,30 +25,6 @@ export class VorgangDetailBescheidenResultDokumentComponent {
 
   @Output() deleteFile: EventEmitter<void> = new EventEmitter<void>();
 
-  get attachmentCaption() {
-    if (this.uploadBescheidDocumentInProgress.loading) {
-      return 'Bescheiddokument wird hochgeladen';
-    }
-
-    if (this.uploadBescheidDocumentInProgress.error) {
-      return 'Fehler beim Hochladen';
-    }
-
-    return this.bescheidDocumentFile.resource.name;
-  }
-
-  get attachmentDataTestId() {
-    if (this.uploadBescheidDocumentInProgress.loading) {
-      return 'upload-bescheid-document-loading';
-    }
-
-    if (this.uploadBescheidDocumentInProgress.error) {
-      return 'upload-bescheid-document-error';
-    }
-
-    return 'upload-bescheid-document-file';
-  }
-
   constructor(private bescheidService: BescheidService) {}
 
   handleBescheidDocument(bescheid: BescheidResource): void {
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
index 7a892cb44c19c0b3826281b874991630930ff336..893c337ba18e0c86c6454628e475431305b092ba 100644
--- 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
@@ -128,5 +128,14 @@ describe('VorgangDetailBescheidenResultNachrichtComponent', () => {
 
       expect(formService.patchNachricht).not.toHaveBeenCalled();
     });
+
+    it.each([null, undefined])(
+      'should not patch form if document resource is %s',
+      (resource: DocumentResource) => {
+        component.bescheidDocumentStateResource = createStateResource(resource);
+
+        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
index fffb51e8555034313271c3d39bff2830defe8119..9dd0fca6fb796f1d47f773d147fdd54954ae1756 100644
--- 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
@@ -1,5 +1,5 @@
 import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared';
-import { StateResource } from '@alfa-client/tech-shared';
+import { StateResource, isNotNil } from '@alfa-client/tech-shared';
 import { Component, Input, OnInit } from '@angular/core';
 import { FormGroup } from '@angular/forms';
 import { Observable } from 'rxjs';
@@ -11,7 +11,7 @@ import { BescheidenFormService } from '../../bescheiden.formservice';
 })
 export class VorgangDetailBescheidenResultNachrichtComponent implements OnInit {
   @Input() set bescheidDocumentStateResource(stateResource: StateResource<DocumentResource>) {
-    if (!stateResource.loading && !stateResource.error) {
+    if (!stateResource.loading && !stateResource.error && isNotNil(stateResource.resource)) {
       this.formService.patchNachricht(stateResource.resource);
     }
   }
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-attachment-hochladen/vorgang-detail-bescheiden-attachment-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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.html
index 58333a2dc251f41b4b20766e3c7882ce5c088416..57979ad9c46243854ab904c46570eac6f92b8a1c 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.html
@@ -5,7 +5,7 @@
     [uploadInProgress]="uploadInProgress$ | async"
     (newFile)="uploadFile($event)"
     [fileLinkList]="getFileLinkList()"
-    label="Attachment hochladen"
+    label="Anhang hochladen"
   >
   </ods-file-upload-editor>
 </div>
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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.spec.ts
index c6d4b9f293b55af444bb3a6b3da555bc5e382200..74c2aea0911f06523b5b632206a370f06cba0f15 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.spec.ts
@@ -1,16 +1,17 @@
-import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
 import { BinaryFileAttachmentContainerComponent } from '@alfa-client/binary-file';
-import { BinaryFileResource, BinaryFileService } from '@alfa-client/binary-file-shared';
-import { createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared';
+import { BinaryFileResource } from '@alfa-client/binary-file-shared';
+import { StateResource, createStateResource } from '@alfa-client/tech-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
 import { FileUploadEditorComponent } from '@ods/component';
-import { cold } from 'jest-marbles';
 import { MockComponent } from 'ng-mocks';
 import { EMPTY, Observable, Subscription, of } from 'rxjs';
-import { createBescheidResource } from '../../../../../../../../../bescheid-shared/src/test/bescheid';
+import { createBescheidStateResource } from '../../../../../../../../../bescheid-shared/src/test/bescheid';
 import { createBinaryFileResource } from '../../../../../../../../../binary-file-shared/test/binary-file';
+import { createFile } from '../../../../../../../../../tech-shared/test/file';
+import { singleColdCompleted } from '../../../../../../../../../tech-shared/test/marbles';
 import { BescheidenFormService } from '../../../../bescheiden.formservice';
 import { VorgangDetailBescheidenAttachmentHochladenComponent } from './vorgang-detail-bescheiden-attachment-hochladen.component';
 
@@ -20,15 +21,12 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => {
   const selfLink: string = 'self';
 
   let bescheidService: Mock<BescheidService>;
-  let binaryFileService: Mock<BinaryFileService>;
   let formService: BescheidenFormService;
 
   beforeEach(async () => {
     bescheidService = mock(BescheidService);
     bescheidService.getAttachments.mockReturnValue(EMPTY);
 
-    binaryFileService = mock(BinaryFileService);
-
     formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService));
 
     await TestBed.configureTestingModule({
@@ -47,10 +45,6 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => {
           provide: BescheidService,
           useValue: bescheidService,
         },
-        {
-          provide: BinaryFileService,
-          useValue: binaryFileService,
-        },
       ],
     }).compileComponents();
 
@@ -167,90 +161,42 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => {
   });
 
   describe('uploadFile', () => {
-    const file: File = <any>{ name: 'TestDatei' };
-    let uploadAndGetFile: jest.Mock;
+    const bescheidDraftStateResource: StateResource<BescheidResource> =
+      createBescheidStateResource();
+    const file: File = createFile();
+    const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource(
+      createBinaryFileResource(),
+    );
 
     beforeEach(() => {
-      uploadAndGetFile = component.uploadAndGetFile = jest.fn();
+      bescheidService.uploadAttachment.mockReturnValue(of(binaryFileStateResource));
+      component.bescheidDraftStateResource = bescheidDraftStateResource;
     });
 
-    it('should uploadAndGetFile', () => {
-      uploadAndGetFile.mockReturnValue(of(createEmptyStateResource()));
-
+    it('should upload attachment', () => {
       component.uploadFile(file);
 
-      expect(component.uploadAndGetFile).toHaveBeenCalledWith(file);
-    });
-
-    it('should start with loading empty state resource', () => {
-      const loadingStateResource = createEmptyStateResource(true);
-      const uploadStateResource = createStateResource(createBinaryFileResource());
-      uploadAndGetFile.mockReturnValue(cold('-a', { a: uploadStateResource }));
-
-      component.uploadFile(file);
+      component.uploadInProgress$.subscribe();
 
-      expect(component.uploadInProgress$).toBeObservable(
-        cold('ab', { a: loadingStateResource, b: uploadStateResource }),
+      expect(bescheidService.uploadAttachment).toHaveBeenCalledWith(
+        bescheidDraftStateResource.resource,
+        file,
       );
     });
 
-    it('should call form service', () => {
-      formService.uploadAttachment = jest.fn();
-      uploadAndGetFile.mockReturnValue(of(createEmptyStateResource()));
-
+    it('should add to file list', () => {
       component.uploadFile(file);
-      component.uploadInProgress$.subscribe();
 
-      expect(formService.uploadAttachment).toHaveBeenCalledWith(createEmptyStateResource());
-    });
-  });
-
-  describe('uploadAndGetFile', () => {
-    const file: File = <any>{ name: 'TestDatei' };
-    let bescheidResource: BescheidResource;
-    let uploadResource: BinaryFileResource;
-
-    beforeEach(() => {
-      bescheidResource = createBescheidResource();
-      uploadResource = createBinaryFileResource();
-      bescheidService.getBescheidDraft.mockReturnValue(of(createStateResource(bescheidResource)));
-      binaryFileService.uploadFile.mockReturnValue(of(createStateResource(uploadResource)));
-    });
-
-    it('should get bescheid draft', () => {
-      component.uploadAndGetFile(file);
-
-      expect(bescheidService.getBescheidDraft).toHaveBeenCalled();
-    });
-
-    it('should upload file', (done) => {
-      const binaryFileStateResource$ = component.uploadAndGetFile(file);
-
-      binaryFileStateResource$.subscribe(() => {
-        expect(binaryFileService.uploadFile).toHaveBeenCalledWith(
-          bescheidResource,
-          BescheidLinkRel.UPLOAD_ATTACHMENT,
-          file,
-          false,
-        );
-        done();
-      });
-    });
-
-    it('should add file to file list', (done) => {
-      const binaryFileStateResource$ = component.uploadAndGetFile(file);
+      component.uploadInProgress$.subscribe();
 
-      binaryFileStateResource$.subscribe(() => {
-        expect(component.fileList[0]).toEqual(uploadResource);
-        done();
-      });
+      expect(component.fileList).toEqual([binaryFileStateResource.resource]);
     });
 
-    it('should emit binary file state resource', () => {
-      const binaryFileStateResource$ = component.uploadAndGetFile(file);
+    it('should emit', () => {
+      component.uploadFile(file);
 
-      expect(binaryFileStateResource$).toBeObservable(
-        cold('(a|)', { a: createStateResource(uploadResource) }),
+      expect(component.uploadInProgress$).toBeObservable(
+        singleColdCompleted(binaryFileStateResource),
       );
     });
   });
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-attachment-hochladen/vorgang-detail-bescheiden-attachment-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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts
index 6632bbe6b17fd5739b97eb99b67f261f1a7bb672..e707f6c2dbcccc73815f858e8adf68726ba57d6a 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts
@@ -1,16 +1,14 @@
-import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
-import { BinaryFileResource, BinaryFileService } from '@alfa-client/binary-file-shared';
+import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import {
   StateResource,
   createEmptyStateResource,
   doOnValidStateResource,
-  isLoaded,
   isNotNil,
 } from '@alfa-client/tech-shared';
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Component, Input, OnDestroy, OnInit } from '@angular/core';
 import { getUrl } from '@ngxp/rest';
-import { Observable, Subscription, filter, first, of, startWith, switchMap } from 'rxjs';
-import { tap } from 'rxjs/operators';
+import { Observable, Subscription, first, of, tap } from 'rxjs';
 import { BescheidenFormService } from '../../../../bescheiden.formservice';
 
 @Component({
@@ -19,6 +17,8 @@ import { BescheidenFormService } from '../../../../bescheiden.formservice';
   styles: [],
 })
 export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnInit, OnDestroy {
+  @Input() bescheidDraftStateResource: StateResource<BescheidResource>;
+
   uploadInProgress$: Observable<StateResource<BinaryFileResource>>;
   fileList: BinaryFileResource[] = [];
   private deleteFileSubscription: Subscription;
@@ -28,7 +28,6 @@ export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnIn
   constructor(
     public readonly formService: BescheidenFormService,
     private readonly bescheidService: BescheidService,
-    private readonly binaryFileService: BinaryFileService,
   ) {
     this.uploadInProgress$ = of(createEmptyStateResource<BinaryFileResource>());
   }
@@ -63,34 +62,16 @@ export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnIn
     return this.fileList.map((fileResource: BinaryFileResource) => getUrl(fileResource));
   }
 
-  public uploadFile(file: File) {
-    this.uploadInProgress$ = this.uploadAndGetFile(file).pipe(
-      tap((stateResource) => this.formService.uploadAttachment(stateResource)),
-      startWith(createEmptyStateResource<BinaryFileResource>(true)),
-    );
-  }
-
-  uploadAndGetFile(file: File): Observable<StateResource<BinaryFileResource>> {
-    return this.bescheidService.getBescheidDraft().pipe(
-      filter(isLoaded),
-      first(),
-      switchMap((bescheidStateResource: StateResource<BescheidResource>) =>
-        this.binaryFileService
-          .uploadFile(
-            bescheidStateResource.resource,
-            BescheidLinkRel.UPLOAD_ATTACHMENT,
-            file,
-            false,
-          )
-          .pipe(
-            tap((stateResource: StateResource<BinaryFileResource>) =>
-              doOnValidStateResource(
-                stateResource,
-                () => (this.fileList = [...this.fileList, stateResource.resource]),
-              ),
-            ),
+  public uploadFile(file: File): void {
+    this.uploadInProgress$ = this.bescheidService
+      .uploadAttachment(this.bescheidDraftStateResource.resource, file)
+      .pipe(
+        tap((stateResource: StateResource<BinaryFileResource>) =>
+          doOnValidStateResource(
+            stateResource,
+            () => (this.fileList = [...this.fileList, stateResource.resource]),
           ),
-      ),
-    );
+        ),
+      );
   }
 }
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 88e80fc07928ff69271f36e4832343d389cce584..e78ff6386bf1b7b908109c15e9d14b2e4c73fbea 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
@@ -9,6 +9,6 @@
   >
     <ods-bescheid-upload-icon icon></ods-bescheid-upload-icon>
     <ods-spinner-icon spinner size="extra-large"></ods-spinner-icon>
-    <div text class="text-center">Bescheid Dokument hochladen</div>
+    <div text class="text-center">Bescheiddokument hochladen</div>
   </ods-single-file-upload-editor>
 </div>
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-dokumente-hinzufuegen.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-dokumente-hinzufuegen.component.html
index 2c98dc3938883b3658342b7bf8194264c0e3bbbc..2cfc7ff99368dc650ab7807c53c4bc0414d00ea4 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-dokumente-hinzufuegen.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-dokumente-hinzufuegen.component.html
@@ -5,5 +5,7 @@
   <alfa-vorgang-detail-bescheiden-dokument-hochladen
     [bescheidDraftStateResource]="bescheidDraftStateResource$ | async"
   ></alfa-vorgang-detail-bescheiden-dokument-hochladen>
-  <alfa-vorgang-detail-bescheiden-attachment-hochladen></alfa-vorgang-detail-bescheiden-attachment-hochladen>
+  <alfa-vorgang-detail-bescheiden-attachment-hochladen
+    [bescheidDraftStateResource]="bescheidDraftStateResource$ | async"
+  ></alfa-vorgang-detail-bescheiden-attachment-hochladen>
 </div>
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-steps-content.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-steps-content.component.ts
index 8bb8b9b2cd8c20339979c950da3561851474eb93..a05c072bc6c488d8b4948180c7f7ebefb58de08a 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-steps-content.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-steps-content.component.ts
@@ -1,4 +1,4 @@
-import { HttpError, StateResource, hasError, isLoaded } from '@alfa-client/tech-shared';
+import { HttpError, StateResource, hasStateResourceError, isLoaded } from '@alfa-client/tech-shared';
 import {
   VorgangService,
   VorgangWithEingangLinkRel,
@@ -61,6 +61,6 @@ export class VorgangDetailBescheidenStepsContentComponent implements OnInit {
   }
 
   noError(stateResource: StateResource<Resource | HttpError>): boolean {
-    return isLoaded(stateResource) && !hasError(stateResource);
+    return isLoaded(stateResource) && !hasStateResourceError(stateResource);
   }
 }
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html
index 8df4670c7d47d8cfc6b998a7d0a0d0b66a4ff803..55a9f67956faa09ff08e2e0849134c690a73059c 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html
@@ -1,10 +1,10 @@
 <ods-button
   *ngIf="showButton$ | async"
-  (click)="clickEmitter.emit($event)"
+  (clickEmitter)="clickEmitter.emit()"
   variant="primary"
   size="medium"
   class="mt-8 flex"
-  data-test-id="bescheid-weiter-button"
+  dataTestId="bescheid-weiter-button"
   text="Weiter"
 >
 </ods-button>
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts
index 46dd5111642b4781159e42e073f20a13214807e2..c82b596f3669350ebd42f569cae44749fa9c92f8 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts
@@ -1,4 +1,5 @@
 import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared';
+import { PostfachService } from '@alfa-client/postfach-shared';
 import { Mock, dispatchEventFromFixture, mock, useFromMock } from '@alfa-client/test-utils';
 import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
@@ -23,6 +24,7 @@ describe('VorgangDetailBescheidenComponent', () => {
   let vorgangService: Mock<VorgangService>;
   let formService: BescheidenFormService;
   let dialogRef: Mock<DialogRef>;
+  let postfachService: Mock<PostfachService>;
 
   let vorgangWithEingangResource: VorgangWithEingangResource;
   let bescheidDraftResource: BescheidResource;
@@ -34,6 +36,7 @@ describe('VorgangDetailBescheidenComponent', () => {
     vorgangService = mock(VorgangService);
     formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService));
     dialogRef = mock(DialogRef);
+    postfachService = mock(PostfachService);
 
     vorgangWithEingangResource = createVorgangWithEingangResource();
     bescheidDraftResource = createBescheidResource();
@@ -73,6 +76,10 @@ describe('VorgangDetailBescheidenComponent', () => {
           provide: DIALOG_DATA,
           useValue: { vorgangWithEingangResource, bescheidDraftResource },
         },
+        {
+          provide: PostfachService,
+          useValue: postfachService,
+        },
       ],
       imports: [ReactiveFormsModule],
     }).compileComponents();
@@ -116,6 +123,12 @@ describe('VorgangDetailBescheidenComponent', () => {
 
       expect(vorgangService.reloadCurrentVorgang).toHaveBeenCalled();
     });
+
+    it('should reload postfach mail list', () => {
+      component.onClose();
+
+      expect(postfachService.setPostfachMailOnReload).toHaveBeenCalled();
+    });
   });
 
   describe('close dialog on bescheiden result', () => {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts
index 9223a68d605e8575a1d48b764a6e839280c7152f..c3a880423edbb95b2b2153db66b3202ae9dd7bad 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts
@@ -1,4 +1,5 @@
 import { BescheidResource } from '@alfa-client/bescheid-shared';
+import { PostfachService } from '@alfa-client/postfach-shared';
 import { VorgangService } from '@alfa-client/vorgang-shared';
 import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
 import { Component, Inject, OnInit } from '@angular/core';
@@ -17,8 +18,9 @@ export class VorgangDetailBescheidenComponent implements OnInit {
 
   constructor(
     public dialogRef: DialogRef,
-    public formService: BescheidenFormService,
-    private vorgangService: VorgangService,
+    public readonly formService: BescheidenFormService,
+    private readonly vorgangService: VorgangService,
+    private readonly postfachService: PostfachService,
     @Inject(DIALOG_DATA) private readonly dialogData: BescheidenDialogData,
   ) {
     this.bescheidDraftResource = dialogData.bescheidDraftResource;
@@ -32,5 +34,6 @@ export class VorgangDetailBescheidenComponent implements OnInit {
   public onClose(): void {
     this.dialogRef.close();
     this.vorgangService.reloadCurrentVorgang();
+    this.postfachService.setPostfachMailOnReload();
   }
 }
diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts
index a96d7ca4e7cd27b2936a41b5b91e9fcbfc1f853d..c9633abfedc9521786c49655796b3304e4a3972e 100644
--- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts
+++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts
@@ -37,7 +37,7 @@ import {
   createStateResource,
   decodeUrlFromEmbedding,
   doIfLoadingRequired,
-  hasError,
+  hasStateResourceError,
   isNotNull,
   isNotUndefined,
   replacePlaceholder,
@@ -327,7 +327,7 @@ export class WiedervorlageService implements OnDestroy {
       this.submitInProgress$.next(createStateResource(commandStateResource.resource));
       this.snackbarService.show(commandStateResource.resource, message);
       this.setWiedervorlageListReload();
-    } else if (hasError(commandStateResource)) {
+    } else if (hasStateResourceError(commandStateResource)) {
       this.submitInProgress$.next(createStateResource(commandStateResource.resource));
     }
   }
diff --git a/alfa-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml
index 961e14d6fa3f44e0a1382e4b26c924e1fe0fd2d2..a0ed2b50fa6eb31acfb21af7156aa2c0590a7cc9 100644
--- a/alfa-server/src/main/resources/application-local.yml
+++ b/alfa-server/src/main/resources/application-local.yml
@@ -12,6 +12,8 @@ grpc:
     user-manager:
       address: static://127.0.0.1:9000
       negotiationType: PLAINTEXT
+    vorgang-manager:
+      negotiationType: PLAINTEXT
 
 ozgcloud:
   feature:
diff --git a/alfa-server/src/main/resources/application.yml b/alfa-server/src/main/resources/application.yml
index 37fafad40ea8fb37e5177621ffb398ff756ccb16..8e17178fea49083f2e1a5035d0b27d50c6670e50 100644
--- a/alfa-server/src/main/resources/application.yml
+++ b/alfa-server/src/main/resources/application.yml
@@ -57,7 +57,7 @@ grpc:
   client:
     vorgang-manager:
       address: static://127.0.0.1:9090
-      negotiationType: PLAINTEXT
+      negotiationType: TLS
     user-manager:
       address: static://127.0.0.1:9000
       negotiationType: TLS
diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml
index 4a3d38c9b4ff9fc0e3183840d1554b666112e25c..cad88f7ba2e55da7b791497853c8ff633af6aaac 100644
--- a/src/main/helm/templates/deployment.yaml
+++ b/src/main/helm/templates/deployment.yaml
@@ -72,6 +72,8 @@ spec:
           value: "/bindings"
         - name: grpc_client_vorgang-manager_address
           value: {{ include "app.grpc_client_vorgang_manager_address" . }}
+        - name: grpc_client_vorgang-manager_negotiationType
+          value: {{ (.Values.vorgangManager).grpcClientNegotiationType | default "TLS" }}
         - name: grpc_client_user-manager_address
           value: {{ include "app.grpc_client_user-manager_address" . }}
         - name: grpc_client_user-manager_negotiationType
@@ -176,12 +178,6 @@ spec:
            mountPath: "/bindings/ca-certificates/type"
            subPath: type
            readOnly: true
-        {{- if not .Values.disableUserManagerGrpcTls }}
-         - name: user-manager-tls-certificate
-           mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem"
-           subPath: ca.crt
-           readOnly: true
-        {{- end }}
          - name: temp-dir
            mountPath: "/tmp"
         {{- if (.Values.sso).tlsCertName }}
@@ -190,15 +186,13 @@ spec:
            subPath: tls.crt
            readOnly: true
         {{- end }}
+         - name: namespace-ca-cert
+           mountPath: "/bindings/namespace-certificate"
+           readOnly: true
       volumes:
          - name: bindings
            configMap:
               name: alfa-bindings-type
-        {{- if not .Values.disableUserManagerGrpcTls }}
-         - name: user-manager-tls-certificate
-           secret:
-              secretName: user-manager-tls-cert
-        {{- end }}
          - name: temp-dir
            emptyDir: {}
         {{- if (.Values.sso).tlsCertName }}
@@ -206,6 +200,17 @@ spec:
            secret:
               secretName: {{ .Values.sso.tlsCertName }}
         {{- end }}
+         - name: namespace-ca-cert
+           projected:
+             sources:
+             - secret:
+                 name: {{ include "app.namespace" . }}-ca-cert
+                 optional: true
+                 items:
+                   - key: ca.crt
+                     path: ca.crt
+             - configMap:
+                 name: alfa-bindings-type
       dnsConfig: {}
       dnsPolicy: ClusterFirst
       imagePullSecrets:
diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml
index aca352c23e4dc350e919c0eb8d3bb45cd79ec40c..91c7626679c859414ff092714b8b21f69796c7df 100644
--- a/src/test/helm/deployment_bindings_test.yaml
+++ b/src/test/helm/deployment_bindings_test.yaml
@@ -38,9 +38,9 @@ set:
   baseUrl: test.company.local
   imagePullSecret: image-pull-secret
 tests:
-  - it: should have volumes
-    set:
-      usermanagerName: user-manager
+  - it: should have volume mounts
+    set: 
+       usermanagerName: user-manager
     asserts:
       - contains:
           path: spec.template.spec.containers[0].volumeMounts
@@ -49,13 +49,6 @@ tests:
             mountPath: "/bindings/ca-certificates/type"
             subPath: type
             readOnly: true
-      - contains:
-          path: spec.template.spec.containers[0].volumeMounts
-          content:
-            name: user-manager-tls-certificate
-            mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem"
-            subPath: ca.crt
-            readOnly: true
       - contains:
           path: spec.template.spec.containers[0].volumeMounts
           content:
@@ -68,9 +61,15 @@ tests:
             mountPath: "/bindings/ca-certificates/ssl-tls-ca.pem"
             subPath: ca.crt
             readOnly: true
-  - it: should have volume mounts
-    set:
-      usermanagerName: user-manager
+      - contains:
+          path: spec.template.spec.containers[0].volumeMounts
+          content:
+            name: namespace-ca-cert
+            mountPath: "/bindings/namespace-certificate"
+            readOnly: true
+  - it: should have volumes
+    set: 
+       usermanagerName: user-manager
     asserts:
       - contains:
           path: spec.template.spec.volumes
@@ -78,12 +77,6 @@ tests:
             name: bindings
             configMap:
               name: alfa-bindings-type
-      - contains:
-          path: spec.template.spec.volumes
-          content:
-            name: user-manager-tls-certificate
-            secret:
-              secretName: user-manager-tls-cert
       - contains:
           path: spec.template.spec.volumes
           content:
@@ -93,6 +86,20 @@ tests:
           path: spec.template.spec.volumes
           content:
             name: sso-tls-certificate
+      - contains:
+          path: spec.template.spec.volumes
+          content:
+              name: namespace-ca-cert
+              projected:
+                sources:
+                  - secret:
+                      items:
+                        - key: ca.crt
+                          path: ca.crt
+                      name: sh-helm-test-ca-cert
+                      optional: true
+                  - configMap:
+                      name: alfa-bindings-type
   - it: should have sso tls cert mount
     set:
       usermanagerName: user-manager
diff --git a/src/test/helm/deployment_defaults_env_test.yaml b/src/test/helm/deployment_defaults_env_test.yaml
index f2b46cc3dcd95eac18f2a1286f97a83034992141..99d108c95f63fc674e22cf2cc369af4db57c0ae5 100644
--- a/src/test/helm/deployment_defaults_env_test.yaml
+++ b/src/test/helm/deployment_defaults_env_test.yaml
@@ -132,3 +132,21 @@ tests:
           content:
             name: grpc_client_user-manager_negotiationType
             value: TLS
+
+  - it: should set vorgang-manager negotiationType plaintext
+    set:
+      vorgangManager.grpcClientNegotiationType: PLAINTEXT
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: grpc_client_vorgang-manager_negotiationType
+            value: PLAINTEXT
+
+  - it: should contain default vorgang-manager negotiationType tls
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: grpc_client_vorgang-manager_negotiationType
+            value: TLS