diff --git a/Jenkinsfile b/Jenkinsfile
index 7b0bd17782cfa1b7207a65caa83b56b855e77680..c584d3f232d41e0893822b3315041199704d72f4 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -6,7 +6,7 @@ pipeline {
     }
 
     environment {
-        BLUE_OCEAN_URL = "https://jenkins.ozg-sh.de/job/user-manager/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/"
+        BLUE_OCEAN_URL = "https://jenkins.infra.ozg-cloud.systems/job/user-manager/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/"
         RELEASE_REGEX = /\d+.\d+.\d+/
         SNAPSHOT_REGEX = /\d+.\d+.\d+-SNAPSHOT/
         FAILED_STAGE = ""
@@ -200,6 +200,44 @@ pipeline {
                 }
             }
         }
+
+
+        stage('march build image') {
+            when {
+                branch 'master'
+            }
+            steps {
+                script {
+                    FAILED_STAGE=env.STAGE_NAME
+
+                    withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
+                        configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
+                            sh './mvnw -pl user-manager-server -s $MAVEN_SETTINGS clean verify \
+                                       -Pnative -Dquarkus.container-image.registry=docker.ozg-sh.de \
+                                       -Dquarkus.container-image.username=${USER} \
+                                       -Dquarkus.container-image.password=${PASSWORD} \
+                                       -Dquarkus.container-image.push=true \
+                                       -Dquarkus.container-image.build=true \
+                                       -Dquarkus.native.remote-container-build=true \
+                                       -Dquarkus.native.additional-build-args=-march=compatibility \
+                                       -Dmaven.wagon.http.retryHandler.count=3'
+                        }
+                    }
+                }
+            }
+        }
+
+        stage('march push image') {
+            when {
+                branch 'master'
+            }
+            steps {
+                script {
+                    FAILED_STAGE = env.STAGE_NAME
+                    tagAndPushDockerImage('march-snapshot-latest')
+                }
+            }
+        }
     }
 
     post {
diff --git a/README.md b/README.md
index dcba360207c60e27781161b20b33e153a125ac2e..517e05d28109b9c11493827ce952bd327e7290bf 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# user-manager Project
+# user-manager
 
 This project uses Quarkus, the Supersonic Subatomic Java Framework.
 
@@ -7,19 +7,19 @@ If you want to learn more about Quarkus, please visit its website: https://quark
 ## Configuring the application
 This properties must be configured to run the application
 
-| Key | Value | Default | Mandatory | Description |
-| --- | ----- | ------- | --------- | ----------- |
-| quarkus.oidc.auth-server-url | https://sso.dev.by.ozg-cloud.de/realms/sh-kiel-dev | none | yes | Url of the keycloak server with the realm |
-| quarkus.mongodb.connection-string | mongodb://ozg-mongodb:27017 | none | yes | The connection string for the mongo db database |
-| quarkus.mongodb.database | usermanager | usermanager | no | Name of the mongo db database |
-| kop.keycloak.sync.cron | 0 15 2 * * ? | 0 15 2 * * ? | no | Cron statement when the sync is done |
-| kop.keycloak.api.user | apiUser | none | yes | The name of the keycloak admin api user |
-| kop.keycloak.api.password | **** | none | yes | The password of the keycloak admin api user |
-| kop.keycloak.api.realm | realm-name | none | yes | The name of the realm |
-| kop.keycloak.api.organisations-einheit-id-key | organisationseinheitId | organisationseinheitId | no | The key where the organisationsEinheitId of the group is saved |
-| kop.keycloak.api.ldap-id-key | LDAP_ID | LDAP_ID | no | The key to get the keycloak user id from |
-| kop.usermanager.url | http://localhost:8080 | none | yes | The external root url of the usermanager |
-| keycloak.url | https://sso.service | none | yes | The root url of the keycloak service |
+| Key                                           | Value                                              | Default                | Mandatory | Description                                                    |
+|-----------------------------------------------|----------------------------------------------------|------------------------| --------- |----------------------------------------------------------------|
+| quarkus.oidc.auth-server-url                  | https://sso.dev.by.ozg-cloud.de/realms/sh-kiel-dev | none                   | yes | Url of the keycloak server with the realm                      |
+| quarkus.mongodb.connection-string             | mongodb://ozg-mongodb:27017                        | none                   | yes | The connection string for the mongo db database                |
+| quarkus.mongodb.database                      | usermanager                                        | usermanager            | no | Name of the mongo db database                                  |
+| kop.keycloak.sync.period                      | 5m                                                 | 6h                     | no | Period between synchronizations                                |
+| kop.keycloak.api.user                         | apiUser                                            | none                   | yes | The name of the keycloak admin api user                        |
+| kop.keycloak.api.password                     | ****                                               | none                   | yes | The password of the keycloak admin api user                    |
+| kop.keycloak.api.realm                        | realm-name                                         | none                   | yes | The name of the realm                                          |
+| kop.keycloak.api.organisations-einheit-id-key | organisationseinheitId                             | organisationseinheitId | no | The key where the organisationsEinheitId of the group is saved |
+| kop.keycloak.api.ldap-id-key                  | LDAP_ID                                            | LDAP_ID                | no | The key to get the keycloak user id from                       |
+| kop.usermanager.url                           | http://localhost:8080                              | none                   | yes | The external root url of the usermanager                       |
+| keycloak.url                                  | https://sso.service                                | none                   | yes | The root url of the keycloak service                           |
 
 ## Running the application in dev mode
 
@@ -30,6 +30,27 @@ You can run your application in dev mode that enables live coding using:
 
 > **_NOTE:_**  Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/.
 
+> If you want to use remote Keycloak for local development, then use the profile remotekc. Be aware,
+> that it deactivates synchronization - if you need it, then you have to create your own realm and 
+> set it in properties, like this:
+> ```yaml
+> keycloak:
+>   realm: your-realm
+> ozgcloud:
+>   usersync:
+>     period: "6h"
+> ```
+
+## Running the server with custom realm
+In order to start user-manager-server connecting againts dev keycloak locally with custom realm 
+use below configuration in your IDE or CLI. 
+```
+-Dquarkus.profile=local,remotekc
+-Dquarkus.oidc.auth-server-url=https://sso.dev.by.ozg-cloud.de/realms/sebo-test
+-Dkop.keycloak.api.realm=sebo-test
+-Dozgcloud.usersync.period="5s"
+```
+
 ## Packaging and running the application
 
 The application can be packaged using:
@@ -121,7 +142,7 @@ Usermanager als native Anwendung erstellen und lokal starten:
     -Dkop.keycloak.api.password=hlc_j1I1Ji0trC0 \
     -Dkop.keycloak.api.realm=by-kiel-dev \
     -Dkop.keycloak.api.client=alfa \
-    -Dkop.keycloak.sync.cron="* */3 * * * ?" \
+    -Dozgcloud.usersync.period="5m" \
     -Xmx32m
 ```
 
diff --git a/build-native-local-docker-image.sh b/build-native-local-docker-image.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e65bf55cd272e2640ca330ead957529cb9e6572c
--- /dev/null
+++ b/build-native-local-docker-image.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+export QUARKUS_CONTAINER_IMAGE_NAME=user-manager
+export QUARKUS_CONTAINER_IMAGE_TAG=build-latest
+export QUARKUS_NATIVE_CONTAINER_RUNTIME=docker
+cd user-manager-server
+./mvnw clean install -D skipTests \
+      -Pnative \
+      -Dquarkus.container-image.registry=docker.ozg-sh.de \
+      -Dquarkus.container-image.push=false \
+      -Dquarkus.container-image.build=true \
+      -Dquarkus.native.remote-container-build=false
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a8c1a4c16b3cdc17e25c68f7267ee73427ad462a..303ed86fe1de7537845b0375f4953fe25138414c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.itvsh.kop</groupId>
 	<artifactId>user-manager</artifactId>
-	<version>1.13.0-SNAPSHOT</version>
+	<version>1.14.0-SNAPSHOT</version>
 
 	<name>User Manager Parent</name>
 	<packaging>pom</packaging>
diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml
index af8cb38b76d848478eda646f4511eb4b661d8e19..c00aeea69396b4d7f79681670f7c5b1560f7d8a6 100644
--- a/src/main/helm/templates/deployment.yaml
+++ b/src/main/helm/templates/deployment.yaml
@@ -98,8 +98,10 @@ spec:
           value: {{ include "app.ssoServerUrl" . }}
         - name: KOP_USER_MANAGER_URL
           value: {{ include "app.baseUrl" . }}
-        - name: KOP_KEYCLOAK_SYNC_CRON
-          value: {{ .Values.kop.keycloak.sync.cron }}
+        {{- if ((.Values.ozgcloud).usersync).period }}
+        - name: OZGCLOUD_USERSYNC_PERIOD
+          value: {{ .Values.ozgcloud.usersync.period }}
+        {{- end }}
         - name: QUARKUS_HTTP_CORS_ORIGINS
           value: {{ (include "app.goofyAddress" .) }}
         {{- with (.Values.env).customList }}
diff --git a/src/main/helm/templates/ingress.yaml b/src/main/helm/templates/ingress.yaml
index 6ae1c2e19604c96a8c2716d9e5c80fa3af98c223..68307d45dd3f0f5af11bda1f8f2d4bb05a953d60 100644
--- a/src/main/helm/templates/ingress.yaml
+++ b/src/main/helm/templates/ingress.yaml
@@ -37,8 +37,8 @@ metadata:
   name: {{ include "app.name" . }}
   namespace: {{ include "app.namespace" . }}
 spec:
-  {{- if ne (.Values).cluster_env "dataport" }}
-  ingressClassName: nginx
+  {{- if and (.Values.ingress).className (ne (.Values).cluster_env "dataport") }}
+  ingressClassName: {{ .Values.ingress.className }}
   {{- end }}
   rules:
     - http:
diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml
index fc0f63d4bb1dffd9bab24772e002c3fa0db9a591..78a2d65144db9cc541ea178ca8fc44de0ac4be05 100644
--- a/src/main/helm/values.yaml
+++ b/src/main/helm/values.yaml
@@ -38,8 +38,6 @@ kop:
   keycloak:
     api:
       user: userManagerApiUser
-    sync:
-      cron: 0 15 1 * * ?
 
 imageCredentials:
   registry: docker.ozg-sh.de
diff --git a/src/test/helm/deployment-keycloak-values-test.yaml b/src/test/helm/deployment-keycloak-values-test.yaml
index 3554cc6ee2454279c5c739d8455eafeb5a7731d9..5aabfe98e118fd878089b379c262814c35348fcf 100644
--- a/src/test/helm/deployment-keycloak-values-test.yaml
+++ b/src/test/helm/deployment-keycloak-values-test.yaml
@@ -52,11 +52,6 @@ tests:
           content: 
             name: KOP_KEYCLOAK_API_REALM
             value: sh-helm-test
-      - contains:
-          path: spec.template.spec.containers[0].env
-          content: 
-            name: KOP_KEYCLOAK_SYNC_CRON
-            value: 0 15 1 * * ?
       - contains:
           path: spec.template.spec.containers[0].env
           content: 
diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml
index d179014a732fd8693d1082a9472609e836b6ffa9..34eb94b430f6cc97d4414d142d0f7dd82d9540f0 100644
--- a/src/test/helm/deployment_env_test.yaml
+++ b/src/test/helm/deployment_env_test.yaml
@@ -68,4 +68,20 @@ tests:
           path: spec.template.spec.containers[0].env
           content: 
             name: QUARKUS_MONGODB_DATABASE
-            value: test-database
\ No newline at end of file
+            value: test-database
+  - it: check user sync period set
+    set:
+      ozgcloud.usersync.period: "6h"
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: OZGCLOUD_USERSYNC_PERIOD
+            value: "6h"
+  - it: check user sync period NOT set
+    asserts:
+      - notContains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: OZGCLOUD_USERSYNC_PERIOD
+            value: "6h"
\ No newline at end of file
diff --git a/src/test/helm/ingress-nginx-tests.yaml b/src/test/helm/ingress-nginx-tests.yaml
index 2e036450f470628c66ac00e9442709ed0521dde4..aaf323163e46b560d7d796028996b0356925058f 100644
--- a/src/test/helm/ingress-nginx-tests.yaml
+++ b/src/test/helm/ingress-nginx-tests.yaml
@@ -29,16 +29,23 @@ release:
 templates:
   - templates/ingress.yaml
 tests:
-  - it: should create ingress tls/ingressClass
+  - it: should create ingress tls
     asserts:
-      - equal:
-          path: spec.ingressClassName
-          value: nginx
       - equal:
           path: spec.tls[0].secretName
           value: helm-user-manager-tls
-
-  - it: should not create ingress tls/ingressClass
+  - it: should not set ingressClassName
+    asserts:
+      - isNull:
+          path: spec.ingressClassName
+  - it: should set ingressClassName
+    set:
+      ingress.className: nginx
+    asserts:
+      - equal:
+          path: spec.ingressClassName
+          value: nginx
+  - it: should not create ingress tls/ingressClassName
     set:
       cluster_env: dataport
     asserts:
diff --git a/user-manager-interface/pom.xml b/user-manager-interface/pom.xml
index 74bb29fe530ac3d576dd65d93484cdfc2c7e66ac..a249d3ea3591c7f6494e042723556e83e3dacb27 100644
--- a/user-manager-interface/pom.xml
+++ b/user-manager-interface/pom.xml
@@ -36,7 +36,7 @@
 
 	<groupId>de.itvsh.kop.user</groupId>
 	<artifactId>user-manager-interface</artifactId>
-	<version>1.13.0-SNAPSHOT</version>
+	<version>1.14.0-SNAPSHOT</version>
 
 	<name>UserManager Interface</name>
 	<description>gRPC Interface for User Manager</description>
@@ -45,6 +45,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<jandex-maven-plugin-version>1.2.3</jandex-maven-plugin-version>
+		<quarkus.platform.version>3.5.0</quarkus.platform.version>
 	</properties>
 
 	<dependencies>
diff --git a/user-manager-server/pom.xml b/user-manager-server/pom.xml
index 09b5c30128e0f46bcd72ee14e23671c71de90cd7..0f9a4f359f11b80c1be49d1d7c006212601b3e1a 100644
--- a/user-manager-server/pom.xml
+++ b/user-manager-server/pom.xml
@@ -30,13 +30,13 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-dependencies</artifactId>
-		<version>1.7.1</version>
+		<version>2.3.1</version>
 		<relativePath/>
 	</parent>
 
 	<groupId>de.itvsh.kop.user</groupId>
 	<artifactId>user-manager-server</artifactId>
-	<version>1.13.0-SNAPSHOT</version>
+	<version>1.14.0-SNAPSHOT</version>
 	<name>User Manager</name>
 
 	<properties>
@@ -54,8 +54,12 @@
 
 		<lombok.version>1.18.24</lombok.version>
 
-		<jakarta.interceptor.version>1.2.5</jakarta.interceptor.version>
-		<jakarta.annotatioin.version>1.3.5</jakarta.annotatioin.version>
+		<jakarta.interceptor.version>2.1.0</jakarta.interceptor.version>
+		<jakarta.annotatioin.version>2.1.1</jakarta.annotatioin.version>
+
+		<keycloak-adapter.version>22.0.5</keycloak-adapter.version>
+
+		<quarkus.platform.version>3.5.0</quarkus.platform.version>
 	</properties>
 
 	<dependencyManagement>
@@ -92,6 +96,10 @@
 					<groupId>org.apache.logging.log4j</groupId>
 					<artifactId>log4j-slf4j-impl</artifactId>
 				</exclusion>
+				<exclusion>
+					<groupId>org.springframework</groupId>
+					<artifactId>spring-context</artifactId>
+				</exclusion>
 			</exclusions>
 		</dependency>
 
@@ -207,11 +215,27 @@
 			<artifactId>jakarta.interceptor-api</artifactId>
 			<version>${jakarta.interceptor.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>jakarta.json</groupId>
+			<artifactId>jakarta.json-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>jakarta.validation</groupId>
+			<artifactId>jakarta.validation-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>jakarta.ws.rs</groupId>
+			<artifactId>jakarta.ws.rs-api</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>jakarta.annotation</groupId>
 			<artifactId>jakarta.annotation-api</artifactId>
 			<version>${jakarta.annotatioin.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>jakarta.inject</groupId>
+			<artifactId>jakarta.inject-api</artifactId>
+		</dependency>
 
 		<!-- Test -->
 		<dependency>
@@ -290,11 +314,11 @@
 					<compilerArgs>
 						<arg>-parameters</arg>
 						<compilerArg>
-								-Amapstruct.defaultComponentModel=cdi
-							</compilerArg>
+							-Amapstruct.defaultComponentModel=jakarta
+						</compilerArg>
 						<compilerArg>
-								-Amapstruct.unmappedTargetPolicy=WARN
-							</compilerArg>
+							-Amapstruct.unmappedTargetPolicy=WARN
+						</compilerArg>
 					</compilerArgs>
 				</configuration>
 			</plugin>
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/RoleHierarchy.java b/user-manager-server/src/main/java/de/itvsh/kop/user/RoleHierarchy.java
new file mode 100644
index 0000000000000000000000000000000000000000..73eb833741891a50fbaa94c0ed2f1a8c0b9feae4
--- /dev/null
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/RoleHierarchy.java
@@ -0,0 +1,41 @@
+package de.itvsh.kop.user;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.List;
+import java.util.Objects;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+@Builder
+@Getter
+class RoleHierarchy {
+
+	private final String roleName;
+
+	@Singular
+	private List<RoleHierarchy> subRoles;
+
+	public List<String> getFlattenedHierarchy(String roleName) {
+		var subRoles = new ArrayDeque<String>();
+		collectSubRoles(this, roleName, subRoles);
+		return subRoles.stream().toList();
+	}
+
+	boolean collectSubRoles(RoleHierarchy role, String roleName, Deque<String> subRoles) {
+		subRoles.addLast(role.getRoleName());
+		if (Objects.equals(role.getRoleName(), roleName)) {
+			return true;
+		}
+		for (var subRole : role.getSubRoles()) {
+			if (collectSubRoles(subRole, roleName, subRoles)) {
+				return true;
+			}
+		}
+		subRoles.removeLast();
+		return false;
+	}
+
+}
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResource.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResource.java
index bbc4f108ddbd0091200bcacdea2488b4032ab4c3..29b2ddb262c3cc6e1201f70f0560f6070c941fbe 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResource.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResource.java
@@ -26,13 +26,13 @@ package de.itvsh.kop.user;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.resteasy.reactive.common.util.RestMediaType;
@@ -80,7 +80,7 @@ public class UserProfileResource {
 		Stream<User> users;
 		if (deleted.isEmpty()) {
 			users = userService.findUsers(query);
-		} else if (deleted.get()) {
+		} else if (deleted.orElse(false)) {
 			users = userService.findInactiveUsers(query);
 		} else {
 			users = userService.findActiveUsers(query);
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResourceAssembler.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResourceAssembler.java
index e4329c10bb0ff984a6afc492434c5c60ed24373e..ebfcc495e253932c32d6c05428322aa2b36b382e 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResourceAssembler.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserProfileResourceAssembler.java
@@ -25,8 +25,8 @@ package de.itvsh.kop.user;
 
 import java.util.List;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.ws.rs.core.Link;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.ws.rs.core.Link;
 
 import de.itvsh.kop.user.settings.UserSettingsResource;
 import io.quarkus.hal.HalCollectionWrapper;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserRepository.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserRepository.java
index d0b96122b453c22113426c26127c77a09942bbae..d382098ee5f721d8f112c2e9a18f045a16726dc6 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserRepository.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserRepository.java
@@ -28,7 +28,7 @@ import static de.itvsh.kop.user.User.*;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import org.bson.types.ObjectId;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserResourceMapper.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserResourceMapper.java
index af43d281a30dbb0a81dd05316d009f40028ad9bd..7a0d8d122152aa093ea6325aa69ed7d74918bd34 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserResourceMapper.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserResourceMapper.java
@@ -32,7 +32,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.UserResource;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserRole.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserRole.java
index 3dc6a4871c970c0237c59ab830a13403d627f2ce..dc694061ae5053bc74b7546a4e4a7f777da815a0 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserRole.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserRole.java
@@ -23,6 +23,9 @@
  */
 package de.itvsh.kop.user;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
@@ -32,4 +35,17 @@ public class UserRole {
 	public static final String EINHEITLICHER_ANSPRECHPARTNER = "EINHEITLICHER_ANSPRECHPARTNER";
 	public static final String VERWALTUNG_POSTSTELLE = "VERWALTUNG_POSTSTELLE";
 	public static final String VERWALTUNG_USER = "VERWALTUNG_USER";
+	public static final String VERWALTUNG_LOESCHEN = "VERWALTUNG_LOESCHEN";
+
+	private static final RoleHierarchy HIERARCHY = RoleHierarchy.builder()
+			.roleName(VERWALTUNG_LOESCHEN)
+			.subRole(RoleHierarchy.builder()
+					.roleName(VERWALTUNG_USER)
+					.build())
+			.build();
+
+	public static boolean containsWithinRoleHierarchy(Collection<String> userRoles, String roleName) {
+		return !Collections.disjoint(userRoles, HIERARCHY.getFlattenedHierarchy(roleName));
+	}
+
 }
\ No newline at end of file
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserService.java
index fbe228791cccda65d8d1a814c5dbaffe0de42143..700348fb23f6f1999a920c21c98f47cef9776923 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/UserService.java
@@ -26,8 +26,8 @@ package de.itvsh.kop.user;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import org.apache.commons.lang3.StringUtils;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/JwtUtil.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/JwtUtil.java
index be7bae09ba093a0616d1eec4dc89d37a7c6ca6c9..10b6fe56ec5019ab1ba88492dad6d988a3776139 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/JwtUtil.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/JwtUtil.java
@@ -28,10 +28,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.json.JsonArray;
-import javax.json.JsonString;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.json.JsonArray;
+import jakarta.json.JsonString;
 
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.microprofile.jwt.JsonWebToken;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/TargetTypeProvider.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/TargetTypeProvider.java
index 93a2f92e0bcc35a6c121c4c2aa5390208bbe27ba..bcdc58e497c2d71bc6ac0bec45f6443f3f9b7519 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/TargetTypeProvider.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/TargetTypeProvider.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.common;
 
 import java.lang.reflect.Type;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import org.jboss.resteasy.reactive.server.core.CurrentRequestManager;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CallContextUser.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CallContextUser.java
index f6426845a1a04b6fb64571f443b8d0cd348472d7..633efe7bcc4c84dd54596af48dc4b752b8c558e2 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CallContextUser.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CallContextUser.java
@@ -26,7 +26,6 @@ package de.itvsh.kop.user.common.callcontext;
 import java.io.Serializable;
 import java.security.Principal;
 import java.util.Collection;
-import java.util.List;
 import java.util.Optional;
 
 import lombok.Builder;
@@ -54,7 +53,7 @@ public class CallContextUser implements Serializable, Principal {
 	@Builder.Default
 	private final transient boolean authenticated = false;
 
-	private final transient List<String> roles;
+	private final transient Collection<String> roles;
 
 	@Override
 	public String getName() {
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserService.java
index 225ab939e1f87965acd3ab66fda7ed8179d60d7f..98b6984de20251ff5b1c83bfc27c843ed66fb4ac 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserService.java
@@ -25,7 +25,9 @@ package de.itvsh.kop.user.common.callcontext;
 
 import java.util.Optional;
 
-import javax.enterprise.context.RequestScoped;
+import jakarta.enterprise.context.RequestScoped;
+
+import de.itvsh.kop.user.UserRole;
 
 @RequestScoped
 public class CurrentCallContextUserService {
@@ -41,7 +43,7 @@ public class CurrentCallContextUserService {
 	}
 
 	public boolean hasRole(String userRole) {
-		return user.getRoles().contains(userRole);
+		return UserRole.containsWithinRoleHierarchy(user.getRoles(), userRole);
 	}
 
 	public void clearCallContextUser() {
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptor.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptor.java
index 5b027a415c629110c354be0e19c9de5b73b11ee4..9717a5bdbd5aa4c70f97541bab47b131fbb370f9 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptor.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptor.java
@@ -26,8 +26,8 @@ package de.itvsh.kop.user.common.callcontext;
 import java.util.Optional;
 import java.util.UUID;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import org.apache.logging.log4j.CloseableThreadContext;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptor.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptor.java
index 11366a4dc7c922b943317d4121d570b27870d5dc..81e3f3f9c5134e0780fd953a4fff62b5541751b3 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptor.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptor.java
@@ -25,10 +25,10 @@ package de.itvsh.kop.user.common.callcontext;
 
 import java.io.IOException;
 
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.ext.Provider;
-import javax.ws.rs.ext.ReaderInterceptor;
-import javax.ws.rs.ext.ReaderInterceptorContext;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.ext.Provider;
+import jakarta.ws.rs.ext.ReaderInterceptor;
+import jakarta.ws.rs.ext.ReaderInterceptorContext;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.CloseableThreadContext;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilter.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilter.java
index a84743ecc0584e161c40e755b1b80e27357599f6..aabdd9cd38551ef45659c321bbc4870d8d9a868e 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilter.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilter.java
@@ -25,11 +25,11 @@ package de.itvsh.kop.user.common.callcontext;
 
 import java.io.IOException;
 
-import javax.inject.Inject;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.container.PreMatching;
-import javax.ws.rs.ext.Provider;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.container.PreMatching;
+import jakarta.ws.rs.ext.Provider;
 
 import de.itvsh.kop.user.common.JwtUtil;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtil.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtil.java
index dbd6b4cf3bcf3b0fddd03eb3f70c7e0b328d607b..c11c6eb5a14f82bc27ae200fe0bc9756d2b7666c 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtil.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtil.java
@@ -25,8 +25,8 @@ package de.itvsh.kop.user.common.errorhandling;
 
 import java.util.UUID;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.ws.rs.NotFoundException;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.ws.rs.NotFoundException;
 
 import de.itvsh.kop.common.errorhandling.ExceptionUtil;
 import lombok.extern.log4j.Log4j2;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandler.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandler.java
index 394b30ac3f8de5903fa0a9504826587ff99012d9..9453922c7981a1ce2bf752eda49281172195b0c5 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandler.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandler.java
@@ -23,11 +23,11 @@
  */
 package de.itvsh.kop.user.common.errorhandling;
 
-import javax.inject.Inject;
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+import jakarta.ws.rs.core.UriInfo;
 
 import org.jboss.resteasy.reactive.server.ServerExceptionMapper;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockRepository.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockRepository.java
index ea4f6fceedfb0b336356790934d4bb4d9ba3e03e..6ca0b99f57523417607e0e7af5e7cbba385c9c92 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockRepository.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockRepository.java
@@ -26,7 +26,7 @@ package de.itvsh.kop.user.common.lock;
 import java.time.Instant;
 import java.util.Optional;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import io.quarkus.mongodb.panache.PanacheMongoRepository;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockService.java
index a37b3e433f0b52d56c923abf0cb327f6208c2828..85de568651ff1ca2dfc3495f669473ac53acfa10 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/lock/LockService.java
@@ -26,8 +26,8 @@ package de.itvsh.kop.user.common.lock;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.common.errorhandling.LockCreationException;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiProperties.java b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiProperties.java
index 5bb7e88df733c7878d78ea93aedcb3a83c62bbf4..b480c6c453e5a85e1920f086c8f27fe4ec0b4460 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiProperties.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiProperties.java
@@ -23,7 +23,7 @@
  */
 package de.itvsh.kop.user.keycloak;
 
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
 
 import io.smallrye.config.ConfigMapping;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiService.java
index 3a005b22cd86714c39870f8f58824d96db0576b6..2c36eea90e954f364431b69be2f2761f0eb6e64d 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakApiService.java
@@ -29,11 +29,12 @@ import java.util.function.Supplier;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.ws.rs.BadRequestException;
-import javax.ws.rs.ClientErrorException;
-import javax.ws.rs.ProcessingException;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.BadRequestException;
+import jakarta.ws.rs.ClientErrorException;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.ProcessingException;
 
 import org.apache.commons.lang3.ObjectUtils;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -73,7 +74,11 @@ class KeycloakApiService {
 	}
 
 	Optional<User> findUserById(String id) {
-		return Optional.ofNullable(realmResource.users().get(id)).map(mapper::toKopUser);
+		try {
+			return Optional.of(realmResource.users().get(id)).map(mapper::toKopUser);
+		} catch (NotFoundException e) {
+			return Optional.empty();
+		}
 	}
 
 	private RemoteUserIterator createRealmUserIterator() {
@@ -98,13 +103,13 @@ class KeycloakApiService {
 		var ozgCloudUserIdInKeycloak = userRepresentation.firstAttribute(attributeName);
 		if (ObjectUtils.notEqual(ozgCloudUserIdInKeycloak, attributeValue)) {
 			userRepresentation.singleAttribute(attributeName, attributeValue);
-			tryUpdateUserResource(userResource,userRepresentation, attributeName);
+			tryUpdateUserResource(userResource, userRepresentation, attributeName);
 		}
 	}
 
-	private void tryUpdateUserResource(UserResource userResource, UserRepresentation userRepresentation, String attributeName) {
+	void tryUpdateUserResource(UserResource userResource, UserRepresentation userRepresentation, String attributeName) {
 		try {
-			userResource.update(userRepresentation);
+			userResource.update(new OlderUserRepresentation(userRepresentation));
 		} catch (BadRequestException e) {
 			LOG.warn("Could not update user attribute {} in Keycloak.", attributeName, e);
 		}
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakProvider.java b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakProvider.java
index 4f5a8d84d2cbb61cfbaba1df8bc2e26aca1a634b..5c59bbf5f78be244cfacd88165972025f7db614d 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakProvider.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakProvider.java
@@ -23,8 +23,8 @@
  */
 package de.itvsh.kop.user.keycloak;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.keycloak.admin.client.Keycloak;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteService.java
index 9bf0a5a19c07b2e64907edc61b87c2264ac4ec4d..b6c910d2ab167f8c5cfe35b76a9b692e2bf21147 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteService.java
@@ -26,8 +26,8 @@ package de.itvsh.kop.user.keycloak;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.User;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/OlderUserRepresentation.java b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/OlderUserRepresentation.java
new file mode 100644
index 0000000000000000000000000000000000000000..493d84512de5fe974d366a535451079753808237
--- /dev/null
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/keycloak/OlderUserRepresentation.java
@@ -0,0 +1,48 @@
+package de.itvsh.kop.user.keycloak;
+
+import org.keycloak.representations.idm.UserProfileMetadata;
+import org.keycloak.representations.idm.UserRepresentation;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * This is a user representation which works with currently used Keycloak version 20.0.3 Because of Quarkus upgrade to 3.5.0 the keycloak admin client
+ * was updated to 22.0.5. The reason for that is the new resteasy client based on Jakarata EE 10 (jakarta.ws.rs-api). Keycloak admin client 20 .0.3 is
+ * based on Jersey (javax.ws.rs-api). What we do here is simple ignoring one field added in the newer version of Keycloak in order for entity to be
+ * processable by the older version. Once Keycloak will be upgraded we can remove this class.
+ *
+ * The workaround was discussed with Quarkus team https://github.com/quarkusio/quarkus/discussions/36766
+ */
+class OlderUserRepresentation extends UserRepresentation {
+
+	@JsonIgnore
+	private UserProfileMetadata userProfileMetadata;
+
+	public OlderUserRepresentation(UserRepresentation origin) {
+		setAttributes(origin.getAttributes());
+		setClientRoles(origin.getClientRoles());
+		setEmail(origin.getEmail());
+		setId(origin.getId());
+		setCreatedTimestamp(origin.getCreatedTimestamp());
+		setFirstName(origin.getFirstName());
+		setLastName(origin.getLastName());
+		setUsername(origin.getUsername());
+		setAccess(origin.getAccess());
+		setClientConsents(origin.getClientConsents());
+		setCredentials(origin.getCredentials());
+		setDisableableCredentialTypes(origin.getDisableableCredentialTypes());
+		setEmailVerified(origin.isEmailVerified());
+		setEnabled(origin.isEnabled());
+		setFederatedIdentities(origin.getFederatedIdentities());
+		setFederationLink(origin.getFederationLink());
+		setGroups(origin.getGroups());
+		setNotBefore(origin.getNotBefore());
+		setOrigin(origin.getOrigin());
+		setRealmRoles(origin.getRealmRoles());
+		setRequiredActions(origin.getRequiredActions());
+		setSelf(origin.getSelf());
+		setServiceAccountClientId(origin.getServiceAccountClientId());
+		setSocialLinks(origin.getSocialLinks());
+		setTotp(origin.isEmailVerified());
+	}
+}
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitGrpcService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitGrpcService.java
index 791c010d89bd03ab49f032b3cf0d8313188315a1..430440ae0e900cd07cc6e0761abdb117b6659715 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitGrpcService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitGrpcService.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.organisationseinheit;
 
 import java.util.Collection;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import com.google.protobuf.Empty;
 
@@ -38,7 +38,7 @@ import io.quarkus.grpc.GrpcService;
 public class OrganisationsEinheitGrpcService extends OrganisationsEinheitServiceImplBase {
 
 	@Inject
-	private OrganisationsEinheitService organisationsEinheitService;
+	OrganisationsEinheitService organisationsEinheitService;
 
 	@Override
 	public void getSupportedOrganisationsEinheiten(Empty request, StreamObserver<GrpcGetSupportedOrganisationsEinheitenResponse> responseObserver) {
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepository.java b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepository.java
index 8bbe58ac001eb62dce80ad351211c74eb493aea7..5f22d5f5381bd6f62a664e43710069a6c355525b 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepository.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepository.java
@@ -28,7 +28,7 @@ import static org.apache.commons.collections4.IterableUtils.*;
 
 import java.util.Collection;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import com.mongodb.client.model.Filters;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitService.java
index bc701b9404b19f2efbb613aab476ea7a12e75e92..f5f77cde964fe326e2e4bf43b2e8df12625b624f 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitService.java
@@ -25,14 +25,14 @@ package de.itvsh.kop.user.organisationseinheit;
 
 import java.util.Collection;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 @ApplicationScoped
 class OrganisationsEinheitService {
 
 	@Inject
-	private OrganisationsEinheitRepository repository;
+	OrganisationsEinheitRepository repository;
 
 	public Collection<String> findAllOrganisationsEinheitIds() {
 		return repository.findAllOrganisationsEinheitIds();
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientGrpcService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientGrpcService.java
index 585511220ac067c02248c7f0246776ef6540770a..16e7f06ea4db5165b88295dc9acd16c45f880425 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientGrpcService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientGrpcService.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.recipient;
 
 import java.util.Collection;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import de.itvsh.kop.user.User;
 import de.itvsh.kop.user.grpc.recipient.GrpcFindRecipientRequest;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientRepository.java b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientRepository.java
index dcebbee5daec02dca277310951821a20b29cda5d..70ea06cea9f706ea7a3aa267c6164653fd9bbb9c 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientRepository.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientRepository.java
@@ -4,7 +4,7 @@ import static de.itvsh.kop.user.User.*;
 
 import java.util.List;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.User;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientService.java
index 1f65e76a32008a7bf7030202633f76bce9f23545..8958d2eed1775c19d58e901e5e217fb07cd1b24d 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientService.java
@@ -25,8 +25,8 @@ package de.itvsh.kop.user.recipient;
 
 import java.util.List;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import com.cronutils.utils.StringUtils;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsRepository.java b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsRepository.java
index b90a0114e73a52c2972623900f4d12f71ddb4a84..d3089627adf7bc02f1c91150502e63b4ff5a7221 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsRepository.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsRepository.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.settings;
 
 import java.util.Optional;
 
-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;
 
 import org.bson.types.ObjectId;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResource.java b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResource.java
index 37cd684ddd72926e4e6410c84166827636243c52..2b2f7c60528e00829636d54c2e25a6b0286496c3 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResource.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResource.java
@@ -25,13 +25,13 @@ package de.itvsh.kop.user.settings;
 
 import java.util.Objects;
 
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.PATCH;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.PATCH;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResourceAssembler.java b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResourceAssembler.java
index e2ec0d3c666c57997780409312b90ac323d8a321..3f3c65285fb7e17083959fe0eaea56c0d5863c88 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResourceAssembler.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsResourceAssembler.java
@@ -23,9 +23,9 @@
  */
 package de.itvsh.kop.user.settings;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.ws.rs.core.Link;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Link;
 
 import org.apache.commons.lang3.StringUtils;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsService.java
index 986bf650740189eca48e31dbcaa0c69e13c2cb01..d05de31f1bdb193692c89958173eeb4bb64579c7 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/settings/UserSettingsService.java
@@ -26,8 +26,8 @@ package de.itvsh.kop.user.settings;
 import java.util.Objects;
 import java.util.Optional;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import de.itvsh.kop.user.UserService;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncScheduler.java b/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncScheduler.java
index e10e7c78ba24638fcb5b137d96ca5aef27b31665..86d8def9a360dfc89dda56b7b5f0b6f72c753223 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncScheduler.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncScheduler.java
@@ -25,8 +25,8 @@ package de.itvsh.kop.user.sync;
 
 import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.*;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import de.itvsh.kop.user.common.lock.LockService;
 import io.quarkus.scheduler.Scheduled;
@@ -41,7 +41,7 @@ public class SyncScheduler {
 	@Inject
 	LockService syncLockService;
 
-	@Scheduled(cron = "{kop.keycloak.sync.cron}", concurrentExecution = SKIP)
+	@Scheduled(every = "{ozgcloud.usersync.period}", concurrentExecution = SKIP)
 	public void start() {
 		if (syncLockService.isNotLocked()) {
 			var lock = syncLockService.lockCollection();
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncService.java
index d677c3e046cd4b4063feabec024986f78cb9079a..baed27bbf16404ce167867ea910709527ac476eb 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/sync/SyncService.java
@@ -25,8 +25,8 @@ package de.itvsh.kop.user.sync;
 
 import java.util.function.Predicate;
 
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 
 import org.apache.commons.collections4.CollectionUtils;
 
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/userprofile/UserProfileGrpcService.java b/user-manager-server/src/main/java/de/itvsh/kop/user/userprofile/UserProfileGrpcService.java
index 15f14793a27e3060c8bacd6f36f0064b10f87df8..81106fa820d7d233d79943a79491fdbfa6b19dcd 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/userprofile/UserProfileGrpcService.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/userprofile/UserProfileGrpcService.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.userprofile;
 
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import com.google.protobuf.Empty;
 
@@ -39,10 +39,10 @@ import io.quarkus.grpc.GrpcService;
 public class UserProfileGrpcService extends UserProfileServiceImplBase {
 
 	@Inject
-	private UserService service;
+	UserService service;
 
 	@Inject
-	private UserProfileMapper mapper;
+	UserProfileMapper mapper;
 
 	@Override
 	public void getById(GrpcGetUserProfileRequest request, StreamObserver<GrpcGetUserProfileResponse> responseObserver) {
diff --git a/user-manager-server/src/main/resources/application-e2e.yaml b/user-manager-server/src/main/resources/application-e2e.yaml
index 3c0d3eb7e242de49edea66d1c369a1b79bead2c1..5a5bccbd9d5b634f65988a21cf419a1c3b517efc 100644
--- a/user-manager-server/src/main/resources/application-e2e.yaml
+++ b/user-manager-server/src/main/resources/application-e2e.yaml
@@ -13,7 +13,7 @@ quarkus:
       "io.quarkus.oidc.runtime.OidcProvider":
         level: TRACE
         min-level: TRACE
-    
+
 kop:
   keycloak:
     api:
@@ -21,8 +21,10 @@ kop:
       password: S9UEMuLG9y9ev99
       realm: by-e2e-local-dev
       client: alfa
-    sync:
-      cron: disabled
 
 keycloak:
-  url: https://sso.dev.by.ozg-cloud.de
\ No newline at end of file
+  url: https://sso.dev.by.ozg-cloud.de
+
+ozgcloud:
+  usersync:
+    period: disabled
\ No newline at end of file
diff --git a/user-manager-server/src/main/resources/application-local.yaml b/user-manager-server/src/main/resources/application-local.yaml
index 7f8084ea2150b33bfc201df66869f6c43940c5af..efa12e0c637280e1085258fe481a3cdbed98f835 100644
--- a/user-manager-server/src/main/resources/application-local.yaml
+++ b/user-manager-server/src/main/resources/application-local.yaml
@@ -7,6 +7,6 @@ quarkus:
       json: false
 kop:
   user-manager:
-    url: http://localhost:9091
+    url: http://localhost:9092
 keycloak:
-    url: http://localhost:8088
\ No newline at end of file
+  url: http://localhost:8088
\ No newline at end of file
diff --git a/user-manager-server/src/main/resources/application-remotekc.yaml b/user-manager-server/src/main/resources/application-remotekc.yaml
index 333b8c5b35b59fbe39f7fbee52b0db54d5dc4b41..368b647bd2ba01778932ac8c7d88c887da0e444b 100644
--- a/user-manager-server/src/main/resources/application-remotekc.yaml
+++ b/user-manager-server/src/main/resources/application-remotekc.yaml
@@ -1,25 +1,28 @@
+keycloak:
+  url: https://sso.dev.by.ozg-cloud.de
+  realm: by-kiel-dev
 quarkus:
   mongodb:
     database: usermanager
   oidc:
-    auth-server-url: https://sso.dev.by.ozg-cloud.de/realms/by-kiel-dev
+    auth-server-url: ${keycloak.url}/realms/${keycloak.realm}
   http:
-    port: 9091
+    port: 9092
     cors:
       ~: true
       origins: http://localhost:4300
 kop:
   user-manager:
-    url: http://localhost:9091
+    url: http://localhost:9092
   keycloak:
-    sync:
-      cron: "* */10 * * * ?"
     api:
       user: userManagerApiUser
       password: hlc_j1I1Ji0trC0
-      realm: by-kiel-dev
+      realm: ${keycloak.realm}
       organisations-einheit-id-key: organisationseinheitId
       client: alfa
       ldap-id-key: LDAP_ID
-keycloak:
-  url: https://sso.dev.by.ozg-cloud.de
\ No newline at end of file
+
+ozgcloud:
+  usersync:
+    period: disabled
\ No newline at end of file
diff --git a/user-manager-server/src/main/resources/application.yaml b/user-manager-server/src/main/resources/application.yaml
index 261320fb74bbfba6f6b5780c96a6daec2b8aa325..6efd2f1f6ad34f0e2f2493c9db44e041c37d7f91 100644
--- a/user-manager-server/src/main/resources/application.yaml
+++ b/user-manager-server/src/main/resources/application.yaml
@@ -1,46 +1,48 @@
 "%prod":
-   quarkus:
-      grpc:
-         server:
-            ssl:
-               certificate: /user-manager-tls-certificate/tls.crt
-               key: /user-manager-tls-certificate/tls.key
+  quarkus:
+    grpc:
+      server:
+        ssl:
+          certificate: /user-manager-tls-certificate/tls.crt
+          key: /user-manager-tls-certificate/tls.key
 quarkus:
- application:
-  name: kopusermanager
- http:
-  cors:
-    ~: true
-  auth:
-   permission:
-    bearer:
-     paths: /api/userProfiles/*,/api/user/*
-     policy: authenticated
-    permit-migration:
-     paths: /api/migration/user/*
-     policy: permit
-     methods: GET
-    deny-api:
-     paths: /api/*
-     policy: deny
- scheduler:
-  metrics:
-   enabled: true
- log:
-  level: INFO
- mongodb:
-  database: usermanager
+  application:
+    name: kopusermanager
+  http:
+    cors:
+      ~: true
+    auth:
+      permission:
+        bearer:
+          paths: /api/userProfiles/*,/api/user/*
+          policy: authenticated
+        permit-migration:
+          paths: /api/migration/user/*
+          policy: permit
+          methods: GET
+        deny-api:
+          paths: /api/*
+          policy: deny
+  scheduler:
+    metrics:
+      enabled: true
+  log:
+    level: INFO
+  mongodb:
+    database: usermanager
 grpc:
- server:
-  enable-reflection-service: true
+  server:
+    enable-reflection-service: true
 kop:
- keycloak:
-  api:
-   ldap-id-key: LDAP_ID
-   organisations-einheit-id-key: organisationseinheitId
-   user: "-"
-   password: "-"
-   realm: by-kiel-dev
-   client: alfa
-  sync:
-   cron: "0 5 2 * * ?"
\ No newline at end of file
+  keycloak:
+    api:
+      ldap-id-key: LDAP_ID
+      organisations-einheit-id-key: organisationseinheitId
+      user: "-"
+      password: "-"
+      realm: by-kiel-dev
+      client: alfa
+
+ozgcloud:
+  usersync:
+    period: "6h"
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/RoleHierarchyTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/RoleHierarchyTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..817276ee3679e4a0c72d29f9890e18ec5f9485a7
--- /dev/null
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/RoleHierarchyTest.java
@@ -0,0 +1,91 @@
+package de.itvsh.kop.user;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Spy;
+
+class RoleHierarchyTest {
+
+	private final RoleHierarchy subRole = RoleHierarchy.builder().roleName(UserRole.VERWALTUNG_USER).build();
+	@Spy
+	private final RoleHierarchy root = RoleHierarchy.builder()
+			.roleName(UserRole.VERWALTUNG_LOESCHEN)
+			.subRole(subRole)
+			.build();
+
+	@Nested
+	class TestGetFlattenedHierarchy {
+
+		@Test
+		void shouldCollectSubRoles() {
+			root.getFlattenedHierarchy(UserRole.VERWALTUNG_LOESCHEN);
+
+			verify(root).collectSubRoles(eq(root), eq(UserRole.VERWALTUNG_LOESCHEN), any(Deque.class));
+		}
+	}
+
+	@Nested
+	class TestCollectSubRoles {
+
+		private static final String UNKNOWN_ROLE = "unknown";
+
+		private final Deque<String> collectedSubRoles = new ArrayDeque<>();
+
+		@Test
+		void shouldAddLast() {
+			root.collectSubRoles(root, UserRole.VERWALTUNG_LOESCHEN, collectedSubRoles);
+
+			assertThat(collectedSubRoles).containsExactly(UserRole.VERWALTUNG_LOESCHEN);
+		}
+
+		@Test
+		void shouldReturnTrue() {
+			var result = root.collectSubRoles(root, UserRole.VERWALTUNG_LOESCHEN, collectedSubRoles);
+
+			assertThat(result).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalse() {
+			var result = root.collectSubRoles(root, UNKNOWN_ROLE, collectedSubRoles);
+
+			assertThat(result).isFalse();
+		}
+
+		@Test
+		void shouldCollectSubRoles() {
+			root.collectSubRoles(root, UserRole.VERWALTUNG_USER, collectedSubRoles);
+
+			verify(root).collectSubRoles(subRole, UserRole.VERWALTUNG_USER, collectedSubRoles);
+		}
+
+		@Test
+		void shouldReturnTrueOnExistingRole() {
+			var result = root.collectSubRoles(root, UserRole.VERWALTUNG_USER, collectedSubRoles);
+
+			assertThat(result).isTrue();
+		}
+
+		@Test
+		void shouldAddLastSubRole() {
+			root.collectSubRoles(root, UserRole.VERWALTUNG_USER, collectedSubRoles);
+
+			assertThat(collectedSubRoles).containsExactly(UserRole.VERWALTUNG_LOESCHEN, UserRole.VERWALTUNG_USER);
+		}
+
+		@Test
+		void shouldRemoveLast() {
+			root.collectSubRoles(root, UserRole.VERWALTUNG_LOESCHEN, collectedSubRoles);
+
+			assertThat(collectedSubRoles).containsExactly(UserRole.VERWALTUNG_LOESCHEN);
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceITCase.java
index 681995a88aba6026d9375666177a89cce0c1a03e..449be2557563ea8477ecfd091dd3c0fc190f2a97 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceITCase.java
@@ -40,15 +40,15 @@ import org.junit.jupiter.api.Test;
 import de.itvsh.kop.user.common.errorhandling.ApiErrorUtil;
 import de.itvsh.kop.user.common.errorhandling.ResourceNotFoundException;
 import de.itvsh.kop.user.settings.UserSettingsResource;
+import io.quarkus.test.InjectMock;
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.TestProfile;
-import io.quarkus.test.junit.mockito.InjectMock;
 
 @QuarkusTest
 @TestProfile(UserProfileResourceTestProfile.class)
 class UserProfileResourceITCase {
-	private static final String HTTP_LOCALHOST = "http://localhost:9092";
 
+	private static final String HTTP_LOCALHOST = "http://localhost:9092";
 	private static final String SEARCH_PATH = UserProfileResource.USERS_PATH + "/?" + UserProfileResource.PARAM_SEARCH_BY + "=";
 
 	@InjectMock
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceTest.java
index 7c18326ace0ad48828b11c54df40d35f8ffe0417..487b12e80cb3be8a94a2eeff5277aae3b5a98001 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceTest.java
@@ -41,8 +41,6 @@ import org.mockito.Mock;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.itvsh.kop.user.common.reflection.SaferReflection;
-
 class UserProfileResourceTest {
 
 	private static final String USER_MANAGER_URL = LoremIpsum.getInstance().getUrl();
@@ -52,16 +50,13 @@ class UserProfileResourceTest {
 
 	@Mock
 	private UserService userService;
+
 	@Mock
 	private UserProfileResourceAssembler resourceAssembler;
 
 	@BeforeEach
 	void init() {
-		mockUserManagerUrl();
-	}
-
-	private void mockUserManagerUrl() {
-		SaferReflection.setField("userManagerUrl", resource, USER_MANAGER_URL);
+		resource.userManagerUrl = USER_MANAGER_URL;
 	}
 
 	@Nested
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryITCase.java
index 0b8ddba96baa53d01f8ae9e68e0d817c1e5d4960..13f17a487de01fa5311d6d2ebc96f01099641228 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryITCase.java
@@ -30,7 +30,7 @@ import java.time.Instant;
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceStub.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceStub.java
index 509d8fd418af30bd70cebd4b5c265a4ed5833a84..723b607643a197e211eeba65f7223fa55fe08120 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceStub.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceStub.java
@@ -26,7 +26,7 @@ package de.itvsh.kop.user;
 import java.util.List;
 import java.util.Map;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.keycloak.admin.client.resource.RoleMappingResource;
 import org.keycloak.admin.client.resource.RoleScopeResource;
@@ -44,6 +44,7 @@ import lombok.NoArgsConstructor;
 
 @NoArgsConstructor
 class UserResourceStub implements UserResource {
+
 	private UserRepresentation userRepresentation = UserRepresentationTestFactory.create();
 	private List<GroupRepresentation> groups = List.of(GroupRepresentationTestFactory.createGroup(UserResourceMapperTest.GROUP_1_PATH));
 
@@ -60,6 +61,11 @@ class UserResourceStub implements UserResource {
 		return userRepresentation;
 	}
 
+	@Override
+	public UserRepresentation toRepresentation(boolean userProfileMetadata) {
+		return userRepresentation;
+	}
+
 	@Override
 	public void update(UserRepresentation userRepresentation) {
 		// not implemented
@@ -95,6 +101,11 @@ class UserResourceStub implements UserResource {
 		return groups();
 	}
 
+	@Override
+	public List<GroupRepresentation> groups(String search, boolean briefRepresentation) {
+		return groups();
+	}
+
 	@Override
 	public List<GroupRepresentation> groups(String search, Integer firstResult, Integer maxResults, boolean briefRepresentation) {
 		return groups();
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserRoleTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRoleTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b38a8a5bdafeb3e276388dad606785edcf193891
--- /dev/null
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRoleTest.java
@@ -0,0 +1,38 @@
+package de.itvsh.kop.user;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class UserRoleTest {
+
+	@Nested
+	class TestContainsWithinRoleHierarchy {
+
+		@Test
+		void shouldReturnTrue() {
+			var containsRole = UserRole.containsWithinRoleHierarchy(List.of(UserRole.VERWALTUNG_LOESCHEN), UserRole.VERWALTUNG_USER);
+
+			assertThat(containsRole).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalse() {
+			var containsRole = UserRole.containsWithinRoleHierarchy(List.of(UserRole.VERWALTUNG_USER), UserRole.VERWALTUNG_LOESCHEN);
+
+			assertThat(containsRole).isFalse();
+		}
+
+		@Test
+		void shouldReturnTrueOnSame() {
+			var containsRole = UserRole.containsWithinRoleHierarchy(List.of(UserRole.VERWALTUNG_USER), UserRole.VERWALTUNG_USER);
+
+			assertThat(containsRole).isTrue();
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceITCase.java
index d7514fd1e43d5c786d06838472c706daa297809c..7375478b17e8921a6fbca7aae4a93e56f1c062ed 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceITCase.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/JwtUtilTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/JwtUtilTest.java
index 11675400942724533a39ecbaff68de0a78bc6df7..db2c00701d8915ab340e3d13871e20bf8055729d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/JwtUtilTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/JwtUtilTest.java
@@ -30,8 +30,8 @@ import static org.mockito.Mockito.*;
 import java.util.List;
 import java.util.Map;
 
-import javax.json.Json;
-import javax.json.JsonArray;
+import jakarta.json.Json;
+import jakarta.json.JsonArray;
 
 import org.eclipse.microprofile.jwt.JsonWebToken;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextUserTestFactory.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextUserTestFactory.java
index f3e93702e91c56153f2c0de7501757a5b775d014..35314f684edff44f61630cc9943172f10f8a7acc 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextUserTestFactory.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextUserTestFactory.java
@@ -29,9 +29,6 @@ import com.thedeanda.lorem.LoremIpsum;
 
 public class CallContextUserTestFactory {
 
-	static final String NAME = CallContextMetadataTestFactory.NAME;
-	static final String ID = CallContextMetadataTestFactory.ID;
-
 	private static final String EMAIL = LoremIpsum.getInstance().getEmail();
 
 	public static CallContextUser create() {
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserServiceTest.java
index e4e9149858abdb8d3a817ff7ff0d1685327fc222..2ac6b2bea3a300647af748462a1a3a382b89a8c6 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CurrentCallContextUserServiceTest.java
@@ -24,13 +24,17 @@
 package de.itvsh.kop.user.common.callcontext;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.List;
 
 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.Spy;
-import org.springframework.util.ReflectionUtils;
+
+import de.itvsh.kop.user.UserRole;
 
 class CurrentCallContextUserServiceTest {
 
@@ -43,14 +47,6 @@ class CurrentCallContextUserServiceTest {
 	@Nested
 	class TestClearCallContextUser {
 
-		@BeforeEach
-		void init() {
-			var userField = ReflectionUtils.findField(CurrentCallContextUserService.class, "user");
-			userField.setAccessible(true);
-			ReflectionUtils.setField(userField, userService, callContextUser);
-			assertThat(userService.getCurrentCallContextUser()).isPresent();
-		}
-
 		@Test
 		void shouldSetUserToNull() {
 			userService.clearCallContextUser();
@@ -60,7 +56,7 @@ class CurrentCallContextUserServiceTest {
 	}
 
 	@Nested
-	class TestService {
+	class TestGetCurrentCallContextUser {
 
 		@BeforeEach
 		void init() {
@@ -72,4 +68,43 @@ class CurrentCallContextUserServiceTest {
 			assertThat(userService.getCurrentCallContextUser()).isPresent().get().isEqualTo(callContextUser);
 		}
 	}
+
+	@Nested
+	class TestHasRole {
+
+		private final CallContextUser callContextUser = CallContextUserTestFactory.createBuilder()
+				.roles(List.of(UserRole.VERWALTUNG_LOESCHEN))
+				.build();
+
+		@BeforeEach
+		void init() {
+			userService.setCallContextUser(callContextUser);
+		}
+
+		@Test
+		void shouldCheckRoleWithinHierarchy() {
+			try (var mock = mockStatic(UserRole.class)) {
+				mock.when(() -> UserRole.containsWithinRoleHierarchy(callContextUser.getRoles(), UserRole.VERWALTUNG_USER)).thenReturn(true);
+
+				userService.hasRole(UserRole.VERWALTUNG_USER);
+
+				mock.verify(() -> UserRole.containsWithinRoleHierarchy(callContextUser.getRoles(), UserRole.VERWALTUNG_USER));
+			}
+		}
+
+		@Test
+		void shouldReturnTrue() {
+			var hasRole = userService.hasRole(UserRole.VERWALTUNG_USER);
+
+			assertThat(hasRole).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalse() {
+			var hasRole = userService.hasRole("unknown");
+
+			assertThat(hasRole).isFalse();
+		}
+
+	}
 }
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptorTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptorTest.java
index b0123cb82a9ba22e84c18f4c422869e88cf6bb38..10c7379cc6d20f8133677cab57ecf7a81dec5c1f 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptorTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/GrpcCallContextInterceptorTest.java
@@ -28,8 +28,6 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.util.Optional;
-
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -37,11 +35,10 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
-import org.springframework.util.ReflectionUtils;
 
 import de.itvsh.kop.user.User;
 import de.itvsh.kop.user.UserTestFactory;
-import de.itvsh.kop.user.common.callcontext.GrpcCallContextInterceptor.LogContextSettingListener;
+import de.itvsh.kop.user.common.callcontext.GrpcCallContextInterceptor.*;
 import de.itvsh.kop.user.common.errorhandling.ResourceNotFoundException;
 import io.grpc.Metadata;
 import io.grpc.ServerCall;
@@ -289,11 +286,6 @@ class GrpcCallContextInterceptorTest {
 				@Nested
 				class TestWithExistingClientName {
 
-					@BeforeEach
-					void initListener() {
-						setClientName(Optional.of("ClientNameDummy"));
-					}
-
 					@Test
 					void shouldCallDoSurroundOn() {
 						listener.onReady();
@@ -306,9 +298,13 @@ class GrpcCallContextInterceptorTest {
 				@Nested
 				class TestWithMissingClientName {
 
+					private LogContextSettingListener<?, ?, ?> listener;
+					private Metadata headers = CallContextMetadataTestFactory.createMetadata();
+
 					@BeforeEach
 					void initListener() {
-						setClientName(Optional.empty());
+						headers.discardAll(GrpcUtil.createKeyOf(GrpcCallContextInterceptor.KEY_CLIENT_NAME));
+						listener = spy(interceptor.new LogContextSettingListener<>(delegate, originCall, headers));
 					}
 
 					@Test
@@ -326,12 +322,6 @@ class GrpcCallContextInterceptorTest {
 						verify(listener, never()).doSurroundOn(any());
 					}
 				}
-
-				private void setClientName(Optional<String> clientName) {
-					var field = ReflectionUtils.findField(LogContextSettingListener.class, "clientName");
-					field.setAccessible(true);
-					ReflectionUtils.setField(field, listener, clientName);
-				}
 			}
 		}
 
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptorTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptorTest.java
index c81a265dfcdd4cd7a0d4f2a723b31bb3127a41b6..c52e0e9039d7540e3cc3eb46dd0bff692fa0ad9d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptorTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpRequestInterceptorTest.java
@@ -29,8 +29,8 @@ import static org.mockito.Mockito.*;
 import java.util.List;
 import java.util.UUID;
 
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.ext.ReaderInterceptorContext;
+import jakarta.ws.rs.core.MultivaluedHashMap;
+import jakarta.ws.rs.ext.ReaderInterceptorContext;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilterTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilterTest.java
index afb1df56af11dccca2924c09cc839f1cbb5c2ae1..3c6898e71c94d7db8b4e0915bbc6e96e595f5856 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilterTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/HttpSecurityFilterTest.java
@@ -29,7 +29,7 @@ import static org.mockito.Mockito.*;
 
 import java.io.IOException;
 
-import javax.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestContext;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtilTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtilTest.java
index 1fdb9bd1e0b85059d3d25caedd03d14ad58b5de9..5d6ecf256749a33e64da5f993a3b3737190fc550 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtilTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ApiErrorUtilTest.java
@@ -28,7 +28,7 @@ import static org.mockito.Mockito.*;
 
 import java.util.UUID;
 
-import javax.ws.rs.NotFoundException;
+import jakarta.ws.rs.NotFoundException;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandlerTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandlerTest.java
index 3740e5fadbe4dcf3bc756adb8574cee7fa4b9928..87f36bfb19d040df215d86d5ce1dea82367ff439 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandlerTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/errorhandling/ExceptionHandlerTest.java
@@ -27,8 +27,8 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.UriInfo;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.core.UriInfo;
 
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/lock/LockRepositoryITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/lock/LockRepositoryITCase.java
index e7beac94930765c072fc5c9a036df1a234d387d7..37acb819bcfd930d301f49fe1e2a1527ac9e954c 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/lock/LockRepositoryITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/lock/LockRepositoryITCase.java
@@ -28,7 +28,7 @@ import static org.assertj.core.api.Assertions.*;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/reflection/SaferReflection.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/reflection/SaferReflection.java
deleted file mode 100644
index f9fb8aeb06c459e191e8c3409a25fcf11d856190..0000000000000000000000000000000000000000
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/reflection/SaferReflection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.itvsh.kop.user.common.reflection;
-
-import static java.lang.String.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-import org.springframework.util.ReflectionUtils;
-
-/**
- * Safer in this case means "with error handling".
- */
-public class SaferReflection {
-
-	private SaferReflection() {
-		// noop
-	}
-
-	public static <T, V> void setField(String fieldName, T target, V value) {
-		var field = ReflectionUtils.findField(target.getClass(), fieldName);
-		if (field == null) {
-			fail(format(
-					"Can't mock because of reflection error. Unknown field: %s. Check in code if the field name in class fits to the  string passed"
-							+ " to reflection call.",
-					fieldName));
-		}
-		field.setAccessible(true);
-		ReflectionUtils.setField(field, target, value);
-	}
-}
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceITCase.java
index e6d76f21ab88e617f83fc0c9f655fa5f45922e14..5514fea735b0e72673ad9f89c974903309fee5b5 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceITCase.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.keycloak;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.Test;
 
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceTest.java
index deb55ce6f6f4e247cd6478b70dce82cd3bba61a1..ffade1d3dfd22e111858ba54929a0e91b679526d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakApiServiceTest.java
@@ -31,9 +31,10 @@ import static org.mockito.Mockito.*;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
 
-import javax.ws.rs.BadRequestException;
-import javax.ws.rs.ClientErrorException;
-import javax.ws.rs.ProcessingException;
+import jakarta.ws.rs.BadRequestException;
+import jakarta.ws.rs.ClientErrorException;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.ProcessingException;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -43,6 +44,8 @@ import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.UserResource;
 import org.keycloak.admin.client.resource.UsersResource;
 import org.keycloak.representations.idm.UserRepresentation;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -123,6 +126,8 @@ class KeycloakApiServiceTest {
 
 		@Test
 		void shouldCallUsersResource() {
+			when(usersResource.get(anyString())).thenReturn(userResource);
+
 			service.findUserById(EXTERNAL_ID);
 
 			verify(usersResource).get(EXTERNAL_ID);
@@ -140,10 +145,21 @@ class KeycloakApiServiceTest {
 		@Test
 		@DisplayName("should not call mapper when user not found")
 		void shouldNotCallMapper() {
+			when(usersResource.get(anyString())).thenThrow(new NotFoundException());
+
 			service.findUserById("unknown_user");
 
 			verify(userResourceMapper, never()).toKopUser(any());
 		}
+
+		@Test
+		void shoulReturnEmpty() {
+			when(usersResource.get(USER_ID)).thenThrow(new NotFoundException());
+
+			var user = service.findUserById(USER_ID);
+
+			assertThat(user).isEmpty();
+		}
 	}
 
 	@DisplayName("handling keycloak exception")
@@ -228,7 +244,7 @@ class KeycloakApiServiceTest {
 			service.updateAttribute(KEYCLOAK_USER_ID, ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
 
 			verify(userRepresentation).singleAttribute(ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
-			verify(userResource).update(userRepresentation);
+			verify(service).tryUpdateUserResource(userResource, userRepresentation, ATTRIBUTE_NAME_USER_ID);
 		}
 
 		@Test
@@ -238,7 +254,7 @@ class KeycloakApiServiceTest {
 			service.updateAttribute(KEYCLOAK_USER_ID, ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
 
 			verify(userRepresentation).singleAttribute(ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
-			verify(userResource).update(userRepresentation);
+			verify(service).tryUpdateUserResource(userResource, userRepresentation, ATTRIBUTE_NAME_USER_ID);
 		}
 
 		@Test
@@ -246,7 +262,7 @@ class KeycloakApiServiceTest {
 			service.updateAttribute(KEYCLOAK_USER_ID, ATTRIBUTE_NAME_USER_ID, NEW_USER_ID);
 
 			verify(userRepresentation).singleAttribute(ATTRIBUTE_NAME_USER_ID, NEW_USER_ID);
-			verify(userResource).update(userRepresentation);
+			verify(service).tryUpdateUserResource(userResource, userRepresentation, ATTRIBUTE_NAME_USER_ID);
 		}
 
 		@Test
@@ -254,15 +270,44 @@ class KeycloakApiServiceTest {
 			service.updateAttribute(KEYCLOAK_USER_ID, ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
 
 			verify(userRepresentation, never()).singleAttribute(ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID);
+			verify(service, never()).tryUpdateUserResource(userResource, userRepresentation, ATTRIBUTE_NAME_USER_ID);
 		}
 
 		@Test
 		void shouldCatchBadRequestException() {
 			when(userRepresentation.firstAttribute(ATTRIBUTE_NAME_USER_ID)).thenReturn(NEW_USER_ID);
-			doThrow(new BadRequestException("error message")).when(userResource).update(userRepresentation);
+			doThrow(new BadRequestException("error message")).when(userResource).update(any(OlderUserRepresentation.class));
 
 			assertThatCode(
 					() -> service.updateAttribute(KEYCLOAK_USER_ID, ATTRIBUTE_NAME_USER_ID, ATTRIBUTE_VALUE_USER_ID)).doesNotThrowAnyException();
 		}
 	}
+
+	@Nested
+	class TestTryUpdateUserResource {
+
+		private static final String ATTRIBUTE_NAME_USER_ID = "userId";
+
+		@Captor
+		private ArgumentCaptor<UserRepresentation> userRepresentationArgumentCaptor;
+
+		@Mock
+		private UserRepresentation userRepresentation;
+
+		@Test
+		void shouldUpdateUserResource() {
+			service.tryUpdateUserResource(userResource, userRepresentation, ATTRIBUTE_NAME_USER_ID);
+
+			verify(userResource).update(any(OlderUserRepresentation.class));
+		}
+
+		@Test
+		void shouldCreateOlderUserRepresentation() {
+			service.tryUpdateUserResource(userResource, UserRepresentationTestFactory.create(), ATTRIBUTE_NAME_USER_ID);
+
+			verify(userResource).update(userRepresentationArgumentCaptor.capture());
+			assertThat(userRepresentationArgumentCaptor.getValue()).usingRecursiveComparison().isEqualTo(UserRepresentationTestFactory.create());
+		}
+
+	}
 }
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderITCase.java
index 19b26b81ea0b7c438b43a240ff57b191e5bc6246..02c286d771c81149cc20dfdb98488f3812b0e171 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderITCase.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.keycloak;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.Test;
 import org.keycloak.admin.client.resource.RealmResource;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderTest.java
index b12dcbdd5d082eb95c702715ca159fd6f7565a44..38ccbb5913a656b23d9d48f57efb832670967818 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakProviderTest.java
@@ -38,6 +38,7 @@ import org.mockito.Mock;
 import lombok.SneakyThrows;
 
 class KeycloakProviderTest {
+
 	@InjectMocks
 	KeycloakProvider keycloakProvider;
 	@Mock
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteServiceITCase.java
index 272a07ef904bb710f3af10f0d5e678c0752fda30..e98d518f0045f95f1865975aa14b3d7ee445943d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/keycloak/KeycloakUserRemoteServiceITCase.java
@@ -27,8 +27,8 @@ import static org.mockito.Mockito.*;
 
 import org.junit.jupiter.api.Test;
 
+import io.quarkus.test.InjectMock;
 import io.quarkus.test.junit.QuarkusTest;
-import io.quarkus.test.junit.mockito.InjectMock;
 import io.quarkus.test.junit.mockito.InjectSpy;
 
 @QuarkusTest
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepositoryITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepositoryITCase.java
index 4327c216e3645dd8213c9fe9a4a29ccab16322d0..1f1082a1749ce748a8787ad7406b30a6752c22fd 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepositoryITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/organisationseinheit/OrganisationsEinheitRepositoryITCase.java
@@ -2,7 +2,7 @@ package de.itvsh.kop.user.organisationseinheit;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -22,10 +22,10 @@ import io.quarkus.test.junit.TestProfile;
 class OrganisationsEinheitRepositoryITCase {
 
 	@Inject
-	private OrganisationsEinheitRepository repository;
+	OrganisationsEinheitRepository repository;
 
 	@Inject
-	private MongoClient mongoClient;
+	MongoClient mongoClient;
 
 	@Nested
 	@DisplayName("Test finding all Organisationseinheiten IDs")
@@ -53,8 +53,9 @@ class OrganisationsEinheitRepositoryITCase {
 
 			var result = repository.findAllOrganisationsEinheitIds();
 
-			assertThat(result).hasSize(1);
-			assertThat(result).containsExactlyInAnyOrder(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+			assertThat(result)
+					.hasSize(1)
+					.containsExactlyInAnyOrder(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
 		}
 	}
 
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientRepositoryITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientRepositoryITCase.java
index 34f8f13b572b828b4de160898f6d9757d72785b8..368f71a48ea68705ae361202e29325a21fe245b4 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientRepositoryITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientRepositoryITCase.java
@@ -3,7 +3,7 @@ package de.itvsh.kop.user.recipient;
 import static de.itvsh.kop.user.settings.NotificationsSendFor.*;
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsRepositoryITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsRepositoryITCase.java
index 98ba6e05eae2b41b8916532f998e7f8b3a2c56a8..5b7e3a403d2ff4304926ab4089b0a47f4dc32458 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsRepositoryITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsRepositoryITCase.java
@@ -2,7 +2,7 @@ package de.itvsh.kop.user.settings;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceITCase.java
index d0ec6596f715158fd7cd24f413ff6c0723131bf4..43d947736894688be42a0b457b32ef92ea6fb3d2 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceITCase.java
@@ -28,8 +28,8 @@ import static de.itvsh.kop.user.settings.UserSettingsResource.*;
 import static io.restassured.RestAssured.*;
 import static org.hamcrest.CoreMatchers.*;
 
-import javax.inject.Inject;
-import javax.ws.rs.core.MediaType;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.http.HttpStatus;
 import org.eclipse.microprofile.jwt.JsonWebToken;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceTest.java
index 7e4cc5d13c96a7b6738346fe85e8ee1423ec87f3..5b9c8c29d5d5e7fb59cbfeef93c0357956e6d636 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsResourceTest.java
@@ -30,7 +30,7 @@ import static org.mockito.Mockito.*;
 import java.util.Optional;
 import java.util.UUID;
 
-import javax.ws.rs.core.UriInfo;
+import jakarta.ws.rs.core.UriInfo;
 
 import org.bson.types.ObjectId;
 import org.eclipse.microprofile.jwt.JsonWebToken;
@@ -41,7 +41,6 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
-import org.springframework.util.ReflectionUtils;
 
 import com.thedeanda.lorem.LoremIpsum;
 
@@ -76,6 +75,11 @@ class UserSettingsResourceTest {
 	private final String USER_MANAGER_URL = LoremIpsum.getInstance().getUrl();
 	private final String USER_ID = UUID.randomUUID().toString();
 
+	@BeforeEach
+	void setUp() {
+		resource.userManagerUrl = USER_MANAGER_URL;
+	}
+
 	@DisplayName("Get Usersettings")
 	@Nested
 	class TestGetUserSettings {
@@ -86,8 +90,6 @@ class UserSettingsResourceTest {
 		void mockAccess() {
 			doNothing().when(resource).checkUserAccess(anyString());
 			when(userSettingsService.getByUserId(anyString())).thenReturn(userSettings);
-
-			mockUserManagerUrl();
 		}
 
 		@Test
@@ -167,8 +169,6 @@ class UserSettingsResourceTest {
 			void mockAccess() {
 				doNothing().when(resource).checkUserAccess(anyString());
 				when(userSettingsService.updateByUserId(any(UserSettings.class), anyString())).thenReturn(Optional.of(updatedUserSettings));
-
-				mockUserManagerUrl();
 			}
 
 			@Test
@@ -198,12 +198,6 @@ class UserSettingsResourceTest {
 		}
 	}
 
-	private void mockUserManagerUrl() {
-		var field = ReflectionUtils.findField(UserSettingsResource.class, "userManagerUrl");
-		field.setAccessible(true);
-		ReflectionUtils.setField(field, resource, USER_MANAGER_URL);
-	}
-
 	@DisplayName("Check User access")
 	@Nested
 	class TestCheckUserAccess {
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceITCase.java
index 47114b6455a1ee15b92be7076e9587983c8f1b3a..525c4af5b3259187eaf062a99c205062b0260a68 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceITCase.java
@@ -25,7 +25,7 @@ package de.itvsh.kop.user.settings;
 
 import static org.assertj.core.api.Assertions.*;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncSchedulerITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncSchedulerITCase.java
index 953d9120f03fc5636b02cb84344f62a6f24ce27b..969600a23fc6b42f6453402e710afbae26ff4948 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncSchedulerITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncSchedulerITCase.java
@@ -10,7 +10,7 @@ import java.util.Arrays;
 import java.util.Map;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.bson.Document;
 import org.junit.jupiter.api.BeforeEach;
@@ -28,9 +28,9 @@ import de.itvsh.kop.user.UserTestFactory;
 import de.itvsh.kop.user.common.MongoDbTestProfile;
 import de.itvsh.kop.user.common.lock.Lock;
 import de.itvsh.kop.user.keycloak.KeycloakUserRemoteService;
+import io.quarkus.test.InjectMock;
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.TestProfile;
-import io.quarkus.test.junit.mockito.InjectMock;
 import io.quarkus.test.junit.mockito.InjectSpy;
 
 @QuarkusTest
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncServiceITCase.java
index 909b45f550134ac338635afa61a0537b1ce66c5a..e1685bd2497fa8b3dbad7890e8a2d0df15fbacee 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/sync/SyncServiceITCase.java
@@ -32,7 +32,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -46,9 +46,9 @@ import de.itvsh.kop.user.UserService;
 import de.itvsh.kop.user.UserTestFactory;
 import de.itvsh.kop.user.common.MongoDbTestProfile;
 import de.itvsh.kop.user.keycloak.KeycloakUserRemoteService;
+import io.quarkus.test.InjectMock;
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.TestProfile;
-import io.quarkus.test.junit.mockito.InjectMock;
 import io.quarkus.test.junit.mockito.InjectSpy;
 
 @QuarkusTest
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileGrpcServiceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileGrpcServiceITCase.java
index b511232c016fbcaccea195f75bcf2bbbb6fbdefe..972f94a7e80eb3dfa5d0de80ab148012a7cfc368 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileGrpcServiceITCase.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileGrpcServiceITCase.java
@@ -16,8 +16,8 @@ import de.itvsh.kop.user.common.callcontext.CallContextInterceptorTestFactory;
 import de.itvsh.kop.user.grpc.userprofile.UserProfileServiceGrpc.UserProfileServiceBlockingStub;
 import io.grpc.StatusRuntimeException;
 import io.quarkus.grpc.GrpcClient;
+import io.quarkus.test.InjectMock;
 import io.quarkus.test.junit.QuarkusTest;
-import io.quarkus.test.junit.mockito.InjectMock;
 
 @QuarkusTest
 class UserProfileGrpcServiceITCase {
diff --git a/user-manager-server/src/test/resources/application.yml b/user-manager-server/src/test/resources/application.yml
index 59023b08da38b4572c5940bc17759d4f00fc831f..f79dce9046b519b1c9c06b7b847ef069763818da 100644
--- a/user-manager-server/src/test/resources/application.yml
+++ b/user-manager-server/src/test/resources/application.yml
@@ -1,33 +1,35 @@
 quarkus:
- keycloak:
-  devservices:
-   enabled: false
- application:
-  name: kopusermanager
- mongodb:
-  devservices:
-   enabled: false
-  database: usermanager
- scheduler:
-  metrics:
-   enabled: true
- log:
-  level: INFO
- oidc:
-  auth-server-url: https://sso.dev.ozg-sh.de/realms/sh-kiel-dev
+  keycloak:
+    devservices:
+      enabled: false
+  application:
+    name: kopusermanager
+  mongodb:
+    devservices:
+      enabled: false
+    database: usermanager
+  scheduler:
+    metrics:
+      enabled: true
+  log:
+    level: INFO
+  oidc:
+    auth-server-url: https://sso.dev.by.ozg-cloud.de/realms/by-kiel-dev
 
 kop:
- keycloak:
-  sync:
-   cron: "0 15 13 * * ?"
-  api:
-   user: "-"
-   password: "-"
-   realm: sh-kiel-dev
-   organisations-einheit-id-key: organisationseinheitId
-   ldap-id-key: LDAP_ID
-   client: sh-kiel-dev-goofy
- user-manager:
-  url: http://localhost:9092
+  keycloak:
+    api:
+      user: "-"
+      password: "-"
+      realm: by-kiel-dev
+      organisations-einheit-id-key: organisationseinheitId
+      ldap-id-key: LDAP_ID
+      client: sh-kiel-dev-goofy
+  user-manager:
+    url: http://localhost:9092
 keycloak:
- url: http://localhost:8088
\ No newline at end of file
+  url: http://localhost:8088
+
+ozgcloud:
+  usersync:
+    period: disabled
\ No newline at end of file