diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/User.java b/user-manager-server/src/main/java/de/itvsh/kop/user/User.java
index 99c8a9722443fb8bed03ef8caf47b372e895ff05..145d92dbf79f662eed14dd0b2adbbb3f65594e92 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/User.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/User.java
@@ -57,8 +57,8 @@ public class User {
 	public static final String LASTNAME_FIELD = "lastName";
 	public static final String FIRSTNAME_FIELD = "firstName";
 	public static final String USERNAME_FIELD = "username";
-	static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds";
-	static final String NOTIFICATION_SEND_FOR_FIELD = "userSettings.notificationsSendFor";
+	public static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds";
+	public static final String NOTIFICATION_SEND_FOR_FIELD = "userSettings.notificationsSendFor";
 
 	@JsonIgnore
 	@BsonId
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/UserIdResource.java b/user-manager-server/src/main/java/de/itvsh/kop/user/UserIdResource.java
deleted file mode 100644
index 7b63864025ccfe0fc3153ca5c8ca2756e060937d..0000000000000000000000000000000000000000
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/UserIdResource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.user;
-
-import javax.annotation.security.PermitAll;
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-
-import de.itvsh.kop.common.logging.KopLogging;
-
-@KopLogging
-@Path(UserIdResource.PATH_MIGRATION)
-public class UserIdResource {
-	static final String PATH_MIGRATION = "/migration/user"; // NOSONAR
-	@Inject
-	UserService userService;
-
-	@GET
-	@Path("/{id}")
-	@PermitAll
-	public String findByExternalId(@PathParam(value = "id") String id) {
-		return userService.findByExternalId(id).getId().toHexString();
-	}
-
-}
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 79533852c5d7b1ed85fbe753dac372140b2bf9d7..4db774a6227542cf4c154275b8416ba02f4bd26c 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
@@ -25,7 +25,6 @@ package de.itvsh.kop.user;
 
 import static de.itvsh.kop.user.User.*;
 
-import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -35,12 +34,12 @@ import org.bson.types.ObjectId;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.common.errorhandling.ResourceNotFoundException;
-import de.itvsh.kop.user.settings.NotificationsSendFor;
 import io.quarkus.mongodb.panache.PanacheMongoRepository;
 
 @ApplicationScoped
 @KopLogging
 class UserRepository implements PanacheMongoRepository<User> {
+
 	private static final String LIKE_OR = " like ?1 or ";
 	private static final String SEARCH_QUERY = LASTNAME_FIELD + LIKE_OR +
 			FIRSTNAME_FIELD + LIKE_OR +
@@ -48,8 +47,6 @@ class UserRepository implements PanacheMongoRepository<User> {
 			EMAIL_FIELD + " like ?1";
 
 	private static final String AND_DELETED = " and deleted = ?2";
-
-	private static final String SEARCH_RECIPIENT_QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + NOTIFICATION_SEND_FOR_FIELD + " = ?2";
 	private static final String UPDATE_UNSYNCED_USER_QUERY = LAST_SYNC_TIMESTAMP_FIELD + " < ?1";
 
 	public User updateUser(User userToUpdate) {
@@ -80,10 +77,6 @@ class UserRepository implements PanacheMongoRepository<User> {
 		return find(SEARCH_QUERY + AND_DELETED, "/.*" + query + "*/i", deleted).range(0, limit - 1).stream();
 	}
 
-	public List<User> findRecipientByOrganisationsEinheitId(String organisationseinheitId) {
-		return find(SEARCH_RECIPIENT_QUERY, organisationseinheitId, NotificationsSendFor.ALL.name()).list();
-	}
-
 	public long updateUnsyncedUsers(long lastSyncTimestamp) {
 		return update(DELETED_FIELD, true).where(UPDATE_UNSYNCED_USER_QUERY, lastSyncTimestamp);
 	}
@@ -92,4 +85,4 @@ class UserRepository implements PanacheMongoRepository<User> {
 		return findByIdOptional(user.getId())
 				.orElse(findByExternalId(user.getExternalId()).orElseThrow(() -> new ResourceNotFoundException(User.class, user.getExternalId())));
 	}
-}
+}
\ No newline at end of file
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 930db5ccedf04d288dcfcf0f95523abae28e7c7d..8759f9450f75518b28395204f18d9721386a3c3e 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
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -68,7 +69,7 @@ public abstract class UserResourceMapper {
 	Date mapCreatedAt(UserResource userRes) {
 		var createdAt = userRes.toRepresentation().getCreatedTimestamp();
 
-		return createdAt != null ? new Date(createdAt) : new Date();
+		return Optional.ofNullable(createdAt).map(Date::new).orElse(new Date());
 	}
 
 	Set<String> mapOrganisationsEinheitIds(UserResource userRes) {
@@ -79,10 +80,7 @@ public abstract class UserResourceMapper {
 
 	private List<String> getOrganisationsEinheitIdsFromGroups(List<GroupRepresentation> groups) {
 		return groups.stream()
-				.map(group -> {
-					var groupFromRealm = realm.getGroupByPath(group.getPath());
-					return groupFromRealm != null ? groupFromRealm.getAttributes() : null;
-				})
+				.map(this::mapGroup)
 				.filter(Objects::nonNull)
 				.map(attributeMap -> attributeMap.get(properties.organisationsEinheitIdKey()))
 				.filter(Objects::nonNull)
@@ -90,6 +88,12 @@ public abstract class UserResourceMapper {
 				.toList();
 	}
 
+	private Map<String, List<String>> mapGroup(GroupRepresentation group) {
+		var groupFromRealm = realm.getGroupByPath(group.getPath());
+
+		return Optional.ofNullable(groupFromRealm).map(GroupRepresentation::getAttributes).orElse(null);
+	}
+
 	List<String> mapRoles(UserResource userRes) {
 		var roleRepresentation = Optional.ofNullable(userRes.roles().getAll().getClientMappings())
 				.filter(Objects::nonNull)
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 5306416e269989e160ee6df9204209e59bf17fbd..29faba06212925767f2281d5a45d33a7c7ef245a 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
@@ -23,7 +23,6 @@
  */
 package de.itvsh.kop.user;
 
-import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -81,14 +80,10 @@ public class UserService {
 		repository.updateUnsyncedUsers(lastSyncTimestamp);
 	}
 
-	public List<User> findRecipientByOrganisationsEinheitId(String organisationsEinheitId) {
-		return repository.findRecipientByOrganisationsEinheitId(organisationsEinheitId);
-	}
-
 	public User getById(String id) {
 		if (id.contains(UUID_PATTERN)) {
 			// TODO wenn user migriert wurden wieder entfernen.
-			return repository.findByExternalId(id).orElseThrow(() -> new ResourceNotFoundException(User.class, id));
+			return findByExternalId(id);
 		}
 
 		return repository.findById(id).orElseThrow(() -> new ResourceNotFoundException(User.class, id));
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcUtil.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcUtil.java
index be21f7a6b4cc6a48b9651c77b4dca899b51020b9..07b3cfb40c353e8b94b6034103d22ad2f971a1ad 100644
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcUtil.java
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/common/callcontext/GrpcUtil.java
@@ -10,7 +10,7 @@ import io.grpc.Metadata;
 import io.grpc.Metadata.Key;
 
 // TODO move to a grpcUtil class in common
-public class GrpcUtil {
+class GrpcUtil {
 
 	public static Optional<String> getFromHeaders(String key, Metadata headers) {
 		return Optional.ofNullable(headers.get(createKeyOf(key)))
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/KeycloakClientException.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/KeycloakClientException.java
deleted file mode 100644
index 36ac5c5f33c54ad7c6b6bade0f67477ff6858028..0000000000000000000000000000000000000000
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/KeycloakClientException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.user.common.errorhandling;
-
-public class KeycloakClientException extends TechnicalException {
-
-	private static final long serialVersionUID = 1L;
-
-	private static final String MESSAGE_TEMPLATE = "Access Denied for admin user: %s, realm: %s, url: %s";
-
-	public KeycloakClientException(String user, String realm, String url, Throwable cause) {
-		super(String.format(MESSAGE_TEMPLATE, user, realm, url), cause);
-	}
-}
\ No newline at end of file
diff --git a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/UserNotFoundException.java b/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/UserNotFoundException.java
deleted file mode 100644
index d869f78bebfad4fdd2475985416f239f5b3dc757..0000000000000000000000000000000000000000
--- a/user-manager-server/src/main/java/de/itvsh/kop/user/common/errorhandling/UserNotFoundException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.user.common.errorhandling;
-
-public class UserNotFoundException extends TechnicalException {
-
-	private static final long serialVersionUID = 1L;
-
-	private static final String MESSAGE_WITH_EXTERNALID_TEMPLATE = "User not found for keycloak id %s";
-	private static final String MESSAGE_WITH_ID_TEMPLATE = "User not found for id %s";
-
-	public UserNotFoundException(String id) {
-		super(String.format(MESSAGE_WITH_ID_TEMPLATE, id));
-	}
-
-	public UserNotFoundException(String externalId, Throwable cause) {
-		super(String.format(MESSAGE_WITH_EXTERNALID_TEMPLATE, externalId), cause);
-	}
-}
\ No newline at end of file
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 403fc8bd1e2076239aa5bedbd7a89bad908643b2..c0bdac2070c68ccc89045b1ae1e21a6a84b7834a 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
@@ -33,11 +33,11 @@ import javax.inject.Inject;
 import javax.ws.rs.ClientErrorException;
 import javax.ws.rs.ProcessingException;
 
-import de.itvsh.kop.common.logging.KopLogging;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.representations.idm.UserRepresentation;
 
+import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.RemoteUserIterator;
 import de.itvsh.kop.user.User;
 import de.itvsh.kop.user.UserResourceMapper;
@@ -74,7 +74,7 @@ class KeycloakApiService {
 		return mapper.toKopUser(realmResource.users().get(userRepresentation.getId()));
 	}
 
-	private <T> T handlingKeycloakException(Supplier<T> runnable) {
+	<T> T handlingKeycloakException(Supplier<T> runnable) {
 		try {
 			return runnable.get();
 		} catch (ClientErrorException | ProcessingException | IllegalStateException e) {
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 b66c0bdac1aebc48cf10e7a4c25838bab79ec45b..585511220ac067c02248c7f0246776ef6540770a 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
@@ -24,7 +24,6 @@
 package de.itvsh.kop.user.recipient;
 
 import java.util.Collection;
-import java.util.List;
 
 import javax.inject.Inject;
 
@@ -45,14 +44,13 @@ public class RecipientGrpcService extends RecipientServiceImplBase {
 
 	@Override
 	public void findRecipientByOrganisationsEinheitId(GrpcFindRecipientRequest request, StreamObserver<GrpcFindRecipientResponse> responseObserver) {
-		List<User> recipients = recipientService.findRecipientByOrganisationsEinheitId(request.getOrganisationsEinheitId());
+		var recipients = recipientService.findByOrganisationsEinheitId(request.getOrganisationsEinheitId());
 
-		responseObserver.onNext(buildSearchReponse(recipients.stream().map(recipientMapper::toRecipient).toList()));
+		responseObserver.onNext(buildSearchReponse(recipients));
 		responseObserver.onCompleted();
 	}
 
-	private GrpcFindRecipientResponse buildSearchReponse(Collection<GrpcRecipient> recipients) {
-		return GrpcFindRecipientResponse.newBuilder().addAllRecipient(recipients).build();
-
+	private GrpcFindRecipientResponse buildSearchReponse(Collection<User> recipients) {
+		return GrpcFindRecipientResponse.newBuilder().addAllRecipient(recipients.stream().map(recipientMapper::toRecipient).toList()).build();
 	}
-}
+}
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..dcebbee5daec02dca277310951821a20b29cda5d
--- /dev/null
+++ b/user-manager-server/src/main/java/de/itvsh/kop/user/recipient/RecipientRepository.java
@@ -0,0 +1,23 @@
+package de.itvsh.kop.user.recipient;
+
+import static de.itvsh.kop.user.User.*;
+
+import java.util.List;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import de.itvsh.kop.common.logging.KopLogging;
+import de.itvsh.kop.user.User;
+import de.itvsh.kop.user.settings.NotificationsSendFor;
+import io.quarkus.mongodb.panache.PanacheMongoRepository;
+
+@ApplicationScoped
+@KopLogging
+class RecipientRepository implements PanacheMongoRepository<User> {
+
+	private static final String SEARCH_RECIPIENT_QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + NOTIFICATION_SEND_FOR_FIELD + " = ?2";
+
+	public List<User> findByOrganisationsEinheitId(String organisationseinheitId) {
+		return find(SEARCH_RECIPIENT_QUERY, organisationseinheitId, NotificationsSendFor.ALL.name()).list();
+	}
+}
\ No newline at end of file
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 922ee3eff17ec3302808852d6a0ac9c4d2d93e30..1f65e76a32008a7bf7030202633f76bce9f23545 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
@@ -31,7 +31,6 @@ import javax.inject.Inject;
 import com.cronutils.utils.StringUtils;
 
 import de.itvsh.kop.user.User;
-import de.itvsh.kop.user.UserService;
 import de.itvsh.kop.user.common.errorhandling.FunctionalException;
 
 @ApplicationScoped
@@ -40,12 +39,12 @@ class RecipientService {
 	static final String MISSING_ORGANISATIONS_EINHEIT_ID_MESSAGE_TEMPLATE = "OrganisationsEinheitId ('%s') can not be null or empty";
 
 	@Inject
-	UserService userService;
+	RecipientRepository repository;
 
-	public List<User> findRecipientByOrganisationsEinheitId(String organisationsEinheitId) {
+	public List<User> findByOrganisationsEinheitId(String organisationsEinheitId) {
 		if (StringUtils.isEmpty(organisationsEinheitId)) {
 			throw new FunctionalException(() -> String.format(MISSING_ORGANISATIONS_EINHEIT_ID_MESSAGE_TEMPLATE, organisationsEinheitId));
 		}
-		return userService.findRecipientByOrganisationsEinheitId(organisationsEinheitId);
+		return repository.findByOrganisationsEinheitId(organisationsEinheitId);
 	}
 }
\ No newline at end of file
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 db61a750a743c31fb4605c0146ab1e5a8eb237a2..a22acb22fc7091f2425d6f72ef0029546c368293 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
@@ -31,7 +31,7 @@ import javax.inject.Inject;
 import de.itvsh.kop.user.UserService;
 
 @ApplicationScoped
-public class UserSettingsService {
+class UserSettingsService {
 
 	@Inject
 	UserService userService;
@@ -43,10 +43,6 @@ public class UserSettingsService {
 		return repository.updateByUserId(userId, userSettings);
 	}
 
-	public UserSettings findByUserId(String userId) {
-		return userService.getById(userId).getUserSettings();
-	}
-
 	public UserSettings getByUserId(String userId) {
 		var user = userService.getById(userId);
 
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 2561d97f954e711e72316d8b16efc8a929f1fdd4..38d8c517a48733610171badb402e683c6903071b 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,6 +25,7 @@ package de.itvsh.kop.user.userprofile;
 
 import javax.inject.Inject;
 
+import de.itvsh.kop.user.User;
 import de.itvsh.kop.user.UserService;
 import de.itvsh.kop.user.grpc.userprofile.GrpcGetUserProfileRequest;
 import de.itvsh.kop.user.grpc.userprofile.GrpcGetUserProfileResponse;
@@ -44,7 +45,11 @@ public class UserProfileGrpcService extends UserProfileServiceImplBase {
 	public void getById(GrpcGetUserProfileRequest request, StreamObserver<GrpcGetUserProfileResponse> responseObserver) {
 		var userProfile = service.getById(request.getUserId());
 
-		responseObserver.onNext(GrpcGetUserProfileResponse.newBuilder().setUserProfile(mapper.mapTo(userProfile)).build());
+		responseObserver.onNext(buildResponse(userProfile));
 		responseObserver.onCompleted();
 	}
+
+	private GrpcGetUserProfileResponse buildResponse(User userProfile) {
+		return GrpcGetUserProfileResponse.newBuilder().setUserProfile(mapper.mapTo(userProfile)).build();
+	}
 }
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserIdResourceITCase.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserIdResourceITCase.java
deleted file mode 100644
index d25f94c4b937b1c597320dcd715700cca2b640d5..0000000000000000000000000000000000000000
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserIdResourceITCase.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.user;
-
-import static io.restassured.RestAssured.*;
-import static org.hamcrest.CoreMatchers.*;
-import static org.mockito.Mockito.when;
-
-import org.junit.jupiter.api.Test;
-
-import io.quarkus.test.junit.QuarkusTest;
-import io.quarkus.test.junit.TestProfile;
-import io.quarkus.test.junit.mockito.InjectMock;
-
-@QuarkusTest
-@TestProfile(UserProfileResourceTestProfile.class)
-class UserIdResourceITCase {
-	private static final String EXTERNAL_ID_PATH = UserIdResource.PATH_MIGRATION + "/{id}";
-
-	@InjectMock
-	UserService userService;
-
-	@Test
-	void shouldGetInternalIdByExternalId() {
-		when(userService.findByExternalId(UserTestFactory.EXTERNAL_ID)).thenReturn(UserTestFactory.createWithId());
-
-		given()
-				.when().get(EXTERNAL_ID_PATH, UserTestFactory.EXTERNAL_ID)
-				.then()
-				.statusCode(200).body(is(UserTestFactory.ID.toHexString()));
-	}
-}
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceAssemblerTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceAssemblerTest.java
index d5d0be062c845c95ece65669dc1d1603e1b46d9f..3ca7db44890e49d1d266d4aa950d5721f514bf9b 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceAssemblerTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserProfileResourceAssemblerTest.java
@@ -23,7 +23,6 @@
  */
 package de.itvsh.kop.user;
 
-import static de.itvsh.kop.user.UserTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 
 import java.util.List;
@@ -48,33 +47,31 @@ class UserProfileResourceAssemblerTest {
 	@Nested
 	class TestToUserProfileResource {
 
-		private static final User USER = createWithId();
-
 		@Test
 		void shouldAddSelfLink() {
-			var res = assembler.toUserProfileResource(USER, USER_MANAGER_URL);
+			var res = assembler.toUserProfileResource(UserTestFactory.create(), USER_MANAGER_URL);
 
 			assertThat(res.getLinks().get(UserProfileResourceAssembler.REL_SELF))
 					.isNotNull()
 					.hasFieldOrPropertyWithValue("href",
-							USER_MANAGER_URL + UserProfileResource.USER_PROFILE_RESOURCE_PATH_TEMPLATE.replace("{id}", ID.toHexString()));
+							USER_MANAGER_URL + UserProfileResource.USER_PROFILE_RESOURCE_PATH_TEMPLATE.replace("{id}", UserTestFactory.ID_STR));
 		}
 
 		@Test
 		void shouldAddSettingsLink() {
-			var res = assembler.toUserProfileResource(USER, USER_MANAGER_URL);
+			var res = assembler.toUserProfileResource(UserTestFactory.create(), USER_MANAGER_URL);
 
 			assertThat(res.getLinks().get(UserProfileResourceAssembler.REL_SETTINGS))
 					.isNotNull()
 					.hasFieldOrPropertyWithValue("href",
-							USER_MANAGER_URL + UserSettingsResource.SETTINGS_LINK_PATTERN.replace("{id}", ID.toHexString()));
+							USER_MANAGER_URL + UserSettingsResource.SETTINGS_LINK_PATTERN.replace("{id}", UserTestFactory.ID_STR));
 		}
 	}
 
 	@DisplayName("To Userprofile Resource List")
 	@Nested
 	class TestToUserProfileResourceList {
-		private static final List<User> USERS = List.of(createWithId(), createWithId());
+		private static final List<User> USERS = List.of(UserTestFactory.create(), UserTestFactory.create());
 
 		@Test
 		void shouldAddSelfLink() {
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 e4b9d4d4d6199522de801f017acd08f41e332b9d..402863432e6d18b74937a0479771f72dfc47664a 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
@@ -26,8 +26,8 @@ package de.itvsh.kop.user;
 import static de.itvsh.kop.user.UserTestFactory.*;
 import static io.restassured.RestAssured.*;
 import static org.hamcrest.CoreMatchers.*;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
 import java.util.stream.Stream;
@@ -55,15 +55,18 @@ class UserProfileResourceITCase {
 	@InjectMock
 	UserService userService;
 
-	private String settingsUrlWithUserId = HTTP_LOCALHOST + UserSettingsResource.SETTINGS_LINK_PATTERN.replace("{id}", ID.toHexString());
-	private String urlWithUserId = HTTP_LOCALHOST + UserProfileResource.USER_PROFILE_RESOURCE_PATH_TEMPLATE.replace("{id}", ID.toHexString());
+	private String settingsUrlWithUserId = HTTP_LOCALHOST
+			+ UserSettingsResource.SETTINGS_LINK_PATTERN.replace("{id}", UserTestFactory.ID_STR);
+	private String urlWithUserId = HTTP_LOCALHOST
+			+ UserProfileResource.USER_PROFILE_RESOURCE_PATH_TEMPLATE.replace("{id}", UserTestFactory.ID_STR);
 
 	@DisplayName("Test get user by id")
 	@Nested
 	class TestGetUser {
+
 		@BeforeEach
 		void init() {
-			when(userService.getById(any())).thenReturn(createWithId());
+			when(userService.getById(any())).thenReturn(UserTestFactory.create());
 		}
 
 		@Test
@@ -71,7 +74,7 @@ class UserProfileResourceITCase {
 			given()
 					.when()
 					.accept(RestMediaType.APPLICATION_HAL_JSON)
-					.get(UserProfileResource.USERS_PATH + "/{id}", ID.toHexString())
+					.get(UserProfileResource.USERS_PATH + "/{id}", UserTestFactory.ID_STR)
 					.then().statusCode(200)
 					.body("_links.self.href", equalTo(urlWithUserId));
 		}
@@ -81,7 +84,7 @@ class UserProfileResourceITCase {
 			given()
 					.when()
 					.accept(RestMediaType.APPLICATION_HAL_JSON)
-					.get(UserProfileResource.USERS_PATH + "/{id}", ID.toHexString())
+					.get(UserProfileResource.USERS_PATH + "/{id}", UserTestFactory.ID_STR)
 					.then().statusCode(200)
 					.body("_links.settings.href", equalTo(settingsUrlWithUserId));
 		}
@@ -111,7 +114,7 @@ class UserProfileResourceITCase {
 
 		@BeforeEach
 		void init() {
-			when(userService.findUsers(any(), anyInt())).thenReturn(Stream.of(createWithId()));
+			when(userService.findUsers(any(), anyInt())).thenReturn(Stream.of(UserTestFactory.create()));
 		}
 
 		@Test
@@ -180,8 +183,8 @@ class UserProfileResourceITCase {
 
 		@Test
 		void shouldGetDeletedAndNotDeletedUsers() {
-			User user1 = UserTestFactory.createBuilder().deleted(false).build();
-			User user2 = UserTestFactory.createBuilder().deleted(true).build();
+			var user1 = UserTestFactory.createBuilder().deleted(false).build();
+			var user2 = UserTestFactory.createBuilder().deleted(true).build();
 			when(userService.findUsers(anyString(), anyInt())).thenReturn(Stream.of(user1, user2));
 
 			given()
@@ -202,7 +205,7 @@ class UserProfileResourceITCase {
 
 			@BeforeEach
 			void init() {
-				when(userService.findUsers(any(), anyInt())).thenReturn(Stream.of(createWithId()));
+				when(userService.findUsers(any(), anyInt())).thenReturn(Stream.of(UserTestFactory.create()));
 			}
 
 			@Test
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 6e56fcccbb75eef637f9af8ed91f8f362d3c22ab..3189e0c7f33edf85fad4f807da3d6eddc5291272 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
@@ -23,15 +23,16 @@
  */
 package de.itvsh.kop.user;
 
-import static de.itvsh.kop.user.settings.NotificationsSendFor.*;
 import static java.util.function.Predicate.not;
 import static org.assertj.core.api.Assertions.*;
 
 import java.time.Instant;
 import java.util.List;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -40,7 +41,6 @@ import org.junit.jupiter.api.Test;
 import com.thedeanda.lorem.LoremIpsum;
 
 import de.itvsh.kop.user.common.MongoDbTestProfile;
-import de.itvsh.kop.user.settings.UserSettings;
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.TestProfile;
 
@@ -51,25 +51,11 @@ class UserRepositoryITCase {
 	@Inject
 	UserRepository repository;
 
-	private User user1;
-	private User user2;
-
-	@BeforeEach
-	void init() {
-		repository.deleteAll();
-		user1 = UserTestFactory.create();
-		repository.persist(user1);
-
-		user2 = UserTestFactory.createBuilder().externalId("unknown").build();
-		repository.persist(user2);
-		user2 = user2.toBuilder().externalId(null).build();
-	}
-
 	@DisplayName("Update unsynced users")
 	@Nested
 	class TestUpdateUnsyncedUser {
 
-		private long lastSyncTimestamp = Instant.now().toEpochMilli();
+		private static final long NOW = Instant.now().toEpochMilli();
 
 		@BeforeEach
 		void init() {
@@ -78,18 +64,18 @@ class UserRepositoryITCase {
 
 		@Test
 		void shouldMarkUnsyncedUserAsDeleted() {
-			repository.persist(createUserWithLastSyncTimestamp(lastSyncTimestamp - 1000));
+			repository.persist(createUserWithLastSyncTimestamp(NOW - 1000));
 
-			repository.updateUnsyncedUsers(lastSyncTimestamp);
+			repository.updateUnsyncedUsers(NOW);
 
 			assertThat(getFirstUser().isDeleted()).isTrue();
 		}
 
 		@Test
 		void shouldNotMarkUserIfSynced() {
-			repository.persist(createUserWithLastSyncTimestamp(lastSyncTimestamp));
+			repository.persist(createUserWithLastSyncTimestamp(NOW));
 
-			repository.updateUnsyncedUsers(lastSyncTimestamp);
+			repository.updateUnsyncedUsers(NOW);
 
 			assertThat(getFirstUser().isDeleted()).isFalse();
 		}
@@ -99,215 +85,241 @@ class UserRepositoryITCase {
 		}
 
 		private User getFirstUser() {
-			var allUser = repository.findAll();
-			return allUser.list().get(0);
+			return repository.findAll().list().get(0);
 		}
 	}
 
-	@DisplayName("Find Users")
+	@DisplayName("Find all active user")
 	@Nested
-	class TestFindUsers {
-
-		private static final int LIMIT_5 = 5;
+	class TestFindAllActiveUser {
 
 		@BeforeEach
 		void init() {
 			repository.deleteAll();
-			repository.persist(UserTestFactory.createBuilder().email(LoremIpsum.getInstance().getEmail()).externalId("additional-id").build());
-			user1 = UserTestFactory.create();
-			repository.persist(user1);
+			repository.persist(UserTestFactory.create());
 		}
 
 		@Test
 		void shouldFindByLastName() {
-			var res = repository.findUsers(UserTestFactory.LAST_NAME, false, LIMIT_5);
+			var user = findAllActiveUser(UserTestFactory.LAST_NAME);
 
-			assertThat(res).isNotEmpty().hasSize(2);
+			assertThat(user).isNotEmpty().hasSize(1);
+		}
+
+		@Test
+		void shouldFindCaseInsensitive() {
+			var user = findAllActiveUser(UserTestFactory.LAST_NAME.toLowerCase());
+
+			assertThat(user).isNotEmpty().hasSize(1);
 		}
 
 		@Test
 		void shouldFindByFirstName() {
-			var res = repository.findUsers(UserTestFactory.FIRST_NAME, false, LIMIT_5);
+			var user = findAllActiveUser(UserTestFactory.FIRST_NAME);
 
-			assertThat(res).isNotEmpty().hasSize(2);
+			assertThat(user).isNotEmpty().hasSize(1);
 		}
 
 		@Test
 		void shouldFindByUsername() {
-			var res = repository.findUsers(UserTestFactory.USER_NAME, false, LIMIT_5);
+			var user = findAllActiveUser(UserTestFactory.USER_NAME);
 
-			assertThat(res).isNotEmpty().hasSize(2);
+			assertThat(user).isNotEmpty().hasSize(1);
 		}
 
 		@Test
 		void shouldFindByUsernamePart() {
-			var res = repository.findUsers(UserTestFactory.USER_NAME.substring(0, 4), false, LIMIT_5);
+			var user = findAllActiveUser(UserTestFactory.USER_NAME.substring(0, 4));
 
-			assertThat(res).isNotEmpty().hasSize(2);
+			assertThat(user).isNotEmpty().hasSize(1);
 		}
 
 		@Test
 		void shouldFindByEmail() {
-			var res = repository.findUsers(UserTestFactory.EMAIL, false, LIMIT_5);
+			var user = findAllActiveUser(UserTestFactory.EMAIL);
 
-			assertThat(res).isNotEmpty().hasSize(1);
+			assertThat(user).isNotEmpty().hasSize(1);
 		}
 
 		@Test
-		void shouldNotFind() {
-			var res = repository.findUsers("xxx", false, 5);
-			assertThat(res).isEmpty();
+		void shouldReturnEmptyListIfNotMatch() {
+			var user = findAllActiveUser("xxx");
+
+			assertThat(user).isEmpty();
 		}
 
-		@Test
-		void shouldFindCaseInsensitive() {
-			var res = repository.findUsers(UserTestFactory.LAST_NAME.toLowerCase(), false, LIMIT_5);
-			assertThat(res).isNotEmpty().hasSize(2);
+		private Stream<User> findAllActiveUser(String query) {
+			return repository.findUsers(query, false, 5);
 		}
 
 		@Test
-		void shouldFindByExternalId() {
-			var res = repository.findByExternalId(user1.getExternalId());
+		void shouldFindNotDeletedUsers() {
+			User user1 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Max").deleted(true).build();
+			User user2 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximilian").deleted(true).build();
+			User user3 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximus").deleted(false).build();
 
-			assertThat(res).isPresent();
-			assertThat(res.get().getExternalId()).isEqualTo(user1.getExternalId());
-		}
+			repository.persist(user1);
+			repository.persist(user2);
+			repository.persist(user3);
 
-		@Test
-		void shouldFindById() {
-			var res = repository.findById(user1.getId());
+			var foundUsers = findAllActiveUser("Max").toList();
 
-			assertThat(res).isNotNull();
-			assertThat(res.getId()).isEqualTo(user1.getId());
+			foundUsers.forEach(u -> assertThat(u.isDeleted()).isFalse());
 		}
 
 		@Test
-		void shouldFindByEmailOnly() {
-			var res = repository.findByEmail(user1.getEmail());
+		void shouldUseLimit() {
+			repository.persist(UserTestFactory.createBuilder().id(new ObjectId()).build());
 
-			assertThat(res).isPresent();
-			assertThat(res.get().getExternalId()).isEqualTo(user1.getExternalId());
+			var res = repository.findUsers(UserTestFactory.LAST_NAME.toLowerCase(), false, 2);
+			assertThat(res).isNotEmpty().hasSize(2);
 		}
+	}
 
-		@Test
-		void shouldNotFindByEmptyEmail() {
-			var res = repository.findByEmail(null);
+	@DisplayName("Find all")
+	@Nested
+	class TestFindAll {
 
-			assertThat(res).isEmpty();
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			repository.persist(UserTestFactory.createBuilder().id(new ObjectId()).email(LoremIpsum.getInstance().getEmail())
+					.externalId("additional-id").build());
+			repository.persist(UserTestFactory.create());
 		}
 
 		@Test
-		void shouldFindDeletedUsers() {
-			User user1 = UserTestFactory.createBuilder().firstName("Max").deleted(true).build();
-			User user2 = UserTestFactory.createBuilder().firstName("Maximilian").deleted(true).build();
-			User user3 = UserTestFactory.createBuilder().firstName("Maximus").deleted(false).build();
+		void shouldFindDeletedAndNotDeletedUsers() {
+			User user1 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Max").deleted(true).build();
+			User user2 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximilian").deleted(true).build();
+			User user3 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximus").deleted(false).build();
 
 			repository.persist(user1);
 			repository.persist(user2);
 			repository.persist(user3);
 
-			var foundUsers = repository.findUsers("Max", true, 10).toList();
+			var foundUsers = repository.findUsers("Max", 10).toList();
 
-			assertThat(foundUsers).hasSize(2);
-			foundUsers.forEach(u -> assertThat(u.isDeleted()).isTrue());
+			assertThat(foundUsers).hasSizeGreaterThan(2);
+			List<User> startWithMax = foundUsers.stream().filter(u -> u.getFirstName().startsWith("Max")).toList();
+			assertThat(startWithMax).hasSize(3);
+			assertThat(startWithMax.stream().filter(User::isDeleted).count()).isEqualTo(2);
+			assertThat(startWithMax.stream().filter(not(User::isDeleted)).count()).isEqualTo(1);
 		}
+	}
 
-		@Test
-		void shouldFindNotDeletedUsers() {
-			User user1 = UserTestFactory.createBuilder().firstName("Max").deleted(true).build();
-			User user2 = UserTestFactory.createBuilder().firstName("Maximilian").deleted(true).build();
-			User user3 = UserTestFactory.createBuilder().firstName("Maximus").deleted(false).build();
+	@DisplayName("Find all inactive user")
+	@Nested
+	class TestFindAllInactiveUser {
 
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			User user1 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Max").deleted(true).build();
+			User user2 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximilian").deleted(true).build();
+			User user3 = UserTestFactory.createBuilder().id(new ObjectId()).firstName("Maximus").deleted(false).build();
 			repository.persist(user1);
 			repository.persist(user2);
 			repository.persist(user3);
-
-			var foundUsers = repository.findUsers("Max", false, 10).toList();
-
-			foundUsers.forEach(u -> assertThat(u.isDeleted()).isFalse());
 		}
 
 		@Test
-		void shouldFindDeletedAndNotDeletedUsers() {
-			User user1 = UserTestFactory.createBuilder().firstName("Max").deleted(true).build();
-			User user2 = UserTestFactory.createBuilder().firstName("Maximilian").deleted(true).build();
-			User user3 = UserTestFactory.createBuilder().firstName("Maximus").deleted(false).build();
+		void shouldFindDeletedUsers() {
+			var foundUsers = repository.findUsers("Max", true, 10).toList();
 
-			repository.persist(user1);
-			repository.persist(user2);
-			repository.persist(user3);
+			assertThat(foundUsers).hasSize(2);
+			foundUsers.forEach(u -> assertThat(u.isDeleted()).isTrue());
+		}
 
-			var foundUsers = repository.findUsers("Max", 10).toList();
+	}
 
-			assertThat(foundUsers).hasSizeGreaterThan(2);
-			List<User> startWithMax = foundUsers.stream().filter(u -> u.getFirstName().startsWith("Max")).toList();
-			assertThat(startWithMax.size()).isEqualTo(3);
-			assertThat(startWithMax.stream().filter(User::isDeleted).count()).isEqualTo(2);
-			assertThat(startWithMax.stream().filter(not(User::isDeleted)).count()).isEqualTo(1);
+	@DisplayName("Find by externalId")
+	@Nested
+	class TestFindByExternalId {
+
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			repository.persist(UserTestFactory.create());
 		}
 
 		@Test
-		void shouldFindByOrganisationeinheitIdAndNotificatinoActivated() {
-			var recipientUser = UserTestFactory.createBuilder().userSettings(new UserSettings(ALL)).build();
-			var notRecipientUser = UserTestFactory.createBuilder().organisationsEinheitIds(List.of("a")).build();
-			repository.persist(List.of(notRecipientUser, recipientUser));
+		void shouldFindByExternalId() {
+			var user = repository.findByExternalId(UserTestFactory.EXTERNAL_ID);
 
-			var users = repository.findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+			assertThat(user).isPresent();
+			assertThat(user.get()).usingRecursiveComparison().isEqualTo(UserTestFactory.create());
+		}
+	}
+
+	@DisplayName("Find by id")
+	@Nested
+	class TestFindById {
 
-			assertThat(users).hasSize(1);
-			assertThat(users.get(0).getOrganisationsEinheitIds()).contains(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			repository.persist(UserTestFactory.create());
 		}
 
 		@Test
-		void shouldUseLimit() {
-			repository.persist(UserTestFactory.create());
+		void shouldFindById() {
+			var user = repository.findById(UserTestFactory.ID_STR);
 
-			var res = repository.findUsers(UserTestFactory.LAST_NAME.toLowerCase(), false, 2);
-			assertThat(res).isNotEmpty().hasSize(2);
+			assertThat(user).isNotNull();
+			assertThat(user.get()).usingRecursiveComparison().isEqualTo(UserTestFactory.create());
 		}
 	}
 
-	@DisplayName("Test refreshing user")
+	@DisplayName("Find by email")
 	@Nested
-	class TestRefresh {
+	class TestFindByEmail {
+
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			repository.persist(UserTestFactory.create());
+		}
+
 		@Test
-		void shouldRefreshByExternalId() {
-			var user = repository.refresh(user1.toBuilder().id(null).build());
+		void shouldFindByEmailOnly() {
+			var user = repository.findByEmail(UserTestFactory.EMAIL);
 
-			assertThat(user).isNotNull().hasFieldOrPropertyWithValue("id", user1.getId());
+			assertThat(user).isPresent();
+			assertThat(user.get()).usingRecursiveComparison().isEqualTo(UserTestFactory.create());
 		}
 
 		@Test
-		void shouldRefreshById() {
-			var user = repository.refresh(user1);
+		void shouldNotFindByEmptyEmail() {
+			var user = repository.findByEmail(null);
 
-			assertThat(user).isNotNull().hasFieldOrPropertyWithValue("id", user1.getId());
+			assertThat(user).isEmpty();
 		}
+
 	}
 
-	@DisplayName("Test for empty result list ")
+	@DisplayName("Test refreshing user")
 	@Nested
-	class TestReturnEmptyList {
-		@Test
-		void whenIdNotFound() {
-			var recipientUser = UserTestFactory.createBuilder().userSettings(new UserSettings(ALL)).build();
-			repository.persist(recipientUser);
-			var users = repository.findRecipientByOrganisationsEinheitId("some_id");
-			assertThat(users).isEmpty();
+	class TestRefresh {
+
+		@BeforeEach
+		void init() {
+			repository.deleteAll();
+			repository.persist(UserTestFactory.create());
 		}
 
 		@Test
-		void whenNotificationDeactivated() {
+		void shouldRefreshByExternalId() {
+			var user = repository.refresh(UserTestFactory.createBuilder().id(null).build());
 
-			var users = repository.findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
-			assertThat(users).isEmpty();
+			assertThat(user).usingRecursiveComparison().ignoringFields("id").isEqualTo(UserTestFactory.create());
 		}
 
 		@Test
-		void shouldReturnEmptyListNotificationDeactivated() {
-			var users = repository.findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+		void shouldRefreshById() {
+			var user = repository.refresh(UserTestFactory.create());
 
-			assertThat(users).isEmpty();
+			assertThat(user).usingRecursiveComparison().ignoringFields("id").isEqualTo(UserTestFactory.create());
 		}
 	}
-}
+}
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceMapperTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceMapperTest.java
index b863d0bf77774efe7e1c6cb8d82ea85543d7b921..0b03b88eccc01b2390f7fab1669b5397bbf3d48f 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceMapperTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserResourceMapperTest.java
@@ -39,7 +39,6 @@ import org.keycloak.admin.client.resource.RoleMappingResource;
 import org.keycloak.admin.client.resource.RoleScopeResource;
 import org.keycloak.admin.client.resource.UserResource;
 import org.keycloak.representations.idm.ClientMappingsRepresentation;
-import org.keycloak.representations.idm.GroupRepresentation;
 import org.keycloak.representations.idm.MappingsRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.mapstruct.factory.Mappers;
@@ -49,6 +48,7 @@ import org.mockito.Mock;
 import de.itvsh.kop.user.keycloak.KeycloakApiProperties;
 
 class UserResourceMapperTest {
+
 	static final String ORGANISATIONS_EINHEIT_ID_KEY = "organisationseinheitId";
 	static final String ORGANISATIONS_EINHEIT_ID_1 = "0815";
 	static final String ORGANISATIONS_EINHEIT_ID_2 = "4711";
@@ -59,16 +59,17 @@ class UserResourceMapperTest {
 	static final Map<String, List<String>> ATTRIBUTES_2 = Map.of(ORGANISATIONS_EINHEIT_ID_KEY, List.of(ORGANISATIONS_EINHEIT_ID_2));
 
 	@InjectMocks
-	private UserResourceMapper mapper = Mappers.getMapper(UserResourceMapper.class);
+	UserResourceMapper mapper = Mappers.getMapper(UserResourceMapper.class);
 
 	@Mock
-	private KeycloakApiProperties properties;
+	KeycloakApiProperties properties;
 
 	@Mock
-	private RealmResource realm;
+	RealmResource realm;
 
+	@DisplayName("To kop user")
 	@Nested
-	class TestMapping {
+	class TestToKopUser {
 
 		@BeforeEach
 		void init() {
@@ -84,80 +85,96 @@ class UserResourceMapperTest {
 
 		@Test
 		void shouldMapToUser() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user).isNotNull();
 		}
 
 		@Test
 		void shouldMapEmail() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getEmail()).isEqualTo(UserRepresentationTestFactory.EMAIL);
 		}
 
-		@Test
-		void shouldMapExternalId() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+		@DisplayName("externalId")
+		@Nested
+		class TestMapExternalId {
 
-			assertThat(user.getExternalId()).isEqualTo(UserRepresentationTestFactory.EXTERNAL_ID);
-		}
+			@Test
+			void shouldMap() {
+				var user = toKopUser();
 
-		@Test
-		void shouldMapExternalIdFallback() {
-			User user = mapper.toKopUser(UserResourceTestFactory.createWithAttributes(Map.of()));
+				assertThat(user.getExternalId()).isEqualTo(UserRepresentationTestFactory.EXTERNAL_ID);
+			}
+
+			@Test
+			void shouldMapFallbackOnEmptyAttributes() {
+				var user = toKopUser(UserResourceTestFactory.createWithAttributes(Collections.emptyMap()));
 
-			assertThat(user.getExternalId()).isEqualTo(UserRepresentationTestFactory.EXTERNAL_ID_FALLBACK);
+				assertThat(user.getExternalId()).isEqualTo(UserRepresentationTestFactory.EXTERNAL_ID_FALLBACK);
+			}
 		}
 
 		@Test
 		void shouldMapFirstName() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getFirstName()).isEqualTo(UserRepresentationTestFactory.FIRST_NAME);
 		}
 
 		@Test
 		void shouldMapLastName() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getLastName()).isEqualTo(UserRepresentationTestFactory.LAST_NAME);
 		}
 
 		@Test
 		void shouldMapUserName() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getUsername()).isEqualTo(UserRepresentationTestFactory.USER_NAME);
 		}
 
 		@Test
 		void shouldMapOrganisationsEinheitIds() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getOrganisationsEinheitIds()).isNotEmpty().contains(ORGANISATIONS_EINHEIT_ID_1);
 		}
 
 		@Test
 		void shouldMapMultipleOrganisationsEinheitIds() {
-			GroupRepresentation groupRepresentation = GroupRepresentationTestFactory.createByPathAndOrganisationEinheitId(GROUP_2_PATH,
+			var groupRepresentation = GroupRepresentationTestFactory.createByPathAndOrganisationEinheitId(GROUP_2_PATH,
 					ORGANISATIONS_EINHEIT_ID_2);
-
 			when(realm.getGroupByPath(GROUP_2_PATH)).thenReturn(groupRepresentation);
 
-			User user = mapper.toKopUser(
-					UserResourceTestFactory.createWithGroups(List.of(GroupRepresentationTestFactory.createGroup(UserResourceMapperTest.GROUP_1_PATH),
-							GroupRepresentationTestFactory.createGroup(UserResourceMapperTest.GROUP_2_PATH))));
+			var user = toKopUser(buildUserResourceWithGroups());
 
 			assertThat(user.getOrganisationsEinheitIds()).isNotEmpty().hasSize(2).contains(ORGANISATIONS_EINHEIT_ID_2);
 		}
 
+		private UserResource buildUserResourceWithGroups() {
+			return UserResourceTestFactory.createWithGroups(List.of(
+					GroupRepresentationTestFactory.createGroup(UserResourceMapperTest.GROUP_1_PATH),
+					GroupRepresentationTestFactory.createGroup(UserResourceMapperTest.GROUP_2_PATH)));
+		}
+
 		@Test
 		void shouldMapRoles() {
-			User user = mapper.toKopUser(UserResourceTestFactory.create());
+			var user = toKopUser();
 
 			assertThat(user.getRoles()).isNotEmpty().contains(UserRepresentationTestFactory.ROLE_NAME);
 		}
+
+		private User toKopUser() {
+			return toKopUser(UserResourceTestFactory.create());
+		}
+
+		private User toKopUser(UserResource userResource) {
+			return mapper.toKopUser(userResource);
+		}
 	}
 
 	@DisplayName("Get client roles")
@@ -165,18 +182,18 @@ class UserResourceMapperTest {
 	class TestGetClientRoles {
 
 		@Mock
-		private UserResource userResource;
+		UserResource userResource;
 
 		@Mock
-		private RoleMappingResource roleMappingResource;
+		RoleMappingResource roleMappingResource;
 		@Mock
-		private RoleScopeResource roleScopeResource;
+		RoleScopeResource roleScopeResource;
 		@Mock
-		private MappingsRepresentation mappingsRepresentation;
+		MappingsRepresentation mappingsRepresentation;
 		@Mock
-		private Map<String, ClientMappingsRepresentation> clientMappingsRepresentation;
+		Map<String, ClientMappingsRepresentation> clientMappingsRepresentation;
 		@Mock
-		private ClientMappingsRepresentation clientMappingRepresentation;
+		ClientMappingsRepresentation clientMappingRepresentation;
 
 		@BeforeEach
 		void init() {
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceTest.java
index 7bf81cd55b2ab07e26b19473a2fd192a87c41a8e..43235c6e126312539c0f9a7e0a993cfe3c68004d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserServiceTest.java
@@ -23,6 +23,7 @@
  */
 package de.itvsh.kop.user;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
@@ -39,6 +40,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
+import de.itvsh.kop.user.common.errorhandling.ResourceNotFoundException;
 import de.itvsh.kop.user.keycloak.KeycloakUserRemoteService;
 
 class UserServiceTest {
@@ -50,26 +52,64 @@ class UserServiceTest {
 	@Mock
 	KeycloakUserRemoteService keycloakRemoteService;
 
-	@DisplayName("Find by id")
+	@DisplayName("Get by id")
 	@Nested
-	class TestFindById {
+	class TestGetById {
 
-		@Test
-		void shouldFindByIdOnInternalId() {
-			when(repository.findById(anyString())).thenReturn(Optional.of(UserTestFactory.create()));
+		@DisplayName("on UUID pattern")
+		@Nested
+		class TestByUUID {
+
+			private final static String ID = UUID.randomUUID().toString();
+
+			@BeforeEach
+			void mockRepository() {
+				when(repository.findByExternalId(any())).thenReturn(Optional.of(UserTestFactory.create()));
+			}
+
+			@Test
+			void shouldCallRepository() {
+				service.getById(ID);
+
+				verify(repository).findByExternalId(anyString());
+			}
 
-			service.getById("xxx");
+			@Test
+			void shouldThrowExceptionIfNotExists() {
+				when(repository.findByExternalId(anyString())).thenReturn(Optional.empty());
 
-			verify(repository).findById(anyString());
+				assertThatThrownBy(() -> service.getById(ID))
+						.isInstanceOf(ResourceNotFoundException.class)
+						.extracting(e -> ((ResourceNotFoundException) e).getId()).isEqualTo(ID);
+			}
 		}
 
-		@Test
-		void shouldFindByExternalIdOnUUID() {
-			when(repository.findByExternalId(any())).thenReturn(Optional.of(UserTestFactory.create()));
+		@DisplayName("on other")
+		@Nested
+		class TestByOther {
+
+			private final static String ID = "xxx";
+
+			@BeforeEach
+			void mockRepository() {
+				when(repository.findById(anyString())).thenReturn(Optional.of(UserTestFactory.create()));
+			}
+
+			@Test
+			void shouldCallRepository() {
+				service.getById(ID);
 
-			service.getById(UUID.randomUUID().toString());
+				verify(repository).findById(anyString());
+			}
 
-			verify(repository).findByExternalId(anyString());
+			@Test
+			void shouldThrowExceptionIfNotExists() {
+				when(repository.findById(anyString())).thenReturn(Optional.empty());
+
+				assertThatThrownBy(() -> service.getById(ID))
+						.isInstanceOf(ResourceNotFoundException.class)
+						.extracting(e -> ((ResourceNotFoundException) e).getId()).isEqualTo(ID);
+			}
 		}
 	}
 
@@ -81,7 +121,7 @@ class UserServiceTest {
 
 		@BeforeEach
 		void init() {
-			when(repository.refresh(any())).thenReturn(UserTestFactory.createWithId());
+			when(repository.refresh(any())).thenReturn(UserTestFactory.create());
 		}
 
 		@Test
@@ -136,18 +176,6 @@ class UserServiceTest {
 		}
 	}
 
-	@DisplayName("Find recipient by organisationsEinheitId")
-	@Nested
-	class TestFindRecipientByOrganisationsEinheitId {
-
-		@Test
-		void shouldCallRepository() {
-			service.findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
-
-			verify(repository).findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
-		}
-	}
-
 	@DisplayName("Search users")
 	@Nested
 	class TestUserSearch {
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserTestFactory.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserTestFactory.java
index d225445ae74234a30f3d37f86ca2e65b4078f3c0..1edc18d419c726140318ebaefe2dbd5d1a45b48d 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserTestFactory.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserTestFactory.java
@@ -30,11 +30,13 @@ import org.bson.types.ObjectId;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.itvsh.kop.user.settings.UserSettings;
 import de.itvsh.kop.user.settings.UserSettingsTestFactory;
 
 public class UserTestFactory {
 
+	public static final ObjectId ID = new ObjectId();
+	public static final String ID_STR = ID.toHexString();
+
 	public static final String FIRST_NAME = LoremIpsum.getInstance().getFirstName();
 	public static final String LAST_NAME = LoremIpsum.getInstance().getLastName();
 	public static final String USER_NAME = LoremIpsum.getInstance().getName();
@@ -43,20 +45,14 @@ public class UserTestFactory {
 	public static final String EXTERNAL_ID = UUID.randomUUID().toString();
 	public static final String ORGANISTATIONSEINHEITEN_ID = "0815";
 	public static final List<String> ROLES = List.of("ROLE_1", "POSTSTELLE");
-	public static final ObjectId ID = new ObjectId();
-	public static final UserSettings USER_SETTINGS = UserSettingsTestFactory.create();
 
 	public static User create() {
 		return createBuilder().build();
 	}
 
-	public static User createWithId() {
-		return createBuilder().id(ID).build();
-	}
-
 	public static User.UserBuilder createBuilder() {
 		return User.builder()
-				.id(new ObjectId())
+				.id(ID)
 				.firstName(FIRST_NAME)
 				.lastName(LAST_NAME)
 				.username(USER_NAME)
@@ -65,6 +61,6 @@ public class UserTestFactory {
 				.externalId(EXTERNAL_ID)
 				.organisationsEinheitId(ORGANISTATIONSEINHEITEN_ID)
 				.roles(ROLES)
-				.userSettings(USER_SETTINGS);
+				.userSettings(UserSettingsTestFactory.create());
 	}
 }
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextInterceptorTestFactory.java b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextInterceptorTestFactory.java
index cbf6e909cede9dfe66d9112d2fb8fa4d24db1759..742e54756a126162359507c8bbe8d8ef673683b0 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextInterceptorTestFactory.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/common/callcontext/CallContextInterceptorTestFactory.java
@@ -33,8 +33,7 @@ public class CallContextInterceptorTestFactory {
 
 			@Override
 			public void start(Listener<RespT> responseListener, Metadata headers) {
-				var metadata = new Metadata();
-				headers.merge(metadata);
+				headers.merge(new Metadata());
 
 				super.start(responseListener, headers);
 			}
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 0f3583495f45be250f719bab29375e174d020cd7..b6a67a5f36cb1d329da467d7301d2c93ae0089c5 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
@@ -201,4 +201,11 @@ class ApiErrorUtilTest {
 			return util.buildFromKeycloakUnavailableException(exception);
 		}
 	}
+
+	@Test
+	void shouldCreateExceptionId() {
+		var exceptionId = util.createExceptionId();
+
+		assertThat(exceptionId).isNotNull();
+	}
 }
\ No newline at end of file
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 4003592a8dd8560feb97c96ae1455fff115ea184..152a2fe30d3bec4e423dbe12aaa155dc1edd9192 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
@@ -23,11 +23,16 @@
  */
 package de.itvsh.kop.user.keycloak;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.function.Supplier;
 import java.util.stream.Stream;
 
+import javax.ws.rs.ClientErrorException;
+import javax.ws.rs.ProcessingException;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -45,6 +50,7 @@ import de.itvsh.kop.user.User;
 import de.itvsh.kop.user.UserRepresentationTestFactory;
 import de.itvsh.kop.user.UserResourceMapper;
 import de.itvsh.kop.user.UserTestFactory;
+import de.itvsh.kop.user.common.errorhandling.KeycloakUnavailableException;
 
 class KeycloakApiServiceTest {
 
@@ -98,4 +104,34 @@ class KeycloakApiServiceTest {
 			verify(userResourceMapper).toKopUser(any(UserResource.class));
 		}
 	}
+
+	@DisplayName("handling keycloak exception")
+	@Nested
+	class TestHandlingKeycloakException {
+
+		@Test
+		void shouldThrowOnClientErrorException() {
+			assertThatThrownBy(() -> handlingKeyCloakException(() -> {
+				throw new ClientErrorException(403);
+			})).isInstanceOf(KeycloakUnavailableException.class);
+		}
+
+		@Test
+		void shouldThrowOnProcessingException() {
+			assertThatThrownBy(() -> handlingKeyCloakException(() -> {
+				throw new ProcessingException(new RuntimeException());
+			})).isInstanceOf(KeycloakUnavailableException.class);
+		}
+
+		@Test
+		void shouldThrowIllegalStateException() {
+			assertThatThrownBy(() -> handlingKeyCloakException(() -> {
+				throw new IllegalStateException(new RuntimeException());
+			})).isInstanceOf(KeycloakUnavailableException.class);
+		}
+
+		private <T> T handlingKeyCloakException(Supplier<T> runnable) {
+			return service.handlingKeycloakException(runnable);
+		}
+	}
 }
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientGrpcServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientGrpcServiceTest.java
index 360abd0df1e5cc822478891d557517d42205975c..ed3567f9d1be37e8d8990febdec4be4d0700acc9 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientGrpcServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientGrpcServiceTest.java
@@ -62,11 +62,11 @@ class RecipientGrpcServiceTest {
 
 		@Test
 		void shouldGetUsersFromRepository() {
-			when(recipientService.findRecipientByOrganisationsEinheitId(any())).thenReturn(List.of(UserTestFactory.create()));
+			when(recipientService.findByOrganisationsEinheitId(any())).thenReturn(List.of(UserTestFactory.create()));
 
 			recipientGrpcService.findRecipientByOrganisationsEinheitId(RecipientTestFactory.FIND_REQUEST, streamObserver);
 
-			verify(recipientService).findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+			verify(recipientService).findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
 		}
 	}
 }
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientMapperTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientMapperTest.java
index 721c12a4f697c95b9dbaa14a5ee10dc9253d8bba..c360d315f56294fe98d1b74da17d6a1ede222719 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientMapperTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientMapperTest.java
@@ -26,6 +26,7 @@ package de.itvsh.kop.user.recipient;
 import static org.assertj.core.api.Assertions.*;
 
 import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -68,5 +69,10 @@ class RecipientMapperTest {
 
 			assertThat(recipient.getEmail()).isEqualTo(StringUtils.EMPTY);
 		}
+
+		@Test
+		void shouldNotThrowExceptionOnNull() {
+			Assertions.assertDoesNotThrow(() -> mapper.toRecipient(null));
+		}
 	}
 }
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..34f8f13b572b828b4de160898f6d9757d72785b8
--- /dev/null
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientRepositoryITCase.java
@@ -0,0 +1,104 @@
+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 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.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.EnumSource.Mode;
+
+import de.itvsh.kop.user.User;
+import de.itvsh.kop.user.UserTestFactory;
+import de.itvsh.kop.user.common.MongoDbTestProfile;
+import de.itvsh.kop.user.settings.NotificationsSendFor;
+import de.itvsh.kop.user.settings.UserSettingsTestFactory;
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
+
+@QuarkusTest
+@TestProfile(MongoDbTestProfile.class)
+class RecipientRepositoryITCase {
+
+	@Inject
+	RecipientRepository repository;
+
+	@DisplayName("Find by organisationsEinheitId")
+	@Nested
+	class TestFindByOrganisationsEinheitId {
+
+		@BeforeEach
+		void clearDb() {
+			repository.deleteAll();
+		}
+
+		@DisplayName("with given organisationsEinheitId")
+		@Nested
+		class TestWithGivenOrganisationsEinheitId {
+
+			private static final User USER_NOTIFICATION_SEND_FOR_ALL = UserTestFactory.createBuilder().userSettings(
+					UserSettingsTestFactory.createBuilder().notificationsSendFor(ALL).build())
+					.build();
+
+			@Test
+			void shouldReturnOnMatch() {
+				persist(USER_NOTIFICATION_SEND_FOR_ALL);
+
+				var userList = repository.findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+
+				assertThat(userList).hasSize(1);
+				assertThat(userList.get(0)).usingRecursiveComparison().isEqualTo(USER_NOTIFICATION_SEND_FOR_ALL);
+			}
+
+			@Test
+			void shouldReturnEmptyListOnNonMatch() {
+				persist(USER_NOTIFICATION_SEND_FOR_ALL);
+
+				var userList = repository.findByOrganisationsEinheitId("nonMatch");
+
+				assertThat(userList).isEmpty();
+			}
+		}
+
+		@DisplayName("by notificationSendFor")
+		@Nested
+		class TestByNotificationSendFor {
+
+			private static final User USER_NOTIFICATION_SEND_FOR_ALL = UserTestFactory.createBuilder().userSettings(
+					UserSettingsTestFactory.createBuilder().notificationsSendFor(ALL).build())
+					.build();
+
+			@Test
+			void shouldReturnOnAll() {
+				persist(USER_NOTIFICATION_SEND_FOR_ALL);
+
+				var userList = repository.findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+
+				assertThat(userList).hasSize(1);
+				assertThat(userList.get(0)).usingRecursiveComparison().isEqualTo(USER_NOTIFICATION_SEND_FOR_ALL);
+			}
+
+			@ParameterizedTest
+			@EnumSource(mode = Mode.EXCLUDE, names = { "ALL" })
+			void shouldNotReturnOn(NotificationsSendFor sendFor) {
+				var user = UserTestFactory.createBuilder().userSettings(
+						UserSettingsTestFactory.createBuilder().notificationsSendFor(sendFor).build())
+						.build();
+				persist(user);
+
+				var userList = repository.findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+
+				assertThat(userList).isEmpty();
+			}
+		}
+
+		private void persist(User user) {
+			repository.persist(user);
+		}
+	}
+}
\ No newline at end of file
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientServiceTest.java
index e5a37bbed38e58de0d59d7ec4dc976d22b496d0c..dc816a3b4eb510e57a12fbaa8447b13d580718a9 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/recipient/RecipientServiceTest.java
@@ -34,7 +34,6 @@ import org.mockito.Mock;
 
 import com.cronutils.utils.StringUtils;
 
-import de.itvsh.kop.user.UserService;
 import de.itvsh.kop.user.UserTestFactory;
 import de.itvsh.kop.user.common.errorhandling.FunctionalException;
 
@@ -43,11 +42,11 @@ class RecipientServiceTest {
 	@InjectMocks
 	RecipientService service;
 	@Mock
-	UserService userService;
+	RecipientRepository repository;
 
-	@DisplayName("Find recipient by organisationsEinheitId")
+	@DisplayName("Find by organisationsEinheitId")
 	@Nested
-	class TestFindRecipientByOrganisationsEinheitId {
+	class TestFindByOrganisationsEinheitId {
 
 		private static final String EXPECTED_EXCEPTION_MESSAGE_TEMPLATE = "Functional error: "
 				+ RecipientService.MISSING_ORGANISATIONS_EINHEIT_ID_MESSAGE_TEMPLATE;
@@ -57,7 +56,7 @@ class RecipientServiceTest {
 			var expectedMessage = String.format(EXPECTED_EXCEPTION_MESSAGE_TEMPLATE, "null");
 
 			assertThatExceptionOfType(FunctionalException.class)
-					.isThrownBy(() -> service.findRecipientByOrganisationsEinheitId(null))
+					.isThrownBy(() -> service.findByOrganisationsEinheitId(null))
 					.withMessageStartingWith(expectedMessage);
 		}
 
@@ -66,15 +65,15 @@ class RecipientServiceTest {
 			var expectedMessage = String.format(EXPECTED_EXCEPTION_MESSAGE_TEMPLATE, StringUtils.EMPTY);
 
 			assertThatExceptionOfType(FunctionalException.class)
-					.isThrownBy(() -> service.findRecipientByOrganisationsEinheitId(StringUtils.EMPTY))
+					.isThrownBy(() -> service.findByOrganisationsEinheitId(StringUtils.EMPTY))
 					.withMessageStartingWith(expectedMessage);
 		}
 
 		@Test
-		void shouldCallUserService() {
-			service.findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+		void shouldCallRepository() {
+			service.findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
 
-			verify(userService).findRecipientByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
+			verify(repository).findByOrganisationsEinheitId(UserTestFactory.ORGANISTATIONSEINHEITEN_ID);
 		}
 	}
 }
\ No newline at end of file
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 cfdca8926e8cbdbfadeef46af0ae5bf5f64d1b72..d4a77869e5499e84b3230dc42e5e9a8d167c36e7 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
@@ -55,7 +55,7 @@ class UserSettingsServiceITCase {
 		void fillDatabase() {
 			repository.deleteAll();
 
-			repository.persist(UserTestFactory.createWithId().toBuilder()
+			repository.persist(UserTestFactory.create().toBuilder()
 					.userSettings(UserSettingsTestFactory.create())
 					.build());
 		}
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceTest.java
index 48a873ab8f6aa326de0ae92648e450a15af2f687..7c7e7c2b1dfdaee7997f9aaeec56fd2176900727 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/settings/UserSettingsServiceTest.java
@@ -103,7 +103,7 @@ class UserSettingsServiceTest {
 			@BeforeEach
 			void mockUserService() {
 				when(userService.getById(anyString()))
-						.thenReturn(UserTestFactory.createBuilder().userSettings(UserSettingsTestFactory.create()).build());
+						.thenReturn(UserTestFactory.createBuilder().userSettings(null).build());
 			}
 
 			@Test
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileMapperTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileMapperTest.java
index 90610c8fb89e989d6e53233b3ce78e28a10241da..9e79187d6e359fde9b51642bfa6219b10239ec8e 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileMapperTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/userprofile/UserProfileMapperTest.java
@@ -64,7 +64,7 @@ class UserProfileMapperTest {
 		}
 
 		private GrpcUserProfile map() {
-			return mapper.mapTo(UserTestFactory.createWithId());
+			return mapper.mapTo(UserTestFactory.create());
 		}
 
 		@Test