diff --git a/ozgcloud-elasticsearch-operator/src/main/resources/log4j2.xml b/ozgcloud-elasticsearch-operator/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..93213f612c66446c316d8c6adcfcec3a90b738a8
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/main/resources/log4j2.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+	<Appenders>
+		<Console name="LogInJSON" target="SYSTEM_OUT">
+			<!-- <JsonLayout compact="true" properties="true" eventEol="true"></JsonLayout> -->
+			<JsonTemplateLayout
+				eventTemplateUri="classpath:EcsLayout.json" 
+				maxStringLength="65536" />
+		</Console>
+	</Appenders>
+
+	<Loggers>
+		<Root level="INFO">
+			<appender-ref ref="LogInJSON" />
+		</Root>
+	</Loggers>
+</configuration>
\ No newline at end of file
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
index dc3e333e5b42269e4cfe2ec8a00418b676ef595b..7edc208537aec1d2afa2817c60ab98cb8eebb61f 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -69,10 +69,10 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 			LOG.info("keep data");
 			return DeleteControl.defaultDelete();
 		}
-		return cleanup(realm);
+		return deleteRealm(realm);
 	}
 
-	DeleteControl cleanup(OzgCloudKeycloakRealm realm) {
+	DeleteControl deleteRealm(OzgCloudKeycloakRealm realm) {
 		var realmName = realm.getMetadata().getNamespace();
 		LOG.info("{} do cleanup...", realmName);
 		try {
@@ -80,7 +80,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 			return DeleteControl.defaultDelete();
 		} catch (Exception e) {
 			LOG.warn(realmName + " could not delete.", e);
-			return DeleteControl.defaultDelete();
+			return DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR);
 		}
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
index 6470b4e9c9d664629b23c18b2cbea9694f338cf5..6d157e2ddd8d61ae3a2cad45029659417d62a7f9 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
@@ -88,10 +88,10 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 			LOG.info("keep data");
 			return DeleteControl.defaultDelete();
 		}
-		return cleanup(user);
+		return deleteUser(user);
 	}
 
-	DeleteControl cleanup(OzgCloudKeycloakUser user) {
+	DeleteControl deleteUser(OzgCloudKeycloakUser user) {
 		var userName = user.getMetadata().getName();
 		var namespace = user.getMetadata().getNamespace();
 		LOG.info("{} do cleanup...", userName);
@@ -100,7 +100,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 			return DeleteControl.defaultDelete();
 		} catch (Exception e) {
 			LOG.warn(userName + " could not delete user in namespace " + namespace, e);
-			return DeleteControl.defaultDelete();
+			return DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR);
 		}
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/resources/log4j2.xml b/ozgcloud-keycloak-operator/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..93213f612c66446c316d8c6adcfcec3a90b738a8
--- /dev/null
+++ b/ozgcloud-keycloak-operator/src/main/resources/log4j2.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+	<Appenders>
+		<Console name="LogInJSON" target="SYSTEM_OUT">
+			<!-- <JsonLayout compact="true" properties="true" eventEol="true"></JsonLayout> -->
+			<JsonTemplateLayout
+				eventTemplateUri="classpath:EcsLayout.json" 
+				maxStringLength="65536" />
+		</Console>
+	</Appenders>
+
+	<Loggers>
+		<Root level="INFO">
+			<appender-ref ref="LogInJSON" />
+		</Root>
+	</Loggers>
+</configuration>
\ No newline at end of file
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
index bdcffd897a0df6b6e0f81b27a332d28922ae2d44..510b314521a42509b33fcb971fa15e3a6e53963b 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
@@ -33,6 +33,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.operator.Config;
 import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
 import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 
@@ -73,9 +74,9 @@ class KeycloakRealmReconcilerTest {
 		}
 	}
 
-	@DisplayName("Cleanup")
+	@DisplayName("Reconciler Cleanup")
 	@Nested
-	class TestCleanup {
+	class TestReconcilerCleanup {
 
 		@DisplayName("with keep_after_delete")
 		@Nested
@@ -99,13 +100,60 @@ class KeycloakRealmReconcilerTest {
 			}
 		}
 
-		@Test
-		void shouldCallServiceDelete() {
-			var realm = OzgCloudKeycloakRealmTestFactory.create();
+		@DisplayName("test cleanup")
+		@Nested
+		class TestCleanup {
+
+			private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create();
+
+			@Test
+			void shouldCallDeleteRealm() {
+				reconciler.cleanup(realm, null);
+
+				verify(reconciler).deleteRealm(realm);
+			}
+
+			@Test
+			void shouldReturnValueFromDeleteUser() {
+				DeleteControl expected = DeleteControl.defaultDelete();
+				when(reconciler.deleteRealm(realm)).thenReturn(expected);
+
+				DeleteControl response = reconciler.cleanup(realm, null);
+
+				assertThat(response).isEqualTo(expected);
+			}
+		}
+
+		@DisplayName("test delete")
+		@Nested
+		class TestDelete {
+
+			private final OzgCloudKeycloakRealm realm = OzgCloudKeycloakRealmTestFactory.create();
+
+			@Test
+			void shouldCallServiceDelete() {
+				reconciler.deleteRealm(realm);
 
-			reconciler.cleanup(realm);
+				verify(service).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
+			}
+
+			@Test
+			void shouldReturnDeleteControl() {
+				var control = reconciler.deleteRealm(realm);
 
-			verify(service).deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
+				assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete());
+			}
+
+			@Test
+			void shouldRescheduleOnError() {
+				doThrow(RuntimeException.class).when(service)
+						.deleteRealm(OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
+
+				var control = reconciler.deleteRealm(realm);
+
+				assertThat(control).usingRecursiveComparison()
+						.isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR));
+			}
 		}
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
index e22f7b0622e507c963a4770a126d856972a69a5a..b96bcf8cb8d50dad6f763130a8dd3415b7f2e021 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconcilerTest.java
@@ -37,7 +37,9 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.operator.Config;
 import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
+import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmTestFactory;
 import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecUser;
 import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 
@@ -96,9 +98,9 @@ class KeycloakUserReconcilerTest {
 		}
 	}
 
-	@DisplayName("Cleanup")
+	@DisplayName("Reconciler Cleanup")
 	@Nested
-	class TestCleanup {
+	class TestReconcilerCleanup {
 
 		@DisplayName("with keep_after_delete")
 		@Nested
@@ -124,13 +126,61 @@ class KeycloakUserReconcilerTest {
 			}
 		}
 
-		@Test
-		void shouldCallServiceDelete() {
-			var user = OzgCloudKeycloakUserTestFactory.create();
+		@DisplayName("test cleanup")
+		@Nested
+		class TestCleanup {
+
+			private final OzgCloudKeycloakUser user = OzgCloudKeycloakUserTestFactory.create();
+
+			@Test
+			void shouldCallDeleteUser() {
+				reconciler.cleanup(user, null);
+
+				verify(reconciler).deleteUser(user);
+			}
+
+			@Test
+			void shouldReturnValueFromDeleteUser() {
+				DeleteControl expected = DeleteControl.defaultDelete();
+				when(reconciler.deleteUser(user)).thenReturn(expected);
+
+				DeleteControl response = reconciler.cleanup(user, null);
+
+				assertThat(response).isEqualTo(expected);
+			}
+		}
+
+		@DisplayName("test delete")
+		@Nested
+		class TestDeleteUser {
 
-			reconciler.cleanup(user);
+			private final OzgCloudKeycloakUser user = OzgCloudKeycloakUserTestFactory.create();
+
+			@Test
+			void shouldCallServiceDelete() {
+				reconciler.deleteUser(user);
+
+				verify(service).deleteUser(user.getSpec(), OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE);
+			}
+
+			@Test
+			void shouldReturnDeleteControl() {
+				var control = reconciler.deleteUser(user);
+
+				assertThat(control).usingRecursiveComparison().isEqualTo(DeleteControl.defaultDelete());
+			}
+
+			@Test
+			void shouldRescheduleOnError() {
+				doThrow(RuntimeException.class).when(service)
+						.deleteUser(user.getSpec(), OzgCloudKeycloakRealmTestFactory.METADATA_NAMESPACE);
+
+				var control = reconciler.cleanup(user, null);
+
+				assertThat(control).usingRecursiveComparison()
+						.isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR));
+			}
 
-			verify(service).deleteUser(user.getSpec(), OzgCloudKeycloakUserTestFactory.METADATA_NAMESPACE);
 		}
 	}
 }