diff --git a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts
index 7e7207e39038dfd923b4b1560bdda6864496a0f2..dbcb98b4dc2a1a77eb110910dd711bf5b9e40dff 100644
--- a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts
@@ -24,46 +24,45 @@
 import { convertToDataTestId } from '../../support/tech.util';
 
 export class AttachmentContainerE2EComponent {
-  private readonly locatorFileUploadInput: string = '-file-upload-input';
+  private readonly multiUploadInput: string = 'multi-file-upload-button';
+
   private readonly attachmentList: AttachmentListE2EComponent = new AttachmentListE2EComponent();
 
   public getList(): AttachmentListE2EComponent {
     return this.attachmentList;
   }
 
-  public getUploadInput() {
-    return cy.getTestElementContaining(this.locatorFileUploadInput);
+  //TODO Rename getMultiUploadButton
+  public getUploadInput(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.multiUploadInput);
   }
 }
 
 export class AttachmentListE2EComponent {
   private readonly locatorRoot: string = 'file-list';
-  private readonly downloadAttachmentsButton: string = 'download-archive-file-button';
 
-  public getRoot() {
-    return cy.getTestElement(this.locatorRoot);
-  }
+  private readonly downloadArchiveButton: string = 'download-archive-file-button';
 
-  public getItem(fileName: string): AttachmentE2EItem {
-    return new AttachmentE2EItem(fileName);
+  public getRoot(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.locatorRoot);
   }
 
-  public getLoadingOrErrorItem(fileName: string): LoadingErrorAttachmentE2EItem {
-    return new LoadingErrorAttachmentE2EItem(fileName);
+  public getItem(fileName: string): AttachmentListItemE2EComponent {
+    return new AttachmentListItemE2EComponent(fileName);
   }
 
-  public getDownloadAttachmentsButton(): Cypress.Chainable<JQuery<HTMLElement>> {
-    return this.getRoot().findTestElementWithClass(this.downloadAttachmentsButton);
+  public getLoadingOrErrorItem(fileName: string): LoadingErrorAttachmentListeItemE2EComponent {
+    return new LoadingErrorAttachmentListeItemE2EComponent(fileName);
   }
 
-  public downloadAttachments(): Cypress.Chainable<any> {
-    return this.getDownloadAttachmentsButton().click();
+  public getDownloadArchiveButton(): Cypress.Chainable<HTMLElement> {
+    return this.getRoot().getTestElement(this.downloadArchiveButton);
   }
 }
 
-class AttachmentE2EItem {
-  private readonly locatorDeleteButton: string = 'delete-file-button';
-  private readonly locatorDownloadButton: string = 'download-file-button';
+export class AttachmentListItemE2EComponent {
+  private readonly deleteButton: string = 'delete-file-button';
+  private readonly downloadButton: string = 'download-file-button';
 
   private locatorRoot: string;
 
@@ -71,20 +70,20 @@ class AttachmentE2EItem {
     this.locatorRoot = convertToDataTestId(this.fileName) + '-file-item';
   }
 
-  public getRoot() {
+  public getRoot(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.locatorRoot);
   }
 
-  public getDeleteButton() {
-    return this.getRoot().findTestElementWithClass(this.locatorDeleteButton);
+  public getDeleteButton(): Cypress.Chainable<HTMLElement> {
+    return this.getRoot().findTestElementWithClass(this.deleteButton);
   }
 
-  public getDownloadButton() {
-    return this.getRoot().findTestElementWithClass(this.locatorDownloadButton);
+  public getDownloadButton(): Cypress.Chainable<HTMLElement> {
+    return this.getRoot().findTestElementWithClass(this.downloadButton);
   }
 }
 
-class LoadingErrorAttachmentE2EItem {
+export class LoadingErrorAttachmentListeItemE2EComponent {
   private readonly root: string;
   private readonly attachmentSuffix: string = '-file-upload-list-item-attachment-upload';
 
@@ -92,7 +91,7 @@ class LoadingErrorAttachmentE2EItem {
     this.root = convertToDataTestId(this.fileName) + this.attachmentSuffix;
   }
 
-  public getRoot() {
+  public getRoot(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.root);
   }
 }
diff --git a/alfa-client/apps/alfa-e2e/src/components/kommentar/kommentar-list.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/kommentar/kommentar-list.e2e.component.ts
index 42e791b9899b0348637184324cfcf91f0ef5d60b..09cebe8b80f722d1869036d55767e47104031728 100644
--- a/alfa-client/apps/alfa-e2e/src/components/kommentar/kommentar-list.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/kommentar/kommentar-list.e2e.component.ts
@@ -25,54 +25,60 @@ import { convertToDataTestId } from '../../support/tech.util';
 import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component';
 import { UserProfileE2EComponent } from '../user-profile/user-profile.component.e2e';
 
-export class KommentareInVorgangE2EComponent {
-  readonly locatorHinzufuegenButton: string = 'create-kommentar';
-  readonly locatorFormular: string = 'kommentar-formular';
-  readonly locatorFormularSpeichernButton: string = 'add-button';
-  readonly locatorFormularAbbrechenButton: string = 'cancel-button';
-  readonly locatorKommentarList: string = 'kommentar-list-in-vorgang';
-  readonly locatorTextInput: string = 'Kommentar-textarea-input';
-  readonly locatorTextError: string = 'Kommentar-textarea-error';
-
-  private readonly attachmentContainer: AttachmentContainerE2EComponent =
-    new AttachmentContainerE2EComponent();
-
-  readonly locatorRoot: string = 'kommentar-container-in-vorgang';
-
-  public getRoot() {
-    return cy.getTestElement(this.locatorRoot);
+export class KommentarListInVorgangE2EComponent {
+  readonly hinzufuegenButton: string = 'create-kommentar';
+
+  readonly root: string = 'kommentar-container-in-vorgang';
+
+  readonly kommentarList: string = 'kommentar-list-in-vorgang';
+
+  readonly formular: string = 'kommentar-formular';
+  readonly formularItem: string = 'kommentar-list-item-form';
+  readonly formularSpeichernButton: string = 'add-button';
+  readonly formularAbbrechenButton: string = 'cancel-button';
+  readonly textInput: string = 'Kommentar-textarea-input';
+  readonly textError: string = 'Kommentar-textarea-error';
+
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
+
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
+  }
+
+  public getFormular(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.formular);
   }
 
-  public getFormular() {
-    return cy.getTestElement(this.locatorFormular);
+  public getFormulare(): Cypress.Chainable<Element[]> {
+    return cy.getTestElement(this.formularItem);
   }
 
-  public getHinzufuegenButton() {
-    return cy.getTestElement(this.locatorHinzufuegenButton);
+  public getHinzufuegenButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.hinzufuegenButton);
   }
 
-  public getFormularSpeichernButton() {
-    return cy.getTestElement(this.locatorFormularSpeichernButton);
+  public getFormularSpeichernButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.formularSpeichernButton);
   }
 
-  public getFormularAbbrechenButton() {
-    return cy.getTestElement(this.locatorFormularAbbrechenButton);
+  public getFormularAbbrechenButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.formularAbbrechenButton);
   }
 
-  public getKommentarList() {
-    return cy.getTestElement(this.locatorKommentarList);
+  public getKommentarList(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.kommentarList);
   }
 
-  public getTextInput() {
-    return cy.getTestElement(this.locatorTextInput);
+  public getTextInput(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.textInput);
   }
 
-  public getTextError() {
-    return cy.getTestElement(this.locatorTextError);
+  public getTextError(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.textError);
   }
 
-  public getKommentar(text: string): KommentarInVorgangE2E {
-    return new KommentarInVorgangE2E(text);
+  public getKommentar(text: string): KommentarInVorgangE2EComponent {
+    return new KommentarInVorgangE2EComponent(text);
   }
 
   public getAttachmentContainer(): AttachmentContainerE2EComponent {
@@ -80,26 +86,24 @@ export class KommentareInVorgangE2EComponent {
   }
 }
 
-export class KommentarInVorgangE2E {
-  //TODO: Rename to KommentarInVorgangE2EComponent
-
-  private readonly locatorCreatedAt: string = 'kommentar-created-at';
+export class KommentarInVorgangE2EComponent {
+  private readonly root: string;
 
-  private readonly locatorRoot: string;
+  private readonly createdAtInput: string = 'kommentar-created-at';
 
   constructor(private text: string) {
-    this.locatorRoot = 'kommentar-item-' + convertToDataTestId(this.text);
+    this.root = 'kommentar-item-' + convertToDataTestId(this.text);
   }
 
-  public getRoot() {
-    return cy.getTestElement(this.locatorRoot);
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
   }
 
   public getUserProfile(): UserProfileE2EComponent {
-    return new UserProfileE2EComponent(this.locatorRoot);
+    return new UserProfileE2EComponent(this.root);
   }
 
-  public getCreatedAt() {
-    return cy.getTestElement(this.locatorCreatedAt);
+  public getCreatedAt(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.createdAtInput);
   }
 }
diff --git a/alfa-client/apps/alfa-e2e/src/components/postfach/postfach-mail-formular.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/postfach/postfach-mail-formular.e2e.component.ts
index fc4edd22fe768eb8be089b6142314fc6d0227e1c..c1348e724905b5cb8bc0daa0b8a02521cd9b23d9 100644
--- a/alfa-client/apps/alfa-e2e/src/components/postfach/postfach-mail-formular.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/postfach/postfach-mail-formular.e2e.component.ts
@@ -25,43 +25,42 @@ import { getTestElement } from '../../support/cypress-helper';
 import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component';
 
 export class PostfachMailFormularE2EComponent {
-  private readonly locatorEmpfaenger: string = 'postfach-empfaenger';
-  private readonly locatorBetreff: string = 'Betreff-text-input';
-  private readonly locatorBetreffError: string = 'Betreff-text-error';
-  private readonly locatorText: string = 'Text-textarea-input';
-  private readonly locatorTextError: string = 'Text-textarea-error';
-  private readonly locatorSendButton: string = 'postfach-send-button';
+  private readonly empfaenger: string = 'postfach-empfaenger';
+  private readonly betreffInput: string = 'Betreff-text-input';
+  private readonly betreffError: string = 'Betreff-text-error';
+  private readonly textInput: string = 'Text-textarea-input';
+  private readonly textError: string = 'Text-textarea-error';
+  private readonly replyOptionCheckbox: string = 'postfach-reply-option';
+  private readonly sendButton: string = 'postfach-send-button';
 
-  private readonly replyOption: string = 'postfach-reply-option';
-  private readonly attachmentContainer: AttachmentContainerE2EComponent =
-    new AttachmentContainerE2EComponent();
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
 
-  public getEmpfaenger() {
-    return cy.getTestElement(this.locatorEmpfaenger);
+  public getEmpfaenger(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.empfaenger);
   }
 
-  public getBetreff() {
-    return cy.getTestElement(this.locatorBetreff);
+  public getBetreff(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.betreffInput);
   }
 
-  public getBetreffError() {
-    return cy.getTestElement(this.locatorBetreffError);
+  public getBetreffError(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.betreffError);
   }
 
-  public getText() {
-    return cy.getTestElement(this.locatorText);
+  public getText(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.textInput);
   }
 
-  public getTextError() {
-    return cy.getTestElement(this.locatorTextError);
+  public getTextError(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.textError);
   }
 
-  public getSendButton() {
-    return cy.getTestElement(this.locatorSendButton);
+  public getSendButton(): Cypress.Chainable<HTMLElement> {
+    return cy.getTestElement(this.sendButton);
   }
 
-  public getReplyOption() {
-    return getTestElement(this.replyOption).find('.mdc-checkbox__native-control');
+  public getReplyOption(): Cypress.Chainable<HTMLElement> {
+    return getTestElement(this.replyOptionCheckbox).find('.mdc-checkbox__native-control');
   }
 
   public getAttachmentContainer(): AttachmentContainerE2EComponent {
diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts
index 057b39b29c7de8819c69e745af44cda24e300859..4b1e36d8940baf9c31b74c0db1496400ff3f3a16 100644
--- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts
@@ -49,7 +49,6 @@ export class VorgangBescheidWizardE2EComponent {
   private readonly uploadBescheidFileButton: string = '-single-file-upload-button';
   private readonly uploadAttachmentButton: string = 'Anhang_hochladen-file-upload-button';
   private readonly uploadAutomaticBescheid: string = 'create-bescheid-document-button';
-  private readonly mailTextArea: string = 'Text-textarea-editor';
   private readonly saveBescheid: string = 'save-button';
   private readonly sendBescheid: string = 'send-button';
   private readonly confirmAndSaveButton: string = 'confirm-and-save-button';
@@ -63,10 +62,6 @@ export class VorgangBescheidWizardE2EComponent {
 
   private readonly bescheidDocument: string = 'bescheid-document';
   private readonly attachmentDocument: string = 'bescheid-attachments';
-  private readonly bescheidUploadSpinner: string = '[data-test-id="bescheid-document"] ods-spinner-icon';
-  private readonly attachmentUploadSpinner: string = '[data-test-id="bescheid-attachments"] ods-spinner-icon';
-  private readonly bescheidSaveSpinner: string = '[data-test-id="confirm-and-save-button"] ods-spinner-icon';
-  private readonly sendenSpinner: string = '[data-test-id="send-button"] ods-spinner-icon';
   private readonly missingBescheidDocumentMessage: string = 'missing-bescheid-document-error-message';
 
   private locatorRoot: string = 'bescheid-wizard';
@@ -142,35 +137,35 @@ export class VorgangBescheidWizardE2EComponent {
     return cy.getTestElement(this.closeDialog);
   }
 
-  public getCloseVerwerfenButton(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getCloseVerwerfenButton(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.bescheidVerwerfenButton);
   }
 
-  public getCloseSpeichernButton(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getCloseSpeichernButton(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.bescheidSpeichernButton);
   }
 
-  public getUploadBescheidButton(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getUploadBescheidButton(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.uploadBescheidFileButton);
   }
 
-  public getUploadAttachmentButton(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getUploadAttachmentButton(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.uploadAttachmentButton);
   }
 
-  public getFileBescheidValidInWizard(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getFileBescheidValidInWizard(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileBescheidValid}]`);
   }
 
-  public getFileAnhangValidInWizard(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getFileAnhangValidInWizard(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileAnhangValid}]`);
   }
 
-  public getAutomaticBescheidFileInWizard() {
+  public getAutomaticBescheidFileInWizard(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileAutomaticBescheid}]`);
   }
 
-  public getDeleteButtonOfElement(element: string): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getDeleteButtonOfElement(element: string): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(element).find('[title="Anhang löschen"]');
   }
 
@@ -178,30 +173,14 @@ export class VorgangBescheidWizardE2EComponent {
     return filename.replace(/\./g, '') + '-file-item';
   }
 
-  public getBescheidDocument(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getBescheidDocument(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.bescheidDocument);
   }
 
-  public getAttachmentDocument(): Cypress.Chainable<JQuery<HTMLElement>> {
+  public getAttachmentDocument(): Cypress.Chainable<HTMLElement> {
     return cy.getTestElement(this.attachmentDocument);
   }
 
-  public getBescheidUploadSpinner(): Cypress.Chainable<JQuery<HTMLElement>> {
-    return cy.get(this.bescheidUploadSpinner);
-  }
-
-  public getAttachmentUploadSpinner(): Cypress.Chainable<JQuery<HTMLElement>> {
-    return cy.get(this.attachmentUploadSpinner);
-  }
-
-  public getBescheidSaveSpinner(): Cypress.Chainable<JQuery<HTMLElement>> {
-    return cy.get(this.bescheidSaveSpinner);
-  }
-
-  public getSendenSpinner(): Cypress.Chainable<JQuery<HTMLElement>> {
-    return cy.get(this.sendenSpinner);
-  }
-
   public getMailText(): Cypress.Chainable<JQuery<HTMLElement>> {
     return cy.getTestElement(this.nachrichtText);
   }
@@ -274,14 +253,6 @@ export class VorgangBescheidWizardE2EComponent {
     uploadFile(this.getUploadAttachmentButton(), fileName);
   }
 
-  public bescheidUploadSpinnerIsClosed(): void {
-    this.getBescheidUploadSpinner().should('not.exist');
-  }
-
-  public attachmentSpinnerIsClosed(): void {
-    this.getAttachmentUploadSpinner().should('not.exist');
-  }
-
   public enterDate(difference: number): void {
     this.getDateInput().should('exist');
     enterWith(this.getDateInput(), getAdjustedDateGerman(difference));
diff --git a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component.ts
index 36b36d076f83254d26bdaa6babef3975300ebedd..753fe1f790e2f4cdcfc140f93ae23681764b3736 100644
--- a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component.ts
@@ -26,38 +26,37 @@ import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.co
 import { StatusE2EComponent } from './wiedervorlage-status.e2e.component';
 
 export class WiedervorlageInVorgangE2EComponent {
-  private readonly locatorFrist: string = 'frist';
-  private readonly locatorBetreff: string = 'betreff';
-  private readonly locatorLink: string = 'link';
-  private readonly locatorExpandButon: string = 'expand-button';
-  private readonly locatorExpandable: string = 'expandable';
-  private readonly attachmentContainer: AttachmentContainerE2EComponent =
-    new AttachmentContainerE2EComponent();
+  private readonly frist: string = 'frist';
+  private readonly betreff: string = 'betreff';
+  private readonly link: string = 'link';
+  private readonly expandButton: string = 'expand-button';
+  private readonly expandable: string = 'expandable';
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
 
   private locatorRoot: string;
 
-  constructor(private betreff: string) {
-    this.locatorRoot = replaceAllWhitespaces(this.betreff, '_');
+  constructor(private betreffIdentificator: string) {
+    this.locatorRoot = replaceAllWhitespaces(this.betreffIdentificator, '_');
   }
 
-  public getRoot() {
+  public getRoot(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorRoot);
   }
 
-  public getLink() {
-    return this.getRoot().findTestElementWithClass(this.locatorLink);
+  public getLink(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.link);
   }
 
-  public getFrist() {
-    return this.getRoot().findTestElementWithClass(this.locatorFrist);
+  public getFrist(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.frist);
   }
 
-  public getBetreff() {
-    return this.getRoot().findTestElementWithClass(this.locatorBetreff);
+  public getBetreff(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.betreff);
   }
 
-  public getExpandButton() {
-    return this.getRoot().findTestElementWithClass(this.locatorExpandButon);
+  public getExpandButton(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.expandButton);
   }
 
   public getStatus(): StatusE2EComponent {
@@ -68,8 +67,8 @@ export class WiedervorlageInVorgangE2EComponent {
     this.getExpandButton().click();
   }
 
-  public getExpandable() {
-    return this.getRoot().findTestElementWithClass(this.locatorExpandable);
+  public getExpandable(): Cypress.Chainable<Element> {
+    return this.getRoot().findTestElementWithClass(this.expandable);
   }
 
   public getAttachmentContainer(): AttachmentContainerE2EComponent {
diff --git a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts
index e17043afdfaa7c7de564ec7b244ff85b1761985a..a647445a85ed68f65dccd37e8f1416dd0c03c396 100644
--- a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts
@@ -34,31 +34,31 @@ export class WiedervorlageE2EComponent {
 
   private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
 
-  public getBetreff() {
+  public getBetreff(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorBetreffInput);
   }
 
-  public getBetreffError() {
+  public getBetreffError(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorBetreffError);
   }
 
-  public getBeschreibung() {
+  public getBeschreibung(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorBeschreibungInput);
   }
 
-  public getFrist() {
+  public getFrist(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorFristInput);
   }
 
-  public getDatumError() {
+  public getDatumError(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorDatumError);
   }
 
-  public getStatusDot() {
+  public getStatusDot(): Cypress.Chainable<Element> {
     return cy.getTestElementWithClass(this.locatorStatusDot);
   }
 
-  public getSpeichernButton() {
+  public getSpeichernButton(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.locatorSpeichernButton);
   }
 
diff --git a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts
index 91718623842de6e64bb8c0a863ba2146606d68c4..0f5d46f7ab8f257fc75e3f6a1bcd9d3cfd80da56 100644
--- a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts
@@ -24,18 +24,18 @@
 import { WiedervorlageInVorgangE2EComponent } from './wiedervorlage-in-vorgang.e2e.component';
 
 export class WiedervorlagenInVorgangE2EComponent {
-  private readonly locatorCreateWiedervorlageButton: string = 'create-wiedervorlage';
-  private readonly locatorRoot: string = 'wiedervorlagen-in-vorgang';
+  private readonly createWiedervorlageButton: string = 'create-wiedervorlage';
+  private readonly root: string = 'wiedervorlagen-in-vorgang';
 
-  public getRoot() {
-    return cy.getTestElement(this.locatorRoot);
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
   }
 
   public getWiedervorlage(betreff: string): WiedervorlageInVorgangE2EComponent {
     return new WiedervorlageInVorgangE2EComponent(betreff);
   }
 
-  public getCreateWiedervorlageButton() {
-    return cy.getTestElement(this.locatorCreateWiedervorlageButton);
+  public getCreateWiedervorlageButton(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.createWiedervorlageButton);
   }
 }
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts
index e3d96d18276ee39862dd14f25d9a0ed02169b812..8cddad300e40d3cb4c4cca590d69f30845a5314f 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts
@@ -22,18 +22,20 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { sleep } from '@alfa-client/tech-shared';
-import { AttachmentContainerE2EComponent, AttachmentListE2EComponent, } from '../../../components/attachment/attachment.e2e.component';
-import { KommentareInVorgangE2EComponent } from '../../../components/kommentar/kommentar-list.e2e.component';
+import {
+  AttachmentContainerE2EComponent,
+  AttachmentListE2EComponent,
+} from '../../../components/attachment/attachment.e2e.component';
+import { KommentarListInVorgangE2EComponent } from '../../../components/kommentar/kommentar-list.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
-import { UserE2E } from '../../../model/user';
 import { VorgangE2E } from '../../../model/vorgang';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, readFileFromDownloads } from '../../../support/cypress-helper';
 import { exist, notExist } from '../../../support/cypress.util';
 import { TEST_FILE_WITH_CONTENT, TEST_FILE_WITHOUT_CONTENT } from '../../../support/data.util';
-import { uploadFile } from '../../../support/file-upload';
-import { getUserSabine, loginAsSabine } from '../../../support/user-util';
+import { uploadFile, uploadFiles } from '../../../support/file-upload';
+import { loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgang } from '../../../support/vorgang-util';
 
 describe('Kommentar attachments', () => {
@@ -41,7 +43,7 @@ describe('Kommentar attachments', () => {
   const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
 
   const vorgangPage: VorgangPage = new VorgangPage();
-  const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
+  const kommentarContainer: KommentarListInVorgangE2EComponent = vorgangPage.getKommentarContainer();
 
   const attachmentContainer: AttachmentContainerE2EComponent = kommentarContainer.getAttachmentContainer();
   const attachmentList: AttachmentListE2EComponent = attachmentContainer.getList();
@@ -49,7 +51,6 @@ describe('Kommentar attachments', () => {
   const kommentarText: string = 'Test text to test the test text test';
 
   const vorgang: VorgangE2E = createVorgang();
-  const userSabine: UserE2E = getUserSabine();
 
   before(() => {
     initVorgang(vorgang);
@@ -124,20 +125,22 @@ describe('Kommentar attachments', () => {
     });
   });
 
-  describe('Download Kommentar attachments', () => {
-    it('should upload attachment', () => {
+  describe('upload multiple attachments', () => {
+    it('should show files after upload is done', () => {
       kommentarContainer.getKommentar(kommentarText).getRoot().click();
       waitForSpinnerToDisappear();
 
-      uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT);
+      uploadFiles(attachmentContainer.getUploadInput(), [TEST_FILE_WITH_CONTENT, TEST_FILE_WITHOUT_CONTENT]);
       waitForSpinnerToDisappear();
-
       kommentarContainer.getFormularSpeichernButton().click();
       waitForSpinnerToDisappear();
 
       exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+      exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
     });
+  });
 
+  describe('Download Kommentar attachments', () => {
     it('should download uploaded attachment', () => {
       sleep(1000);
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts
index 23754b15795ba5f5ed020b7dd450dad2a2d14fe3..002476fc9fbca92bc87ef43cf52f794266c3c45c 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts
@@ -21,13 +21,13 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { KommentareInVorgangE2EComponent } from '../../../components/kommentar/kommentar-list.e2e.component';
+import { KommentarListInVorgangE2EComponent } from '../../../components/kommentar/kommentar-list.e2e.component';
 import { UserE2E } from '../../../model/user';
 import { VorgangE2E } from '../../../model/vorgang';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections } from '../../../support/cypress-helper';
-import { contains, exist, haveText, notExist } from '../../../support/cypress.util';
+import { contains, exist, haveLength, haveText, notExist } from '../../../support/cypress.util';
 import { getUserSabine, initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgang } from '../../../support/vorgang-util';
 
@@ -35,7 +35,7 @@ describe('Kommentar', () => {
   const mainPage: MainPage = new MainPage();
 
   const vorgangPage: VorgangPage = new VorgangPage();
-  const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer();
+  const kommentarContainer: KommentarListInVorgangE2EComponent = vorgangPage.getKommentarContainer();
 
   const kommentarText: string = 'Test text to test the test text test';
 
@@ -90,7 +90,7 @@ describe('Kommentar', () => {
     });
 
     describe('click on hinzufuegen button in formular', () => {
-      it('should show error on invalid input', () => {
+      it('should show error on empty text', () => {
         kommentarContainer.getFormularSpeichernButton().click();
         waitForSpinnerToDisappear();
 
@@ -101,53 +101,22 @@ describe('Kommentar', () => {
         kommentarContainer.getTextInput().clear().type(kommentarText);
 
         kommentarContainer.getFormularSpeichernButton().click();
-        exist(vorgangPage.getSpinner());
-        notExist(
-          kommentarContainer
-            .getKommentar(kommentarText)
-            .getUserProfile()
-            .getIconContainer()
-            .getAssignedIcon(),
-        );
-        exist(vorgangPage.getSpinner());
         waitForSpinnerToDisappear();
-        exist(
-          kommentarContainer
-            .getKommentar(kommentarText)
-            .getUserProfile()
-            .getIconContainer()
-            .getAssignedIcon(),
-        );
 
+        exist(kommentarContainer.getKommentar(kommentarText).getUserProfile().getIconContainer().getAssignedIcon());
         notExist(kommentarContainer.getTextError());
         notExist(kommentarContainer.getFormular());
         exist(kommentarContainer.getHinzufuegenButton());
-      });
-
-      it('should show entry in list', () => {
         exist(kommentarContainer.getKommentar(kommentarText).getRoot());
       });
 
       it('should show user profile at kommentar', () => {
-        exist(
-          kommentarContainer
-            .getKommentar(kommentarText)
-            .getUserProfile()
-            .getIconContainer()
-            .getAssignedIcon(),
-        );
+        exist(kommentarContainer.getKommentar(kommentarText).getUserProfile().getIconContainer().getAssignedIcon());
         haveText(
-          kommentarContainer
-            .getKommentar(kommentarText)
-            .getUserProfile()
-            .getIconContainer()
-            .getAssignedIcon(),
+          kommentarContainer.getKommentar(kommentarText).getUserProfile().getIconContainer().getAssignedIcon(),
           userSabine.initials,
         );
-        contains(
-          kommentarContainer.getKommentar(kommentarText).getUserProfile().getName(),
-          userSabine.fullName,
-        );
+        contains(kommentarContainer.getKommentar(kommentarText).getUserProfile().getName(), userSabine.fullName);
         exist(kommentarContainer.getKommentar(kommentarText).getCreatedAt());
       });
     });
@@ -212,5 +181,27 @@ describe('Kommentar', () => {
         exist(kommentarContainer.getHinzufuegenButton());
       });
     });
+
+    describe('other kommentar', () => {
+      const otherKommentar: string = 'otherKommentar';
+
+      it('should be created', () => {
+        kommentarContainer.getHinzufuegenButton().click();
+        kommentarContainer.getTextInput().clear().type(otherKommentar);
+        kommentarContainer.getFormularSpeichernButton().click();
+        waitForSpinnerToDisappear();
+
+        haveLength(kommentarContainer.getFormulare(), 0);
+        exist(kommentarContainer.getKommentar(otherKommentar).getRoot());
+      });
+
+      it('should hide previous opened kommentar on edit other kommentar', () => {
+        kommentarContainer.getKommentar(kommentarText).getRoot().click();
+        haveLength(kommentarContainer.getFormulare(), 1);
+
+        kommentarContainer.getKommentar(otherKommentar).getRoot().click();
+        haveLength(kommentarContainer.getFormulare(), 1);
+      });
+    });
   });
 });
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts
index 044306b1063a79e993a306928e4a1bf7d9cbf827..70ef41af32be8a87839358860fa5eb7c7243be28 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts
@@ -22,7 +22,12 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { faker } from '@faker-js/faker';
-import { AttachmentContainerE2EComponent, AttachmentListE2EComponent, } from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component';
+import {
+  AttachmentContainerE2EComponent,
+  AttachmentListE2EComponent,
+} from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component';
+import { E2EAttachmentHelper } from 'apps/alfa-e2e/src/helper/attachment/attachment.helper';
+import { E2EAttachmentVerifier } from 'apps/alfa-e2e/src/helper/attachment/attachment.verifier';
 import { BinaryFileSnackbarMessageE2E } from 'apps/alfa-e2e/src/model/binary-file';
 import { PostfachMailFormularE2EComponent } from '../../../components/postfach/postfach-mail-formular.e2e.component';
 import { PostfachMailE2EComponent, PostfachMailListItem } from '../../../components/postfach/postfach-mail.e2e.component';
@@ -31,7 +36,12 @@ import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.compon
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { VorgangSubnavigationE2EComponent } from '../../../components/vorgang/vorgang-subnavigation';
 import { ClientAttributeNameE2E, ClientAttributesE2E, VorgangE2E } from '../../../model/vorgang';
-import { PostfachMailItemE2E, PostfachNachrichtSnackbarMessageE2E, VorgangAttachedItemClientE2E, VorgangAttachedItemE2E, } from '../../../model/vorgang-attached-item';
+import {
+  PostfachMailItemE2E,
+  PostfachNachrichtSnackbarMessageE2E,
+  VorgangAttachedItemClientE2E,
+  VorgangAttachedItemE2E,
+} from '../../../model/vorgang-attached-item';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { PostfachMailPage } from '../../../page-objects/postfach-mail.component.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
@@ -39,10 +49,20 @@ import { expectIconWithBadge, expectIconWithoutBadge } from '../../../support/an
 import { dropCollections, readFileFromDownloads } from '../../../support/cypress-helper';
 import { beChecked, contains, exist, notBeChecked, notBeVisible, notExist, visible } from '../../../support/cypress.util';
 import { TEST_FILE_WITH_CONTENT, TEST_FILE_WITH_CONTENT_4_MB, TEST_FILE_WITHOUT_CONTENT } from '../../../support/data.util';
-import { uploadEmptyFile, uploadFile } from '../../../support/file-upload';
 import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
-import { createPostfachNachrichtAttachedItem, createPostfachNachrichtReplyItem, initVorgangAttachedItem, } from '../../../support/vorgang-attached-item-util';
-import { buildVorgang, createHasNewPostfachNachrichtClientAttribute, createHasPostfachNachrichtClientAttribute, createVorgang, initVorgaenge, objectIds, } from '../../../support/vorgang-util';
+import {
+  createPostfachNachrichtAttachedItem,
+  createPostfachNachrichtReplyItem,
+  initVorgangAttachedItem,
+} from '../../../support/vorgang-attached-item-util';
+import {
+  buildVorgang,
+  createHasNewPostfachNachrichtClientAttribute,
+  createHasPostfachNachrichtClientAttribute,
+  createVorgang,
+  initVorgaenge,
+  objectIds,
+} from '../../../support/vorgang-util';
 
 describe('PostfachMail', () => {
   const mainPage: MainPage = new MainPage();
@@ -57,6 +77,9 @@ describe('PostfachMail', () => {
   const attachmentContainer: AttachmentContainerE2EComponent = postfachMailFormular.getAttachmentContainer();
   const attachmentList: AttachmentListE2EComponent = attachmentContainer.getList();
 
+  const attachmentHelper: E2EAttachmentHelper = new E2EAttachmentHelper();
+  const attachmentVerifier: E2EAttachmentVerifier = new E2EAttachmentVerifier();
+
   const postfachMailPage: PostfachMailPage = new PostfachMailPage();
 
   const clientAttributes: ClientAttributesE2E = {
@@ -226,45 +249,47 @@ describe('PostfachMail', () => {
 
     describe('attach files', () => {
       it('should show empty attachment after uploading it', () => {
-        uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT);
-        waitForSpinnerToDisappear();
+        attachmentHelper.uploadEmptyAttachment();
 
-        exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+        attachmentVerifier.verifyAttachmentInList(TEST_FILE_WITHOUT_CONTENT);
       });
 
       it('should show attachment with content after uploading it', () => {
-        uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT);
-        waitForSpinnerToDisappear();
+        attachmentHelper.uploadAttachment();
 
-        exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+        attachmentVerifier.verifyAttachmentInList(TEST_FILE_WITH_CONTENT);
       });
 
       it('should download empty attachment on click', () => {
-        attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click();
-        waitForSpinnerToDisappear();
+        attachmentHelper.downloadAttachment(TEST_FILE_WITHOUT_CONTENT);
 
-        exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
+        attachmentVerifier.verifyAttachmentDownload(TEST_FILE_WITHOUT_CONTENT);
       });
 
       it('should download attachment with content on click', () => {
-        attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
-        waitForSpinnerToDisappear();
+        attachmentHelper.downloadAttachment(TEST_FILE_WITH_CONTENT);
 
-        exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT));
+        attachmentVerifier.verifyAttachmentDownload(TEST_FILE_WITH_CONTENT);
       });
 
       it('should not show empty attachment after deleting it', () => {
-        attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDeleteButton().click();
-        waitForSpinnerToDisappear();
+        attachmentHelper.deleteAttachment(TEST_FILE_WITHOUT_CONTENT);
+
+        attachmentVerifier.verifyAttachmentNotInList(TEST_FILE_WITHOUT_CONTENT);
+      });
 
-        notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+      it('should delete and multi upload all', () => {
+        attachmentHelper.deleteAttachments([TEST_FILE_WITH_CONTENT]);
+
+        attachmentHelper.uploadAttachments([TEST_FILE_WITH_CONTENT, TEST_FILE_WITHOUT_CONTENT]);
+
+        attachmentVerifier.verifyAttachmentsInList([TEST_FILE_WITH_CONTENT, TEST_FILE_WITHOUT_CONTENT]);
       });
     });
 
     describe('attach file > 3 MB', () => {
-      it('should show failed upload', () => {
-        uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT_4_MB);
-        waitForSpinnerToDisappear();
+      it('should show failed upload', { defaultCommandTimeout: 90000 }, () => {
+        attachmentHelper.uploadAttachment(TEST_FILE_WITH_CONTENT_4_MB);
 
         exist(attachmentList.getLoadingOrErrorItem(TEST_FILE_WITH_CONTENT_4_MB).getRoot());
         contains(
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-anhang/vorgang-anhang-herunterladen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-anhang/vorgang-anhang-herunterladen.cy.ts
index 66ed9474b72739851ea9c6f0eb4845b761d91377..122141ad34b4cb0fbf1b594b071ffaa932e9166f 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-anhang/vorgang-anhang-herunterladen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-anhang/vorgang-anhang-herunterladen.cy.ts
@@ -132,7 +132,7 @@ describe('Vorgang Anhänge', () => {
     });
 
     it('should download attachment zip file', () => {
-      attachmentList.downloadAttachments();
+      attachmentList.getDownloadArchiveButton().click();
 
       waitForSpinnerToDisappear();
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-abbrechen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-abbrechen.cy.ts
index 7292aa333e4233b18c846485f02d316a080b6dc4..d7f9e7a5a73f9fa0eb942be9e5b64b25e4f53169 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-abbrechen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-abbrechen.cy.ts
@@ -88,9 +88,9 @@ describe('Vorgang - Bescheid abbrechen', () => {
 
     it('should upload files and continue to step 3', () => {
       bescheidWizard.uploadBescheid(TEST_FILE_BESCHEID_VALID);
-      bescheidWizard.bescheidUploadSpinnerIsClosed();
+      waitForSpinnerToDisappear();
       bescheidWizard.uploadAttachment(TEST_FILE_BESCHEID_ANHANG_VALID);
-      bescheidWizard.attachmentSpinnerIsClosed();
+      waitForSpinnerToDisappear();
       bescheidWizard.weiter();
 
       bescheidWizard.isBescheidVersendenStep();
@@ -140,9 +140,10 @@ describe('Vorgang - Bescheid abbrechen', () => {
 
     it('should upload Bescheid and attachment', () => {
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
+
       uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-      notExist(bescheidWizard.getAttachmentUploadSpinner());
+      waitForSpinnerToDisappear();
     });
     it('should open dialog after click on X', () => {
       bescheidWizard.close();
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts
index 7cd0331269d087f962a1602f91a87b27ddf14128..1a8e2f654385e9d00a147f3d87277d3d4c175686 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-automatisch-erstellen.cy.ts
@@ -28,12 +28,7 @@ import { VorgangBescheidWizardE2EComponent } from 'apps/alfa-e2e/src/components/
 import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
 import { VorgangSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation';
 import { SmockerMocks } from 'apps/alfa-e2e/src/model/smocker';
-import {
-  EingangE2E,
-  EingangHeaderE2E,
-  VorgangE2E,
-  VorgangStatusE2E,
-} from 'apps/alfa-e2e/src/model/vorgang';
+import { EingangE2E, EingangHeaderE2E, VorgangE2E, VorgangStatusE2E } from 'apps/alfa-e2e/src/model/vorgang';
 import 'cypress-real-events/support';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
@@ -41,12 +36,7 @@ import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { addSmockerMock, dropCollections } from '../../../support/cypress-helper';
 import { exist, haveText, notExist } from '../../../support/cypress.util';
 import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
-import {
-  buildVorgang,
-  createVorgang,
-  initVorgaenge,
-  objectIds,
-} from '../../../support/vorgang-util';
+import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
 
 registerLocaleData(localeDe, 'de', localeDeExtra);
 
@@ -79,8 +69,7 @@ describe('Upload automatic Bescheid', () => {
     status: VorgangStatusE2E.IN_BEARBEITUNG,
   };
 
-  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent =
-    vorgangPage.getFormularButtons();
+  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
 
   const vorgangSubnavigation: VorgangSubnavigationE2EComponent = vorgangPage.getSubnavigation();
 
@@ -114,8 +103,7 @@ describe('Upload automatic Bescheid', () => {
       waitForSpinnerToDisappear();
       bescheidWizard.getUploadAutomaticBescheidButton().click();
 
-      exist(bescheidWizard.getBescheidUploadSpinner());
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
       exist(bescheidWizard.getAutomaticBescheidFileInWizard());
     });
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts
index 2f0235885f20f005854b6a72df819534cbd15c6c..71531d122d7f3fdc14570feb7d498dd7f449b467 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts
@@ -26,15 +26,25 @@ import localeDe from '@angular/common/locales/de';
 import localeDeExtra from '@angular/common/locales/extra/de';
 import { VorgangBescheidWizardE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component';
 import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
+import { E2EAttachmentHelper } from 'apps/alfa-e2e/src/helper/attachment/attachment.helper';
+import { E2EAttachmentVerifier } from 'apps/alfa-e2e/src/helper/attachment/attachment.verifier';
 import { VorgangE2E, VorgangStatusE2E } from 'apps/alfa-e2e/src/model/vorgang';
 import { uploadFile } from 'apps/alfa-e2e/src/support/file-upload';
 import 'cypress-real-events/support';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
-import { dropCollections, getTestElement } from '../../../support/cypress-helper';
+import { dropCollections } from '../../../support/cypress-helper';
 import { contains, exist, haveText, haveValue, notContains, notExist } from '../../../support/cypress.util';
-import { TEST_FILE_BESCHEID_ANHANG_BIG, TEST_FILE_BESCHEID_ANHANG_VALID, TEST_FILE_BESCHEID_VALID, TEST_FILE_JPEG, TEST_FILE_JPG, TEST_FILE_PNG, TEST_FILE_WITH_CONTENT, } from '../../../support/data.util';
+import {
+  TEST_FILE_BESCHEID_ANHANG_BIG,
+  TEST_FILE_BESCHEID_ANHANG_VALID,
+  TEST_FILE_BESCHEID_VALID,
+  TEST_FILE_JPEG,
+  TEST_FILE_JPG,
+  TEST_FILE_PNG,
+  TEST_FILE_WITH_CONTENT,
+} from '../../../support/data.util';
 import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
 import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
 
@@ -54,6 +64,9 @@ describe('Bescheid Dokumente hochladen', () => {
 
   const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
 
+  const attachmentHelper: E2EAttachmentHelper = new E2EAttachmentHelper();
+  const attachmentVerifier: E2EAttachmentVerifier = new E2EAttachmentVerifier();
+
   const documentError: string = 'Erlaubte Dateiendungen';
   const sizeError: string = 'Anhänge größer';
   const missingBescheidError: string = 'Bitte fügen Sie ein Bescheiddokument hinzu.';
@@ -90,13 +103,15 @@ describe('Bescheid Dokumente hochladen', () => {
 
     it('should upload manual Bescheid file', () => {
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
+
       exist(bescheidWizard.getFileBescheidValidInWizard());
     });
 
     it('should upload attachment file', () => {
-      uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-      exist(bescheidWizard.getFileAnhangValidInWizard());
+      attachmentHelper.uploadAttachment(TEST_FILE_BESCHEID_ANHANG_VALID);
+
+      attachmentVerifier.verifyAttachmentInList(TEST_FILE_BESCHEID_ANHANG_VALID);
     });
 
     it('should still show files after clicking Weiter and step 2', () => {
@@ -127,15 +142,9 @@ describe('Bescheid Dokumente hochladen', () => {
     });
 
     it('should be able to attach all valid types of files', () => {
-      uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_JPG);
-      notExist(bescheidWizard.getAttachmentUploadSpinner());
-      uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_JPEG);
-      notExist(bescheidWizard.getAttachmentUploadSpinner());
-      uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_PNG);
-      notExist(bescheidWizard.getAttachmentUploadSpinner());
-      exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_JPG)));
-      exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_JPEG)));
-      exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_PNG)));
+      attachmentHelper.uploadAttachments([TEST_FILE_JPG, TEST_FILE_JPEG, TEST_FILE_PNG]);
+
+      attachmentVerifier.verifyAttachmentsInList([TEST_FILE_JPG, TEST_FILE_JPEG, TEST_FILE_PNG]);
     });
   });
 
@@ -145,8 +154,9 @@ describe('Bescheid Dokumente hochladen', () => {
       contains(bescheidWizard.getBescheidDocument(), documentError);
     });
 
-    it('should show error if file is too big', () => {
+    it('should show error if file is too big', { defaultCommandTimeout: 90000 }, () => {
       uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_BIG);
+
       contains(bescheidWizard.getAttachmentDocument(), sizeError);
     });
   });
@@ -162,7 +172,7 @@ describe('Bescheid Dokumente hochladen', () => {
   describe('check contents of step 3', () => {
     it('should show Max Testermann as Antragsteller, the default message text', () => {
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
 
       bescheidWizard.getWeiterButton().click();
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts
index 36320a61d712fa2189a6e23b43971de8fe1ffbf6..55c6b8b418ee3224b35210e6b963dbf78e03d268 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts
@@ -29,7 +29,10 @@ import { VorgangBescheideE2EComponent } from 'apps/alfa-e2e/src/components/vorga
 import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
 import { VorgangFormularDatenE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular.e2e.component';
 import { VorgangSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation';
-import { BescheidHistorieItemE2EComponent, VorgangFormularDatenHistorieItemE2EComponent, } from 'apps/alfa-e2e/src/components/vorgang/vorgang.formular-daten.historie.e2e.component';
+import {
+  BescheidHistorieItemE2EComponent,
+  VorgangFormularDatenHistorieItemE2EComponent,
+} from 'apps/alfa-e2e/src/components/vorgang/vorgang.formular-daten.historie.e2e.component';
 import { HistorieHeadlineE2E } from 'apps/alfa-e2e/src/model/historie';
 import { VorgangE2E, VorgangStatusE2E } from 'apps/alfa-e2e/src/model/vorgang';
 import { TEST_FILE_BESCHEID_ANHANG_VALID, TEST_FILE_BESCHEID_VALID } from 'apps/alfa-e2e/src/support/data.util';
@@ -110,9 +113,9 @@ describe('Bescheid History', () => {
         waitForSpinnerToDisappear();
 
         uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-        notExist(bescheidWizard.getBescheidUploadSpinner());
+        waitForSpinnerToDisappear();
         uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-        notExist(bescheidWizard.getAttachmentUploadSpinner());
+        waitForSpinnerToDisappear();
         bescheidWizard.getWeiterButton().click();
         waitForSpinnerToDisappear();
         wait(waitForFormPatchMillis, 'Wait for patch form values to be completed.');
@@ -151,7 +154,7 @@ describe('Bescheid History', () => {
         waitForSpinnerToDisappear();
 
         uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-        notExist(bescheidWizard.getBescheidUploadSpinner());
+        waitForSpinnerToDisappear();
         bescheidWizard.getWeiterButton().click();
         waitForSpinnerToDisappear();
         wait(waitForFormPatchMillis, 'Wait for patch form values to be completed.');
@@ -186,17 +189,16 @@ describe('Bescheid History', () => {
         waitForSpinnerToDisappear();
 
         uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-        notExist(bescheidWizard.getBescheidUploadSpinner());
+        waitForSpinnerToDisappear();
         uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-        notExist(bescheidWizard.getAttachmentUploadSpinner());
+        waitForSpinnerToDisappear();
         uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-        notExist(bescheidWizard.getAttachmentUploadSpinner());
+        waitForSpinnerToDisappear();
         bescheidWizard.getWeiterButton().click();
         waitForSpinnerToDisappear();
 
         bescheidWizard.getSendButton().click();
-        exist(bescheidWizard.getSendenSpinner());
-        notExist(bescheidWizard.getSendenSpinner());
+        waitForSpinnerToDisappear();
 
         vorgangDatenFormular.getHistorieTab().click();
         const historieItemExpand: VorgangFormularDatenHistorieItemE2EComponent = vorgangDatenFormular.getHistorieItemByIndex(0);
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts
index a6d7e8cc4795a1794745211f20c99a6f4a7e213e..d0e5d9939d952ad91aad4b1539b7989decf1f00b 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts
@@ -132,9 +132,9 @@ describe('Bescheid Info anzeigen', () => {
 
     it('should upload files and continue to step 3', () => {
       bescheidWizard.uploadBescheid(TEST_FILE_BESCHEID_VALID);
-      bescheidWizard.bescheidUploadSpinnerIsClosed();
+      waitForSpinnerToDisappear();
       bescheidWizard.uploadAttachment(TEST_FILE_BESCHEID_ANHANG_VALID);
-      bescheidWizard.attachmentSpinnerIsClosed();
+      waitForSpinnerToDisappear();
       bescheidWizard.weiter();
 
       bescheidWizard.isBescheidVersendenStep();
@@ -193,7 +193,7 @@ describe('Bescheid Info anzeigen', () => {
 
     it('should upload Bescheid and continue to step 3', () => {
       bescheidWizard.uploadBescheid(TEST_FILE_BESCHEID_VALID);
-      bescheidWizard.bescheidUploadSpinnerIsClosed();
+      waitForSpinnerToDisappear();
       bescheidWizard.weiter();
       bescheidWizard.isBescheidVersendenStep();
     });
@@ -201,9 +201,7 @@ describe('Bescheid Info anzeigen', () => {
     it('should show 2 Bescheid containers after saving', () => {
       bescheidWizard.getSaveButton().click();
       bescheidWizard.getConfirmAndSaveButton().click();
-      exist(bescheidWizard.getBescheidSaveSpinner());
-      notExist(bescheidWizard.getBescheidSaveSpinner());
-
+      waitForSpinnerToDisappear();
       haveLength(bescheide.getBescheidContainer(), 2);
     });
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts
index f7c01770b981f35ce9753d9898b89648dfcfb685..54c4965b9fb8e41f6cced9749f375e472bc5a262 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts
@@ -83,9 +83,9 @@ describe('Bescheid speichern', () => {
       enterWith(bescheidWizard.getDateInput(), getAdjustedDateGerman(-1));
       bescheidWizard.getWeiterButton().click();
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
       uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-      notExist(bescheidWizard.getAttachmentUploadSpinner());
+      waitForSpinnerToDisappear();
       bescheidWizard.getWeiterButton().click();
       waitForSpinnerToDisappear();
       wait(waitForFormPatchMillis, 'Wait for patch form values to be completed.');
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-senden.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-senden.cy.ts
index 7d5ccdabee70ce2b9e5307e61cf20b79d18919f5..43e23febb7f15a82dd1431890c52590438388cfd 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-senden.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-senden.cy.ts
@@ -32,10 +32,7 @@ import { VorgangBescheidWizardE2EComponent } from 'apps/alfa-e2e/src/components/
 import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components';
 import { VorgangE2E, VorgangStatusE2E } from 'apps/alfa-e2e/src/model/vorgang';
 import { PostfachMailPage } from 'apps/alfa-e2e/src/page-objects/postfach-mail.component.po';
-import {
-  TEST_FILE_BESCHEID_ANHANG_VALID,
-  TEST_FILE_BESCHEID_VALID,
-} from 'apps/alfa-e2e/src/support/data.util';
+import { TEST_FILE_BESCHEID_ANHANG_VALID, TEST_FILE_BESCHEID_VALID } from 'apps/alfa-e2e/src/support/data.util';
 import { uploadFile } from 'apps/alfa-e2e/src/support/file-upload';
 import { getAdjustedDateGerman } from 'apps/alfa-e2e/src/support/tech.util';
 import 'cypress-real-events/support';
@@ -43,7 +40,7 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections } from '../../../support/cypress-helper';
-import { contains, enterWith, exist, notExist } from '../../../support/cypress.util';
+import { contains, enterWith, exist } from '../../../support/cypress.util';
 import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
 import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
 
@@ -66,8 +63,7 @@ describe('Bescheid senden', () => {
     status: VorgangStatusE2E.IN_BEARBEITUNG,
   };
 
-  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent =
-    vorgangPage.getFormularButtons();
+  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
 
   before(() => {
     initVorgaenge([bescheidSendenVorgang]);
@@ -93,9 +89,9 @@ describe('Bescheid senden', () => {
         enterWith(bescheidWizard.getDateInput(), getAdjustedDateGerman(1));
         bescheidWizard.getWeiterButton().click();
         uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-        notExist(bescheidWizard.getBescheidUploadSpinner());
+        waitForSpinnerToDisappear();
         uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID);
-        notExist(bescheidWizard.getAttachmentUploadSpinner());
+        waitForSpinnerToDisappear();
         bescheidWizard.getWeiterButton().click();
 
         bescheidWizard.getSendButton().click();
@@ -114,21 +110,9 @@ describe('Bescheid senden', () => {
         const postfachListItem: PostfachMailListItem = postfachMailPage.getListItem(mailText);
         contains(postfachMailPage.getMailText(), anredeText);
 
-        exist(
-          postfachListItem
-            .getAttachmentContainer()
-            .getList()
-            .getItem(TEST_FILE_BESCHEID_VALID)
-            .getRoot(),
-        );
-
-        exist(
-          postfachListItem
-            .getAttachmentContainer()
-            .getList()
-            .getItem(TEST_FILE_BESCHEID_ANHANG_VALID)
-            .getRoot(),
-        );
+        exist(postfachListItem.getAttachmentContainer().getList().getItem(TEST_FILE_BESCHEID_VALID).getRoot());
+
+        exist(postfachListItem.getAttachmentContainer().getList().getItem(TEST_FILE_BESCHEID_ANHANG_VALID).getRoot());
       });
     });
   });
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
index d02307f1af90ab1e2a3fdaa354534dd8861cba7c..06378019b3ceaf1a1d74e8143846923091b7c2a0 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts
@@ -118,7 +118,7 @@ describe('Bescheid Wizard', () => {
       bescheidWizard.getRoot().should('not.contain', stepCaption3);
 
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
       bescheidWizard.getWeiterButton().click();
       waitForSpinnerToDisappear();
       bescheidWizard.getRoot().contains(stepCaption1);
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-dateien-tab.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-dateien-tab.cy.ts
index c93d89d9e08a0433aa15dc52a59e02b8a848f3c1..c1b5866cb7d4483cae346c7a3b036ae99654975c 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-dateien-tab.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-dateien-tab.cy.ts
@@ -140,7 +140,7 @@ describe('Dateien Tab', () => {
     it('should show attachments and download button', () => {
       exist(vorgangDatenFormular.getFileElementByName(jpgFileName));
       exist(vorgangDatenFormular.getFileElementByName(pdfFileName));
-      exist(attachmentList.getDownloadAttachmentsButton(vorgangDatenFormular.getRoot()));
+      exist(attachmentList.getDownloadArchiveButton());
     });
   });
 });
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-xdomea-inhalte.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-xdomea-inhalte.cy.ts
index 1ed205ce1acecae3028a6682411de030b49c17cb..ff177ddcffc8fae0d04a2294b6c3176c07062abd 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-xdomea-inhalte.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-xdomea-inhalte.cy.ts
@@ -36,10 +36,7 @@ import { VorgangAttachedItemE2E } from 'apps/alfa-e2e/src/model/vorgang-attached
 import { buildCommand, initCommands } from 'apps/alfa-e2e/src/support/command-util';
 import { TEST_FILE_BESCHEID_VALID } from 'apps/alfa-e2e/src/support/data.util';
 import { uploadFile } from 'apps/alfa-e2e/src/support/file-upload';
-import {
-  createKommentar,
-  createKommentarAttachedItem,
-} from 'apps/alfa-e2e/src/support/kommentar.util';
+import { createKommentar, createKommentarAttachedItem } from 'apps/alfa-e2e/src/support/kommentar.util';
 import { initVorgangAttachedItem } from 'apps/alfa-e2e/src/support/vorgang-attached-item-util';
 import { objectIds } from 'apps/alfa-e2e/src/support/vorgang-util';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
@@ -53,7 +50,7 @@ import {
   getDownloadFiles,
   unzipDownloadFile,
 } from '../../../support/cypress-helper';
-import { exist, notExist } from '../../../support/cypress.util';
+import { exist } from '../../../support/cypress.util';
 import { parseXml } from '../../../support/tech.util';
 import { getUserDorotheaId, initUsermanagerUsers, loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgang } from '../../../support/vorgang-util';
@@ -81,11 +78,7 @@ describe('check xDomea contents', () => {
   };
 
   const assignUserCommand: CommandE2E = {
-    ...buildCommand(
-      CommandOrderE2E.ASSIGN_USER,
-      vorgangExportieren._id.$oid,
-      vorgangExportieren._id.$oid,
-    ),
+    ...buildCommand(CommandOrderE2E.ASSIGN_USER, vorgangExportieren._id.$oid, vorgangExportieren._id.$oid),
     bodyObject: { assignedTo: getUserDorotheaId() },
     finishedAt: { $date: '2024-06-20T07:25:30.000Z' },
   };
@@ -102,11 +95,7 @@ describe('check xDomea contents', () => {
   };
 
   const setAktenzeichenCommand: CommandE2E = {
-    ...buildCommand(
-      CommandOrderE2E.SET_AKTENZEICHEN,
-      vorgangExportieren._id.$oid,
-      vorgangExportieren._id.$oid,
-    ),
+    ...buildCommand(CommandOrderE2E.SET_AKTENZEICHEN, vorgangExportieren._id.$oid, vorgangExportieren._id.$oid),
     order: CommandOrderE2E.SET_AKTENZEICHEN,
     bodyObject: { aktenzeichen: 'AKT_ENZ_EIC_HEN1' },
     finishedAt: { $date: '2024-06-19T07:25:30.000Z' },
@@ -121,8 +110,7 @@ describe('check xDomea contents', () => {
     item: kommentar,
   };
 
-  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent =
-    vorgangPage.getFormularButtons();
+  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons();
 
   const bescheidWizard: VorgangBescheidWizardE2EComponent = vorgangPage.getBescheidWizard();
 
@@ -148,7 +136,7 @@ describe('check xDomea contents', () => {
       vorgangFormularButtons.getBescheidenButton().click();
       bescheidWizard.weiter();
       uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
-      notExist(bescheidWizard.getBescheidUploadSpinner());
+      waitForSpinnerToDisappear();
       bescheidWizard.weiter();
       bescheidWizard.getSendButton().click();
       waitForSpinnerToDisappear();
@@ -237,12 +225,7 @@ describe('check xDomea contents', () => {
     return getXMLFromTagAtPosition(xdomeaNamespace, content, tagName, position);
   }
 
-  function getXMLFromTagAtPosition(
-    namespaceURI: string,
-    content: string,
-    tagName: string,
-    position: number,
-  ) {
+  function getXMLFromTagAtPosition(namespaceURI: string, content: string, tagName: string, position: number) {
     const xmlDoc = parseXml(content);
     return xmlDoc.getElementsByTagNameNS(namespaceURI, tagName)[position].textContent;
   }
@@ -273,9 +256,7 @@ describe('check xDomea contents', () => {
 
   function compareXmlEntry(xDomeaFile: string, xmlMap: Map<XmlTypePosition, string>) {
     xmlMap.forEach((expectedValue, xmlTypePosition) => {
-      expect(
-        getXdomeaNamespace(xDomeaFile, xmlTypePosition.type, xmlTypePosition.position),
-      ).to.equal(expectedValue);
+      expect(getXdomeaNamespace(xDomeaFile, xmlTypePosition.type, xmlTypePosition.position)).to.equal(expectedValue);
     });
   }
 
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
index a32737f51ba4be5eb46a092f211db36236f239cf..fa176831377d0b9775f4991bdaa1ccd2454df68a 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts
@@ -21,10 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { AttachmentContainerE2EComponent, AttachmentListE2EComponent, } from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component';
+import {
+  AttachmentContainerE2EComponent,
+  AttachmentListE2EComponent,
+} from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component';
 import { WiedervorlageSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-subnavigation';
+import { E2EAttachmentHelper } from 'apps/alfa-e2e/src/helper/attachment/attachment.helper';
+import { E2EWiedervorlageHelper } from 'apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.helper';
 import { WiedervorlageE2E } from 'apps/alfa-e2e/src/model/wiedervorlage';
-import { dropCollections, readFileFromDownloads, wait } from 'apps/alfa-e2e/src/support/cypress-helper';
+import { dropCollections, readFileFromDownloads } from 'apps/alfa-e2e/src/support/cypress-helper';
 import { initVorgangAttachedItem } from 'apps/alfa-e2e/src/support/vorgang-attached-item-util';
 import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
@@ -37,7 +42,6 @@ import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po';
 import { containClass, contains, exist, haveLength, notContainClass, notExist } from '../../../support/cypress.util';
 import { TEST_FILE_WITH_CONTENT, TEST_FILE_WITH_CONTENT_46MB, TEST_FILE_WITHOUT_CONTENT } from '../../../support/data.util';
-import { uploadEmptyFile, uploadFile } from '../../../support/file-upload';
 import { loginAsSabine } from '../../../support/user-util';
 import { createVorgang, initVorgang, objectIds } from '../../../support/vorgang-util';
 import { createWiedervorlageAttachedItem, createWiedervorlageItem } from '../../../support/wiedervorlage-util';
@@ -60,6 +64,9 @@ describe('Wiedervorlage attachments', () => {
 
   const snackbar: SnackBarE2EComponent = mainPage.getSnackBar();
 
+  const wiedervorlageHelper: E2EWiedervorlageHelper = new E2EWiedervorlageHelper();
+  const attachmentHelper: E2EAttachmentHelper = new E2EAttachmentHelper();
+
   const WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF: string = 'WiedervorlageWithAttachments';
 
   const vorgang: VorgangE2E = createVorgang();
@@ -89,36 +96,31 @@ describe('Wiedervorlage attachments', () => {
     });
 
     it('should show wiedervorlage page on click on create wiedervorlage button', () => {
-      wiedervorlageContainerInVorgang.getCreateWiedervorlageButton().click();
-      waitForSpinnerToDisappear();
+      wiedervorlageHelper.openNewWiedervorlage();
 
       exist(wiedervorlagePage.getRoot());
     });
 
     it('should show empty attachment after upload', () => {
-      uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT);
-      waitForSpinnerToDisappear();
+      attachmentHelper.uploadEmptyAttachment();
 
       exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
     });
 
     it('should download empty attachment on click', () => {
-      attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click();
-      waitForSpinnerToDisappear();
+      attachmentHelper.downloadAttachment(TEST_FILE_WITHOUT_CONTENT);
 
       exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
     });
 
     it('should show attachment with content after download', () => {
-      uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT);
-      waitForSpinnerToDisappear();
+      attachmentHelper.uploadAttachment(TEST_FILE_WITH_CONTENT);
 
       exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
     });
 
-    it('should show failed upload', { defaultCommandTimeout: 30000 }, () => {
-      uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT_46MB);
-      waitForSpinnerToDisappear();
+    it('should show failed upload on bigger size than allowed', { defaultCommandTimeout: 300000 }, () => {
+      attachmentHelper.uploadAttachment(TEST_FILE_WITH_CONTENT_46MB);
 
       exist(attachmentList.getLoadingOrErrorItem(TEST_FILE_WITH_CONTENT_46MB).getRoot());
       contains(
@@ -128,8 +130,7 @@ describe('Wiedervorlage attachments', () => {
     });
 
     it('should download attachment on click', () => {
-      attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
-      waitForSpinnerToDisappear();
+      attachmentHelper.downloadAttachment(TEST_FILE_WITH_CONTENT);
 
       exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT));
     });
@@ -205,22 +206,63 @@ describe('Wiedervorlage attachments', () => {
     });
   });
 
-  describe('Delete attachment', () => {
+  describe('Upload multiple attachments', () => {
     const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(
       WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF,
     );
 
     it('should open wiedervorlage page', () => {
-      wiedervorlageComp.getLink().click();
+      wiedervorlageHelper.openWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF);
+
+      exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+      exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+    });
+
+    it('should delete all', () => {
+      attachmentHelper.deleteAttachment(TEST_FILE_WITH_CONTENT);
+      attachmentHelper.deleteAttachment(TEST_FILE_WITHOUT_CONTENT);
+
+      notExist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+      notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+    });
+
+    it('should do upload', () => {
+      attachmentHelper.uploadAttachments([TEST_FILE_WITHOUT_CONTENT, TEST_FILE_WITH_CONTENT]);
+
+      exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+      exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+
+      wiedervorlageContainer.getSpeichernButton().click();
+      exist(snackbar.getMessage());
+      contains(snackbar.getMessage(), `Die Wiedervorlage "${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF}" wurde gespeichert`);
+      snackbar.getCloseButton().click();
+    });
+
+    it('check attachments in wiedervorlage list', () => {
       waitForSpinnerToDisappear();
 
+      wiedervorlageComp.getExpandButton();
+      wiedervorlageComp.expandItem();
+
+      exist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
+      exist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot());
+    });
+  });
+
+  describe('Delete attachment', () => {
+    const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(
+      WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF,
+    );
+
+    it('should open wiedervorlage page', () => {
+      wiedervorlageHelper.openWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF);
+
       exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
       exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
     });
 
     it('delete', () => {
-      attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDeleteButton().click();
-      waitForSpinnerToDisappear();
+      attachmentHelper.deleteAttachment(TEST_FILE_WITHOUT_CONTENT);
 
       notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
       exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
@@ -239,6 +281,7 @@ describe('Wiedervorlage attachments', () => {
 
       wiedervorlageComp.getExpandButton();
       wiedervorlageComp.expandItem();
+      waitForSpinnerToDisappear();
 
       notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
       exist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot());
@@ -251,28 +294,22 @@ describe('Wiedervorlage attachments', () => {
     );
 
     it('should not show any attachments', () => {
-      wiedervorlageComp.getLink().click();
-      waitForSpinnerToDisappear();
+      wiedervorlageHelper.openWiedervorlage(wiedervorlage.betreff);
 
       notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
       notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot());
 
       wiedervorlagePage.getSubnavigation().navigateBack();
+      waitForSpinnerToDisappear();
     });
   });
 
   describe('Same number of attachments after status change', () => {
-    const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(
-      WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF,
-    );
-
     it('should open wiedervorlage page', () => {
-      wait(500);
-      wiedervorlageComp.getLink().click();
-
-      waitForSpinnerToDisappear();
+      wiedervorlageHelper.openWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF);
 
       exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
+      notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
     });
 
     it('should mark as erledigt', () => {
@@ -317,8 +354,7 @@ describe('Wiedervorlage attachments', () => {
 
   describe('delete last attachment', () => {
     it('should remove on delete', () => {
-      attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDeleteButton().click();
-      waitForSpinnerToDisappear();
+      attachmentHelper.deleteAttachment(TEST_FILE_WITH_CONTENT);
 
       notExist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
     });
@@ -337,7 +373,7 @@ describe('Wiedervorlage attachments', () => {
       notExist(snackBar.getMessage());
     });
 
-    it('(Skip reason in OZG-4658) should have no attachments after save', () => {
+    it('should have no attachments after save', () => {
       const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(
         WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF,
       );
diff --git a/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.executor.ts b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.executor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..25b0dce789373955a60b97632848ac2c8c218dde
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.executor.ts
@@ -0,0 +1,44 @@
+import { AttachmentContainerE2EComponent, AttachmentE2EItem } from '../../components/attachment/attachment.e2e.component';
+import { waitForSpinnerToDisappear } from '../../page-objects/main.po';
+import { exist, notExist } from '../../support/cypress.util';
+import { uploadEmptyFile, uploadFiles } from '../../support/file-upload';
+
+export class E2EAttachmentExecutor {
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
+
+  public uploadAttachment(fileNames: string[]): void {
+    uploadFiles(this.getUploadInput(), fileNames);
+    waitForSpinnerToDisappear();
+  }
+
+  public uploadEmptyAttachment(fileName: string): void {
+    uploadEmptyFile(this.getUploadInput(), fileName);
+    waitForSpinnerToDisappear();
+  }
+
+  private getUploadInput(): Cypress.Chainable<HTMLElement> {
+    return this.attachmentContainer.getUploadInput();
+  }
+
+  public deleteAttachments(fileNames: string[]): void {
+    fileNames.forEach((fileName: string) => this.deleteAttachment(fileName));
+  }
+
+  private deleteAttachment(fileName: string): void {
+    const attachment: AttachmentE2EItem = this.getAttachment(fileName);
+    exist(attachment.getRoot());
+    attachment.getDeleteButton().click();
+    notExist(attachment.getRoot());
+  }
+
+  public downloadAttachment(fileName: string): void {
+    const attachment: AttachmentE2EItem = this.getAttachment(fileName);
+    exist(attachment.getRoot());
+    attachment.getDownloadButton().click();
+    waitForSpinnerToDisappear();
+  }
+
+  private getAttachment(fileName: string): AttachmentE2EItem {
+    return this.attachmentContainer.getList().getItem(fileName);
+  }
+}
diff --git a/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dd9743081a8eae3596b692daf53ff5b2479ce74b
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts
@@ -0,0 +1,30 @@
+import { TEST_FILE_WITH_CONTENT, TEST_FILE_WITHOUT_CONTENT } from '../../support/data.util';
+import { E2EAttachmentExecutor } from './attachment.executor';
+
+export class E2EAttachmentHelper {
+  private readonly executor: E2EAttachmentExecutor = new E2EAttachmentExecutor();
+
+  public deleteAttachment(fileName: string): void {
+    this.deleteAttachments([fileName]);
+  }
+
+  public deleteAttachments(fileNames: string[]): void {
+    this.executor.deleteAttachments(fileNames);
+  }
+
+  public uploadAttachment(fileName: string = TEST_FILE_WITH_CONTENT): void {
+    this.uploadAttachments([fileName]);
+  }
+
+  public uploadAttachments(fileNames: string[]): void {
+    this.executor.uploadAttachment(fileNames);
+  }
+
+  public uploadEmptyAttachment(fileName: string = TEST_FILE_WITHOUT_CONTENT): void {
+    this.executor.uploadEmptyAttachment(fileName);
+  }
+
+  public downloadAttachment(fileName: string): void {
+    this.executor.downloadAttachment(fileName);
+  }
+}
diff --git a/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.verifier.ts b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.verifier.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2c68292a0e10bdfac3e20d83377120a258d08b25
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.verifier.ts
@@ -0,0 +1,23 @@
+import { AttachmentContainerE2EComponent } from '../../components/attachment/attachment.e2e.component';
+import { readFileFromDownloads } from '../../support/cypress-helper';
+import { exist, notExist } from '../../support/cypress.util';
+
+export class E2EAttachmentVerifier {
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
+
+  public verifyAttachmentsInList(filesNames: string[]): void {
+    filesNames.forEach((filesName: string) => this.verifyAttachmentInList(filesName));
+  }
+
+  public verifyAttachmentInList(filesName: string): void {
+    exist(this.attachmentContainer.getList().getItem(filesName).getRoot());
+  }
+
+  public verifyAttachmentNotInList(filesName: string): void {
+    notExist(this.attachmentContainer.getList().getItem(filesName).getRoot());
+  }
+
+  public verifyAttachmentDownload(fileName: string): void {
+    exist(readFileFromDownloads(fileName));
+  }
+}
diff --git a/alfa-client/apps/alfa-e2e/src/helper/kommentar/kommentar.executor.ts b/alfa-client/apps/alfa-e2e/src/helper/kommentar/kommentar.executor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.helper.ts b/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.helper.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2c6c96e50c79a44ee3d6a771d16e5a74fb3bd1a5
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.helper.ts
@@ -0,0 +1,13 @@
+import { E2EWiedervorlageNavigator } from './wiedervorlage.navigator';
+
+export class E2EWiedervorlageHelper {
+  private navigator: E2EWiedervorlageNavigator = new E2EWiedervorlageNavigator();
+
+  public openWiedervorlage(betreff: string): void {
+    this.navigator.openWiedervorlage(betreff);
+  }
+
+  public openNewWiedervorlage(): void {
+    this.navigator.openNewWiedervorlage();
+  }
+}
diff --git a/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.navigator.ts b/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.navigator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..42fe2c26a02ce0b3518c7bcd0f39aabaf9a25edd
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/helper/wiedervorlage/wiedervorlage.navigator.ts
@@ -0,0 +1,26 @@
+import { WiedervorlageInVorgangE2EComponent } from '../../components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component';
+import { WiedervorlagenInVorgangE2EComponent } from '../../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component';
+import { VorgangPage } from '../../page-objects/vorgang.po';
+import { WiedervorlagePage } from '../../page-objects/wiedervorlage.po';
+import { exist } from '../../support/cypress.util';
+
+export class E2EWiedervorlageNavigator {
+  private vorgangPage: VorgangPage = new VorgangPage();
+  private wiedervorlagenInVorgang: WiedervorlagenInVorgangE2EComponent = this.vorgangPage.getWiedervorlagenContainer();
+
+  private wiedervorlagePage: WiedervorlagePage = new WiedervorlagePage();
+
+  public openWiedervorlage(betreff: string): void {
+    const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = this.wiedervorlagenInVorgang.getWiedervorlage(betreff);
+    exist(wiedervorlageInVorgang.getRoot());
+    exist(wiedervorlageInVorgang.getLink());
+    wiedervorlageInVorgang.getLink().click();
+    exist(this.wiedervorlagePage.getHeadline());
+  }
+
+  public openNewWiedervorlage(): void {
+    exist(this.wiedervorlagenInVorgang.getCreateWiedervorlageButton());
+    this.wiedervorlagenInVorgang.getCreateWiedervorlageButton().click();
+    exist(this.wiedervorlagePage.getHeadline());
+  }
+}
diff --git a/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts b/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts
index caa0e2872c6ffb9820602075dd194c072b8b6008..6a1d1b397b3e0a9eb91362cd0220230b67a5db14 100644
--- a/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts
+++ b/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AttachmentContainerE2EComponent } from '../components/attachment/attachment.e2e.component';
-import { KommentareInVorgangE2EComponent } from '../components/kommentar/kommentar-list.e2e.component';
+import { KommentarListInVorgangE2EComponent } from '../components/kommentar/kommentar-list.e2e.component';
 import { PostfachMailFormularE2EComponent } from '../components/postfach/postfach-mail-formular.e2e.component';
 import { PostfachMailE2EComponent } from '../components/postfach/postfach-mail.e2e.component';
 import { FixedDialogE2EComponent } from '../components/ui/fixed-dialog.e2e.component';
@@ -40,42 +40,29 @@ import { VorgangZusammenarbeitE2EComponent } from '../components/vorgang/vorgang
 import { WiedervorlagenInVorgangE2EComponent } from '../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component';
 
 export class VorgangPage {
-  private readonly subnavigation: VorgangSubnavigationE2EComponent =
-    new VorgangSubnavigationE2EComponent();
-  private readonly vorgangDetailHeader: VorgangDetailHeaderE2EComponent =
-    new VorgangDetailHeaderE2EComponent();
-  private readonly formularDatenContainer: VorgangFormularDatenE2EComponent =
-    new VorgangFormularDatenE2EComponent();
-  private readonly formularButtons: VorgangFormularButtonsE2EComponent =
-    new VorgangFormularButtonsE2EComponent();
+  private readonly subnavigation: VorgangSubnavigationE2EComponent = new VorgangSubnavigationE2EComponent();
+  private readonly vorgangDetailHeader: VorgangDetailHeaderE2EComponent = new VorgangDetailHeaderE2EComponent();
+  private readonly formularDatenContainer: VorgangFormularDatenE2EComponent = new VorgangFormularDatenE2EComponent();
+  private readonly formularButtons: VorgangFormularButtonsE2EComponent = new VorgangFormularButtonsE2EComponent();
   private readonly moreMenu: VorgangMoreMenuE2EComponent = new VorgangMoreMenuE2EComponent();
-  private readonly aktenzeichenEditor: VorgangAktenzeichenEditE2EComponent =
-    new VorgangAktenzeichenEditE2EComponent();
-  private readonly bescheidWizard: VorgangBescheidWizardE2EComponent =
-    new VorgangBescheidWizardE2EComponent();
+  private readonly aktenzeichenEditor: VorgangAktenzeichenEditE2EComponent = new VorgangAktenzeichenEditE2EComponent();
+  private readonly bescheidWizard: VorgangBescheidWizardE2EComponent = new VorgangBescheidWizardE2EComponent();
   private readonly bescheide: VorgangBescheideE2EComponent = new VorgangBescheideE2EComponent();
-  private readonly wiedervorlagen: WiedervorlagenInVorgangE2EComponent =
-    new WiedervorlagenInVorgangE2EComponent();
-  private readonly forwardingContainer: VorgangForwardingE2EComponent =
-    new VorgangForwardingE2EComponent();
-  private readonly attachmentContainer: AttachmentContainerE2EComponent =
-    new AttachmentContainerE2EComponent();
-  private readonly kommentarContainer: KommentareInVorgangE2EComponent =
-    new KommentareInVorgangE2EComponent();
+  private readonly wiedervorlagen: WiedervorlagenInVorgangE2EComponent = new WiedervorlagenInVorgangE2EComponent();
+  private readonly forwardingContainer: VorgangForwardingE2EComponent = new VorgangForwardingE2EComponent();
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
+  private readonly kommentarContainer: KommentarListInVorgangE2EComponent = new KommentarListInVorgangE2EComponent();
   private readonly postfachMailContainer: PostfachMailE2EComponent = new PostfachMailE2EComponent();
-  private readonly antragstellerContainer: AntragstellerE2EComponent =
-    new AntragstellerE2EComponent();
-  private readonly zusammenArbeitContainer: VorgangZusammenarbeitE2EComponent =
-    new VorgangZusammenarbeitE2EComponent();
+  private readonly antragstellerContainer: AntragstellerE2EComponent = new AntragstellerE2EComponent();
+  private readonly zusammenArbeitContainer: VorgangZusammenarbeitE2EComponent = new VorgangZusammenarbeitE2EComponent();
 
   private readonly fixedDialog: FixedDialogE2EComponent = new FixedDialogE2EComponent();
-  private readonly postfachMailFormular: PostfachMailFormularE2EComponent =
-    new PostfachMailFormularE2EComponent();
+  private readonly postfachMailFormular: PostfachMailFormularE2EComponent = new PostfachMailFormularE2EComponent();
 
   private readonly locatorSpinner: string = 'spinner';
   private readonly locatorProgressBar: string = 'progress-bar';
 
-  public getKommentarContainer(): KommentareInVorgangE2EComponent {
+  public getKommentarContainer(): KommentarListInVorgangE2EComponent {
     return this.kommentarContainer;
   }
 
diff --git a/alfa-client/apps/alfa-e2e/src/page-objects/wiedervorlage.po.ts b/alfa-client/apps/alfa-e2e/src/page-objects/wiedervorlage.po.ts
index ce5c00e85ce61eb22109881bf26ab4bf3f121b02..cf253b1d3e54ade65ed5711a9b689e88b2640baf 100644
--- a/alfa-client/apps/alfa-e2e/src/page-objects/wiedervorlage.po.ts
+++ b/alfa-client/apps/alfa-e2e/src/page-objects/wiedervorlage.po.ts
@@ -25,20 +25,24 @@ import { WiedervorlageE2EComponent } from '../components/wiedervorlage/wiedervor
 import { WiedervorlageSubnavigationE2EComponent } from '../components/wiedervorlage/wiedervorlage-subnavigation';
 
 export class WiedervorlagePage {
-  private readonly subnavigation: WiedervorlageSubnavigationE2EComponent =
-    new WiedervorlageSubnavigationE2EComponent();
-  private readonly wiedervorlageContainer: WiedervorlageE2EComponent =
-    new WiedervorlageE2EComponent();
-  private readonly locatorWiedervorlagePage: string = 'wiedervorlage-page';
+  private readonly root: string = 'wiedervorlage-page';
 
-  public getRoot() {
-    return cy.getTestElement(this.locatorWiedervorlagePage);
+  private readonly subnavigation: WiedervorlageSubnavigationE2EComponent = new WiedervorlageSubnavigationE2EComponent();
+  private readonly headline: string = 'wiedervorlage-headline';
+  private readonly wiedervorlageContainer: WiedervorlageE2EComponent = new WiedervorlageE2EComponent();
+
+  public getRoot(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.root);
   }
 
   public getSubnavigation(): WiedervorlageSubnavigationE2EComponent {
     return this.subnavigation;
   }
 
+  public getHeadline(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.headline);
+  }
+
   public getWiedervorlageContainer(): WiedervorlageE2EComponent {
     return this.wiedervorlageContainer;
   }
diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts
index 9c2bd2f7944d04ee78e668cf89f1cbe9c396689f..b4f477e2422f3bd0ea391d7d3259c29bd4b2a8a6 100644
--- a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts
@@ -134,11 +134,12 @@ export function initUsermanagerData(data: UsermanagerUserE2E[]): void {
   cy.task(CypressTasks.INIT_USERMANAGER_DATA, { collection: MongoCollections.USER, data });
 }
 
-export function dropCollections() {
+export function dropCollections(): void {
   cy.task(CypressTasks.DROP_COLLECTIONS, [
     MongoCollections.COMMAND,
     MongoCollections.VORGANG,
     MongoCollections.VORGANG_ATTACHED_ITEM,
+    MongoCollections.OZG_CLOUD_FILE,
     MongoCollections.FS_FILES,
     MongoCollections.FS_CHUNKS,
   ]);
diff --git a/alfa-client/apps/alfa-e2e/src/support/data.util.ts b/alfa-client/apps/alfa-e2e/src/support/data.util.ts
index 47f84cd7927ba964684b1de514a846d866d188af..46c335ab573be9cd33c24970ebd37cce56f1da15 100644
--- a/alfa-client/apps/alfa-e2e/src/support/data.util.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/data.util.ts
@@ -36,10 +36,13 @@ export const ORGANISATIONSEINHEITEN_ID_FOR_ADELHEIT = '10363455';
 export const ORGANISATIONSEINHEITEN_ID_FOR_SABINE = '9030229';
 export const ORGANISATIONSEINHEITEN_ID_FOR_BEATE = '12345678';
 
+//TODO Rename = nicht fachlich bezogen bspw. TEST_FILE_WITH_CONTENT_5_MB anstelle von "invalid" oder "big"
 export const TEST_FILE_BESCHEID_VALID: string = 'Bescheid_valid.pdf';
 export const TEST_FILE_BESCHEID_BIG: string = 'Bescheid_5mb.pdf';
 export const TEST_FILE_BESCHEID_ANHANG_VALID: string = 'Anhang_valid.pdf';
 export const TEST_FILE_BESCHEID_ANHANG_BIG: string = 'Anhang_5mb.pdf';
+//
+
 export const TEST_FILE_JPG: string = 'small_jpg.jpg';
 export const TEST_FILE_JPEG: string = 'small_jpeg.jpeg';
 export const TEST_FILE_PNG: string = 'small_png.png';
diff --git a/alfa-client/apps/alfa-e2e/src/support/file-upload.ts b/alfa-client/apps/alfa-e2e/src/support/file-upload.ts
index eb8b69908acb11159d4c8b35d1ee8471bc4b9637..d01cc9a98299f7766f316a5b84bda890e4c7e3ba 100644
--- a/alfa-client/apps/alfa-e2e/src/support/file-upload.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/file-upload.ts
@@ -23,10 +23,14 @@
  */
 import 'cypress-file-upload';
 
-export function uploadFile(inputElement: any, fileName: string): void {
-  inputElement.attachFile(fileName);
+export function uploadFile(inputElement: Cypress.Chainable<HTMLElement>, fileName: string): void {
+  uploadFiles(inputElement, [fileName]);
 }
 
-export function uploadEmptyFile(inputElement: any, fileName: string): void {
+export function uploadFiles(inputElement: Cypress.Chainable<HTMLElement>, fileNames: string[]): void {
+  inputElement.attachFile(fileNames);
+}
+
+export function uploadEmptyFile(inputElement: Cypress.Chainable<HTMLElement>, fileName: string): void {
   inputElement.attachFile(fileName, { allowEmpty: true });
 }
diff --git a/alfa-client/libs/binary-file/src/lib/download-archive-file-button-container/download-archive-file-button-container.component.html b/alfa-client/libs/binary-file/src/lib/download-archive-file-button-container/download-archive-file-button-container.component.html
index b4f57dff63600c9090de98d2646272bad58e06f4..9434cdd4a3edbaa2d3adb37bc41b54d585dc1b81 100644
--- a/alfa-client/libs/binary-file/src/lib/download-archive-file-button-container/download-archive-file-button-container.component.html
+++ b/alfa-client/libs/binary-file/src/lib/download-archive-file-button-container/download-archive-file-button-container.component.html
@@ -24,6 +24,7 @@
 
 -->
 <ods-download-button
+  dataTestId="download-archive-file-button"
   [stateResource]="downloadArchiveInProgress$ | async"
   data-test-class="download-archive"
   (click)="downloadArchive()"
diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html
index 4024dc2de95e58d010447f113834a2b1b0387252..538932cf346eea42688fc28259a330b1d18fb552 100644
--- a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html
+++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html
@@ -6,6 +6,7 @@
   [isLoading]="isUploadInProgress$ | async"
   [variant]="uploadButtonVariant"
   data-test-id="binary-file-upload"
+  dataTestId="multi-file-upload-button"
 >
   <ods-spinner-icon spinner size="medium" />
   <ods-attachment-icon icon size="medium" />
diff --git a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.html b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.html
index b8b8d9e4c1d3addfff29d35af5e786923e194454..2649c1cdb731e0b5997df29d904241f569cf544d 100644
--- a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.html
+++ b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.html
@@ -23,28 +23,18 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<ozgcloud-spinner
-  *ngIf="binaryFileListStateResource.resource"
-  [stateResource]="binaryFileListStateResource"
->
+<ozgcloud-spinner *ngIf="binaryFileListStateResource.resource" [stateResource]="binaryFileListStateResource">
   <ods-attachment-wrapper data-test-id="file-list">
-    <ods-attachment-header
-      [title]="title"
-      *ngIf="title || archiveDownloadUri"
-      data-test-id="file-list-header"
-    >
+    <ods-attachment-header [title]="title" *ngIf="title || archiveDownloadUri" data-test-id="file-list-header">
       <alfa-download-archive-file-button-container
         *ngIf="archiveDownloadUri"
-        data-test-class="download-archive-file-button"
+        data-test-id="download-archive-file-button-container"
         [downloadUri]="archiveDownloadUri"
         action-buttons
       ></alfa-download-archive-file-button-container
     ></ods-attachment-header>
     <ng-container
-      *ngFor="
-        let binaryFileResource of binaryFileListStateResource.resource
-          | toEmbeddedResources: fileListRel.FILE_LIST
-      "
+      *ngFor="let binaryFileResource of binaryFileListStateResource.resource | toEmbeddedResources: fileListRel.FILE_LIST"
     >
       <alfa-binary-file2-container
         [file]="binaryFileResource"
diff --git a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts
index 93be7c71dab2c1f665423770e2c877a73e12c869..500c35cf858960e3a27674d2bf53ca9999555ca5 100644
--- a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts
+++ b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts
@@ -23,21 +23,14 @@
  */
 import { BinaryFileResource } from '@alfa-client/binary-file-shared';
 import { ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech-shared';
-import {
-  existsAsHtmlElement,
-  getMockComponent,
-  notExistsAsHtmlElement,
-} from '@alfa-client/test-utils';
+import { existsAsHtmlElement, getMockComponent, notExistsAsHtmlElement } from '@alfa-client/test-utils';
 import { SpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
 import { ResourceUri } from '@ngxp/rest';
 import { AttachmentHeaderComponent, AttachmentWrapperComponent } from '@ods/system';
-import {
-  createBinaryFileListResource,
-  createBinaryFileResource,
-} from 'libs/binary-file-shared/test/binary-file';
-import { getDataTestClassOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createBinaryFileListResource, createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
 import { BinaryFile2ContainerComponent } from '../binary-file2-container/binary-file2-container.component';
 import { DownloadArchiveFileButtonContainerComponent } from '../download-archive-file-button-container/download-archive-file-button-container.component';
@@ -47,7 +40,7 @@ describe('VerticalBinaryFileListComponent', () => {
   let component: VerticalBinaryFileListComponent;
   let fixture: ComponentFixture<VerticalBinaryFileListComponent>;
 
-  const downloadArchiveFileButton: string = getDataTestClassOf('download-archive-file-button');
+  const downloadArchiveFileButton: string = getDataTestIdOf('download-archive-file-button-container');
   const fileListHeader: string = getDataTestIdOf('file-list-header');
 
   const binaryFile: BinaryFileResource = createBinaryFileResource();
@@ -69,9 +62,7 @@ describe('VerticalBinaryFileListComponent', () => {
   beforeEach(() => {
     fixture = TestBed.createComponent(VerticalBinaryFileListComponent);
     component = fixture.componentInstance;
-    component.binaryFileListStateResource = createStateResource(
-      createBinaryFileListResource([binaryFile]),
-    );
+    component.binaryFileListStateResource = createStateResource(createBinaryFileListResource([binaryFile]));
     fixture.detectChanges();
   });
 
@@ -82,28 +73,19 @@ describe('VerticalBinaryFileListComponent', () => {
   describe('binary file component', () => {
     describe('should be called with', () => {
       it('file', () => {
-        const comp: BinaryFile2ContainerComponent = getMockComponent(
-          fixture,
-          BinaryFile2ContainerComponent,
-        );
+        const comp: BinaryFile2ContainerComponent = getMockComponent(fixture, BinaryFile2ContainerComponent);
 
         expect(comp.file).toBe(binaryFile);
       });
 
       it('deletable', () => {
-        const comp: BinaryFile2ContainerComponent = getMockComponent(
-          fixture,
-          BinaryFile2ContainerComponent,
-        );
+        const comp: BinaryFile2ContainerComponent = getMockComponent(fixture, BinaryFile2ContainerComponent);
 
         expect(comp.deletable).toBe(component.deletable);
       });
 
       it('downloadFileNamePrefix', () => {
-        const comp: BinaryFile2ContainerComponent = getMockComponent(
-          fixture,
-          BinaryFile2ContainerComponent,
-        );
+        const comp: BinaryFile2ContainerComponent = getMockComponent(fixture, BinaryFile2ContainerComponent);
 
         expect(comp.downloadFileNamePrefix).toBe(component.downloadFileNamePrefix);
       });
diff --git a/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts
index 7c479ec1713ce6efca5777e04880575c623ba23d..14473d08c588ba1a2ee9d63a240cb30ca451d48b 100644
--- a/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts
+++ b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts
@@ -46,7 +46,7 @@ type IconVariants = VariantProps<typeof iconVariants>;
   </ods-button>`,
 })
 export class DownloadButtonComponent {
-  @Input() dataTestId: string = '';
+  @Input({ required: true }) dataTestId: string;
   @Input() size: IconVariants['size'] = 'small';
   @Input() set stateResource(resource: StateResource<CommandResource>) {
     this.isLoading = resource.loading || resource.reload;
diff --git a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html
index ff08ce18e4ad8cc6037b84833bd941f375a6da0f..e3807c40af21c86b0026c201ed9cb12525aa263b 100644
--- a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html
+++ b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html
@@ -35,6 +35,7 @@
   [attr.data-test-id]="(label | convertForDataTest) + '-file-upload-button'"
   [isLoading]="uploadInProgress.loading"
   class="relative w-full max-w-72"
+  dataTestId="file-upload-editor"
 >
   <ods-spinner-icon spinner size="medium" />
   <ods-attachment-icon icon size="medium" />
diff --git a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html
index 837b069ad149e2e7e2eb08305e54e8ab74df16f5..409101e9b6320310d915e0364f8da49bf82a7fda 100644
--- a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html
+++ b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html
@@ -29,6 +29,7 @@
   [isLoading]="uploadInProgress"
   [accept]="accept"
   [attr.data-test-id]="(label | convertForDataTest) + '-single-file-upload-button'"
+  dataTestId="single-file-upload-button"
 >
   <ng-content icon select="[icon]"></ng-content>
   <ng-content text select="[text]"></ng-content>
diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html
index b65b88d5b02c74982b872549c6d87aeccdf1644b..2e4573ac9c648f820f392f51dc8e96c237f74fb5 100644
--- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html
+++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html
@@ -32,7 +32,7 @@
   (click)="resetInput()"
   [disabled]="isLoading"
   [multiple]="multi"
-  [attr.data-test-id]="(id | convertForDataTest) + '-file-upload-input'"
+  [attr.data-test-id]="dataTestId"
 />
 <label [for]="id" [ngClass]="uploadButtonVariants({ variant })" role="button">
   @if (isLoading) {
diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
index 54b7d3b7dde522ce018e0efae8b4210f6e2e2cff..bc63bfe1e214deec130fcd1f487045d14a68ad79 100644
--- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
@@ -21,7 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
@@ -34,16 +33,18 @@ describe('FileUploadButtonComponent', () => {
   let fixture: ComponentFixture<FileUploadButtonComponent>;
 
   const labelText: string = faker.word.noun();
-  const inputTestClass: string = getDataTestIdOf(labelText + '-file-upload-input');
+  const dataTestId: string = 'dummyDataTestId';
+  const input: string = getDataTestIdOf(dataTestId);
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [FileUploadButtonComponent, ConvertForDataTestPipe],
+      imports: [FileUploadButtonComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(FileUploadButtonComponent);
     component = fixture.componentInstance;
     component.id = labelText;
+    component.dataTestId = dataTestId;
     fixture.detectChanges();
   });
 
@@ -54,7 +55,7 @@ describe('FileUploadButtonComponent', () => {
   describe('click at file input', () => {
     it('should call resetInput()', () => {
       component.resetInput = jest.fn();
-      const fileInput = getElementFromFixture(fixture, inputTestClass);
+      const fileInput = getElementFromFixture(fixture, input);
 
       fileInput.click();
       fixture.detectChanges();
@@ -68,7 +69,7 @@ describe('FileUploadButtonComponent', () => {
       component.multi = true;
       fixture.detectChanges();
 
-      const inputElement: HTMLInputElement = getElementFromFixture(fixture, inputTestClass);
+      const inputElement: HTMLInputElement = getElementFromFixture(fixture, input);
 
       expect(inputElement.multiple).toEqual(component.multi);
     });
diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
index b5048be11b1b7e67eaf8c077e3d4cd0caab66388..9f06d3864e0c7767b368509d49449e68d18ac0a0 100644
--- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
+++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
@@ -59,6 +59,7 @@ export class FileUploadButtonComponent {
   @Input() accept: string = '*/*';
   @Input() multi: boolean = false;
   @Input() variant: UploadButtonVariants['variant'];
+  @Input({ required: true }) dataTestId: string;
 
   @ViewChild('inputElement') inputElement: ElementRef = new ElementRef({});
 
diff --git a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.html b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.html
index 78ac673c8e3c3a2b871f8f0af621b8bf5b2d09e3..2bace6cd981024e6e589d527c6af06a0a1c572a1 100644
--- a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.html
+++ b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.html
@@ -32,7 +32,7 @@
         [kommentar]="kommentar"
         data-test-class="kommentar-created-by"
       ></alfa-user-profile-in-kommentar-container>
-      <span data-test-id="kommentar-created-at" class="date text-sm">{{
+      <span data-test-class="kommentar-created-at" class="date text-sm">{{
         kommentar.createdAt | formatDateWithTimePipe: false
       }}</span>
     </div>
diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-page.component.html b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-page.component.html
index 8f0c3d3c5dfb5e59a191e8e18c725e098376b2fe..99cc6d70f2db39cd1ab3fb16016af9f8f07288ac 100644
--- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-page.component.html
+++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-page.component.html
@@ -24,31 +24,19 @@
 
 -->
 <ozgcloud-spinner [stateResource]="wiedervorlageStateResource">
-  <ozgcloud-subnavigation
-    data-test-id="subnavigation-wiedervorlage"
-    class="mat-typography mat-app-background"
-  >
-    <alfa-wiedervorlage-action-buttons [wiedervorlage]="wiedervorlageStateResource.resource">
-    </alfa-wiedervorlage-action-buttons>
+  <ozgcloud-subnavigation data-test-id="subnavigation-wiedervorlage" class="mat-typography mat-app-background">
+    <alfa-wiedervorlage-action-buttons [wiedervorlage]="wiedervorlageStateResource.resource"> </alfa-wiedervorlage-action-buttons>
   </ozgcloud-subnavigation>
 
   <div class="l-scroll-area--full">
     <div class="wrapper grow">
-      <h1 class="text-lg font-medium">Wiedervorlage</h1>
+      <h1 class="text-lg font-medium" data-test-id="wiedervorlage-headline">Wiedervorlage</h1>
       <alfa-wiedervorlage-breadcrumb-container
         [wiedervorlage]="wiedervorlageStateResource.resource"
       ></alfa-wiedervorlage-breadcrumb-container>
 
-      <alfa-wiedervorlage-status
-        class="status"
-        [wiedervorlageResource]="wiedervorlageStateResource.resource"
-        [diameter]="16"
-      >
-        <span>{{
-          wiedervorlageStateResource.resource && wiedervorlageStateResource.resource.done ?
-            'erledigt'
-          : 'offen'
-        }}</span>
+      <alfa-wiedervorlage-status class="status" [wiedervorlageResource]="wiedervorlageStateResource.resource" [diameter]="16">
+        <span>{{ wiedervorlageStateResource.resource && wiedervorlageStateResource.resource.done ? 'erledigt' : 'offen' }}</span>
       </alfa-wiedervorlage-status>
 
       <alfa-wiedervorlage-form