diff --git a/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts
deleted file mode 100644
index 4ac9816e675cd64b552f97c41b05a685dd8307d1..0000000000000000000000000000000000000000
--- a/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-export class ButtonWithSpinnerE2EComponent {
-  private readonly locatorButton: string = 'icon-button';
-
-  public findButton(root) {
-    return root.findTestElementWithClass(this.locatorButton);
-  }
-
-  //TODO Methode aus der MeinPage verwenden
-  public waitToDisappear(root) {
-    root.should('not.have.descendants', '[data-test-class=spinner]');
-  }
-}
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 4be7b6532108923566044183f5591b1a175ee2d8..e17043afdfaa7c7de564ec7b244ff85b1761985a 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
@@ -22,7 +22,6 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component';
-import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component';
 
 export class WiedervorlageE2EComponent {
   private readonly locatorBetreffInput: string = 'Betreff-text-input';
@@ -33,10 +32,7 @@ export class WiedervorlageE2EComponent {
   private readonly locatorStatusDot: string = 'dot';
   private readonly locatorSpeichernButton: string = 'speichern-button';
 
-  private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent =
-    new ButtonWithSpinnerE2EComponent();
-  private readonly attachmentContainer: AttachmentContainerE2EComponent =
-    new AttachmentContainerE2EComponent();
+  private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
 
   public getBetreff() {
     return cy.getTestElement(this.locatorBetreffInput);
@@ -63,9 +59,7 @@ export class WiedervorlageE2EComponent {
   }
 
   public getSpeichernButton() {
-    return this.buttonWithSpinnerComponent.findButton(
-      cy.getTestElement(this.locatorSpeichernButton),
-    );
+    return cy.getTestElement(this.locatorSpeichernButton);
   }
 
   public getAttachmentContainer(): AttachmentContainerE2EComponent {
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 93801c671d44ca75f7473867689c7941d6efa611..91718623842de6e64bb8c0a863ba2146606d68c4 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
@@ -21,15 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component';
 import { WiedervorlageInVorgangE2EComponent } from './wiedervorlage-in-vorgang.e2e.component';
 
 export class WiedervorlagenInVorgangE2EComponent {
   private readonly locatorCreateWiedervorlageButton: string = 'create-wiedervorlage';
-
-  private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent =
-    new ButtonWithSpinnerE2EComponent();
-
   private readonly locatorRoot: string = 'wiedervorlagen-in-vorgang';
 
   public getRoot() {
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts
index c86efc5d90992c7d5eb14b126554bc3b1872cac1..246013c7b169d348bd6882b3cd20f1d211f1b6fa 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts
@@ -153,8 +153,9 @@ describe('Vorgang wiedereroeffnen', () => {
           contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
         });
 
-        it('should close snackbar on revoke', () => {
+        it('should click on snackbar revoke', () => {
           snackbar.getRevokeButton().click();
+          wait(500);
           waitForSpinnerToDisappear();
 
           notExist(snackbar.getMessage());
@@ -258,7 +259,7 @@ describe('Vorgang wiedereroeffnen', () => {
           contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
         });
 
-        it('should close snackbar on revoke', () => {
+        it('should click snackbar revoke', () => {
           snackbar.getRevokeButton().click();
           wait(500);
           waitForSpinnerToDisappear();
diff --git a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts
index de1242c608e560f453c76ee160ddaf89dc3b9b0c..7643fbc6e08d29e0aadf7792f87d1f40348b709b 100644
--- a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts
+++ b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts
@@ -21,13 +21,13 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { createStateResource, StateResource } from '@alfa-client/tech-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { createCommandErrorStateResource, createCommandResource } from 'libs/command-shared/test/command';
+import { createCommandErrorStateResource } from 'libs/command-shared/test/command';
 import { createApiError } from 'libs/tech-shared/test/error';
+import { createDummyResource } from '../../../../tech-shared/test/resource';
 import { ButtonWithSpinnerComponent } from './button-with-spinner.component';
 
-import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util';
-
 describe('ButtonWithSpinnerComponent', () => {
   let component: ButtonWithSpinnerComponent;
   let fixture: ComponentFixture<ButtonWithSpinnerComponent>;
@@ -46,39 +46,25 @@ describe('ButtonWithSpinnerComponent', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('onInit', () => {
-    it('should call getStateResource', () => {
-      component.getStateResource = jest.fn();
+  describe('set stateResource', () => {
+    it('should set stateResource', () => {
+      const stateResource: StateResource<unknown> = createStateResource(createDummyResource());
 
-      component.ngOnInit();
+      component.stateResource = stateResource;
 
-      expect(component.getStateResource).toHaveBeenCalled();
+      expect(component._stateResource).toBe(stateResource);
     });
-  });
-
-  describe('getStateResource', () => {
-    it('should return stateResource', () => {
-      component.stateResource = ResourceUtils.createStateResource(createCommandResource());
-
-      component.getStateResource();
 
-      const valid: boolean = ResourceUtils.isValidStateResource(component.stateResource);
-      expect(valid).toBeTruthy();
-    });
-
-    it('should return empty stateResource', () => {
-      const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
+    it('should not set stateResource', () => {
       component.stateResource = null;
 
-      component.getStateResource();
-
-      expect(spy).toHaveBeenCalled();
+      expect(component._stateResource).not.toBe(null);
     });
   });
 
   describe('isLoading', () => {
     it('should return false', () => {
-      component.stateResource.loading = component.stateResource.reload = false;
+      component._stateResource.loading = component._stateResource.reload = false;
 
       const isLoading: boolean = component.isLoading;
 
@@ -86,8 +72,8 @@ describe('ButtonWithSpinnerComponent', () => {
     });
 
     it('should return true if stateResource is loading', () => {
-      component.stateResource.loading = true;
-      component.stateResource.reload = false;
+      component._stateResource.loading = true;
+      component._stateResource.reload = false;
 
       const isLoading: boolean = component.isLoading;
 
@@ -95,8 +81,8 @@ describe('ButtonWithSpinnerComponent', () => {
     });
 
     it('should return true if stateResource is reloading', () => {
-      component.stateResource.loading = false;
-      component.stateResource.reload = true;
+      component._stateResource.loading = false;
+      component._stateResource.reload = true;
 
       const isLoading: boolean = component.isLoading;
 
@@ -106,7 +92,7 @@ describe('ButtonWithSpinnerComponent', () => {
 
   describe('isError', () => {
     it('should return false if error is not set', () => {
-      component.stateResource.error = null;
+      component._stateResource.error = null;
 
       const isError: boolean = component.isError;
 
@@ -114,7 +100,7 @@ describe('ButtonWithSpinnerComponent', () => {
     });
 
     it('should return false if error is set and error is ApiError', () => {
-      component.stateResource.error = createApiError();
+      component._stateResource.error = createApiError();
 
       const isError: boolean = component.isError;
 
@@ -122,7 +108,7 @@ describe('ButtonWithSpinnerComponent', () => {
     });
 
     it('should return true if error is set and error is not ApiError', () => {
-      component.stateResource = createCommandErrorStateResource();
+      component._stateResource = createCommandErrorStateResource();
 
       const isError: boolean = component.isError;
 
diff --git a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
index f76f1f907cecaa625c3e1c6dc950458e3f4aa640..a12b0a8ad74b49d34ec172ae36682d7d0ce01104 100644
--- a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
+++ b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
@@ -24,7 +24,7 @@
 import { CommandResource, hasCommandError } from '@alfa-client/command-shared';
 import { StateResource, createEmptyStateResource, isLoaded } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
 import { ButtonComponent, ErrorMessageComponent, buttonVariants } from '@ods/system';
 import { VariantProps } from 'class-variance-authority';
 import { isNil } from 'lodash-es';
@@ -49,28 +49,24 @@ type ButtonVariants = VariantProps<typeof buttonVariants>;
       <ng-content icon select="[icon]" />
     </ods-button>`,
 })
-export class ButtonWithSpinnerComponent implements OnInit {
+export class ButtonWithSpinnerComponent {
+  @Input() set stateResource(value: StateResource<unknown>) {
+    if (!isNil(value)) this._stateResource = value;
+  }
   @Input() text: string = '';
   @Input() dataTestId: string = '';
-  @Input() stateResource: StateResource<unknown>;
   @Input() variant: ButtonVariants['variant'] = 'primary';
   @Input() size: ButtonVariants['size'] = 'medium';
 
   @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
 
-  ngOnInit(): void {
-    this.stateResource = this.getStateResource();
-  }
-
-  getStateResource(): StateResource<unknown> {
-    return isNil(this.stateResource) ? createEmptyStateResource() : this.stateResource;
-  }
+  _stateResource: StateResource<unknown> = createEmptyStateResource();
 
   get isLoading(): boolean {
-    return this.stateResource.loading || this.stateResource.reload;
+    return this._stateResource.loading || this._stateResource.reload;
   }
 
   get isError(): boolean {
-    return isLoaded(this.stateResource) && hasCommandError(<CommandResource>this.stateResource.resource);
+    return isLoaded(this._stateResource) && hasCommandError(<CommandResource>this._stateResource.resource);
   }
 }
diff --git a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
index 322b8313078161b76335fcbb5936987686522411..df18f4361bbd25449d00c65d6ae30df918cc7617 100644
--- a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
+++ b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html
@@ -26,20 +26,21 @@
 @if (showAsIconButton) {
   <ods-button-with-spinner
     [stateResource]="submitInProgress$ | async"
+    (clickEmitter)="submit()"
     tooltip="Wiedervorlage speichern"
     variant="ghost"
     size="fit"
-    (clickEmitter)="submit()"
+    dataTestId="speichern-icon-button"
   >
     <ods-save-icon icon class="fill-text" />
   </ods-button-with-spinner>
 } @else {
   <ods-button-with-spinner
-    data-test-id="speichern-button"
     [stateResource]="submitInProgress$ | async"
+    (clickEmitter)="submit()"
     text="Speichern"
     variant="outline"
-    (clickEmitter)="submit()"
+    dataTestId="speichern-button"
   >
     <ods-save-icon icon />
   </ods-button-with-spinner>