diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
index 5dc954e2c97ce3b5bc3cef43b0cee24532dc987c..15147aaf6e7a835c2392340bb18c2d02c9d80f88 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html
@@ -1,7 +1,10 @@
 <h1 class="heading-1 pb-4">Organisationseinheiten</h1>
 
-<admin-organisationseinheit-list
-  *ngIf="organisationsEinheitResources$ | async as organisationsEinheitResources"
-  [organisationsEinheitResources]="organisationsEinheitResources"
-  data-test-id="organisations-einheit-list"
-/>
+<ng-container *ngIf="organisationsEinheitListStateResource$ | async as organisationsEinheitListStateResource">
+  <ozgcloud-spinner [stateResource]="organisationsEinheitListStateResource">
+    <admin-organisationseinheit-list
+      [organisationsEinheitResources]="organisationsEinheitListStateResource.resource | toEmbeddedResources: OrganisationsEinheitListLinkRel.LIST"
+      data-test-id="organisations-einheit-list"
+    />
+  </ozgcloud-spinner>
+</ng-container>
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
index 43ee626c39887b1f882a4b5af5d23619171a0a63..4df2de4c73425c2807d46e7d01d53d4839eb34af 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts
@@ -1,38 +1,47 @@
-import { AdminOrganisationsEinheitResource, OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings';
-import { createStateResource } from '@alfa-client/tech-shared';
-import { Mock, existsAsHtmlElement, mock } from '@alfa-client/test-utils';
+import { AdminOrganisationsEinheitListResource, OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings';
+import { StateResource, ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech-shared';
+import { Mock, existsAsHtmlElement, getMockComponent, mock } from '@alfa-client/test-utils';
+import { SpinnerComponent } from '@alfa-client/ui';
+import { OrganisationsEinheitListResource } from '@alfa-client/zustaendige-stelle-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ButtonWithSpinnerComponent } from '@ods/component';
 import { MockComponent } from 'ng-mocks';
-import { Observable, of } from 'rxjs';
+import { of } from 'rxjs';
 import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test';
-import {
-  createAdminOrganisationsEinheitListResource,
-  createAdminOrganisationsEinheitResource,
-} from '../../../../test/organisations-einheit/organisations-einheit';
+import { createAdminOrganisationsEinheitListResource } from '../../../../test/organisations-einheit/organisations-einheit';
 import { OrganisationsEinheitService } from '../organisationseinheit.service';
 import { OrganisationsEinheitListComponent } from './organisationseinheit-list/organisationseinheit-list.component';
 
 describe('OrganisationsEinheitContainerComponent', () => {
   let component: OrganisationsEinheitContainerComponent;
   let fixture: ComponentFixture<OrganisationsEinheitContainerComponent>;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
 
-  const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService);
+  const organisationsEinheitListStateResource: StateResource<AdminOrganisationsEinheitListResource> = createStateResource(
+    createAdminOrganisationsEinheitListResource(),
+  );
+
+  const listSelector: string = getDataTestIdOf('organisations-einheit-list');
 
   beforeEach(async () => {
+    organisationsEinheitService = {
+      ...mock(OrganisationsEinheitService),
+      getList: jest.fn().mockReturnValue(of(organisationsEinheitListStateResource)),
+    };
+
     await TestBed.configureTestingModule({
-      declarations: [OrganisationsEinheitContainerComponent, MockComponent(OrganisationsEinheitListComponent)],
+      declarations: [
+        OrganisationsEinheitContainerComponent,
+        MockComponent(OrganisationsEinheitListComponent),
+        MockComponent(SpinnerComponent),
+        ToEmbeddedResourcesPipe,
+      ],
       imports: [ButtonWithSpinnerComponent],
       providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OrganisationsEinheitContainerComponent);
     component = fixture.componentInstance;
-
-    organisationsEinheitService.getList = jest
-      .fn()
-      .mockReturnValue(of(createStateResource(createAdminOrganisationsEinheitListResource())));
-
     fixture.detectChanges();
   });
 
@@ -42,49 +51,37 @@ describe('OrganisationsEinheitContainerComponent', () => {
 
   describe('component', () => {
     describe('ngOnInit', () => {
-      beforeEach(() => {
-        component.loadOrganisationsEinheitResources = jest.fn().mockReturnValue(of([createAdminOrganisationsEinheitResource()]));
-      });
+      it('should call organisationsEinheitService getList', (done) => {
+        component.ngOnInit();
 
-      it('should call loadOrganisationsEinheitResources', () => {
-        component.organisationsEinheitResources$.subscribe(() => {
-          expect(component.loadOrganisationsEinheitResources).toHaveBeenCalled();
+        component.organisationsEinheitListStateResource$.subscribe(() => {
+          expect(organisationsEinheitService.getList).toHaveBeenCalled();
+          done();
         });
       });
 
-      it('should set organisationsEinheitResources', () => {
+      it('should set organisationsEinheitListStateResource$', (done) => {
         component.ngOnInit();
 
-        component.organisationsEinheitResources$.subscribe(
-          (organisationsEinheitResources: AdminOrganisationsEinheitResource[]) => {
-            expect(organisationsEinheitResources.length).toBe(1);
+        component.organisationsEinheitListStateResource$.subscribe(
+          (listStateResource: StateResource<OrganisationsEinheitListResource>) => {
+            expect(listStateResource).toBe(organisationsEinheitListStateResource);
+            done();
           },
         );
       });
     });
-
-    describe('loadOrganisationsEinheitResources', () => {
-      it('should call organisationsEinheitService getList', () => {
-        component.loadOrganisationsEinheitResources();
-
-        expect(organisationsEinheitService.getList).toHaveBeenCalled();
-      });
-
-      it('should set organisationsEinheitResources', () => {
-        const organisationsEinheitResources$: Observable<AdminOrganisationsEinheitResource[]> =
-          component.loadOrganisationsEinheitResources();
-
-        organisationsEinheitResources$.subscribe((organisationsEinheitResources: AdminOrganisationsEinheitResource[]) => {
-          expect(organisationsEinheitResources.length).toBe(1);
-        });
-      });
-    });
   });
 
   describe('template', () => {
     describe('organisationsEinheiten list', () => {
       it('should show list', () => {
-        existsAsHtmlElement(fixture, getDataTestIdOf('organisations-einheit-list'));
+        existsAsHtmlElement(fixture, listSelector);
+      });
+
+      it('should have organisationsEinheitResources', () => {
+        const listComponent: OrganisationsEinheitListComponent = getMockComponent(fixture, OrganisationsEinheitListComponent);
+        expect(listComponent.organisationsEinheitResources).toBeTruthy();
       });
     });
   });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
index ce5610b8b2d295c591265cc930f96f4b5c1684a4..eaa53e7accd8d8f1a27c8ed39dd64e47b5c94ce9 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts
@@ -1,8 +1,8 @@
-import { getEmbeddedResources, StateResource } from '@alfa-client/tech-shared';
+import { StateResource } from '@alfa-client/tech-shared';
 import { Component, OnInit } from '@angular/core';
-import { map, Observable } from 'rxjs';
+import { Observable } from 'rxjs';
 import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel';
-import { AdminOrganisationsEinheitListResource, AdminOrganisationsEinheitResource } from '../organisations-einheit.model';
+import { AdminOrganisationsEinheitListResource } from '../organisations-einheit.model';
 import { OrganisationsEinheitService } from '../organisationseinheit.service';
 
 @Component({
@@ -10,24 +10,13 @@ import { OrganisationsEinheitService } from '../organisationseinheit.service';
   templateUrl: './organisationseinheit-container.component.html',
 })
 export class OrganisationsEinheitContainerComponent implements OnInit {
-  organisationsEinheitResources$: Observable<AdminOrganisationsEinheitResource[]>;
+  organisationsEinheitListStateResource$: Observable<StateResource<AdminOrganisationsEinheitListResource>>;
+
+  public readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel;
 
   constructor(private organisationsEinheitService: OrganisationsEinheitService) {}
 
   ngOnInit(): void {
-    this.organisationsEinheitResources$ = this.loadOrganisationsEinheitResources();
-  }
-
-  loadOrganisationsEinheitResources(): Observable<AdminOrganisationsEinheitResource[]> {
-    return this.organisationsEinheitService
-      .getList()
-      .pipe(
-        map((organisationsEinheitListResource: StateResource<AdminOrganisationsEinheitListResource>) =>
-          getEmbeddedResources<AdminOrganisationsEinheitResource>(
-            organisationsEinheitListResource,
-            OrganisationsEinheitListLinkRel.LIST,
-          ),
-        ),
-      );
+    this.organisationsEinheitListStateResource$ = this.organisationsEinheitService.getList();
   }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
index c15165d10d23dd9e1d9bbe53429b1c533d598fd5..4d7bb88c347ce810280f41d2202077cccf4e9062 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html
@@ -1,7 +1,7 @@
 <ods-list *ngIf="organisationsEinheitResources.length > 0" data-test-id="organisations-einheit-list">
   <ods-list-item
     *ngFor="let organisationsEinheitResource of organisationsEinheitResources"
-    [path]="getEncodedSelfLink(organisationsEinheitResource)"
+    [path]="organisationsEinheitResource | toResourceUri"
     [class.text-red-500]="
       organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG ||
       organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.ORGANISATIONSEINHEIT_ID_NOT_UNIQUE
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
index e39d5d9c2c40866380db9bf83538d04b5d7feace..1ed84ced8bdd0a6662cb17d9d227c1b3a2a46b31 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts
@@ -1,8 +1,9 @@
 import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings';
-import { ConvertForDataTestPipe } from '@alfa-client/tech-shared';
+import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared';
 import {
   existsAsHtmlElement,
   getElementFromFixture,
+  getElementFromFixtureByType,
   getElementsFromFixture,
   mock,
   notExistsAsHtmlElement,
@@ -10,7 +11,6 @@ import {
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatTooltipModule } from '@angular/material/tooltip';
 import { ActivatedRoute } from '@angular/router';
-import { ResourceUri } from '@ngxp/rest';
 import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockModule } from 'ng-mocks';
@@ -23,6 +23,13 @@ describe('OrganisationsEinheitListComponent', () => {
 
   const listSelector: string = getDataTestIdOf('organisations-einheit-list');
   const listItemSelector: string = getDataTestIdOf('organisations-einheit-list-item');
+  const organisationsEinheitNameSelector: string = getDataTestIdOf('organisations-einheit-name');
+  const organisationsEinheitIdSelector: string = getDataTestIdOf('organisations-einheit-id');
+
+  const organisationsEinheitResource: AdminOrganisationsEinheitResource = {
+    ...createAdminOrganisationsEinheitResource(),
+    syncResult: AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG,
+  };
 
   beforeEach(async () => {
     await TestBed.configureTestingModule({
@@ -32,7 +39,7 @@ describe('OrganisationsEinheitListComponent', () => {
           useValue: mock(ActivatedRoute),
         },
       ],
-      declarations: [OrganisationsEinheitListComponent, ConvertForDataTestPipe, MockModule(MatTooltipModule)],
+      declarations: [OrganisationsEinheitListComponent, ConvertForDataTestPipe, ToResourceUriPipe, MockModule(MatTooltipModule)],
       imports: [ListComponent, ListItemComponent, ExclamationIconComponent],
     }).compileComponents();
 
@@ -47,32 +54,25 @@ describe('OrganisationsEinheitListComponent', () => {
 
   describe('input', () => {
     describe('organisationsEinheitResources', () => {
-      const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource(
-        AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG,
-      );
-
       beforeEach(() => {
         component.organisationsEinheitResources = [organisationsEinheitResource];
         fixture.detectChanges();
       });
 
       it('should set organisationsEinheitResource name', () => {
-        const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector);
-        const nameElement: Element = listItemElement.querySelector('[data-test-id="organisations-einheit-name"]');
+        const nameElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitNameSelector);
 
         expect(nameElement.textContent).toBe(organisationsEinheitResource.name);
       });
 
       it('should set organisationsEinheitResource organisationsEinheitId', () => {
-        const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector);
-        const idElement: Element = listItemElement.querySelector('[data-test-id="organisations-einheit-id"]');
+        const idElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitIdSelector);
 
         expect(idElement.textContent).toBe(organisationsEinheitResource.organisationsEinheitId);
       });
 
       it('should set exclamation icon', () => {
-        const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector);
-        const iconElement: Element = listItemElement.querySelector('ods-exclamation-icon');
+        const iconElement: ExclamationIconComponent = getElementFromFixtureByType(fixture, ExclamationIconComponent);
 
         expect(iconElement).toBeTruthy();
       });
@@ -107,14 +107,6 @@ describe('OrganisationsEinheitListComponent', () => {
         expect(component.organisationsEinheitResources[2].isChild).toBeTruthy();
       });
     });
-    describe('getEncodedSelfLink', () => {
-      it('should return encoded self link', () => {
-        const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
-        const result: ResourceUri = component.getEncodedSelfLink(organisationsEinheitResource);
-
-        expect(result).toBeDefined();
-      });
-    });
   });
 
   describe('template', () => {
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
index 9faaabdd00916cb80761e1833a2d9fbe03375add..51937dcb6d5bc30bec596b5514879c14fca79dcc 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts
@@ -1,8 +1,5 @@
 import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings';
-import { encodeUrlForEmbedding } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
-import { ResourceUri, getLink } from '@ngxp/rest';
-import { OrganisationsEinheitLinkRel } from '../../organisations-einheit.linkrel';
 
 @Component({
   selector: 'admin-organisationseinheit-list',
@@ -23,7 +20,7 @@ export class OrganisationsEinheitListComponent {
   public readonly AdminOrganisationsEinheitSyncResult = AdminOrganisationsEinheitSyncResult;
 
   moveChildrenIntoParentLevel(list: AdminOrganisationsEinheitResource[]): void {
-    list.forEach((parent) => {
+    list.forEach((parent: AdminOrganisationsEinheitResource) => {
       this._organisationsEinheitResources.push(parent);
 
       if (parent._embedded && Array.isArray(parent._embedded.childList)) {
@@ -34,9 +31,4 @@ export class OrganisationsEinheitListComponent {
       }
     });
   }
-
-  getEncodedSelfLink(organisationsEinheitResource: AdminOrganisationsEinheitResource): ResourceUri {
-    const resourceUri: ResourceUri = getLink(organisationsEinheitResource, OrganisationsEinheitLinkRel.SELF).href;
-    return encodeUrlForEmbedding(resourceUri);
-  }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html
index f31e92e3c557900090fce127c00d206ce8f19d51..097bae6dc28c04048164fcc07896dee8a37ff43f 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html
@@ -1,8 +1,10 @@
-<h1 class="heading-1" data-test-id="organisations-form-container-headline">
-    {{ (organisationsEinheitStateResource$ | async)?.resource?.name }}
-</h1>
+<ng-container *ngIf="organisationsEinheitStateResource$ | async as organisationsEinheitStateResource">
+    <ozgcloud-spinner [stateResource]="organisationsEinheitStateResource">
+        <h1 class="heading-1" data-test-id="organisations-form-container-headline">{{ organisationsEinheitStateResource.resource?.name }}</h1>
 
-<admin-organisationseinheit-form
-  [organisationsEinheitStateResource]="organisationsEinheitStateResource$ | async"
-  data-test-id="organisations-form"
-/>
\ No newline at end of file
+        <admin-organisationseinheit-form
+          [organisationsEinheitStateResource]="organisationsEinheitStateResource"
+          data-test-id="organisations-form"
+        />
+    </ozgcloud-spinner>
+</ng-container>
\ No newline at end of file
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts
index c0854bf5313ee7fc349c7049dc8f7befe498c869..cdb93ce6d6c9ff32ad146a4a7a19946faac2b84d 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts
@@ -1,6 +1,7 @@
 import { AdminOrganisationsEinheitResource, OrganisationsEinheitFormContainerComponent } from '@admin-client/admin-settings';
 import { StateResource, createStateResource } from '@alfa-client/tech-shared';
-import { Mock, existsAsHtmlElement, mock } from '@alfa-client/test-utils';
+import { Mock, existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
+import { SpinnerComponent } from '@alfa-client/ui';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MockComponent } from 'ng-mocks';
 import { of } from 'rxjs';
@@ -12,22 +13,32 @@ import { OrganisationsEinheitFormComponent } from './organisationseinheit-form/o
 describe('OrganisationsEinheitFormContainerComponent', () => {
   let component: OrganisationsEinheitFormContainerComponent;
   let fixture: ComponentFixture<OrganisationsEinheitFormContainerComponent>;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
 
-  const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService);
+  const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+  const organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource> =
+    createStateResource(organisationsEinheitResource);
 
-  const organisationsEinheitStateResource = createStateResource(createAdminOrganisationsEinheitResource());
+  const headlineSelector: string = getDataTestIdOf('organisations-form-container-headline');
+  const formSelector: string = getDataTestIdOf('organisations-form');
 
   beforeEach(async () => {
+    organisationsEinheitService = {
+      ...mock(OrganisationsEinheitService),
+      get: jest.fn().mockReturnValue(of(organisationsEinheitStateResource)),
+    };
+
     await TestBed.configureTestingModule({
-      declarations: [OrganisationsEinheitFormContainerComponent, MockComponent(OrganisationsEinheitFormComponent)],
+      declarations: [
+        OrganisationsEinheitFormContainerComponent,
+        MockComponent(OrganisationsEinheitFormComponent),
+        MockComponent(SpinnerComponent),
+      ],
       providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }],
     }).compileComponents();
 
     fixture = TestBed.createComponent(OrganisationsEinheitFormContainerComponent);
     component = fixture.componentInstance;
-
-    organisationsEinheitService.get = jest.fn().mockReturnValue(of(organisationsEinheitStateResource));
-
     fixture.detectChanges();
   });
 
@@ -37,20 +48,22 @@ describe('OrganisationsEinheitFormContainerComponent', () => {
 
   describe('component', () => {
     describe('ngOnInit', () => {
-      it('should call organisationsEinheitService get', () => {
+      it('should call organisationsEinheitService get', (done) => {
         component.ngOnInit();
 
         component.organisationsEinheitStateResource$.subscribe(() => {
           expect(organisationsEinheitService.get).toHaveBeenCalled();
+          done();
         });
       });
 
-      it('should set organisationsEinheitStateResource', () => {
+      it('should set organisationsEinheitStateResource', (done) => {
         component.ngOnInit();
 
         component.organisationsEinheitStateResource$.subscribe(
           (organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource>) => {
             expect(organisationsEinheitStateResource).toEqual(organisationsEinheitStateResource);
+            done();
           },
         );
       });
@@ -59,14 +72,25 @@ describe('OrganisationsEinheitFormContainerComponent', () => {
 
   describe('template', () => {
     describe('headline', () => {
+      it('should show headline', () => {
+        existsAsHtmlElement(fixture, headlineSelector);
+      });
+
       it('should show organisationsEinheit name', () => {
-        existsAsHtmlElement(fixture, getDataTestIdOf('organisations-form-container-headline'));
+        const headlineElement: HTMLElement = getElementFromFixture(fixture, headlineSelector);
+
+        expect(headlineElement.textContent).toBe(organisationsEinheitResource.name);
       });
     });
 
     describe('organisationsEinheit form', () => {
-      it('should show organisationsEinheit form', () => {
-        existsAsHtmlElement(fixture, getDataTestIdOf('organisations-form'));
+      it('should show form', () => {
+        existsAsHtmlElement(fixture, formSelector);
+      });
+
+      it('should have organisationsEinheitStateResource', () => {
+        const formComponent: OrganisationsEinheitFormComponent = getMockComponent(fixture, OrganisationsEinheitFormComponent);
+        expect(formComponent.organisationsEinheitStateResource).toBe(organisationsEinheitStateResource);
       });
     });
   });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts
index cc46ee5d86126541187b2ebd9d41dce928d553e8..d643c74a04163010a590714a2f1d6d00640cf259 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts
@@ -1,6 +1,7 @@
 import { StateResource } from '@alfa-client/tech-shared';
 import { Component, OnInit } from '@angular/core';
 import { Observable } from 'rxjs';
+import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel';
 import { AdminOrganisationsEinheitResource } from '../organisations-einheit.model';
 import { OrganisationsEinheitService } from '../organisationseinheit.service';
 
@@ -16,4 +17,6 @@ export class OrganisationsEinheitFormContainerComponent implements OnInit {
   ngOnInit(): void {
     this.organisationsEinheitStateResource$ = this.organisationsEinheitService.get();
   }
+
+  protected readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel;
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html
index 3e8708c6939b72e0796be10b943baf18bc9cf892..3b1b1f0673cb2d42afa4b6d5a67a0fa14a3b0f1f 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html
@@ -9,7 +9,7 @@
     ></ods-button-with-spinner>
 
     <span
-      *ngIf="formService.invalidEmpty"
+      *ngIf="formService.isInvalid()"
       data-test-id="invalid-empty-message-span"
       class="m-2 text-red-500"
     >
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
index 1976562c9a9fa7aa270e230278e4ce3093775503..ad4f7bd11d40c6444ba2fdbbc169cd0b81aff0f4 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts
@@ -19,10 +19,15 @@ describe('OrganisationsEinheitFormComponent', () => {
   let component: OrganisationsEinheitFormComponent;
   let fixture: ComponentFixture<OrganisationsEinheitFormComponent>;
   let formService: OrganisationsEinheitFormService;
+  let organisationsEinheitService: Mock<OrganisationsEinheitService>;
 
-  const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService);
+  const signaturComponentSelector: string = getDataTestIdOf('organisations-einheit-signatur-component');
+  const saveButtonSelector: string = getDataTestIdOf('save-button');
+  const invalidMessageSpanSelector: string = getDataTestIdOf('invalid-empty-message-span');
 
   beforeEach(async () => {
+    organisationsEinheitService = mock(OrganisationsEinheitService);
+
     await TestBed.configureTestingModule({
       declarations: [
         OrganisationsEinheitFormComponent,
@@ -47,15 +52,12 @@ describe('OrganisationsEinheitFormComponent', () => {
   describe('input', () => {
     describe('organisationsEinheitStateResource', () => {
       it('should return resource', () => {
-        const updateOrganisationsEinheitResourceFn: jest.SpyInstance = jest.spyOn(
-          component,
-          'updateOrganisationsEinheitResource',
-        );
-        const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
+        component.updateOrganisationsEinheitResource = jest.fn();
 
+        const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource();
         component.organisationsEinheitStateResource = createStateResource(organisationsEinheitResource);
 
-        expect(updateOrganisationsEinheitResourceFn).toHaveBeenCalledWith(organisationsEinheitResource);
+        expect(component.updateOrganisationsEinheitResource).toHaveBeenCalledWith(organisationsEinheitResource);
       });
     });
   });
@@ -87,20 +89,18 @@ describe('OrganisationsEinheitFormComponent', () => {
   describe('template', () => {
     describe('organisationsEinheit signatur component', () => {
       it('should show signatur component', () => {
-        existsAsHtmlElement(fixture, getDataTestIdOf('organisations-einheit-signatur-component'));
+        existsAsHtmlElement(fixture, signaturComponentSelector);
       });
     });
 
     describe('save button', () => {
       it('should show save button', () => {
-        existsAsHtmlElement(fixture, getDataTestIdOf('save-button'));
+        existsAsHtmlElement(fixture, saveButtonSelector);
       });
     });
 
     describe('invalid message', () => {
-      const invalidMessageSpan: string = getDataTestIdOf('invalid-empty-message-span');
-
-      it('should show if form invalidEmpty', () => {
+      it('should show if form is invalid', () => {
         const problemDetail: ProblemDetail = {
           ...createProblemDetail(),
           invalidParams: [{ ...createInvalidParam(), name: 'settingBody.signatur' }],
@@ -109,11 +109,11 @@ describe('OrganisationsEinheitFormComponent', () => {
 
         fixture.detectChanges();
 
-        existsAsHtmlElement(fixture, invalidMessageSpan);
+        existsAsHtmlElement(fixture, invalidMessageSpanSelector);
       });
 
       it('should not show if form valid', () => {
-        notExistsAsHtmlElement(fixture, invalidMessageSpan);
+        notExistsAsHtmlElement(fixture, invalidMessageSpanSelector);
       });
     });
   });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts
index da98a3b87601a0830743d69fbe6ed99cb2325f1f..9f47fc9511c867a415ced0e677eb486c083a970c 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts
@@ -5,8 +5,8 @@ import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
 import { EffectsModule } from '@ngrx/effects';
 import { StoreModule } from '@ngrx/store';
 import { TextareaEditorComponent } from '@ods/component';
-import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { MockComponent } from 'ng-mocks';
+import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test';
 import { OrganisationsEinheitService } from '../../../organisationseinheit.service';
 import { OrganisationsEinheitFormService } from '../organisationseinheit.formservice';
 import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-signatur.component';
@@ -14,15 +14,13 @@ import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-si
 describe('OrganisationsEinheitSignaturComponent', () => {
   let component: OrganisationsEinheitSignaturComponent;
   let fixture: ComponentFixture<OrganisationsEinheitSignaturComponent>;
+  let formService: OrganisationsEinheitFormService;
 
-  const formService: OrganisationsEinheitFormService = new OrganisationsEinheitFormService(
-    new FormBuilder(),
-    useFromMock(mock(OrganisationsEinheitService)),
-  );
-
-  const signaturTextarea = getDataTestIdOf('signatur-text');
+  const signaturTextareaSelector: string = getDataTestIdOf('signatur-text');
 
   beforeEach(async () => {
+    formService = new OrganisationsEinheitFormService(new FormBuilder(), useFromMock(mock(OrganisationsEinheitService)));
+
     await TestBed.configureTestingModule({
       imports: [ReactiveFormsModule, NavigationSharedModule, StoreModule.forRoot({}), EffectsModule.forRoot([])],
       declarations: [OrganisationsEinheitSignaturComponent, MockComponent(TextareaEditorComponent)],
@@ -47,7 +45,7 @@ describe('OrganisationsEinheitSignaturComponent', () => {
     describe('ods-textarea-editor', () => {
       describe('input', () => {
         it('should set signatur field', () => {
-          const textAreaEditor = getElementFromFixture(fixture, signaturTextarea);
+          const textAreaEditor: HTMLElement = getElementFromFixture(fixture, signaturTextareaSelector);
 
           expect(textAreaEditor.getAttribute('rows')).toEqual('6');
         });
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts
index 112353d7b5cf1a613f3f81fd77662b7b11c8a2c0..ad670e03d75622a851b7de1bfe7b9ceb18cefce7 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts
@@ -6,7 +6,7 @@ import { OrganisationsEinheitFormService } from '../organisationseinheit.formser
   templateUrl: './organisationseinheit-signatur.component.html',
 })
 export class OrganisationsEinheitSignaturComponent {
-  protected readonly formServiceClass = OrganisationsEinheitFormService;
+  public readonly formServiceClass = OrganisationsEinheitFormService;
 
   constructor(public formService: OrganisationsEinheitFormService) {}
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts
index 82beca0dfb6fd1cb9210090f7a11cac3c2b497eb..9cb9131e6259cf12b596db1438224396abd952ae 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts
@@ -29,8 +29,4 @@ export class OrganisationsEinheitFormService extends AbstractFormService {
   protected getPathPrefix(): string {
     return 'settingBody';
   }
-
-  public get invalidEmpty(): boolean {
-    return this.form.invalid;
-  }
 }
diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
index 77d2d39309893316e9a99db8d6e6796fcd1a9d05..ad3de85839043a279b9692d3ece0593d83602bb3 100644
--- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts
@@ -55,11 +55,11 @@ describe('OrganisationsEinheitService', () => {
     });
 
     it('should call getOrganisationsEinheitUrl', () => {
-      (<any>service).getOrganisationsEinheitUrl = jest.fn();
+      service.getOrganisationsEinheitUrl = jest.fn();
 
       service.onNavigation({ [OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL]: 'some-uri' });
 
-      expect((<any>service).getOrganisationsEinheitUrl).toHaveBeenCalled();
+      expect(service.getOrganisationsEinheitUrl).toHaveBeenCalled();
     });
   });
 
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
index a5aace656e46f148670b719e35a52d23df73ec4b..23447820822d57bfca778a3b4f870bb4e1780a52 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html
@@ -45,7 +45,7 @@
   ></ods-button-with-spinner>
 
   <span
-    *ngIf="formService.invalidEmpty"
+    *ngIf="formService.isInvalid()"
     data-test-id="invalid-empty-message-span"
     class="m-2 text-red-500"
   >
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
index 3470d76a49844b39ea90737b2474d95c76ff5a2c..8c8096d7df647918130510a8ac0fad54499064f7 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts
@@ -1,15 +1,5 @@
-import {
-  createEmptyStateResource,
-  createStateResource,
-  ProblemDetail,
-} from '@alfa-client/tech-shared';
-import {
-  dispatchEventFromFixture,
-  existsAsHtmlElement,
-  Mock,
-  mock,
-  notExistsAsHtmlElement,
-} from '@alfa-client/test-utils';
+import { createEmptyStateResource, createStateResource, ProblemDetail } from '@alfa-client/tech-shared';
+import { dispatchEventFromFixture, existsAsHtmlElement, Mock, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { ButtonWithSpinnerComponent } from '@ods/component';
@@ -67,15 +57,12 @@ describe('PostfachFormComponent', () => {
 
   describe('set postfachStateResource', () => {
     it('should return resource', () => {
-      const updatePostfachResourceFn: jest.SpyInstance = jest.spyOn(
-        component,
-        'updatePostfachResource',
-      );
-      const postfachResource: PostfachResource = createPostfachResource();
+      component.updatePostfachResource = jest.fn();
 
+      const postfachResource: PostfachResource = createPostfachResource();
       component.postfachStateResource = createStateResource(postfachResource);
 
-      expect(updatePostfachResourceFn).toHaveBeenCalledWith(postfachResource);
+      expect(component.updatePostfachResource).toHaveBeenCalledWith(postfachResource);
     });
   });
 
@@ -152,7 +139,7 @@ describe('PostfachFormComponent', () => {
   });
 
   describe('invalid message', () => {
-    it('should show if form invalidEmpty', () => {
+    it('should show if form is invalid', () => {
       formService.setErrorByProblemDetail(createProblemDetailForAbsenderName());
 
       fixture.detectChanges();
diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
index ed81ff5fd52cfc3ef92312fd3f2d0cbbcb8d4d89..dd9bcc7a3732f8562aa596faa52b1b4b70407f26 100644
--- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
+++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts
@@ -46,17 +46,10 @@ export class PostfachFormService extends AbstractFormService {
   }
 
   private shouldSkipAbsender(postfach: Postfach): boolean {
-    return (
-      isNil(this.source?.absender) &&
-      Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0)
-    );
+    return isNil(this.source?.absender) && Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0);
   }
 
   protected getPathPrefix(): string {
     return 'settingBody';
   }
-
-  public get invalidEmpty(): boolean {
-    return this.form.invalid;
-  }
 }
diff --git a/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts
index 600e815386e1d52dce43597b5187f1310a1be713..85ef561372b3ccf0231065f9210ca754f07aa7de 100644
--- a/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts
+++ b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts
@@ -9,22 +9,19 @@ import {
 } from '../../src';
 import { OrganisationsEinheitListLinkRel } from '../../src/lib/organisationseinheit/organisations-einheit.linkrel';
 
-export function createAdminOrganisationsEinheit(syncResult?: AdminOrganisationsEinheitSyncResult): AdminOrganisationsEinheit {
+export function createAdminOrganisationsEinheit(): AdminOrganisationsEinheit {
   return {
     name: faker.random.word(),
     organisationsEinheitId: faker.random.word(),
-    syncResult: syncResult ?? AdminOrganisationsEinheitSyncResult.OK,
+    syncResult: AdminOrganisationsEinheitSyncResult.OK,
     settings: {
       signatur: faker.random.words(5),
     },
   };
 }
 
-export function createAdminOrganisationsEinheitResource(
-  syncResult?: AdminOrganisationsEinheitSyncResult,
-  linkRel: string[] = [],
-): AdminOrganisationsEinheitResource {
-  return toResource(createAdminOrganisationsEinheit(syncResult), linkRel);
+export function createAdminOrganisationsEinheitResource(linkRel: string[] = []): AdminOrganisationsEinheitResource {
+  return toResource(createAdminOrganisationsEinheit(), linkRel);
 }
 
 export function createAdminOrganisationsEinheitResources(linkRelations: string[] = []): AdminOrganisationsEinheitResource[] {
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
index e608186534a4f3573d8a78a4fdda739926d7c7fb..e4421c2c22364a7a444d5796929194b2ca4bba61 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts
@@ -1,11 +1,9 @@
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { fakeAsync, tick } from '@angular/core/testing';
 import { Resource } from '@ngxp/rest';
-import { Observable, of, throwError } from 'rxjs';
+import { Observable, of } from 'rxjs';
 import { singleCold, singleHot } from '../../../test//marbles';
-import { createProblemDetail } from '../../../test/error';
 import { createDummyResource } from '../../../test/resource';
-import { ProblemDetail } from '../tech.model';
 import { ApiResourceService } from './api-resource.service';
 import { LinkRelationName, ResourceServiceConfig, SaveResourceData } from './resource.model';
 import { ResourceRepository } from './resource.repository';
@@ -70,17 +68,6 @@ describe('ApiResourceService', () => {
       expect(saved).toBeObservable(singleCold(createStateResource(loadedResource)));
     });
 
-    it('should call handleError', () => {
-      service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel])));
-      const errorResponse: ProblemDetail = createProblemDetail();
-      repository.save.mockReturnValue(throwError(() => errorResponse));
-      service.handleError = jest.fn();
-
-      service.save(<any>{}).subscribe();
-
-      expect(service.handleError).toHaveBeenCalledWith(errorResponse);
-    });
-
     it('should update state resource subject', fakeAsync(() => {
       service.stateResource.next(createStateResource(resourceWithEditLinkRel));
       repository.save.mockReturnValue(of(loadedResource));
@@ -122,17 +109,6 @@ describe('ApiResourceService', () => {
       expect(saved).toBeObservable(singleCold(createStateResource(loadedResource)));
     });
 
-    it('should call handleError', () => {
-      service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel])));
-      const errorResponse: ProblemDetail = createProblemDetail();
-      repository.patch.mockReturnValue(throwError(() => errorResponse));
-      service.handleError = jest.fn();
-
-      service.patch(<any>{}).subscribe();
-
-      expect(service.handleError).toHaveBeenCalledWith(errorResponse);
-    });
-
     it('should update state resource subject', fakeAsync(() => {
       service.stateResource.next(createStateResource(resourceWithEditLinkRel));
       repository.patch.mockReturnValue(of(loadedResource));
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 02abe975e853fe01912920f1bff836914c4779aa..1b5ea7e05416786b91861e5f79a247501076fed3 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts
@@ -121,16 +121,16 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
 
   public save(toSave: unknown): Observable<StateResource<T>> {
     const previousResource: T = this.stateResource.value.resource;
-    return this.doSave(previousResource, toSave).pipe(
-      tap((loadedResource: T) => this.stateResource.next(createStateResource(loadedResource))),
-      map(() => this.stateResource.value),
-      catchError((errorResponse: HttpErrorResponse) => this.handleError(errorResponse)),
-    );
+    return this.handleSave(this.doSave(previousResource, toSave));
   }
 
   public patch(toPatch: unknown): Observable<StateResource<T>> {
     const previousResource: T = this.stateResource.value.resource;
-    return this.doPatch(previousResource, toPatch).pipe(
+    return this.handleSave(this.doPatch(previousResource, toPatch));
+  }
+
+  private handleSave(response$: Observable<T>): Observable<StateResource<T>> {
+    return response$.pipe(
       tap((loadedResource: T) => this.stateResource.next(createStateResource(loadedResource))),
       map(() => this.stateResource.value),
       catchError((errorResponse: HttpErrorResponse) => this.handleError(errorResponse)),
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 bff5f0c17ffa7ad22f1de49bd51e1a3bf2729939..d525b273f7de7b9f8e79b596c4ff58b128e23796 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts
@@ -164,6 +164,22 @@ describe('AbstractFormService', () => {
       expect(formService.form.reset).toHaveBeenCalled();
     });
   });
+
+  describe('isInvalid', () => {
+    it('should return false on valid state', () => {
+      const isInvalid: boolean = formService.isInvalid();
+
+      expect(isInvalid).toBeFalsy();
+    });
+
+    it('should return true on invalid state', () => {
+      formService.form.controls[TestFormService.FIELD].setErrors({ required: true });
+
+      const isInvalid: boolean = formService.isInvalid();
+
+      expect(isInvalid).toBeTruthy();
+    });
+  });
 });
 
 class TestFormService extends AbstractFormService {
diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
index ddbdfbd28daffd74b6637bd446373730f7111bec..e14057ca1213095531293412d81b4952f80e5e1d 100644
--- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
+++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts
@@ -102,4 +102,8 @@ export abstract class AbstractFormService<T extends Resource = Resource> {
   public reset(): void {
     this.form.reset();
   }
+
+  public isInvalid(): boolean {
+    return this.form.invalid;
+  }
 }