diff --git a/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts b/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts
index 8ebcdfe95dd85b0788e1848725b2ac353450099d..474b719fef02f95377505bb0d34c85df693b46ae 100644
--- a/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts
+++ b/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts
@@ -1,10 +1,8 @@
-export class PostfachE2EComponent {
-  private readonly benutzerTabelle: string = '';
-  private readonly benutzerHinzufuegenButton: string = '';
+import { exist } from '../../support/cypress.util';
 
-  public getUserTable(): any {
-    return cy.getTestElement(this.benutzerTabelle);
-  }
+export class BenutzerE2EComponent {
+  private readonly benutzerHinzufuegenButton: string = 'add-user-button';
+  private readonly userEntry: string = 'user-entry-';
 
   public getHinzufuegenButton(): Cypress.Chainable<Element> {
     return cy.getTestElement(this.benutzerHinzufuegenButton);
@@ -14,5 +12,14 @@ export class PostfachE2EComponent {
     this.getHinzufuegenButton().click();
   }
 
-  public tableContains(compare: string): void {}
+  public getUserEntry(user: string): Cypress.Chainable<Element> {
+    user = this.userEntry + user;
+    return cy.getTestElement(user);
+  }
+
+  public stringExistsInUserEntry(phrase: string, user: string): void {
+    this.getUserEntry(user).within(() => {
+      exist(cy.contains(phrase));
+    });
+  }
 }
diff --git a/alfa-client/apps/admin-e2e/src/components/postfach/postfach.e2e.component.ts b/alfa-client/apps/admin-e2e/src/components/postfach/postfach.e2e.component.ts
index ee1c8dfa6b0f77f723d0ce4a5dacd699e816fff8..c0b20783ba77f5247d66f50e4c1b21cab2c4271e 100644
--- a/alfa-client/apps/admin-e2e/src/components/postfach/postfach.e2e.component.ts
+++ b/alfa-client/apps/admin-e2e/src/components/postfach/postfach.e2e.component.ts
@@ -24,7 +24,7 @@ export class PostfachE2EComponent {
     this.getSaveButton().click();
   }
 
-  public signatureContains(compare: string): void {
+  public signatureIs(compare: string): void {
     haveValue(this.getSignaturText(), compare);
   }
 
diff --git a/alfa-client/apps/admin-e2e/src/components/user-profile/current-user-profile.component.e2e.ts b/alfa-client/apps/admin-e2e/src/components/user-profile/current-user-profile.component.e2e.ts
index cec3ba5cd2928c558706cab247d47efcebff6e4b..8456a21b82e3976f16f597e35080c00910d8f7b0 100644
--- a/alfa-client/apps/admin-e2e/src/components/user-profile/current-user-profile.component.e2e.ts
+++ b/alfa-client/apps/admin-e2e/src/components/user-profile/current-user-profile.component.e2e.ts
@@ -1,7 +1,7 @@
 import { UserProfileE2EComponent } from './user-profile.component.e2e';
 
 export class CurrentUserProfileE2EComponent {
-  private readonly locatorUserIconButton: string = 'popup-button';
+  private readonly locatorUserIconButton: string = 'popup-button-content';
   private readonly locatorLogoutButton: string = 'popup-logout-button';
 
   private readonly locatorRoot: string = 'current-user';
diff --git a/alfa-client/apps/admin-e2e/src/e2e/benutzer_rollen/benutzer_rollen.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/benutzer_rollen/benutzer_rollen.cy.ts
index fe3c7a872af5c83ece40d73e3160a6953df0795d..45b22031b07206ebfc1b7a5ce62c288c99f62e95 100644
--- a/alfa-client/apps/admin-e2e/src/e2e/benutzer_rollen/benutzer_rollen.cy.ts
+++ b/alfa-client/apps/admin-e2e/src/e2e/benutzer_rollen/benutzer_rollen.cy.ts
@@ -1,30 +1,40 @@
-import { HeaderE2EComponent } from '../../page-objects/header.po';
+import { BenutzerE2EComponent } from '../../components/benutzer/benutzer.e2e.component';
 import { MainPage } from '../../page-objects/main.po';
 import { exist } from '../../support/cypress.util';
 import { loginAsAriane } from '../../support/user-util';
 
 const mainPage: MainPage = new MainPage();
-const header: HeaderE2EComponent = mainPage.getHeader();
+const benutzerPage: BenutzerE2EComponent = new BenutzerE2EComponent();
+const role1: string = 'VERWALTUNG_USER';
+const role2: string = 'VERWALTUNG_LOESCHEN';
+const role3: string = 'VERWALTUNG_POSTSTELLE';
+const orga1: string = 'Ordnungsamt';
+const orga2: string = 'Landesamt für Denkmalpflege';
+const orga3: string = 'Wirtschaftsförderung';
+const orga_none: string = 'keine zuständige Stelle zugewiesen';
+const mail1: string = 'peter.von.der.post@ozg-sh.de';
 
 describe('Benutzer und Rollen', () => {
   before(() => {
     loginAsAriane();
   });
 
-  it('should display logo', () => {
-    // waitForSpinnerToDisappear();
+  it('should open Benutzer tab and show Hinzufuegen button', () => {
+    mainPage.clickBenutzerTab();
 
-    exist(header.getLogo());
+    exist(benutzerPage.getHinzufuegenButton());
   });
 
-  it('should show Benutzer tab', () => {
-    // waitForSpinnerToDisappear();
-    //klick auf Benutzer tab
-    //Benutzer hinzufügen Button ist sichtbar
-    //Tabelle ist sichtbar
-  });
-
-  it('should show existing users in table', () => {
-    //Inhalt der Tabelle kontrollieren
+  it('should show users and attributes in table', () => {
+    exist(benutzerPage.getUserEntry('ariane'));
+    benutzerPage.stringExistsInUserEntry(role1, 'dorothea');
+    benutzerPage.stringExistsInUserEntry(orga1, 'ludwig');
+    benutzerPage.stringExistsInUserEntry(role1, 'zelda');
+    benutzerPage.stringExistsInUserEntry(role2, 'zelda');
+    benutzerPage.stringExistsInUserEntry(orga2, 'zelda');
+    benutzerPage.stringExistsInUserEntry(orga3, 'zelda');
+    benutzerPage.stringExistsInUserEntry(orga_none, 'adelheit');
+    benutzerPage.stringExistsInUserEntry(mail1, 'peter');
+    benutzerPage.stringExistsInUserEntry(role3, 'peter');
   });
 });
diff --git a/alfa-client/apps/admin-e2e/src/e2e/postfach/signatur.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/postfach/signatur.cy.ts
index 3b7f65abd5b8b89e6f6caed25bb3ab8af375de56..1a9d07d9cd02a699d33ad6f24e3df8fb94d24d89 100644
--- a/alfa-client/apps/admin-e2e/src/e2e/postfach/signatur.cy.ts
+++ b/alfa-client/apps/admin-e2e/src/e2e/postfach/signatur.cy.ts
@@ -15,18 +15,21 @@ describe('Signatur', () => {
     loginAsAriane();
   });
 
-  it('should show Signatur input', () => {
+  it('should clear current signature0', () => {
     waitForSpinnerToDisappear();
-
     exist(postfachTab.getSignaturText());
 
     postfachTab.clearSignatur();
+    postfachTab.signatureIs('');
+
+    postfachTab.saveSignatur();
+  });
+
+  it('should show Signatur input', () => {
     postfachTab.setSignatur(signaturText);
     postfachTab.saveSignatur();
 
-    postfachTab.signatureContains(signaturText);
+    postfachTab.signatureIs(signaturText);
     postfachTab.scrollbarIsPresent();
-
-    header.getCurrentUserProfile().logout();
   });
 });
diff --git a/alfa-client/apps/admin-e2e/src/page-objects/main.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/main.po.ts
index 8a32afeb1969570dd1dd3fce5a954aa61797f9ad..14c867e8b121a71674c1ef602bf52b8a5234ed31 100644
--- a/alfa-client/apps/admin-e2e/src/page-objects/main.po.ts
+++ b/alfa-client/apps/admin-e2e/src/page-objects/main.po.ts
@@ -4,6 +4,8 @@ import { HeaderE2EComponent } from './header.po';
 export class MainPage {
   private readonly buildInfo: BuildInfoE2EComponent = new BuildInfoE2EComponent();
   private readonly header: HeaderE2EComponent = new HeaderE2EComponent();
+  private readonly benutzerTab: string = 'nav-item-Benutzer__Rollen';
+  private readonly postfachTab: string = 'nav-item-Postfach';
 
   public getBuildInfo(): BuildInfoE2EComponent {
     return this.buildInfo;
@@ -12,6 +14,14 @@ export class MainPage {
   public getHeader(): HeaderE2EComponent {
     return this.header;
   }
+
+  public getBenutzerTab(): Cypress.Chainable<Element> {
+    return cy.getTestElement(this.benutzerTab);
+  }
+
+  public clickBenutzerTab(): void {
+    this.getBenutzerTab().click();
+  }
 }
 
 export function waitForSpinnerToDisappear(): boolean {
diff --git a/alfa-client/apps/admin/src/app/app.component.html b/alfa-client/apps/admin/src/app/app.component.html
index 69e4b50b55c887010dbdea890b1f62c3b275478f..f2b6f351107b9ad56a829832c750d7b9f6956033 100644
--- a/alfa-client/apps/admin/src/app/app.component.html
+++ b/alfa-client/apps/admin/src/app/app.component.html
@@ -11,31 +11,26 @@
     >
       <ods-admin-logo-icon />
     </a>
-    <user-profile-button-container
-      data-test-id="user-profile-button"
-    ></user-profile-button-container>
+    <user-profile-button-container data-test-id="user-profile-button"></user-profile-button-container>
   </header>
   <div class="flex h-screen w-full justify-center overflow-y-auto">
     <ods-navbar data-test-id="navigation">
       <ng-container *ngIf="apiRoot | hasLink: ApiRootLinkRel.CONFIGURATION">
-        <!--        <ods-nav-item caption="Organisationseinheiten" to="/organisationseinheiten">-->
-        <!--          <ods-orga-unit-icon icon />-->
-        <!--        </ods-nav-item>-->
-        <ods-nav-item caption="Benutzer & Rollen" to="/benutzer_und_rollen">
+        <ods-nav-item caption="Benutzer & Rollen" path="/benutzer_und_rollen">
           <ods-users-icon class="stroke-text" icon />
         </ods-nav-item>
         <hr />
-        <ods-nav-item caption="Postfach" to="/postfach">
+        <ods-nav-item caption="Postfach" path="/postfach">
           <ods-mailbox-icon icon />
         </ods-nav-item>
+        <ods-nav-item caption="Organisationseinheiten" path="/organisationseinheiten">
+          <ods-orga-unit-icon icon />
+        </ods-nav-item>
       </ng-container>
     </ods-navbar>
     <main class="flex-1 overflow-y-auto bg-white px-6 py-4">
       <router-outlet
-        *ngIf="
-          apiRoot | hasLink: ApiRootLinkRel.CONFIGURATION;
-          else configurationResourceLinkNotAvailable
-        "
+        *ngIf="apiRoot | hasLink: ApiRootLinkRel.CONFIGURATION; else configurationResourceLinkNotAvailable"
         data-test-id="router-outlet"
       ></router-outlet>
       <ng-template #configurationResourceLinkNotAvailable>
diff --git a/alfa-client/apps/admin/src/app/app.module.ts b/alfa-client/apps/admin/src/app/app.module.ts
index 87851bfbf2023a5c45f01651136813ef6d0dab9e..01643aecf53c02179b296544043e2dd10f3fca65 100644
--- a/alfa-client/apps/admin/src/app/app.module.ts
+++ b/alfa-client/apps/admin/src/app/app.module.ts
@@ -28,7 +28,8 @@ import { OAuthModule } from 'angular-oauth2-oidc';
 import { HttpUnauthorizedInterceptor } from 'libs/authentication/src/lib/http-unauthorized.interceptor';
 import { UserProfileButtonContainerComponent } from '../common/user-profile-button-container/user-profile.button-container.component';
 import { environment } from '../environments/environment';
-import { OrganisationseinheitPageComponent } from '../pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component';
+import { OrganisationsEinheitFormPageComponent } from '../pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component';
+import { OrganisationsEinheitPageComponent } from '../pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component';
 import { PostfachPageComponent } from '../pages/postfach/postfach-page/postfach-page.component';
 import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component';
 import { UserRolesPageComponent } from '../pages/users-roles/user-roles-page/user-roles-page.component';
@@ -40,7 +41,8 @@ import { appRoutes } from './app.routes';
     AppComponent,
     PostfachPageComponent,
     UserRolesPageComponent,
-    OrganisationseinheitPageComponent,
+    OrganisationsEinheitPageComponent,
+    OrganisationsEinheitFormPageComponent,
     UserProfileButtonContainerComponent,
     UnavailablePageComponent,
   ],
diff --git a/alfa-client/apps/admin/src/app/app.routes.ts b/alfa-client/apps/admin/src/app/app.routes.ts
index 9594ce3ee2736d7a990774c0b57db4f75e3a7582..4225458cdaeb73330edbafa34f76c46209ebfc27 100644
--- a/alfa-client/apps/admin/src/app/app.routes.ts
+++ b/alfa-client/apps/admin/src/app/app.routes.ts
@@ -1,4 +1,6 @@
 import { Route } from '@angular/router';
+import { OrganisationsEinheitFormPageComponent } from '../pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component';
+import { OrganisationsEinheitPageComponent } from '../pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component';
 import { PostfachPageComponent } from '../pages/postfach/postfach-page/postfach-page.component';
 import { UserRolesPageComponent } from '../pages/users-roles/user-roles-page/user-roles-page.component';
 
@@ -18,9 +20,14 @@ export const appRoutes: Route[] = [
     component: UserRolesPageComponent,
     title: 'Admin | Benutzer & Rollen',
   },
-  // {
-  //   path: 'organisationseinheiten',
-  //   component: OrganisationseinheitPageComponent,
-  //   title: 'Admin | Organisationseinheiten',
-  // },
+  {
+    path: 'organisationseinheiten',
+    component: OrganisationsEinheitPageComponent,
+    title: 'Admin | Organisationseinheiten',
+  },
+  {
+    path: 'organisationseinheiten/:organisationsEinheitUrl',
+    component: OrganisationsEinheitFormPageComponent,
+    title: 'Admin | Organisationseinheit',
+  },
 ];
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.html b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..2449a303b186022b68d062f7b59ba73c5cb6a790
--- /dev/null
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.html
@@ -0,0 +1 @@
+<admin-organisationseinheit-form-container/>
\ No newline at end of file
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.spec.ts b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4ad49ca4595e598e66a9e6b0d40b46cca0d606b5
--- /dev/null
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.spec.ts
@@ -0,0 +1,26 @@
+import { OrganisationsEinheitFormContainerComponent } from '@admin-client/admin-settings';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MockComponent } from 'ng-mocks';
+import { OrganisationsEinheitFormPageComponent } from './organisationseinheit-form-page.component';
+
+describe('OrganisationsEinheitFormPageComponent', () => {
+  let component: OrganisationsEinheitFormPageComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitFormPageComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [OrganisationsEinheitFormPageComponent, MockComponent(OrganisationsEinheitFormContainerComponent)],
+    }).compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(OrganisationsEinheitFormPageComponent);
+    component = fixture.componentInstance;
+
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.ts b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b7c9e0ea72a6ccd313239a4461f3a75692be5d9d
--- /dev/null
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component.ts
@@ -0,0 +1,7 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'organisationseinheit-form-page',
+  templateUrl: './organisationseinheit-form-page.component.html',
+})
+export class OrganisationsEinheitFormPageComponent {}
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.html b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.html
index ff86abb3c13e73397ead229e205a03fa87c3f944..792930158756ab6bea2bf0e8fbd5c164c5037c0a 100644
--- a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.html
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.html
@@ -1 +1 @@
-<admin-organisationseinheit-container></admin-organisationseinheit-container>
+<admin-organisationseinheit-container/>
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.spec.ts b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.spec.ts
index e5c52e8433943e7eaedee4c2cc541400b7eb873c..59ddda81ab9c26fbac8f8bd976298596c9283b5a 100644
--- a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.spec.ts
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.spec.ts
@@ -1,23 +1,20 @@
-import { OrganisationseinheitContainerComponent } from '@admin-client/admin-settings';
+import { OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MockComponent } from 'ng-mocks';
-import { OrganisationseinheitPageComponent } from './organisationseinheit-page.component';
+import { OrganisationsEinheitPageComponent } from './organisationseinheit-page.component';
 
-describe('OrganisationseinheitPageComponent', () => {
-  let component: OrganisationseinheitPageComponent;
-  let fixture: ComponentFixture<OrganisationseinheitPageComponent>;
+describe('OrganisationsEinheitPageComponent', () => {
+  let component: OrganisationsEinheitPageComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitPageComponent>;
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        OrganisationseinheitPageComponent,
-        MockComponent(OrganisationseinheitContainerComponent),
-      ],
+      declarations: [OrganisationsEinheitPageComponent, MockComponent(OrganisationsEinheitContainerComponent)],
     }).compileComponents();
   });
 
   beforeEach(() => {
-    fixture = TestBed.createComponent(OrganisationseinheitPageComponent);
+    fixture = TestBed.createComponent(OrganisationsEinheitPageComponent);
     component = fixture.componentInstance;
 
     fixture.detectChanges();
diff --git a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.ts b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.ts
index a87b271644db44803dd63e84c99ca71b0be15443..4d653b6ed7b3701a4f74ce763f313cc93ca29dc6 100644
--- a/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.ts
+++ b/alfa-client/apps/admin/src/pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component.ts
@@ -4,4 +4,4 @@ import { Component } from '@angular/core';
   selector: 'organisationseinheit-page',
   templateUrl: './organisationseinheit-page.component.html',
 })
-export class OrganisationseinheitPageComponent {}
+export class OrganisationsEinheitPageComponent {}
diff --git a/alfa-client/apps/admin/src/styles.scss b/alfa-client/apps/admin/src/styles.scss
index 9a4448d0f9c72e50e1aac1b190f36cf3118d060a..96c11f976ff90e09cd3bfd7a1bbfeee02560a841 100644
--- a/alfa-client/apps/admin/src/styles.scss
+++ b/alfa-client/apps/admin/src/styles.scss
@@ -6,10 +6,17 @@
 
 @import 'libs/design-system/src/lib/tailwind-preset/root.css';
 @import 'libs/ui/src/lib/font/font_material';
+@import 'variables';
 
 @include mat.all-component-typographies();
 @include mat.core();
 
+@include mat.all-component-themes($alfaTheme);
+
+body.dark {
+  @include mat.all-component-colors($alfaDarkTheme);
+}
+
 .heading-1 {
   @apply text-3xl font-medium text-text;
 }
diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-more-menu.e2e.components.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-more-menu.e2e.components.ts
index cb6f501de05aeae9d46d44ccbcc9c53c37127a28..f064652c55847f3c0afdbb7b7a418653172f9d33 100644
--- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-more-menu.e2e.components.ts
+++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-more-menu.e2e.components.ts
@@ -38,7 +38,10 @@ export class VorgangMoreMenuE2EComponent {
   public getButton() {
     return this.getRoot().getTestElementWithOid(this.buttonLocator);
   }
-  //
+
+  public openMenu(): void {
+    this.getButton().click();
+  }
 
   public getExportierenItem(): VorgangMoreMenuExportierenItemE2EComponent {
     return this.exportierenItem;
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-exportieren.cy.ts
similarity index 92%
rename from alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts
rename to alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-exportieren.cy.ts
index 768acbc0f79869d9a834fd236fcc25232232808e..d11aeed9a9bbb1d38b1c7660d73773ea320084d4 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-exportieren.cy.ts
@@ -76,7 +76,7 @@ describe('Vorgang exportieren', () => {
     dropCollections();
   });
 
-  describe('exportieren', () => {
+  describe('export file', () => {
     const menuItem: VorgangMoreMenuExportierenItemE2EComponent =
       vorgangMoreMenu.getExportierenItem();
 
@@ -103,7 +103,7 @@ describe('Vorgang exportieren', () => {
       vorgangMoreMenu.getButton().click({ force: true });
     });
 
-    it('should handle snackbar after abschliessen', () => {
+    it('should show "Herunterladen" button in Abgeschlossen status', () => {
       vorgangFormularButtons.getAbschliessenButton().click();
       waitForSpinnerToDisappear();
 
@@ -119,19 +119,18 @@ describe('Vorgang exportieren', () => {
       vorgangMoreMenu.getButton().click({ force: true });
     });
 
-    it('should have 1 file in download folder after download', () => {
-      vorgangMoreMenu.getButton().click();
+    it('should delete the downloads folder and click on download', () => {
       deleteDownloadFolder().then(() => {
         menuItem.getButton().click({ force: true });
         waitForSpinnerToDisappear();
-
-        countDownloadFiles().then((count) => {
-          expect(count).to.eq(1);
-        });
       });
     });
 
-    it('should close menu after download', () => {
+    it('should have 1 file in download folder after download and close menu', () => {
+      countDownloadFiles().then((count) => {
+        expect(count).to.eq(1);
+      });
+
       notExist(menuItem.getRoot());
     });
   });
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
new file mode 100644
index 0000000000000000000000000000000000000000..e1ec775a98bb267f6958d829d7163570aed65949
--- /dev/null
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-xdomea/vorgang-xdomea-inhalte.cy.ts
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+import { registerLocaleData } from '@angular/common';
+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 {
+  VorgangMoreMenuE2EComponent,
+  VorgangMoreMenuExportierenItemE2EComponent,
+} from 'apps/alfa-e2e/src/components/vorgang/vorgang-more-menu.e2e.components';
+import { CommandE2E, CommandOrderE2E } from 'apps/alfa-e2e/src/model/command';
+import { KommentarE2E } from 'apps/alfa-e2e/src/model/kommentar';
+import { VorgangAttachedItemE2E } from 'apps/alfa-e2e/src/model/vorgang-attached-item';
+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 { 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';
+import { VorgangE2E, VorgangStatusE2E } from '../../../model/vorgang';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
+import { VorgangPage } from '../../../page-objects/vorgang.po';
+import {
+  deleteDownloadFolder,
+  dropCollections,
+  getDownloadFileAt,
+  getDownloadFiles,
+  unzipDownloadFile,
+} from '../../../support/cypress-helper';
+import { exist, notExist } 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';
+
+registerLocaleData(localeDe, 'de', localeDeExtra);
+
+describe('check xDomea contents', () => {
+  const mainPage: MainPage = new MainPage();
+  const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
+
+  const vorgangPage: VorgangPage = new VorgangPage();
+  const vorgangMoreMenu: VorgangMoreMenuE2EComponent = vorgangPage.getMoreMenu();
+  const menuItem: VorgangMoreMenuExportierenItemE2EComponent = vorgangMoreMenu.getExportierenItem();
+
+  const xdomeaNamespace: string = 'urn:xoev-de:xdomea:schema:3.0.0';
+  //const ns3Namespace: string = 'urn:ozgcloud-de:xdomea:schema:1.0.0';
+
+  const kommentarText: string = 'Kommentar zum Export';
+  let xdomeaFile: string;
+
+  const vorgangExportieren: VorgangE2E = {
+    ...createVorgang(),
+    status: VorgangStatusE2E.IN_BEARBEITUNG,
+    name: 'DoExportieren',
+  };
+
+  const assignUserCommand: CommandE2E = {
+    ...buildCommand(
+      CommandOrderE2E.ASSIGN_USER,
+      vorgangExportieren._id.$oid,
+      vorgangExportieren._id.$oid,
+    ),
+    bodyObject: { assignedTo: getUserDorotheaId() },
+    finishedAt: { $date: '2024-06-20T07:25:30.000Z' },
+  };
+
+  const changeStatusCommand: CommandE2E = {
+    ...buildCommand(
+      CommandOrderE2E.VORGANG_WIEDEREROEFFNEN,
+      vorgangExportieren._id.$oid,
+
+      vorgangExportieren._id.$oid,
+    ),
+    order: CommandOrderE2E.VORGANG_WIEDEREROEFFNEN,
+    finishedAt: { $date: '2024-06-18T07:25:30.000Z' },
+  };
+
+  const setAktenzeichenCommand: CommandE2E = {
+    ...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' },
+  };
+
+  const kommentar: KommentarE2E = {
+    ...createKommentar(),
+    text: kommentarText,
+  };
+  const kommentarAttachedItem: VorgangAttachedItemE2E = {
+    ...createKommentarAttachedItem(objectIds[1], vorgangExportieren._id.$oid),
+    item: kommentar,
+  };
+
+  const vorgangFormularButtons: VorgangFormularButtonsE2EComponent =
+    vorgangPage.getFormularButtons();
+
+  const bescheidWizard: VorgangBescheidWizardE2EComponent = vorgangPage.getBescheidWizard();
+
+  before(() => {
+    initVorgang(vorgangExportieren);
+    initCommands([assignUserCommand, changeStatusCommand, setAktenzeichenCommand]);
+    initVorgangAttachedItem([kommentarAttachedItem]);
+    initUsermanagerUsers();
+
+    loginAsSabine();
+
+    waitForSpinnerToDisappear();
+    exist(vorgangList.getRoot());
+  });
+
+  after(() => {
+    dropCollections();
+  });
+
+  describe('create Bescheid, export and unzip file', () => {
+    it('should create a Bescheid', () => {
+      vorgangList.getListItem(vorgangExportieren.name).getRoot().click();
+      vorgangFormularButtons.getBescheidenButton().click();
+      bescheidWizard.weiter();
+      uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID);
+      notExist(bescheidWizard.getBescheidUploadSpinner());
+      bescheidWizard.weiter();
+      bescheidWizard.getSendButton().click();
+      waitForSpinnerToDisappear();
+      vorgangFormularButtons.getAbschliessenButton().click();
+    });
+
+    it('should download and unzip the xdomea file', () => {
+      waitForSpinnerToDisappear();
+      openXdomeaFile();
+    });
+
+    it('should read the xdomea content', () => {
+      readXdomeaFile();
+    });
+  });
+
+  describe('check contents of xdomea file', () => {
+    it('should contain entries for AnwendungsspezifischeErweiterung', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'Kennung', position: 0 }, 'IDOZGCloud1234567');
+      xmlMap.set({ type: 'Name', position: 6 }, 'Anwendungsspezifische Erweiterung OZGCloud Basis');
+      xmlMap.set({ type: 'Wert', position: 0 }, '2021-02-11T17:17:28Z');
+      xmlMap.set({ type: 'Wert', position: 1 }, 'Testermann');
+      xmlMap.set({ type: 'Wert', position: 2 }, 'Max');
+      xmlMap.set({ type: 'Wert', position: 3 }, '1995-03-21');
+      xmlMap.set({ type: 'Wert', position: 4 }, '66X00');
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+
+    it('should contain change of Vorgang Status', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'MetadatumNeuerWert', position: 0 }, 'In Bearbeitung');
+      xmlMap.set({ type: 'DatumUhrzeit', position: 0 }, '2024-06-18T07:25:30.000Z');
+      xmlMap.set({ type: 'Aktion', position: 0 }, CommandOrderE2E.VORGANG_WIEDEREROEFFNEN);
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+
+    it('should contain change of Aktenzeichen', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'MetadatumNeuerWert', position: 3 }, 'AKT_ENZ_EIC_HEN1');
+      xmlMap.set({ type: 'DatumUhrzeit', position: 3 }, '2024-06-19T07:25:30.000Z');
+      xmlMap.set({ type: 'Aktion', position: 3 }, 'SET_AKTENZEICHEN');
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+
+    it('should contain change of Bearbeiter', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'MetadatumNeuerWert', position: 4 }, 'Dorothea Doe; 9030229');
+      xmlMap.set({ type: 'DatumUhrzeit', position: 4 }, '2024-06-20T07:25:30.000Z');
+      xmlMap.set({ type: 'Aktion', position: 4 }, 'ASSIGN_USER');
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+
+    it('should contain creation of Kommentar', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'Typ', position: 0 }, 'Notiz');
+      xmlMap.set({ type: 'Akteur', position: 5 }, 'Sabine Sach; 9030229');
+      xmlMap.set({ type: 'DatumUhrzeit', position: 5 }, '2024-01-10T12:57:35.000Z');
+      xmlMap.set({ type: 'Aktion', position: 5 }, 'CREATE_KOMMENTAR');
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+
+    it('should contain Bescheid info', () => {
+      const xmlMap: Map<XmlTypePosition, string> = new Map<XmlTypePosition, string>();
+      xmlMap.set({ type: 'Typ', position: 2 }, 'Bescheid');
+      xmlMap.set({ type: 'Akteur', position: 7 }, 'Sabine Sach; 9030229');
+      xmlMap.set({ type: 'Aktion', position: 7 }, 'Bescheid an Antragsteller gesendet');
+      compareXmlEntry(xdomeaFile, xmlMap);
+    });
+  });
+
+  function openXdomeaFile(): void {
+    vorgangMoreMenu.openMenu();
+    deleteDownloadFolder().then(() => {
+      menuItem.getButton().click({ force: true });
+      waitForSpinnerToDisappear();
+      cy.wait(1000);
+      getDownloadFiles().then((files) => {
+        unzipDownloadFile(files[0]);
+      });
+    });
+  }
+
+  //TODO: Funktionen für NS3-Tag schreiben / anpassen
+  function getXdomeaNamespace(content: string, tagName: string, position: number): string {
+    return getXMLFromTagAtPosition(xdomeaNamespace, content, tagName, position);
+  }
+
+  function getXMLFromTagAtPosition(
+    namespaceURI: string,
+    content: string,
+    tagName: string,
+    position: number,
+  ) {
+    const xmlDoc = parseXml(content);
+    return xmlDoc.getElementsByTagNameNS(namespaceURI, tagName)[position].textContent;
+  }
+
+  function readXdomeaFile(): void {
+    findFirstDownloadFileWithString('Abgabe.0401.xml').then((xmlFile) => {
+      getDownloadFileAt(xmlFile).then((content) => {
+        xdomeaFile = content;
+      });
+    });
+  }
+
+  function findFirstDownloadFileWithString(searchString: string): Cypress.Chainable<number> {
+    return getDownloadFiles().then((files) => {
+      const targetFiles = files.filter((file) => {
+        return file.toLowerCase().includes(searchString.toLowerCase());
+      });
+
+      if (targetFiles.length === 0) {
+        throw new Error(`No files containing "${searchString}" found.`);
+      }
+
+      const targetFileName = targetFiles[0];
+      const position = files.indexOf(targetFileName);
+      return position;
+    });
+  }
+
+  function compareXmlEntry(xDomeaFile: string, xmlMap: Map<XmlTypePosition, string>) {
+    xmlMap.forEach((expectedValue, xmlTypePosition) => {
+      expect(
+        getXdomeaNamespace(xDomeaFile, xmlTypePosition.type, xmlTypePosition.position),
+      ).to.equal(expectedValue);
+    });
+  }
+
+  interface XmlTypePosition {
+    type: string;
+    position: number;
+  }
+});
diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts
index ff47d4f57c44947ca091adfd2b7075fa92013942..325b7e256a1d99dc658fd348654578aba928e480 100644
--- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts
+++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-zusammenarbeit/vorgang-zusammenarbeit-anfragen.cy.ts
@@ -15,13 +15,12 @@ import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang
 
 registerLocaleData(localeDe, 'de', localeDeExtra);
 
-describe('Vorgang Zusammenarbeit anfragen', () => {
+describe.skip('Vorgang Zusammenarbeit anfragen', () => {
   const mainPage: MainPage = new MainPage();
   const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
 
   const vorgangPage: VorgangPage = new VorgangPage();
-  const zusammenarbeitContainer: VorgangZusammenarbeitE2EComponent =
-    vorgangPage.getZusammenarbeitContainer();
+  const zusammenarbeitContainer: VorgangZusammenarbeitE2EComponent = vorgangPage.getZusammenarbeitContainer();
 
   const zusammenarbeitVorgang: VorgangE2E = {
     ...buildVorgang(objectIds[0], 'Zusammenarbeit Vorgang'),
diff --git a/alfa-client/apps/alfa-e2e/src/model/command.ts b/alfa-client/apps/alfa-e2e/src/model/command.ts
index acd160995e1bd16bc44116bd41f0e0977cb05e0c..b4ed055ac0fe2f4f2b54d302bff199a82813d437 100644
--- a/alfa-client/apps/alfa-e2e/src/model/command.ts
+++ b/alfa-client/apps/alfa-e2e/src/model/command.ts
@@ -34,7 +34,9 @@ export enum CommandOrderE2E {
   RESEND_POSTFACH_NACHRICHT = 'RESEND_POSTFACH_MAIL',
   SEND_POSTFACH_MAIL = 'SEND_POSTFACH_MAIL',
   SEND_POSTFACH_NACHRICHT = 'SEND_POSTFACH_NACHRICHT',
+  SET_AKTENZEICHEN = 'SET_AKTENZEICHEN',
   UPDATE_ATTACHED_ITEM = 'UPDATE_ATTACHED_ITEM',
+  VORGANG_WIEDEREROEFFNEN = 'VORGANG_WIEDEREROEFFNEN',
 }
 export class CommandE2E {
   vorgangId: string;
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 90c0c0b4058f983b0cb51861d8b632084cb2a8a3..aa30f90a3e2aba7dfd964af16093943324b68d14 100644
--- a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts
@@ -192,7 +192,7 @@ export function reload(): void {
 }
 
 export function readFileFromDownloads(fileName: string): Cypress.Chainable<any> {
-  return cy.readFile(`${DOWNLOAD_FOLDER}/${fileName}`, { timeout: 5000 });
+  return cy.readFile(`${DOWNLOAD_FOLDER}/${fileName}`);
 }
 
 export function pressTab(): void {
@@ -216,3 +216,7 @@ export function addSmockerMock(mock: SmockerMocks): void {
 export function resetSmocker(): void {
   cy.resetSmocker();
 }
+
+export function getDownloadFileAt(filePosition: number): Cypress.Chainable<string> {
+  return getDownloadFiles().then((files) => readFileFromDownloads(files[filePosition]));
+}
diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts b/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts
index 4440874cbfcc512a5b23c9394c60f50f15e07d21..fb946e5df04adf16437a2d71ac9666ed7ce1932e 100644
--- a/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts
@@ -26,6 +26,10 @@ import { wait } from './cypress-helper';
 
 //TODO Naming der Methoden geradeziehen
 
+export function beEqual(element: any, text: string): void {
+  element.should('equal', text);
+}
+
 export function containClass(element: any, cssClass: string): void {
   element.should('have.class', cssClass);
 }
diff --git a/alfa-client/apps/alfa-e2e/src/support/tech.util.ts b/alfa-client/apps/alfa-e2e/src/support/tech.util.ts
index 564665623ac9f858891882a163cb1f435694f77e..675bc0457ffeeb7d90dfa98cad59c706dad31965 100644
--- a/alfa-client/apps/alfa-e2e/src/support/tech.util.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/tech.util.ts
@@ -105,3 +105,9 @@ export function getAdjustedDateEnglish(daysOffset: number): string {
   const date = add(new Date(), { days: daysOffset });
   return format(date, 'yyyy/MM/dd');
 }
+
+const parser = new DOMParser();
+
+export function parseXml(fileContent): Document {
+  return parser.parseFromString(fileContent, 'text/xml');
+}
diff --git a/alfa-client/apps/alfa-e2e/src/support/user-util.ts b/alfa-client/apps/alfa-e2e/src/support/user-util.ts
index 72b27edd2355cb32742d6c2ac3d7607500c226fa..34d06a712b3944f70b621d4507ca2dfc3b6ca004 100644
--- a/alfa-client/apps/alfa-e2e/src/support/user-util.ts
+++ b/alfa-client/apps/alfa-e2e/src/support/user-util.ts
@@ -92,6 +92,10 @@ export function getUserSabineId(): string {
   return getUserManagerUserSabine()._id.$oid;
 }
 
+export function getUserDorotheaId(): string {
+  return getUserManagerUserDorothea()._id.$oid;
+}
+
 enum DatabaseUser {
   EMIL = 'user-ea/user_emil.json',
   ADELHEIT = 'user-main/user_adelheit.json',
diff --git a/alfa-client/libs/admin/settings/src/index.ts b/alfa-client/libs/admin/settings/src/index.ts
index c4fb8070ef7b2b2df0fcfbe70f30c84a06235327..a13f84185d2480694cbb145fb300e553cc668381 100644
--- a/alfa-client/libs/admin/settings/src/index.ts
+++ b/alfa-client/libs/admin/settings/src/index.ts
@@ -1,5 +1,7 @@
 export * from './lib/admin-settings.module';
+export * from './lib/organisationseinheit/organisations-einheit.model';
 export * from './lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component';
+export * from './lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component';
 export * from './lib/postfach/postfach-container/postfach-container.component';
 export * from './lib/shared/navigation-item/navigation-item.component';
 export * from './lib/users-roles/users-roles.component';
diff --git a/alfa-client/libs/admin/settings/src/lib/admin-settings.module.ts b/alfa-client/libs/admin/settings/src/lib/admin-settings.module.ts
index 321e7c04c5850b85027d827f2bc43e971cdef1b1..ad13c6426adbf09d39909c175b215c4e79f6c932 100644
--- a/alfa-client/libs/admin/settings/src/lib/admin-settings.module.ts
+++ b/alfa-client/libs/admin/settings/src/lib/admin-settings.module.ts
@@ -1,20 +1,39 @@
 import { ApiRootService } from '@alfa-client/api-root-shared';
 import { Environment, ENVIRONMENT_CONFIG } from '@alfa-client/environment-shared';
+import { NavigationSharedModule } from '@alfa-client/navigation-shared';
 import { ResourceRepository, TechSharedModule } from '@alfa-client/tech-shared';
+import { UiModule } from '@alfa-client/ui';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 import KcAdminClient from '@keycloak/keycloak-admin-client';
 import { ButtonWithSpinnerComponent, TextareaEditorComponent } from '@ods/component';
-import { MailboxIconComponent, PersonIconComponent, TextInputComponent } from '@ods/system';
+import {
+  ExclamationIconComponent,
+  ListComponent,
+  ListItemComponent,
+  MailboxIconComponent,
+  PersonIconComponent,
+  TextInputComponent,
+} from '@ods/system';
 import { createSettingListResourceService, SettingListResourceService } from './admin-settings-resource.service';
 import { SettingsService } from './admin-settings.service';
 import { ConfigurationResourceService, createConfigurationResourceService } from './configuration/configuration-resource.service';
 import { ConfigurationService } from './configuration/configuration.service';
-import { OrganisationseinheitContainerComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-container.component';
-import { OrganisationseinheitFormComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component';
-import { OrganisationseinheitListComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component';
+import {
+  createOrganisationsEinheitListResourceService,
+  OrganisationsEinheitListResourceService,
+} from './organisationseinheit/organisations-einheit-list-resource.service';
+import {
+  createOrganisationsEinheitResourceService,
+  OrganisationsEinheitResourceService,
+} from './organisationseinheit/organisations-einheit-resource.service';
+import { OrganisationsEinheitContainerComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-container.component';
+import { OrganisationsEinheitListComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component';
+import { OrganisationsEinheitFormContainerComponent } from './organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component';
+import { OrganisationsEinheitFormComponent } from './organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component';
+import { OrganisationsEinheitSignaturComponent } from './organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component';
 import { PostfachContainerComponent } from './postfach/postfach-container/postfach-container.component';
 import { PostfachFormComponent } from './postfach/postfach-container/postfach-form/postfach-form.component';
 import { PostfachSignaturComponent } from './postfach/postfach-container/postfach-form/postfach-signatur/postfach-signatur.component';
@@ -37,11 +56,13 @@ import { UsersRolesComponent } from './users-roles/users-roles.component';
     PostfachSignaturComponent,
     NavigationItemComponent,
     TextFieldComponent,
-    OrganisationseinheitContainerComponent,
-    OrganisationseinheitFormComponent,
+    OrganisationsEinheitContainerComponent,
+    OrganisationsEinheitListComponent,
+    OrganisationsEinheitFormContainerComponent,
+    OrganisationsEinheitFormComponent,
+    OrganisationsEinheitSignaturComponent,
     PrimaryButtonComponent,
     SecondaryButtonComponent,
-    OrganisationseinheitListComponent,
     MoreMenuComponent,
     MoreItemButtonComponent,
     SpinnerComponent,
@@ -58,8 +79,19 @@ import { UsersRolesComponent } from './users-roles/users-roles.component';
     MailboxIconComponent,
     PersonIconComponent,
     ToUserNamePipe,
+    ListComponent,
+    ListItemComponent,
+    ExclamationIconComponent,
+    UiModule,
+    NavigationSharedModule,
+  ],
+  exports: [
+    PostfachContainerComponent,
+    OrganisationsEinheitContainerComponent,
+    OrganisationsEinheitFormContainerComponent,
+    NavigationItemComponent,
+    UsersRolesComponent,
   ],
-  exports: [PostfachContainerComponent, OrganisationseinheitContainerComponent, NavigationItemComponent, UsersRolesComponent],
   providers: [
     ConfigurationService,
     SettingsService,
@@ -88,6 +120,16 @@ import { UsersRolesComponent } from './users-roles/users-roles.component';
       useFactory: createSettingListResourceService,
       deps: [ResourceRepository, ConfigurationService],
     },
+    {
+      provide: OrganisationsEinheitListResourceService,
+      useFactory: createOrganisationsEinheitListResourceService,
+      deps: [ResourceRepository, ApiRootService],
+    },
+    {
+      provide: OrganisationsEinheitResourceService,
+      useFactory: createOrganisationsEinheitResourceService,
+      deps: [ResourceRepository, OrganisationsEinheitListResourceService],
+    },
   ],
 })
 export class AdminSettingsModule {}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-list-resource.service.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-list-resource.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6fd977e0f5cffdd20fc701931e73e023279efafc
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-list-resource.service.ts
@@ -0,0 +1,24 @@
+import { AdminOrganisationsEinheitItemResource, AdminOrganisationsEinheitListResource } from '@admin-client/admin-settings';
+import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
+import { ListResourceServiceConfig, ResourceListService, ResourceRepository } from '@alfa-client/tech-shared';
+import { ConfigurationResource } from 'libs/admin/settings/src/lib/configuration/configuration.model';
+import { OrganisationsEinheitListLinkRel } from './organisations-einheit.linkrel';
+
+export class OrganisationsEinheitListResourceService extends ResourceListService<
+  ApiRootResource,
+  AdminOrganisationsEinheitListResource,
+  AdminOrganisationsEinheitItemResource
+> {}
+
+export function createOrganisationsEinheitListResourceService(repository: ResourceRepository, apiRootService: ApiRootService) {
+  return new ResourceListService(buildConfig(apiRootService), repository);
+}
+
+function buildConfig(apiRootService: ApiRootService): ListResourceServiceConfig<ConfigurationResource> {
+  return {
+    baseResource: apiRootService.getApiRoot(),
+    createLinkRel: 'TODO',
+    listLinkRel: ApiRootLinkRel.ORGANISATIONS_EINHEIT,
+    listResourceListLinkRel: OrganisationsEinheitListLinkRel.LIST,
+  };
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-resource.service.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-resource.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7722ed1bc822c933a67f33f74b7175ae2e7e2f47
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit-resource.service.ts
@@ -0,0 +1,25 @@
+import { AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { ApiResourceService, ResourceRepository, ResourceServiceConfig } from '@alfa-client/tech-shared';
+import { ConfigurationResource } from 'libs/admin/settings/src/lib/configuration/configuration.model';
+import { OrganisationsEinheitListResourceService } from './organisations-einheit-list-resource.service';
+import { OrganisationsEinheitLinkRel } from './organisations-einheit.linkrel';
+
+export class OrganisationsEinheitResourceService extends ApiResourceService<
+  AdminOrganisationsEinheitResource,
+  AdminOrganisationsEinheitResource
+> {}
+
+export function createOrganisationsEinheitResourceService(
+  repository: ResourceRepository,
+  listResourceService: OrganisationsEinheitListResourceService,
+) {
+  return new ApiResourceService(buildConfig(listResourceService), repository);
+}
+
+function buildConfig(listResourceService: OrganisationsEinheitListResourceService): ResourceServiceConfig<ConfigurationResource> {
+  return {
+    resource: listResourceService.getSelected(),
+    getLinkRel: OrganisationsEinheitLinkRel.SELF,
+    edit: { linkRel: OrganisationsEinheitLinkRel.SELF },
+  };
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.linkrel.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.linkrel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e941e1fc3ac3406b32d44085fcde10284fde8ba
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.linkrel.ts
@@ -0,0 +1,7 @@
+export enum OrganisationsEinheitListLinkRel {
+  LIST = 'organisationsEinheitList',
+}
+
+export enum OrganisationsEinheitLinkRel {
+  SELF = 'self',
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.model.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f74a83a382373287cfc21afe8654c9023d67e341
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisations-einheit.model.ts
@@ -0,0 +1,26 @@
+import { ListResource } from '@alfa-client/tech-shared';
+import { Resource } from '@ngxp/rest';
+
+export interface AdminOrganisationsEinheit {
+  name: string;
+  organisationsEinheitId: string;
+  syncResult: AdminOrganisationsEinheitSyncResult;
+  settings?: AdminOrganisationsEinheitSettings;
+  isChild?: boolean;
+}
+
+export enum AdminOrganisationsEinheitSyncResult {
+  OK = 'OK',
+  NOT_FOUND_IN_PVOG = 'NOT_FOUND_IN_PVOG',
+  NAME_MISMATCH = 'NAME_MISMATCH',
+  ORGANISATIONSEINHEIT_ID_NOT_UNIQUE = 'ORGANISATIONSEINHEIT_ID_NOT_UNIQUE',
+  DELETED = 'DELETED',
+}
+
+export interface AdminOrganisationsEinheitSettings {
+  signatur?: string;
+}
+
+export interface AdminOrganisationsEinheitResource extends AdminOrganisationsEinheit, Resource {}
+export interface AdminOrganisationsEinheitListResource extends ListResource {}
+export declare type AdminOrganisationsEinheitItemResource = Resource & AdminOrganisationsEinheit;
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
index 3e7af75f493ada03112994766ea980b90033e282..15147aaf6e7a835c2392340bb18c2d02c9d80f88 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
@@ -1,27 +1,10 @@
-<ng-container *ngIf="organisationseinheitItems$ | async as organisationseinheitItems">
-  <h1 class="heading-1 pb-4">Organisationseinheiten</h1>
-  <p id="absender-desc" class="p-1">Hinterlegen Sie Name und ID der Organisationseinheiten.</p>
+<h1 class="heading-1 pb-4">Organisationseinheiten</h1>
 
-  <admin-organisationseinheit-form
-    data-test-id="organisationseinheit-form"
-    [organisationseinheitItems]="organisationseinheitItems"
-  ></admin-organisationseinheit-form>
-
-  <admin-secondary-button
-    (clickEmitter)="openDialogForNewGroup()"
-    data-test-id="organisationseinheit-open-dialog-button"
-    label="Neue Organisationseinheit anlegen"
-  >
-  </admin-secondary-button>
-  <admin-spinner
-    data-test-id="organisationseinheit-spinner"
-    *ngIf="deleteInProgress$ | async"
-  ></admin-spinner>
-
-  <admin-organisationseinheit-list
-    [organisationseinheitItems]="organisationseinheitItems"
-    (editOrganisationseinheit)="edit($event)"
-    (deleteOrganisationseinheit)="delete($event)"
-    data-test-id="organisationseinheit-list"
-  ></admin-organisationseinheit-list>
+<ng-container *ngIf="organisationsEinheitListStateResource$ | async as organisationsEinheitListStateResource">
+  <ozgcloud-spinner [stateResource]="organisationsEinheitListStateResource">
+    <admin-organisationseinheit-list
+      [organisationsEinheitResources]="organisationsEinheitListStateResource.resource | toEmbeddedResources: OrganisationsEinheitListLinkRel.LIST"
+      data-test-id="organisations-einheit-list"
+    />
+  </ozgcloud-spinner>
 </ng-container>
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
index 1c5f9731bdfef401363bc423391cf1c7a2ed0529..4df2de4c73425c2807d46e7d01d53d4839eb34af 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
@@ -1,126 +1,88 @@
-import { createStateResource } from '@alfa-client/tech-shared';
-import {
-  Mock,
-  dispatchEventFromFixture,
-  existsAsHtmlElement,
-  getElementFromFixtureByType,
-  mock,
-  notExistsAsHtmlElement,
-} from '@alfa-client/test-utils';
+import { AdminOrganisationsEinheitListResource, OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings';
+import { StateResource, ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, existsAsHtmlElement, getMockComponent, mock } from '@alfa-client/test-utils';
+import { SpinnerComponent } from '@alfa-client/ui';
+import { OrganisationsEinheitListResource } from '@alfa-client/zustaendige-stelle-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { singleCold } from 'libs/tech-shared/test/marbles';
+import { ButtonWithSpinnerComponent } from '@ods/component';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
-import { createOrganisationseinheit } from '../../../../test/user/user';
-import { SecondaryButtonComponent } from '../../shared/secondary-button/secondary-button.component';
-import { SpinnerComponent } from '../../shared/spinner/spinner.component';
-import { Organisationseinheit } from '../../user/user.model';
-import { OrganisationseinheitService } from '../organisationseinheit.service';
-import { OrganisationseinheitContainerComponent } from './organisationseinheit-container.component';
-import { OrganisationseinheitFormComponent } from './organisationseinheit-form/organisationseinheit-form.component';
-import { OrganisationseinheitListComponent } from './organisationseinheit-list/organisationseinheit-list.component';
+import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test';
+import { createAdminOrganisationsEinheitListResource } from '../../../../test/organisations-einheit/organisations-einheit';
+import { OrganisationsEinheitService } from '../organisationseinheit.service';
+import { OrganisationsEinheitListComponent } from './organisationseinheit-list/organisationseinheit-list.component';
 
-describe('OrganisationseinheitContainerComponent', () => {
-  let component: OrganisationseinheitContainerComponent;
-  let fixture: ComponentFixture<OrganisationseinheitContainerComponent>;
+describe('OrganisationsEinheitContainerComponent', () => {
+  let component: OrganisationsEinheitContainerComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitContainerComponent>;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
 
-  const organisationseinheitService: Mock<OrganisationseinheitService> = mock(OrganisationseinheitService);
+  const organisationsEinheitListStateResource: StateResource<AdminOrganisationsEinheitListResource> = createStateResource(
+    createAdminOrganisationsEinheitListResource(),
+  );
 
-  const dialogOpenButtonSelector: string = getDataTestIdOf('organisationseinheit-open-dialog-button');
-  const spinnerSelector: string = getDataTestIdOf('organisationseinheit-spinner');
-
-  const organisationseinheitItems: Organisationseinheit[] = [createOrganisationseinheit()];
-
-  let formComponent: OrganisationseinheitFormComponent;
-  let listComponent: OrganisationseinheitListComponent;
+  const listSelector: string = getDataTestIdOf('organisations-einheit-list');
 
   beforeEach(async () => {
+    organisationsEinheitService = {
+      ...mock(OrganisationsEinheitService),
+      getList: jest.fn().mockReturnValue(of(organisationsEinheitListStateResource)),
+    };
+
     await TestBed.configureTestingModule({
       declarations: [
-        OrganisationseinheitContainerComponent,
-        MockComponent(SecondaryButtonComponent),
-        MockComponent(OrganisationseinheitFormComponent),
-        MockComponent(OrganisationseinheitListComponent),
+        OrganisationsEinheitContainerComponent,
+        MockComponent(OrganisationsEinheitListComponent),
         MockComponent(SpinnerComponent),
+        ToEmbeddedResourcesPipe,
       ],
-      providers: [{ provide: OrganisationseinheitService, useValue: organisationseinheitService }],
+      imports: [ButtonWithSpinnerComponent],
+      providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }],
     }).compileComponents();
 
-    fixture = TestBed.createComponent(OrganisationseinheitContainerComponent);
+    fixture = TestBed.createComponent(OrganisationsEinheitContainerComponent);
     component = fixture.componentInstance;
-
-    organisationseinheitService.get = jest.fn().mockReturnValue(of(createStateResource(organisationseinheitItems)));
     fixture.detectChanges();
-
-    formComponent = getElementFromFixtureByType(fixture, OrganisationseinheitFormComponent);
-    listComponent = getElementFromFixtureByType(fixture, OrganisationseinheitListComponent);
   });
 
   it('should create', () => {
     expect(component).toBeTruthy();
   });
 
-  it('should open form on new organisationseinheit button', () => {
-    formComponent.open = jest.fn();
-
-    dispatchEventFromFixture(fixture, dialogOpenButtonSelector, 'clickEmitter');
-
-    expect(formComponent.open).toHaveBeenCalled();
-  });
-
-  describe('organisationseinheit list', () => {
-    it('should open form for editing on editOrganisationseinheit event', () => {
-      const organisationseinheit: Organisationseinheit = organisationseinheitItems[0];
-      formComponent.openEdit = jest.fn();
-
-      listComponent.editOrganisationseinheit.emit(organisationseinheit);
-
-      expect(formComponent.openEdit).toHaveBeenCalledWith(organisationseinheit);
-    });
-
-    it('should call deleteOrganisationseinheit form on deleteOrganisationseinheit event', () => {
-      const organisationseinheit: Organisationseinheit = organisationseinheitItems[0];
-      component.delete = jest.fn();
-
-      listComponent.deleteOrganisationseinheit.emit(organisationseinheit);
-
-      expect(component.delete).toHaveBeenCalledWith(organisationseinheit);
-    });
-  });
-
-  describe('delete', () => {
-    const organisationseinheit: Organisationseinheit = organisationseinheitItems[0];
-
-    beforeEach(() => {
-      organisationseinheitService.delete = jest.fn().mockReturnValue(singleCold(true));
-    });
-
-    it('should call service method', () => {
-      component.delete(organisationseinheit);
-
-      expect(organisationseinheitService.delete).toHaveBeenCalledWith(organisationseinheit.id);
-    });
-
-    it('should assign delete progress observable', () => {
-      component.delete(organisationseinheit);
-
-      expect(component.deleteInProgress$).toBeObservable(singleCold(true));
+  describe('component', () => {
+    describe('ngOnInit', () => {
+      it('should call organisationsEinheitService getList', (done) => {
+        component.ngOnInit();
+
+        component.organisationsEinheitListStateResource$.subscribe(() => {
+          expect(organisationsEinheitService.getList).toHaveBeenCalled();
+          done();
+        });
+      });
+
+      it('should set organisationsEinheitListStateResource$', (done) => {
+        component.ngOnInit();
+
+        component.organisationsEinheitListStateResource$.subscribe(
+          (listStateResource: StateResource<OrganisationsEinheitListResource>) => {
+            expect(listStateResource).toBe(organisationsEinheitListStateResource);
+            done();
+          },
+        );
+      });
     });
   });
 
-  describe('spinner', () => {
-    it('should not show if delete in not progress', () => {
-      fixture.detectChanges();
-
-      notExistsAsHtmlElement(fixture, spinnerSelector);
-    });
-    it('should show if delete in progress', () => {
-      component.deleteInProgress$ = of(true);
-
-      fixture.detectChanges();
+  describe('template', () => {
+    describe('organisationsEinheiten list', () => {
+      it('should show list', () => {
+        existsAsHtmlElement(fixture, listSelector);
+      });
 
-      existsAsHtmlElement(fixture, spinnerSelector);
+      it('should have organisationsEinheitResources', () => {
+        const listComponent: OrganisationsEinheitListComponent = getMockComponent(fixture, OrganisationsEinheitListComponent);
+        expect(listComponent.organisationsEinheitResources).toBeTruthy();
+      });
     });
   });
 });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
index c8dc13a8eda3ff1f0825c7282020040695df6ecd..eaa53e7accd8d8f1a27c8ed39dd64e47b5c94ce9 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
@@ -1,36 +1,22 @@
 import { StateResource } from '@alfa-client/tech-shared';
-import { Component, OnInit, ViewChild } from '@angular/core';
-import { Observable, of } from 'rxjs';
-import { Organisationseinheit } from '../../user/user.model';
-import { OrganisationseinheitService } from '../organisationseinheit.service';
-import { OrganisationseinheitFormComponent } from './organisationseinheit-form/organisationseinheit-form.component';
+import { Component, OnInit } from '@angular/core';
+import { Observable } from 'rxjs';
+import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel';
+import { AdminOrganisationsEinheitListResource } from '../organisations-einheit.model';
+import { OrganisationsEinheitService } from '../organisationseinheit.service';
 
 @Component({
   selector: 'admin-organisationseinheit-container',
   templateUrl: './organisationseinheit-container.component.html',
 })
-export class OrganisationseinheitContainerComponent implements OnInit {
-  organisationseinheitItems$: Observable<StateResource<Organisationseinheit[]>>;
-  deleteInProgress$: Observable<boolean> = of(false);
+export class OrganisationsEinheitContainerComponent implements OnInit {
+  organisationsEinheitListStateResource$: Observable<StateResource<AdminOrganisationsEinheitListResource>>;
 
-  @ViewChild(OrganisationseinheitFormComponent)
-  private form!: OrganisationseinheitFormComponent;
+  public readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel;
 
-  constructor(private organisationseinheitService: OrganisationseinheitService) {}
+  constructor(private organisationsEinheitService: OrganisationsEinheitService) {}
 
   ngOnInit(): void {
-    this.organisationseinheitItems$ = this.organisationseinheitService.get();
-  }
-
-  public openDialogForNewGroup(): void {
-    this.form.open();
-  }
-
-  public edit(organisationseinheit: Organisationseinheit): void {
-    this.form.openEdit(organisationseinheit);
-  }
-
-  public delete(organisationseinheit: Organisationseinheit): void {
-    this.deleteInProgress$ = this.organisationseinheitService.delete(organisationseinheit.id);
+    this.organisationsEinheitListStateResource$ = this.organisationsEinheitService.getList();
   }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.html
deleted file mode 100644
index 3bd257438d0545a41b7b791b9574b1cf9184b009..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<ng-container *ngIf="submitInProgress$ | async"></ng-container>
-<dialog #OrganisationseinheitDialog data-test-id="organisationseinheit-dialog" class="bg-gray-50">
-  <button
-    (click)="OrganisationseinheitDialog.close()"
-    data-test-id="organisationseinheit-close-button"
-    class="absolute right-3 top-1 text-2xl text-black hover:font-bold active:text-black/80"
-  >
-    &#x2715;
-  </button>
-  <form [formGroup]="formService.form" class="m-5 grid grid-cols-1 gap-5">
-    <h1 class="text-2xl" data-test-id="organisationseinheit-form-header">
-      {{ label }}
-    </h1>
-    <text-field
-      label="Name"
-      data-test-id="organisationseinheit-name"
-      [formControlName]="OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD"
-    ></text-field>
-    <text-field
-      label="OrganisationseinheitID"
-      data-test-id="organisationseinheit-id"
-      [formControlName]="OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD"
-    ></text-field>
-
-    <ods-button-with-spinner
-      data-test-id="organisationseinheit-save-button"
-      class="justify-self-end"
-      (clickEmitter)="submit()"
-      [stateResource]="organisationseinheitItems"
-      text="Speichern"
-    >
-    </ods-button-with-spinner>
-  </form>
-</dialog>
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
deleted file mode 100644
index fd81569ecb52fceecb829096f4e859aeb73fad36..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
+++ /dev/null
@@ -1,281 +0,0 @@
-import { createEmptyStateResource } from '@alfa-client/tech-shared';
-import {
-  dispatchEventFromFixture,
-  getDebugElementFromFixtureByCss,
-  getElementFromFixture,
-  mock,
-  Mock,
-} from '@alfa-client/test-utils';
-import { DebugElement } from '@angular/core';
-import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
-import { AbstractControl, FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
-import { ButtonWithSpinnerComponent } from '@ods/component';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MockComponent, ngMocks } from 'ng-mocks';
-import { of, throwError } from 'rxjs';
-import { createOrganisationseinheit } from '../../../../../test/user/user';
-import { TextFieldComponent } from '../../../shared/text-field/text-field.component';
-import { Organisationseinheit } from '../../../user/user.model';
-import { OrganisationseinheitService } from '../../organisationseinheit.service';
-import { OrganisationseinheitFormComponent } from './organisationseinheit-form.component';
-import { OrganisationseinheitFormService } from './organisationseinheit-form.service';
-
-describe('OrganisationseinheitFormComponent', () => {
-  let component: OrganisationseinheitFormComponent;
-  let fixture: ComponentFixture<OrganisationseinheitFormComponent>;
-  let form: UntypedFormGroup;
-
-  const organisationseinheitService: Mock<OrganisationseinheitService> = mock(OrganisationseinheitService);
-
-  const saveButtonSelector: string = getDataTestIdOf('organisationseinheit-save-button');
-  const closeButtonSelector: string = getDataTestIdOf('organisationseinheit-close-button');
-  const headerSelector: string = getDataTestIdOf('organisationseinheit-form-header');
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [
-        OrganisationseinheitFormComponent,
-        MockComponent(TextFieldComponent),
-        MockComponent(ButtonWithSpinnerComponent),
-      ],
-      imports: [ReactiveFormsModule, FormsModule, ButtonWithSpinnerComponent],
-      providers: [{ provide: OrganisationseinheitService, useValue: organisationseinheitService }],
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(OrganisationseinheitFormComponent);
-    component = fixture.componentInstance;
-    form = fixture.componentInstance.formService.form;
-    fixture.detectChanges();
-
-    component.dialog.showModal = jest.fn();
-    component.dialog.close = jest.fn();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-
-  describe('form element', () => {
-    const fields: string[][] = [
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD, 'Name', 'organisationseinheit-name'],
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD, 'OrganisationseinheitID', 'organisationseinheit-id'],
-    ];
-
-    it.each(fields)('should have label for field "%s" with name "%s"', (fieldName: string, text: string, inputId: string) => {
-      const textFieldElement = getElementFromFixture(fixture, getDataTestIdOf(inputId));
-      expect(textFieldElement.getAttribute('label')).toBe(text);
-    });
-
-    it.each(fields)('should bind form for text-field "%s"', (fieldName, text, dataTestId) => {
-      const fieldValue: string = `some text-field ${text}`;
-      const formControl: AbstractControl = form.get(fieldName);
-
-      const textFieldComponent: DebugElement = getDebugElementFromFixtureByCss(fixture, getDataTestIdOf(dataTestId));
-      ngMocks.change(textFieldComponent, fieldValue);
-      expect(formControl.value).toBe(fieldValue);
-    });
-  });
-
-  describe('save button', () => {
-    let saveButtonComponent: ButtonWithSpinnerComponent;
-
-    beforeEach(() => {
-      saveButtonComponent = getDebugElementFromFixtureByCss(fixture, saveButtonSelector).componentInstance;
-    });
-
-    it('should call submit on click', () => {
-      component.submit = jest.fn();
-
-      dispatchEventFromFixture(fixture, saveButtonSelector, 'clickEmitter');
-
-      expect(component.submit).toHaveBeenCalled();
-    });
-
-    it('should be disabled while stateResource in loading', () => {
-      component.organisationseinheitItems = createEmptyStateResource(true);
-
-      fixture.detectChanges();
-
-      expect(saveButtonComponent.stateResource.loading).toBe(true);
-    });
-
-    it('should be enabled while not in progress', () => {
-      component.organisationseinheitItems = createEmptyStateResource(false);
-
-      fixture.detectChanges();
-
-      expect(saveButtonComponent.stateResource.loading).toBe(false);
-    });
-  });
-
-  describe('submit', () => {
-    beforeEach(() => {
-      component.handleProgressChange = jest.fn();
-    });
-
-    it('should not call complete on submit error', fakeAsync(() => {
-      component.formService.submit = () => throwError(() => new Error('some error'));
-
-      component.submit();
-      component.submitInProgress$.subscribe({
-        error: () => {},
-      });
-      tick();
-
-      expect(component.handleProgressChange).not.toHaveBeenCalled();
-    }));
-
-    it('should call complete on submit event', fakeAsync(() => {
-      component.formService.submit = () => of(false);
-
-      component.submit();
-      component.submitInProgress$.subscribe();
-      tick();
-
-      expect(component.handleProgressChange).toHaveBeenCalled();
-    }));
-
-    it.each([true, false])('should use submit progress "%s"', (progress) => {
-      component.organisationseinheitItems = createEmptyStateResource(progress);
-
-      fixture.detectChanges();
-
-      const saveButtonComponent: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(
-        fixture,
-        saveButtonSelector,
-      ).componentInstance;
-
-      expect(saveButtonComponent.stateResource.loading).toBe(progress);
-    });
-  });
-
-  describe('handle progress change', () => {
-    it('should call complete if no errors with progress false', () => {
-      component.completeIfNoErrors = jest.fn();
-
-      component.handleProgressChange(false);
-
-      expect(component.completeIfNoErrors).toHaveBeenCalled();
-    });
-
-    it('should call complete if no errors with progress true', () => {
-      component.completeIfNoErrors = jest.fn();
-
-      component.handleProgressChange(true);
-
-      expect(component.completeIfNoErrors).not.toHaveBeenCalled();
-    });
-  });
-
-  describe('complete if no errors', () => {
-    beforeEach(() => {
-      component.complete = jest.fn();
-    });
-
-    it('should call not complete with errors', () => {
-      component.formService.isInvalid = jest.fn().mockReturnValue(true);
-
-      component.completeIfNoErrors();
-
-      expect(component.complete).not.toHaveBeenCalled();
-    });
-
-    it('should call complete without errors', () => {
-      component.formService.isInvalid = jest.fn().mockReturnValue(false);
-
-      component.completeIfNoErrors();
-
-      expect(component.complete).toHaveBeenCalled();
-    });
-  });
-
-  describe('complete', () => {
-    beforeEach(() => {
-      component.dialog.close = jest.fn();
-      component.formService.reset = jest.fn();
-    });
-
-    it('should close dialog', () => {
-      component.complete();
-
-      expect(component.dialog.close).toHaveBeenCalled();
-    });
-    it('should reset form', () => {
-      component.complete();
-
-      expect(component.formService.reset).toHaveBeenCalled();
-    });
-  });
-
-  describe('close button', () => {
-    it('should call to close dialog', () => {
-      component.dialog.close = jest.fn();
-
-      dispatchEventFromFixture(fixture, closeButtonSelector, 'click');
-
-      expect(component.dialog.close).toHaveBeenCalled();
-    });
-  });
-
-  describe('open', () => {
-    beforeEach(() => {
-      form.markAsTouched();
-    });
-
-    it('should set create label', () => {
-      component.open();
-
-      expect(component.label).toEqual(OrganisationseinheitFormComponent.CREATE_LABEL);
-    });
-
-    it('should open form', () => {
-      component.open();
-
-      expect(component.dialog.showModal).toHaveBeenCalled();
-    });
-
-    it('should reset form', () => {
-      component.formService.reset = jest.fn();
-
-      component.open();
-
-      expect(component.formService.reset).toHaveBeenCalled();
-    });
-  });
-
-  describe('open edit', () => {
-    const organisationseinheit: Organisationseinheit = createOrganisationseinheit();
-
-    it('should set edit label', () => {
-      component.openEdit(organisationseinheit);
-
-      expect(component.label).toEqual(OrganisationseinheitFormComponent.EDIT_LABEL);
-    });
-
-    it('should open dialog', () => {
-      component.open();
-
-      expect(component.dialog.showModal).toHaveBeenCalled();
-    });
-
-    it('should patch form', () => {
-      component.formService.patch = jest.fn();
-
-      component.openEdit(organisationseinheit);
-
-      expect(component.formService.patch).toHaveBeenCalledWith(organisationseinheit);
-    });
-  });
-
-  describe('header', () => {
-    it('should show label text', () => {
-      const text: string = 'test-text';
-      component.label = text;
-
-      fixture.detectChanges();
-
-      const headerElement: HTMLElement = getElementFromFixture(fixture, headerSelector);
-      expect(headerElement.textContent.trim()).toEqual(text);
-    });
-  });
-});
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts
deleted file mode 100644
index 4f4976209bc7976af17a5ce954585efbcffaff15..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { StateResource, createStateResource } from '@alfa-client/tech-shared';
-import { AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core';
-import { Observable, of, tap } from 'rxjs';
-import { Organisationseinheit } from '../../../user/user.model';
-import { OrganisationseinheitFormService } from './organisationseinheit-form.service';
-
-@Component({
-  selector: 'admin-organisationseinheit-form',
-  templateUrl: './organisationseinheit-form.component.html',
-  providers: [OrganisationseinheitFormService],
-})
-export class OrganisationseinheitFormComponent implements AfterViewInit {
-  @Input() organisationseinheitItems: StateResource<Organisationseinheit[]> = createStateResource([]);
-
-  static CREATE_LABEL: string = 'Neue Organisationseinheit anlegen';
-  static EDIT_LABEL: string = 'Organisationseinheit bearbeiten';
-
-  protected readonly OrganisationseinheitFormService = OrganisationseinheitFormService;
-
-  @ViewChild('OrganisationseinheitDialog') private dialogRef: ElementRef<HTMLDialogElement>;
-  dialog: HTMLDialogElement;
-
-  submitInProgress$: Observable<boolean> = of(false);
-
-  label: string;
-
-  constructor(public formService: OrganisationseinheitFormService) {}
-
-  ngAfterViewInit(): void {
-    this.dialog = this.dialogRef.nativeElement;
-  }
-
-  public submit() {
-    this.submitInProgress$ = this.formService.submit().pipe(tap((progress: boolean) => this.handleProgressChange(progress)));
-  }
-
-  handleProgressChange(progress: boolean): void {
-    if (!progress) {
-      this.completeIfNoErrors();
-    }
-  }
-
-  completeIfNoErrors(): void {
-    if (!this.formService.isInvalid()) {
-      this.complete();
-    }
-  }
-
-  public open(): void {
-    this.label = OrganisationseinheitFormComponent.CREATE_LABEL;
-    this.formService.reset();
-    this.dialog.showModal();
-  }
-
-  public openEdit(organisationseinheit: Organisationseinheit): void {
-    this.label = OrganisationseinheitFormComponent.EDIT_LABEL;
-    this.formService.patch(organisationseinheit);
-    this.dialog.showModal();
-  }
-
-  complete(): void {
-    this.dialog.close();
-    this.formService.reset();
-  }
-}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.service.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.service.ts
deleted file mode 100644
index fb65fa06cc6959e5df3f029f7e2894307d140d43..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.service.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { createStateResource, isNotNil, StateResource } from '@alfa-client/tech-shared';
-import { Injectable, Input } from '@angular/core';
-import { AbstractControl, FormControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
-import { catchError, Observable, of } from 'rxjs';
-import { Organisationseinheit, OrganisationseinheitError, OrganisationseinheitErrorType } from '../../../user/user.model';
-import { getOrganisationseinheitErrorMessage } from '../../../user/user.util';
-import { OrganisationseinheitService } from '../../organisationseinheit.service';
-
-@Injectable()
-export class OrganisationseinheitFormService {
-  @Input() organisationseinheitItems: StateResource<Organisationseinheit[]> = createStateResource([]);
-
-  public static readonly ORGANISATIONSEINHEIT_NAME_FIELD: string = 'name';
-  public static readonly ORGANISATIONSEINHEIT_IDS_FIELD: string = 'organisationseinheit';
-
-  form: UntypedFormGroup;
-
-  source: Organisationseinheit;
-
-  constructor(
-    private formBuilder: UntypedFormBuilder,
-    private organisationsEinheitService: OrganisationseinheitService,
-  ) {
-    this.form = this.formBuilder.group({
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: new FormControl(''),
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: new FormControl(''),
-    });
-  }
-
-  public submit(): Observable<boolean> {
-    if (this.validate()) {
-      return this.callService().pipe(
-        catchError((error: OrganisationseinheitError) => {
-          this.handleError(error);
-          return of(false);
-        }),
-      );
-    } else {
-      return of(false);
-    }
-  }
-
-  callService(): Observable<boolean> {
-    return this.isPatch() ? this.save() : this.create();
-  }
-
-  create(): Observable<boolean> {
-    return this.organisationsEinheitService.create({
-      name: this.getName(),
-      organisationseinheitIds: this.getOrganisationseinheitIds(),
-    });
-  }
-
-  save(): Observable<boolean> {
-    return this.organisationsEinheitService.save({
-      ...this.source,
-      name: this.getName(),
-      organisationseinheitIds: this.getOrganisationseinheitIds(),
-    });
-  }
-
-  validate(): boolean {
-    let valid: boolean = true;
-
-    if (this.getOrganisationseinheitIds().length == 0) {
-      this.setError(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD, {
-        errorType: OrganisationseinheitErrorType.ID_MISSING,
-        detail: '',
-      });
-      valid = false;
-    }
-
-    return valid;
-  }
-
-  private getName(): string {
-    return this.getStringFromPotentiallyEmptyField(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD);
-  }
-
-  private getOrganisationseinheitIds(): string[] {
-    return this.splitOrganisationseinheitIds(
-      this.form.get(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD).value ?? '',
-    );
-  }
-
-  private getStringFromPotentiallyEmptyField(fieldName: string): string {
-    return this.form.get(fieldName).value ?? '';
-  }
-
-  public isPatch(): boolean {
-    return isNotNil(this.source);
-  }
-
-  handleError(error: OrganisationseinheitError): void {
-    if (
-      error.errorType === OrganisationseinheitErrorType.NAME_CONFLICT ||
-      error.errorType === OrganisationseinheitErrorType.NAME_MISSING
-    ) {
-      this.setError(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD, error);
-    }
-  }
-
-  private setError(controlName: string, error: OrganisationseinheitError): void {
-    const control: AbstractControl = this.form.get(controlName);
-    control.setErrors({
-      [error.errorType]: getOrganisationseinheitErrorMessage(error),
-    });
-  }
-
-  splitOrganisationseinheitIds(organisationseinheitIdsString: string): string[] {
-    return organisationseinheitIdsString
-      .split(',')
-      .map((organisationseinheitId) => organisationseinheitId.trim())
-      .filter((organisationseinheitId) => organisationseinheitId.length > 0);
-  }
-
-  public patch(organisationseinheit: Organisationseinheit): void {
-    this.reset();
-    this.source = organisationseinheit;
-    this.form.patchValue({
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: organisationseinheit.name,
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: organisationseinheit.organisationseinheitIds.join(', '),
-    });
-  }
-
-  public reset(): void {
-    this.source = null;
-    this.form.reset();
-    this.form.markAsUntouched();
-  }
-
-  public isInvalid(): boolean {
-    return this.form.invalid;
-  }
-}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts
deleted file mode 100644
index 30b0562d0e2ab18a08381eb1bded287beb3dcd68..0000000000000000000000000000000000000000
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts
+++ /dev/null
@@ -1,344 +0,0 @@
-import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
-import { Type } from '@angular/core';
-import { fakeAsync, tick } from '@angular/core/testing';
-import { AbstractControl, FormBuilder } from '@angular/forms';
-import { hot } from 'jest-marbles';
-import { singleCold, singleHot } from 'libs/tech-shared/test/marbles';
-import { Observable, lastValueFrom, throwError } from 'rxjs';
-import { createOrganisationseinheit, createOrganisationseinheitError } from '../../../../../test/user/user';
-import { Organisationseinheit, OrganisationseinheitError, OrganisationseinheitErrorType } from '../../../user/user.model';
-import { getOrganisationseinheitErrorMessage } from '../../../user/user.util';
-import { OrganisationseinheitService } from '../../organisationseinheit.service';
-import { OrganisationseinheitFormService } from './organisationseinheit-form.service';
-
-describe('OrganisationseinheitFormService', () => {
-  let formService: OrganisationseinheitFormService;
-  let organisationseinheit: Organisationseinheit;
-  const organisationseinheitService: Mock<OrganisationseinheitService> = mockResourceService(OrganisationseinheitService);
-
-  const formBuilder: FormBuilder = new FormBuilder();
-
-  beforeEach(() => {
-    formService = new OrganisationseinheitFormService(formBuilder, useFromMock(organisationseinheitService));
-    organisationseinheit = createOrganisationseinheit();
-    formService.form.setValue({
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: organisationseinheit.name,
-      [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: organisationseinheit.organisationseinheitIds.join(','),
-    });
-  });
-
-  it('should create', () => {
-    expect(formService).toBeTruthy();
-  });
-
-  describe('submit', () => {
-    beforeEach(() => {
-      formService.handleError = jest.fn();
-    });
-
-    describe('with successful validation', () => {
-      beforeEach(() => {
-        formService.validate = jest.fn().mockReturnValue(true);
-      });
-      it('should call handle error with service call observable', fakeAsync(() => {
-        const error: OrganisationseinheitError = createOrganisationseinheitError();
-        formService.callService = jest.fn().mockReturnValue(throwError(() => error));
-
-        formService.submit().subscribe();
-        tick();
-
-        expect(formService.handleError).toHaveBeenCalledWith(error);
-      }));
-
-      it('should emit emit progress as false on error', () => {
-        const error: OrganisationseinheitError = createOrganisationseinheitError();
-        formService.callService = jest.fn().mockReturnValue(hot('a#', { a: true }, error));
-
-        const progressObservable: Observable<boolean> = formService.submit();
-
-        expect(progressObservable).toBeObservable(hot('a(b|)', { a: true, b: false }));
-      });
-
-      it('should return progress observable', () => {
-        formService.callService = jest.fn().mockReturnValue(singleCold(true));
-
-        const progressObservable: Observable<boolean> = formService.submit();
-
-        expect(progressObservable).toBeObservable(singleCold(true));
-      });
-    });
-    describe('with unsuccessful validation', () => {
-      beforeEach(() => {
-        formService.validate = jest.fn().mockReturnValue(false);
-      });
-
-      it('should return progress observable with false', async () => {
-        const progressObservable: Observable<boolean> = formService.submit();
-
-        const progress: boolean = await lastValueFrom(progressObservable);
-
-        expect(progress).toBeFalsy();
-      });
-    });
-  });
-
-  describe('validate', () => {
-    const hasIdMissingError = () =>
-      formService.form.hasError(
-        OrganisationseinheitErrorType.ID_MISSING,
-        OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD,
-      );
-    describe('without organisationeinheitIds', () => {
-      beforeEach(() => {
-        formService.form.setValue({
-          [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: organisationseinheit.name,
-          [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: ',',
-        });
-      });
-
-      it('should set id-missing error', () => {
-        formService.validate();
-
-        expect(hasIdMissingError()).toBeTruthy();
-      });
-      it('should be invalid', () => {
-        const valid: boolean = formService.validate();
-
-        expect(valid).toBeFalsy();
-      });
-    });
-    describe('with organisationeinheitIds', () => {
-      it('should not set error', () => {
-        formService.validate();
-
-        expect(hasIdMissingError()).toBeFalsy();
-      });
-
-      it('should be valid', () => {
-        const valid: boolean = formService.validate();
-
-        expect(valid).toBeTruthy();
-      });
-    });
-  });
-
-  describe('call service', () => {
-    it('should use create if is not patch', () => {
-      formService.isPatch = jest.fn().mockReturnValue(false);
-      formService.create = jest.fn().mockReturnValue(singleHot(true));
-
-      const progressObservable: Observable<boolean> = formService.callService();
-
-      expect(progressObservable).toBeObservable(singleHot(true));
-    });
-
-    it('should use save if is patch', () => {
-      formService.isPatch = jest.fn().mockReturnValue(true);
-      formService.save = jest.fn().mockReturnValue(singleHot(true));
-
-      const progressObservable: Observable<boolean> = formService.callService();
-
-      expect(progressObservable).toBeObservable(singleHot(true));
-    });
-  });
-
-  describe('is patch', () => {
-    it('should return false without source', () => {
-      formService.source = null;
-
-      const isPatch: boolean = formService.isPatch();
-
-      expect(isPatch).toBeFalsy();
-    });
-    it('should return true with source', () => {
-      formService.source = createOrganisationseinheit();
-
-      const isPatch: boolean = formService.isPatch();
-
-      expect(isPatch).toBeTruthy();
-    });
-  });
-
-  describe('create', () => {
-    it('should call create organisationseinheit', () => {
-      formService.create();
-
-      expect(organisationseinheitService.create).toHaveBeenCalledWith({
-        name: organisationseinheit.name,
-        organisationseinheitIds: organisationseinheit.organisationseinheitIds,
-      });
-    });
-
-    it('should call create organisationseinheit with empty form', () => {
-      formService.form.setValue({
-        [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: null,
-        [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: null,
-      });
-      formService.create();
-
-      expect(organisationseinheitService.create).toHaveBeenCalledWith({
-        name: '',
-        organisationseinheitIds: [],
-      });
-    });
-
-    it('should return progress observable', () => {
-      organisationseinheitService.create.mockReturnValue(singleCold(true));
-
-      const progressObservable: Observable<boolean> = formService.create();
-
-      expect(progressObservable).toBeObservable(singleCold(true));
-    });
-  });
-
-  describe('save', () => {
-    it('should call save organisationseinheit', () => {
-      formService.source = createOrganisationseinheit();
-
-      formService.save();
-
-      expect(organisationseinheitService.save).toHaveBeenCalledWith({
-        id: formService.source.id,
-        name: organisationseinheit.name,
-        organisationseinheitIds: organisationseinheit.organisationseinheitIds,
-      });
-    });
-
-    it('should call save organisationseinheit with empty form', () => {
-      formService.source = createOrganisationseinheit();
-      formService.form.setValue({
-        [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD]: null,
-        [OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD]: null,
-      });
-      formService.save();
-
-      expect(organisationseinheitService.save).toHaveBeenCalledWith({
-        id: formService.source.id,
-        name: '',
-        organisationseinheitIds: [],
-      });
-    });
-
-    it('should return progress observable', () => {
-      organisationseinheitService.save.mockReturnValue(singleCold(true));
-
-      const progressObservable: Observable<boolean> = formService.save();
-
-      expect(progressObservable).toBeObservable(singleCold(true));
-    });
-  });
-
-  describe('handle error', () => {
-    it.each([OrganisationseinheitErrorType.NAME_CONFLICT, OrganisationseinheitErrorType.NAME_MISSING])(
-      'should set error on name field on %s',
-      (type: OrganisationseinheitErrorType) => {
-        const error: OrganisationseinheitError = {
-          ...createOrganisationseinheitError(),
-          errorType: type,
-        };
-
-        formService.handleError(error);
-        const errorMessage = formService.form.getError(type, OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD);
-        expect(errorMessage).toEqual(getOrganisationseinheitErrorMessage(error));
-      },
-    );
-
-    it('should not set error on name field for unknown errors', () => {
-      const unknownError: OrganisationseinheitError = createOrganisationseinheitError(undefined);
-
-      formService.handleError(unknownError);
-
-      expect(formService.form.errors).toBeNull();
-    });
-  });
-
-  describe('patch', () => {
-    const organisationseinheit: Organisationseinheit = createOrganisationseinheit();
-
-    it('should reset', () => {
-      formService.reset = jest.fn();
-
-      formService.patch(organisationseinheit);
-
-      expect(formService.reset).toHaveBeenCalled();
-    });
-
-    it('should set source', () => {
-      formService.patch(organisationseinheit);
-
-      expect(formService.source).toBe(organisationseinheit);
-    });
-
-    it('should set name', () => {
-      formService.patch(organisationseinheit);
-
-      const formControl: AbstractControl = formService.form.get(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_NAME_FIELD);
-      expect(formControl.value).toEqual(organisationseinheit.name);
-    });
-
-    it('should set organisationseinheitIds', () => {
-      formService.patch(organisationseinheit);
-
-      const formControl: AbstractControl = formService.form.get(OrganisationseinheitFormService.ORGANISATIONSEINHEIT_IDS_FIELD);
-      expect(formControl.value).toEqual(organisationseinheit.organisationseinheitIds.join(', '));
-    });
-  });
-
-  describe('split organisationseinheitIds by comma', () => {
-    it('should return', () => {
-      const organisationseinheitIds: string[] = formService.splitOrganisationseinheitIds('123, 555 ,  666');
-
-      expect(organisationseinheitIds).toEqual(['123', '555', '666']);
-    });
-
-    it('should filter empty organisationseinheitIds', () => {
-      const organisationseinheitIds: string[] = formService.splitOrganisationseinheitIds(',55,,66,');
-
-      expect(organisationseinheitIds).toEqual(['55', '66']);
-    });
-  });
-
-  describe('reset', () => {
-    it('should set source to null', () => {
-      formService.form.reset = jest.fn();
-
-      formService.reset();
-
-      expect(formService.source).toBeNull();
-    });
-
-    it('should call form reset', () => {
-      formService.form.reset = jest.fn();
-
-      formService.reset();
-
-      expect(formService.form.reset).toHaveBeenCalled();
-    });
-
-    it('should mark as untouched', () => {
-      formService.patch(organisationseinheit);
-
-      expect(formService.form.untouched).toBeTruthy();
-    });
-  });
-
-  describe('is invalid', () => {
-    it('should return true', () => {
-      formService.form.setErrors({ some: 'message' });
-
-      const invalid: boolean = formService.isInvalid();
-
-      expect(invalid).toBeTruthy();
-    });
-
-    it('should return false', () => {
-      const invalid: boolean = formService.isInvalid();
-
-      expect(invalid).toBeFalsy();
-    });
-  });
-});
-
-function mockResourceService<T>(service: Type<T>): Mock<T> {
-  return <Mock<T>>{ ...mock(service), create: jest.fn(), save: jest.fn() };
-}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
index 35f04a2f2e65d9cd6354ccc65e4ebe980c7ad8bb..4d7bb88c347ce810280f41d2202077cccf4e9062 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
@@ -1,54 +1,38 @@
-<ng-container *ngIf="organisationseinheitItems.resource">
-  <table
-    *ngIf="organisationseinheitItems.resource.length; else emptyMessage"
-    aria-label="Keycloak-Gruppen mit OrganisationseinheitIDs"
-    class="mb-2 mt-2 table-fixed"
-    data-test-id="organisationseinheit-table"
+<ods-list *ngIf="organisationsEinheitResources.length > 0" data-test-id="organisations-einheit-list">
+  <ods-list-item
+    *ngFor="let organisationsEinheitResource of organisationsEinheitResources"
+    [path]="organisationsEinheitResource | toResourceUri"
+    [class.text-red-500]="
+      organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG ||
+      organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.ORGANISATIONSEINHEIT_ID_NOT_UNIQUE
+    "
+    data-test-id="organisations-einheit-list-item"
   >
-    <tr class="invisible">
-      <th scope="col">Name</th>
-      <th scope="col">Attribute</th>
-    </tr>
-    <tr *ngFor="let organisationseinheit of organisationseinheitItems.resource" [id]="organisationseinheit.id">
-      <td
-        [attr.data-test-id]="
-          'organisationseinheit-name-' + organisationseinheit.id | convertForDataTest
-        "
-        class="w-96 border border-slate-500 p-2 font-bold"
-      >
-        {{ organisationseinheit.name }}
-      </td>
-      <td
-        [attr.data-test-id]="
-          'organisationseinheit-attr-' + organisationseinheit.id | convertForDataTest
-        "
-        class="w-96 border border-slate-500 p-2"
-      >
-        OrganisationseinheitID: {{ organisationseinheit.organisationseinheitIds.join(', ') }}
-        <admin-more-menu class="float-right">
-          <admin-more-item-button
-            (clickEmitter)="editOrganisationseinheit.emit(organisationseinheit)"
-            more-menu-item
-            [attr.data-test-id]="
-              'organisationseinheit-edit-' + organisationseinheit.id | convertForDataTest
-            "
-            label="Bearbeiten"
-          ></admin-more-item-button>
-          <admin-more-item-button
-            (clickEmitter)="deleteOrganisationseinheit.emit(organisationseinheit)"
-            more-menu-item
-            [attr.data-test-id]="
-              'organisationseinheit-delete-' + organisationseinheit.id | convertForDataTest
-            "
-            label="Löschen"
-          ></admin-more-item-button>
-        </admin-more-menu>
-      </td>
-    </tr>
-  </table>
-  <ng-template #emptyMessage
-    ><span data-test-id="organisationseinheit-empty-message" class="mb-2 mt-2 block italic"
-      >Keine Organisationseinheiten vorhanden.</span
-    >
-  </ng-template>
-</ng-container>
+    <dl class="flex-1 basis-3/4 font-semibold" [class.pl-4]="organisationsEinheitResource.isChild">
+      <dt class="sr-only">Name</dt>
+      <dd data-test-id="organisations-einheit-name">{{ organisationsEinheitResource.name }}</dd>
+    </dl>
+
+    <dl class="flex-1 basis-3/12">
+      <dt class="sr-only">Organisationseinheit-ID</dt>
+      <dd data-test-id="organisations-einheit-id">{{ organisationsEinheitResource.organisationsEinheitId }}</dd>
+    </dl>
+
+    <dl class="flex-1 basis-1/12">
+      <dt class="sr-only">Synchronisationsergebnis</dt>
+      <dd class="mt-1">
+        <ods-exclamation-icon
+          *ngIf="organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG"
+          matTooltip="Organisationseinheit wurde nicht in den PVOG-Daten gefunden."
+          size="small"
+        />
+        <ods-exclamation-icon
+          *ngIf="
+            organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.ORGANISATIONSEINHEIT_ID_NOT_UNIQUE
+          "
+          size="small"
+        />
+      </dd>
+    </dl>
+  </ods-list-item>
+</ods-list>
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
index 53a1347003495d3b5501794c11b04af3f60008c7..1ed84ced8bdd0a6662cb17d9d227c1b3a2a46b31 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
@@ -1,48 +1,49 @@
+import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings';
+import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared';
 import {
-  ConvertForDataTestPipe,
-  StateResource,
-  convertForDataTest,
-  createStateResource,
-} from '@alfa-client/tech-shared';
-import {
-  dispatchEventFromFixture,
   existsAsHtmlElement,
   getElementFromFixture,
+  getElementFromFixtureByType,
+  getElementsFromFixture,
+  mock,
   notExistsAsHtmlElement,
 } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatTooltipModule } from '@angular/material/tooltip';
+import { ActivatedRoute } from '@angular/router';
+import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MockComponent } from 'ng-mocks';
-import { createOrganisationseinheit } from '../../../../../test/user/user';
-import { MoreItemButtonComponent } from '../../../shared/more-menu/more-item-button/more-item-button.component';
-import { MoreMenuComponent } from '../../../shared/more-menu/more-menu.component';
-import { Organisationseinheit } from '../../../user/user.model';
-import { OrganisationseinheitListComponent } from './organisationseinheit-list.component';
-
-describe('OrganisationseinheitListComponent', () => {
-  let component: OrganisationseinheitListComponent;
-  let fixture: ComponentFixture<OrganisationseinheitListComponent>;
-
-  const emptyMessageSelector: string = getDataTestIdOf('organisationseinheit-empty-message');
-  const tableSelector: string = getDataTestIdOf('organisationseinheit-table');
-
-  const organisationseinheitElementSelector = (
-    organisationseinheit: Organisationseinheit,
-    cell: string,
-  ) =>
-    getDataTestIdOf(convertForDataTest(`organisationseinheit-${cell}-${organisationseinheit.id}`));
+import { MockModule } from 'ng-mocks';
+import { createAdminOrganisationsEinheitResource } from '../../../../../test/organisations-einheit/organisations-einheit';
+import { OrganisationsEinheitListComponent } from './organisationseinheit-list.component';
+
+describe('OrganisationsEinheitListComponent', () => {
+  let component: OrganisationsEinheitListComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitListComponent>;
+
+  const listSelector: string = getDataTestIdOf('organisations-einheit-list');
+  const listItemSelector: string = getDataTestIdOf('organisations-einheit-list-item');
+  const organisationsEinheitNameSelector: string = getDataTestIdOf('organisations-einheit-name');
+  const organisationsEinheitIdSelector: string = getDataTestIdOf('organisations-einheit-id');
+
+  const organisationsEinheitResource: AdminOrganisationsEinheitResource = {
+    ...createAdminOrganisationsEinheitResource(),
+    syncResult: AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG,
+  };
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        OrganisationseinheitListComponent,
-        ConvertForDataTestPipe,
-        MockComponent(MoreMenuComponent),
-        MockComponent(MoreItemButtonComponent),
+      providers: [
+        {
+          provide: ActivatedRoute,
+          useValue: mock(ActivatedRoute),
+        },
       ],
+      declarations: [OrganisationsEinheitListComponent, ConvertForDataTestPipe, ToResourceUriPipe, MockModule(MatTooltipModule)],
+      imports: [ListComponent, ListItemComponent, ExclamationIconComponent],
     }).compileComponents();
 
-    fixture = TestBed.createComponent(OrganisationseinheitListComponent);
+    fixture = TestBed.createComponent(OrganisationsEinheitListComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });
@@ -51,104 +52,92 @@ describe('OrganisationseinheitListComponent', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('table rows', () => {
-    describe('without organisationseinheit items', () => {
-      it('should show empty message', () => {
-        existsAsHtmlElement(fixture, emptyMessageSelector);
+  describe('input', () => {
+    describe('organisationsEinheitResources', () => {
+      beforeEach(() => {
+        component.organisationsEinheitResources = [organisationsEinheitResource];
+        fixture.detectChanges();
       });
-      it('should not show table', () => {
-        notExistsAsHtmlElement(fixture, tableSelector);
+
+      it('should set organisationsEinheitResource name', () => {
+        const nameElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitNameSelector);
+
+        expect(nameElement.textContent).toBe(organisationsEinheitResource.name);
       });
-    });
 
-    describe('with organisationseinheit items', () => {
-      const organisationseinheitItems: StateResource<Organisationseinheit[]> = createStateResource([
-        createOrganisationseinheit(),
-        createOrganisationseinheit(),
-      ]);
-      beforeEach(() => {
-        component.organisationseinheitItems = organisationseinheitItems;
-        fixture.detectChanges();
+      it('should set organisationsEinheitResource organisationsEinheitId', () => {
+        const idElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitIdSelector);
+
+        expect(idElement.textContent).toBe(organisationsEinheitResource.organisationsEinheitId);
       });
 
-      it('should show table', () => {
-        existsAsHtmlElement(fixture, tableSelector);
+      it('should set exclamation icon', () => {
+        const iconElement: ExclamationIconComponent = getElementFromFixtureByType(fixture, ExclamationIconComponent);
+
+        expect(iconElement).toBeTruthy();
       });
-      it('should not show empty message', () => {
-        notExistsAsHtmlElement(fixture, emptyMessageSelector);
+    });
+  });
+
+  describe('component', () => {
+    describe('moveChildrenIntoParentLevel', () => {
+      it('should move children one level up', () => {
+        const childList: AdminOrganisationsEinheitResource[] = [
+          createAdminOrganisationsEinheitResource(),
+          createAdminOrganisationsEinheitResource(),
+        ];
+        const item1: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        const item2: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        item2['_embedded'] = { childList };
+        component.organisationsEinheitResources = [item1, item2];
+
+        expect(component.organisationsEinheitResources.length).toBe(4);
       });
 
-      it('should show rows in order', () => {
-        const tableElement: HTMLTableElement = getElementFromFixture(fixture, tableSelector);
-        const rows: HTMLTableRowElement[] = Array.from(tableElement.querySelectorAll('tr[id]'));
-        const rowIds: string[] = rows.map((row) => row.id);
+      it('should set isChild property at moved children', () => {
+        const childList: AdminOrganisationsEinheitResource[] = [
+          createAdminOrganisationsEinheitResource(),
+          createAdminOrganisationsEinheitResource(),
+        ];
+        const item1: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        const item2: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        item2['_embedded'] = { childList };
+        component.organisationsEinheitResources = [item1, item2];
+
+        expect(component.organisationsEinheitResources[2].isChild).toBeTruthy();
+      });
+    });
+  });
 
-        expect(rowIds).toEqual(
-          organisationseinheitItems.resource.map(
-            (organisationseinheit: Organisationseinheit) => organisationseinheit.id,
-          ),
-        );
+  describe('template', () => {
+    describe('organisationsEinheiten list', () => {
+      describe('without organisationsEinheiten', () => {
+        it('should not show list', () => {
+          notExistsAsHtmlElement(fixture, listSelector);
+        });
       });
 
-      it.each(organisationseinheitItems.resource)(
-        'should show name of organisationseinheit %#',
-        (organisationseinheit: Organisationseinheit) => {
-          const nameTableCell = getElementFromFixture(
-            fixture,
-            organisationseinheitElementSelector(organisationseinheit, 'name'),
-          );
+      describe('with organisationsEinheiten', () => {
+        const organisationsEinheiten: AdminOrganisationsEinheitResource[] = [
+          createAdminOrganisationsEinheitResource(),
+          createAdminOrganisationsEinheitResource(),
+        ];
 
-          expect(nameTableCell.textContent.trim()).toBe(organisationseinheit.name);
-        },
-      );
-
-      it.each(organisationseinheitItems.resource)(
-        'should show organisationseinheitId of organisationseinheit %#',
-        (organisationseinheit: Organisationseinheit) => {
-          const attrTableCell = getElementFromFixture(
-            fixture,
-            organisationseinheitElementSelector(organisationseinheit, 'attr'),
-          );
-
-          expect(attrTableCell.textContent.trim()).toBe(
-            `OrganisationseinheitID: ${organisationseinheit.organisationseinheitIds.join(', ')}`,
-          );
-        },
-      );
-
-      it.each(organisationseinheitItems.resource)(
-        'should emit editOrganisationseinheit %# on edit button click ',
-        (organisationseinheit: Organisationseinheit) => {
-          component.editOrganisationseinheit.emit = jest.fn();
-
-          dispatchEventFromFixture(
-            fixture,
-            organisationseinheitElementSelector(organisationseinheit, 'edit'),
-            'clickEmitter',
-          );
-
-          expect(component.editOrganisationseinheit.emit).toHaveBeenCalledWith(
-            organisationseinheit,
-          );
-        },
-      );
-
-      it.each(organisationseinheitItems.resource)(
-        'should emit deleteOrganisationseinheit %# on delete button click ',
-        (organisationseinheit: Organisationseinheit) => {
-          component.deleteOrganisationseinheit.emit = jest.fn();
-
-          dispatchEventFromFixture(
-            fixture,
-            organisationseinheitElementSelector(organisationseinheit, 'delete'),
-            'clickEmitter',
-          );
-
-          expect(component.deleteOrganisationseinheit.emit).toHaveBeenCalledWith(
-            organisationseinheit,
-          );
-        },
-      );
+        beforeEach(() => {
+          component.organisationsEinheitResources = organisationsEinheiten;
+          fixture.detectChanges();
+        });
+
+        it('should show list', () => {
+          existsAsHtmlElement(fixture, listSelector);
+        });
+
+        it('should show rows', () => {
+          const rows = getElementsFromFixture(fixture, listItemSelector);
+
+          expect(rows.length).toEqual(2);
+        });
+      });
     });
   });
 });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
index 39b105cb05759aad5be906fb7b78e7b0b167dcb6..51937dcb6d5bc30bec596b5514879c14fca79dcc 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
@@ -1,18 +1,34 @@
-import { createStateResource, StateResource } from '@alfa-client/tech-shared';
-import { Component, EventEmitter, Input, Output } from '@angular/core';
-import { Organisationseinheit } from '../../../user/user.model';
+import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings';
+import { Component, Input } from '@angular/core';
 
 @Component({
   selector: 'admin-organisationseinheit-list',
   templateUrl: './organisationseinheit-list.component.html',
 })
-export class OrganisationseinheitListComponent {
+export class OrganisationsEinheitListComponent {
+  private _organisationsEinheitResources: AdminOrganisationsEinheitResource[] = [];
+
   @Input()
-  organisationseinheitItems: StateResource<Organisationseinheit[]> = createStateResource([]);
+  public get organisationsEinheitResources(): AdminOrganisationsEinheitResource[] {
+    return this._organisationsEinheitResources;
+  }
+
+  public set organisationsEinheitResources(list: AdminOrganisationsEinheitResource[]) {
+    this.moveChildrenIntoParentLevel(list);
+  }
+
+  public readonly AdminOrganisationsEinheitSyncResult = AdminOrganisationsEinheitSyncResult;
 
-  @Output()
-  editOrganisationseinheit: EventEmitter<Organisationseinheit> = new EventEmitter();
+  moveChildrenIntoParentLevel(list: AdminOrganisationsEinheitResource[]): void {
+    list.forEach((parent: AdminOrganisationsEinheitResource) => {
+      this._organisationsEinheitResources.push(parent);
 
-  @Output()
-  deleteOrganisationseinheit: EventEmitter<Organisationseinheit> = new EventEmitter();
+      if (parent._embedded && Array.isArray(parent._embedded.childList)) {
+        parent._embedded.childList.forEach((child: AdminOrganisationsEinheitResource) => {
+          child.isChild = true;
+          this._organisationsEinheitResources.push(child);
+        });
+      }
+    });
+  }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..097bae6dc28c04048164fcc07896dee8a37ff43f
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html
@@ -0,0 +1,10 @@
+<ng-container *ngIf="organisationsEinheitStateResource$ | async as organisationsEinheitStateResource">
+    <ozgcloud-spinner [stateResource]="organisationsEinheitStateResource">
+        <h1 class="heading-1" data-test-id="organisations-form-container-headline">{{ organisationsEinheitStateResource.resource?.name }}</h1>
+
+        <admin-organisationseinheit-form
+          [organisationsEinheitStateResource]="organisationsEinheitStateResource"
+          data-test-id="organisations-form"
+        />
+    </ozgcloud-spinner>
+</ng-container>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cdb93ce6d6c9ff32ad146a4a7a19946faac2b84d
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts
@@ -0,0 +1,97 @@
+import { AdminOrganisationsEinheitResource, OrganisationsEinheitFormContainerComponent } from '@admin-client/admin-settings';
+import { StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
+import { SpinnerComponent } from '@alfa-client/ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test';
+import { createAdminOrganisationsEinheitResource } from '../../../../test/organisations-einheit/organisations-einheit';
+import { OrganisationsEinheitService } from '../organisationseinheit.service';
+import { OrganisationsEinheitFormComponent } from './organisationseinheit-form/organisationseinheit-form.component';
+
+describe('OrganisationsEinheitFormContainerComponent', () => {
+  let component: OrganisationsEinheitFormContainerComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitFormContainerComponent>;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
+
+  const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+  const organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource> =
+    createStateResource(organisationsEinheitResource);
+
+  const headlineSelector: string = getDataTestIdOf('organisations-form-container-headline');
+  const formSelector: string = getDataTestIdOf('organisations-form');
+
+  beforeEach(async () => {
+    organisationsEinheitService = {
+      ...mock(OrganisationsEinheitService),
+      get: jest.fn().mockReturnValue(of(organisationsEinheitStateResource)),
+    };
+
+    await TestBed.configureTestingModule({
+      declarations: [
+        OrganisationsEinheitFormContainerComponent,
+        MockComponent(OrganisationsEinheitFormComponent),
+        MockComponent(SpinnerComponent),
+      ],
+      providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitFormContainerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('component', () => {
+    describe('ngOnInit', () => {
+      it('should call organisationsEinheitService get', (done) => {
+        component.ngOnInit();
+
+        component.organisationsEinheitStateResource$.subscribe(() => {
+          expect(organisationsEinheitService.get).toHaveBeenCalled();
+          done();
+        });
+      });
+
+      it('should set organisationsEinheitStateResource', (done) => {
+        component.ngOnInit();
+
+        component.organisationsEinheitStateResource$.subscribe(
+          (organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource>) => {
+            expect(organisationsEinheitStateResource).toEqual(organisationsEinheitStateResource);
+            done();
+          },
+        );
+      });
+    });
+  });
+
+  describe('template', () => {
+    describe('headline', () => {
+      it('should show headline', () => {
+        existsAsHtmlElement(fixture, headlineSelector);
+      });
+
+      it('should show organisationsEinheit name', () => {
+        const headlineElement: HTMLElement = getElementFromFixture(fixture, headlineSelector);
+
+        expect(headlineElement.textContent).toBe(organisationsEinheitResource.name);
+      });
+    });
+
+    describe('organisationsEinheit form', () => {
+      it('should show form', () => {
+        existsAsHtmlElement(fixture, formSelector);
+      });
+
+      it('should have organisationsEinheitStateResource', () => {
+        const formComponent: OrganisationsEinheitFormComponent = getMockComponent(fixture, OrganisationsEinheitFormComponent);
+        expect(formComponent.organisationsEinheitStateResource).toBe(organisationsEinheitStateResource);
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d643c74a04163010a590714a2f1d6d00640cf259
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts
@@ -0,0 +1,22 @@
+import { StateResource } from '@alfa-client/tech-shared';
+import { Component, OnInit } from '@angular/core';
+import { Observable } from 'rxjs';
+import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel';
+import { AdminOrganisationsEinheitResource } from '../organisations-einheit.model';
+import { OrganisationsEinheitService } from '../organisationseinheit.service';
+
+@Component({
+  selector: 'admin-organisationseinheit-form-container',
+  templateUrl: './organisationseinheit-form-container.component.html',
+})
+export class OrganisationsEinheitFormContainerComponent implements OnInit {
+  organisationsEinheitStateResource$: Observable<StateResource<AdminOrganisationsEinheitResource>>;
+
+  constructor(private organisationsEinheitService: OrganisationsEinheitService) {}
+
+  ngOnInit(): void {
+    this.organisationsEinheitStateResource$ = this.organisationsEinheitService.get();
+  }
+
+  protected readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel;
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..3b1b1f0673cb2d42afa4b6d5a67a0fa14a3b0f1f
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html
@@ -0,0 +1,18 @@
+<form class="form flex-col" [formGroup]="formService.form">
+    <admin-organisationseinheit-signatur class="mb-6 block" data-test-id="organisations-einheit-signatur-component" />
+
+    <ods-button-with-spinner
+      data-test-id="save-button"
+      text="Speichern"
+      [stateResource]="submitInProgress$ | async"
+      (clickEmitter)="submit()"
+    ></ods-button-with-spinner>
+
+    <span
+      *ngIf="formService.isInvalid()"
+      data-test-id="invalid-empty-message-span"
+      class="m-2 text-red-500"
+    >
+      *Es müssen alle Felder ausgefüllt sein.
+    </span>
+</form>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ad4f7bd11d40c6444ba2fdbbc169cd0b81aff0f4
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
@@ -0,0 +1,120 @@
+import { AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { createEmptyStateResource, createStateResource, ProblemDetail } from '@alfa-client/tech-shared';
+import { existsAsHtmlElement, Mock, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { createInvalidParam, createProblemDetail } from '../../../../../../../tech-shared/test/error';
+import { createAdminOrganisationsEinheitResource } from '../../../../../test/organisations-einheit/organisations-einheit';
+import { TextFieldComponent } from '../../../shared/text-field/text-field.component';
+import { OrganisationsEinheitService } from '../../organisationseinheit.service';
+import { OrganisationsEinheitFormComponent } from './organisationseinheit-form.component';
+import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-signatur/organisationseinheit-signatur.component';
+import { OrganisationsEinheitFormService } from './organisationseinheit.formservice';
+
+describe('OrganisationsEinheitFormComponent', () => {
+  let component: OrganisationsEinheitFormComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitFormComponent>;
+  let formService: OrganisationsEinheitFormService;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
+
+  const signaturComponentSelector: string = getDataTestIdOf('organisations-einheit-signatur-component');
+  const saveButtonSelector: string = getDataTestIdOf('save-button');
+  const invalidMessageSpanSelector: string = getDataTestIdOf('invalid-empty-message-span');
+
+  beforeEach(async () => {
+    organisationsEinheitService = mock(OrganisationsEinheitService);
+
+    await TestBed.configureTestingModule({
+      declarations: [
+        OrganisationsEinheitFormComponent,
+        MockComponent(TextFieldComponent),
+        MockComponent(OrganisationsEinheitSignaturComponent),
+        MockComponent(ButtonWithSpinnerComponent),
+      ],
+      imports: [ReactiveFormsModule, FormsModule],
+      providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitFormComponent);
+    component = fixture.componentInstance;
+    formService = component.formService;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('input', () => {
+    describe('organisationsEinheitStateResource', () => {
+      it('should return resource', () => {
+        component.updateOrganisationsEinheitResource = jest.fn();
+
+        const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        component.organisationsEinheitStateResource = createStateResource(organisationsEinheitResource);
+
+        expect(component.updateOrganisationsEinheitResource).toHaveBeenCalledWith(organisationsEinheitResource);
+      });
+    });
+  });
+
+  describe('component', () => {
+    describe('updateOrganisationsEinheitResource', () => {
+      it('should call formService patch', () => {
+        formService.patch = jest.fn();
+
+        const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+
+        component.updateOrganisationsEinheitResource(organisationsEinheitResource);
+
+        expect(formService.patch).toHaveBeenCalledWith(organisationsEinheitResource.settings);
+      });
+    });
+
+    describe('submit', () => {
+      it('should call formService submit', () => {
+        formService.submit = jest.fn().mockReturnValue(of(createEmptyStateResource()));
+
+        component.submit();
+
+        expect(formService.submit).toHaveBeenCalled();
+      });
+    });
+  });
+
+  describe('template', () => {
+    describe('organisationsEinheit signatur component', () => {
+      it('should show signatur component', () => {
+        existsAsHtmlElement(fixture, signaturComponentSelector);
+      });
+    });
+
+    describe('save button', () => {
+      it('should show save button', () => {
+        existsAsHtmlElement(fixture, saveButtonSelector);
+      });
+    });
+
+    describe('invalid message', () => {
+      it('should show if form is invalid', () => {
+        const problemDetail: ProblemDetail = {
+          ...createProblemDetail(),
+          invalidParams: [{ ...createInvalidParam(), name: 'settingBody.signatur' }],
+        };
+        formService.setErrorByProblemDetail(problemDetail);
+
+        fixture.detectChanges();
+
+        existsAsHtmlElement(fixture, invalidMessageSpanSelector);
+      });
+
+      it('should not show if form valid', () => {
+        notExistsAsHtmlElement(fixture, invalidMessageSpanSelector);
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e23d78e48258b6444fa11e4375ce8259f46742fd
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.ts
@@ -0,0 +1,31 @@
+import { AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { StateResource, createEmptyStateResource, isNotNil } from '@alfa-client/tech-shared';
+import { Component, Input } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { Observable, of } from 'rxjs';
+import { OrganisationsEinheitFormService } from './organisationseinheit.formservice';
+
+@Component({
+  selector: 'admin-organisationseinheit-form',
+  templateUrl: './organisationseinheit-form.component.html',
+  providers: [OrganisationsEinheitFormService],
+})
+export class OrganisationsEinheitFormComponent {
+  submitInProgress$: Observable<StateResource<Resource>> = of(createEmptyStateResource<Resource>());
+
+  @Input() set organisationsEinheitStateResource(stateResource: StateResource<AdminOrganisationsEinheitResource>) {
+    this.updateOrganisationsEinheitResource(stateResource.resource);
+  }
+
+  updateOrganisationsEinheitResource(organisationsEinheitResource: AdminOrganisationsEinheitResource): void {
+    if (isNotNil(organisationsEinheitResource)) {
+      this.formService.patch(organisationsEinheitResource.settings);
+    }
+  }
+
+  constructor(public formService: OrganisationsEinheitFormService) {}
+
+  public submit(): void {
+    this.submitInProgress$ = this.formService.submit();
+  }
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..08db87e61bb3198d993070fdb54ab8ae5a68eb0c
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.html
@@ -0,0 +1,16 @@
+<form [formGroup]="formService.form" class="max-w-[960px]">
+    <h2 class="heading-2">Signatur</h2>
+    <p id="signatur-desc">
+      Diese Signatur gilt für die ausgewählte Organisationseinheit und wird bei allen Nachrichten an den Antragsteller angezeigt.
+    </p>
+    <ods-textarea-editor
+      [formControlName]="formServiceClass.ORGANISATIONSEINHEIT_SIGNATUR_FIELD"
+      [isResizable]="false"
+      [showLabel]="false"
+      data-test-id="signatur-text"
+      label="signature"
+      rows="6"
+      class="w-full"
+      aria-describedby="signatur-desc"
+    />
+</form>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9f47fc9511c867a415ced0e677eb486c083a970c
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts
@@ -0,0 +1,55 @@
+import { NavigationSharedModule } from '@alfa-client/navigation-shared';
+import { getElementFromFixture, mock, useFromMock } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
+import { EffectsModule } from '@ngrx/effects';
+import { StoreModule } from '@ngrx/store';
+import { TextareaEditorComponent } from '@ods/component';
+import { MockComponent } from 'ng-mocks';
+import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
+import { OrganisationsEinheitService } from '../../../organisationseinheit.service';
+import { OrganisationsEinheitFormService } from '../organisationseinheit.formservice';
+import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-signatur.component';
+
+describe('OrganisationsEinheitSignaturComponent', () => {
+  let component: OrganisationsEinheitSignaturComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitSignaturComponent>;
+  let formService: OrganisationsEinheitFormService;
+
+  const signaturTextareaSelector: string = getDataTestIdOf('signatur-text');
+
+  beforeEach(async () => {
+    formService = new OrganisationsEinheitFormService(new FormBuilder(), useFromMock(mock(OrganisationsEinheitService)));
+
+    await TestBed.configureTestingModule({
+      imports: [ReactiveFormsModule, NavigationSharedModule, StoreModule.forRoot({}), EffectsModule.forRoot([])],
+      declarations: [OrganisationsEinheitSignaturComponent, MockComponent(TextareaEditorComponent)],
+      providers: [
+        {
+          provide: OrganisationsEinheitFormService,
+          useValue: formService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitSignaturComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('template', () => {
+    describe('ods-textarea-editor', () => {
+      describe('input', () => {
+        it('should set signatur field', () => {
+          const textAreaEditor: HTMLElement = getElementFromFixture(fixture, signaturTextareaSelector);
+
+          expect(textAreaEditor.getAttribute('rows')).toEqual('6');
+        });
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ad670e03d75622a851b7de1bfe7b9ceb18cefce7
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts
@@ -0,0 +1,12 @@
+import { Component } from '@angular/core';
+import { OrganisationsEinheitFormService } from '../organisationseinheit.formservice';
+
+@Component({
+  selector: 'admin-organisationseinheit-signatur',
+  templateUrl: './organisationseinheit-signatur.component.html',
+})
+export class OrganisationsEinheitSignaturComponent {
+  public readonly formServiceClass = OrganisationsEinheitFormService;
+
+  constructor(public formService: OrganisationsEinheitFormService) {}
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..249af7021abcd360680e7c7318c2123763089d20
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.spec.ts
@@ -0,0 +1,42 @@
+import { AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
+import { FormBuilder } from '@angular/forms';
+import { of } from 'rxjs';
+import { createAdminOrganisationsEinheitResource } from '../../../../../test/organisations-einheit/organisations-einheit';
+import { OrganisationsEinheitService } from '../../organisationseinheit.service';
+import { OrganisationsEinheitFormService } from './organisationseinheit.formservice';
+
+describe('OrganisationsEinheitFormService', () => {
+  let service: OrganisationsEinheitFormService;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
+  const formBuilder: FormBuilder = new FormBuilder();
+
+  beforeEach(() => {
+    organisationsEinheitService = mock(OrganisationsEinheitService);
+    service = new OrganisationsEinheitFormService(formBuilder, useFromMock(organisationsEinheitService));
+  });
+
+  it('should create', () => {
+    expect(service).toBeTruthy();
+  });
+
+  describe('submit', () => {
+    const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+
+    beforeEach(() => {
+      const stateResource: StateResource<AdminOrganisationsEinheitResource> = createStateResource(organisationsEinheitResource);
+      organisationsEinheitService.patch.mockReturnValue(of(stateResource));
+      organisationsEinheitService.get.mockReturnValue(of(stateResource));
+      service.form.setValue({
+        [OrganisationsEinheitFormService.ORGANISATIONSEINHEIT_SIGNATUR_FIELD]: organisationsEinheitResource.settings.signatur,
+      });
+    });
+
+    it('should call organisationsEinheitService patch', () => {
+      service.submit();
+
+      expect(organisationsEinheitService.patch).toHaveBeenCalledWith(organisationsEinheitResource.settings);
+    });
+  });
+});
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9cb9131e6259cf12b596db1438224396abd952ae
--- /dev/null
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts
@@ -0,0 +1,32 @@
+import { AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { AbstractFormService, EMPTY_STRING, StateResource } from '@alfa-client/tech-shared';
+import { Injectable } from '@angular/core';
+import { FormControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
+import { Observable } from 'rxjs';
+import { OrganisationsEinheitService } from '../../organisationseinheit.service';
+
+@Injectable()
+export class OrganisationsEinheitFormService extends AbstractFormService {
+  public static readonly ORGANISATIONSEINHEIT_SIGNATUR_FIELD: string = 'signatur';
+
+  constructor(
+    formBuilder: UntypedFormBuilder,
+    private organisationsEinheitService: OrganisationsEinheitService,
+  ) {
+    super(formBuilder);
+  }
+
+  protected initForm(): UntypedFormGroup {
+    return this.formBuilder.group({
+      [OrganisationsEinheitFormService.ORGANISATIONSEINHEIT_SIGNATUR_FIELD]: new FormControl(EMPTY_STRING),
+    });
+  }
+
+  protected doSubmit(): Observable<StateResource<AdminOrganisationsEinheitResource>> {
+    return this.organisationsEinheitService.patch(this.getFormValue());
+  }
+
+  protected getPathPrefix(): string {
+    return 'settingBody';
+  }
+}
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
index 4e16cd2a3421cac02ddcd38e472322fc5942e808..ad3de85839043a279b9692d3ece0593d83602bb3 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
@@ -1,48 +1,155 @@
-import { mock, Mock, useFromMock } from '@alfa-client/test-utils';
-import { createOrganisationseinheit } from '../../../test/user/user';
-import { UserRepository } from '../user/user.repository.service';
-import { OrganisationseinheitService } from './organisationseinheit.service';
+import { AdminOrganisationsEinheitListResource, AdminOrganisationsEinheitResource } from '@admin-client/admin-settings';
+import { NavigationService } from '@alfa-client/navigation-shared';
+import { StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
+import { SnackBarService } from '@alfa-client/ui';
+import { singleColdCompleted } from 'libs/tech-shared/test/marbles';
+import { Observable, of } from 'rxjs';
+import {
+  createAdminOrganisationsEinheitListResource,
+  createAdminOrganisationsEinheitResource,
+} from '../../../test/organisations-einheit/organisations-einheit';
+import { OrganisationsEinheitListResourceService } from './organisations-einheit-list-resource.service';
+import { OrganisationsEinheitResourceService } from './organisations-einheit-resource.service';
+import { OrganisationsEinheitService } from './organisationseinheit.service';
 
-describe('OrganisationseinheitService', () => {
-  let service: OrganisationseinheitService;
-  let repository: Mock<UserRepository>;
+jest.mock('./organisations-einheit-list-resource.service');
+jest.mock('./organisations-einheit-resource.service');
+jest.mock('../../../../../navigation-shared/src/lib/navigation.service');
+jest.mock('../../../../../ui/src/lib/snackbar/snackbar.service');
 
-  const organisationseinheit = createOrganisationseinheit();
+describe('OrganisationsEinheitService', () => {
+  let service: OrganisationsEinheitService;
+  let listResourceService: Mock<OrganisationsEinheitListResourceService>;
+  let resourceService: Mock<OrganisationsEinheitResourceService>;
+  let navigationService: Mock<NavigationService>;
+  let snackBarService: Mock<SnackBarService>;
 
   beforeEach(() => {
-    repository = mock(UserRepository);
-    service = new OrganisationseinheitService(useFromMock(repository));
+    listResourceService = mock(OrganisationsEinheitListResourceService);
+    resourceService = mock(OrganisationsEinheitResourceService);
+
+    navigationService = mock(NavigationService);
+    navigationService.urlChanged.mockReturnValue(of({}));
+
+    snackBarService = mock(SnackBarService);
+    service = new OrganisationsEinheitService(
+      useFromMock(listResourceService),
+      useFromMock(resourceService),
+      useFromMock(navigationService),
+      useFromMock(snackBarService),
+    );
   });
 
-  describe('getItemsFromKeycloak', () => {
-    it('should call findOrganisationseinheitItems from userRepository', () => {
-      service.getItemsFromKeycloak();
+  describe('onNavigation', () => {
+    it('should not call listResourceService select', () => {
+      service.onNavigation({});
+
+      expect(listResourceService.select).not.toHaveBeenCalled();
+    });
+
+    it('should call listResourceService select', () => {
+      service.onNavigation({ [OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL]: 'some-uri' });
 
-      expect(repository.findOrganisationseinheitItems).toHaveBeenCalled();
+      expect(listResourceService.select).toHaveBeenCalled();
+    });
+
+    it('should call getOrganisationsEinheitUrl', () => {
+      service.getOrganisationsEinheitUrl = jest.fn();
+
+      service.onNavigation({ [OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL]: 'some-uri' });
+
+      expect(service.getOrganisationsEinheitUrl).toHaveBeenCalled();
     });
   });
 
-  describe('saveInKeycloak', () => {
-    it('should call saveOrganisationseinheit from userRepository', () => {
-      service.saveInKeycloak(organisationseinheit);
+  describe('getOrganisationsEinheitUrl', () => {
+    it('should call navigationService getDecodedParam', () => {
+      service.getOrganisationsEinheitUrl();
 
-      expect(repository.saveOrganisationseinheit).toHaveBeenCalledWith(organisationseinheit);
+      expect(navigationService.getDecodedParam).toHaveBeenCalled();
+    });
+
+    it('should return uri', () => {
+      navigationService.getDecodedParam.mockReturnValue('some-uri');
+
+      expect(service.getOrganisationsEinheitUrl()).toBe('some-uri');
     });
   });
 
-  describe('createInKeycloak', () => {
-    it('should call createOrganisationseinheit from userRepository', () => {
-      service.createInKeycloak(organisationseinheit);
+  describe('getList', () => {
+    const organisationsEinheitListResource: AdminOrganisationsEinheitListResource = createAdminOrganisationsEinheitListResource();
+    const organisationsEinheitStateListResource: StateResource<AdminOrganisationsEinheitListResource> =
+      createStateResource(organisationsEinheitListResource);
+
+    beforeEach(() => {
+      listResourceService.getList.mockReturnValue(of(organisationsEinheitStateListResource));
+    });
+
+    it('should call listResourceService', () => {
+      service.getList();
 
-      expect(repository.createOrganisationseinheit).toHaveBeenCalledWith(organisationseinheit);
+      expect(listResourceService.getList).toHaveBeenCalled();
+    });
+
+    it('should return value', () => {
+      const list$: Observable<StateResource<AdminOrganisationsEinheitListResource>> = service.getList();
+
+      expect(list$).toBeObservable(singleColdCompleted(organisationsEinheitStateListResource));
     });
   });
 
-  describe('deleteInKeycloak', () => {
-    it('should call deleteOrganisationseinheit from userRepository', () => {
-      service.deleteInKeycloak(organisationseinheit.id);
+  describe('get', () => {
+    const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+    const organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource> =
+      createStateResource(organisationsEinheitResource);
+
+    beforeEach(() => {
+      resourceService.get.mockReturnValue(of(organisationsEinheitStateResource));
+    });
+
+    it('should call resourceService', () => {
+      service.get();
+
+      expect(resourceService.get).toHaveBeenCalled();
+    });
+
+    it('should return value', () => {
+      const resource$: Observable<StateResource<AdminOrganisationsEinheitResource>> = service.get();
+
+      expect(resource$).toBeObservable(singleColdCompleted(organisationsEinheitStateResource));
+    });
+  });
+
+  describe('patch', () => {
+    const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+    const organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource> =
+      createStateResource(organisationsEinheitResource);
+
+    beforeEach(() => {
+      resourceService.patch.mockReturnValue(of(organisationsEinheitStateResource));
+    });
+
+    it('should call resourceService', () => {
+      service.patch(organisationsEinheitResource.settings).subscribe();
+
+      expect(resourceService.patch).toHaveBeenCalled();
+    });
+
+    it('should call snackBarService showInfo', () => {
+      service.patch(organisationsEinheitResource.settings).subscribe();
+
+      expect(snackBarService.showInfo).toHaveBeenCalled();
+    });
+
+    it('should return value', () => {
+      const resource$: Observable<StateResource<AdminOrganisationsEinheitResource>> = service.patch(
+        organisationsEinheitResource.settings,
+      );
 
-      expect(repository.deleteOrganisationseinheit).toHaveBeenCalledWith(organisationseinheit.id);
+      resource$.subscribe((result: StateResource<AdminOrganisationsEinheitResource>) => {
+        expect(result).toEqual(organisationsEinheitStateResource);
+      });
     });
   });
 });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.ts
index d07d400cdb35c40955a164a99bcd66faf933b911..d20e30cc1f824e8f912a624540ff8047b3771041 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.ts
@@ -1,30 +1,81 @@
+import {
+  AdminOrganisationsEinheitListResource,
+  AdminOrganisationsEinheitResource,
+  AdminOrganisationsEinheitSettings,
+} from '@admin-client/admin-settings';
+import { NavigationService } from '@alfa-client/navigation-shared';
+import { StateResource, createEmptyStateResource, isNotUndefined } from '@alfa-client/tech-shared';
+import { SnackBarService } from '@alfa-client/ui';
 import { Injectable } from '@angular/core';
-import { Observable } from 'rxjs';
-import { KeycloakResourceService } from '../user/keycloak.resource.service';
-import { Organisationseinheit } from '../user/user.model';
-import { UserRepository } from '../user/user.repository.service';
+import { Params } from '@angular/router';
+import { ResourceUri } from '@ngxp/rest';
+import { isNil } from 'lodash-es';
+import { Observable, Subscription, startWith, tap } from 'rxjs';
+import { OrganisationsEinheitListResourceService } from './organisations-einheit-list-resource.service';
+import { OrganisationsEinheitResourceService } from './organisations-einheit-resource.service';
 
 @Injectable({
   providedIn: 'root',
 })
-export class OrganisationseinheitService extends KeycloakResourceService<Organisationseinheit> {
-  constructor(private userRepository: UserRepository) {
-    super();
+export class OrganisationsEinheitService {
+  static ORGANISATIONS_EINHEIT_URL: string = 'organisationsEinheitUrl';
+
+  private subscription: Subscription;
+
+  constructor(
+    private listResourceService: OrganisationsEinheitListResourceService,
+    private resourceService: OrganisationsEinheitResourceService,
+    private navigationService: NavigationService,
+    private snackBarService: SnackBarService,
+  ) {
+    this.listenToNavigation();
+  }
+
+  private listenToNavigation(): void {
+    this.unsubscribe();
+    this.subscription = this.navigationService.urlChanged().subscribe((params: Params) => this.onNavigation(params));
+  }
+
+  private unsubscribe(): void {
+    if (!isNil(this.subscription)) {
+      this.subscription.unsubscribe();
+    }
+  }
+
+  onNavigation(params: Params): void {
+    if (this.navigateToOrganisationsEinheitDetailPage(params)) {
+      this.listResourceService.select(this.getOrganisationsEinheitUrl());
+    }
+  }
+
+  private navigateToOrganisationsEinheitDetailPage(params: Params): boolean {
+    return isNotUndefined(params[OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL]);
+  }
+
+  getOrganisationsEinheitUrl(): ResourceUri {
+    return this.navigationService.getDecodedParam(OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL);
   }
 
-  getItemsFromKeycloak(): Observable<Organisationseinheit[]> {
-    return this.userRepository.findOrganisationseinheitItems();
+  public getList(): Observable<StateResource<AdminOrganisationsEinheitListResource>> {
+    return this.listResourceService.getList();
   }
 
-  saveInKeycloak(organisationseinheit: Organisationseinheit): Observable<void> {
-    return this.userRepository.saveOrganisationseinheit(organisationseinheit);
+  public get(): Observable<StateResource<AdminOrganisationsEinheitResource>> {
+    return this.resourceService.get();
   }
 
-  createInKeycloak(organisationseinheit: { name: string; organisationseinheitIds: string[] }): Observable<Organisationseinheit> {
-    return this.userRepository.createOrganisationseinheit(organisationseinheit);
+  public patch(
+    organisationsEinheitSettings: AdminOrganisationsEinheitSettings,
+  ): Observable<StateResource<AdminOrganisationsEinheitResource>> {
+    return this.resourceService.patch(organisationsEinheitSettings).pipe(
+      tap((stateResource: StateResource<AdminOrganisationsEinheitResource>) => this.showInfoAfterPatch(stateResource)),
+      startWith(createEmptyStateResource<AdminOrganisationsEinheitResource>(true)),
+    );
   }
 
-  deleteInKeycloak(id: string): Observable<void> {
-    return this.userRepository.deleteOrganisationseinheit(id);
+  private showInfoAfterPatch(stateResource: StateResource<AdminOrganisationsEinheitResource>) {
+    if (!stateResource.loading) {
+      this.snackBarService.showInfo('Die Signatur wurde erfolgreich gespeichert.');
+    }
   }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
index a5aace656e46f148670b719e35a52d23df73ec4b..23447820822d57bfca778a3b4f870bb4e1780a52 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
@@ -45,7 +45,7 @@
   ></ods-button-with-spinner>
 
   <span
-    *ngIf="formService.invalidEmpty"
+    *ngIf="formService.isInvalid()"
     data-test-id="invalid-empty-message-span"
     class="m-2 text-red-500"
   >
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
index 3470d76a49844b39ea90737b2474d95c76ff5a2c..8c8096d7df647918130510a8ac0fad54499064f7 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
@@ -1,15 +1,5 @@
-import {
-  createEmptyStateResource,
-  createStateResource,
-  ProblemDetail,
-} from '@alfa-client/tech-shared';
-import {
-  dispatchEventFromFixture,
-  existsAsHtmlElement,
-  Mock,
-  mock,
-  notExistsAsHtmlElement,
-} from '@alfa-client/test-utils';
+import { createEmptyStateResource, createStateResource, ProblemDetail } from '@alfa-client/tech-shared';
+import { dispatchEventFromFixture, existsAsHtmlElement, Mock, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { ButtonWithSpinnerComponent } from '@ods/component';
@@ -67,15 +57,12 @@ describe('PostfachFormComponent', () => {
 
   describe('set postfachStateResource', () => {
     it('should return resource', () => {
-      const updatePostfachResourceFn: jest.SpyInstance = jest.spyOn(
-        component,
-        'updatePostfachResource',
-      );
-      const postfachResource: PostfachResource = createPostfachResource();
+      component.updatePostfachResource = jest.fn();
 
+      const postfachResource: PostfachResource = createPostfachResource();
       component.postfachStateResource = createStateResource(postfachResource);
 
-      expect(updatePostfachResourceFn).toHaveBeenCalledWith(postfachResource);
+      expect(component.updatePostfachResource).toHaveBeenCalledWith(postfachResource);
     });
   });
 
@@ -152,7 +139,7 @@ describe('PostfachFormComponent', () => {
   });
 
   describe('invalid message', () => {
-    it('should show if form invalidEmpty', () => {
+    it('should show if form is invalid', () => {
       formService.setErrorByProblemDetail(createProblemDetailForAbsenderName());
 
       fixture.detectChanges();
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
index ed81ff5fd52cfc3ef92312fd3f2d0cbbcb8d4d89..dd9bcc7a3732f8562aa596faa52b1b4b70407f26 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
@@ -46,17 +46,10 @@ export class PostfachFormService extends AbstractFormService {
   }
 
   private shouldSkipAbsender(postfach: Postfach): boolean {
-    return (
-      isNil(this.source?.absender) &&
-      Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0)
-    );
+    return isNil(this.source?.absender) && Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0);
   }
 
   protected getPathPrefix(): string {
     return 'settingBody';
   }
-
-  public get invalidEmpty(): boolean {
-    return this.form.invalid;
-  }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.model.ts b/alfa-client/libs/admin/settings/src/lib/user/user.model.ts
index 742ca490a50a84a8f9026204e573bcf729bf3c30..43f4181229bb301da6124cde831ab9f7346c5ea9 100644
--- a/alfa-client/libs/admin/settings/src/lib/user/user.model.ts
+++ b/alfa-client/libs/admin/settings/src/lib/user/user.model.ts
@@ -1,20 +1,3 @@
-export interface Organisationseinheit {
-  id: string;
-  name: string;
-  organisationseinheitIds: string[];
-}
-
-export enum OrganisationseinheitErrorType {
-  NAME_CONFLICT = 'name-conflict',
-  NAME_MISSING = 'name-missing',
-  ID_MISSING = 'id-missing',
-}
-
-export interface OrganisationseinheitError {
-  errorType: OrganisationseinheitErrorType;
-  detail: string;
-}
-
 export interface User {
   id: string;
   username: string;
diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts b/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts
index 5415be30358d129923f64c6f837885a5d78e2fd4..f7da378621af67111a8ce3640a4a86e566cc1f14 100644
--- a/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts
+++ b/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts
@@ -1,5 +1,5 @@
 import { Injectable } from '@angular/core';
-import KcAdminClient, { NetworkError } from '@keycloak/keycloak-admin-client';
+import KcAdminClient from '@keycloak/keycloak-admin-client';
 import { TokenProvider } from '@keycloak/keycloak-admin-client/lib/client';
 import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation';
 import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation';
@@ -7,9 +7,8 @@ import RoleRepresentation from '@keycloak/keycloak-admin-client/lib/defs/roleRep
 import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation';
 import { OAuthService } from 'angular-oauth2-oidc';
 import { isNil } from 'lodash-es';
-import { Observable, OperatorFunction, catchError, forkJoin, from, map, mergeMap, throwError } from 'rxjs';
-import { Organisationseinheit, OrganisationseinheitError, User } from './user.model';
-import { KEYCLOAK_CREATE_GROUPS_ERROR_STATUS } from './user.util';
+import { Observable, forkJoin, from, map, mergeMap } from 'rxjs';
+import { User } from './user.model';
 
 @Injectable({
   providedIn: 'root',
@@ -32,69 +31,6 @@ export class UserRepository {
     };
   }
 
-  public deleteOrganisationseinheit(id: string): Observable<void> {
-    return from(this.kcAdminClient.groups.del({ id }));
-  }
-
-  public findOrganisationseinheitItems(): Observable<Organisationseinheit[]> {
-    return from(this.kcAdminClient.groups.find({ briefRepresentation: false })).pipe(
-      map((reps: GroupRepresentation[]) =>
-        reps.map((rep: GroupRepresentation) => this.mapGroupRepresentationToOrganisationseinheit(rep)),
-      ),
-    );
-  }
-
-  mapGroupRepresentationToOrganisationseinheit(group: GroupRepresentation): Organisationseinheit {
-    return {
-      id: group.id,
-      name: group.name,
-      organisationseinheitIds: group.attributes?.organisationseinheitId ?? [],
-    };
-  }
-
-  public saveOrganisationseinheit(organisationseinheit: Organisationseinheit): Observable<void> {
-    return from(
-      this.kcAdminClient.groups.update(
-        { id: organisationseinheit.id },
-        {
-          name: organisationseinheit.name,
-          attributes: { organisationseinheitId: organisationseinheit.organisationseinheitIds },
-        },
-      ),
-    ).pipe(this.rethrowMappedGroupsError());
-  }
-
-  public createOrganisationseinheit(organisationseinheit: {
-    name: string;
-    organisationseinheitIds: string[];
-  }): Observable<Organisationseinheit> {
-    return from(
-      this.kcAdminClient.groups.create({
-        name: organisationseinheit.name,
-        attributes: { organisationseinheitId: organisationseinheit.organisationseinheitIds },
-      }),
-    ).pipe(
-      map(
-        ({ id }): Organisationseinheit => ({
-          ...organisationseinheit,
-          id,
-        }),
-      ),
-      this.rethrowMappedGroupsError(),
-    );
-  }
-
-  rethrowMappedGroupsError<T>(): OperatorFunction<T, T> {
-    return catchError((err) => throwError(() => this.mapCreateGroupsNetworkError(err)));
-  }
-
-  mapCreateGroupsNetworkError(error: NetworkError): OrganisationseinheitError {
-    return {
-      errorType: KEYCLOAK_CREATE_GROUPS_ERROR_STATUS[error.response.status],
-      detail: error.responseData['errorMessage'] ?? '',
-    };
-  }
-
   public getUsers(): Observable<User[]> {
     return from(this.kcAdminClient.users.find()).pipe(
       map((userReps: UserRepresentation[]) => userReps.map((userReps) => this.mapToUser(userReps))),
diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts b/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts
index 126f5e4be748e33244669b22c3380b995ff48158..a854ab7a46bb79f8bab8a22c3417e88f7321e3d2 100644
--- a/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts
@@ -1,39 +1,23 @@
 import { Mock, mock } from '@alfa-client/test-utils';
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
-import KcAdminClient, { NetworkError } from '@keycloak/keycloak-admin-client';
+import KcAdminClient from '@keycloak/keycloak-admin-client';
 import { TokenProvider } from '@keycloak/keycloak-admin-client/lib/client';
 import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation';
 import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation';
-import { Groups } from '@keycloak/keycloak-admin-client/lib/resources/groups';
 import { OAuthService } from 'angular-oauth2-oidc';
-import { Observable, OperatorFunction, catchError, firstValueFrom, of, throwError } from 'rxjs';
-import {
-  createGroupRepresentation,
-  createNetworkError,
-  createOrganisationseinheit,
-  createOrganisationseinheitError,
-  createUser,
-} from '../../../test/user/user';
-import { Organisationseinheit, OrganisationseinheitError, OrganisationseinheitErrorType, User } from './user.model';
+import { createUser } from '../../../test/user/user';
+import { User } from './user.model';
 import { UserRepository } from './user.repository.service';
 
 describe('UserRepository', () => {
   const accessToken: string = faker.string.alphanumeric(40);
-  const error: OrganisationseinheitError = createOrganisationseinheitError();
-  const networkError: NetworkError = createNetworkError(400, '');
 
   let repository: UserRepository;
 
   let kcAdminClient: Mock<KcAdminClient>;
   let oAuthService: Mock<OAuthService>;
 
-  const mockGroupsFunc = (groupsKey: keyof Groups, implementation: jest.Mock) => {
-    kcAdminClient.groups = <any>{
-      [groupsKey]: implementation,
-    };
-  };
-
   beforeEach(() => {
     kcAdminClient = mock(KcAdminClient);
     oAuthService = mock(OAuthService);
@@ -59,257 +43,6 @@ describe('UserRepository', () => {
     });
   });
 
-  describe('map organisationseinheit representation', () => {
-    const expectedOrganisationseinheit: Organisationseinheit = createOrganisationseinheit();
-
-    it('should map field "id"', () => {
-      const organisationseinheit: Organisationseinheit = repository.mapGroupRepresentationToOrganisationseinheit({
-        id: expectedOrganisationseinheit.id,
-      });
-
-      expect(organisationseinheit.id).toEqual(expectedOrganisationseinheit.id);
-    });
-
-    it('should map field "name"', () => {
-      const organisationseinheit: Organisationseinheit = repository.mapGroupRepresentationToOrganisationseinheit({
-        name: expectedOrganisationseinheit.name,
-      });
-
-      expect(organisationseinheit.name).toEqual(expectedOrganisationseinheit.name);
-    });
-
-    it('should map field "organisationseinheitIds"', () => {
-      const organisationseinheit: Organisationseinheit = repository.mapGroupRepresentationToOrganisationseinheit({
-        attributes: {
-          organisationseinheitId: expectedOrganisationseinheit.organisationseinheitIds,
-        },
-      });
-
-      expect(organisationseinheit.organisationseinheitIds).toEqual(expectedOrganisationseinheit.organisationseinheitIds);
-    });
-
-    it('should map missing organisationseinheitIds to empty list', () => {
-      const organisationseinheit: Organisationseinheit = repository.mapGroupRepresentationToOrganisationseinheit({});
-
-      expect(organisationseinheit.organisationseinheitIds).toEqual([]);
-    });
-  });
-
-  describe('find organisationseinheitItems', () => {
-    const organisationseinheitItems: Organisationseinheit[] = [
-      createOrganisationseinheit(),
-      createOrganisationseinheit(),
-      createOrganisationseinheit(),
-    ];
-
-    const groupReps: GroupRepresentation[] = organisationseinheitItems.map(createGroupRepresentation);
-
-    it('should return mapped organisationseinheit search result', async () => {
-      const findMock: jest.Mock = jest.fn().mockReturnValue(Promise.resolve(groupReps));
-      mockGroupsFunc('find', findMock);
-
-      const groupsResult: Organisationseinheit[] = await firstValueFrom(repository.findOrganisationseinheitItems());
-
-      expect(groupsResult).toEqual(groupsResult);
-    });
-
-    it('should call with brief representation', fakeAsync(() => {
-      const findMock: jest.Mock = jest.fn().mockReturnValue(Promise.resolve(groupReps));
-      mockGroupsFunc('find', findMock);
-
-      repository.findOrganisationseinheitItems().subscribe();
-      tick();
-
-      expect(findMock).toHaveBeenCalledWith({ briefRepresentation: false });
-    }));
-  });
-
-  describe('save organisationseinheit', () => {
-    const saveGroup: Organisationseinheit = createOrganisationseinheit();
-
-    it('should call kcAdminClient.groups.save', async () => {
-      const updateMock: jest.Mock = jest.fn(() => of(null));
-      mockGroupsFunc('update', updateMock);
-
-      await firstValueFrom(repository.saveOrganisationseinheit(saveGroup));
-
-      expect(updateMock).toHaveBeenCalledWith(
-        { id: saveGroup.id },
-        {
-          name: saveGroup.name,
-          attributes: {
-            organisationseinheitId: saveGroup.organisationseinheitIds,
-          },
-        },
-      );
-    });
-
-    it('should return organisationseinheit save observable', async () => {
-      const updateMock: jest.Mock = jest.fn(() => Promise.resolve(null));
-      mockGroupsFunc('update', updateMock);
-
-      const voidResult = await firstValueFrom(repository.saveOrganisationseinheit(saveGroup));
-
-      expect(voidResult).toBe(null);
-    });
-
-    it('should pipe rethrowMappedGroupsError', (done) => {
-      const updateMock: jest.Mock = jest.fn(() => Promise.reject(networkError));
-      mockGroupsFunc('update', updateMock);
-      repository.rethrowMappedGroupsError = jest.fn().mockReturnValue(catchError(() => throwError(() => error)));
-
-      repository.saveOrganisationseinheit(saveGroup).subscribe({
-        error: (err) => {
-          expect(err).toBe(error);
-          done();
-        },
-      });
-    });
-  });
-
-  describe('create organisationseinheit', () => {
-    const newOrganisationseinheit: Organisationseinheit = createOrganisationseinheit();
-
-    it('should call kcAdminClient.groups.create', async () => {
-      const createMock: jest.Mock = jest.fn(() => of({ id: newOrganisationseinheit.id }));
-      mockGroupsFunc('create', createMock);
-
-      await firstValueFrom(
-        repository.createOrganisationseinheit({
-          name: newOrganisationseinheit.name,
-          organisationseinheitIds: newOrganisationseinheit.organisationseinheitIds,
-        }),
-      );
-
-      expect(createMock).toHaveBeenCalledWith({
-        name: newOrganisationseinheit.name,
-        attributes: {
-          organisationseinheitId: newOrganisationseinheit.organisationseinheitIds,
-        },
-      });
-    });
-
-    it('should return mapped organisationseinheit result', async () => {
-      const createMock: jest.Mock = jest.fn(() => Promise.resolve({ id: newOrganisationseinheit.id }));
-      mockGroupsFunc('create', createMock);
-
-      const newGroupResult: Organisationseinheit = await firstValueFrom(
-        repository.createOrganisationseinheit({
-          name: newOrganisationseinheit.name,
-          organisationseinheitIds: newOrganisationseinheit.organisationseinheitIds,
-        }),
-      );
-
-      expect(newGroupResult).toEqual(newOrganisationseinheit);
-    });
-
-    it('should pipe rethrowMappedGroupsError', (done) => {
-      const createMock: jest.Mock = jest.fn(() => Promise.reject(networkError));
-      mockGroupsFunc('create', createMock);
-      repository.rethrowMappedGroupsError = jest.fn().mockReturnValue(catchError(() => throwError(() => error)));
-
-      repository
-        .createOrganisationseinheit({
-          name: newOrganisationseinheit.name,
-          organisationseinheitIds: newOrganisationseinheit.organisationseinheitIds,
-        })
-        .subscribe({
-          error: (err) => {
-            expect(err).toBe(error);
-            done();
-          },
-        });
-    });
-  });
-
-  describe('rethrow mapped groups error', () => {
-    let networkErrorObservable: Observable<never>;
-
-    beforeEach(() => {
-      repository.mapCreateGroupsNetworkError = jest.fn().mockReturnValue(error);
-      networkErrorObservable = throwError(() => networkError);
-    });
-
-    it('should throw mapped error', (done) => {
-      const rethrowOperator: OperatorFunction<never, never> = repository.rethrowMappedGroupsError();
-
-      networkErrorObservable.pipe(rethrowOperator).subscribe({
-        error: (err) => {
-          expect(err).toBe(error);
-          done();
-        },
-      });
-    });
-
-    it('should call mapCreateGroupsNetworkError', (done) => {
-      const rethrowOperator: OperatorFunction<never, never> = repository.rethrowMappedGroupsError();
-
-      networkErrorObservable.pipe(rethrowOperator).subscribe({
-        error: () => {
-          expect(repository.mapCreateGroupsNetworkError).toHaveBeenCalledWith(networkError);
-          done();
-        },
-      });
-    });
-  });
-
-  describe('map create groups network error', () => {
-    it('should interpret 409 status as name conflict', () => {
-      const keycloakError: OrganisationseinheitError = createOrganisationseinheitError(
-        OrganisationseinheitErrorType.NAME_CONFLICT,
-      );
-      const networkError: NetworkError = createNetworkError(409, keycloakError.detail);
-
-      const error: OrganisationseinheitError = repository.mapCreateGroupsNetworkError(networkError);
-
-      expect(error).toEqual(keycloakError);
-    });
-
-    it('should interpret 400 status as name missing', () => {
-      const keycloakError: OrganisationseinheitError = createOrganisationseinheitError(
-        OrganisationseinheitErrorType.NAME_MISSING,
-      );
-      const networkError: NetworkError = createNetworkError(400, keycloakError.detail);
-
-      const error: OrganisationseinheitError = repository.mapCreateGroupsNetworkError(networkError);
-
-      expect(error).toEqual(keycloakError);
-    });
-
-    it('should map missing errorMessage to empty string', () => {
-      const networkError: NetworkError = createNetworkError(500, undefined);
-
-      const error: OrganisationseinheitError = repository.mapCreateGroupsNetworkError(networkError);
-      expect(error.detail).toEqual('');
-    });
-  });
-
-  describe('delete organisationseinheit', () => {
-    const deleteOrganisationseinheit: Organisationseinheit = createOrganisationseinheit();
-
-    it('should call kcAdminClient.groups.del', async () => {
-      const delMock: jest.Mock = jest.fn(() => Promise.resolve({ id: deleteOrganisationseinheit.id }));
-      mockGroupsFunc('del', delMock);
-
-      await firstValueFrom(repository.deleteOrganisationseinheit(deleteOrganisationseinheit.id));
-
-      expect(delMock).toHaveBeenCalledWith({
-        id: deleteOrganisationseinheit.id,
-      });
-    });
-
-    it('should return void', async () => {
-      mockGroupsFunc(
-        'del',
-        jest.fn(() => Promise.resolve(null)),
-      );
-
-      const voidResult: void = await firstValueFrom(repository.deleteOrganisationseinheit(deleteOrganisationseinheit.id));
-
-      expect(voidResult).toBeNull();
-    });
-  });
-
   describe('getUsers', () => {
     const userRep: User = createUser();
     const userRepArray: User[] = [userRep, userRep, userRep];
diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.util.spec.ts b/alfa-client/libs/admin/settings/src/lib/user/user.util.spec.ts
index f4d9cc168ecb9eaca45f28cead659716ff232845..7ede2e6daccb6281372e0f3a161fed776447c8bb 100644
--- a/alfa-client/libs/admin/settings/src/lib/user/user.util.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/user/user.util.spec.ts
@@ -1,30 +1,8 @@
-import { EMPTY_STRING } from '@alfa-client/tech-shared';
-import { createOrganisationseinheitError, createUser } from '../../../test/user/user';
-import { OrganisationseinheitError, OrganisationseinheitErrorType, User } from './user.model';
-import { KEYCLOAK_ERROR_MESSAGES, getOrganisationseinheitErrorMessage, sortUsersByLastName } from './user.util';
+import { createUser } from '../../../test/user/user';
+import { User } from './user.model';
+import { sortUsersByLastName } from './user.util';
 
 describe('user util', () => {
-  describe('get organisationseinheit error message', () => {
-    it('should map known error message', () => {
-      const nameConflictError: OrganisationseinheitError = createOrganisationseinheitError(
-        OrganisationseinheitErrorType.NAME_CONFLICT,
-      );
-      const expectedMessage: string = KEYCLOAK_ERROR_MESSAGES[nameConflictError.errorType];
-
-      const message: string = getOrganisationseinheitErrorMessage(nameConflictError);
-
-      expect(message).toEqual(expectedMessage);
-    });
-
-    it('should map unknown error message to empty string', () => {
-      const nameConflictError: OrganisationseinheitError = createOrganisationseinheitError(null);
-
-      const message: string = getOrganisationseinheitErrorMessage(nameConflictError);
-
-      expect(message).toEqual(EMPTY_STRING);
-    });
-  });
-
   describe('sort users by last name', () => {
     const users: User[] = [
       { ...createUser(), lastName: 'Müller' },
diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.util.ts b/alfa-client/libs/admin/settings/src/lib/user/user.util.ts
index 9878f7021e501b38d8d0938228a3c2c7c1df51b9..f801d3276c4ce3cdf05b67ab9412bcda0dde7fcd 100644
--- a/alfa-client/libs/admin/settings/src/lib/user/user.util.ts
+++ b/alfa-client/libs/admin/settings/src/lib/user/user.util.ts
@@ -1,21 +1,4 @@
-import { OrganisationseinheitError, OrganisationseinheitErrorType, User } from './user.model';
-
-export const KEYCLOAK_ERROR_MESSAGES: { [type: string]: string } = {
-  [OrganisationseinheitErrorType.NAME_CONFLICT]: 'Der Name exisitert bereits.',
-  [OrganisationseinheitErrorType.NAME_MISSING]: 'Bitte den Namen angeben.',
-  [OrganisationseinheitErrorType.ID_MISSING]: 'Bitte mindestens eine Organisationseinheit ID angeben.',
-};
-
-export const KEYCLOAK_CREATE_GROUPS_ERROR_STATUS: {
-  [status: number]: OrganisationseinheitErrorType;
-} = {
-  409: OrganisationseinheitErrorType.NAME_CONFLICT,
-  400: OrganisationseinheitErrorType.NAME_MISSING,
-};
-
-export function getOrganisationseinheitErrorMessage(error: OrganisationseinheitError): string {
-  return KEYCLOAK_ERROR_MESSAGES[error.errorType] ?? '';
-}
+import { User } from './user.model';
 
 export function sortUsersByLastName(users: User[]): User[] {
   return users.sort((a, b) => (a.lastName ?? '').localeCompare(b.lastName ?? ''));
diff --git a/alfa-client/libs/admin/settings/src/lib/users-roles/users-roles.component.html b/alfa-client/libs/admin/settings/src/lib/users-roles/users-roles.component.html
index 38c6cab182bd292ea1d60227a3d03eef8a7d621e..09160afabe086d514782957cb31784a715e747f1 100644
--- a/alfa-client/libs/admin/settings/src/lib/users-roles/users-roles.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/users-roles/users-roles.component.html
@@ -1,61 +1,51 @@
 <h1 class="heading-1">Benutzer & Rollen</h1>
 <ods-button-with-spinner text="Benutzer hinzufügen" class="py-8" dataTestId="add-user-button" />
-<ng-container *ngIf="users$ | async as users">
-  <ul class="divide-y divide-gray-300 rounded-md bg-background-50 text-text shadow-sm ring-1 ring-gray-300 empty:hidden">
-    <li *ngFor="let user of users.resource">
-      <a
-        href="#"
-        (click)="(false)"
-        class="flex flex-col items-start justify-between gap-6 border-primary-600/50 px-6 py-4 hover:bg-background-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus lg:flex-row"
-      >
-        <div class="flex-1 basis-1/2">
-          <div class="mb-2 flex flex-wrap items-center gap-3">
-            <h3 class="text-md font-semibold">{{ user | toUserName }}</h3>
-            <dl class="flex flex-wrap gap-2">
-              <dt class="sr-only">Rollen:</dt>
-              <dd
-                *ngFor="let role of user.roles"
-                class="inline-flex flex-shrink-0 items-center rounded-full bg-green-50 px-1.5 py-0.5 text-sm font-medium text-green-700 ring-1 ring-inset ring-green-600/20"
-              >
-                {{ role }}
-              </dd>
-            </dl>
-          </div>
+<ods-list *ngIf="users$ | async as users">
+  <ods-list-item *ngFor="let user of users.resource" [path]="user.username">
+    <div class="flex-1 basis-1/2">
+      <div class="mb-2 flex flex-wrap items-center gap-3">
+        <h3 class="text-md font-semibold">{{ user | toUserName }}</h3>
+        <dl class="flex flex-wrap gap-2">
+          <dt class="sr-only">Rollen:</dt>
+          <dd
+            *ngFor="let role of user.roles"
+            class="inline-flex flex-shrink-0 items-center rounded-full bg-green-50 px-1.5 py-0.5 text-sm font-medium text-green-700 ring-1 ring-inset ring-green-600/20"
+          >
+            {{ role }}
+          </dd>
+        </dl>
+      </div>
 
-          <dl>
-            <div *ngIf="user.email" class="flex items-center gap-2">
-              <dt>
-                <span class="sr-only">E-Mail:</span>
-                <ods-mailbox-icon size="small" class="stroke-gray-600" />
-              </dt>
-              <dd>{{ user.email }}</dd>
-            </div>
-            <div class="flex items-center gap-2">
-              <dt>
-                <span class="sr-only">Benutzername:</span>
-                <ods-person-icon />
-              </dt>
-              <dd>{{ user.username }}</dd>
-            </div>
-          </dl>
+      <dl>
+        <div *ngIf="user.email" class="flex items-center gap-2">
+          <dt>
+            <span class="sr-only">E-Mail:</span>
+            <ods-mailbox-icon size="small" class="stroke-gray-600" />
+          </dt>
+          <dd>{{ user.email }}</dd>
         </div>
+        <div class="flex items-center gap-2">
+          <dt>
+            <span class="sr-only">Benutzername:</span>
+            <ods-person-icon />
+          </dt>
+          <dd>{{ user.username }}</dd>
+        </div>
+      </dl>
+    </div>
 
-        <div class="flex-1 basis-1/2">
-          <h4 class="sr-only">Zuständige Stellen</h4>
+    <div class="flex-1 basis-1/2">
+      <h4 class="sr-only">Zuständige Stellen</h4>
 
-          <ng-container *ngIf="user.groups.length > 0; else noGroups">
-            <ul class="list-outside list-disc pl-4">
-              <ng-container *ngFor="let group of user.groups | slice: 0 : GROUPS_TO_DISPLAY">
-                <li>{{ group }}</li>
-              </ng-container>
-            </ul>
-            <p *ngIf="user.groups.length > GROUPS_TO_DISPLAY" class="pl-4 text-gray-500">
-              und {{ user.groups.length - 3 }} weitere
-            </p>
+      <ng-container *ngIf="user.groups.length > 0; else noGroups">
+        <ul class="list-outside list-disc pl-4">
+          <ng-container *ngFor="let group of user.groups | slice: 0 : GROUPS_TO_DISPLAY">
+            <li>{{ group }}</li>
           </ng-container>
-          <ng-template #noGroups>keine zuständige Stelle zugewiesen</ng-template>
-        </div>
-      </a>
-    </li>
-  </ul>
-</ng-container>
+        </ul>
+        <p *ngIf="user.groups.length > GROUPS_TO_DISPLAY" class="pl-4 text-gray-500">und {{ user.groups.length - 3 }} weitere</p>
+      </ng-container>
+      <ng-template #noGroups>keine zuständige Stelle zugewiesen</ng-template>
+    </div>
+  </ods-list-item>
+</ods-list>
diff --git a/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts
new file mode 100644
index 0000000000000000000000000000000000000000..754f117bada7606e59729a5a9a98028078e3e82b
--- /dev/null
+++ b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts
@@ -0,0 +1,38 @@
+import { faker } from '@faker-js/faker';
+import { times } from 'lodash-es';
+import { toResource } from '../../../../tech-shared/test/resource';
+import {
+  AdminOrganisationsEinheit,
+  AdminOrganisationsEinheitListResource,
+  AdminOrganisationsEinheitResource,
+  AdminOrganisationsEinheitSyncResult,
+} from '../../src';
+import { OrganisationsEinheitListLinkRel } from '../../src/lib/organisationseinheit/organisations-einheit.linkrel';
+
+export function createAdminOrganisationsEinheit(): AdminOrganisationsEinheit {
+  return {
+    name: faker.lorem.word(),
+    organisationsEinheitId: faker.lorem.word(),
+    syncResult: AdminOrganisationsEinheitSyncResult.OK,
+    settings: {
+      signatur: faker.lorem.words(5),
+    },
+  };
+}
+
+export function createAdminOrganisationsEinheitResource(linkRel: string[] = []): AdminOrganisationsEinheitResource {
+  return toResource(createAdminOrganisationsEinheit(), linkRel);
+}
+
+export function createAdminOrganisationsEinheitResources(linkRelations: string[] = []): AdminOrganisationsEinheitResource[] {
+  return times(10, () => toResource(createAdminOrganisationsEinheit(), [...linkRelations]));
+}
+
+export function createAdminOrganisationsEinheitListResource(
+  resources?: AdminOrganisationsEinheitResource[],
+  linkRelations: string[] = [],
+): AdminOrganisationsEinheitListResource {
+  return toResource({}, [...linkRelations], {
+    [OrganisationsEinheitListLinkRel.LIST]: resources ? resources : createAdminOrganisationsEinheitResources(),
+  });
+}
diff --git a/alfa-client/libs/admin/settings/test/user/user.ts b/alfa-client/libs/admin/settings/test/user/user.ts
index b267a09cb41105c7a03cd20b222342f6a3f6e78b..54f6d5fdf7881a193372e1e78641b8b35feeb25d 100644
--- a/alfa-client/libs/admin/settings/test/user/user.ts
+++ b/alfa-client/libs/admin/settings/test/user/user.ts
@@ -1,12 +1,5 @@
 import { faker } from '@faker-js/faker';
-import { NetworkError } from '@keycloak/keycloak-admin-client';
-import type GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation';
-import {
-  Organisationseinheit,
-  OrganisationseinheitError,
-  OrganisationseinheitErrorType,
-  User,
-} from '../../src/lib/user/user.model';
+import { User } from '../../src/lib/user/user.model';
 
 export function createUser(): User {
   return {
@@ -19,41 +12,3 @@ export function createUser(): User {
     groups: null,
   };
 }
-
-export function createOrganisationseinheit(): Organisationseinheit {
-  return {
-    id: faker.string.alphanumeric(16),
-    name: faker.person.jobTitle(),
-    organisationseinheitIds: [faker.string.numeric(10), faker.string.numeric(10)],
-  };
-}
-
-export function createGroupRepresentation(
-  organisationseinheit: Organisationseinheit = createOrganisationseinheit(),
-): GroupRepresentation {
-  return {
-    id: organisationseinheit.id,
-    name: organisationseinheit.name,
-    attributes: {
-      organisationseinheitId: organisationseinheit.organisationseinheitIds,
-    },
-  };
-}
-
-export function createOrganisationseinheitError(
-  errorType: OrganisationseinheitErrorType = OrganisationseinheitErrorType.NAME_MISSING,
-): OrganisationseinheitError {
-  return {
-    errorType,
-    detail: faker.lorem.sentence(10),
-  };
-}
-
-export function createNetworkError(status: number, errorMessage: string | undefined): NetworkError {
-  return new NetworkError('...', {
-    response: { status } as Response,
-    responseData: {
-      errorMessage,
-    },
-  });
-}
diff --git a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
index fed6b6cc56cb6ded4a3d5b9f19a68578ec28edcb..231bfb91adcc94fad96c9727f06992960376dc3f 100644
--- a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
+++ b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
@@ -61,4 +61,5 @@ export enum ApiRootLinkRel {
   DOCUMENTATIONS = 'documentations',
   HINTS = 'hints',
   RESOURCE = 'resource',
+  ORGANISATIONS_EINHEIT = 'organisationsEinheiten',
 }
diff --git a/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.spec.ts b/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.spec.ts
index b2c553deddfd284a92e8d95e6436807560b47384..028ec248d97981464a4458538f6a6d25d798bab0 100644
--- a/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.spec.ts
+++ b/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.spec.ts
@@ -280,7 +280,7 @@ describe('BinaryFileRepository', () => {
     });
 
     function buildExpectedRequestOptions(): HttpHeaders {
-      return new HttpHeaders().set(HttpHeader.ACCEPT, ContentType.APPLICATION_OCTET_STREAM);
+      return new HttpHeaders().set(HttpHeader.ACCEPT, ContentType.APPLICATION_ZIP);
     }
   });
 });
diff --git a/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.ts b/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.ts
index ef0c1b6762f8ac2177282f36b07d64879f8aac7c..945b8662db1b3076489002a6bdfac68bdcff320e 100644
--- a/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.ts
+++ b/alfa-client/libs/binary-file-shared/src/lib/binary-file.repository.ts
@@ -104,7 +104,7 @@ export class BinaryFileRepository {
 
   buildRequestOptionsForArchive(): GetRequestOptions {
     let headers = new HttpHeaders();
-    headers = headers.set(HttpHeader.ACCEPT, ContentType.APPLICATION_OCTET_STREAM);
+    headers = headers.set(HttpHeader.ACCEPT, ContentType.APPLICATION_ZIP);
     return <GetRequestOptions>{ headers, responseType: 'blob' as 'json', observe: 'response' };
   }
 }
diff --git a/alfa-client/libs/collaboration-shared/src/index.ts b/alfa-client/libs/collaboration-shared/src/index.ts
index cd761bf34a9d3d1e63337bb36e92e56977ef0b1e..58859f091df38c372a92ca17a76e2719ebf244d3 100644
--- a/alfa-client/libs/collaboration-shared/src/index.ts
+++ b/alfa-client/libs/collaboration-shared/src/index.ts
@@ -1,6 +1,3 @@
 export * from './lib/collaboration-shared.module';
 export * from './lib/collaboration.linkrel';
 export * from './lib/collaboration.model';
-export * from './lib/organisations-einheit.linkrel';
-export * from './lib/organisations-einheit.model';
-export * from './lib/organisations-einheit.service';
diff --git a/alfa-client/libs/collaboration-shared/src/lib/collaboration-shared.module.ts b/alfa-client/libs/collaboration-shared/src/lib/collaboration-shared.module.ts
index b4a95fe57bb26a6a1fe9cd8de98e6c2422b0033b..70457bcd41fd9709c9169744074b3b199859feb6 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/collaboration-shared.module.ts
+++ b/alfa-client/libs/collaboration-shared/src/lib/collaboration-shared.module.ts
@@ -2,32 +2,18 @@ import { ResourceRepository } from '@alfa-client/tech-shared';
 import { VorgangService } from '@alfa-client/vorgang-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
-import {
-  CollaborationListResourceService,
-  createCollaborationListResourceService,
-} from './collaboration-list-resource.service';
+import { CollaborationListResourceService, createCollaborationListResourceService } from './collaboration-list-resource.service';
 import { CollaborationService } from './collaboration.service';
-import {
-  OrganisationsEinheitResourceSearchService,
-  createOrganisationsEinheitResourceSearchService,
-} from './organisations-einheit-resource-search.service';
-import { OrganisationsEinheitService } from './organisations-einheit.service';
 
 @NgModule({
   imports: [CommonModule],
   providers: [
     CollaborationService,
-    OrganisationsEinheitService,
     {
       provide: CollaborationListResourceService,
       useFactory: createCollaborationListResourceService,
       deps: [ResourceRepository, VorgangService],
     },
-    {
-      provide: OrganisationsEinheitResourceSearchService,
-      useFactory: createOrganisationsEinheitResourceSearchService,
-      deps: [ResourceRepository, VorgangService],
-    },
   ],
 })
 export class CollaborationSharedModule {}
diff --git a/alfa-client/libs/collaboration-shared/src/lib/collaboration.model.ts b/alfa-client/libs/collaboration-shared/src/lib/collaboration.model.ts
index 0e5a678748f2ac3076ff3a7cd94f60d5bf69eae0..5cb0cb4409c1bf54e9447410b2e7bc02b54f1b30 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/collaboration.model.ts
+++ b/alfa-client/libs/collaboration-shared/src/lib/collaboration.model.ts
@@ -5,6 +5,7 @@ export interface Collaboration {
   titel: string;
   anfrage: string;
   zustaendigeStelle: ResourceUri;
+  collaborationLevel?: number;
 }
 
 export interface CollaborationResource extends Collaboration, Resource, ListItemResource {}
diff --git a/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.spec.ts b/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.spec.ts
index d5cdf3d7a38229b500188f238c7ed137ac9a475b..3ad660af24dfd54fbe6a5b7368f2fe66e064aa4d 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.spec.ts
+++ b/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.spec.ts
@@ -4,10 +4,7 @@ import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { singleColdCompleted } from 'libs/tech-shared/test/marbles';
 import { Observable, of } from 'rxjs';
-import {
-  createCollaboration,
-  createCollaborationListResource,
-} from '../../../collaboration-shared/test/collaboration';
+import { createCollaboration, createCollaborationListResource } from '../../../collaboration-shared/test/collaboration';
 import { CollaborationListResourceService } from './collaboration-list-resource.service';
 import { CollaborationListLinkRel } from './collaboration.linkrel';
 import { Collaboration, CollaborationListResource } from './collaboration.model';
@@ -22,8 +19,7 @@ describe('CollaborationService', () => {
   let commandService: Mock<CommandService>;
 
   const collaborationListResource: CollaborationListResource = createCollaborationListResource();
-  const collaborationStateListResource: StateResource<CollaborationListResource> =
-    createStateResource(collaborationListResource);
+  const collaborationStateListResource: StateResource<CollaborationListResource> = createStateResource(collaborationListResource);
 
   beforeEach(() => {
     listService = mock(CollaborationListResourceService);
@@ -50,47 +46,170 @@ describe('CollaborationService', () => {
     });
   });
 
-  describe('is request form visible', () => {
-    it('should return value', (done) => {
-      service.showRequestForm$.next(false);
+  describe('organisationsEinheit', () => {
+    describe('is form visible', () => {
+      it('should return value', (done) => {
+        service.showOrganisationsEinheitForm$.next(true);
 
-      service.isRequestFormVisible().subscribe((isVisible: boolean) => {
-        expect(isVisible).toBeTruthy();
-        done();
+        service.isOrganisationsEinheitFormVisible().subscribe((isVisible: boolean) => {
+          expect(isVisible).toBeTruthy();
+          done();
+        });
+
+        service.isOrganisationsEinheitFormVisible();
+      });
+    });
+
+    describe('show formular', () => {
+      it('should set form visibility to true', () => {
+        service.showOrganisationsEinheitForm$.next(false);
+
+        service.showOrganisationsEinheitForm();
+
+        expect(service.showOrganisationsEinheitForm$.value).toBeTruthy();
       });
 
-      service.showRequestForm();
+      it('should disable externeFachstelle button visibility', () => {
+        service.showExterneFachstelleAnfrageButton$.next(true);
+
+        service.showOrganisationsEinheitForm();
+
+        expect(service.showExterneFachstelleAnfrageButton$.value).toBeFalsy();
+      });
+
+      it('should set collaborationLevel to 1', () => {
+        service.showOrganisationsEinheitForm();
+
+        expect(service.collaborationLevel$.value).toEqual(1);
+      });
     });
-  });
 
-  describe('show anfrage formular', () => {
-    it('should set "showRequestForm" to true', () => {
-      service.showRequestForm$.next(false);
+    describe('hide formular', () => {
+      it('should set "showRequestForm" to false', () => {
+        service.showOrganisationsEinheitForm$.next(true);
+
+        service.hideOrganisationseinheitForm();
 
-      service.showRequestForm();
+        expect(service.showOrganisationsEinheitForm$.value).toBeFalsy();
+      });
 
-      expect(service.showRequestForm$.value).toBeTruthy();
+      it('should enable externe fachstelle button visibility', () => {
+        service.showExterneFachstelleAnfrageButton$.next(false);
+
+        service.hideOrganisationseinheitForm();
+
+        expect(service.showExterneFachstelleAnfrageButton$.value).toBeTruthy();
+      });
+
+      it('should reset collaborationLevel to null', () => {
+        service.collaborationLevel$.next(1);
+
+        service.hideOrganisationseinheitForm();
+
+        expect(service.collaborationLevel$.value).toBeNull();
+      });
+    });
+
+    describe('show anfrage button', () => {
+      it('should return value', (done) => {
+        service.showOrganisationsEinheitAnfrageButton$.next(true);
+
+        service.showOrganisationsEinheitAnfrageButton().subscribe((isVisible: boolean) => {
+          expect(isVisible).toBeTruthy();
+          done();
+        });
+
+        service.showOrganisationsEinheitAnfrageButton();
+      });
     });
   });
 
-  describe('hide anfrage formular', () => {
-    it('should set "showRequestForm" to false', () => {
-      service.showRequestForm$.next(true);
+  describe('externe fachstelle', () => {
+    describe('is form visible', () => {
+      it('should return value', (done) => {
+        service.showExterneFachstelleForm$.next(true);
+
+        service.isExterneFachstelleFormVisible().subscribe((isVisible: boolean) => {
+          expect(isVisible).toBeTruthy();
+          done();
+        });
+
+        service.isExterneFachstelleFormVisible();
+      });
+    });
+
+    describe('show formular', () => {
+      it('should set form visbility to true', () => {
+        service.showExterneFachstelleForm$.next(false);
+
+        service.showExterneFachstelleForm();
+
+        expect(service.showExterneFachstelleForm$.value).toBeTruthy();
+      });
+
+      it('should disable organisationsEinheit button visibility', () => {
+        service.showOrganisationsEinheitAnfrageButton$.next(true);
+
+        service.showExterneFachstelleForm();
+
+        expect(service.showOrganisationsEinheitAnfrageButton$.value).toBeFalsy();
+      });
+
+      it('should set collaborationLevel to 4', () => {
+        service.showExterneFachstelleForm();
+
+        expect(service.collaborationLevel$.value).toEqual(4);
+      });
+    });
+
+    describe('hide formular', () => {
+      it('should set "showRequestForm" to false', () => {
+        service.showExterneFachstelleForm$.next(true);
 
-      service.hideRequestForm();
+        service.hideExterneFachstelleForm();
 
-      expect(service.showRequestForm$.value).toBeFalsy();
+        expect(service.showExterneFachstelleForm$.value).toBeFalsy();
+      });
+
+      it('should enable organisationsEinheit button visibility', () => {
+        service.showOrganisationsEinheitAnfrageButton$.next(false);
+
+        service.hideExterneFachstelleForm();
+
+        expect(service.showOrganisationsEinheitAnfrageButton$.value).toBeTruthy();
+      });
+
+      it('should reset collaborationLevel to null', () => {
+        service.collaborationLevel$.next(4);
+
+        service.hideExterneFachstelleForm();
+
+        expect(service.collaborationLevel$.value).toBeNull();
+      });
+    });
+
+    describe('show anfrage button', () => {
+      it('should return value', (done) => {
+        service.showExterneFachstelleAnfrageButton$.next(true);
+
+        service.showExterneFachstelleAnfrageButton().subscribe((isVisible: boolean) => {
+          expect(isVisible).toBeTruthy();
+          done();
+        });
+
+        service.showExterneFachstelleAnfrageButton();
+      });
     });
   });
 
   describe('create', () => {
     const collaborationListResource: CollaborationListResource = createCollaborationListResource();
-    const commandStateResource: StateResource<CommandResource> =
-      createStateResource(createCommandResource());
+    const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
     const collaboration: Collaboration = createCollaboration();
 
     beforeEach(() => {
       commandService.createCommandByProps.mockReturnValue(of(commandStateResource));
+      service.collaborationLevel$.next(1);
     });
 
     it('should call command service', () => {
@@ -101,17 +220,14 @@ describe('CollaborationService', () => {
         resource: collaborationListResource,
         command: {
           order: CommandOrder.CREATE_COLLABORATION_REQUEST,
-          body: collaboration,
+          body: { ...collaboration, collaborationLevel: 1 },
         },
         snackBarMessage: 'Die Zuarbeit wurde angefragt.',
       });
     });
 
     it('should return value', () => {
-      const created$: Observable<StateResource<CommandResource>> = service.create(
-        collaborationListResource,
-        collaboration,
-      );
+      const created$: Observable<StateResource<CommandResource>> = service.create(collaborationListResource, collaboration);
 
       expect(created$).toBeObservable(singleColdCompleted(commandStateResource));
     });
diff --git a/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.ts b/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.ts
index f210a1133df3293f5bfa9da2bdd97fe033af1f6c..5e3a4bddae93de877988896523a9132e676c6575 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.ts
+++ b/alfa-client/libs/collaboration-shared/src/lib/collaboration.service.ts
@@ -8,7 +8,16 @@ import { Collaboration, CollaborationListResource } from './collaboration.model'
 
 @Injectable()
 export class CollaborationService {
-  showRequestForm$: BehaviorSubject<boolean> = new BehaviorSubject(false);
+  showExterneFachstelleForm$: BehaviorSubject<boolean> = new BehaviorSubject(false);
+  showExterneFachstelleAnfrageButton$: BehaviorSubject<boolean> = new BehaviorSubject(true);
+
+  showOrganisationsEinheitForm$: BehaviorSubject<boolean> = new BehaviorSubject(false);
+  showOrganisationsEinheitAnfrageButton$: BehaviorSubject<boolean> = new BehaviorSubject(true);
+
+  collaborationLevel$: BehaviorSubject<number> = new BehaviorSubject(null);
+
+  readonly ORGANISATIONS_EINHEIT_COLLABORATION_LEVEL: number = 1;
+  readonly EXTERNE_FACHSTELLE_COLLABORATION_LEVEL: number = 4;
 
   constructor(
     private listService: CollaborationListResourceService,
@@ -19,16 +28,44 @@ export class CollaborationService {
     return this.listService.getList();
   }
 
-  public isRequestFormVisible(): Observable<boolean> {
-    return this.showRequestForm$.asObservable();
+  public isOrganisationsEinheitFormVisible(): Observable<boolean> {
+    return this.showOrganisationsEinheitForm$.asObservable();
+  }
+
+  public showOrganisationsEinheitForm(): void {
+    this.showOrganisationsEinheitForm$.next(true);
+    this.showExterneFachstelleAnfrageButton$.next(false);
+    this.collaborationLevel$.next(this.ORGANISATIONS_EINHEIT_COLLABORATION_LEVEL);
+  }
+
+  public hideOrganisationseinheitForm(): void {
+    this.showOrganisationsEinheitForm$.next(false);
+    this.showExterneFachstelleAnfrageButton$.next(true);
+    this.collaborationLevel$.next(null);
+  }
+
+  public showOrganisationsEinheitAnfrageButton(): Observable<boolean> {
+    return this.showOrganisationsEinheitAnfrageButton$.asObservable();
+  }
+
+  public isExterneFachstelleFormVisible(): Observable<boolean> {
+    return this.showExterneFachstelleForm$.asObservable();
+  }
+
+  public showExterneFachstelleForm(): void {
+    this.showExterneFachstelleForm$.next(true);
+    this.showOrganisationsEinheitAnfrageButton$.next(false);
+    this.collaborationLevel$.next(this.EXTERNE_FACHSTELLE_COLLABORATION_LEVEL);
   }
 
-  public showRequestForm(): void {
-    this.showRequestForm$.next(true);
+  public hideExterneFachstelleForm(): void {
+    this.showExterneFachstelleForm$.next(false);
+    this.showOrganisationsEinheitAnfrageButton$.next(true);
+    this.collaborationLevel$.next(null);
   }
 
-  public hideRequestForm(): void {
-    this.showRequestForm$.next(false);
+  public showExterneFachstelleAnfrageButton(): Observable<boolean> {
+    return this.showExterneFachstelleAnfrageButton$.asObservable();
   }
 
   public create(
@@ -40,7 +77,7 @@ export class CollaborationService {
       resource: listResource,
       command: {
         order: CommandOrder.CREATE_COLLABORATION_REQUEST,
-        body: collaborationRequest,
+        body: { ...collaborationRequest, collaborationLevel: this.collaborationLevel$.value },
       },
       snackBarMessage: 'Die Zuarbeit wurde angefragt.',
     });
diff --git a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.spec.ts b/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.spec.ts
deleted file mode 100644
index 52a7a98f60fb08cedd88f1b41bbca0d746b46920..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.spec.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { StateResource, createStateResource } from '@alfa-client/tech-shared';
-import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
-import { faker } from '@faker-js/faker';
-import { Observable, of } from 'rxjs';
-import { singleColdCompleted } from '../../../tech-shared/test/marbles';
-import {
-  createOrganisationsEinheitListResource,
-  createOrganisationsEinheitResource,
-} from '../../test/organisations-einheit';
-import { OrganisationsEinheitResourceSearchService } from './organisations-einheit-resource-search.service';
-import {
-  OrganisationsEinheitListResource,
-  OrganisationsEinheitResource,
-} from './organisations-einheit.model';
-import { OrganisationsEinheitService } from './organisations-einheit.service';
-
-jest.mock('./organisations-einheit-resource-search.service');
-
-describe('OrganisationsEinheitService', () => {
-  let service: OrganisationsEinheitService;
-
-  let searchService: Mock<OrganisationsEinheitResourceSearchService>;
-
-  const listResource: OrganisationsEinheitListResource = createOrganisationsEinheitListResource();
-  const listStateResource: StateResource<OrganisationsEinheitListResource> =
-    createStateResource(listResource);
-
-  beforeEach(() => {
-    searchService = mock(OrganisationsEinheitResourceSearchService);
-
-    service = new OrganisationsEinheitService(useFromMock(searchService));
-  });
-
-  describe('get search result list', () => {
-    it('should call search service', () => {
-      service.getSearchResultList();
-
-      expect(searchService.getResultList).toHaveBeenCalled();
-    });
-
-    it('should return result', (done) => {
-      searchService.getResultList.mockReturnValue(of(listStateResource));
-
-      service
-        .getSearchResultList()
-        .subscribe((result: StateResource<OrganisationsEinheitListResource>) => {
-          expect(result).toBe(listStateResource);
-          done();
-        });
-    });
-  });
-
-  describe('search', () => {
-    const searchBy: string = faker.word.sample();
-
-    it('should call search service with search string', () => {
-      service.search(searchBy);
-
-      expect(searchService.search).toHaveBeenCalledWith(searchBy);
-    });
-  });
-
-  describe('clear search result', () => {
-    it('should call search service', () => {
-      service.clearSearchResult();
-
-      expect(searchService.clearResultList).toHaveBeenCalledWith();
-    });
-  });
-
-  describe('get selected result', () => {
-    const organisationsEinheitResource: OrganisationsEinheitResource =
-      createOrganisationsEinheitResource();
-
-    beforeEach(() => {
-      searchService.getSelectedResult.mockReturnValue(of(organisationsEinheitResource));
-    });
-
-    it('should call service', () => {
-      service.getSelectedResult();
-
-      expect(searchService.getSelectedResult).toHaveBeenCalled();
-    });
-
-    it('should return result', () => {
-      const selectedResult$: Observable<OrganisationsEinheitResource> = service.getSelectedResult();
-
-      expect(selectedResult$).toBeObservable(singleColdCompleted(organisationsEinheitResource));
-    });
-  });
-
-  describe('select search result', () => {
-    const organisationsEinheitResource: OrganisationsEinheitResource =
-      createOrganisationsEinheitResource();
-
-    it('should call service', () => {
-      service.selectSearchResult(organisationsEinheitResource);
-
-      expect(searchService.selectResult).toHaveBeenCalledWith(organisationsEinheitResource);
-    });
-  });
-
-  describe('clear selected result', () => {
-    it('should call service', () => {
-      service.clearSelectedResult();
-
-      expect(searchService.clearSelectedResult).toHaveBeenCalled();
-    });
-  });
-});
diff --git a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.ts b/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.ts
deleted file mode 100644
index 495c115446391b8d126feef91bc6b02ad9c24134..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.service.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { StateResource } from '@alfa-client/tech-shared';
-import { Injectable } from '@angular/core';
-import { Observable } from 'rxjs';
-import { OrganisationsEinheitResourceSearchService } from './organisations-einheit-resource-search.service';
-import {
-  OrganisationsEinheitListResource,
-  OrganisationsEinheitResource,
-} from './organisations-einheit.model';
-
-@Injectable()
-export class OrganisationsEinheitService {
-  constructor(private readonly searchService: OrganisationsEinheitResourceSearchService) {}
-
-  public getSearchResultList(): Observable<StateResource<OrganisationsEinheitListResource>> {
-    return this.searchService.getResultList();
-  }
-
-  public search(searchBy: string): void {
-    this.searchService.search(searchBy);
-  }
-
-  public clearSearchResult(): void {
-    this.searchService.clearResultList();
-  }
-
-  public getSelectedResult(): Observable<OrganisationsEinheitResource> {
-    return this.searchService.getSelectedResult();
-  }
-
-  public selectSearchResult(organisationsEinheitResource: OrganisationsEinheitResource): void {
-    this.searchService.selectResult(organisationsEinheitResource);
-  }
-
-  public clearSelectedResult(): void {
-    this.searchService.clearSelectedResult();
-  }
-}
diff --git a/alfa-client/libs/collaboration-shared/test/collaboration.ts b/alfa-client/libs/collaboration-shared/test/collaboration.ts
index 6645e69efc3d9cbf8f4df49f5f4ddde047e602f9..da923fb34b96e475b692c6212297e6f612f90be6 100644
--- a/alfa-client/libs/collaboration-shared/test/collaboration.ts
+++ b/alfa-client/libs/collaboration-shared/test/collaboration.ts
@@ -2,12 +2,9 @@ import { faker } from '@faker-js/faker';
 import { times } from 'lodash-es';
 import { LinkRelationName } from '../../tech-shared/src';
 import { toResource } from '../../tech-shared/test/resource';
-import { CollaborationListLinkRel, OrganisationsEinheitResource } from '../src';
-import {
-  Collaboration,
-  CollaborationListResource,
-  CollaborationResource,
-} from '../src/lib/collaboration.model';
+import { OrganisationsEinheitResource } from '../../zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.model';
+import { CollaborationListLinkRel } from '../src';
+import { Collaboration, CollaborationListResource, CollaborationResource } from '../src/lib/collaboration.model';
 
 export function createCollaboration(): Collaboration {
   return {
@@ -17,21 +14,15 @@ export function createCollaboration(): Collaboration {
   };
 }
 
-export function createCollaborationResource(
-  linkRelations: LinkRelationName[] = [],
-): CollaborationResource {
+export function createCollaborationResource(linkRelations: LinkRelationName[] = []): CollaborationResource {
   return toResource(createCollaboration(), linkRelations);
 }
 
-export function createCollaborationResources(
-  linkRelations: LinkRelationName[] = [],
-): OrganisationsEinheitResource[] {
+export function createCollaborationResources(linkRelations: LinkRelationName[] = []): OrganisationsEinheitResource[] {
   return times(10, () => toResource(createCollaborationResource(), [...linkRelations]));
 }
 
-export function createCollaborationListResource(
-  linkRelations: LinkRelationName[] = [],
-): CollaborationListResource {
+export function createCollaborationListResource(linkRelations: LinkRelationName[] = []): CollaborationListResource {
   return toResource({}, [...linkRelations], {
     [CollaborationListLinkRel.COLLABORATION_LIST]: createCollaborationResources(),
   });
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.html
index d0d5db82cd5b543c578693ef03c4907a134077f8..3f896b077d98b171d49206be45d866764fc3923f 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.html
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.html
@@ -1,8 +1,6 @@
 <alfa-collaboration-in-vorgang
-  data-test-id="collaboration-in-vorgang"
+  [vorgang]="vorgang"
   [collaborationStateListResource]="collaborationStateListResource$ | async"
-  [isRequestFormVisible]="isRequestFormVisible$ | async"
-  [organisationsEinheit]="selectedOrganisationsEinheit$ | async"
-  (hideRequestForm)="hideRequestForm()"
-  (showRequestForm)="showRequestForm()"
+  [showOrganisationsEinheitAnfrageButton]="showOrganisationsEinheitAnfrageButton$ | async"
+  [showExterneFachstelleAnfrageButton]="showExterneFachstelleAnfrageButton$ | async"
 ></alfa-collaboration-in-vorgang>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.spec.ts
index a5e6e9e22dc4c22f174f59115b1bb954d1addaf3..4543235a339d3c62076e82ead2f770e45f2af46b 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.spec.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.spec.ts
@@ -1,57 +1,39 @@
-import {
-  CollaborationListResource,
-  OrganisationsEinheitResource,
-} from '@alfa-client/collaboration-shared';
+import { CollaborationListResource } from '@alfa-client/collaboration-shared';
 import { StateResource, createStateResource } from '@alfa-client/tech-shared';
-import { Mock, dispatchEventFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
+import { Mock, getMockComponent, mock } from '@alfa-client/test-utils';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
-import { OrganisationsEinheitResourceSearchService } from 'libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service';
 import { createCollaborationListResource } from 'libs/collaboration-shared/test/collaboration';
-import { createOrganisationsEinheitResource } from 'libs/collaboration-shared/test/organisations-einheit';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
 import { CollaborationInVorgangContainerComponent } from './collaboration-in-vorgang-container.component';
 import { CollaborationInVorgangComponent } from './collaboration-in-vorgang/collaboration-in-vorgang.component';
 
-jest.mock('libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service');
-
 describe('CollaborationInVorgangContainerComponent', () => {
   let component: CollaborationInVorgangContainerComponent;
   let fixture: ComponentFixture<CollaborationInVorgangContainerComponent>;
 
-  const collaborationInVorgangComp: string = getDataTestIdOf('collaboration-in-vorgang');
-
-  const service: Mock<CollaborationService> = {
-    ...mock(CollaborationService),
-    isRequestFormVisible: jest.fn().mockReturnValue(of(false)),
-  };
+  let service: Mock<CollaborationService>;
 
-  const organisationsEinheitSearchService: Mock<OrganisationsEinheitResourceSearchService> = mock(
-    OrganisationsEinheitResourceSearchService,
-  );
+  const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource();
 
   beforeEach(async () => {
+    service = mock(CollaborationService);
     await TestBed.configureTestingModule({
-      declarations: [
-        CollaborationInVorgangContainerComponent,
-        MockComponent(CollaborationInVorgangComponent),
-      ],
+      declarations: [CollaborationInVorgangContainerComponent, MockComponent(CollaborationInVorgangComponent)],
       providers: [
         {
           provide: CollaborationService,
           useValue: service,
         },
-        {
-          provide: OrganisationsEinheitResourceSearchService,
-          useValue: organisationsEinheitSearchService,
-        },
       ],
     }).compileComponents();
 
     fixture = TestBed.createComponent(CollaborationInVorgangContainerComponent);
     component = fixture.componentInstance;
+    component.vorgang = vorgang;
     fixture.detectChanges();
   });
 
@@ -66,101 +48,62 @@ describe('CollaborationInVorgangContainerComponent', () => {
       expect(service.getList).toHaveBeenCalled();
     });
 
-    it('should call service to get request form visbility', () => {
+    it('should call service to get organisationsEinheit anfrage button visbility', () => {
       component.ngOnInit();
 
-      expect(service.isRequestFormVisible).toHaveBeenCalled();
+      expect(service.showOrganisationsEinheitAnfrageButton).toHaveBeenCalled();
     });
 
-    it('should get selected result', () => {
+    it('should call service to get externeFachstelle anfrage button visbility', () => {
       component.ngOnInit();
 
-      expect(organisationsEinheitSearchService.getSelectedResult).toHaveBeenCalled();
+      expect(service.showExterneFachstelleAnfrageButton).toHaveBeenCalled();
     });
   });
 
-  describe('collaboration in vorgang component', () => {
-    const collaborationListResource: CollaborationListResource = createCollaborationListResource();
-    const collaborationStateListResource: StateResource<CollaborationListResource> =
-      createStateResource(collaborationListResource);
-
-    describe('should be called with', () => {
-      it('collaboration state list resource', () => {
-        component.collaborationStateListResource$ = of(collaborationStateListResource);
-
-        fixture.detectChanges();
-
-        expect(getCollaborationInVorgangComponent().collaborationStateListResource).toBe(
-          collaborationStateListResource,
-        );
-      });
-
-      it('is request form visible', () => {
-        component.isRequestFormVisible$ = of(true);
-
-        fixture.detectChanges();
-
-        expect(getCollaborationInVorgangComponent().isRequestFormVisible).toBeTruthy();
-      });
-
-      it('organisations einheit', () => {
-        const organisationsEinheitResource: OrganisationsEinheitResource =
-          createOrganisationsEinheitResource();
-        component.selectedOrganisationsEinheit$ = of(organisationsEinheitResource);
+  describe('template', () => {
+    describe('collaboration in vorgang component', () => {
+      const collaborationListResource: CollaborationListResource = createCollaborationListResource();
+      const collaborationStateListResource: StateResource<CollaborationListResource> =
+        createStateResource(collaborationListResource);
 
-        fixture.detectChanges();
+      describe('should be called with', () => {
+        it('vorgang', () => {
+          component.vorgang = vorgang;
 
-        expect(getCollaborationInVorgangComponent().organisationsEinheit).toBe(
-          organisationsEinheitResource,
-        );
-      });
+          fixture.detectChanges();
 
-      function getCollaborationInVorgangComponent(): CollaborationInVorgangComponent {
-        return getMockComponent<CollaborationInVorgangComponent>(
-          fixture,
-          CollaborationInVorgangComponent,
-        );
-      }
-    });
+          expect(getCollaborationInVorgangComponent().vorgang).toBe(vorgang);
+        });
 
-    it('should call hideRequestForm on output', () => {
-      component.hideRequestForm = jest.fn();
+        it('collaboration state list resource', () => {
+          component.collaborationStateListResource$ = of(collaborationStateListResource);
 
-      dispatchEventFromFixture(fixture, collaborationInVorgangComp, 'hideRequestForm');
+          fixture.detectChanges();
 
-      expect(component.hideRequestForm).toHaveBeenCalled();
-    });
+          expect(getCollaborationInVorgangComponent().collaborationStateListResource).toBe(collaborationStateListResource);
+        });
 
-    it('should call showRequestForm on output', () => {
-      component.showRequestForm = jest.fn();
+        it('showOrganisationsEinheitAnfrageButton', () => {
+          component.showOrganisationsEinheitAnfrageButton$ = of(true);
 
-      dispatchEventFromFixture(fixture, collaborationInVorgangComp, 'showRequestForm');
+          fixture.detectChanges();
 
-      expect(component.showRequestForm).toHaveBeenCalled();
-    });
-  });
+          expect(getCollaborationInVorgangComponent().showOrganisationsEinheitAnfrageButton).toBeTruthy();
+        });
 
-  describe('show request form', () => {
-    it('should call service', () => {
-      component.showRequestForm();
+        it('showExterneFachstelleAnfrageButton', () => {
+          component.showExterneFachstelleAnfrageButton$ = of(true);
 
-      expect(service.showRequestForm).toHaveBeenCalled();
-    });
-  });
-
-  describe('hide request form', () => {
-    it('should call service', () => {
-      component.hideRequestForm();
-
-      expect(service.hideRequestForm).toHaveBeenCalled();
-    });
-  });
+          fixture.detectChanges();
 
-  describe('ngOnDestroy', () => {
-    it('should call service to clear selected result', () => {
-      component.ngOnDestroy();
+          expect(getCollaborationInVorgangComponent().showExterneFachstelleAnfrageButton).toBeTruthy();
+        });
 
-      expect(organisationsEinheitSearchService.clearSelectedResult).toHaveBeenCalled();
+        function getCollaborationInVorgangComponent(): CollaborationInVorgangComponent {
+          return getMockComponent<CollaborationInVorgangComponent>(fixture, CollaborationInVorgangComponent);
+        }
+      });
     });
   });
 });
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.ts
index 50c5d04bcffdbd5cd7171a14c5f696839b7447ea..bd7530c12154abd88a8bf9ba75d6a3078bc021c1 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang-container.component.ts
@@ -1,40 +1,26 @@
-import { OrganisationsEinheitResource } from '@alfa-client/collaboration-shared';
 import { StateResource } from '@alfa-client/tech-shared';
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Input, OnInit } from '@angular/core';
 import { CollaborationListResource } from 'libs/collaboration-shared/src/lib/collaboration.model';
 import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
-import { OrganisationsEinheitResourceSearchService } from 'libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service';
 import { Observable } from 'rxjs';
 
 @Component({
   selector: 'alfa-collaboration-in-vorgang-container',
   templateUrl: './collaboration-in-vorgang-container.component.html',
 })
-export class CollaborationInVorgangContainerComponent implements OnInit, OnDestroy {
+export class CollaborationInVorgangContainerComponent implements OnInit {
+  @Input() public vorgang: VorgangWithEingangResource;
+
   public collaborationStateListResource$: Observable<StateResource<CollaborationListResource>>;
-  public isRequestFormVisible$: Observable<boolean>;
-  public selectedOrganisationsEinheit$: Observable<OrganisationsEinheitResource>;
+  public showOrganisationsEinheitAnfrageButton$: Observable<boolean>;
+  public showExterneFachstelleAnfrageButton$: Observable<boolean>;
 
-  constructor(
-    private readonly service: CollaborationService,
-    private readonly searchService: OrganisationsEinheitResourceSearchService,
-  ) {}
+  constructor(private readonly service: CollaborationService) {}
 
   ngOnInit(): void {
     this.collaborationStateListResource$ = this.service.getList();
-    this.isRequestFormVisible$ = this.service.isRequestFormVisible();
-    this.selectedOrganisationsEinheit$ = this.searchService.getSelectedResult();
-  }
-
-  public showRequestForm(): void {
-    this.service.showRequestForm();
-  }
-
-  public hideRequestForm(): void {
-    this.service.hideRequestForm();
-  }
-
-  ngOnDestroy(): void {
-    this.searchService.clearSelectedResult();
+    this.showOrganisationsEinheitAnfrageButton$ = this.service.showOrganisationsEinheitAnfrageButton();
+    this.showExterneFachstelleAnfrageButton$ = this.service.showExterneFachstelleAnfrageButton();
   }
 }
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..75d1ff1c07aa52d92793e99ac30c77acf7d89ddf
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.html
@@ -0,0 +1,6 @@
+<ods-button
+  variant="outline"
+  text="Neue Anfrage erstellen"
+  dataTestId="anfrage-erstellen-button"
+  (clickEmitter)="clickEmitter.emit()"
+/>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6f1c7fbe7d49d18bc41aa4d24b0fb2c541f5815d
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.spec.ts
@@ -0,0 +1,38 @@
+import { dispatchEventFromFixture } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ButtonComponent, UsersIconComponent } from '@ods/system';
+import { getDataTestIdAttributeOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { AnfrageErstellenButtonComponent } from './anfrage-erstellen-button.component';
+
+describe('AnfrageErstellenButtonComponent', () => {
+  let component: AnfrageErstellenButtonComponent;
+  let fixture: ComponentFixture<AnfrageErstellenButtonComponent>;
+
+  const button: string = getDataTestIdAttributeOf('anfrage-erstellen-button');
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [AnfrageErstellenButtonComponent],
+      imports: [MockComponent(ButtonComponent), MockComponent(UsersIconComponent)],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(AnfrageErstellenButtonComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('click on button', () => {
+    it('should emit', () => {
+      component.clickEmitter.emit = jest.fn();
+
+      dispatchEventFromFixture(fixture, button, 'clickEmitter');
+
+      expect(component.clickEmitter.emit).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..780d5d212884c43db0e423d91f85cf509f966509
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component.ts
@@ -0,0 +1,9 @@
+import { Component, EventEmitter, Output } from '@angular/core';
+
+@Component({
+  selector: 'alfa-anfrage-erstellen-button',
+  templateUrl: './anfrage-erstellen-button.component.html',
+})
+export class AnfrageErstellenButtonComponent {
+  @Output() public clickEmitter: EventEmitter<void> = new EventEmitter();
+}
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.html
index f6f07ea8d41b856a7044732497a7a9ae381ef669..dc9ab9a02ccaaa690f1fe6c3d20eb27246766cdd 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.html
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.html
@@ -1,38 +1,22 @@
-<ng-container
-  *ngIf="
-    collaborationStateListResource.resource
-      | hasLink: collaborationListLinkRel.CREATE_COLLABORATION_REQUEST
-  "
->
-  <ng-template #anfrageErstellenButton>
-    <ods-button
-      variant="outline"
-      text="Anfrage erstellen"
-      dataTestId="anfrage-erstellen-button"
-      (clickEmitter)="showRequestForm.emit()"
-    >
-      <ods-users-icon icon />
-    </ods-button>
-  </ng-template>
-
-  <ng-container *ngIf="isRequestFormVisible; else anfrageErstellenButton">
-    <alfa-collaboration-request-form
-      data-test-id="collaboration-request-form"
+<ng-container *ngIf="collaborationStateListResource.resource | hasLink: collaborationListLinkRel.CREATE_COLLABORATION_REQUEST">
+  <div
+    [ngClass]="{
+      'flex flex-1 flex-col gap-6 xl:flex-row': showOrganisationsEinheitAnfrageButton && showExterneFachstelleAnfrageButton,
+    }"
+  >
+    <alfa-organisations-einheit-container
+      class="flex flex-1 flex-col"
+      *ngIf="showOrganisationsEinheitAnfrageButton"
+      data-test-id="organisations-einheit-container"
+      [vorgang]="vorgang"
       [collaborationListResource]="collaborationStateListResource.resource"
-      (hide)="hideRequestForm.emit()"
-      (showResult)="setCollaboration($event)"
-    ></alfa-collaboration-request-form>
-  </ng-container>
-</ng-container>
-<ng-container *ngIf="collaboration">
-  <div data-test-id="collaboration-request-result">
-    <div class="flex items-center gap-3">
-      <ods-office-icon size="large" class="fill-text" />
-      <alfa-organisations-einheit
-        [organisationsEinheitResource]="organisationsEinheit"
-      ></alfa-organisations-einheit>
-    </div>
-    <h4 class="my-6 text-xl font-medium">{{ collaboration.titel }}</h4>
-    <p class="text-base">{{ collaboration.anfrage }}</p>
+    ></alfa-organisations-einheit-container>
+    <alfa-externe-fachstelle-container
+      class="flex flex-1 flex-col"
+      *ngIf="showExterneFachstelleAnfrageButton"
+      data-test-id="externe-fachstelle-container"
+      [vorgang]="vorgang"
+      [collaborationListResource]="collaborationStateListResource.resource"
+    ></alfa-externe-fachstelle-container>
   </div>
 </ng-container>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.spec.ts
index ab7493dc471343f302d5f6053f5dff6dc20057da..ba3837f2c82b22b05299684c891cf0686b9de804 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.spec.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.spec.ts
@@ -1,54 +1,39 @@
-import {
-  Collaboration,
-  CollaborationListLinkRel,
-  CollaborationListResource,
-} from '@alfa-client/collaboration-shared';
+import { CollaborationListLinkRel, CollaborationListResource } from '@alfa-client/collaboration-shared';
 import { HasLinkPipe, createStateResource } from '@alfa-client/tech-shared';
-import {
-  EventData,
-  dispatchEventFromFixture,
-  existsAsHtmlElement,
-  getMockComponent,
-  notExistsAsHtmlElement,
-  triggerEvent,
-} from '@alfa-client/test-utils';
+import { existsAsHtmlElement, getMockComponent, notExistsAsHtmlElement } from '@alfa-client/test-utils';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ButtonComponent, OfficeIconComponent, UsersIconComponent } from '@ods/system';
-import {
-  createCollaboration,
-  createCollaborationListResource,
-} from 'libs/collaboration-shared/test/collaboration';
-import { getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createCollaborationListResource } from 'libs/collaboration-shared/test/collaboration';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
-import { CollaborationRequestFormComponent } from '../collaboration-request-form/collaboration-request-form.component';
-import { OrganisationsEinheitComponent } from '../collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component';
 import { CollaborationInVorgangComponent } from './collaboration-in-vorgang.component';
+import { ExterneFachstelleContainerComponent } from './externe-fachstelle-container/externe-fachstelle-container.component';
+import { OrganisationsEinheitContainerComponent } from './organisations-einheit-container/organisations-einheit-container.component';
 
 describe('CollaborationInVorgangComponent', () => {
   let component: CollaborationInVorgangComponent;
   let fixture: ComponentFixture<CollaborationInVorgangComponent>;
 
-  const anfrageErstellenButton: string = getDataTestIdAttributeOf('anfrage-erstellen-button');
-  const collaborationRequestForm: string = getDataTestIdOf('collaboration-request-form');
-  const collaborationRequestResult: string = getDataTestIdOf('collaboration-request-result');
+  const externeFachstelleContainer: string = getDataTestIdOf('externe-fachstelle-container');
+  const organisationsEinheitContainer: string = getDataTestIdOf('organisations-einheit-container');
 
   const collaborationListResource: CollaborationListResource = createCollaborationListResource();
+  const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource();
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       declarations: [
         CollaborationInVorgangComponent,
         HasLinkPipe,
-        MockComponent(ButtonComponent),
-        MockComponent(CollaborationRequestFormComponent),
-        MockComponent(UsersIconComponent),
-        MockComponent(OfficeIconComponent),
-        MockComponent(OrganisationsEinheitComponent),
+        MockComponent(OrganisationsEinheitContainerComponent),
+        MockComponent(ExterneFachstelleContainerComponent),
       ],
     }).compileComponents();
 
     fixture = TestBed.createComponent(CollaborationInVorgangComponent);
     component = fixture.componentInstance;
+    component.vorgang = vorgang;
     component.collaborationStateListResource = createStateResource(collaborationListResource);
     fixture.detectChanges();
   });
@@ -57,133 +42,125 @@ describe('CollaborationInVorgangComponent', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('if create collaboration request link exists', () => {
-    const collaborationListResourceWithLink: CollaborationListResource =
-      createCollaborationListResource([CollaborationListLinkRel.CREATE_COLLABORATION_REQUEST]);
-    beforeEach(() => {
-      component.collaborationStateListResource = createStateResource(
-        collaborationListResourceWithLink,
-      );
-      fixture.detectChanges();
-    });
+  describe('template', () => {
+    describe('on createCollaborationRequest link', () => {
+      describe('exists', () => {
+        const collaborationListResourceWithLink: CollaborationListResource = createCollaborationListResource([
+          CollaborationListLinkRel.CREATE_COLLABORATION_REQUEST,
+        ]);
 
-    describe('anfrage erstellen button', () => {
-      describe('on request form visibility false', () => {
         beforeEach(() => {
-          component.isRequestFormVisible = false;
-        });
-
-        it('should be shown', () => {
+          component.collaborationStateListResource = createStateResource(collaborationListResourceWithLink);
           fixture.detectChanges();
-
-          existsAsHtmlElement(fixture, anfrageErstellenButton);
         });
 
-        it('should call service on click', () => {
-          fixture.detectChanges();
-          const showRequestFormSpy: jest.SpyInstance = (component.showRequestForm.emit = jest.fn());
+        describe('and organisations einheit', () => {
+          describe('is visible', () => {
+            beforeEach(() => {
+              component.showOrganisationsEinheitAnfrageButton = true;
+              fixture.detectChanges();
+            });
+
+            it('should show component', () => {
+              existsAsHtmlElement(fixture, organisationsEinheitContainer);
+            });
+
+            describe('component should be called with', () => {
+              it('vorgang', () => {
+                const comp: OrganisationsEinheitContainerComponent = getMockComponent<OrganisationsEinheitContainerComponent>(
+                  fixture,
+                  OrganisationsEinheitContainerComponent,
+                );
+
+                expect(comp.vorgang).toBe(vorgang);
+              });
+              it('collaborationListResource', () => {
+                const comp: OrganisationsEinheitContainerComponent = getMockComponent<OrganisationsEinheitContainerComponent>(
+                  fixture,
+                  OrganisationsEinheitContainerComponent,
+                );
+
+                expect(comp.collaborationListResource).toBe(collaborationListResourceWithLink);
+              });
+            });
+          });
 
-          dispatchEventFromFixture(fixture, anfrageErstellenButton, 'clickEmitter');
+          describe('is not visible', () => {
+            beforeEach(() => {
+              component.showOrganisationsEinheitAnfrageButton = false;
+              fixture.detectChanges();
+            });
 
-          expect(showRequestFormSpy).toHaveBeenCalled();
+            it('should hide component', () => {
+              notExistsAsHtmlElement(fixture, organisationsEinheitContainer);
+            });
+          });
         });
-      });
 
-      it('should be hidden if request form visibility is true', () => {
-        component.isRequestFormVisible = true;
+        describe('and externe fachstelle', () => {
+          describe('is visible', () => {
+            beforeEach(() => {
+              component.showExterneFachstelleAnfrageButton = true;
+              fixture.detectChanges();
+            });
+
+            it('should show component', () => {
+              existsAsHtmlElement(fixture, externeFachstelleContainer);
+            });
+
+            describe('component should be called with', () => {
+              it('vorgang', () => {
+                const comp: ExterneFachstelleContainerComponent = getMockComponent<ExterneFachstelleContainerComponent>(
+                  fixture,
+                  ExterneFachstelleContainerComponent,
+                );
+
+                expect(comp.vorgang).toBe(vorgang);
+              });
+              it('collaborationListResource', () => {
+                const comp: ExterneFachstelleContainerComponent = getMockComponent<ExterneFachstelleContainerComponent>(
+                  fixture,
+                  ExterneFachstelleContainerComponent,
+                );
+
+                expect(comp.collaborationListResource).toBe(collaborationListResourceWithLink);
+              });
+            });
+          });
 
-        fixture.detectChanges();
+          describe('is not visible', () => {
+            beforeEach(() => {
+              component.showExterneFachstelleAnfrageButton = false;
+              fixture.detectChanges();
+            });
 
-        notExistsAsHtmlElement(fixture, anfrageErstellenButton);
+            it('should hide component', () => {
+              notExistsAsHtmlElement(fixture, externeFachstelleContainer);
+            });
+          });
+        });
       });
-    });
 
-    describe('zustaendige stelle', () => {
-      describe('on request form visibility true', () => {
+      describe('not exists', () => {
+        const collaborationListResource: CollaborationListResource = createCollaborationListResource();
+
         beforeEach(() => {
-          component.isRequestFormVisible = true;
-        });
-        it('should be shown', () => {
+          component.collaborationStateListResource = createStateResource(collaborationListResource);
           fixture.detectChanges();
-
-          existsAsHtmlElement(fixture, collaborationRequestForm);
         });
 
-        describe('component', () => {
-          it('should call service on hideFormular output', () => {
-            fixture.detectChanges();
-            const hideRequestFormSpy: jest.SpyInstance = (component.hideRequestForm.emit =
-              jest.fn());
-
-            dispatchEventFromFixture(fixture, collaborationRequestForm, 'hide');
-
-            expect(hideRequestFormSpy).toHaveBeenCalled();
-          });
-
-          it('should call set collaboration on showResult output', () => {
-            fixture.detectChanges();
-            component.setCollaboration = jest.fn();
-            const collaboration: Collaboration = createCollaboration();
-
-            const eventData: EventData<CollaborationInVorgangComponent> = {
-              fixture,
-              elementSelector: collaborationRequestForm,
-              name: 'showResult',
-              data: collaboration,
-            };
-            triggerEvent(eventData);
-
-            expect(component.setCollaboration).toHaveBeenCalledWith(collaboration);
-          });
-
-          it('should be called with', () => {
-            fixture.detectChanges();
+        it('should hide externe fachstelle component', () => {
+          fixture.detectChanges();
 
-            const comp: CollaborationRequestFormComponent =
-              getMockComponent<CollaborationRequestFormComponent>(
-                fixture,
-                CollaborationRequestFormComponent,
-              );
-            expect(comp.collaborationListResource).toBe(collaborationListResourceWithLink);
-          });
+          notExistsAsHtmlElement(fixture, externeFachstelleContainer);
         });
-      });
-
-      it('should be hidden if request form visibility is false', () => {
-        component.isRequestFormVisible = false;
 
-        fixture.detectChanges();
+        it('should hide organisations einheit component', () => {
+          fixture.detectChanges();
 
-        notExistsAsHtmlElement(fixture, collaborationRequestForm);
+          notExistsAsHtmlElement(fixture, externeFachstelleContainer);
+        });
       });
     });
   });
-
-  describe('on existing collaboration', () => {
-    it('should show result', () => {
-      component.collaboration = createCollaboration();
-
-      fixture.detectChanges();
-
-      existsAsHtmlElement(fixture, collaborationRequestResult);
-    });
-  });
-
-  describe('set collaboration', () => {
-    const collaboration: Collaboration = createCollaboration();
-
-    it('should set attribute', () => {
-      component.setCollaboration(collaboration);
-
-      expect(component.collaboration).toBe(collaboration);
-    });
-
-    it('should call emitter', () => {
-      const hideRequestFormEmitSpy: jest.SpyInstance = (component.hideRequestForm.emit = jest.fn());
-
-      component.setCollaboration(collaboration);
-
-      expect(hideRequestFormEmitSpy).toBeCalled();
-    });
-  });
 });
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.ts
index 3216f10156d4e4506b3a028a833700a04b4eb96b..b6685d289011d6a16c1336038af6f536d4fc43c8 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component.ts
@@ -1,30 +1,17 @@
-import {
-  Collaboration,
-  CollaborationListLinkRel,
-  CollaborationListResource,
-  OrganisationsEinheitResource,
-} from '@alfa-client/collaboration-shared';
+import { CollaborationListLinkRel, CollaborationListResource } from '@alfa-client/collaboration-shared';
 import { StateResource } from '@alfa-client/tech-shared';
-import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Input } from '@angular/core';
 
 @Component({
   selector: 'alfa-collaboration-in-vorgang',
   templateUrl: './collaboration-in-vorgang.component.html',
 })
 export class CollaborationInVorgangComponent {
+  @Input() public vorgang: VorgangWithEingangResource;
   @Input() public collaborationStateListResource: StateResource<CollaborationListResource>;
-  @Input() public isRequestFormVisible: boolean;
-  @Input() public organisationsEinheit: OrganisationsEinheitResource;
-
-  @Output() public readonly showRequestForm: EventEmitter<void> = new EventEmitter<void>();
-  @Output() public readonly hideRequestForm: EventEmitter<void> = new EventEmitter<void>();
+  @Input() public showOrganisationsEinheitAnfrageButton: boolean;
+  @Input() public showExterneFachstelleAnfrageButton: boolean;
 
   public readonly collaborationListLinkRel = CollaborationListLinkRel;
-
-  public collaboration: Collaboration;
-
-  public setCollaboration(collaboration: Collaboration) {
-    this.collaboration = collaboration;
-    this.hideRequestForm.emit();
-  }
 }
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..6cba5c87759822517c618a393d7534359027e339
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.html
@@ -0,0 +1,22 @@
+<ng-container *ngIf="isFormVisible$ | async; else anfrageErstellenButton">
+  <alfa-search-externe-fachstelle-container
+    *ngIf="vorgang | hasLink: vorgangLinkRel.SEARCH_EXTERNE_FACHSTELLE"
+    data-test-id="search-externe-fachstelle-container"
+    [fieldControl]="formService.form.controls.zustaendigeStelle"
+  ></alfa-search-externe-fachstelle-container>
+  <alfa-collaboration-request-form
+    data-test-id="collaboration-request-form"
+    [collaborationListResource]="collaborationListResource"
+    (abbrechen)="hideForm()"
+  ></alfa-collaboration-request-form>
+</ng-container>
+<ng-template #anfrageErstellenButton>
+  <div class="flex flex-1 gap-3 border border-grayborder bg-background-100 p-4 shadow shadow-grayborder">
+    <ods-external-unit-icon />
+    <div class="flex flex-1 flex-col text-base">
+      <p class="text-primary">Externe Fachstelle</p>
+      <p class="text-text">Private Organisation, Verein, Schule</p>
+    </div>
+    <alfa-anfrage-erstellen-button data-test-id="externe-fachstelle-anfrage-erstellen-button" (clickEmitter)="showForm()" />
+  </div>
+</ng-template>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2770d0fb9d618c8e139b9cf4131ec33c9667869c
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.spec.ts
@@ -0,0 +1,204 @@
+import { CollaborationListResource } from '@alfa-client/collaboration-shared';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import {
+  Mock,
+  dispatchEventFromFixture,
+  existsAsHtmlElement,
+  getMockComponent,
+  mock,
+  notExistsAsHtmlElement,
+  useFromMock,
+} from '@alfa-client/test-utils';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { SearchExterneFachstelleContainerComponent } from '@alfa-client/zustaendige-stelle';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { ExternalUnitIconComponent } from '@ods/system';
+import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
+import { createCollaborationListResource } from 'libs/collaboration-shared/test/collaboration';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { CollaborationRequestFormComponent } from '../../collaboration-request-form/collaboration-request-form.component';
+import { CollaborationRequestFormService } from '../../collaboration-request-form/collaboration.request.formservice';
+import { AnfrageErstellenButtonComponent } from '../anfrage-erstellen-button/anfrage-erstellen-button.component';
+import { ExterneFachstelleContainerComponent } from './externe-fachstelle-container.component';
+
+describe('ExterneFachstelleContainerComponent', () => {
+  let component: ExterneFachstelleContainerComponent;
+  let fixture: ComponentFixture<ExterneFachstelleContainerComponent>;
+
+  const anfrageErstellenButton: string = getDataTestIdOf('externe-fachstelle-anfrage-erstellen-button');
+  const collaborationRequestForm: string = getDataTestIdOf('collaboration-request-form');
+  const searchExterneFachstelleContainer: string = getDataTestIdOf('search-externe-fachstelle-container');
+
+  let formService: CollaborationRequestFormService;
+  let service: Mock<CollaborationService>;
+
+  const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource();
+  const collaborationListResource: CollaborationListResource = createCollaborationListResource();
+
+  beforeEach(async () => {
+    formService = new CollaborationRequestFormService(new FormBuilder(), useFromMock(mock(CollaborationService)));
+    service = mock(CollaborationService);
+    TestBed.overrideComponent(CollaborationRequestFormComponent, {
+      set: {
+        providers: [
+          {
+            provide: CollaborationRequestFormService,
+            useValue: formService,
+          },
+        ],
+      },
+    });
+    await TestBed.configureTestingModule({
+      declarations: [
+        ExterneFachstelleContainerComponent,
+        HasLinkPipe,
+        MockComponent(SearchExterneFachstelleContainerComponent),
+        MockComponent(CollaborationRequestFormComponent),
+        MockComponent(AnfrageErstellenButtonComponent),
+        MockComponent(ExternalUnitIconComponent),
+      ],
+      providers: [
+        {
+          provide: CollaborationRequestFormService,
+          useValue: formService,
+        },
+        {
+          provide: CollaborationService,
+          useValue: service,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ExterneFachstelleContainerComponent);
+    component = fixture.componentInstance;
+    component.vorgang = vorgang;
+    component.collaborationListResource = collaborationListResource;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('ngOnInit', () => {
+    it('should call service to get form visibility', () => {
+      component.ngOnInit();
+
+      expect(service.isExterneFachstelleFormVisible).toHaveBeenCalled();
+    });
+  });
+
+  describe('ngOnDestroy', () => {
+    it('should call hideForm', () => {
+      component.hideForm = jest.fn();
+
+      component.ngOnDestroy();
+
+      expect(component.hideForm).toHaveBeenCalled();
+    });
+  });
+
+  describe('hideForm', () => {
+    it('should call service to hide form', () => {
+      component.hideForm();
+
+      expect(service.hideExterneFachstelleForm).toHaveBeenCalled();
+    });
+
+    it.skip('FIXME should call formService to reset values', () => {
+      component.hideForm();
+
+      expect(formService.reset).toHaveBeenCalled();
+    });
+  });
+
+  describe('showForm', () => {
+    it('should call service', () => {
+      component.showForm();
+
+      expect(service.showExterneFachstelleForm).toHaveBeenCalled();
+    });
+  });
+
+  describe('template', () => {
+    describe('on shown form', () => {
+      beforeEach(() => {
+        component.isFormVisible$ = of(true);
+        fixture.detectChanges();
+      });
+
+      it('anfrage button should be hidden', () => {
+        notExistsAsHtmlElement(fixture, anfrageErstellenButton);
+      });
+
+      describe('request form', () => {
+        it('should be visible', () => {
+          existsAsHtmlElement(fixture, collaborationRequestForm);
+        });
+
+        describe('component', () => {
+          it('should be called with collaborationListResource', () => {
+            const comp: CollaborationRequestFormComponent = getMockComponent<CollaborationRequestFormComponent>(
+              fixture,
+              CollaborationRequestFormComponent,
+            );
+            expect(comp.collaborationListResource).toBe(collaborationListResource);
+          });
+
+          it('should call hideForm on abbrechen output', () => {
+            component.hideForm = jest.fn();
+
+            dispatchEventFromFixture(fixture, collaborationRequestForm, 'abbrechen');
+
+            expect(component.hideForm).toHaveBeenCalled();
+          });
+        });
+      });
+
+      describe('and search link exists', () => {
+        beforeEach(() => {
+          component.vorgang = createVorgangWithEingangResource([VorgangWithEingangLinkRel.SEARCH_EXTERNE_FACHSTELLE]);
+          fixture.detectChanges();
+        });
+
+        it('search externe fachstelle component should be visible', () => {
+          existsAsHtmlElement(fixture, searchExterneFachstelleContainer);
+        });
+      });
+
+      describe('and search link is NOT exists', () => {
+        beforeEach(() => {
+          component.vorgang = createVorgangWithEingangResource();
+          fixture.detectChanges();
+        });
+        it('search externe fachstelle component should be hidden', () => {
+          notExistsAsHtmlElement(fixture, searchExterneFachstelleContainer);
+        });
+      });
+    });
+
+    describe('on hidden form', () => {
+      beforeEach(() => {
+        component.isFormVisible$ = of(false);
+        fixture.detectChanges();
+      });
+      describe('anfrage erstellen button', () => {
+        it('should be visible', () => {
+          existsAsHtmlElement(fixture, anfrageErstellenButton);
+        });
+
+        it('should call showForm on click output', () => {
+          component.showForm = jest.fn();
+
+          dispatchEventFromFixture(fixture, anfrageErstellenButton, 'clickEmitter');
+
+          expect(component.showForm).toHaveBeenCalled();
+        });
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..025455d739cbe39f5ac2fa96aa751eb73042c31a
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component.ts
@@ -0,0 +1,42 @@
+import { CollaborationListResource } from '@alfa-client/collaboration-shared';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Input } from '@angular/core';
+import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
+import { Observable } from 'rxjs';
+import { CollaborationRequestFormService } from '../../collaboration-request-form/collaboration.request.formservice';
+
+@Component({
+  selector: 'alfa-externe-fachstelle-container',
+  templateUrl: './externe-fachstelle-container.component.html',
+  providers: [CollaborationRequestFormService],
+})
+export class ExterneFachstelleContainerComponent {
+  @Input() public vorgang: VorgangWithEingangResource;
+  @Input() public collaborationListResource: CollaborationListResource;
+
+  public isFormVisible$: Observable<boolean>;
+
+  public readonly vorgangLinkRel = VorgangWithEingangLinkRel;
+
+  constructor(
+    public service: CollaborationService,
+    public formService: CollaborationRequestFormService,
+  ) {}
+
+  ngOnInit(): void {
+    this.isFormVisible$ = this.service.isExterneFachstelleFormVisible();
+  }
+
+  ngOnDestroy(): void {
+    this.hideForm();
+  }
+
+  public hideForm(): void {
+    this.service.hideExterneFachstelleForm();
+    this.formService.reset();
+  }
+
+  public showForm(): void {
+    this.service.showExterneFachstelleForm();
+  }
+}
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..c0fbb4fd42809f2ab44f3b3ceb4a6bfdfd89bacd
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.html
@@ -0,0 +1,22 @@
+<ng-container *ngIf="isFormVisible$ | async; else anfrageErstellenButton">
+  <alfa-search-organisations-einheit-container
+    *ngIf="vorgang | hasLink: vorgangLinkRel.SEARCH_ORGANISATIONS_EINHEIT"
+    data-test-id="search-organisations-einheit-container"
+    [fieldControl]="formService.form.controls.zustaendigeStelle"
+  ></alfa-search-organisations-einheit-container>
+  <alfa-collaboration-request-form
+    data-test-id="collaboration-request-form"
+    [collaborationListResource]="collaborationListResource"
+    (abbrechen)="hideForm()"
+  ></alfa-collaboration-request-form>
+</ng-container>
+<ng-template #anfrageErstellenButton>
+  <div class="flex flex-1 gap-3 border border-grayborder bg-background-100 bg-background-100 p-4 p-4 shadow shadow-grayborder">
+    <ods-public-administration-icon />
+    <div class="flex flex-1 flex-col text-base">
+      <p class="text-primary">Öffentliche Verwaltung</p>
+      <p class="text-text">Kommune, Amt, Ministerium</p>
+    </div>
+    <alfa-anfrage-erstellen-button data-test-id="organisations-einheit-anfrage-erstellen-button" (clickEmitter)="showForm()" />
+  </div>
+</ng-template>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..db074ea7b2b912cf078df24749c72831b6935ba7
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.spec.ts
@@ -0,0 +1,204 @@
+import { CollaborationListResource } from '@alfa-client/collaboration-shared';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import {
+  dispatchEventFromFixture,
+  existsAsHtmlElement,
+  getMockComponent,
+  mock,
+  Mock,
+  notExistsAsHtmlElement,
+  useFromMock,
+} from '@alfa-client/test-utils';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { SearchOrganisationsEinheitContainerComponent } from '@alfa-client/zustaendige-stelle';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { PublicAdministrationIconComponent } from '@ods/system';
+import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
+import { createCollaborationListResource } from 'libs/collaboration-shared/test/collaboration';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { CollaborationRequestFormComponent } from '../../collaboration-request-form/collaboration-request-form.component';
+import { CollaborationRequestFormService } from '../../collaboration-request-form/collaboration.request.formservice';
+import { AnfrageErstellenButtonComponent } from '../anfrage-erstellen-button/anfrage-erstellen-button.component';
+import { OrganisationsEinheitContainerComponent } from './organisations-einheit-container.component';
+
+describe('OrganisationsEinheitContainerComponent', () => {
+  let component: OrganisationsEinheitContainerComponent;
+  let fixture: ComponentFixture<OrganisationsEinheitContainerComponent>;
+
+  const anfrageErstellenButton: string = getDataTestIdOf('organisations-einheit-anfrage-erstellen-button');
+  const collaborationRequestForm: string = getDataTestIdOf('collaboration-request-form');
+  const searchOrganisationsEinheitContainer: string = getDataTestIdOf('search-organisations-einheit-container');
+
+  let formService: CollaborationRequestFormService;
+  let service: Mock<CollaborationService>;
+
+  const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource();
+  const collaborationListResource: CollaborationListResource = createCollaborationListResource();
+
+  beforeEach(async () => {
+    formService = new CollaborationRequestFormService(new FormBuilder(), useFromMock(mock(CollaborationService)));
+    service = mock(CollaborationService);
+    TestBed.overrideComponent(CollaborationRequestFormComponent, {
+      set: {
+        providers: [
+          {
+            provide: CollaborationRequestFormService,
+            useValue: formService,
+          },
+        ],
+      },
+    });
+    await TestBed.configureTestingModule({
+      declarations: [
+        OrganisationsEinheitContainerComponent,
+        HasLinkPipe,
+        MockComponent(SearchOrganisationsEinheitContainerComponent),
+        MockComponent(CollaborationRequestFormComponent),
+        MockComponent(AnfrageErstellenButtonComponent),
+        MockComponent(PublicAdministrationIconComponent),
+      ],
+      providers: [
+        {
+          provide: CollaborationRequestFormService,
+          useValue: formService,
+        },
+        {
+          provide: CollaborationService,
+          useValue: service,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(OrganisationsEinheitContainerComponent);
+    component = fixture.componentInstance;
+    component.vorgang = vorgang;
+    component.collaborationListResource = collaborationListResource;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('ngOnInit', () => {
+    it('should call service to get form visibility', () => {
+      component.ngOnInit();
+
+      expect(service.isOrganisationsEinheitFormVisible).toHaveBeenCalled();
+    });
+  });
+
+  describe('ngOnDestroy', () => {
+    it('should call hideForm', () => {
+      component.hideForm = jest.fn();
+
+      component.ngOnDestroy();
+
+      expect(component.hideForm).toHaveBeenCalled();
+    });
+  });
+
+  describe('hideForm', () => {
+    it('should call service to hide form', () => {
+      component.hideForm();
+
+      expect(service.hideOrganisationseinheitForm).toHaveBeenCalled();
+    });
+
+    it.skip('FIXME should call formService to reset values', () => {
+      component.hideForm();
+
+      expect(formService.reset).toHaveBeenCalled();
+    });
+  });
+
+  describe('showForm', () => {
+    it('should call service', () => {
+      component.showForm();
+
+      expect(service.showOrganisationsEinheitForm).toHaveBeenCalled();
+    });
+  });
+
+  describe('template', () => {
+    describe('on shown form', () => {
+      beforeEach(() => {
+        component.isFormVisible$ = of(true);
+        fixture.detectChanges();
+      });
+
+      it('anfrage button should be hidden', () => {
+        notExistsAsHtmlElement(fixture, anfrageErstellenButton);
+      });
+
+      describe('request form', () => {
+        it('should be visible', () => {
+          existsAsHtmlElement(fixture, collaborationRequestForm);
+        });
+
+        describe('component', () => {
+          it('should be called with collaborationListResource', () => {
+            const comp: CollaborationRequestFormComponent = getMockComponent<CollaborationRequestFormComponent>(
+              fixture,
+              CollaborationRequestFormComponent,
+            );
+            expect(comp.collaborationListResource).toBe(collaborationListResource);
+          });
+
+          it('should call hideForm on abbrechen output', () => {
+            component.hideForm = jest.fn();
+
+            dispatchEventFromFixture(fixture, collaborationRequestForm, 'abbrechen');
+
+            expect(component.hideForm).toHaveBeenCalled();
+          });
+        });
+      });
+
+      describe('and search link exists', () => {
+        beforeEach(() => {
+          component.vorgang = createVorgangWithEingangResource([VorgangWithEingangLinkRel.SEARCH_ORGANISATIONS_EINHEIT]);
+          fixture.detectChanges();
+        });
+
+        it('search organisations einheit component should be visible', () => {
+          existsAsHtmlElement(fixture, searchOrganisationsEinheitContainer);
+        });
+      });
+
+      describe('and search link is NOT exists', () => {
+        beforeEach(() => {
+          component.vorgang = createVorgangWithEingangResource();
+          fixture.detectChanges();
+        });
+        it('search organisations einheit component should be hidden', () => {
+          notExistsAsHtmlElement(fixture, searchOrganisationsEinheitContainer);
+        });
+      });
+    });
+
+    describe('on hidden form', () => {
+      beforeEach(() => {
+        component.isFormVisible$ = of(false);
+        fixture.detectChanges();
+      });
+      describe('anfrage erstellen button', () => {
+        it('should be visible', () => {
+          existsAsHtmlElement(fixture, anfrageErstellenButton);
+        });
+
+        it('should call showForm on click output', () => {
+          component.showForm = jest.fn();
+
+          dispatchEventFromFixture(fixture, anfrageErstellenButton, 'clickEmitter');
+
+          expect(component.showForm).toHaveBeenCalled();
+        });
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a76dd254321135bd414b66efc13e5c80f276574
--- /dev/null
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component.ts
@@ -0,0 +1,42 @@
+import { CollaborationListResource } from '@alfa-client/collaboration-shared';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, Input, OnDestroy, OnInit } from '@angular/core';
+import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
+import { Observable } from 'rxjs';
+import { CollaborationRequestFormService } from '../../collaboration-request-form/collaboration.request.formservice';
+
+@Component({
+  selector: 'alfa-organisations-einheit-container',
+  templateUrl: './organisations-einheit-container.component.html',
+  providers: [CollaborationRequestFormService],
+})
+export class OrganisationsEinheitContainerComponent implements OnInit, OnDestroy {
+  @Input() public vorgang: VorgangWithEingangResource;
+  @Input() public collaborationListResource: CollaborationListResource;
+
+  public isFormVisible$: Observable<boolean>;
+
+  public readonly vorgangLinkRel = VorgangWithEingangLinkRel;
+
+  constructor(
+    public service: CollaborationService,
+    public formService: CollaborationRequestFormService,
+  ) {}
+
+  ngOnInit(): void {
+    this.isFormVisible$ = this.service.isOrganisationsEinheitFormVisible();
+  }
+
+  ngOnDestroy(): void {
+    this.hideForm();
+  }
+
+  public hideForm(): void {
+    this.service.hideOrganisationseinheitForm();
+    this.formService.reset();
+  }
+
+  public showForm(): void {
+    this.service.showOrganisationsEinheitForm();
+  }
+}
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.html
index bbb5fd59fc99d36e5f449e35d879bdc5b50bde88..231014281929086791b7e4c5265852238182a5ea 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.html
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.html
@@ -1,16 +1,8 @@
-<alfa-organisations-einheit-container
-  [fieldControl]="formService.form.controls.zustaendigeStelle"
-></alfa-organisations-einheit-container>
-
 <form [formGroup]="formService.form" class="mt-4 flex flex-col gap-2">
-  <ods-text-editor
-    label="Titel"
-    [formControlName]="formServiceClass.FIELD_TITLE"
-    [isRequired]="true"
-  ></ods-text-editor>
+  <ods-text-editor label="Titel" [formControlName]="formServiceClass.FIELD_TITEL" [isRequired]="true"></ods-text-editor>
   <ods-textarea-editor
-    label="Nachricht"
-    [formControlName]="formServiceClass.FIELD_NACHRICHT"
+    label="Beschreibung"
+    [formControlName]="formServiceClass.FIELD_BESCHREIBUNG"
     [isRequired]="true"
   ></ods-textarea-editor>
 </form>
@@ -27,7 +19,7 @@
     variant="outline"
     text="Abbrechen"
     dataTestId="collaboration-request-cancel-button"
-    (clickEmitter)="hide.emit()"
+    (clickEmitter)="abbrechen.emit()"
   >
     <ods-close-icon icon class="fill-primary"></ods-close-icon>
   </ods-button>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.spec.ts
index 0ec28ea4c355c960aeb9be676a5ef47cd6026814..c6afc4f1d8ce8bbe019c5a6ad1c1a70bf4f91255 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.spec.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.spec.ts
@@ -1,19 +1,10 @@
 import { CollaborationListResource } from '@alfa-client/collaboration-shared';
 import { CommandLinkRel, CommandResource } from '@alfa-client/command-shared';
 import { StateResource, createStateResource } from '@alfa-client/tech-shared';
-import {
-  dispatchEventFromFixture,
-  getMockComponent,
-  mock,
-  useFromMock,
-} from '@alfa-client/test-utils';
+import { dispatchEventFromFixture, getMockComponent, mock, useFromMock } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
-import {
-  ButtonWithSpinnerComponent,
-  TextEditorComponent,
-  TextareaEditorComponent,
-} from '@ods/component';
+import { ButtonWithSpinnerComponent, TextEditorComponent, TextareaEditorComponent } from '@ods/component';
 import { ButtonComponent, CloseIconComponent } from '@ods/system';
 import { CollaborationService } from 'libs/collaboration-shared/src/lib/collaboration.service';
 import { createCollaborationListResource } from 'libs/collaboration-shared/test/collaboration';
@@ -24,7 +15,6 @@ import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
 import { CollaborationRequestFormComponent } from './collaboration-request-form.component';
 import { CollaborationRequestFormService } from './collaboration.request.formservice';
-import { OrganisationsEinheitContainerComponent } from './organisations-einheit-container/organisations-einheit-container.component';
 
 describe('CollaborationRequestFormComponent', () => {
   let component: CollaborationRequestFormComponent;
@@ -35,14 +25,10 @@ describe('CollaborationRequestFormComponent', () => {
 
   let formService: CollaborationRequestFormService;
 
-  const stateCommandResource: StateResource<CommandResource> =
-    createStateResource(createCommandResource());
+  const stateCommandResource: StateResource<CommandResource> = createStateResource(createCommandResource());
 
   beforeEach(async () => {
-    formService = new CollaborationRequestFormService(
-      new FormBuilder(),
-      useFromMock(mock(CollaborationService)),
-    );
+    formService = new CollaborationRequestFormService(new FormBuilder(), useFromMock(mock(CollaborationService)));
     TestBed.overrideComponent(CollaborationRequestFormComponent, {
       set: {
         providers: [
@@ -62,7 +48,6 @@ describe('CollaborationRequestFormComponent', () => {
         MockComponent(CloseIconComponent),
         MockComponent(TextEditorComponent),
         MockComponent(TextareaEditorComponent),
-        MockComponent(OrganisationsEinheitContainerComponent),
       ],
       providers: [
         {
@@ -82,11 +67,11 @@ describe('CollaborationRequestFormComponent', () => {
 
   describe('cancel button', () => {
     it('should emit hideRequestForm', () => {
-      const emitSpy: jest.SpyInstance = (component.hide.emit = jest.fn());
+      component.abbrechen.emit = jest.fn();
 
       dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter');
 
-      expect(emitSpy).toHaveBeenCalled();
+      expect(component.abbrechen.emit).toHaveBeenCalled();
     });
   });
 
@@ -97,8 +82,10 @@ describe('CollaborationRequestFormComponent', () => {
 
         fixture.detectChanges();
 
-        const submitButtonComp: ButtonWithSpinnerComponent =
-          getMockComponent<ButtonWithSpinnerComponent>(fixture, ButtonWithSpinnerComponent);
+        const submitButtonComp: ButtonWithSpinnerComponent = getMockComponent<ButtonWithSpinnerComponent>(
+          fixture,
+          ButtonWithSpinnerComponent,
+        );
         expect(submitButtonComp.stateResource).toBe(stateCommandResource);
       });
     });
@@ -134,9 +121,7 @@ describe('CollaborationRequestFormComponent', () => {
     beforeEach(() => {
       formService.submit = jest
         .fn()
-        .mockReturnValue(
-          of(createStateResource(createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]))),
-        );
+        .mockReturnValue(of(createStateResource(createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]))));
     });
 
     it('should call formService', () => {
@@ -148,11 +133,11 @@ describe('CollaborationRequestFormComponent', () => {
     });
 
     it('should emit show result', () => {
-      const showResultSpy: jest.SpyInstance = (component.showResult.emit = jest.fn());
+      component.showResult.emit = jest.fn();
 
       component.doSubmit().subscribe();
 
-      expect(showResultSpy).toHaveBeenCalledWith(formService.form.value);
+      expect(component.showResult.emit).toHaveBeenCalledWith(formService.form.value);
     });
 
     it('should return value', () => {
@@ -165,8 +150,7 @@ describe('CollaborationRequestFormComponent', () => {
   describe('set collaboration list resource', () => {
     it('should call set list resource on formService', () => {
       formService.setListResource = jest.fn();
-      const collaborationListResource: CollaborationListResource =
-        createCollaborationListResource();
+      const collaborationListResource: CollaborationListResource = createCollaborationListResource();
 
       component.collaborationListResource = collaborationListResource;
 
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.ts
index d78bb1da55f8ffcb8d3364ce11ef6aff6573aad4..36fabdc2f2ec25a404005de60ec512640d1cd04e 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component.ts
@@ -8,21 +8,16 @@ import { CollaborationRequestFormService } from './collaboration.request.formser
 @Component({
   selector: 'alfa-collaboration-request-form',
   templateUrl: './collaboration-request-form.component.html',
-  providers: [CollaborationRequestFormService],
 })
 export class CollaborationRequestFormComponent {
-  @Output() public hide: EventEmitter<void> = new EventEmitter<void>();
+  @Output() public abbrechen: EventEmitter<void> = new EventEmitter<void>();
   @Output() public showResult: EventEmitter<Collaboration> = new EventEmitter<Collaboration>();
 
-  @Input() public set collaborationListResource(
-    collaborationListResource: CollaborationListResource,
-  ) {
+  @Input() public set collaborationListResource(collaborationListResource: CollaborationListResource) {
     this.formService.setListResource(collaborationListResource);
   }
 
-  public submitInProgress$: Observable<StateResource<CommandResource>> = of(
-    createEmptyStateResource<CommandResource>(),
-  );
+  public submitInProgress$: Observable<StateResource<CommandResource>> = of(createEmptyStateResource<CommandResource>());
 
   constructor(readonly formService: CollaborationRequestFormService) {}
 
@@ -35,8 +30,6 @@ export class CollaborationRequestFormComponent {
   doSubmit(): Observable<StateResource<CommandResource>> {
     return this.formService
       .submit()
-      .pipe(
-        tapOnCommandSuccessfullyDone(() => this.showResult.emit(this.formService.getFormValue())),
-      );
+      .pipe(tapOnCommandSuccessfullyDone(() => this.showResult.emit(this.formService.getFormValue())));
   }
 }
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.spec.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.spec.ts
index 8333c24f140f2ad55fc22d3da7011806b90dccdf..989607ccc531c76d5db317ed591f0d8d60d865f6 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.spec.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.spec.ts
@@ -29,9 +29,22 @@ describe('CollaborationRequestFormService', () => {
     expect(formService).toBeTruthy();
   });
 
+  describe('form', () => {
+    it('should have initial zustaendigeStelle value', () => {
+      expect(formService.form.controls[CollaborationRequestFormService.FIELD_ZUSTAENDIGE_STELLE].value).toBeNull();
+    });
+
+    it('should have initial titel value', () => {
+      expect(formService.form.controls[CollaborationRequestFormService.FIELD_TITEL].value).toBeNull();
+    });
+
+    it('should have initial beschreibung value', () => {
+      expect(formService.form.controls[CollaborationRequestFormService.FIELD_BESCHREIBUNG].value).toBeNull();
+    });
+  });
+
   describe('do submit', () => {
-    const stateCommandResource: StateResource<CommandResource> =
-      createStateResource(createCommandResource());
+    const stateCommandResource: StateResource<CommandResource> = createStateResource(createCommandResource());
 
     beforeEach(() => {
       formService.listResource = collaborationListResource;
@@ -41,10 +54,7 @@ describe('CollaborationRequestFormService', () => {
     it('should call service', () => {
       formService.submit();
 
-      expect(service.create).toHaveBeenCalledWith(
-        collaborationListResource,
-        formService.form.value,
-      );
+      expect(service.create).toHaveBeenCalledWith(collaborationListResource, formService.form.value);
     });
 
     it('should return stateCommandResource', () => {
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.ts
index eedf11fea57b5413757b863d50fee87000986a58..3e9334240e76bc7a2fff71ea1f4d22b10f9d253d 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/collaboration.request.formservice.ts
@@ -10,8 +10,8 @@ import { Observable } from 'rxjs';
 @Injectable()
 export class CollaborationRequestFormService extends AbstractFormService<CommandResource> {
   public static readonly FIELD_ZUSTAENDIGE_STELLE: string = 'zustaendigeStelle';
-  public static readonly FIELD_TITLE: string = 'titel';
-  public static readonly FIELD_NACHRICHT: string = 'anfrage';
+  public static readonly FIELD_TITEL: string = 'titel';
+  public static readonly FIELD_BESCHREIBUNG: string = 'beschreibung';
 
   private static readonly PATH_PREFIX: string = 'command.body';
 
@@ -26,11 +26,9 @@ export class CollaborationRequestFormService extends AbstractFormService<Command
 
   protected initForm(): FormGroup {
     return this.formBuilder.group({
-      [CollaborationRequestFormService.FIELD_ZUSTAENDIGE_STELLE]: new FormControl<ResourceUri>(
-        null,
-      ),
-      [CollaborationRequestFormService.FIELD_TITLE]: new FormControl<string>(null),
-      [CollaborationRequestFormService.FIELD_NACHRICHT]: new FormControl<string>(null),
+      [CollaborationRequestFormService.FIELD_ZUSTAENDIGE_STELLE]: new FormControl<ResourceUri>(null),
+      [CollaborationRequestFormService.FIELD_TITEL]: new FormControl<string>(null),
+      [CollaborationRequestFormService.FIELD_BESCHREIBUNG]: new FormControl<string>(null),
     });
   }
 
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.html
deleted file mode 100644
index 26bf7894a39f4bc7fb5d5d1e07d51dc2cd2976cd..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<ng-container
-  *ngIf="organisationsEinheitResource$ | async as organisationsEinheitResource; else searchButton"
->
-  <div class="flex items-center gap-3">
-    <ods-office-icon size="large" class="fill-text" />
-    <alfa-organisations-einheit
-      data-test-id="organisations-einheit-in-collaboration"
-      [organisationsEinheitResource]="organisationsEinheitResource"
-    ></alfa-organisations-einheit>
-  </div>
-</ng-container>
-<ng-template #searchButton>
-  <div class="flex items-center gap-3">
-    <ods-button
-      variant="outline"
-      text="Zuständige Stelle auswählen"
-      data-test-id="organisations-einheit-search-button"
-      (clickEmitter)="openSearchDialog()"
-    >
-      <ods-search-icon icon />
-    </ods-button>
-  </div>
-</ng-template>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.ts b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.ts
deleted file mode 100644
index 2bddc100f8d72ccd8560386dd144574e532a58e6..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import {
-  OrganisationsEinheitResource,
-  OrganisationsEinheitService,
-} from '@alfa-client/collaboration-shared';
-import { isNotNull } from '@alfa-client/tech-shared';
-import { OzgcloudDialogService } from '@alfa-client/ui';
-import { DialogConfig } from '@angular/cdk/dialog';
-import { Component, Input, OnInit, ViewContainerRef } from '@angular/core';
-import { AbstractControl } from '@angular/forms';
-import { ResourceUri, getUrl } from '@ngxp/rest';
-import { Observable, tap } from 'rxjs';
-import { SearchOrganisationsEinheitContainerComponent } from '../../../search-organisations-einheit-container/search-organisations-einheit-container.component';
-
-const DIALOG_CONFIG: DialogConfig = {
-  backdropClass: ['backdrop-blur-1', 'bg-greybackdrop'],
-};
-
-@Component({
-  selector: 'alfa-organisations-einheit-container',
-  templateUrl: './organisations-einheit-container.component.html',
-  providers: [OrganisationsEinheitService],
-})
-export class OrganisationsEinheitContainerComponent implements OnInit {
-  @Input() public fieldControl: AbstractControl<ResourceUri>;
-
-  public organisationsEinheitResource$: Observable<OrganisationsEinheitResource>;
-
-  constructor(
-    private readonly dialogService: OzgcloudDialogService,
-    readonly viewContainerRef: ViewContainerRef,
-    private readonly service: OrganisationsEinheitService,
-  ) {}
-
-  ngOnInit(): void {
-    this.organisationsEinheitResource$ = this.getSelectedResult();
-  }
-
-  getSelectedResult(): Observable<OrganisationsEinheitResource> {
-    return this.service
-      .getSelectedResult()
-      .pipe(
-        tap((organisationsEinheitResource: OrganisationsEinheitResource) =>
-          this.handleResult(organisationsEinheitResource),
-        ),
-      );
-  }
-
-  handleResult(organisationsEinheitResource: OrganisationsEinheitResource): void {
-    if (isNotNull(organisationsEinheitResource)) {
-      this.fieldControl.patchValue(getUrl(organisationsEinheitResource));
-    }
-  }
-
-  public openSearchDialog(): void {
-    this.dialogService.openInCallingComponentContext<SearchOrganisationsEinheitContainerComponent>(
-      SearchOrganisationsEinheitContainerComponent,
-      this.viewContainerRef,
-      null, //FIXME bitte null nicht als Parameter nehmen
-      DIALOG_CONFIG,
-    );
-  }
-}
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.html b/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.html
deleted file mode 100644
index 57d9280a6f6c3909e5d5c4494a245a803517d7a3..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<p class="font-bold">{{ name }}</p>
-<p>{{ address }}</p>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration.module.ts b/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
index bff26cb02d9a14bef2898adce7a6ec64c779106c..d9d38c700855608e944c4960c591c7b6f49e9b56 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
@@ -1,35 +1,31 @@
 import { CollaborationSharedModule } from '@alfa-client/collaboration-shared';
 import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import {
-  ButtonWithSpinnerComponent,
-  TextEditorComponent,
-  TextareaEditorComponent,
-} from '@ods/component';
+import { ButtonWithSpinnerComponent, TextEditorComponent, TextareaEditorComponent } from '@ods/component';
 import {
   ButtonComponent,
   CloseIconComponent,
-  InstantSearchComponent,
+  ExternalUnitIconComponent,
   OfficeIconComponent,
+  PublicAdministrationIconComponent,
   SaveIconComponent,
   SearchIconComponent,
   UsersIconComponent,
 } from '@ods/system';
 import { CollaborationInVorgangContainerComponent } from './collaboration-in-vorgang-container/collaboration-in-vorgang-container.component';
+import { AnfrageErstellenButtonComponent } from './collaboration-in-vorgang-container/collaboration-in-vorgang/anfrage-erstellen-button/anfrage-erstellen-button.component';
 import { CollaborationInVorgangComponent } from './collaboration-in-vorgang-container/collaboration-in-vorgang/collaboration-in-vorgang.component';
+import { ExterneFachstelleContainerComponent } from './collaboration-in-vorgang-container/collaboration-in-vorgang/externe-fachstelle-container/externe-fachstelle-container.component';
+import { OrganisationsEinheitContainerComponent } from './collaboration-in-vorgang-container/collaboration-in-vorgang/organisations-einheit-container/organisations-einheit-container.component';
 import { CollaborationRequestFormComponent } from './collaboration-in-vorgang-container/collaboration-request-form/collaboration-request-form.component';
-import { OrganisationsEinheitContainerComponent } from './collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component';
-import { OrganisationsEinheitComponent } from './collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component';
-import { SearchOrganisationsEinheitContainerComponent } from './search-organisations-einheit-container/search-organisations-einheit-container.component';
-import { SearchOrganisationsEinheitFormComponent } from './search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component';
 
 @NgModule({
   imports: [
     CommonModule,
     ButtonComponent,
-    OfficeIconComponent,
     SaveIconComponent,
     CloseIconComponent,
     SearchIconComponent,
@@ -39,18 +35,20 @@ import { SearchOrganisationsEinheitFormComponent } from './search-organisations-
     TextareaEditorComponent,
     FormsModule,
     ReactiveFormsModule,
-    InstantSearchComponent,
     TechSharedModule,
     ButtonWithSpinnerComponent,
+    ZustaendigeStelleModule,
+    OfficeIconComponent,
+    ExternalUnitIconComponent,
+    PublicAdministrationIconComponent,
   ],
   declarations: [
     CollaborationInVorgangContainerComponent,
     CollaborationInVorgangComponent,
     CollaborationRequestFormComponent,
-    SearchOrganisationsEinheitContainerComponent,
-    SearchOrganisationsEinheitFormComponent,
+    AnfrageErstellenButtonComponent,
     OrganisationsEinheitContainerComponent,
-    OrganisationsEinheitComponent,
+    ExterneFachstelleContainerComponent,
   ],
   exports: [CollaborationInVorgangContainerComponent],
 })
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html b/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html
deleted file mode 100644
index 3ec530a875705138b08d5e81fc65c2490cb39d1e..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<div class="my-32 flex h-screen flex-col gap-2">
-  <div class="flex gap-48 py-6 lg:gap-96">
-    <h1 class="text-xl font-bold text-primary">Zuständige Stelle auswählen</h1>
-    <ods-button
-      variant="icon"
-      size="fit"
-      (clickEmitter)="closeDialog()"
-      dataTestId="close-search-dialog"
-    >
-      <ods-close-icon class="fill-primary" icon />
-    </ods-button>
-  </div>
-  <alfa-search-organisations-einheit-form
-    *ngIf="organisationsEinheitStateListResource$ | async as organisationsEinheitStateListResource"
-    data-test-id="search-organisations-einheit"
-    [organisationsEinheiten]="
-      organisationsEinheitStateListResource.resource
-        | toEmbeddedResources: organisationsEinheitListLinkRel.ORGANISATIONS_EINHEIT_HEADER_LIST
-    "
-    (search)="search($event)"
-    (selectSearchResult)="selectSearchResult($event)"
-    (clearSearchResult)="clearSearchResult()"
-  ></alfa-search-organisations-einheit-form>
-</div>
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts b/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts
deleted file mode 100644
index 14a54da18681ed93697757c2cbcd13e81346414c..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import {
-  OrganisationsEinheitListLinkRel,
-  OrganisationsEinheitService,
-} from '@alfa-client/collaboration-shared';
-import { StateResource } from '@alfa-client/tech-shared';
-import { DialogRef } from '@angular/cdk/dialog';
-import { Component, HostListener, OnInit } from '@angular/core';
-import {
-  OrganisationsEinheitListResource,
-  OrganisationsEinheitResource,
-} from 'libs/collaboration-shared/src/lib/organisations-einheit.model';
-import { Observable } from 'rxjs';
-
-@Component({
-  selector: 'alfa-search-organisations-einheit-container',
-  templateUrl: './search-organisations-einheit-container.component.html',
-})
-export class SearchOrganisationsEinheitContainerComponent implements OnInit {
-  public organisationsEinheitStateListResource$: Observable<
-    StateResource<OrganisationsEinheitListResource>
-  >;
-
-  public readonly organisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel;
-
-  constructor(
-    private readonly service: OrganisationsEinheitService,
-    private readonly dialogRef: DialogRef,
-  ) {}
-
-  ngOnInit(): void {
-    this.organisationsEinheitStateListResource$ = this.service.getSearchResultList();
-  }
-
-  @HostListener('document:keydown', ['$event']) onKeyDownHandler(e: KeyboardEvent) {
-    if (e.key === 'Enter') e.preventDefault();
-  }
-
-  public search(searchBy: string): void {
-    this.service.search(searchBy);
-  }
-
-  public selectSearchResult(organisationsEinheit: OrganisationsEinheitResource): void {
-    this.service.selectSearchResult(organisationsEinheit);
-    this.service.clearSearchResult();
-    this.dialogRef.close();
-  }
-
-  public clearSearchResult(): void {
-    this.service.clearSearchResult();
-  }
-
-  public closeDialog(): void {
-    this.clearSearchResult();
-    this.dialogRef.close();
-  }
-}
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.spec.ts b/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.spec.ts
deleted file mode 100644
index 3235b40e35df167ed979b25a603fb7b5c47ccea7..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.spec.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-import { OrganisationsEinheitResource } from '@alfa-client/collaboration-shared';
-import { EventData, Mock, getMockComponent, mock, triggerEvent } from '@alfa-client/test-utils';
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ReactiveFormsModule } from '@angular/forms';
-import { faker } from '@faker-js/faker';
-import { InstantSearchComponent } from '@ods/system';
-import { createOrganisationsEinheitResource } from 'libs/collaboration-shared/test/organisations-einheit';
-import { InstantSearchResult } from 'libs/design-system/src/lib/instant-search/instant-search/instant-search.model';
-import { createInstantSearchResult } from 'libs/design-system/src/test/search';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MockComponent } from 'ng-mocks';
-import { SearchOrganisationsEinheitFormService } from '../search-organisations-einheit.formservice';
-import { SearchOrganisationsEinheitFormComponent } from './search-organisations-einheit-form.component';
-
-describe('SearchOrganisationsEinheitFormComponent', () => {
-  let component: SearchOrganisationsEinheitFormComponent;
-  let fixture: ComponentFixture<SearchOrganisationsEinheitFormComponent>;
-
-  const searchComp: string = getDataTestIdOf('search');
-
-  const formService: Mock<SearchOrganisationsEinheitFormService> = mock(
-    SearchOrganisationsEinheitFormService,
-  );
-
-  const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
-    createInstantSearchResult<OrganisationsEinheitResource>();
-  const organisationsEinheitResource: OrganisationsEinheitResource =
-    createOrganisationsEinheitResource();
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [ReactiveFormsModule],
-      declarations: [
-        SearchOrganisationsEinheitFormComponent,
-        MockComponent(InstantSearchComponent),
-      ],
-      providers: [
-        {
-          provide: SearchOrganisationsEinheitFormService,
-          useValue: formService,
-        },
-      ],
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(SearchOrganisationsEinheitFormComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-
-  describe('set organisationsEinheiten', () => {
-    it('should map organisationsEinheitResources', () => {
-      component.mapOrganisationsEinheitResources = jest.fn();
-
-      component.organisationsEinheiten = [organisationsEinheitResource];
-
-      expect(component.mapOrganisationsEinheitResources).toHaveBeenCalledWith([
-        organisationsEinheitResource,
-      ]);
-    });
-  });
-
-  describe('map organisationsEinheit Resources', () => {
-    it('should call mapToInstantSearchResult', () => {
-      component.mapToInstantantSearchResult = jest.fn();
-
-      component.mapOrganisationsEinheitResources([organisationsEinheitResource]);
-
-      expect(component.mapToInstantantSearchResult).toHaveBeenCalledWith(
-        organisationsEinheitResource,
-      );
-    });
-
-    it('should set searchResults', () => {
-      component.mapToInstantantSearchResult = jest.fn().mockReturnValue(instantSearchResult);
-
-      component.mapOrganisationsEinheitResources([organisationsEinheitResource]);
-
-      expect(component.searchResults).toEqual([instantSearchResult]);
-    });
-  });
-
-  describe('map to instand search result', () => {
-    it('should map titel', () => {
-      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
-        component.mapToInstantantSearchResult(organisationsEinheitResource);
-
-      expect(instantSearchResult.title).toBe(organisationsEinheitResource.name);
-    });
-    it('should map description', () => {
-      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
-        component.mapToInstantantSearchResult(organisationsEinheitResource);
-
-      const expectedDescription: string = `${organisationsEinheitResource.anschrift.strasse} ${organisationsEinheitResource.anschrift.hausnummer}, ${organisationsEinheitResource.anschrift.plz} ${organisationsEinheitResource.anschrift.ort}`;
-      expect(instantSearchResult.description).toBe(expectedDescription);
-    });
-
-    it('should map data', () => {
-      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
-        component.mapToInstantantSearchResult(organisationsEinheitResource);
-
-      expect(instantSearchResult.data).toBe(organisationsEinheitResource);
-    });
-  });
-
-  describe('instant search component', () => {
-    it('should be called with search results', () => {
-      component.searchResults = [instantSearchResult];
-
-      fixture.detectChanges();
-
-      expect(getInstantSearchComponent().searchResults).toEqual([instantSearchResult]);
-    });
-
-    function getInstantSearchComponent(): InstantSearchComponent {
-      return getMockComponent<InstantSearchComponent>(fixture, InstantSearchComponent);
-    }
-
-    it('should emit selected search result on searchResultSelected output', () => {
-      const selectSearchResultSpy: jest.SpyInstance = (component.selectSearchResult.emit =
-        jest.fn());
-      const eventData: EventData<SearchOrganisationsEinheitFormComponent> = {
-        fixture,
-        elementSelector: searchComp,
-        name: 'searchResultSelected',
-        data: { data: organisationsEinheitResource },
-      };
-
-      triggerEvent(eventData);
-
-      expect(selectSearchResultSpy).toHaveBeenCalledWith(organisationsEinheitResource);
-    });
-
-    it('should emit search on searchQueryChanged output', () => {
-      const searchSpy: jest.SpyInstance = (component.search.emit = jest.fn());
-      const searchBy: string = faker.word.sample();
-      const eventData: EventData<SearchOrganisationsEinheitFormComponent> = {
-        fixture,
-        elementSelector: searchComp,
-        name: 'searchQueryChanged',
-        data: { searchBy },
-      };
-
-      triggerEvent(eventData);
-
-      expect(searchSpy).toHaveBeenCalledWith(searchBy);
-    });
-
-    describe('should emit clear search result', () => {
-      let clearSearchResultSpy: jest.SpyInstance;
-      let eventData: EventData<SearchOrganisationsEinheitFormComponent>;
-
-      beforeEach(() => {
-        clearSearchResultSpy = component.clearSearchResult.emit = jest.fn();
-        eventData = {
-          fixture,
-          elementSelector: searchComp,
-          name: 'TBD',
-          data: { searchBy: faker.word.sample() },
-        };
-      });
-
-      it('on searchResultClosed output', () => {
-        eventData = { ...eventData, name: 'searchResultClosed' };
-
-        triggerEvent(eventData);
-
-        expect(clearSearchResultSpy).toHaveBeenCalledWith();
-      });
-
-      it('on searchQueryCleared output', () => {
-        eventData = { ...eventData, name: 'searchResultClosed' };
-
-        triggerEvent(eventData);
-
-        expect(clearSearchResultSpy).toHaveBeenCalled();
-      });
-    });
-  });
-});
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.ts b/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.ts
deleted file mode 100644
index e144eb1257283beea80b37d9b1d79b1a1fee50ab..0000000000000000000000000000000000000000
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { OrganisationsEinheitResource } from '@alfa-client/collaboration-shared';
-import { Component, EventEmitter, Input, Output } from '@angular/core';
-import { InstantSearchResult } from '@ods/system';
-import { SearchOrganisationsEinheitFormService } from '../search-organisations-einheit.formservice';
-
-@Component({
-  selector: 'alfa-search-organisations-einheit-form',
-  templateUrl: './search-organisations-einheit-form.component.html',
-  providers: [SearchOrganisationsEinheitFormService],
-})
-export class SearchOrganisationsEinheitFormComponent {
-  @Input() set organisationsEinheiten(organisationsEinheiten: OrganisationsEinheitResource[]) {
-    this.mapOrganisationsEinheitResources(organisationsEinheiten);
-  }
-
-  @Output() public search: EventEmitter<string> = new EventEmitter();
-  @Output() public selectSearchResult: EventEmitter<OrganisationsEinheitResource> =
-    new EventEmitter();
-  @Output() public clearSearchResult: EventEmitter<string> = new EventEmitter();
-
-  public searchResults: InstantSearchResult<OrganisationsEinheitResource>[];
-
-  constructor(public formService: SearchOrganisationsEinheitFormService) {}
-
-  mapOrganisationsEinheitResources(organisationsEinheiten: OrganisationsEinheitResource[]): void {
-    this.searchResults = organisationsEinheiten.map(
-      (organisationsEinheiten: OrganisationsEinheitResource) =>
-        this.mapToInstantantSearchResult(organisationsEinheiten),
-    );
-  }
-
-  mapToInstantantSearchResult(
-    organisationsEinheit: OrganisationsEinheitResource,
-  ): InstantSearchResult<OrganisationsEinheitResource> {
-    return <any>{
-      title: organisationsEinheit.name,
-      description: `${organisationsEinheit.anschrift.strasse} ${organisationsEinheit.anschrift.hausnummer}, ${organisationsEinheit.anschrift.plz} ${organisationsEinheit.anschrift.ort}`,
-      data: organisationsEinheit,
-    };
-  }
-}
diff --git a/alfa-client/libs/command-shared/src/lib/command-resource.service.spec.ts b/alfa-client/libs/command-shared/src/lib/command-resource.service.spec.ts
index 01af08536ee53c2b081a2da1a34d0823958d5e5c..282d49ecc2c827b47980b536a152681c9df26a3c 100644
--- a/alfa-client/libs/command-shared/src/lib/command-resource.service.spec.ts
+++ b/alfa-client/libs/command-shared/src/lib/command-resource.service.spec.ts
@@ -42,26 +42,31 @@ describe('CommandResourceService', () => {
     repository = mock(ResourceRepository);
     commandService = mock(CommandService);
 
-    service = new CommandResourceService(
-      config,
-      useFromMock(repository),
-      useFromMock(commandService),
-    );
+    service = new CommandResourceService(config, useFromMock(repository), useFromMock(commandService));
   });
 
   it('should be created', () => {
     expect(service).toBeTruthy();
   });
 
+  describe('doSave', () => {
+    it('should throw error', () => {
+      expect(() => service.doSave(configResource, {})).toThrowError('Method not implemented.');
+    });
+  });
+
+  describe('doPatch', () => {
+    it('should throw error', () => {
+      expect(() => service.doPatch(configResource, {})).toThrowError('Method not implemented.');
+    });
+  });
+
   describe('delete', () => {
     const resourceWithDeleteLinkRel: Resource = createDummyResource([deleteLinkRel]);
-    const stateResourceWithDeleteLink: StateResource<Resource> =
-      createStateResource(resourceWithDeleteLinkRel);
+    const stateResourceWithDeleteLink: StateResource<Resource> = createStateResource(resourceWithDeleteLinkRel);
 
     beforeEach(() => {
-      commandService.createCommandByProps.mockReturnValue(
-        of(createStateResource(createCommandResource())),
-      );
+      commandService.createCommandByProps.mockReturnValue(of(createStateResource(createCommandResource())));
       service.stateResource.next(stateResourceWithDeleteLink);
     });
 
diff --git a/alfa-client/libs/command-shared/src/lib/command-resource.service.ts b/alfa-client/libs/command-shared/src/lib/command-resource.service.ts
index 9a564442fd23862a0c85f645a6a93573ddca3612..4ec5a90e60890c26a04a3fd2d8aeed14794176d4 100644
--- a/alfa-client/libs/command-shared/src/lib/command-resource.service.ts
+++ b/alfa-client/libs/command-shared/src/lib/command-resource.service.ts
@@ -11,10 +11,7 @@ import { BehaviorSubject, Observable } from 'rxjs';
 import { CommandResource, CreateCommandProps } from './command.model';
 import { CommandService } from './command.service';
 
-export class CommandResourceService<B extends Resource, T extends Resource> extends ResourceService<
-  B,
-  T
-> {
+export class CommandResourceService<B extends Resource, T extends Resource> extends ResourceService<B, T> {
   deleteStateCommandResource: BehaviorSubject<StateResource<CommandResource>> = new BehaviorSubject<
     StateResource<CommandResource>
   >(createEmptyStateResource());
@@ -31,6 +28,10 @@ export class CommandResourceService<B extends Resource, T extends Resource> exte
     throw new Error('Method not implemented.');
   }
 
+  doPatch(resource: T, toPatch: unknown): Observable<T> {
+    throw new Error('Method not implemented.');
+  }
+
   public delete(): Observable<StateResource<CommandResource>> {
     return this.commandService.createCommandByProps(this.buildDeleteCommandProps());
   }
diff --git a/alfa-client/libs/design-system/src/index.ts b/alfa-client/libs/design-system/src/index.ts
index 35d2f4891764c4a3d808b6600e01cb16d4d0e46b..14054415c1d92807b561a8d4601f57b06326c5f1 100644
--- a/alfa-client/libs/design-system/src/index.ts
+++ b/alfa-client/libs/design-system/src/index.ts
@@ -21,7 +21,9 @@ export * from './lib/icons/bescheid-generate-icon/bescheid-generate-icon.compone
 export * from './lib/icons/bescheid-upload-icon/bescheid-upload-icon.component';
 export * from './lib/icons/check-icon/check-icon.component';
 export * from './lib/icons/close-icon/close-icon.component';
+export * from './lib/icons/edit-icon/edit-icon.component';
 export * from './lib/icons/exclamation-icon/exclamation-icon.component';
+export * from './lib/icons/external-unit-icon/external-unit-icon.component';
 export * from './lib/icons/file-icon/file-icon.component';
 export * from './lib/icons/iconVariants';
 export * from './lib/icons/logout-icon/logout-icon.component';
@@ -29,6 +31,7 @@ export * from './lib/icons/mailbox-icon/mailbox-icon.component';
 export * from './lib/icons/office-icon/office-icon.component';
 export * from './lib/icons/orga-unit-icon/orga-unit-icon.component';
 export * from './lib/icons/person-icon/person-icon.component';
+export * from './lib/icons/public-administration-icon/public-administration-icon.component';
 export * from './lib/icons/save-icon/save-icon.component';
 export * from './lib/icons/search-icon/search-icon.component';
 export * from './lib/icons/send-icon/send-icon.component';
@@ -37,6 +40,8 @@ export * from './lib/icons/stamp-icon/stamp-icon.component';
 export * from './lib/icons/users-icon/users-icon.component';
 export * from './lib/instant-search/instant-search/instant-search.component';
 export * from './lib/instant-search/instant-search/instant-search.model';
+export * from './lib/list/list-item/list-item.component';
+export * from './lib/list/list.component';
 export * from './lib/navbar/nav-item/nav-item.component';
 export * from './lib/navbar/navbar/navbar.component';
 export * from './lib/testbtn/testbtn.component';
diff --git a/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.spec.ts b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cd013ced1912306eaa9798977fe6ea95ed13280d
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { EditIconComponent } from './edit-icon.component';
+
+describe('EditIconComponent', () => {
+  let component: EditIconComponent;
+  let fixture: ComponentFixture<EditIconComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [EditIconComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(EditIconComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e767400be6b431d9859b7e9f62b28c7d6955293e
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.component.ts
@@ -0,0 +1,27 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { twMerge } from 'tailwind-merge';
+import { iconVariants, IconVariants } from '../iconVariants';
+
+@Component({
+  selector: 'ods-edit-icon',
+  standalone: true,
+  imports: [CommonModule],
+  template: `<svg
+    viewBox="0 0 24 24"
+    fill="none"
+    xmlns="http://www.w3.org/2000/svg"
+    [ngClass]="twMerge(iconVariants({ size }), 'fill-primary', class)"
+  >
+    <path
+      d="M5 19H6.425L16.2 9.225L14.775 7.8L5 17.575V19ZM3 21V16.75L16.2 3.575C16.4 3.39167 16.6208 3.25 16.8625 3.15C17.1042 3.05 17.3583 3 17.625 3C17.8917 3 18.15 3.05 18.4 3.15C18.65 3.25 18.8667 3.4 19.05 3.6L20.425 5C20.625 5.18333 20.7708 5.4 20.8625 5.65C20.9542 5.9 21 6.15 21 6.4C21 6.66667 20.9542 6.92083 20.8625 7.1625C20.7708 7.40417 20.625 7.625 20.425 7.825L7.25 21H3ZM15.475 8.525L14.775 7.8L16.2 9.225L15.475 8.525Z"
+    />
+  </svg>`,
+})
+export class EditIconComponent {
+  @Input() size: IconVariants['size'] = 'medium';
+  @Input() class: string = undefined;
+
+  readonly iconVariants = iconVariants;
+  readonly twMerge = twMerge;
+}
diff --git a/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.stories.ts b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..96a32144e1ed2aee22ae8688076711b02c26f7df
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/edit-icon/edit-icon.stories.ts
@@ -0,0 +1,27 @@
+import type { Meta, StoryObj } from '@storybook/angular';
+
+import { EditIconComponent } from './edit-icon.component';
+
+const meta: Meta<EditIconComponent> = {
+  title: 'Icons/Edit icon',
+  component: EditIconComponent,
+  excludeStories: /.*Data$/,
+  tags: ['autodocs'],
+};
+
+export default meta;
+type Story = StoryObj<EditIconComponent>;
+
+export const Default: Story = {
+  args: { size: 'medium' },
+  argTypes: {
+    size: {
+      control: 'select',
+      options: ['small', 'medium', 'large', 'extra-large', 'full'],
+      description: 'Size of icon. Property "full" means 100%',
+      table: {
+        defaultValue: { summary: 'medium' },
+      },
+    },
+  },
+};
diff --git a/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.html b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..222b4d34db4bf54889b13e78a5c2a9b161dc55b7
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.html
@@ -0,0 +1,67 @@
+<svg width="45" height="37" viewBox="0 0 45 37" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g [ngClass]="[twMerge('fill-primary', class)]">
+    <path
+      d="M9.13165 9.58598H8.85322V8.76559C8.85322 8.61465 8.72877 8.49214 8.57479 8.49214C8.42081 8.49214 8.29636 8.61465 8.29636 8.76559V9.85943C8.29636 10.0104 8.42081 10.1329 8.57479 10.1329H9.13169C9.28567 10.1329 9.41012 10.0104 9.41012 9.85943C9.41012 9.70849 9.28563 9.58598 9.13165 9.58598Z"
+    />
+    <path
+      d="M3.56334 16.6978H2.44898C2.29492 16.6978 2.17041 16.8203 2.17041 16.9712V18.6121C2.17041 18.763 2.29492 18.8855 2.44898 18.8855H3.56331C3.71737 18.8855 3.84188 18.763 3.84188 18.6121V16.9712C3.84191 16.8203 3.7174 16.6978 3.56334 16.6978ZM3.28473 18.3386H2.72759V17.2447H3.28477L3.28473 18.3386Z"
+    />
+    <path
+      d="M3.84191 13.69C3.84191 13.5391 3.7174 13.4166 3.56334 13.4166H2.44898C2.29492 13.4166 2.17041 13.5391 2.17041 13.69V15.3309C2.17041 15.4818 2.29492 15.6043 2.44898 15.6043H3.56331C3.71737 15.6043 3.84188 15.4818 3.84188 15.3309L3.84191 13.69ZM3.28473 15.0574H2.72759V13.9635H3.28477L3.28473 15.0574Z"
+    />
+    <path
+      d="M4.40016 12.0495C4.40016 11.8985 4.27565 11.776 4.12159 11.776H1.05715V11.5026C1.05715 11.3516 0.932633 11.2291 0.778574 11.2291C0.624514 11.2291 0.5 11.3516 0.5 11.5026V20.8005C0.5 21.2528 0.874979 21.6209 1.33575 21.6209H3.56444C4.02521 21.6209 4.40019 21.2528 4.40019 20.8005C4.40019 20.3482 4.02521 19.9801 3.56444 19.9801C3.51625 19.9801 3.46833 19.9842 3.42125 19.9924C3.22932 19.6525 2.86296 19.4332 2.45011 19.4332C2.03726 19.4332 1.6709 19.6525 1.47897 19.9924C1.4319 19.9842 1.38397 19.9801 1.33579 19.9801C1.23745 19.9801 1.14467 19.9998 1.05721 20.0304V12.323H4.12165C4.27561 12.323 4.40016 12.2005 4.40016 12.0495ZM1.33572 20.5271C1.38893 20.5271 1.4399 20.5421 1.48671 20.5716C1.56278 20.62 1.65833 20.6288 1.74247 20.5952C1.8266 20.5618 1.88843 20.4902 1.90935 20.4035C1.96786 20.1543 2.19018 19.9801 2.45008 19.9801C2.70998 19.9801 2.93204 20.1543 2.99081 20.4035C3.0117 20.4902 3.07353 20.5618 3.1577 20.5952C3.24183 20.6288 3.33709 20.6201 3.41345 20.5716C3.5951 20.4568 3.84301 20.5973 3.84301 20.8005C3.84301 20.9512 3.71821 21.074 3.56444 21.074H1.33572C1.18196 21.074 1.05715 20.9512 1.05715 20.8005C1.05715 20.6498 1.18196 20.5271 1.33572 20.5271Z"
+    />
+    <path
+      d="M12.4807 20.525H5.23751C5.08345 20.525 4.95894 20.6476 4.95894 20.7986V21.3458C4.95894 21.4968 5.08345 21.6194 5.23751 21.6194C5.39157 21.6194 5.51608 21.4968 5.51608 21.3458V21.0722H12.2021V21.3458C12.2021 21.4968 12.3266 21.6194 12.4807 21.6194C12.6347 21.6194 12.7593 21.4968 12.7593 21.3458V20.7986C12.7593 20.6476 12.6347 20.525 12.4807 20.525Z"
+    />
+    <path
+      d="M5.23751 19.9765C5.39157 19.9765 5.51608 19.854 5.51608 19.703V9.03772C5.51608 8.88677 5.39157 8.76426 5.23751 8.76426C5.08345 8.76426 4.95894 8.88677 4.95894 9.03772V19.703C4.95891 19.854 5.08345 19.9765 5.23751 19.9765Z"
+    />
+    <path
+      d="M12.4816 8.49214C12.3275 8.49214 12.203 8.61466 12.203 8.7656V19.7044C12.203 19.8553 12.3275 19.9778 12.4816 19.9778C12.6357 19.9778 12.7602 19.8553 12.7602 19.7044V8.7656C12.7602 8.61466 12.6357 8.49214 12.4816 8.49214Z"
+    />
+    <path
+      d="M16.9258 11.2291C16.7717 11.2291 16.6472 11.3516 16.6472 11.5026V11.776H13.5828C13.4287 11.776 13.3042 11.8985 13.3042 12.0495C13.3042 12.2004 13.4287 12.3229 13.5828 12.3229H16.6472V20.0304C16.5595 19.9998 16.4667 19.9801 16.3686 19.9801C16.3205 19.9801 16.2725 19.9842 16.2254 19.9924C16.0335 19.6525 15.6672 19.4331 15.2543 19.4331C14.8415 19.4331 14.4751 19.6525 14.2832 19.9924C14.2361 19.9842 14.1882 19.9801 14.14 19.9801C13.6792 19.9801 13.3042 20.3482 13.3042 20.8005C13.3042 21.2528 13.6792 21.6209 14.14 21.6209H16.3687C16.8294 21.6209 17.2044 21.2528 17.2044 20.8005V11.5026C17.2044 11.3516 17.0798 11.2291 16.9258 11.2291ZM16.3686 21.074H14.1399C13.9862 21.074 13.8613 20.9512 13.8613 20.8006C13.8613 20.6499 13.9862 20.5271 14.1399 20.5271C14.1931 20.5271 14.2441 20.5421 14.2909 20.5717C14.3672 20.6201 14.4625 20.6288 14.5467 20.5952C14.6308 20.5618 14.6926 20.4902 14.7135 20.4035C14.772 20.1544 14.9943 19.9802 15.2542 19.9802C15.5142 19.9802 15.7362 20.1544 15.795 20.4035C15.8159 20.4902 15.8777 20.5618 15.9618 20.5952C16.046 20.6289 16.1412 20.6201 16.2176 20.5717C16.3995 20.4568 16.6471 20.5974 16.6471 20.8006C16.6472 20.9512 16.5224 21.074 16.3686 21.074Z"
+    />
+    <path
+      d="M13.1829 7.71134L9.00411 5.25012C8.9158 5.19788 8.80549 5.19788 8.71718 5.25012L4.53841 7.71134C4.40665 7.78899 4.36375 7.95692 4.44315 8.08655C4.52225 8.21589 4.69303 8.258 4.82538 8.18007L8.86066 5.80335L12.8959 8.18007C12.9408 8.2066 12.9904 8.21916 13.0391 8.21916C13.1338 8.21916 13.2261 8.17186 13.2782 8.08652C13.3575 7.95692 13.3146 7.78903 13.1829 7.71134Z"
+    />
+    <path
+      d="M13.8734 18.6121C13.8734 18.763 13.9979 18.8855 14.152 18.8855H15.2663C15.4204 18.8855 15.5449 18.763 15.5449 18.6121V16.9712C15.5449 16.8203 15.4204 16.6978 15.2663 16.6978H14.152C13.9979 16.6978 13.8734 16.8203 13.8734 16.9712V18.6121ZM14.4306 17.2447H14.9878V18.3386H14.4306V17.2447Z"
+    />
+    <path
+      d="M14.152 15.6043H15.2663C15.4204 15.6043 15.5449 15.4818 15.5449 15.3309V13.69C15.5449 13.5391 15.4204 13.4166 15.2663 13.4166H14.152C13.9979 13.4166 13.8734 13.5391 13.8734 13.69V15.3309C13.8734 15.4818 13.9979 15.6043 14.152 15.6043ZM14.4306 13.9635H14.9878V15.0574H14.4306V13.9635Z"
+    />
+    <path
+      d="M8.64818 18.4117C8.59777 18.4636 8.56742 18.532 8.56742 18.6058C8.56742 18.6769 8.59777 18.748 8.64818 18.8C8.70082 18.8492 8.77041 18.8793 8.84589 18.8793C8.91829 18.8793 8.9904 18.8492 9.04359 18.8C9.09371 18.748 9.12435 18.6769 9.12435 18.6058C9.12435 18.532 9.09371 18.4636 9.04359 18.4117C8.94055 18.3105 8.74816 18.3105 8.64818 18.4117Z"
+    />
+    <path
+      d="M6.62596 15.3309C6.62596 15.4818 6.75047 15.6043 6.90453 15.6043H8.01886C8.17292 15.6043 8.29743 15.4818 8.29743 15.3309V13.69C8.29743 13.5391 8.17292 13.4166 8.01886 13.4166H6.90453C6.75047 13.4166 6.62596 13.5391 6.62596 13.69V15.3309ZM7.18314 13.9635H7.74032V15.0574H7.18314V13.9635Z"
+    />
+    <path
+      d="M9.69306 13.4166C9.539 13.4166 9.41449 13.5391 9.41449 13.69V15.3309C9.41449 15.4818 9.539 15.6043 9.69306 15.6043H10.8074C10.9614 15.6043 11.086 15.4818 11.086 15.3309V13.69C11.086 13.5391 10.9614 13.4166 10.8074 13.4166H9.69306ZM10.5288 15.0574H9.97163V13.9635H10.5288V15.0574Z"
+    />
+    <path
+      d="M8.85464 7.40016C7.62579 7.40016 6.62596 8.38164 6.62596 9.58793C6.62596 10.7942 7.62579 11.7757 8.85464 11.7757C10.0835 11.7757 11.0833 10.7942 11.0833 9.58793C11.0833 8.38164 10.0835 7.40016 8.85464 7.40016ZM8.85464 11.2287C7.9328 11.2287 7.18314 10.4928 7.18314 9.5879C7.18314 8.68298 7.9328 7.94708 8.85464 7.94708C9.77649 7.94708 10.5261 8.68298 10.5261 9.5879C10.5261 10.4928 9.77649 11.2287 8.85464 11.2287Z"
+    />
+    <path
+      d="M6.07367 16.9712C6.07367 17.1222 6.19819 17.2447 6.35225 17.2447H7.188V19.7059C7.188 19.8569 7.31251 19.9794 7.46657 19.9794C7.62063 19.9794 7.74515 19.8569 7.74515 19.7059V17.2447H9.97383V19.7059C9.97383 19.8569 10.0983 19.9794 10.2524 19.9794C10.4065 19.9794 10.531 19.8569 10.531 19.7059V17.2447H11.3667C11.5208 17.2447 11.6453 17.1222 11.6453 16.9712C11.6453 16.8203 11.5208 16.6978 11.3667 16.6978H6.35221C6.19819 16.6978 6.07367 16.8203 6.07367 16.9712Z"
+    />
+    <path
+      d="M21.1445 28V27.1651C21.1445 26.5194 21.481 25.9821 22.1541 25.5532C22.8271 25.1244 23.6984 24.9099 24.7679 24.9099C24.9151 24.9099 25.0813 24.9181 25.2663 24.9345C25.4514 24.951 25.6413 24.9746 25.8359 25.0053C25.7352 25.285 25.6563 25.562 25.5991 25.8361C25.542 26.1102 25.5134 26.3844 25.5134 26.6587V28H21.1445ZM27.514 28V26.7447C27.514 26.295 27.6382 25.8839 27.8866 25.5114C28.135 25.139 28.5014 24.8169 28.9858 24.545C29.4704 24.2733 30.0349 24.0695 30.6793 23.9336C31.3237 23.7976 32.0351 23.7296 32.8136 23.7296C33.6071 23.7296 34.3261 23.7976 34.9704 23.9336C35.6148 24.0695 36.1793 24.2733 36.6639 24.545C37.1483 24.8169 37.5138 25.139 37.7602 25.5114C38.0065 25.8839 38.1297 26.295 38.1297 26.7447V28H27.514ZM40.1302 28V26.6652C40.1302 26.3661 40.106 26.0775 40.0577 25.7993C40.0094 25.521 39.9281 25.257 39.8138 25.0073C40.0357 24.9753 40.2353 24.951 40.4126 24.9345C40.5898 24.9181 40.7544 24.9099 40.9062 24.9099C41.9778 24.9099 42.8446 25.1202 43.5065 25.5407C44.1682 25.9613 44.4991 26.5028 44.4991 27.1651V28H40.1302ZM28.3101 27.1416H37.3335V26.8239C37.3743 26.1501 36.9855 25.609 36.1668 25.2006C35.3482 24.7922 34.2332 24.588 32.8218 24.588C31.4241 24.588 30.3125 24.7922 29.4871 25.2006C28.6616 25.609 28.2693 26.1522 28.3101 26.8303V27.1416ZM24.7411 23.9871C24.3618 23.9871 24.0384 23.8447 23.7709 23.5597C23.5035 23.2748 23.3698 22.9309 23.3698 22.5279C23.3698 22.1317 23.5054 21.7931 23.7764 21.5119C24.0475 21.2307 24.3746 21.0901 24.7579 21.0901C25.1349 21.0901 25.4605 21.2307 25.7348 21.5119C26.009 21.7931 26.1461 22.138 26.1461 22.5465C26.1461 22.9304 26.0127 23.2665 25.7459 23.5547C25.4793 23.843 25.1444 23.9871 24.7411 23.9871ZM40.8945 23.9871C40.5253 23.9871 40.2035 23.8424 39.9293 23.553C39.655 23.2637 39.5179 22.9241 39.5179 22.5343C39.5179 22.1339 39.6556 21.7931 39.9309 21.5119C40.2062 21.2307 40.5325 21.0901 40.9099 21.0901C41.2979 21.0901 41.6257 21.2307 41.8932 21.5119C42.1605 21.7931 42.2942 22.1358 42.2942 22.5401C42.2942 22.9372 42.1613 23.2776 41.8956 23.5614C41.6298 23.8452 41.2961 23.9871 40.8945 23.9871ZM32.829 22.8927C32.1846 22.8927 31.6344 22.6549 31.1785 22.1792C30.7225 21.7036 30.4946 21.1261 30.4946 20.4465C30.4946 19.7534 30.7208 19.1724 31.1732 18.7035C31.6258 18.2345 32.1753 18 32.8218 18C33.4812 18 34.0339 18.2338 34.48 18.7013C34.926 19.1687 35.149 19.7479 35.149 20.439C35.149 21.1163 34.9267 21.6946 34.4821 22.1739C34.0375 22.6531 33.4864 22.8927 32.829 22.8927ZM32.8414 22.0344C33.2611 22.0344 33.6145 21.8802 33.9017 21.5718C34.1888 21.2635 34.3324 20.8815 34.3324 20.4259C34.3324 19.9847 34.1884 19.6132 33.9004 19.3111C33.6123 19.0093 33.2559 18.8584 32.8311 18.8584C32.4098 18.8584 32.0512 19.0098 31.7552 19.3128C31.4592 19.6156 31.3112 19.9902 31.3112 20.4367C31.3112 20.8796 31.4579 21.2565 31.7512 21.5677C32.0446 21.8788 32.408 22.0344 32.8414 22.0344Z"
+    />
+  </g>
+  <g [ngClass]="[twMerge('stroke-primary', class)]">
+    <path
+      d="M7.76319 23.4211C7.77138 26.1365 8.70174 28.7709 10.3957 30.8753C12.0897 32.9797 14.4426 34.424 17.0533 34.9621C19.6641 35.5001 22.3712 35.0986 24.7135 33.826C25.8548 33.206 26.875 32.3978 27.7381 31.4423M4.54687 28.2841L7.4063 23.2109L12.3942 26.1609"
+      stroke-width="2"
+      stroke-linejoin="round"
+    />
+    <path
+      d="M33.5608 12.7737C33.5526 10.0582 32.6223 7.42389 30.9283 5.31947C29.2343 3.21505 26.8815 1.77077 24.2707 1.23273C21.6599 0.694683 18.9528 1.09616 16.6105 2.36875C15.4692 2.98879 14.449 3.79695 13.5859 4.75251M36.7772 7.91068L33.9177 12.9838L28.9298 10.0338"
+      stroke-width="2"
+      stroke-linejoin="round"
+    />
+  </g>
+</svg>
diff --git a/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.spec.ts b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..69cdb1bba2d29d6a4543da14b957aca1405374b0
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ExternalUnitIconComponent } from './external-unit-icon.component';
+
+describe('ExternalUnitIconComponent', () => {
+  let component: ExternalUnitIconComponent;
+  let fixture: ComponentFixture<ExternalUnitIconComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ExternalUnitIconComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ExternalUnitIconComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f06c60b0f95fc9070c6096ed88bda3e7997005e2
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.component.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { twMerge } from 'tailwind-merge';
+
+@Component({
+  selector: 'ods-external-unit-icon',
+  standalone: true,
+  imports: [CommonModule],
+  templateUrl: './external-unit-icon.component.html',
+})
+export class ExternalUnitIconComponent {
+  @Input() class: string = undefined;
+
+  readonly twMerge = twMerge;
+}
diff --git a/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.stories.ts b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6718fd2fdca463fc995dd228c4b21d8a5d772f68
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/external-unit-icon/external-unit-icon.stories.ts
@@ -0,0 +1,15 @@
+import type { Meta, StoryObj } from '@storybook/angular';
+
+import { ExternalUnitIconComponent } from './external-unit-icon.component';
+
+const meta: Meta<ExternalUnitIconComponent> = {
+  title: 'Icons/External unit icon',
+  component: ExternalUnitIconComponent,
+  excludeStories: /.*Data$/,
+  tags: ['autodocs'],
+};
+
+export default meta;
+type Story = StoryObj<ExternalUnitIconComponent>;
+
+export const Default: Story = {};
diff --git a/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.html b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..45ef2a2964157d80fff9cd0ff873d4f40aeb83d7
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.html
@@ -0,0 +1,112 @@
+<svg width="44" height="44" viewBox="0 0 44 38" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g [ngClass]="[twMerge('fill-primary', class)]">
+    <path
+      d="M8.81083 9.89993H8.52662V9.04961C8.52662 8.89316 8.39959 8.76618 8.24241 8.76618C8.08523 8.76618 7.9582 8.89316 7.9582 9.04961V10.1834C7.9582 10.3398 8.08523 10.4668 8.24241 10.4668H8.81086C8.96804 10.4668 9.09507 10.3398 9.09507 10.1834C9.09507 10.0269 8.96801 9.89993 8.81083 9.89993Z"
+    />
+    <path
+      d="M3.12693 17.2713H1.98944C1.83218 17.2713 1.70508 17.3983 1.70508 17.5547V19.2554C1.70508 19.4119 1.83218 19.5388 1.98944 19.5388H3.1269C3.28415 19.5388 3.41125 19.4119 3.41125 19.2554V17.5547C3.41129 17.3983 3.28419 17.2713 3.12693 17.2713ZM2.84254 18.972H2.27383V17.8382H2.84257L2.84254 18.972Z"
+    />
+    <path
+      d="M3.41129 14.1538C3.41129 13.9973 3.28419 13.8703 3.12693 13.8703H1.98944C1.83218 13.8703 1.70508 13.9973 1.70508 14.1538V15.8545C1.70508 16.0109 1.83218 16.1379 1.98944 16.1379H3.1269C3.28415 16.1379 3.41125 16.0109 3.41125 15.8545L3.41129 14.1538ZM2.84254 15.571H2.27383V14.4372H2.84257L2.84254 15.571Z"
+    />
+    <path
+      d="M3.98112 12.4533C3.98112 12.2969 3.85402 12.1699 3.69676 12.1699H0.568712V11.8865C0.568712 11.73 0.441614 11.603 0.284356 11.603C0.127099 11.603 0 11.73 0 11.8865V21.5237C0 21.9926 0.382763 22.3741 0.853102 22.3741H3.12805C3.59839 22.3741 3.98115 21.9926 3.98115 21.5237C3.98115 21.0549 3.59839 20.6734 3.12805 20.6734C3.07887 20.6734 3.02995 20.6776 2.98189 20.6861C2.78598 20.3338 2.41201 20.1065 1.99059 20.1065C1.56917 20.1065 1.19521 20.3338 0.999296 20.6861C0.951242 20.6776 0.902322 20.6734 0.853135 20.6734C0.752763 20.6734 0.658055 20.6938 0.568779 20.7255V12.7368H3.69683C3.85399 12.7368 3.98112 12.6098 3.98112 12.4533ZM0.853069 21.2403C0.907387 21.2403 0.959406 21.2559 1.00719 21.2865C1.08484 21.3367 1.18238 21.3457 1.26826 21.3109C1.35413 21.2763 1.41725 21.202 1.43861 21.1122C1.49833 20.854 1.72527 20.6734 1.99056 20.6734C2.25586 20.6734 2.48253 20.854 2.54251 21.1122C2.56384 21.202 2.62695 21.2763 2.71286 21.3109C2.79874 21.3458 2.89598 21.3367 2.97393 21.2865C3.15934 21.1675 3.41241 21.3131 3.41241 21.5237C3.41241 21.6799 3.28501 21.8072 3.12805 21.8072H0.853069C0.696111 21.8072 0.568712 21.6799 0.568712 21.5237C0.568712 21.3676 0.696111 21.2403 0.853069 21.2403Z"
+    />
+    <path
+      d="M12.2294 21.2381H4.83585C4.6786 21.2381 4.5515 21.3652 4.5515 21.5217V22.0889C4.5515 22.2454 4.6786 22.3725 4.83585 22.3725C4.99311 22.3725 5.12021 22.2454 5.12021 22.0889V21.8053H11.945V22.0889C11.945 22.2454 12.0721 22.3725 12.2294 22.3725C12.3866 22.3725 12.5137 22.2454 12.5137 22.0889V21.5217C12.5138 21.3652 12.3866 21.2381 12.2294 21.2381Z"
+    />
+    <path
+      d="M4.83585 20.6696C4.99311 20.6696 5.12021 20.5427 5.12021 20.3862V9.33167C5.12021 9.17522 4.99311 9.04823 4.83585 9.04823C4.6786 9.04823 4.5515 9.17522 4.5515 9.33167V20.3862C4.55146 20.5427 4.6786 20.6696 4.83585 20.6696Z"
+    />
+    <path
+      d="M12.2303 8.76618C12.073 8.76618 11.9459 8.89317 11.9459 9.04962V20.3876C11.9459 20.544 12.073 20.671 12.2303 20.671C12.3876 20.671 12.5147 20.544 12.5147 20.3876V9.04962C12.5147 8.89317 12.3876 8.76618 12.2303 8.76618Z"
+    />
+    <path
+      d="M16.7668 11.603C16.6095 11.603 16.4824 11.73 16.4824 11.8865V12.1699H13.3543C13.1971 12.1699 13.07 12.2969 13.07 12.4533C13.07 12.6098 13.1971 12.7368 13.3543 12.7368H16.4824V20.7255C16.3928 20.6938 16.2981 20.6734 16.198 20.6734C16.1489 20.6734 16.0999 20.6776 16.0519 20.6861C15.856 20.3338 15.482 20.1065 15.0606 20.1065C14.6392 20.1065 14.2652 20.3338 14.0693 20.6861C14.0212 20.6776 13.9723 20.6734 13.9231 20.6734C13.4528 20.6734 13.07 21.0549 13.07 21.5237C13.07 21.9925 13.4528 22.3741 13.9231 22.3741H16.1981C16.6684 22.3741 17.0512 21.9925 17.0512 21.5237V11.8865C17.0511 11.73 16.924 11.603 16.7668 11.603ZM16.198 21.8072H13.9231C13.7661 21.8072 13.6387 21.68 13.6387 21.5238C13.6387 21.3676 13.7661 21.2403 13.9231 21.2403C13.9774 21.2403 14.0294 21.2559 14.0772 21.2865C14.1551 21.3367 14.2524 21.3458 14.3382 21.3109C14.4241 21.2763 14.4872 21.2021 14.5086 21.1122C14.5683 20.854 14.7952 20.6734 15.0605 20.6734C15.3258 20.6734 15.5525 20.854 15.6125 21.1122C15.6338 21.2021 15.6969 21.2763 15.7828 21.3109C15.8687 21.3458 15.9659 21.3367 16.0438 21.2865C16.2295 21.1675 16.4823 21.3132 16.4823 21.5238C16.4824 21.68 16.355 21.8072 16.198 21.8072Z"
+    />
+    <path
+      d="M12.9462 7.95689L8.68064 5.40584C8.5905 5.3517 8.4779 5.3517 8.38775 5.40584L4.12224 7.95689C3.98775 8.03737 3.94396 8.21143 4.025 8.34579C4.10575 8.47985 4.28007 8.5235 4.41516 8.44272L8.53422 5.97926L12.6533 8.44272C12.6991 8.47022 12.7497 8.48324 12.7994 8.48324C12.8961 8.48324 12.9902 8.43421 13.0434 8.34576C13.1244 8.21143 13.0806 8.0374 12.9462 7.95689Z"
+    />
+    <path
+      d="M13.651 19.2554C13.651 19.4119 13.7781 19.5388 13.9354 19.5388H15.0728C15.2301 19.5388 15.3572 19.4119 15.3572 19.2554V17.5547C15.3572 17.3983 15.2301 17.2713 15.0728 17.2713H13.9354C13.7781 17.2713 13.651 17.3983 13.651 17.5547V19.2554ZM14.2198 17.8382H14.7885V18.972H14.2198V17.8382Z"
+    />
+    <path
+      d="M13.9354 16.1379H15.0728C15.2301 16.1379 15.3572 16.0109 15.3572 15.8545V14.1538C15.3572 13.9973 15.2301 13.8703 15.0728 13.8703H13.9354C13.7781 13.8703 13.651 13.9973 13.651 14.1538V15.8545C13.651 16.0109 13.7781 16.1379 13.9354 16.1379ZM14.2198 14.4372H14.7885V15.571H14.2198V14.4372Z"
+    />
+    <path
+      d="M8.31732 19.0477C8.26586 19.1015 8.23489 19.1724 8.23489 19.2489C8.23489 19.3226 8.26586 19.3963 8.31732 19.4502C8.37105 19.5012 8.44209 19.5324 8.51913 19.5324C8.59304 19.5324 8.66665 19.5012 8.72094 19.4502C8.7721 19.3964 8.80337 19.3226 8.80337 19.2489C8.80337 19.1724 8.7721 19.1016 8.72094 19.0477C8.61576 18.9428 8.41938 18.9428 8.31732 19.0477Z"
+    />
+    <path
+      d="M6.25312 15.8545C6.25312 16.0109 6.38022 16.1379 6.53748 16.1379H7.67493C7.83219 16.1379 7.95929 16.0109 7.95929 15.8545V14.1538C7.95929 13.9973 7.83219 13.8703 7.67493 13.8703H6.53748C6.38022 13.8703 6.25312 13.9973 6.25312 14.1538V15.8545ZM6.82187 14.4372H7.39061V15.571H6.82187V14.4372Z"
+    />
+    <path
+      d="M9.38389 13.8703C9.22663 13.8703 9.09953 13.9973 9.09953 14.1538V15.8545C9.09953 16.0109 9.22663 16.1379 9.38389 16.1379H10.5213C10.6786 16.1379 10.8057 16.0109 10.8057 15.8545V14.1538C10.8057 13.9973 10.6786 13.8703 10.5213 13.8703H9.38389ZM10.237 15.571H9.66825V14.4372H10.237V15.571Z"
+    />
+    <path
+      d="M8.52807 7.63435C7.27371 7.63435 6.25312 8.65165 6.25312 9.90196C6.25312 11.1523 7.27371 12.1696 8.52807 12.1696C9.78243 12.1696 10.803 11.1523 10.803 9.90196C10.803 8.65165 9.78243 7.63435 8.52807 7.63435ZM8.52807 11.6026C7.58709 11.6026 6.82187 10.8399 6.82187 9.90192C6.82187 8.96398 7.58709 8.20123 8.52807 8.20123C9.46905 8.20123 10.2343 8.96398 10.2343 9.90192C10.2343 10.8399 9.46905 11.6026 8.52807 11.6026Z"
+    />
+    <path
+      d="M5.68937 17.5547C5.68937 17.7112 5.81647 17.8381 5.97373 17.8381H6.82683V20.3892C6.82683 20.5456 6.95393 20.6726 7.11118 20.6726C7.26844 20.6726 7.39554 20.5456 7.39554 20.3892V17.8381H9.67049V20.3892C9.67049 20.5456 9.79759 20.6726 9.95485 20.6726C10.1121 20.6726 10.2392 20.5456 10.2392 20.3892V17.8381H11.0923C11.2496 17.8381 11.3767 17.7112 11.3767 17.5547C11.3767 17.3983 11.2496 17.2713 11.0923 17.2713H5.97369C5.81647 17.2713 5.68937 17.3983 5.68937 17.5547Z"
+    />
+    <path
+      d="M35.76 19.0093H35.4758V18.159C35.4758 18.0025 35.3488 17.8756 35.1916 17.8756C35.0345 17.8756 34.9074 18.0025 34.9074 18.159V19.2927C34.9074 19.4492 35.0345 19.5762 35.1916 19.5762H35.7601C35.9173 19.5762 36.0443 19.4492 36.0443 19.2927C36.0443 19.1363 35.9172 19.0093 35.76 19.0093Z"
+    />
+    <path
+      d="M30.0761 26.3806H28.9387C28.7814 26.3806 28.6543 26.5076 28.6543 26.6641V28.3648C28.6543 28.5212 28.7814 28.6482 28.9387 28.6482H30.0761C30.2334 28.6482 30.3605 28.5212 30.3605 28.3648V26.6641C30.3605 26.5076 30.2334 26.3806 30.0761 26.3806ZM29.7918 28.0813H29.223V26.9476H29.7918L29.7918 28.0813Z"
+    />
+    <path
+      d="M30.3605 23.2631C30.3605 23.1067 30.2334 22.9797 30.0761 22.9797H28.9387C28.7814 22.9797 28.6543 23.1067 28.6543 23.2631V24.9638C28.6543 25.1203 28.7814 25.2473 28.9387 25.2473H30.0761C30.2334 25.2473 30.3605 25.1203 30.3605 24.9638L30.3605 23.2631ZM29.7918 24.6804H29.223V23.5466H29.7918L29.7918 24.6804Z"
+    />
+    <path
+      d="M30.9303 21.5627C30.9303 21.4063 30.8032 21.2793 30.646 21.2793H27.5179V20.9958C27.5179 20.8394 27.3908 20.7124 27.2336 20.7124C27.0763 20.7124 26.9492 20.8394 26.9492 20.9958V30.6331C26.9492 31.1019 27.332 31.4835 27.8023 31.4835H30.0773C30.5476 31.4835 30.9304 31.1019 30.9304 30.6331C30.9304 30.1643 30.5476 29.7828 30.0773 29.7828C30.0281 29.7828 29.9792 29.787 29.9311 29.7955C29.7352 29.4432 29.3612 29.2159 28.9398 29.2159C28.5184 29.2159 28.1444 29.4432 27.9485 29.7955C27.9005 29.787 27.8515 29.7828 27.8024 29.7828C27.702 29.7828 27.6073 29.8032 27.518 29.8349V21.8462H30.6461C30.8032 21.8462 30.9303 21.7192 30.9303 21.5627ZM27.8023 30.3497C27.8566 30.3497 27.9086 30.3653 27.9564 30.3959C28.0341 30.446 28.1316 30.4551 28.2175 30.4203C28.3034 30.3857 28.3665 30.3114 28.3878 30.2216C28.4475 29.9633 28.6745 29.7828 28.9398 29.7828C29.2051 29.7828 29.4317 29.9633 29.4917 30.2216C29.5131 30.3114 29.5762 30.3857 29.6621 30.4203C29.748 30.4551 29.8452 30.4461 29.9231 30.3959C30.1086 30.2768 30.3616 30.4225 30.3616 30.6331C30.3616 30.7893 30.2342 30.9166 30.0773 30.9166H27.8023C27.6453 30.9166 27.5179 30.7893 27.5179 30.6331C27.5179 30.4769 27.6453 30.3497 27.8023 30.3497Z"
+    />
+    <path
+      d="M39.1786 30.3475H31.7851C31.6278 30.3475 31.5007 30.4746 31.5007 30.6311V31.1983C31.5007 31.3548 31.6278 31.4818 31.7851 31.4818C31.9423 31.4818 32.0694 31.3548 32.0694 31.1983V30.9147H38.8942V31.1983C38.8942 31.3548 39.0213 31.4818 39.1786 31.4818C39.3359 31.4818 39.463 31.3548 39.463 31.1983V30.6311C39.463 30.4746 39.3359 30.3475 39.1786 30.3475Z"
+    />
+    <path
+      d="M31.7851 29.779C31.9423 29.779 32.0694 29.652 32.0694 29.4956V18.441C32.0694 18.2846 31.9423 18.1576 31.7851 18.1576C31.6278 18.1576 31.5007 18.2846 31.5007 18.441V29.4956C31.5007 29.652 31.6278 29.779 31.7851 29.779Z"
+    />
+    <path
+      d="M39.1795 17.8756C39.0223 17.8756 38.8952 18.0025 38.8952 18.159V29.497C38.8952 29.6534 39.0223 29.7804 39.1795 29.7804C39.3368 29.7804 39.4639 29.6534 39.4639 29.497V18.159C39.4639 18.0025 39.3368 17.8756 39.1795 17.8756Z"
+    />
+    <path
+      d="M43.716 20.7124C43.5587 20.7124 43.4316 20.8394 43.4316 20.9958V21.2793H40.3036C40.1463 21.2793 40.0192 21.4063 40.0192 21.5627C40.0192 21.7192 40.1463 21.8462 40.3036 21.8462H43.4316V29.8349C43.342 29.8031 43.2473 29.7827 43.1473 29.7827C43.0981 29.7827 43.0492 29.787 43.0011 29.7955C42.8052 29.4432 42.4312 29.2158 42.0098 29.2158C41.5884 29.2158 41.2144 29.4432 41.0185 29.7955C40.9704 29.787 40.9215 29.7827 40.8723 29.7827C40.402 29.7827 40.0192 30.1643 40.0192 30.6331C40.0192 31.1019 40.402 31.4834 40.8723 31.4834H43.1473C43.6176 31.4834 44.0004 31.1019 44.0004 30.6331V20.9959C44.0003 20.8394 43.8732 20.7124 43.716 20.7124ZM43.1472 30.9166H40.8723C40.7153 30.9166 40.5879 30.7893 40.5879 30.6332C40.5879 30.477 40.7153 30.3497 40.8723 30.3497C40.9266 30.3497 40.9786 30.3653 41.0264 30.3959C41.1043 30.4461 41.2016 30.4551 41.2875 30.4203C41.3733 30.3857 41.4365 30.3114 41.4578 30.2216C41.5175 29.9634 41.7444 29.7828 42.0097 29.7828C42.2751 29.7828 42.5017 29.9634 42.5617 30.2216C42.583 30.3114 42.6461 30.3857 42.732 30.4203C42.8179 30.4552 42.9151 30.4461 42.9931 30.3959C43.1787 30.2769 43.4315 30.4226 43.4315 30.6332C43.4316 30.7893 43.3042 30.9166 43.1472 30.9166Z"
+    />
+    <path
+      d="M39.8954 17.0663L35.6299 14.5152C35.5397 14.4611 35.4271 14.4611 35.337 14.5152L31.0715 17.0663C30.937 17.1467 30.8932 17.3208 30.9742 17.4552C31.055 17.5892 31.2293 17.6329 31.3644 17.5521L35.4834 15.0886L39.6025 17.5521C39.6483 17.5796 39.6989 17.5926 39.7486 17.5926C39.8453 17.5926 39.9395 17.5436 39.9926 17.4551C40.0737 17.3208 40.0299 17.1468 39.8954 17.0663Z"
+    />
+    <path
+      d="M40.6003 28.3648C40.6003 28.5212 40.7273 28.6482 40.8846 28.6482H42.0221C42.1793 28.6482 42.3064 28.5212 42.3064 28.3648V26.6641C42.3064 26.5076 42.1793 26.3806 42.0221 26.3806H40.8846C40.7273 26.3806 40.6003 26.5076 40.6003 26.6641V28.3648ZM41.169 26.9476H41.7377V28.0813H41.169V26.9476Z"
+    />
+    <path
+      d="M40.8846 25.2473H42.0221C42.1793 25.2473 42.3064 25.1203 42.3064 24.9638V23.2631C42.3064 23.1067 42.1793 22.9797 42.0221 22.9797H40.8846C40.7273 22.9797 40.6003 23.1067 40.6003 23.2631V24.9638C40.6003 25.1203 40.7273 25.2473 40.8846 25.2473ZM41.169 23.5466H41.7377V24.6804H41.169V23.5466Z"
+    />
+    <path
+      d="M35.2665 28.1571C35.2151 28.2109 35.1841 28.2818 35.1841 28.3583C35.1841 28.432 35.2151 28.5057 35.2665 28.5596C35.3203 28.6106 35.3913 28.6418 35.4684 28.6418C35.5423 28.6418 35.6159 28.6106 35.6702 28.5596C35.7213 28.5057 35.7526 28.432 35.7526 28.3583C35.7526 28.2818 35.7213 28.2109 35.6702 28.1571C35.565 28.0522 35.3686 28.0522 35.2665 28.1571Z"
+    />
+    <path
+      d="M33.2023 24.9638C33.2023 25.1203 33.3294 25.2473 33.4867 25.2473H34.6242C34.7814 25.2473 34.9085 25.1203 34.9085 24.9638V23.2631C34.9085 23.1067 34.7814 22.9797 34.6242 22.9797H33.4867C33.3294 22.9797 33.2023 23.1067 33.2023 23.2631V24.9638ZM33.7711 23.5466H34.3398V24.6804H33.7711V23.5466Z"
+    />
+    <path
+      d="M36.3331 22.9797C36.1759 22.9797 36.0488 23.1067 36.0488 23.2631V24.9638C36.0488 25.1203 36.1759 25.2473 36.3331 25.2473H37.4706C37.6278 25.2473 37.7549 25.1203 37.7549 24.9638V23.2631C37.7549 23.1067 37.6278 22.9797 37.4706 22.9797H36.3331ZM37.1862 24.6804H36.6175V23.5466H37.1862V24.6804Z"
+    />
+    <path
+      d="M35.4773 16.7437C34.2229 16.7437 33.2023 17.761 33.2023 19.0113C33.2023 20.2616 34.2229 21.2789 35.4773 21.2789C36.7316 21.2789 37.7522 20.2616 37.7522 19.0113C37.7522 17.761 36.7316 16.7437 35.4773 16.7437ZM35.4773 20.712C34.5363 20.712 33.7711 19.9492 33.7711 19.0113C33.7711 18.0734 34.5363 17.3106 35.4773 17.3106C36.4183 17.3106 37.1835 18.0734 37.1835 19.0113C37.1835 19.9492 36.4183 20.712 35.4773 20.712Z"
+    />
+    <path
+      d="M32.6386 26.6641C32.6386 26.8205 32.7657 26.9475 32.9229 26.9475H33.776V29.4986C33.776 29.655 33.9031 29.782 34.0604 29.782C34.2177 29.782 34.3448 29.655 34.3448 29.4986V26.9475H36.6197V29.4986C36.6197 29.655 36.7468 29.782 36.9041 29.782C37.0613 29.782 37.1884 29.655 37.1884 29.4986V26.9475H38.0415C38.1988 26.9475 38.3259 26.8205 38.3259 26.6641C38.3259 26.5076 38.1988 26.3806 38.0415 26.3806H32.9229C32.7657 26.3806 32.6386 26.5076 32.6386 26.6641Z"
+    />
+  </g>
+  <g [ngClass]="[twMerge('stroke-primary', class)]">
+    <path
+      d="M7.41198 24.2393C7.42035 27.0539 8.37002 29.7843 10.0992 31.9656C11.8283 34.1468 14.23 35.6438 16.895 36.2014C19.5599 36.7591 22.3233 36.343 24.7142 35.024C25.8791 34.3813 26.9205 33.5436 27.8015 32.5532M4.12891 29.2798L7.04768 24.0215L12.1392 27.0791"
+      stroke-width="2"
+      stroke-linejoin="round"
+    />
+    <path
+      d="M33.745 13.2033C33.7367 10.3888 32.787 7.65832 31.0578 5.4771C29.3287 3.29588 26.927 1.7989 24.262 1.24122C21.5971 0.683541 18.8337 1.09967 16.4428 2.4187C15.2779 3.06137 14.2365 3.89902 13.3555 4.88946M37.0281 8.16288L34.1093 13.4212L29.0178 10.3635"
+      stroke-width="2"
+      stroke-linejoin="round"
+    />
+  </g>
+</svg>
diff --git a/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.spec.ts b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af3252cb43e04538d31228d8ff3f6186b459dfdd
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { PublicAdministrationIconComponent } from './public-administration-icon.component';
+
+describe('PublicAdministrationIconComponent', () => {
+  let component: PublicAdministrationIconComponent;
+  let fixture: ComponentFixture<PublicAdministrationIconComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [PublicAdministrationIconComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(PublicAdministrationIconComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2d09979eea5219f1d993e05a4cb8989002c8ab5a
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.component.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { twMerge } from 'tailwind-merge';
+
+@Component({
+  selector: 'ods-public-administration-icon',
+  standalone: true,
+  imports: [CommonModule],
+  templateUrl: './public-administration-icon.component.html',
+})
+export class PublicAdministrationIconComponent {
+  @Input() class: string = undefined;
+
+  readonly twMerge = twMerge;
+}
diff --git a/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.stories.ts b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c68129b3c4607671a7898891fb89c9d4690ffe6c
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/public-administration-icon/public-administration-icon.stories.ts
@@ -0,0 +1,15 @@
+import type { Meta, StoryObj } from '@storybook/angular';
+
+import { PublicAdministrationIconComponent } from './public-administration-icon.component';
+
+const meta: Meta<PublicAdministrationIconComponent> = {
+  title: 'Icons/Public administration icon',
+  component: PublicAdministrationIconComponent,
+  excludeStories: /.*Data$/,
+  tags: ['autodocs'],
+};
+
+export default meta;
+type Story = StoryObj<PublicAdministrationIconComponent>;
+
+export const Default: Story = {};
diff --git a/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.spec.ts b/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.spec.ts
index 72cc13e7708a00114b96193a07e83a855f0c628c..b83a6e167dbaabae7a8a6e4b6595086ff48bde93 100644
--- a/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.spec.ts
@@ -1,12 +1,6 @@
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { EventEmitter } from '@angular/core';
-import {
-  ComponentFixture,
-  TestBed,
-  discardPeriodicTasks,
-  fakeAsync,
-  tick,
-} from '@angular/core/testing';
+import { ComponentFixture, TestBed, discardPeriodicTasks, fakeAsync, tick } from '@angular/core/testing';
 import { Resource } from '@ngxp/rest';
 import { Subscription } from 'rxjs';
 import { InstantSearchComponent } from './instant-search.component';
@@ -184,16 +178,13 @@ describe('InstantSearchComponent', () => {
     });
 
     describe('on null or undefined', () => {
-      it.each([null, undefined])(
-        'should not call setSearchResults for %s',
-        (searchResults: InstantSearchResult<Resource>[]) => {
-          component.setSearchResults = jest.fn();
+      it.each([null, undefined])('should not call setSearchResults for %s', (searchResults: InstantSearchResult<Resource>[]) => {
+        component.setSearchResults = jest.fn();
 
-          component.searchResults = searchResults;
+        component.searchResults = searchResults;
 
-          expect(component.setSearchResults).not.toHaveBeenCalled();
-        },
-      );
+        expect(component.setSearchResults).not.toHaveBeenCalled();
+      });
     });
   });
 
@@ -274,11 +265,11 @@ describe('InstantSearchComponent', () => {
     });
 
     it('should call hideResults', () => {
-      component.hideResults = jest.fn();
+      component.searchClosed.emit = jest.fn();
 
       component.handleEscape(event);
 
-      expect(component.hideResults).toHaveBeenCalled();
+      expect(component.searchClosed.emit).toHaveBeenCalled();
     });
   });
 
@@ -362,17 +353,13 @@ describe('InstantSearchComponent', () => {
     it('should return text for one result', () => {
       const result: string = component.buildAriaLiveText(1);
 
-      expect(result).toBe(
-        'Ein Suchergebnis für Eingabe test. Nutze Pfeiltaste nach unten, um das zu erreichen.',
-      );
+      expect(result).toBe('Ein Suchergebnis für Eingabe test. Nutze Pfeiltaste nach unten, um das zu erreichen.');
     });
 
     it('should return text for many results', () => {
       const result: string = component.buildAriaLiveText(4);
 
-      expect(result).toBe(
-        '4 Suchergebnisse für Eingabe test. Nutze Pfeiltaste nach unten, um diese zu erreichen.',
-      );
+      expect(result).toBe('4 Suchergebnisse für Eingabe test. Nutze Pfeiltaste nach unten, um diese zu erreichen.');
     });
 
     it('should return text for no results', () => {
@@ -396,14 +383,6 @@ describe('InstantSearchComponent', () => {
 
       expect(component.areResultsVisible).toBe(false);
     });
-
-    it('should emit searchResultClosed event', () => {
-      component.searchResultClosed.emit = jest.fn();
-
-      component.hideResults();
-
-      expect(component.searchResultClosed.emit).toHaveBeenCalled();
-    });
   });
 
   describe('onKeydownHandler', () => {
diff --git a/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.ts b/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.ts
index 80a889a7bfa1211c008d3891cfb80d98d811448e..8b23822f25beea96c9bdf42a52c4eba075c50b9d 100644
--- a/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.ts
+++ b/alfa-client/libs/design-system/src/lib/instant-search/instant-search/instant-search.component.ts
@@ -15,7 +15,7 @@ import {
 import { FormControl } from '@angular/forms';
 import { Resource } from '@ngxp/rest';
 import { isEqual, isUndefined } from 'lodash-es';
-import { Subscription, debounceTime, distinctUntilChanged, filter } from 'rxjs';
+import { Subscription, debounceTime, filter } from 'rxjs';
 import { AriaLiveRegionComponent } from '../../aria-live-region/aria-live-region.component';
 import { SearchFieldComponent } from '../search-field/search-field.component';
 import { SearchResultHeaderComponent } from '../search-result-header/search-result-header.component';
@@ -50,12 +50,7 @@ import { InstantSearchQuery, InstantSearchResult } from './instant-search.model'
       containerClass="absolute z-50 mt-3 max-h-[calc(50vh)] w-full overflow-y-auto"
       id="results"
     >
-      <ods-search-result-header
-        *ngIf="headerText"
-        [text]="headerText"
-        [count]="results.length"
-        header
-      />
+      <ods-search-result-header *ngIf="headerText" [text]="headerText" [count]="results.length" header />
       <ods-search-result-item
         *ngFor="let result of results; let i = index"
         [title]="result.title"
@@ -79,12 +74,9 @@ export class InstantSearchComponent implements OnInit, OnDestroy {
     }
   }
 
-  @Output() searchResultSelected: EventEmitter<InstantSearchResult<Resource>> = new EventEmitter<
-    InstantSearchResult<Resource>
-  >();
-  @Output() searchResultClosed: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
-  @Output() searchQueryChanged: EventEmitter<InstantSearchQuery> =
-    new EventEmitter<InstantSearchQuery>();
+  @Output() searchClosed: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
+  @Output() searchResultSelected: EventEmitter<InstantSearchResult<Resource>> = new EventEmitter<InstantSearchResult<Resource>>();
+  @Output() searchQueryChanged: EventEmitter<InstantSearchQuery> = new EventEmitter<InstantSearchQuery>();
   @Output() searchQueryCleared: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
 
   readonly FIRST_ITEM_INDEX: number = 0;
@@ -107,8 +99,8 @@ export class InstantSearchComponent implements OnInit, OnDestroy {
     this.formControlSubscription = this.control.valueChanges
       .pipe(
         debounceTime(InstantSearchComponent.DEBOUNCE_TIME_IN_MILLIS),
+        filter((value) => Boolean(value)),
         filter((value: string) => value.length >= this.PREVIEW_SEARCH_STRING_MIN_LENGTH),
-        distinctUntilChanged(),
       )
       .subscribe((searchBy: string) => {
         this.searchQueryChanged.emit({ searchBy });
@@ -146,6 +138,7 @@ export class InstantSearchComponent implements OnInit, OnDestroy {
   handleEscape(e: KeyboardEvent): void {
     e.preventDefault();
     this.hideResults();
+    this.searchClosed.emit();
   }
 
   setFocusOnResultItem(index: number): void {
@@ -201,7 +194,6 @@ export class InstantSearchComponent implements OnInit, OnDestroy {
   hideResults(): void {
     this.areResultsVisible = false;
     this.focusedResult = undefined;
-    this.searchResultClosed.emit();
   }
 
   isLastItemOrOutOfArray(index: number, arrayLength: number): boolean {
@@ -224,7 +216,7 @@ export class InstantSearchComponent implements OnInit, OnDestroy {
     return e.key === 'Escape';
   }
 
-  onItemClicked(searchResult: InstantSearchResult<Resource>, index: number) {
+  onItemClicked(searchResult: InstantSearchResult<Resource>, index: number): void {
     this.searchResultSelected.emit(searchResult);
     this.focusedResult = index;
     this.hideResults();
diff --git a/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.spec.ts b/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0aef13978f11b606c0be0d6e0dbb6c297e8149e0
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.spec.ts
@@ -0,0 +1,40 @@
+import { getElementFromFixture } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { provideRouter } from '@angular/router';
+import { faker } from '@faker-js/faker';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { ListItemComponent } from './list-item.component';
+
+describe('ListItemComponent', () => {
+  let component: ListItemComponent;
+  let fixture: ComponentFixture<ListItemComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ListItemComponent],
+      providers: [provideRouter([])],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ListItemComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('input', () => {
+    describe('routerLink', () => {
+      it('should set href attribute', () => {
+        component.path = faker.system.filePath();
+        const resultingLink: string = 'http://localhost' + component.path;
+        const linkElement: HTMLLinkElement = getElementFromFixture(fixture, getDataTestClassOf('list-item-link'));
+
+        fixture.detectChanges();
+
+        expect(linkElement.href).toBe(resultingLink);
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.ts b/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e99fef42c4db3be62e2f83901fc30eb32df0017e
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/list/list-item/list-item.component.ts
@@ -0,0 +1,21 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { RouterLink } from '@angular/router';
+
+@Component({
+  selector: 'ods-list-item',
+  standalone: true,
+  imports: [CommonModule, RouterLink],
+  template: `<li>
+    <a
+      [routerLink]="path"
+      data-test-class="list-item-link"
+      class="flex flex-col items-start justify-between gap-6 border-primary-600/50 px-6 py-4 hover:bg-background-150 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus lg:flex-row"
+      ><ng-content
+    /></a>
+  </li>`,
+  styles: [':host { @apply block w-full }'],
+})
+export class ListItemComponent {
+  @Input() path: string;
+}
diff --git a/alfa-client/libs/design-system/src/lib/list/list.component.spec.ts b/alfa-client/libs/design-system/src/lib/list/list.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35076e4e0ed34c166da97e496571c43c642f14a0
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/list/list.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ListComponent } from './list.component';
+
+describe('ListComponent', () => {
+  let component: ListComponent;
+  let fixture: ComponentFixture<ListComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ListComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ListComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/list/list.component.ts b/alfa-client/libs/design-system/src/lib/list/list.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c4e903c1990ebc67a3bcb51f7e3596d0391c011e
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/list/list.component.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { Component } from '@angular/core';
+import { ListItemComponent } from './list-item/list-item.component';
+
+@Component({
+  selector: 'ods-list',
+  standalone: true,
+  imports: [CommonModule, ListItemComponent],
+  template: `
+    <ul class="divide-y divide-gray-300 rounded-md bg-background-50 text-text shadow-sm ring-1 ring-gray-300 empty:hidden">
+      <ng-content />
+    </ul>
+  `,
+})
+export class ListComponent {}
diff --git a/alfa-client/libs/design-system/src/lib/list/list.stories.ts b/alfa-client/libs/design-system/src/lib/list/list.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..85aca93322bcbf330f47e08610814dc3f0fedbf7
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/list/list.stories.ts
@@ -0,0 +1,42 @@
+import { APP_BASE_HREF } from '@angular/common';
+import { importProvidersFrom } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { applicationConfig, moduleMetadata, type Meta, type StoryObj } from '@storybook/angular';
+import { ListItemComponent } from './list-item/list-item.component';
+import { ListComponent } from './list.component';
+
+const meta: Meta<ListComponent> = {
+  title: 'List',
+  component: ListComponent,
+  excludeStories: /.*Data$/,
+  tags: ['autodocs'],
+  decorators: [
+    applicationConfig({
+      providers: [importProvidersFrom(RouterModule.forRoot([]))],
+    }),
+    moduleMetadata({
+      imports: [ListItemComponent],
+      providers: [
+        {
+          provide: APP_BASE_HREF,
+          useValue: '/',
+        },
+      ],
+    }),
+  ],
+};
+
+export default meta;
+type Story = StoryObj<ListComponent>;
+
+export const Default: Story = {
+  args: {},
+  render: () => ({
+    template: `
+      <ods-list>
+        <ods-list-item path="/pfad/1">List Item 1</ods-list-item>
+        <ods-list-item path="/pfad/2">List Item 2</ods-list-item>
+        <ods-list-item path="/pfad/3">List Item 3</ods-list-item>
+      </ods-list>`,
+  }),
+};
diff --git a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
index 71b3e7c98f8e23d30f056ef4ad65544794294196..220af3f589fc2bb8ad7eea2817af77a01ccf98e5 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.spec.ts
@@ -1,3 +1,4 @@
+import { convertForDataTest, TechSharedModule } from '@alfa-client/tech-shared';
 import { getElementFromFixture, Mock, mock } from '@alfa-client/test-utils';
 import { importProvidersFrom } from '@angular/core';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
@@ -13,7 +14,7 @@ describe('NavItemComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [NavItemComponent],
+      imports: [NavItemComponent, TechSharedModule],
       providers: [
         {
           provide: Router,
@@ -36,27 +37,23 @@ describe('NavItemComponent', () => {
     describe('caption', () => {
       it('should set link text', () => {
         component.caption = 'Test caption';
-        fixture.detectChanges();
+        const testId: string = 'caption-' + convertForDataTest(component.caption);
 
-        const captionElement: HTMLParagraphElement = getElementFromFixture(
-          fixture,
-          getDataTestIdOf('link-caption'),
-        );
+        fixture.detectChanges();
 
+        const captionElement: HTMLParagraphElement = getElementFromFixture(fixture, getDataTestIdOf(testId));
         expect(captionElement.innerHTML).toBe('Test caption');
       });
     });
 
-    describe('to', () => {
+    describe('path', () => {
       it('should set href', () => {
-        component.to = '/';
-        fixture.detectChanges();
+        component.path = 'pfad';
+        const testId: string = 'link-path-' + convertForDataTest(component.path);
 
-        const linkElement: HTMLAnchorElement = getElementFromFixture(
-          fixture,
-          getDataTestIdOf('link-to-/'),
-        );
+        fixture.detectChanges();
 
+        const linkElement: HTMLAnchorElement = getElementFromFixture(fixture, getDataTestIdOf(testId));
         expect(linkElement).toHaveProperty('href');
       });
     });
diff --git a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
index df3cc837b44933211f471f15420d87d88a95985b..0bf2f5580404c802a94c8f25d167638a9a5bf901 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/nav-item/nav-item.component.ts
@@ -1,3 +1,4 @@
+import { TechSharedModule } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, HostBinding, Input } from '@angular/core';
 import { RouterLink, RouterLinkActive } from '@angular/router';
@@ -5,22 +6,22 @@ import { RouterLink, RouterLinkActive } from '@angular/router';
 @Component({
   selector: 'ods-nav-item',
   standalone: true,
-  imports: [CommonModule, RouterLink, RouterLinkActive],
+  imports: [CommonModule, RouterLink, RouterLinkActive, TechSharedModule],
   template: `<a
-    [routerLink]="to"
+    [routerLink]="path"
     routerLinkActive="bg-selected-light border-selected"
     class="flex min-h-8 items-center gap-2 rounded-2xl border border-transparent
     px-4 py-2 outline-2 outline-offset-2 outline-focus hover:border-primary
     focus-visible:border-background-200 focus-visible:outline"
-    [attr.data-test-id]="'link-to-' + to"
+    [attr.data-test-id]="'link-path-' + path | convertForDataTest"
   >
     <ng-content select="[icon]" />
-    <p class="text-left text-sm text-text" data-test-id="link-caption">{{ caption }}</p>
+    <p class="text-left text-sm text-text" [attr.data-test-id]="'caption-' + caption | convertForDataTest">{{ caption }}</p>
   </a>`,
 })
 export class NavItemComponent {
   @Input({ required: true }) caption!: string;
-  @Input() to: string;
+  @Input() path: string;
 
-  @HostBinding('attr.role') role = 'menuitem';
+  @HostBinding('attr.role') role: string = 'menuitem';
 }
diff --git a/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts b/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
index fa5b213b2e0f14fe9de3643ce21e123f042df68c..8ae3842b6143820d0340035f9522a285610018d6 100644
--- a/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
+++ b/alfa-client/libs/design-system/src/lib/navbar/navbar/navbar.stories.ts
@@ -34,10 +34,10 @@ export const Default: Story = {
   args: {},
   render: () => ({
     template: `<ods-navbar>
-      <ods-nav-item caption="First link" to="/"><ods-office-icon icon /></ods-nav-item>
-      <ods-nav-item caption="Second link" to="/second"><ods-office-icon icon /></ods-nav-item>
+      <ods-nav-item caption="First link" path="/"><ods-office-icon icon /></ods-nav-item>
+      <ods-nav-item caption="Second link" path="/second"><ods-office-icon icon /></ods-nav-item>
       <hr />
-      <ods-nav-item caption="Third link" to="/third"><ods-office-icon icon /></ods-nav-item>
+      <ods-nav-item caption="Third link" path="/third"><ods-office-icon icon /></ods-nav-item>
     </ods-navbar>`,
   }),
 };
diff --git a/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js b/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js
index 3d33483b952c991b6d66bbf1170437c787cb80f4..88f03501ec468c7aea37ab033a35ce86c7d57280 100644
--- a/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js
+++ b/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js
@@ -6,10 +6,7 @@ const { join } = require('path');
 
 /** @type {import('tailwindcss').Config} */
 module.exports = {
-  content: [
-    join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'),
-    ...createGlobPatternsForDependencies(__dirname),
-  ],
+  content: [join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), ...createGlobPatternsForDependencies(__dirname)],
   darkMode: 'class',
   theme: {
     extend: {
diff --git a/alfa-client/libs/hint-shared/src/lib/+state/hint.selectors.spec.ts b/alfa-client/libs/hint-shared/src/lib/+state/hint.selectors.spec.ts
index 089d388d83aa3ba8fba808650bac4f05e5c7e08e..2903a67670d831b52dd9943c477d703116a2bd04 100644
--- a/alfa-client/libs/hint-shared/src/lib/+state/hint.selectors.spec.ts
+++ b/alfa-client/libs/hint-shared/src/lib/+state/hint.selectors.spec.ts
@@ -22,17 +22,15 @@ describe('Hint Selectors', () => {
   });
 
   describe('hasNoOrganisationsEinheitId', () => {
-    const getHasUserNoOrganisationsEinheitIdSpy: jest.SpyInstance<
-      boolean,
-      [hintList: HintListResource]
-    > = jest.spyOn(HintUtil, 'hasUserNoOrganisationsEinheitIdHint');
+    const getHasUserNoOrganisationsEinheitIdSpy: jest.SpyInstance<boolean, [hintList: HintListResource]> = jest.spyOn(
+      HintUtil,
+      'hasUserNoOrganisationsEinheitIdHint',
+    );
 
     it('should return stateResource with hint if exist', () => {
       getHasUserNoOrganisationsEinheitIdSpy.mockReturnValue(true);
 
-      const result: boolean = HintSelectors.hasUserNoOrganisationsEinheitIdHint.projector(
-        state.HintState,
-      );
+      const result: boolean = HintSelectors.hasUserNoOrganisationsEinheitIdHint.projector(state.HintState);
 
       expect(result).toBeTruthy();
     });
@@ -40,9 +38,7 @@ describe('Hint Selectors', () => {
     it('should return emptyStateResource if not exist', () => {
       getHasUserNoOrganisationsEinheitIdSpy.mockReturnValue(false);
 
-      const result: boolean = HintSelectors.hasUserNoOrganisationsEinheitIdHint.projector(
-        state.HintState,
-      );
+      const result: boolean = HintSelectors.hasUserNoOrganisationsEinheitIdHint.projector(state.HintState);
 
       expect(result).toBeFalsy();
     });
@@ -50,7 +46,7 @@ describe('Hint Selectors', () => {
     it('should return emptyStateResource if resource is null', () => {
       const result: boolean = HintSelectors.hasUserNoOrganisationsEinheitIdHint.projector({
         ...state.HintState,
-        hintList: createEmptyListResource(),
+        hintList: createEmptyListResource<HintListResource>(),
       });
 
       expect(result).toBeFalsy();
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
index 977db3428026e075b535d45b53e6cdd9865579fb..e4421c2c22364a7a444d5796929194b2ca4bba61 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
@@ -1,11 +1,9 @@
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { fakeAsync, tick } from '@angular/core/testing';
 import { Resource } from '@ngxp/rest';
-import { Observable, of, throwError } from 'rxjs';
+import { Observable, of } from 'rxjs';
 import { singleCold, singleHot } from '../../../test//marbles';
-import { createProblemDetail } from '../../../test/error';
 import { createDummyResource } from '../../../test/resource';
-import { ProblemDetail } from '../tech.model';
 import { ApiResourceService } from './api-resource.service';
 import { LinkRelationName, ResourceServiceConfig, SaveResourceData } from './resource.model';
 import { ResourceRepository } from './resource.repository';
@@ -70,22 +68,52 @@ describe('ApiResourceService', () => {
       expect(saved).toBeObservable(singleCold(createStateResource(loadedResource)));
     });
 
-    it('should call handleError', () => {
-      service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel])));
-      const errorResponse: ProblemDetail = createProblemDetail();
-      repository.save.mockReturnValue(throwError(() => errorResponse));
-      service.handleError = jest.fn();
+    it('should update state resource subject', fakeAsync(() => {
+      service.stateResource.next(createStateResource(resourceWithEditLinkRel));
+      repository.save.mockReturnValue(of(loadedResource));
+
+      service.save(dummyToSave).subscribe();
+      tick();
+
+      expect(service.stateResource.value).toEqual(createStateResource(loadedResource));
+    }));
+  });
+
+  describe('patch', () => {
+    const dummyToPatch: unknown = {};
+    const loadedResource: Resource = createDummyResource();
+
+    const resourceWithEditLinkRel: Resource = createDummyResource([editLinkRel]);
+
+    it('should call repository', fakeAsync(() => {
+      service.stateResource.next(createStateResource(resourceWithEditLinkRel));
+      repository.patch.mockReturnValue(of(loadedResource));
 
-      service.save(<any>{}).subscribe();
+      service.patch(dummyToPatch).subscribe();
+      tick();
 
-      expect(service.handleError).toHaveBeenCalledWith(errorResponse);
+      const expectedSaveResourceData: SaveResourceData<Resource> = {
+        resource: resourceWithEditLinkRel,
+        linkRel: editLinkRel,
+        toSave: dummyToPatch,
+      };
+      expect(repository.patch).toHaveBeenCalledWith(expectedSaveResourceData);
+    }));
+
+    it('should return patched object', () => {
+      service.stateResource.next(createStateResource(resourceWithEditLinkRel));
+      repository.patch.mockReturnValue(singleHot(loadedResource));
+
+      const saved: Observable<StateResource<Resource>> = service.patch(dummyToPatch);
+
+      expect(saved).toBeObservable(singleCold(createStateResource(loadedResource)));
     });
 
     it('should update state resource subject', fakeAsync(() => {
       service.stateResource.next(createStateResource(resourceWithEditLinkRel));
-      repository.save.mockReturnValue(of(loadedResource));
+      repository.patch.mockReturnValue(of(loadedResource));
 
-      service.save(dummyToSave).subscribe();
+      service.patch(dummyToPatch).subscribe();
       tick();
 
       expect(service.stateResource.value).toEqual(createStateResource(loadedResource));
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.ts
index d19c4a6fdc52813b270661c560bf76bed7f3ba24..f27414058aae8584e3ce77dd8668735232c33acd 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.ts
@@ -4,10 +4,7 @@ import { ResourceServiceConfig } from './resource.model';
 import { ResourceRepository } from './resource.repository';
 import { ResourceService } from './resource.service';
 
-export class ApiResourceService<B extends Resource, T extends Resource> extends ResourceService<
-  B,
-  T
-> {
+export class ApiResourceService<B extends Resource, T extends Resource> extends ResourceService<B, T> {
   constructor(
     protected config: ResourceServiceConfig<B>,
     protected repository: ResourceRepository,
@@ -22,4 +19,12 @@ export class ApiResourceService<B extends Resource, T extends Resource> extends
       toSave,
     });
   }
+
+  doPatch(resource: T, toPatch: unknown): Observable<T> {
+    return <Observable<T>>this.repository.patch({
+      resource,
+      linkRel: this.config.edit.linkRel,
+      toSave: toPatch,
+    });
+  }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts
index 85de9a5726263a797b4682e3f4a647f6dc202985..0864617da8cadf79db67003fb5fcae343da2ee68 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts
@@ -4,29 +4,14 @@ import { faker } from '@faker-js/faker';
 import { Resource, ResourceUri } from '@ngxp/rest';
 import { cold } from 'jest-marbles';
 import { DummyLinkRel, DummyListLinkRel } from 'libs/tech-shared/test/dummy';
-import {
-  createDummyListResource,
-  createDummyResource,
-  createFilledDummyListResource,
-} from 'libs/tech-shared/test/resource';
+import { createDummyListResource, createDummyResource, createFilledDummyListResource } from 'libs/tech-shared/test/resource';
 import { BehaviorSubject, Observable, of } from 'rxjs';
 import { singleCold, singleHot } from '../../../test/marbles';
+import { EMPTY_ARRAY } from '../tech.util';
 import { ResourceListService } from './list-resource.service';
-import {
-  CreateResourceData,
-  LinkRelationName,
-  ListItemResource,
-  ListResourceServiceConfig,
-} from './resource.model';
+import { CreateResourceData, LinkRelationName, ListItemResource, ListResourceServiceConfig } from './resource.model';
 import { ResourceRepository } from './resource.repository';
-import {
-  ListResource,
-  StateResource,
-  createEmptyStateResource,
-  createStateResource,
-} from './resource.util';
-
-import { EMPTY_ARRAY } from '../tech.util';
+import { ListResource, StateResource, createEmptyStateResource, createStateResource } from './resource.util';
 
 import * as ResourceUtil from './resource.util';
 
@@ -42,9 +27,9 @@ describe('ListResourceService', () => {
 
   const baseResource: Resource = createDummyResource();
   const baseStateResource: StateResource<Resource> = createStateResource(baseResource);
-  const baseResourceSubj: BehaviorSubject<StateResource<Resource>> = new BehaviorSubject<
-    StateResource<Resource>
-  >(baseStateResource);
+  const baseResourceSubj: BehaviorSubject<StateResource<Resource>> = new BehaviorSubject<StateResource<Resource>>(
+    baseStateResource,
+  );
 
   beforeEach(() => {
     config = {
@@ -63,8 +48,7 @@ describe('ListResourceService', () => {
   });
 
   describe('getList', () => {
-    const listStateResource: StateResource<ListResource> =
-      createStateResource(createDummyListResource());
+    const listStateResource: StateResource<ListResource> = createStateResource(createDummyListResource());
 
     let isInvalidResourceCombinationSpy: jest.SpyInstance;
 
@@ -73,9 +57,7 @@ describe('ListResourceService', () => {
 
       service.handleNullConfigResource = jest.fn();
       service.handleChanges = jest.fn();
-      isInvalidResourceCombinationSpy = jest
-        .spyOn(ResourceUtil, 'isInvalidResourceCombination')
-        .mockReturnValue(true);
+      isInvalidResourceCombinationSpy = jest.spyOn(ResourceUtil, 'isInvalidResourceCombination').mockReturnValue(true);
     });
 
     it('should handle config resource changed', fakeAsync(() => {
@@ -104,15 +86,12 @@ describe('ListResourceService', () => {
 
       const apiRootStateResource$: Observable<StateResource<Resource>> = service.getList();
 
-      expect(apiRootStateResource$).toBeObservable(
-        cold('a', { a: createEmptyStateResource(true) }),
-      );
+      expect(apiRootStateResource$).toBeObservable(cold('a', { a: createEmptyStateResource(true) }));
     });
   });
 
   describe('handle changes', () => {
-    const listStateResource: StateResource<ListResource> =
-      createStateResource(createDummyListResource());
+    const listStateResource: StateResource<ListResource> = createStateResource(createDummyListResource());
     const changedConfigResource: Resource = createDummyResource();
 
     describe('on different config resource', () => {
@@ -127,8 +106,7 @@ describe('ListResourceService', () => {
     });
 
     describe('on same config resource', () => {
-      const listStateResource: StateResource<ListResource> =
-        createStateResource(createDummyListResource());
+      const listStateResource: StateResource<ListResource> = createStateResource(createDummyListResource());
 
       beforeEach(() => {
         service.baseResource = baseResource;
@@ -210,8 +188,7 @@ describe('ListResourceService', () => {
 
       it('should keep current current list resource on unstable state resource', () => {
         jest.spyOn(ResourceUtil, 'isStateResoureStable').mockReturnValue(false);
-        const currentListStateResource: StateResource<ListResource> =
-          createStateResource(createDummyListResource());
+        const currentListStateResource: StateResource<ListResource> = createStateResource(createDummyListResource());
         service.listResource.next(currentListStateResource);
 
         const configResuorceWithoutLink: Resource = createDummyListResource();
@@ -318,18 +295,6 @@ describe('ListResourceService', () => {
       resourceRepository.getResource.mockReturnValue(of(loadedResource));
     });
 
-    it('should throw error if listResource is not valid', () => {
-      service.listResource.next(createEmptyStateResource());
-
-      expect(() => service.select(selfHref)).toThrowError('No list resource available.');
-    });
-
-    it('should throw error if uri not exists in list resource', () => {
-      expect(() => service.select('uriNotExistsInListResource')).toThrowError(
-        'No entry match with given uri.',
-      );
-    });
-
     it('should set resource loading', () => {
       service.setSelectedResourceLoading = jest.fn();
 
@@ -375,8 +340,7 @@ describe('ListResourceService', () => {
 
   describe('getSelected', () => {
     it('should return selected resource', (done) => {
-      const dummyStateResource: StateResource<Resource> =
-        createStateResource(createDummyResource());
+      const dummyStateResource: StateResource<Resource> = createStateResource(createDummyResource());
 
       service.getSelected().subscribe((selected) => {
         expect(selected).toEqual(dummyStateResource);
@@ -411,10 +375,7 @@ describe('ListResourceService', () => {
 
       service.prev();
 
-      expect(resourceRepository.getListResource).toHaveBeenCalledWith(
-        listResource,
-        service.prevLink,
-      );
+      expect(resourceRepository.getListResource).toHaveBeenCalledWith(listResource, service.prevLink);
     });
 
     it('should update listResource', () => {
@@ -443,10 +404,7 @@ describe('ListResourceService', () => {
 
       service.next();
 
-      expect(resourceRepository.getListResource).toHaveBeenCalledWith(
-        listResourceWithPrevLink,
-        service.nextLink,
-      );
+      expect(resourceRepository.getListResource).toHaveBeenCalledWith(listResourceWithPrevLink, service.nextLink);
     });
 
     it('should update listResource', () => {
@@ -485,9 +443,7 @@ describe('ListResourceService', () => {
 
   describe('get items', () => {
     const listResourceItems: ListItemResource[] = [createDummyResource()];
-    const stateListResource: StateResource<ListResource> = createStateResource(
-      createFilledDummyListResource(listResourceItems),
-    );
+    const stateListResource: StateResource<ListResource> = createStateResource(createFilledDummyListResource(listResourceItems));
     let getListSpy: jest.SpyInstance;
 
     beforeEach(() => {
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts
index 631e1c685eba0e9f96e5a4e1d97e1314a1cb7e9f..4bb6beecc38df96224fa5adf1b4ede5ed4729039 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts
@@ -1,15 +1,6 @@
 import { Resource, ResourceUri, getUrl, hasLink } from '@ngxp/rest';
 import { isEqual, isNull } from 'lodash-es';
-import {
-  BehaviorSubject,
-  Observable,
-  combineLatest,
-  filter,
-  first,
-  map,
-  startWith,
-  tap,
-} from 'rxjs';
+import { BehaviorSubject, Observable, combineLatest, filter, first, map, startWith, tap } from 'rxjs';
 import { isNotNull, isNotUndefined } from '../tech.util';
 import { CreateResourceData, ListItemResource, ListResourceServiceConfig } from './resource.model';
 import { ResourceRepository } from './resource.repository';
@@ -31,21 +22,13 @@ import {
  * T = Type of listresource
  * I = Type of items in listresource
  */
-export class ResourceListService<
-  B extends Resource,
-  T extends ListResource,
-  I extends ListItemResource,
-> {
+export class ResourceListService<B extends Resource, T extends ListResource, I extends ListItemResource> {
   readonly nextLink: string = 'next';
   readonly prevLink: string = 'prev';
 
-  readonly listResource: BehaviorSubject<StateResource<T>> = new BehaviorSubject(
-    createEmptyStateResource(),
-  );
+  readonly listResource: BehaviorSubject<StateResource<T>> = new BehaviorSubject(createEmptyStateResource());
 
-  readonly selectedResource: BehaviorSubject<StateResource<I>> = new BehaviorSubject(
-    createEmptyStateResource(),
-  );
+  readonly selectedResource: BehaviorSubject<StateResource<I>> = new BehaviorSubject(createEmptyStateResource());
 
   baseResource: B = null;
 
@@ -56,7 +39,9 @@ export class ResourceListService<
 
   public getList(): Observable<StateResource<T>> {
     return combineLatest([this.listResource.asObservable(), this.getConfigResource()]).pipe(
-      tap(([stateResource, configResource]) => this.handleChanges(stateResource, configResource)),
+      tap(([stateResource, configResource]) => {
+        this.handleChanges(stateResource, configResource);
+      }),
       tap(([, configResource]) => this.handleNullConfigResource(configResource)),
       filter(([stateResource]) => !isInvalidResourceCombination(stateResource, this.baseResource)),
       mapToFirst<T, B>(),
@@ -109,9 +94,7 @@ export class ResourceListService<
 
   public create(toCreate: unknown): Observable<Resource> {
     this.verifyBeforeCreation();
-    return this.repository.createResource(
-      this.buildCreateResourceData(toCreate, this.config.createLinkRel),
-    );
+    return this.repository.createResource(this.buildCreateResourceData(toCreate, this.config.createLinkRel));
   }
 
   private verifyBeforeCreation(): void {
@@ -132,7 +115,6 @@ export class ResourceListService<
   }
 
   public select(uri: ResourceUri): void {
-    this.verifyBeforeSelection(uri);
     this.setSelectedResourceLoading();
     this.repository
       .getResource(uri)
@@ -156,10 +138,7 @@ export class ResourceListService<
   }
 
   existsUriInList(uri: ResourceUri): boolean {
-    const listResources: Resource[] = getEmbeddedResources(
-      this.listResource.value,
-      this.config.listLinkRel,
-    );
+    const listResources: Resource[] = getEmbeddedResources(this.listResource.value, this.config.listLinkRel);
 
     return isNotUndefined(listResources.find((resource) => getUrl(resource) === uri));
   }
@@ -234,10 +213,7 @@ export class ResourceListService<
     return this.getList().pipe(
       filter((listStateResource: StateResource<T>) => !listStateResource.loading),
       map((listStateResource: StateResource<T>) =>
-        getEmbeddedResources<ListItemResource>(
-          listStateResource,
-          this.config.listResourceListLinkRel,
-        ),
+        getEmbeddedResources<ListItemResource>(listStateResource, this.config.listResourceListLinkRel),
       ),
     );
   }
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.spec.ts
index 2bba6504c7395f12a1e1475f797d07ba494ec5f5..6670a414e1f9e8ec801a5fb1d6da9120d63ad7e3 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.spec.ts
@@ -13,7 +13,7 @@ describe('ResourceRepository', () => {
   let repository: ResourceRepository;
 
   let resourceFactory = mock(ResourceFactory);
-  let resourceWrapper = { get: jest.fn(), post: jest.fn(), put: jest.fn(), delete: jest.fn() };
+  let resourceWrapper = { get: jest.fn(), post: jest.fn(), put: jest.fn(), patch: jest.fn(), delete: jest.fn() };
 
   beforeEach(() => {
     resourceFactory.from.mockReturnValue(resourceWrapper);
@@ -42,9 +42,7 @@ describe('ResourceRepository', () => {
     it('should call get url without parameter', () => {
       repository.getListResource(baseResource, listLinkRel);
 
-      expect(repository.getUrlWithoutParameter).toHaveBeenCalledWith(
-        getUrl(baseResource, listLinkRel),
-      );
+      expect(repository.getUrlWithoutParameter).toHaveBeenCalledWith(getUrl(baseResource, listLinkRel));
     });
 
     it('should call resourceFactory with uri', () => {
@@ -131,7 +129,7 @@ describe('ResourceRepository', () => {
       expect(resourceFactory.from).toHaveBeenCalledWith(resource);
     });
 
-    it('should call resourceWrapper with linkel and object to create', () => {
+    it('should call resourceWrapper with linkRel and object to create', () => {
       repository.createResource(createResourceData);
 
       expect(resourceWrapper.post).toHaveBeenCalledWith(linkRel, toCreate);
@@ -162,7 +160,7 @@ describe('ResourceRepository', () => {
       expect(resourceFactory.from).toHaveBeenCalledWith(resource);
     });
 
-    it('should call resourceWrapper with linkel and object to save', () => {
+    it('should call resourceWrapper with linkRel and object to save', () => {
       repository.save(saveResourceData);
 
       expect(resourceWrapper.put).toHaveBeenCalledWith(linkRel, toSave);
@@ -175,6 +173,37 @@ describe('ResourceRepository', () => {
     });
   });
 
+  describe('patch', () => {
+    const toPatch: unknown = {};
+    const linkRel: string = DummyLinkRel.DUMMY;
+    const resource: Resource = createDummyResource([linkRel]);
+    const patchResourceData: SaveResourceData<Resource> = { toSave: toPatch, linkRel, resource };
+
+    const patchedResource: Resource = createDummyResource();
+
+    beforeEach(() => {
+      resourceWrapper.patch.mockReturnValue(singleCold(patchedResource));
+    });
+
+    it('should call resourceFactory with resource', () => {
+      repository.patch(patchResourceData);
+
+      expect(resourceFactory.from).toHaveBeenCalledWith(resource);
+    });
+
+    it('should call resourceWrapper with linkRel and object to patch', () => {
+      repository.patch(patchResourceData);
+
+      expect(resourceWrapper.patch).toHaveBeenCalledWith(linkRel, toPatch);
+    });
+
+    it('should return value', () => {
+      const result: Observable<Resource> = repository.patch(patchResourceData);
+
+      expect(result).toBeObservable(singleHot(patchedResource));
+    });
+  });
+
   describe('delete', () => {
     const deleteLinkRel: LinkRelationName = faker.word.sample();
     const resourceToDelete: Resource = createDummyResource([deleteLinkRel]);
@@ -191,7 +220,7 @@ describe('ResourceRepository', () => {
       expect(resourceFactory.from).toHaveBeenCalledWith(resourceToDelete);
     });
 
-    it('should call resourceWrapper with linkel', () => {
+    it('should call resourceWrapper with linkRel', () => {
       repository.delete(resourceToDelete, deleteLinkRel);
 
       expect(resourceWrapper.delete).toHaveBeenCalledWith(deleteLinkRel);
@@ -218,10 +247,7 @@ describe('ResourceRepository', () => {
 
       repository.search(dummyResource, linkRel, searchBy);
 
-      expect(repository.buildSearchUri).toHaveBeenCalledWith(
-        new URL(getUrl(dummyResource, linkRel)),
-        searchBy,
-      );
+      expect(repository.buildSearchUri).toHaveBeenCalledWith(new URL(getUrl(dummyResource, linkRel)), searchBy);
     });
 
     it('should call resourceFactory', () => {
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.ts
index b0fcb3995f0961983b8caef53160762ad3fc4416..fe199d6e0f55c932f385ecfa4d3dac96dd930230 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.repository.ts
@@ -23,9 +23,7 @@ export class ResourceRepository {
   }
 
   public createResource(createResourceData: CreateResourceData<Resource>): Observable<Resource> {
-    return this.resourceFactory
-      .from(createResourceData.resource)
-      .post(createResourceData.linkRel, createResourceData.toCreate);
+    return this.resourceFactory.from(createResourceData.resource).post(createResourceData.linkRel, createResourceData.toCreate);
   }
 
   public getResource<T>(uri: ResourceUri): Observable<T> {
@@ -33,9 +31,11 @@ export class ResourceRepository {
   }
 
   public save(saveResourceData: SaveResourceData<Resource>): Observable<Resource> {
-    return this.resourceFactory
-      .from(saveResourceData.resource)
-      .put(saveResourceData.linkRel, saveResourceData.toSave);
+    return this.resourceFactory.from(saveResourceData.resource).put(saveResourceData.linkRel, saveResourceData.toSave);
+  }
+
+  public patch(patchResourceData: SaveResourceData<Resource>): Observable<Resource> {
+    return this.resourceFactory.from(patchResourceData.resource).patch(patchResourceData.linkRel, patchResourceData.toSave);
   }
 
   public delete(resource: Resource, linkRel: LinkRelationName): Observable<Resource> {
@@ -43,9 +43,7 @@ export class ResourceRepository {
   }
 
   public search<T>(resource: Resource, linkRel: LinkRelationName, searchBy: string): Observable<T> {
-    return this.resourceFactory
-      .fromId(this.buildSearchUri(new URL(getUrl(resource, linkRel)), searchBy))
-      .get();
+    return this.resourceFactory.fromId(this.buildSearchUri(new URL(getUrl(resource, linkRel)), searchBy)).get();
   }
 
   buildSearchUri(url: URL, searchBy: string): ResourceUri {
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
index 61f1ae622b0c4621da50136718665d0c5a94756e..1a7c4254c31475dde3488c115c80245b758d0145 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
@@ -12,12 +12,7 @@ import { ProblemDetail } from '../tech.model';
 import { LinkRelationName, ResourceServiceConfig } from './resource.model';
 import { ResourceRepository } from './resource.repository';
 import { ResourceService } from './resource.service';
-import {
-  StateResource,
-  createEmptyStateResource,
-  createErrorStateResource,
-  createStateResource,
-} from './resource.util';
+import { StateResource, createEmptyStateResource, createErrorStateResource, createStateResource } from './resource.util';
 
 import * as ResourceUtil from './resource.util';
 
@@ -62,9 +57,7 @@ describe('ResourceService', () => {
       service.stateResource.next(stateResource);
 
       service.handleResourceChanges = jest.fn();
-      isInvalidResourceCombinationSpy = jest
-        .spyOn(ResourceUtil, 'isInvalidResourceCombination')
-        .mockReturnValue(true);
+      isInvalidResourceCombinationSpy = jest.spyOn(ResourceUtil, 'isInvalidResourceCombination').mockReturnValue(true);
     });
 
     it('should handle config resource changed', fakeAsync(() => {
@@ -82,15 +75,11 @@ describe('ResourceService', () => {
     }));
 
     it('should return initial value', () => {
-      service.stateResource.asObservable = jest
-        .fn()
-        .mockReturnValue(singleHot(stateResource, '-a'));
+      service.stateResource.asObservable = jest.fn().mockReturnValue(singleHot(stateResource, '-a'));
 
       const apiRootStateResource$: Observable<StateResource<Resource>> = service.get();
 
-      expect(apiRootStateResource$).toBeObservable(
-        cold('a', { a: createEmptyStateResource(true) }),
-      );
+      expect(apiRootStateResource$).toBeObservable(cold('a', { a: createEmptyStateResource(true) }));
     });
   });
 
@@ -167,10 +156,7 @@ describe('ResourceService', () => {
       it('should update stateresource by configresource', () => {
         service.handleResourceChanges(stateResource, configResource);
 
-        expect(service.updateStateResourceByConfigResource).toHaveBeenCalledWith(
-          stateResource,
-          configResource,
-        );
+        expect(service.updateStateResourceByConfigResource).toHaveBeenCalledWith(stateResource, configResource);
       });
     });
 
@@ -235,10 +221,7 @@ describe('ResourceService', () => {
       });
 
       it('should return true if configresource has no get link', () => {
-        const shouldClear: boolean = service.shouldClearStateResource(
-          dummyStateResource,
-          createDummyResource(),
-        );
+        const shouldClear: boolean = service.shouldClearStateResource(dummyStateResource, createDummyResource());
 
         expect(shouldClear).toBeTruthy();
       });
@@ -246,19 +229,13 @@ describe('ResourceService', () => {
 
     describe('on empty stateresource', () => {
       it('should return false', () => {
-        const shouldClear: boolean = service.shouldClearStateResource(
-          createEmptyStateResource(),
-          null,
-        );
+        const shouldClear: boolean = service.shouldClearStateResource(createEmptyStateResource(), null);
 
         expect(shouldClear).toBeFalsy();
       });
 
       it('should return false if configresource has no get link', () => {
-        const shouldClear: boolean = service.shouldClearStateResource(
-          createEmptyStateResource(),
-          createDummyResource(),
-        );
+        const shouldClear: boolean = service.shouldClearStateResource(createEmptyStateResource(), createDummyResource());
 
         expect(shouldClear).toBeFalsy();
       });
@@ -306,9 +283,7 @@ describe('ResourceService', () => {
 
       service.loadResource(configResourceWithGetLinkRel);
 
-      expect(service.doLoadResource).toHaveBeenCalledWith(
-        getUrl(configResourceWithGetLinkRel, config.getLinkRel),
-      );
+      expect(service.doLoadResource).toHaveBeenCalledWith(getUrl(configResourceWithGetLinkRel, config.getLinkRel));
     });
   });
 
@@ -394,9 +369,7 @@ describe('ResourceService', () => {
     it('should do save', fakeAsync(() => {
       const stateResource: StateResource<Resource> = createStateResource(resourceWithEditLinkRel);
       service.stateResource.next(stateResource);
-      const doSaveMock: jest.Mock = (service.doSave = jest.fn()).mockReturnValue(
-        of(loadedResource),
-      );
+      const doSaveMock: jest.Mock = (service.doSave = jest.fn()).mockReturnValue(of(loadedResource));
 
       service.save(dummyToSave).subscribe();
       tick();
@@ -435,16 +408,62 @@ describe('ResourceService', () => {
     }));
   });
 
+  describe('patch', () => {
+    const dummyToPatch: unknown = {};
+    const loadedResource: Resource = createDummyResource();
+
+    const resourceWithEditLinkRel: Resource = createDummyResource([editLinkRel]);
+
+    it('should do patch', fakeAsync(() => {
+      const stateResource: StateResource<Resource> = createStateResource(resourceWithEditLinkRel);
+      service.stateResource.next(stateResource);
+      const doPatchMock: jest.Mock = (service.doPatch = jest.fn()).mockReturnValue(of(loadedResource));
+
+      service.patch(dummyToPatch).subscribe();
+      tick();
+
+      expect(doPatchMock).toHaveBeenCalledWith(resourceWithEditLinkRel, dummyToPatch);
+    }));
+
+    it('should return patched object', () => {
+      service.stateResource.next(createStateResource(resourceWithEditLinkRel));
+      service.doPatch = jest.fn().mockReturnValue(singleHot(loadedResource));
+
+      const patched: Observable<StateResource<Resource>> = service.patch(dummyToPatch);
+
+      expect(patched).toBeObservable(singleCold(createStateResource(loadedResource)));
+    });
+
+    it('should call handleError', () => {
+      service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel])));
+      const errorResponse: ProblemDetail = createProblemDetail();
+      service.doPatch = jest.fn().mockReturnValue(throwError(() => errorResponse));
+      service.handleError = jest.fn();
+
+      service.patch(<any>{}).subscribe();
+
+      expect(service.handleError).toHaveBeenCalledWith(errorResponse);
+    });
+
+    it('should update state resource subject', fakeAsync(() => {
+      service.stateResource.next(createStateResource(resourceWithEditLinkRel));
+      service.doPatch = jest.fn().mockReturnValue(of(loadedResource));
+
+      service.patch(dummyToPatch).subscribe();
+      tick();
+
+      expect(service.stateResource.value).toEqual(createStateResource(loadedResource));
+    }));
+  });
+
   describe('handleError', () => {
     it('should return error stateresource on problem unprocessable entity', (done: jest.DoneCallback) => {
       const error: ProblemDetail = createProblemDetail();
 
-      service
-        .handleError(<HttpErrorResponse>(<any>error))
-        .subscribe((responseError: StateResource<unknown>) => {
-          expect(responseError).toEqual(createErrorStateResource(error));
-          done();
-        });
+      service.handleError(<HttpErrorResponse>(<any>error)).subscribe((responseError: StateResource<unknown>) => {
+        expect(responseError).toEqual(createErrorStateResource(error));
+        done();
+      });
     });
 
     it('should rethrow error', () => {
@@ -503,10 +522,7 @@ describe('ResourceService', () => {
   });
 });
 
-export class DummyResourceService<B extends Resource, T extends Resource> extends ResourceService<
-  B,
-  T
-> {
+export class DummyResourceService<B extends Resource, T extends Resource> extends ResourceService<B, T> {
   constructor(
     protected config: ResourceServiceConfig<B>,
     protected repository: ResourceRepository,
@@ -517,4 +533,8 @@ export class DummyResourceService<B extends Resource, T extends Resource> extend
   doSave(resource: T, toSave: unknown): Observable<T> {
     return of(resource);
   }
+
+  doPatch(resource: T, toPatch: unknown): Observable<T> {
+    return of(resource);
+  }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts
index 6c9eb0a56f13fb81555b915c436119b742b2ec45..1b5ea7e05416786b91861e5f79a247501076fed3 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts
@@ -1,19 +1,7 @@
 import { HttpErrorResponse } from '@angular/common/http';
 import { getUrl, hasLink, Resource, ResourceUri } from '@ngxp/rest';
 import { isEqual, isNull } from 'lodash-es';
-import {
-  BehaviorSubject,
-  catchError,
-  combineLatest,
-  filter,
-  first,
-  map,
-  Observable,
-  of,
-  startWith,
-  tap,
-  throwError,
-} from 'rxjs';
+import { BehaviorSubject, catchError, combineLatest, filter, first, map, Observable, of, startWith, tap, throwError } from 'rxjs';
 import { isUnprocessableEntity } from '../http.util';
 import { HttpError } from '../tech.model';
 import { isNotNull } from '../tech.util';
@@ -35,9 +23,7 @@ import {
  * T = Type of the resource which is working on
  */
 export abstract class ResourceService<B extends Resource, T extends Resource> {
-  readonly stateResource: BehaviorSubject<StateResource<T>> = new BehaviorSubject(
-    createEmptyStateResource(),
-  );
+  readonly stateResource: BehaviorSubject<StateResource<T>> = new BehaviorSubject(createEmptyStateResource());
 
   configResource: B = null;
 
@@ -48,12 +34,8 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   public get(): Observable<StateResource<T>> {
     return combineLatest([this.stateResource.asObservable(), this.getConfigResource()]).pipe(
-      tap(([stateResource, configResource]) =>
-        this.handleResourceChanges(stateResource, configResource),
-      ),
-      filter(
-        ([stateResource]) => !isInvalidResourceCombination(stateResource, this.configResource),
-      ),
+      tap(([stateResource, configResource]) => this.handleResourceChanges(stateResource, configResource)),
+      filter(([stateResource]) => !isInvalidResourceCombination(stateResource, this.configResource)),
       mapToFirst<T, B>(),
       startWith(createEmptyStateResource<T>(true)),
     );
@@ -61,10 +43,7 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   private getConfigResource(): Observable<B> {
     return this.config.resource.pipe(
-      filter(
-        (configStateResource: StateResource<B>) =>
-          !configStateResource.loading && !configStateResource.reload,
-      ),
+      filter((configStateResource: StateResource<B>) => !configStateResource.loading && !configStateResource.reload),
       mapToResource<B>(),
     );
   }
@@ -93,10 +72,7 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
   }
 
   shouldClearStateResource(stateResource: StateResource<T>, configResource: B): boolean {
-    return (
-      (isNull(configResource) || this.hasNotGetLink(configResource)) &&
-      !this.isStateResourceEmpty(stateResource)
-    );
+    return (isNull(configResource) || this.hasNotGetLink(configResource)) && !this.isStateResourceEmpty(stateResource);
   }
 
   private hasNotGetLink(configResource: B): boolean {
@@ -145,7 +121,16 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   public save(toSave: unknown): Observable<StateResource<T>> {
     const previousResource: T = this.stateResource.value.resource;
-    return this.doSave(previousResource, toSave).pipe(
+    return this.handleSave(this.doSave(previousResource, toSave));
+  }
+
+  public patch(toPatch: unknown): Observable<StateResource<T>> {
+    const previousResource: T = this.stateResource.value.resource;
+    return this.handleSave(this.doPatch(previousResource, toPatch));
+  }
+
+  private handleSave(response$: Observable<T>): Observable<StateResource<T>> {
+    return response$.pipe(
       tap((loadedResource: T) => this.stateResource.next(createStateResource(loadedResource))),
       map(() => this.stateResource.value),
       catchError((errorResponse: HttpErrorResponse) => this.handleError(errorResponse)),
@@ -161,6 +146,8 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   abstract doSave(resource: T, toSave: unknown): Observable<T>;
 
+  abstract doPatch(resource: T, toPatch: unknown): Observable<T>;
+
   public refresh(): void {
     this.stateResource.next({ ...this.stateResource.value, reload: true });
   }
diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts
index 35fd33e57c839f74868240d50a5af8d47773fe79..d525b273f7de7b9f8e79b596c4ff58b128e23796 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts
@@ -27,17 +27,16 @@ import { Resource } from '@ngxp/rest';
 import { cold } from 'jest-marbles';
 import { createInvalidParam, createProblemDetail } from 'libs/tech-shared/test/error';
 import { Observable, of } from 'rxjs';
-import { AbstractFormService } from './formservice.abstract';
-
+import { createCommandResource } from '../../../../command-shared/test/command';
 import {
+  StateResource,
   createEmptyStateResource,
   createErrorStateResource,
   createStateResource,
-  StateResource,
 } from '../resource/resource.util';
 import { InvalidParam, ProblemDetail } from '../tech.model';
+import { AbstractFormService } from './formservice.abstract';
 
-import { createCommandResource } from '../../../../command-shared/test/command';
 import * as ValidationUtil from '../validation/tech.validation.util';
 
 describe('AbstractFormService', () => {
@@ -53,8 +52,7 @@ describe('AbstractFormService', () => {
 
   describe('submit', () => {
     describe('with ProblemDetail', () => {
-      const stateResourceWithError: StateResource<ProblemDetail> =
-        createErrorStateResource(createProblemDetail());
+      const stateResourceWithError: StateResource<ProblemDetail> = createErrorStateResource(createProblemDetail());
 
       beforeEach(() => {
         TestFormService.SUBMIT_OBSERVABLE = () => of(stateResourceWithError);
@@ -76,8 +74,7 @@ describe('AbstractFormService', () => {
     });
 
     it('should call after submit operator function', (done) => {
-      const commandStateResource: StateResource<CommandResource> =
-        createStateResource(createCommandResource());
+      const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
       const afterSubmit = () => of(commandStateResource);
       formService.handleResponse = jest.fn();
 
@@ -88,8 +85,7 @@ describe('AbstractFormService', () => {
     });
 
     it('should pass through as default after submit', (done) => {
-      const commandStateResource: StateResource<CommandResource> =
-        createStateResource(createCommandResource());
+      const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
       TestFormService.SUBMIT_OBSERVABLE = () => of(commandStateResource);
       formService.handleResponse = jest.fn();
 
@@ -145,11 +141,7 @@ describe('AbstractFormService', () => {
 
       formService.setErrorByProblemDetail(problemDetail);
 
-      expect(setInvalidParamValidationErrorSpy).toHaveBeenCalledWith(
-        formService.form,
-        invalidParam,
-        TestFormService.PATH_PREFIX,
-      );
+      expect(setInvalidParamValidationErrorSpy).toHaveBeenCalledWith(formService.form, invalidParam, TestFormService.PATH_PREFIX);
     });
   });
 
@@ -162,6 +154,32 @@ describe('AbstractFormService', () => {
       expect(formService.form.value).toEqual(formValue);
     });
   });
+
+  describe('reset', () => {
+    it('should reset form', () => {
+      formService.form.reset = jest.fn();
+
+      formService.reset();
+
+      expect(formService.form.reset).toHaveBeenCalled();
+    });
+  });
+
+  describe('isInvalid', () => {
+    it('should return false on valid state', () => {
+      const isInvalid: boolean = formService.isInvalid();
+
+      expect(isInvalid).toBeFalsy();
+    });
+
+    it('should return true on invalid state', () => {
+      formService.form.controls[TestFormService.FIELD].setErrors({ required: true });
+
+      const isInvalid: boolean = formService.isInvalid();
+
+      expect(isInvalid).toBeTruthy();
+    });
+  });
 });
 
 class TestFormService extends AbstractFormService {
diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
index 4f225d54b0b1d97d031eb854263bee095aeed03f..e14057ca1213095531293412d81b4952f80e5e1d 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
@@ -45,9 +45,7 @@ export abstract class AbstractFormService<T extends Resource = Resource> {
 
   protected abstract initForm(): UntypedFormGroup;
 
-  public submit(
-    afterSubmit: OperatorFunction<StateResource<T>, StateResource<T>> = identity,
-  ): Observable<StateResource<T>> {
+  public submit(afterSubmit: OperatorFunction<StateResource<T>, StateResource<T>> = identity): Observable<StateResource<T>> {
     return this.doSubmit().pipe(
       afterSubmit,
       map((result) => this.handleResponse(result)),
@@ -100,4 +98,12 @@ export abstract class AbstractFormService<T extends Resource = Resource> {
   public isPatch(): boolean {
     return !isNil(this.source);
   }
+
+  public reset(): void {
+    this.form.reset();
+  }
+
+  public isInvalid(): boolean {
+    return this.form.invalid;
+  }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/tech.model.ts b/alfa-client/libs/tech-shared/src/lib/tech.model.ts
index 869313d09ddd0b5c7703f80ea79f23bf72403e07..da754a64f4682e35b5770d23a7c06840db56551a 100644
--- a/alfa-client/libs/tech-shared/src/lib/tech.model.ts
+++ b/alfa-client/libs/tech-shared/src/lib/tech.model.ts
@@ -89,6 +89,7 @@ export enum ContentType {
   IMAGES_ALL = 'images/*',
   APPLICATION_ALL = 'application/*',
   APPLICATION_OCTET_STREAM = 'application/octet-stream',
+  APPLICATION_ZIP = 'application/zip',
 }
 
 export interface GetRequestOptions {
diff --git a/alfa-client/libs/tech-shared/test/resource.ts b/alfa-client/libs/tech-shared/test/resource.ts
index cf93fb97578b9e4f707014f4441d746b86a740be..8cbc924738e6ad45987eb74abe6792489979478b 100644
--- a/alfa-client/libs/tech-shared/test/resource.ts
+++ b/alfa-client/libs/tech-shared/test/resource.ts
@@ -70,14 +70,11 @@ export function createDummyResources(linkRelations: string[] = []): Resource[] {
   return times(10, () => toResource(createDummyResource(), [...linkRelations]));
 }
 
-export function createEmptyListResource(linkRelations: string[] = []): ListResource {
+export function createEmptyListResource<T extends ListResource>(linkRelations: string[] = []): T {
   return toResource({}, [...linkRelations]);
 }
 
-export function createFilledDummyListResource(
-  resources: Resource[],
-  linkRelations: string[] = [],
-): ListResource {
+export function createFilledDummyListResource(resources: Resource[], linkRelations: string[] = []): ListResource {
   return toResource({}, [...linkRelations], {
     [DummyListLinkRel.LIST]: resources,
   });
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 8fac9311bbcd78efbdd449922e9901f6cd97aa45..bc8f22e304e830e201a66bfb6211141b3c49d707 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
@@ -1,7 +1,6 @@
-import { TestBed } from '@angular/core/testing';
-
 import { Mock, mock } from '@alfa-client/test-utils';
 import { Dialog, DialogConfig } from '@angular/cdk/dialog';
+import { TestBed } from '@angular/core/testing';
 import { OzgcloudDialogService } from './ozgcloud-dialog.service';
 
 describe('OzgcloudDialogService', () => {
@@ -70,19 +69,13 @@ describe('OzgcloudDialogService', () => {
     it('should open dialog with custom config', () => {
       service.openInCallingComponentContext(component, viewContainerRef, null, dialogConfig);
 
-      expect(dialog.open).toHaveBeenCalledWith(
-        component,
-        dialogConfigWithOwnConfigAndViewContainerRef,
-      );
+      expect(dialog.open).toHaveBeenCalledWith(component, dialogConfigWithOwnConfigAndViewContainerRef);
     });
 
     it('should open dialog without data and custom config', () => {
       service.openInCallingComponentContext(component, viewContainerRef);
 
-      expect(dialog.open).toHaveBeenCalledWith(
-        component,
-        dialogConfigWithOutDataAndWithViewContainerRef,
-      );
+      expect(dialog.open).toHaveBeenCalledWith(component, dialogConfigWithOutDataAndWithViewContainerRef);
     });
   });
 
@@ -104,4 +97,19 @@ describe('OzgcloudDialogService', () => {
       });
     });
   });
+
+  describe('open full screen dialog', () => {
+    it('should call openInCallingComponentContext', () => {
+      service.openInCallingComponentContext = jest.fn();
+
+      service.openFullScreenDialog(component, viewContainerRef, dialogData);
+
+      expect(service.openInCallingComponentContext).toHaveBeenCalledWith(
+        component,
+        viewContainerRef,
+        dialogData,
+        service.GREY_BLUR_CONFIG,
+      );
+    });
+  });
 });
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 3c9383b4a60f1293b42ee00b3acc3fa90a54abaf..ca7bf24afd1e3f7fb1f4ba918cc6e3fe768aca33 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
@@ -13,29 +13,36 @@ export class OzgcloudDialogService {
     disableClose: true,
   };
 
+  readonly GREY_BLUR_CONFIG: DialogConfig = {
+    backdropClass: ['backdrop-blur-1', 'bg-greybackdrop'],
+    disableClose: true,
+  };
+
   constructor(private dialog: Dialog) {}
 
   public openWizard<T, D>(component: ComponentType<T>, data?: D): DialogRef<T> {
-    return this.openDialog<T>(
-      component,
-      this.buildDialogConfigWithData<D>(data, this.WIZARD_DIALOG_CONFIG),
-    );
+    return this.openDialog<T>(component, this.buildDialogConfigWithData<D>(data, this.WIZARD_DIALOG_CONFIG));
   }
 
   public open<T, D = unknown>(component: ComponentType<T>, data?: D): DialogRef<T> {
     return this.openDialog(component, this.buildDialogConfigWithData(data));
   }
 
+  public openFullScreenDialog<T, D = unknown>(
+    component: ComponentType<T>,
+    viewContainerRef: ViewContainerRef,
+    data?: D,
+  ): DialogRef<T> {
+    return this.openInCallingComponentContext(component, viewContainerRef, data, this.GREY_BLUR_CONFIG);
+  }
+
   public openInCallingComponentContext<T, D = unknown>(
     component: ComponentType<T>,
     viewContainerRef: ViewContainerRef,
     data?: D,
     dialogConfig?: DialogConfig,
   ): DialogRef<T> {
-    return this.openDialog(
-      component,
-      this.buildDialogConfigWithData(data, { viewContainerRef, ...dialogConfig }),
-    );
+    return this.openDialog(component, this.buildDialogConfigWithData(data, { viewContainerRef, ...dialogConfig }));
   }
 
   private buildDialogConfigWithData<D>(data: D, dialogConfig?: DialogConfig): DialogConfig | null {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.html
index 2d16e8047196cf952d24fea9f905b058d7a3e9d9..d1d6dc6a5e8ee2eddfe33f8eac630c030ee15cb7 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.html
@@ -36,9 +36,7 @@
       ></alfa-vorgang-detail-header>
 
       <div class="section one-column">
-        <alfa-vorgang-detail-formular-daten
-          [vorgangWithEingang]="vorgangResource"
-        ></alfa-vorgang-detail-formular-daten>
+        <alfa-vorgang-detail-formular-daten [vorgangWithEingang]="vorgangResource"></alfa-vorgang-detail-formular-daten>
 
         <div *ngIf="vorgangResource | hasLink: vorgangWithEingangLinkRel.BESCHEIDE">
           <ozgcloud-expansion-panel headline="Bescheid" data-test-id="bescheid-expansion-panel">
@@ -47,30 +45,20 @@
           </ozgcloud-expansion-panel>
         </div>
 
-        <alfa-vorgang-detail-formular-buttons
-          [vorgangWithEingang]="vorgangResource"
-        ></alfa-vorgang-detail-formular-buttons>
+        <alfa-vorgang-detail-formular-buttons [vorgangWithEingang]="vorgangResource"></alfa-vorgang-detail-formular-buttons>
       </div>
 
-      <div
-        class="section one-column"
-        *ngIf="vorgangResource | hasLink: vorgangWithEingangLinkRel.COLLABORATIONS"
-      >
-        <ozgcloud-expansion-panel
-          headline="Zusammenarbeit"
-          data-test-id="collaboration-expansion-panel"
-        >
+      <div class="section one-column" *ngIf="vorgangResource | hasLink: vorgangWithEingangLinkRel.COLLABORATIONS">
+        <ozgcloud-expansion-panel headline="Zusammenarbeit" data-test-id="collaboration-expansion-panel">
           <alfa-collaboration-in-vorgang-container
-            data-test-id="collaboration-in-voragng-container"
+            [vorgang]="vorgangResource"
+            data-test-id="collaboration-in-vorgang-container"
           ></alfa-collaboration-in-vorgang-container>
         </ozgcloud-expansion-panel>
       </div>
 
       <div class="two-column">
-        <div
-          class="section"
-          *ngIf="vorgangResource | hasLink: vorgangWithEingangLinkRel.FORWARDING"
-        >
+        <div class="section" *ngIf="vorgangResource | hasLink: vorgangWithEingangLinkRel.FORWARDING">
           <alfa-vorgang-forwarding-container
             [vorgang]="vorgangResource"
             data-test-id="forwarding-container-in-vorgang"
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
index 7786b45a3e33dc073681a9cb53887a78d3a9587e..b63d9fabfe54a184580c2da4734bece6e408f69a 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts
@@ -25,22 +25,10 @@ import { CollaborationInVorgangContainerComponent } from '@alfa-client/collabora
 import { VorgangForwardingContainerComponent } from '@alfa-client/forwarding';
 import { KommentarListInVorgangContainerComponent } from '@alfa-client/kommentar';
 import { PostfachMailListContainerComponent } from '@alfa-client/postfach';
-import {
-  HasLinkPipe,
-  ToEmbeddedResourcesPipe,
-  createEmptyStateResource,
-  createStateResource,
-} from '@alfa-client/tech-shared';
-import { existsAsHtmlElement, notExistsAsHtmlElement } from '@alfa-client/test-utils';
-import {
-  ExpansionPanelComponent,
-  OzgcloudStrokedButtonWithSpinnerComponent,
-} from '@alfa-client/ui';
-import {
-  VorgangHeaderLinkRel,
-  VorgangWithEingangLinkRel,
-  VorgangWithEingangResource,
-} from '@alfa-client/vorgang-shared';
+import { HasLinkPipe, ToEmbeddedResourcesPipe, createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared';
+import { existsAsHtmlElement, getMockComponent, notExistsAsHtmlElement } from '@alfa-client/test-utils';
+import { ExpansionPanelComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
+import { VorgangHeaderLinkRel, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { WiedervorlageListInVorgangContainerComponent } from '@alfa-client/wiedervorlage';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatDialogModule } from '@angular/material/dialog';
@@ -59,12 +47,10 @@ describe('VorgangDetailAreaComponent', () => {
   let component: VorgangDetailAreaComponent;
   let fixture: ComponentFixture<VorgangDetailAreaComponent>;
 
-  const collaborationContainer: string = getDataTestIdOf('collaboration-in-voragng-container');
+  const collaborationContainer: string = getDataTestIdOf('collaboration-in-vorgang-container');
   const wiedervorlagenContainer: string = getDataTestIdOf('wiedervorlagen-container-in-vorgang');
   const kommentarContainer: string = getDataTestIdOf('kommentar-container-in-vorgang');
-  const postfachNachrichtenContainer: string = getDataTestIdOf(
-    'postfach-nachrichten-container-in-vorgang',
-  );
+  const postfachNachrichtenContainer: string = getDataTestIdOf('postfach-nachrichten-container-in-vorgang');
   const forwardingContainer: string = getDataTestIdOf('forwarding-container-in-vorgang');
   const bescheidContainer: string = getDataTestIdOf('bescheid-container-in-vorgang');
 
@@ -105,11 +91,13 @@ describe('VorgangDetailAreaComponent', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('Collaboration', () => {
+  describe('collaboration', () => {
+    const vorgangWithCollaborationsLink: VorgangWithEingangResource = createVorgangWithEingangResource([
+      VorgangWithEingangLinkRel.COLLABORATIONS,
+    ]);
+
     it('should be visibile if link is present', () => {
-      component.vorgangStateResource = createStateResource(
-        createVorgangWithEingangResource([VorgangWithEingangLinkRel.COLLABORATIONS]),
-      );
+      component.vorgangStateResource = createStateResource(vorgangWithCollaborationsLink);
 
       fixture.detectChanges();
 
@@ -123,6 +111,18 @@ describe('VorgangDetailAreaComponent', () => {
 
       notExistsAsHtmlElement(fixture, collaborationContainer);
     });
+
+    it('component should be called with vorgang', () => {
+      component.vorgangStateResource = createStateResource(vorgangWithCollaborationsLink);
+
+      fixture.detectChanges();
+
+      const comp: CollaborationInVorgangContainerComponent = getMockComponent<CollaborationInVorgangContainerComponent>(
+        fixture,
+        CollaborationInVorgangContainerComponent,
+      );
+      expect(comp.vorgang).toEqual(vorgangWithCollaborationsLink);
+    });
   });
 
   describe('wiedervorlagen', () => {
@@ -149,9 +149,7 @@ describe('VorgangDetailAreaComponent', () => {
 
   describe('kommentare', () => {
     it('should be visible', () => {
-      component.vorgangStateResource = createStateResource(
-        createVorgangWithEingangResource([VorgangHeaderLinkRel.KOMMENTARE]),
-      );
+      component.vorgangStateResource = createStateResource(createVorgangWithEingangResource([VorgangHeaderLinkRel.KOMMENTARE]));
       fixture.detectChanges();
 
       const element = fixture.nativeElement.querySelector(kommentarContainer);
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
index a06768b2ed6d34e4c9a6e3fd4f7352a6de6edc89..5b3f83373d1bbdec9d416953be59cb1aba474098 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
@@ -66,6 +66,7 @@ export enum VorgangWithEingangLinkRel {
   DOWNLOAD_ATTACHMENTS = 'downloadAttachments',
 
   SEARCH_ORGANISATIONS_EINHEIT = 'searchOrganisationsEinheit',
+  SEARCH_EXTERNE_FACHSTELLE = 'searchFachstelle',
 
   COLLABORATIONS = 'collaborations',
 }
diff --git a/alfa-client/libs/zustaendige-stelle-shared/.eslintrc.json b/alfa-client/libs/zustaendige-stelle-shared/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..b953e5d37d40148217ab14a01859ea0cb43d9ebc
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/.eslintrc.json
@@ -0,0 +1,33 @@
+{
+  "extends": ["../../.eslintrc.json"],
+  "ignorePatterns": ["!**/*"],
+  "overrides": [
+    {
+      "files": ["*.ts"],
+      "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
+      "rules": {
+        "@angular-eslint/directive-selector": [
+          "error",
+          {
+            "type": "attribute",
+            "prefix": "lib",
+            "style": "camelCase"
+          }
+        ],
+        "@angular-eslint/component-selector": [
+          "error",
+          {
+            "type": "element",
+            "prefix": "lib",
+            "style": "kebab-case"
+          }
+        ]
+      }
+    },
+    {
+      "files": ["*.html"],
+      "extends": ["plugin:@nx/angular-template"],
+      "rules": {}
+    }
+  ]
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/README.md b/alfa-client/libs/zustaendige-stelle-shared/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..746271b0090d56c3c5abbb2dfb34b7966d65a8e8
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/README.md
@@ -0,0 +1,7 @@
+# zustaendige-stelle-shared
+
+This library was generated with [Nx](https://nx.dev).
+
+## Running unit tests
+
+Run `nx test zustaendige-stelle-shared` to execute the unit tests.
diff --git a/alfa-client/libs/zustaendige-stelle-shared/jest.config.ts b/alfa-client/libs/zustaendige-stelle-shared/jest.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..97f146082b038daa9b2539267d9f2d562181427a
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+  displayName: 'zustaendige-stelle-shared',
+  preset: '../../jest.preset.js',
+  setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
+  coverageDirectory: '../../coverage/libs/zustaendige-stelle-shared',
+  transform: {
+    '^.+\\.(ts|mjs|js|html)$': [
+      'jest-preset-angular',
+      {
+        tsconfig: '<rootDir>/tsconfig.spec.json',
+        stringifyContentPathRegex: '\\.(html|svg)$',
+      },
+    ],
+  },
+  transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+  snapshotSerializers: [
+    'jest-preset-angular/build/serializers/no-ng-attributes',
+    'jest-preset-angular/build/serializers/ng-snapshot',
+    'jest-preset-angular/build/serializers/html-comment',
+  ],
+};
diff --git a/alfa-client/libs/zustaendige-stelle-shared/project.json b/alfa-client/libs/zustaendige-stelle-shared/project.json
new file mode 100644
index 0000000000000000000000000000000000000000..16d8b42f87c70ddf052d1b6b4b4ae71a30eeae98
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/project.json
@@ -0,0 +1,20 @@
+{
+  "name": "zustaendige-stelle-shared",
+  "$schema": "../../node_modules/nx/schemas/project-schema.json",
+  "sourceRoot": "libs/zustaendige-stelle-shared/src",
+  "prefix": "lib",
+  "projectType": "library",
+  "tags": [],
+  "targets": {
+    "test": {
+      "executor": "@nx/jest:jest",
+      "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+      "options": {
+        "jestConfig": "libs/zustaendige-stelle-shared/jest.config.ts"
+      }
+    },
+    "lint": {
+      "executor": "@nx/eslint:lint"
+    }
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/index.ts b/alfa-client/libs/zustaendige-stelle-shared/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a7848f376a7054d248e5aecc97aff7a3b5a3fe76
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/index.ts
@@ -0,0 +1,8 @@
+export * from './lib/externe-fachstelle/externe-fachstelle.model';
+export * from './lib/externe-fachstelle/externe-fachstelle.service';
+export * from './lib/organisations-einheit/organisations-einheit-resource-search.service';
+export * from './lib/organisations-einheit/organisations-einheit.model';
+export * from './lib/organisations-einheit/organisations-einheit.service';
+export * from './lib/zustaendige-stelle-shared.module';
+export * from './lib/zustaendige-stelle.service';
+export * from './lib/zustaendige-stelle.token';
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle-resource-search.service.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle-resource-search.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3b5dca89b26947bc637309ced5110d94113f5063
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle-resource-search.service.ts
@@ -0,0 +1,20 @@
+import { ResourceRepository, ResourceSearchService, SearchResourceServiceConfig, mapToResource } from '@alfa-client/tech-shared';
+import { VorgangResource, VorgangService, VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared';
+import { ExterneFachstelleListResource, ExterneFachstelleResource } from './externe-fachstelle.model';
+
+export class ExterneFachstelleResourceSearchService extends ResourceSearchService<
+  VorgangResource,
+  ExterneFachstelleListResource,
+  ExterneFachstelleResource
+> {}
+
+export function createExterneFachstelleResourceSearchService(repository: ResourceRepository, vorgangService: VorgangService) {
+  return new ResourceSearchService(buildConfig(vorgangService), repository);
+}
+
+function buildConfig(vorgangService: VorgangService): SearchResourceServiceConfig<VorgangResource> {
+  return {
+    baseResource: vorgangService.getVorgangWithEingang().pipe(mapToResource<VorgangResource>()),
+    searchLinkRel: VorgangWithEingangLinkRel.SEARCH_EXTERNE_FACHSTELLE,
+  };
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.linkrel.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.linkrel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..db9e7fdd545ac5ce57841426e2e84ee015d1e091
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.linkrel.ts
@@ -0,0 +1,3 @@
+export enum ExterneFachstelleListLinkRel {
+  EXTERNE_FACHSTELLE_LIST = 'fachstelleList',
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.model.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c946e5c5fff6943675f65f299527843812eb9ddb
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.model.ts
@@ -0,0 +1,11 @@
+import { ListItemResource, ListResource } from '@alfa-client/tech-shared';
+import { Resource } from '@ngxp/rest';
+
+export interface ExterneFachstelle {
+  name: string;
+  anschrift: string;
+  email: string;
+}
+
+export interface ExterneFachstelleResource extends ExterneFachstelle, Resource, ListItemResource {}
+export interface ExterneFachstelleListResource extends ListResource {}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.spec.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..44fc719d403d8fae9f04a78eac33994aa07ef6cd
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.spec.ts
@@ -0,0 +1,174 @@
+import { EMPTY_ARRAY, StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
+import { faker } from '@faker-js/faker';
+import { InstantSearchResult } from '@ods/system';
+import { createInstantSearchResult } from 'libs/design-system/src/test/search';
+import { createEmptyListResource } from 'libs/tech-shared/test/resource';
+import { Observable, of } from 'rxjs';
+import { singleColdCompleted } from '../../../../tech-shared/test/marbles';
+import { createExterneFachstelleListResource, createExterneFachstelleResource } from './../../../test/externe-fachstelle';
+import { ExterneFachstelleResourceSearchService } from './externe-fachstelle-resource-search.service';
+import { ExterneFachstelleListResource, ExterneFachstelleResource } from './externe-fachstelle.model';
+import { ExterneFachstelleService } from './externe-fachstelle.service';
+
+jest.mock('./externe-fachstelle-resource-search.service');
+
+describe('ExterneFachstelleService', () => {
+  let service: ExterneFachstelleService;
+
+  let searchService: Mock<ExterneFachstelleResourceSearchService>;
+
+  const listResource: ExterneFachstelleListResource = createExterneFachstelleListResource();
+  const listStateResource: StateResource<ExterneFachstelleListResource> = createStateResource(listResource);
+
+  beforeEach(() => {
+    searchService = mock(ExterneFachstelleResourceSearchService);
+
+    service = new ExterneFachstelleService(useFromMock(searchService));
+  });
+
+  describe('get search result list', () => {
+    const instantSearchResult: InstantSearchResult<ExterneFachstelleResource> = createInstantSearchResult();
+
+    beforeEach(() => {
+      searchService.getResultList.mockReturnValue(of(listStateResource));
+      service.mapListResource = jest.fn().mockReturnValue([instantSearchResult]);
+    });
+
+    it('should call search service', () => {
+      service.getSearchResultList();
+
+      expect(searchService.getResultList).toHaveBeenCalled();
+    });
+
+    it('should map list resource', () => {
+      service.getSearchResultList().subscribe();
+
+      expect(service.mapListResource).toHaveBeenCalledWith(listStateResource);
+    });
+
+    it('should return result', (done) => {
+      searchService.getResultList.mockReturnValue(of(listStateResource));
+
+      service.getSearchResultList().subscribe((result: InstantSearchResult<ExterneFachstelleResource>[]) => {
+        expect(result).toEqual([instantSearchResult]);
+        done();
+      });
+    });
+  });
+
+  describe('map listResource', () => {
+    const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+    const singleEntrylistResource: ExterneFachstelleListResource = createExterneFachstelleListResource([
+      externeFachstelleResource,
+    ]);
+    const singleEntryListStateResource: StateResource<ExterneFachstelleListResource> =
+      createStateResource(singleEntrylistResource);
+
+    const instantSearchResult: InstantSearchResult<ExterneFachstelleResource> = createInstantSearchResult();
+
+    beforeEach(() => {
+      service.mapToInstantSearchResult = jest.fn().mockReturnValue(instantSearchResult);
+    });
+
+    it('should map to instantSearchResult', () => {
+      service.mapListResource(singleEntryListStateResource);
+
+      expect(service.mapToInstantSearchResult).toHaveBeenCalledWith(externeFachstelleResource);
+    });
+
+    it('should return value', () => {
+      const result: InstantSearchResult<ExterneFachstelleResource>[] = service.mapListResource(singleEntryListStateResource);
+
+      expect(result).toEqual([instantSearchResult]);
+    });
+
+    it('should return empty array on empty listResource', () => {
+      const result: InstantSearchResult<ExterneFachstelleResource>[] = service.mapListResource(
+        createStateResource(createEmptyListResource<ExterneFachstelleListResource>()),
+      );
+
+      expect(result).toEqual(EMPTY_ARRAY);
+    });
+  });
+
+  describe('map to instant search result', () => {
+    const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+
+    it('should map titel', () => {
+      const instantSearchResult: InstantSearchResult<ExterneFachstelleResource> =
+        service.mapToInstantSearchResult(externeFachstelleResource);
+
+      expect(instantSearchResult.title).toBe(externeFachstelleResource.name);
+    });
+    it('should map description', () => {
+      const instantSearchResult: InstantSearchResult<ExterneFachstelleResource> =
+        service.mapToInstantSearchResult(externeFachstelleResource);
+
+      expect(instantSearchResult.description).toBe(externeFachstelleResource.anschrift);
+    });
+
+    it('should map data', () => {
+      const instantSearchResult: InstantSearchResult<ExterneFachstelleResource> =
+        service.mapToInstantSearchResult(externeFachstelleResource);
+
+      expect(instantSearchResult.data).toBe(externeFachstelleResource);
+    });
+  });
+
+  describe('search', () => {
+    const searchBy: string = faker.lorem.word();
+
+    it('should call search service with search string', () => {
+      service.search(searchBy);
+
+      expect(searchService.search).toHaveBeenCalledWith(searchBy);
+    });
+  });
+
+  describe('clear search result', () => {
+    it('should call search service', () => {
+      service.clearSearchResult();
+
+      expect(searchService.clearResultList).toHaveBeenCalledWith();
+    });
+  });
+
+  describe('get selected result', () => {
+    const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+
+    beforeEach(() => {
+      searchService.getSelectedResult.mockReturnValue(of(externeFachstelleResource));
+    });
+
+    it('should call service', () => {
+      service.getSelectedResult();
+
+      expect(searchService.getSelectedResult).toHaveBeenCalled();
+    });
+
+    it('should return result', () => {
+      const selectedResult$: Observable<ExterneFachstelleResource> = service.getSelectedResult();
+
+      expect(selectedResult$).toBeObservable(singleColdCompleted(externeFachstelleResource));
+    });
+  });
+
+  describe('select search result', () => {
+    const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+
+    it('should call service', () => {
+      service.selectSearchResult(externeFachstelleResource);
+
+      expect(searchService.selectResult).toHaveBeenCalledWith(externeFachstelleResource);
+    });
+  });
+
+  describe('clear selected result', () => {
+    it('should call service', () => {
+      service.clearSelectedResult();
+
+      expect(searchService.clearSelectedResult).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..85e9d9b5528e2a2076c783c8b8c78c07c2b0f9f1
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/externe-fachstelle/externe-fachstelle.service.ts
@@ -0,0 +1,70 @@
+import { EMPTY_ARRAY, getEmbeddedResources, StateResource } from '@alfa-client/tech-shared';
+import { Injectable } from '@angular/core';
+import { InstantSearchResult } from '@ods/system';
+import { isNull } from 'lodash-es';
+import { map, Observable } from 'rxjs';
+import { ZustaendigeStelleService } from '../zustaendige-stelle.service';
+import { ExterneFachstelleResourceSearchService } from './externe-fachstelle-resource-search.service';
+import { ExterneFachstelleListLinkRel } from './externe-fachstelle.linkrel';
+import { ExterneFachstelleListResource, ExterneFachstelleResource } from './externe-fachstelle.model';
+
+@Injectable()
+export class ExterneFachstelleService implements ZustaendigeStelleService<ExterneFachstelleResource> {
+  constructor(private readonly searchService: ExterneFachstelleResourceSearchService) {}
+
+  public getSearchResultList(): Observable<InstantSearchResult<ExterneFachstelleResource>[]> {
+    return this.searchService
+      .getResultList()
+      .pipe(
+        map((externeFachstelleStateListResource: StateResource<ExterneFachstelleListResource>) =>
+          this.mapListResource(externeFachstelleStateListResource),
+        ),
+      );
+  }
+
+  mapListResource(
+    externeFachstelleStateListResource: StateResource<ExterneFachstelleListResource>,
+  ): InstantSearchResult<ExterneFachstelleResource>[] {
+    return this.getExterneFachstellenResources(externeFachstelleStateListResource).map(
+      (externeFachstelle: ExterneFachstelleResource) => this.mapToInstantSearchResult(externeFachstelle),
+    );
+  }
+
+  private getExterneFachstellenResources(
+    externeFachstelleStateListResource: StateResource<ExterneFachstelleListResource>,
+  ): ExterneFachstelleResource[] {
+    const resources: ExterneFachstelleResource[] = getEmbeddedResources(
+      externeFachstelleStateListResource,
+      ExterneFachstelleListLinkRel.EXTERNE_FACHSTELLE_LIST,
+    );
+    return isNull(resources) ? EMPTY_ARRAY : resources;
+  }
+
+  mapToInstantSearchResult(externeFachstelle: ExterneFachstelleResource): InstantSearchResult<ExterneFachstelleResource> {
+    return {
+      title: externeFachstelle.name,
+      description: externeFachstelle.anschrift,
+      data: externeFachstelle,
+    };
+  }
+
+  public search(searchBy: string): void {
+    this.searchService.search(searchBy);
+  }
+
+  public clearSearchResult(): void {
+    this.searchService.clearResultList();
+  }
+
+  public getSelectedResult(): Observable<ExterneFachstelleResource> {
+    return this.searchService.getSelectedResult();
+  }
+
+  public selectSearchResult(externeFachstelle: ExterneFachstelleResource): void {
+    this.searchService.selectResult(externeFachstelle);
+  }
+
+  public clearSelectedResult(): void {
+    this.searchService.clearSelectedResult();
+  }
+}
diff --git a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit-resource-search.service.ts
similarity index 58%
rename from alfa-client/libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service.ts
rename to alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit-resource-search.service.ts
index 23f726f9ed323a5c596e660190d1168e0aea41e5..a31309271a877ac8e22ad2280885d38dd6ed3257 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit-resource-search.service.ts
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit-resource-search.service.ts
@@ -1,18 +1,6 @@
-import {
-  ResourceRepository,
-  ResourceSearchService,
-  SearchResourceServiceConfig,
-  mapToResource,
-} from '@alfa-client/tech-shared';
-import {
-  VorgangResource,
-  VorgangService,
-  VorgangWithEingangLinkRel,
-} from '@alfa-client/vorgang-shared';
-import {
-  OrganisationsEinheitListResource,
-  OrganisationsEinheitResource,
-} from './organisations-einheit.model';
+import { ResourceRepository, ResourceSearchService, SearchResourceServiceConfig, mapToResource } from '@alfa-client/tech-shared';
+import { VorgangResource, VorgangService, VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared';
+import { OrganisationsEinheitListResource, OrganisationsEinheitResource } from './organisations-einheit.model';
 
 export class OrganisationsEinheitResourceSearchService extends ResourceSearchService<
   VorgangResource,
@@ -20,10 +8,7 @@ export class OrganisationsEinheitResourceSearchService extends ResourceSearchSer
   OrganisationsEinheitResource
 > {}
 
-export function createOrganisationsEinheitResourceSearchService(
-  repository: ResourceRepository,
-  vorgangService: VorgangService,
-) {
+export function createOrganisationsEinheitResourceSearchService(repository: ResourceRepository, vorgangService: VorgangService) {
   return new ResourceSearchService(buildConfig(vorgangService), repository);
 }
 
diff --git a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.linkrel.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.linkrel.ts
similarity index 100%
rename from alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.linkrel.ts
rename to alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.linkrel.ts
diff --git a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.model.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.model.ts
similarity index 65%
rename from alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.model.ts
rename to alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.model.ts
index aafc23fbbce95dae57f511413b8e1c0dedd936ad..46320868558c4bcb58c907bcb3ad1ec3cd766b73 100644
--- a/alfa-client/libs/collaboration-shared/src/lib/organisations-einheit.model.ts
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.model.ts
@@ -13,8 +13,6 @@ export interface Anschrift {
   ort: string;
 }
 
-export interface OrganisationsEinheitResource
-  extends OrganisationsEinheit,
-    Resource,
-    ListItemResource {}
+export interface OrganisationsEinheitResource extends OrganisationsEinheit, Resource, ListItemResource {}
 export interface OrganisationsEinheitListResource extends ListResource {}
+export declare type OrganisationsEinheitItemResource = Resource & OrganisationsEinheit;
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.spec.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..62a1511e600749a8c907c49f0430014fd10bfc12
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.spec.ts
@@ -0,0 +1,175 @@
+import { EMPTY_ARRAY, StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
+import { faker } from '@faker-js/faker';
+import { InstantSearchResult } from '@ods/system';
+import { createInstantSearchResult } from 'libs/design-system/src/test/search';
+import { createEmptyListResource } from 'libs/tech-shared/test/resource';
+import { Observable, of } from 'rxjs';
+import { singleColdCompleted } from '../../../../tech-shared/test/marbles';
+import { createOrganisationsEinheitListResource, createOrganisationsEinheitResource } from '../../../test/organisations-einheit';
+import { OrganisationsEinheitResourceSearchService } from './organisations-einheit-resource-search.service';
+import { OrganisationsEinheitListResource, OrganisationsEinheitResource } from './organisations-einheit.model';
+import { OrganisationsEinheitService } from './organisations-einheit.service';
+
+jest.mock('./organisations-einheit-resource-search.service');
+
+describe('OrganisationsEinheitService', () => {
+  let service: OrganisationsEinheitService;
+
+  let searchService: Mock<OrganisationsEinheitResourceSearchService>;
+
+  const listResource: OrganisationsEinheitListResource = createOrganisationsEinheitListResource();
+  const listStateResource: StateResource<OrganisationsEinheitListResource> = createStateResource(listResource);
+
+  beforeEach(() => {
+    searchService = mock(OrganisationsEinheitResourceSearchService);
+
+    service = new OrganisationsEinheitService(useFromMock(searchService));
+  });
+
+  describe('get search result list', () => {
+    const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> = createInstantSearchResult();
+
+    beforeEach(() => {
+      searchService.getResultList.mockReturnValue(of(listStateResource));
+      service.mapListResource = jest.fn().mockReturnValue([instantSearchResult]);
+    });
+
+    it('should call search service', () => {
+      service.getSearchResultList();
+
+      expect(searchService.getResultList).toHaveBeenCalled();
+    });
+
+    it('should map list resource', () => {
+      service.getSearchResultList().subscribe();
+
+      expect(service.mapListResource).toHaveBeenCalledWith(listStateResource);
+    });
+
+    it('should return result', (done) => {
+      searchService.getResultList.mockReturnValue(of(listStateResource));
+
+      service.getSearchResultList().subscribe((result: InstantSearchResult<OrganisationsEinheitResource>[]) => {
+        expect(result).toEqual([instantSearchResult]);
+        done();
+      });
+    });
+  });
+
+  describe('map listResource', () => {
+    const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
+    const singleEntrylistResource: OrganisationsEinheitListResource = createOrganisationsEinheitListResource([
+      organisationsEinheitResource,
+    ]);
+    const singleEntryListStateResource: StateResource<OrganisationsEinheitListResource> =
+      createStateResource(singleEntrylistResource);
+
+    const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> = createInstantSearchResult();
+
+    beforeEach(() => {
+      service.mapToInstantSearchResult = jest.fn().mockReturnValue(instantSearchResult);
+    });
+
+    it('should map to instantSearchResult', () => {
+      service.mapListResource(singleEntryListStateResource);
+
+      expect(service.mapToInstantSearchResult).toHaveBeenCalledWith(organisationsEinheitResource);
+    });
+
+    it('should return value', () => {
+      const result: InstantSearchResult<OrganisationsEinheitResource>[] = service.mapListResource(singleEntryListStateResource);
+
+      expect(result).toEqual([instantSearchResult]);
+    });
+
+    it('should return empty array on empty listResource', () => {
+      const result: InstantSearchResult<OrganisationsEinheitResource>[] = service.mapListResource(
+        createStateResource(createEmptyListResource<OrganisationsEinheitListResource>()),
+      );
+
+      expect(result).toEqual(EMPTY_ARRAY);
+    });
+  });
+
+  describe('map to instant search result', () => {
+    const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
+
+    it('should map titel', () => {
+      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
+        service.mapToInstantSearchResult(organisationsEinheitResource);
+
+      expect(instantSearchResult.title).toBe(organisationsEinheitResource.name);
+    });
+    it('should map description', () => {
+      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
+        service.mapToInstantSearchResult(organisationsEinheitResource);
+
+      const expectedDescription: string = `${organisationsEinheitResource.anschrift.strasse} ${organisationsEinheitResource.anschrift.hausnummer}, ${organisationsEinheitResource.anschrift.plz} ${organisationsEinheitResource.anschrift.ort}`;
+      expect(instantSearchResult.description).toBe(expectedDescription);
+    });
+
+    it('should map data', () => {
+      const instantSearchResult: InstantSearchResult<OrganisationsEinheitResource> =
+        service.mapToInstantSearchResult(organisationsEinheitResource);
+
+      expect(instantSearchResult.data).toBe(organisationsEinheitResource);
+    });
+  });
+
+  describe('search', () => {
+    const searchBy: string = faker.lorem.word();
+
+    it('should call search service with search string', () => {
+      service.search(searchBy);
+
+      expect(searchService.search).toHaveBeenCalledWith(searchBy);
+    });
+  });
+
+  describe('clear search result', () => {
+    it('should call search service', () => {
+      service.clearSearchResult();
+
+      expect(searchService.clearResultList).toHaveBeenCalledWith();
+    });
+  });
+
+  describe('get selected result', () => {
+    const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
+
+    beforeEach(() => {
+      searchService.getSelectedResult.mockReturnValue(of(organisationsEinheitResource));
+    });
+
+    it('should call service', () => {
+      service.getSelectedResult();
+
+      expect(searchService.getSelectedResult).toHaveBeenCalled();
+    });
+
+    it('should return result', () => {
+      const selectedResult$: Observable<OrganisationsEinheitResource> = service.getSelectedResult();
+
+      expect(selectedResult$).toBeObservable(singleColdCompleted(organisationsEinheitResource));
+    });
+  });
+
+  describe('select search result', () => {
+    const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
+
+    it('should call service', () => {
+      service.selectSearchResult(organisationsEinheitResource);
+
+      expect(searchService.selectResult).toHaveBeenCalledWith(organisationsEinheitResource);
+    });
+  });
+
+  describe('clear selected result', () => {
+    it('should call service', () => {
+      service.clearSelectedResult();
+
+      expect(searchService.clearSelectedResult).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f37df6898ee27ef575d5faa964dc0fa57baad68b
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/organisations-einheit/organisations-einheit.service.ts
@@ -0,0 +1,70 @@
+import { EMPTY_ARRAY, getEmbeddedResources, StateResource } from '@alfa-client/tech-shared';
+import { Injectable } from '@angular/core';
+import { InstantSearchResult } from '@ods/system';
+import { isNull } from 'lodash-es';
+import { map, Observable } from 'rxjs';
+import { ZustaendigeStelleService } from '../zustaendige-stelle.service';
+import { OrganisationsEinheitResourceSearchService } from './organisations-einheit-resource-search.service';
+import { OrganisationsEinheitListLinkRel } from './organisations-einheit.linkrel';
+import { OrganisationsEinheitListResource, OrganisationsEinheitResource } from './organisations-einheit.model';
+
+@Injectable()
+export class OrganisationsEinheitService implements ZustaendigeStelleService<OrganisationsEinheitResource> {
+  constructor(private readonly searchService: OrganisationsEinheitResourceSearchService) {}
+
+  public getSearchResultList(): Observable<InstantSearchResult<OrganisationsEinheitResource>[]> {
+    return this.searchService
+      .getResultList()
+      .pipe(
+        map((organisationsEinheitStateListResource: StateResource<OrganisationsEinheitListResource>) =>
+          this.mapListResource(organisationsEinheitStateListResource),
+        ),
+      );
+  }
+
+  mapListResource(
+    organisationsEinheitStateListResource: StateResource<OrganisationsEinheitListResource>,
+  ): InstantSearchResult<OrganisationsEinheitResource>[] {
+    return this.getOrganisationsEinheitResources(organisationsEinheitStateListResource).map(
+      (organisationsEinheitResource: OrganisationsEinheitResource) => this.mapToInstantSearchResult(organisationsEinheitResource),
+    );
+  }
+
+  private getOrganisationsEinheitResources(
+    organisationsEinheitStateListResource: StateResource<OrganisationsEinheitListResource>,
+  ): OrganisationsEinheitResource[] {
+    const resources: OrganisationsEinheitResource[] = getEmbeddedResources(
+      organisationsEinheitStateListResource,
+      OrganisationsEinheitListLinkRel.ORGANISATIONS_EINHEIT_HEADER_LIST,
+    );
+    return isNull(resources) ? EMPTY_ARRAY : resources;
+  }
+
+  mapToInstantSearchResult(zustaendigeStelle: OrganisationsEinheitResource): InstantSearchResult<OrganisationsEinheitResource> {
+    return {
+      title: zustaendigeStelle.name,
+      description: `${zustaendigeStelle.anschrift.strasse} ${zustaendigeStelle.anschrift.hausnummer}, ${zustaendigeStelle.anschrift.plz} ${zustaendigeStelle.anschrift.ort}`,
+      data: zustaendigeStelle,
+    };
+  }
+
+  public search(searchBy: string): void {
+    this.searchService.search(searchBy);
+  }
+
+  public clearSearchResult(): void {
+    this.searchService.clearResultList();
+  }
+
+  public getSelectedResult(): Observable<OrganisationsEinheitResource> {
+    return this.searchService.getSelectedResult();
+  }
+
+  public selectSearchResult(organisationsEinheitResource: OrganisationsEinheitResource): void {
+    this.searchService.selectResult(organisationsEinheitResource);
+  }
+
+  public clearSelectedResult(): void {
+    this.searchService.clearSelectedResult();
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.spec.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d35dca1187314e568d682dd77633c693e56124b
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.spec.ts
@@ -0,0 +1,14 @@
+import { TestBed } from '@angular/core/testing';
+import { ZustaendigeStelleSharedModule } from './zustaendige-stelle-shared.module';
+
+describe('ZustaendigeStelleSharedModule', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [ZustaendigeStelleSharedModule],
+    }).compileComponents();
+  });
+
+  it('should create', () => {
+    expect(ZustaendigeStelleSharedModule).toBeDefined();
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d233051635da34cf94f031f139df71eba683dfb
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module.ts
@@ -0,0 +1,33 @@
+import { ResourceRepository } from '@alfa-client/tech-shared';
+import { VorgangService } from '@alfa-client/vorgang-shared';
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import {
+  ExterneFachstelleResourceSearchService,
+  createExterneFachstelleResourceSearchService,
+} from './externe-fachstelle/externe-fachstelle-resource-search.service';
+import { ExterneFachstelleService } from './externe-fachstelle/externe-fachstelle.service';
+import {
+  OrganisationsEinheitResourceSearchService,
+  createOrganisationsEinheitResourceSearchService,
+} from './organisations-einheit/organisations-einheit-resource-search.service';
+import { OrganisationsEinheitService } from './organisations-einheit/organisations-einheit.service';
+
+@NgModule({
+  imports: [CommonModule],
+  providers: [
+    OrganisationsEinheitService,
+    ExterneFachstelleService,
+    {
+      provide: OrganisationsEinheitResourceSearchService,
+      useFactory: createOrganisationsEinheitResourceSearchService,
+      deps: [ResourceRepository, VorgangService],
+    },
+    {
+      provide: ExterneFachstelleResourceSearchService,
+      useFactory: createExterneFachstelleResourceSearchService,
+      deps: [ResourceRepository, VorgangService],
+    },
+  ],
+})
+export class ZustaendigeStelleSharedModule {}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.service.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0349ebacc9ec8ca35851b4f2a994f1eb2b219e12
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.service.ts
@@ -0,0 +1,12 @@
+import { Resource } from '@ngxp/rest';
+import { InstantSearchResult } from '@ods/system';
+import { Observable } from 'rxjs';
+
+export interface ZustaendigeStelleService<T extends Resource> {
+  getSearchResultList(): Observable<InstantSearchResult<T>[]>;
+  search(searchBy: string): void;
+  clearSearchResult(): void;
+  getSelectedResult(): Observable<T>;
+  selectSearchResult(zustaendigeStelleResource: T): void;
+  clearSelectedResult(): void;
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.token.ts b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.token.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bdb1bef21fc92ccf970b6c536cc77e3553dea213
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle.token.ts
@@ -0,0 +1,5 @@
+import { InjectionToken } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { ZustaendigeStelleService } from './zustaendige-stelle.service';
+
+export const ZUSTAENDIGE_STELLE_SERVICE = new InjectionToken<ZustaendigeStelleService<Resource>>('ZustaendigeStelleService');
diff --git a/alfa-client/libs/zustaendige-stelle-shared/src/test-setup.ts b/alfa-client/libs/zustaendige-stelle-shared/src/test-setup.ts
new file mode 100644
index 0000000000000000000000000000000000000000..12fa19564300d506f71206e28de6cfa4a933bc59
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/src/test-setup.ts
@@ -0,0 +1,9 @@
+import { getTestBed } from '@angular/core/testing';
+import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
+
+getTestBed().resetTestEnvironment();
+getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), {
+  teardown: { destroyAfterEach: false },
+  errorOnUnknownProperties: true,
+  errorOnUnknownElements: true,
+});
diff --git a/alfa-client/libs/zustaendige-stelle-shared/test/externe-fachstelle.ts b/alfa-client/libs/zustaendige-stelle-shared/test/externe-fachstelle.ts
new file mode 100644
index 0000000000000000000000000000000000000000..adca84c77ef27222bd7c3891e01401a3e68a6783
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/test/externe-fachstelle.ts
@@ -0,0 +1,34 @@
+import { faker } from '@faker-js/faker';
+import { toResource } from 'libs/tech-shared/test/resource';
+import { times } from 'lodash-es';
+import { ExterneFachstelleListLinkRel } from '../src/lib/externe-fachstelle/externe-fachstelle.linkrel';
+import {
+  ExterneFachstelle,
+  ExterneFachstelleListResource,
+  ExterneFachstelleResource,
+} from '../src/lib/externe-fachstelle/externe-fachstelle.model';
+
+export function createExterneFachstelle(): ExterneFachstelle {
+  return {
+    name: faker.lorem.word(),
+    anschrift: faker.lorem.words(5),
+    email: faker.internet.email(),
+  };
+}
+
+export function createExterneFachstelleResource(linkRel: string[] = []): ExterneFachstelleResource {
+  return toResource(createExterneFachstelle(), linkRel);
+}
+
+export function createExterneFachstelleResources(linkRelations: string[] = []): ExterneFachstelleResource[] {
+  return times(10, () => toResource(createExterneFachstelleResource(), [...linkRelations]));
+}
+
+export function createExterneFachstelleListResource(
+  resources?: ExterneFachstelleResource[],
+  linkRelations: string[] = [],
+): ExterneFachstelleListResource {
+  return toResource({}, [...linkRelations], {
+    [ExterneFachstelleListLinkRel.EXTERNE_FACHSTELLE_LIST]: resources ? resources : createExterneFachstelleResources(),
+  });
+}
diff --git a/alfa-client/libs/collaboration-shared/test/organisations-einheit.ts b/alfa-client/libs/zustaendige-stelle-shared/test/organisations-einheit.ts
similarity index 73%
rename from alfa-client/libs/collaboration-shared/test/organisations-einheit.ts
rename to alfa-client/libs/zustaendige-stelle-shared/test/organisations-einheit.ts
index 41b2121267aeffd6b68e1d5c554d4cb4dc72f41a..3fa8a76977ba13edde1d864b8edb576994475512 100644
--- a/alfa-client/libs/collaboration-shared/test/organisations-einheit.ts
+++ b/alfa-client/libs/zustaendige-stelle-shared/test/organisations-einheit.ts
@@ -1,14 +1,13 @@
+import { faker } from '@faker-js/faker';
 import { times } from 'lodash-es';
 import { toResource } from '../../tech-shared/test/resource';
+import { OrganisationsEinheitListLinkRel } from '../src/lib/organisations-einheit/organisations-einheit.linkrel';
 import {
   Anschrift,
   OrganisationsEinheit,
-  OrganisationsEinheitListLinkRel,
   OrganisationsEinheitListResource,
   OrganisationsEinheitResource,
-} from '../src';
-
-import { faker } from '@faker-js/faker';
+} from '../src/lib/organisations-einheit/organisations-einheit.model';
 
 export function createAnschrift(): Anschrift {
   return {
@@ -26,15 +25,11 @@ export function createOrganisationsEinheit(): OrganisationsEinheit {
   };
 }
 
-export function createOrganisationsEinheitResource(
-  linkRel: string[] = [],
-): OrganisationsEinheitResource {
+export function createOrganisationsEinheitResource(linkRel: string[] = []): OrganisationsEinheitResource {
   return toResource(createOrganisationsEinheit(), linkRel);
 }
 
-export function createOrganisationsEinheitResources(
-  linkRelations: string[] = [],
-): OrganisationsEinheitResource[] {
+export function createOrganisationsEinheitResources(linkRelations: string[] = []): OrganisationsEinheitResource[] {
   return times(10, () => toResource(createOrganisationsEinheitResource(), [...linkRelations]));
 }
 
diff --git a/alfa-client/libs/zustaendige-stelle-shared/tsconfig.json b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..7cc6baf2f58ed5ccfba098131996f579979e9f18
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.json
@@ -0,0 +1,16 @@
+{
+  "extends": "../../tsconfig.base.json",
+  "files": [],
+  "include": [],
+  "references": [
+    {
+      "path": "./tsconfig.lib.json"
+    },
+    {
+      "path": "./tsconfig.spec.json"
+    }
+  ],
+  "compilerOptions": {
+    "target": "es2022"
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle-shared/tsconfig.lib.json b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.lib.json
new file mode 100644
index 0000000000000000000000000000000000000000..9475b010386d7226f2b81f0f8501a110c3340cb2
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.lib.json
@@ -0,0 +1,19 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../dist/out-tsc",
+    "target": "es2015",
+    "declaration": true,
+    "declarationMap": true,
+    "inlineSources": true,
+    "types": [],
+    "lib": ["dom", "es2018"]
+  },
+  "angularCompilerOptions": {
+    "skipTemplateCodegen": true,
+    "strictMetadataEmit": true,
+    "enableResourceInlining": true
+  },
+  "exclude": ["src/test-setup.ts", "**/*.spec.ts", "jest.config.ts"],
+  "include": ["**/*.ts"]
+}
\ No newline at end of file
diff --git a/alfa-client/libs/zustaendige-stelle-shared/tsconfig.spec.json b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..3a690070a7f5e48080dd36522d6a0db384d940aa
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle-shared/tsconfig.spec.json
@@ -0,0 +1,12 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../dist/out-tsc",
+    "module": "commonjs",
+    "types": ["jest", "node"],
+    "target": "ES2022",
+    "useDefineForClassFields": false
+  },
+  "files": ["src/test-setup.ts"],
+  "include": ["**/*.spec.ts", "**/*.d.ts", "jest.config.ts"]
+}
diff --git a/alfa-client/libs/zustaendige-stelle/.eslintrc.json b/alfa-client/libs/zustaendige-stelle/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..b953e5d37d40148217ab14a01859ea0cb43d9ebc
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/.eslintrc.json
@@ -0,0 +1,33 @@
+{
+  "extends": ["../../.eslintrc.json"],
+  "ignorePatterns": ["!**/*"],
+  "overrides": [
+    {
+      "files": ["*.ts"],
+      "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
+      "rules": {
+        "@angular-eslint/directive-selector": [
+          "error",
+          {
+            "type": "attribute",
+            "prefix": "lib",
+            "style": "camelCase"
+          }
+        ],
+        "@angular-eslint/component-selector": [
+          "error",
+          {
+            "type": "element",
+            "prefix": "lib",
+            "style": "kebab-case"
+          }
+        ]
+      }
+    },
+    {
+      "files": ["*.html"],
+      "extends": ["plugin:@nx/angular-template"],
+      "rules": {}
+    }
+  ]
+}
diff --git a/alfa-client/libs/zustaendige-stelle/README.md b/alfa-client/libs/zustaendige-stelle/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..79cdd47f94b5d289ef89c83fac63d412edf6b4e8
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/README.md
@@ -0,0 +1,7 @@
+# zustaendige-stelle
+
+This library was generated with [Nx](https://nx.dev).
+
+## Running unit tests
+
+Run `nx test zustaendige-stelle` to execute the unit tests.
diff --git a/alfa-client/libs/zustaendige-stelle/jest.config.ts b/alfa-client/libs/zustaendige-stelle/jest.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab3acdae1b5402f061cb7eecf2d2c8fa38811f79
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+  displayName: 'zustaendige-stelle',
+  preset: '../../jest.preset.js',
+  setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
+  coverageDirectory: '../../coverage/libs/zustaendige-stelle',
+  transform: {
+    '^.+\\.(ts|mjs|js|html)$': [
+      'jest-preset-angular',
+      {
+        tsconfig: '<rootDir>/tsconfig.spec.json',
+        stringifyContentPathRegex: '\\.(html|svg)$',
+      },
+    ],
+  },
+  transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+  snapshotSerializers: [
+    'jest-preset-angular/build/serializers/no-ng-attributes',
+    'jest-preset-angular/build/serializers/ng-snapshot',
+    'jest-preset-angular/build/serializers/html-comment',
+  ],
+};
diff --git a/alfa-client/libs/zustaendige-stelle/project.json b/alfa-client/libs/zustaendige-stelle/project.json
new file mode 100644
index 0000000000000000000000000000000000000000..867f306a90142d3343259429b19dbedaa5d3259d
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/project.json
@@ -0,0 +1,20 @@
+{
+  "name": "zustaendige-stelle",
+  "$schema": "../../node_modules/nx/schemas/project-schema.json",
+  "sourceRoot": "libs/zustaendige-stelle/src",
+  "prefix": "lib",
+  "projectType": "library",
+  "tags": [],
+  "targets": {
+    "test": {
+      "executor": "@nx/jest:jest",
+      "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+      "options": {
+        "jestConfig": "libs/zustaendige-stelle/jest.config.ts"
+      }
+    },
+    "lint": {
+      "executor": "@nx/eslint:lint"
+    }
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/index.ts b/alfa-client/libs/zustaendige-stelle/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0b94d9bc2b959f56babe9fe5df97cb5dd0886f02
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/index.ts
@@ -0,0 +1,3 @@
+export * from './lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component';
+export * from './lib/search-organisations-einheit-container/search-organisations-einheit-container.component';
+export * from './lib/zustaendige-stelle.module';
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..d36f2ccadb9ebb69aa3ccf78c2fc000f17fdd953
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.html
@@ -0,0 +1,9 @@
+<ods-button
+  variant="icon"
+  size="fit"
+  data-test-class="edit-zustaendige-stelle-button"
+  [dataTestId]="dataTestId"
+  (clickEmitter)="openSearchDialog()"
+>
+  <ods-edit-icon icon />
+</ods-button>
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8facf8e5b085edde1b1c413cff3b6921f9dd9078
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.spec.ts
@@ -0,0 +1,69 @@
+import { dispatchEventFromFixture, mock, Mock } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { faker } from '@faker-js/faker';
+import { Resource } from '@ngxp/rest';
+import { ButtonComponent, EditIconComponent } from '@ods/system';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { SearchZustaendigeStelleDialogComponent } from '../search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component';
+import { EditZustaendigeStelleButtonComponent } from './edit-zustaendige-stelle-button.component';
+
+describe('EditZustaendigeStelleButtonComponent', () => {
+  let component: EditZustaendigeStelleButtonComponent<Resource>;
+  let fixture: ComponentFixture<EditZustaendigeStelleButtonComponent<Resource>>;
+
+  const title: string = faker.lorem.words(3);
+  const dataTestId: string = faker.lorem.word();
+
+  const button: string = getDataTestClassOf('edit-zustaendige-stelle-button');
+
+  let dialogService: Mock<OzgcloudDialogService>;
+
+  beforeEach(async () => {
+    dialogService = mock(OzgcloudDialogService);
+    await TestBed.configureTestingModule({
+      declarations: [EditZustaendigeStelleButtonComponent],
+      imports: [MockComponent(ButtonComponent), MockComponent(EditIconComponent)],
+      providers: [
+        {
+          provide: OzgcloudDialogService,
+          useValue: dialogService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(EditZustaendigeStelleButtonComponent);
+    component = fixture.componentInstance;
+    component.title = title;
+    component.dataTestId = dataTestId;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('search zustaendige stelle button', () => {
+    it('should call openSearchDialog', () => {
+      component.openSearchDialog = jest.fn();
+
+      fixture.detectChanges();
+      dispatchEventFromFixture(fixture, button, 'clickEmitter');
+
+      expect(component.openSearchDialog).toHaveBeenCalled();
+    });
+  });
+
+  describe('open search dialog', () => {
+    it('should call dialog service', () => {
+      component.openSearchDialog();
+
+      expect(dialogService.openFullScreenDialog).toHaveBeenCalledWith(
+        SearchZustaendigeStelleDialogComponent,
+        component.viewContainerRef,
+        title,
+      );
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b3c059fc8c8c044ce4b94d961190bd6d7e35057f
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component.ts
@@ -0,0 +1,26 @@
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { Component, Input, ViewContainerRef } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { SearchZustaendigeStelleDialogComponent } from '../search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component';
+
+@Component({
+  selector: 'alfa-edit-zustaendige-stelle-button',
+  templateUrl: './edit-zustaendige-stelle-button.component.html',
+})
+export class EditZustaendigeStelleButtonComponent<T extends Resource> {
+  @Input() public dataTestId: string;
+  @Input() title: string;
+
+  constructor(
+    private dialogService: OzgcloudDialogService,
+    readonly viewContainerRef: ViewContainerRef,
+  ) {}
+
+  public openSearchDialog(): void {
+    this.dialogService.openFullScreenDialog<SearchZustaendigeStelleDialogComponent<T>>(
+      SearchZustaendigeStelleDialogComponent,
+      this.viewContainerRef,
+      this.title,
+    );
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..c3e48e9305999ee9f845f56ec608ef9f256d03b2
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.html
@@ -0,0 +1,19 @@
+<ng-container *ngIf="externeFachstelleResource$ | async as externeFachstelleResource; else searchButton">
+  <alfa-zustaendige-stelle-header title="Externe Fachstelle" [subTitle]="externeFachstelleResource.name" [isSubTitleBold]="true">
+    <ods-external-unit-icon icon />
+    <div class="flex flex-1 flex-col text-sm text-text" info>
+      <p>{{ externeFachstelleResource.anschrift }}</p>
+      <p>{{ 'Email: ' + externeFachstelleResource.email }}</p>
+    </div>
+    <alfa-edit-zustaendige-stelle-button
+      title="Zuständige externe Fachstelle auswählen"
+      dataTestId="edit-externe-fachstelle-button"
+    />
+  </alfa-zustaendige-stelle-header>
+</ng-container>
+<ng-template #searchButton>
+  <alfa-zustaendige-stelle-header title="Externe Fachstelle" subTitle="Private Organisation, Verein, Schule">
+    <ods-external-unit-icon icon />
+    <alfa-zustaendige-stelle-button title="Zuständige externe Fachstelle auswählen" dataTestId="externe-fachstelle-button" />
+  </alfa-zustaendige-stelle-header>
+</ng-template>
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e51df04f892b09f383e96113374091d17666e687
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.spec.ts
@@ -0,0 +1,148 @@
+import { Mock, mock } from '@alfa-client/test-utils';
+import {
+  ExterneFachstelleResource,
+  ExterneFachstelleService,
+  ZUSTAENDIGE_STELLE_SERVICE,
+} from '@alfa-client/zustaendige-stelle-shared';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormControl } from '@angular/forms';
+import { getUrl } from '@ngxp/rest';
+import { ExternalUnitIconComponent } from '@ods/system';
+import { createExterneFachstelleResource } from 'libs/zustaendige-stelle-shared/test/externe-fachstelle';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { EditZustaendigeStelleButtonComponent } from '../edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component';
+import { ZustaendigeStelleButtonComponent } from '../zustaendige-stelle-button/zustaendige-stelle-button.component';
+import { ZustaendigeStelleHeaderComponent } from '../zustaendige-stelle-header/zustaendige-stelle-header.component';
+import { SearchExterneFachstelleContainerComponent } from './search-externe-fachstelle-container.component';
+
+describe('SearchExterneFachstelleContainerComponent', () => {
+  let component: SearchExterneFachstelleContainerComponent;
+  let fixture: ComponentFixture<SearchExterneFachstelleContainerComponent>;
+
+  const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+
+  let externeFachstelleService: Mock<ExterneFachstelleService>;
+
+  beforeEach(async () => {
+    externeFachstelleService = {
+      ...mock(ExterneFachstelleService),
+      getSelectedResult: jest.fn().mockReturnValue(of(createExterneFachstelleResource())),
+    };
+    TestBed.overrideComponent(SearchExterneFachstelleContainerComponent, {
+      set: {
+        providers: [
+          {
+            provide: ZUSTAENDIGE_STELLE_SERVICE,
+            useValue: externeFachstelleService,
+          },
+        ],
+      },
+    });
+    await TestBed.configureTestingModule({
+      declarations: [
+        SearchExterneFachstelleContainerComponent,
+        MockComponent(EditZustaendigeStelleButtonComponent),
+        MockComponent(ZustaendigeStelleButtonComponent),
+        MockComponent(ZustaendigeStelleHeaderComponent),
+        MockComponent(ExternalUnitIconComponent),
+      ],
+      providers: [
+        {
+          provide: ExterneFachstelleService,
+          useValue: externeFachstelleService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(SearchExterneFachstelleContainerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('ngOnInt', () => {
+    beforeEach(() => {
+      component.getSelectedResult = jest.fn().mockReturnValue(of(externeFachstelleResource));
+    });
+
+    it('should call getSelectedResult', () => {
+      component.ngOnInit();
+
+      expect(component.getSelectedResult).toHaveBeenCalled();
+    });
+
+    it('should set externeFachstelleResource', (done) => {
+      component.ngOnInit();
+
+      component.externeFachstelleResource$.subscribe((externeFachstelleResource: ExterneFachstelleResource) => {
+        expect(externeFachstelleResource).toBe(externeFachstelleResource);
+        done();
+      });
+    });
+  });
+
+  describe('ngOnDestroy', () => {
+    it('should clear selected result', () => {
+      component.ngOnDestroy();
+
+      expect(externeFachstelleService.clearSelectedResult).toHaveBeenCalled();
+    });
+  });
+
+  describe('get selected result', () => {
+    const externeFachstelleResource: ExterneFachstelleResource = createExterneFachstelleResource();
+
+    beforeEach(() => {
+      externeFachstelleService.getSelectedResult.mockReturnValue(of(externeFachstelleResource));
+    });
+
+    it('should call service', () => {
+      component.getSelectedResult().subscribe();
+
+      expect(externeFachstelleService.getSelectedResult).toHaveBeenCalled();
+    });
+
+    it('should call handleResult', () => {
+      component.handleResult = jest.fn();
+
+      component.getSelectedResult().subscribe();
+
+      expect(component.handleResult).toHaveBeenCalledWith(externeFachstelleResource);
+    });
+
+    it('should return value', (done) => {
+      component.handleResult = jest.fn();
+
+      component.getSelectedResult().subscribe((result) => {
+        expect(result).toBe(externeFachstelleResource);
+        done();
+      });
+    });
+  });
+
+  describe('handle result', () => {
+    beforeEach(() => {
+      component.fieldControl = new FormControl();
+    });
+
+    it('should patch fieldControl with resource uri', () => {
+      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue = jest.fn());
+
+      component.handleResult(externeFachstelleResource);
+
+      expect(fieldControlPatchSpy).toHaveBeenCalledWith(getUrl(externeFachstelleResource));
+    });
+
+    it('should not patch fieldControl if externeFachstelle resource is null', () => {
+      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue = jest.fn());
+
+      component.handleResult(null);
+
+      expect(fieldControlPatchSpy).not.toHaveBeenCalled();
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a1b23bb17a43a7536219ca39c6a6ea229f6a4498
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-externe-fachstelle-container/search-externe-fachstelle-container.component.ts
@@ -0,0 +1,47 @@
+import { isNotNull } from '@alfa-client/tech-shared';
+import {
+  ExterneFachstelleResource,
+  ExterneFachstelleService,
+  ZUSTAENDIGE_STELLE_SERVICE,
+  ZustaendigeStelleService,
+} from '@alfa-client/zustaendige-stelle-shared';
+import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';
+import { AbstractControl } from '@angular/forms';
+import { ResourceUri, getUrl } from '@ngxp/rest';
+import { Observable, tap } from 'rxjs';
+
+@Component({
+  selector: 'alfa-search-externe-fachstelle-container',
+  templateUrl: './search-externe-fachstelle-container.component.html',
+  providers: [{ provide: ZUSTAENDIGE_STELLE_SERVICE, useClass: ExterneFachstelleService }],
+})
+export class SearchExterneFachstelleContainerComponent implements OnInit, OnDestroy {
+  @Input() public fieldControl: AbstractControl<ResourceUri>;
+
+  public externeFachstelleResource$: Observable<ExterneFachstelleResource>;
+
+  constructor(
+    @Inject(ZUSTAENDIGE_STELLE_SERVICE)
+    private service: ZustaendigeStelleService<ExterneFachstelleResource>,
+  ) {}
+
+  ngOnInit(): void {
+    this.externeFachstelleResource$ = this.getSelectedResult();
+  }
+
+  ngOnDestroy(): void {
+    this.service.clearSelectedResult();
+  }
+
+  getSelectedResult(): Observable<ExterneFachstelleResource> {
+    return this.service
+      .getSelectedResult()
+      .pipe(tap((externeFachstelleResource: ExterneFachstelleResource) => this.handleResult(externeFachstelleResource)));
+  }
+
+  handleResult(externeFachstelleResource: ExterneFachstelleResource): void {
+    if (isNotNull(externeFachstelleResource)) {
+      this.fieldControl.patchValue(getUrl(externeFachstelleResource));
+    }
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..4dfc708d600fb2f0e9691666cc22cdcc82a9693c
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.html
@@ -0,0 +1 @@
+<p class="text-sm text-text">{{ address }}</p>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts
similarity index 75%
rename from alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts
index 8e6eaa1ea513256ec82992961078976755078248..821ce7f843e1e2d4ef4f367959aacf360fb7f5b4 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.spec.ts
@@ -1,14 +1,13 @@
-import { OrganisationsEinheitResource } from '@alfa-client/collaboration-shared';
+import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { createOrganisationsEinheitResource } from 'libs/collaboration-shared/test/organisations-einheit';
+import { createOrganisationsEinheitResource } from 'libs/zustaendige-stelle-shared/test/organisations-einheit';
 import { OrganisationsEinheitComponent } from './organisations-einheit.component';
 
 describe('OrganisationsEinheitComponent', () => {
   let component: OrganisationsEinheitComponent;
   let fixture: ComponentFixture<OrganisationsEinheitComponent>;
 
-  const organisationsEinheitResource: OrganisationsEinheitResource =
-    createOrganisationsEinheitResource();
+  const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
@@ -30,21 +29,11 @@ describe('OrganisationsEinheitComponent', () => {
 
       component.organisationsEinheitResource = organisationsEinheitResource;
 
-      expect(component.updateByOrganisationsEinheit).toHaveBeenCalledWith(
-        organisationsEinheitResource,
-      );
+      expect(component.updateByOrganisationsEinheit).toHaveBeenCalledWith(organisationsEinheitResource);
     });
   });
 
   describe('update by organisationsEinheit', () => {
-    it('should set name', () => {
-      component.name = null;
-
-      component.updateByOrganisationsEinheit(organisationsEinheitResource);
-
-      expect(component.name).toEqual(organisationsEinheitResource.name);
-    });
-
     it('should set address', () => {
       component.address = null;
 
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts
similarity index 76%
rename from alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts
index ff94e74f550eee641eaf4645b166838d5048badb..91889a8bced5ef09e4976e4762786646eee887be 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/organisations-einheit/organisations-einheit.component.ts
@@ -1,4 +1,4 @@
-import { Anschrift, OrganisationsEinheitResource } from '@alfa-client/collaboration-shared';
+import { Anschrift, OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared';
 import { Component, Input } from '@angular/core';
 
 @Component({
@@ -6,17 +6,13 @@ import { Component, Input } from '@angular/core';
   templateUrl: './organisations-einheit.component.html',
 })
 export class OrganisationsEinheitComponent {
-  @Input() public set organisationsEinheitResource(
-    organisationsEinheit: OrganisationsEinheitResource,
-  ) {
+  @Input() public set organisationsEinheitResource(organisationsEinheit: OrganisationsEinheitResource) {
     this.updateByOrganisationsEinheit(organisationsEinheit);
   }
 
-  public name: string;
   public address: string;
 
   updateByOrganisationsEinheit(organisationsEinheit: OrganisationsEinheitResource): void {
-    this.name = organisationsEinheit.name;
     this.address = this.buildAddress(organisationsEinheit.anschrift);
   }
 
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..77443b9e24d398ace9485cfaa0a2a71bb83266c7
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.html
@@ -0,0 +1,22 @@
+<ng-container *ngIf="organisationsEinheitResource$ | async as organisationsEinheitResource; else searchButton">
+  <alfa-zustaendige-stelle-header
+    title="Öffentliche Verwaltung"
+    [subTitle]="organisationsEinheitResource.name"
+    [isSubTitleBold]="true"
+  >
+    <ods-public-administration-icon icon />
+    <alfa-organisations-einheit
+      data-test-id="organisations-einheit-in-collaboration"
+      [organisationsEinheitResource]="organisationsEinheitResource"
+      class="flex-1"
+      info
+    />
+    <alfa-edit-zustaendige-stelle-button title="Zuständige Stelle auswählen" dataTestId="edit-organisations-einheit-button" />
+  </alfa-zustaendige-stelle-header>
+</ng-container>
+<ng-template #searchButton>
+  <alfa-zustaendige-stelle-header title="Öffentliche Verwaltung" subTitle="Kommune, Amt, Ministerium">
+    <ods-public-administration-icon icon />
+    <alfa-zustaendige-stelle-button title="Zuständige Stelle auswählen" dataTestId="organisations-einheit-search-button" />
+  </alfa-zustaendige-stelle-header>
+</ng-template>
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts
similarity index 51%
rename from alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.spec.ts
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts
index 9fe951c4b33dbd191a352467286baaa168922529..eee16abf0001bcbe53e1991a2d6c3ac2cfc99466 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration-in-vorgang-container/collaboration-request-form/organisations-einheit-container/organisations-einheit-container.component.spec.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts
@@ -1,83 +1,66 @@
+import { Mock, existsAsHtmlElement, getMockComponent, mock } from '@alfa-client/test-utils';
 import {
   OrganisationsEinheitResource,
   OrganisationsEinheitService,
-} from '@alfa-client/collaboration-shared';
-import {
-  Mock,
-  dispatchEventFromFixture,
-  existsAsHtmlElement,
-  getMockComponent,
-  mock,
-} from '@alfa-client/test-utils';
-import { OzgcloudDialogService } from '@alfa-client/ui';
-import { DialogConfig } from '@angular/cdk/dialog';
+  ZUSTAENDIGE_STELLE_SERVICE,
+} from '@alfa-client/zustaendige-stelle-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormControl } from '@angular/forms';
 import { getUrl } from '@ngxp/rest';
-import { ButtonComponent, OfficeIconComponent } from '@ods/system';
-import { createOrganisationsEinheitResource } from 'libs/collaboration-shared/test/organisations-einheit';
-import { SearchIconComponent } from 'libs/design-system/src/lib/icons/search-icon/search-icon.component';
+import { PublicAdministrationIconComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createOrganisationsEinheitResource } from 'libs/zustaendige-stelle-shared/test/organisations-einheit';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
-import { SearchOrganisationsEinheitContainerComponent } from '../../../search-organisations-einheit-container/search-organisations-einheit-container.component';
-import { OrganisationsEinheitContainerComponent } from './organisations-einheit-container.component';
+import { EditZustaendigeStelleButtonComponent } from '../edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component';
+import { ZustaendigeStelleButtonComponent } from '../zustaendige-stelle-button/zustaendige-stelle-button.component';
+import { ZustaendigeStelleHeaderComponent } from '../zustaendige-stelle-header/zustaendige-stelle-header.component';
 import { OrganisationsEinheitComponent } from './organisations-einheit/organisations-einheit.component';
+import { SearchOrganisationsEinheitContainerComponent } from './search-organisations-einheit-container.component';
 
-describe('OrganisationsEinheitContainerComponent', () => {
-  let component: OrganisationsEinheitContainerComponent;
-  let fixture: ComponentFixture<OrganisationsEinheitContainerComponent>;
+describe('SearchOrganisationsEinheitContainerComponent', () => {
+  let component: SearchOrganisationsEinheitContainerComponent;
+  let fixture: ComponentFixture<SearchOrganisationsEinheitContainerComponent>;
 
-  const searchOrganisationsEinheitButton: string = getDataTestIdOf(
-    'organisations-einheit-search-button',
-  );
-  const organisationsEinheitComp: string = getDataTestIdOf(
-    'organisations-einheit-in-collaboration',
-  );
+  const organisationsEinheitComp: string = getDataTestIdOf('organisations-einheit-in-collaboration');
 
-  const organisationsEinheitResource: OrganisationsEinheitResource =
-    createOrganisationsEinheitResource();
+  const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
 
-  let dialogService: Mock<OzgcloudDialogService>;
-  let service: Mock<OrganisationsEinheitService>;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
 
   beforeEach(async () => {
-    dialogService = mock(OzgcloudDialogService);
-    service = {
+    organisationsEinheitService = {
       ...mock(OrganisationsEinheitService),
       getSelectedResult: jest.fn().mockReturnValue(of(createOrganisationsEinheitResource())),
     };
-    TestBed.overrideComponent(OrganisationsEinheitContainerComponent, {
+    TestBed.overrideComponent(SearchOrganisationsEinheitContainerComponent, {
       set: {
         providers: [
           {
-            provide: OrganisationsEinheitService,
-            useValue: service,
+            provide: ZUSTAENDIGE_STELLE_SERVICE,
+            useValue: organisationsEinheitService,
           },
         ],
       },
     });
     await TestBed.configureTestingModule({
       declarations: [
-        OrganisationsEinheitContainerComponent,
-        MockComponent(SearchIconComponent),
-        MockComponent(OfficeIconComponent),
-        MockComponent(ButtonComponent),
+        SearchOrganisationsEinheitContainerComponent,
         MockComponent(OrganisationsEinheitComponent),
+        MockComponent(ZustaendigeStelleButtonComponent),
+        MockComponent(ZustaendigeStelleHeaderComponent),
+        MockComponent(PublicAdministrationIconComponent),
+        MockComponent(EditZustaendigeStelleButtonComponent),
       ],
       providers: [
-        {
-          provide: OzgcloudDialogService,
-          useValue: dialogService,
-        },
         {
           provide: OrganisationsEinheitService,
-          useValue: service,
+          useValue: organisationsEinheitService,
         },
       ],
     }).compileComponents();
 
-    fixture = TestBed.createComponent(OrganisationsEinheitContainerComponent);
+    fixture = TestBed.createComponent(SearchOrganisationsEinheitContainerComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });
@@ -92,8 +75,6 @@ describe('OrganisationsEinheitContainerComponent', () => {
     });
 
     it('should call getSelectedResult', () => {
-      component.getSelectedResult = jest.fn();
-
       component.ngOnInit();
 
       expect(component.getSelectedResult).toHaveBeenCalled();
@@ -102,27 +83,32 @@ describe('OrganisationsEinheitContainerComponent', () => {
     it('should set organisationsEinheitResource', (done) => {
       component.ngOnInit();
 
-      component.organisationsEinheitResource$.subscribe(
-        (organisationsEinheitResource: OrganisationsEinheitResource) => {
-          expect(organisationsEinheitResource).toBe(organisationsEinheitResource);
-          done();
-        },
-      );
+      component.organisationsEinheitResource$.subscribe((organisationsEinheitResource: OrganisationsEinheitResource) => {
+        expect(organisationsEinheitResource).toBe(organisationsEinheitResource);
+        done();
+      });
+    });
+  });
+
+  describe('ngOnDestory', () => {
+    it('should clear selected result', () => {
+      component.ngOnDestroy();
+
+      expect(organisationsEinheitService.clearSelectedResult).toHaveBeenCalled();
     });
   });
 
   describe('get selected result', () => {
-    const organisationsEinheitResource: OrganisationsEinheitResource =
-      createOrganisationsEinheitResource();
+    const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
 
     beforeEach(() => {
-      service.getSelectedResult.mockReturnValue(of(organisationsEinheitResource));
+      organisationsEinheitService.getSelectedResult.mockReturnValue(of(organisationsEinheitResource));
     });
 
     it('should call service', () => {
       component.getSelectedResult().subscribe();
 
-      expect(service.getSelectedResult).toHaveBeenCalled();
+      expect(organisationsEinheitService.getSelectedResult).toHaveBeenCalled();
     });
 
     it('should call handleResult', () => {
@@ -149,8 +135,7 @@ describe('OrganisationsEinheitContainerComponent', () => {
     });
 
     it('should patch fieldControl with resource uri', () => {
-      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue =
-        jest.fn());
+      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue = jest.fn());
 
       component.handleResult(organisationsEinheitResource);
 
@@ -158,8 +143,7 @@ describe('OrganisationsEinheitContainerComponent', () => {
     });
 
     it('should not patch fieldControl if organisationsEinheit resource is null', () => {
-      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue =
-        jest.fn());
+      const fieldControlPatchSpy: jest.SpyInstance = (component.fieldControl.patchValue = jest.fn());
 
       component.handleResult(null);
 
@@ -167,26 +151,6 @@ describe('OrganisationsEinheitContainerComponent', () => {
     });
   });
 
-  describe('search zustaendige stelle button', () => {
-    beforeEach(() => {
-      component.organisationsEinheitResource$ = of(undefined);
-    });
-
-    it('should be visible on missing organisationsEinheit', () => {
-      fixture.detectChanges();
-
-      existsAsHtmlElement(fixture, searchOrganisationsEinheitButton);
-    });
-    it('should call openSearchDialog', () => {
-      component.openSearchDialog = jest.fn();
-
-      fixture.detectChanges();
-      dispatchEventFromFixture(fixture, searchOrganisationsEinheitButton, 'clickEmitter');
-
-      expect(component.openSearchDialog).toHaveBeenCalled();
-    });
-  });
-
   describe('organisationsEinheit component', () => {
     beforeEach(() => {
       component.organisationsEinheitResource$ = of(organisationsEinheitResource);
@@ -208,21 +172,4 @@ describe('OrganisationsEinheitContainerComponent', () => {
       expect(comp.organisationsEinheitResource).toBe(organisationsEinheitResource);
     });
   });
-
-  describe('open search dialog', () => {
-    it('should call dialog service', () => {
-      const DIALOG_CONFIG: DialogConfig = {
-        backdropClass: ['backdrop-blur-1', 'bg-greybackdrop'],
-      };
-
-      component.openSearchDialog();
-
-      expect(dialogService.openInCallingComponentContext).toHaveBeenCalledWith(
-        SearchOrganisationsEinheitContainerComponent,
-        component.viewContainerRef,
-        null,
-        DIALOG_CONFIG,
-      );
-    });
-  });
 });
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4ce7deee0316075aba1c8888cc5832c2f3181f87
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.ts
@@ -0,0 +1,47 @@
+import { isNotNull } from '@alfa-client/tech-shared';
+import {
+  OrganisationsEinheitResource,
+  OrganisationsEinheitService,
+  ZUSTAENDIGE_STELLE_SERVICE,
+  ZustaendigeStelleService,
+} from '@alfa-client/zustaendige-stelle-shared';
+import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';
+import { AbstractControl } from '@angular/forms';
+import { ResourceUri, getUrl } from '@ngxp/rest';
+import { Observable, tap } from 'rxjs';
+
+@Component({
+  selector: 'alfa-search-organisations-einheit-container',
+  templateUrl: './search-organisations-einheit-container.component.html',
+  providers: [{ provide: ZUSTAENDIGE_STELLE_SERVICE, useClass: OrganisationsEinheitService }],
+})
+export class SearchOrganisationsEinheitContainerComponent implements OnInit, OnDestroy {
+  @Input() public fieldControl: AbstractControl<ResourceUri>;
+
+  public organisationsEinheitResource$: Observable<OrganisationsEinheitResource>;
+
+  constructor(
+    @Inject(ZUSTAENDIGE_STELLE_SERVICE)
+    private service: ZustaendigeStelleService<OrganisationsEinheitResource>,
+  ) {}
+
+  ngOnInit(): void {
+    this.organisationsEinheitResource$ = this.getSelectedResult();
+  }
+
+  ngOnDestroy(): void {
+    this.service.clearSelectedResult();
+  }
+
+  getSelectedResult(): Observable<OrganisationsEinheitResource> {
+    return this.service
+      .getSelectedResult()
+      .pipe(tap((organisationsEinheitResource: OrganisationsEinheitResource) => this.handleResult(organisationsEinheitResource)));
+  }
+
+  handleResult(organisationsEinheitResource: OrganisationsEinheitResource): void {
+    if (isNotNull(organisationsEinheitResource)) {
+      this.fieldControl.patchValue(getUrl(organisationsEinheitResource));
+    }
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..ba1e3274e4abdbe281712544b86d398583b7f239
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.html
@@ -0,0 +1,15 @@
+<div class="my-32 flex h-screen flex-col gap-2">
+  <div class="flex gap-48 py-6 lg:gap-96">
+    <h1 class="text-xl font-bold text-primary">{{ title }}</h1>
+    <ods-button variant="icon" size="fit" (clickEmitter)="closeDialog()" dataTestId="close-search-dialog">
+      <ods-close-icon class="fill-primary" icon />
+    </ods-button>
+  </div>
+  <alfa-search-zustaendige-stelle-form
+    data-test-id="search-organisations-einheit"
+    [searchResults]="searchResults$ | async"
+    (search)="search($event)"
+    (selectSearchResult)="selectSearchResult($event)"
+    (clearSearchResult)="clearSearchResult()"
+  ></alfa-search-zustaendige-stelle-form>
+</div>
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.spec.ts
similarity index 56%
rename from alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.spec.ts
index 85d28bd782a6fd623135baf9de9bb140175d4fa6..adb12daf7e4ec5b14e8c3e505413869531193abb 100644
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-container.component.spec.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.spec.ts
@@ -1,77 +1,61 @@
+import { ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
+import { EventData, Mock, dialogRefMock, getMockComponent, mock, triggerEvent } from '@alfa-client/test-utils';
 import {
-  OrganisationsEinheitListResource,
   OrganisationsEinheitResource,
   OrganisationsEinheitService,
-} from '@alfa-client/collaboration-shared';
-import {
-  StateResource,
-  ToEmbeddedResourcesPipe,
-  createStateResource,
-} from '@alfa-client/tech-shared';
-import {
-  EventData,
-  Mock,
-  dialogRefMock,
-  getMockComponent,
-  mock,
-  triggerEvent,
-} from '@alfa-client/test-utils';
-import { DialogRef } from '@angular/cdk/dialog';
+  ZUSTAENDIGE_STELLE_SERVICE,
+} from '@alfa-client/zustaendige-stelle-shared';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
-import { ButtonComponent, CloseIconComponent } from '@ods/system';
-import {
-  createOrganisationsEinheitListResource,
-  createOrganisationsEinheitResource,
-  createOrganisationsEinheitResources,
-} from 'libs/collaboration-shared/test/organisations-einheit';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { Resource } from '@ngxp/rest';
+import { ButtonComponent, CloseIconComponent, InstantSearchResult } from '@ods/system';
+import { createInstantSearchResult } from 'libs/design-system/src/test/search';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
-import { SearchOrganisationsEinheitContainerComponent } from './search-organisations-einheit-container.component';
-import { SearchOrganisationsEinheitFormComponent } from './search-organisations-einheit-form/search-organisations-einheit-form.component';
+import { getDataTestIdOf } from '../../../../tech-shared/test/data-test';
+import { createOrganisationsEinheitResource } from '../../../../zustaendige-stelle-shared/test/organisations-einheit';
+import { SearchZustaendigeStelleDialogComponent } from '././search-zustaendige-stelle-dialog.component';
+import { SearchZustaendigeStelleFormComponent } from './search-zustaendige-stelle-form/search-zustaendige-stelle-form.component';
 
-describe('SearchOrganisationsEinheitContainerComponent', () => {
-  let component: SearchOrganisationsEinheitContainerComponent;
-  let fixture: ComponentFixture<SearchOrganisationsEinheitContainerComponent>;
+describe('SearchZustaendigeStelleDialogComponent', () => {
+  let component: SearchZustaendigeStelleDialogComponent<Resource>;
+  let fixture: ComponentFixture<SearchZustaendigeStelleDialogComponent<Resource>>;
 
   const searchOrganisationsEinheitComp: string = getDataTestIdOf('search-organisations-einheit');
 
   const service: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService);
+  const title: string = 'dummyTitle';
 
-  const organisationsEinheitResource: OrganisationsEinheitResource =
-    createOrganisationsEinheitResource();
-  const organisationsEinheitResources: OrganisationsEinheitResource[] =
-    createOrganisationsEinheitResources();
-  const organisationsEinheitListResource: OrganisationsEinheitListResource =
-    createOrganisationsEinheitListResource(organisationsEinheitResources);
-  const organisationsEinheitStateListResource: StateResource<OrganisationsEinheitListResource> =
-    createStateResource(organisationsEinheitListResource);
+  const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       declarations: [
-        SearchOrganisationsEinheitContainerComponent,
+        SearchZustaendigeStelleDialogComponent,
         ToEmbeddedResourcesPipe,
-        MockComponent(SearchOrganisationsEinheitFormComponent),
+        MockComponent(SearchZustaendigeStelleFormComponent),
         MockComponent(ButtonComponent),
         MockComponent(CloseIconComponent),
       ],
       providers: [
         {
-          provide: OrganisationsEinheitService,
+          provide: ZUSTAENDIGE_STELLE_SERVICE,
           useValue: service,
         },
         {
           provide: DialogRef,
           useValue: dialogRefMock,
         },
+        {
+          provide: DIALOG_DATA,
+          useValue: title,
+        },
       ],
     }).compileComponents();
 
-    fixture = TestBed.createComponent(SearchOrganisationsEinheitContainerComponent);
+    fixture = TestBed.createComponent(SearchZustaendigeStelleDialogComponent);
     component = fixture.componentInstance;
-    component.organisationsEinheitStateListResource$ = of(organisationsEinheitStateListResource);
     fixture.detectChanges();
   });
 
@@ -88,39 +72,53 @@ describe('SearchOrganisationsEinheitContainerComponent', () => {
   });
 
   describe('onKeyDownHandler', () => {
-    it('should prevent default behavior for enter key', () => {
+    it('should prevent default behavior for enter key on non buttons', () => {
       const keyboardEvent: KeyboardEvent = {
         ...new KeyboardEvent('enter'),
         key: 'Enter',
         preventDefault: jest.fn(),
+        target: new EventTarget(),
       };
 
       component.onKeyDownHandler(keyboardEvent);
 
       expect(keyboardEvent.preventDefault).toHaveBeenCalled();
     });
+
+    it('should not prevent default behavior for enter key on buttons', () => {
+      const keyboardEvent: KeyboardEvent = {
+        ...new KeyboardEvent('enter'),
+        key: 'Enter',
+        preventDefault: jest.fn(),
+        target: { ...new EventTarget(), tagName: 'BUTTON' } as Element,
+      };
+
+      component.onKeyDownHandler(keyboardEvent);
+
+      expect(keyboardEvent.preventDefault).not.toHaveBeenCalled();
+    });
   });
 
   describe('search organisationsEinheit component', () => {
+    const result: InstantSearchResult<Resource> = createInstantSearchResult();
+
     beforeEach(() => {
-      component.organisationsEinheitStateListResource$ = of(organisationsEinheitStateListResource);
+      component.searchResults$ = of([result]);
       fixture.detectChanges();
     });
 
-    it('should be called with organisationsEinheiten', () => {
-      const comp: SearchOrganisationsEinheitFormComponent =
-        getMockComponent<SearchOrganisationsEinheitFormComponent>(
-          fixture,
-          SearchOrganisationsEinheitFormComponent,
-        );
+    it('should be called with searchResult', () => {
+      const comp: SearchZustaendigeStelleFormComponent<Resource> = getMockComponent<
+        SearchZustaendigeStelleFormComponent<Resource>
+      >(fixture, SearchZustaendigeStelleFormComponent);
 
-      expect(comp.organisationsEinheiten).toEqual(organisationsEinheitResources);
+      expect(comp.searchResults).toEqual([result]);
     });
 
     it('should call search on openSearchDialog output', () => {
       component.search = jest.fn();
       const searchBy: string = faker.word.sample();
-      const eventData: EventData<SearchOrganisationsEinheitContainerComponent> = {
+      const eventData: EventData<SearchZustaendigeStelleDialogComponent<Resource>> = {
         fixture,
         elementSelector: searchOrganisationsEinheitComp,
         name: 'search',
@@ -135,7 +133,7 @@ describe('SearchOrganisationsEinheitContainerComponent', () => {
     it('should call selectSearchResult on selectSearchResult output', () => {
       component.selectSearchResult = jest.fn();
 
-      const eventData: EventData<SearchOrganisationsEinheitContainerComponent> = {
+      const eventData: EventData<SearchZustaendigeStelleDialogComponent<Resource>> = {
         fixture,
         elementSelector: searchOrganisationsEinheitComp,
         name: 'selectSearchResult',
@@ -150,7 +148,7 @@ describe('SearchOrganisationsEinheitContainerComponent', () => {
     it('should call clearSearchResult', () => {
       component.clearSearchResult = jest.fn();
 
-      const eventData: EventData<SearchOrganisationsEinheitContainerComponent> = {
+      const eventData: EventData<SearchZustaendigeStelleDialogComponent<Resource>> = {
         fixture,
         elementSelector: searchOrganisationsEinheitComp,
         name: 'clearSearchResult',
@@ -216,4 +214,22 @@ describe('SearchOrganisationsEinheitContainerComponent', () => {
       expect(dialogRefMock.close).toHaveBeenCalled();
     });
   });
+
+  describe('isNotButtonElement', () => {
+    it('should return false', () => {
+      const element: Element = { tagName: 'BUTTON' } as Element;
+
+      const result: boolean = component.isNotButtonElement(element);
+
+      expect(result).toBe(false);
+    });
+
+    it('should return true', () => {
+      const element: Element = { tagName: 'INPUT' } as Element;
+
+      const result: boolean = component.isNotButtonElement(element);
+
+      expect(result).toBe(true);
+    });
+  });
 });
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..848ffc0d98a31c99b190f659cbda6b528936e301
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component.ts
@@ -0,0 +1,56 @@
+import { ZUSTAENDIGE_STELLE_SERVICE, ZustaendigeStelleService } from '@alfa-client/zustaendige-stelle-shared';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
+import { Component, HostListener, Inject, OnInit } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { InstantSearchResult } from '@ods/system';
+import { Observable } from 'rxjs';
+
+//TODO rename to SearchZustaendigeStelleDialogContainerComponent
+@Component({
+  selector: 'search-zustaendige-stelle-dialog',
+  templateUrl: './search-zustaendige-stelle-dialog.component.html',
+})
+export class SearchZustaendigeStelleDialogComponent<T extends Resource> implements OnInit {
+  public searchResults$: Observable<InstantSearchResult<T>[]>;
+
+  constructor(
+    private dialogRef: DialogRef,
+    @Inject(ZUSTAENDIGE_STELLE_SERVICE)
+    private service: ZustaendigeStelleService<T>,
+    @Inject(DIALOG_DATA) public title: string,
+  ) {}
+
+  ngOnInit(): void {
+    this.searchResults$ = this.service.getSearchResultList();
+  }
+
+  @HostListener('document:keydown', ['$event'])
+  onKeyDownHandler(e: KeyboardEvent) {
+    if (e.key === 'Enter' && this.isNotButtonElement(e.target as Element)) {
+      e.preventDefault();
+    }
+  }
+
+  public search(searchBy: string): void {
+    this.service.search(searchBy);
+  }
+
+  public selectSearchResult(zustaendigeStelle: T): void {
+    this.service.selectSearchResult(zustaendigeStelle);
+    this.service.clearSearchResult();
+    this.dialogRef.close();
+  }
+
+  public clearSearchResult(): void {
+    this.service.clearSearchResult();
+  }
+
+  public closeDialog(): void {
+    this.clearSearchResult();
+    this.dialogRef.close();
+  }
+
+  public isNotButtonElement(e: Element): boolean {
+    return e.tagName !== 'BUTTON';
+  }
+}
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.html
similarity index 89%
rename from alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.html
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.html
index 7252665d682c7686f3ae4b63e4cce1567edf4f9d..6c888f1981e40ff86e638086a34a92d0b6c8c1d1 100644
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit-form/search-organisations-einheit-form.component.html
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.html
@@ -7,6 +7,6 @@
     (searchResultSelected)="selectSearchResult.emit($event.data)"
     (searchQueryChanged)="search.emit($event.searchBy)"
     (searchQueryCleared)="clearSearchResult.emit()"
-    (searchResultClosed)="clearSearchResult.emit()"
+    (searchClosed)="clearSearchResult.emit()"
   ></ods-instant-search>
 </form>
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2593d6121f7c9efd004e92e063963e6263b2557e
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.spec.ts
@@ -0,0 +1,120 @@
+import { EventData, Mock, getMockComponent, mock, triggerEvent } from '@alfa-client/test-utils';
+import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { faker } from '@faker-js/faker';
+import { Resource } from '@ngxp/rest';
+import { InstantSearchComponent, InstantSearchResult } from '@ods/system';
+import { MockComponent } from 'ng-mocks';
+import { createInstantSearchResult } from '../../../../../design-system/src/test/search';
+import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test';
+import { createOrganisationsEinheitResource } from '../../../../../zustaendige-stelle-shared/test/organisations-einheit';
+import { SearchZustaendigeStelleFormservice } from '../search-zustaendige-stelle.formservice';
+import { SearchZustaendigeStelleFormComponent } from './search-zustaendige-stelle-form.component';
+
+describe('SearchZustaendigeStelleFormComponent', () => {
+  let component: SearchZustaendigeStelleFormComponent<Resource>;
+  let fixture: ComponentFixture<SearchZustaendigeStelleFormComponent<Resource>>;
+
+  const searchComp: string = getDataTestIdOf('search');
+
+  const formService: Mock<SearchZustaendigeStelleFormservice> = mock(SearchZustaendigeStelleFormservice);
+
+  const instantSearchResult: InstantSearchResult<Resource> = createInstantSearchResult<OrganisationsEinheitResource>();
+  const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource();
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ReactiveFormsModule],
+      declarations: [SearchZustaendigeStelleFormComponent, MockComponent(InstantSearchComponent)],
+      providers: [
+        {
+          provide: SearchZustaendigeStelleFormservice,
+          useValue: formService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(SearchZustaendigeStelleFormComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('instant search component', () => {
+    it('should be called with search results', () => {
+      component.searchResults = [instantSearchResult];
+
+      fixture.detectChanges();
+
+      expect(getInstantSearchComponent().searchResults).toEqual([instantSearchResult]);
+    });
+
+    function getInstantSearchComponent(): InstantSearchComponent {
+      return getMockComponent<InstantSearchComponent>(fixture, InstantSearchComponent);
+    }
+
+    it('should emit selected search result on searchResultSelected output', () => {
+      const selectSearchResultSpy: jest.SpyInstance = (component.selectSearchResult.emit = jest.fn());
+      const eventData: EventData<SearchZustaendigeStelleFormComponent<Resource>> = {
+        fixture,
+        elementSelector: searchComp,
+        name: 'searchResultSelected',
+        data: { data: organisationsEinheitResource },
+      };
+
+      triggerEvent(eventData);
+
+      expect(selectSearchResultSpy).toHaveBeenCalledWith(organisationsEinheitResource);
+    });
+
+    it('should emit search on searchQueryChanged output', () => {
+      const searchSpy: jest.SpyInstance = (component.search.emit = jest.fn());
+      const searchBy: string = faker.lorem.word();
+      const eventData: EventData<SearchZustaendigeStelleFormComponent<Resource>> = {
+        fixture,
+        elementSelector: searchComp,
+        name: 'searchQueryChanged',
+        data: { searchBy },
+      };
+
+      triggerEvent(eventData);
+
+      expect(searchSpy).toHaveBeenCalledWith(searchBy);
+    });
+
+    describe('should emit clear search result', () => {
+      let clearSearchResultSpy: jest.SpyInstance;
+      let eventData: EventData<SearchZustaendigeStelleFormComponent<Resource>>;
+
+      beforeEach(() => {
+        clearSearchResultSpy = component.clearSearchResult.emit = jest.fn();
+        eventData = {
+          fixture,
+          elementSelector: searchComp,
+          name: 'TBD',
+          data: { searchBy: faker.lorem.word() },
+        };
+      });
+
+      it('on searchClosed output', () => {
+        eventData = { ...eventData, name: 'searchClosed' };
+
+        triggerEvent(eventData);
+
+        expect(clearSearchResultSpy).toHaveBeenCalledWith();
+      });
+
+      it('on searchQueryCleared output', () => {
+        eventData = { ...eventData, name: 'searchClosed' };
+
+        triggerEvent(eventData);
+
+        expect(clearSearchResultSpy).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bc616cec372cb5d411c5e984d63fdcfc9cb3eca8
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component.ts
@@ -0,0 +1,19 @@
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { InstantSearchResult } from '@ods/system';
+import { SearchZustaendigeStelleFormservice } from '../search-zustaendige-stelle.formservice';
+
+@Component({
+  selector: 'alfa-search-zustaendige-stelle-form',
+  templateUrl: './search-zustaendige-stelle-form.component.html',
+  providers: [SearchZustaendigeStelleFormservice],
+})
+export class SearchZustaendigeStelleFormComponent<T extends Resource> {
+  @Input() public searchResults: InstantSearchResult<T>[];
+
+  @Output() public search: EventEmitter<string> = new EventEmitter();
+  @Output() public selectSearchResult: EventEmitter<T> = new EventEmitter();
+  @Output() public clearSearchResult: EventEmitter<string> = new EventEmitter();
+
+  constructor(public formService: SearchZustaendigeStelleFormservice) {}
+}
diff --git a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit.formservice.ts b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle.formservice.ts
similarity index 89%
rename from alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit.formservice.ts
rename to alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle.formservice.ts
index 2b63e2097a660615148dce5468d7b017976b64ef..95a21678407e72ce5b25ec54cb3113ddd0ef7344 100644
--- a/alfa-client/libs/collaboration/src/lib/search-organisations-einheit-container/search-organisations-einheit.formservice.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/search-zustaendige-stelle-dialog/search-zustaendige-stelle.formservice.ts
@@ -3,7 +3,7 @@ import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
 import { ResourceUri } from '@ngxp/rest';
 
 @Injectable()
-export class SearchOrganisationsEinheitFormService {
+export class SearchZustaendigeStelleFormservice {
   public form: FormGroup;
 
   public readonly SEARCH_FIELD: string = 'search';
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9c1bebdcea3451828f6a4270bb72620fe1478e3c
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.html
@@ -0,0 +1,11 @@
+<div class="flex items-center gap-3">
+  <ods-button
+    variant="outline"
+    text="Zuständige Stelle auswählen"
+    data-test-class="zustaendige-stelle-button"
+    [dataTestId]="dataTestId"
+    (clickEmitter)="openSearchDialog()"
+  >
+    <ods-search-icon icon />
+  </ods-button>
+</div>
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ede463cfcbfcc1baabe15f5564c7ebe9e12c7d11
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.spec.ts
@@ -0,0 +1,69 @@
+import { dispatchEventFromFixture, Mock, mock } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { faker } from '@faker-js/faker';
+import { Resource } from '@ngxp/rest';
+import { ButtonComponent, SearchIconComponent } from '@ods/system';
+import { getDataTestClassOf } from 'libs/tech-shared/test/data-test';
+import { MockComponent } from 'ng-mocks';
+import { SearchZustaendigeStelleDialogComponent } from '../search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component';
+import { ZustaendigeStelleButtonComponent } from './zustaendige-stelle-button.component';
+
+describe('ZustaendigeStelleButtonComponent', () => {
+  let component: ZustaendigeStelleButtonComponent<Resource>;
+  let fixture: ComponentFixture<ZustaendigeStelleButtonComponent<Resource>>;
+
+  const title: string = faker.lorem.words(3);
+  const dataTestId: string = faker.lorem.word();
+
+  const button: string = getDataTestClassOf('zustaendige-stelle-button');
+
+  let dialogService: Mock<OzgcloudDialogService>;
+
+  beforeEach(async () => {
+    dialogService = mock(OzgcloudDialogService);
+    await TestBed.configureTestingModule({
+      declarations: [ZustaendigeStelleButtonComponent],
+      imports: [MockComponent(SearchIconComponent), MockComponent(ButtonComponent)],
+      providers: [
+        {
+          provide: OzgcloudDialogService,
+          useValue: dialogService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ZustaendigeStelleButtonComponent);
+    component = fixture.componentInstance;
+    component.title = title;
+    component.dataTestId = dataTestId;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('search zustaendige stelle button', () => {
+    it('should call openSearchDialog', () => {
+      component.openSearchDialog = jest.fn();
+
+      fixture.detectChanges();
+      dispatchEventFromFixture(fixture, button, 'clickEmitter');
+
+      expect(component.openSearchDialog).toHaveBeenCalled();
+    });
+  });
+
+  describe('open search dialog', () => {
+    it('should call dialog service', () => {
+      component.openSearchDialog();
+
+      expect(dialogService.openFullScreenDialog).toHaveBeenCalledWith(
+        SearchZustaendigeStelleDialogComponent,
+        component.viewContainerRef,
+        title,
+      );
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7dcd968fe1c69d4a5ed7f7af3f256d93716cb075
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-button/zustaendige-stelle-button.component.ts
@@ -0,0 +1,26 @@
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { Component, Input, ViewContainerRef } from '@angular/core';
+import { Resource } from '@ngxp/rest';
+import { SearchZustaendigeStelleDialogComponent } from '../search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component';
+
+@Component({
+  selector: 'alfa-zustaendige-stelle-button',
+  templateUrl: './zustaendige-stelle-button.component.html',
+})
+export class ZustaendigeStelleButtonComponent<T extends Resource> {
+  @Input() public dataTestId: string;
+  @Input() title: string;
+
+  constructor(
+    private readonly dialogService: OzgcloudDialogService,
+    readonly viewContainerRef: ViewContainerRef,
+  ) {}
+
+  public openSearchDialog(): void {
+    this.dialogService.openFullScreenDialog<SearchZustaendigeStelleDialogComponent<T>>(
+      SearchZustaendigeStelleDialogComponent,
+      this.viewContainerRef,
+      this.title,
+    );
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.html b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..eda66df0206c64ce27affabd18339fa0933e2689
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.html
@@ -0,0 +1,13 @@
+<div class="flex">
+  <div class="flex flex-1 gap-3">
+    <ng-content select="[icon]" />
+    <div class="flex flex-1 flex-col text-base">
+      <p class="text-primary" data-test-id="zustaendige-stelle-header-title">{{ title }}</p>
+      <p class="text-text" [class.font-medium]="isSubTitleBold" data-test-id="zustaendige-stelle-header-sub-title">
+        {{ subTitle }}
+      </p>
+    </div>
+    <ng-content select="[info]" />
+  </div>
+  <ng-content />
+</div>
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a9f48ee516c4a0a1419de895de4d0ba201dbf495
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.spec.ts
@@ -0,0 +1,71 @@
+import { getElementFromFixture } from '@alfa-client/test-utils';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { ZustaendigeStelleHeaderComponent } from './zustaendige-stelle-header.component';
+
+describe('ZustaendigeStelleHeaderComponent', () => {
+  let component: ZustaendigeStelleHeaderComponent;
+  let fixture: ComponentFixture<ZustaendigeStelleHeaderComponent>;
+  const titleSelector = getDataTestIdOf('zustaendige-stelle-header-title');
+  const subTitleSelector = getDataTestIdOf('zustaendige-stelle-header-sub-title');
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ZustaendigeStelleHeaderComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ZustaendigeStelleHeaderComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('template', () => {
+    describe('title', () => {
+      it('should show title', () => {
+        component.title = 'I am test title';
+        fixture.detectChanges();
+
+        const titleElement: HTMLElement = getElementFromFixture(fixture, titleSelector);
+
+        expect(titleElement.innerHTML).toContain('I am test title');
+      });
+    });
+
+    describe('subTitle', () => {
+      it('should show sub title', () => {
+        component.subTitle = 'I am test sub title';
+        fixture.detectChanges();
+
+        const subTitleElement: HTMLElement = getElementFromFixture(fixture, subTitleSelector);
+
+        expect(subTitleElement.innerHTML).toContain('I am test sub title');
+      });
+    });
+
+    describe('isSubTitleBold', () => {
+      it('should add class if true', () => {
+        component.subTitle = 'I am test sub title';
+        component.isSubTitleBold = true;
+        fixture.detectChanges();
+
+        const subTitleElement: HTMLElement = getElementFromFixture(fixture, subTitleSelector);
+
+        expect(subTitleElement.classList).toContain('font-medium');
+      });
+
+      it('should not add class if false', () => {
+        component.subTitle = 'I am test sub title';
+        component.isSubTitleBold = false;
+        fixture.detectChanges();
+
+        const subTitleElement: HTMLElement = getElementFromFixture(fixture, subTitleSelector);
+
+        expect(subTitleElement.classList).not.toContain('font-medium');
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1315d4eb444c2ee5e27976a762ef934a9b8bedc0
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle-header/zustaendige-stelle-header.component.ts
@@ -0,0 +1,11 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector: 'alfa-zustaendige-stelle-header',
+  templateUrl: './zustaendige-stelle-header.component.html',
+})
+export class ZustaendigeStelleHeaderComponent {
+  @Input() title: string;
+  @Input() subTitle: string;
+  @Input() isSubTitleBold: boolean = false;
+}
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.spec.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4314534118ddd91873bfb530f3accd1493b11363
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.spec.ts
@@ -0,0 +1,14 @@
+import { TestBed } from '@angular/core/testing';
+import { ZustaendigeStelleModule } from './zustaendige-stelle.module';
+
+describe('ZustaendigeStelleModule', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [ZustaendigeStelleModule],
+    }).compileComponents();
+  });
+
+  it('should create', () => {
+    expect(ZustaendigeStelleModule).toBeDefined();
+  });
+});
diff --git a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.ts b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..359741d86014184f95392702aed7ba82ee168164
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.ts
@@ -0,0 +1,59 @@
+import { TechSharedModule } from '@alfa-client/tech-shared';
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import {
+  ButtonComponent,
+  CloseIconComponent,
+  ExternalUnitIconComponent,
+  InstantSearchComponent,
+  OfficeIconComponent,
+  SearchIconComponent,
+} from '@ods/system';
+import { ZustaendigeStelleSharedModule } from 'libs/zustaendige-stelle-shared/src/lib/zustaendige-stelle-shared.module';
+import { EditIconComponent } from '../../../design-system/src/lib/icons/edit-icon/edit-icon.component';
+import { PublicAdministrationIconComponent } from '../../../design-system/src/lib/icons/public-administration-icon/public-administration-icon.component';
+import { EditZustaendigeStelleButtonComponent } from './edit-zustaendige-stelle-button/edit-zustaendige-stelle-button.component';
+import { SearchExterneFachstelleContainerComponent } from './search-externe-fachstelle-container/search-externe-fachstelle-container.component';
+import { OrganisationsEinheitComponent } from './search-organisations-einheit-container/organisations-einheit/organisations-einheit.component';
+import { SearchOrganisationsEinheitContainerComponent } from './search-organisations-einheit-container/search-organisations-einheit-container.component';
+import { SearchZustaendigeStelleDialogComponent } from './search-zustaendige-stelle-dialog/search-zustaendige-stelle-dialog.component';
+import { SearchZustaendigeStelleFormComponent } from './search-zustaendige-stelle-dialog/search-zustaendige-stelle-form/search-zustaendige-stelle-form.component';
+import { ZustaendigeStelleButtonComponent } from './zustaendige-stelle-button/zustaendige-stelle-button.component';
+import { ZustaendigeStelleHeaderComponent } from './zustaendige-stelle-header/zustaendige-stelle-header.component';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    ButtonComponent,
+    CloseIconComponent,
+    TechSharedModule,
+    InstantSearchComponent,
+    FormsModule,
+    ReactiveFormsModule,
+    ZustaendigeStelleSharedModule,
+    OfficeIconComponent,
+    SearchIconComponent,
+    ExternalUnitIconComponent,
+    EditIconComponent,
+    PublicAdministrationIconComponent,
+  ],
+  declarations: [
+    SearchOrganisationsEinheitContainerComponent,
+    OrganisationsEinheitComponent,
+    SearchZustaendigeStelleFormComponent,
+    SearchZustaendigeStelleDialogComponent,
+    ZustaendigeStelleButtonComponent,
+    SearchExterneFachstelleContainerComponent,
+    EditZustaendigeStelleButtonComponent,
+    ZustaendigeStelleHeaderComponent,
+  ],
+  exports: [
+    OrganisationsEinheitComponent,
+    SearchZustaendigeStelleFormComponent,
+    SearchZustaendigeStelleDialogComponent,
+    SearchOrganisationsEinheitContainerComponent,
+    SearchExterneFachstelleContainerComponent,
+  ],
+})
+export class ZustaendigeStelleModule {}
diff --git a/alfa-client/libs/zustaendige-stelle/src/test-setup.ts b/alfa-client/libs/zustaendige-stelle/src/test-setup.ts
new file mode 100644
index 0000000000000000000000000000000000000000..03a84127dca1b63fa485fc51d162cec76921b596
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/src/test-setup.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+import '@testing-library/jest-dom';
+import 'jest-preset-angular/setup-jest';
+
+import { getTestBed } from '@angular/core/testing';
+import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
+
+getTestBed().resetTestEnvironment();
+getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), {
+  teardown: { destroyAfterEach: false },
+  errorOnUnknownProperties: true,
+  errorOnUnknownElements: true,
+});
diff --git a/alfa-client/libs/zustaendige-stelle/tsconfig.json b/alfa-client/libs/zustaendige-stelle/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..7cc6baf2f58ed5ccfba098131996f579979e9f18
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/tsconfig.json
@@ -0,0 +1,16 @@
+{
+  "extends": "../../tsconfig.base.json",
+  "files": [],
+  "include": [],
+  "references": [
+    {
+      "path": "./tsconfig.lib.json"
+    },
+    {
+      "path": "./tsconfig.spec.json"
+    }
+  ],
+  "compilerOptions": {
+    "target": "es2022"
+  }
+}
diff --git a/alfa-client/libs/zustaendige-stelle/tsconfig.lib.json b/alfa-client/libs/zustaendige-stelle/tsconfig.lib.json
new file mode 100644
index 0000000000000000000000000000000000000000..9475b010386d7226f2b81f0f8501a110c3340cb2
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/tsconfig.lib.json
@@ -0,0 +1,19 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../dist/out-tsc",
+    "target": "es2015",
+    "declaration": true,
+    "declarationMap": true,
+    "inlineSources": true,
+    "types": [],
+    "lib": ["dom", "es2018"]
+  },
+  "angularCompilerOptions": {
+    "skipTemplateCodegen": true,
+    "strictMetadataEmit": true,
+    "enableResourceInlining": true
+  },
+  "exclude": ["src/test-setup.ts", "**/*.spec.ts", "jest.config.ts"],
+  "include": ["**/*.ts"]
+}
\ No newline at end of file
diff --git a/alfa-client/libs/zustaendige-stelle/tsconfig.spec.json b/alfa-client/libs/zustaendige-stelle/tsconfig.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..3a690070a7f5e48080dd36522d6a0db384d940aa
--- /dev/null
+++ b/alfa-client/libs/zustaendige-stelle/tsconfig.spec.json
@@ -0,0 +1,12 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../dist/out-tsc",
+    "module": "commonjs",
+    "types": ["jest", "node"],
+    "target": "ES2022",
+    "useDefineForClassFields": false
+  },
+  "files": ["src/test-setup.ts"],
+  "include": ["**/*.spec.ts", "**/*.d.ts", "jest.config.ts"]
+}
diff --git a/alfa-client/nx.json b/alfa-client/nx.json
index ef541a7eb5a1b147ff131218b9f498e2d295f344..d5846d9ce54ec894bf7601a95e7f626e1bfe360b 100644
--- a/alfa-client/nx.json
+++ b/alfa-client/nx.json
@@ -49,12 +49,7 @@
     },
     "build-storybook": {
       "cache": true,
-      "inputs": [
-        "default",
-        "^production",
-        "{projectRoot}/.storybook/**/*",
-        "{projectRoot}/tsconfig.storybook.json"
-      ]
+      "inputs": ["default", "^production", "{projectRoot}/.storybook/**/*", "{projectRoot}/tsconfig.storybook.json"]
     },
     "@nx/jest:jest": {
       "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"],
diff --git a/alfa-client/package.json b/alfa-client/package.json
index c967cc693a329b6ade607f33db7b8957093867f8..258c1df9adeffa23dfca7a666f981eb6b2e58a0a 100644
--- a/alfa-client/package.json
+++ b/alfa-client/package.json
@@ -122,6 +122,7 @@
     "@storybook/core-server": "8.3.5",
     "@swc-node/register": "1.9.2",
     "@swc/core": "1.5.29",
+    "@swc/helpers": "~0.5.2",
     "@testing-library/jest-dom": "6.4.5",
     "@types/file-saver": "2.0.7",
     "@types/jest": "29.5.13",
@@ -167,4 +168,4 @@
     "ts-node": "10.9.1",
     "typescript": "5.5.4"
   }
-}
+}
\ No newline at end of file
diff --git a/alfa-client/pom.xml b/alfa-client/pom.xml
index 756ceff4655f37af4e196a30dfc5d61e2b0e1dbd..1db71743e5cc3a907ed88af1a2119597108c6003 100644
--- a/alfa-client/pom.xml
+++ b/alfa-client/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>de.ozgcloud.alfa</groupId>
 		<artifactId>alfa</artifactId>
-		<version>2.15.0-SNAPSHOT</version>
+		<version>2.16.0-SNAPSHOT</version>
 	</parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/alfa-client/tsconfig.base.json b/alfa-client/tsconfig.base.json
index 2229d079d789542ca856f907139767c60bb80c9c..074d37046bc7c1d420bba5c631c72ec945d9b276 100644
--- a/alfa-client/tsconfig.base.json
+++ b/alfa-client/tsconfig.base.json
@@ -57,6 +57,8 @@
       "@alfa-client/vorgang-shared-ui": ["libs/vorgang-shared-ui/src/index.ts"],
       "@alfa-client/wiedervorlage": ["libs/wiedervorlage/src/index.ts"],
       "@alfa-client/wiedervorlage-shared": ["libs/wiedervorlage-shared/src/index.ts"],
+      "@alfa-client/zustaendige-stelle": ["libs/zustaendige-stelle/src/index.ts"],
+      "@alfa-client/zustaendige-stelle-shared": ["libs/zustaendige-stelle-shared/src/index.ts"],
       "@ods/component": ["libs/design-component/src/index.ts"],
       "@ods/system": ["libs/design-system/src/index.ts"],
       "authentication": ["libs/authentication/src/index.ts"]
diff --git a/alfa-server/pom.xml b/alfa-server/pom.xml
index 632ca43155b36c3b27a62281658cccbe073b43d9..5e51365a7d41f0fcd9ef379a087e14e8dfc61a90 100644
--- a/alfa-server/pom.xml
+++ b/alfa-server/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>de.ozgcloud.alfa</groupId>
 		<artifactId>alfa</artifactId>
-		<version>2.15.0-SNAPSHOT</version>
+		<version>2.16.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>alfa-server</artifactId>
diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml
index 80aeb0d1704a845cb773697d5d4ccb85d949bc71..1065a01112aada11a850d06625ae570b63e78207 100644
--- a/alfa-service/pom.xml
+++ b/alfa-service/pom.xml
@@ -31,7 +31,7 @@
 	<parent>
 		<groupId>de.ozgcloud.alfa</groupId>
 		<artifactId>alfa</artifactId>
-		<version>2.15.0-SNAPSHOT</version>
+		<version>2.16.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>alfa-service</artifactId>
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangController.java
new file mode 100644
index 0000000000000000000000000000000000000000..10b1131c4cf583be35f5e2dd6f3f104763bc84ec
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangController.java
@@ -0,0 +1,56 @@
+package de.ozgcloud.alfa.attachment;
+
+import java.io.OutputStream;
+
+import org.springframework.hateoas.CollectionModel;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
+
+import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
+import de.ozgcloud.alfa.common.file.OzgFile;
+import de.ozgcloud.alfa.common.file.OzgFileService;
+import de.ozgcloud.alfa.common.zipdownload.ZipDownloadService;
+import de.ozgcloud.alfa.vorgang.VorgangController;
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping(AttachmentByVorgangController.PATH)
+@RequiredArgsConstructor
+public class AttachmentByVorgangController {
+	static final String PATH = "/api/vorgang/{vorgangId}/attachments"; // NOSONAR
+	static final String APPLICATION_ZIP_VALUE = "application/zip";
+
+	private final OzgFileService fileService;
+	private final ZipDownloadService zipDownloadService;
+	private final VorgangController vorgangController;
+	private final BinaryFileModelAssembler modelAssembler;
+
+	@GetMapping
+	public CollectionModel<EntityModel<OzgFile>> getAllByVorgang(@PathVariable String vorgangId) {
+		return modelAssembler.toCollectionModel(fileService.getAttachments(vorgangId));
+	}
+
+	@GetMapping(produces = APPLICATION_ZIP_VALUE)
+	public ResponseEntity<StreamingResponseBody> download(@PathVariable String vorgangId) {
+		return ResponseEntity.ok()
+				.header(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s", buildZipName(vorgangId)))
+				.contentType(MediaType.valueOf(APPLICATION_ZIP_VALUE))
+				.body(out -> createZipFile(out, vorgangId));
+	}
+
+	String buildZipName(String vorgangId) {
+		return vorgangController.getVorgang(vorgangId).getNummer() + "_Anhaenge.zip";
+	}
+
+	void createZipFile(OutputStream out, String vorgangId) {
+		var ozgFiles = fileService.getAttachments(vorgangId);
+		zipDownloadService.write(ozgFiles.toList(), out);
+	}
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentController.java
deleted file mode 100644
index 1211543468abb21bc9b39b98408cd8075adc1710..0000000000000000000000000000000000000000
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/attachment/AttachmentController.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-package de.ozgcloud.alfa.attachment;
-
-import java.io.OutputStream;
-
-import org.springframework.hateoas.CollectionModel;
-import org.springframework.hateoas.EntityModel;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
-
-import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
-import de.ozgcloud.alfa.common.file.OzgFile;
-import de.ozgcloud.alfa.common.file.OzgFileService;
-import de.ozgcloud.alfa.common.zipdownload.ZipDownloadService;
-import de.ozgcloud.alfa.vorgang.VorgangController;
-import lombok.RequiredArgsConstructor;
-
-@RestController
-@RequestMapping(AttachmentController.PATH)
-@RequiredArgsConstructor
-public class AttachmentController {
-
-	static final String PATH = "/api/attachments"; // NOSONAR
-
-	static final String PARAM_EINGANG_ID = "eingangId";
-
-	private final OzgFileService fileService;
-	private final BinaryFileModelAssembler modelAssembler;
-
-	@GetMapping(params = PARAM_EINGANG_ID)
-	public CollectionModel<EntityModel<OzgFile>> getAllByEingang(@RequestParam String eingangId) {
-		return modelAssembler.toCollectionModel(fileService.getAttachmentsByEingang(eingangId));
-	}
-
-	@RestController
-	@RequestMapping(AttachmentsByVorgangController.PATH)
-	@RequiredArgsConstructor
-	public static class AttachmentsByVorgangController {
-		static final String PATH = "/api/vorgang/{vorgangId}/attachments"; // NOSONAR
-
-		private final OzgFileService fileService;
-		private final ZipDownloadService zipDownloadService;
-		private final VorgangController vorgangController;
-
-		@GetMapping(params = PARAM_EINGANG_ID, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
-		public ResponseEntity<StreamingResponseBody> download(@PathVariable String vorgangId, @RequestParam String eingangId) {
-			return ResponseEntity.ok()
-					.header(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s", buildZipName(vorgangId)))
-					.contentType(MediaType.APPLICATION_OCTET_STREAM)
-					.body(out -> createZipFile(out, eingangId));
-		}
-
-		String buildZipName(String vorgangId) {
-			return vorgangController.getVorgang(vorgangId).getNummer() + "_Anhaenge.zip";
-		}
-
-		void createZipFile(OutputStream out, String eingangId) {
-			var ozgFiles = fileService.getAttachmentsByEingang(eingangId);
-			zipDownloadService.write(ozgFiles.toList(), out);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Collaboration.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Collaboration.java
index a6e8f794e96951c0eb215b97dc73b49205ce0234..b062636d2f66051bde94792e7904d7d40a67acba 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Collaboration.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Collaboration.java
@@ -17,7 +17,8 @@ public class Collaboration implements CommandBody {
 	private String collaborationVorgangId;
 
 	private String titel;
-	private String anfrage;
+	private String beschreibung;
+	private int collaborationLevel;
 
 	@LinkedResource(controllerClass = OrganisationsEinheitController.class)
 	private String zustaendigeStelle;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileRemoteService.java
index 6b1577082e0c2bdc7d53344547265a77ad5e452e..d8c4a4e1d04bd53c9a2b0125a33e5c04da59e3e1 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileRemoteService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileRemoteService.java
@@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.alfa.common.GrpcUtil;
-import de.ozgcloud.alfa.common.callcontext.ContextService;
 import de.ozgcloud.vorgang.grpc.file.FileServiceGrpc.FileServiceBlockingStub;
 import de.ozgcloud.vorgang.grpc.file.GrpcGetAttachmentsRequest;
 import de.ozgcloud.vorgang.grpc.file.GrpcGetRepresentationsRequest;
@@ -41,33 +40,29 @@ public class OzgFileRemoteService {
 	@GrpcClient(GrpcUtil.VORGANG_MANAGER_GRPC_CLIENT)
 	private FileServiceBlockingStub fileServiceStub;
 	@Autowired
-	private ContextService contextService;
-	@Autowired
 	private OzgFileMapper fileMapper;
 
-	public Stream<OzgFile> getAttachmentsByEingang(String eingangId) {
-		var response = fileServiceStub.getAttachments(buildGrpcGetAttachmentsRequest(eingangId));
+	public Stream<OzgFile> getAttachments(String vorgangId) {
+		var response = fileServiceStub.getAttachments(buildGrpcGetAttachmentsRequest(vorgangId));
 
 		return response.getFileList().stream().map(fileMapper::toFile);
 	}
 
-	private GrpcGetAttachmentsRequest buildGrpcGetAttachmentsRequest(String eingangId) {
+	private GrpcGetAttachmentsRequest buildGrpcGetAttachmentsRequest(String vorgangId) {
 		return GrpcGetAttachmentsRequest.newBuilder()
-				.setContext(contextService.createCallContext())
-				.setEingangId(eingangId)
+				.setVorgangId(vorgangId)
 				.build();
 	}
 
-	public Stream<OzgFile> getRepresentationsByEingang(String eingangId) {
-		var response = fileServiceStub.getRepresentations(buildGrpcGetRepresentationsRequest(eingangId));
+	public Stream<OzgFile> getRepresentations(String vorgangId) {
+		var response = fileServiceStub.getRepresentations(buildGrpcGetRepresentationsRequest(vorgangId));
 
 		return response.getFileList().stream().map(fileMapper::toFile);
 	}
 
-	private GrpcGetRepresentationsRequest buildGrpcGetRepresentationsRequest(String eingangId) {
+	private GrpcGetRepresentationsRequest buildGrpcGetRepresentationsRequest(String vorgangId) {
 		return GrpcGetRepresentationsRequest.newBuilder()
-				.setContext(contextService.createCallContext())
-				.setEingangId(eingangId)
+				.setVorgangId(vorgangId)
 				.build();
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileService.java
index 63e9bdb12be7eb045d6eb0d3876fd1694ac4ee08..9041fa12dcfd1d8e7cecc99af58a94fa4cbeb6dc 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/file/OzgFileService.java
@@ -34,11 +34,11 @@ public class OzgFileService {
 	@Autowired
 	private OzgFileRemoteService remoteService;
 
-	public Stream<OzgFile> getAttachmentsByEingang(String eingangId) {
-		return remoteService.getAttachmentsByEingang(eingangId);
+	public Stream<OzgFile> getAttachments(String vorgangId) {
+		return remoteService.getAttachments(vorgangId);
 	}
 
-	public Stream<OzgFile> getRepresentationsByEingang(String eingangId) {
-		return remoteService.getRepresentationsByEingang(eingangId);
+	public Stream<OzgFile> getRepresentations(String vorgangId) {
+		return remoteService.getRepresentations(vorgangId);
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettings.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettings.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5d1f19f53554a619d68368c49e5445c978d8c73
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettings.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024.
+ * 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.
+ */
+
+package de.ozgcloud.alfa.postfach;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder
+public class OrganisationsEinheitSettings {
+	private String signatur;
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachProperties.java
index e6d7b0dea5e3fd6e4951c8df5447ab43a45d2a97..5a7e9f401ebea5b79c3db5c5e3ef8e069c247cfb 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachProperties.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachProperties.java
@@ -1,5 +1,27 @@
+/*
+ * Copyright (c) 2024.
+ * 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.
+ */
+
 package de.ozgcloud.alfa.postfach;
 
+import java.util.Map;
+
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.annotation.Configuration;
@@ -21,4 +43,9 @@ public class PostfachProperties {
 	 */
 	private String signatur = "";
 
+	/**
+	 * Settings that are linked to an Organisationseinheit. Configured by administration config server.
+	 */
+	private Map<String, Map<String, Object>> organisationsEinheitSettings = Map.of();
+
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachSettingsService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachSettingsService.java
index e42fc707246eba12df26de9cb20c31a6f6598262..0d3ff32f19a6e7e7a5383f1e77cb47c680ff0674 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachSettingsService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachSettingsService.java
@@ -1,5 +1,6 @@
 package de.ozgcloud.alfa.postfach;
 
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -15,6 +16,8 @@ import lombok.RequiredArgsConstructor;
 @Service
 class PostfachSettingsService {
 
+	static final String FIELD_SIGNATUR = "signatur";
+
 	private PostfachConfigGroup postfachConfigGroup;
 
 	private final PostfachMailRemoteService remoteService;
@@ -35,14 +38,15 @@ class PostfachSettingsService {
 						.reply(isReplyToMessageAllowed(vorgang))
 						.build())
 				.settings(Settings.builder()
-						.signatur(getSignatur())
+						.signatur(getSignatur(vorgang.getOrganisationseinheitenID()))
 						.build())
 				.build();
 	}
 
-	String getSignatur() {
+	String getSignatur(String organisationseinheitenID) {
 		refreshPostfachProperties();
-		return postfachProperties.getSignatur();
+		var settings = getOrganisationsEinheitSettings(organisationseinheitenID);
+		return settings.map(OrganisationsEinheitSettings::getSignatur).orElseGet(postfachProperties::getSignatur);
 	}
 
 	void refreshPostfachProperties() {
@@ -71,4 +75,13 @@ class PostfachSettingsService {
 				.findFirst()
 				.orElse(false);
 	}
+
+	Optional<OrganisationsEinheitSettings> getOrganisationsEinheitSettings(final String organisationId) {
+		return Optional.ofNullable(postfachProperties.getOrganisationsEinheitSettings().get(organisationId)).map(this::mapOrganisationsEinheitSettings);
+	}
+
+	OrganisationsEinheitSettings mapOrganisationsEinheitSettings(Map<String, Object> organisationsEinheitSettings) {
+		var signatur = Optional.ofNullable(organisationsEinheitSettings.get(FIELD_SIGNATUR)).map(Object::toString).orElse(null);
+		return OrganisationsEinheitSettings.builder().signatur(signatur).build();
+	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationByVorgangController.java
similarity index 79%
rename from alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationController.java
rename to alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationByVorgangController.java
index 28913930a067740c12c8bf214423b59426f22c54..d7731c004ba71684e7d6a752ec78433b367f8aa6 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/representation/RepresentationByVorgangController.java
@@ -26,8 +26,8 @@ package de.ozgcloud.alfa.representation;
 import org.springframework.hateoas.CollectionModel;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
@@ -36,20 +36,17 @@ import de.ozgcloud.alfa.common.file.OzgFileService;
 import lombok.RequiredArgsConstructor;
 
 @RestController
-@RequestMapping(RepresentationController.PATH)
+@RequestMapping(RepresentationByVorgangController.PATH)
 @RequiredArgsConstructor
-public class RepresentationController {
-
-	static final String PATH = "/api/representations"; // NOSONAR
-
-	static final String PARAM_EINGANG_ID = "eingangId";
+public class RepresentationByVorgangController {
+	static final String PATH = "/api/vorgang/{vorgangId}/representations"; // NOSONAR
 
 	private final OzgFileService fileService;
 	private final BinaryFileModelAssembler modelAssembler;
 
-	@GetMapping(params = PARAM_EINGANG_ID)
-	public CollectionModel<EntityModel<OzgFile>> getAllByEingang(@RequestParam String eingangId) {
-		return modelAssembler.toCollectionModel(fileService.getRepresentationsByEingang(eingangId));
+	@GetMapping
+	public CollectionModel<EntityModel<OzgFile>> getAll(@PathVariable String vorgangId) {
+		return modelAssembler.toCollectionModel(fileService.getRepresentations(vorgangId));
 	}
 
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java
index 6b111ac3c55ed436df4b141e6115ba419d599905..68ab090f6a599fa547808abbf62e6ffc43075cf3 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java
@@ -36,8 +36,7 @@ import org.springframework.hateoas.LinkRelation;
 import org.springframework.hateoas.server.RepresentationModelProcessor;
 import org.springframework.stereotype.Component;
 
-import de.ozgcloud.alfa.attachment.AttachmentController;
-import de.ozgcloud.alfa.attachment.AttachmentController.AttachmentsByVorgangController;
+import de.ozgcloud.alfa.attachment.AttachmentByVorgangController;
 import de.ozgcloud.alfa.common.ModelBuilder;
 import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
@@ -46,7 +45,7 @@ import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.historie.HistorieController;
 import de.ozgcloud.alfa.kommentar.KommentarController.KommentarByVorgangController;
 import de.ozgcloud.alfa.postfach.PostfachMailController;
-import de.ozgcloud.alfa.representation.RepresentationController;
+import de.ozgcloud.alfa.representation.RepresentationByVorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty;
 import de.ozgcloud.alfa.vorgang.forwarding.ForwardingController;
 import lombok.RequiredArgsConstructor;
@@ -91,14 +90,13 @@ class VorgangWithEingangProcessor implements RepresentationModelProcessor<Entity
 		return ModelBuilder.fromModel(model)
 				.addLink(linkTo(KommentarByVorgangController.class).slash(vorgang.getId()).slash("kommentars").withRel(REL_KOMMENTARE))
 				.ifMatch(HAS_ATTACHMENTS)
-				.addLinks(linkTo(methodOn(AttachmentController.class).getAllByEingang(vorgang.getEingang().getId()))
+				.addLinks(linkTo(methodOn(AttachmentByVorgangController.class).getAllByVorgang(vorgang.getId()))
 						.withRel(REL_ATTACHMENTS),
-						linkTo(methodOn(AttachmentsByVorgangController.class).download(vorgang.getId(), vorgang.getEingang().getId()))
+						linkTo(methodOn(AttachmentByVorgangController.class).download(vorgang.getId()))
 								.withRel(REL_DOWNLOAD_ATTACHMENTS))
 				.ifMatch(HAS_REPRESENTATIONS)
-				.addLink(vorgangWithEingang -> linkTo(
-						methodOn(RepresentationController.class).getAllByEingang(vorgangWithEingang.getEingang().getId()))
-								.withRel(REL_REPRESENTATIONS))
+				.addLink(linkTo(methodOn(RepresentationByVorgangController.class).getAll(vorgang.getId()))
+						.withRel(REL_REPRESENTATIONS))
 				.ifMatch(this::isPostfachConfigured)
 				.addLink(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withRel(REL_POSTFACH_MAILS))
 				.ifMatch(this::isEinheitlicherAnsprechpartner)
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentsByVorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangControllerTest.java
similarity index 72%
rename from alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentsByVorgangControllerTest.java
rename to alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangControllerTest.java
index 54638cb8a8390236ab8fc1c155d8ff3e33759779..0f3a90126e5da1db42e63875315efdb160947cb6 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentsByVorgangControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentByVorgangControllerTest.java
@@ -15,6 +15,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -26,23 +27,22 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.ozgcloud.alfa.attachment.AttachmentController.AttachmentsByVorgangController;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
+import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileService;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
 import de.ozgcloud.alfa.common.zipdownload.ZipDownloadService;
-import de.ozgcloud.alfa.vorgang.EingangTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 import lombok.SneakyThrows;
 
-class AttachmentsByVorgangControllerTest {
+class AttachmentByVorgangControllerTest {
 
 	@Spy
 	@InjectMocks
-	private AttachmentsByVorgangController controller;
+	private AttachmentByVorgangController controller;
 	@Mock
 	private BinaryFileModelAssembler modelAssembler;
 	@Mock
@@ -59,6 +59,38 @@ class AttachmentsByVorgangControllerTest {
 		mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
 	}
 
+	@Nested
+	class TestGetAttachmentsByVorgang {
+
+		@BeforeEach
+		void mockFileService() {
+			when(fileService.getAttachments(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(OzgFileTestFactory.create()));
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldResponseWithStatusOk() {
+			var result = callEndpoint();
+
+			result.andExpect(status().isOk());
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldCallModelAssembler() {
+			callEndpoint();
+
+			verify(modelAssembler).toCollectionModel(ArgumentMatchers.<Stream<OzgFile>>any());
+		}
+
+		@SneakyThrows
+		private ResultActions callEndpoint() {
+			return mockMvc.perform(
+					get(AttachmentByVorgangController.PATH.replace("{vorgangId}", VorgangHeaderTestFactory.ID))
+							.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE));
+		}
+	}
+
 	@DisplayName("Download")
 	@Nested
 	class TestDownload {
@@ -98,7 +130,7 @@ class AttachmentsByVorgangControllerTest {
 		void shouldHaveContentType() {
 			var response = doRequest();
 
-			response.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE));
+			response.andExpect(header().string(HttpHeaders.CONTENT_TYPE, AttachmentByVorgangController.APPLICATION_ZIP_VALUE));
 		}
 
 		@SneakyThrows
@@ -106,16 +138,15 @@ class AttachmentsByVorgangControllerTest {
 		void shouldWriteZipFile() {
 			doRequest();
 
-			verify(controller).createZipFile(any(), eq(EingangTestFactory.ID));
+			verify(controller).createZipFile(any(), eq(VorgangHeaderTestFactory.ID));
 		}
 
 		@SneakyThrows
 		private ResultActions doRequest() {
 			return mockMvc.perform(asyncDispatch(
-					mockMvc.perform(get(AttachmentsByVorgangController.PATH.replace("{vorgangId}", VorgangHeaderTestFactory.ID) + "?eingangId="
-							+ EingangTestFactory.ID)
-									.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_OCTET_STREAM_VALUE))
-							.andReturn()))
+							mockMvc.perform(get(AttachmentByVorgangController.PATH.replace("{vorgangId}", VorgangHeaderTestFactory.ID))
+											.header(HttpHeaders.ACCEPT, AttachmentByVorgangController.APPLICATION_ZIP_VALUE))
+									.andReturn()))
 					.andExpect(status().isOk());
 		}
 	}
@@ -159,13 +190,13 @@ class AttachmentsByVorgangControllerTest {
 		void shouldGetAttachments() {
 			callController();
 
-			verify(fileService).getAttachmentsByEingang(EingangTestFactory.ID);
+			verify(fileService).getAttachments(VorgangHeaderTestFactory.ID);
 		}
 
 		@Test
 		void shouldCallZipDownloadService() {
 			var ozgFile = OzgFileTestFactory.create();
-			when(fileService.getAttachmentsByEingang(EingangTestFactory.ID)).thenReturn(Stream.of(ozgFile));
+			when(fileService.getAttachments(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(ozgFile));
 
 			callController();
 
@@ -173,7 +204,7 @@ class AttachmentsByVorgangControllerTest {
 		}
 
 		private void callController() {
-			controller.createZipFile(outputStream, EingangTestFactory.ID);
+			controller.createZipFile(outputStream, VorgangHeaderTestFactory.ID);
 		}
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationControllerTest.java
index 87122cbb75c58ec12784d345654fd573f534ed70..71f1d8153365c3971e4333b3a7bc48789ba34447 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationControllerTest.java
@@ -115,12 +115,12 @@ class CollaborationControllerTest {
 
 				@SneakyThrows
 				@Test
-				void shouldHaveAnfrage() {
+				void shouldHaveBeschreibung() {
 					var response = performRequest();
 
 					System.out.println(response.andReturn().getResponse().getContentAsString());
 
-					response.andExpect(jsonPath("$.content[0].anfrage").value(CollaborationTestFactory.ANFRAGE));
+					response.andExpect(jsonPath("$.content[0].beschreibung").value(CollaborationTestFactory.BESCHREIBUNG));
 				}
 
 				@SneakyThrows
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationTestFactory.java
index 133acf57bb11cd6d048f2c578405f4ceadd4ae4b..9959f1a2b18e38db081c5bb62847213b3353a81f 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationTestFactory.java
@@ -11,7 +11,7 @@ public class CollaborationTestFactory {
 	public static final String VORGANG_ID = UUID.randomUUID().toString();
 	public static final String COLLABORATION_VORGANG_ID = UUID.randomUUID().toString();
 	public static final String TITEL = LoremIpsum.getInstance().getWords(7);
-	public static final String ANFRAGE = LoremIpsum.getInstance().getParagraphs(2, 5);
+	public static final String BESCHREIBUNG = LoremIpsum.getInstance().getParagraphs(2, 5);
 	public static final String ZUSTAENDIGE_STELLE = OrganisationsEinheitTestFactory.ID;
 
 	public static Collaboration create() {
@@ -24,7 +24,7 @@ public class CollaborationTestFactory {
 				.vorgangId(VORGANG_ID)
 				.collaborationVorgangId(COLLABORATION_VORGANG_ID)
 				.titel(TITEL)
-				.anfrage(ANFRAGE)
+				.beschreibung(BESCHREIBUNG)
 				.zustaendigeStelle(ZUSTAENDIGE_STELLE);
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileRemoteServiceTest.java
index 72bbe175b6bf69fe5d31d0ada39c9c0be50eada9..5f6571512cd3660298c0d89cef73903d48addbf8 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileRemoteServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileRemoteServiceTest.java
@@ -26,7 +26,6 @@ package de.ozgcloud.alfa.common.file;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -36,11 +35,9 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
 import de.ozgcloud.alfa.attachment.GrpcGetAttachmentsResponseTestFactory;
-import de.ozgcloud.alfa.common.GrpcCallContextTestFactory;
 import de.ozgcloud.alfa.common.callcontext.ContextService;
 import de.ozgcloud.alfa.representation.GrpcGetRepresentationsResponseTestFactory;
-import de.ozgcloud.alfa.vorgang.EingangTestFactory;
-import de.ozgcloud.vorgang.grpc.command.GrpcCallContext;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.vorgang.grpc.file.FileServiceGrpc.FileServiceBlockingStub;
 import de.ozgcloud.vorgang.grpc.file.GrpcGetAttachmentsRequest;
 import de.ozgcloud.vorgang.grpc.file.GrpcGetAttachmentsResponse;
@@ -58,15 +55,8 @@ class OzgFileRemoteServiceTest {
 	@Mock
 	private ContextService contextService;
 
-	private GrpcCallContext callContext = GrpcCallContextTestFactory.create();
-
-	@BeforeEach
-	void mockContextService() {
-		when(contextService.createCallContext()).thenReturn(callContext);
-	}
-
 	@Nested
-	class TestGetAttachmentsByEingang {
+	class TestGetAttachments {
 
 		private final GrpcGetAttachmentsResponse response = GrpcGetAttachmentsResponseTestFactory.create();
 
@@ -75,13 +65,6 @@ class OzgFileRemoteServiceTest {
 			when(serviceStub.getAttachments(any())).thenReturn(response);
 		}
 
-		@Test
-		void shouldCallContextService() {
-			doServiceCall();
-
-			verify(contextService).createCallContext();
-		}
-
 		@Test
 		void shouldCallFileStub() {
 			doServiceCall();
@@ -98,16 +81,16 @@ class OzgFileRemoteServiceTest {
 		}
 
 		private Stream<OzgFile> forceActionsDone(Stream<OzgFile> stream) {
-			return stream.collect(Collectors.toList()).stream();
+			return stream.toList().stream();
 		}
 
 		private Stream<OzgFile> doServiceCall() {
-			return remoteService.getAttachmentsByEingang(EingangTestFactory.ID);
+			return remoteService.getAttachments(VorgangHeaderTestFactory.ID);
 		}
 	}
 
 	@Nested
-	class TestGetRepresentationsByEingang {
+	class TestGetRepresentations {
 
 		private final GrpcGetRepresentationsResponse response = GrpcGetRepresentationsResponseTestFactory.create();
 
@@ -116,13 +99,6 @@ class OzgFileRemoteServiceTest {
 			when(serviceStub.getRepresentations(any())).thenReturn(response);
 		}
 
-		@Test
-		void shouldCallContextService() {
-			doServiceCall();
-
-			verify(contextService).createCallContext();
-		}
-
 		@Test
 		void shouldCallFileStub() {
 			doServiceCall();
@@ -139,11 +115,11 @@ class OzgFileRemoteServiceTest {
 		}
 
 		private Stream<OzgFile> forceActionsDone(Stream<OzgFile> stream) {
-			return stream.collect(Collectors.toList()).stream();
+			return stream.toList().stream();
 		}
 
 		private Stream<OzgFile> doServiceCall() {
-			return remoteService.getRepresentationsByEingang(EingangTestFactory.ID);
+			return remoteService.getRepresentations(VorgangHeaderTestFactory.ID);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileServiceTest.java
index 0cde31348cb7ee6eb9dcb1e36a01b3dd0c522356..320e1fede704fb20116eddc40ba3fe2ec15f4e40 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/file/OzgFileServiceTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
-import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 
 class OzgFileServiceTest {
 
@@ -40,24 +40,24 @@ class OzgFileServiceTest {
 	private OzgFileRemoteService remoteService;
 
 	@Nested
-	class TestGetAttachmentsByEingang {
+	class TestGetAttachments {
 
 		@Test
 		void shouldCallRemoteService() {
-			service.getAttachmentsByEingang(EingangTestFactory.ID);
+			service.getAttachments(VorgangHeaderTestFactory.ID);
 
-			verify(remoteService).getAttachmentsByEingang(EingangTestFactory.ID);
+			verify(remoteService).getAttachments(VorgangHeaderTestFactory.ID);
 		}
 	}
 
 	@Nested
-	class TestGetRepresentationsByEingang {
+	class TestGetRepresentations {
 
 		@Test
 		void shouldCallRemoteService() {
-			service.getRepresentationsByEingang(EingangTestFactory.ID);
+			service.getRepresentations(VorgangHeaderTestFactory.ID);
 
-			verify(remoteService).getRepresentationsByEingang(EingangTestFactory.ID);
+			verify(remoteService).getRepresentations(VorgangHeaderTestFactory.ID);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettingsTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettingsTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3704afd3e6e53302b1fdff0f7883260cd332ff88
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/OrganisationsEinheitSettingsTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024.
+ * 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.
+ */
+
+package de.ozgcloud.alfa.postfach;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+class OrganisationsEinheitSettingsTestFactory {
+	public static final String TEST_SIGNATUR = "Test organisationseinheit signatur";
+
+	static OrganisationsEinheitSettings create() {
+		return createBuilder().build();
+	}
+
+	static OrganisationsEinheitSettings.OrganisationsEinheitSettingsBuilder createBuilder() {
+		return new OrganisationsEinheitSettings.OrganisationsEinheitSettingsBuilder()
+		  .signatur(TEST_SIGNATUR);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a880a875df7f52489823ab29804ad3f0ba96c6c
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2024.
+ * 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.
+ */
+
+package de.ozgcloud.alfa.postfach;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+
+@SpringBootTest(classes = { PostfachPropertiesTestConfiguration.class })
+class PostfachPropertiesTest {
+	private static final String ORGANISATIONSEINHEITEN_ID = "oe1";
+	private static final String TEST_SIG = "test1";
+	private static final String TEST_ORGANISATIONS_SIG = OrganisationsEinheitSettingsTestFactory.TEST_SIGNATUR;
+
+	@DisplayName("Test loading postfach configuration")
+	@Nested
+	@TestPropertySource(properties = {
+			PostfachProperties.PREFIX + ".signatur=" + TEST_SIG,
+			PostfachProperties.PREFIX + ".organisations-einheit-settings." + ORGANISATIONSEINHEITEN_ID + ".signatur=" + TEST_ORGANISATIONS_SIG,
+	})
+	class TestLoadingPostfachProperties {
+
+		@Autowired
+		private PostfachProperties postfachProperties;
+
+		@Nested
+		class TestInitialization {
+
+			@Test
+			void shouldHaveProperties() {
+				assertThat(postfachProperties).isNotNull();
+			}
+
+			@Test
+			void shouldHaveOrganisationsEinheitSettings() {
+				assertThat(postfachProperties.getOrganisationsEinheitSettings()).isNotNull();
+			}
+		}
+	}
+
+	@DisplayName("Test mapping organisations einheit settings")
+	@Nested
+	@TestPropertySource(properties = {
+			PostfachProperties.PREFIX + ".signatur=" + TEST_SIG,
+			PostfachProperties.PREFIX + ".organisations-einheit-settings.oe1.signatur=" + TEST_ORGANISATIONS_SIG,
+	})
+	class TestMapOrganisationsEinheitSettings {
+
+		@Autowired
+		private PostfachProperties postfachProperties;
+
+		@Test
+		void shouldHaveOrganisationsEinheit() {
+			var props = postfachProperties.getOrganisationsEinheitSettings();
+
+			assertThat(props).containsKey(ORGANISATIONSEINHEITEN_ID);
+		}
+
+		@Test
+		void shouldHaveOrganisationsEinheitSetting() {
+			assertThat(postfachProperties.getOrganisationsEinheitSettings().get(ORGANISATIONSEINHEITEN_ID)).hasFieldOrPropertyWithValue("signatur",
+					TEST_ORGANISATIONS_SIG);
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTestConfiguration.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTestConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ad3591f8955244f52afbebae68225d0a43e0d62
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachPropertiesTestConfiguration.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2024.
+ * 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.
+ */
+
+package de.ozgcloud.alfa.postfach;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableConfigurationProperties(PostfachProperties.class)
+class PostfachPropertiesTestConfiguration {
+
+	@Autowired
+	private PostfachProperties postfachProperties;
+
+}
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachSettingsServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachSettingsServiceTest.java
index 2898c5ecf7fde5ead5dab2eb396bbeeae8f3861d..6a5a5e6c6ffb0555d0bc1cde94d73d5a532ef0c9 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachSettingsServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachSettingsServiceTest.java
@@ -3,7 +3,11 @@ package de.ozgcloud.alfa.postfach;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -19,6 +23,7 @@ import org.springframework.test.util.ReflectionTestUtils;
 
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory;
 import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.vorgang.ServiceKontoTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangHeadTestFactory;
@@ -62,7 +67,7 @@ class PostfachSettingsServiceTest {
 		}
 
 		@Test
-		void shoulCallRemoteServiceOnlyOnce() {
+		void shouldCallRemoteServiceOnlyOnce() {
 			when(remoteService.getPostfachConfig()).thenReturn(PostfachConfigGroupTestFactory.create());
 
 			callService();
@@ -128,12 +133,12 @@ class PostfachSettingsServiceTest {
 		void shouldGetSignatur() {
 			callService();
 
-			verify(service).getSignatur();
+			verify(service).getSignatur(vorgang.getOrganisationseinheitenID());
 		}
 
 		@Test
 		void shouldSetSignatur() {
-			doReturn(SettingsTestFactory.SIGNATUR).when(service).getSignatur();
+			doReturn(SettingsTestFactory.SIGNATUR).when(service).getSignatur(vorgang.getOrganisationseinheitenID());
 
 			var postfach = callService();
 
@@ -156,24 +161,60 @@ class PostfachSettingsServiceTest {
 		}
 
 		@Test
-		void shouldGetSignatur() {
+		void shouldGetOrganisationEinheitSettings() {
 			callService();
 
-			verify(postfachProperties).getSignatur();
+			verify(service).getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+		}
+
+		@Nested
+		class OnExistingOrganisationsEinheitSignatur {
+
+			@BeforeEach
+			void setUp() {
+				doReturn(Optional.of(OrganisationsEinheitSettingsTestFactory.create())).when(service)
+						.getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+			}
+
+			@Test
+			void shouldReturnOrganisationsEinheitSignatur() {
+				var signatur = callService();
+
+				assertThat(signatur).isEqualTo(OrganisationsEinheitSettingsTestFactory.TEST_SIGNATUR);
+			}
 
 		}
 
-		@Test
-		void shouldReturnSignatur() {
-			when(postfachProperties.getSignatur()).thenReturn(SettingsTestFactory.SIGNATUR);
+		@Nested
+		class OnNoOrganisationsEinheitSignatur {
+
+			@BeforeEach
+			void setUp() {
+				doReturn(Optional.empty()).when(service)
+						.getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+			}
+
+			@Test
+			void shouldGetSignatur() {
+				callService();
+
+				verify(postfachProperties).getSignatur();
+
+			}
+
+			@Test
+			void shouldReturnSignatur() {
+				when(postfachProperties.getSignatur()).thenReturn(SettingsTestFactory.SIGNATUR);
 
-			var signatur = callService();
+				var signatur = callService();
+
+				assertThat(signatur).isEqualTo(SettingsTestFactory.SIGNATUR);
+			}
 
-			assertThat(signatur).isEqualTo(SettingsTestFactory.SIGNATUR);
 		}
 
 		private String callService() {
-			return service.getSignatur();
+			return service.getSignatur(OrganisationsEinheitTestFactory.ID);
 		}
 	}
 
@@ -317,4 +358,65 @@ class PostfachSettingsServiceTest {
 		ReflectionTestUtils.setField(service, "postfachConfigGroup", postfachConfigGroup);
 	}
 
+	@Nested
+	class TestGetOrganisationsEinheitSettings {
+
+		private final OrganisationsEinheitSettings organisationsEinheitSettings = OrganisationsEinheitSettingsTestFactory.create();
+		private final Map<String, Object> organisationsEinheitSettingsMap = Map.of(PostfachSettingsService.FIELD_SIGNATUR, OrganisationsEinheitSettingsTestFactory.TEST_SIGNATUR);
+
+		@BeforeEach
+		void setUp() {
+			when(postfachProperties.getOrganisationsEinheitSettings()).thenReturn(
+					Map.of(OrganisationsEinheitTestFactory.ID, organisationsEinheitSettingsMap));
+		}
+
+		@Test
+		void shouldGetOrganisationsEinheitSettings() {
+			service.getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+
+			verify(postfachProperties).getOrganisationsEinheitSettings();
+		}
+
+		@Test
+		void shouldMapToOrganisationsEinheitSettings() {
+			service.getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+
+			verify(service).mapOrganisationsEinheitSettings(organisationsEinheitSettingsMap);
+		}
+
+		@Test
+		void shouldReturnSettings() {
+			var settings = service.getOrganisationsEinheitSettings(OrganisationsEinheitTestFactory.ID);
+
+			assertThat(settings).isPresent().get().usingRecursiveComparison().isEqualTo(organisationsEinheitSettings);
+		}
+
+		@Test
+		void shouldReturnEmpty() {
+			var settings = service.getOrganisationsEinheitSettings(UUID.randomUUID().toString());
+
+			assertThat(settings).isEmpty();
+		}
+	}
+
+	@Nested
+	class TestMapOrganisationsEinheitSettings {
+
+		private final String signatur = LoremIpsum.getInstance().getWords(2);
+		private final Map<String, Object> organisationsEinheitSettings = Map.of(PostfachSettingsService.FIELD_SIGNATUR, signatur);
+
+		@Test
+		void shouldMap() {
+			var settings = service.mapOrganisationsEinheitSettings(organisationsEinheitSettings);
+
+			assertThat(settings.getSignatur()).isEqualTo(signatur);
+		}
+
+		@Test
+		void shouldReturnSettingsWithNullSignatur() {
+			var settings = service.mapOrganisationsEinheitSettings(Collections.emptyMap());
+
+			assertThat(settings.getSignatur()).isNull();
+		}
+	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationByVorgangControllerTest.java
similarity index 67%
rename from alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentControllerTest.java
rename to alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationByVorgangControllerTest.java
index 7e7b3a6e20a4aa2ca117acb79ece432c7d5cf57c..bacd8d37cd39d528a54d0eb3b778ecef9da5dc46 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationByVorgangControllerTest.java
@@ -21,9 +21,8 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.alfa.attachment;
+package de.ozgcloud.alfa.representation;
 
-import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -31,12 +30,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.hateoas.CollectionModel;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@@ -45,50 +45,52 @@ import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileService;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
-import de.ozgcloud.alfa.common.zipdownload.ZipDownloadService;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import lombok.SneakyThrows;
 
-class AttachmentControllerTest {
+class RepresentationByVorgangControllerTest {
 
 	@Spy
 	@InjectMocks
-	private AttachmentController controller;
+	private RepresentationByVorgangController controller;
 	@Mock
 	private BinaryFileModelAssembler modelAssembler;
 	@Mock
 	private OzgFileService fileService;
-	@Mock
-	private ZipDownloadService zipDownloadService;
 
 	private MockMvc mockMvc;
 
 	@BeforeEach
-	void initTest() {
+	void init() {
 		mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
 	}
 
 	@Nested
-	class TestGetAttachmentsByEingang {
+	class TestGetRepresentations {
+
+		Stream<OzgFile> representations = Stream.of(OzgFileTestFactory.create());
 
 		@BeforeEach
 		void mockFileService() {
-			when(fileService.getAttachmentsByEingang(anyString())).thenReturn(Stream.of(OzgFileTestFactory.create()));
+			when(fileService.getRepresentations(VorgangHeaderTestFactory.ID)).thenReturn(representations);
+			when(modelAssembler.toCollectionModel(representations)).thenReturn(CollectionModel.empty());
 		}
 
 		@SneakyThrows
+		@DisplayName("should return ok")
 		@Test
-		void shouldResponseWithStatusOk() {
+		void shouldReturnOk() {
 			var result = callEndpoint();
 
 			result.andExpect(status().isOk());
 		}
 
-		@SneakyThrows
+		@DisplayName("should call file service")
 		@Test
-		void shoudlCallFileService() {
+		void shouldCallFileService() {
 			callEndpoint();
 
-			verify(fileService).getAttachmentsByEingang(any());
+			verify(fileService).getRepresentations(VorgangHeaderTestFactory.ID);
 		}
 
 		@SneakyThrows
@@ -96,12 +98,21 @@ class AttachmentControllerTest {
 		void shouldCallModelAssembler() {
 			callEndpoint();
 
-			verify(modelAssembler).toCollectionModel(ArgumentMatchers.<Stream<OzgFile>>any());
+			verify(modelAssembler).toCollectionModel(representations);
+		}
+
+		@SneakyThrows
+		@DisplayName("should return entity")
+		@Test
+		void shouldReturnEntity() {
+			var result = callEndpoint();
+
+			result.andExpect(jsonPath("$.content").isEmpty());
 		}
 
 		@SneakyThrows
 		private ResultActions callEndpoint() {
-			return mockMvc.perform(get(AttachmentController.PATH).param(AttachmentController.PARAM_EINGANG_ID, "1"));
+			return mockMvc.perform(get(RepresentationByVorgangController.PATH, VorgangHeaderTestFactory.ID));
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationControllerTest.java
deleted file mode 100644
index baa2ecbbff4cb2b1ddf4e43ac192d10109088069..0000000000000000000000000000000000000000
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/representation/RepresentationControllerTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-package de.ozgcloud.alfa.representation;
-
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
-import java.util.stream.Stream;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatchers;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-
-import de.ozgcloud.alfa.common.binaryfile.BinaryFileModelAssembler;
-import de.ozgcloud.alfa.common.file.OzgFile;
-import de.ozgcloud.alfa.common.file.OzgFileService;
-import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
-import lombok.SneakyThrows;
-
-class RepresentationControllerTest {
-
-	@Spy
-	@InjectMocks
-	private RepresentationController controller;
-	@Mock
-	private BinaryFileModelAssembler modelAssembler;
-	@Mock
-	private OzgFileService fileService;
-
-	private MockMvc mockMvc;
-
-	@BeforeEach
-	void init() {
-		mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
-	}
-
-	@Nested
-	class TestGetRepresentationsByEingang {
-
-		@BeforeEach
-		void mockFileService() {
-			when(fileService.getRepresentationsByEingang(anyString())).thenReturn(Stream.of(OzgFileTestFactory.create()));
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldCallEndpoint() {
-			callEndpoint();
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldCallFileService() {
-			callEndpoint();
-
-			verify(fileService).getRepresentationsByEingang(any());
-		}
-
-		@SneakyThrows
-		@Test
-		void shouldCallModelAssembler() {
-			callEndpoint();
-
-			verify(modelAssembler).toCollectionModel(ArgumentMatchers.<Stream<OzgFile>>any());
-		}
-
-		@SneakyThrows
-		private void callEndpoint() {
-			mockMvc.perform(get(RepresentationController.PATH).param(RepresentationController.PARAM_EINGANG_ID, "1")).andExpect(status().isOk());
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java
index 988b8cd04b8df6ae58cb6923785235828ebd5447..a145ca8b23e05f8d925e015a8e5cc9cb6f739357 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java
@@ -67,7 +67,7 @@ class VorgangWithEingangProcessorTest {
 	@Mock
 	private VorgangProcessorProperties vorgangProcessorProperties;
 
-	private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
+	private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
 
 	@DisplayName("Attachments")
 	@Nested
@@ -82,7 +82,7 @@ class VorgangWithEingangProcessorTest {
 		@Nested
 		class TestLink {
 
-			private static final String PATH = "/api/attachments?eingangId=" + EingangTestFactory.ID;
+			private static final String PATH = "/api/vorgang/" + VorgangHeaderTestFactory.ID + "/attachments";
 			private final LinkRelation linkRel = VorgangWithEingangProcessor.REL_ATTACHMENTS;
 
 			@DisplayName("should be present if attachments exists")
@@ -105,7 +105,7 @@ class VorgangWithEingangProcessorTest {
 		@Nested
 		class TestDownloadLink {
 
-			private static final String PATH = "/api/vorgang/" + VorgangHeaderTestFactory.ID + "/attachments?eingangId=" + EingangTestFactory.ID;
+			private static final String PATH = "/api/vorgang/" + VorgangHeaderTestFactory.ID + "/attachments";
 			private final LinkRelation linkRel = VorgangWithEingangProcessor.REL_DOWNLOAD_ATTACHMENTS;
 
 			@DisplayName("should be present if attachments exists")
@@ -144,7 +144,7 @@ class VorgangWithEingangProcessorTest {
 			initUserProfileUrlProvider(urlProvider);
 		}
 
-		private static final String PATH = "/api/representations?eingangId=" + EingangTestFactory.ID;
+		private static final String PATH = "/api/vorgang/" + VorgangHeaderTestFactory.ID + "/representations";
 
 		private final LinkRelation linkRel = VorgangWithEingangProcessor.REL_REPRESENTATIONS;
 
diff --git a/alfa-xdomea/pom.xml b/alfa-xdomea/pom.xml
index b26ac517ff64134e1aa77ca1ab183e1fd6399dd9..d263dd38d2a153faa29682be9c8031a3423c79b6 100644
--- a/alfa-xdomea/pom.xml
+++ b/alfa-xdomea/pom.xml
@@ -31,7 +31,7 @@
 	<parent>
 		<groupId>de.ozgcloud.alfa</groupId>
 		<artifactId>alfa</artifactId>
-		<version>2.15.0-SNAPSHOT</version>
+		<version>2.16.0-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>alfa-xdomea</artifactId>
diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java
index ab9ead3554f9ff95650c64d2e171882613b49e49..fd7442319cbf13109c91a94e72a04cc5d5af764d 100644
--- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java
+++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java
@@ -2,7 +2,6 @@ package de.ozgcloud.alfa.file;
 
 import java.io.OutputStream;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Stream;
 
@@ -12,7 +11,6 @@ import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
 import de.ozgcloud.alfa.common.binaryfile.FileId;
 import de.ozgcloud.alfa.common.file.OzgFile;
 import de.ozgcloud.alfa.common.file.OzgFileService;
-import de.ozgcloud.alfa.vorgang.Eingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.xoev.xdomea.DokumentType;
 import lombok.RequiredArgsConstructor;
@@ -25,15 +23,11 @@ public class ExportFileService {
 	private final BinaryFileService binaryFileService;
 
 	public Stream<OzgFile> getRepresentations(VorgangWithEingang vorgang) {
-		return Optional.ofNullable(vorgang.getEingang())
-				.map(Eingang::getId).stream()
-				.flatMap(ozgFileService::getRepresentationsByEingang);
+		return ozgFileService.getRepresentations(vorgang.getId());
 	}
 
 	public Stream<OzgFile> getAttachments(VorgangWithEingang vorgang) {
-		return Optional.ofNullable(vorgang.getEingang())
-				.map(Eingang::getId).stream()
-				.flatMap(ozgFileService::getAttachmentsByEingang);
+		return ozgFileService.getAttachments(vorgang.getId());
 	}
 
 	public Stream<DokumentType> createDokumentTypes(List<OzgFile> ozgFiles, String formEngineName) {
diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/ExportFileServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/ExportFileServiceTest.java
index 502ab6599a36de2b53c4da6e2b0e3600b03b928f..73d519947c0903948271c05fd95c06ebcc29f3cf 100644
--- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/ExportFileServiceTest.java
+++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/ExportFileServiceTest.java
@@ -9,12 +9,12 @@ import java.util.stream.Stream;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
-import org.springframework.http.MediaType;
 
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileService;
 import de.ozgcloud.alfa.common.binaryfile.FileId;
@@ -23,7 +23,8 @@ import de.ozgcloud.alfa.common.file.OzgFileService;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
 import de.ozgcloud.alfa.export.DokumentTypeTestFactory;
 import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory;
-import de.ozgcloud.alfa.vorgang.EingangTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 import de.xoev.xdomea.DokumentType;
 
@@ -38,109 +39,66 @@ class ExportFileServiceTest {
 	@Mock
 	private BinaryFileService binaryFileService;
 
-	@Nested
-	class TestGetRepresentations {
-
-		private final OzgFile representationPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build();
-		private final OzgFile representationXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build();
-
-		@Nested
-		class OnAvailableVorgangData {
+	private final OzgFile ozgFile = OzgFileTestFactory.create();
 
-			@BeforeEach
-			void init() {
-				when(ozgFileService.getRepresentationsByEingang(EingangTestFactory.ID)).thenReturn(
-						Stream.of(representationPdfFile, representationXmlFile));
-			}
+	private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create();
 
-			@Test
-			void shouldLoadRepresentations() {
-				service.getRepresentations(VorgangWithEingangTestFactory.create()).toList();
-
-				verify(ozgFileService).getRepresentationsByEingang(EingangTestFactory.ID);
-			}
-
-			@Test
-			void shouldReturnAllFiles() {
-				var representations = service.getRepresentations(VorgangWithEingangTestFactory.create());
+	@DisplayName("get representations")
+	@Nested
+	class TestGetRepresentations {
 
-				assertThat(representations).hasSize(2).containsExactlyInAnyOrder(representationPdfFile, representationXmlFile);
-			}
+		@BeforeEach
+		void mock() {
+			when(ozgFileService.getRepresentations(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(ozgFile));
 		}
 
-		@Nested
-		class OnMissingVorgangData {
-
-			@Test
-			void shouldReturnEmptyOnMissingEingang() {
-				var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(null).build();
-
-				var representations = service.getRepresentations(vorgang);
-
-				assertThat(representations).isEmpty();
-			}
-
-			@Test
-			void shouldReturnEmptyOnMissingEingangId() {
-				var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().id(null).build()).build();
+		@DisplayName("should call get representations")
+		@Test
+		void shouldShouldCallGetRepresentations() {
+			getRepresentations();
 
-				var representations = service.getRepresentations(vorgang);
+			verify(ozgFileService).getRepresentations(VorgangHeaderTestFactory.ID);
+		}
 
-				assertThat(representations).isEmpty();
-			}
+		@DisplayName("should return representations")
+		@Test
+		void shouldReturnRepresentations() {
+			var representations = getRepresentations();
 
+			assertThat(representations).containsExactly(ozgFile);
 		}
 
+		private List<OzgFile> getRepresentations() {
+			return service.getRepresentations(vorgangWithEingang).toList();
+		}
 	}
 
+	@DisplayName("get attachments")
 	@Nested
 	class TestGetAttachments {
-
-		private final OzgFile attachmentPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build();
-		private final OzgFile attachmentXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build();
-
-		@Nested
-		class OnAvailableVorgangData {
-
-			@BeforeEach
-			void init() {
-				when(ozgFileService.getAttachmentsByEingang(EingangTestFactory.ID)).thenReturn(Stream.of(attachmentXmlFile, attachmentPdfFile));
-			}
-
-			@Test
-			void shouldLoadAttachments() {
-				service.getAttachments(VorgangWithEingangTestFactory.create()).toList();
-
-				verify(ozgFileService).getAttachmentsByEingang(EingangTestFactory.ID);
-			}
-
-			@Test
-			void shouldReturnAllFiles() {
-				var ozgFiles = service.getAttachments(VorgangWithEingangTestFactory.create());
-
-				assertThat(ozgFiles).hasSize(2).containsExactlyInAnyOrder(attachmentPdfFile, attachmentXmlFile);
-			}
+		@BeforeEach
+		void mock() {
+			when(ozgFileService.getAttachments(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(ozgFile));
 		}
 
-		@Nested
-		class OnMissingVorgangData {
-			@Test
-			void shouldReturnEmptyOnMissingEingang() {
-				var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(null).build();
-
-				var attachments = service.getAttachments(vorgang);
+		@DisplayName("should call get attachments")
+		@Test
+		void shouldShouldCallGetRepresentations() {
+			getAttachments();
 
-				assertThat(attachments).isEmpty();
-			}
+			verify(ozgFileService).getAttachments(VorgangHeaderTestFactory.ID);
+		}
 
-			@Test
-			void shouldReturnEmptyOnMissingEingangId() {
-				var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().id(null).build()).build();
+		@DisplayName("should return")
+		@Test
+		void shouldReturn() {
+			var representations = getAttachments();
 
-				var attachments = service.getAttachments(vorgang);
+			assertThat(representations).containsExactly(ozgFile);
+		}
 
-				assertThat(attachments).isEmpty();
-			}
+		private List<OzgFile> getAttachments() {
+			return service.getAttachments(vorgangWithEingang).toList();
 		}
 	}
 
diff --git a/pom.xml b/pom.xml
index b9558ffe451bae15b53c5a85085f60d9f746555a..b94a9aeca3933d3690cf4dfe516a54515f43d240 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,7 +35,7 @@
 
 	<groupId>de.ozgcloud.alfa</groupId>
 	<artifactId>alfa</artifactId>
-	<version>2.15.0-SNAPSHOT</version>
+	<version>2.16.0-SNAPSHOT</version>
 	<name>Alfa Parent</name>
 	<packaging>pom</packaging>
 
@@ -54,7 +54,7 @@
 		<nachrichten-manager.version>2.11.0</nachrichten-manager.version>
 		<ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version>
 		<user-manager.version>2.8.0</user-manager.version>
-		<zufi-manager.version>1.5.0-SNAPSHOT</zufi-manager.version>
+		<zufi-manager.version>1.5.0</zufi-manager.version>
 		<spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
 
 		<!-- TODO: die Version über ozgcloud-common ziehen -->