From bd59911956f5527213bb501fe5efddee7986c6d8 Mon Sep 17 00:00:00 2001
From: Albert Bruns <albert.bruns@mgm-tp.com>
Date: Mon, 17 Feb 2025 17:05:09 +0000
Subject: [PATCH] Ozg 7413 modules ui and tech shared modernisieren

---
 .../apps/admin/src/app/app.component.ts       |  12 +-
 alfa-client/apps/admin/src/main.ts            |  26 +-
 .../organisationseinheit-page.component.ts    |   3 +-
 alfa-client/apps/alfa-e2e/docker-compose.yml  |   4 +-
 .../apps/alfa/src/app/app.component.ts        |   3 +-
 alfa-client/apps/alfa/src/app/app.module.ts   |  66 ++++-
 .../menu/menu.component.spec.ts               |   4 +-
 .../lib/menu-container/menu/menu.component.ts |   4 +-
 ...ations-einheit-container.component.spec.ts |  15 +-
 ...ganisations-einheit-container.component.ts |   6 +-
 ...ganisations-einheit-list.component.spec.ts |   9 +-
 .../organisations-einheit-list.component.ts   |  12 +-
 .../libs/bescheid/src/lib/bescheid.module.ts  |  40 ++-
 .../src/lib/binary-file.repository.spec.ts    |  26 +-
 .../binary-file/src/lib/binary-file.module.ts |  20 +-
 .../src/lib/collaboration.module.ts           |   8 +-
 .../build-info/build-info.component.spec.ts   |   3 +-
 .../checkbox-editor.component.ts              |   4 +-
 .../file-upload-editor.component.spec.ts      |  17 +-
 .../file-upload-editor.component.ts           |  27 +-
 .../single-file-upload-editor.component.ts    |   4 +-
 .../form/text-editor/text-editor.component.ts |  10 +-
 .../textarea-editor.component.ts              |  10 +-
 .../libs/design-system/run_helm_test.sh       |   0
 .../dropdown-menu-link-item.component.ts      |   2 +-
 .../lib/form/checkbox/checkbox.component.ts   |   4 +-
 .../file-upload-button.component.spec.ts      |   4 +-
 .../file-upload-button.component.ts           |   4 +-
 .../text-input/text-input.component.spec.ts   |   4 +-
 .../form/text-input/text-input.component.ts   |   4 +-
 .../form/textarea/textarea.component.spec.ts  |   4 +-
 .../lib/form/textarea/textarea.component.ts   |   4 +-
 .../nav-item/nav-item.component.spec.ts       |   4 +-
 .../lib/navbar/nav-item/nav-item.component.ts |   8 +-
 .../externe-fachstelle-list-item.component.ts |   4 +-
 ...zgcloud-button-container.component.spec.ts |   3 +-
 ...-by-ozgcloud-button-container.component.ts |   4 +-
 .../forwarding/src/lib/forwarding.module.ts   |  30 +-
 .../vorgang-forward-form.component.spec.ts    |  13 +-
 .../hint-shared/src/lib/hint-shared.module.ts |   4 +-
 alfa-client/libs/hint/src/lib/hint.module.ts  |   7 +-
 ...rie-item-bescheid-status.component.spec.ts |   3 +-
 ...rie-item-vorgang-created.component.spec.ts |   9 +-
 .../libs/historie/src/lib/historie.module.ts  |  27 +-
 .../src/lib/kommentar-shared.module.ts        |   5 +-
 .../kommentar/src/lib/kommentar.module.ts     |  18 +-
 .../src/lib/loesch-anforderung.module.ts      |   9 +-
 .../src/lib/navigation-shared.module.ts       |   2 -
 .../header/header.component.spec.ts           |   2 -
 .../src/lib/navigation.module.spec.ts         |   2 +-
 .../navigation/src/lib/navigation.module.ts   |   2 -
 ...ganisations-einheit-list-item.component.ts |   4 +-
 .../postfach-mail-form.component.spec.ts      |   9 +-
 .../postfach-mail-date.component.spec.ts      |   9 +-
 .../libs/postfach/src/lib/postfach.module.ts  |  31 ++-
 .../lib/resource-redirect-shared.module.ts    |   5 +-
 alfa-client/libs/tech-shared/src/index.ts     |   2 +-
 .../src/lib/decorator/error.decorator.util.ts |   4 +-
 .../src/lib/injector/injector.service.spec.ts |  30 ++
 .../src/lib/injector/injector.service.ts      |  16 ++
 .../tech-shared/src/lib/keyboard.util.spec.ts |   2 +-
 ...onvert-api-error-to-error-messages.pipe.ts |   5 +-
 .../lib/pipe/convert-for-data-test.pipe.ts    |   5 +-
 ...t-problem-detail-to-error-messages.pipe.ts |   9 +-
 .../src/lib/pipe/convert-to-boolean.pipe.ts   |   5 +-
 .../src/lib/pipe/enum-to-label.pipe.ts        |   5 +-
 .../src/lib/pipe/file-size-plain.pipe.ts      |   5 +-
 .../src/lib/pipe/file-size.pipe.ts            |   5 +-
 .../lib/pipe/format-date-with-time.pipe.ts    |   9 +-
 ...format-date-without-year-with-time.pipe.ts |   5 +-
 .../src/lib/pipe/format-full-date.pipe.ts     |   5 +-
 .../lib/pipe/format-to-pretty-date.pipe.ts    |   5 +-
 .../tech-shared/src/lib/pipe/get-url.pipe.ts  |   5 +-
 .../src/lib/pipe/has-any-link.pipe.ts         |   5 +-
 .../tech-shared/src/lib/pipe/has-link.pipe.ts |   5 +-
 .../src/lib/pipe/not-has-any-link.pipe.ts     |   5 +-
 .../src/lib/pipe/not-has-link.pipe.ts         |   5 +-
 .../src/lib/pipe/to-embedded-resource.pipe.ts |   5 +-
 .../src/lib/pipe/to-resource-uri.pipe.ts      |   5 +-
 .../lib/pipe/to-traffic-light-tooltip.pipe.ts |   5 +-
 .../src/lib/pipe/to-traffic-light.pipe.ts     |   5 +-
 .../resource/list-resource.service.spec.ts    |  10 +-
 .../src/lib/resource/list-resource.service.ts |   3 +-
 .../lib/resource/resource.repository.spec.ts  |   7 +-
 .../src/lib/resource/resource.repository.ts   |   8 +-
 .../src/lib/resource/resource.service.spec.ts |  10 +-
 .../src/lib/resource/resource.service.ts      |  16 +-
 .../src/lib/resource/resource.util.spec.ts    |   2 +-
 .../lib/service/formservice.abstract.spec.ts  |   2 +-
 .../src/lib/tech-shared.module.spec.ts        |  37 ---
 .../tech-shared/src/lib/tech-shared.module.ts | 121 --------
 alfa-client/libs/ui/src/index.ts              |   5 +-
 .../icon/app-icon/app-icon.component.spec.ts  |   3 +-
 .../lib/icon/app-icon/app-icon.component.ts   |   3 +
 .../postfach-icon.component.spec.ts           |   3 +-
 .../postfach-icon/postfach-icon.component.ts  |   4 +
 .../snackbar-close-button.component.spec.ts   |   3 +-
 .../snackbar-close-button.component.ts        |   4 +
 .../snackbar-error.component.spec.ts          |   5 +-
 .../snackbar-error.component.ts               |  11 +-
 .../snackbar-info.component.html              |  12 +-
 .../snackbar-info.component.spec.ts           |   5 +-
 .../snackbar-info/snackbar-info.component.ts  |  14 +-
 .../ui/src/lib/snackbar/snackbar.service.ts   |  10 +-
 .../ui/accordion/accordion.component.spec.ts  |   3 +-
 .../lib/ui/accordion/accordion.component.ts   |   3 +
 .../ui/back-button/back-button.component.ts   |   7 +
 .../basic-dialog.component.spec.ts            |   9 +-
 .../ui/basic-dialog/basic-dialog.component.ts |  28 +-
 .../ui/src/lib/ui/dialog/dialog.service.ts    |  15 +-
 .../download-button.component.spec.ts         |   4 +-
 .../download-button.component.ts              |   6 +
 .../autocomplete-editor.component.html        |  61 ++--
 .../autocomplete-editor.component.spec.ts     |  10 +-
 .../autocomplete-editor.component.ts          |  40 +--
 .../checkbox-enum-editor.component.spec.ts    |  13 +-
 .../checkbox-enum-editor.component.ts         |   9 +-
 .../date-editor/date-editor.component.spec.ts |  13 +-
 .../date-editor/date-editor.component.ts      |  20 +-
 .../file-upload-editor.component.html         |  53 ++--
 .../file-upload-editor.component.spec.ts      |  25 +-
 .../file-upload-editor.component.ts           |  46 +--
 .../ozgcloud-text-editor.component.html       |  66 +++++
 ...ss => ozgcloud-text-editor.component.scss} |   0
 ...=> ozgcloud-text-editor.component.spec.ts} |  26 +-
 ...t.ts => ozgcloud-text-editor.component.ts} |  33 ++-
 .../text-editor/text-editor.component.html    |  65 -----
 .../textarea-editor.component.spec.ts         |  13 +-
 .../textarea-editor.component.ts              |  22 +-
 .../expansion-panel.component.spec.ts         |   9 +-
 .../expansion-panel.component.ts              |   6 +
 .../ui/file-upload/file-upload.component.html |  56 ++--
 .../file-upload/file-upload.component.spec.ts |   6 +-
 .../ui/file-upload/file-upload.component.ts   |   8 +-
 .../fixed-dialog.component.spec.ts            |   3 +-
 .../ui/fixed-dialog/fixed-dialog.component.ts |  22 +-
 ...ion-timeout-retry-dialog.component.spec.ts |   6 +-
 ...nnection-timeout-retry-dialog.component.ts |   5 +
 ...imeout-retry-fail-dialog.component.spec.ts |   6 +-
 ...ion-timeout-retry-fail-dialog.component.ts |   6 +
 .../icon-button-with-spinner.component.html   |  12 +-
 ...icon-button-with-spinner.component.spec.ts |  15 +-
 .../icon-button-with-spinner.component.ts     |   8 +
 ...nternal-server-error-dialog.component.html |  47 ++--
 ...rnal-server-error-dialog.component.spec.ts |  12 +-
 .../internal-server-error-dialog.component.ts |  15 +-
 .../open-url-button.component.spec.ts         |   4 +-
 .../open-url-button.component.ts              |   5 +
 ...loud-button-with-spinner.component.spec.ts |   2 +-
 .../ozgcloud-button-with-spinner.component.ts |   8 +-
 ...loud-icon-button-primary.component.spec.ts |   5 +-
 .../ozgcloud-icon-button-primary.component.ts |   8 +-
 ...oked-button-with-spinner.component.spec.ts |   2 +-
 ...d-stroked-button-with-spinner.component.ts |   8 +-
 .../ozgcloud-button-content.component.html    |  85 +++---
 .../ozgcloud-button-content.component.spec.ts |   2 +-
 .../ozgcloud-button-content.component.ts      |   6 +-
 .../ozgcloud-dialog.service.ts                |   6 +-
 .../ozgcloud-icon.component.spec.ts           |   3 +-
 .../ozgcloud-icon/ozgcloud-icon.component.ts  |   3 +
 .../ozgcloud-menu.component.spec.ts           |   3 +-
 .../ozgcloud-menu/ozgcloud-menu.component.ts  |   2 +
 .../ozgcloud-paste-text-button.component.html |  55 ++--
 ...gcloud-paste-text-button.component.spec.ts |   4 +-
 .../ozgcloud-paste-text-button.component.ts   |   5 +-
 .../ozgcloud-routing-button.component.spec.ts |   3 +-
 .../ozgcloud-routing-button.component.ts      |   4 +
 .../ozgcloud-svgicon-big.component.spec.ts    |   3 +-
 .../ozgcloud-svgicon-big.component.ts         |   3 +
 .../ozgcloud-svgicon.component.spec.ts        |   3 +-
 .../ozgcloud-svgicon.component.ts             |   3 +
 .../progress-bar/progress-bar.component.html  |  44 +--
 .../progress-bar.component.spec.ts            |   3 +-
 .../ui/progress-bar/progress-bar.component.ts |   5 +-
 .../ui/slide-toggle/slide-toggle.component.ts |   7 +-
 .../spinner-transparency.component.html       |  53 ++--
 .../spinner-transparency.component.spec.ts    |   3 +-
 .../spinner-transparency.component.ts         |   5 +-
 .../src/lib/ui/spinner/spinner.component.html |  52 ++--
 .../lib/ui/spinner/spinner.component.spec.ts  |   3 +-
 .../src/lib/ui/spinner/spinner.component.ts   |   3 +
 .../subnavigation.component.spec.ts           |   2 +-
 .../subnavigation/subnavigation.component.ts  |   1 +
 .../libs/ui/src/lib/ui/ui.module.spec.ts      |  37 ---
 alfa-client/libs/ui/src/lib/ui/ui.module.ts   | 263 ------------------
 .../validation-error.component.html           |  40 +--
 .../validation-error.component.spec.ts        |   2 +-
 .../validation-error.component.ts             |   1 +
 .../open-documentation-button.component.html  |   2 +-
 .../lib/help-menu/help-menu.component.spec.ts |  11 +-
 .../src/lib/user-assistance.module.ts         |  13 +-
 .../src/lib/user-profile.repository.spec.ts   |  10 +-
 .../user-profile-in-header.component.spec.ts  |   2 +
 ...profile-button-container.component.spec.ts |   4 +-
 .../src/lib/user-profile.module.ts            |  24 +-
 .../user-settings.component.spec.ts           |   3 +-
 .../src/lib/user-settings.module.ts           |  13 +-
 ...aktenzeichen-edit-dialog.component.spec.ts |  41 +--
 .../aktenzeichen-edit-dialog.component.ts     |  39 +--
 ...eiden-dokument-hochladen.component.spec.ts |   9 +-
 .../src/lib/vorgang-detail.module.ts          |  54 +++-
 .../src/lib/vorgang-shared-ui.module.ts       |  38 ++-
 .../vorgang-status-dot.component.spec.ts      |   5 +-
 .../vorgang-status-text.component.spec.ts     |   3 +-
 .../src/lib/+state/vorgang.repository.spec.ts | 145 +++-------
 .../src/lib/vorgang-shared.module.ts          |   2 -
 .../libs/vorgang/src/lib/vorgang.module.ts    |  32 ++-
 .../wiedervorlage-form.component.spec.ts      |  29 +-
 .../wiedervorlage-status.component.spec.ts    |   4 +-
 .../src/lib/wiedervorlage.module.ts           |  46 ++-
 .../src/lib/zustaendige-stelle.module.ts      |   2 -
 alfa-client/nx.json                           |   1 +
 212 files changed, 1600 insertions(+), 1560 deletions(-)
 mode change 100755 => 100644 alfa-client/libs/design-system/run_helm_test.sh
 create mode 100644 alfa-client/libs/tech-shared/src/lib/injector/injector.service.spec.ts
 create mode 100644 alfa-client/libs/tech-shared/src/lib/injector/injector.service.ts
 delete mode 100644 alfa-client/libs/tech-shared/src/lib/tech-shared.module.spec.ts
 delete mode 100644 alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts
 create mode 100644 alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.html
 rename alfa-client/libs/ui/src/lib/ui/editor/text-editor/{text-editor.component.scss => ozgcloud-text-editor.component.scss} (100%)
 rename alfa-client/libs/ui/src/lib/ui/editor/text-editor/{text-editor.component.spec.ts => ozgcloud-text-editor.component.spec.ts} (84%)
 rename alfa-client/libs/ui/src/lib/ui/editor/text-editor/{text-editor.component.ts => ozgcloud-text-editor.component.ts} (69%)
 delete mode 100644 alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.html
 delete mode 100644 alfa-client/libs/ui/src/lib/ui/ui.module.spec.ts
 delete mode 100644 alfa-client/libs/ui/src/lib/ui/ui.module.ts

diff --git a/alfa-client/apps/admin/src/app/app.component.ts b/alfa-client/apps/admin/src/app/app.component.ts
index fe6c276c6d..6de5c0ab4d 100644
--- a/alfa-client/apps/admin/src/app/app.component.ts
+++ b/alfa-client/apps/admin/src/app/app.component.ts
@@ -27,13 +27,19 @@ import { ROUTES } from '@admin-client/shared';
 import { KeycloakTokenService } from '@admin/keycloak-shared';
 import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
 import { BuildInfoComponent } from '@alfa-client/common';
-import { isLoaded, isNotUndefined, mapToResource, StateResource, TechSharedModule } from '@alfa-client/tech-shared';
+import { HasLinkPipe, isLoaded, isNotUndefined, mapToResource, StateResource } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, inject, OnInit } from '@angular/core';
 import { Router, RouterLink, RouterOutlet } from '@angular/router';
 import { AuthenticationService } from '@authentication';
 import { hasLink } from '@ngxp/rest';
-import { AdminLogoIconComponent, NavbarComponent, NavItemComponent, OrgaUnitIconComponent, UsersIconComponent, } from '@ods/system';
+import {
+  AdminLogoIconComponent,
+  NavbarComponent,
+  NavItemComponent,
+  OrgaUnitIconComponent,
+  UsersIconComponent,
+} from '@ods/system';
 import { filter, Observable, Subscription } from 'rxjs';
 import { UserProfileButtonContainerComponent } from '../common/user-profile-button-container/user-profile.button-container.component';
 import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component';
@@ -54,9 +60,9 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/
     RouterOutlet,
     UnavailablePageComponent,
     BuildInfoComponent,
-    TechSharedModule,
     MenuContainerComponent,
     RouterLink,
+    HasLinkPipe,
   ],
 })
 export class AppComponent implements OnInit {
diff --git a/alfa-client/apps/admin/src/main.ts b/alfa-client/apps/admin/src/main.ts
index 517ab0538b..7f198e2f54 100644
--- a/alfa-client/apps/admin/src/main.ts
+++ b/alfa-client/apps/admin/src/main.ts
@@ -32,7 +32,13 @@ import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@a
 import localeDe from '@angular/common/locales/de';
 import { bootstrapApplication, BrowserModule } from '@angular/platform-browser';
 import { provideAnimations } from '@angular/platform-browser/animations';
-import { ActivatedRouteSnapshot, BaseRouteReuseStrategy, provideRouter, RouteReuseStrategy, withRouterConfig, } from '@angular/router';
+import {
+  ActivatedRouteSnapshot,
+  BaseRouteReuseStrategy,
+  provideRouter,
+  RouteReuseStrategy,
+  withRouterConfig,
+} from '@angular/router';
 import { HttpUnauthorizedInterceptor } from '@authentication';
 import { EffectsModule } from '@ngrx/effects';
 import { StoreRouterConnectingModule } from '@ngrx/router-store';
@@ -43,6 +49,9 @@ import { ConfigurationsProviders } from 'libs/admin/configuration-shared/src/lib
 import { PostfachProviders } from 'libs/admin/postfach-shared/src/lib/postfach.providers';
 import { SettingsProviders } from 'libs/admin/settings-shared/src/lib/settings.providers';
 import { UserProviders } from 'libs/admin/user/src/lib/user.providers';
+import { HttpBinaryFileInterceptor } from '../../../libs/tech-shared/src/lib/interceptor/http-binary-file.interceptor';
+import { HttpXsrfInterceptor } from '../../../libs/tech-shared/src/lib/interceptor/http-xsrf.interceptor';
+import { XhrInterceptor } from '../../../libs/tech-shared/src/lib/interceptor/xhr.interceptor';
 import { AppComponent } from './app/app.component';
 import { appRoutes } from './app/app.routes';
 import { environment } from './environments/environment';
@@ -69,6 +78,21 @@ loadEnvironment(environment.environmentUrl).then((env) => {
   bootstrapApplication(AppComponent, {
     providers: [
       { provide: RouteReuseStrategy, useClass: NoRouteReuseStrategy },
+      {
+        provide: HTTP_INTERCEPTORS,
+        useClass: XhrInterceptor,
+        multi: true,
+      },
+      {
+        provide: HTTP_INTERCEPTORS,
+        useClass: HttpXsrfInterceptor,
+        multi: true,
+      },
+      {
+        provide: HTTP_INTERCEPTORS,
+        useClass: HttpBinaryFileInterceptor,
+        multi: true,
+      },
       ConfigurationsProviders,
       PostfachProviders,
       SettingsProviders,
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 d2d9e13340..431f26bb8d 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
@@ -22,12 +22,13 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { OrganisationsEinheitContainerComponent } from '@admin-client/organisations-einheit';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
 import { Component } from '@angular/core';
 
 @Component({
   selector: 'organisationseinheit-page',
   templateUrl: './organisationseinheit-page.component.html',
   standalone: true,
-  imports: [OrganisationsEinheitContainerComponent],
+  imports: [ OrganisationsEinheitContainerComponent, HasLinkPipe],
 })
 export class OrganisationsEinheitPageComponent {}
diff --git a/alfa-client/apps/alfa-e2e/docker-compose.yml b/alfa-client/apps/alfa-e2e/docker-compose.yml
index efbb27de90..cb3cff0ebb 100644
--- a/alfa-client/apps/alfa-e2e/docker-compose.yml
+++ b/alfa-client/apps/alfa-e2e/docker-compose.yml
@@ -154,7 +154,7 @@ services:
         soft: 65536
         hard: 65536
     healthcheck:
-      test: [ 'CMD-SHELL', "curl -s 'http://localhost:9200/_cat/health?h=status' | egrep -q '(green|yellow)'" ]
+      test: ['CMD-SHELL', "curl -s 'http://localhost:9200/_cat/health?h=status' | egrep -q '(green|yellow)'"]
       interval: 10s
       timeout: 10s
       retries: 5
@@ -195,7 +195,7 @@ services:
       - 7080:8080
       - 7081:8081
     healthcheck:
-      test: [ 'CMD-SHELL', 'wget --spider localhost:8081/version' ]
+      test: ['CMD-SHELL', 'wget --spider localhost:8081/version']
       interval: 5s
       timeout: 5s
       retries: 5
diff --git a/alfa-client/apps/alfa/src/app/app.component.ts b/alfa-client/apps/alfa/src/app/app.component.ts
index 559dcfd6e2..6a4820c703 100644
--- a/alfa-client/apps/alfa/src/app/app.component.ts
+++ b/alfa-client/apps/alfa/src/app/app.component.ts
@@ -24,7 +24,7 @@
 import { ApiRootFacade, ApiRootResource } from '@alfa-client/api-root-shared';
 import { ENVIRONMENT_CONFIG } from '@alfa-client/environment-shared';
 import { NavigationService } from '@alfa-client/navigation-shared';
-import { StateResource, isNotNull } from '@alfa-client/tech-shared';
+import { InjectorService, StateResource, isNotNull } from '@alfa-client/tech-shared';
 import { IconService } from '@alfa-client/ui';
 import { buildPathSegmentsFromLocalStorage } from '@alfa-client/vorgang-shared';
 import { Component, Inject, OnInit } from '@angular/core';
@@ -49,6 +49,7 @@ export class AppComponent implements OnInit {
     private iconService: IconService,
     private oAuthService: OAuthService,
     private navigationService: NavigationService,
+    private injectorService: InjectorService,
   ) {
     this.iconService.registerIcons();
   }
diff --git a/alfa-client/apps/alfa/src/app/app.module.ts b/alfa-client/apps/alfa/src/app/app.module.ts
index d8e90a9d20..566ebc0b3f 100644
--- a/alfa-client/apps/alfa/src/app/app.module.ts
+++ b/alfa-client/apps/alfa/src/app/app.module.ts
@@ -29,11 +29,14 @@ import { HintSharedModule } from '@alfa-client/hint-shared';
 import { NavigationModule } from '@alfa-client/navigation';
 import { OzgCloudUrlSerializer } from '@alfa-client/navigation-shared';
 import { ResourceRedirectComponent } from '@alfa-client/resource-redirect';
-import { UiModule } from '@alfa-client/ui';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { registerLocaleData } from '@angular/common';
-import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
+import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
 import localeDe from '@angular/common/locales/de';
 import { LOCALE_ID, NgModule } from '@angular/core';
+import { DateFnsAdapter } from '@angular/material-date-fns-adapter';
+import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
+import { MatIconModule } from '@angular/material/icon';
 import { BrowserModule } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { RouterModule, Routes, UrlSerializer } from '@angular/router';
@@ -42,11 +45,29 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store';
 import { StoreModule } from '@ngrx/store';
 import { StoreDevtoolsModule } from '@ngrx/store-devtools';
 import { OAuthModule } from 'angular-oauth2-oidc';
+import { de } from 'date-fns/locale';
+import { HttpBinaryFileInterceptor } from '../../../../libs/tech-shared/src/lib/interceptor/http-binary-file.interceptor';
+import { HttpXsrfInterceptor } from '../../../../libs/tech-shared/src/lib/interceptor/http-xsrf.interceptor';
+import { XhrInterceptor } from '../../../../libs/tech-shared/src/lib/interceptor/xhr.interceptor';
+import { HttpConnectionTimeoutInterceptor } from '../../../../libs/ui/src/lib/interceptor/http-connection-timeout.interceptor';
+import { HttpErrorInterceptor } from '../../../../libs/ui/src/lib/interceptor/http-error.interceptor';
 import { environment } from '../environments/environment';
 import { AppComponent } from './app.component';
 
 registerLocaleData(localeDe);
 
+export const CUSTOM_DATE_FORMATS = {
+  parse: {
+    dateInput: 'dd.MM.yyyy',
+  },
+  display: {
+    dateInput: 'dd.MM.yyyy',
+    monthYearLabel: 'MMM yyyy',
+    dateA11yLabel: 'dd.MM.yyyy',
+    monthYearA11yLabel: 'MM yyyy',
+  },
+};
+
 const routes: Routes = [
   {
     path: '',
@@ -61,13 +82,13 @@ const routes: Routes = [
 @NgModule({
   declarations: [AppComponent],
   imports: [
+    MatIconModule,
     BrowserModule,
     BrowserAnimationsModule,
     RouterModule.forRoot(routes, {
       initialNavigation: 'disabled',
       onSameUrlNavigation: 'reload',
     }),
-    UiModule,
     EnvironmentModule,
     OAuthModule.forRoot({
       resourceServer: {
@@ -94,10 +115,49 @@ const routes: Routes = [
     // Workaround: load any module depending on ApiRootActions.loadApiRootSuccess
     // TODO Check if a future NgRx version will solve Lazy Loading + Effects.forFeature()
     HintSharedModule,
+    SpinnerComponent,
   ],
   providers: [
     { provide: LOCALE_ID, useValue: 'de' },
     { provide: UrlSerializer, useClass: OzgCloudUrlSerializer },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: HttpErrorInterceptor,
+      multi: true,
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: HttpConnectionTimeoutInterceptor,
+      multi: true,
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: XhrInterceptor,
+      multi: true,
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: HttpXsrfInterceptor,
+      multi: true,
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: HttpBinaryFileInterceptor,
+      multi: true,
+    },
+    {
+      provide: MAT_DATE_LOCALE,
+      useValue: de,
+    },
+    {
+      provide: MAT_DATE_FORMATS,
+      useValue: CUSTOM_DATE_FORMATS,
+    },
+    {
+      provide: DateAdapter,
+      useClass: DateFnsAdapter,
+      deps: [MAT_DATE_LOCALE],
+    },
     provideHttpClient(withInterceptorsFromDi()),
   ],
   bootstrap: [AppComponent],
diff --git a/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.spec.ts b/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.spec.ts
index 1f417e5feb..6fe7f6ec6a 100644
--- a/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.spec.ts
+++ b/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.spec.ts
@@ -17,8 +17,8 @@ describe('MenuComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MenuComponent],
-      declarations: [HasLinkPipe, MockComponent(NavItemComponent), MockComponent(MailboxIconComponent)],
+      imports: [MenuComponent, HasLinkPipe],
+      declarations: [MockComponent(NavItemComponent), MockComponent(MailboxIconComponent)],
     }).compileComponents();
 
     fixture = TestBed.createComponent(MenuComponent);
diff --git a/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.ts b/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.ts
index 19cc60bab4..0c9cddefff 100644
--- a/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.ts
+++ b/alfa-client/libs/admin/configuration/src/lib/menu-container/menu/menu.component.ts
@@ -1,5 +1,5 @@
 import { ConfigurationLinkRel, ConfigurationResource } from '@admin-client/configuration-shared';
-import { StateResource, TechSharedModule } from '@alfa-client/tech-shared';
+import { HasLinkPipe, StateResource } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
 import { MailboxIconComponent, NavItemComponent, StatisticIconComponent } from '@ods/system';
@@ -7,7 +7,7 @@ import { MailboxIconComponent, NavItemComponent, StatisticIconComponent } from '
 @Component({
   selector: 'admin-menu',
   standalone: true,
-  imports: [CommonModule, NavItemComponent, MailboxIconComponent, TechSharedModule, StatisticIconComponent],
+  imports: [CommonModule, NavItemComponent, MailboxIconComponent, StatisticIconComponent, HasLinkPipe],
   templateUrl: './menu.component.html',
 })
 export class MenuComponent {
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.spec.ts
index 5fd68cc789..562b00dafa 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.spec.ts
@@ -25,7 +25,7 @@ import { OrganisationsEinheitContainerComponent } from '@admin-client/organisati
 import { AdminOrganisationsEinheit, AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared';
 import { createStateResource, StateResource, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
 import { existsAsHtmlElement, getMockComponent, Mock, mock } from '@alfa-client/test-utils';
-import { OzgcloudDialogService, UiModule } from '@alfa-client/ui';
+import { OzgcloudDialogService } from '@alfa-client/ui';
 import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared';
 import { CommonModule } from '@angular/common';
 import { ViewContainerRef } from '@angular/core';
@@ -66,7 +66,7 @@ describe('OrganisationsEinheitContainerComponent', () => {
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       declarations: [ToEmbeddedResourcesPipe],
-      imports: [CommonModule, UiModule, OrganisationsEinheitContainerComponent, MockComponent(OrganisationsEinheitListComponent)],
+      imports: [CommonModule, OrganisationsEinheitContainerComponent, MockComponent(OrganisationsEinheitListComponent)],
       providers: [
         { provide: AdminOrganisationsEinheitService, useValue: organisationsEinheitService },
         { provide: OzgcloudDialogService, useValue: dialogService },
@@ -85,7 +85,16 @@ describe('OrganisationsEinheitContainerComponent', () => {
 
   describe('component', () => {
     describe('ngOnInit', () => {
-      it('should call organisationsEinheitService getAll', (done) => {
+      it('should call organisationsEinheitService getList', (done) => {
+        component.ngOnInit();
+
+        component.organisationsEinheitenStateResource$.subscribe(() => {
+          expect(organisationsEinheitService.getAll).toHaveBeenCalled();
+          done();
+        });
+      });
+
+      it('should set organisationsEinheitListStateResource$', (done) => {
         component.ngOnInit();
 
         component.organisationsEinheitenStateResource$.subscribe(() => {
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.ts
index a1b124b07e..e12a8a85f7 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-container.component.ts
@@ -7,9 +7,8 @@ import {
   ResourceSearchService,
   SearchResourceServiceConfig,
   StateResource,
-  TechSharedModule,
 } from '@alfa-client/tech-shared';
-import { OzgcloudDialogService, UiModule } from '@alfa-client/ui';
+import { OzgcloudDialogService, SpinnerComponent } from '@alfa-client/ui';
 import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle';
 import {
   OrganisationsEinheitListResource,
@@ -31,12 +30,11 @@ import { OrganisationsEinheitListComponent } from './organisations-einheit-list/
   standalone: true,
   imports: [
     CommonModule,
-    UiModule,
     ZustaendigeStelleModule,
     ZustaendigeStelleSharedModule,
     OrganisationsEinheitListComponent,
-    TechSharedModule,
     ButtonComponent,
+    SpinnerComponent,
   ],
   providers: [
     {
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
index 6fd9e1d7f9..dd2fba6125 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts
@@ -22,14 +22,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { existsAsHtmlElement, getElementFromFixture, mock } from '@alfa-client/test-utils';
 import { CommonModule } from '@angular/common';
 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 { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
-import { MockComponent, MockModule } from 'ng-mocks';
+import { MockComponent } from 'ng-mocks';
 import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit';
 import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component';
 
@@ -48,13 +48,12 @@ describe('OrganisationsEinheitListComponent', () => {
           useValue: mock(ActivatedRoute),
         },
       ],
-      imports: [
-        CommonModule,
+      imports: [CommonModule, ConvertForDataTestPipe],
+      declarations: [
         OrganisationsEinheitListComponent,
         MockComponent(ListComponent),
         MockComponent(ListItemComponent),
         MockComponent(ExclamationIconComponent),
-        MockModule(MatTooltipModule),
       ],
     }).compileComponents();
 
diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
index 349085056b..7efc0bbbe6 100644
--- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
+++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
 import { ExclamationIconComponent, ListComponent, ListItemComponent, TooltipDirective } from '@ods/system';
@@ -31,7 +31,15 @@ import { ExclamationIconComponent, ListComponent, ListItemComponent, TooltipDire
   selector: 'admin-organisations-einheit-list',
   templateUrl: './organisations-einheit-list.component.html',
   standalone: true,
-  imports: [CommonModule, ListComponent, ListItemComponent, ExclamationIconComponent, TooltipDirective, TechSharedModule],
+  imports: [
+    CommonModule,
+    ListComponent,
+    ListItemComponent,
+    ExclamationIconComponent,
+    TooltipDirective,
+    ToResourceUriPipe,
+    ConvertForDataTestPipe,
+  ],
 })
 export class OrganisationsEinheitListComponent {
   @Input() public organisationsEinheitList: AdminOrganisationsEinheit[] = [];
diff --git a/alfa-client/libs/bescheid/src/lib/bescheid.module.ts b/alfa-client/libs/bescheid/src/lib/bescheid.module.ts
index 1e6f131245..f6df6b162c 100644
--- a/alfa-client/libs/bescheid/src/lib/bescheid.module.ts
+++ b/alfa-client/libs/bescheid/src/lib/bescheid.module.ts
@@ -24,8 +24,7 @@
 import { BescheidSharedModule } from '@alfa-client/bescheid-shared';
 import { BinaryFileModule } from '@alfa-client/binary-file';
 import { CommandSharedModule } from '@alfa-client/command-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { GetUrlPipe, HasLinkPipe, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import {
@@ -35,6 +34,22 @@ import {
   TextareaEditorComponent,
   TextEditorComponent,
 } from '@ods/component';
+import { BescheidInVorgangContainerComponent } from './bescheid-in-vorgang-container/bescheid-in-vorgang-container.component';
+import { BescheidInVorgangComponent } from './bescheid-in-vorgang-container/bescheid-in-vorgang/bescheid-in-vorgang.component';
+import { BescheidListInVorgangContainerComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang-container.component';
+import { BescheidListInVorgangComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang/bescheid-list-in-vorgang.component';
+import { DocumentInBescheidContainerComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang/document-in-bescheid-container/document-in-bescheid-container.component';
+import { BeschiedenDateContainerComponent } from './beschieden-date-in-vorgang-container/beschieden-date-container/beschieden-date-container.component';
+import { BeschiedenDateInVorgangContainerComponent } from './beschieden-date-in-vorgang-container/beschieden-date-in-vorgang-container.component';
+
+import {
+  DateEditorComponent,
+  ExpansionPanelComponent,
+  OzgcloudStrokedButtonWithSpinnerComponent,
+  SpinnerComponent,
+} from '@alfa-client/ui';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
 import {
   AttachmentComponent,
   AttachmentWrapperComponent,
@@ -51,11 +66,7 @@ import {
   SpinnerIconComponent,
   StampIconComponent,
 } from '@ods/system';
-import { BescheidInVorgangContainerComponent } from './bescheid-in-vorgang-container/bescheid-in-vorgang-container.component';
-import { BescheidInVorgangComponent } from './bescheid-in-vorgang-container/bescheid-in-vorgang/bescheid-in-vorgang.component';
-import { BescheidListInVorgangContainerComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang-container.component';
-import { BescheidListInVorgangComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang/bescheid-list-in-vorgang.component';
-import { DocumentInBescheidContainerComponent } from './bescheid-list-in-vorgang-container/bescheid-list-in-vorgang/document-in-bescheid-container/document-in-bescheid-container.component';
+import { FormatFullDatePipe } from '../../../tech-shared/src/lib/pipe/format-full-date.pipe';
 import { BescheidWizardContainerComponent } from './bescheid-wizard-container/bescheid-wizard-container.component';
 import { BescheidWizardAbschliessenButtonComponent } from './bescheid-wizard-container/bescheid-wizard/antrag-bescheiden/abschliessen-button/bescheid-wizard-abschliessen-button.component';
 import { BescheidWizardAbschliessenDialogContainerComponent } from './bescheid-wizard-container/bescheid-wizard/antrag-bescheiden/abschliessen-dialog-container/bescheid-wizard-abschliessen-dialog-container.component';
@@ -88,16 +99,12 @@ import { BescheidWizardUploadAttachmentButtonComponent } from './bescheid-wizard
 import { BescheidWizardUploadDocumentButtonContainerComponent } from './bescheid-wizard-container/bescheid-wizard/upload-document-button-container/bescheid-wizard-upload-document-button-container.component';
 import { BescheidWizardUploadDocumentButtonComponent } from './bescheid-wizard-container/bescheid-wizard/upload-document-button-container/upload-document-button/bescheid-wizard-upload-document-button.component';
 import { BescheidWizardWeiterButtonComponent } from './bescheid-wizard-container/bescheid-wizard/weiter-button/bescheid-wizard-weiter-button.component';
-import { BeschiedenDateContainerComponent } from './beschieden-date-in-vorgang-container/beschieden-date-container/beschieden-date-container.component';
-import { BeschiedenDateInVorgangContainerComponent } from './beschieden-date-in-vorgang-container/beschieden-date-in-vorgang-container.component';
 
 @NgModule({
   imports: [
     CommonModule,
     BescheidSharedModule,
     BinaryFileModule,
-    TechSharedModule,
-    UiModule,
     CommandSharedModule,
     BescheidStatusTextComponent,
     BescheidWrapperComponent,
@@ -106,6 +113,17 @@ import { BeschiedenDateInVorgangContainerComponent } from './beschieden-date-in-
     ButtonWithSpinnerComponent,
     RadioButtonCardComponent,
     ButtonComponent,
+    FormatFullDatePipe,
+    HasLinkPipe,
+    GetUrlPipe,
+    ToEmbeddedResourcesPipe,
+    SpinnerComponent,
+    ExpansionPanelComponent,
+    AttachmentWrapperComponent,
+    MatIcon,
+    DateEditorComponent,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    ReactiveFormsModule,
     ButtonCardComponent,
     BescheidGenerateIconComponent,
     SingleFileUploadEditorComponent,
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 98650f90ed..27377b3854 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
@@ -28,26 +28,22 @@ import {
   HttpErrorHandler,
   HttpHeader,
   ListResource,
-  TechSharedModule,
 } from '@alfa-client/tech-shared';
 import { mock, mockClass, useFromMock } from '@alfa-client/test-utils';
 import { HttpClient, HttpHeaders } from '@angular/common/http';
 import { faker } from '@faker-js/faker';
 import { Resource, ResourceFactory, ResourceUri, getUrl } from '@ngxp/rest';
 import { cold, hot } from 'jest-marbles';
+import { InjectorService } from 'libs/tech-shared/src/lib/injector/injector.service';
 import { DummyLinkRel } from 'libs/tech-shared/test/dummy';
 import { createDummyListResource, createDummyResource } from 'libs/tech-shared/test/resource';
 import { Observable, of } from 'rxjs';
-import {
-  createBinaryFileResource,
-  createBlob,
-  createGetRequestOptions,
-} from '../../test/binary-file';
+import { createBinaryFileResource, createBlob, createGetRequestOptions } from '../../test/binary-file';
 import { BinaryFileLinkRel } from './binary-file.linkrel';
 import { BinaryFileResource } from './binary-file.model';
 import { BinaryFileRepository } from './binary-file.repository';
 
-import * as HttpUtil from '../../../tech-shared/src/lib/http.util';
+import * as HttpUtil from 'libs/tech-shared/src/lib/http.util';
 
 describe('BinaryFileRepository', () => {
   let repository: BinaryFileRepository;
@@ -66,7 +62,7 @@ describe('BinaryFileRepository', () => {
   });
 
   function mockInterceptor(): void {
-    mockClass(TechSharedModule).injector = <any>{ get: () => useFromMock(mock(HttpErrorHandler)) };
+    mockClass(InjectorService).injector = <any>{ get: () => useFromMock(mock(HttpErrorHandler)) };
   }
 
   it('should be created', () => {
@@ -102,9 +98,7 @@ describe('BinaryFileRepository', () => {
 
   describe('download', () => {
     const blob = {};
-    const binaryFileResource: BinaryFileResource = createBinaryFileResource([
-      BinaryFileLinkRel.DOWNLOAD,
-    ]);
+    const binaryFileResource: BinaryFileResource = createBinaryFileResource([BinaryFileLinkRel.DOWNLOAD]);
 
     beforeEach(() => {
       httpClient.get.mockReturnValue(hot('a', { a: blob }));
@@ -117,10 +111,7 @@ describe('BinaryFileRepository', () => {
 
       repository.download(binaryFileResource);
 
-      expect(httpClient.get).toHaveBeenCalledWith(
-        getUrl(binaryFileResource, BinaryFileLinkRel.DOWNLOAD),
-        requestOptions,
-      );
+      expect(httpClient.get).toHaveBeenCalledWith(getUrl(binaryFileResource, BinaryFileLinkRel.DOWNLOAD), requestOptions);
     });
 
     it('should return value', () => {
@@ -189,10 +180,7 @@ describe('BinaryFileRepository', () => {
     });
 
     function getExpectedRequestOptions(): HttpHeaders {
-      return new HttpHeaders().set(HttpHeader.ACCEPT, [
-        ContentType.APPLICATION_PDF,
-        ContentType.APPLICATION_JSON,
-      ]);
+      return new HttpHeaders().set(HttpHeader.ACCEPT, [ContentType.APPLICATION_PDF, ContentType.APPLICATION_JSON]);
     }
   });
 
diff --git a/alfa-client/libs/binary-file/src/lib/binary-file.module.ts b/alfa-client/libs/binary-file/src/lib/binary-file.module.ts
index ee4cacdb5f..9327cbb0be 100644
--- a/alfa-client/libs/binary-file/src/lib/binary-file.module.ts
+++ b/alfa-client/libs/binary-file/src/lib/binary-file.module.ts
@@ -21,10 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { ConvertForDataTestPipe, FileSizePipe, HasLinkPipe, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
+import { IconButtonWithSpinnerComponent, SpinnerComponent } from '@alfa-client/ui';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
 import { DownloadButtonComponent } from '@ods/component';
 import {
   AttachmentComponent,
@@ -34,6 +36,8 @@ import {
   SpinnerIconComponent,
   TooltipDirective,
 } from '@ods/system';
+import { FileSizePlainPipe } from '../../../tech-shared/src/lib/pipe/file-size-plain.pipe';
+import { FileUploadEditorComponent } from '../../../ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component';
 import { BinaryFileAttachmentContainerComponent } from './binary-file-attachment-container/binary-file-attachment-container.component';
 import { BinaryFileContainerComponent } from './binary-file-container/binary-file-container.component';
 import { BinaryFileComponent } from './binary-file-container/binary-file/binary-file.component';
@@ -49,14 +53,22 @@ import { VerticalBinaryFileListComponent } from './vertical-binary-file-list/ver
 @NgModule({
   imports: [
     CommonModule,
-    UiModule,
-    TechSharedModule,
     AttachmentComponent,
     AttachmentHeaderComponent,
     AttachmentWrapperComponent,
     SpinnerIconComponent,
     CloseIconComponent,
     DownloadButtonComponent,
+    FileUploadEditorComponent,
+    HasLinkPipe,
+    MatTooltip,
+    MatIcon,
+    SpinnerComponent,
+    IconButtonWithSpinnerComponent,
+    FileSizePipe,
+    ConvertForDataTestPipe,
+    ToEmbeddedResourcesPipe,
+    FileSizePlainPipe,
     TooltipDirective,
   ],
   declarations: [
diff --git a/alfa-client/libs/collaboration/src/lib/collaboration.module.ts b/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
index a99b23f737..62308b9704 100644
--- a/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
+++ b/alfa-client/libs/collaboration/src/lib/collaboration.module.ts
@@ -22,8 +22,8 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { CollaborationSharedModule } from '@alfa-client/collaboration-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
@@ -63,7 +63,6 @@ import { CollaborationRequestFormComponent } from './collaboration-in-vorgang-co
     TextareaEditorComponent,
     FormsModule,
     ReactiveFormsModule,
-    TechSharedModule,
     ButtonWithSpinnerComponent,
     ZustaendigeStelleModule,
     OfficeIconComponent,
@@ -71,7 +70,8 @@ import { CollaborationRequestFormComponent } from './collaboration-in-vorgang-co
     PublicAdministrationIconComponent,
     OrganisationsEinheitListItemContainerComponent,
     ExterneFachstelleListItemContainerComponent,
-    UiModule,
+    HasLinkPipe,
+    SpinnerComponent,
   ],
   declarations: [
     CollaborationInVorgangContainerComponent,
diff --git a/alfa-client/libs/common/src/lib/build-info/build-info.component.spec.ts b/alfa-client/libs/common/src/lib/build-info/build-info.component.spec.ts
index 0f8d5ff013..a47f70b4bf 100644
--- a/alfa-client/libs/common/src/lib/build-info/build-info.component.spec.ts
+++ b/alfa-client/libs/common/src/lib/build-info/build-info.component.spec.ts
@@ -47,8 +47,7 @@ describe('BuildInfoComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [BuildInfoComponent],
-      declarations: [FormatDateWithTimePipe],
+      imports: [BuildInfoComponent, FormatDateWithTimePipe],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/design-component/src/lib/form/checkbox-editor/checkbox-editor.component.ts b/alfa-client/libs/design-component/src/lib/form/checkbox-editor/checkbox-editor.component.ts
index 121f52bb8d..dfab859671 100644
--- a/alfa-client/libs/design-component/src/lib/form/checkbox-editor/checkbox-editor.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/checkbox-editor/checkbox-editor.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
 import { CheckboxComponent } from '@ods/system';
@@ -31,7 +31,7 @@ import { ValidationErrorComponent } from '../validation-error/validation-error.c
 @Component({
   selector: 'ods-checkbox-editor',
   standalone: true,
-  imports: [CheckboxComponent, ValidationErrorComponent, TechSharedModule, ReactiveFormsModule],
+  imports: [CheckboxComponent, ValidationErrorComponent, ReactiveFormsModule, ConvertForDataTestPipe],
   templateUrl: './checkbox-editor.component.html',
 })
 export class CheckboxEditorComponent extends FormControlEditorAbstractComponent {
diff --git a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.spec.ts b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.spec.ts
index e23d68f4fd..9bb05063e4 100644
--- a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.spec.ts
+++ b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.spec.ts
@@ -21,15 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule, createEmptyStateResource } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, createEmptyStateResource } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import {
-  AbstractControl,
-  FormGroupDirective,
-  ReactiveFormsModule,
-  UntypedFormBuilder,
-} from '@angular/forms';
+import { AbstractControl, FormGroupDirective, ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
 import { FileUploadButtonComponent, SpinnerIconComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
@@ -48,12 +43,8 @@ describe('FileUploadEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        FileUploadEditorComponent,
-        MockComponent(SpinnerIconComponent),
-        MockComponent(FileUploadButtonComponent),
-      ],
-      imports: [ReactiveFormsModule, TechSharedModule],
+      declarations: [FileUploadEditorComponent, MockComponent(SpinnerIconComponent), MockComponent(FileUploadButtonComponent)],
+      imports: [ReactiveFormsModule, ConvertForDataTestPipe],
       providers: [
         {
           provide: FormGroupDirective,
diff --git a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.ts b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.ts
index 0a9f5a53ef..2a412d827f 100644
--- a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.ts
@@ -21,22 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { StateResource, TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, StateResource } from '@alfa-client/tech-shared';
 import { NgForOf } from '@angular/common';
 import { Component, EventEmitter, HostListener, Input, OnInit, Output } from '@angular/core';
-import {
-  ControlContainer,
-  FormGroupDirective,
-  ReactiveFormsModule,
-  UntypedFormArray,
-  UntypedFormControl,
-} from '@angular/forms';
+import { ControlContainer, FormGroupDirective, ReactiveFormsModule, UntypedFormArray, UntypedFormControl } from '@angular/forms';
 import { Resource } from '@ngxp/rest';
-import {
-  AttachmentIconComponent,
-  FileUploadButtonComponent,
-  SpinnerIconComponent,
-} from '@ods/system';
+import { AttachmentIconComponent, FileUploadButtonComponent, SpinnerIconComponent } from '@ods/system';
 import { uniqueId } from 'lodash-es';
 import { FormControlEditorAbstractComponent } from '../formcontrol-editor.abstract.component';
 
@@ -51,13 +41,10 @@ import { FormControlEditorAbstractComponent } from '../formcontrol-editor.abstra
     SpinnerIconComponent,
     ReactiveFormsModule,
     NgForOf,
-    TechSharedModule,
+    ConvertForDataTestPipe,
   ],
 })
-export class FileUploadEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements OnInit
-{
+export class FileUploadEditorComponent extends FormControlEditorAbstractComponent implements OnInit {
   @Input() label: string = '';
   @Input() parentFormArrayName: string;
   @Input() accept: string = '*/*';
@@ -88,9 +75,7 @@ export class FileUploadEditorComponent
 
   buildFormArray(fileLinkList: string[]): void {
     this.fileLinkControls.clear();
-    fileLinkList.forEach((link: string) =>
-      this.fileLinkControls.push(new UntypedFormControl(link)),
-    );
+    fileLinkList.forEach((link: string) => this.fileLinkControls.push(new UntypedFormControl(link)));
   }
 
   upload(file: File): void {
diff --git a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.ts b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.ts
index 4ae84174d1..a62e384fb3 100644
--- a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule, isNotNil } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, isNotNil } from '@alfa-client/tech-shared';
 import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
 import { FileUploadButtonComponent, SpinnerIconComponent } from '@ods/system';
@@ -32,7 +32,7 @@ import { FormControlEditorAbstractComponent } from '../formcontrol-editor.abstra
   selector: 'ods-single-file-upload-editor',
   templateUrl: './single-file-upload-editor.component.html',
   standalone: true,
-  imports: [FileUploadButtonComponent, SpinnerIconComponent, ReactiveFormsModule, TechSharedModule],
+  imports: [FileUploadButtonComponent, SpinnerIconComponent, ReactiveFormsModule, ConvertForDataTestPipe],
 })
 export class SingleFileUploadEditorComponent extends FormControlEditorAbstractComponent {
   @Input() label: string = '';
diff --git a/alfa-client/libs/design-component/src/lib/form/text-editor/text-editor.component.ts b/alfa-client/libs/design-component/src/lib/form/text-editor/text-editor.component.ts
index 88059147b4..cfdd66512d 100644
--- a/alfa-client/libs/design-component/src/lib/form/text-editor/text-editor.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/text-editor/text-editor.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
@@ -32,13 +32,7 @@ import { ValidationErrorComponent } from '../validation-error/validation-error.c
 @Component({
   selector: 'ods-text-editor',
   standalone: true,
-  imports: [
-    CommonModule,
-    ReactiveFormsModule,
-    TechSharedModule,
-    TextInputComponent,
-    ValidationErrorComponent,
-  ],
+  imports: [CommonModule, ReactiveFormsModule, TextInputComponent, ValidationErrorComponent, ConvertForDataTestPipe],
   templateUrl: './text-editor.component.html',
 })
 export class TextEditorComponent extends FormControlEditorAbstractComponent {
diff --git a/alfa-client/libs/design-component/src/lib/form/textarea-editor/textarea-editor.component.ts b/alfa-client/libs/design-component/src/lib/form/textarea-editor/textarea-editor.component.ts
index be0fc9b4f3..c7032ef03b 100644
--- a/alfa-client/libs/design-component/src/lib/form/textarea-editor/textarea-editor.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/textarea-editor/textarea-editor.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
@@ -32,13 +32,7 @@ import { ValidationErrorComponent } from '../validation-error/validation-error.c
 @Component({
   selector: 'ods-textarea-editor',
   standalone: true,
-  imports: [
-    CommonModule,
-    ReactiveFormsModule,
-    TechSharedModule,
-    TextareaComponent,
-    ValidationErrorComponent,
-  ],
+  imports: [CommonModule, ReactiveFormsModule, TextareaComponent, ValidationErrorComponent, ConvertForDataTestPipe],
   templateUrl: './textarea-editor.component.html',
 })
 export class TextareaEditorComponent extends FormControlEditorAbstractComponent {
diff --git a/alfa-client/libs/design-system/run_helm_test.sh b/alfa-client/libs/design-system/run_helm_test.sh
old mode 100755
new mode 100644
diff --git a/alfa-client/libs/design-system/src/lib/dropdown-menu/dropdown-menu-link-item/dropdown-menu-link-item.component.ts b/alfa-client/libs/design-system/src/lib/dropdown-menu/dropdown-menu-link-item/dropdown-menu-link-item.component.ts
index 52b3e46d6a..045191b56a 100644
--- a/alfa-client/libs/design-system/src/lib/dropdown-menu/dropdown-menu-link-item/dropdown-menu-link-item.component.ts
+++ b/alfa-client/libs/design-system/src/lib/dropdown-menu/dropdown-menu-link-item/dropdown-menu-link-item.component.ts
@@ -5,7 +5,7 @@ import { LinkComponent } from '../../link/link.component';
 @Component({
   selector: 'ods-dropdown-menu-link-item',
   standalone: true,
-  imports: [LinkComponent, OpenLinkIconComponent],
+  imports: [OpenLinkIconComponent, LinkComponent],
   styles: [':host {@apply first:mt-2}'],
   template: ` <ods-link [url]="url" class="bg-whitetext" [openInNewTab]="true">
     <div class="flex items-center gap-2 px-4 py-3">
diff --git a/alfa-client/libs/design-system/src/lib/form/checkbox/checkbox.component.ts b/alfa-client/libs/design-system/src/lib/form/checkbox/checkbox.component.ts
index 120fa956bb..ffadf796c9 100644
--- a/alfa-client/libs/design-system/src/lib/form/checkbox/checkbox.component.ts
+++ b/alfa-client/libs/design-system/src/lib/form/checkbox/checkbox.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
 import { FormControl, ReactiveFormsModule } from '@angular/forms';
@@ -29,7 +29,7 @@ import { FormControl, ReactiveFormsModule } from '@angular/forms';
 @Component({
   selector: 'ods-checkbox',
   standalone: true,
-  imports: [CommonModule, ReactiveFormsModule, TechSharedModule],
+  imports: [CommonModule, ReactiveFormsModule, ConvertForDataTestPipe],
   template: `
     <div>
       <div class="relative flex items-start gap-3 text-start">
diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
index 0972a93d2b..fee4fa492f 100644
--- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
@@ -37,7 +37,7 @@ describe('FileUploadButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [FileUploadButtonComponent, TechSharedModule],
+      imports: [FileUploadButtonComponent, ConvertForDataTestPipe],
     }).compileComponents();
 
     fixture = TestBed.createComponent(FileUploadButtonComponent);
diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
index 8a1f968b27..3e111b19ad 100644
--- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
+++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts
@@ -21,14 +21,14 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, ElementRef, Input, ViewChild } from '@angular/core';
 
 @Component({
   selector: 'ods-file-upload-button',
   standalone: true,
-  imports: [CommonModule, TechSharedModule],
+  imports: [CommonModule, ConvertForDataTestPipe],
   styles: [':host {@apply inline-flex}'],
   templateUrl: './file-upload-button.component.html',
 })
diff --git a/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.spec.ts
index 6d1f5b7eb8..974db9b7c5 100644
--- a/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.spec.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { convertForDataTest } from '@alfa-client/tech-shared';
+import { convertForDataTest, ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormControl, ReactiveFormsModule } from '@angular/forms';
@@ -37,7 +37,7 @@ describe('TextInputComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [ReactiveFormsModule, TextInputComponent],
+      imports: [ReactiveFormsModule, TextInputComponent, ConvertForDataTestPipe],
     }).compileComponents();
 
     fixture = TestBed.createComponent(TextInputComponent);
diff --git a/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.ts b/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.ts
index 1b038667fb..5de77014fc 100644
--- a/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.ts
+++ b/alfa-client/libs/design-system/src/lib/form/text-input/text-input.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { convertForDataTest, EMPTY_STRING, TechSharedModule } from '@alfa-client/tech-shared';
+import { convertForDataTest, ConvertForDataTestPipe, EMPTY_STRING } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
 import { FormControl, ReactiveFormsModule } from '@angular/forms';
@@ -50,7 +50,7 @@ type TextInputVariants = VariantProps<typeof textInputVariants>;
 @Component({
   selector: 'ods-text-input',
   standalone: true,
-  imports: [CommonModule, ReactiveFormsModule, TechSharedModule],
+  imports: [CommonModule, ReactiveFormsModule, ConvertForDataTestPipe],
   template: `
     <div class="relative">
       <label *ngIf="showLabel" [for]="id" class="text-md mb-2 block font-medium text-text">
diff --git a/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.spec.ts
index 872bec5354..580f9cab71 100644
--- a/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.spec.ts
+++ b/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.spec.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { convertForDataTest } from '@alfa-client/tech-shared';
+import { convertForDataTest, ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormControl, ReactiveFormsModule } from '@angular/forms';
@@ -37,7 +37,7 @@ describe('TextareaComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [ReactiveFormsModule, TextareaComponent],
+      imports: [ReactiveFormsModule, TextareaComponent, ConvertForDataTestPipe],
     }).compileComponents();
 
     fixture = TestBed.createComponent(TextareaComponent);
diff --git a/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.ts b/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.ts
index d586185f3b..f3eb84af9d 100644
--- a/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.ts
+++ b/alfa-client/libs/design-system/src/lib/form/textarea/textarea.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { EMPTY_STRING, TechSharedModule, convertForDataTest } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, EMPTY_STRING, convertForDataTest } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, ElementRef, Input, ViewChild } from '@angular/core';
 import { FormControl, ReactiveFormsModule } from '@angular/forms';
@@ -50,7 +50,7 @@ type TextareaVariants = VariantProps<typeof textareaVariants>;
 @Component({
   selector: 'ods-textarea',
   standalone: true,
-  imports: [CommonModule, ReactiveFormsModule, TechSharedModule],
+  imports: [CommonModule, ReactiveFormsModule, ConvertForDataTestPipe],
   template: `
     <div class="mt-2">
       <label *ngIf="showLabel" [for]="id" class="text-md mb-2 block font-medium text-text">
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 81485f802c..f4fd0fc39d 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
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { convertForDataTest, TechSharedModule } from '@alfa-client/tech-shared';
+import { convertForDataTest, ConvertForDataTestPipe } 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';
@@ -37,7 +37,7 @@ describe('NavItemComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [NavItemComponent, TechSharedModule],
+      imports: [NavItemComponent, ConvertForDataTestPipe],
       providers: [
         {
           provide: Router,
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 ac28440c04..a3bd688e81 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
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { Component, HostBinding, Input } from '@angular/core';
 import { RouterLink, RouterLinkActive } from '@angular/router';
@@ -29,13 +29,11 @@ import { RouterLink, RouterLinkActive } from '@angular/router';
 @Component({
   selector: 'ods-nav-item',
   standalone: true,
-  imports: [CommonModule, RouterLink, RouterLinkActive, TechSharedModule],
+  imports: [CommonModule, RouterLink, RouterLinkActive, ConvertForDataTestPipe],
   template: `<a
     [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"
+    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-path-' + path | convertForDataTest"
   >
     <ng-content select="[icon]" />
diff --git a/alfa-client/libs/externe-fachstelle/src/lib/externe-fachstelle-list-item-container/externe-fachstelle-list-item/externe-fachstelle-list-item.component.ts b/alfa-client/libs/externe-fachstelle/src/lib/externe-fachstelle-list-item-container/externe-fachstelle-list-item/externe-fachstelle-list-item.component.ts
index 51d26eecb5..274c1b9090 100644
--- a/alfa-client/libs/externe-fachstelle/src/lib/externe-fachstelle-list-item-container/externe-fachstelle-list-item/externe-fachstelle-list-item.component.ts
+++ b/alfa-client/libs/externe-fachstelle/src/lib/externe-fachstelle-list-item-container/externe-fachstelle-list-item/externe-fachstelle-list-item.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { StateResource } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { ExterneFachstelleResource } from '@alfa-client/zustaendige-stelle-shared';
 import { Component, Input } from '@angular/core';
 import { ExternalUnitIconComponent, PublicAdministrationIconComponent } from '@ods/system';
@@ -30,7 +30,7 @@ import { ExternalUnitIconComponent, PublicAdministrationIconComponent } from '@o
 @Component({
   selector: 'alfa-externe-fachstelle-list-item',
   standalone: true,
-  imports: [PublicAdministrationIconComponent, ExternalUnitIconComponent, UiModule],
+  imports: [PublicAdministrationIconComponent, ExternalUnitIconComponent, SpinnerComponent],
   templateUrl: './externe-fachstelle-list-item.component.html',
 })
 export class ExterneFachstelleListItemComponent {
diff --git a/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.spec.ts
index 0bdb21fd38..8aab319a28 100644
--- a/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.spec.ts
+++ b/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.spec.ts
@@ -1,3 +1,4 @@
+import { HasLinkPipe } from '@alfa-client/tech-shared';
 import { existsAsHtmlElement, notExistsAsHtmlElement } from '@alfa-client/test-utils';
 import { VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
@@ -17,7 +18,7 @@ describe('ForwardByOzgcloudButtonContainerComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [ForwardByOzgcloudButtonContainerComponent],
+      imports: [ForwardByOzgcloudButtonContainerComponent, HasLinkPipe],
       declarations: [
         MockComponent(ButtonWithSpinnerComponent),
         MockComponent(ForwardVorgangIconComponent),
diff --git a/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.ts b/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.ts
index b00da7ddb3..f5fbad7ed1 100644
--- a/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.ts
+++ b/alfa-client/libs/forwarding/src/lib/forward-by-ozgcloud-button-container/forward-by-ozgcloud-button-container.component.ts
@@ -1,4 +1,4 @@
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
 import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { CommonModule } from '@angular/common';
 import { Component, Input } from '@angular/core';
@@ -8,7 +8,7 @@ import { ForwardVorgangIconComponent, TooltipDirective } from '@ods/system';
 @Component({
   selector: 'alfa-forward-by-ozgcloud-button-container',
   standalone: true,
-  imports: [CommonModule, TechSharedModule, ButtonWithSpinnerComponent, ForwardVorgangIconComponent, TooltipDirective],
+  imports: [CommonModule, ButtonWithSpinnerComponent, ForwardVorgangIconComponent, TooltipDirective, HasLinkPipe],
   templateUrl: './forward-by-ozgcloud-button-container.component.html',
   styles: [':host {@apply empty:hidden}'],
 })
diff --git a/alfa-client/libs/forwarding/src/lib/forwarding.module.ts b/alfa-client/libs/forwarding/src/lib/forwarding.module.ts
index 56ba3f3ad8..973cf7b7a1 100644
--- a/alfa-client/libs/forwarding/src/lib/forwarding.module.ts
+++ b/alfa-client/libs/forwarding/src/lib/forwarding.module.ts
@@ -21,12 +21,19 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
 import { CommandSharedModule } from '@alfa-client/command-shared';
 import { ForwardingSharedModule } from '@alfa-client/forwarding-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { FormatDateWithTimePipe, HasLinkPipe, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
+import {
+  ExpansionPanelComponent,
+  OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
+  SpinnerComponent,
+} from '@alfa-client/ui';
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
 import { VorgangForwardFormComponent } from './vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component';
 import { VorgangForwardFormularComponent } from './vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-formular.component';
 import { VorgangForwardingContainerComponent } from './vorgang-forwarding-container/vorgang-forwarding-container.component';
@@ -35,7 +42,20 @@ import { VorgangForwardingInfoComponent } from './vorgang-forwarding-container/v
 import { VorgangForwardZustellenContainerComponent } from './vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component';
 
 @NgModule({
-  imports: [CommonModule, TechSharedModule, ForwardingSharedModule, CommandSharedModule, UiModule],
+  imports: [
+    CommonModule,
+    ForwardingSharedModule,
+    CommandSharedModule,
+    OzgcloudTextEditorComponent,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    SpinnerComponent,
+    FormatDateWithTimePipe,
+    MatIcon,
+    HasLinkPipe,
+    ToEmbeddedResourcesPipe,
+    ExpansionPanelComponent,
+    ReactiveFormsModule,
+  ],
   declarations: [
     VorgangForwardZustellenContainerComponent,
     VorgangForwardingContainerComponent,
diff --git a/alfa-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts b/alfa-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
index 19d141bc8d..d4de767de8 100644
--- a/alfa-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
+++ b/alfa-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts
@@ -21,15 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { mock } from '@alfa-client/test-utils';
+import { OzgcloudStrokedButtonWithSpinnerComponent, OzgcloudTextEditorComponent } from '@alfa-client/ui';
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
 import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatIcon } from '@angular/material/icon';
 import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { mock } from '@alfa-client/test-utils';
-import { OzgcloudStrokedButtonWithSpinnerComponent, TextEditorComponent } from '@alfa-client/ui';
-import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
 import { VorgangForwardFormComponent } from './vorgang-forward-form.component';
@@ -54,7 +54,7 @@ describe('VorgangForwardFormComponent', () => {
         VorgangForwardFormComponent,
         MatIcon,
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
-        MockComponent(TextEditorComponent),
+        MockComponent(OzgcloudTextEditorComponent),
       ],
       imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule, BrowserAnimationsModule],
       providers: [
@@ -112,10 +112,7 @@ describe('VorgangForwardFormComponent', () => {
 
       component.patchEmail();
 
-      expect(formService.patchField).toHaveBeenCalledWith(
-        'email',
-        vorgangWithEingang.eingang.zustaendigeStelle.email,
-      );
+      expect(formService.patchField).toHaveBeenCalledWith('email', vorgangWithEingang.eingang.zustaendigeStelle.email);
     });
   });
 });
diff --git a/alfa-client/libs/hint-shared/src/lib/hint-shared.module.ts b/alfa-client/libs/hint-shared/src/lib/hint-shared.module.ts
index e0304dd1d6..482c311a15 100644
--- a/alfa-client/libs/hint-shared/src/lib/hint-shared.module.ts
+++ b/alfa-client/libs/hint-shared/src/lib/hint-shared.module.ts
@@ -21,10 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ApiRootModule } from '@alfa-client/api-root-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
-import { ApiRootModule } from '@alfa-client/api-root-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
 import { EffectsModule } from '@ngrx/effects';
 import { StoreModule } from '@ngrx/store';
 import { HintEffects } from './+state/hint.effects';
@@ -38,7 +37,6 @@ import { HintService } from './hint.service';
     CommonModule,
     StoreModule.forFeature(HINT_FEATURE_KEY, reducer),
     EffectsModule.forFeature([HintEffects]),
-    TechSharedModule,
     ApiRootModule,
   ],
   providers: [HintService, HintFacade, HintRepository],
diff --git a/alfa-client/libs/hint/src/lib/hint.module.ts b/alfa-client/libs/hint/src/lib/hint.module.ts
index 37fa3fb082..d72695756d 100644
--- a/alfa-client/libs/hint/src/lib/hint.module.ts
+++ b/alfa-client/libs/hint/src/lib/hint.module.ts
@@ -21,16 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
 import { ApiRootModule } from '@alfa-client/api-root-shared';
 import { HintSharedModule } from '@alfa-client/hint-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
 import { HintContainerComponent } from './hint-container/hint-container.component';
 import { UserNoOrganisationsEinheitIdHintComponent } from './hint-container/user-no-organisations-einheit-id-hint/user-no-organisations-einheit-id-hint.component';
 
 @NgModule({
-  imports: [CommonModule, TechSharedModule, ApiRootModule, HintSharedModule],
+  imports: [CommonModule, ApiRootModule, HintSharedModule],
   declarations: [UserNoOrganisationsEinheitIdHintComponent, HintContainerComponent],
   exports: [HintContainerComponent],
 })
diff --git a/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-bescheid/historie-item-bescheid-status/historie-item-bescheid-status.component.spec.ts b/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-bescheid/historie-item-bescheid-status/historie-item-bescheid-status.component.spec.ts
index a47331f870..cea37b23a9 100644
--- a/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-bescheid/historie-item-bescheid-status/historie-item-bescheid-status.component.spec.ts
+++ b/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-bescheid/historie-item-bescheid-status/historie-item-bescheid-status.component.spec.ts
@@ -42,7 +42,8 @@ describe('HistorieItemBescheidStatusComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [HistorieItemBescheidStatusComponent, ConvertToBooleanPipe, FormatFullDatePipe],
+      imports: [ConvertToBooleanPipe, FormatFullDatePipe],
+      declarations: [HistorieItemBescheidStatusComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(HistorieItemBescheidStatusComponent);
diff --git a/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.spec.ts b/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.spec.ts
index 97a6910287..1fb501bf07 100644
--- a/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.spec.ts
+++ b/alfa-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.spec.ts
@@ -21,12 +21,12 @@
  * 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 { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormatDateWithTimePipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
 import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { registerLocaleData } from '@angular/common';
+import localeDe from '@angular/common/locales/de';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { HistorieItemVorgangCreatedComponent } from './historie-item-vorgang-created.component';
@@ -43,7 +43,8 @@ describe('HistorieItemVorgangCreatedComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [FormatDateWithTimePipe, HistorieItemVorgangCreatedComponent],
+      imports: [FormatDateWithTimePipe],
+      declarations: [HistorieItemVorgangCreatedComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/historie/src/lib/historie.module.ts b/alfa-client/libs/historie/src/lib/historie.module.ts
index 7c064391c2..c9675a3642 100644
--- a/alfa-client/libs/historie/src/lib/historie.module.ts
+++ b/alfa-client/libs/historie/src/lib/historie.module.ts
@@ -23,11 +23,20 @@
  */
 import { CommandSharedModule } from '@alfa-client/command-shared';
 import { HistorieSharedModule } from '@alfa-client/historie-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import {
+  ConvertToBooleanPipe,
+  FormatDateWithTimePipe,
+  FormatToPrettyDatePipe,
+  HasLinkPipe,
+  ToEmbeddedResourcesPipe,
+} from '@alfa-client/tech-shared';
+import { AccordionComponent, AppIconComponent, SpinnerComponent } from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { MatExpansionPanel, MatExpansionPanelTitle } from '@angular/material/expansion';
+import { MatIcon } from '@angular/material/icon';
+import { FormatFullDatePipe } from '../../../tech-shared/src/lib/pipe/format-full-date.pipe';
 import { HistorieContainerComponent } from './historie-container/historie-container.component';
 import { ExpansionPanelWithUserComponent } from './historie-container/historie-list/expansion-panel-with-user/expansion-panel-with-user.component';
 import { HistorieItemAktenzeichenComponent } from './historie-container/historie-list/historie-item-aktenzeichen/historie-item-aktenzeichen.component';
@@ -52,11 +61,21 @@ import { HistorieListComponent } from './historie-container/historie-list/histor
 @NgModule({
   imports: [
     CommonModule,
-    TechSharedModule,
     HistorieSharedModule,
     UserProfileModule,
-    UiModule,
     CommandSharedModule,
+    MatExpansionPanel,
+    MatExpansionPanelTitle,
+    MatIcon,
+    ConvertToBooleanPipe,
+    FormatFullDatePipe,
+    HasLinkPipe,
+    AppIconComponent,
+    FormatDateWithTimePipe,
+    FormatToPrettyDatePipe,
+    SpinnerComponent,
+    AccordionComponent,
+    ToEmbeddedResourcesPipe,
   ],
   declarations: [
     HistorieContainerComponent,
diff --git a/alfa-client/libs/kommentar-shared/src/lib/kommentar-shared.module.ts b/alfa-client/libs/kommentar-shared/src/lib/kommentar-shared.module.ts
index f87a70b3cb..de0954a3f8 100644
--- a/alfa-client/libs/kommentar-shared/src/lib/kommentar-shared.module.ts
+++ b/alfa-client/libs/kommentar-shared/src/lib/kommentar-shared.module.ts
@@ -21,12 +21,11 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 
 @NgModule({
-  imports: [CommonModule, TechSharedModule, VorgangSharedModule],
+  imports: [CommonModule, VorgangSharedModule],
 })
 export class KommentarSharedModule {}
diff --git a/alfa-client/libs/kommentar/src/lib/kommentar.module.ts b/alfa-client/libs/kommentar/src/lib/kommentar.module.ts
index 978a2bf16d..4c9da054be 100644
--- a/alfa-client/libs/kommentar/src/lib/kommentar.module.ts
+++ b/alfa-client/libs/kommentar/src/lib/kommentar.module.ts
@@ -21,14 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
 import { BinaryFileModule } from '@alfa-client/binary-file';
 import { KommentarSharedModule } from '@alfa-client/kommentar-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { ConvertForDataTestPipe, FormatDateWithTimePipe, HasLinkPipe } from '@alfa-client/tech-shared';
+import { ExpansionPanelComponent, OzgcloudStrokedButtonWithSpinnerComponent, TextAreaEditorComponent } from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
 import { KommentarFormComponent } from './kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component';
 import { KommentarListInVorgangContainerComponent } from './kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component';
 import { KommentarListInVorgangComponent } from './kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-in-vorgang.component';
@@ -38,11 +39,16 @@ import { KommentarListItemInVorgangComponent } from './kommentar-list-in-vorgang
   imports: [
     CommonModule,
     VorgangSharedModule,
-    UiModule,
     KommentarSharedModule,
-    TechSharedModule,
     UserProfileModule,
     BinaryFileModule,
+    ReactiveFormsModule,
+    TextAreaEditorComponent,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    ConvertForDataTestPipe,
+    HasLinkPipe,
+    FormatDateWithTimePipe,
+    ExpansionPanelComponent,
   ],
   declarations: [
     KommentarListInVorgangContainerComponent,
diff --git a/alfa-client/libs/loesch-anforderung/src/lib/loesch-anforderung.module.ts b/alfa-client/libs/loesch-anforderung/src/lib/loesch-anforderung.module.ts
index 4841c7b2b2..ff527cfc47 100644
--- a/alfa-client/libs/loesch-anforderung/src/lib/loesch-anforderung.module.ts
+++ b/alfa-client/libs/loesch-anforderung/src/lib/loesch-anforderung.module.ts
@@ -22,8 +22,8 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { LoeschAnforderungSharedModule } from '@alfa-client/loesch-anforderung-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
@@ -45,9 +45,10 @@ import { LoeschenAnfordernButtonComponent } from './loeschen-anfordern-button-co
   imports: [
     CommonModule,
     LoeschAnforderungSharedModule,
-    TechSharedModule,
-    UiModule,
     VorgangSharedModule,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    IconButtonWithSpinnerComponent,
+    HasLinkPipe,
     RequestVorgangDeletionIconComponent,
     ButtonWithSpinnerComponent,
     DeleteVorgangFinallyIconComponent,
diff --git a/alfa-client/libs/navigation-shared/src/lib/navigation-shared.module.ts b/alfa-client/libs/navigation-shared/src/lib/navigation-shared.module.ts
index b596ca2b99..16fde28370 100644
--- a/alfa-client/libs/navigation-shared/src/lib/navigation-shared.module.ts
+++ b/alfa-client/libs/navigation-shared/src/lib/navigation-shared.module.ts
@@ -23,7 +23,6 @@
  */
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
-import { TechSharedModule } from '@alfa-client/tech-shared';
 import { EffectsModule } from '@ngrx/effects';
 import { StoreModule } from '@ngrx/store';
 import { NavigationEffects } from './+state/navigation.effects';
@@ -36,7 +35,6 @@ import { NavigationService } from './navigation.service';
     CommonModule,
     StoreModule.forFeature(fromNavigation.NAVIGATION_FEATURE_KEY, fromNavigation.reducer),
     EffectsModule.forFeature([NavigationEffects]),
-    TechSharedModule,
   ],
   providers: [NavigationFacade, NavigationService],
 })
diff --git a/alfa-client/libs/navigation/src/lib/header-container/header/header.component.spec.ts b/alfa-client/libs/navigation/src/lib/header-container/header/header.component.spec.ts
index 34bfb94cc2..3566cb04a6 100644
--- a/alfa-client/libs/navigation/src/lib/header-container/header/header.component.spec.ts
+++ b/alfa-client/libs/navigation/src/lib/header-container/header/header.component.spec.ts
@@ -22,7 +22,6 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AccessibilityButtonComponent } from '@alfa-client/common';
-import { UiModule } from '@alfa-client/ui';
 import { HelpMenuComponent } from '@alfa-client/user-assistance';
 import { UserProfileInHeaderContainerComponent } from '@alfa-client/user-profile';
 import { UserSettingsContainerComponent } from '@alfa-client/user-settings';
@@ -38,7 +37,6 @@ describe('HeaderComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [UiModule],
       declarations: [
         HeaderComponent,
         MockComponent(HeaderLogoComponent),
diff --git a/alfa-client/libs/navigation/src/lib/navigation.module.spec.ts b/alfa-client/libs/navigation/src/lib/navigation.module.spec.ts
index 8cb65e6da4..a4f111d64e 100644
--- a/alfa-client/libs/navigation/src/lib/navigation.module.spec.ts
+++ b/alfa-client/libs/navigation/src/lib/navigation.module.spec.ts
@@ -24,7 +24,7 @@
 import { TestBed } from '@angular/core/testing';
 import { NavigationModule } from './navigation.module';
 
-describe('UiModule', () => {
+describe('NavigationModule', () => {
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       imports: [NavigationModule],
diff --git a/alfa-client/libs/navigation/src/lib/navigation.module.ts b/alfa-client/libs/navigation/src/lib/navigation.module.ts
index 67cd2f216c..37ee717862 100644
--- a/alfa-client/libs/navigation/src/lib/navigation.module.ts
+++ b/alfa-client/libs/navigation/src/lib/navigation.module.ts
@@ -22,7 +22,6 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { AccessibilityButtonComponent } from '@alfa-client/common';
-import { UiModule } from '@alfa-client/ui';
 import { UserAssistanceModule } from '@alfa-client/user-assistance';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { UserSettingsModule } from '@alfa-client/user-settings';
@@ -38,7 +37,6 @@ import { HeaderComponent } from './header-container/header/header.component';
   declarations: [HeaderComponent, HeaderContainerComponent, HeaderLogoComponent],
   imports: [
     CommonModule,
-    UiModule,
     RouterModule,
     VorgangSharedUiModule,
     UserProfileModule,
diff --git a/alfa-client/libs/organisations-einheit/src/lib/organisations-einheit-list-item-container/organisations-einheit-list-item/organisations-einheit-list-item.component.ts b/alfa-client/libs/organisations-einheit/src/lib/organisations-einheit-list-item-container/organisations-einheit-list-item/organisations-einheit-list-item.component.ts
index f4fc21b66b..05558ae4b7 100644
--- a/alfa-client/libs/organisations-einheit/src/lib/organisations-einheit-list-item-container/organisations-einheit-list-item/organisations-einheit-list-item.component.ts
+++ b/alfa-client/libs/organisations-einheit/src/lib/organisations-einheit-list-item-container/organisations-einheit-list-item/organisations-einheit-list-item.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { StateResource } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared';
 import { Component, Input } from '@angular/core';
 import { ExternalUnitIconComponent, PublicAdministrationIconComponent } from '@ods/system';
@@ -30,7 +30,7 @@ import { ExternalUnitIconComponent, PublicAdministrationIconComponent } from '@o
 @Component({
   selector: 'alfa-organisations-einheit-list-item',
   standalone: true,
-  imports: [ExternalUnitIconComponent, PublicAdministrationIconComponent, UiModule],
+  imports: [ExternalUnitIconComponent, PublicAdministrationIconComponent, SpinnerComponent],
   templateUrl: './organisations-einheit-list-item.component.html',
 })
 export class OrganisationsEinheitListItemComponent {
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
index c3fd2f97ae..5b5beec8bf 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts
@@ -29,9 +29,9 @@ import {
   FileUploadComponent,
   IconButtonWithSpinnerComponent,
   OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
   SpinnerComponent,
   TextAreaEditorComponent,
-  TextEditorComponent,
 } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
@@ -58,10 +58,7 @@ describe('PostfachMailFormComponent', () => {
     ...mock(PostfachService),
     getSettings: jest.fn().mockReturnValue(of(createPostfachSettings())),
   };
-  const formService: PostfachMailFormservice = new PostfachMailFormservice(
-    new FormBuilder(),
-    useFromMock(postfachService),
-  );
+  const formService: PostfachMailFormservice = new PostfachMailFormservice(new FormBuilder(), useFromMock(postfachService));
   const dialogService: Mock<DialogService> = mock(DialogService);
 
   beforeEach(async () => {
@@ -69,7 +66,7 @@ describe('PostfachMailFormComponent', () => {
       declarations: [
         PostfachMailFormComponent,
         MockComponent(TextAreaEditorComponent),
-        MockComponent(TextEditorComponent),
+        MockComponent(OzgcloudTextEditorComponent),
         MockComponent(IconButtonWithSpinnerComponent),
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
         MockComponent(PostfachNachrichtReplyEditorContainerComponent),
diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail-date/postfach-mail-date.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail-date/postfach-mail-date.component.spec.ts
index 5a48882242..ca8fd42b29 100644
--- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail-date/postfach-mail-date.component.spec.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail-date/postfach-mail-date.component.spec.ts
@@ -21,12 +21,12 @@
  * 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 { ComponentFixture, TestBed } from '@angular/core/testing';
 import { Direction } from '@alfa-client/postfach-shared';
 import { FormatDateWithTimePipe, HasLinkPipe } from '@alfa-client/tech-shared';
 import { getElementFromFixture } from '@alfa-client/test-utils';
+import { registerLocaleData } from '@angular/common';
+import localeDe from '@angular/common/locales/de';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach';
 import { PostfachMailDateComponent } from './postfach-mail-date.component';
 
@@ -41,7 +41,8 @@ describe('PostfachMailDateComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [PostfachMailDateComponent, HasLinkPipe, FormatDateWithTimePipe],
+      imports: [HasLinkPipe, FormatDateWithTimePipe],
+      declarations: [PostfachMailDateComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/postfach/src/lib/postfach.module.ts b/alfa-client/libs/postfach/src/lib/postfach.module.ts
index e206c35d6c..2a6fe82af2 100644
--- a/alfa-client/libs/postfach/src/lib/postfach.module.ts
+++ b/alfa-client/libs/postfach/src/lib/postfach.module.ts
@@ -23,11 +23,24 @@
  */
 import { BinaryFileModule } from '@alfa-client/binary-file';
 import { ON_PAGE, PostfachSharedModule } from '@alfa-client/postfach-shared';
-import { UiModule } from '@alfa-client/ui';
+import { ConvertForDataTestPipe, FormatDateWithTimePipe, HasLinkPipe, ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared';
+import {
+  BackButtonComponent,
+  CheckboxEnumEditorComponent,
+  IconButtonWithSpinnerComponent,
+  OzgcloudIconComponent,
+  OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
+  SpinnerComponent,
+  SubnavigationComponent,
+  TextAreaEditorComponent,
+} from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { VorgangSharedUiModule } from '@alfa-client/vorgang-shared-ui';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
 import { RouterModule, Routes } from '@angular/router';
 import { ButtonComponent, MailboxIconComponent, PlusIconComponent, TooltipDirective } from '@ods/system';
 import { PostfachMailButtonContainerComponent } from './postfach-mail-button-container/postfach-mail-button-container.component';
@@ -63,11 +76,25 @@ const routes: Routes = [
   imports: [
     CommonModule,
     RouterModule.forChild(routes),
-    UiModule,
     PostfachSharedModule,
     UserProfileModule,
     VorgangSharedUiModule,
     BinaryFileModule,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    HasLinkPipe,
+    CheckboxEnumEditorComponent,
+    ReactiveFormsModule,
+    OzgcloudTextEditorComponent,
+    TextAreaEditorComponent,
+    MatIcon,
+    OzgcloudIconComponent,
+    FormatDateWithTimePipe,
+    SpinnerComponent,
+    ToEmbeddedResourcesPipe,
+    ConvertForDataTestPipe,
+    SubnavigationComponent,
+    BackButtonComponent,
+    IconButtonWithSpinnerComponent,
     ButtonComponent,
     PlusIconComponent,
     MailboxIconComponent,
diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-shared.module.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-shared.module.ts
index c595c6eed1..33ef83703d 100644
--- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-shared.module.ts
+++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-shared.module.ts
@@ -21,10 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
 import { NgModule } from '@angular/core';
 
-@NgModule({
-  imports: [TechSharedModule],
-})
+@NgModule({})
 export class ResourceRedirectSharedModule {}
diff --git a/alfa-client/libs/tech-shared/src/index.ts b/alfa-client/libs/tech-shared/src/index.ts
index f2c01ec546..6fbc4e5294 100644
--- a/alfa-client/libs/tech-shared/src/index.ts
+++ b/alfa-client/libs/tech-shared/src/index.ts
@@ -29,6 +29,7 @@ export * from './lib/error/error.handler';
 export * from './lib/error/error.util';
 export * from './lib/form.util';
 export * from './lib/http.util';
+export * from './lib/injector/injector.service';
 export * from './lib/keyboard.util';
 export * from './lib/message-code';
 export * from './lib/ngrx/actions';
@@ -57,7 +58,6 @@ export * from './lib/resource/resource.rxjs.operator';
 export * from './lib/resource/resource.service';
 export * from './lib/resource/resource.util';
 export * from './lib/service/formservice.abstract';
-export * from './lib/tech-shared.module';
 export * from './lib/tech.model';
 export * from './lib/tech.util';
 export * from './lib/validation/tech.validation.util';
diff --git a/alfa-client/libs/tech-shared/src/lib/decorator/error.decorator.util.ts b/alfa-client/libs/tech-shared/src/lib/decorator/error.decorator.util.ts
index 669b687239..f02936d4fb 100644
--- a/alfa-client/libs/tech-shared/src/lib/decorator/error.decorator.util.ts
+++ b/alfa-client/libs/tech-shared/src/lib/decorator/error.decorator.util.ts
@@ -22,10 +22,10 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { HttpErrorHandler } from '../error/error.handler';
-import { TechSharedModule } from '../tech-shared.module';
+import { InjectorService } from '../injector/injector.service';
 
 export function injectHttpErrorHandler(): HttpErrorHandler {
-  return TechSharedModule.injector.get(HttpErrorHandler);
+  return InjectorService.getInjector().get(HttpErrorHandler);
 }
 
 export function enableInterceptorDefaultHandling(httpErrorHandler: HttpErrorHandler): void {
diff --git a/alfa-client/libs/tech-shared/src/lib/injector/injector.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/injector/injector.service.spec.ts
new file mode 100644
index 0000000000..1833f3fd12
--- /dev/null
+++ b/alfa-client/libs/tech-shared/src/lib/injector/injector.service.spec.ts
@@ -0,0 +1,30 @@
+import { Injector } from '@angular/core';
+import { TestBed } from '@angular/core/testing';
+import { InjectorService } from './injector.service';
+
+describe('InjectorService', () => {
+  let injector: Injector;
+  let injectorService: InjectorService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [InjectorService, { provide: Injector, useValue: {} }],
+    });
+    injector = TestBed.inject(Injector);
+    injectorService = TestBed.inject(InjectorService);
+  });
+
+  it('should be created', () => {
+    expect(injectorService).toBeTruthy();
+  });
+
+  it('should set and get the injector', () => {
+    expect(InjectorService.getInjector()).toBe(injector);
+  });
+
+  describe('getInjector', () => {
+    it('should return the injector', () => {
+      expect(InjectorService.getInjector()).toBe(injector);
+    });
+  });
+});
diff --git a/alfa-client/libs/tech-shared/src/lib/injector/injector.service.ts b/alfa-client/libs/tech-shared/src/lib/injector/injector.service.ts
new file mode 100644
index 0000000000..eb2ad9d101
--- /dev/null
+++ b/alfa-client/libs/tech-shared/src/lib/injector/injector.service.ts
@@ -0,0 +1,16 @@
+import { Injectable, Injector } from '@angular/core';
+
+@Injectable({
+  providedIn: 'root',
+})
+export class InjectorService {
+  private static injector: Injector;
+
+  constructor(injector: Injector) {
+    InjectorService.injector = injector;
+  }
+
+  public static getInjector(): Injector {
+    return InjectorService.injector;
+  }
+}
diff --git a/alfa-client/libs/tech-shared/src/lib/keyboard.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/keyboard.util.spec.ts
index 10b46493b6..92ba5f3e69 100644
--- a/alfa-client/libs/tech-shared/src/lib/keyboard.util.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/keyboard.util.spec.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { createKeydownKeyboardEvent } from '../../../test-utils/src/lib/keyboard';
+import { createKeydownKeyboardEvent } from 'libs/test-utils/src/lib/keyboard';
 import {
   ARROW_DOWN_KEY,
   ARROW_UP_KEY,
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts
index 20392c34d7..e57e531260 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts
@@ -25,7 +25,10 @@ import { ApiError, EMPTY_STRING, getMessageForIssue, Issue } from '@alfa-client/
 import { Pipe, PipeTransform } from '@angular/core';
 import { isNil } from 'lodash-es';
 
-@Pipe({ name: 'convertApiErrorToErrorMessages' })
+@Pipe({
+  name: 'convertApiErrorToErrorMessages',
+  standalone: true,
+})
 export class ConvertApiErrorToErrorMessagesPipe implements PipeTransform {
   transform(value: ApiError) {
     if (isNil(value)) {
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-for-data-test.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-for-data-test.pipe.ts
index b187390164..dd6bb93c51 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/convert-for-data-test.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-for-data-test.pipe.ts
@@ -25,7 +25,10 @@ import { Pipe, PipeTransform } from '@angular/core';
 import { isNil } from 'lodash-es';
 import { convertForDataTest } from '../tech.util';
 
-@Pipe({ name: 'convertForDataTest' })
+@Pipe({
+  name: 'convertForDataTest',
+  standalone: true,
+})
 export class ConvertForDataTestPipe implements PipeTransform {
   transform(value: string): string {
     return isNil(value) ? null : convertForDataTest(value);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-problem-detail-to-error-messages.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-problem-detail-to-error-messages.pipe.ts
index 24f50446e2..7ce05836fe 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/convert-problem-detail-to-error-messages.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-problem-detail-to-error-messages.pipe.ts
@@ -27,14 +27,15 @@ import { InvalidParam, ProblemDetail } from '../tech.model';
 import { EMPTY_STRING } from '../tech.util';
 import { getMessageForInvalidParam } from '../validation/tech.validation.util';
 
-@Pipe({ name: 'convertProblemDetailToErrorMessages' })
+@Pipe({
+  name: 'convertProblemDetailToErrorMessages',
+  standalone: true,
+})
 export class ConvertProblemDetailToErrorMessagesPipe implements PipeTransform {
   transform(value: ProblemDetail) {
     if (isNil(value)) {
       return [];
     }
-    return value.invalidParams.map((invalidParam: InvalidParam) =>
-      getMessageForInvalidParam(EMPTY_STRING, invalidParam),
-    );
+    return value.invalidParams.map((invalidParam: InvalidParam) => getMessageForInvalidParam(EMPTY_STRING, invalidParam));
   }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-to-boolean.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-to-boolean.pipe.ts
index daac6384c2..ad5da3e078 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/convert-to-boolean.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-to-boolean.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { convertToBoolean } from '../tech.util';
 
-@Pipe({ name: 'convertToBoolean' })
+@Pipe({
+  name: 'convertToBoolean',
+  standalone: true,
+})
 export class ConvertToBooleanPipe implements PipeTransform {
   public transform(booleanStr: string): boolean {
     return convertToBoolean(booleanStr);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/enum-to-label.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/enum-to-label.pipe.ts
index 194e92483d..38033a7182 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/enum-to-label.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/enum-to-label.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { isNil } from 'lodash-es';
 
-@Pipe({ name: 'enumToLabel' })
+@Pipe({
+  name: 'enumToLabel',
+  standalone: true,
+})
 export class EnumToLabelPipe implements PipeTransform {
   transform(enumValue: any, enumLabel: any) {
     return isNil(enumValue) || isNil(enumLabel) ? null : enumLabel[enumValue];
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/file-size-plain.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/file-size-plain.pipe.ts
index 1863262788..d18d294fa3 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/file-size-plain.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/file-size-plain.pipe.ts
@@ -23,7 +23,10 @@
  */
 import { Pipe, PipeTransform } from '@angular/core';
 
-@Pipe({ name: 'fileSizePlain' })
+@Pipe({
+  name: 'fileSizePlain',
+  standalone: true,
+})
 export class FileSizePlainPipe implements PipeTransform {
   readonly kB = 1024;
   readonly MB = Math.pow(this.kB, 2);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/file-size.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/file-size.pipe.ts
index 327058ea9c..db4f547063 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/file-size.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/file-size.pipe.ts
@@ -23,7 +23,10 @@
  */
 import { Pipe, PipeTransform } from '@angular/core';
 
-@Pipe({ name: 'fileSize' })
+@Pipe({
+  name: 'fileSize',
+  standalone: true,
+})
 export class FileSizePipe implements PipeTransform {
   readonly kB = 1024;
   readonly MB = Math.pow(this.kB, 2);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/format-date-with-time.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/format-date-with-time.pipe.ts
index fc33dcc8a3..7d95383257 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/format-date-with-time.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/format-date-with-time.pipe.ts
@@ -24,11 +24,12 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { formatFullDateWithTimeAndDay, formatFullDateWithTimeWithoutSeconds } from '../date.util';
 
-@Pipe({ name: 'formatDateWithTimePipe' })
+@Pipe({
+  name: 'formatDateWithTimePipe',
+  standalone: true,
+})
 export class FormatDateWithTimePipe implements PipeTransform {
   transform(date: Date, withSeconds: boolean = true): string {
-    return withSeconds ?
-        formatFullDateWithTimeAndDay(date)
-      : formatFullDateWithTimeWithoutSeconds(date);
+    return withSeconds ? formatFullDateWithTimeAndDay(date) : formatFullDateWithTimeWithoutSeconds(date);
   }
 }
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/format-date-without-year-with-time.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/format-date-without-year-with-time.pipe.ts
index 42694b05a7..f2835bd7e6 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/format-date-without-year-with-time.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/format-date-without-year-with-time.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { formatDateWithoutYearWithTime } from '../date.util';
 
-@Pipe({ name: 'formatDateWithoutYearWithTime' })
+@Pipe({
+  name: 'formatDateWithoutYearWithTime',
+  standalone: true,
+})
 export class FormatDateWithoutYearWithTimePipe implements PipeTransform {
   transform(date: Date): string {
     return formatDateWithoutYearWithTime(date);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/format-full-date.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/format-full-date.pipe.ts
index 250167b0bc..c9bec878f1 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/format-full-date.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/format-full-date.pipe.ts
@@ -25,7 +25,10 @@ import { Pipe, PipeTransform } from '@angular/core';
 import { isString } from 'lodash-es';
 import { formatFullDate } from '../date.util';
 
-@Pipe({ name: 'formatFullDatePipe' })
+@Pipe({
+  name: 'formatFullDatePipe',
+  standalone: true,
+})
 export class FormatFullDatePipe implements PipeTransform {
   transform(date: Date | string): string {
     date = isString(date) ? new Date(date) : date;
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/format-to-pretty-date.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/format-to-pretty-date.pipe.ts
index 054f4f8b9c..0d16ccd7a7 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/format-to-pretty-date.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/format-to-pretty-date.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { formatToPrettyDate } from '../date.util';
 
-@Pipe({ name: 'formatToPrettyDate' })
+@Pipe({
+  name: 'formatToPrettyDate',
+  standalone: true,
+})
 export class FormatToPrettyDatePipe implements PipeTransform {
   transform(date: Date): string {
     return formatToPrettyDate(date);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/get-url.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/get-url.pipe.ts
index c41e3024cd..d936124c61 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/get-url.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/get-url.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { Resource, ResourceUri, getUrl } from '@ngxp/rest';
 
-@Pipe({ name: 'getUrl' })
+@Pipe({
+  name: 'getUrl',
+  standalone: true,
+})
 export class GetUrlPipe implements PipeTransform {
   transform(resource: Resource, link: string): ResourceUri {
     return getUrl(resource, link);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts
index 1bf5a803a8..ec9083014c 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/has-any-link.pipe.ts
@@ -26,7 +26,10 @@ import { Resource } from '@ngxp/rest';
 import { LinkRelationName } from '../resource/resource.model';
 import { hasAnyLink } from '../tech.util';
 
-@Pipe({ name: 'hasAnyLink' })
+@Pipe({
+  name: 'hasAnyLink',
+  standalone: true,
+})
 export class HasAnyLinkPipe implements PipeTransform {
   transform(resource: Resource, ...links: LinkRelationName[]): boolean {
     return hasAnyLink(resource, ...links);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/has-link.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/has-link.pipe.ts
index d2d15cb1ea..34abe1a2f2 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/has-link.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/has-link.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { Resource, hasLink } from '@ngxp/rest';
 
-@Pipe({ name: 'hasLink' })
+@Pipe({
+  name: 'hasLink',
+  standalone: true,
+})
 export class HasLinkPipe implements PipeTransform {
   transform(resource: Resource, link: string): boolean {
     return hasLink(resource, link);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/not-has-any-link.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/not-has-any-link.pipe.ts
index 19d64e5599..b04c9a7b61 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/not-has-any-link.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/not-has-any-link.pipe.ts
@@ -26,7 +26,10 @@ import { Resource } from '@ngxp/rest';
 import { LinkRelationName } from '../resource/resource.model';
 import { notHasAnyLink } from '../tech.util';
 
-@Pipe({ name: 'notHasAnyLink' })
+@Pipe({
+  name: 'notHasAnyLink',
+  standalone: true,
+})
 export class NotHasAnyLinkPipe implements PipeTransform {
   transform(resource: Resource, ...links: LinkRelationName[]): boolean {
     return notHasAnyLink(resource, ...links);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts
index 8c8f879b03..018d49e877 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { Resource, hasLink } from '@ngxp/rest';
 
-@Pipe({ name: 'notHasLink' })
+@Pipe({
+  name: 'notHasLink',
+  standalone: true,
+})
 export class NotHasLinkPipe implements PipeTransform {
   transform(resource: Resource, link: string): boolean {
     return !hasLink(resource, link);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/to-embedded-resource.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/to-embedded-resource.pipe.ts
index 537bd91348..dbb7025753 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/to-embedded-resource.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/to-embedded-resource.pipe.ts
@@ -28,7 +28,10 @@ import { LinkRelationName } from '../resource/resource.model';
 import { ListResource } from '../resource/resource.util';
 import { EMPTY_ARRAY } from '../tech.util';
 
-@Pipe({ name: 'toEmbeddedResources' })
+@Pipe({
+  name: 'toEmbeddedResources',
+  standalone: true,
+})
 export class ToEmbeddedResourcesPipe implements PipeTransform {
   transform(listResource: ListResource, linkRel: LinkRelationName): Resource[] {
     if (isNil(listResource) || isNil(linkRel)) return EMPTY_ARRAY;
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/to-resource-uri.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/to-resource-uri.pipe.ts
index d102cc2012..9ac1e3aaa4 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/to-resource-uri.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/to-resource-uri.pipe.ts
@@ -26,7 +26,10 @@ import { Resource, ResourceUri } from '@ngxp/rest';
 import { isNil } from 'lodash-es';
 import { toResourceUri } from '../resource/resource.util';
 
-@Pipe({ name: 'toResourceUri' })
+@Pipe({
+  name: 'toResourceUri',
+  standalone: true,
+})
 export class ToResourceUriPipe implements PipeTransform {
   transform(resource: Resource, linkRel?: string): ResourceUri {
     if (isNil(resource)) {
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light-tooltip.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light-tooltip.pipe.ts
index f0e66e4fd8..ab1c286a7c 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light-tooltip.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light-tooltip.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { isPast, isToday, isValid, parseISO } from 'date-fns';
 
-@Pipe({ name: 'toTrafficLightTooltip' })
+@Pipe({
+  name: 'toTrafficLightTooltip',
+  standalone: true,
+})
 export class ToTrafficLightTooltipPipe implements PipeTransform {
   transform(date: Date): string {
     date = isValid(date) ? date : parseISO(date as unknown as string);
diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light.pipe.ts
index 83f4e421d1..1763a26143 100644
--- a/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light.pipe.ts
+++ b/alfa-client/libs/tech-shared/src/lib/pipe/to-traffic-light.pipe.ts
@@ -24,7 +24,10 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { isPast, isToday, isValid, parseISO } from 'date-fns';
 
-@Pipe({ name: 'toTrafficLight' })
+@Pipe({
+  name: 'toTrafficLight',
+  standalone: true,
+})
 export class ToTrafficLightPipe implements PipeTransform {
   transform(date: Date): string {
     date = isValid(date) ? date : parseISO(date as unknown as string);
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 76fac14c0b..02e4ff7ccc 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
@@ -84,16 +84,22 @@ describe('ListResourceService', () => {
       isInvalidResourceCombinationSpy = jest.spyOn(ResourceUtil, 'isInvalidResourceCombination').mockReturnValue(true);
     });
 
+    it('should have debounce', () => {
+      service.getList().subscribe();
+
+      expect(service.handleChanges).not.toHaveBeenCalled();
+    });
+
     it('should handle config resource changed', fakeAsync(() => {
       service.getList().subscribe();
-      tick();
+      tick(50);
 
       expect(service.handleChanges).toHaveBeenCalledWith(listStateResource, baseResource);
     }));
 
     it('should call isInvalidResourceCombinationSpy', fakeAsync(() => {
       service.getList().subscribe();
-      tick();
+      tick(50);
 
       expect(isInvalidResourceCombinationSpy).toHaveBeenCalled();
     }));
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 50cee3aa72..13df5d4cf6 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
@@ -23,7 +23,7 @@
  */
 import { Resource, ResourceUri, getUrl, hasLink } from '@ngxp/rest';
 import { isEqual, isNil, isNull } from 'lodash-es';
-import { BehaviorSubject, Observable, combineLatest, filter, first, map, startWith, tap } from 'rxjs';
+import { BehaviorSubject, Observable, combineLatest, debounceTime, 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';
@@ -63,6 +63,7 @@ export class ResourceListService<B extends Resource, T extends ListResource, I e
 
   public getList(): Observable<StateResource<T>> {
     return combineLatest([this.listResource.asObservable(), this.getConfigResource()]).pipe(
+      debounceTime(50),
       tap(([stateResource, configResource]) => {
         this.handleChanges(stateResource, configResource);
       }),
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 bbd264a358..cade44ce12 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
@@ -22,6 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { mock, useFromMock } from '@alfa-client/test-utils';
+import { TestBed } from '@angular/core/testing';
 import { faker } from '@faker-js/faker';
 import { Resource, ResourceFactory, ResourceUri, getUrl } from '@ngxp/rest';
 import { DummyLinkRel, DummyListLinkRel } from 'libs/tech-shared/test/dummy';
@@ -42,7 +43,11 @@ describe('ResourceRepository', () => {
     resourceFactory.from.mockReturnValue(resourceWrapper);
     resourceFactory.fromId.mockReturnValue(resourceWrapper);
 
-    repository = new ResourceRepository(useFromMock(resourceFactory));
+    TestBed.configureTestingModule({
+      providers: [{ provide: ResourceFactory, useValue: useFromMock(resourceFactory) }],
+    });
+
+    repository = TestBed.inject(ResourceRepository);
   });
 
   it('should be created', () => {
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 d8f90a78eb..8a4081f31b 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
@@ -21,17 +21,17 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Injectable } from '@angular/core';
-import { Resource, ResourceFactory, ResourceUri, getUrl } from '@ngxp/rest';
+import { inject, Injectable } from '@angular/core';
+import { getUrl, Resource, ResourceFactory, ResourceUri } from '@ngxp/rest';
 import { Observable } from 'rxjs';
 import { CreateResourceData, LinkRelationName, SaveResourceData } from './resource.model';
 import { ListResource } from './resource.util';
 
 @Injectable({ providedIn: 'root' })
 export class ResourceRepository {
-  static SEARCH_PARAM: string = 'searchBy';
+  private resourceFactory = inject(ResourceFactory);
 
-  constructor(private resourceFactory: ResourceFactory) {}
+  static SEARCH_PARAM: string = 'searchBy';
 
   public getListResource(resource: Resource, linkRel: string): Observable<ListResource> {
     const uriWithoutParameter: string = this.getUrlWithoutParameter(getUrl(resource, linkRel));
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 7a045fa751..d7d188b8c5 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
@@ -82,16 +82,22 @@ describe('ResourceService', () => {
       isInvalidResourceCombinationSpy = jest.spyOn(ResourceUtil, 'isInvalidResourceCombination').mockReturnValue(true);
     });
 
+    it('should have debounce', () => {
+      service.get().subscribe();
+
+      expect(service.handleResourceChanges).not.toHaveBeenCalled();
+    });
+
     it('should handle config resource changed', fakeAsync(() => {
       service.get().subscribe();
-      tick();
+      tick(50);
 
       expect(service.handleResourceChanges).toHaveBeenCalledWith(stateResource, configResource);
     }));
 
     it('should call isInvalidResourceCombinationSpy', fakeAsync(() => {
       service.get().subscribe();
-      tick();
+      tick(50);
 
       expect(isInvalidResourceCombinationSpy).toHaveBeenCalled();
     }));
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 9900059919..1953e85ff4 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
@@ -24,7 +24,20 @@
 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,
+  debounceTime,
+  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';
@@ -57,6 +70,7 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   public get(): Observable<StateResource<T>> {
     return combineLatest([this.stateResource.asObservable(), this.getConfigResource()]).pipe(
+      debounceTime(50),
       tap(([stateResource, configResource]) => this.handleResourceChanges(stateResource, configResource)),
       filter(([stateResource]) => !isInvalidResourceCombination(stateResource, this.configResource)),
       mapToFirst<T, B>(),
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts
index 068bdad458..3bfc293f96 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Resource } from '@ngxp/rest';
-import { createCommandStateResource } from '../../../../command-shared/test/command';
+import { createCommandStateResource } from 'libs/command-shared/test/command';
 import { DummyListLinkRel } from '../../../test/dummy';
 import { createApiError } from '../../../test/error';
 import { createDummyListResource, createDummyResource, toResource } from '../../../test/resource';
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 47119c7a1b..05e53e161d 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
@@ -25,9 +25,9 @@ import { CommandResource } from '@alfa-client/command-shared';
 import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
 import { Resource } from '@ngxp/rest';
 import { cold } from 'jest-marbles';
+import { createCommandResource } from 'libs/command-shared/test/command';
 import { createInvalidParam, createProblemDetail } from 'libs/tech-shared/test/error';
 import { Observable, of } from 'rxjs';
-import { createCommandResource } from '../../../../command-shared/test/command';
 import {
   StateResource,
   createEmptyStateResource,
diff --git a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.spec.ts b/alfa-client/libs/tech-shared/src/lib/tech-shared.module.spec.ts
deleted file mode 100644
index 740aaee232..0000000000
--- a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.spec.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { TechSharedModule } from './tech-shared.module';
-import { TestBed } from '@angular/core/testing';
-
-describe('TechSharedModule', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      imports: [TechSharedModule],
-    }).compileComponents();
-  });
-
-  it('should create', () => {
-    expect(TechSharedModule).toBeDefined();
-  });
-});
diff --git a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts b/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts
deleted file mode 100644
index be795a66c9..0000000000
--- a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { CommonModule } from '@angular/common';
-import { HTTP_INTERCEPTORS } from '@angular/common/http';
-import { Injector, NgModule } from '@angular/core';
-import { HttpBinaryFileInterceptor } from './interceptor/http-binary-file.interceptor';
-import { HttpXsrfInterceptor } from './interceptor/http-xsrf.interceptor';
-import { XhrInterceptor } from './interceptor/xhr.interceptor';
-import { ConvertApiErrorToErrorMessagesPipe } from './pipe/convert-api-error-to-error-messages.pipe';
-import { ConvertForDataTestPipe } from './pipe/convert-for-data-test.pipe';
-import { ConvertProblemDetailToErrorMessagesPipe } from './pipe/convert-problem-detail-to-error-messages.pipe';
-import { ConvertToBooleanPipe } from './pipe/convert-to-boolean.pipe';
-import { EnumToLabelPipe } from './pipe/enum-to-label.pipe';
-import { FileSizePlainPipe } from './pipe/file-size-plain.pipe';
-import { FileSizePipe } from './pipe/file-size.pipe';
-import { FormatDateWithTimePipe } from './pipe/format-date-with-time.pipe';
-import { FormatDateWithoutYearWithTimePipe } from './pipe/format-date-without-year-with-time.pipe';
-import { FormatFullDatePipe } from './pipe/format-full-date.pipe';
-import { FormatToPrettyDatePipe } from './pipe/format-to-pretty-date.pipe';
-import { GetUrlPipe } from './pipe/get-url.pipe';
-import { HasAnyLinkPipe } from './pipe/has-any-link.pipe';
-import { HasLinkPipe } from './pipe/has-link.pipe';
-import { NotHasAnyLinkPipe } from './pipe/not-has-any-link.pipe';
-import { NotHasLinkPipe } from './pipe/not-has-link.pipe';
-import { ToEmbeddedResourcesPipe } from './pipe/to-embedded-resource.pipe';
-import { ToResourceUriPipe } from './pipe/to-resource-uri.pipe';
-import { ToTrafficLightTooltipPipe } from './pipe/to-traffic-light-tooltip.pipe';
-import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe';
-
-@NgModule({
-  imports: [CommonModule],
-  declarations: [
-    FormatToPrettyDatePipe,
-    FormatFullDatePipe,
-    EnumToLabelPipe,
-    FormatDateWithTimePipe,
-    FormatDateWithoutYearWithTimePipe,
-    HasLinkPipe,
-    HasAnyLinkPipe,
-    NotHasLinkPipe,
-    NotHasAnyLinkPipe,
-    ToResourceUriPipe,
-    ToTrafficLightPipe,
-    ToTrafficLightTooltipPipe,
-    ToEmbeddedResourcesPipe,
-    ConvertForDataTestPipe,
-    FileSizePipe,
-    FileSizePlainPipe,
-    GetUrlPipe,
-    ConvertToBooleanPipe,
-    ConvertApiErrorToErrorMessagesPipe,
-    ConvertProblemDetailToErrorMessagesPipe,
-  ],
-  exports: [
-    FormatToPrettyDatePipe,
-    FormatFullDatePipe,
-    EnumToLabelPipe,
-    FormatDateWithTimePipe,
-    FormatDateWithoutYearWithTimePipe,
-    HasLinkPipe,
-    HasAnyLinkPipe,
-    NotHasLinkPipe,
-    NotHasAnyLinkPipe,
-    ToResourceUriPipe,
-    ToTrafficLightPipe,
-    ToTrafficLightTooltipPipe,
-    ToEmbeddedResourcesPipe,
-    ConvertForDataTestPipe,
-    FileSizePipe,
-    FileSizePlainPipe,
-    GetUrlPipe,
-    ConvertToBooleanPipe,
-    ConvertApiErrorToErrorMessagesPipe,
-    ConvertProblemDetailToErrorMessagesPipe,
-  ],
-  providers: [
-    {
-      provide: HTTP_INTERCEPTORS,
-      useClass: XhrInterceptor,
-      multi: true,
-    },
-    {
-      provide: HTTP_INTERCEPTORS,
-      useClass: HttpXsrfInterceptor,
-      multi: true,
-    },
-    {
-      provide: HTTP_INTERCEPTORS,
-      useClass: HttpBinaryFileInterceptor,
-      multi: true,
-    },
-  ],
-})
-export class TechSharedModule {
-  public static injector: Injector;
-
-  constructor(private injector: Injector) {
-    TechSharedModule.injector = this.injector;
-  }
-}
diff --git a/alfa-client/libs/ui/src/index.ts b/alfa-client/libs/ui/src/index.ts
index 8571055878..2db371a18e 100644
--- a/alfa-client/libs/ui/src/index.ts
+++ b/alfa-client/libs/ui/src/index.ts
@@ -35,7 +35,7 @@ export * from './lib/ui/editor/autocomplete-editor/autocomplete-editor.component
 export * from './lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component';
 export * from './lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.model';
 export * from './lib/ui/editor/date-editor/date-editor.component';
-export * from './lib/ui/editor/text-editor/text-editor.component';
+export * from './lib/ui/editor/text-editor/ozgcloud-text-editor.component';
 export * from './lib/ui/editor/textarea-editor/textarea-editor.component';
 export * from './lib/ui/expansion-panel/expansion-panel.component';
 export * from './lib/ui/file-upload/file-upload.component';
@@ -50,10 +50,11 @@ export * from './lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozg
 export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.result';
 export * from './lib/ui/ozgcloud-dialog/ozgcloud-dialog.service';
 export * from './lib/ui/ozgcloud-icon/ozgcloud-icon.component';
+export * from './lib/ui/ozgcloud-menu/ozgcloud-menu.component';
 export * from './lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component';
 export * from './lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component';
 export * from './lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component';
+export * from './lib/ui/slide-toggle/slide-toggle.component';
 export * from './lib/ui/spinner-transparency/spinner-transparency.component';
 export * from './lib/ui/spinner/spinner.component';
 export * from './lib/ui/subnavigation/subnavigation.component';
-export * from './lib/ui/ui.module';
diff --git a/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.spec.ts b/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.spec.ts
index b39b315dbd..c773235e92 100644
--- a/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.spec.ts
@@ -32,8 +32,7 @@ describe('AppIconComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [AppIconComponent],
-      imports: [MatIcon, MatIconTestingModule],
+      imports: [MatIcon, MatIconTestingModule, AppIconComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.ts b/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.ts
index 0b93d2c244..a09417be79 100644
--- a/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.ts
+++ b/alfa-client/libs/ui/src/lib/icon/app-icon/app-icon.component.ts
@@ -22,10 +22,13 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-app-icon',
   templateUrl: './app-icon.component.html',
   styleUrls: ['./app-icon.component.scss'],
+  standalone: true,
+  imports: [MatIcon],
 })
 export class AppIconComponent {}
diff --git a/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.spec.ts b/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.spec.ts
index 7d0696427c..a5ce3c8c70 100644
--- a/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.spec.ts
@@ -37,8 +37,7 @@ describe('PostfachIconComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [PostfachIconComponent],
-      imports: [MatIconTestingModule, MatBadgeModule, MatBadge, MatIcon],
+      imports: [MatIconTestingModule, MatBadgeModule, MatBadge, MatIcon, PostfachIconComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.ts b/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.ts
index 3ad4d01502..684c8781ea 100644
--- a/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.ts
+++ b/alfa-client/libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.ts
@@ -22,11 +22,15 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatBadge } from '@angular/material/badge';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-postfach-icon',
   templateUrl: './postfach-icon.component.html',
   styleUrls: ['./postfach-icon.component.scss'],
+  standalone: true,
+  imports: [MatIcon, MatBadge],
 })
 export class PostfachIconComponent {
   @Input() showBadge: boolean = false;
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts
index a591c897b1..51f5f1b134 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts
@@ -36,8 +36,7 @@ describe('SnackbarCloseButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [SnackbarCloseButtonComponent],
-      imports: [MatIcon],
+      imports: [MatIcon, SnackbarCloseButtonComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts
index 53d5bc4018..6a4ea9b58c 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts
@@ -22,11 +22,15 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, EventEmitter, Output } from '@angular/core';
+import { MatIconButton } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-snackbar-close-button',
   templateUrl: './snackbar-close-button.component.html',
   styleUrls: ['./snackbar-close-button.component.scss'],
+  standalone: true,
+  imports: [MatIconButton, MatIcon],
 })
 export class SnackbarCloseButtonComponent {
   @Output() close: EventEmitter<void> = new EventEmitter();
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
index 1421a91855..c18e96c89e 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
@@ -21,10 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { mock } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIconModule } from '@angular/material/icon';
 import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
-import { mock } from '@alfa-client/test-utils';
 import { MockComponent } from 'ng-mocks';
 import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
 import { SnackBarData } from '../snackbar.model';
@@ -39,8 +39,7 @@ describe('SnackbarErrorComponent', () => {
 
   beforeEach(async () => {
     TestBed.configureTestingModule({
-      imports: [MatIconModule],
-      declarations: [SnackbarErrorComponent, MockComponent(SnackbarCloseButtonComponent)],
+      imports: [MatIconModule, SnackbarErrorComponent, MockComponent(SnackbarCloseButtonComponent)],
       providers: [
         {
           provide: MAT_SNACK_BAR_DATA,
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
index 19a27fa8e5..06b3709ca3 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts
@@ -21,20 +21,21 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject } from '@angular/core';
+import { Component, inject } from '@angular/core';
 import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
+import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
 import { SnackBarData } from '../snackbar.model';
 
 @Component({
   selector: 'ozgcloud-snackbar-error',
   templateUrl: './snackbar-error.component.html',
   styleUrls: ['./snackbar-error.component.scss'],
+  standalone: true,
+  imports: [SnackbarCloseButtonComponent],
 })
 export class SnackbarErrorComponent {
-  constructor(
-    @Inject(MAT_SNACK_BAR_DATA) public data: SnackBarData,
-    public snackBarRef: MatSnackBarRef<SnackbarErrorComponent>,
-  ) {}
+  public snackBarRef = inject(MatSnackBarRef<SnackbarErrorComponent>);
+  public data = inject<SnackBarData>(MAT_SNACK_BAR_DATA);
 
   get message(): string {
     return this.data.message;
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
index 82103c833a..fbf8300ce5 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
@@ -25,14 +25,8 @@
 -->
 <div data-test-id="snackbar-message">{{ message }}</div>
 
-<button
-  *ngIf="showRevokeButton()"
-  data-test-id="snackbar-revoke-button"
-  mat-button
-  color="primary"
-  (click)="revoke()"
->
-  Rückgängig
-</button>
+@if (showRevokeButton()) {
+  <button data-test-id="snackbar-revoke-button" mat-button color="primary" (click)="revoke()">Rückgängig</button>
+}
 
 <ozgcloud-snackbar-close-button (close)="close()"></ozgcloud-snackbar-close-button>
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
index 55ce0007b6..62d87fd9bf 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
@@ -21,10 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { mock } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIconModule } from '@angular/material/icon';
 import { MAT_SNACK_BAR_DATA, MatSnackBarModule, MatSnackBarRef } from '@angular/material/snack-bar';
-import { mock } from '@alfa-client/test-utils';
 import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -47,8 +47,7 @@ describe('SnackbarInfoComponent', () => {
 
   beforeEach(async () => {
     TestBed.configureTestingModule({
-      imports: [MatSnackBarModule, MatIconModule],
-      declarations: [SnackbarInfoComponent, MockComponent(SnackbarCloseButtonComponent)],
+      imports: [MatSnackBarModule, MatIconModule, SnackbarInfoComponent, MockComponent(SnackbarCloseButtonComponent)],
       providers: [
         {
           provide: MAT_SNACK_BAR_DATA,
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
index e1431695e2..cad0471768 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts
@@ -21,22 +21,24 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject } from '@angular/core';
-import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
 import { isRevokeable } from '@alfa-client/command-shared';
+import { Component, inject } from '@angular/core';
+import { MatButton } from '@angular/material/button';
+import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
 import { isUndefined } from 'lodash-es';
+import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
 import { SnackBarData } from '../snackbar.model';
 
 @Component({
   selector: 'ozgcloud-snackbar-info',
   templateUrl: './snackbar-info.component.html',
   styleUrls: ['./snackbar-info.component.scss'],
+  standalone: true,
+  imports: [MatButton, SnackbarCloseButtonComponent],
 })
 export class SnackbarInfoComponent {
-  constructor(
-    @Inject(MAT_SNACK_BAR_DATA) public data: SnackBarData,
-    public snackBarRef: MatSnackBarRef<SnackbarInfoComponent>,
-  ) {}
+  public snackBarRef = inject(MatSnackBarRef<SnackbarInfoComponent>);
+  public data = inject<SnackBarData>(MAT_SNACK_BAR_DATA);
 
   get message(): string {
     return this.data.message;
diff --git a/alfa-client/libs/ui/src/lib/snackbar/snackbar.service.ts b/alfa-client/libs/ui/src/lib/snackbar/snackbar.service.ts
index 98b7170fe7..6e0ecf60e6 100644
--- a/alfa-client/libs/ui/src/lib/snackbar/snackbar.service.ts
+++ b/alfa-client/libs/ui/src/lib/snackbar/snackbar.service.ts
@@ -21,11 +21,11 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ComponentType } from '@angular/cdk/overlay';
-import { Injectable } from '@angular/core';
-import { MatSnackBar, MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';
 import { CommandResource, CommandStatus } from '@alfa-client/command-shared';
 import { isNotUndefined } from '@alfa-client/tech-shared';
+import { ComponentType } from '@angular/cdk/overlay';
+import { inject, Injectable } from '@angular/core';
+import { MatSnackBar, MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';
 import { isUndefined } from 'lodash-es';
 import { Subscription } from 'rxjs';
 import { SnackbarErrorComponent } from './snackbar-error/snackbar-error.component';
@@ -33,14 +33,14 @@ import { SnackbarInfoComponent } from './snackbar-info/snackbar-info.component';
 
 @Injectable({ providedIn: 'root' })
 export class SnackBarService {
+  private snackBar = inject(MatSnackBar);
+
   private subscription: Subscription;
 
   snackBarRef: MatSnackBarRef<SnackbarInfoComponent | SnackbarErrorComponent>;
 
   private durationTime: number = 10000;
 
-  constructor(private snackBar: MatSnackBar) {}
-
   public show(commandResource: CommandResource, message: string, revokeAction?: () => void): void {
     if (commandResource.status === CommandStatus.ERROR) {
       this.showError(message);
diff --git a/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.spec.ts
index 8c9259c77a..7a5b60d6c3 100644
--- a/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.spec.ts
@@ -31,8 +31,7 @@ describe('AccordionComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [AccordionComponent],
-      imports: [MatAccordion],
+      imports: [MatAccordion, AccordionComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.ts b/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.ts
index 36001957eb..2327c0401e 100644
--- a/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/accordion/accordion.component.ts
@@ -22,11 +22,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatAccordion } from '@angular/material/expansion';
 
 @Component({
   selector: 'ozgcloud-accordion',
   templateUrl: './accordion.component.html',
   styleUrls: ['./accordion.component.scss'],
+  standalone: true,
+  imports: [MatAccordion],
 })
 export class AccordionComponent {
   @Input() multi: boolean = false;
diff --git a/alfa-client/libs/ui/src/lib/ui/back-button/back-button.component.ts b/alfa-client/libs/ui/src/lib/ui/back-button/back-button.component.ts
index 14ad27f618..a5c00893b3 100644
--- a/alfa-client/libs/ui/src/lib/ui/back-button/back-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/back-button/back-button.component.ts
@@ -22,11 +22,18 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatIconAnchor } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
+import { RouterLink } from '@angular/router';
+import { ArrowBackIconComponent, ButtonComponent, TooltipDirective } from '@ods/system';
 
 @Component({
   selector: 'ozgcloud-back-button',
   templateUrl: './back-button.component.html',
   styleUrls: ['./back-button.component.scss'],
+  standalone: true,
+  imports: [MatIconAnchor, RouterLink, MatTooltip, MatIcon, TooltipDirective, ButtonComponent, ArrowBackIconComponent],
 })
 export class BackButtonComponent {
   @Input() label: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
index ec797a1c52..23ca3dbbc8 100644
--- a/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts
@@ -21,13 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import {
-  IconButtonWithSpinnerComponent,
-  OzgcloudStrokedButtonWithSpinnerComponent,
-} from '@alfa-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { BasicDialogComponent } from './basic-dialog.component';
 
@@ -37,8 +34,8 @@ describe('BasicDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MatDialogModule],
-      declarations: [
+      imports: [
+        MatDialogModule,
         BasicDialogComponent,
         MatIcon,
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
diff --git a/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts b/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
index e9519e8042..cbe53ff122 100644
--- a/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts
@@ -21,20 +21,36 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject } from '@angular/core';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { CdkScrollable } from '@angular/cdk/scrolling';
+import { Component, inject } from '@angular/core';
+import {
+  MAT_DIALOG_DATA,
+  MatDialogActions,
+  MatDialogClose,
+  MatDialogContent,
+  MatDialogRef,
+  MatDialogTitle,
+} from '@angular/material/dialog';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '../ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
 import { BasicDialogData } from './basic-dialog-data.model';
 
 @Component({
   selector: 'ozgcloud-basic-dialog',
   templateUrl: './basic-dialog.component.html',
   styleUrls: ['./basic-dialog.component.scss'],
+  standalone: true,
+  imports: [
+    MatDialogTitle,
+    CdkScrollable,
+    MatDialogContent,
+    MatDialogActions,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    MatDialogClose,
+  ],
 })
 export class BasicDialogComponent {
-  constructor(
-    public dialogRef: MatDialogRef<BasicDialogComponent>,
-    @Inject(MAT_DIALOG_DATA) public data: BasicDialogData,
-  ) {}
+  public dialogRef = inject(MatDialogRef<BasicDialogComponent>);
+  public data = inject<BasicDialogData>(MAT_DIALOG_DATA);
 
   onNoClick(): void {
     this.dialogRef.close();
diff --git a/alfa-client/libs/ui/src/lib/ui/dialog/dialog.service.ts b/alfa-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
index dfe376a9f5..cd72feef7d 100644
--- a/alfa-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
+++ b/alfa-client/libs/ui/src/lib/ui/dialog/dialog.service.ts
@@ -21,22 +21,19 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ApiError, isNotUndefined } from '@alfa-client/tech-shared';
+import { BasicDialogComponent, BasicDialogData, FixedDialogComponent, FixedDialogData } from '@alfa-client/ui';
 import { NoopScrollStrategy } from '@angular/cdk/overlay';
 import { ComponentType } from '@angular/cdk/portal';
-import { Injectable } from '@angular/core';
+import { inject, Injectable } from '@angular/core';
 import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';
-import { ApiError, isNotUndefined } from '@alfa-client/tech-shared';
-import {
-  BasicDialogComponent,
-  BasicDialogData,
-  FixedDialogComponent,
-  FixedDialogData,
-} from '@alfa-client/ui';
 import { InternalServerErrorDialogComponent } from '../notification/internal-server-error-dialog/internal-server-error-dialog.component';
 import { RetryInTimeDialog } from './retry-in-time.dialog';
 
 @Injectable({ providedIn: 'root' })
 export class DialogService {
+  private dialog = inject(MatDialog);
+
   fixedSingleDialogRef: MatDialogRef<FixedDialogComponent>;
 
   readonly FIXED_DIALOG_CONFIG: MatDialogConfig = {
@@ -67,8 +64,6 @@ export class DialogService {
     restoreFocus: false,
   };
 
-  constructor(private dialog: MatDialog) {}
-
   public openWidely<T>(component: ComponentType<T>, config?: MatDialogConfig): MatDialogRef<T> {
     return this.open<T>(component, { ...config, ...this.WIDE_DIALOG_CONFIG });
   }
diff --git a/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.spec.ts
index d1215dcb80..2771e50313 100644
--- a/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { DownloadButtonComponent } from './download-button.component';
 import { MockComponent } from 'ng-mocks';
+import { DownloadButtonComponent } from './download-button.component';
 
 describe('DownloadButtonComponent', () => {
   let component: DownloadButtonComponent;
@@ -32,7 +32,7 @@ describe('DownloadButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [DownloadButtonComponent, MockComponent(DownloadButtonComponent)],
+      imports: [DownloadButtonComponent, MockComponent(DownloadButtonComponent)],
     }).compileComponents();
 
     fixture = TestBed.createComponent(DownloadButtonComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.ts b/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.ts
index d1b4e7fed8..be55bf7f0d 100644
--- a/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/download-button/download-button.component.ts
@@ -22,11 +22,17 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatAnchor } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TooltipDirective } from '@ods/system';
 
 @Component({
   selector: 'ozgcloud-download-button',
   templateUrl: './download-button.component.html',
   styleUrls: ['./download-button.component.scss'],
+  standalone: true,
+  imports: [MatAnchor, MatTooltip, MatIcon, TooltipDirective],
 })
 export class DownloadButtonComponent {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.html b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.html
index b60743ee96..43edcd913d 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.html
@@ -1,26 +1,26 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
-
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
-
-    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
-
-    Sofern nicht durch anwendbare Rechtsvorschriften
-    gefordert oder in schriftlicher Form vereinbart, wird
-    die unter der Lizenz verbreitete Software "so wie sie
-    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
-    ausdrücklich oder stillschweigend - verbreitet.
-    Die sprachspezifischen Genehmigungen und Beschränkungen
-    unter der Lizenz sind dem Lizenztext zu entnehmen.
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+Lizenziert unter der EUPL, Version 1.2 oder - sobald
+diese von der Europäischen Kommission genehmigt wurden -
+Folgeversionen der EUPL ("Lizenz");
+Sie dürfen dieses Werk ausschließlich gemäß
+dieser Lizenz nutzen.
+Eine Kopie der Lizenz finden Sie hier:
+
+https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+Sofern nicht durch anwendbare Rechtsvorschriften
+gefordert oder in schriftlicher Form vereinbart, wird
+die unter der Lizenz verbreitete Software "so wie sie
+ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ausdrücklich oder stillschweigend - verbreitet.
+Die sprachspezifischen Genehmigungen und Beschränkungen
+unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
 <mat-form-field appearance="outline">
@@ -40,15 +40,16 @@
   />
 
   <mat-autocomplete autoActiveFirstOption #auto="matAutocomplete">
-    <mat-option
-      *ngFor="let value of values"
-      [attr.data-test-id]="(value.label | convertForDataTest) + '-autocomplete-option'"
-      [value]="value.value"
-      (keyup.enter)="onSelection(value)"
-      (onSelectionChange)="onSelection(value)"
-    >
-      {{ value.label }}
-    </mat-option>
+    @for (value of values; track value) {
+      <mat-option
+        [attr.data-test-id]="(value.label | convertForDataTest) + '-autocomplete-option'"
+        [value]="value.value"
+        (keyup.enter)="onSelection(value)"
+        (onSelectionChange)="onSelection(value)"
+      >
+        {{ value.label }}
+      </mat-option>
+    }
   </mat-autocomplete>
 
   <mat-error>
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
index 609ef74f56..c590cbe105 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts
@@ -21,13 +21,13 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
 import { MatAutocompleteModule } from '@angular/material/autocomplete';
 import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
 import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 import { AutocompleteEditorComponent } from './autocomplete-editor.component';
@@ -38,17 +38,15 @@ describe('AutocompleteEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        AutocompleteEditorComponent,
-        ConvertForDataTestPipe,
-        MockComponent(ValidationErrorComponent),
-      ],
       imports: [
         MatAutocompleteModule,
         MatFormFieldModule,
         MatInputModule,
         ReactiveFormsModule,
         BrowserAnimationsModule,
+        AutocompleteEditorComponent,
+        ConvertForDataTestPipe,
+        MockComponent(ValidationErrorComponent),
       ],
       providers: [
         {
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.ts
index 1cb488f0f7..87aba70b53 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.ts
@@ -21,28 +21,38 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import {
-  AfterViewInit,
-  Component,
-  ElementRef,
-  EventEmitter,
-  Input,
-  Output,
-  ViewChild,
-} from '@angular/core';
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
+import { AfterViewInit, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
+import { MatOption } from '@angular/material/core';
+import { MatError, MatFormField, MatLabel } from '@angular/material/form-field';
+import { MatInput } from '@angular/material/input';
 import { ResourceUri } from '@ngxp/rest';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
 import { isEmpty, isEqual, isNil } from 'lodash-es';
+import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 
 @Component({
   selector: 'ozgcloud-autocomplete-editor',
   templateUrl: './autocomplete-editor.component.html',
   styleUrls: ['./autocomplete-editor.component.scss'],
+  standalone: true,
+  imports: [
+    MatFormField,
+    MatLabel,
+    MatInput,
+    MatAutocompleteTrigger,
+    FormsModule,
+    ReactiveFormsModule,
+    MatAutocomplete,
+    MatOption,
+    MatError,
+    ValidationErrorComponent,
+    ConvertForDataTestPipe,
+  ],
 })
-export class AutocompleteEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements AfterViewInit
-{
+export class AutocompleteEditorComponent extends FormControlEditorAbstractComponent implements AfterViewInit {
   @Input() label: string;
   @Input() values: Selectable[] = [];
   @Input() required: boolean = false;
@@ -64,9 +74,7 @@ export class AutocompleteEditorComponent
   onEnter(): void {
     const selectedValue: ResourceUri = this.fieldControl.value;
 
-    isEmpty(selectedValue) ?
-      this.enterOnNoSelection.emit()
-    : this.onSelection(this.getUserProfile());
+    isEmpty(selectedValue) ? this.enterOnNoSelection.emit() : this.onSelection(this.getUserProfile());
   }
 
   private getUserProfile(): Selectable {
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.spec.ts
index 2a7caecd0e..91a6537c22 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.spec.ts
@@ -21,16 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
-import { MatIcon } from '@angular/material/icon';
 import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
 import { IconButtonWithSpinnerComponent } from '../../icon-button-with-spinner/icon-button-with-spinner.component';
 import { CheckboxEnumEditorComponent } from './checkbox-enum-editor.component';
-import { UiModule } from '../../ui.module';
 
 describe('CheckboxEnumEditorComponent', () => {
   let component: CheckboxEnumEditorComponent;
@@ -38,13 +37,15 @@ describe('CheckboxEnumEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
+      declarations: [ConvertForDataTestPipe],
+      imports: [
+        MatFormFieldModule,
+        ReactiveFormsModule,
+        BrowserAnimationsModule,
         CheckboxEnumEditorComponent,
         MatIcon,
-        ConvertForDataTestPipe,
         MockComponent(IconButtonWithSpinnerComponent),
       ],
-      imports: [UiModule, MatFormFieldModule, ReactiveFormsModule, BrowserAnimationsModule],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.ts
index 26e505719f..0943452372 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/checkbox-enum-editor/checkbox-enum-editor.component.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input, OnInit } from '@angular/core';
-import { MatCheckboxChange } from '@angular/material/checkbox';
+import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
 import { CheckboxEnumEditorItem } from './checkbox-enum-editor.model';
 
@@ -34,11 +34,10 @@ import { CheckboxEnumEditorItem } from './checkbox-enum-editor.model';
   selector: 'ozgcloud-checkbox-enum-editor',
   templateUrl: './checkbox-enum-editor.component.html',
   styleUrls: ['./checkbox-enum-editor.component.scss'],
+  standalone: true,
+  imports: [MatCheckbox],
 })
-export class CheckboxEnumEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements OnInit
-{
+export class CheckboxEnumEditorComponent extends FormControlEditorAbstractComponent implements OnInit {
   @Input() label: string;
   @Input() defaultItem: CheckboxEnumEditorItem;
   @Input() checkedItem: CheckboxEnumEditorItem;
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
index 2af7293846..e8fb9e83f6 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts
@@ -43,12 +43,9 @@ describe('DateEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        DateEditorComponent,
-        ConvertForDataTestPipe,
-        MockComponent(ValidationErrorComponent),
-      ],
+      declarations: [ConvertForDataTestPipe],
       imports: [
+        ConvertForDataTestPipe,
         MatFormFieldModule,
         MatInputModule,
         MatIconModule,
@@ -56,6 +53,8 @@ describe('DateEditorComponent', () => {
         MatNativeDateModule,
         ReactiveFormsModule,
         BrowserAnimationsModule,
+        DateEditorComponent,
+        MockComponent(ValidationErrorComponent),
       ],
     }).compileComponents();
   });
@@ -75,9 +74,7 @@ describe('DateEditorComponent', () => {
       component.label = 'Ein Label';
       fixture.detectChanges();
 
-      const element: HTMLElement = fixture.nativeElement.querySelector(
-        '[data-test-id="Ein_Label-date-input"]',
-      );
+      const element: HTMLElement = fixture.nativeElement.querySelector('[data-test-id="Ein_Label-date-input"]');
 
       expect(element).toBeInstanceOf(HTMLElement);
     });
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
index c632ccf07f..b7dd27fb2f 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts
@@ -21,16 +21,32 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { add2000Years } from '@alfa-client/tech-shared';
+import { add2000Years, ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
-import { MatDatepickerInputEvent } from '@angular/material/datepicker';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatDatepickerInputEvent, MatDatepickerModule } from '@angular/material/datepicker';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatInputModule } from '@angular/material/input';
 import { isDate } from 'date-fns';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
+import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 
 @Component({
   selector: 'ozgcloud-date-editor',
   templateUrl: './date-editor.component.html',
   styleUrls: ['./date-editor.component.scss'],
+  standalone: true,
+  imports: [
+    MatFormFieldModule,
+    MatInputModule,
+    FormsModule,
+    ReactiveFormsModule,
+    MatIcon,
+    ValidationErrorComponent,
+    MatDatepickerModule,
+    ConvertForDataTestPipe,
+  ],
 })
 export class DateEditorComponent extends FormControlEditorAbstractComponent {
   @Input() label: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.html b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.html
index 123269b8cb..c8501ddaa8 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.html
@@ -1,32 +1,32 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
-
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
-
-    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
-
-    Sofern nicht durch anwendbare Rechtsvorschriften
-    gefordert oder in schriftlicher Form vereinbart, wird
-    die unter der Lizenz verbreitete Software "so wie sie
-    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
-    ausdrücklich oder stillschweigend - verbreitet.
-    Die sprachspezifischen Genehmigungen und Beschränkungen
-    unter der Lizenz sind dem Lizenztext zu entnehmen.
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+Lizenziert unter der EUPL, Version 1.2 oder - sobald
+diese von der Europäischen Kommission genehmigt wurden -
+Folgeversionen der EUPL ("Lizenz");
+Sie dürfen dieses Werk ausschließlich gemäß
+dieser Lizenz nutzen.
+Eine Kopie der Lizenz finden Sie hier:
+
+https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+Sofern nicht durch anwendbare Rechtsvorschriften
+gefordert oder in schriftlicher Form vereinbart, wird
+die unter der Lizenz verbreitete Software "so wie sie
+ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ausdrücklich oder stillschweigend - verbreitet.
+Die sprachspezifischen Genehmigungen und Beschränkungen
+unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
 <ng-container [formArrayName]="parentFormArrayName">
-  <ng-container *ngFor="let hiddenInput of fileLinkControls.controls; let i = index">
+  @for (hiddenInput of fileLinkControls.controls; track hiddenInput; let i = $index) {
     <input id="file-link-{{ i }}" type="hidden" [formControlName]="i" />
-  </ng-container>
+  }
 </ng-container>
 
 <input
@@ -39,10 +39,11 @@
 />
 
 <label [attr.for]="uploadFileId" matRipple [attr.aria-label]="label">
-  <mat-icon *ngIf="!uploadInProgress.loading">attach_file</mat-icon>
+  @if (!uploadInProgress.loading) {
+    <mat-icon>attach_file</mat-icon>
+  }
 
-  <ozgcloud-spinner [stateResource]="uploadInProgress" [diameter]="22" padding="0">
-  </ozgcloud-spinner>
+  <ozgcloud-spinner [stateResource]="uploadInProgress" [diameter]="22" padding="0"> </ozgcloud-spinner>
 </label>
 
 <mat-error>
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
index a6c2b5c8d8..2dc06d2e3d 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts
@@ -21,20 +21,15 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ConvertForDataTestPipe, createEmptyStateResource } from '@alfa-client/tech-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import {
-  AbstractControl,
-  FormGroupDirective,
-  ReactiveFormsModule,
-  UntypedFormBuilder,
-} from '@angular/forms';
+import { AbstractControl, FormGroupDirective, ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
 import { MatNativeDateModule } from '@angular/material/core';
 import { MatDatepickerModule } from '@angular/material/datepicker';
-import { MatIconModule } from '@angular/material/icon';
 import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatIconModule } from '@angular/material/icon';
 import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { ConvertForDataTestPipe, createEmptyStateResource } from '@alfa-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
 import { SpinnerComponent } from '../../spinner/spinner.component';
 import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
@@ -51,12 +46,6 @@ describe('FileUploadEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
-        FileUploadEditorComponent,
-        ConvertForDataTestPipe,
-        MockComponent(ValidationErrorComponent),
-        MockComponent(SpinnerComponent),
-      ],
       imports: [
         MatFormFieldModule,
         MatInputModule,
@@ -65,6 +54,10 @@ describe('FileUploadEditorComponent', () => {
         MatNativeDateModule,
         ReactiveFormsModule,
         BrowserAnimationsModule,
+        FileUploadEditorComponent,
+        ConvertForDataTestPipe,
+        MockComponent(ValidationErrorComponent),
+        MockComponent(SpinnerComponent),
       ],
       providers: [
         FormGroupDirective,
@@ -100,9 +93,7 @@ describe('FileUploadEditorComponent', () => {
       component.label = 'Ein Label';
       fixture.detectChanges();
 
-      const element: HTMLElement = fixture.nativeElement.querySelector(
-        '[data-test-id="Ein_Label-file-upload-input"]',
-      );
+      const element: HTMLElement = fixture.nativeElement.querySelector('[data-test-id="Ein_Label-file-upload-input"]');
 
       expect(element).toBeInstanceOf(HTMLElement);
     });
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.ts
index 148f7d0dd0..5c75b22163 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.ts
@@ -21,36 +21,44 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { StateResource } from '@alfa-client/tech-shared';
-import {
-  Component,
-  ElementRef,
-  EventEmitter,
-  HostListener,
-  Input,
-  OnInit,
-  Output,
-  ViewChild,
-} from '@angular/core';
+import { ConvertForDataTestPipe, StateResource } from '@alfa-client/tech-shared';
+import { Component, ElementRef, EventEmitter, HostListener, inject, Input, OnInit, Output, ViewChild } from '@angular/core';
 import {
   ControlContainer,
   FormGroupDirective,
+  FormsModule,
+  ReactiveFormsModule,
   UntypedFormArray,
   UntypedFormControl,
 } from '@angular/forms';
+import { MatRipple } from '@angular/material/core';
+import { MatError } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
 import { uniqueId } from 'lodash-es';
+import { SpinnerComponent } from '../../spinner/spinner.component';
+import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 
 @Component({
   selector: 'ozgcloud-file-upload-editor',
   templateUrl: './file-upload-editor.component.html',
   styleUrls: ['./file-upload-editor.component.scss'],
   viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
+  standalone: true,
+  imports: [
+    FormsModule,
+    ReactiveFormsModule,
+    MatRipple,
+    MatIcon,
+    SpinnerComponent,
+    MatError,
+    ValidationErrorComponent,
+    ConvertForDataTestPipe,
+  ],
 })
-export class FileUploadEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements OnInit
-{
+export class FileUploadEditorComponent extends FormControlEditorAbstractComponent implements OnInit {
+  public parentForm = inject(FormGroupDirective);
+
   @Input() label: string = '';
   @Input() parentFormArrayName: string;
   @Input() accept: string = '*/*';
@@ -72,19 +80,13 @@ export class FileUploadEditorComponent
     this.setErrors();
   }
 
-  constructor(public parentForm: FormGroupDirective) {
-    super(null);
-  }
-
   override ngOnInit(): void {
     this.fileLinkControls = this.parentForm.form.get(this.parentFormArrayName) as UntypedFormArray;
   }
 
   buildFormArray(fileLinkList: string[]): void {
     this.fileLinkControls.clear();
-    fileLinkList.forEach((link: string) =>
-      this.fileLinkControls.push(new UntypedFormControl(link)),
-    );
+    fileLinkList.forEach((link: string) => this.fileLinkControls.push(new UntypedFormControl(link)));
   }
 
   resetInput(): void {
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.html b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.html
new file mode 100644
index 0000000000..8dab6eb918
--- /dev/null
+++ b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.html
@@ -0,0 +1,66 @@
+<!--
+
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+Lizenziert unter der EUPL, Version 1.2 oder - sobald
+diese von der Europäischen Kommission genehmigt wurden -
+Folgeversionen der EUPL ("Lizenz");
+Sie dürfen dieses Werk ausschließlich gemäß
+dieser Lizenz nutzen.
+Eine Kopie der Lizenz finden Sie hier:
+
+https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+Sofern nicht durch anwendbare Rechtsvorschriften
+gefordert oder in schriftlicher Form vereinbart, wird
+die unter der Lizenz verbreitete Software "so wie sie
+ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ausdrücklich oder stillschweigend - verbreitet.
+Die sprachspezifischen Genehmigungen und Beschränkungen
+unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<mat-form-field
+  [subscriptSizing]="subscriptSizing"
+  class="compact-input"
+  appearance="{{ appearance }}"
+  [floatLabel]="readOnly || autoFocus ? 'always' : 'auto'"
+>
+  <mat-label>{{ label }}</mat-label>
+  <div class="wrapper">
+    <input
+      #inputElement
+      matInput
+      placeholder="{{ placeholder }}"
+      [formControl]="fieldControl"
+      [autocomplete]="autocomplete"
+      [readonly]="readOnly"
+      (blur)="touch()"
+      [required]="required"
+      [attr.data-test-id]="(label | convertForDataTest) + '-text-input'"
+      [class.with-clear-button]="showClearButton$ | async"
+    />
+    @if (showClearButton$ | async) {
+      <button
+        data-test-id="clear-button"
+        class="clear-button"
+        type="button"
+        (click)="onClear()"
+        mat-icon-button
+        aria-label="Leeren"
+      >
+        <mat-icon>close</mat-icon>
+      </button>
+    }
+  </div>
+  <mat-error>
+    <ozgcloud-validation-error
+      [attr.data-test-id]="(getPlaceholderLabel() | convertForDataTest) + '-text-error'"
+      [invalidParams]="invalidParams"
+      [label]="getPlaceholderLabel()"
+    ></ozgcloud-validation-error>
+  </mat-error>
+</mat-form-field>
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.scss b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.scss
similarity index 100%
rename from alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.scss
rename to alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.scss
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.spec.ts
similarity index 84%
rename from alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts
rename to alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.spec.ts
index e2000c8388..52c2e53829 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.spec.ts
@@ -29,18 +29,26 @@ import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { MockComponent } from 'ng-mocks';
 import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
-import { TextEditorComponent } from './text-editor.component';
+import { OzgcloudTextEditorComponent } from './ozgcloud-text-editor.component';
 
-describe('TextEditorComponent', () => {
-  let component: TextEditorComponent;
-  let fixture: ComponentFixture<TextEditorComponent>;
+describe('OzgcloudTextEditorComponent', () => {
+  let component: OzgcloudTextEditorComponent;
+  let fixture: ComponentFixture<OzgcloudTextEditorComponent>;
 
   const input: string = '[data-test-id="Ein_Label-text-input"]';
 
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [TextEditorComponent, ConvertForDataTestPipe, MockComponent(ValidationErrorComponent)],
-      imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule, BrowserAnimationsModule],
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        OzgcloudTextEditorComponent,
+        MatFormFieldModule,
+        MatInputModule,
+        ReactiveFormsModule,
+        BrowserAnimationsModule,
+        ConvertForDataTestPipe,
+        MockComponent(ValidationErrorComponent),
+      ],
+      imports: [],
       providers: [
         {
           provide: NgControl,
@@ -51,7 +59,7 @@ describe('TextEditorComponent', () => {
   });
 
   beforeEach(() => {
-    fixture = TestBed.createComponent(TextEditorComponent);
+    fixture = TestBed.createComponent(OzgcloudTextEditorComponent);
     component = fixture.componentInstance;
     component.label = 'Ein Label';
     fixture.detectChanges();
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.ts
similarity index 69%
rename from alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts
rename to alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.ts
index 5e3227127c..9e1294a605 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/ozgcloud-text-editor.component.ts
@@ -21,21 +21,38 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { hasContent } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, hasContent } from '@alfa-client/tech-shared';
+import { AsyncPipe } from '@angular/common';
 import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
-import { SubscriptSizing } from '@angular/material/form-field';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatIconButton } from '@angular/material/button';
+import { MatError, MatFormField, MatLabel, SubscriptSizing } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatInput } from '@angular/material/input';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
 import { Observable, map, startWith } from 'rxjs';
+import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 
 @Component({
   selector: 'ozgcloud-text-editor',
-  templateUrl: './text-editor.component.html',
-  styleUrls: ['./text-editor.component.scss'],
+  templateUrl: './ozgcloud-text-editor.component.html',
+  styleUrls: ['./ozgcloud-text-editor.component.scss'],
+  standalone: true,
+  imports: [
+    MatFormField,
+    MatLabel,
+    MatInput,
+    FormsModule,
+    ReactiveFormsModule,
+    MatIconButton,
+    MatIcon,
+    MatError,
+    ValidationErrorComponent,
+    AsyncPipe,
+    ConvertForDataTestPipe,
+  ],
 })
-export class TextEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements OnInit, AfterViewInit
-{
+export class OzgcloudTextEditorComponent extends FormControlEditorAbstractComponent implements OnInit, AfterViewInit {
   @ViewChild('inputElement') inputElement: ElementRef;
 
   @Input() label: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.html b/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.html
deleted file mode 100644
index 303e1315d5..0000000000
--- a/alfa-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
-
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
-
-    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
-
-    Sofern nicht durch anwendbare Rechtsvorschriften
-    gefordert oder in schriftlicher Form vereinbart, wird
-    die unter der Lizenz verbreitete Software "so wie sie
-    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
-    ausdrücklich oder stillschweigend - verbreitet.
-    Die sprachspezifischen Genehmigungen und Beschränkungen
-    unter der Lizenz sind dem Lizenztext zu entnehmen.
-
--->
-<mat-form-field
-  [subscriptSizing]="subscriptSizing"
-  class="compact-input"
-  appearance="{{ appearance }}"
-  [floatLabel]="readOnly || autoFocus ? 'always' : 'auto'"
->
-  <mat-label>{{ label }}</mat-label>
-  <div class="wrapper">
-    <input
-      #inputElement
-      matInput
-      placeholder="{{ placeholder }}"
-      [formControl]="fieldControl"
-      [autocomplete]="autocomplete"
-      [readonly]="readOnly"
-      (blur)="touch()"
-      [required]="required"
-      [attr.data-test-id]="(label | convertForDataTest) + '-text-input'"
-      [class.with-clear-button]="showClearButton$ | async"
-    />
-    <button
-      *ngIf="showClearButton$ | async"
-      data-test-id="clear-button"
-      class="clear-button"
-      type="button"
-      (click)="onClear()"
-      mat-icon-button
-      aria-label="Leeren"
-    >
-      <mat-icon>close</mat-icon>
-    </button>
-  </div>
-  <mat-error>
-    <ozgcloud-validation-error
-      [attr.data-test-id]="(getPlaceholderLabel() | convertForDataTest) + '-text-error'"
-      [invalidParams]="invalidParams"
-      [label]="getPlaceholderLabel()"
-    ></ozgcloud-validation-error>
-  </mat-error>
-</mat-form-field>
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
index 49217b8c81..670590d080 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts
@@ -21,12 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
 import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatInputModule } from '@angular/material/input';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { MockComponent } from 'ng-mocks';
 import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 import { TextAreaEditorComponent } from './textarea-editor.component';
@@ -37,12 +37,15 @@ describe('TextAreaEditorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
+      imports: [
+        MatFormFieldModule,
+        MatInputModule,
+        ReactiveFormsModule,
+        BrowserAnimationsModule,
         TextAreaEditorComponent,
         ConvertForDataTestPipe,
         MockComponent(ValidationErrorComponent),
       ],
-      imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule, BrowserAnimationsModule],
       providers: [
         {
           provide: NgControl,
@@ -67,9 +70,7 @@ describe('TextAreaEditorComponent', () => {
     component.label = 'Ein Label';
     fixture.detectChanges();
 
-    const element: HTMLElement = fixture.nativeElement.querySelector(
-      '[data-test-id="Ein_Label-textarea-input"]',
-    );
+    const element: HTMLElement = fixture.nativeElement.querySelector('[data-test-id="Ein_Label-textarea-input"]');
 
     expect(element).toBeInstanceOf(HTMLElement);
   });
diff --git a/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
index 27644f1824..a58f6a04d4 100644
--- a/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts
@@ -21,19 +21,33 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
 import { CdkTextareaAutosize } from '@angular/cdk/text-field';
 import { AfterViewInit, Component, Input, ViewChild } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatError, MatFormField, MatLabel } from '@angular/material/form-field';
+import { MatInput } from '@angular/material/input';
 import { FormControlEditorAbstractComponent } from 'libs/design-component/src/lib/form/formcontrol-editor.abstract.component';
+import { ValidationErrorComponent } from '../../validation-error/validation-error.component';
 
 @Component({
   selector: 'ozgcloud-textarea-editor',
   templateUrl: './textarea-editor.component.html',
   styleUrls: ['./textarea-editor.component.scss'],
+  standalone: true,
+  imports: [
+    MatFormField,
+    MatLabel,
+    MatInput,
+    CdkTextareaAutosize,
+    FormsModule,
+    ReactiveFormsModule,
+    MatError,
+    ValidationErrorComponent,
+    ConvertForDataTestPipe,
+  ],
 })
-export class TextAreaEditorComponent
-  extends FormControlEditorAbstractComponent
-  implements AfterViewInit
-{
+export class TextAreaEditorComponent extends FormControlEditorAbstractComponent implements AfterViewInit {
   @ViewChild('autosize') autosize: CdkTextareaAutosize;
 
   @Input() placeholder: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.spec.ts
index 4f5bc141b8..f8b2852312 100644
--- a/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.spec.ts
@@ -23,12 +23,7 @@
  */
 import { PortalModule } from '@angular/cdk/portal';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import {
-  MatAccordion,
-  MatExpansionPanel,
-  MatExpansionPanelHeader,
-  MatExpansionPanelTitle,
-} from '@angular/material/expansion';
+import { MatAccordion, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle } from '@angular/material/expansion';
 import { MatIcon } from '@angular/material/icon';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { ExpansionPanelComponent } from './expansion-panel.component';
@@ -47,8 +42,8 @@ describe('VorgangDetailExpansionPanelComponent', () => {
         MatAccordion,
         MatIcon,
         MatExpansionPanelHeader,
+        ExpansionPanelComponent,
       ],
-      declarations: [ExpansionPanelComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.ts b/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.ts
index 451efa2332..c1056c852e 100644
--- a/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/expansion-panel/expansion-panel.component.ts
@@ -21,12 +21,18 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { NgStyle } from '@angular/common';
 import { Component, Input } from '@angular/core';
+import { MatIconButton } from '@angular/material/button';
+import { MatAccordion, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle } from '@angular/material/expansion';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-expansion-panel',
   templateUrl: './expansion-panel.component.html',
   styleUrls: ['./expansion-panel.component.scss'],
+  standalone: true,
+  imports: [MatAccordion, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatIconButton, MatIcon, NgStyle],
 })
 export class ExpansionPanelComponent {
   @Input() headline: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.html b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.html
index 3421e95727..6cd69f6200 100644
--- a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.html
@@ -1,40 +1,34 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
-<ng-container *ngIf="uploadInProgress$ | async as uploadInProgress">
-  <input
-    data-test-id="file-upload-input"
-    [id]="myId"
-    type="file"
-    [accept]="accept"
-    (change)="onFileChanged($event)"
-  />
+@if (uploadInProgress$ | async; as uploadInProgress) {
+  <input data-test-id="file-upload-input" [id]="myId" type="file" [accept]="accept" (change)="onFileChanged($event)" />
   <label [attr.for]="myId" matRipple aria-label="Anhang hinzufügen">
-    <mat-icon *ngIf="!uploadInProgress.loading">attach_file</mat-icon>
-
-    <ozgcloud-spinner [stateResource]="uploadInProgress" [diameter]="22" padding="0">
-    </ozgcloud-spinner>
+    @if (!uploadInProgress.loading) {
+      <mat-icon>attach_file</mat-icon>
+    }
+    <ozgcloud-spinner [stateResource]="uploadInProgress" [diameter]="22" padding="0"> </ozgcloud-spinner>
   </label>
-</ng-container>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.spec.ts
index b823f373c5..a8ead2a90d 100644
--- a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.spec.ts
@@ -23,10 +23,10 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { FileUploadComponent } from './file-upload.component';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { MatIcon } from '@angular/material/icon';
 import { MockComponent } from 'ng-mocks';
-import { SpinnerComponent } from '@alfa-client/ui';
+import { FileUploadComponent } from './file-upload.component';
 
 describe('FileUploadComponent', () => {
   let component: FileUploadComponent;
@@ -34,7 +34,7 @@ describe('FileUploadComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [FileUploadComponent, MatIcon, MockComponent(SpinnerComponent)],
+      imports: [FileUploadComponent, MatIcon, MockComponent(SpinnerComponent)],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.ts b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.ts
index cfafed7120..37c1e62075 100644
--- a/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/file-upload/file-upload.component.ts
@@ -21,15 +21,21 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, Output } from '@angular/core';
 import { StateResource } from '@alfa-client/tech-shared';
+import { AsyncPipe } from '@angular/common';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { MatRipple } from '@angular/material/core';
+import { MatIcon } from '@angular/material/icon';
 import { uniqueId } from 'lodash-es';
 import { Observable } from 'rxjs';
+import { SpinnerComponent } from '../spinner/spinner.component';
 
 @Component({
   selector: 'ozgcloud-file-upload',
   templateUrl: './file-upload.component.html',
   styleUrls: ['./file-upload.component.scss'],
+  standalone: true,
+  imports: [MatRipple, MatIcon, SpinnerComponent, AsyncPipe],
 })
 export class FileUploadComponent {
   @Input() accept: string = '*/*';
diff --git a/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
index f74f63c0b9..119257aa82 100644
--- a/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts
@@ -32,8 +32,7 @@ describe('FixedDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MatDialogModule, MatIcon],
-      declarations: [FixedDialogComponent],
+      imports: [MatDialogModule, MatIcon, FixedDialogComponent],
       providers: [
         {
           provide: MatDialogRef,
diff --git a/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts b/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
index 0a0d03890f..a4bb9d6af8 100644
--- a/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts
@@ -21,26 +21,32 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject, Injector } from '@angular/core';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { CdkScrollable } from '@angular/cdk/scrolling';
+import { NgClass, NgComponentOutlet } from '@angular/common';
+import { Component, inject, Injector, OnInit } from '@angular/core';
+import { MatIconButton } from '@angular/material/button';
+import { MAT_DIALOG_DATA, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
 import { FixedDialogData } from './fixed-dialog-data.model';
 
 @Component({
   selector: 'ozgcloud-fixed-dialog',
   templateUrl: './fixed-dialog.component.html',
+  standalone: true,
+  imports: [MatDialogTitle, MatIconButton, NgClass, MatIcon, MatDialogClose, CdkScrollable, MatDialogContent, NgComponentOutlet],
 })
-export class FixedDialogComponent {
+export class FixedDialogComponent implements OnInit {
+  public data = inject<FixedDialogData>(MAT_DIALOG_DATA);
+  private injector = inject(Injector);
+
   componentInjector: Injector;
 
   isMinimized: boolean;
 
-  constructor(
-    @Inject(MAT_DIALOG_DATA) public data: FixedDialogData,
-    injector: Injector,
-  ) {
+  ngOnInit(): void {
     this.componentInjector = Injector.create({
       providers: [],
-      parent: injector,
+      parent: this.injector,
     });
   }
 
diff --git a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
index 29d0ea1951..650e50ec93 100644
--- a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts
@@ -21,10 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatDialogModule } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { ConnectionTimeoutRetryDialogComponent } from './connection-timeout-retry-dialog.component';
 
@@ -34,8 +34,8 @@ describe('ConnectionTimeoutRetryDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MatDialogModule],
-      declarations: [
+      imports: [
+        MatDialogModule,
         ConnectionTimeoutRetryDialogComponent,
         MatIcon,
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
diff --git a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.ts b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.ts
index eb209e7c7b..c2cc728cf6 100644
--- a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.ts
@@ -21,11 +21,16 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { CdkScrollable } from '@angular/cdk/scrolling';
 import { Component } from '@angular/core';
+import { MatDialogContent, MatDialogTitle } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-connection-timeout-retry-dialog',
   templateUrl: './connection-timeout-retry-dialog.component.html',
   styleUrls: ['./connection-timeout-retry-dialog.component.scss'],
+  standalone: true,
+  imports: [MatDialogTitle, MatIcon, CdkScrollable, MatDialogContent],
 })
 export class ConnectionTimeoutRetryDialogComponent {}
diff --git a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
index 42d3c9febf..6c41b694c5 100644
--- a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts
@@ -21,10 +21,10 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatDialogModule } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
-import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { MockComponent } from 'ng-mocks';
 import { ConnectionTimeoutRetryFailDialogComponent } from './connection-timeout-retry-fail-dialog.component';
 
@@ -34,8 +34,8 @@ describe('ConnectionTimeoutRetryFailDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MatDialogModule],
-      declarations: [
+      imports: [
+        MatDialogModule,
         ConnectionTimeoutRetryFailDialogComponent,
         MatIcon,
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
diff --git a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.ts b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.ts
index 858098b7e7..62646a5aad 100644
--- a/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.ts
@@ -21,12 +21,18 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { CdkScrollable } from '@angular/cdk/scrolling';
 import { Component } from '@angular/core';
+import { MatDialogContent, MatDialogTitle } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '../../ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
 
 @Component({
   selector: 'ozgcloud-connection-timeout-retry-fail-dialog',
   templateUrl: './connection-timeout-retry-fail-dialog.component.html',
   styleUrls: ['./connection-timeout-retry-fail-dialog.component.scss'],
+  standalone: true,
+  imports: [MatDialogTitle, MatIcon, CdkScrollable, MatDialogContent, OzgcloudStrokedButtonWithSpinnerComponent],
 })
 export class ConnectionTimeoutRetryFailDialogComponent {
   reload(): void {
diff --git a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html
index 1bb8fb6c94..ce20ce0990 100644
--- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.html
@@ -33,11 +33,15 @@
   (click)="clickEmitter.emit($event)"
   type="button"
 >
-  <mat-icon *ngIf="icon" data-test-class="icon" [style.visibility]="isDisabled ? 'hidden' : 'visible'">
-    {{ icon }}
-  </mat-icon>
+  @if (icon) {
+    <mat-icon data-test-class="icon" [style.visibility]="isDisabled ? 'hidden' : 'visible'">
+      {{ icon }}
+    </mat-icon>
+  }
 
-  <mat-icon *ngIf="svgIcon" data-test-class="icon" [svgIcon]="svgIcon" [style.visibility]="isDisabled ? 'hidden' : 'visible'" />
+  @if (svgIcon) {
+    <mat-icon data-test-class="icon" [svgIcon]="svgIcon" [style.visibility]="isDisabled ? 'hidden' : 'visible'" />
+  }
 
   <ozgcloud-spinner [stateResource]="getStateResource()" [diameter]="22" [show]="showSpinner" padding="0" />
 </button>
diff --git a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
index 7cf06e5752..365f71d7a8 100644
--- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts
@@ -26,7 +26,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
 import { MatMenuModule } from '@angular/material/menu';
 import { TooltipDirective } from '@ods/system';
-import { MockComponent, MockDirective, MockModule } from 'ng-mocks';
+import { MockComponent, MockDirective } from 'ng-mocks';
 import { SpinnerComponent } from '../spinner/spinner.component';
 import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner.component';
 
@@ -37,15 +37,10 @@ describe('IconButtonWithSpinnerComponent', () => {
   const buttonSelector = '[data-test-class="icon-button"]';
   const iconSelector = '[data-test-class="icon"]';
 
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [
-        IconButtonWithSpinnerComponent,
-        MatIcon,
-        MockComponent(SpinnerComponent),
-        MockDirective(TooltipDirective),
-        MockModule(MatMenuModule),
-      ],
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [IconButtonWithSpinnerComponent, MatIcon, MatMenuModule],
+      declarations: [MockComponent(SpinnerComponent), MockDirective(TooltipDirective)],
     });
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts
index e2b8c90813..f83e6bfcc7 100644
--- a/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.ts
@@ -23,13 +23,21 @@
  */
 import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
 import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { MatIconButton } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatMenuTrigger } from '@angular/material/menu';
+import { MatTooltip } from '@angular/material/tooltip';
 import { Resource } from '@ngxp/rest';
+import { TooltipDirective } from '@ods/system';
 import { isNil } from 'lodash-es';
+import { SpinnerComponent } from '../spinner/spinner.component';
 
 @Component({
   selector: 'ozgcloud-icon-button-with-spinner',
   templateUrl: './icon-button-with-spinner.component.html',
   styleUrls: ['./icon-button-with-spinner.component.scss'],
+  standalone: true,
+  imports: [MatIconButton, MatTooltip, MatMenuTrigger, MatIcon, SpinnerComponent, TooltipDirective],
 })
 export class IconButtonWithSpinnerComponent {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
index 3ffd5acf99..7c9621388e 100644
--- a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html
@@ -1,26 +1,26 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
 <h1 mat-dialog-title>
@@ -30,14 +30,13 @@
 <mat-dialog-content>
   <p data-test-id="error-message" class="error-message">
     Wir sind nicht ganz sicher, was schiefgelaufen ist. Der Fehler
-    <span *ngIf="showId()">(ID: {{ data.issues[0].exceptionId }})</span> wurde unserem Support
-    gemeldet. Bitte starten sie die Anwendung neu.
+    @if (showId()) {
+      <span>(ID: {{ data.issues[0].exceptionId }})</span>
+    }
+    wurde unserem Support gemeldet. Bitte starten sie die Anwendung neu.
   </p>
   <a href="/" tabindex="-1" class="button">
-    <ozgcloud-stroked-button-with-spinner
-      icon="refresh"
-      text="Neu starten"
-    ></ozgcloud-stroked-button-with-spinner>
+    <ozgcloud-stroked-button-with-spinner icon="refresh" text="Neu starten"></ozgcloud-stroked-button-with-spinner>
   </a>
   <ozgcloud-stroked-button-with-spinner
     icon="logout"
diff --git a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
index ebc6907e4a..3eb87f3f90 100644
--- a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts
@@ -21,12 +21,12 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
+import { mock } from '@alfa-client/test-utils';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
 import { faker } from '@faker-js/faker';
-import { mock } from '@alfa-client/test-utils';
-import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { OAuthService } from 'angular-oauth2-oidc';
 import { createIssue } from 'libs/tech-shared/test/error';
 import { MockComponent } from 'ng-mocks';
@@ -40,12 +40,12 @@ describe('InternalServerErrorDialogComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
+      imports: [
+        MatDialogModule,
         InternalServerErrorDialogComponent,
         MatIcon,
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
       ],
-      imports: [MatDialogModule],
       providers: [
         {
           provide: MatDialogRef,
@@ -83,9 +83,7 @@ describe('InternalServerErrorDialogComponent', () => {
       dialogData = { error: { ...{ issues: [createIssue()] }, id: exceptionId } };
       fixture.detectChanges();
 
-      expect(fixture.nativeElement).not.toHaveTextContent(
-        `ID: ${dialogData.error.issues[0].exceptionId}`,
-      );
+      expect(fixture.nativeElement).not.toHaveTextContent(`ID: ${dialogData.error.issues[0].exceptionId}`);
     });
   });
 });
diff --git a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
index cfcbff45db..e55158c9e1 100644
--- a/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts
@@ -21,21 +21,24 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Inject } from '@angular/core';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ApiError, hasExceptionId } from '@alfa-client/tech-shared';
+import { CdkScrollable } from '@angular/cdk/scrolling';
+import { Component, inject } from '@angular/core';
+import { MAT_DIALOG_DATA, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
 import { OAuthService } from 'angular-oauth2-oidc';
+import { OzgcloudStrokedButtonWithSpinnerComponent } from '../../ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
 
 @Component({
   selector: 'ozgcloud-internal-server-error-dialog',
   templateUrl: './internal-server-error-dialog.component.html',
   styleUrls: ['./internal-server-error-dialog.component.scss'],
+  standalone: true,
+  imports: [MatDialogTitle, MatIcon, CdkScrollable, MatDialogContent, OzgcloudStrokedButtonWithSpinnerComponent],
 })
 export class InternalServerErrorDialogComponent {
-  constructor(
-    @Inject(MAT_DIALOG_DATA) public data: ApiError,
-    public authService: OAuthService,
-  ) {}
+  public data: ApiError = inject<ApiError>(MAT_DIALOG_DATA);
+  public authService = inject(OAuthService);
 
   showId(): boolean {
     return hasExceptionId(this.data);
diff --git a/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.spec.ts
index f5fbf2d6c3..b53d242247 100644
--- a/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.spec.ts
@@ -23,8 +23,8 @@
  */
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { OpenUrlButtonComponent } from './open-url-button.component';
 import { MockComponent } from 'ng-mocks';
+import { OpenUrlButtonComponent } from './open-url-button.component';
 
 describe('OpenUrlButtonComponent', () => {
   let component: OpenUrlButtonComponent;
@@ -32,7 +32,7 @@ describe('OpenUrlButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OpenUrlButtonComponent, MockComponent(OpenUrlButtonComponent)],
+      imports: [OpenUrlButtonComponent, MockComponent(OpenUrlButtonComponent)],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OpenUrlButtonComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.ts b/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.ts
index 4663a18ab9..f080acaa27 100644
--- a/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.ts
@@ -22,11 +22,16 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatAnchor } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
 
 @Component({
   selector: 'ozgcloud-open-url-button',
   templateUrl: './open-url-button.component.html',
   styleUrls: ['./open-url-button.component.scss'],
+  standalone: true,
+  imports: [MatAnchor, MatTooltip, MatIcon],
 })
 export class OpenUrlButtonComponent {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts
index ee97fa5589..5447abd13a 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts
@@ -41,7 +41,7 @@ describe('OzgcloudButtonWithSpinnerComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
+      imports: [
         MatButton,
         MatRipple,
         OzgcloudButtonWithSpinnerComponent,
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
index 497704e4b9..fb46489bd4 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts
@@ -21,15 +21,21 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { MatButton } from '@angular/material/button';
+import { MatTooltip } from '@angular/material/tooltip';
 import { Resource } from '@ngxp/rest';
+import { TooltipDirective } from '@ods/system';
 import { isNil } from 'lodash-es';
+import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component';
 
 @Component({
   selector: 'ozgcloud-button-with-spinner',
   templateUrl: './ozgcloud-button-with-spinner.component.html',
   styleUrls: ['./ozgcloud-button-with-spinner.component.scss'],
+  standalone: true,
+  imports: [MatButton, MatTooltip, OzgcloudButtonContentComponent, TooltipDirective],
 })
 export class OzgcloudButtonWithSpinnerComponent implements OnInit {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.spec.ts
index 976c0b0c39..48f65db014 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.spec.ts
@@ -61,10 +61,7 @@ describe('IconButtonPrimaryWithSpinnerComponent', () => {
     it('should create aria label', () => {
       component.ngOnInit();
 
-      expect(createAriaLabelForIconButtonMock).toHaveBeenCalledWith(
-        component.tooltip,
-        component.svgIcon,
-      );
+      expect(createAriaLabelForIconButtonMock).toHaveBeenCalledWith(component.tooltip, component.svgIcon);
     });
 
     it('should set aria label', () => {
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.ts
index f6dd2b5094..d5fc959cc4 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component.ts
@@ -21,14 +21,20 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { createAriaLabelForIconButton, StateResource } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { MatIconButton } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
 import { Resource } from '@ngxp/rest';
+import { TooltipDirective } from '@ods/system';
 
 @Component({
   selector: 'ozgcloud-icon-button-primary',
   templateUrl: './ozgcloud-icon-button-primary.component.html',
   styleUrls: ['./ozgcloud-icon-button-primary.component.scss'],
+  standalone: true,
+  imports: [MatIconButton, MatTooltip, MatIcon, TooltipDirective],
 })
 export class OzgcloudIconButtonPrimaryComponent implements OnInit {
   @Input() svgIcon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts
index 208868555e..ac0307f012 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts
@@ -41,7 +41,7 @@ describe('OzgcloudStrokedButtonWithSpinnerComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [
+      imports: [
         MatButton,
         MatRipple,
         OzgcloudStrokedButtonWithSpinnerComponent,
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts
index 218915f94f..36f102a0d7 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts
@@ -21,15 +21,21 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { MatButton } from '@angular/material/button';
+import { MatTooltip } from '@angular/material/tooltip';
 import { Resource } from '@ngxp/rest';
+import { TooltipDirective } from '@ods/system';
 import { isNil } from 'lodash-es';
+import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component';
 
 @Component({
   selector: 'ozgcloud-stroked-button-with-spinner',
   templateUrl: './ozgcloud-stroked-button-with-spinner.component.html',
   styleUrls: ['./ozgcloud-stroked-button-with-spinner.component.scss'],
+  standalone: true,
+  imports: [MatButton, MatTooltip, OzgcloudButtonContentComponent, TooltipDirective],
 })
 export class OzgcloudStrokedButtonWithSpinnerComponent implements OnInit {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html
index 168a6bfdaa..88d174c6a8 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html
@@ -1,47 +1,46 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
-
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
-
-    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
-
-    Sofern nicht durch anwendbare Rechtsvorschriften
-    gefordert oder in schriftlicher Form vereinbart, wird
-    die unter der Lizenz verbreitete Software "so wie sie
-    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
-    ausdrücklich oder stillschweigend - verbreitet.
-    Die sprachspezifischen Genehmigungen und Beschränkungen
-    unter der Lizenz sind dem Lizenztext zu entnehmen.
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+Lizenziert unter der EUPL, Version 1.2 oder - sobald
+diese von der Europäischen Kommission genehmigt wurden -
+Folgeversionen der EUPL ("Lizenz");
+Sie dürfen dieses Werk ausschließlich gemäß
+dieser Lizenz nutzen.
+Eine Kopie der Lizenz finden Sie hier:
+
+https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+Sofern nicht durch anwendbare Rechtsvorschriften
+gefordert oder in schriftlicher Form vereinbart, wird
+die unter der Lizenz verbreitete Software "so wie sie
+ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ausdrücklich oder stillschweigend - verbreitet.
+Die sprachspezifischen Genehmigungen und Beschränkungen
+unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<mat-icon
-  *ngIf="icon"
-  data-test-class="icon"
-  [class.with-text]="text"
-  [style.visibility]="isDisabled ? 'hidden' : 'visible'"
->
-  {{ icon }}
-</mat-icon>
-
-<mat-icon
-  *ngIf="svgIcon"
-  data-test-class="icon"
-  [class.with-text]="text"
-  [svgIcon]="svgIcon"
-  [style.visibility]="isDisabled ? 'hidden' : 'visible'"
->
-</mat-icon>
-
-<span *ngIf="text" class="text-sm" data-test-class="button-with-spinner-text">{{ text }}</span>
-
-<ozgcloud-spinner [diameter]="22" padding="0" [stateResource]="stateResource" [show]="showSpinner">
-</ozgcloud-spinner>
+@if (icon) {
+  <mat-icon data-test-class="icon" [class.with-text]="text" [style.visibility]="isDisabled ? 'hidden' : 'visible'">
+    {{ icon }}
+  </mat-icon>
+}
+
+@if (svgIcon) {
+  <mat-icon
+    data-test-class="icon"
+    [class.with-text]="text"
+    [svgIcon]="svgIcon"
+    [style.visibility]="isDisabled ? 'hidden' : 'visible'"
+  >
+  </mat-icon>
+}
+
+@if (text) {
+  <span class="text-sm" data-test-class="button-with-spinner-text">{{ text }}</span>
+}
+
+<ozgcloud-spinner [diameter]="22" padding="0" [stateResource]="stateResource" [show]="showSpinner"> </ozgcloud-spinner>
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts
index 0a313a7ef6..14e079e54c 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts
@@ -37,7 +37,7 @@ describe('OzgcloudButtonContentComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [MatIcon, MockComponent(SpinnerComponent), OzgcloudButtonContentComponent],
+      imports: [MatIcon, MockComponent(SpinnerComponent), OzgcloudButtonContentComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudButtonContentComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts
index 32283456c7..4e2b5fec9f 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts
@@ -21,14 +21,18 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Input } from '@angular/core';
 import { StateResource } from '@alfa-client/tech-shared';
+import { Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
 import { Resource } from '@ngxp/rest';
+import { SpinnerComponent } from '../../../spinner/spinner.component';
 
 @Component({
   selector: 'ozgcloud-button-content',
   templateUrl: './ozgcloud-button-content.component.html',
   styleUrls: ['./ozgcloud-button-content.component.scss'],
+  standalone: true,
+  imports: [MatIcon, SpinnerComponent],
 })
 export class OzgcloudButtonContentComponent {
   @Input() icon: string;
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 da2fb2923e..077780a3e1 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
@@ -23,13 +23,15 @@
  */
 import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog';
 import { ComponentType } from '@angular/cdk/portal';
-import { Injectable, ViewContainerRef } from '@angular/core';
+import { inject, Injectable, ViewContainerRef } from '@angular/core';
 import { isNil } from 'lodash-es';
 
 @Injectable({
   providedIn: 'root',
 })
 export class OzgcloudDialogService {
+  private dialog = inject(Dialog);
+
   readonly WIZARD_DIALOG_CONFIG: DialogConfig = {
     width: '1000px',
     restoreFocus: false,
@@ -41,8 +43,6 @@ export class OzgcloudDialogService {
     disableClose: true,
   };
 
-  constructor(private dialog: Dialog) {}
-
   public openWizard<C, D, R = unknown>(component: ComponentType<C>, data?: D): DialogRef<R> {
     return this.openDialog<C, R>(component, this.buildDialogConfigWithData<D>(data, this.WIZARD_DIALOG_CONFIG));
   }
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.spec.ts
index 2f46c2cd4b..348a842ef6 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.spec.ts
@@ -31,8 +31,7 @@ describe('OzgcloudIconComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OzgcloudIconComponent],
-      imports: [MatIcon],
+      imports: [MatIcon, OzgcloudIconComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudIconComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.ts
index 888c31801b..b2e99d1f83 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.ts
@@ -22,11 +22,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-icon',
   templateUrl: './ozgcloud-icon.component.html',
   styleUrls: ['./ozgcloud-icon.component.scss'],
+  standalone: true,
+  imports: [MatIcon],
 })
 export class OzgcloudIconComponent {
   @Input() icon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
index e967e79c2a..454e44cb8d 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts
@@ -31,8 +31,7 @@ describe('OzgcloudMenuComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OzgcloudMenuComponent],
-      imports: [MatMenuModule],
+      imports: [MatMenuModule, OzgcloudMenuComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudMenuComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
index bd007c3069..d267a8ffe0 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts
@@ -28,6 +28,8 @@ import { MatMenu } from '@angular/material/menu';
   selector: 'ozgcloud-menu',
   templateUrl: './ozgcloud-menu.component.html',
   styleUrls: ['./ozgcloud-menu.component.scss'],
+  standalone: true,
+  imports: [MatMenu],
 })
 export class OzgcloudMenuComponent {
   @ViewChild('menu', { static: true }) matMenu: MatMenu;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.html b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.html
index 604b944120..f6dd97a4e5 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.html
@@ -1,34 +1,35 @@
 <!--
 
-    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2024 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:
+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
+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.
+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.
 
 -->
-<ozgcloud-icon-button-primary
-  *ngIf="isPasteSupported"
-  [tooltip]="tooltip"
-  svgIcon="paste_from_clipboard"
-  class="paste_icon"
-  (clickEmitter)="onPaste()"
-  data-test-id="paste_from_clipboard"
->
-</ozgcloud-icon-button-primary>
+@if (isPasteSupported) {
+  <ozgcloud-icon-button-primary
+    [tooltip]="tooltip"
+    svgIcon="paste_from_clipboard"
+    class="paste_icon"
+    (clickEmitter)="onPaste()"
+    data-test-id="paste_from_clipboard"
+  >
+  </ozgcloud-icon-button-primary>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.spec.ts
index e91b91840b..918ec8d7c1 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.spec.ts
@@ -50,8 +50,8 @@ describe('OzgcloudPasteTextButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [MatIconTestingModule],
-      declarations: [
+      imports: [
+        MatIconTestingModule,
         OzgcloudPasteTextButtonComponent,
         MockComponent(MatIcon),
         MockComponent(OzgcloudIconButtonPrimaryComponent),
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.ts
index de10060dbe..3fa9c14b0b 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-paste-text-button/ozgcloud-paste-text-button.component.ts
@@ -21,13 +21,16 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { isClipboardReadSupported } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { OzgcloudIconButtonPrimaryComponent } from '../ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component';
 
 @Component({
   selector: 'ozgcloud-paste-text-button',
   templateUrl: './ozgcloud-paste-text-button.component.html',
   styleUrls: ['./ozgcloud-paste-text-button.component.scss'],
+  standalone: true,
+  imports: [OzgcloudIconButtonPrimaryComponent],
 })
 export class OzgcloudPasteTextButtonComponent implements OnInit {
   @Input() tooltip: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.spec.ts
index e29ecd69fc..b789f1e69a 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.spec.ts
@@ -31,8 +31,7 @@ describe('OzgcloudRoutingButtonComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OzgcloudRoutingButtonComponent],
-      imports: [RouterTestingModule],
+      imports: [RouterTestingModule, OzgcloudRoutingButtonComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudRoutingButtonComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.ts
index fa61fa8f60..92d82c8800 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component.ts
@@ -22,11 +22,15 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatAnchor } from '@angular/material/button';
+import { RouterLink } from '@angular/router';
 
 @Component({
   selector: 'ozgcloud-routing-button',
   templateUrl: './ozgcloud-routing-button.component.html',
   styleUrls: ['./ozgcloud-routing-button.component.scss'],
+  standalone: true,
+  imports: [MatAnchor, RouterLink],
 })
 export class OzgcloudRoutingButtonComponent {
   @Input() routerLinkPath: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.spec.ts
index 734f2aa0c6..6189dfc0e3 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.spec.ts
@@ -31,8 +31,7 @@ describe('OzgcloudSvgIconBigComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OzgcloudSvgIconBigComponent],
-      imports: [MatIcon],
+      imports: [MatIcon, OzgcloudSvgIconBigComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudSvgIconBigComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.ts
index e99ad4a83f..5d7c397f0a 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon-big/ozgcloud-svgicon-big.component.ts
@@ -22,11 +22,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-svgicon-big',
   templateUrl: './ozgcloud-svgicon-big.component.html',
   styleUrls: ['./ozgcloud-svgicon-big.component.scss'],
+  standalone: true,
+  imports: [MatIcon],
 })
 export class OzgcloudSvgIconBigComponent {
   @Input() svgIcon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.spec.ts
index 9ce6d63d48..d3f63f4b2c 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.spec.ts
@@ -31,8 +31,7 @@ describe('OzgcloudSvgIconComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [OzgcloudSvgIconComponent],
-      imports: [MatIcon],
+      imports: [MatIcon, OzgcloudSvgIconComponent],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OzgcloudSvgIconComponent);
diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.ts
index 7aa1d869fc..c35c9ab18d 100644
--- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component.ts
@@ -22,11 +22,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
 
 @Component({
   selector: 'ozgcloud-svgicon',
   templateUrl: './ozgcloud-svgicon.component.html',
   styleUrls: ['./ozgcloud-svgicon.component.scss'],
+  standalone: true,
+  imports: [MatIcon],
 })
 export class OzgcloudSvgIconComponent {
   @Input() svgIcon: string;
diff --git a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
index 6f992fe024..3a7dda7133 100644
--- a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
@@ -1,28 +1,30 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
-<div *ngIf="isVisible" class="progressbar-overlay" data-test-class="progressbar-overlay">
-  <mat-progress-bar data-test-id="progress-bar" mode="indeterminate"></mat-progress-bar>
-</div>
+@if (isVisible) {
+  <div class="progressbar-overlay" data-test-class="progressbar-overlay">
+    <mat-progress-bar data-test-id="progress-bar" mode="indeterminate"></mat-progress-bar>
+  </div>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
index 87b2dca90e..a98db10dc4 100644
--- a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts
@@ -34,8 +34,7 @@ describe('ProgressBarComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [ProgressBarComponent],
-      imports: [MatProgressBar],
+      imports: [MatProgressBar, ProgressBarComponent],
     });
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.ts b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.ts
index 69bf1807b1..0ce2009d9f 100644
--- a/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.ts
@@ -21,14 +21,17 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Input } from '@angular/core';
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
+import { Component, Input } from '@angular/core';
+import { MatProgressBar } from '@angular/material/progress-bar';
 import { Resource } from '@ngxp/rest';
 
 @Component({
   selector: 'ozgcloud-progress-bar',
   templateUrl: './progress-bar.component.html',
   styleUrls: ['./progress-bar.component.scss'],
+  standalone: true,
+  imports: [MatProgressBar],
 })
 export class ProgressBarComponent {
   @Input() stateResource: StateResource<Resource> = createEmptyStateResource<Resource>();
diff --git a/alfa-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.ts b/alfa-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.ts
index 951d47620e..862f4c7ec8 100644
--- a/alfa-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.ts
@@ -21,13 +21,18 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, EventEmitter, Input, Output } from '@angular/core';
 import { EMPTY_STRING } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { MatSlideToggle } from '@angular/material/slide-toggle';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TooltipDirective } from '@ods/system';
 
 @Component({
   selector: 'ozgcloud-slide-toggle',
   templateUrl: './slide-toggle.component.html',
   styleUrls: ['./slide-toggle.component.scss'],
+  standalone: true,
+  imports: [MatSlideToggle, MatTooltip, TooltipDirective],
 })
 export class SlideToggleComponent {
   @Input() checked: boolean = false;
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.html b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.html
index fa88c4170c..488dfee2c9 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.html
@@ -1,35 +1,32 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
-<div
-  *ngIf="showSpinner"
-  data-test-class="spinner-transparency"
-  class="spinner"
-  [style.padding]="'16px'"
->
-  <mat-spinner [diameter]="70"></mat-spinner>
-</div>
-
-<ng-content *ngIf="!showSpinner" data-test-class="spinner-transparency-content"></ng-content>
+@if (showSpinner) {
+  <div data-test-class="spinner-transparency" class="spinner" [style.padding]="'16px'">
+    <mat-spinner [diameter]="70"></mat-spinner>
+  </div>
+} @else {
+  <ng-content data-test-class="spinner-transparency-content"></ng-content>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.spec.ts
index 2c13950761..c5c81db615 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.spec.ts
@@ -38,8 +38,7 @@ describe('SpinnerTransparencyComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [SpinnerTransparencyComponent, SpinnerComponent],
-      imports: [MatIcon, MatProgressSpinner],
+      imports: [MatIcon, MatProgressSpinner, SpinnerTransparencyComponent, SpinnerComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.ts b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.ts
index bf70ce6a77..34fa02963b 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/spinner-transparency/spinner-transparency.component.ts
@@ -21,14 +21,17 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { Component, Input } from '@angular/core';
 import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared';
+import { Component, Input } from '@angular/core';
+import { MatProgressSpinner } from '@angular/material/progress-spinner';
 import { Resource } from '@ngxp/rest';
 
 @Component({
   selector: 'ozgcloud-spinner-transparency',
   templateUrl: './spinner-transparency.component.html',
   styleUrls: ['./spinner-transparency.component.scss'],
+  standalone: true,
+  imports: [MatProgressSpinner],
 })
 export class SpinnerTransparencyComponent {
   @Input() stateResource: StateResource<Resource> = createEmptyStateResource<Resource>();
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.html b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.html
index eaa2ab4398..5a426212ea 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.html
@@ -1,31 +1,37 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
-<div *ngIf="showSpinner" class="spinner" [style.padding]="padding + 'px'">
-  <mat-spinner [diameter]="diameter" data-test-class="spinner"> </mat-spinner>
-  <span *ngIf="text">{{ text }}</span>
-</div>
+@if (showSpinner) {
+  <div class="spinner" [style.padding]="padding + 'px'">
+    <mat-spinner [diameter]="diameter" data-test-class="spinner"> </mat-spinner>
+    @if (text) {
+      <span>{{ text }}</span>
+    }
+  </div>
+}
 
-<ng-content *ngIf="!showSpinner" data-test-class="spinner-content"></ng-content>
+@if (!showSpinner) {
+  <ng-content data-test-class="spinner-content"></ng-content>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
index 8bc40b8d5b..27b80e6f55 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts
@@ -37,8 +37,7 @@ describe('SpinnerComponent', () => {
 
   beforeEach(async () => {
     TestBed.configureTestingModule({
-      declarations: [SpinnerComponent],
-      imports: [MatIcon, MatProgressSpinner],
+      imports: [MatIcon, MatProgressSpinner, SpinnerComponent],
     });
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.ts b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.ts
index cfd3cfd4d3..1535029656 100644
--- a/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/spinner/spinner.component.ts
@@ -23,11 +23,14 @@
  */
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
+import { MatProgressSpinner } from '@angular/material/progress-spinner';
 
 @Component({
   selector: 'ozgcloud-spinner',
   templateUrl: './spinner.component.html',
   styleUrls: ['./spinner.component.scss'],
+  standalone: true,
+  imports: [MatProgressSpinner],
 })
 export class SpinnerComponent {
   @Input() stateResource: StateResource<unknown> = createEmptyStateResource<unknown>();
diff --git a/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.spec.ts
index b021131cd7..6586a17065 100644
--- a/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.spec.ts
@@ -30,7 +30,7 @@ describe('SubnavigationComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [SubnavigationComponent],
+      imports: [SubnavigationComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.ts b/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.ts
index 631e4713fa..1e2deca56f 100644
--- a/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/subnavigation/subnavigation.component.ts
@@ -27,5 +27,6 @@ import { Component } from '@angular/core';
   selector: 'ozgcloud-subnavigation',
   templateUrl: './subnavigation.component.html',
   styleUrls: ['./subnavigation.component.scss'],
+  standalone: true,
 })
 export class SubnavigationComponent {}
diff --git a/alfa-client/libs/ui/src/lib/ui/ui.module.spec.ts b/alfa-client/libs/ui/src/lib/ui/ui.module.spec.ts
deleted file mode 100644
index 1133667573..0000000000
--- a/alfa-client/libs/ui/src/lib/ui/ui.module.spec.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { TestBed } from '@angular/core/testing';
-import { UiModule } from './ui.module';
-
-describe('UiModule', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      imports: [UiModule],
-    }).compileComponents();
-  });
-
-  it('should create', () => {
-    expect(UiModule).toBeDefined();
-  });
-});
diff --git a/alfa-client/libs/ui/src/lib/ui/ui.module.ts b/alfa-client/libs/ui/src/lib/ui/ui.module.ts
deleted file mode 100644
index e7c19b188d..0000000000
--- a/alfa-client/libs/ui/src/lib/ui/ui.module.ts
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { CommonModule } from '@angular/common';
-import { HTTP_INTERCEPTORS } from '@angular/common/http';
-import { NgModule } from '@angular/core';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { DateFnsAdapter, MatDateFnsModule } from '@angular/material-date-fns-adapter';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
-import { MatBadgeModule } from '@angular/material/badge';
-import { MatButtonModule } from '@angular/material/button';
-import { MatButtonToggleModule } from '@angular/material/button-toggle';
-import { MatCheckboxModule } from '@angular/material/checkbox';
-import { DateAdapter, MAT_DATE_LOCALE, MatRippleModule } from '@angular/material/core';
-import { MatDatepickerModule } from '@angular/material/datepicker';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatExpansionModule } from '@angular/material/expansion';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatIconModule } from '@angular/material/icon';
-import { MatInputModule } from '@angular/material/input';
-import { MatListModule } from '@angular/material/list';
-import { MatMenuModule } from '@angular/material/menu';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatSlideToggleModule } from '@angular/material/slide-toggle';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
-import { MatTabsModule } from '@angular/material/tabs';
-import { RouterModule } from '@angular/router';
-import {
-  ArrowBackIconComponent,
-  ButtonComponent,
-  FileUploadButtonComponent,
-  SpinnerIconComponent,
-  TooltipDirective,
-} from '@ods/system';
-import { de } from 'date-fns/locale';
-import { AppIconComponent } from '../icon/app-icon/app-icon.component';
-import { PostfachIconComponent } from '../icon/postfach-icon/postfach-icon.component';
-import { HttpConnectionTimeoutInterceptor } from '../interceptor/http-connection-timeout.interceptor';
-import { HttpErrorInterceptor } from '../interceptor/http-error.interceptor';
-import { SnackbarCloseButtonComponent } from '../snackbar/snackbar-close-button/snackbar-close-button.component';
-import { SnackbarErrorComponent } from '../snackbar/snackbar-error/snackbar-error.component';
-import { SnackbarInfoComponent } from '../snackbar/snackbar-info/snackbar-info.component';
-import { AccordionComponent } from './accordion/accordion.component';
-import { BackButtonComponent } from './back-button/back-button.component';
-import { BasicDialogComponent } from './basic-dialog/basic-dialog.component';
-import { DownloadButtonComponent } from './download-button/download-button.component';
-import { AutocompleteEditorComponent } from './editor/autocomplete-editor/autocomplete-editor.component';
-import { CheckboxEnumEditorComponent } from './editor/checkbox-enum-editor/checkbox-enum-editor.component';
-import { DateEditorComponent } from './editor/date-editor/date-editor.component';
-import { FileUploadEditorComponent } from './editor/file-upload-editor/file-upload-editor.component';
-import { TextEditorComponent } from './editor/text-editor/text-editor.component';
-import { TextAreaEditorComponent } from './editor/textarea-editor/textarea-editor.component';
-import { ExpansionPanelComponent } from './expansion-panel/expansion-panel.component';
-import { FileUploadComponent } from './file-upload/file-upload.component';
-import { FixedDialogComponent } from './fixed-dialog/fixed-dialog.component';
-import { ConnectionTimeoutRetryDialogComponent } from './http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component';
-import { ConnectionTimeoutRetryFailDialogComponent } from './http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component';
-import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner/icon-button-with-spinner.component';
-import { InternalServerErrorDialogComponent } from './notification/internal-server-error-dialog/internal-server-error-dialog.component';
-import { OpenUrlButtonComponent } from './open-url-button/open-url-button.component';
-import { OzgcloudButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component';
-import { OzgcloudIconButtonPrimaryComponent } from './ozgcloud-button/ozgcloud-icon-button-primary/ozgcloud-icon-button-primary.component';
-import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component';
-import { OzgcloudButtonContentComponent } from './ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component';
-import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component';
-import { OzgcloudMenuComponent } from './ozgcloud-menu/ozgcloud-menu.component';
-import { OzgcloudPasteTextButtonComponent } from './ozgcloud-paste-text-button/ozgcloud-paste-text-button.component';
-import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component';
-import { OzgcloudSvgIconBigComponent } from './ozgcloud-svgicon-big/ozgcloud-svgicon-big.component';
-import { OzgcloudSvgIconComponent } from './ozgcloud-svgicon/ozgcloud-svgicon.component';
-import { ProgressBarComponent } from './progress-bar/progress-bar.component';
-import { SlideToggleComponent } from './slide-toggle/slide-toggle.component';
-import { SpinnerTransparencyComponent } from './spinner-transparency/spinner-transparency.component';
-import { SpinnerComponent } from './spinner/spinner.component';
-import { SubnavigationComponent } from './subnavigation/subnavigation.component';
-import { ValidationErrorComponent } from './validation-error/validation-error.component';
-
-@NgModule({
-  declarations: [
-    SubnavigationComponent,
-    SpinnerComponent,
-    OzgcloudButtonWithSpinnerComponent,
-    OzgcloudStrokedButtonWithSpinnerComponent,
-    IconButtonWithSpinnerComponent,
-    ProgressBarComponent,
-    ExpansionPanelComponent,
-    SnackbarInfoComponent,
-    SnackbarErrorComponent,
-    FileUploadComponent,
-    DateEditorComponent,
-    TextEditorComponent,
-    TextAreaEditorComponent,
-    ValidationErrorComponent,
-    AutocompleteEditorComponent,
-    FixedDialogComponent,
-    InternalServerErrorDialogComponent,
-    FileUploadEditorComponent,
-    PostfachIconComponent,
-    AccordionComponent,
-    AppIconComponent,
-    SlideToggleComponent,
-    BackButtonComponent,
-    OzgcloudIconButtonPrimaryComponent,
-    OzgcloudIconComponent,
-    OzgcloudRoutingButtonComponent,
-    OzgcloudSvgIconComponent,
-    OzgcloudSvgIconBigComponent,
-    SpinnerTransparencyComponent,
-    OpenUrlButtonComponent,
-    DownloadButtonComponent,
-    ConnectionTimeoutRetryDialogComponent,
-    ConnectionTimeoutRetryFailDialogComponent,
-    SnackbarCloseButtonComponent,
-    BasicDialogComponent,
-    OzgcloudButtonContentComponent,
-    OzgcloudPasteTextButtonComponent,
-    CheckboxEnumEditorComponent,
-    OzgcloudMenuComponent,
-  ],
-  imports: [
-    MatButtonModule,
-    MatIconModule,
-    MatProgressBarModule,
-    MatProgressSpinnerModule,
-    MatMenuModule,
-    MatSlideToggleModule,
-    MatExpansionModule,
-    MatRippleModule,
-    MatSnackBarModule,
-    MatCheckboxModule,
-    MatFormFieldModule,
-    MatInputModule,
-    MatListModule,
-    MatDatepickerModule,
-    MatDateFnsModule,
-    FormsModule,
-    ReactiveFormsModule,
-    MatAutocompleteModule,
-    MatDialogModule,
-    MatTabsModule,
-    MatBadgeModule,
-    CommonModule,
-    TechSharedModule,
-    RouterModule,
-    MatButtonToggleModule,
-    FileUploadButtonComponent,
-    SpinnerIconComponent,
-    TooltipDirective,
-    ButtonComponent,
-    ArrowBackIconComponent,
-  ],
-  exports: [
-    MatButtonModule,
-    MatIconModule,
-    MatProgressBarModule,
-    MatProgressSpinnerModule,
-    MatMenuModule,
-    MatSlideToggleModule,
-    MatExpansionModule,
-    MatRippleModule,
-    MatSnackBarModule,
-    MatCheckboxModule,
-    MatFormFieldModule,
-    MatInputModule,
-    MatListModule,
-    MatDatepickerModule,
-    MatDateFnsModule,
-    FormsModule,
-    ReactiveFormsModule,
-    MatAutocompleteModule,
-    MatDialogModule,
-    MatTabsModule,
-    MatBadgeModule,
-    CommonModule,
-    TechSharedModule,
-    RouterModule,
-    MatButtonToggleModule,
-    SubnavigationComponent,
-    SpinnerComponent,
-    OzgcloudIconButtonPrimaryComponent,
-    OzgcloudButtonWithSpinnerComponent,
-    OzgcloudStrokedButtonWithSpinnerComponent,
-    IconButtonWithSpinnerComponent,
-    ProgressBarComponent,
-    ExpansionPanelComponent,
-    SnackbarInfoComponent,
-    SnackbarErrorComponent,
-    FileUploadComponent,
-    DateEditorComponent,
-    TextEditorComponent,
-    TextAreaEditorComponent,
-    ValidationErrorComponent,
-    AutocompleteEditorComponent,
-    FixedDialogComponent,
-    InternalServerErrorDialogComponent,
-    FileUploadEditorComponent,
-    PostfachIconComponent,
-    AccordionComponent,
-    AppIconComponent,
-    SlideToggleComponent,
-    BackButtonComponent,
-    OzgcloudIconComponent,
-    OzgcloudRoutingButtonComponent,
-    OzgcloudSvgIconComponent,
-    OzgcloudSvgIconBigComponent,
-    SpinnerTransparencyComponent,
-    OpenUrlButtonComponent,
-    DownloadButtonComponent,
-    ConnectionTimeoutRetryDialogComponent,
-    ConnectionTimeoutRetryFailDialogComponent,
-    SnackbarCloseButtonComponent,
-    BasicDialogComponent,
-    OzgcloudPasteTextButtonComponent,
-    CheckboxEnumEditorComponent,
-    FileUploadButtonComponent,
-    OzgcloudButtonContentComponent,
-    OzgcloudMenuComponent,
-  ],
-  providers: [
-    {
-      provide: HTTP_INTERCEPTORS,
-      useClass: HttpErrorInterceptor,
-      multi: true,
-    },
-    {
-      provide: HTTP_INTERCEPTORS,
-      useClass: HttpConnectionTimeoutInterceptor,
-      multi: true,
-    },
-    {
-      provide: MAT_DATE_LOCALE,
-      useValue: de,
-    },
-    {
-      provide: DateAdapter,
-      useClass: DateFnsAdapter,
-      deps: [MAT_DATE_LOCALE],
-    },
-  ],
-})
-export class UiModule {}
diff --git a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
index cdf207ba37..673ecf065e 100644
--- a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
@@ -1,26 +1,28 @@
 <!--
 
-    Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
-    Ministerpräsidenten des Landes Schleswig-Holstein
-    Staatskanzlei
-    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+Ministerpräsidenten des Landes Schleswig-Holstein
+Staatskanzlei
+Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 
-    Lizenziert unter der EUPL, Version 1.2 oder - sobald
-    diese von der Europäischen Kommission genehmigt wurden -
-    Folgeversionen der EUPL ("Lizenz");
-    Sie dürfen dieses Werk ausschließlich gemäß
-    dieser Lizenz nutzen.
-    Eine Kopie der Lizenz finden Sie hier:
+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
+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.
+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.
 
 -->
-<span *ngFor="let invalidParam of invalidParams">{{ message(invalidParam) }}</span>
+@for (invalidParam of invalidParams; track invalidParam) {
+  <span>{{ message(invalidParam) }}</span>
+}
diff --git a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.spec.ts
index 0b265b44ec..2e851164cb 100644
--- a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.spec.ts
+++ b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.spec.ts
@@ -33,7 +33,7 @@ describe('ValidationErrorComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [ValidationErrorComponent],
+      imports: [ValidationErrorComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
index 285a9989ed..eae4c1e994 100644
--- a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
@@ -28,6 +28,7 @@ import { Component, Input } from '@angular/core';
   selector: 'ozgcloud-validation-error',
   templateUrl: './validation-error.component.html',
   styleUrls: ['./validation-error.component.scss'],
+  standalone: true,
 })
 export class ValidationErrorComponent {
   @Input() label: string;
diff --git a/alfa-client/libs/user-assistance/src/lib/help-menu/documentation/open-documentation-button/open-documentation-button.component.html b/alfa-client/libs/user-assistance/src/lib/help-menu/documentation/open-documentation-button/open-documentation-button.component.html
index 0179cbc7aa..d3f460b90b 100644
--- a/alfa-client/libs/user-assistance/src/lib/help-menu/documentation/open-documentation-button/open-documentation-button.component.html
+++ b/alfa-client/libs/user-assistance/src/lib/help-menu/documentation/open-documentation-button/open-documentation-button.component.html
@@ -29,4 +29,4 @@
   [targetName]="'_blank'"
   [tooltip]="'Öffnet in einem neuen Tab'"
   data-test-id="open-documentation-button"
-></ozgcloud-open-url-button>
+/>
diff --git a/alfa-client/libs/user-assistance/src/lib/help-menu/help-menu.component.spec.ts b/alfa-client/libs/user-assistance/src/lib/help-menu/help-menu.component.spec.ts
index ba0e572d4e..870deee5a2 100644
--- a/alfa-client/libs/user-assistance/src/lib/help-menu/help-menu.component.spec.ts
+++ b/alfa-client/libs/user-assistance/src/lib/help-menu/help-menu.component.spec.ts
@@ -24,8 +24,9 @@
 import { ApiRootLinkRel } from '@alfa-client/api-root-shared';
 import { GetUrlPipe, HasLinkPipe, createStateResource } from '@alfa-client/tech-shared';
 import { getElementFromDomRoot } from '@alfa-client/test-utils';
-import { UiModule } from '@alfa-client/ui';
+import { OzgcloudIconComponent, OzgcloudMenuComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatMenuTrigger } from '@angular/material/menu';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import {
   DropdownMenuComponent,
@@ -34,9 +35,9 @@ import {
   FileIconComponent,
   HelpIconComponent,
 } from '@ods/system';
+import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
-import { createApiRootResource } from '../../../../../libs/api-root-shared/test/api-root';
 import { DocumentationComponent } from './documentation/documentation.component';
 import { HelpButtonComponent } from './help-button/help-button.component';
 import { HelpMenuComponent } from './help-menu.component';
@@ -54,6 +55,10 @@ describe('HelpMenuComponent', () => {
         HelpMenuComponent,
         HasLinkPipe,
         GetUrlPipe,
+        MatMenuTrigger,
+        MockComponent(OzgcloudMenuComponent),
+        MockComponent(DocumentationComponent),
+        MockComponent(OzgcloudIconComponent),
         MockComponent(DocumentationComponent),
         MockComponent(FileIconComponent),
         MockComponent(HelpIconComponent),
@@ -62,7 +67,7 @@ describe('HelpMenuComponent', () => {
         MockComponent(DropdownMenuLinkItemComponent),
         MockComponent(HelpButtonComponent),
       ],
-      imports: [NoopAnimationsModule, UiModule],
+      imports: [NoopAnimationsModule],
     }).compileComponents();
 
     fixture = TestBed.createComponent(HelpMenuComponent);
diff --git a/alfa-client/libs/user-assistance/src/lib/user-assistance.module.ts b/alfa-client/libs/user-assistance/src/lib/user-assistance.module.ts
index 1eda492b4f..63fc01ce61 100644
--- a/alfa-client/libs/user-assistance/src/lib/user-assistance.module.ts
+++ b/alfa-client/libs/user-assistance/src/lib/user-assistance.module.ts
@@ -21,9 +21,8 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
 import { CommonModule } from '@angular/common';
+import { GetUrlPipe, HasLinkPipe } from '@alfa-client/tech-shared';
 import { NgModule } from '@angular/core';
 import {
   DropdownMenuComponent,
@@ -32,21 +31,27 @@ import {
   FileIconComponent,
   HelpIconComponent,
 } from '@ods/system';
+import { MatFabButton } from '@angular/material/button';
+import { MatMenuTrigger } from '@angular/material/menu';
 import { DocumentationComponent } from './help-menu/documentation/documentation.component';
 import { OpenDocumentationButtonComponent } from './help-menu/documentation/open-documentation-button/open-documentation-button.component';
 import { HelpButtonComponent } from './help-menu/help-button/help-button.component';
 import { HelpMenuComponent } from './help-menu/help-menu.component';
+import { OpenUrlButtonComponent } from '@alfa-client/ui';
 
 @NgModule({
   imports: [
     CommonModule,
-    TechSharedModule,
+    MatMenuTrigger,
+    HasLinkPipe,
+    GetUrlPipe,
+    MatFabButton,
     FileIconComponent,
     HelpIconComponent,
     DropdownMenuComponent,
     DropdownMenuTextItemComponent,
-    UiModule,
     DropdownMenuLinkItemComponent,
+    OpenUrlButtonComponent,
   ],
   declarations: [HelpMenuComponent, DocumentationComponent, OpenDocumentationButtonComponent, HelpButtonComponent],
   exports: [HelpMenuComponent],
diff --git a/alfa-client/libs/user-profile-shared/src/lib/user-profile.repository.spec.ts b/alfa-client/libs/user-profile-shared/src/lib/user-profile.repository.spec.ts
index 844d2d4ad7..9b9cc5c3f6 100644
--- a/alfa-client/libs/user-profile-shared/src/lib/user-profile.repository.spec.ts
+++ b/alfa-client/libs/user-profile-shared/src/lib/user-profile.repository.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { ApiRootLinkRel, ApiRootResource } from '@alfa-client/api-root-shared';
-import { HttpErrorHandler, TechSharedModule } from '@alfa-client/tech-shared';
+import { HttpErrorHandler } from '@alfa-client/tech-shared';
 import { mock, mockClass, useFromMock } from '@alfa-client/test-utils';
 import {
   VorgangHeaderLinkRel,
@@ -33,10 +33,8 @@ import {
 import { ResourceFactory } from '@ngxp/rest';
 import { cold, hot } from 'jest-marbles';
 import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
-import {
-  createVorgangResource,
-  createVorgangWithEingangResource,
-} from 'libs/vorgang-shared/test/vorgang';
+import { InjectorService } from 'libs/tech-shared/src/lib/injector/injector.service';
+import { createVorgangResource, createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { createUserProfileListResource, createUserProfileResource } from '../../test/user-profile';
 import { UserProfileListResource, UserProfileResource } from './user-profile.model';
 import { UserProfileRepository } from './user-profile.repository';
@@ -51,7 +49,7 @@ describe('User profile repository', () => {
   const userProfile: UserProfileResource = createUserProfileResource();
 
   beforeEach(() => {
-    const classMock = mockClass(TechSharedModule);
+    const classMock = mockClass(InjectorService);
     classMock.injector = <any>{ get: () => useFromMock(mock(HttpErrorHandler)) };
 
     repository = new UserProfileRepository(useFromMock(resourceFactory));
diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-header-container/user-profile-in-header/user-profile-in-header.component.spec.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-header-container/user-profile-in-header/user-profile-in-header.component.spec.ts
index 1f91ba4533..ab53c00816 100644
--- a/alfa-client/libs/user-profile/src/lib/user-profile-in-header-container/user-profile-in-header/user-profile-in-header.component.spec.ts
+++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-header-container/user-profile-in-header/user-profile-in-header.component.spec.ts
@@ -28,6 +28,7 @@ import { getUserName, UserProfileResource } from '@alfa-client/user-profile-shar
 import { EventEmitter } from '@angular/core';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatIcon } from '@angular/material/icon';
+import { MatMenuTrigger } from '@angular/material/menu';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { DropdownMenuButtonItemComponent, DropdownMenuComponent, LogoutIconComponent } from '@ods/system';
 import { getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test';
@@ -49,6 +50,7 @@ describe('UserProfileInHeaderComponent', () => {
       declarations: [
         UserProfileInHeaderComponent,
         MatIcon,
+        MatMenuTrigger,
         MockComponent(UserIconComponent),
         MockComponent(DropdownMenuComponent),
         MockComponent(DropdownMenuButtonItemComponent),
diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts
index e8c3f33af4..9d67b5fbb3 100644
--- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts
+++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.spec.ts
@@ -23,9 +23,9 @@
  */
 import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
 import { mock } from '@alfa-client/test-utils';
-import { UiModule } from '@alfa-client/ui';
 import { UserProfileResource, UserProfileService } from '@alfa-client/user-profile-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatMenuTrigger } from '@angular/material/menu';
 import { MockComponent } from 'ng-mocks';
 import { BehaviorSubject } from 'rxjs';
 import { OzgcloudMenuComponent } from '../../../../../../ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component';
@@ -47,6 +47,7 @@ describe('UserProfileButtonContainerComponent', () => {
     TestBed.configureTestingModule({
       declarations: [
         UserProfileButtonContainerComponent,
+        MatMenuTrigger,
         MockComponent(UserIconComponent),
         MockComponent(UserProfileSearchContainerComponent),
         MockComponent(OzgcloudMenuComponent),
@@ -57,7 +58,6 @@ describe('UserProfileButtonContainerComponent', () => {
           useValue: userProfileService,
         },
       ],
-      imports: [UiModule],
     });
   });
 
diff --git a/alfa-client/libs/user-profile/src/lib/user-profile.module.ts b/alfa-client/libs/user-profile/src/lib/user-profile.module.ts
index 408ace4cfb..0f595e41c3 100644
--- a/alfa-client/libs/user-profile/src/lib/user-profile.module.ts
+++ b/alfa-client/libs/user-profile/src/lib/user-profile.module.ts
@@ -21,11 +21,20 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import {
+  AutocompleteEditorComponent,
+  IconButtonWithSpinnerComponent,
+  OzgcloudMenuComponent,
+  SpinnerComponent,
+} from '@alfa-client/ui';
 import { UserProfileSharedModule } from '@alfa-client/user-profile-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
+import { MatMenuTrigger } from '@angular/material/menu';
+import { MatTooltip } from '@angular/material/tooltip';
 import { RouterModule } from '@angular/router';
 import { ButtonWithSpinnerComponent } from '@ods/component';
 import {
@@ -61,13 +70,20 @@ import { UserProfileComponent } from './user-profile/user-profile.component';
 @NgModule({
   imports: [
     CommonModule,
-    TechSharedModule,
-    UiModule,
     UserProfileSharedModule,
     RouterModule,
     OdsUserIconComponent,
     LogoutIconComponent,
     ErrorIconComponent,
+    IconButtonWithSpinnerComponent,
+    HasLinkPipe,
+    MatTooltip,
+    SpinnerComponent,
+    MatMenuTrigger,
+    OzgcloudMenuComponent,
+    MatIcon,
+    AutocompleteEditorComponent,
+    ReactiveFormsModule,
     DropdownMenuComponent,
     DropdownMenuItemComponent,
     DropdownMenuButtonItemComponent,
diff --git a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
index de1ccc1a69..f40d240d63 100644
--- a/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
+++ b/alfa-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts
@@ -22,7 +22,6 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { HasLinkPipe, createEmptyStateResource } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { DropdownMenuComponent } from '@ods/system';
@@ -37,7 +36,7 @@ describe('UserSettingsComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      imports: [NoopAnimationsModule, UiModule],
+      imports: [NoopAnimationsModule],
       declarations: [
         HasLinkPipe,
         UserSettingsComponent,
diff --git a/alfa-client/libs/user-settings/src/lib/user-settings.module.ts b/alfa-client/libs/user-settings/src/lib/user-settings.module.ts
index bafeb748dc..fce1e22c3e 100644
--- a/alfa-client/libs/user-settings/src/lib/user-settings.module.ts
+++ b/alfa-client/libs/user-settings/src/lib/user-settings.module.ts
@@ -21,7 +21,8 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { UiModule } from '@alfa-client/ui';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
+import { SlideToggleComponent } from '@alfa-client/ui';
 import { UserSettingsSharedModule } from '@alfa-client/user-settings-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
@@ -35,7 +36,15 @@ import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-cont
 import { UserSettingsComponent } from './user-settings-container/user-settings/user-settings.component';
 
 @NgModule({
-  imports: [CommonModule, UiModule, UserSettingsSharedModule, DropdownMenuComponent, CloseIconComponent, SettingsIconComponent],
+  imports: [
+    CommonModule,
+    UserSettingsSharedModule,
+    DropdownMenuComponent,
+    CloseIconComponent,
+    SettingsIconComponent,
+    SlideToggleComponent,
+    HasLinkPipe,
+  ],
   declarations: [
     UserSettingsContainerComponent,
     UserSettingsEmailBenachrichtigungComponent,
diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
index ebf2fa64f1..174d105fae 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts
@@ -21,45 +21,28 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog.component';
-import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { COMMAND_ERROR_MESSAGES, CommandErrorMessage, hasCommandError, isSuccessfulDone } from '@alfa-client/command-shared';
+import { createEmptyStateResource, hasContent, isClipboardReadSupported } from '@alfa-client/tech-shared';
 import { mock } from '@alfa-client/test-utils';
 import {
   OzgcloudPasteTextButtonComponent,
   OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
   SnackBarService,
-  TextEditorComponent,
 } from '@alfa-client/ui';
-import { MockComponent, MockDirective } from 'ng-mocks';
 import { VorgangService } from '@alfa-client/vorgang-shared';
-import {
-  MAT_DIALOG_DATA,
-  MatDialogActions,
-  MatDialogContent,
-  MatDialogRef,
-} from '@angular/material/dialog';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormBuilder, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
+import { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
 import { MatIcon } from '@angular/material/icon';
+import { cold, hot } from 'jest-marbles';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
-import {
-  createEmptyStateResource,
-  hasContent,
-  isClipboardReadSupported,
-} from '@alfa-client/tech-shared';
+import { MockComponent, MockDirective } from 'ng-mocks';
 import { EMPTY, NEVER } from 'rxjs';
-import { FormBuilder, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
-import { cold, hot } from 'jest-marbles';
-import {
-  createCommandErrorResource,
-  createCommandResource,
-} from '../../../../command-shared/test/command';
-import {
-  COMMAND_ERROR_MESSAGES,
-  CommandErrorMessage,
-  hasCommandError,
-  isSuccessfulDone,
-} from '@alfa-client/command-shared';
-import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message';
+import { createCommandErrorResource, createCommandResource } from '../../../../command-shared/test/command';
+import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog.component';
 import { AktenzeichenEditDialogFormservice } from './aktenzeichen-edit-dialog.formservice';
+import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message';
 
 jest.mock('@alfa-client/tech-shared');
 const isClipboardReadSupportedMock = isClipboardReadSupported as jest.Mock;
@@ -99,7 +82,7 @@ describe('AktenzeichenEditDialogComponent', () => {
         MockDirective(MatDialogContent),
         MockDirective(MatDialogActions),
         MockComponent(MatIcon),
-        MockComponent(TextEditorComponent),
+        MockComponent(OzgcloudTextEditorComponent),
         MockComponent(OzgcloudPasteTextButtonComponent),
         MockComponent(OzgcloudStrokedButtonWithSpinnerComponent),
       ],
diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
index 79dce7d7da..35789e92ba 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts
@@ -21,40 +21,27 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import {
-  COMMAND_ERROR_MESSAGES,
-  CommandResource,
-  hasCommandError,
-  isSuccessfulDone,
-} from '@alfa-client/command-shared';
-import {
-  createEmptyStateResource,
-  hasContent,
-  isClipboardReadSupported,
-  StateResource,
-} from '@alfa-client/tech-shared';
+import { COMMAND_ERROR_MESSAGES, CommandResource, hasCommandError, isSuccessfulDone } from '@alfa-client/command-shared';
+import { createEmptyStateResource, hasContent, isClipboardReadSupported, StateResource } from '@alfa-client/tech-shared';
 import { SnackBarService } from '@alfa-client/ui';
 import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { Component, Inject, OnInit } from '@angular/core';
+import { UntypedFormGroup } from '@angular/forms';
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 import { map, Observable, of, startWith, tap } from 'rxjs';
 import { AktenzeichenEditDialogData } from './aktenzeichen-edit-dialog.data';
-import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message';
-import { UntypedFormGroup } from '@angular/forms';
 import { AktenzeichenEditDialogFormservice } from './aktenzeichen-edit-dialog.formservice';
+import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message';
 
 @Component({
   selector: 'alfa-aktenzeichen-edit-dialog',
   templateUrl: './aktenzeichen-edit-dialog.component.html',
   styleUrls: ['./aktenzeichen-edit-dialog.component.scss'],
-  providers: [AktenzeichenEditDialogFormservice],
 })
 export class AktenzeichenEditDialogComponent implements OnInit {
   vorgang: VorgangWithEingangResource;
 
-  setAktenzeichenPending$: Observable<StateResource<CommandResource>> = of(
-    createEmptyStateResource<CommandResource>(),
-  );
+  setAktenzeichenPending$: Observable<StateResource<CommandResource>> = of(createEmptyStateResource<CommandResource>());
   hasAktenzeichen$: Observable<boolean>;
   isPasteSupported = false;
 
@@ -73,10 +60,7 @@ export class AktenzeichenEditDialogComponent implements OnInit {
   ngOnInit(): void {
     this.isPasteSupported = isClipboardReadSupported();
     this.formService.setAktenzeichen(this.vorgang.aktenzeichen);
-    this.hasAktenzeichen$ = this.formService
-      .valueChanges()
-      .pipe(startWith(this.vorgang.aktenzeichen))
-      .pipe(map(hasContent));
+    this.hasAktenzeichen$ = this.formService.valueChanges().pipe(startWith(this.vorgang.aktenzeichen)).pipe(map(hasContent));
   }
 
   public onCancel(): void {
@@ -88,11 +72,7 @@ export class AktenzeichenEditDialogComponent implements OnInit {
     this.setAktenzeichenPending$ = this.formService
       .submit()
       .pipe(startWith(createEmptyStateResource<CommandResource>(true)))
-      .pipe(
-        tap((commandStateResource: StateResource<CommandResource>) =>
-          this.onResponse(commandStateResource.resource),
-        ),
-      );
+      .pipe(tap((commandStateResource: StateResource<CommandResource>) => this.onResponse(commandStateResource.resource)));
   }
 
   onResponse(commandResource: CommandResource) {
@@ -111,10 +91,7 @@ export class AktenzeichenEditDialogComponent implements OnInit {
   }
 
   getErrorMessage(commandResource: CommandResource): string {
-    return (
-      COMMAND_ERROR_MESSAGES[commandResource.errorMessage] ||
-      AktenzeichenEditDialogMessages.SET_FAILED
-    );
+    return COMMAND_ERROR_MESSAGES[commandResource.errorMessage] || AktenzeichenEditDialogMessages.SET_FAILED;
   }
 
   paste(clipboardContent: string) {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.spec.ts
index 471467b8ea..5b089dac01 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.spec.ts
@@ -22,7 +22,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { BescheidService } from '@alfa-client/bescheid-shared';
-import { HasLinkPipe, TechSharedModule } from '@alfa-client/tech-shared';
+import { HasLinkPipe } from '@alfa-client/tech-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
@@ -59,7 +59,7 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => {
         MockComponent(SingleFileUploadEditorComponent),
         MockComponent(SpinnerIconComponent),
       ],
-      imports: [ReactiveFormsModule, TechSharedModule],
+      imports: [ReactiveFormsModule],
       providers: [
         {
           provide: BescheidenFormService,
@@ -119,10 +119,7 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => {
 
       component.uploadFile(file);
 
-      expect(bescheidService.uploadBescheidDocument).toHaveBeenCalledWith(
-        bescheidStateResource.resource,
-        file,
-      );
+      expect(bescheidService.uploadBescheidDocument).toHaveBeenCalledWith(bescheidStateResource.resource, file);
     });
   });
 });
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
index 32aba23140..cd9df94996 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
@@ -31,8 +31,22 @@ import { LoeschAnforderungModule } from '@alfa-client/loesch-anforderung';
 import { LoeschAnforderungSharedModule } from '@alfa-client/loesch-anforderung-shared';
 import { PostfachModule } from '@alfa-client/postfach';
 import { PostfachSharedModule } from '@alfa-client/postfach-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import { ConvertForDataTestPipe, ConvertProblemDetailToErrorMessagesPipe, HasLinkPipe } from '@alfa-client/tech-shared';
+import {
+  BackButtonComponent,
+  DateEditorComponent,
+  ExpansionPanelComponent,
+  IconButtonWithSpinnerComponent,
+  OzgcloudIconButtonPrimaryComponent,
+  OzgcloudIconComponent,
+  OzgcloudMenuComponent,
+  OzgcloudPasteTextButtonComponent,
+  OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
+  SpinnerComponent,
+  SpinnerTransparencyComponent,
+  SubnavigationComponent,
+} from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { UserProfileSharedModule } from '@alfa-client/user-profile-shared';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
@@ -40,13 +54,18 @@ import { VorgangSharedUiModule } from '@alfa-client/vorgang-shared-ui';
 import { WiedervorlageModule } from '@alfa-client/wiedervorlage';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatDialogActions, MatDialogContent } from '@angular/material/dialog';
+import { MatIcon } from '@angular/material/icon';
+import { MatMenuTrigger } from '@angular/material/menu';
+import { MatTab, MatTabGroup } from '@angular/material/tabs';
 import { RouterModule, Routes } from '@angular/router';
 import {
   ButtonWithSpinnerComponent,
   FileUploadEditorComponent,
   SingleFileUploadEditorComponent,
-  TextEditorComponent,
   TextareaEditorComponent,
+  TextEditorComponent,
 } from '@ods/component';
 import {
   ArchiveIconComponent,
@@ -76,6 +95,8 @@ import {
   TooltipDirective,
   UndoIconComponent,
 } from '@ods/system';
+import { NotHasAnyLinkPipe } from '../../../tech-shared/src/lib/pipe/not-has-any-link.pipe';
+import { ProgressBarComponent } from '../../../ui/src/lib/ui/progress-bar/progress-bar.component';
 import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component';
 import { AktenzeichenEditableComponent } from './aktenzeichen-editable/aktenzeichen-editable.component';
 import { AbschliessenButtonComponent } from './buttons/abschliessen-button/abschliessen-button.component';
@@ -141,8 +162,6 @@ const routes: Routes = [
     CommonModule,
     RouterModule.forChild(routes),
     VorgangSharedModule,
-    UiModule,
-    TechSharedModule,
     WiedervorlageModule,
     BinaryFileModule,
     ForwardingModule,
@@ -182,6 +201,31 @@ const routes: Routes = [
     ArchiveIconComponent,
     CheckCircleIconComponent,
     CheckIconComponent,
+    MatDialogContent,
+    ReactiveFormsModule,
+    MatIcon,
+    OzgcloudPasteTextButtonComponent,
+    MatDialogActions,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    OzgcloudIconButtonPrimaryComponent,
+    HasLinkPipe,
+    IconButtonWithSpinnerComponent,
+    ExpansionPanelComponent,
+    MatTabGroup,
+    MatTab,
+    NotHasAnyLinkPipe,
+    BackButtonComponent,
+    ConvertForDataTestPipe,
+    ConvertProblemDetailToErrorMessagesPipe,
+    DateEditorComponent,
+    MatMenuTrigger,
+    OzgcloudIconComponent,
+    OzgcloudMenuComponent,
+    SubnavigationComponent,
+    ProgressBarComponent,
+    SpinnerTransparencyComponent,
+    SpinnerComponent,
+    OzgcloudTextEditorComponent,
     DropdownMenuComponent,
     DropdownMenuTextItemComponent,
     MoreIconComponent,
diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-shared-ui.module.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-shared-ui.module.ts
index a6549aff7c..1624a50764 100644
--- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-shared-ui.module.ts
+++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-shared-ui.module.ts
@@ -21,11 +21,22 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import {
+  ConvertForDataTestPipe,
+  EnumToLabelPipe,
+  FormatToPrettyDatePipe,
+  HasLinkPipe,
+  ToEmbeddedResourcesPipe,
+} from '@alfa-client/tech-shared';
+import { OzgcloudSvgIconComponent, SpinnerComponent } from '@alfa-client/ui';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from '@angular/material/autocomplete';
+import { MatFormField, MatFormFieldModule } from '@angular/material/form-field';
+import { MatIcon, MatIconModule } from '@angular/material/icon';
+import { MatInputModule } from '@angular/material/input';
 import { RouterModule } from '@angular/router';
 import { TooltipDirective } from '@ods/system';
 import { AktenzeichenComponent } from './aktenzeichen/aktenzeichen.component';
@@ -39,7 +50,28 @@ import { VorgangStatusTextComponent } from './vorgang-status-text/vorgang-status
 import { WiedervorlageIconComponent } from './wiedervorlage-icon/wiedervorlage-icon.component';
 
 @NgModule({
-  imports: [CommonModule, VorgangSharedModule, UiModule, RouterModule, TechSharedModule, TooltipDirective],
+  imports: [
+    CommonModule,
+    VorgangSharedModule,
+    RouterModule,
+    FormatToPrettyDatePipe,
+    MatIcon,
+    MatIconModule,
+    MatInputModule,
+    MatFormField,
+    MatFormFieldModule,
+    ReactiveFormsModule,
+    MatAutocompleteTrigger,
+    MatAutocomplete,
+    SpinnerComponent,
+    MatOption,
+    ToEmbeddedResourcesPipe,
+    HasLinkPipe,
+    ConvertForDataTestPipe,
+    EnumToLabelPipe,
+    OzgcloudSvgIconComponent,
+    TooltipDirective,
+  ],
   declarations: [
     VorgangSearchContainerComponent,
     VorgangSearchComponent,
diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.spec.ts
index fc9be609db..9b833b8800 100644
--- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.spec.ts
+++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.spec.ts
@@ -21,9 +21,9 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { EnumToLabelPipe } from '@alfa-client/tech-shared';
 import { VorgangResource } from '@alfa-client/vorgang-shared';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { VorgangStatusDotComponent } from './vorgang-status-dot.component';
@@ -37,7 +37,8 @@ describe('VorgangStatusDotComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [VorgangStatusDotComponent, EnumToLabelPipe],
+      imports: [EnumToLabelPipe],
+      declarations: [VorgangStatusDotComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts
index c49336ccf2..ec5f8e7063 100644
--- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts
+++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-status-text/vorgang-status-text.component.spec.ts
@@ -37,7 +37,8 @@ describe('VorgangStatusTextComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [EnumToLabelPipe, VorgangStatusTextComponent],
+      imports: [EnumToLabelPipe],
+      declarations: [VorgangStatusTextComponent],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.repository.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.repository.spec.ts
index fa699a030e..f322aa3551 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.repository.spec.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.repository.spec.ts
@@ -21,34 +21,22 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';
 import { ApiRootLinkRel, ApiRootResource } from '@alfa-client/api-root-shared';
-import {
-  ContentType,
-  GetRequestOptions,
-  HttpErrorHandler,
-  HttpHeader,
-} from '@alfa-client/tech-shared';
+import { BlobWithFileName, ContentType, GetRequestOptions, HttpErrorHandler, HttpHeader } from '@alfa-client/tech-shared';
 import { mock, mockClass, useFromMock } from '@alfa-client/test-utils';
+import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';
 import { LinkRel, ResourceFactory, ResourceUri, getUrl } from '@ngxp/rest';
-import { cold, hot } from 'jest-marbles';
 import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
-import { TechSharedModule } from 'libs/tech-shared/src/lib/tech-shared.module';
+import { InjectorService } from 'libs/tech-shared/src/lib/injector/injector.service';
 import {
   createVorgangListResource,
   createVorgangResource,
   createVorgangWithEingangResource,
 } from 'libs/vorgang-shared/test/vorgang';
-import {
-  VorgangHeaderLinkRel,
-  VorgangListLinkRel,
-  VorgangWithEingangLinkRel,
-} from './../vorgang.linkrel';
-import {
-  VorgangListResource,
-  VorgangResource,
-  VorgangWithEingangResource,
-} from './../vorgang.model';
+import { Observable } from 'rxjs';
+import { singleCold, singleHot } from '../../../../tech-shared/test/marbles';
+import { VorgangHeaderLinkRel, VorgangListLinkRel, VorgangWithEingangLinkRel } from './../vorgang.linkrel';
+import { VorgangListResource, VorgangResource, VorgangWithEingangResource } from './../vorgang.model';
 import { VorgangRepository } from './vorgang.repository';
 
 describe('VorgangRepository', () => {
@@ -70,7 +58,7 @@ describe('VorgangRepository', () => {
     const linkRel: string = 'dummyLinkRel';
 
     beforeEach(() => {
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangListResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangListResource));
     });
 
     it('should call resourceFactory with resource', () => {
@@ -86,20 +74,17 @@ describe('VorgangRepository', () => {
     });
 
     it('should return result', () => {
-      let result = repository.loadVorgangList(apiRootResource, linkRel);
+      let result: Observable<VorgangListResource> = repository.loadVorgangList(apiRootResource, linkRel);
 
-      expect(result).not.toBeNull();
-      expect(result).toBeObservable(cold('a', { a: vorgangListResource }));
+      expect(result).toBeObservable(singleCold(vorgangListResource));
     });
   });
 
   describe('getNextVorgangListPage', () => {
-    const vorgangListResource: VorgangListResource = createVorgangListResource([
-      VorgangListLinkRel.NEXT,
-    ]);
+    const vorgangListResource: VorgangListResource = createVorgangListResource([VorgangListLinkRel.NEXT]);
 
     beforeEach(() => {
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangListResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangListResource));
     });
 
     it('should call resourceFactory with resource', () => {
@@ -115,29 +100,22 @@ describe('VorgangRepository', () => {
     });
 
     it('should return result', () => {
-      let result = repository.getNextVorgangListPage(vorgangListResource);
+      let result: Observable<VorgangListResource> = repository.getNextVorgangListPage(vorgangListResource);
 
-      expect(result).not.toBeNull();
-      expect(result).toBeObservable(cold('a', { a: vorgangListResource }));
+      expect(result).toBeObservable(singleCold(vorgangListResource));
     });
   });
 
   describe('getVorgangWithEingang', () => {
-    const vorgangResource: VorgangResource = createVorgangResource([
-      VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-    ]);
-    const vorgangWithEingangUrl = getUrl(
-      vorgangResource,
-      VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-    );
-    const vorgangWithEingangResource: VorgangWithEingangResource =
-      createVorgangWithEingangResource();
+    const vorgangResource: VorgangResource = createVorgangResource([VorgangHeaderLinkRel.VORGANG_WITH_EINGANG]);
+    const vorgangWithEingangUrl: string = getUrl(vorgangResource, VorgangHeaderLinkRel.VORGANG_WITH_EINGANG);
+    const vorgangWithEingangResource: VorgangWithEingangResource = createVorgangWithEingangResource();
 
     beforeEach(() => {
-      const classMock = mockClass(TechSharedModule);
+      const classMock = mockClass(InjectorService);
       classMock.injector = <any>{ get: () => useFromMock(mock(HttpErrorHandler)) };
 
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangWithEingangResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangWithEingangResource));
     });
 
     it('should call resourceFactory with resource', () => {
@@ -155,18 +133,17 @@ describe('VorgangRepository', () => {
     it('should return result', () => {
       let result = repository.getVorgang(vorgangWithEingangUrl);
 
-      expect(result).not.toBeNull();
-      expect(result).toBeObservable(cold('a', { a: vorgangWithEingangResource }));
+      expect(result).toBeObservable(singleCold(vorgangWithEingangResource));
     });
   });
 
   describe('getAttachments', () => {
-    const vorgangWithEingangResource: VorgangWithEingangResource = createVorgangWithEingangResource(
-      [VorgangWithEingangLinkRel.ATTACHMENTS],
-    );
+    const vorgangWithEingangResource: VorgangWithEingangResource = createVorgangWithEingangResource([
+      VorgangWithEingangLinkRel.ATTACHMENTS,
+    ]);
 
     beforeEach(() => {
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangWithEingangResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangWithEingangResource));
     });
 
     it('should call resourceFactory with resource', () => {
@@ -185,7 +162,7 @@ describe('VorgangRepository', () => {
       let result = repository.getAttachments(vorgangWithEingangResource);
 
       expect(result).not.toBeNull();
-      expect(result).toBeObservable(cold('a', { a: vorgangWithEingangResource }));
+      expect(result).toBeObservable(singleCold(vorgangWithEingangResource));
     });
   });
 
@@ -194,7 +171,7 @@ describe('VorgangRepository', () => {
     const apiRootResource: ApiRootResource = createApiRootResource();
 
     beforeEach(() => {
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangListResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangListResource));
       repository.buildSearchByUrl = jest.fn();
     });
 
@@ -213,19 +190,9 @@ describe('VorgangRepository', () => {
     it('should call buildSearchByUrl', () => {
       const searchString: string = 'i search for...';
       const limit: number = 7;
-      repository.searchVorgaengeBy(
-        apiRootResource,
-        searchString,
-        ApiRootLinkRel.SEARCH_ALLE,
-        limit,
-      );
-
-      expect(repository.buildSearchByUrl).toHaveBeenCalledWith(
-        apiRootResource,
-        searchString,
-        ApiRootLinkRel.SEARCH_ALLE,
-        limit,
-      );
+      repository.searchVorgaengeBy(apiRootResource, searchString, ApiRootLinkRel.SEARCH_ALLE, limit);
+
+      expect(repository.buildSearchByUrl).toHaveBeenCalledWith(apiRootResource, searchString, ApiRootLinkRel.SEARCH_ALLE, limit);
     });
   });
 
@@ -242,11 +209,7 @@ describe('VorgangRepository', () => {
         _links,
       };
 
-      const searchUrl: ResourceUri = repository.buildSearchByUrl(
-        apiRootResource,
-        'searchParam',
-        ApiRootLinkRel.SEARCH_ALLE,
-      );
+      const searchUrl: ResourceUri = repository.buildSearchByUrl(apiRootResource, 'searchParam', ApiRootLinkRel.SEARCH_ALLE);
 
       expect(searchUrl).toEqual(baseUrl + '&' + VorgangRepository.SEARCH_PARAM + '=searchParam');
     });
@@ -254,11 +217,7 @@ describe('VorgangRepository', () => {
     it('should ignore unused, optional parameters', () => {
       const apiRoot: ApiRootResource = buildLinksWithSearch(baseUrl + '{&searchBy,limit}');
 
-      const searchUrl: ResourceUri = repository.buildSearchByUrl(
-        apiRoot,
-        'search',
-        ApiRootLinkRel.SEARCH_ALLE,
-      );
+      const searchUrl: ResourceUri = repository.buildSearchByUrl(apiRoot, 'search', ApiRootLinkRel.SEARCH_ALLE);
 
       expect(searchUrl).toEqual(baseUrl + '&' + VorgangRepository.SEARCH_PARAM + '=search');
     });
@@ -267,16 +226,9 @@ describe('VorgangRepository', () => {
       const limit = 5;
       const res = buildLinksWithSearch(baseUrl + '{&searchBy,limit}');
 
-      const searchUrl: ResourceUri = repository.buildSearchByUrl(
-        res,
-        'search',
-        ApiRootLinkRel.SEARCH_ALLE,
-        limit,
-      );
+      const searchUrl: ResourceUri = repository.buildSearchByUrl(res, 'search', ApiRootLinkRel.SEARCH_ALLE, limit);
 
-      expect(searchUrl).toEqual(
-        baseUrl + '&' + VorgangRepository.SEARCH_PARAM + '=search&limit=' + limit,
-      );
+      expect(searchUrl).toEqual(baseUrl + '&' + VorgangRepository.SEARCH_PARAM + '=search&limit=' + limit);
     });
 
     function buildLinksWithSearch(searchHref: string): ApiRootResource {
@@ -288,21 +240,16 @@ describe('VorgangRepository', () => {
 
   describe('loadMeineVorgaengeList', () => {
     const vorgangListResource: VorgangListResource = createVorgangListResource();
-    const apiRootResource: ApiRootResource = createApiRootResource([
-      ApiRootLinkRel.MEINE_VORGAENGE,
-    ]);
+    const apiRootResource: ApiRootResource = createApiRootResource([ApiRootLinkRel.MEINE_VORGAENGE]);
 
     beforeEach(() => {
-      resourceWrapper.get.mockReturnValue(hot('a', { a: vorgangListResource }));
+      resourceWrapper.get.mockReturnValue(singleHot(vorgangListResource));
     });
 
     it('should call resourceFactory with uri', () => {
       repository.loadMeineVorgaengeList(apiRootResource);
 
-      const urlWithoutParameter: URL = repository.getUrlWithoutParameter(
-        apiRootResource,
-        ApiRootLinkRel.MEINE_VORGAENGE,
-      );
+      const urlWithoutParameter: URL = repository.getUrlWithoutParameter(apiRootResource, ApiRootLinkRel.MEINE_VORGAENGE);
       expect(resourceFactory.fromId).toHaveBeenCalledWith(urlWithoutParameter.href);
     });
 
@@ -313,17 +260,14 @@ describe('VorgangRepository', () => {
     });
 
     it('should return result', () => {
-      let result = repository.loadMeineVorgaengeList(apiRootResource);
+      let result: Observable<VorgangListResource> = repository.loadMeineVorgaengeList(apiRootResource);
 
-      expect(result).not.toBeNull();
-      expect(result).toBeObservable(cold('a', { a: vorgangListResource }));
+      expect(result).toBeObservable(singleCold(vorgangListResource));
     });
   });
 
   describe('export', () => {
-    const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource([
-      VorgangWithEingangLinkRel.EXPORT,
-    ]);
+    const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.EXPORT]);
 
     const body: Blob = new Blob();
     const fileName: string = '927ee047-0123-4c36-911c-52e984accc87_Abgabe.Abgabe.0401.xdomea';
@@ -331,7 +275,7 @@ describe('VorgangRepository', () => {
     const httpResponse: HttpResponse<Blob> = <any>{ body, headers: { get: () => headerString } };
 
     beforeEach(() => {
-      httpClient.get.mockReturnValue(hot('a', { a: httpResponse }));
+      httpClient.get.mockReturnValue(singleHot(httpResponse));
     });
 
     it('should call httpClient', () => {
@@ -341,16 +285,13 @@ describe('VorgangRepository', () => {
 
       repository.export(vorgangWithEingang);
 
-      expect(httpClient.get).toHaveBeenCalledWith(
-        getUrl(vorgangWithEingang, VorgangWithEingangLinkRel.EXPORT),
-        requestOptions,
-      );
+      expect(httpClient.get).toHaveBeenCalledWith(getUrl(vorgangWithEingang, VorgangWithEingangLinkRel.EXPORT), requestOptions);
     });
 
     it('should return value', () => {
-      const result = repository.export(vorgangWithEingang);
+      const result: Observable<BlobWithFileName> = repository.export(vorgangWithEingang);
 
-      expect(result).toBeObservable(cold('b', { b: { blob: body, fileName } }));
+      expect(result).toBeObservable(singleCold({ blob: body, fileName }));
     });
   });
 
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang-shared.module.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang-shared.module.ts
index 57caef2562..b2dd59e658 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang-shared.module.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang-shared.module.ts
@@ -24,7 +24,6 @@
 import { BinaryFileSharedModule } from '@alfa-client/binary-file-shared';
 import { CommandSharedModule } from '@alfa-client/command-shared';
 import { NavigationSharedModule } from '@alfa-client/navigation-shared';
-import { TechSharedModule } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import { RouterModule } from '@angular/router';
@@ -41,7 +40,6 @@ import * as fromVorgang from './+state/vorgang.reducer';
   imports: [
     CommonModule,
     RestModule,
-    TechSharedModule,
     CommandSharedModule,
     BinaryFileSharedModule,
     RouterModule,
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang.module.ts b/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
index cf3421cb9e..d1668cea27 100644
--- a/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
+++ b/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
@@ -22,8 +22,15 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { HintModule } from '@alfa-client/hint';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import {
+  ConvertForDataTestPipe,
+  FormatDateWithoutYearWithTimePipe,
+  FormatDateWithTimePipe,
+  FormatToPrettyDatePipe,
+  HasLinkPipe,
+  ToResourceUriPipe,
+} from '@alfa-client/tech-shared';
+import { OzgcloudIconComponent, OzgcloudRoutingButtonComponent, PostfachIconComponent, SpinnerComponent } from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 import { VorgangSharedUiModule } from '@alfa-client/vorgang-shared-ui';
@@ -31,9 +38,13 @@ import { WiedervorlageModule } from '@alfa-client/wiedervorlage';
 import { ScrollingModule } from '@angular/cdk/scrolling';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
 import { MatButtonToggleModule } from '@angular/material/button-toggle';
+import { MatIcon, MatIconModule } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
 import { RouterModule, Routes } from '@angular/router';
 import { ButtonToggleGroupComponent } from '@ods/component';
+import { HasAnyLinkPipe } from '../../../tech-shared/src/lib/pipe/has-any-link.pipe';
 import { ArchiveIconComponent, ButtonToggleComponent, TooltipDirective } from '@ods/system';
 import { vorgangFilterViewGuard } from './vorgang-filter-view.guard';
 import { VorgangListContainerComponent } from './vorgang-list-container/vorgang-list-container.component';
@@ -169,9 +180,7 @@ const routes: Routes = [
 @NgModule({
   imports: [
     CommonModule,
-    TechSharedModule,
     ScrollingModule,
-    UiModule,
     RouterModule.forChild(routes),
     VorgangSharedModule,
     WiedervorlageModule,
@@ -182,6 +191,21 @@ const routes: Routes = [
     ButtonToggleComponent,
     ButtonToggleGroupComponent,
     ArchiveIconComponent,
+    FormatDateWithTimePipe,
+    FormatDateWithoutYearWithTimePipe,
+    MatIcon,
+    MatTooltip,
+    MatIconModule,
+    FormatToPrettyDatePipe,
+    ToResourceUriPipe,
+    ConvertForDataTestPipe,
+    HasLinkPipe,
+    PostfachIconComponent,
+    SpinnerComponent,
+    ReactiveFormsModule,
+    OzgcloudRoutingButtonComponent,
+    OzgcloudIconComponent,
+    HasAnyLinkPipe,
     TooltipDirective,
   ],
   declarations: [
diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts
index 2d573153c6..f7dfb80e9b 100644
--- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts
+++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts
@@ -21,18 +21,14 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { SimpleChanges } from '@angular/core';
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms';
 import { BinaryFileAttachmentContainerComponent } from '@alfa-client/binary-file';
 import { BinaryFileListResource } from '@alfa-client/binary-file-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
-import { DateEditorComponent, TextAreaEditorComponent, TextEditorComponent } from '@alfa-client/ui';
-import {
-  WiedervorlageLinkRel,
-  WiedervorlageResource,
-  WiedervorlageService,
-} from '@alfa-client/wiedervorlage-shared';
+import { DateEditorComponent, OzgcloudTextEditorComponent, TextAreaEditorComponent } from '@alfa-client/ui';
+import { WiedervorlageLinkRel, WiedervorlageResource, WiedervorlageService } from '@alfa-client/wiedervorlage-shared';
+import { SimpleChanges } from '@angular/core';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
 import { createBinaryFileListResource } from 'libs/binary-file-shared/test/binary-file';
 import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage';
 import { MockComponent } from 'ng-mocks';
@@ -45,10 +41,7 @@ describe('WiedervorlageFormComponent', () => {
   let component: WiedervorlageFormComponent;
   let fixture: ComponentFixture<WiedervorlageFormComponent>;
 
-  const formService = new WiedervorlageFormService(
-    new UntypedFormBuilder(),
-    useFromMock(mock(WiedervorlageService)),
-  );
+  const formService = new WiedervorlageFormService(new UntypedFormBuilder(), useFromMock(mock(WiedervorlageService)));
   const wiedervorlageService: Mock<WiedervorlageService> = mock(WiedervorlageService);
   const wiedervorlage: WiedervorlageResource = createWiedervorlageResource();
 
@@ -57,7 +50,7 @@ describe('WiedervorlageFormComponent', () => {
       declarations: [
         WiedervorlageFormComponent,
         MockComponent(DateEditorComponent),
-        MockComponent(TextEditorComponent),
+        MockComponent(OzgcloudTextEditorComponent),
         MockComponent(TextAreaEditorComponent),
         MockComponent(BinaryFileAttachmentContainerComponent),
         MockComponent(SubmitWiedervorlageButtonComponent),
@@ -118,16 +111,12 @@ describe('WiedervorlageFormComponent', () => {
     });
 
     it('should call wiedervorlage service to get attachments if links exists', () => {
-      const wiedervorlageWithAttachments: WiedervorlageResource = createWiedervorlageResource([
-        WiedervorlageLinkRel.ATTACHMENTS,
-      ]);
+      const wiedervorlageWithAttachments: WiedervorlageResource = createWiedervorlageResource([WiedervorlageLinkRel.ATTACHMENTS]);
       component.wiedervorlage = wiedervorlageWithAttachments;
 
       component.updateAttachments();
 
-      expect(wiedervorlageService.getAttachmentList).toHaveBeenCalledWith(
-        wiedervorlageWithAttachments,
-      );
+      expect(wiedervorlageService.getAttachmentList).toHaveBeenCalledWith(wiedervorlageWithAttachments);
     });
 
     it('should NOT call wiedervorlage service if link is not present', () => {
diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
index ab2dd54f97..86383128c2 100644
--- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
+++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts
@@ -35,8 +35,8 @@ describe('WiedervorlageStatusComponent', () => {
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
-      declarations: [WiedervorlageStatusComponent, ToTrafficLightPipe],
-      imports: [MatIcon],
+      declarations: [WiedervorlageStatusComponent],
+      imports: [MatIcon, ToTrafficLightPipe],
     }).compileComponents();
   });
 
diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts
index 7729ab5f2f..2057849d9d 100644
--- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts
+++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts
@@ -22,13 +22,34 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { BinaryFileModule } from '@alfa-client/binary-file';
-import { TechSharedModule } from '@alfa-client/tech-shared';
-import { UiModule } from '@alfa-client/ui';
+import {
+  ConvertForDataTestPipe,
+  FormatToPrettyDatePipe,
+  HasLinkPipe,
+  ToEmbeddedResourcesPipe,
+  ToResourceUriPipe,
+  ToTrafficLightPipe,
+  ToTrafficLightTooltipPipe,
+} from '@alfa-client/tech-shared';
+import {
+  BackButtonComponent,
+  DateEditorComponent,
+  ExpansionPanelComponent,
+  IconButtonWithSpinnerComponent,
+  OzgcloudStrokedButtonWithSpinnerComponent,
+  OzgcloudTextEditorComponent,
+  SpinnerComponent,
+  SubnavigationComponent,
+  TextAreaEditorComponent,
+} from '@alfa-client/ui';
 import { UserProfileModule } from '@alfa-client/user-profile';
 import { VorgangSharedModule } from '@alfa-client/vorgang-shared';
 import { VorgangSharedUiModule } from '@alfa-client/vorgang-shared-ui';
 import { CommonModule, DatePipe } from '@angular/common';
 import { NgModule } from '@angular/core';
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
 import { RouterModule, Routes } from '@angular/router';
 import { ButtonWithSpinnerComponent } from '@ods/component';
 import {
@@ -71,12 +92,29 @@ const routes: Routes = [
   imports: [
     CommonModule,
     RouterModule.forChild(routes),
-    UiModule,
     VorgangSharedModule,
-    TechSharedModule,
     VorgangSharedUiModule,
     BinaryFileModule,
     UserProfileModule,
+    HasLinkPipe,
+    IconButtonWithSpinnerComponent,
+    OzgcloudStrokedButtonWithSpinnerComponent,
+    MatIcon,
+    MatTooltip,
+    ToTrafficLightTooltipPipe,
+    ToResourceUriPipe,
+    FormatToPrettyDatePipe,
+    SpinnerComponent,
+    ExpansionPanelComponent,
+    ToEmbeddedResourcesPipe,
+    BackButtonComponent,
+    ReactiveFormsModule,
+    OzgcloudTextEditorComponent,
+    TextAreaEditorComponent,
+    DateEditorComponent,
+    SubnavigationComponent,
+    ToTrafficLightPipe,
+    ConvertForDataTestPipe,
     ButtonWithSpinnerComponent,
     TooltipDirective,
     UpdateIconComponent,
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
index 0ca329814a..820da330c9 100644
--- a/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.ts
+++ b/alfa-client/libs/zustaendige-stelle/src/lib/zustaendige-stelle.module.ts
@@ -21,7 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { TechSharedModule } from '@alfa-client/tech-shared';
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@@ -50,7 +49,6 @@ import { ZustaendigeStelleHeaderComponent } from './zustaendige-stelle-header/zu
     CommonModule,
     ButtonComponent,
     CloseIconComponent,
-    TechSharedModule,
     InstantSearchComponent,
     FormsModule,
     ReactiveFormsModule,
diff --git a/alfa-client/nx.json b/alfa-client/nx.json
index 45e3e58f41..4153173c19 100644
--- a/alfa-client/nx.json
+++ b/alfa-client/nx.json
@@ -103,6 +103,7 @@
     }
   },
   "useInferencePlugins": false,
+  "defaultBase": "main",
   "release": {
     "projects": ["admin", "alfa", "info"],
     "projectsRelationship": "independent"
-- 
GitLab