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 76a9e3e7ef368c8333a5308eb5052b2b16fce9de..f8f90170f7279d161c5ce28c6b6f601a79e2e728 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,6 +57,8 @@ public class User {
 	public static final String LAST_SYNC_TIMESTAMP_FIELD = "lastSyncTimestamp";
 	public static final String LASTNAME_FIELD = "lastName";
 	public static final String FIRSTNAME_FIELD = "firstName";
+	public static final String FULL_NAME_FIELD = "fullName";
+	public static final String FULL_NAME_REVERSED_FIELD = "fullNameReversed";
 	public static final String USERNAME_FIELD = "username";
 	public static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds";
 	public static final String NOTIFICATION_SEND_FOR_FIELD = "userSettings.notificationsSendFor";
@@ -70,6 +72,8 @@ public class User {
 	private String keycloakUserId;
 	private String firstName;
 	private String lastName;
+	private String fullName;
+	private String fullNameReversed;
 	private String username;
 	private String email;
 	@JsonIgnore
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 d382098ee5f721d8f112c2e9a18f045a16726dc6..4946984edb0ea91e9106763aed3e214762b8359f 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,14 +28,13 @@ import static de.itvsh.kop.user.User.*;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import jakarta.enterprise.context.ApplicationScoped;
-
 import org.bson.types.ObjectId;
 
 import de.itvsh.kop.common.logging.KopLogging;
 import de.itvsh.kop.user.common.errorhandling.ResourceNotFoundException;
 import io.quarkus.mongodb.panache.PanacheMongoRepository;
 import io.quarkus.panache.common.Parameters;
+import jakarta.enterprise.context.ApplicationScoped;
 
 @ApplicationScoped
 @KopLogging
@@ -47,9 +46,9 @@ class UserRepository implements PanacheMongoRepository<User> {
 	static final String PARAM_NAME_TIMESTAMP = "timestamp";
 
 	private static final String LIKE_OR = " like " + param(PARAM_NAME_SEARCH_BY) + " or ";
-	private static final String SEARCH_QUERY = LASTNAME_FIELD + LIKE_OR +
-			FIRSTNAME_FIELD + LIKE_OR +
-			USERNAME_FIELD + LIKE_OR +
+	private static final String SEARCH_QUERY = USERNAME_FIELD + LIKE_OR +
+			FULL_NAME_FIELD + LIKE_OR +
+			FULL_NAME_REVERSED_FIELD + LIKE_OR +
 			EMAIL_FIELD + " like " + param(PARAM_NAME_SEARCH_BY);
 
 	private static final String AND_DELETED = " and deleted = " + param(PARAM_NAME_DELETED);
@@ -105,7 +104,7 @@ class UserRepository implements PanacheMongoRepository<User> {
 	}
 
 	String toRegex(String query) {
-		return "/.*" + query + ".*/i";
+		return "/^" + query + "/i";
 	}
 
 	public long updateUnsyncedUsers(long lastSyncTimestamp) {
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 7a0d8d122152aa093ea6325aa69ed7d74918bd34..3583e4daa51095b5e11d084a9d1393432baf1937 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
@@ -31,19 +31,21 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-
-import jakarta.inject.Inject;
+import java.util.stream.Stream;
 
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.admin.client.resource.UserResource;
 import org.keycloak.representations.idm.ClientMappingsRepresentation;
 import org.keycloak.representations.idm.GroupRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
+import org.mapstruct.AfterMapping;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
+import org.mapstruct.MappingTarget;
 import org.mapstruct.ReportingPolicy;
 
 import de.itvsh.kop.user.keycloak.KeycloakApiProperties;
+import jakarta.inject.Inject;
 
 @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN)
 public abstract class UserResourceMapper {
@@ -97,7 +99,6 @@ public abstract class UserResourceMapper {
 
 	List<String> mapRoles(UserResource userRes) {
 		var roleRepresentation = Optional.ofNullable(userRes.roles().getAll().getClientMappings())
-				.filter(Objects::nonNull)
 				.filter(map -> map.containsKey(properties.client()))
 				.map(map -> map.get(properties.client()))
 				.map(ClientMappingsRepresentation::getMappings)
@@ -111,7 +112,6 @@ public abstract class UserResourceMapper {
 
 		return Optional.ofNullable(userRepresentation.getAttributes())
 				.map(attributes -> attributes.get(properties.ldapIdKey()))
-				.filter(Objects::nonNull)
 				.map(id -> id.get(0))
 				.orElseGet(userRepresentation::getId);
 
@@ -136,4 +136,18 @@ public abstract class UserResourceMapper {
 	String mapUsername(UserResource userRes) {
 		return userRes.toRepresentation().getUsername();
 	}
+
+	@AfterMapping
+	protected void mapFullName(@MappingTarget User.UserBuilder user, UserResource userRes) {
+		user.fullName(String.join(" ",
+				Stream.of(userRes.toRepresentation().getFirstName(), userRes.toRepresentation().getLastName())
+						.filter(Objects::nonNull).toArray(String[]::new)));
+	}
+
+	@AfterMapping
+	protected void mapFullNameReversed(@MappingTarget User.UserBuilder user, UserResource userRes) {
+		user.fullNameReversed(String.join(" ",
+				Stream.of(userRes.toRepresentation().getLastName(), userRes.toRepresentation().getFirstName())
+						.filter(Objects::nonNull).toArray(String[]::new)));
+	}
 }
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 13f17a487de01fa5311d6d2ebc96f01099641228..610e7768637ca5d571fe37c9db02ae1cccd638d1 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
@@ -27,22 +27,23 @@ import static java.util.function.Predicate.not;
 import static org.assertj.core.api.Assertions.*;
 
 import java.time.Instant;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Stream;
 
-import jakarta.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;
 import org.junit.jupiter.api.Test;
-
-import com.thedeanda.lorem.LoremIpsum;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import de.itvsh.kop.user.common.MongoDbTestProfile;
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.TestProfile;
+import jakarta.inject.Inject;
 
 @QuarkusTest
 @TestProfile(MongoDbTestProfile.class)
@@ -154,9 +155,9 @@ class UserRepositoryITCase {
 
 		@Test
 		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();
+			User user1 = UserTestFactory.createBuilder().id(new ObjectId()).fullName("Max").deleted(true).build();
+			User user2 = UserTestFactory.createBuilder().id(new ObjectId()).fullName("Maximilian").deleted(true).build();
+			User user3 = UserTestFactory.createBuilder().id(new ObjectId()).fullName("Maximus").deleted(false).build();
 
 			repository.persist(user1);
 			repository.persist(user2);
@@ -183,16 +184,13 @@ class UserRepositoryITCase {
 		@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 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();
+			User user1 = new User.UserBuilder().id(new ObjectId()).fullName("Max").deleted(true).build();
+			User user2 = new User.UserBuilder().id(new ObjectId()).fullName("Maximilian").deleted(true).build();
+			User user3 = new User.UserBuilder().id(new ObjectId()).fullName("Maximus").deleted(false).build();
 
 			repository.persist(user1);
 			repository.persist(user2);
@@ -201,7 +199,7 @@ class UserRepositoryITCase {
 			var foundUsers = repository.findUsers("Max", 10).toList();
 
 			assertThat(foundUsers).hasSizeGreaterThan(2);
-			List<User> startWithMax = foundUsers.stream().filter(u -> u.getFirstName().startsWith("Max")).toList();
+			List<User> startWithMax = foundUsers.stream().filter(u -> u.getFullName().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);
@@ -209,7 +207,7 @@ class UserRepositoryITCase {
 
 		@Test
 		void shouldNotFindAnyUser() {
-			repository.persist(UserTestFactory.createBuilder().id(null).firstName("Marvel").build());
+			repository.persist(new User.UserBuilder().id(null).fullName("Marvel").build());
 
 			var foundUsers = repository.findUsers("Max", 10).toList();
 
@@ -218,8 +216,8 @@ class UserRepositoryITCase {
 
 		@Test
 		void shouldFindOneUser() {
-			User user1 = UserTestFactory.createBuilder().id(null).firstName("Maximilian").build();
-			User user2 = UserTestFactory.createBuilder().id(null).firstName("Madleen").build();
+			User user1 = new User.UserBuilder().id(null).fullName("Maximilian").build();
+			User user2 = new User.UserBuilder().id(null).fullName("Madleen").build();
 
 			repository.persist(user1);
 			repository.persist(user2);
@@ -229,9 +227,58 @@ class UserRepositoryITCase {
 			assertThat(foundUsers)
 					.hasSize(1)
 					.first()
-					.extracting(User::getFirstName)
+					.extracting(User::getFullName)
 					.isEqualTo("Maximilian");
 		}
+
+		@ParameterizedTest
+		@MethodSource("provideDataForFindUsersByFullName")
+		void shouldFindUsersByFullName(String query, String[] expectedUsernames) {
+			Arrays.asList(
+					new User.UserBuilder().id(null).username("user1").fullName("Franz Vogel").build(),
+					new User.UserBuilder().id(null).username("user2").fullName("Franz von Holzhausen").build(),
+					new User.UserBuilder().id(null).username("user3").fullName("Peter Lustig").build()
+			).forEach(repository::persist);
+
+			var foundUsernames = repository.findUsers(query, 10).map(User::getUsername);
+
+			assertThat(foundUsernames).containsExactlyInAnyOrder(expectedUsernames);
+		}
+
+		private static Stream<Arguments> provideDataForFindUsersByFullName() {
+			return Stream.of(
+					Arguments.of("Fra", new String[] { "user1", "user2" }),
+					Arguments.of("Franz", new String[] { "user1", "user2" }),
+					Arguments.of("Franz v", new String[] { "user1", "user2" }),
+					Arguments.of("Franz Vo ", new String[0]),
+					Arguments.of("Franz von", new String[] { "user2" }),
+					Arguments.of("Franz von Holzhausen", new String[] { "user2" }),
+					Arguments.of("Franz L", new String[0]),
+					Arguments.of("Peter V", new String[0])
+			);
+		}
+
+		@ParameterizedTest
+		@MethodSource("provideDataForFindUsersByFullNameReversed")
+		void shouldFindUsersByFullNameReversed(String query, String[] expectedUsernames) {
+			Arrays.asList(
+					new User.UserBuilder().id(null).username("user1").fullNameReversed("Langbein Franz").build(),
+					new User.UserBuilder().id(null).username("user2").fullNameReversed("Lustig Peter").build(),
+					new User.UserBuilder().id(null).username("user3").fullNameReversed("Ilona Nowak").build()
+			).forEach(repository::persist);
+
+			var foundUsernames = repository.findUsers(query, 10).map(User::getUsername);
+
+			assertThat(foundUsernames).containsExactlyInAnyOrder(expectedUsernames);
+		}
+
+		private static Stream<Arguments> provideDataForFindUsersByFullNameReversed() {
+			return Stream.of(
+					Arguments.of("L", new String[] { "user1", "user2" }),
+					Arguments.of("Lustig", new String[] { "user2" }),
+					Arguments.of("Lustig Peter", new String[] { "user2" })
+			);
+		}
 	}
 
 	@Nested
@@ -321,9 +368,9 @@ class UserRepositoryITCase {
 		@BeforeEach
 		void init() {
 			repository.deleteAll();
-			User user1 = UserTestFactory.createBuilder().id(null).firstName("Max").deleted(true).build();
-			User user2 = UserTestFactory.createBuilder().id(null).firstName("Maximilian").deleted(true).build();
-			User user3 = UserTestFactory.createBuilder().id(null).firstName("Maximus").deleted(false).build();
+			User user1 = UserTestFactory.createBuilder().id(null).fullName("Max").deleted(true).build();
+			User user2 = UserTestFactory.createBuilder().id(null).fullName("Maximilian").deleted(true).build();
+			User user3 = UserTestFactory.createBuilder().id(null).fullName("Maximus").deleted(false).build();
 			repository.persist(user1);
 			repository.persist(user2);
 			repository.persist(user3);
diff --git a/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryTest.java b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryTest.java
index 409eb4b45dcdbd93f1ac2267463e5fd10b2cb180..9b1dbbfb2510925baaab5fb14a8ede96bcf642c9 100644
--- a/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryTest.java
+++ b/user-manager-server/src/test/java/de/itvsh/kop/user/UserRepositoryTest.java
@@ -31,7 +31,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
-import org.assertj.core.api.Condition;
+import org.assertj.core.api.*;
 import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -198,7 +198,7 @@ class UserRepositoryTest {
 		void shouldReturnRegex(){
 			var regex = userRepository.toRegex("abc");
 
-			assertThat(regex).isEqualTo("/.*abc.*/i");
+			assertThat(regex).isEqualTo("/^abc/i");
 		}
 	}
 }
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 f7014b40f301ae964c30204f63ffd1af03c752e3..4817dc2ee222969a4a11307118884f825f6eedcd 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
@@ -175,6 +175,20 @@ class UserResourceMapperTest {
 			assertThat(user.getKeycloakUserId()).isEqualTo(UserRepresentationTestFactory.EXTERNAL_ID_FALLBACK);
 		}
 
+		@Test
+		void shouldMapFullName() {
+			var user = toKopUser();
+
+			assertThat(user.getFullName()).isEqualTo(UserRepresentationTestFactory.FIRST_NAME + " " + UserRepresentationTestFactory.LAST_NAME);
+		}
+
+		@Test
+		void shouldMapFullNameReversed() {
+			var user = toKopUser();
+
+			assertThat(user.getFullNameReversed()).isEqualTo(UserRepresentationTestFactory.LAST_NAME + " " + UserRepresentationTestFactory.FIRST_NAME);
+		}
+
 		private User toKopUser() {
 			return toKopUser(UserResourceTestFactory.create());
 		}
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 b3a56bb9506058042a88dba91ed262de80ae58ba..270cf1dc4f1d3aa1d2c6e06690ed806e351f3439 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
@@ -57,6 +57,8 @@ public class UserTestFactory {
 				.keycloakUserId(KEYCLOAK_USER_ID)
 				.firstName(FIRST_NAME)
 				.lastName(LAST_NAME)
+				.fullName(FIRST_NAME + " " + LAST_NAME)
+				.fullNameReversed(LAST_NAME + " " + FIRST_NAME)
 				.username(USER_NAME)
 				.lastSyncTimestamp(LAST_SYNC_TIMESTAMP)
 				.email(EMAIL)