diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
index 7cf22057645a2e910a15da4507dde7a27c80c919..a576ebaaf7af152b87607dd924965f3e44a419e2 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -26,9 +26,12 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl
 	public UpdateControl<OzgKeycloakRealm> reconcile(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) {
 
 		try {
-			log.info("Create KeycloakRealm " + resource.getMetadata().getName());
 
-			service.createRealm(resource.getSpec(), resource.getMetadata().getNamespace());
+			String realmName = resource.getMetadata().getNamespace();
+
+			log.info("Create KeycloakRealm " + realmName + " (crd name " + resource.getMetadata().getName() + ")");
+
+			service.createRealm(resource.getSpec(), realmName);
 
 			resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.OK).errorMessage(null).build());
 			return UpdateControl.updateStatus(resource);
@@ -43,7 +46,21 @@ public class KeycloakRealmReconciler implements Reconciler<OzgKeycloakRealm>, Cl
 
 	@Override
 	public DeleteControl cleanup(OzgKeycloakRealm resource, Context<OzgKeycloakRealm> context) {
-		// TODO Auto-generated method stub
-		return null;
+
+		String realmName = resource.getMetadata().getNamespace();
+
+		try {
+
+			log.info("Deleting KeycloakRealm " + realmName);
+
+			service.deleteRealm(realmName);
+
+			return DeleteControl.defaultDelete();
+		} catch (Exception e) {
+			log.log(Level.SEVERE, "Could not delete KeycloakRealm " + realmName, e);
+			resource.setStatus(OzgKeycloakRealmStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
+			UpdateControl.updateStatus(resource);
+			return DeleteControl.noFinalizerRemoval();
+		}
 	}
 }
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
index 24c8fe6e15e475b59185d30b7e0247daa6053c31..6c9f12a97c5ef78e76d4fe1ecc159d43bea7ef3e 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
@@ -21,4 +21,8 @@ class KeycloakRealmRemoteService {
 		return keycloakClient.getKeycloak().realms().findAll().stream()
 				.anyMatch(realmExisting -> realmExisting.getRealm().equals(newRealm.getRealm()));
 	}
+
+	void deleteRealm(String realmName) {
+		keycloakClient.getKeycloak().realm(realmName).remove();
+	}
 }
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
index 0f72234928c1861f451981d858e518baea1120f6..feea4fe8e4850e3a10f389da0878f2b998eb36eb 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
@@ -27,4 +27,8 @@ class KeycloakRealmService {
 		realm.setRealm(realmName);
 		return realm;
 	}
+
+	public void deleteRealm(String realmName) {
+		remoteService.deleteRealm(realmName);
+	}
 }
diff --git a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
index 47c8a711fa5a605b0dada58e0298dbba2d9046e8..57546d4859cd6b1d521d303d5a848bcc57ef0336 100644
--- a/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
+++ b/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
@@ -41,7 +41,8 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea
 			return UpdateControl.updateStatus(resource);
 
 		} catch (Exception e) {
-			log.log(Level.SEVERE, "Could not reconcile user " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e);
+			log.log(Level.SEVERE,
+					"Could not reconcile user " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace(), e);
 			resource.setStatus(OzgKeycloakUserStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
 			return UpdateControl.updateStatus(resource);
 		}
@@ -60,7 +61,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgKeycloakUser>, Clea
 			log.log(Level.SEVERE, "Could not delete user " + crd.getMetadata().getName() + " in namespace " + crd.getMetadata().getNamespace(), e);
 			crd.setStatus(OzgKeycloakUserStatus.builder().status(OzgCustomResourceStatus.ERROR).errorMessage(e.getMessage()).build());
 			UpdateControl.updateStatus(crd);
-			return DeleteControl.defaultDelete();
+			return DeleteControl.noFinalizerRemoval();
 		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
index 9f247e7b4a82c2c123c29616ebdddbc7e5b9234f..5fd0842c45de7bf4528fcbea445eb71f6fb471de 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java
@@ -3,6 +3,7 @@ package de.ozgcloud.operator.keycloak.realm;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
@@ -19,27 +20,44 @@ class KeycloakRealmReconcilerTest {
 	@Mock
 	private KeycloakRealmService service;
 
-	@Test
-	void shouldCallServiceAddRealm() {
+	@Nested
+	class TestReconcile {
 
-		OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
+		@Test
+		void shouldCallServiceAddRealm() {
 
-		conciler.reconcile(realm, null);
+			OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
 
-		verify(service).createRealm(realm.getSpec(), OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
-	}
+			conciler.reconcile(realm, null);
+
+			verify(service).createRealm(realm.getSpec(), OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
+		}
+
+		@Test
+		void shouldReturnUpdateStatus() {
+			var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
 
-	@Test
-	void shouldReturnUpdateStatus() {
-		var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+			assertThat(response.getResource()).isNotNull();
+		}
 
-		assertThat(response.getResource()).isNotNull();
+		@Test
+		void shouldSetStatusOk() {
+			var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+
+			assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK);
+		}
 	}
 
-	@Test
-	void shouldSetStatusOk() {
-		var response = conciler.reconcile(OzgKeycloakRealmTestFactory.create(), null);
+	@Nested
+	class TestDelete {
+
+		@Test
+		void shouldCallServiceDelete() {
+			OzgKeycloakRealm realm = OzgKeycloakRealmTestFactory.create();
+
+			conciler.cleanup(realm, null);
 
-		assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCustomResourceStatus.OK);
+			verify(service).deleteRealm(OzgKeycloakRealmTestFactory.METADATA_NAMESPACE);
+		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
index e2a7aeb06a82aa71c23499427fc1c2a0d43eb9c7..53e35617557c319cd8e972a3afcd959c268fd049 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java
@@ -72,4 +72,20 @@ class KeycloakRealmRemoteServiceTest {
 			assertThat(response).isTrue();
 		}
 	}
+
+	@Nested
+	class TestDeleteRealm {
+
+		private static final String REALM_NAME = "TestRealmName";
+
+		@Test
+		void shouldDeleteRealm() {
+			when(keycloak.realm(REALM_NAME)).thenReturn(realmResource);
+
+
+			remoteService.deleteRealm(REALM_NAME);
+
+			verify(realmResource).remove();
+		}
+	}
 }
diff --git a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
index 0c2238640fd99462b0109073650a1c50e55d536e..7551552118ff4eefc0c40c4f73a120f97cee120f 100644
--- a/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
+++ b/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceTest.java
@@ -86,4 +86,15 @@ class KeycloakRealmServiceTest {
 
 		verify(realmRepresentation).setRealm(REALM_NAME);
 	}
+
+	@Nested
+	class TestDeleteRealm {
+
+		@Test
+		void shouldCallRemoteServiceDelete() {
+			service.deleteRealm(REALM_NAME);
+
+			verify(remoteService).deleteRealm(REALM_NAME);
+		}
+	}
 }