diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts
index 865f904f83dbfd0ad22873ec8578531815b1c8dd..7cd0b9ff96f257d7e06ccdd68846796a083b056a 100644
--- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts
+++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts
@@ -26,6 +26,7 @@ import { Injectable } from '@angular/core';
 import { TestBed } from '@angular/core/testing';
 import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
 import { ActivatedRoute, UrlSegment } from '@angular/router';
+import { faker } from '@faker-js/faker/.';
 import { createDummy, Dummy } from 'libs/tech-shared/test/dummy';
 import { singleCold, singleHot } from 'libs/tech-shared/test/marbles';
 import { createSpy, mock, Mock } from 'libs/test-utils/src/lib/mocking';
@@ -261,6 +262,19 @@ describe('KeycloakFormService', () => {
       expect(isInvalid).toBeTruthy();
     });
   });
+
+  describe('get id', () => {
+    const patchConfigId: string = faker.string.alphanumeric();
+    const patchConfig: PatchConfig = { id: patchConfigId, doPatch: false };
+
+    it('should return id from patch config', () => {
+      service._patchConfig = patchConfig;
+
+      const id: string = service.getId();
+
+      expect(id).toBe(patchConfigId);
+    });
+  });
 });
 
 @Injectable()
diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts
index f0aae76ba36f97b4d3508ad517764a02b2b3b5f2..49a2e6c84e3fdbf69b22ca324ee0100a34ae6763 100644
--- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts
+++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts
@@ -75,10 +75,6 @@ export abstract class KeycloakFormService<T> {
 
   abstract _doSubmit(): Observable<StateResource<T>>;
 
-  public delete(): Observable<StateResource<T>> {
-    return null;
-  }
-
   _patch(valueToPatch: T): void {
     this.form.reset();
 
@@ -98,6 +94,10 @@ export abstract class KeycloakFormService<T> {
   public isInvalid(): boolean {
     return this.form.invalid;
   }
+
+  public getId(): string {
+    return this._patchConfig.id;
+  }
 }
 
 export interface PatchConfig {
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html
deleted file mode 100644
index e180bccebc7c5139936430630b94d8b40fbe4f21..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<ods-button-with-spinner
-  (clickEmitter)="openDeleteDialog()"
-  variant="outline"
-  text="Löschen"
-  dataTestId="delete-button"
-/>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts
deleted file mode 100644
index cc2b06b8107649c5e49586a99ce3a8d14cf7252f..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { dispatchEventFromFixture, existsAsHtmlElement, Mock, mock } from '@alfa-client/test-utils';
-import { DialogService } from '@alfa-client/ui';
-import { ButtonWithSpinnerComponent } from '@ods/component';
-import { MockComponent } from 'ng-mocks';
-import { getDataTestIdAttributeOf } from '../../../../../../tech-shared/test/data-test';
-import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component';
-import { UserFormDeleteButtonComponent } from './user-form-delete-button.component';
-
-describe('UserFormDeleteButtonComponent', () => {
-  let component: UserFormDeleteButtonComponent;
-  let fixture: ComponentFixture<UserFormDeleteButtonComponent>;
-
-  const deleteButton: string = getDataTestIdAttributeOf('delete-button');
-
-  let dialogService: Mock<DialogService>;
-
-  beforeEach(async () => {
-    dialogService = mock(DialogService);
-
-    await TestBed.configureTestingModule({
-      imports: [UserFormDeleteButtonComponent],
-      declarations: [MockComponent(ButtonWithSpinnerComponent)],
-      providers: [{ provide: DialogService, useValue: dialogService }],
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(UserFormDeleteButtonComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-
-  describe('component', () => {
-    describe('delete', () => {
-      it('should open dialog', () => {
-        component.openDeleteDialog();
-
-        expect(dialogService.open).toHaveBeenCalledWith(UserFormDeleteDialogContainerComponent);
-      });
-    });
-  });
-
-  describe('template', () => {
-    describe('button with spinner', () => {
-      it('should exist', () => {
-        existsAsHtmlElement(fixture, deleteButton);
-      });
-
-      it('should open delete dialog on click', () => {
-        component.openDeleteDialog = jest.fn();
-
-        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
-
-        expect(component.openDeleteDialog).toHaveBeenCalled();
-      });
-    });
-  });
-});
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts
deleted file mode 100644
index 7cbef8bf523992dd16a0dd070b3650bdde11ca2e..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { DialogService } from '@alfa-client/ui';
-import { Component, inject } from '@angular/core';
-import { ButtonWithSpinnerComponent } from '@ods/component';
-import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component';
-
-@Component({
-  selector: 'admin-user-form-delete-button',
-  standalone: true,
-  imports: [ButtonWithSpinnerComponent],
-  templateUrl: './user-form-delete-button.component.html',
-})
-export class UserFormDeleteButtonComponent {
-  private readonly dialogService = inject(DialogService);
-
-  public openDeleteDialog(): void {
-    this.dialogService.openWidely(UserFormDeleteDialogContainerComponent);
-  }
-}
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html
index 2e2466e86c47be1080b899ed4d92277eb3cb0263..0bc050817641fda6d8b2bb0b253e073136590b61 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html
@@ -1,7 +1,6 @@
 <admin-user-form-delete-dialog
-  [username]="getUsername()"
+  [username]="formService.getUserName()"
   [deleteUserStateResource]="deleteUserStateResource$ | async"
-  (cancel)="closeDeleteDialog()"
   (delete)="deleteUser()"
   data-test-id="delete-dialog"
-/>
\ No newline at end of file
+/>
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts
index 5a25c702488c11df6a470fb68eb4ac9d139d134f..085218ad36f025930942f38789eaf8f7383a46a2 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts
@@ -2,7 +2,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils';
-import { FormControl } from '@angular/forms';
 import { faker } from '@faker-js/faker/locale/de';
 import { of } from 'rxjs';
 import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test';
@@ -41,26 +40,17 @@ describe('UserFormDeleteDialogComponent', () => {
   });
 
   describe('user form delete dialog', () => {
-    it('should exist', () => {
+    it('should be called', () => {
       const username: string = faker.word.sample();
-      const state: StateResource<unknown> = createEmptyStateResource();
-      component.getUsername = jest.fn().mockReturnValue(username);
-      component.deleteUserStateResource$ = of(state);
+      const stateResource: StateResource<unknown> = createEmptyStateResource();
+      formService.getUserName = jest.fn().mockReturnValue(username);
+      component.deleteUserStateResource$ = of(stateResource);
 
       fixture.detectChanges();
 
       const deleteDialog: UserFormDeleteDialogComponent = getMockComponent(fixture, UserFormDeleteDialogComponent);
-      expect(deleteDialog).toBeTruthy();
       expect(deleteDialog.username).toBe(username);
-      expect(deleteDialog.deleteUserStateResource).toBe(state);
-    });
-
-    it('should call closeDeteleDialog on emit cancel', () => {
-      component.closeDeleteDialog = jest.fn();
-
-      dispatchEventFromFixture(fixture, 'admin-user-form-delete-dialog', 'cancel');
-
-      expect(component.closeDeleteDialog).toHaveBeenCalled();
+      expect(deleteDialog.deleteUserStateResource).toBe(stateResource);
     });
 
     it('should call deleteUser on emit delete', () => {
@@ -71,46 +61,4 @@ describe('UserFormDeleteDialogComponent', () => {
       expect(component.deleteUser).toHaveBeenCalled();
     });
   });
-
-  describe('component', () => {
-    describe('getUsername', () => {
-      it('should return username', () => {
-        const username: string = faker.word.sample();
-        jest.spyOn(formService.form as any, 'get').mockReturnValue(new FormControl(username));
-
-        const result: string = component.getUsername();
-
-        expect(result).toBe(username);
-      });
-    });
-
-    describe('closeDeleteDialog', () => {
-      it('should call dialogService closeAll', () => {
-        component.dialogService.closeAll = jest.fn();
-
-        component.closeDeleteDialog();
-
-        expect(component.dialogService.closeAll).toHaveBeenCalled();
-      });
-    });
-
-    describe('deleteUser', () => {
-      it('should call userFormService delete ', () => {
-        formService.delete = jest.fn();
-
-        component.deleteUser();
-
-        expect(formService.delete).toHaveBeenCalled();
-      });
-
-      it('should set deleteUserState', () => {
-        const state: StateResource<unknown> = createEmptyStateResource();
-        formService.delete = jest.fn().mockReturnValue(state);
-
-        component.deleteUser();
-
-        expect(component.deleteUserStateResource$).toBe(state);
-      });
-    });
-  });
 });
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts
index b5ff2dc0d480b561a567f4639e876700d0358b26..3837d6fb96449fd7daa01b2123daed6896d789c3 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts
@@ -1,5 +1,4 @@
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
-import { DialogService } from '@alfa-client/ui';
 import { AsyncPipe } from '@angular/common';
 import { Component, inject } from '@angular/core';
 import { Observable, of } from 'rxjs';
@@ -11,25 +10,14 @@ import { UserFormDeleteDialogComponent } from './user-form-delete-dialog/user-fo
   standalone: true,
   imports: [UserFormDeleteDialogComponent, AsyncPipe],
   templateUrl: './user-form-delete-dialog-container.component.html',
-  providers: [UserFormService],
 })
+//TODO Rename -> DeleteUserDialogContainerComponent
 export class UserFormDeleteDialogContainerComponent {
   public readonly formService = inject(UserFormService);
-  public readonly dialogService = inject(DialogService);
 
   public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource());
 
-  protected readonly UserFormService = UserFormService;
-
-  getUsername(): string {
-    return this.formService.form.get(UserFormService.USERNAME).value;
-  }
-
-  public closeDeleteDialog(): void {
-    this.dialogService.closeAll();
-  }
-
   public deleteUser(): void {
-    this.deleteUserStateResource$ = this.formService.delete();
+    //Implement me
   }
 }
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html
index b261057d5fabafbec8e598d12dcd0b737dd89676..33e600ca06996f160ef265262bfba2a749e6a2c4 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html
@@ -1,17 +1,13 @@
-<p>Sind Sie sicher, dass sie {{username}} löschen möchten? Hinweis: Die zugewiesenen Vorgänge bleiben bestehen.</p>
+<p>Sind Sie sicher, dass sie {{ username }} löschen möchten? Hinweis: Die zugewiesenen Vorgänge bleiben bestehen.</p>
 
 <div class="flex justify-between">
-  <ods-button-with-spinner
-    (clickEmitter)="cancel.emit()"
-    text="Abbrechen"
-    dataTestId="dialog-abbrechen-button"
-  />
-
+  <ods-cancel-dialog-button data-test-id="dialog-cancel-button-host" />
   <ods-button-with-spinner
     [stateResource]="deleteUserStateResource"
     (clickEmitter)="delete.emit()"
     variant="outline"
     text="Löschen"
-    dataTestId="dialog-delete-button"
+    dataTestId="dialog-delete"
+    data-test-id="dialog-delete-button-host"
   />
-</div>
\ No newline at end of file
+</div>
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts
index 1ca1f2ad8fff971770c45b30f98b433accfc31f3..0d9ab4a5d968a014fdbe8dfa0d9b0f0b3678b5c6 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts
@@ -1,21 +1,22 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
-import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils';
-import { ButtonWithSpinnerComponent } from '@ods/component';
-import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test';
+import { dispatchEventFromFixture, existsAsHtmlElement, getMockComponent, MockEvent } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component';
+import { MockComponent } from 'ng-mocks';
+import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test';
 import { UserFormDeleteDialogComponent } from './user-form-delete-dialog.component';
 
 describe('UserFormDeleteDialogComponent', () => {
   let component: UserFormDeleteDialogComponent;
   let fixture: ComponentFixture<UserFormDeleteDialogComponent>;
 
-  const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button');
-  const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button');
+  const deleteButton: string = getDataTestIdOf('dialog-delete-button-host');
+  const cancelButton: string = getDataTestIdOf('dialog-cancel-button-host');
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [UserFormDeleteDialogComponent, ButtonWithSpinnerComponent],
+      imports: [UserFormDeleteDialogComponent],
+      declarations: [MockComponent(CancelDialogButtonComponent), MockComponent(ButtonWithSpinnerComponent)],
     }).compileComponents();
 
     fixture = TestBed.createComponent(UserFormDeleteDialogComponent);
@@ -32,14 +33,6 @@ describe('UserFormDeleteDialogComponent', () => {
       it('should exist', () => {
         existsAsHtmlElement(fixture, cancelButton);
       });
-
-      it('should emit cancel on click', () => {
-        component.cancel.emit = jest.fn();
-
-        dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter');
-
-        expect(component.cancel.emit).toHaveBeenCalled();
-      });
     });
 
     describe('delete button', () => {
@@ -49,14 +42,13 @@ describe('UserFormDeleteDialogComponent', () => {
 
         fixture.detectChanges();
 
-        const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance;
-        expect(button._stateResource).toBe(stateResource);
+        expect(getMockComponent(fixture, ButtonWithSpinnerComponent).stateResource).toBe(stateResource);
       });
 
       it('should emit delete on click', () => {
         component.delete.emit = jest.fn();
 
-        dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter');
+        dispatchEventFromFixture(fixture, deleteButton, MockEvent.CLICK);
 
         expect(component.delete.emit).toHaveBeenCalled();
       });
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts
index f48fe94e09e8bc6bcf9daef759ab22d6a85403c1..a5ca4d3f99253778536011b590ff06c3abeffe99 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts
@@ -1,16 +1,16 @@
 import { StateResource } from '@alfa-client/tech-shared';
 import { Component, EventEmitter, Input, Output } from '@angular/core';
-import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component';
 
 @Component({
   selector: 'admin-user-form-delete-dialog',
   standalone: true,
-  imports: [ButtonWithSpinnerComponent],
+  imports: [ButtonWithSpinnerComponent, CancelDialogButtonComponent],
   templateUrl: './user-form-delete-dialog.component.html',
 })
 export class UserFormDeleteDialogComponent {
   @Input() username: string;
   @Input() deleteUserStateResource: StateResource<unknown>;
-  @Output() cancel: EventEmitter<void> = new EventEmitter<void>();
+
   @Output() delete: EventEmitter<void> = new EventEmitter<void>();
 }
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html
index 944e7a1c13b0512ed9ef2a39f7471dbada63007d..2dd292b2672fc600b501d9d4385852fc90faf8a2 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html
@@ -34,8 +34,8 @@
     />
     <div class="flex justify-between">
       <admin-user-form-save-button />
-      @if(formService.isPatch()){
-        <admin-user-form-delete-button data-test-id="delete-button-host"/>
+      @if (formService.isPatch()) {
+        <ods-open-dialog-button label="Löschen" dataTestId="delete-user" data-test-id="delete-user-button-host" />
       }
     </div>
   </div>
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts
index 6d3e2413240c63953cfb608858fab4df2f8e9552..091b77f6ef1dc06a225827807b8f66c6f8535295 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts
@@ -24,6 +24,7 @@
 import { User } from '@admin-client/user-shared';
 import { createEmptyStateResource, createStateResource, StateResource } from '@alfa-client/tech-shared';
 import { existsAsHtmlElement, getMockComponent, mock, Mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
+import { DIALOG_COMPONENT } from '@alfa-client/ui';
 import { CommonModule } from '@angular/common';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormGroup, ReactiveFormsModule } from '@angular/forms';
@@ -34,7 +35,6 @@ import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
 import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test';
 import { UserFormDataComponent } from './user-form-data/user-form-data.component';
-import { UserFormDeleteButtonComponent } from './user-form-delete-button/user-form-delete-button.component';
 import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component';
 import { UserFormOrganisationsEinheitListComponent } from './user-form-organisations-einheit-list/user-form-organisations-einheit-list.component';
 import { UserFormRolesComponent } from './user-form-roles/user-form-roles.component';
@@ -48,7 +48,7 @@ describe('UserFormComponent', () => {
   let formService: Mock<UserFormService>;
 
   const userContent: string = getDataTestIdOf('user-content');
-  const deleteButton: string = getDataTestIdOf('delete-button-host');
+  const deleteButton: string = getDataTestIdOf('delete-user-button-host');
 
   beforeEach(async () => {
     formService = <any>{
@@ -68,8 +68,8 @@ describe('UserFormComponent', () => {
         MockComponent(UserFormOrganisationsEinheitListComponent),
         MockComponent(UserFormRolesComponent),
         MockComponent(UserFormHeadlineComponent),
-        MockComponent(UserFormDeleteButtonComponent),
       ],
+      providers: [{ provide: DIALOG_COMPONENT, useValue: {} }],
     })
       .overrideComponent(UserFormComponent, {
         set: {
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts
index d671aee05003b1b27f84bee9f03eeda63cf1f1b2..9fc048a1ff3e96fff626248ddbf0f0d03ac4b8ed 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts
@@ -23,13 +23,14 @@
  */
 import { User } from '@admin-client/user-shared';
 import { StateResource } from '@alfa-client/tech-shared';
+import { DIALOG_COMPONENT } from '@alfa-client/ui';
 import { AsyncPipe } from '@angular/common';
 import { Component, inject, OnInit } from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { SpinnerComponent } from '@ods/component';
+import { OpenDialogButtonComponent, SpinnerComponent } from '@ods/component';
 import { Observable } from 'rxjs';
 import { UserFormDataComponent } from './user-form-data/user-form-data.component';
-import { UserFormDeleteButtonComponent } from './user-form-delete-button/user-form-delete-button.component';
+import { UserFormDeleteDialogContainerComponent } from './user-form-delete-dialog-container/user-form-delete-dialog-container.component';
 import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component';
 import { UserFormOrganisationsEinheitListComponent } from './user-form-organisations-einheit-list/user-form-organisations-einheit-list.component';
 import { UserFormRolesComponent } from './user-form-roles/user-form-roles.component';
@@ -38,7 +39,7 @@ import { UserFormService } from './user.formservice';
 
 @Component({
   selector: 'admin-user-form',
-  providers: [UserFormService],
+  providers: [UserFormService, { provide: DIALOG_COMPONENT, useValue: UserFormDeleteDialogContainerComponent }],
   templateUrl: './user-form.component.html',
   standalone: true,
   imports: [
@@ -51,7 +52,7 @@ import { UserFormService } from './user.formservice';
     UserFormOrganisationsEinheitListComponent,
     UserFormHeadlineComponent,
     UserFormSaveButtonComponent,
-    UserFormDeleteButtonComponent,
+    OpenDialogButtonComponent,
   ],
 })
 export class UserFormComponent implements OnInit {
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts
index 8e823be03c1f064fe2cd152da724bb3e0fcdc001..a7d60371fbecc62f86d23f23171f47bc323dc4ca 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts
@@ -30,7 +30,7 @@ import { createEmptyStateResource, createStateResource, EMPTY_ARRAY, StateResour
 import { Mock, mock } from '@alfa-client/test-utils';
 import { SnackBarService } from '@alfa-client/ui';
 import { fakeAsync, TestBed, tick } from '@angular/core/testing';
-import { AbstractControl, FormControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
+import { AbstractControl, FormControl, FormGroup, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
 import { ActivatedRoute, UrlSegment } from '@angular/router';
 import { faker } from '@faker-js/faker/locale/de';
 import { cold } from 'jest-marbles';
@@ -45,6 +45,7 @@ import SpyInstance = jest.SpyInstance;
 
 describe('UserFormService', () => {
   let formService: UserFormService;
+
   let roleGroup: UntypedFormGroup;
   let alfaGroup: UntypedFormGroup;
   let organisationsEinheitenGroup: UntypedFormGroup;
@@ -456,4 +457,14 @@ describe('UserFormService', () => {
       expect(formService._initOrganisationsEinheiten$.unsubscribe).toHaveBeenCalled();
     });
   });
+
+  describe('get userName', () => {
+    it('should return form control value of userName', () => {
+      formService.form = new FormGroup({ [UserFormService.USERNAME]: new FormControl('userNameDummy') });
+
+      const userName: string = formService.getUserName();
+
+      expect(userName).toBe('userNameDummy');
+    });
+  });
 });
diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts
index e7e537b362cf5938842d80e3ededcf7297665b78..a456872659a6b1ebd15a0bb570080b5834069fdd 100644
--- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts
+++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts
@@ -263,4 +263,8 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest
   ngOnDestroy(): void {
     this._initOrganisationsEinheiten$.unsubscribe();
   }
+
+  public getUserName(): string {
+    return this.form.get(UserFormService.USERNAME).value;
+  }
 }
diff --git a/alfa-client/libs/design-component/src/index.ts b/alfa-client/libs/design-component/src/index.ts
index 745720be72b8665fb259372141e6ab5537efbfbe..9eec827c3a019115cc42c751521816fdde5c87a7 100644
--- a/alfa-client/libs/design-component/src/index.ts
+++ b/alfa-client/libs/design-component/src/index.ts
@@ -22,6 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 export * from './lib/button-with-spinner/button-with-spinner.component';
+export * from './lib/cancel-dialog-button/cancel-dialog-button.component';
 export * from './lib/download-button/download-button.component';
 export * from './lib/form/button-toggle-group/button-toggle-group.component';
 export * from './lib/form/checkbox-editor/checkbox-editor.component';
@@ -30,5 +31,6 @@ export * from './lib/form/formcontrol-editor.abstract.component';
 export * from './lib/form/single-file-upload-editor/single-file-upload-editor.component';
 export * from './lib/form/text-editor/text-editor.component';
 export * from './lib/form/textarea-editor/textarea-editor.component';
+export * from './lib/open-dialog-button/open-dialog-button.component';
 export * from './lib/routing-button/routing-button.component';
 export * from './lib/spinner/spinner.component';
diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..110c81e4d4072ef0417676ea9966a7fa3394f144
--- /dev/null
+++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts
@@ -0,0 +1,47 @@
+import { dispatchEventFromFixture, mock, Mock, MockEvent } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ButtonComponent } from '@ods/system';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { CancelDialogButtonComponent } from './cancel-dialog-button.component';
+
+describe('CancelDialogButtonComponent', () => {
+  let component: CancelDialogButtonComponent;
+  let fixture: ComponentFixture<CancelDialogButtonComponent>;
+
+  let dialogService: Mock<OzgcloudDialogService>;
+
+  const cancelDialog: string = getDataTestIdOf('cancel-dialog');
+
+  beforeEach(async () => {
+    dialogService = mock(OzgcloudDialogService);
+
+    await TestBed.configureTestingModule({
+      imports: [CancelDialogButtonComponent],
+      declarations: [MockComponent(ButtonComponent)],
+      providers: [
+        {
+          provide: OzgcloudDialogService,
+          useValue: dialogService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(CancelDialogButtonComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('on button click', () => {
+    it('should call dialog service to close all', () => {
+      dispatchEventFromFixture(fixture, cancelDialog, MockEvent.CLICK);
+
+      expect(dialogService.closeAll).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6fd01cafbed417d086ed524c4c1c910426d2fab0
--- /dev/null
+++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts
@@ -0,0 +1,17 @@
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { Component, inject } from '@angular/core';
+import { ButtonComponent } from '@ods/system';
+
+@Component({
+  selector: 'ods-cancel-dialog-button',
+  standalone: true,
+  imports: [ButtonComponent],
+  template: `<ods-button (clickEmitter)="cancel()" text="Abbrechen" dataTestId="cancel-dialog" data-test-id="cancel-dialog" />`,
+})
+export class CancelDialogButtonComponent {
+  public readonly dialogService = inject(OzgcloudDialogService);
+
+  public cancel(): void {
+    this.dialogService.closeAll();
+  }
+}
diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8cbe8c1ae06eabaea31340ddd8eb31f710cab503
--- /dev/null
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts
@@ -0,0 +1,104 @@
+import { OzgCloudComponentFactory } from '@alfa-client/tech-shared';
+import { dispatchEventFromFixture, Mock, mock, MockEvent, mockGetValue } from '@alfa-client/test-utils';
+import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui';
+import { ComponentType } from '@angular/cdk/portal';
+import { ComponentRef, Injector, ViewContainerRef } from '@angular/core';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ButtonComponent } from '@ods/system';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { OpenDialogButtonComponent } from './open-dialog-button.component';
+
+describe('OpenDialogButtonComponent', () => {
+  let component: OpenDialogButtonComponent;
+  let fixture: ComponentFixture<OpenDialogButtonComponent>;
+
+  let dialogComponent: Mock<ComponentType<any>>;
+  let componentFactory: Mock<OzgCloudComponentFactory>;
+  let dialogService: Mock<OzgcloudDialogService>;
+  let viewContainerRef: Mock<ViewContainerRef>;
+  let injector: Mock<Injector>;
+
+  const openDialog: string = getDataTestIdOf('open-dialog');
+
+  const componentRef: ComponentRef<any> = <any>{ instance: { constructor: null } };
+  const dialogResponse: any = {};
+
+  beforeEach(async () => {
+    dialogComponent = {};
+    componentFactory = mock(OzgCloudComponentFactory);
+    dialogService = { ...mock(OzgcloudDialogService), openInContext: jest.fn().mockReturnValue({ closed: of(dialogResponse) }) };
+    viewContainerRef = mock(ViewContainerRef as any);
+    injector = mock(Injector as any);
+
+    await TestBed.configureTestingModule({
+      imports: [OpenDialogButtonComponent],
+      declarations: [MockComponent(ButtonComponent)],
+      providers: [
+        {
+          provide: DIALOG_COMPONENT,
+          useValue: dialogComponent,
+        },
+        {
+          provide: OzgCloudComponentFactory,
+          useValue: componentFactory,
+        },
+        {
+          provide: OzgcloudDialogService,
+          useValue: dialogService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OpenDialogButtonComponent);
+    component = fixture.componentInstance;
+    mockGetValue(component, 'viewContainerRef', viewContainerRef);
+    mockGetValue(component, 'injector', injector);
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('on button click', () => {
+    beforeEach(() => {
+      component._createComponent = jest.fn().mockReturnValue(componentRef);
+    });
+
+    it('should call create component factory to create component', () => {
+      dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK);
+
+      expect(component._createComponent).toHaveBeenCalled();
+    });
+
+    it('should call dialog service to open dialog', () => {
+      dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK);
+
+      expect(dialogService.openInContext).toHaveBeenCalledWith(componentRef.instance.constructor, viewContainerRef);
+    });
+  });
+
+  describe('open', () => {
+    beforeEach(() => {
+      component._createComponent = jest.fn().mockReturnValue(componentRef);
+    });
+
+    it('should emit close emitter on dialog close', () => {
+      component.close.emit = jest.fn();
+
+      component.open();
+
+      expect(component.close.emit).toHaveBeenCalled();
+    });
+  });
+
+  describe('create component', () => {
+    it('should call component factory to create component', () => {
+      component._createComponent();
+
+      expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector);
+    });
+  });
+});
diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8d5df99f45cc8a1da0c62380afba0592fb4f0d0e
--- /dev/null
+++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts
@@ -0,0 +1,46 @@
+import { OzgCloudComponentFactory } from '@alfa-client/tech-shared';
+import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui';
+import { ComponentType } from '@angular/cdk/portal';
+import { Component, ComponentRef, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core';
+import { ButtonComponent } from '@ods/system';
+import { first } from 'rxjs';
+
+@Component({
+  selector: 'ods-open-dialog-button',
+  standalone: true,
+  imports: [ButtonComponent],
+  template: `<ods-button
+    (clickEmitter)="open()"
+    variant="outline"
+    text="{{ label }}"
+    [dataTestId]="dataTestId"
+    data-test-id="open-dialog"
+  />`,
+})
+export class OpenDialogButtonComponent {
+  private readonly component: ComponentType<any> = inject(DIALOG_COMPONENT);
+  private readonly componentFactory = inject(OzgCloudComponentFactory);
+
+  private readonly dialogService = inject(OzgcloudDialogService);
+
+  readonly viewContainerRef = inject(ViewContainerRef);
+  private readonly injector = inject(Injector);
+
+  @Input() label: string;
+  @Input() dataTestId: string;
+
+  @Output() close: EventEmitter<void> = new EventEmitter();
+
+  public open(): void {
+    this.dialogService
+      .openInContext(this._createComponent().instance.constructor, this.viewContainerRef)
+      .closed.pipe(first())
+      .subscribe(() => {
+        this.close.emit();
+      });
+  }
+
+  _createComponent(): ComponentRef<any> {
+    return this.componentFactory.createComponent<any>(this.component, this.injector);
+  }
+}
diff --git a/alfa-client/libs/tech-shared/src/index.ts b/alfa-client/libs/tech-shared/src/index.ts
index 6fbc4e5294b1490dd9924a225715b0007c0ba80f..be9ebae3ab1b5b0b13a375f8bd097acbfa8c11e8 100644
--- a/alfa-client/libs/tech-shared/src/index.ts
+++ b/alfa-client/libs/tech-shared/src/index.ts
@@ -57,6 +57,7 @@ export * from './lib/resource/resource.repository';
 export * from './lib/resource/resource.rxjs.operator';
 export * from './lib/resource/resource.service';
 export * from './lib/resource/resource.util';
+export * from './lib/service/component.factory';
 export * from './lib/service/formservice.abstract';
 export * from './lib/tech.model';
 export * from './lib/tech.util';
diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..32fb2f6d84f6be4f3699b21359aa61395a0d50f8
--- /dev/null
+++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts
@@ -0,0 +1,101 @@
+import { Mock, mock, mockGetValue } from '@alfa-client/test-utils';
+import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, ViewRef } from '@angular/core';
+import { TestBed } from '@angular/core/testing';
+import { OzgCloudComponentFactory } from './component.factory';
+
+import { ComponentType } from '@angular/cdk/portal';
+
+jest.mock('@angular/core', () => ({
+  ...jest.requireActual('@angular/core'),
+  createComponent: jest.fn(),
+}));
+
+describe('OzgCloudComponentFactory', () => {
+  let factory: OzgCloudComponentFactory;
+
+  let appRef: Mock<ApplicationRef>;
+  let envInjector: Mock<EnvironmentInjector>;
+
+  beforeEach(() => {
+    appRef = mock(ApplicationRef);
+    envInjector = mock(EnvironmentInjector as any);
+
+    factory = TestBed.inject(OzgCloudComponentFactory);
+
+    mockGetValue(factory, 'appRef', appRef);
+    mockGetValue(factory, 'envInjector', envInjector);
+  });
+
+  it('should be created', () => {
+    expect(factory).toBeTruthy();
+  });
+
+  describe('create component', () => {
+    let createComponentSpy: jest.SpyInstance;
+    const injectorMock: Mock<Injector> = mock(Injector as any);
+    const componentRefMock: Mock<ComponentRef<any>> = mock(ComponentRef as any);
+
+    const componentType: ComponentType<any> = <any>{};
+    const injector: Injector = <any>{};
+
+    beforeEach(() => {
+      createComponentSpy = jest.spyOn(require('@angular/core'), 'createComponent').mockReturnValue(componentRefMock);
+      factory._createElementInjector = jest.fn().mockReturnValue(injectorMock);
+      factory._registerComponentToChangeDetection = jest.fn();
+    });
+
+    it('should call createComponent', () => {
+      factory.createComponent(componentType, injector);
+
+      expect(createComponentSpy).toHaveBeenCalledWith(componentType, {
+        environmentInjector: envInjector,
+        elementInjector: injectorMock,
+      });
+    });
+
+    it('should register component to angulars change detection', () => {
+      factory.createComponent(componentType, injector);
+
+      expect(factory._registerComponentToChangeDetection).toHaveBeenCalledWith(componentRefMock);
+    });
+
+    it('should return created component', () => {
+      const componentRef: ComponentRef<any> = factory.createComponent(componentType, injector);
+
+      expect(componentRef).toBe(componentRefMock);
+    });
+  });
+
+  describe('create element injector', () => {
+    const injectorMock: Mock<Injector> = mock(Injector as any);
+
+    let createSpy: jest.SpyInstance;
+
+    beforeEach(() => {
+      createSpy = jest.spyOn(Injector, 'create').mockReturnValue(injectorMock as Injector);
+    });
+
+    it('should create an injector by given parent selector', () => {
+      factory._createElementInjector(injectorMock);
+
+      expect(createSpy).toHaveBeenCalled();
+    });
+
+    it('should return created injector', () => {
+      const injector: Injector = factory._createElementInjector(injectorMock);
+
+      expect(injector).toBe(injectorMock);
+    });
+  });
+
+  describe('register component to angulars change detection', () => {
+    const hostView: ViewRef = <any>{};
+    const componentRef: ComponentRef<any> = <any>{ hostView };
+
+    it('should set hostview to appRef', () => {
+      factory._registerComponentToChangeDetection(componentRef);
+
+      expect(appRef.attachView).toHaveBeenCalledWith(hostView);
+    });
+  });
+});
diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e54497e9fc92bbb198891d487ddcf7565ffab139
--- /dev/null
+++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts
@@ -0,0 +1,25 @@
+import { ComponentType } from '@angular/cdk/portal';
+import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable, Injector } from '@angular/core';
+
+@Injectable({ providedIn: 'root' })
+export class OzgCloudComponentFactory {
+  private readonly appRef = inject(ApplicationRef);
+  private readonly envInjector = inject(EnvironmentInjector);
+
+  public createComponent<T>(componentType: ComponentType<any>, parentInjector: Injector): ComponentRef<T> {
+    const component: ComponentRef<any> = <ComponentRef<any>>createComponent(componentType, {
+      environmentInjector: this.envInjector,
+      elementInjector: this._createElementInjector(parentInjector),
+    });
+    this._registerComponentToChangeDetection(component);
+    return component;
+  }
+
+  _createElementInjector(parentInjector: Injector): Injector {
+    return Injector.create({ providers: [], parent: parentInjector });
+  }
+
+  _registerComponentToChangeDetection(component: ComponentRef<any>): void {
+    this.appRef.attachView(component.hostView);
+  }
+}
diff --git a/alfa-client/libs/test-utils/src/lib/model.ts b/alfa-client/libs/test-utils/src/lib/model.ts
index 1094ac96376b5a8d2d81cf5a7ebf13c69aa2a550..b2564a9ddf9869f6511f01c27ac61a0de6943879 100644
--- a/alfa-client/libs/test-utils/src/lib/model.ts
+++ b/alfa-client/libs/test-utils/src/lib/model.ts
@@ -30,6 +30,6 @@ export interface EventData<T> {
   data?: unknown;
 }
 
-export const MockEvent = {
-  CLICK: 'clickEmitter',
-};
+export enum MockEvent {
+  CLICK = 'clickEmitter',
+}
diff --git a/alfa-client/libs/ui/src/index.ts b/alfa-client/libs/ui/src/index.ts
index 2db371a18e23b0b2d01eb93bcf1738bd8ef43f61..76832535931b3342403ac5674f6f866c4c7eb58f 100644
--- a/alfa-client/libs/ui/src/index.ts
+++ b/alfa-client/libs/ui/src/index.ts
@@ -47,6 +47,7 @@ export * from './lib/ui/open-url-button/open-url-button.component';
 export * from './lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component';
 export * from './lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component';
 export * from './lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
+export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.model';
 export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.result';
 export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.service';
 export * from './lib/ui/ozgcloud-icon/ozgcloud-icon.component';
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..441d097a057ac2121ffd01610740f149e6d6d5b1
--- /dev/null
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.model.ts
@@ -0,0 +1,4 @@
+import { ComponentType } from '@angular/cdk/portal';
+import { InjectionToken } from '@angular/core';
+
+export const DIALOG_COMPONENT: InjectionToken<ComponentType<any>> = new InjectionToken<ComponentType<any>>('DialogComponent');
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts
index 91585f64a670993693cd3eb2202a181dc9d805ae..b95396349c8cb79f0e97601877a7fcd108529e56 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Mock, mock } from '@alfa-client/test-utils';
-import { Dialog, DialogConfig } from '@angular/cdk/dialog';
+import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog';
 import { TestBed } from '@angular/core/testing';
 import { OzgcloudDialogService } from './ozgcloud-dialog.service';
 
@@ -82,6 +82,26 @@ describe('OzgcloudDialogService', () => {
     });
   });
 
+  describe('open in context', () => {
+    const dialogRefMock: Mock<DialogRef> = mock(DialogRef);
+
+    beforeEach(() => {
+      service.openInCallingComponentContext = jest.fn().mockReturnValue(dialogRefMock);
+    });
+
+    it('should call open in calling component context', () => {
+      service.openInContext(component, viewContainerRef, dialogData);
+
+      expect(service.openInCallingComponentContext).toHaveBeenCalledWith(component, viewContainerRef, dialogData);
+    });
+
+    it('should return dialog ref', () => {
+      const dialogRef: DialogRef = service.openInContext(component, viewContainerRef, dialogData);
+
+      expect(dialogRef).toBe(dialogRefMock);
+    });
+  });
+
   describe('openInCallingComponentContext', () => {
     it('should open dialog with data', () => {
       service.openInCallingComponentContext(component, viewContainerRef, dialogData);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts
index 077780a3e1d01c0e198efc1de9f12244315b1194..aebed88efe5a54fafce9ec09283f0314c744fc5e 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts
@@ -30,7 +30,7 @@ import { isNil } from 'lodash-es';
   providedIn: 'root',
 })
 export class OzgcloudDialogService {
-  private dialog = inject(Dialog);
+  private readonly dialog = inject(Dialog);
 
   readonly WIZARD_DIALOG_CONFIG: DialogConfig = {
     width: '1000px',
@@ -47,10 +47,21 @@ export class OzgcloudDialogService {
     return this.openDialog<C, R>(component, this.buildDialogConfigWithData<D>(data, this.WIZARD_DIALOG_CONFIG));
   }
 
+  /**
+   * @deprecated use openInContext instead
+   */
   public open<C, D = unknown, R = unknown>(component: ComponentType<C>, data?: D): DialogRef<R> {
     return this.openDialog(component, this.buildDialogConfigWithData(data));
   }
 
+  public openInContext<C, D = unknown, R = unknown>(
+    component: ComponentType<C>,
+    viewContainerRef: ViewContainerRef,
+    data?: D,
+  ): DialogRef<R> {
+    return this.openInCallingComponentContext<C, D, R>(component, viewContainerRef, data);
+  }
+
   public openFullScreenDialog<C, D = unknown, R = unknown>(
     component: ComponentType<C>,
     viewContainerRef: ViewContainerRef,
@@ -59,6 +70,7 @@ export class OzgcloudDialogService {
     return this.openInCallingComponentContext<C, D, R>(component, viewContainerRef, data, this.GREY_BLUR_CONFIG);
   }
 
+  //TODO private machen und openInContext bei den jeweiligen Stellen nutzen
   public openInCallingComponentContext<C, D = unknown, R = unknown>(
     component: ComponentType<C>,
     viewContainerRef: ViewContainerRef,