diff --git a/alfa-client/apps/alfa/src/app/app.component.spec.ts b/alfa-client/apps/alfa/src/app/app.component.spec.ts
index f50f222a3cb24322f264207532148c40226ab1bf..0ca6382a2e0987cdbc277b9d388a891049849563 100644
--- a/alfa-client/apps/alfa/src/app/app.component.spec.ts
+++ b/alfa-client/apps/alfa/src/app/app.component.spec.ts
@@ -430,9 +430,7 @@ describe('AppComponent', () => {
 
       it('should return path segments from localStorage', () => {
         const pathSegments: string[] = ['alle', 'angenommen'];
-        jest
-          .spyOn(VorgangNavigationUtil, 'buildPathSegmentsFromLocalStorage')
-          .mockReturnValue(pathSegments);
+        jest.spyOn(VorgangNavigationUtil, 'buildPathSegmentsFromLocalStorage').mockReturnValue(pathSegments);
 
         const redirectUri: string = component.buildInitialPath();
 
@@ -452,7 +450,7 @@ describe('AppComponent', () => {
 
       it('should return query params', () => {
         const expected: Params = { uri: 'some-uri' };
-        const queryParams = component.buildInitialQueryParams();
+        const queryParams: Params = component.buildInitialQueryParams();
 
         expect(queryParams).toStrictEqual(expected);
       });
@@ -466,7 +464,7 @@ describe('AppComponent', () => {
       });
 
       it('should return undefined', () => {
-        const queryParams = component.buildInitialQueryParams();
+        const queryParams: Params = component.buildInitialQueryParams();
 
         expect(queryParams).toBeUndefined();
       });
diff --git a/alfa-client/apps/alfa/src/app/app.component.ts b/alfa-client/apps/alfa/src/app/app.component.ts
index c5c0cd4dff204193b082d4e1185f4767fd7dd9e3..b8a23b6510cbd1aabcb5d28e3f77697b2d4d22c5 100644
--- a/alfa-client/apps/alfa/src/app/app.component.ts
+++ b/alfa-client/apps/alfa/src/app/app.component.ts
@@ -88,7 +88,7 @@ export class AppComponent implements OnInit {
   }
 
   buildInitialPath(): string {
-    const currentPath = window.location.pathname;
+    const currentPath: string = window.location.pathname;
     if (currentPath === '/') {
       return currentPath + buildPathSegmentsFromLocalStorage().join('/');
     }
@@ -97,26 +97,23 @@ export class AppComponent implements OnInit {
   }
 
   buildInitialQueryParams(): Params | undefined {
-    const queryParams = new URLSearchParams(window.location.search);
+    const queryParams: URLSearchParams = new URLSearchParams(window.location.search);
     if (!queryParams.toString()) {
       return undefined;
     }
 
-    const result: Params = {};
-    queryParams.forEach((value, key) => {
-      result[key] = value;
+    const params: Params = {};
+    queryParams.forEach((value: string, key: string) => {
+      params[key] = value;
     });
 
-    return result;
+    return params;
   }
 
   listenToOAuthEvents(): void {
     this.oAuthEventSubscription = this.oAuthService.events
       .pipe(
-        filter(
-          (event: OAuthEvent) =>
-            this.consideredAsLoginEvent(event.type) || this.consideredAsPageReloadEvent(event.type),
-        ),
+        filter((event: OAuthEvent) => this.consideredAsLoginEvent(event.type) || this.consideredAsPageReloadEvent(event.type)),
       )
       .subscribe(() => (this.apiRoot$ = this.loadApiRootAndNavigate()));
   }
diff --git a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
index e4d1553f981c6a4947b1151afcbd7af95636ba47..fed6b6cc56cb6ded4a3d5b9f19a68578ec28edcb 100644
--- a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
+++ b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts
@@ -60,4 +60,5 @@ export enum ApiRootLinkRel {
   UNASSIGNED_ZU_LOESCHEN = 'vorgaenge_zu_loeschen_unassigned',
   DOCUMENTATIONS = 'documentations',
   HINTS = 'hints',
+  RESOURCE = 'resource',
 }
diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b29d9cb7e4fae12057f20b46928254748967ed88
--- /dev/null
+++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts
@@ -0,0 +1,3 @@
+export enum ResourceLinkRel {
+  VORGANG = 'vorgang',
+}
diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts
deleted file mode 100644
index 95a048e03bcb1fa1a2241e4a1d878834e357942f..0000000000000000000000000000000000000000
--- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export enum ResourceRedirectLinkRel {
-  RESOURCE = 'resource',
-  VORGANG = 'vorgang',
-}
diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts
index 740370e063214d4686ef37747234ec11c18dafb1..bca45d89e161b81187803dbcc54d51489ffd6adf 100644
--- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts
+++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts
@@ -1,4 +1,4 @@
-import { ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
+import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
 import { NavigationService } from '@alfa-client/navigation-shared';
 import { ResourceRedirectService } from '@alfa-client/resource-redirect-shared';
 import {
@@ -14,7 +14,7 @@ import { Resource, ResourceUri } from '@ngxp/rest';
 import { of, throwError } from 'rxjs';
 import { createApiRootResource } from '../../../api-root-shared/test/api-root';
 import { createDummyResource } from '../../../tech-shared/test/resource';
-import { ResourceRedirectLinkRel } from './resource-redirect-linkrel';
+import { ResourceLinkRel } from './resource-linkrel';
 
 describe('ResourceRedirectService', () => {
   let service: ResourceRedirectService;
@@ -40,37 +40,39 @@ describe('ResourceRedirectService', () => {
   });
 
   describe('redirectToResource', () => {
-    it('should navigate to vorgang on success', () => {
-      const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]);
-      const apiRoot: StateResource<ApiRootResource> = createStateResource(
-        createApiRootResource([ResourceRedirectLinkRel.RESOURCE]),
-      );
+    it('should navigate to resource on success', () => {
+      const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]);
+      const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE]));
       apiRootService.getApiRoot.mockReturnValue(of(apiRoot));
       repository.getResource.mockReturnValue(of(resource));
 
+      const spy = jest.spyOn(service, 'navigateToResource');
+
       service.redirectToResource(resourceUri);
 
-      expect(navigationService.navigateToVorgang).toHaveBeenCalled();
+      expect(spy).toHaveBeenCalled();
     });
 
-    it('should handle api root error', () => {
+    it('should handle empty api root resource', () => {
       apiRootService.getApiRoot.mockReturnValue(of(createEmptyStateResource()));
 
+      const spy = jest.spyOn(service, 'handleResolveError');
+
       service.redirectToResource(resourceUri);
 
-      expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
-      expect(navigationService.navigateToVorgangList).toHaveBeenCalled();
+      expect(spy).toHaveBeenCalled();
     });
 
-    it('should handle repository error', () => {
-      const apiRoot = createStateResource(createApiRootResource([ResourceRedirectLinkRel.RESOURCE]));
+    it('should handle resource repository error', () => {
+      const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE]));
       apiRootService.getApiRoot.mockReturnValue(of(apiRoot));
       repository.getResource.mockReturnValue(throwError(() => new Error('some error')));
 
+      const spy = jest.spyOn(service, 'handleResolveError');
+
       service.redirectToResource(resourceUri);
 
-      expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
-      expect(navigationService.navigateToVorgangList).toHaveBeenCalled();
+      expect(spy).toHaveBeenCalled();
     });
   });
 
@@ -84,18 +86,16 @@ describe('ResourceRedirectService', () => {
       });
     });
 
-    it('should return not emitted observable on empty resource', () => {
+    it('should return null observable on empty resource', () => {
       apiRootService.getApiRoot.mockReturnValue(of(createEmptyStateResource()));
 
-      service.getResolvedResource(resourceUri).subscribe((res) => {
-        expect(res).toBeNull();
+      service.getResolvedResource(resourceUri).subscribe((resolvedResource: Resource) => {
+        expect(resolvedResource).toBeNull();
       });
     });
 
     it('should call resource repository', () => {
-      const apiRoot: StateResource<ApiRootResource> = createStateResource(
-        createApiRootResource([ResourceRedirectLinkRel.RESOURCE]),
-      );
+      const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE]));
       apiRootService.getApiRoot.mockReturnValue(of(apiRoot));
 
       service.getResolvedResource(resourceUri).subscribe(() => {
@@ -104,22 +104,20 @@ describe('ResourceRedirectService', () => {
     });
 
     it('should return resolved resource', () => {
-      const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]);
-      const apiRoot: StateResource<ApiRootResource> = createStateResource(
-        createApiRootResource([ResourceRedirectLinkRel.RESOURCE]),
-      );
+      const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]);
+      const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE]));
       apiRootService.getApiRoot.mockReturnValue(of(apiRoot));
       repository.getResource.mockReturnValue(of(resource));
 
-      service.getResolvedResource(resourceUri).subscribe((res) => {
-        expect(res).toEqual(resource);
+      service.getResolvedResource(resourceUri).subscribe((resolvedResource: Resource) => {
+        expect(resolvedResource).toEqual(resource);
       });
     });
   });
 
   describe('buildResolveUri', () => {
     it('should build resolve uri', () => {
-      const apiRootResource: ApiRootResource = createApiRootResource([ResourceRedirectLinkRel.RESOURCE]);
+      const apiRootResource: ApiRootResource = createApiRootResource([ApiRootLinkRel.RESOURCE]);
       const resolveUri: ResourceUri = service.buildResolveUri(apiRootResource, resourceUri);
 
       expect(resolveUri).toBeDefined();
@@ -133,31 +131,27 @@ describe('ResourceRedirectService', () => {
   });
 
   describe('handleResolveError', () => {
-    it('should show snackbar and navigate to vorgang list', () => {
+    it('should show snackbar', () => {
       service.handleResolveError();
 
       expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
+    });
+
+    it('should navigate to vorgang list', () => {
+      service.handleResolveError();
+
       expect(navigationService.navigateToVorgangList).toHaveBeenCalled();
     });
   });
 
   describe('navigateToResource', () => {
     it('should navigate to vorgang', () => {
-      const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]);
-      const resourceUri: ResourceUri = toResourceUri(resource, ResourceRedirectLinkRel.VORGANG);
+      const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]);
+      const resourceUri: ResourceUri = toResourceUri(resource, ResourceLinkRel.VORGANG);
 
       service.navigateToResource(resource);
 
       expect(navigationService.navigateToVorgang).toHaveBeenCalledWith(resourceUri);
     });
-
-    it('should handle resolve error on missing link rel', () => {
-      const resource: Resource = createDummyResource();
-
-      service.navigateToResource(resource);
-
-      expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
-      expect(navigationService.navigateToVorgangList).toHaveBeenCalled();
-    });
   });
 });
diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts
index 487cb4b016d03ddb5ed0e2926121bfa7d33b2212..a07508e0d0d73bd38329590059db15448e80b755 100644
--- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts
+++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts
@@ -1,4 +1,4 @@
-import { ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
+import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
 import { NavigationService } from '@alfa-client/navigation-shared';
 import { ResourceRepository, StateResource, isLoaded, toResourceUri } from '@alfa-client/tech-shared';
 import { Messages, SnackBarService } from '@alfa-client/ui';
@@ -6,7 +6,7 @@ import { Injectable } from '@angular/core';
 import { Resource, ResourceUri, getUrl, hasLink } from '@ngxp/rest';
 import { Observable, first, switchMap } from 'rxjs';
 import { filter } from 'rxjs/operators';
-import { ResourceRedirectLinkRel } from './resource-redirect-linkrel';
+import { ResourceLinkRel } from './resource-linkrel';
 
 @Injectable({ providedIn: 'root' })
 export class ResourceRedirectService {
@@ -19,7 +19,7 @@ export class ResourceRedirectService {
     private navigationService: NavigationService,
   ) {}
 
-  public redirectToResource(resourceUri: ResourceUri) {
+  public redirectToResource(resourceUri: ResourceUri): void {
     this.getResolvedResource(resourceUri)
       .pipe(first())
       .subscribe({
@@ -38,25 +38,18 @@ export class ResourceRedirectService {
   }
 
   buildResolveUri(apiRootResource: ApiRootResource, resourceUri: ResourceUri): ResourceUri {
-    return getUrl(apiRootResource, ResourceRedirectLinkRel.RESOURCE).replace(
-      this.PARAM_URI_PLACEHOLDER,
-      encodeURIComponent(resourceUri),
-    );
-  }
-
-  handleResolveError(): void {
-    this.snackbarService.showInfo(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
-    this.navigationService.navigateToVorgangList();
+    return getUrl(apiRootResource, ApiRootLinkRel.RESOURCE).replace(this.PARAM_URI_PLACEHOLDER, encodeURIComponent(resourceUri));
   }
 
   navigateToResource(resource: Resource): void {
-    if (hasLink(resource, ResourceRedirectLinkRel.VORGANG)) {
-      const vorgangUri: ResourceUri = toResourceUri(resource, ResourceRedirectLinkRel.VORGANG);
+    if (hasLink(resource, ResourceLinkRel.VORGANG)) {
+      const vorgangUri: ResourceUri = toResourceUri(resource, ResourceLinkRel.VORGANG);
       this.navigationService.navigateToVorgang(vorgangUri);
-
-      return;
     }
+  }
 
-    this.handleResolveError();
+  handleResolveError(): void {
+    this.snackbarService.showInfo(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND);
+    this.navigationService.navigateToVorgangList();
   }
 }
diff --git a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts
index 9aa945dd75c6324ac32e7000ce8ee56b36a913c9..58344a08914a8381f6e2270cf9f0829889286c64 100644
--- a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts
+++ b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts
@@ -8,14 +8,13 @@ import { Observable, of } from 'rxjs';
 describe('ResourceRedirectComponent', () => {
   let component: ResourceRedirectComponent;
   let fixture: ComponentFixture<ResourceRedirectComponent>;
-
-  const resourceRedirectService: Mock<ResourceRedirectService> = mock(ResourceRedirectService);
+  let resourceRedirectService: Mock<ResourceRedirectService>;
 
   const initActivatedRoute = (queryParamKey?: string): { queryParamMap: Observable<Map<string, string>> } => ({
     queryParamMap: of(new Map(queryParamKey ? [[queryParamKey, 'some-uri']] : [])),
   });
 
-  const createComponentWithQueryParam = (queryParamKey?: string) => {
+  const createComponentWithQueryParam = (queryParamKey?: string): void => {
     TestBed.configureTestingModule({
       imports: [ResourceRedirectComponent],
       providers: [
@@ -30,7 +29,8 @@ describe('ResourceRedirectComponent', () => {
 
   beforeEach(() => {
     TestBed.resetTestingModule();
-    jest.clearAllMocks();
+
+    resourceRedirectService = mock(ResourceRedirectService);
   });
 
   it('should create', () => {
diff --git a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts
index 77037dcc57df3bbabbf5bea568fa4fb8d3b34309..37274fc2dd8dd16574e7de19234ba5fdf55e06ed 100644
--- a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts
+++ b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts
@@ -1,6 +1,6 @@
 import { ResourceRedirectService } from '@alfa-client/resource-redirect-shared';
 import { Component, OnInit } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, ParamMap } from '@angular/router';
 import { ResourceUri } from '@ngxp/rest';
 
 @Component({
@@ -16,7 +16,7 @@ export class ResourceRedirectComponent implements OnInit {
   ) {}
 
   ngOnInit(): void {
-    this.route.queryParamMap.subscribe((queryParams) => {
+    this.route.queryParamMap.subscribe((queryParams: ParamMap) => {
       const resourceUri: ResourceUri = queryParams.get(this.PARAM_URI);
       if (resourceUri) {
         this.resourceRedirectService.redirectToResource(resourceUri);