diff --git a/goofy-client/.gitignore b/goofy-client/.gitignore
index 4fd9280cfc1fbd0aa4b37c6d3c2c5798c3aea859..92abdb41d7fa17686e58d3ccf2fcb843520c83e7 100644
--- a/goofy-client/.gitignore
+++ b/goofy-client/.gitignore
@@ -45,3 +45,5 @@ testem.log
 # System Files
 .DS_Store
 Thumbs.db
+
+.angular
diff --git a/goofy-client/angular.json b/goofy-client/angular.json
index dc95c00d557171ac0c83278366be1a3a1463395a..faabb2288332d4d7fda6e994cf2e3450a17e6c01 100644
--- a/goofy-client/angular.json
+++ b/goofy-client/angular.json
@@ -741,6 +741,32 @@
 			},
 			"tags": []
 		},
+		"vorgang-historie": {
+			"projectType": "library",
+			"root": "libs/vorgang-historie",
+			"sourceRoot": "libs/vorgang-historie/src",
+			"prefix": "goofy-client",
+			"architect": {
+				"test": {
+					"builder": "@nrwl/jest:jest",
+					"outputs": ["coverage/libs/vorgang-historie"],
+					"options": {
+						"jestConfig": "libs/vorgang-historie/jest.config.js",
+						"passWithNoTests": true
+					}
+				},
+				"lint": {
+					"builder": "@nrwl/linter:eslint",
+					"options": {
+						"lintFilePatterns": [
+							"libs/vorgang-historie/src/**/*.ts",
+							"libs/vorgang-historie/src/**/*.html"
+						]
+					}
+				}
+			},
+			"tags": []
+		},
 		"vorgang-shared": {
 			"projectType": "library",
 			"root": "libs/vorgang-shared",
diff --git a/goofy-client/apps/goofy-e2e/cypress-ci.json b/goofy-client/apps/goofy-e2e/cypress-ci.json
index 226e3b24a4874cf11e02abb708326aa56cc6f09e..e9ae33f9b5536c4362ae095cb37566d4b2eee0b3 100644
--- a/goofy-client/apps/goofy-e2e/cypress-ci.json
+++ b/goofy-client/apps/goofy-e2e/cypress-ci.json
@@ -18,7 +18,7 @@
 	"screenshotsFolder": "./reports/screenshots",
 	"chromeWebSecurity": false,
 	"reporter": "../../node_modules/cypress-mochawesome-reporter",
-	"defaultCommandTimeout": 30000,
+	"defaultCommandTimeout": 10000,
 	"reporterOptions": {
 		"html": false,
 		"json": true,
diff --git a/goofy-client/apps/goofy-e2e/cypress.json b/goofy-client/apps/goofy-e2e/cypress.json
index e6a2f99932c1bebd99a5b710f42ed5ad0257a9fc..4122b625bd22da6b8d73513906d3bb83f608dc3e 100644
--- a/goofy-client/apps/goofy-e2e/cypress.json
+++ b/goofy-client/apps/goofy-e2e/cypress.json
@@ -19,7 +19,7 @@
 	"screenshotsFolder": "./reports/screenshots",
 	"chromeWebSecurity": false,
 	"reporter": "../../node_modules/cypress-mochawesome-reporter",
-	"defaultCommandTimeout": 30000,
+	"defaultCommandTimeout": 10000,
 	"reporterOptions": {
 		"html": false,
 		"json": true,
diff --git a/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml b/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml
index 186bcf470603c5e114d0646583806d9bda3cf9e8..0f0c380e7742c42c4aac7aa8b20a3bdc2912690c 100644
--- a/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml
+++ b/goofy-client/apps/goofy-e2e/deployment-values/goofy/ea-values.yaml
@@ -1,6 +1,7 @@
 sso:
   serverUrl: 'https://sso.dev.ozg-sh.de/auth'
   role_einheitlicher_ansprechpartner: true
+  apiPassword: "Goofy1234!"
 env:
   overrideSpringProfiles: 'oc,dev,ea,e2e'
 plutoName: pluto
diff --git a/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml b/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml
index 7fc995858ebbf5ef31d5ef914a9f0b8f83a3edad..cf6d7c3b88614b1b205cd616a46dc332303752a3 100644
--- a/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml
+++ b/goofy-client/apps/goofy-e2e/deployment-values/goofy/values.yaml
@@ -1,5 +1,6 @@
 sso:
   serverUrl: 'https://sso.dev.ozg-sh.de/auth'
+  apiPassword: "Goofy1234!"
 env:
   overrideSpringProfiles: 'oc, dev, e2e'
 plutoName: pluto
diff --git a/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts b/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts
index c963cd470c996f9bd2505a8e4f53427d3fb44209..8caf345fa69221ddf747bdd958aedbb6334bbe3b 100644
--- a/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts
+++ b/goofy-client/apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component.ts
@@ -15,6 +15,7 @@ export class PostfachMailE2EComponent {
 		return cy.getTestElement(this.locatorRoot);
 	}
 
+	//TODO Umbenennen in bspw. sendButton
 	public getButton() {
 		return cy.getTestElement(this.locatorButton);
 	}
diff --git a/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts b/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts
index adf241c5f3fab6967a7add75d9755ba38abf02d1..b1e2ac805a7aaba0c03dc50efc52f00ec2d8083a 100644
--- a/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts
+++ b/goofy-client/apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component.ts
@@ -6,6 +6,7 @@ export class VorgangListE2EComponent {
 	private readonly spinnerComponent: SpinnerE2EComponent = new SpinnerE2EComponent();
 
 	private readonly locatorRoot: string = 'vorgang-list';
+	private readonly locatorNoRoleMessage: string = 'user-no-role-message';
 
 	public getRoot() {
 		return cy.getTestElement(this.locatorRoot);
@@ -18,4 +19,8 @@ export class VorgangListE2EComponent {
 	public getSpinner() {
 		return this.spinnerComponent.findSpinner(this.getRoot());
 	}
+
+	public getNoRoleMessage() {
+		return cy.getTestElement(this.locatorNoRoleMessage);
+	}
 }
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json
index a5e8c36bf6737e1c73a30939cd905fa0068aeb04..fdf45c69e17675488dcbb47134c0d2f941f5f74c 100644
--- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json
+++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_emil.json
@@ -1,6 +1,6 @@
 {
 	"name": "emil",
-	"password": "Y9nk43yrQ_zzIPpfFU-I",
+	"password": "Ansprechpartner",
 	"firstName": "Emil",
 	"lastName": "Ansprechpartner",
 	"fullName": "Emil Ansprechpartner",
diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json
index 22f78e014b70157a4d6d26ba3604e7affcf06fc9..3a7a5dcf387c718ca6e9f91ca3b0e834b8f06212 100644
--- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json
+++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kfinder.json
@@ -1,5 +1,6 @@
 {
 	"name": "kfinder",
 	"password": "Katrinfinder",
-	"groups": ["Abtl. 10.0.1 Versammlungsbehörde, Identitätsfeststellung, Fundbüro"]
+	"groups": ["Abtl. 10.0.1 Versammlungsbehörde, Identitätsfeststellung, Fundbüro"],
+	"clientRoles": ["VERWALTUNG_USER"]
 }
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json
index f1f4ebbbea2ffe18d2118a52470cf2b17be2a6ae..79b8c6c09a07eaf851ae30f92489b3afd057f71b 100644
--- a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json
+++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_kordner.json
@@ -1,5 +1,6 @@
 {
 	"name": "kordner",
 	"password": "Klausordner",
-	"groups": ["Abtl. 10.5.1.2 Allgemeine Gefahrenabwehr und sonstige Ordnungsrechtsangelegenheiten"]
+	"groups": ["Abtl. 10.5.1.2 Allgemeine Gefahrenabwehr und sonstige Ordnungsrechtsangelegenheiten"],
+	"clientRoles": ["VERWALTUNG_USER"]
 }
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json
new file mode 100644
index 0000000000000000000000000000000000000000..c1fa331c717ea67ff70dbeb7c599b91526189c7e
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/src/fixtures/user/user_richard.json
@@ -0,0 +1,6 @@
+{
+	"name": "richard",
+	"firstName": "Richard",
+	"lastName": "Rollenlos",
+	"password": "Y9nk43yrQ_zzIPpfFU-I"
+}
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts
index 06c04cf370028b782d68678eed6f5f88543020ea..e4c18311022168829fb39c3a0732dbe70e28119b 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Vorgang abschliessen', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -37,6 +38,7 @@ describe('Vorgang abschliessen', () => {
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAbschliessen.name).getRoot().click();
 
+			waitForSpinnerToDisappear();
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
 
@@ -46,14 +48,11 @@ describe('Vorgang abschliessen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbschliessen.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangFormularButtons.clickAbschliessenByButton();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN)
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN)
 			})
 
 			it('should close snackBar', () => {
@@ -68,13 +67,12 @@ describe('Vorgang abschliessen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Abgeschlossen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangAbschliessen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 			})
 		})
@@ -84,6 +82,7 @@ describe('Vorgang abschliessen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAbschliessenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -94,35 +93,34 @@ describe('Vorgang abschliessen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbschliessenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().clickAbschliessenByIconButton();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
-			it('should show status Beschieden', () => {
+			it('should show status Beschieden after progressbar dissapear', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Beschieden', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangAbschliessenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG])
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts
index df4f9a76e881adcc96cf14d7323e62857e504320..409bded210ae8dc7b08be68647044ec2d7a5fda9 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts
@@ -24,6 +24,7 @@ describe('Vorgang forwarding', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -35,6 +36,7 @@ describe('Vorgang forwarding', () => {
 
 		it('should show vorgang header', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -55,6 +57,7 @@ describe('Vorgang forwarding', () => {
 			forwardFormular.getPasswort().clear().type('zukurz');
 
 			forwardFormular.forward();
+			waitForSpinnerToDisappear();
 
 			exist(forwardFormular.getPasswortError());
 		})
@@ -64,6 +67,7 @@ describe('Vorgang forwarding', () => {
 			forwardFormular.getZustaendigeStelle().clear().type('invalidemail.com');
 
 			forwardFormular.forward();
+			waitForSpinnerToDisappear();
 
 			exist(forwardFormular.getZustaendigeStelleError());
 		})
@@ -101,6 +105,7 @@ describe('Vorgang forwarding', () => {
 
 		it('should show "zustellung success message" after click on button', () => {
 			forwardingContainer.getMarkAsSuccessButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(forwardingContainer.getForwardingSuccessMessage());
 		})
@@ -110,7 +115,6 @@ describe('Vorgang forwarding', () => {
 
 		it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET] + ' in list', () => {
 			vorgangPage.getSubnavigation().clickBackButton();
-
 			waitForSpinnerToDisappear();
 
 			haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]);
@@ -121,6 +125,7 @@ describe('Vorgang forwarding', () => {
 
 		it('should formular after switching vorgang without pending commands', () => {
 			vorgangList.getListItem(vorgangEmpty.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(forwardingContainer.getRoot());
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts
index 463be058e579c6309c498ab5d137cc2e9ab938cd..1c9bcbeddd8f52c7ed4b980949359601afdbdb9f 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts
@@ -23,6 +23,7 @@ describe('Vorgang forwarding failed', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -34,6 +35,7 @@ describe('Vorgang forwarding failed', () => {
 
 		it('should show vorgang header', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -52,13 +54,15 @@ describe('Vorgang forwarding failed', () => {
 
 			formular.forward();
 
-			waitForSpinnerToDisappear();
+			exist(forwardingContainer.getSpinner());
 		})
 	})
 
 	describe('mark forwarding as fail', () => {
 
 		it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], () => {
+			waitForSpinnerToDisappear();
+
 			haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET])
 		})
 
@@ -97,7 +101,6 @@ describe('Vorgang forwarding failed', () => {
 
 		it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG] + ' in list', () => {
 			vorgangPage.getSubnavigation().clickBackButton();
-
 			waitForSpinnerToDisappear();
 
 			haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts
index b446c717078d72330f2b0bf982cbbad040e60d50..ebd21580474f4f60c91cf4789a799fa6a6d6e80e 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts
@@ -30,6 +30,7 @@ describe('Vorgang Verwerfen', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Vorgang Verwerfen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangVerwerfen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -53,15 +55,13 @@ describe('Vorgang Verwerfen', () => {
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.clickVerwerfenByButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackbar.getCloseButton());
+				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close button', () => {
 				snackbar.getCloseButton().click();
 
 				notExist(snackbar.getMessage());
@@ -78,13 +78,12 @@ describe('Vorgang Verwerfen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Verworfen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangVerwerfen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 		})
@@ -94,6 +93,7 @@ describe('Vorgang Verwerfen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangVerwerfenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -104,23 +104,24 @@ describe('Vorgang Verwerfen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().clickVerwerfenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackbar.getCloseButton());
+				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackbar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackbar.getMessage());
 			})
 
-			it('should show status Neu', () => {
+			it('should show status Neu after progressbar dissapear', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 
@@ -131,13 +132,12 @@ describe('Vorgang Verwerfen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Neu', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangVerwerfenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts
index 19969db1281cf3cb0698290ae52ffe031d983814..efdab9bb0f489f1af5f5330f3ed6ba79f24e1832 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -38,6 +39,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -48,17 +50,15 @@ describe('Vorgang wiedereroeffnen', () => {
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnen.status]);
 				})
 
-				it('should show snackBar message', () => {
+				it('should show snackBar', () => {
 					vorgangFormularButtons.clickWiedereroeffnenByButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should close snackBar', () => {
+				it('should close snackBar on close', () => {
 					snackbar.getCloseButton().click();
 
 					notExist(snackbar.getMessage());
@@ -70,13 +70,12 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status In Bearbeitung', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 				})
 			})
@@ -86,6 +85,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -96,35 +96,35 @@ describe('Vorgang wiedereroeffnen', () => {
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnenRevoke.status]);
 				})
 
-				it('should show snackBar message', () => {
+				it('should show snackBar', () => {
 					vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should show progressbar', () => {
+				it('should close snackbar on revoke', () => {
 					snackbar.getRevokeButton().click();
+					waitForSpinnerToDisappear();
 
-					exist(vorgangPage.getProgressBar());
+					notExist(snackbar.getMessage());
 				})
 
-				it('should show status Abgeschlossen', () => {
+				it('should show status Abgeschlossen after progressbar dissapear', () => {
+					notExist(vorgangPage.getProgressBar());
+
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 				})
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status Abgeschlossen', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 				})
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts
index a8cca227ed36bc17abfa2ab8a7e675db15184700..dd64bead9a1e543c106ebf8a050900a7503125a9 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts
@@ -30,6 +30,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		loginAsEmil();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckholen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -51,17 +53,15 @@ describe('Vorgang Zurueckholen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholen.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangFormularButtons.getZurueckholenButton().click();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close button', () => {
 				snackBar.getCloseButton().click();
 
 				notExist(snackBar.getMessage());
@@ -77,13 +77,12 @@ describe('Vorgang Zurueckholen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Neu', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckholen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 		})
@@ -93,6 +92,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckholenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -103,23 +103,24 @@ describe('Vorgang Zurueckholen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().getZurueckholenIconButton().click();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
-			it('should show status Verworfen', () => {
+			it('should show status Verworfen after progressbar dissapear', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 
@@ -130,13 +131,12 @@ describe('Vorgang Zurueckholen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Verworfen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckholenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
index 203c52d1434d3ea22f67dfd6b4ab3f84a4ac87a7..f883346b68b13208de815768db5915a07186c443 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
@@ -31,8 +31,8 @@ describe('VorgangList Suche for EA User', () => {
 
 			loginAsEmil();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		after(() => {
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts
index 5eb8d73a7a55affde88fd652bfabbdc5ea62aa0f..14f07f5139439315fc39e2a868ecd9111048655a 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts
@@ -13,8 +13,8 @@ describe('Buildinfo', () => {
 	before(() => {
 		loginAsSabine();
 
-		exist(vorgangList.getRoot());
 		waitForSpinnerToDisappear();
+		exist(vorgangList.getRoot());
 	})
 
 	after(() => {
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts
index 31d96367988452e667682d3352d353808f902fb4..16b0888357438675785587de4c1a998ea3243ceb 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts
@@ -3,7 +3,7 @@ import { ConnectionTimeoutRetryDialogE2EComponent, ConnectionTimeoutRetryFailDia
 import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vorgang-detail-header.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper';
 import { contains, exist } from '../../../support/cypress.util';
@@ -30,6 +30,7 @@ describe('Interceptor Connection Timeout', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -50,6 +51,7 @@ describe('Interceptor Connection Timeout', () => {
 
 		it('should navigate to vorgang detail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangHeader.getRoot());
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts
index 6f971f3dce5e52e043a092c5c36efe36b2235337..d8c311a1f3424f7eb09ca478df052cdbe0f82c63 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts
@@ -4,7 +4,7 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis
 import { VorgangSubnavigationE2EComponent } from '../../../components/vorgang/vorgang-subnavigation';
 import { HttpMethodE2E } from '../../../model/util';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper';
 import { contains, exist, notExist } from '../../../support/cypress.util';
@@ -28,6 +28,7 @@ describe('Interceptor Forbidden', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -48,6 +49,7 @@ describe('Interceptor Forbidden', () => {
 
 		it('should show page and snackbar', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			waitOfInterceptor(interceptor).then((interception) => {
 				assert(interception.response.statusCode, statusCode.toString());
@@ -59,8 +61,17 @@ describe('Interceptor Forbidden', () => {
 			})
 		})
 
+		it('should close snackbar on close button', () => {
+			snackbar.getCloseButton().click()
+
+			notExist(snackbar.getMessage());
+		})
+
 		it('should navigate back on back button', () => {
 			subnavigation.clickBackButton();
+
+			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 	})
 })
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts
index 01a057f45e4fdda8a23a26d4a21401ac8904fa8c..438160b38f2980878f20ccee42c6f7003e48ca59 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts
@@ -2,7 +2,7 @@ import { InternalServerErrorDialogE2EComponent } from '../../../components/ui/in
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { HttpMethodE2E } from '../../../model/util';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, interceptWithResponse, waitOfInterceptor } from '../../../support/cypress-helper';
 import { contains, exist, notExist } from '../../../support/cypress.util';
@@ -24,6 +24,7 @@ describe('Interceptor Server Error', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -44,6 +45,7 @@ describe('Interceptor Server Error', () => {
 
 		it('should show page', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			waitOfInterceptor(interceptor).then(interception => {
 				assert(interception.response.statusCode, statusCode.toString());
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts
index fdd0153dd47f7ed0867268ea4823b188c8b3d1d8..9904eb389b800a0bfbc081e5b2f21af6167b4589 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Interceptor unauthorized', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -42,6 +43,7 @@ describe('Interceptor unauthorized', () => {
 			interceptWithResponse(HttpMethodE2E.GET, BASE_PATH + vorgang._id.$oid, { statusCode }).as(interceptorResponseUnauthorized);
 
 			vorgangList.getListItem(vorgang.name).getRoot().click({ force: true });
+			waitForSpinnerToDisappear();
 
 			waitOfInterceptor(interceptorResponseUnauthorized).then((interception) => {
 				assert(interception.response.statusCode, statusCode.toString());
@@ -59,6 +61,9 @@ describe('Interceptor unauthorized', () => {
 
 		it('should navigate back on back button', () => {
 			subnavigation.clickBackButton();
+			waitForSpinnerToDisappear();
+
+			exist(vorgangList.getRoot());
 		})
 	})
 })
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts
index aff539185f321f7c0c72a00d506d660e6834b2fc..ecaf35b5a3970e7fefb43c0dd1f9b1a5ce7787d3 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts
@@ -24,6 +24,7 @@ describe('Kommentar', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(mainPage.getVorgangList().getRoot());
 	})
 
@@ -35,6 +36,7 @@ describe('Kommentar', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			mainPage.getVorgangList().getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -48,6 +50,7 @@ describe('Kommentar', () => {
 
 			it('should show formular', () => {
 				kommentarContainer.getHinzufuegenButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(kommentarContainer.getFormular());
 			})
@@ -65,9 +68,8 @@ describe('Kommentar', () => {
 		describe('click on hinzufuegen button in formular', () => {
 
 			it('should show error on invalid input', () => {
-				waitForSpinnerToDisappear();
-
 				kommentarContainer.getFormularSpeichernButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(kommentarContainer.getTextError());
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
index 83e1ee78b3d2fdf94dc4c2ce754c059e3422841d..8f5b997336681229f082ca75e91d259aac2ff6f5 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
@@ -1,13 +1,13 @@
 import { NavigationE2EComponent } from 'apps/goofy-e2e/src/components/navigation/navigation.e2e.component';
 import { VorgangListE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component';
 import { VorgangE2E } from 'apps/goofy-e2e/src/model/vorgang';
-import { MainPage } from 'apps/goofy-e2e/src/page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-objects/main.po';
 import { dropCollections } from 'apps/goofy-e2e/src/support/cypress-helper';
 import { CypressKeyboardActions, exist, notExist } from 'apps/goofy-e2e/src/support/cypress.util';
 import { getUserSabineUuid, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util';
 import { buildVorgang, createVorgang, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util';
 
-describe.skip('Navigation', () => {
+describe('Navigation', () => {
 	const mainPage: MainPage = new MainPage();
 	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
 
@@ -25,6 +25,10 @@ describe.skip('Navigation', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
+		exist(vorgangList.getRoot());
+		navigation.getAllVorgaengeItem().click();
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -36,6 +40,7 @@ describe.skip('Navigation', () => {
 
 		it('should hide not to user assigned vorgaenge', () => {
 			navigation.getMyVorgaengeItem().click();
+			waitForSpinnerToDisappear();
 
 			notExist(vorgangList.getListItem(vorgang.name).getRoot());
 			notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
@@ -45,6 +50,7 @@ describe.skip('Navigation', () => {
 
 		it('should hide not matching vorgaenge after do search', () => {
 			doSearch(searchString);
+			waitForSpinnerToDisappear();
 
 			notExist(vorgangList.getListItem(vorgang.name).getRoot());
 			notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
@@ -57,6 +63,7 @@ describe.skip('Navigation', () => {
 
 		it('should show all vorgaenge', () => {
 			navigation.getAllVorgaengeItem().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangList.getListItem(vorgang.name).getRoot());
 			exist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
@@ -66,6 +73,7 @@ describe.skip('Navigation', () => {
 
 		it('should hide not matching vorgaenge after do search', () => {
 			doSearch(searchString);
+			waitForSpinnerToDisappear();
 
 			notExist(vorgangList.getListItem(vorgang.name).getRoot());
 			exist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts
index 621dabf8a158720324163270a540d882c28f3c4a..7694fdeed57227d15a48267b26284576ebffa866 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts
@@ -4,7 +4,7 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis
 import { VorgangSubnavigationE2EComponent } from '../../../components/vorgang/vorgang-subnavigation';
 import { VorgangE2E } from '../../../model/vorgang';
 import { DirectionE2E, PostfachMailItemE2E, PostfachNachrichtMessageCodeE2E, PostfachNachrichtMessageCodeMessagesE2E, PostfachNachrichtSnackbarMessageE2E, VorgangAttachedItemE2E } from '../../../model/vorgang-attached-item';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { PostfachMailPage } from '../../../page-objects/postfach-mail.component.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections } from '../../../support/cypress-helper';
@@ -41,6 +41,7 @@ describe('PostfachMail error', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -52,6 +53,7 @@ describe('PostfachMail error', () => {
 
 		it('should open vorgang detail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -109,6 +111,7 @@ describe('PostfachMail error', () => {
 
 			it('click on resend button should hide error', () => {
 				listItem.getResendButton().click();
+				waitForSpinnerToDisappear();
 
 				notExist(listItem.getMailSendErrorIcon());
 			})
@@ -120,6 +123,12 @@ describe('PostfachMail error', () => {
 					notExist(snackbar.getRevokeButton());
 				})
 
+				it('should close snackbar on close button', () => {
+					snackbar.getCloseButton().click();
+
+					notExist(snackbar.getMessage());
+				})
+
 				it('should show mail subject', () => {
 					contains(listItem.getSubject(), postfachMailItem.subject);
 				})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts
index 63ee7d0fd571d2ae8748978b8e57b100a507fe77..944b11a29574a0e637ac97d4841a894853e2daf2 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts
@@ -53,6 +53,7 @@ describe('PostfachMail', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -61,6 +62,7 @@ describe('PostfachMail', () => {
 	})
 
 	describe('mail icon', () => {
+
 		it('should not be visible', () => {
 			notExist(vorgangList.getListItem(vorgang.name).getPostfachStatus());
 		})
@@ -70,6 +72,7 @@ describe('PostfachMail', () => {
 
 		it('should open vorgang detail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -98,6 +101,7 @@ describe('PostfachMail', () => {
 
 			it('should show fixed dialog header and content', () => {
 				postfachMailContainer.getButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(fixedDialog.getDialogHeader());
 				exist(fixedDialog.getDialogContent());
@@ -124,6 +128,7 @@ describe('PostfachMail', () => {
 
 			it('should open dialog click on icon button', () => {
 				subnavigation.getPostfachMailIconButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(postfachMailFormular.getEmpfaenger());
 			})
@@ -146,6 +151,7 @@ describe('PostfachMail', () => {
 
 			it('should show error on subject if send empty', () => {
 				postfachMailFormular.getSendButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(postfachMailFormular.getBetreffError());
 			})
@@ -173,32 +179,35 @@ describe('PostfachMail', () => {
 
 			it('should show empty attachment after uploading it', () => {
 				uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT)
+				waitForSpinnerToDisappear();
 
 				exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
 			})
 
 			it('should show attachment with content after uploading it', () => {
 				uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT);
+				waitForSpinnerToDisappear();
 
 				exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
 			})
 
 			it('should download empty attachment on click', () => {
 				attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click();
-
 				waitForSpinnerToDisappear();
+
 				exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
 			})
 
 			it('should download attachment with content on click', () => {
 				attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
-
 				waitForSpinnerToDisappear();
+
 				exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT));
 			})
 
 			it('should not show empty attachment after deleting it', () => {
 				attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDeleteButton().click();
+				waitForSpinnerToDisappear();
 
 				notExist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
 			})
@@ -208,12 +217,13 @@ describe('PostfachMail', () => {
 
 			it('should show error snackbar', () => {
 				uploadFile(postfachMailFormular.getAttachmentContainer().getUploadInput(), TEST_FILE_WITH_CONTENT_4_MB);
+				waitForSpinnerToDisappear();
 
 				exist(snackbar.getMessage());
 				contains(snackbar.getMessage(), BinaryFileSnackbarMessageE2E.ATTACHMENT_NOT_ADDED.replace('{size}', '3MB'));
 			})
 
-			it('should close snackbar', () => {
+			it('should close snackbar on close button', () => {
 				snackbar.getCloseButton().click();
 
 				notExist(snackbar.getCloseButton());
@@ -240,6 +250,7 @@ describe('PostfachMail', () => {
 
 			it('should close dialog', () => {
 				postfachMailFormular.getSendButton().click();
+				waitForSpinnerToDisappear();
 
 				notExist(postfachMailFormular.getEmpfaenger());
 			})
@@ -249,6 +260,12 @@ describe('PostfachMail', () => {
 				notExist(snackbar.getRevokeButton());
 			})
 
+			it('should close snackbar on close button', () => {
+				snackbar.getCloseButton().click();
+
+				notExist(snackbar.getMessage());
+			})
+
 			it('should show postfach mail in list', () => {
 				const postfachMailItem: PostfachMailListItem = postfachMailContainer.getListItem(postfachMailToSend.subject);
 
@@ -280,8 +297,8 @@ describe('PostfachMail', () => {
 			it('should download attachment after click', () => {
 				const postfachListItem: PostfachMailListItem = postfachMailPage.getListItem(postfachMailToSend.subject);
 
-				waitForSpinnerToDisappear();
 				postfachListItem.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
 			});
@@ -390,6 +407,9 @@ describe('PostfachMail', () => {
 
 			it('should open full view of postfachMailList', () => {
 				postfachMailReplyItem.getRoot().click();
+				waitForSpinnerToDisappear();
+
+				exist(postfachMailPage.getRoot());
 			})
 
 			it('should show subnavigation', () => {
@@ -424,6 +444,7 @@ describe('PostfachMail', () => {
 
 			it('should navigate to vorgang detail', () => {
 				postfachMailPage.getSubnavigation().getBackButton().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts
index 8c388898fd9a633fe3e8a968ef7cdc970060b646..bfd4a54ec45dbff7c02fd4008796b96f782a15e7 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts
@@ -46,13 +46,14 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => {
 		before(() => {
 			loginAsKfinder();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		it('should open postfachNachrichten page', () => {
 			logInParts(authorizedUrl);
 			visitUrl(authorizedUrl);
+			waitForSpinnerToDisappear();
 
 			exist(postfachMailPage.getBreadcrump());
 		});
@@ -60,10 +61,15 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => {
 		it('should not open postfachNachrichten page', () => {
 			logInParts(forbiddenUrl);
 			visitUrl(forbiddenUrl);
+			waitForSpinnerToDisappear();
 
 			notExist(postfachMailPage.getBreadcrump());
+		})
+
+		it('should show snackbar', () => {
+			exist(snackbar.getCloseButton());
 			contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
-		});
+		})
 	})
 
 	describe('on user kordner', () => {
@@ -73,13 +79,14 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => {
 		before(() => {
 			loginAsKordner();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		it('should open postfachNachrichten page', () => {
 			logInParts(authorizedUrl);
 			visitUrl(authorizedUrl);
+			waitForSpinnerToDisappear();
 
 			exist(postfachMailPage.getBreadcrump())
 		})
@@ -87,8 +94,13 @@ describe('PostfachNachrichten filtered by organisationseinheit', () => {
 		it('should not open postfachNachrichten page', () => {
 			logInParts(forbiddenUrl);
 			visitUrl(forbiddenUrl);
+			waitForSpinnerToDisappear();
 
 			notExist(postfachMailPage.getBreadcrump())
+		})
+
+		it('should show snackbar', () => {
+			exist(snackbar.getCloseButton());
 			contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 		})
 	})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts
index 417dc74f6409c2f42e5a22065a58d22e8fc141bc..1722f12188e52d052cb1b1c26e78a851e38362e0 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts
@@ -46,8 +46,8 @@ describe('Postfach Nachricht should be authorized by role', () => {
 
 		it(`should show vorgang in Stauts ${VorgangStatusE2E.NEU}`, () => {
 			visitUrl(vorgangInStatusNeuUrl);
-
 			waitForSpinnerToDisappear();
+
 			exist(postfachNachrichtPage.getRoot());
 		})
 
@@ -55,24 +55,24 @@ describe('Postfach Nachricht should be authorized by role', () => {
 
 			it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => {
 				visitUrl(vorgangInStatusInBearbeitungUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(postfachNachrichtPage.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 
 			it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => {
 				visitUrl(vorgangInStatusAbgeschlossenUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(postfachNachrichtPage.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 
 			it(`${VorgangStatusE2E.BESCHIEDEN}`, () => {
 				visitUrl(vorgangInStatusBeschiedenUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(postfachNachrichtPage.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts
index 52bc2268b846b11854cdda954a91b9faa0c581fe..62892150267e504f3b6d627b46481f12d7d4ad7e 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts
@@ -2,7 +2,7 @@ import { CyHttpMessages } from 'cypress/types/net-stubbing';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { HttpMethodE2E } from '../../../model/util';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, interceptWithResponse } from '../../../support/cypress-helper';
 import { exist, notExist } from '../../../support/cypress.util';
@@ -22,6 +22,7 @@ describe('Postfach Nachrichten', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Postfach Nachrichten', () => {
 
 		it('navigate to vorgangDetail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts
index 4ee3b74623b6c6d794867813a49552103d1a0c49..d7f781d43afe7f14d579ea044c81769ac0591e3e 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts
@@ -17,7 +17,7 @@ describe('User Profile im ausgewählten Vorgang', () => {
 	const vorgangPage: VorgangPage = new VorgangPage();
 	const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer();
 
-	let vorgang: VorgangE2E = createVorgang();
+	const vorgang: VorgangE2E = createVorgang();
 	const userSabine: UserE2E = getUserSabine();
 	const userEmil: UserE2E = getUserEmil();
 
@@ -26,6 +26,7 @@ describe('User Profile im ausgewählten Vorgang', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -46,6 +47,7 @@ describe('User Profile im ausgewählten Vorgang', () => {
 
 		it('open vorgang detail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -62,14 +64,14 @@ describe('User Profile im ausgewählten Vorgang', () => {
 
 		describe('fill formular', () => {
 
-			it('should show error on enter empty field', () => {
+			it('should show error on enter wrong input', () => {
 				enterWith(userProfileContainer.getSearchContainer().getInput(), 'Clark Kent');
 
 				exist(userProfileContainer.getSearchContainer().getError());
 				exist(userProfileContainer.getIconContainer().getUnassignedIcon());
 			})
 
-			it('should show error on enter wrong input', () => {
+			it('should show error on enter empty field', () => {
 				enterWith(userProfileContainer.getSearchContainer().getInput(), '');
 
 				exist(userProfileContainer.getSearchContainer().getError());
@@ -112,6 +114,7 @@ describe('User Profile im ausgewählten Vorgang', () => {
 
 			it('open vorgang detail', () => {
 				vorgangList.getListItem(vorgang.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts
index 5c03ba490c7ab7982627d486f315ce28c7390554..b01f639bb481756e382349c755592a29b6edffd8 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts
@@ -36,6 +36,7 @@ describe('Postfach nachricht user profile on backend error', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -47,6 +48,7 @@ describe('Postfach nachricht user profile on backend error', () => {
 
 		it('should navigate to vorgang detail', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			waitForSpinnerToDisappear();
@@ -62,6 +64,9 @@ describe('Postfach nachricht user profile on backend error', () => {
 
 		it('should navigate back to list', () => {
 			vorgangPage.getSubnavigation().clickBackButton();
+			waitForSpinnerToDisappear();
+
+			exist(vorgangList.getRoot());
 		})
 	})
 
@@ -96,6 +101,9 @@ describe('Postfach nachricht user profile on backend error', () => {
 
 		it('should navigate back', () => {
 			vorgangPage.getSubnavigation().clickBackButton();
+			waitForSpinnerToDisappear();
+
+			exist(vorgangList.getRoot());
 		})
 	})
 })
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts
index 3270339a9c28435a401ac8ef8d962eb9ac436c33..25a62e54666685b4258417722be004b5c6be6104 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts
@@ -20,13 +20,14 @@ describe('User profile assigned to vorgang', () => {
 	const vorgangPage: VorgangPage = new VorgangPage();
 	const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer();
 
-	let vorgang: VorgangE2E = { ...createVorgang(), assignedTo: faker.datatype.uuid() };
+	const vorgang: VorgangE2E = { ...createVorgang(), assignedTo: faker.datatype.uuid() };
 
 	before(() => {
 		initVorgang(vorgang);
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -40,9 +41,9 @@ describe('User profile assigned to vorgang', () => {
 
 			it('should navigate to vorgang detail', () => {
 				vorgangList.getListItem(vorgang.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
-				waitForSpinnerToDisappear();
 			})
 
 			it('should show icon', () => {
@@ -55,6 +56,9 @@ describe('User profile assigned to vorgang', () => {
 
 			it('should navigate back', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+
+				waitForSpinnerToDisappear();
+				exist(vorgangList.getRoot());
 			})
 		})
 
@@ -63,8 +67,6 @@ describe('User profile assigned to vorgang', () => {
 			const userProfile: UserProfileIconE2EComponent = vorgangList.getListItem(vorgang.name).getUserProfile().getIconContainer();
 
 			it('should show icon', () => {
-				waitForSpinnerToDisappear();
-
 				exist(userProfile.getErrorResourceNotFoundIcon());
 			})
 
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts
index d7c477c00215beb0d6768c4e33ddcb962b8a22b1..2cd258c55c852cf1e20ad2babe891387d8fd4676 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts
@@ -47,6 +47,7 @@ describe('Vorgang Anhänge', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear()
 		exist(vorgangList.getRoot());
 	})
 
@@ -58,8 +59,8 @@ describe('Vorgang Anhänge', () => {
 
 		it('should open vorgang detail page on click on single vorgang', () => {
 			vorgangList.getListItem(vorgangAnhangVorhanden.name).getRoot().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(vorgangHeader.getRoot());
 		})
 
@@ -73,23 +74,23 @@ describe('Vorgang Anhänge', () => {
 		it('should download jpg', () => {
 			const jpgAttachmentName: string = getJpgAttachment().name;
 			attachmentContainer.getList().getItem(jpgAttachmentName).getRoot().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(jpgAttachmentName));
 		})
 
 		it('should download pdf', () => {
 			const pdfAttachmentName: string = getPdfAttachment().name;
 			attachmentContainer.getList().getItem(convertToDataTestId(pdfAttachmentName)).getRoot().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(pdfAttachmentName));
 		})
 
 		it('should navigate to vorganglist on back button', () => {
 			subnavigation.clickBackButton();
-
 			waitForSpinnerToDisappear();
+
 			exist(vorgangList.getRoot());
 		})
 
@@ -106,8 +107,8 @@ describe('Vorgang Anhänge', () => {
 
 		it('should open vorgang detail page on click on single vorgang', () => {
 			vorgangList.getListItem(vorgangAnhangVorhanden.name).getRoot().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(vorgangHeader.getRoot());
 		})
 
@@ -120,15 +121,15 @@ describe('Vorgang Anhänge', () => {
 
 		it('should download representation', () => {
 			attachmentContainer.getList().getItem(xmlRepresentation.name).getRoot().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(xmlRepresentation.name));
 		})
 
 		it('should navigate to vorganglist on back button', () => {
 			subnavigation.clickBackButton();
-
 			waitForSpinnerToDisappear();
+
 			exist(vorgangList.getRoot());
 		})
 	})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts
index 418c7631cfcffa90eb7157ac5dd19b4600aba17d..ca75d37cffb640113588983e344276215320c4a9 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Vorgang abschliessen(EA)', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -36,6 +37,7 @@ describe('Vorgang abschliessen(EA)', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAbschliessen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -48,12 +50,10 @@ describe('Vorgang abschliessen(EA)', () => {
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.clickAbschliessenByButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN)
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN)
 			})
 
 			it('should close snackBar', () => {
@@ -68,13 +68,12 @@ describe('Vorgang abschliessen(EA)', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Abgeschlossen', () => {
-				waitForSpinnerToDisappear()
-
 				haveText(vorgangList.getListItem(vorgangAbschliessen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 			})
 		})
@@ -84,6 +83,7 @@ describe('Vorgang abschliessen(EA)', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAbschliessenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -96,33 +96,33 @@ describe('Vorgang abschliessen(EA)', () => {
 
 			it('should show snackBar message', () => {
 				vorgangPage.getSubnavigation().clickAbschliessenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ABGESCHLOSSEN);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
 			it('should show status Beschieden', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Beschieden', () => {
-				waitForSpinnerToDisappear()
-
 				haveText(vorgangList.getListItem(vorgangAbschliessenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN])
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts
index 1e5c724078e13598c0f05f24941f0f19d1d14ae6..a7d9a247a87091fb9cd52fae58269d7e5148740c 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts
@@ -30,6 +30,7 @@ describe('Vorgang Annehmen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Vorgang Annehmen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAnnehmen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -53,15 +55,13 @@ describe('Vorgang Annehmen', () => {
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.clickAnnehmenByButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN);
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close', () => {
 				snackBar.getCloseButton().click();
 
 				notExist(snackBar.getMessage());
@@ -73,13 +73,12 @@ describe('Vorgang Annehmen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Angenommen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangAnnehmen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]);
 			})
 		})
@@ -89,6 +88,7 @@ describe('Vorgang Annehmen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangAnnehmenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -101,33 +101,32 @@ describe('Vorgang Annehmen', () => {
 
 			it('should show snackBar message', () => {
 				vorgangPage.getSubnavigation().clickAnnehmenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ANGENOMMEN);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
 			it('should show status Neu', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Neu', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangAnnehmenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts
index f22f6ee8e24337c7a53373fc226e043a712481d9..c2c9639eb69124f39c53a631c445737ae8ae46ea 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Vorgang bearbeiten', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -36,6 +37,7 @@ describe('Vorgang bearbeiten', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangBearbeiten.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -46,17 +48,15 @@ describe('Vorgang bearbeiten', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangBearbeiten.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangFormularButtons.clickBearbeitenByButton();
+				waitForSpinnerToDisappear();
 
 				contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close button', () => {
 				snackBar.getCloseButton().click();
 
 				notExist(snackBar.getMessage());
@@ -68,13 +68,12 @@ describe('Vorgang bearbeiten', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status In Bearbeitung', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangBearbeiten.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG])
 			})
 		})
@@ -84,6 +83,7 @@ describe('Vorgang bearbeiten', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangBearbeitenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -94,35 +94,35 @@ describe('Vorgang bearbeiten', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangBearbeitenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().clickBearbeitenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.BEARBEITET);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
 			it('should show status Angenommen', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Angenommen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangBearbeitenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN])
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts
index 828b30bcfc7c56016230710851d2ffbe24ba0332..8a7507dc6faf733efb7e75a92ac8ac1361919ff1 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts
@@ -25,6 +25,7 @@ describe('Vorgang bescheiden', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -36,6 +37,7 @@ describe('Vorgang bescheiden', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangBescheiden.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -48,6 +50,7 @@ describe('Vorgang bescheiden', () => {
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.clickBescheidenByButton();
+				waitForSpinnerToDisappear();
 
 				contains(snackBar.getMessage(), VorgangMessagesE2E.BESCHIEDEN);
 			})
@@ -68,6 +71,7 @@ describe('Vorgang bescheiden', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
@@ -84,6 +88,7 @@ describe('Vorgang bescheiden', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangBescheidenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -96,6 +101,7 @@ describe('Vorgang bescheiden', () => {
 
 			it('should show snackBar message', () => {
 				vorgangPage.getSubnavigation().clickBescheidenByIconButton();
+				waitForSpinnerToDisappear();
 
 				contains(snackBar.getMessage(), VorgangMessagesE2E.BESCHIEDEN);
 			})
@@ -104,25 +110,27 @@ describe('Vorgang bescheiden', () => {
 				exist(snackBar.getCloseButton());
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
-			it('should show status In Bearbeitung', () => {
+			it('should show status Angenommen', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status In Bearbeitung', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangBescheidenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts
index 149ffcb5341df253331274d1a4580f85ceaba311..142169a91e9bffd79cb63977366549996c9874b5 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts
@@ -10,7 +10,7 @@ import { AntragstellerE2EComponent } from '../../../components/vorgang/vorgang-a
 import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vorgang-detail-header.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections } from '../../../support/cypress-helper';
 import { exist, notExist } from '../../../support/cypress.util';
@@ -42,6 +42,7 @@ describe('Vorgang Detailansicht by role', () => {
 
 			loginAsSabine();
 
+			waitForSpinnerToDisappear();
 			exist(vorgangList.getRoot());
 		})
 
@@ -53,6 +54,7 @@ describe('Vorgang Detailansicht by role', () => {
 
 			it('should show vorgang header', () => {
 				vorgangList.getListItem(vorgang.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangHeader.getRoot());
 			})
@@ -145,6 +147,7 @@ describe('Vorgang Detailansicht by role', () => {
 
 			loginAsPeter();
 
+			waitForSpinnerToDisappear();
 			exist(vorgangList.getRoot());
 		})
 
@@ -156,6 +159,7 @@ describe('Vorgang Detailansicht by role', () => {
 
 			it('should show vorgang header', () => {
 				vorgangList.getListItem(vorgang.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangHeader.getRoot());
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts
index ef4580dcb7452922d2048e243a025cfd593d4535..3a142e56dcc6d31bbf8050116cfd248c30fdd072 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts
@@ -41,8 +41,8 @@ describe('Vorgang Detailansicht should be authorized by role', () => {
 
 		it(`should show vorgang in Stauts ${VorgangStatusE2E.NEU}`, () => {
 			visitUrl(vorgangInStatusNeuUrl);
-
 			waitForSpinnerToDisappear();
+
 			exist(vorgangHeader.getRoot());
 		})
 
@@ -50,24 +50,24 @@ describe('Vorgang Detailansicht should be authorized by role', () => {
 
 			it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => {
 				visitUrl(vorgangInStatusInBearbeitungUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(vorgangHeader.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 
 			it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => {
 				visitUrl(vorgangInStatusAbgeschlossenUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(vorgangHeader.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 
 			it(`${VorgangStatusE2E.BESCHIEDEN}`, () => {
 				visitUrl(vorgangInStatusBeschiedenUrl);
-
 				waitForSpinnerToDisappear();
+
 				notExist(vorgangHeader.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts
index 646844ed4200896472625a8675a0e92888172e45..a4379d6f5b9cec103dea4f24bdee60d6337b3f4d 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts
@@ -7,7 +7,7 @@ import { VorgangDetailHeaderE2EComponent } from '../../../components/vorgang/vor
 import { VorgangFormularDatenE2EComponent } from '../../../components/vorgang/vorgang-formular.e2e.component';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { NO_AKTENZEICHEN, VorgangE2E, vorgangStatusLabelE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, reload } from '../../../support/cypress-helper';
 import { contains, exist, haveText, shouldFirstContains, shouldHaveAttributeBeGreaterThan, shouldHaveAttributeBeLowerThan } from '../../../support/cypress.util';
@@ -34,6 +34,7 @@ describe('Vorgang Detailansicht', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -47,6 +48,7 @@ describe('Vorgang Detailansicht', () => {
 
 			it('should show header', () => {
 				vorgangList.getListItem(vorgang.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangHeader.getRoot());
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts
index cb4b967375f9dac8017e703ffd3e9c8b4826164e..04c011a405433385a98d2539c52698ddf192bcd7 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts
@@ -43,20 +43,26 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => {
 		before(() => {
 			loginAsKfinder();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		it('should open detailpage', () => {
-			visitUrl(authorizedUrl)
+			visitUrl(authorizedUrl);
+			waitForSpinnerToDisappear();
 
 			exist(detailPage.getRoot());
 		})
 
 		it('should not open detailpage', () => {
-			visitUrl(forbiddenUrl)
+			visitUrl(forbiddenUrl);
+			waitForSpinnerToDisappear();
 
 			notExist(detailPage.getRoot());
+		})
+
+		it('should show snackbar', () => {
+			exist(snackbar.getCloseButton());
 			contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 		})
 	})
@@ -68,20 +74,26 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => {
 		before(() => {
 			loginAsKordner();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		it('should open detailpage', () => {
-			visitUrl(authorizedUrl)
+			visitUrl(authorizedUrl);
+			waitForSpinnerToDisappear();
 
 			exist(detailPage.getRoot());
 		})
 
 		it('should not open detailpage', () => {
-			visitUrl(forbiddenUrl)
+			visitUrl(forbiddenUrl);
+			waitForSpinnerToDisappear();
 
 			notExist(detailPage.getRoot());
+		})
+
+		it('should show snackbar', () => {
+			exist(snackbar.getCloseButton());
 			contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 		})
 	})
@@ -93,23 +105,41 @@ describe('Vorgang-detailansicht filtered by organisationseinheit', () => {
 		before(() => {
 			loginAsZonk();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		describe('for vorgang with assigned organisationseinheitenId', () => {
 
 			it('should not open detailpage (for kordner)', () => {
-				visitUrl(authorizedUrl)
+				visitUrl(authorizedUrl);
+				waitForSpinnerToDisappear();
 
 				notExist(detailPage.getRoot());
+			})
+
+			it('should show snackbar', () => {
+				exist(snackbar.getCloseButton());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 
+			it('should close snackbar on close button', () => {
+				//FIXME Workaround, somewhere and somehow here are appearing multiple instances of snackbar(or the button)
+				snackbar.getCloseButton().click({ multiple: true });
+
+				notExist(snackbar.getCloseButton());
+				notExist(snackbar.getMessage());
+			})
+
 			it('should not open detailpage (for kfinder)', () => {
-				visitUrl(forbiddenUrl)
+				visitUrl(forbiddenUrl);
+				waitForSpinnerToDisappear();
 
 				notExist(detailPage.getRoot());
+			})
+
+			it('should show snackbar', () => {
+				exist(snackbar.getCloseButton());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts
index 0d15e1c5b29f7d9e1acd5d833f6e47c1b08cc3cb..406f302306caf7fba1c9e696a8e0bd8580fca210 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts
@@ -30,6 +30,7 @@ describe('Vorgang Verwerfen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Vorgang Verwerfen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangVerwerfen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -51,17 +53,15 @@ describe('Vorgang Verwerfen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfen.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangFormularButtons.clickVerwerfenByButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackbar.getCloseButton());
+				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close button', () => {
 				snackbar.getCloseButton().click();
 
 				notExist(snackbar.getMessage());
@@ -78,13 +78,12 @@ describe('Vorgang Verwerfen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Verworfen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangVerwerfen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 		})
@@ -94,6 +93,7 @@ describe('Vorgang Verwerfen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangVerwerfenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -104,23 +104,24 @@ describe('Vorgang Verwerfen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerwerfenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().clickVerwerfenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackbar.getCloseButton());
+				contains(snackbar.getMessage(), VorgangMessagesE2E.VERWORFEN);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackbar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackbar.getMessage());
 			})
 
 			it('should show status Neu', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 
@@ -131,13 +132,12 @@ describe('Vorgang Verwerfen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Neu', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangVerwerfenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts
index 1858838d553977c8fb374a22588823053dbdf3a2..c8f66d7b542e403c20c0bed24cc5d23042c104ab 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts
@@ -27,6 +27,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -40,6 +41,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangBeschiedenWiedereroeffnen.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -52,15 +54,13 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('should show snackBar message', () => {
 					vorgangFormularButtons.clickWiedereroeffnenByButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should close snackBar', () => {
+				it('should close snackBar on close', () => {
 					snackbar.getCloseButton().click();
 
 					notExist(snackbar.getMessage());
@@ -72,13 +72,12 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status In Bearbeitung', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangBeschiedenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 				})
 			})
@@ -88,6 +87,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangBeschiedenWiedereroeffnenRevoke.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -99,18 +99,17 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('should show snackBar message', () => {
 					vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should show progressbar', () => {
+				it('should close snackbar on revoke', () => {
 					snackbar.getRevokeButton().click();
+					waitForSpinnerToDisappear();
 
-					exist(vorgangPage.getProgressBar());
+					notExist(snackbar.getMessage());
 				})
 
 				it('should show status Beschieden', () => {
@@ -119,13 +118,12 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status Beschieden', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangBeschiedenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN]);
 				})
 			})
@@ -138,6 +136,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -148,17 +147,15 @@ describe('Vorgang wiedereroeffnen', () => {
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnen.status]);
 				})
 
-				it('should show snackBar message', () => {
+				it('should show snackBar', () => {
 					vorgangFormularButtons.clickWiedereroeffnenByButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should close snackBar', () => {
+				it('should close snackBar on close', () => {
 					snackbar.getCloseButton().click();
 
 					notExist(snackbar.getMessage());
@@ -170,13 +167,12 @@ describe('Vorgang wiedereroeffnen', () => {
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status In Bearbeitung', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 				})
 			})
@@ -186,6 +182,7 @@ describe('Vorgang wiedereroeffnen', () => {
 
 			it('Open Vorgang-Detail-Page', () => {
 				vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getRoot().click();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
 			})
@@ -196,35 +193,35 @@ describe('Vorgang wiedereroeffnen', () => {
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenWiedereroeffnenRevoke.status]);
 				})
 
-				it('should show snackBar message', () => {
+				it('should show snackBar', () => {
 					vorgangPage.getSubnavigation().clickWiedereroeffnenByIconButton();
+					waitForSpinnerToDisappear();
 
-					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
-				})
-
-				it('should show snackBar close button', () => {
 					exist(snackbar.getCloseButton());
+					contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
 				})
 
-				it('should show progressbar', () => {
+				it('should close snackbar on revoke', () => {
 					snackbar.getRevokeButton().click();
+					waitForSpinnerToDisappear();
 
-					exist(vorgangPage.getProgressBar());
+					notExist(snackbar.getMessage());
 				})
 
 				it('should show status Abgeschlossen', () => {
+					notExist(vorgangPage.getProgressBar());
+
 					haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 				})
 
 				it('back to vorgang list', () => {
 					vorgangPage.getSubnavigation().clickBackButton();
+					waitForSpinnerToDisappear();
 
 					exist(vorgangList.getRoot());
 				})
 
 				it('should have status Abgeschlossen', () => {
-					waitForSpinnerToDisappear();
-
 					haveText(vorgangList.getListItem(vorgangAbgeschlossenWiedereroeffnenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]);
 				})
 			})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts
index f22c2435761230070c1ec32e386a11d41bfeb015..65e409c051f981a604756c121cea4c0ba6377b71 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts
@@ -30,6 +30,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -41,6 +42,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckholen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -53,15 +55,13 @@ describe('Vorgang Zurueckholen', () => {
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.getZurueckholenButton().click();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
 			})
 
-			it('should close snackBar', () => {
+			it('should close snackBar on close button', () => {
 				snackBar.getCloseButton().click();
 
 				notExist(snackBar.getMessage());
@@ -77,13 +77,12 @@ describe('Vorgang Zurueckholen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Neu', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckholen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.NEU]);
 			})
 		})
@@ -93,6 +92,7 @@ describe('Vorgang Zurueckholen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckholenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -103,23 +103,24 @@ describe('Vorgang Zurueckholen', () => {
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangZurueckholenRevoke.status]);
 			})
 
-			it('should show snackBar message', () => {
+			it('should show snackBar', () => {
 				vorgangPage.getSubnavigation().getZurueckholenIconButton().click();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGEHOLT);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
-			it('should show status Verworfen', () => {
+			it('should show status Abgeschlossen', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 
@@ -130,13 +131,12 @@ describe('Vorgang Zurueckholen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Verworfen', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckholenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts
index 5369892a4a69a2dba8d398761ecc0cda846f714a..26b97a8d3e6246618865b62106ebe903914d2fd2 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts
@@ -32,6 +32,7 @@ describe('Vorgang Zurueckstellen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -43,6 +44,7 @@ describe('Vorgang Zurueckstellen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckstellen.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -54,19 +56,16 @@ describe('Vorgang Zurueckstellen', () => {
 			})
 
 			it('should have assigned user(Bearbeiter)', () => {
-				waitForSpinnerToDisappear();
 				exist(userContainer.getRoot());
 				exist(userContainer.getIconContainer().getAssignedIcon());
 			})
 
 			it('should show snackBar message', () => {
 				vorgangFormularButtons.clickZurueckstellenByButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT);
 			})
 
 			it('should close snackBar', () => {
@@ -81,13 +80,12 @@ describe('Vorgang Zurueckstellen', () => {
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status Zurückgestellt', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckstellen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ANGENOMMEN]);
 			})
 		})
@@ -97,6 +95,7 @@ describe('Vorgang Zurueckstellen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			vorgangList.getListItem(vorgangZurueckstellenRevoke.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -109,33 +108,33 @@ describe('Vorgang Zurueckstellen', () => {
 
 			it('should show snackBar message', () => {
 				vorgangPage.getSubnavigation().clickZurueckstellenByIconButton();
+				waitForSpinnerToDisappear();
 
-				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT);
-			})
-
-			it('should show snackBar close button', () => {
 				exist(snackBar.getCloseButton());
+				contains(snackBar.getMessage(), VorgangMessagesE2E.ZURUECKGESTELLT);
 			})
 
-			it('should show progressbar', () => {
+			it('should close snackbar on revoke', () => {
 				snackBar.getRevokeButton().click();
+				waitForSpinnerToDisappear();
 
-				exist(vorgangPage.getProgressBar());
+				notExist(snackBar.getMessage());
 			})
 
 			it('should show status In Bearbeitung', () => {
+				notExist(vorgangPage.getProgressBar());
+
 				haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 			})
 
 			it('back to vorgang list', () => {
 				vorgangPage.getSubnavigation().clickBackButton();
+				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
 			})
 
 			it('should have status In Bearbeitung', () => {
-				waitForSpinnerToDisappear();
-
 				haveText(vorgangList.getListItem(vorgangZurueckstellenRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]);
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts
index 67c6139fd149877e2ab73d2c0d283140bacd87eb..8f4f7a8ffd29da11826f5d8d9958988c5d96c929 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts
@@ -57,8 +57,8 @@ describe('VorgangList Wiedervorlagen Next Frist', () => {
 
 		loginAsSabine();
 
-		exist(vorgangList.getRoot());
 		waitForSpinnerToDisappear();
+		exist(vorgangList.getRoot());
 	})
 
 	after(() => {
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f1965d99c729fabcfa424f835f127b8057e1b0cb
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts
@@ -0,0 +1,92 @@
+import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
+import { EingangE2E, VorgangE2E } from '../../../model/vorgang';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
+import { dropCollections } from '../../../support/cypress-helper';
+import { exist, notExist } from '../../../support/cypress.util';
+import { ORGANISATIONSEINHEITEN_ID_FOR_KFINDER, ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } from '../../../support/data.util';
+import { loginAsKfinder, loginAsKordner, loginAsRichard, loginAsZonk } from '../../../support/user-util';
+import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
+
+describe('VorgangList', () => {
+	const mainPage: MainPage = new MainPage();
+	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
+
+	const eingangForKFinder: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KFINDER } };
+	const vorgangForKFinder: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangVisibleToKFinder'), eingangs: [eingangForKFinder] };
+
+	const eingangForKOrdner: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } };
+	const vorgangForKOrdner: VorgangE2E = { ...buildVorgang(objectIds[1], 'VorgangVisibleToKOrdner'), eingangs: [eingangForKOrdner] };
+
+	before(() => {
+		initVorgaenge([vorgangForKFinder, vorgangForKOrdner]);
+	})
+
+	after(() => {
+		dropCollections();
+	})
+
+	describe('filtered/authorized', () => {
+
+		describe('by user kfinder', () => {
+
+			before(() => {
+				loginAsKfinder();
+
+				waitForSpinnerToDisappear();
+				exist(vorgangList.getRoot());
+			})
+
+			it('should show authorized vorgaenge', () => {
+				exist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
+				notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
+			})
+		})
+
+		describe('by user kordner', () => {
+
+			before(() => {
+				loginAsKordner();
+
+				waitForSpinnerToDisappear();
+				exist(vorgangList.getRoot());
+			})
+
+			it('should show authorized vorgaenge', () => {
+				exist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
+				notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
+			})
+		})
+
+		describe('by user zonk', () => {
+
+			const vorgang: VorgangE2E = createVorgang();
+
+			before(() => {
+				loginAsZonk();
+
+				waitForSpinnerToDisappear();
+				exist(vorgangList.getRoot());
+			})
+
+			it('should show authorized empty vorgaenge', () => {
+				notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
+				notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
+				notExist(vorgangList.getListItem(vorgang.name).getRoot());
+			})
+		})
+
+		describe('by user richard', () => {
+
+			before(() => {
+				loginAsRichard();
+
+				waitForSpinnerToDisappear();
+			})
+
+			it('should show hint message while have no roles', () => {
+				notExist(vorgangList.getRoot());
+				exist(vorgangList.getNoRoleMessage());
+			})
+		})
+	})
+})
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts
deleted file mode 100644
index a34bf37792c33edaad29827f089cda91bf558ec6..0000000000000000000000000000000000000000
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.filtered-by-organisationseinheit.e2e-spec.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
-import { EingangE2E, VorgangE2E } from '../../../model/vorgang';
-import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
-import { dropCollections } from '../../../support/cypress-helper';
-import { exist, notExist } from '../../../support/cypress.util';
-import { ORGANISATIONSEINHEITEN_ID_FOR_KFINDER, ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } from '../../../support/data.util';
-import { loginAsKfinder, loginAsKordner, loginAsZonk } from '../../../support/user-util';
-import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util';
-
-describe('VorgangList filtered by organisationseinheit', () => {
-	const mainPage: MainPage = new MainPage();
-	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
-
-	const eingangForKFinder: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KFINDER } };
-	const vorgangForKFinder: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangVisibleToKFinder'), eingangs: [eingangForKFinder] };
-
-	const eingangForKOrdner: EingangE2E = { ...createVorgang().eingangs[0], zustaendigeStelle: { organisationseinheitenId: ORGANISATIONSEINHEITEN_ID_FOR_KORDNER } };
-	const vorgangForKOrdner: VorgangE2E = { ...buildVorgang(objectIds[1], 'VorgangVisibleToKOrdner'), eingangs: [eingangForKOrdner] };
-
-	before(() => {
-		initVorgaenge([vorgangForKFinder, vorgangForKOrdner]);
-	})
-
-	after(() => {
-		dropCollections();
-	})
-
-	describe('on user kfinder', () => {
-
-		before(() => {
-			loginAsKfinder();
-
-			exist(vorgangList.getRoot());
-			waitForSpinnerToDisappear();
-		})
-
-		it('should check list', () => {
-			exist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
-			notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
-		})
-	})
-
-	describe('on user kordner', () => {
-
-		before(() => {
-			loginAsKordner();
-
-			exist(vorgangList.getRoot());
-			waitForSpinnerToDisappear();
-		})
-
-		it('should check list', () => {
-			exist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
-			notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
-		})
-	})
-
-	describe('on user zonk', () => {
-
-		const vorgang: VorgangE2E = createVorgang();
-
-		before(() => {
-			loginAsZonk();
-
-			exist(vorgangList.getRoot());
-			waitForSpinnerToDisappear();
-		})
-
-		it('should check list', () => {
-			notExist(vorgangList.getListItem(vorgangForKOrdner.name).getRoot());
-			notExist(vorgangList.getListItem(vorgangForKFinder.name).getRoot());
-			notExist(vorgangList.getListItem(vorgang.name).getRoot());
-		})
-	})
-})
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
index b6952573e714611b15933a1e6454dd4ca50bc861..1fa2c0c8f192151232620a5b18288730884f2038 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
@@ -37,8 +37,8 @@ describe('VorgangList Suche', () => {
 
 			loginAsSabine();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		after(() => {
@@ -81,8 +81,8 @@ describe('VorgangList Suche', () => {
 
 			beforeEach(() => {
 				doSearchWith(requestId);
-
 				waitForSpinnerToDisappear();
+
 				exist(vorgangList.getRoot());
 				vorgangStayInList.getRoot().click();
 				exist(vorgangPage.getVorgangDetailHeader().getRoot());
@@ -133,8 +133,8 @@ describe('VorgangList Suche', () => {
 
 			loginAsSabine();
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		after(() => {
@@ -263,8 +263,8 @@ describe('VorgangList Suche', () => {
 
 			loginAsSabine();;
 
-			exist(vorgangList.getRoot());
 			waitForSpinnerToDisappear();
+			exist(vorgangList.getRoot());
 		})
 
 		after(() => {
@@ -281,8 +281,8 @@ describe('VorgangList Suche', () => {
 
 			it('should show result by vorgang name', () => {
 				doSearchWith(vorgangNameToMatch);
-
 				waitForSpinnerToDisappear();
+
 				exist(byVorgangName.getRoot());
 				notExist(byAktenzeichen.getRoot());
 				notExist(byAntragstellerVorname.getRoot());
@@ -292,8 +292,8 @@ describe('VorgangList Suche', () => {
 
 			it('should show result by aktenzeichen', () => {
 				doSearchWith(aktenzeichenToMatch);
-
 				waitForSpinnerToDisappear();
+
 				notExist(byVorgangName.getRoot());
 				exist(byAktenzeichen.getRoot());
 				notExist(byAntragstellerVorname.getRoot());
@@ -303,8 +303,8 @@ describe('VorgangList Suche', () => {
 
 			it('should show result by antragsteller vorname', () => {
 				doSearchWith(antragstellerVornameToMatch);
-
 				waitForSpinnerToDisappear();
+
 				notExist(byVorgangName.getRoot());
 				notExist(byAktenzeichen.getRoot());
 				exist(byAntragstellerVorname.getRoot());
@@ -314,8 +314,8 @@ describe('VorgangList Suche', () => {
 
 			it('should show result by antragsteller nachname', () => {
 				doSearchWith(antragstellerNachnameToMatch);
-
 				waitForSpinnerToDisappear();
+
 				notExist(byVorgangName.getRoot());
 				notExist(byAktenzeichen.getRoot());
 				notExist(byAntragstellerVorname.getRoot());
@@ -325,8 +325,8 @@ describe('VorgangList Suche', () => {
 
 			it('should show result by requestId/eingangskennzeichen', () => {
 				doSearchWith(requestIdToMatch);
-
 				waitForSpinnerToDisappear();
+
 				notExist(byVorgangName.getRoot());
 				notExist(byAktenzeichen.getRoot());
 				notExist(byAntragstellerVorname.getRoot());
@@ -336,8 +336,8 @@ describe('VorgangList Suche', () => {
 
 			it('search button should show search result', () => {
 				doSearchWith(requestIdToMatch);
-
 				waitForSpinnerToDisappear();
+
 				notExist(byVorgangName.getRoot());
 			})
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts
index d50a8ae4105283a7041facd9ddc2ad1566b3ed1c..10106d131b9ce4651c8cce2fad6f5fd6980c0ff6 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts
@@ -3,7 +3,7 @@ import localeDe from '@angular/common/locales/de';
 import localeDeExtra from '@angular/common/locales/extra/de';
 import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component';
 import { VorgangE2E } from '../../../model/vorgang';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po';
 import { dropCollections } from '../../../support/cypress-helper';
@@ -20,13 +20,14 @@ describe('Vorgang Detailansicht Wiedervorlage routing', () => {
 	const vorgangPage: VorgangPage = new VorgangPage();
 	const wiedervorlagePage: WiedervorlagePage = new WiedervorlagePage();
 
-	let vorgang: VorgangE2E = createVorgang();
+	const vorgang: VorgangE2E = createVorgang();
 
 	before(() => {
 		initVorgang(vorgang);
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -36,30 +37,35 @@ describe('Vorgang Detailansicht Wiedervorlage routing', () => {
 
 	it('Open Vorgang-Detail-Page', () => {
 		vorgangList.getListItem(vorgang.name).getRoot().click();
+		waitForSpinnerToDisappear();
 
 		exist(vorgangPage.getVorgangDetailHeader().getRoot());
 	})
 
 	it('click on create wiedervorlage icon button should open page', () => {
 		vorgangPage.getSubnavigation().clickWiedervorlageIconButton();
+		waitForSpinnerToDisappear();
 
 		exist(wiedervorlagePage.getSubnavigation().getRoot());
 	})
 
 	it('click on navigate back', () => {
 		wiedervorlagePage.getSubnavigation().navigateBack();
+		waitForSpinnerToDisappear();
 
 		exist(vorgangPage.getVorgangDetailHeader().getRoot());
 	})
 
 	it('click on create wiedervorlage button should open page', () => {
 		vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton().click();
+		waitForSpinnerToDisappear();
 
 		exist(wiedervorlagePage.getSubnavigation().getRoot());
 	})
 
 	it('click on navigate back', () => {
 		wiedervorlagePage.getSubnavigation().navigateBack();
+		waitForSpinnerToDisappear();
 
 		exist(vorgangPage.getVorgangDetailHeader().getRoot());
 	})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts
index f4cba20491929dc51591384784419a59a350e68b..d16dae4aa356bd1e72fc8b44c6c0015966b90fe4 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts
@@ -51,8 +51,8 @@ describe('Vorgang Wiedervorlagen List', () => {
 
 		loginAsSabine();
 
-		exist(vorgangList.getRoot());
 		waitForSpinnerToDisappear();
+		exist(vorgangList.getRoot());
 	})
 
 	after(() => {
@@ -61,6 +61,7 @@ describe('Vorgang Wiedervorlagen List', () => {
 
 	it('navigate to vorgang detail', () => {
 		vorgangList.getListItem(vorgang.name).getRoot().click();
+		waitForSpinnerToDisappear();
 
 		exist(vorgangPage.getVorgangDetailHeader().getRoot());
 	})
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts
index ba33064224e38a6e59e2c85881154acd8d54170f..72f6b9bf35d522885ace442ade1a8eb6fcf07516 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts
@@ -46,6 +46,7 @@ describe('Wiedervorlage attachments', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -57,48 +58,57 @@ describe('Wiedervorlage attachments', () => {
 
 		it('should show vorgang detail page on click on list item', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
 
 		it('should show wiedervorlage page on click on create wiedervorlage button', () => {
 			wiedervorlageContainerInVorgang.getCreateWiedervorlageButton().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(wiedervorlagePage.getRoot());
 		})
 
 		it('should show empty attachment after upload', () => {
-			uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT)
+			uploadEmptyFile(attachmentContainer.getUploadInput(), TEST_FILE_WITHOUT_CONTENT);
+			waitForSpinnerToDisappear();
 
 			exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
 		})
 
 		it('should download empty attachment on click', () => {
 			attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
 		})
 
 		it('should show attachment with content after download', () => {
 			uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT);
+			waitForSpinnerToDisappear();
 
 			exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
 		})
 
-		it('should error snackbar after upload to large file', () => {
+		it('should error snackbar after upload to large file', { defaultCommandTimeout: 30000 }, () => {
 			uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT_46MB);
+			waitForSpinnerToDisappear();
 
 			exist(snackbar.getMessage());
 			contains(snackbar.getMessage(), BinaryFileSnackbarMessageE2E.ATTACHMENT_NOT_ADDED.replace('{size}', '40MB'));
+		})
+
+		it('should close snackbar on close button', () => {
 			snackbar.getCloseButton().click();
+
+			notExist(snackbar.getMessage());
 		})
 
 		it('should download attachment on click', () => {
 			attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT));
 		})
 
@@ -126,15 +136,15 @@ describe('Wiedervorlage attachments', () => {
 
 		it('should download empty attachment on click in list', () => {
 			wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlage.betreff).getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getDownloadButton().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(TEST_FILE_WITHOUT_CONTENT));
 		})
 
 		it('should download attachment on click in list', () => {
 			wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlage.betreff).getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click();
-
 			waitForSpinnerToDisappear();
+
 			exist(readFileFromDownloads(TEST_FILE_WITH_CONTENT));
 		})
 	})
@@ -145,6 +155,7 @@ describe('Wiedervorlage attachments', () => {
 
 		it('should open wiedervorlage page', () => {
 			wiedervorlageComp.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(attachmentList.getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
 			exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
@@ -183,6 +194,7 @@ describe('Wiedervorlage attachments', () => {
 
 		it('should not show any attachments', () => {
 			wiedervorlageComp.getLink().click();
+			waitForSpinnerToDisappear();
 
 			notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot());
 			notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot());
@@ -196,18 +208,21 @@ describe('Wiedervorlage attachments', () => {
 
 		it('should open wiedervorlage page', () => {
 			wiedervorlageComp.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot());
 		})
 
 		it('should mark as erledigt', () => {
 			subnavigation.erledigen();
+			waitForSpinnerToDisappear();
 
 			containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should mark as open', () => {
 			subnavigation.wiedereroeffnen();
+			waitForSpinnerToDisappear();
 
 			notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
@@ -218,5 +233,4 @@ describe('Wiedervorlage attachments', () => {
 			haveLength(attachmentList.getRoot(), 1);
 		})
 	})
-
 })
\ No newline at end of file
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts
index c30efb2c9e26b234f830b35f6b3149a2c4b16b55..12e23b39b5bd51e5ad0046acd2cbff709e41299f 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts
@@ -49,9 +49,9 @@ describe('Wiedervorlage should be authorized by role', () => {
 
 		it(`should NOT show vorgang in status ${VorgangStatusE2E.NEU}`, () => {
 			visitUrl(vorgangInStatusNeuUrl);
+			waitForSpinnerToDisappear();
 
 			exist(mainPage.getHeader().getTitle());
-			waitForSpinnerToDisappear();
 			notExist(wiedervorlagePage.getRoot());
 		})
 
@@ -59,18 +59,18 @@ describe('Wiedervorlage should be authorized by role', () => {
 
 			it(`${VorgangStatusE2E.IN_BEARBEITUNG}`, () => {
 				visitUrl(vorgangInStatusInBearbeitungUrl);
+				waitForSpinnerToDisappear();
 
 				exist(mainPage.getHeader().getTitle());
-				waitForSpinnerToDisappear();
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
 				notExist(wiedervorlagePage.getRoot());
 			})
 
 			it(`${VorgangStatusE2E.ABGESCHLOSSEN}`, () => {
 				visitUrl(vorgangInStatusAbgeschlossenUrl);
+				waitForSpinnerToDisappear();
 
 				exist(mainPage.getHeader().getTitle());
-				waitForSpinnerToDisappear();
 				notExist(wiedervorlagePage.getRoot());
 				notExist(wiedervorlageSubnavigation.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
@@ -78,9 +78,9 @@ describe('Wiedervorlage should be authorized by role', () => {
 
 			it(`${VorgangStatusE2E.BESCHIEDEN}`, () => {
 				visitUrl(vorgangInStatusBeschiedenUrl);
+				waitForSpinnerToDisappear();
 
 				exist(mainPage.getHeader().getTitle());
-				waitForSpinnerToDisappear();
 				notExist(wiedervorlagePage.getRoot());
 				notExist(wiedervorlageSubnavigation.getRoot());
 				contains(snackbar.getMessage(), MessagesE2E.HTTP_STATUS_FORBIDDEN);
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts
index 535e28642e37b956b3256a1335a634a6bfc858fe..2d3bcaa65cdf8b7948a87549e1c4c34e4206e7c7 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts
@@ -40,6 +40,7 @@ describe('Wiedervorlage', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(vorgangList.getRoot());
 	})
 
@@ -51,6 +52,7 @@ describe('Wiedervorlage', () => {
 
 		it('should show vorgang detail by click on vorgang in list', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -60,6 +62,7 @@ describe('Wiedervorlage', () => {
 
 		it('should open wiedervorlage pag by click on create wiedervorlage button', () => {
 			vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(wiedervorlagePage.getSubnavigation().getRoot());
 		})
@@ -68,6 +71,7 @@ describe('Wiedervorlage', () => {
 			wiedervorlageCotainer.getBetreff().clear().type('Ab');
 
 			wiedervorlageCotainer.getSpeichernButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(wiedervorlageCotainer.getBetreffError());
 		})
@@ -76,6 +80,7 @@ describe('Wiedervorlage', () => {
 			wiedervorlageCotainer.getBetreff().clear().type(faker.random.alphaNumeric(41));
 
 			wiedervorlageCotainer.getSpeichernButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(wiedervorlageCotainer.getBetreffError());
 		})
@@ -85,6 +90,7 @@ describe('Wiedervorlage', () => {
 			wiedervorlageCotainer.getFrist().clear().type('1.1.2020');
 
 			wiedervorlageCotainer.getSpeichernButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(wiedervorlageCotainer.getDatumError());
 		})
@@ -95,6 +101,7 @@ describe('Wiedervorlage', () => {
 			wiedervorlageCotainer.getFrist().clear().type(wiedervorlageFrist);
 
 			wiedervorlageCotainer.getSpeichernButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(snackbar.getMessage());
 			haveText(snackbar.getMessage(), MessagesE2E.WIEDERVORLAGE_ANGELEGT.replace('%s', wiedervorlageBetreff));
@@ -127,6 +134,7 @@ describe('Wiedervorlage', () => {
 
 		it('should open Vorgang-Detail-Page on click on vorgang in list', () => {
 			vorgangList.getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -135,6 +143,7 @@ describe('Wiedervorlage', () => {
 			const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff);
 
 			wiedervorlageInVorgang.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(wiedervorlagePage.getSubnavigation().getRoot());
 		})
@@ -151,6 +160,7 @@ describe('Wiedervorlage', () => {
 			wiedervorlageCotainer.getFrist().clear().type(formatDateLocal(new Date(), 'dd.MM.yyyy'));
 
 			wiedervorlageCotainer.getSpeichernButton().click();
+			waitForSpinnerToDisappear();
 
 			exist(snackbar.getMessage());
 			haveText(snackbar.getMessage(), MessagesE2E.WIEDERVORLAGE_GESPEICHERT.replace('%s', 'Editierter Betreff'));
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts
index 59a41a3ddf76e6be4e5a16b5689299f960b68974..8ed26664b938399c9619e0791efafdc7d567d775 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts
@@ -7,7 +7,7 @@ import { WiedervorlageSubnavigationE2EComponent } from '../../../components/wied
 import { WiedervorlagenInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component';
 import { VorgangE2E } from '../../../model/vorgang';
 import { WiedervorlageE2E } from '../../../model/wiedervorlage';
-import { MainPage } from '../../../page-objects/main.po';
+import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po';
 import { dropCollections } from '../../../support/cypress-helper';
@@ -41,6 +41,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 
 		loginAsSabine();
 
+		waitForSpinnerToDisappear();
 		exist(mainPage.getVorgangList().getRoot());
 	})
 
@@ -52,6 +53,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 
 		it('Open Vorgang-Detail-Page', () => {
 			mainPage.getVorgangList().getListItem(vorgang.name).getRoot().click();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangPage.getVorgangDetailHeader().getRoot());
 		})
@@ -63,18 +65,21 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 
 		it('should open wiedervorlage on click', () => {
 			wiedervorlage.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(subnavigation.getRoot());
 		})
 
 		it('should mark as erledigt after do erledigen', () => {
 			subnavigation.erledigen();
+			waitForSpinnerToDisappear();
 
 			containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should open vorgang detail on click on back', () => {
 			subnavigation.navigateBack();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangDetailHeader.getRoot());
 		})
@@ -86,18 +91,21 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 
 		it('should open wiedervorlage on click', () => {
 			wiedervorlage.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(subnavigation.getRoot());
 		})
 
 		it('should mark as open after do wiedereroeffnen', () => {
 			subnavigation.wiedereroeffnen();
+			waitForSpinnerToDisappear();
 
 			notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should open vorgang detail on click on back', () => {
 			subnavigation.navigateBack();
+			waitForSpinnerToDisappear();
 
 			exist(vorgangDetailHeader.getRoot());
 		})
@@ -109,30 +117,35 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
 
 		it('should open wiedervorlage on click', () => {
 			wiedervorlage.getLink().click();
+			waitForSpinnerToDisappear();
 
 			exist(subnavigation.getRoot());
 		})
 
 		it('should mark as erledigt', () => {
 			subnavigation.erledigen();
+			waitForSpinnerToDisappear();
 
 			containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should mark as open', () => {
 			subnavigation.wiedereroeffnen();
+			waitForSpinnerToDisappear();
 
 			notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should mark as erledigt', () => {
 			subnavigation.erledigen();
+			waitForSpinnerToDisappear();
 
 			containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
 
 		it('should mark as open', () => {
 			subnavigation.wiedereroeffnen();
+			waitForSpinnerToDisappear();
 
 			notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
 		})
diff --git a/goofy-client/apps/goofy-e2e/src/support/user-util.ts b/goofy-client/apps/goofy-e2e/src/support/user-util.ts
index 8c205092db57422b6353aeef62a68bb03a41e614..148d262be6246794a3a93ed8b67b489f3f20c97f 100644
--- a/goofy-client/apps/goofy-e2e/src/support/user-util.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/user-util.ts
@@ -21,6 +21,7 @@ enum DatabaseUser {
 	KFINDER = 'user/user_kfinder.json',
 	KORDNER = 'user/user_kordner.json',
 	PETER = 'user/user_peter.json',
+	RICHARD = 'user/user_richard.json',
 	SABINE = 'user/user_sabine.json',
 	ZONK = 'user/user_zonk.json'
 }
@@ -41,6 +42,10 @@ export function loginAsPeter(): void {
 	login(DatabaseUser.PETER);
 }
 
+export function loginAsRichard(): void {
+	login(DatabaseUser.RICHARD);
+}
+
 export function loginAsSabine(): void {
 	login(DatabaseUser.SABINE);
 }
diff --git a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
index 89fc0e3b6c753a8f96b78f11004fe86ce9892805..25c38013e2a41900e131a44781410d0a7947294c 100644
--- a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
+++ b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss
@@ -1,6 +1,7 @@
 @use '@angular/material' as mat;
 
 $grey: #777;
+$greyLight: rgba(0, 0, 0, 0.08);
 
 $background: #fafafa;
 $dark-background: #303030;
diff --git a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts
index 1002d550218dfdc411faa7c542ed7b750b090e6e..432fb515888fcf6969ad36da92f7413eba1b08c7 100644
--- a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts
+++ b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts
@@ -65,25 +65,35 @@ describe('CommandUtil', () => {
 		})
 	})
 
-	describe('getPendingForwardCommand', () => {
+	describe('getPendingCommandByOrder', () => {
 
 		const order: string = 'dummyOrder';
+		const anotherOrder: string = 'anotherOrder';
 
 		it('should return null on non existing pending command', () => {
 			const listResource: CommandListResource = createCommandListResource();
 
-			const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order);
+			const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order]);
 
 			expect(pendingCommand).toBeNull();
 		})
 
-		it('should return existing pending command', () => {
-			const pendingForwardCommand: CommandResource = { ...createCommandResource(), order };
-			const listResource: CommandListResource = createCommandListResource([pendingForwardCommand]);
+		it('should return existing pending command on single order', () => {
+			const command: CommandResource = { ...createCommandResource(), order };
+			const listResource: CommandListResource = createCommandListResource([command]);
 
-			const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order);
+			const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order]);
 
-			expect(pendingCommand).toBe(pendingForwardCommand);
+			expect(pendingCommand).toBe(command);
+		})
+
+		it('should return existing pending command on multiple orders', () => {
+			const command: CommandResource = { ...createCommandResource(), order: anotherOrder };
+			const listResource: CommandListResource = createCommandListResource([command]);
+
+			const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, [order, anotherOrder]);
+
+			expect(pendingCommand).toBe(command);
 		})
 	})
 })
\ No newline at end of file
diff --git a/goofy-client/libs/command-shared/src/lib/command.util.ts b/goofy-client/libs/command-shared/src/lib/command.util.ts
index 9dcbd90775befb85c776dc61492d959bdbd6423e..059d50eb855e30a32b0a9347d67662eefff8cd28 100644
--- a/goofy-client/libs/command-shared/src/lib/command.util.ts
+++ b/goofy-client/libs/command-shared/src/lib/command.util.ts
@@ -27,8 +27,8 @@ export function getEmbeddedCommandResources(commandListResource: CommandListReso
 	return getEmbeddedResource<CommandResource[]>(commandListResource, CommandListLinkRel.COMMAND_LIST);
 }
 
-export function getPendingCommandByOrder(pendingCommands: CommandListResource, commandOrder: any): CommandResource {
-	var commands: CommandResource[] = getEmbeddedCommandResources(pendingCommands).filter(command => command.order == commandOrder);
+export function getPendingCommandByOrder(pendingCommands: CommandListResource, commandOrder: any[]): CommandResource {
+	var commands: CommandResource[] = getEmbeddedCommandResources(pendingCommands).filter(command => commandOrder.includes(command.order));
 	return commands.length > 0 ? commands[0] : null;
 }
 
diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts
index ac93192a7a4aeee007690262a9026467b5bbe414..16b14da973576f667d55f47b6a9e35ac31e94115 100644
--- a/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts
+++ b/goofy-client/libs/postfach-shared/src/lib/postfach.model.ts
@@ -27,7 +27,7 @@ export enum ReplyOption {
 }
 
 export enum PostfachOrder {
-	SEND_POSTFACH_MAIL = 'SEND_POSTFACH_MAIL',
+	SEND_POSTFACH_NACHRICHT = 'SEND_POSTFACH_NACHRICHT',
 	RESEND_POSTFACH_MAIL = 'RESEND_POSTFACH_MAIL'
 }
 
diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts
index 8c4013d38bbb218b4ac52b3acf0852db3f6c9e59..4048bf842743adee9370e896f611b9a6ee26d910 100644
--- a/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts
+++ b/goofy-client/libs/postfach-shared/src/lib/postfach.util.spec.ts
@@ -13,7 +13,7 @@ describe('PostfachUtil', () => {
 		it('should have order', () => {
 			const command: CreatePostfachMailCommand = createSendPostfachMailCommand(postfachMail);
 
-			expect(command.order).toEqual(PostfachOrder.SEND_POSTFACH_MAIL);
+			expect(command.order).toEqual(PostfachOrder.SEND_POSTFACH_NACHRICHT);
 		})
 
 		it('should have body', () => {
diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts
index 45f7d021e76e5c50148c2dc47bedd0105038b428..42cb6bb5a63ffdc9360a5f51dd2aa1da444864d3 100644
--- a/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts
+++ b/goofy-client/libs/postfach-shared/src/lib/postfach.util.ts
@@ -2,7 +2,7 @@ import { postfachNachrichtMessageCodeMessages } from './postfach.message-code';
 import { CreatePostfachMailCommand, Direction, PostfachMail, PostfachMailResource, PostfachOrder } from './postfach.model';
 
 export function createSendPostfachMailCommand(postfachMail: PostfachMail): CreatePostfachMailCommand {
-	return { order: PostfachOrder.SEND_POSTFACH_MAIL, body: postfachMail };
+	return { order: PostfachOrder.SEND_POSTFACH_NACHRICHT, body: postfachMail };
 }
 
 export function createResendPostfachMailCommand(): CreatePostfachMailCommand {
diff --git a/goofy-client/libs/tech-shared/src/index.ts b/goofy-client/libs/tech-shared/src/index.ts
index b607f46b67b53b24bfee67f8af75735ed9d821f2..7e0f749f00c0b9bc0c3f6c8895db70bec44535fb 100644
--- a/goofy-client/libs/tech-shared/src/index.ts
+++ b/goofy-client/libs/tech-shared/src/index.ts
@@ -11,6 +11,7 @@ export * from './lib/pipe/file-size.pipe';
 export * from './lib/pipe/format-date-with-time.pipe';
 export * from './lib/pipe/format-to-pretty-date.pipe';
 export * from './lib/pipe/has-link.pipe';
+export * from './lib/pipe/not-has-link.pipe';
 export * from './lib/pipe/to-embedded-resource.pipe';
 export * from './lib/pipe/to-resource-uri.pipe';
 export * from './lib/pipe/to-traffic-light-tooltip.pipe';
diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c7517c2753666e5651cbfae1fcfa477f60780b86
--- /dev/null
+++ b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.spec.ts
@@ -0,0 +1,21 @@
+import { Resource } from '@ngxp/rest';
+import { createDummyResource } from 'libs/tech-shared/test/resource';
+import { NotHasLinkPipe } from './not-has-link.pipe';
+
+describe('NotHasLinkPipe', () => {
+	const selfLink: string = 'self';
+	const dummyLink: string = 'dummy';
+	const resource: Resource = createDummyResource([selfLink]);
+	const pipe: NotHasLinkPipe = new NotHasLinkPipe();
+
+	it('resource has link', () => {
+		const result: boolean = pipe.transform(resource, selfLink);
+
+		expect(result).toBe(false);
+	})
+	it('resource doesnt has link', () => {
+		const result: boolean = pipe.transform(resource, dummyLink);
+
+		expect(result).toBe(true);
+	})
+})
diff --git a/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d68f0417cea19776db39a12a21129d85b0f11269
--- /dev/null
+++ b/goofy-client/libs/tech-shared/src/lib/pipe/not-has-link.pipe.ts
@@ -0,0 +1,9 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import { hasLink, Resource } from '@ngxp/rest';
+
+@Pipe({ name: 'notHasLink' })
+export class NotHasLinkPipe implements PipeTransform {
+	transform(resource: Resource, link: string) {
+		return !hasLink(resource, link);
+	}
+}
diff --git a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
index 2ed55173a712884078afff7af605bde8623913b7..67328c81f7d110f528ba7d4282651a251f6ddf24 100644
--- a/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
+++ b/goofy-client/libs/tech-shared/src/lib/tech-shared.module.ts
@@ -8,6 +8,7 @@ import { FileSizePipe } from './pipe/file-size.pipe';
 import { FormatDateWithTimePipe } from './pipe/format-date-with-time.pipe';
 import { FormatToPrettyDatePipe } from './pipe/format-to-pretty-date.pipe';
 import { HasLinkPipe } from './pipe/has-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';
@@ -20,6 +21,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe';
 		EnumToLabelPipe,
 		FormatDateWithTimePipe,
 		HasLinkPipe,
+		NotHasLinkPipe,
 		ToResourceUriPipe,
 		ToTrafficLightPipe,
 		ToTrafficLightTooltipPipe,
@@ -32,6 +34,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe';
 		EnumToLabelPipe,
 		FormatDateWithTimePipe,
 		HasLinkPipe,
+		NotHasLinkPipe,
 		ToResourceUriPipe,
 		ToTrafficLightPipe,
 		ToTrafficLightTooltipPipe,
diff --git a/goofy-client/libs/test-utils/src/lib/helper.ts b/goofy-client/libs/test-utils/src/lib/helper.ts
index e16d3029e0f10ca2d8a5602bc54d52a835d69c9e..94887c81370ac5a428485249e842ddc34158afdd 100644
--- a/goofy-client/libs/test-utils/src/lib/helper.ts
+++ b/goofy-client/libs/test-utils/src/lib/helper.ts
@@ -10,15 +10,15 @@ function getDebugElementFromFixtureByType<T>(fixture: ComponentFixture<any>, com
 	return fixture.debugElement.query(By.directive(component));
 }
 
-export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement {
-	return fixture.debugElement.query(By.css(query));
-}
-
 export function getElementFromFixture(fixture: ComponentFixture<any>, htmlElement: string): any {
 	return fixture.nativeElement.querySelector(htmlElement);
 }
 
 export function dispatchEventFromFixture(fixture: ComponentFixture<any>, elementSelector: string, event: string): void {
-	const element = fixture.debugElement.query(By.css(elementSelector));
+	const element = getDebugElementFromFixtureByCss(fixture, elementSelector)
 	element.nativeElement.dispatchEvent(new Event(event));
 }
+
+export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement {
+	return fixture.debugElement.query(By.css(query));
+}
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..312d42ddadb72b90bf3559e644f3f8601a9a4955
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.html
@@ -0,0 +1,3 @@
+<button mat-icon-button (click)="close.emit()" data-test-id="snackbar-close-button">
+	<mat-icon data-test-class="icon">clear</mat-icon>
+</button>
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5e2fce20b698f7394eacec58ae3fbd517862d2ee
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss
@@ -0,0 +1,50 @@
+@use 'sass:map';
+@use '@angular/material' as mat;
+@import 'variables';
+
+.message {
+	white-space: pre-wrap
+}
+
+::ng-deep .mat-snack-bar-container.error {
+	min-width: 240px;
+	max-width: 90vw;
+
+	border: 3px solid mat.get-color-from-palette($warnPalette);
+	background-color: lighten(mat.get-color-from-palette($warnPalette), 38%);
+	color: rgba(#000, 0.89);
+	position: relative;
+
+	&:before {
+		position: absolute;
+		content: url("/assets/icons/error_outline_white.svg");
+		display: block;
+		background-color: mat.get-color-from-palette($warnPalette);
+		left: 0;
+		top: 0;
+		padding: 11px 9px 11px 7px;
+		color: #fff;
+		height: 100%;
+	}
+
+	> div {
+		margin-left: 44px;
+	}
+}
+
+.wrapper {
+	display: flex;
+	align-items: center;
+}
+
+.mat-button {
+	color: mat.get-color-from-palette($primaryPalette, lighter);
+}
+
+button {
+	margin: -12px -8px -12px 8px
+}
+
+::ng-deep body.dark .mat-snack-bar-container .mat-button {
+	color: mat.get-color-from-palette($primaryPalette);
+}
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a419ae9594946ac9edc382392cddd4bc5b1f47d
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.spec.ts
@@ -0,0 +1,39 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatIcon } from '@angular/material/icon';
+import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { EventEmitter } from 'stream';
+import { SnackbarCloseButtonComponent } from './snackbar-close-button.component';
+
+describe('SnackbarCloseButtonComponent', () => {
+	let component: SnackbarCloseButtonComponent;
+	let fixture: ComponentFixture<SnackbarCloseButtonComponent>;
+
+	const closeButton: string = getDataTestIdOf('snackbar-close-button');
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				MatIcon,
+				SnackbarCloseButtonComponent
+			]
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(SnackbarCloseButtonComponent);
+		component = fixture.componentInstance;
+		component.close = { ...<any>mock(EventEmitter), emit: jest.fn() };
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	it('click should emit action', () => {
+		dispatchEventFromFixture(fixture, closeButton, 'click');
+
+		expect(component.close.emit).toHaveBeenCalled();
+	})
+});
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c900fda5a90fde396aec8b66322c6e0fc2c28e9
--- /dev/null
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.ts
@@ -0,0 +1,11 @@
+import { Component, EventEmitter, Output } from '@angular/core';
+
+@Component({
+	selector: 'goofy-client-snackbar-close-button',
+	templateUrl: './snackbar-close-button.component.html',
+	styleUrls: ['./snackbar-close-button.component.scss']
+})
+export class SnackbarCloseButtonComponent {
+
+	@Output() close: EventEmitter<void> = new EventEmitter();
+}
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
index c8c31801c567d84bb3da0905aaaf804bd5d15e57..1c87bdc69fac21eb254ec3b12845f862e50bb6cb 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html
@@ -1,7 +1,5 @@
 <div class="wrapper">
 	<span data-test-id="snackbar-message" class="message">{{ message }}</span>
 
-	<button mat-icon-button (click)="close()" data-test-id="snackbar-close-button">
-		<mat-icon data-test-class="icon">clear</mat-icon>
-	</button>
+	<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button>
 </div>
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
index d0ead57221621e13aac4de1e9df89518b681e003..452e8208aff9c3aa5f9510af797dc2719f4b807b 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts
@@ -3,6 +3,8 @@ import { MatIconModule } from '@angular/material/icon';
 import { MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';
 import { mock } from '@goofy-client/test-utils';
 import { SnackBarData } from '@goofy-client/ui';
+import { MockComponent } from 'ng-mocks';
+import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
 import { SnackbarErrorComponent } from './snackbar-error.component';
 
 describe('SnackbarErrorComponent', () => {
@@ -18,7 +20,8 @@ describe('SnackbarErrorComponent', () => {
 				MatIconModule
 			],
 			declarations: [
-				SnackbarErrorComponent
+				SnackbarErrorComponent,
+				MockComponent(SnackbarCloseButtonComponent)
 			],
 			providers: [
 				{
@@ -42,4 +45,12 @@ describe('SnackbarErrorComponent', () => {
 	it('should create', () => {
 		expect(component).toBeTruthy();
 	});
+
+	describe('close button', () => {
+		it('should close the snackbar', () => {
+			component.close();
+
+			expect(snackBarRef.dismiss).toHaveBeenCalled();
+		})
+	})
 });
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
index 5aefe84d96b0c8698f29084a2a58becac9a9a507..dae817d661748914e85446df69190ca1c0d3d6a2 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html
@@ -7,6 +7,4 @@
 	Rückgängig
 </button>
 
-<button mat-icon-button (click)="close()" data-test-id="snackbar-close-button">
-	<mat-icon data-test-class="icon">clear</mat-icon>
-</button>
\ No newline at end of file
+<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button>
\ No newline at end of file
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
index 7e295a2c20d40831dc026a57ae107af79a6af03d..cd8a3825c547c18f2ffb7f83f8efeec7754c7b65 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts
@@ -4,6 +4,9 @@ import { MatSnackBarModule, MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/
 import { mock } from '@goofy-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';
+import { MockComponent } from 'ng-mocks';
+import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component';
 import { SnackBarData } from '../snackbar.service';
 import { SnackbarInfoComponent } from './snackbar-info.component';
 
@@ -14,7 +17,7 @@ describe('SnackbarInfoComponent', () => {
 	const snackBarData: SnackBarData = { message: 'Message', commandResource: createCommandResource() };
 	const snackBarRef = { ...mock(MatSnackBarRef), dissmis: jest.fn(), dismissWithAction: jest.fn() };
 
-	const revokeButton: string = '[data-test-id="snackbar-revoke-button"]';
+	const revokeButton: string = getDataTestIdOf('snackbar-revoke-button');
 
 	beforeEach(async () => {
 		await TestBed.configureTestingModule({
@@ -22,7 +25,10 @@ describe('SnackbarInfoComponent', () => {
 				MatSnackBarModule,
 				MatIconModule
 			],
-			declarations: [SnackbarInfoComponent],
+			declarations: [
+				SnackbarInfoComponent,
+				MockComponent(SnackbarCloseButtonComponent)
+			],
 			providers: [
 				{
 					provide: MAT_SNACK_BAR_DATA,
@@ -46,7 +52,7 @@ describe('SnackbarInfoComponent', () => {
 		expect(component).toBeTruthy();
 	});
 
-	describe('clear button', () => {
+	describe('close button', () => {
 		it('should close the snackbar', () => {
 			component.close();
 
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
index 29774c23c1fc4365593a112e30c3f871977cc930..9ae931738e196b19d43fd0158c48cc82ed5d2213 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts
@@ -21,8 +21,8 @@ describe('SnackBarService', () => {
 	beforeEach(async () => {
 		await TestBed.configureTestingModule({
 			providers: [
-                { provide: MatSnackBar, useValue: mockMatSnackBar },
-            ],
+				{ provide: MatSnackBar, useValue: mockMatSnackBar },
+			],
 		}).compileComponents();
 		service = TestBed.inject(SnackBarService);
 		matSnackBar = TestBed.inject(MatSnackBar);
@@ -37,6 +37,13 @@ describe('SnackBarService', () => {
 		beforeEach(() => {
 			service.listenOnRevokeAction = jest.fn();
 			service.listenOnAfterDismissed = jest.fn();
+			service.closeSnackBarIfVisible = jest.fn();
+		})
+
+		it('should close snackbar if exists', () => {
+			service.show(commandResource, message);
+
+			expect(service.closeSnackBarIfVisible).toHaveBeenCalled();
 		})
 
 		it('should open from component', () => {
@@ -73,8 +80,16 @@ describe('SnackBarService', () => {
 
 		beforeEach(() => {
 			service.listenOnAfterDismissed = jest.fn();
+			service.closeSnackBarIfVisible = jest.fn();
 		})
 
+		it('should close snackbar if exists', () => {
+			service.showError(message);
+
+			expect(service.closeSnackBarIfVisible).toHaveBeenCalled();
+		})
+
+
 		it('should open from component', () => {
 			service.showError(message);
 
@@ -89,4 +104,27 @@ describe('SnackBarService', () => {
 			expect(service.listenOnAfterDismissed).toHaveBeenCalled();
 		})
 	})
+
+	describe('close snackbar if visible', () => {
+
+		beforeEach(() => {
+			service.closeSnackBar = jest.fn();
+		})
+
+		it('should dismiss snack bar if ref exists ', () => {
+			service.snackBarRef = <any>{};
+
+			service.closeSnackBarIfVisible();
+
+			expect(service.closeSnackBar).toHaveBeenCalled();
+		})
+
+		it('should do nothing if ref not exists ', () => {
+			service.snackBarRef = undefined;
+
+			service.closeSnackBarIfVisible();
+
+			expect(service.closeSnackBar).not.toHaveBeenCalled();
+		})
+	})
 })
diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
index 6921eaba96738d7df1a2049512b7a93917ee9ee6..f91d60b7cf1522da9ab8f7a954bcb8d4f51aee76 100644
--- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
+++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts
@@ -1,6 +1,7 @@
 import { Injectable } from '@angular/core';
 import { MatSnackBar, MatSnackBarRef } from '@angular/material/snack-bar';
 import { CommandResource, CommandStatus } from '@goofy-client/command-shared';
+import { isNotNil } from '@goofy-client/tech-shared';
 import { isNil } from 'lodash-es';
 import { Subscription } from 'rxjs';
 import { SnackbarErrorComponent } from './snackbar-error/snackbar-error.component';
@@ -10,12 +11,13 @@ import { SnackbarInfoComponent } from './snackbar-info/snackbar-info.component';
 export class SnackBarService {
 
 	private subscription: Subscription;
-	private snackBarRef: MatSnackBarRef<SnackbarInfoComponent | SnackbarErrorComponent>;
+	snackBarRef: MatSnackBarRef<SnackbarInfoComponent | SnackbarErrorComponent>;
 	private durationTime: number = 10000;
 
 	constructor(private snackBar: MatSnackBar) { }
 
 	public show(commandResource: CommandResource, message: string, revokeAction?: () => void): void {
+		this.closeSnackBarIfVisible();
 		if (commandResource.status === CommandStatus.ERROR) {
 			this.showError(message);
 		} else {
@@ -25,10 +27,15 @@ export class SnackBarService {
 	}
 
 	public showError(message: string): void {
+		this.closeSnackBarIfVisible();
 		this.snackBarRef = this.snackBar.openFromComponent(SnackbarErrorComponent, { data: { message }, duration: this.durationTime, panelClass: 'error' });
 		this.listenOnAfterDismissed();
 	}
 
+	closeSnackBarIfVisible() {
+		if (isNotNil(this.snackBarRef)) this.closeSnackBar();
+	}
+
 	private listenToActions(revokeAction: () => void): void {
 		this.listenOnAfterDismissed();
 		this.listenOnRevokeAction(revokeAction);
@@ -45,7 +52,7 @@ export class SnackBarService {
 		this.subscription = this.snackBarRef.afterDismissed().subscribe(() => this.closeSnackBar());
 	}
 
-	private closeSnackBar(): void {
+	closeSnackBar(): void {
 		this.snackBarRef.dismiss();
 		this.unsubscribe();
 	}
diff --git a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
index a55d8825a0d7c2ed79a65982b3f2ff5c4cf82981..5df4f31d06f208fdf8d4c19ba2202b046050b9ec 100644
--- a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
+++ b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.html
@@ -1,3 +1,3 @@
-<div class="progressbar-overlay" *ngIf="isVisible" data-test-class="progressbar-overlay">
-	<mat-progress-bar mode="indeterminate"></mat-progress-bar>
+<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>
diff --git a/goofy-client/libs/ui/src/lib/ui/ui.module.ts b/goofy-client/libs/ui/src/lib/ui/ui.module.ts
index 06404bf99418f9d86b3ce83af7c10e3d41e756f1..c482f7fc5c5248928f8c0ac3a5b03f48d66ed7fe 100644
--- a/goofy-client/libs/ui/src/lib/ui/ui.module.ts
+++ b/goofy-client/libs/ui/src/lib/ui/ui.module.ts
@@ -24,6 +24,7 @@ import { TechSharedModule } from '@goofy-client/tech-shared';
 import { de } from 'date-fns/locale';
 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 { ButtonWithSpinnerComponent } from './button-with-spinner/button-with-spinner.component';
@@ -102,6 +103,7 @@ const modules = [
 		InternalServerErrorDialogComponent,
 		ConnectionTimeoutRetryDialogComponent,
 		ConnectionTimeoutRetryFailDialogComponent,
+		SnackbarCloseButtonComponent
 	],
 	imports: [
 		...modules
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
index 97fc42277eea4729dd3fa51424713417da6a6027..9c2459d066398fccc76b6c80b675274ab1a1951c 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html
@@ -12,17 +12,22 @@
 			</goofy-client-vorgang-detail-meta-data>
 		</mat-tab>
 		<mat-tab label="Datenrepräsentation ({{vorgangWithEingang.eingang.numberOfRepresentations}})"
-			[disabled]="!(vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.REPRESENTATIONS)">
+			[disabled]="vorgangWithEingang | notHasLink:vorgangWithEingangLinkRel.REPRESENTATIONS">
 				<ng-template matTabContent>
 					<goofy-client-vorgang-detail-representation-list data-test-id="tab-representations-list" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-detail-representation-list>
 				</ng-template>
 		</mat-tab>
 		<mat-tab label="Anhänge ({{vorgangWithEingang.eingang.numberOfAttachments}})"
-			[disabled]="!(vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.ATTACHMENTS)">
+			[disabled]="vorgangWithEingang | notHasLink:vorgangWithEingangLinkRel.ATTACHMENTS">
 				<ng-template matTabContent>
 					<goofy-client-vorgang-detail-attachment-list data-test-id="tab-attachments-list" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-detail-attachment-list>
 				</ng-template>
 		</mat-tab>
+		<mat-tab label="Historie" *ngIf="vorgangWithEingang | hasLink:vorgangWithEingangLinkRel.HISTORIE">
+				<ng-template matTabContent>
+					<goofy-client-vorgang-historie-container data-test-id="tab-historie-container" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-historie-container>
+				</ng-template>
+		</mat-tab>
 	</mat-tab-group>
 
 </goofy-client-expansion-panel>
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
index 0511ec5727b1138a01d3327dddf91f25c386258d..a7694c5a1f8a67302f84f6cc55beb31caef24170 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts
@@ -1,9 +1,10 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { MatTabsModule } from '@angular/material/tabs';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { HasLinkPipe } from '@goofy-client/tech-shared';
+import { HasLinkPipe, NotHasLinkPipe } from '@goofy-client/tech-shared';
 import { getElementFromFixture } from '@goofy-client/test-utils';
 import { ExpansionPanelComponent } from '@goofy-client/ui';
+import { VorgangHistorieContainerComponent } from '@goofy-client/vorgang-historie';
 import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
@@ -20,10 +21,12 @@ describe('VorgangDetailFormularDatenComponent', () => {
 	const tabMetaData: string = 'div[role=tab]:nth-child(2)';
 	const tabRepresentations: string = 'div[role=tab]:nth-child(3)';
 	const tabAttachments: string = 'div[role=tab]:nth-child(4)';
+	const tabHistorie: string = 'div[role=tab]:nth-child(5)';
 
 	const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource();
 	const vorgangWithAttachments: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.ATTACHMENTS]);
 	const vorgangWithRepresentations: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.REPRESENTATIONS]);
+	const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]);
 
 	beforeEach(async () => {
 		await TestBed.configureTestingModule({
@@ -33,12 +36,14 @@ describe('VorgangDetailFormularDatenComponent', () => {
 			],
 			declarations: [
 				HasLinkPipe,
+				NotHasLinkPipe,
 				VorgangDetailFormularDatenComponent,
 				MockComponent(VorgangDetailAntragDataComponent),
 				MockComponent(VorgangDetailMetaDataComponent),
 				MockComponent(VorgangDetailAttachmentListComponent),
 				MockComponent(VorgangDetailRepresentationListComponent),
 				MockComponent(ExpansionPanelComponent),
+				MockComponent(VorgangHistorieContainerComponent),
 			]
 		}).compileComponents();
 	});
@@ -139,4 +144,24 @@ describe('VorgangDetailFormularDatenComponent', () => {
 		})
 	})
 
+	describe('Tab Historie', () => {
+		it('should be visible if Link "historie" exists', () => {
+			component.vorgangWithEingang = vorgangWithHistorie;
+
+			fixture.detectChanges();
+			const tab = getElementFromFixture(fixture, tabHistorie);
+
+			expect(tab).toBeInTheDocument();
+		})
+
+		it('should not be visible if no Link "historie"', () => {
+			component.vorgangWithEingang = vorgang;
+
+			fixture.detectChanges();
+			const tab = getElementFromFixture(fixture, tabHistorie);
+
+			expect(tab).not.toBeInTheDocument();
+		})
+	})
+
 });
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html
index 5e8ecaaa94dbfd9a031161240945412b77654320..d019a1ac5866afe7234426fd7c62d8f530898a10 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html
@@ -11,4 +11,4 @@
 
 </ng-container>
 
-<goofy-client-progress-bar data-test-id="progress-bar" [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar>
\ No newline at end of file
+<goofy-client-progress-bar [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
index 4ea2a3fedfb8a38e50c2c0c1879bac72b8f830f6..fbb58cedeb0551ee16dbdaee75859f158ae3b8e6 100644
--- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
+++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
@@ -10,6 +10,7 @@ import { TechSharedModule } from '@goofy-client/tech-shared';
 import { UiModule } from '@goofy-client/ui';
 import { UserProfileModule } from '@goofy-client/user-profile';
 import { UserProfileSharedModule } from '@goofy-client/user-profile-shared';
+import { VorgangHistorieModule } from '@goofy-client/vorgang-historie';
 import { VorgangSharedModule } from '@goofy-client/vorgang-shared';
 import { VorgangSharedUiModule } from '@goofy-client/vorgang-shared-ui';
 import { WiedervorlageModule } from '@goofy-client/wiedervorlage';
@@ -59,7 +60,8 @@ const routes: Routes = [
 		UserProfileModule,
 		UserProfileSharedModule,
 		PostfachSharedModule,
-		PostfachModule
+		PostfachModule,
+		VorgangHistorieModule
 	],
 	declarations: [
 		VorgangDetailPageComponent,
diff --git a/goofy-client/libs/vorgang-historie/.eslintrc.json b/goofy-client/libs/vorgang-historie/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..28f19b630511beab4ad3ff61ffce5a45f7430728
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+	"extends": ["../../.eslintrc.json"],
+	"ignorePatterns": ["!**/*"],
+	"overrides": [
+		{
+			"files": ["*.ts"],
+			"extends": [
+				"plugin:@nrwl/nx/angular",
+				"plugin:@angular-eslint/template/process-inline-templates"
+			],
+			"rules": {
+				"@angular-eslint/directive-selector": [
+					"error",
+					{
+						"type": "attribute",
+						"prefix": "goofyClient",
+						"style": "camelCase"
+					}
+				],
+				"@angular-eslint/component-selector": [
+					"error",
+					{
+						"type": "element",
+						"prefix": "goofy-client",
+						"style": "kebab-case"
+					}
+				]
+			}
+		},
+		{
+			"files": ["*.html"],
+			"extends": ["plugin:@nrwl/nx/angular-template"],
+			"rules": {}
+		}
+	]
+}
diff --git a/goofy-client/libs/vorgang-historie/README.md b/goofy-client/libs/vorgang-historie/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..0412a90d25be161803edbe2751e3635c48dcbc31
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/README.md
@@ -0,0 +1,7 @@
+# vorgang-historie
+
+This library was generated with [Nx](https://nx.dev).
+
+## Running unit tests
+
+Run `nx test vorgang-historie` to execute the unit tests.
diff --git a/goofy-client/libs/vorgang-historie/jest.config.js b/goofy-client/libs/vorgang-historie/jest.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..707cb488ad0a8db33a85c90c2fab768d9ecac3f5
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/jest.config.js
@@ -0,0 +1,21 @@
+module.exports = {
+	displayName: 'vorgang-historie',
+	preset: '../../jest.preset.js',
+	setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
+	globals: {
+		'ts-jest': {
+			tsconfig: '<rootDir>/tsconfig.spec.json',
+			stringifyContentPathRegex: '\\.(html|svg)$',
+		},
+	},
+	coverageDirectory: '../../coverage/libs/vorgang-historie',
+	transform: {
+		'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
+	},
+	transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+	snapshotSerializers: [
+		'jest-preset-angular/build/serializers/no-ng-attributes',
+		'jest-preset-angular/build/serializers/ng-snapshot',
+		'jest-preset-angular/build/serializers/html-comment',
+	],
+};
diff --git a/goofy-client/libs/vorgang-historie/src/index.ts b/goofy-client/libs/vorgang-historie/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..41a6b1400e8baf95216e1d8593b45b0b8faff17d
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/index.ts
@@ -0,0 +1,3 @@
+export * from './lib/vorgang-historie.module';
+
+export * from './lib/vorgang-historie-container/vorgang-historie-container.component';
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..429eccc43389cd64517c4b3bb1998f2ba7ca5037
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.html
@@ -0,0 +1 @@
+<goofy-client-vorgang-historie-list data-test-id="tab-historie-list-container" [vorgangWithEingang]="vorgangWithEingang"></goofy-client-vorgang-historie-list>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.scss b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5fbc53485f39ab439b2bcff922b89ce61a04f872
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.spec.ts
@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { VorgangHistorieContainerComponent } from './vorgang-historie-container.component';
+
+describe('VorgangHistorieContainerComponent', () => {
+	let component: VorgangHistorieContainerComponent;
+	let fixture: ComponentFixture<VorgangHistorieContainerComponent>;
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [VorgangHistorieContainerComponent],
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(VorgangHistorieContainerComponent);
+		component = fixture.componentInstance;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+});
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7da65f22da2b3028a257b27b3826bfa7154d4461
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-container.component.ts
@@ -0,0 +1,13 @@
+import { Component, Input } from '@angular/core';
+import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
+
+@Component({
+	selector: 'goofy-client-vorgang-historie-container',
+	templateUrl: './vorgang-historie-container.component.html',
+	styleUrls: ['./vorgang-historie-container.component.scss'],
+})
+export class VorgangHistorieContainerComponent {
+
+	@Input() vorgangWithEingang: VorgangWithEingangResource;
+
+}
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..4ffbccbc10733efb76f1ecaf553a57a727d43d2f
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.html
@@ -0,0 +1,3 @@
+<ul>
+	<li data-test-id="created-at">Der Vorgang wurde am {{ vorgangWithEingang.createdAt | formatDateWithTimePipe:false }} erstellt.</li>
+</ul>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..72a25c5cf822d4d8165725a12287832f6269080d
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.scss
@@ -0,0 +1,12 @@
+@import "variables";
+
+ul {
+	margin-top: 0;
+	padding-left: 0;
+	width: 100%;
+
+	li {
+		border-bottom: 1px solid $greyLight;
+		padding: 0.75rem 0;
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1908346811cd19a353c854de26805f98f5ad4073
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.spec.ts
@@ -0,0 +1,48 @@
+import { registerLocaleData } from '@angular/common';
+import localeDe from '@angular/common/locales/de';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormatDateWithTimePipe } from '@goofy-client/tech-shared';
+import { getElementFromFixture } from '@goofy-client/test-utils';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
+import { VorgangHistorieListComponent } from './vorgang-historie-list.component';
+
+registerLocaleData(localeDe);
+
+describe('VorgangHistorieListComponent', () => {
+	let component: VorgangHistorieListComponent;
+	let fixture: ComponentFixture<VorgangHistorieListComponent>;
+
+	const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]);
+	const createdAtElement: string = getDataTestIdOf('created-at');
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				FormatDateWithTimePipe,
+				VorgangHistorieListComponent
+			],
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(VorgangHistorieListComponent);
+		component = fixture.componentInstance;
+		component.vorgangWithEingang = vorgangWithHistorie;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	describe('on vorgang', () => {
+
+		it('should have Historie list', () => {
+			const element = getElementFromFixture(fixture, createdAtElement);
+
+			expect(element).toBeInstanceOf(HTMLLIElement);
+		});
+	});
+});
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bd015726a6fe0a1979b9fdd5d83bff0d87d72670
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component.ts
@@ -0,0 +1,13 @@
+import { Component, Input } from '@angular/core';
+import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
+
+@Component({
+	selector: 'goofy-client-vorgang-historie-list',
+	templateUrl: './vorgang-historie-list.component.html',
+	styleUrls: ['./vorgang-historie-list.component.scss'],
+})
+export class VorgangHistorieListComponent {
+
+	@Input() vorgangWithEingang: VorgangWithEingangResource;
+
+}
diff --git a/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..41f06719072483d05854a282803e6dc699e8f779
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/lib/vorgang-historie.module.ts
@@ -0,0 +1,20 @@
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { TechSharedModule } from '@goofy-client/tech-shared';
+import { VorgangHistorieContainerComponent } from './vorgang-historie-container/vorgang-historie-container.component';
+import { VorgangHistorieListComponent } from './vorgang-historie-container/vorgang-historie-list/vorgang-historie-list.component';
+
+@NgModule({
+	imports: [
+		CommonModule,
+		TechSharedModule
+	],
+	declarations: [
+		VorgangHistorieContainerComponent,
+		VorgangHistorieListComponent,
+	],
+	exports: [
+		VorgangHistorieContainerComponent,
+	],
+})
+export class VorgangHistorieModule {}
diff --git a/goofy-client/libs/vorgang-historie/src/test-setup.ts b/goofy-client/libs/vorgang-historie/src/test-setup.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1100b3e8a6ed08f4b5c27a96471846d57023c320
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/src/test-setup.ts
@@ -0,0 +1 @@
+import 'jest-preset-angular/setup-jest';
diff --git a/goofy-client/libs/vorgang-historie/tsconfig.json b/goofy-client/libs/vorgang-historie/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..518abe89089dd06c8c6430da3f5f7c9105c10cd2
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/tsconfig.json
@@ -0,0 +1,13 @@
+{
+	"extends": "../../tsconfig.base.json",
+	"files": [],
+	"include": [],
+	"references": [
+		{
+			"path": "./tsconfig.lib.json"
+		},
+		{
+			"path": "./tsconfig.spec.json"
+		}
+	]
+}
diff --git a/goofy-client/libs/vorgang-historie/tsconfig.lib.json b/goofy-client/libs/vorgang-historie/tsconfig.lib.json
new file mode 100644
index 0000000000000000000000000000000000000000..a2a53880f8274e73d8c264e347047cbd8c1f1cf8
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/tsconfig.lib.json
@@ -0,0 +1,12 @@
+{
+	"extends": "./tsconfig.json",
+	"compilerOptions": {
+		"outDir": "../../dist/out-tsc",
+		"declaration": true,
+		"declarationMap": true,
+		"inlineSources": true,
+		"types": []
+	},
+	"exclude": ["src/test-setup.ts", "**/*.spec.ts", "**/*.test.ts"],
+	"include": ["**/*.ts"]
+}
diff --git a/goofy-client/libs/vorgang-historie/tsconfig.spec.json b/goofy-client/libs/vorgang-historie/tsconfig.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..ff36e0edd33bbc39279480063c3c8e62e8be27ef
--- /dev/null
+++ b/goofy-client/libs/vorgang-historie/tsconfig.spec.json
@@ -0,0 +1,10 @@
+{
+	"extends": "./tsconfig.json",
+	"compilerOptions": {
+		"outDir": "../../dist/out-tsc",
+		"module": "commonjs",
+		"types": ["jest", "node"]
+	},
+	"files": ["src/test-setup.ts"],
+	"include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"]
+}
diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
index aa3c06d5f237beb44245203e769956ba7a26d298..0f7f646640c7cff4edebda7b522e51b1c286e786 100644
--- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
+++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
@@ -28,4 +28,5 @@ export enum VorgangWithEingangLinkRel {
 	PENDING_COMMANDS = 'pending-commands',
 	ASSIGN = 'assign',
 	REPRESENTATIONS = 'representations',
+	HISTORIE = 'historie',
 }
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts
index dc1f216f7bb4c5205dd12f7e9f7bd843e6656c73..05b8cef25a4727432d96f3806e1f22e4a999e6dc 100644
--- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts
+++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts
@@ -85,7 +85,7 @@ export class VorgangService {
 
 	setPendingForwardCommand(pendingCommandList: CommandListResource): void {
 		if (!this.pendingForwardCommand$.value.loaded) {
-			this.setPendingForwardSingleCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, VorgangOrder.FORWARD)));
+			this.setPendingForwardSingleCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, [VorgangOrder.FORWARD])));
 		}
 	}
 
@@ -95,7 +95,7 @@ export class VorgangService {
 
 	handlePendingSendPostfachMailCommand(pendingCommandList: CommandListResource): void {
 		if (!this.pendingSendPostfachMailCommand$.value.loaded) {
-			this.setPendingSendPostfachMailCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, PostfachOrder.SEND_POSTFACH_MAIL)));
+			this.setPendingSendPostfachMailCommand(createStateResource(getPendingCommandByOrder(pendingCommandList, [PostfachOrder.SEND_POSTFACH_NACHRICHT])));
 		}
 	}
 
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..c244b2559d54624b7c16b7a010ecbef0eddeaa41
--- /dev/null
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.html
@@ -0,0 +1 @@
+<goofy-client-vorgang-list-page [apiRootStateResource]="apiRootStateResource$ | async"></goofy-client-vorgang-list-page>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5151bc413161b0ac0029b4efdcb2be2eca0928b8
--- /dev/null
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.spec.ts
@@ -0,0 +1,45 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ApiRootService } from '@goofy-client/api-root-shared';
+import { mock } from '@goofy-client/test-utils';
+import { MockComponent } from 'ng-mocks';
+import { VorgangListPageComponent } from '../vorgang-list-page/vorgang-list-page.component';
+import { VorgangListPageContainerComponent } from './vorgang-list-page-container.component';
+
+describe('VorgangListPageContainerComponent', () => {
+	let component: VorgangListPageContainerComponent;
+	let fixture: ComponentFixture<VorgangListPageContainerComponent>;
+
+	const apiRootService = mock(ApiRootService);
+
+	beforeEach(async () => {
+		await TestBed.configureTestingModule({
+			declarations: [
+				VorgangListPageContainerComponent,
+				MockComponent(VorgangListPageComponent)
+			],
+			providers: [{
+				provide: ApiRootService,
+				useValue: apiRootService
+			}]
+		}).compileComponents();
+	});
+
+	beforeEach(() => {
+		fixture = TestBed.createComponent(VorgangListPageContainerComponent);
+		component = fixture.componentInstance;
+		fixture.detectChanges();
+	});
+
+	it('should create', () => {
+		expect(component).toBeTruthy();
+	});
+
+	describe('onInit', () => {
+
+		it('should call apiRootService', () => {
+			component.ngOnInit();
+
+			expect(apiRootService.getApiRoot).toHaveBeenCalled();
+		})
+	})
+});
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ecc0ea6837efe767b36e46c08a73ee662d041fc1
--- /dev/null
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page-container.component.ts
@@ -0,0 +1,20 @@
+import { Component, OnInit } from '@angular/core';
+import { ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared';
+import { StateResource } from '@goofy-client/tech-shared';
+import { Observable } from 'rxjs';
+
+@Component({
+	selector: 'goofy-client-vorgang-list-page-container',
+	templateUrl: './vorgang-list-page-container.component.html',
+	styleUrls: ['./vorgang-list-page-container.component.scss'],
+})
+export class VorgangListPageContainerComponent implements OnInit {
+
+	apiRootStateResource$: Observable<StateResource<ApiRootResource>>;
+
+	constructor(private apiRootService: ApiRootService) { }
+
+	ngOnInit(): void {
+		this.apiRootStateResource$ = this.apiRootService.getApiRoot();
+	}
+}
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
index 2bf1a8ddb3fa9fe14514a55299a3034ef1045f33..bafd229827f85b6d530d8b78e524e068ddfccd90 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.html
@@ -1,2 +1,6 @@
 <goofy-client-subnavigation class="mat-app-background"></goofy-client-subnavigation>
-<goofy-client-vorgang-list-container></goofy-client-vorgang-list-container>
+
+<goofy-client-vorgang-list-container *ngIf="apiRootStateResource?.resource | hasLink: apiRootLinkRel.VORGAENGE; else showNoRoleMessage" data-test-id="vorgaenge-list"></goofy-client-vorgang-list-container>
+<ng-template #showNoRoleMessage>
+	<h1 data-test-id="user-no-role-message">Die Allgemeine Fachanwendung ist wegen fehlender Rollen nicht benutzbar.</h1>
+</ng-template>
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1f8ba303033ec012306500158c50e3a082bc3ab0 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.scss
@@ -0,0 +1,13 @@
+@import "variables";
+
+h1 {
+	text-align: center;
+	margin: 0;
+	padding: 1rem;
+}
+
+:host-context(.dark) {
+	h1 {
+		background-color: $dark-background;
+	}
+}
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts
index 1548673e95fbf1a263d7a20160f9ff5403b8ec56..95184f30ba5b5314c55717c5969569c6bb2af316 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.spec.ts
@@ -1,18 +1,28 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { VorgangListPageComponent } from './vorgang-list-page.component';
-import { MockComponent } from 'ng-mocks';
-import { SubnavigationComponent } from 'libs/ui/src/lib/ui/subnavigation/subnavigation.component';
+import { ApiRootLinkRel } from '@goofy-client/api-root-shared';
+import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@goofy-client/tech-shared';
+import { getElementFromFixture } from '@goofy-client/test-utils';
+import { SpinnerComponent } from '@goofy-client/ui';
 import { VorgangListContainerComponent } from '@goofy-client/vorgang';
+import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
+import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
+import { SubnavigationComponent } from 'libs/ui/src/lib/ui/subnavigation/subnavigation.component';
+import { MockComponent } from 'ng-mocks';
+import { VorgangListPageComponent } from './vorgang-list-page.component';
 
 describe('VorgangListPageComponent', () => {
 	let component: VorgangListPageComponent;
 	let fixture: ComponentFixture<VorgangListPageComponent>;
 
+	const userMessage: string = getDataTestIdOf('user-no-role-message');
+	const vorgaengeList: string = getDataTestIdOf('vorgaenge-list');
+
 	beforeEach(async () => {
 		await TestBed.configureTestingModule({
 			declarations: [
 				VorgangListPageComponent,
+				HasLinkPipe,
+				MockComponent(SpinnerComponent),
 				MockComponent(SubnavigationComponent),
 				MockComponent(VorgangListContainerComponent)
 			]
@@ -23,10 +33,32 @@ describe('VorgangListPageComponent', () => {
 	beforeEach(() => {
 		fixture = TestBed.createComponent(VorgangListPageComponent);
 		component = fixture.componentInstance;
+		component.apiRootStateResource = createEmptyStateResource();
 		fixture.detectChanges();
 	});
 
 	it('should create', () => {
 		expect(component).toBeTruthy();
 	});
+
+	describe('page', () => {
+
+		it('should show vorgaenge if link exists', () => {
+			component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.VORGAENGE]));
+			fixture.detectChanges();
+
+			const element = getElementFromFixture(fixture, vorgaengeList);
+
+			expect(element).toBeInstanceOf(HTMLElement);
+		})
+
+		it('should show hint message if link not exists', () => {
+			component.apiRootStateResource = createStateResource(createApiRootResource());
+			fixture.detectChanges();
+
+			const element = getElementFromFixture(fixture, userMessage);
+
+			expect(element).toBeInstanceOf(HTMLElement);
+		})
+	})
 });
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts
index 1f16539089f801cd3d44329020eb290556386ad0..cfe7072d4a20ee7601805bac22084ed1dd197ec2 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-list-page.component.ts
@@ -1,8 +1,16 @@
-import { Component } from '@angular/core';
+import { Component, Input } from '@angular/core';
+import { ApiRootLinkRel, ApiRootResource } from '@goofy-client/api-root-shared';
+import { StateResource } from '@goofy-client/tech-shared';
 
+//TODO unter vorgang-list-page-container schieben
 @Component({
 	selector: 'goofy-client-vorgang-list-page',
 	templateUrl: './vorgang-list-page.component.html',
 	styleUrls: ['./vorgang-list-page.component.scss']
 })
-export class VorgangListPageComponent { }
+export class VorgangListPageComponent {
+
+	@Input() apiRootStateResource: StateResource<ApiRootResource>;
+
+	readonly apiRootLinkRel = ApiRootLinkRel;
+}
\ No newline at end of file
diff --git a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts
index c300d818a54cdef72982b58b86d7278425a3f905..b9587df7dfb040efd4e874db0a8253fa217109ac 100644
--- a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts
+++ b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts
@@ -13,29 +13,30 @@ import { EmptyListComponent } from './vorgang-list-container/vorgang-list/empty-
 import { VorgangListItemComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component';
 import { VorgangNextFristButton } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component';
 import { VorgangListComponent } from './vorgang-list-container/vorgang-list/vorgang-list.component';
+import { VorgangListPageContainerComponent } from './vorgang-list-page-container/vorgang-list-page-container.component';
 import { VorgangListPageComponent } from './vorgang-list-page/vorgang-list-page.component';
 
 const routes: Routes = [
 	{
 		path: '',
-		component: VorgangListPageComponent
+		component: VorgangListPageContainerComponent,
 	},
 	{
 		path: 'search/:search',
-		component: VorgangListPageComponent
+		component: VorgangListPageContainerComponent,
 	},
 	{
 		path: 'myVorgaenge',
-		component: VorgangListPageComponent
+		component: VorgangListPageContainerComponent,
 	},
 	{
 		path: 'myVorgaenge/search/:search',
-		component: VorgangListPageComponent
+		component: VorgangListPageContainerComponent,
 	},
 	{
 		path: 'vorgang/:vorgangWithEingangUrl',
-		loadChildren: () => import('@goofy-client/vorgang-detail').then(m => m.VorgangDetailModule)
-	}
+		loadChildren: () => import('@goofy-client/vorgang-detail').then(m => m.VorgangDetailModule),
+	},
 ];
 
 @NgModule({
@@ -48,7 +49,7 @@ const routes: Routes = [
 		VorgangSharedModule,
 		WiedervorlageModule,
 		VorgangSharedUiModule,
-		UserProfileModule
+		UserProfileModule,
 	],
 	declarations: [
 		VorgangListComponent,
@@ -56,7 +57,8 @@ const routes: Routes = [
 		VorgangListContainerComponent,
 		VorgangListPageComponent,
 		EmptyListComponent,
-		VorgangNextFristButton
-	]
+		VorgangNextFristButton,
+		VorgangListPageContainerComponent
+	],
 })
 export class VorgangModule { }
diff --git a/goofy-client/tsconfig.base.json b/goofy-client/tsconfig.base.json
index b68afb258404cae674d402b8eb66078fa7beab24..b077313028be1be67cf372d6f755f0cf1e126102 100644
--- a/goofy-client/tsconfig.base.json
+++ b/goofy-client/tsconfig.base.json
@@ -54,6 +54,9 @@
 			"@goofy-client/vorgang-detail": [
 				"libs/vorgang-detail/src/index.ts"
 			],
+			"@goofy-client/vorgang-historie": [
+				"libs/vorgang-historie/src/index.ts"
+			],
 			"@goofy-client/vorgang-shared": [
 				"libs/vorgang-shared/src/index.ts"
 			],
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java b/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java
index 35ff2b41ccd56e82d7f8a2875b075e34d57f9a1f..834e157f26cbfa4bfcdf3bbd369548651447062f 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/JwtTokenUtil.java
@@ -1,6 +1,7 @@
 package de.itvsh.goofy;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -31,9 +32,11 @@ public class JwtTokenUtil {
 	public static final String TOKEN_ISSUER = "secure-api";
 	public static final String TOKEN_AUDIENCE = "secure-app";
 	public static final String ROLE_CLAIM = "roles";
+	public static final String USERID_CLAIM = "userId";
 	public static final String FIRSTNAME_CLAIM = "firstName";
 	public static final String LASTNAME_CLAIM = "lastName";
 	public static final String FILEID_CLAIM = "fileId";
+	public static final String ORGANSIATIONSEINHEIT_IDS_CLAIM = "organisationseinheitIds";
 
 	@Autowired
 	private DownloadTokenProperties downloadTokenProperties;
@@ -72,12 +75,26 @@ public class JwtTokenUtil {
 				.toList();
 	}
 
+	@SuppressWarnings({ "unchecked" })
+	public Collection<String> getOrganisationseinheitIdsFromToken(String token) {
+		List<String> organisationseinheitIds = new ArrayList<>();
+		getAllClaimsFromToken(token)
+				.ifPresent(claims -> {
+					if (claims.get(ORGANSIATIONSEINHEIT_IDS_CLAIM) != null) {
+						organisationseinheitIds.addAll((Collection<String>) claims.get(ORGANSIATIONSEINHEIT_IDS_CLAIM));
+					}
+				});
+		return organisationseinheitIds;
+	}
+
 	public String generateToken(FileId fileId, GoofyUser user) {
 		var claims = new HashMap<String, Object>();
+		claims.put(USERID_CLAIM, user.getId().toString());
 		claims.put(FIRSTNAME_CLAIM, user.getFirstName());
 		claims.put(LASTNAME_CLAIM, user.getLastName());
 		claims.put(ROLE_CLAIM, user.getAuthorities());
 		claims.put(FILEID_CLAIM, fileId.toString());
+		claims.put(ORGANSIATIONSEINHEIT_IDS_CLAIM, user.getOrganisationseinheitIds());
 
 		return doGenerateToken(claims, user.getId().toString());
 	}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java
index f931023a603f2803a7b465cfc7a6c93181f676a7..f394e86ca7234a76fca635adbb013a6558f16aed 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java
@@ -18,6 +18,7 @@ import de.itvsh.goofy.common.downloadtoken.DownloadTokenController;
 import de.itvsh.goofy.common.user.CurrentUserService;
 import de.itvsh.goofy.common.user.UserId;
 import de.itvsh.goofy.common.user.UserProfileController;
+import de.itvsh.goofy.common.user.UserRole;
 import de.itvsh.goofy.vorgang.VorgangController;
 
 @RestController
@@ -39,16 +40,23 @@ public class RootController {
 	@GetMapping
 	public EntityModel<RootResource> getRootResource() {
 		return ModelBuilder.fromEntity(new RootResource())
-				.addLink(linkTo(RootController.class).withSelfRel())
-				.addLink(linkTo(VorgangController.class).withRel(REL_VORGAENGE))
-				.addLink(linkTo(methodOn(UserProfileController.class).findUsers(null)).withRel(REL_SEARCH_USER))
-				.addLink(linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN))
-				.addLink(buildVorgangListByPageLink(REL_SEARCH, Optional.empty()))
-				.addLink(buildVorgangListByPageLink(REL_MY_VORGAENGE, Optional.of(currentUserService.getUserId())))
-				.addLink(buildVorgangListByPageLink(REL_SEARCH_MY_VORGAENGE, Optional.of(currentUserService.getUserId())))
+				.ifMatch(this::hasRole).addLinks(
+						linkTo(RootController.class).withSelfRel(),
+						linkTo(VorgangController.class).withRel(REL_VORGAENGE),
+						linkTo(methodOn(UserProfileController.class).findUsers(null)).withRel(REL_SEARCH_USER),
+						linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN),
+						buildVorgangListByPageLink(REL_SEARCH, Optional.empty()),
+						buildVorgangListByPageLink(REL_MY_VORGAENGE, Optional.of(currentUserService.getUserId())),
+						buildVorgangListByPageLink(REL_SEARCH_MY_VORGAENGE, Optional.of(currentUserService.getUserId())))
 				.buildModel();
 	}
 
+	private boolean hasRole() {
+		return currentUserService.hasRole(UserRole.VERWALTUNG_USER)
+				|| currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)
+				|| currentUserService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER);
+	}
+
 	private Link buildVorgangListByPageLink(String linkRel, Optional<UserId> assignedTo) {
 		return linkTo(methodOn(VorgangController.class).getVorgangListByPage(0, null, null, assignedTo)).withRel(linkRel);
 	}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java
index 282f1b74bba6575ac710ef96318c5227484f1887..cf8d3a0506bbadc521974bad0144cd7c42bd6407 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/DownloadGoofyUser.java
@@ -10,6 +10,8 @@ import de.itvsh.goofy.common.user.GoofyUser;
 import lombok.Builder;
 import lombok.Getter;
 
+//TODO rename this class - it es not a user, it is a user and a file id
+
 @Builder
 @Getter
 public class DownloadGoofyUser {
@@ -17,7 +19,7 @@ public class DownloadGoofyUser {
 
 	private FileId fileId;
 
-	public Collection<? extends GrantedAuthority> getAuthorities() { // NOSONAR
+	public Collection<GrantedAuthority> getAuthorities() {
 		return Objects.nonNull(user) ? user.getAuthorities() : List.of();
 	}
 }
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java
index b2b4e4291127c2754b88a8e120c8d190c5f90686..b80ba70fc1822726303a3e23551f91825e0758ee 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/callcontext/ContextService.java
@@ -29,7 +29,7 @@ public class ContextService {
 	static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin";
 	static final String KEY_REQUEST_ID = "REQUEST_ID-bin";
 	static final String KEY_ACCESS_LIMITED_ORGAID = "ACCESS_LIMITED_TO_ORGANISATORISCHEEINHEITENID-bin";
-	static final String KEY_ORGAID_CHECK_NECESSARY = "ORGANISATION_EINHEITEN_ID_CHECK_NECESSARY-bin";
+	static final String KEY_ACCESS_LIMITED = "ACCESS_LIMITED-bin";
 
 	@Autowired
 	private ApplicationContext context;
@@ -79,14 +79,16 @@ public class ContextService {
 				.ifPresentOrElse(bytes -> metadata.put(createKeyOf(KEY_CLIENT_NAME), bytes), () -> LOG.warn("Missing value 'client name'"));
 		user.getOrganisationseinheitIds().stream().map(String::getBytes)
 				.forEach(bytes -> metadata.put(createKeyOf(KEY_ACCESS_LIMITED_ORGAID), bytes));
-		metadata.put(createKeyOf(KEY_ORGAID_CHECK_NECESSARY), isOrganisationEinheitenIdCheckNecessary());
+		metadata.put(createKeyOf(KEY_ACCESS_LIMITED), isOrganisationEinheitenIdCheckNecessary());
 
 		return metadata;
 	}
 
 	private byte[] isOrganisationEinheitenIdCheckNecessary() {
-		Boolean doOrgaIdCheck = !userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE);
-		return doOrgaIdCheck.toString().getBytes();
+		var hasRoleWithNoCheckNecessary = userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)
+				|| userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER);
+
+		return Boolean.toString(!hasRoleWithNoCheckNecessary).getBytes();
 	}
 
 	private String formatListAsCommaSeperatedString(Collection<String> organisatorischeEinheitenIds) {
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java
index a24fc7535ceea1e0e5030a168e18206df6087e6f..661d146cb6ca8ac8fbaf027243d780e8b0b4e61a 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/Command.java
@@ -40,5 +40,5 @@ public class Command {
 
 	private RedirectRequest redirectRequest;
 
-	private Map<String, String> body;
+	private Map<String, ?> body;
 }
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java
index f8e2c4cf1f1bde9745c1a9bac2a2caf4b595777e..c1d7d2c1f5b225bba75aaa7b6a7b9a1d123634dc 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBody.java
@@ -11,6 +11,7 @@ import de.itvsh.goofy.wiedervorlage.Wiedervorlage;
 
 @JsonSubTypes({
 		@Type(value = PostfachMail.class, name = "SEND_POSTFACH_MAIL"),
+		@Type(value = PostfachMail.class, name = "SEND_POSTFACH_NACHRICHT"),
 		@Type(value = AssignUserCommandBody.class, name = "ASSIGN_USER"),
 		@Type(value = RedirectRequest.class, name = "REDIRECT_VORGANG"),
 		@Type(value = Wiedervorlage.class, name = "WIEDERVORLAGE"),
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java
index 18477d9d1fc068ab8472d07c7f04fefd525e8292..703a17d43d415bfcd5d39da8b002796399825f44 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java
@@ -3,10 +3,13 @@ package de.itvsh.goofy.common.command;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.commons.beanutils.BeanMap;
+import org.apache.commons.lang3.StringUtils;
 import org.mapstruct.Mapper;
 
 import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBody;
@@ -15,13 +18,31 @@ import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBodyField;
 @Mapper
 public interface CommandBodyMapper {
 
+	final Predicate<Entry<Object, Object>> HAS_NOT_NULL_VALUE = entry -> Objects.nonNull(entry.getValue());
+	final Predicate<Entry<Object, Object>> IS_NOT_CLASS_VALUE = entry -> !StringUtils.equals("class", entry.getKey().toString());
+
 	static final String VORGANG_ID_PROPERTY = "vorgangId";
 	static final String ITEM_NAME_PROPERTY = "itemName";
 	static final String ITEM_PROPERTY = "item";
 
+	default Map<String, Object> fromObjectToMap(Object object) {
+		return new BeanMap(object).entrySet().stream()
+				.filter(HAS_NOT_NULL_VALUE)
+				.filter(IS_NOT_CLASS_VALUE)
+				.collect(Collectors.toMap(entry -> entry.getKey().toString(), this::checkEnumValue));
+	}
+
+	private Object checkEnumValue(Entry<Object, Object> entry) {
+		if (entry.getValue() instanceof Enum<?> enumValue) {
+			return enumValue.name();
+		}
+		return entry.getValue();
+	}
+
 	default GrpcCommandBody mapToBody(Map<String, String> bodyMap) {
-		if (Objects.isNull(bodyMap))
+		if (Objects.isNull(bodyMap)) {
 			return GrpcCommandBody.getDefaultInstance();
+		}
 
 		var builder = GrpcCommandBody.newBuilder();
 
@@ -34,18 +55,21 @@ public interface CommandBodyMapper {
 	}
 
 	default List<GrpcCommandBodyField> mapToBodyFields(CommandBody body) {
-		if (Objects.isNull(body))
+		if (Objects.isNull(body)) {
 			return Collections.emptyList();
+		}
 
 		return mapToBodyFields(new BeanMap(body));
 	}
 
 	default List<GrpcCommandBodyField> mapToBodyFields(Map<Object, Object> bodyMap) {
-		if (Objects.isNull(bodyMap))
+		if (Objects.isNull(bodyMap)) {
 			return Collections.emptyList();
+		}
 
 		return bodyMap.entrySet().stream()
-				.filter(entry -> Objects.nonNull(entry.getValue()))
+				.filter(HAS_NOT_NULL_VALUE)
+				.filter(IS_NOT_CLASS_VALUE)
 				.map(entry -> GrpcCommandBodyField.newBuilder().setName(entry.getKey().toString()).setValue(entry.getValue().toString()).build())
 				.collect(Collectors.toList());
 	}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java
index 000c055d46c2c7fd56371fc63a03a617b70260ac..d6c45c11a6021bddc0cb4cbb7ac6b89189c6200f 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java
@@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.postfach.PostfachMail;
-import de.itvsh.goofy.postfach.PostfachMailController;
 import de.itvsh.goofy.vorgang.VorgangController;
 import de.itvsh.goofy.vorgang.VorgangWithEingang;
 import lombok.Getter;
@@ -74,55 +74,57 @@ public class CommandController {
 		private CommandService service;
 		@Autowired
 		private VorgangController vorgangController;
-		@Autowired
-		private PostfachMailController postfachController;
 
 		@PostMapping
 		public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable String relationId,
 				@PathVariable long relationVersion, @RequestBody CreateCommand command) {
 			command = command.toBuilder().vorgangId(vorgangId).relationId(relationId).build();
-			var created = createCommand(command, relationVersion);
 
 			if (isSendPostfachMailOrder(command)) {
-				sendPostfachMail(created.getId(), buildPostfachMail(command));
+				command = prepareCommandForPostfachNachricht(command, vorgangId);
 			}
 
+			var created = createCommand(command, relationVersion);
+
 			return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build();
 		}
 
-		public Command createCommand(CreateCommand command, long version) {
-			return service.createCommand(command, version);
+		private boolean isSendPostfachMailOrder(CreateCommand command) {
+			return command.getOrder() == CommandOrder.SEND_POSTFACH_NACHRICHT;
 		}
 
-		public Command createCommand(CreateCommand command, String itemName) {
-			return service.createCommand(command, itemName);
+		CreateCommand prepareCommandForPostfachNachricht(CreateCommand command, String vorgangId) {
+			var postfachBody = (PostfachMail) command.getBody();
+			var attachments = postfachBody.getAttachments().stream().map(this::stripToFileId).toList();
+			postfachBody = postfachBody.toBuilder().postfachId(getPostfachId(vorgangId))
+					.clearAttachments().attachments(attachments)
+					.build();
+			return command.toBuilder().body(postfachBody).build();
 		}
 
-		public Command createCommandWithoutValidation(CreateCommand command, String itemName) {
-			return service.createCommandWithoutValidation(command, itemName);
+		private FileId stripToFileId(FileId fileUri) {
+			var fileUriStr = fileUri.toString();
+			return FileId.from(fileUriStr.substring(fileUriStr.lastIndexOf("/") + 1, fileUriStr.length()));
 		}
 
-		private boolean isSendPostfachMailOrder(CreateCommand command) {
-			return command.getOrder() == CommandOrder.SEND_POSTFACH_MAIL;
+		private String getPostfachId(String vorgangId) {
+			return getVorgang(vorgangId).getEingang().getAntragsteller().getPostfachId();
 		}
 
-		void sendPostfachMail(String commandId, PostfachMail postfachMail) {
-			postfachController.sendPostfachMail(commandId, postfachMail);
+		private VorgangWithEingang getVorgang(String vorgangId) {
+			return vorgangController.getVorgang(vorgangId);
 		}
 
-		private PostfachMail buildPostfachMail(CreateCommand command) {
-			return ((PostfachMail) command.getBody()).toBuilder()
-					.vorgangId(command.getVorgangId())
-					.postfachId(getPostfachId(command.getVorgangId()))
-					.build();
+		public Command createCommand(CreateCommand command, long version) {
+			return service.createCommand(command, version);
 		}
 
-		private String getPostfachId(String vorgangId) {
-			return getVorgang(vorgangId).getEingang().getAntragsteller().getPostfachId();
+		public Command createCommand(CreateCommand command, String itemName) {
+			return service.createCommand(command, itemName);
 		}
 
-		private VorgangWithEingang getVorgang(String vorgangId) {
-			return vorgangController.getVorgang(vorgangId);
+		public Command createCommandWithoutValidation(CreateCommand command, String itemName) {
+			return service.createCommandWithoutValidation(command, itemName);
 		}
 	}
 }
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java
index e2b81a1c10ea9b0190034b7c31bd2f26fe52e6ab..cf44ac65b3a9065011f693fce1870bca2c4c1cde 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandMapper.java
@@ -1,23 +1,56 @@
 package de.itvsh.goofy.common.command;
 
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.commons.lang3.StringUtils;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.MappingConstants;
 import org.mapstruct.ValueMapping;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import de.itvsh.goofy.common.TimeMapper;
 import de.itvsh.goofy.common.callcontext.CallContextMapper;
-import de.itvsh.goofy.common.user.UserId;
+import de.itvsh.goofy.common.user.UserIdMapper;
 import de.itvsh.goofy.vorgang.RedirectRequest;
+import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCommand;
 import de.itvsh.ozg.pluto.grpc.command.GrpcRedirectRequest;
 
-@Mapper(uses = { CallContextMapper.class, TimeMapper.class, CommandBodyMapper.class })
-public interface CommandMapper {
+@Mapper(uses = { CallContextMapper.class, TimeMapper.class, CommandBodyMapper.class, GrpcObjectMapper.class, UserIdMapper.class })
+public abstract class CommandMapper {
+
+	@Autowired
+	private GrpcObjectMapper objectMapper;
+	@Autowired
+	private CommandBodyMapper bodyMapper;
 
 	@ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL)
 	@ValueMapping(source = "UNDEFINED", target = MappingConstants.NULL)
-	Command toCommand(GrpcCommand grpcCommand);
+	@Mapping(target = "order", expression = "java(mapOrder(grpcCommand))")
+	@Mapping(target = "body", expression = "java(mapBody(grpcCommand))")
+	abstract Command toCommand(GrpcCommand grpcCommand);
+
+	Map<String, ?> mapBody(GrpcCommand command) {
+		if (!Objects.isNull(command.getBodyObj())) {
+			return objectMapper.mapFromGrpc(command.getBodyObj());
+		} else {
+			return bodyMapper.map(command.getBody());
+		}
+	}
+
+	CommandOrder mapOrder(GrpcCommand command) {
+		if (StringUtils.isNotBlank(command.getOrderString())) {
+			return CommandOrder.valueOf(command.getOrderString());
+		} else {
+			return CommandOrder.valueOf(command.getOrder().name());
+		}
+	}
+
+	String mapStringtoNull(String in) {
+		return StringUtils.trimToNull(in);
+	}
 
 	@Mapping(target = "mergeContext", ignore = true)
 	@Mapping(target = "context", ignore = true)
@@ -29,9 +62,6 @@ public interface CommandMapper {
 	@Mapping(target = "passwordBytes", ignore = true)
 	@Mapping(target = "unknownFields", ignore = true)
 	@Mapping(target = "allFields", ignore = true)
-	GrpcRedirectRequest toGrpcRedirectRequest(RedirectRequest request);
+	abstract GrpcRedirectRequest toGrpcRedirectRequest(RedirectRequest request);
 
-	default UserId mapUserId(String userId) {
-		return UserId.from(userId);
-	}
 }
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java
index 136cf4ea625bb8e60c4cdb2e07b0da5ae29551ab..d486668a566b4d1a64939d5ca114873a81b3888a 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandOrder.java
@@ -30,7 +30,9 @@ public enum CommandOrder {
 	WIEDERVORLAGE_ERLEDIGEN(false, Type.WIEDERVORLAGE),
 	WIEDERVORLAGE_WIEDEREROEFFNEN(false, Type.WIEDERVORLAGE),
 	//
+	@Deprecated
 	SEND_POSTFACH_MAIL(false, Type.POSTFACH),
+	SEND_POSTFACH_NACHRICHT(false, Type.POSTFACH),
 	RESEND_POSTFACH_MAIL(false, Type.POSTFACH),
 
 	CREATE_ATTACHED_ITEM(false, Type.VORGANG),
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java
index 0185cb89bcfbf21d4288b96a9ce7b093b8510e93..bc35a6d14771b3822737b95cf2efa5d5b2677cf1 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java
@@ -21,6 +21,8 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
 @Service
 public class CommandRemoteService {
 
+	@GrpcClient("pluto")
+	private CommandServiceBlockingStub commandServiceStub;
 	@Autowired
 	private ContextService contextService;
 	@Autowired
@@ -30,9 +32,6 @@ public class CommandRemoteService {
 	@Autowired
 	private GrpcObjectMapper objectMapper;
 
-	@GrpcClient("pluto")
-	private CommandServiceBlockingStub commandServiceStub;
-
 	public Command createCommand(CreateCommand command, long version) {
 		return doCreateCommand(buildCreateCommandRequest(command, version));
 	}
@@ -54,7 +53,8 @@ public class CommandRemoteService {
 				.setRelationId(command.getRelationId())
 				.setRelationVersion(version)
 				.addAllBody(bodyMapper.mapToBodyFields(command.getBody()))
-				.setOrder(GrpcOrder.valueOf(command.getOrder().name()));
+				.setBodyObj(objectMapper.fromMap(bodyMapper.fromObjectToMap(command.getBody())))
+				.setOrderString(command.getOrder().name());
 
 		Optional.ofNullable(command.getRedirectRequest()).map(mapper::toGrpcRedirectRequest).ifPresent(requestBuilder::setRedirectRequest);
 
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java
index dd9ac1f05e25b5cba1a7ad46ea1bfd26bc6a68fd..bc1f6064da1de5322c28bf556679aa838d5d4948 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenService.java
@@ -18,10 +18,11 @@ import com.auth0.jwt.exceptions.JWTVerificationException;
 
 import de.itvsh.goofy.JwtTokenUtil;
 import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser;
-import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser.DownloadGoofyUserBuilder;
+import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.common.user.CurrentUserService;
 import de.itvsh.goofy.common.user.GoofyUser;
+import de.itvsh.goofy.common.user.UserId;
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import io.jsonwebtoken.Claims;
 import lombok.extern.log4j.Log4j2;
@@ -68,9 +69,11 @@ class DownloadTokenService {
 		final DownloadGoofyUserBuilder downloadUserBuilder = DownloadGoofyUser.builder();
 		claimsOptional.ifPresent(claims -> downloadUserBuilder.user(
 				GoofyUser.builder()
+						.id(UserId.from(claims.get(USERID_CLAIM, String.class)))
 						.firstName(claims.get(FIRSTNAME_CLAIM, String.class))
 						.lastName(claims.get(LASTNAME_CLAIM, String.class))
-						.authorities(jwtTokenUtil.getRolesFromToken(token)).build())
+						.authorities(jwtTokenUtil.getRolesFromToken(token))
+						.organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build())
 				.fileId(FileId.from(claims.get(FILEID_CLAIM, String.class))));
 
 		return downloadUserBuilder.build();
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java
index 0e1da92e75bbbd21e20b79babb1f58814e7da1c7..58040fd30f13c4f728a4c93ef9fb1b3bd0a2a90b 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/CurrentUserService.java
@@ -13,6 +13,8 @@ import org.keycloak.representations.AccessToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.stereotype.Service;
 
+import de.itvsh.goofy.common.binaryfile.DownloadGoofyUser;
+
 @Service
 public class CurrentUserService {
 
@@ -29,6 +31,11 @@ public class CurrentUserService {
 	}
 
 	public GoofyUser getUser() {
+		var dlUser = getDownloadUser();
+		if (dlUser.isPresent()) {
+			return dlUser.get();
+		}
+
 		Optional<AccessToken> token = getCurrentSecurityToken();
 
 		var userBuilder = GoofyUser.builder()
@@ -53,12 +60,21 @@ public class CurrentUserService {
 				.stream().map(Object::toString).collect(Collectors.toList());
 	}
 
+	private Optional<GoofyUser> getDownloadUser() {
+		return Optional.of(CurrentUserHelper.getAuthentication().getPrincipal())
+				.filter(DownloadGoofyUser.class::isInstance)
+				.map(DownloadGoofyUser.class::cast)
+				.map(DownloadGoofyUser::getUser);
+
+	}
+
 	private Optional<AccessToken> getCurrentSecurityToken() {
 		Object principal = CurrentUserHelper.getAuthentication().getPrincipal();
 
 		if (principal instanceof KeycloakPrincipal) {
 			return Optional.of(((KeycloakPrincipal<?>) principal).getKeycloakSecurityContext().getToken());
 		}
+
 		return Optional.empty();
 	}
 }
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java
index a780e3d6883225dd238b908366be172535a96a65..ed84924b41b56f16d30afaf3cf5c259d52ca8c8e 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMail.java
@@ -10,11 +10,9 @@ import javax.validation.constraints.Size;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
-import de.itvsh.goofy.common.LinkedResource;
 import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.common.command.CommandBody;
 import de.itvsh.goofy.common.user.UserId;
-import de.itvsh.goofy.common.user.UserProfileController;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -42,7 +40,7 @@ public class PostfachMail implements CommandBody {
 	private String vorgangId;
 
 	private ZonedDateTime createdAt;
-	@LinkedResource(controllerClass = UserProfileController.class)
+	@JsonIgnore
 	private UserId createdBy;
 
 	private ZonedDateTime sentAt;
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java
index 2261c99b4463d0cf368c7baaaec0d563505f319c..4bd0a32d73aa3817555633bbc1b936d2a80c6952 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java
@@ -46,10 +46,6 @@ public class PostfachMailController {
 	@Autowired
 	private BinaryFileController binaryFileController;
 
-	public void sendPostfachMail(String commandId, PostfachMail message) {
-		service.sendPostfachMail(commandId, message);
-	}
-
 	@GetMapping(params = PARAM_VORGANG_ID)
 	public CollectionModel<EntityModel<PostfachMail>> getAll(@RequestParam String vorgangId) {
 		var vorgang = getVorgang(vorgangId);
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java
index a323d38ae2e7194e2edfcf8f33fa3b656d9322dd..0b49bcbc606db14e5096b9dea6af58360053a0b6 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailModelAssembler.java
@@ -15,6 +15,7 @@ import org.springframework.stereotype.Component;
 import de.itvsh.goofy.common.ModelBuilder;
 import de.itvsh.goofy.common.binaryfile.BinaryFileController;
 import de.itvsh.goofy.common.command.CommandController.CommandByRelationController;
+import de.itvsh.goofy.common.user.UserProfileController;
 import de.itvsh.goofy.postfach.PostfachMailController.PostfachMailCommandController;
 
 @Component
@@ -24,10 +25,15 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
 	public static final String REL_RESEND_POSTFACH_MAIL = "resendPostfachMail";
 	public static final String REL_ATTACHMENTS = "attachments";
 	static final String REL_UPLOAD_ATTACHMENT = "uploadAttachment";
+	static final String REL_CREATED_BY = "createdBy";
 
 	private static final Predicate<PostfachMail> SENT_FAILED = postfachMail -> BooleanUtils.isFalse(postfachMail.getSentSuccessful());
 	private static final Predicate<PostfachMail> HAS_ATTACHMENTS = nachricht -> !nachricht.getAttachments().isEmpty();
 
+	static final String SYSTEM_USER_IDENTIFIER = "system";
+	private static final Predicate<PostfachMail> SENT_BY_CLIENT_USER = postfachNachricht -> Optional.ofNullable(postfachNachricht.getCreatedBy())
+			.map(createdBy -> !createdBy.toString().startsWith(SYSTEM_USER_IDENTIFIER)).orElse(false);
+
 	public CollectionModel<EntityModel<PostfachMail>> toCollectionModel(Stream<PostfachMail> entities, String vorgangId, long vorgangVersion,
 			Optional<String> postfachId) {
 		CollectionModel<EntityModel<PostfachMail>> model = CollectionModel.of(entities.map(this::toModel).toList(),
@@ -49,6 +55,8 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
 				.ifMatch(HAS_ATTACHMENTS)
 				.addLink(linkTo(methodOn(PostfachMailController.class).findAttachments(PostfachNachrichtId.from(postfachMail.getId())))
 						.withRel(REL_ATTACHMENTS))
+				.ifMatch(SENT_BY_CLIENT_USER)
+				.addLink(linkTo(UserProfileController.class).slash(postfachMail.getCreatedBy()).withRel(REL_CREATED_BY))
 				.buildModel();
 	}
 
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java
index be2e440130cb1c4452317a08f4924348d46e65e6..8a48ba36b825d2d51ffbbb4035aac4b427c3cb2e 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailRemoteService.java
@@ -6,14 +6,12 @@ import java.util.stream.Stream;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.common.callcontext.ContextService;
 import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailRequest;
 import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailsRequest;
 import de.itvsh.ozg.mail.postfach.GrpcFindPostfachMailsResponse;
 import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredRequest;
 import de.itvsh.ozg.mail.postfach.GrpcResendPostfachMailRequest;
-import de.itvsh.ozg.mail.postfach.GrpcSendPostfachMailRequest;
 import de.itvsh.ozg.mail.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
@@ -27,29 +25,6 @@ class PostfachMailRemoteService {
 	@Autowired
 	private PostfachMailMapper postfachNachrichtMapper;
 
-	public void sendPostfachMail(String commandId, PostfachMail postfachMail) {
-		serviceStub.sendPostfachMail(buildSendPostfachMailRequest(commandId, postfachMail));
-	}
-
-	private GrpcSendPostfachMailRequest buildSendPostfachMailRequest(String commandId, PostfachMail postfachMail) {
-		var mail = postfachNachrichtMapper.toGrpcPostfachMail(postfachMail);
-
-		// TODO Die Attachments direkt im Mapper setzen
-		var attachmentStringList = postfachMail.getAttachments().stream().map(this::stripToFileId).toList();
-		mail = mail.toBuilder().addAllAttachment(attachmentStringList).build();
-
-		return GrpcSendPostfachMailRequest.newBuilder()
-				.setCommandId(commandId)
-				.setContext(contextService.createCallContext())
-				.setMail(mail)
-				.build();
-	}
-
-	private String stripToFileId(FileId fileUri) {
-		var fileUriStr = fileUri.toString();
-		return fileUriStr.substring(fileUriStr.lastIndexOf("/") + 1, fileUriStr.length());
-	}
-
 	public Stream<PostfachMail> findPostfachMails(String vorgangId) {
 		GrpcFindPostfachMailsResponse response = serviceStub.findPostfachMails(buildFindPostfachMailsRequest(vorgangId));
 
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java
index 789ebe855ae3446f964e90868a9ace0def327e1a..445aad6500dc4204f9947b517ff8b4c749689030 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailService.java
@@ -19,16 +19,6 @@ class PostfachMailService {
 	@Autowired
 	private PostfachMailRemoteService remoteService;
 
-	@Async
-	public void sendPostfachMail(String commandId, PostfachMail postfachMail) {
-		try {
-			remoteService.sendPostfachMail(commandId, postfachMail);
-		} catch (RuntimeException e) {
-			LOG.error("Error sending PostfachNachricht: " + e.getMessage(), e);
-//			FIXME mark command als error
-		}
-	}
-
 	public Stream<PostfachMail> getAll(String vorgangId) {
 		return remoteService.findPostfachMails(vorgangId);
 	}
@@ -36,7 +26,6 @@ class PostfachMailService {
 	public PostfachMail findById(PostfachNachrichtId nachrichtId) {
 		return remoteService.findById(nachrichtId)
 				.orElseThrow(() -> new ResourceNotFoundException(PostfachMail.class, nachrichtId));
-
 	}
 
 	@Async
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java b/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java
index 61548e5b6a4d7230b09465260f68ecc7dedf5702..21872772831a98e4addae01feaf3073624b3e7d8 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/JwtTokenUtilTest.java
@@ -6,6 +6,7 @@ import static org.mockito.Mockito.*;
 
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
@@ -72,6 +73,13 @@ class JwtTokenUtilTest {
 			assertThat(expirationDate).isAfter(before).isBefore(after);
 		}
 
+		@Test
+		void organisationseinheitIds() {
+			var organisationseinheitIds = jwtTokenUtil.getOrganisationseinheitIdsFromToken(generatedToken);
+
+			assertThat(organisationseinheitIds).isEqualTo(List.of(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID));
+		}
+
 		private Claims getParsedBody() {
 			return Jwts.parser().setSigningKey(TOKEN_SECRET.getBytes()).parseClaimsJws(generatedToken).getBody();
 		}
@@ -107,6 +115,7 @@ class JwtTokenUtilTest {
 			claims.put(JwtTokenUtil.LASTNAME_CLAIM, SecurityTestFactory.USER_LASTNAME);
 			claims.put(JwtTokenUtil.ROLE_CLAIM, SecurityTestFactory.AUTHORITIES);
 			claims.put(JwtTokenUtil.FILEID_CLAIM, FileId.createNew());
+			claims.put(JwtTokenUtil.ORGANSIATIONSEINHEIT_IDS_CLAIM, SecurityTestFactory.ORGANSIATIONSEINHEIT_IDS);
 
 			return Jwts.builder()
 					.setClaims(claims)
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java
index db4a5b8c67f1dab678a0733decd25231ad7f9c8b..778e0dc261ca83baefff24df794e4e346fb7c403 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java
@@ -1,6 +1,6 @@
 package de.itvsh.goofy;
 
-import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -9,6 +9,7 @@ import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -20,6 +21,8 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.common.user.CurrentUserService;
 import de.itvsh.goofy.common.user.UserTestFactory;
 
@@ -43,62 +46,90 @@ class RootControllerTest {
 		when(currentUserService.getUserId()).thenReturn(UserTestFactory.ID);
 	}
 
+	@DisplayName("Links for user")
 	@Nested
 	class TestLinks {
 
-		@Test
-		void shouldHaveSelfLink() {
-			var model = controller.getRootResource();
+		@DisplayName("with any role")
+		@Nested
+		class TestWithAnyRole {
 
-			assertThat(model.getLink(IanaLinkRelations.SELF)).isPresent();
-		}
+			@BeforeEach
+			void mockCurrentUserService() {
+				when(currentUserService.hasRole(anyString())).thenReturn(true);
+			}
 
-		@Test
-		void shouldHaveLinkToVorgangList() {
-			var model = controller.getRootResource();
+			@Test
+			void shouldHaveSelfLink() {
+				var model = controller.getRootResource();
 
-			assertThat(model.getLink(RootController.REL_VORGAENGE)).isPresent().get()
-					.extracting(Link::getHref).isEqualTo("/api/vorgangs");
-		}
+				assertThat(model.getLink(IanaLinkRelations.SELF)).isPresent();
+			}
 
-		@Test
-		void shouldHaveSearchLinkWithLimit() {
-			var model = controller.getRootResource();
+			@Test
+			void shouldHaveLinkToVorgangList() {
+				var model = controller.getRootResource();
 
-			assertThat(model.getLink(RootController.REL_SEARCH)).isPresent().get()
-					.extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0{&searchBy,limit,assignedTo}");
-		}
+				assertThat(model.getLink(RootController.REL_VORGAENGE)).isPresent().get()
+						.extracting(Link::getHref).isEqualTo("/api/vorgangs");
+			}
 
-		@Test
-		void shouldHaveSearchUserLink() {
-			var model = controller.getRootResource();
+			@Test
+			void shouldHaveSearchLinkWithLimit() {
+				var model = controller.getRootResource();
 
-			assertThat(model.getLink(RootController.REL_SEARCH_USER)).isPresent().get().extracting(Link::getHref)
-					.isEqualTo("/api/userProfiles?searchBy={searchBy}");
-		}
+				assertThat(model.getLink(RootController.REL_SEARCH)).isPresent().get()
+						.extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0{&searchBy,limit,assignedTo}");
+			}
 
-		@Test
-		void shoulHaveMyVorgaengeLink() {
-			var model = controller.getRootResource();
+			@Test
+			void shouldHaveSearchUserLink() {
+				var model = controller.getRootResource();
 
-			assertThat(model.getLink(RootController.REL_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref)
-					.isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}");
-		}
+				assertThat(model.getLink(RootController.REL_SEARCH_USER)).isPresent().get().extracting(Link::getHref)
+						.isEqualTo("/api/userProfiles?searchBy={searchBy}");
+			}
+
+			@Test
+			void shoulHaveMyVorgaengeLink() {
+				var model = controller.getRootResource();
+
+				assertThat(model.getLink(RootController.REL_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref)
+						.isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}");
+			}
+
+			@Test
+			void shoulHaveSearchMyVorgaengeLink() {
+				var model = controller.getRootResource();
 
-		@Test
-		void shoulHaveSearchMyVorgaengeLink() {
-			var model = controller.getRootResource();
+				assertThat(model.getLink(RootController.REL_SEARCH_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref)
+						.isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}");
+			}
 
-			assertThat(model.getLink(RootController.REL_SEARCH_MY_VORGAENGE)).isPresent().get().extracting(Link::getHref)
-					.isEqualTo("/api/vorgangs?page=0&assignedTo=" + UserTestFactory.ID.toString() + "{&searchBy,limit}");
+			@Test
+			void shoulHaveDownloadTokenLink() {
+				var model = controller.getRootResource();
+
+				assertThat(model.getLink(RootController.REL_DOWNLOAD_TOKEN)).isPresent().get().extracting(Link::getHref)
+						.isEqualTo("/api/downloadtoken");
+			}
 		}
 
-		@Test
-		void shoulHaveDownloadTokenLink() {
-			var model = controller.getRootResource();
+		@DisplayName("with no role")
+		@Nested
+		class TestWithNoRole {
+
+			@BeforeEach
+			void mockCurrentUserService() {
+				when(currentUserService.hasRole(anyString())).thenReturn(false);
+			}
+
+			@Test
+			void shouldHaveNoLinkAtAll() {
+				var model = controller.getRootResource();
 
-			assertThat(model.getLink(RootController.REL_DOWNLOAD_TOKEN)).isPresent().get().extracting(Link::getHref)
-					.isEqualTo("/api/downloadtoken");
+				assertThat(model.getLinks()).isEmpty();
+			}
 		}
 	}
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java
index 68298120a8b3c8725f65488b6849f024a2fe0f38..50885feffbd1c88f245154f41d16db71bafec558 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/SecurityTestFactory.java
@@ -1,6 +1,7 @@
 package de.itvsh.goofy;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -14,4 +15,5 @@ public class SecurityTestFactory {
 	static final String USER_LASTNAME = "Tester";
 	static final String ROLE = "Testrolle";
 	static final List<SimpleGrantedAuthority> AUTHORITIES = Arrays.asList(new SimpleGrantedAuthority(ROLE));
+	static final Collection<String> ORGANSIATIONSEINHEIT_IDS = List.of("812546");
 }
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java
index ae80e2f1ae22fdfc26ec5d288f295e65c60bda8f..6a3331f7260afc7f02743a60723632df1e8333d6 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/ContextServiceTest.java
@@ -7,6 +7,7 @@ import static org.mockito.Mockito.*;
 import java.util.Collection;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -22,6 +23,7 @@ import de.itvsh.goofy.RequestAttributes;
 import de.itvsh.goofy.RequestAttributesTestFactory;
 import de.itvsh.goofy.common.GrpcUtil;
 import de.itvsh.goofy.common.user.CurrentUserService;
+import de.itvsh.goofy.common.user.UserRole;
 import de.itvsh.goofy.common.user.UserTestFactory;
 import de.itvsh.ozg.pluto.grpc.command.GrpcUser;
 
@@ -45,6 +47,7 @@ class ContextServiceTest {
 		when(userService.getUser()).thenReturn(UserTestFactory.create());
 	}
 
+	@DisplayName("Get context metas")
 	@Nested
 	class TestGetContextMetas {
 
@@ -83,25 +86,36 @@ class ContextServiceTest {
 					.contains(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID, "orgaid_2");
 		}
 
+		@DisplayName("access limited")
 		@Nested
-		class CheckAccessByUserRole {
+		class TestAccessLimitedByUserRole {
 
 			@Test
-			void shouldHaveCheckIsNecessaryTrueOnRoleVerwaltungPoststelle() {
-				when(userService.hasRole(anyString())).thenReturn(Boolean.TRUE);
+			void shouldHaveTrueOnRoleVerwaltungUser() {
+				when(userService.hasRole(anyString())).thenReturn(Boolean.FALSE);
 
 				var metadata = service.buildCallContextMetadata();
 
-				assertThat(GrpcUtil.getFromHeaders(KEY_ORGAID_CHECK_NECESSARY, metadata)).isEqualTo(Boolean.FALSE.toString());
+				assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.TRUE.toString());
 			}
 
 			@Test
-			void shouldHaveCheckIsNecessaryFalseOnNoRoleVerwaltungPoststelle() {
-				when(userService.hasRole(anyString())).thenReturn(Boolean.FALSE);
+			void shouldHaveFalseOnRoleVerwaltungPoststelle() {
+				when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(Boolean.TRUE);
+
+				var metadata = service.buildCallContextMetadata();
+
+				assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.FALSE.toString());
+			}
+
+			@Test
+			void shouldHaveFalseOnRoleEinheitlicherAnsprechpartner() {
+				when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(Boolean.FALSE);
+				when(userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)).thenReturn(Boolean.TRUE);
 
 				var metadata = service.buildCallContextMetadata();
 
-				assertThat(GrpcUtil.getFromHeaders(KEY_ORGAID_CHECK_NECESSARY, metadata)).isEqualTo(Boolean.TRUE.toString());
+				assertThat(GrpcUtil.getFromHeaders(KEY_ACCESS_LIMITED, metadata)).isEqualTo(Boolean.FALSE.toString());
 			}
 		}
 	}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java
index 89c4004a925bfbe95f29bce96367f38fb174c470..13d0d22456f477f570a97c73bc50e1991d947272 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java
@@ -1,16 +1,22 @@
 package de.itvsh.goofy.common.command;
 
-import static org.assertj.core.api.Assertions.*;
-
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Spy;
+
+import static org.assertj.core.api.Assertions.*;
 
 import de.itvsh.goofy.common.binaryfile.BinaryFileTestFactory;
+import de.itvsh.goofy.postfach.PostfachMailTestFactory;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
 import de.itvsh.goofy.wiedervorlage.WiedervorlageTestFactory;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBody;
@@ -21,8 +27,51 @@ class CommandBodyMapperTest {
 	private static final String FIELD = "FIELD";
 	private static final String VALUE = "VALUE";
 
+	@Spy
 	private CommandBodyMapper mapper = Mappers.getMapper(CommandBodyMapper.class);
 
+	@DisplayName("Map from object to map")
+	@Nested
+	class TestFromObjectToMap {
+
+		@Test
+		void shouldMapAllFieldsExceptClass() {
+			var commandAsObject = CommandTestFactory.create();
+
+			var mappedMap = mapper.fromObjectToMap(commandAsObject);
+
+			assertThat(mappedMap).hasSize(5).doesNotContainKey("class");
+		}
+
+		@Test
+		void shouldNotMapNullValue() {
+			var commandAsObject = CommandTestFactory.createBuilder().status(null).build();
+
+			var mappedMap = mapper.fromObjectToMap(commandAsObject);
+
+			assertThat(mappedMap)
+					.hasSize(4)
+					.doesNotContainKey("status")
+					.containsEntry("order", CommandTestFactory.ORDER.name())
+					.containsEntry("relationId", CommandTestFactory.RELATION_ID)
+					.containsEntry("vorgangId", CommandTestFactory.VORGANG_ID);
+		}
+
+		@Test
+		void shouldMapAllValues() {
+			var commandAsObject = CommandTestFactory.create();
+
+			var mappedMap = mapper.fromObjectToMap(commandAsObject);
+
+			assertThat(mappedMap)
+					.hasSize(5)
+					.containsEntry("status", CommandTestFactory.STATUS.name())
+					.containsEntry("order", CommandTestFactory.ORDER.name())
+					.containsEntry("relationId", CommandTestFactory.RELATION_ID)
+					.containsEntry("vorgangId", CommandTestFactory.VORGANG_ID);
+		}
+	}
+
 	@Nested
 	class TestMapToBody {
 		@Test
@@ -62,6 +111,10 @@ class CommandBodyMapperTest {
 
 	@Nested
 	class TestMapToBodyFields {
+
+		@Captor
+		private ArgumentCaptor<Map<Object, Object>> mapCaptor;
+
 		@Test
 		void shouldReturnEmptyListOnNull() {
 			var result = mapper.mapToBodyFields((CommandBody) null);
@@ -69,6 +122,20 @@ class CommandBodyMapperTest {
 			assertThat(result).isEmpty();
 		}
 
+		@Test
+		void shouldContainFields() {
+			var fieldList = mapper.mapToBodyFields(PostfachMailTestFactory.create());
+
+			assertThat(fieldList).hasSize(13);
+		}
+
+		@Test
+		void shouldNOTContainClassEntry() {
+			var fieldList = mapper.mapToBodyFields(PostfachMailTestFactory.create());
+
+			assertThat(fieldList).isNotEmpty().allMatch(field -> !StringUtils.equals(field.getName(), "class"));
+		}
+
 		@Test
 		void shouldReturnField() {
 			var result = mapper.mapToBodyFields(buildBodyMap());
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java
index bc28c4d6a83a72d6ff9e8ec8009bdf2aafbee2ec..1d701b2269b468c4d63d4a3f13309c47d7e930af 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java
@@ -1,7 +1,6 @@
 package de.itvsh.goofy.common.command;
 
 import static de.itvsh.goofy.common.command.CommandController.*;
-import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -17,16 +16,20 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Spy;
 import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import static org.assertj.core.api.Assertions.*;
+
+import de.itvsh.goofy.common.binaryfile.FileId;
 import de.itvsh.goofy.common.command.CommandController.CommandByRelationController;
 import de.itvsh.goofy.common.errorhandling.ExceptionController;
 import de.itvsh.goofy.postfach.PostfachMail;
-import de.itvsh.goofy.postfach.PostfachMailController;
 import de.itvsh.goofy.postfach.PostfachMailTestFactory;
+import de.itvsh.goofy.vorgang.AntragstellerTestFactory;
 import de.itvsh.goofy.vorgang.VorgangController;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
 import de.itvsh.goofy.vorgang.VorgangWithEingangTestFactory;
@@ -40,8 +43,6 @@ class CommandControllerTest {
 	private CommandService service;
 	@Mock
 	private CommandModelAssembler modelAssembler;
-	@Mock
-	private VorgangController vorgangController;
 
 	private MockMvc mockMvc;
 
@@ -119,6 +120,7 @@ class CommandControllerTest {
 	@Nested
 	class TestCommandByRelationController {
 
+		@Spy
 		@InjectMocks // NOSONAR
 		private CommandByRelationController controller;
 		@Mock
@@ -127,8 +129,6 @@ class CommandControllerTest {
 		private CommandModelAssembler modelAssembler;
 		@Mock
 		private VorgangController vorgangController;
-		@Mock
-		private PostfachMailController postfachController;
 
 		private MockMvc mockMvc;
 
@@ -175,35 +175,13 @@ class CommandControllerTest {
 			@DisplayName("CreateCommand with postfach mail")
 			class WithPostfachMail {
 
-				@BeforeEach
-				void mockVorgangController() {
-					when(vorgangController.getVorgang(anyString())).thenReturn(VorgangWithEingangTestFactory.create());
-				}
-
 				@Test
-				void shouldHavePostfachMail() throws Exception {
-					doRequest(PostfachMailTestFactory.buildSendPostfachMailContent());
+				void shouldPrepareForPostfachNachricht() throws Exception {
+					doReturn(CommandTestFactory.createCreateCommand()).when(controller).prepareCommandForPostfachNachricht(any(), any());
 
-					verify(service).createCommand(createCommandCaptor.capture(), anyLong());
-					assertThat(createCommandCaptor.getValue()).extracting(CreateCommand::getBody).usingRecursiveComparison()
-							.ignoringFields("id", "vorgangId", "postfachId", "createdAt", "createdBy", "direction", "sentAt", "sentSuccessful",
-									"messageCode",
-									"attachments") // TODO remove this when sending attachments
-							.isEqualTo(PostfachMailTestFactory.create());
-				}
-
-				@Test
-				void shouldCallVorgangController() throws Exception {
 					doRequest(PostfachMailTestFactory.buildSendPostfachMailContent());
 
-					verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
-				}
-
-				@Test
-				void shouldCallPostfachController() throws Exception {
-					doRequest(PostfachMailTestFactory.buildSendPostfachMailContent());
-
-					verify(postfachController).sendPostfachMail(anyString(), any(PostfachMail.class));
+					verify(controller).prepareCommandForPostfachNachricht(any(), eq(VorgangHeaderTestFactory.ID));
 				}
 			}
 
@@ -223,6 +201,53 @@ class CommandControllerTest {
 			}
 		}
 
+		@Nested
+		class TestPrepareCommandForPostfachNachricht {
+
+			@BeforeEach
+			void mockVorgangController() {
+				when(vorgangController.getVorgang(anyString())).thenReturn(VorgangWithEingangTestFactory.create());
+			}
+
+			@Test
+			void shouldCallVorgangController() {
+				controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(),
+						VorgangHeaderTestFactory.ID);
+
+				verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
+			}
+
+			@Test
+			void shouldMapAttachments() {
+				var preparedCommand = controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(), VorgangHeaderTestFactory.ID);
+
+				assertThat(((PostfachMail) preparedCommand.getBody()).getAttachments()).contains(FileId.from(PostfachMailTestFactory.ID));
+			}
+
+			@Test
+			void shouldAddPostfachId() {
+				var preparedCommand = controller.prepareCommandForPostfachNachricht(createPostfachCreateCommand(), VorgangHeaderTestFactory.ID);
+
+				assertThat(((PostfachMail) preparedCommand.getBody()).getPostfachId()).isEqualTo(AntragstellerTestFactory.POSTFACH_ID);
+			}
+
+			@Test
+			void shouldProceedWithEmptyAttachments() {
+				var createCommand = CommandTestFactory.createCreateCommandBuilder()
+						.body(PostfachMailTestFactory.createBuilder().clearAttachments().build()).build();
+
+				var preparedCommand = controller.prepareCommandForPostfachNachricht(createCommand, VorgangHeaderTestFactory.ID);
+
+				assertThat(((PostfachMail) preparedCommand.getBody()).getAttachments()).isEmpty();
+			}
+
+			private CreateCommand createPostfachCreateCommand() {
+				var postfachNachricht = PostfachMailTestFactory.createBuilder().clearAttachments()
+						.attachment(FileId.from("api/resource/" + PostfachMailTestFactory.ID)).build();
+				return CommandTestFactory.createCreateCommandBuilder().body(postfachNachricht).build();
+			}
+		}
+
 		@Nested
 		class CreateByVorgangAndItemName {
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..10ef5468a4fb0ddebedfd17aae38d5da074da314
--- /dev/null
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandMapperTest.java
@@ -0,0 +1,41 @@
+package de.itvsh.goofy.common.command;
+
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import static org.assertj.core.api.Assertions.*;
+
+import de.itvsh.goofy.common.TimeMapper;
+import de.itvsh.goofy.common.callcontext.CallContextMapper;
+import de.itvsh.goofy.common.user.UserIdMapper;
+import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper;
+import de.itvsh.ozg.pluto.grpc.command.GrpcOrder;
+
+class CommandMapperTest {
+
+	@InjectMocks
+	private CommandMapper mapper = Mappers.getMapper(CommandMapper.class);
+	@Mock
+	private UserIdMapper userIdMapper;
+	@Mock
+	private GrpcObjectMapper grpcObjectMapper;
+	@Mock
+	private CommandBodyMapper bodyMapper;
+	@Mock
+	private TimeMapper timeMapper;
+	@Mock
+	private CallContextMapper callContextMapper;
+
+	@Test
+	void shouldMapNonEnumOrder() {
+		var command = mapper.toCommand(GrpcCommandTestFactory.createBuilder()
+				.setOrder(GrpcOrder.UNDEFINED)
+				.setOrderString(CommandOrder.SEND_POSTFACH_NACHRICHT.name())
+				.build());
+
+		assertThat(command.getOrder()).isEqualTo(CommandOrder.SEND_POSTFACH_NACHRICHT);
+	}
+
+}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java
index 095cd13ee643f93b18fd3669b01818566b0610ec..60795b04bf34f24b95dd21b33faee21bad70d6bd 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandModelAssemblerTest.java
@@ -2,7 +2,6 @@ package de.itvsh.goofy.common.command;
 
 import static de.itvsh.goofy.common.command.CommandModelAssembler.*;
 import static de.itvsh.goofy.common.command.CommandTestFactory.*;
-import static org.assertj.core.api.Assertions.*;
 
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -15,6 +14,8 @@ import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.IanaLinkRelations;
 import org.springframework.hateoas.Link;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
 
 class CommandModelAssemblerTest {
@@ -160,7 +161,8 @@ class CommandModelAssemblerTest {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "CREATE_WIEDERVORLAGE", "WIEDERVORLAGE_ERLEDIGEN", "EDIT_WIEDERVORLAGE",
 				"WIEDERVORLAGE_WIEDEREROEFFNEN", "CREATE_KOMMENTAR", "EDIT_KOMMENTAR", "REDIRECT_VORGANG", "FORWARD_SUCCESSFULL",
-				"FORWARD_FAILED", "ASSIGN_USER", "SEND_POSTFACH_MAIL", "RESEND_POSTFACH_MAIL", "CREATE_ATTACHED_ITEM", "UPDATE_ATTACHED_ITEM" })
+				"FORWARD_FAILED", "ASSIGN_USER", "SEND_POSTFACH_MAIL", "SEND_POSTFACH_NACHRICHT", "RESEND_POSTFACH_MAIL", "CREATE_ATTACHED_ITEM",
+				"UPDATE_ATTACHED_ITEM" })
 		void shouldHaveLink(CommandOrder order) {
 			var model = toModelWithOrder(order);
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java
index e187d76d1f402fba6bf262698365cf77221854c4..3b9794b4c12d1a7d2d96c35e805e0c758b02c2b6 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java
@@ -1,6 +1,5 @@
 package de.itvsh.goofy.common.command;
 
-import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
@@ -23,10 +22,13 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.common.callcontext.ContextService;
 import de.itvsh.goofy.vorgang.RedirectRequestTestFactory;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
 import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper;
+import de.itvsh.kop.pluto.common.grpc.GrpcObjectTestFactory;
 import de.itvsh.ozg.pluto.common.GrpcObject;
 import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext;
@@ -111,6 +113,7 @@ class CommandRemoteServiceTest {
 			@BeforeEach
 			void initTest() {
 				when(contextService.createCallContext()).thenReturn(grpcCallContext);
+				when(grpcObjectMapper.fromMap(any())).thenReturn(GrpcObjectTestFactory.create());
 			}
 
 			@Test
@@ -124,7 +127,7 @@ class CommandRemoteServiceTest {
 			void shouldHaveOrder() {
 				var request = buildRequest();
 
-				assertThat(request.getOrder().name()).isEqualTo(CommandTestFactory.ORDER.name());
+				assertThat(request.getOrderString()).isEqualTo(CommandTestFactory.ORDER.name());
 			}
 
 			@Test
@@ -148,6 +151,20 @@ class CommandRemoteServiceTest {
 				assertThat(request.getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID);
 			}
 
+			@Test
+			void shouldCallBodyMapper() {
+				buildRequest();
+
+				verify(bodyMapper).fromObjectToMap(any(CommandBody.class));
+			}
+
+			@Test
+			void shouldCallObjectMapper() {
+				buildRequest();
+
+				verify(grpcObjectMapper).fromMap(any());
+			}
+
 			@Test
 			void shouldHaveVersion() {
 				var request = buildRequest();
@@ -171,11 +188,13 @@ class CommandRemoteServiceTest {
 				var request = service.buildCreateCommandRequest(CommandTestFactory.createCreateCommandBuilder().order(order).build(),
 						CommandTestFactory.VERSION);
 
-				assertThat(request.getOrder()).hasToString(order.name());
+				assertThat(request.getOrderString()).isEqualTo(order.name());
 			}
 
 			private GrpcCreateCommandRequest buildRequest() {
-				return service.buildCreateCommandRequest(CommandTestFactory.createCreateCommand(), CommandTestFactory.VERSION);
+				return service.buildCreateCommandRequest(
+						CommandTestFactory.createCreateCommandBuilder().body(RedirectRequestTestFactory.create()).build(),
+						CommandTestFactory.VERSION);
 			}
 		}
 	}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java
index e974fd071f39dfc6e8366f5455690ee5225a9b92..37a52409f588d74043237f56d6f997923fe1ce45 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/GrpcCommandTestFactory.java
@@ -4,15 +4,28 @@ import java.util.UUID;
 
 import de.itvsh.goofy.common.GrpcCallContextTestFactory;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext;
+import de.itvsh.ozg.pluto.grpc.command.GrpcCommand;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest;
 import de.itvsh.ozg.pluto.grpc.command.GrpcOrder;
 
 public class GrpcCommandTestFactory {
 
 	private static final String RELATION_ID = UUID.randomUUID().toString();
+	private static final CommandStatus STATUS = CommandStatus.PENDING;
 	private static final GrpcOrder ORDER = GrpcOrder.RESEND_POSTFACH_MAIL;
 	private static final GrpcCallContext CALL_CONTEXT = GrpcCallContextTestFactory.create();
 
+	public static GrpcCommand create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcCommand.Builder createBuilder() {
+		return GrpcCommand.newBuilder()
+				.setStatus(STATUS.name())
+				.setRelationId(RELATION_ID)
+				.setOrder(ORDER);
+	}
+
 	public static GrpcCreateCommandRequest createCommandRequest() {
 		return createCommandRequestBuilder().build();
 	}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
index 260ec0db0d19212af471df04315e95f3d70adee9..479e63fb7804e00e7f792bea1c96fdcc2f77f372 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java
@@ -45,6 +45,17 @@ class DownloadTokenAuthenticationFilterITCase {
 		verify(filter).doFilterInternal(any(), any(), any());
 	}
 
+	@Test
+	void shouldCallFilterWhenNoOrganisationseinheitIds() throws Exception {
+		String token = DownloadTokenTestFactory.createTokenBuilder(downloadTokenProperties.getSecret(), downloadTokenProperties.getValidity())
+				.setClaims(DownloadTokenTestFactory.CLAIMS_WITHOUT_ORGANSIATIONSEINHEIT_IDS).compact();
+
+		performRequest(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token)
+				.andExpect(status().isOk());
+
+		verify(filter).doFilterInternal(any(), any(), any());
+	}
+
 	@Test
 	void shouldReturnUnauthorised() throws Exception {
 		String token = DownloadTokenTestFactory.createToken("badSecret", downloadTokenProperties.getValidity());
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java
index d5b9f9e614f9d18d40bb37f267c7cc53928e5e56..d15ad742cb3d2f1fe6b4ee2feff81bc641363e95 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenServiceTest.java
@@ -6,6 +6,8 @@ import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
 
 import javax.servlet.http.HttpServletRequest;
@@ -41,6 +43,7 @@ class DownloadTokenServiceTest {
 	private HttpServletResponse response;
 
 	private final static String FAKE_TOKEN = "xxx";
+	private final static Collection<String> ORGE_IDS = List.of("258994");
 
 	@Nested
 	class TestCreateToken {
@@ -99,10 +102,23 @@ class DownloadTokenServiceTest {
 			assertThat(user).isNotNull();
 		}
 
+		@Test
+		void shouldGetOrganisationseinheitIdsFromToken() {
+			mockClaims(FIRSTNAME_CLAIM, LASTNAME_CLAIM);
+
+			GoofyUser user = service.getUserFromToken(FAKE_TOKEN).getUser();
+
+			assertThat(user.getOrganisationseinheitIds()).isEqualTo(ORGE_IDS);
+		}
+
 		private void mockClaims(String firstnameClaim, String lastnameClaim) {
 			Claims claims = mock(Claims.class);
+
 			when(claims.get(FIRSTNAME_CLAIM, String.class)).thenReturn(firstnameClaim);
 			when(claims.get(LASTNAME_CLAIM, String.class)).thenReturn(lastnameClaim);
+			when(claims.get(USERID_CLAIM, String.class)).thenReturn(UserTestFactory.ID.toString());
+
+			when(jwtTokenUtil.getOrganisationseinheitIdsFromToken(any())).thenReturn(ORGE_IDS);
 			when(jwtTokenUtil.getAllClaimsFromToken(any())).thenReturn(Optional.of(claims));
 		}
 
@@ -119,6 +135,7 @@ class DownloadTokenServiceTest {
 
 			assertThrows(TechnicalException.class, () -> handleToken());
 		}
+
 	}
 
 	void handleToken() {
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java
index 884ec1e1d43a663e2219ae17a6ae7f88242f4752..d549a1e792b12848c51aeb2fa9cb47b074a2d7c5 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/downloadtoken/DownloadTokenTestFactory.java
@@ -2,6 +2,7 @@ package de.itvsh.goofy.common.downloadtoken;
 
 import static de.itvsh.goofy.JwtTokenUtil.*;
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -17,9 +18,15 @@ public class DownloadTokenTestFactory {
 	static final String SUBJECT = "subject";
 	static final String FIRSTNAME_CLAIM_VALUE = UserTestFactory.FIRSTNAME;
 	static final String LASTNAME_CLAIM_VALUE = UserTestFactory.LASTNAME;
+	final static Collection<String> ORGE_IDS = List.of("258994");
 	static final List<?> ROLE_CLAIM_VALUE = List.of();
 	static final long VALIDITY = 5000;
 	static final Map<String, Object> CLAIMS = new HashMap<>(Map.of(
+			FIRSTNAME_CLAIM, FIRSTNAME_CLAIM_VALUE,
+			LASTNAME_CLAIM, LASTNAME_CLAIM_VALUE,
+			ROLE_CLAIM, ROLE_CLAIM_VALUE,
+			ORGANSIATIONSEINHEIT_IDS_CLAIM, ORGE_IDS));
+	static final Map<String, Object> CLAIMS_WITHOUT_ORGANSIATIONSEINHEIT_IDS = new HashMap<>(Map.of(
 			FIRSTNAME_CLAIM, FIRSTNAME_CLAIM_VALUE,
 			LASTNAME_CLAIM, LASTNAME_CLAIM_VALUE,
 			ROLE_CLAIM, ROLE_CLAIM_VALUE));
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java
index 5698978fca53e1a27a1c11d99859c50781d82b0f..6cc924272be0a555cb5c7edd0911013be87f1ff0 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailControllerTest.java
@@ -1,6 +1,5 @@
 package de.itvsh.goofy.postfach;
 
-import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -21,8 +20,9 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.common.binaryfile.BinaryFileController;
-import de.itvsh.goofy.common.command.CommandTestFactory;
 import de.itvsh.goofy.vorgang.Antragsteller;
 import de.itvsh.goofy.vorgang.EingangTestFactory;
 import de.itvsh.goofy.vorgang.VorgangController;
@@ -50,19 +50,6 @@ class PostfachMailControllerTest {
 		mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
 	}
 
-	@Nested
-	class TestPostfachSendMessage {
-
-		final PostfachMail postfachMail = PostfachMailTestFactory.create();
-
-		@Test
-		void shouldCallService() {
-			controller.sendPostfachMail(CommandTestFactory.ID, postfachMail);
-
-			verify(service).sendPostfachMail(CommandTestFactory.ID, postfachMail);
-		}
-	}
-
 	@Nested
 	class TestPostfachMailGetAll {
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java
index 307738b87ea4cd29579b2845be5be1d0356e9bf6..06c76b268f59f851d66d840cf3e39e20ec3096bb 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailITCase.java
@@ -15,7 +15,6 @@ import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.util.ReflectionTestUtils;
 
 import de.itvsh.goofy.CallScope;
-import de.itvsh.goofy.common.command.CommandTestFactory;
 import de.itvsh.goofy.vorgang.EingangTestFactory;
 import de.itvsh.goofy.vorgang.VorgangController;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
@@ -45,19 +44,6 @@ public class PostfachMailITCase {
 		callScope.startScope();
 	}
 
-	@Nested
-	@WithMockUser
-	class TestSendeMail {
-
-		@Test
-		void shouldCallPostfachGrpc() throws InterruptedException {
-
-			controller.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.createLikeFromClient());
-
-			verify(serviceStub, after(2000)).sendPostfachMail(any());
-		}
-	}
-
 	@Nested
 	@WithMockUser
 	class TestGetAll {
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java
index b3b6db94568ed1eb142301e319d90736495d0709..100b7a73b6827e90dfd9af06f9aca36d7102f202 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailModelAssemblerTest.java
@@ -1,8 +1,7 @@
 package de.itvsh.goofy.postfach;
 
-import static org.assertj.core.api.Assertions.*;
-
 import java.util.Optional;
+import java.util.UUID;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.DisplayName;
@@ -14,6 +13,9 @@ import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.IanaLinkRelations;
 import org.springframework.hateoas.Link;
 
+import static org.assertj.core.api.Assertions.*;
+
+import de.itvsh.goofy.common.user.UserId;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
 
 class PostfachMailModelAssemblerTest {
@@ -78,6 +80,37 @@ class PostfachMailModelAssemblerTest {
 			}
 		}
 
+		@DisplayName("created by link")
+		@Nested
+		class TestCreatedByLink {
+
+			@Test
+			void shouldBePresent() {
+				var link = modelAssembler.toModel(PostfachMailTestFactory.create()).getLink(PostfachMailModelAssembler.REL_CREATED_BY);
+
+				assertThat(link).isPresent().get().extracting(Link::getHref)
+						.isEqualTo("/api/userProfiles/" + PostfachMailTestFactory.CREATED_BY);
+			}
+
+			@DisplayName("should not be present if the value of createdBy starts with 'system'")
+			@Test
+			void shouldNOTBePresentOnSystemUser() {
+				var link = modelAssembler
+						.toModel(PostfachMailTestFactory.createBuilder()
+								.createdBy(UserId.from(PostfachMailModelAssembler.SYSTEM_USER_IDENTIFIER + UUID.randomUUID().toString())).build())
+						.getLink(PostfachMailModelAssembler.REL_CREATED_BY);
+
+				assertThat(link).isNotPresent();
+			}
+
+			@Test
+			void shouldNotBePresentOnNull() {
+				var link = modelAssembler.toModel(PostfachMailTestFactory.createBuilder().createdBy(null).build())
+						.getLink(PostfachMailModelAssembler.REL_CREATED_BY);
+
+				assertThat(link).isNotPresent();
+			}
+		}
 	}
 
 	@Nested
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java
index fbf48356fa253c97dd4be99dca7630c4aca42cef..ca147f87a6f8d404da513aeb75ade4785f2c80ef 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailRemoteServiceTest.java
@@ -1,6 +1,5 @@
 package de.itvsh.goofy.postfach;
 
-import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
@@ -15,6 +14,8 @@ import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.common.callcontext.ContextService;
 import de.itvsh.goofy.common.command.CommandTestFactory;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
@@ -24,7 +25,6 @@ import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredRequest;
 import de.itvsh.ozg.mail.postfach.GrpcIsPostfachConfiguredResponse;
 import de.itvsh.ozg.mail.postfach.GrpcPostfachMail;
 import de.itvsh.ozg.mail.postfach.GrpcResendPostfachMailRequest;
-import de.itvsh.ozg.mail.postfach.GrpcSendPostfachMailRequest;
 import de.itvsh.ozg.mail.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext;
 
@@ -46,50 +46,6 @@ class PostfachMailRemoteServiceTest {
 		when(contextService.createCallContext()).thenReturn(callContext);
 	}
 
-	@Nested
-	class TestSendPostfachMail {
-
-		private GrpcPostfachMail postfachMail = GrpcPostfachMail.newBuilder().setPostfachId("42").build();
-
-		@Captor
-		private ArgumentCaptor<GrpcSendPostfachMailRequest> requestCaptor;
-
-		@BeforeEach
-		void initMocks() {
-			when(postfachNachrichtMapper.toGrpcPostfachMail(any())).thenReturn(postfachMail);
-		}
-
-		@Test
-		void shouldCallStub() {
-			service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create());
-
-			verify(serviceStub).sendPostfachMail(any(GrpcSendPostfachMailRequest.class));
-		}
-
-		@Test
-		void shouldCallCallContextService() {
-			service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create());
-
-			verify(contextService).createCallContext();
-		}
-
-		@Test
-		void shouldCallMapper() {
-			service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create());
-
-			verify(postfachNachrichtMapper).toGrpcPostfachMail(any(PostfachMail.class));
-		}
-
-		@Test
-		void shouldAddAttachments() {
-			service.sendPostfachMail(CommandTestFactory.ID, PostfachMailTestFactory.create());
-
-			verify(serviceStub).sendPostfachMail(requestCaptor.capture());
-			assertThat(requestCaptor.getValue().getMail().getAttachmentList()).hasSize(1);
-			assertThat(requestCaptor.getValue().getMail().getAttachmentList().get(0)).isEqualTo(PostfachMailTestFactory.ATTACHMENT.toString());
-		}
-	}
-
 	@Nested
 	class TestFindPostfachMail {
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java
index 5690e5c2819effd6bd3cc76ba1aeb034e40fb96d..4e14e58beb7119298c477c241417a81cf375a985 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailServiceTest.java
@@ -1,6 +1,5 @@
 package de.itvsh.goofy.postfach;
 
-import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
@@ -14,6 +13,8 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
+import static org.assertj.core.api.Assertions.*;
+
 import de.itvsh.goofy.common.command.CommandTestFactory;
 import de.itvsh.goofy.common.errorhandling.ResourceNotFoundException;
 import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory;
@@ -25,19 +26,6 @@ class PostfachMailServiceTest {
 	@Mock
 	private PostfachMailRemoteService remoteService;
 
-	@Nested
-	class TestSendPostfachMail {
-
-		final PostfachMail postfachMail = PostfachMailTestFactory.create();
-
-		@Test
-		void shouldCallRemoteService() {
-			service.sendPostfachMail(CommandTestFactory.ID, postfachMail);
-
-			verify(remoteService).sendPostfachMail(CommandTestFactory.ID, postfachMail);
-		}
-	}
-
 	@Nested
 	class TestGetAll {
 
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java
index fa99f37a3203f8a084d68ba29457f4e7ac2d9e03..bea7a39b6ed1b1679fde1f939ba50e3af2b06a95 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailTestFactory.java
@@ -72,10 +72,15 @@ public class PostfachMailTestFactory {
 	}
 
 	public static String buildSendPostfachMailContent(PostfachMail postfachMail) {
-		return TestUtils.loadTextFile("jsonTemplates/command/createCommandWithPostfachMail.json.tmpl", CommandOrder.SEND_POSTFACH_MAIL.name(),
+		return buildSendPostfachMailContent(postfachMail, CommandOrder.SEND_POSTFACH_NACHRICHT);
+	}
+
+	public static String buildSendPostfachMailContent(PostfachMail postfachMail, CommandOrder order) {
+		return TestUtils.loadTextFile("jsonTemplates/command/createCommandWithPostfachMail.json.tmpl", order.name(),
 				postfachMail.getReplyOption().name(),
 				TestUtils.addQuote(postfachMail.getSubject()),
-				TestUtils.addQuote(postfachMail.getMailBody()));
+				TestUtils.addQuote(postfachMail.getMailBody()),
+				postfachMail.getAttachments().get(0).toString());
 	}
 
 	public static String buildResendPostfachMailContent() {
diff --git a/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl b/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl
index 48616ee6e0851973aca270eeaf5cd3abc864081c..1481e0b8af4c3810e80c70855a01bab4351b59b8 100644
--- a/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl
+++ b/goofy-server/src/test/resources/jsonTemplates/command/createCommandWithPostfachMail.json.tmpl
@@ -3,6 +3,7 @@
 	"body": {
 		"replyOption": "%s",
 		"subject": %s,
-		"mailBody": %s
+		"mailBody": %s,
+		"attachments": ["%s"]
 	}
 }
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8f2380ad5b37a33247b8a51bcc4724c841cd689f..d777589e440e5c9b114b123c98bd5de9706b6a01 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-parent</artifactId>
-		<version>1.1.1-SNAPSHOT</version>
+		<version>1.1.3-SNAPSHOT</version>
 	</parent>
 
 	<modules>
@@ -24,7 +24,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
-		<pluto.version>0.25.0</pluto.version>
+		<pluto.version>0.26.0-SNAPSHOT</pluto.version>
 	</properties>
 
 	<dependencyManagement>