diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml
index 841b6bb0e2bb8786974638264576a17f8d908dc1..12f10df6b78642b6fc69f4e9d264b2fe3a4d4b8f 100644
--- a/goofy-server/pom.xml
+++ b/goofy-server/pom.xml
@@ -63,10 +63,15 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
+		
 		<dependency>
 			<groupId>org.keycloak</groupId>
 			<artifactId>keycloak-spring-boot-starter</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.keycloak</groupId>
+			<artifactId>keycloak-admin-client</artifactId>
+		</dependency>
 
 		<!-- own projects -->
 		<dependency>
@@ -142,6 +147,11 @@
 			<groupId>com.thedeanda</groupId>
 			<artifactId>lorem</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/ContextService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/ContextService.java
index cfd6d28b69ae997221b2603363005618b86c5c2d..3a73893ec891f78c6381f788a390c31b5acbe649 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/ContextService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/ContextService.java
@@ -28,7 +28,7 @@ public class ContextService {
 		var goofyUser = userService.getUser();
 
 		return GrpcUser.newBuilder()
-				.setId(goofyUser.getId().toStringValue())
+				.setId(goofyUser.getId().toString())
 				.setName(goofyUser.getFullName())
 				.addAllRoles(goofyUser.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet()))
 				.build();
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/datatypes/StringBasedValue.java b/goofy-server/src/main/java/de/itvsh/goofy/common/datatypes/StringBasedValue.java
index a2e3d328cae62a11d6cdd65b3f02c59380c54062..619b7a199c84389fd087690ead00e01aacd3c947 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/datatypes/StringBasedValue.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/datatypes/StringBasedValue.java
@@ -25,10 +25,6 @@ public abstract class StringBasedValue implements Serializable {
 		this.value = value;
 	}
 
-	public String toStringValue() {
-		return value;
-	}
-
 	@Override
 	public String toString() {
 		return value;
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserIdMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserIdMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9349f3404ab35209c545188e0ce5467e3a00449
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserIdMapper.java
@@ -0,0 +1,15 @@
+package de.itvsh.goofy.common.user;
+
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface UserIdMapper {
+
+	default UserId fromString(String userId) {
+		return UserId.from(userId);
+	}
+
+	default String toString(UserId userId) {
+		return userId.toString();
+	}
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e68ee8f120b4907ca7e657472d6846e40b9b9d
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/UserRemoteService.java
@@ -0,0 +1,12 @@
+package de.itvsh.goofy.common.user;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+public interface UserRemoteService {
+
+	Optional<GoofyUser> findUser(UserId userId);
+
+	Stream<GoofyUser> findUserProfile(String searchBy, int limit);
+
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminConfiguration.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8e75f9ed36b2a6719d255e3101447de21face4d
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminConfiguration.java
@@ -0,0 +1,39 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import org.keycloak.adapters.KeycloakDeployment;
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.KeycloakBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+class KeycloakAdminConfiguration {
+
+	private static final String CLIENT = "admin-cli";
+
+	@Autowired
+	private KeycloakSpringBootConfigResolver configResolver;
+	@Autowired
+	private KeycloakAdminProperties adminProperties;
+
+	@Bean
+	public KeycloakDeployment keycloakDeployment() {
+		return configResolver.resolve(null);
+	}
+
+	@Bean
+	public Keycloak keycloak() {
+		var deployment = this.keycloakDeployment();
+		String realm = deployment.getRealm();
+
+		return KeycloakBuilder.builder()
+				.serverUrl(deployment.getAuthServerBaseUrl())
+				.realm(realm)
+				.username(adminProperties.getUser())
+				.password(adminProperties.getPassword())
+				.clientId(CLIENT)
+				.build();
+	}
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminProperties.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..71754dd52d291922fb45ff10c7c45ce12e9a34ae
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakAdminProperties.java
@@ -0,0 +1,22 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Valid
+@Configuration
+@ConfigurationProperties(prefix = "goofy.keycloak.api")
+class KeycloakAdminProperties {
+	@NotBlank
+	private String user;
+	@NotBlank
+	private String password;
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiService.java
new file mode 100644
index 0000000000000000000000000000000000000000..58433f09656c41f6e34050e883958c07bc17cc3f
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiService.java
@@ -0,0 +1,29 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.keycloak.adapters.KeycloakDeployment;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.representations.idm.UserRepresentation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.itvsh.goofy.common.user.UserId;
+
+@Service
+class KeycloakApiService {
+
+	@Autowired
+	private Keycloak keycloak;
+	@Autowired
+	private KeycloakDeployment deployment;
+
+	public Optional<UserRepresentation> findUser(UserId userId) {
+		return Optional.ofNullable(keycloak.realm(deployment.getRealm()).users().get(userId.toString()).toRepresentation());
+	}
+
+	public Stream<UserRepresentation> findUserProfile(String searchBy, int limit) {
+		return keycloak.realm(deployment.getRealm()).users().search(searchBy, 0, limit).stream();
+	}
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakUserRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakUserRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3f1169d25607a0d9e20385be017eb0aef55fb71
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/KeycloakUserRemoteService.java
@@ -0,0 +1,31 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.itvsh.goofy.common.user.GoofyUser;
+import de.itvsh.goofy.common.user.UserId;
+import de.itvsh.goofy.common.user.UserRemoteService;
+
+@Service
+class KeycloakUserRemoteService implements UserRemoteService {
+
+	@Autowired
+	private KeycloakApiService apiService;
+	@Autowired
+	private UserRepresentationMapper userMapper;
+
+	@Override
+	public Optional<GoofyUser> findUser(UserId userId) {
+		return apiService.findUser(userId).map(userMapper::toGoofyUser);
+	}
+
+	@Override
+	public Stream<GoofyUser> findUserProfile(String searchBy, int limit) {
+		return apiService.findUserProfile(searchBy, limit).map(userMapper::toGoofyUser);
+	}
+
+}
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/UserRepresentationMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/UserRepresentationMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3c1df681f02c2fd67e0a4e0ac16c84d9f0e0f39
--- /dev/null
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/user/keycloak/UserRepresentationMapper.java
@@ -0,0 +1,18 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import org.keycloak.representations.idm.UserRepresentation;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.itvsh.goofy.common.user.GoofyUser;
+import de.itvsh.goofy.common.user.UserIdMapper;
+
+@Mapper(uses = UserIdMapper.class)
+interface UserRepresentationMapper {
+
+	// TODO map roles
+	@Mapping(target = "authorities", ignore = true)
+	@Mapping(target = "authority", ignore = true)
+	@Mapping(target = "userName", source = "username")
+	GoofyUser toGoofyUser(UserRepresentation userRep);
+}
diff --git a/goofy-server/src/main/resources/application.yml b/goofy-server/src/main/resources/application.yml
index 908e7b092587505e71a980286ebab73f7950299a..89eb3f07a28dd6f6bb1db127487fa165b08043ff 100644
--- a/goofy-server/src/main/resources/application.yml
+++ b/goofy-server/src/main/resources/application.yml
@@ -26,6 +26,10 @@ management:
 
 goofy:
   production: true
+  keycloak:
+    api:
+      user: goofyApiUser
+      password: abs9354.3Yds
   
   
 grpc:
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/ContextServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/ContextServiceTest.java
index 29781b0aad9d34fd6a95e16a4d06892d2c3db7e3..dee597cc09ee0144e7745f439d4ced21d830157b 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/ContextServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/ContextServiceTest.java
@@ -66,7 +66,7 @@ class ContextServiceTest {
 		void shoultHaveUserId() {
 			var context = service.createCallContext();
 
-			assertThat(context.getUser()).extracting(GrpcUser::getId).isEqualTo(UserTestFactory.ID.toStringValue());
+			assertThat(context.getUser()).extracting(GrpcUser::getId).isEqualTo(UserTestFactory.ID.toString());
 		}
 
 		@Test
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiFunctionalITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiFunctionalITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..5262344b75bf1e79f9dae918988537fdb0e2543e
--- /dev/null
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/user/keycloak/KeycloakApiFunctionalITCase.java
@@ -0,0 +1,38 @@
+package de.itvsh.goofy.common.user.keycloak;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.representations.idm.UserRepresentation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+@SpringBootTest
+@ActiveProfiles("remotekc")
+class KeycloakApiFunctionalITCase {
+
+	private static final String REALM = "sh-kiel-dev";
+	private static final String TEST_USER_NAME = "beate";
+
+	@Autowired
+	private Keycloak keycloak;
+
+	@Test
+	void shouldFindTestUser() {
+		List<UserRepresentation> users = keycloak.realm(REALM).users().search(TEST_USER_NAME);
+
+		assertThat(users).hasSize(1);
+	}
+
+	@Test
+	void shouldFindTestUserByPartialName() {
+		List<UserRepresentation> users = keycloak.realm(REALM).users().search(TEST_USER_NAME.substring(1, 4));
+
+		assertThat(users).hasSize(1);
+	}
+
+}
diff --git a/pom.xml b/pom.xml
index 1b45cd0bcaf5ce6c72fb61c3be4e4a71856ab475..521ebdffdea3b6c7ed5c0c107603e8af2b4a2468 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<java.version>11</java.version>
-		
+
 		<pluto.version>${project.version}</pluto.version>
 
 		<spring.boot.version>2.4.5</spring.boot.version>
@@ -27,7 +27,7 @@
 		<spring-admin.version>2.3.1</spring-admin.version>
 		<mapstruct.version>1.4.1.Final</mapstruct.version>
 		<commons-io.version>2.8.0</commons-io.version>
-		<keycloak-adapter.version>12.0.4</keycloak-adapter.version>
+		<keycloak-adapter.version>13.0.1</keycloak-adapter.version>
 
 		<lorem.version>2.1</lorem.version>
 
@@ -50,6 +50,7 @@
 				<type>pom</type>
 				<scope>import</scope>
 			</dependency>
+			
 			<!-- keycloak -->
 			<dependency>
 				<groupId>org.keycloak.bom</groupId>
@@ -58,6 +59,11 @@
 				<type>pom</type>
 				<scope>import</scope>
 			</dependency>
+			<dependency>
+				<groupId>org.keycloak</groupId>
+				<artifactId>keycloak-admin-client</artifactId>
+				<version>${keycloak-adapter.version}</version>
+			</dependency>
 
 			<dependency>
 				<groupId>de.codecentric</groupId>
@@ -147,10 +153,10 @@
 				</plugin>
 
 				<plugin>
-          			<groupId>org.sonarsource.scanner.maven</groupId>
-          			<artifactId>sonar-maven-plugin</artifactId>
-        		  	<version>${sonarqube.version}</version>
-		        </plugin>
+					<groupId>org.sonarsource.scanner.maven</groupId>
+					<artifactId>sonar-maven-plugin</artifactId>
+					<version>${sonarqube.version}</version>
+				</plugin>
 
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>