diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile
index 9311ca4e67f32650f288bae11b8b3c0660b59380..6b8c732e4c4000aec630e1eb5bdb23b0afd45b41 100644
--- a/dbrepo-metadata-service/Dockerfile
+++ b/dbrepo-metadata-service/Dockerfile
@@ -34,8 +34,9 @@ MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
 
 ENV ADMIN_MAIL="noreply@localhost"
 ENV BASE_URL="http://localhost"
+ENV GRANT_PRIVILEGES="ALL PRIVILEGES"
 ENV BROKER_CONSUMERS=2
-ENV BROKER_ENDPOINT=http://broker-service:15672
+ENV BROKER_ENDPOINT="http://broker-service:15672"
 ENV BROKER_USERNAME=fda
 ENV CLIENT_ID="dbrepo-client"
 ENV DBREPO_CLIENT_SECRET="MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
@@ -54,7 +55,8 @@ ENV REPOSITORY_NAME="Example Repository"
 ENV SEARCH_USERNAME=admin
 ENV SHARED_FILESYSTEM=/tmp
 ENV USER_NETWORK=userdb
-ENV WEBSITE=http://localhost
+ENV WEBSITE="http://localhost"
+ENV KEYCLOAK_HOST="http://authentication-service:8080/api/auth"
 ENV KEYCLOAK_ADMIN=fda
 ENV KEYCLOAK_ADMIN_PASSWORD=fda
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
index c5fc2b0797dbf255546694ba5d84f9909c963ce8..21fa777910d21d3ef71d1ffdd1de90d3c63b7f7f 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
@@ -22,11 +22,13 @@ import java.util.UUID;
 @AllArgsConstructor
 @Jacksonized
 @ToString
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
 @Document(indexName = "user")
 public class UserDto {
 
     @Id
     @NotNull
+    @EqualsAndHashCode.Include
     @Schema(example = "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4")
     @Field(name = "id", type = FieldType.Keyword)
     private UUID id;
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
index 7b73daf49f5a8d45c05dd2d62cc0e32d480b377b..2550f1a846760e766318b5d15f5841021232f3cc 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
@@ -84,6 +84,10 @@ public interface DatabaseMapper {
     Database databaseCreateDtoToDatabase(DatabaseCreateDto data);
 
     default PreparedStatement userToRawCreateUserQuery(Connection connection, UserDto data) throws QueryMalformedException {
+        if (data.getAttributes().getMariadbPassword() == null) {
+            log.error("Failed to map create user query: attribute 'mariadb_password' is empty");
+            throw new QueryMalformedException("Failed to map create user query: attribute 'mariadb_password' is empty");
+        }
         final StringBuilder statement = new StringBuilder("CREATE USER IF NOT EXISTS `")
                 .append(data.getUsername())
                 .append("`@`%` IDENTIFIED BY PASSWORD '")
@@ -98,6 +102,25 @@ public interface DatabaseMapper {
         }
     }
 
+    default PreparedStatement userToRawUpdateUserQuery(Connection connection, UserDto data) throws QueryMalformedException {
+        if (data.getAttributes().getMariadbPassword() == null) {
+            log.error("Failed to map create user query: attribute 'mariadb_password' is empty");
+            throw new QueryMalformedException("Failed to map create user query: attribute 'mariadb_password' is empty");
+        }
+        final StringBuilder statement = new StringBuilder("SET PASSWORD FOR `")
+                .append(data.getUsername())
+                .append("`@`%` = '")
+                .append(data.getAttributes().getMariadbPassword())
+                .append("';");
+        log.trace("statement={}", statement);
+        try {
+            return connection.prepareStatement(statement.toString());
+        } catch (SQLException e) {
+            log.error("Failed to prepare statement {}, reason: {}", statement, e.getMessage());
+            throw new QueryMalformedException("Failed to prepare statement", e);
+        }
+    }
+
     default PreparedStatement userToRawDropUserQuery(Connection connection, String username) throws QueryMalformedException {
         final StringBuilder statement = new StringBuilder("DROP USER IF EXISTS `")
                 .append(username)
@@ -138,8 +161,13 @@ public interface DatabaseMapper {
                 .build();
     }
 
-    default PreparedStatement rawGrantCreatorAccessQuery(Connection connection, String username) throws QueryMalformedException {
-        final StringBuilder statement = new StringBuilder("GRANT ALL PRIVILEGES ON *.* TO `")
+    default PreparedStatement rawGrantCreatorAccessQuery(Connection connection, String databaseName, String username,
+                                                         String priviliges) throws QueryMalformedException {
+        final StringBuilder statement = new StringBuilder("GRANT ")
+                .append(priviliges)
+                .append(" ON ")
+                .append(databaseName)
+                .append(".* TO `")
                 .append(username)
                 .append("`@`%`;");
         log.trace("statement={}", statement);
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java
index 433dcded1c69ee32222718bbd6c9bb860c675d1a..4073e95081c82c4c7f3a0ed078b9f9de1d3b24ae 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java
@@ -23,7 +23,7 @@ public class UserUtil {
             return null;
         }
         final Authentication authentication = (Authentication) principal;
-        final UserDetailsDto user = (UserDetailsDto) authentication.getDetails();
+        final UserDetailsDto user = (UserDetailsDto) authentication.getPrincipal();
         return UUID.fromString(user.getId());
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
index e78686f788c3f7a37341602149cecc034d55ecb2..db2b793cbfa20a09a92adcdfe515fc3e20eae7c7 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
@@ -245,7 +245,8 @@ public class UserEndpoint {
     public ResponseEntity<?> password(@NotNull @PathVariable("id") UUID id,
                                             @NotNull @Valid @RequestBody UserPasswordDto data,
                                             @NotNull Principal principal)
-            throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, AccessDeniedException {
+            throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, AccessDeniedException,
+            QueryMalformedException, DatabaseMalformedException {
         log.debug("endpoint modify a user password, id={}, data={}, principal={}", id, data, principal);
         /* check */
         if (!id.equals(UserUtil.getId(principal))) {
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
index caab719e8f3100c64fbde4c0c4d1ae7ac813de38..0d3c040d253b1e34ad104f301c0a63e2de90f560 100644
--- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
+++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
@@ -47,6 +47,7 @@ logging:
     at.tuwien.: trace
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
 fda:
+  privileges: ALL PRIVILEGES
   pid:
     base: https://example.com/pid/
   broker:
@@ -55,6 +56,7 @@ fda:
     issuer: http://localhost/realms/dbrepo
     public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB
   keycloak:
+    endpoint: "http://authentication-service:8080/api/auth"
     username: fda
     password: fda
   consumers: 2
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
index f8eff0c28c3a779160e21b4c7eaeca050ed199e1..66f1cb64cf5de896aa936030de5aa4b8cc38fb3d 100644
--- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
+++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
@@ -60,6 +60,7 @@ logging:
     at.tuwien.: "${LOG_LEVEL}"
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
 fda:
+  privileges: "${GRANT_PRIVILEGES}"
   pid:
     base: "${PID_BASE}"
   broker:
@@ -68,6 +69,7 @@ fda:
     issuer: "${JWT_ISSUER}"
     public_key: "${JWT_PUBKEY}"
   keycloak:
+    endpoint: "${KEYCLOAK_HOST}"
     username: "${KEYCLOAK_ADMIN}"
     password: "${KEYCLOAK_ADMIN_PASSWORD}"
   consumers: "${BROKER_CONSUMERS}"
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
index bcf8c86eb11679f8e0fd3b27d99f38354f1d1d91..9277a146f9691a440b7d2322fc46b0d6a3bf3036 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
@@ -1,7 +1,6 @@
 package at.tuwien.config;
 
 import at.tuwien.api.database.AccessTypeDto;
-import at.tuwien.api.database.DatabaseGiveAccessDto;
 import at.tuwien.api.database.table.columns.ColumnTypeDto;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.Database;
@@ -75,7 +74,7 @@ public class MariaDbConfig {
         final String jdbc = "jdbc:mariadb://" + container.getHost() + ":" + container.getPort();
         log.trace("connect to database {}", jdbc);
         try (Connection connection = DriverManager.getConnection(jdbc, container.getPrivilegedUsername(), container.getPrivilegedPassword())) {
-            ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource("init/" + database.getInternalName() + ".sql"), new ClassPathResource("init/querystore.sql"));
+            ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource("init/" + database.getInternalName() + ".sql"), new ClassPathResource("init/users.sql"), new ClassPathResource("init/querystore.sql"));
             populator.setSeparator(";\n");
             populator.populate(connection);
         }
@@ -119,15 +118,11 @@ public class MariaDbConfig {
         }
     }
 
-    public void mockGrantUserPermissions(Container container, Database database, String username, UUID userId) throws SQLException,
+    public void mockGrantUserPermissions(Container container, Database database, String username) throws SQLException,
             QueryMalformedException {
         final String jdbc = "jdbc:mariadb://" + container.getHost() + ":" + container.getPort() + "/" + database.getInternalName();
         log.trace("connect to database {}", jdbc);
         try (Connection connection = DriverManager.getConnection(jdbc, container.getPrivilegedUsername(), container.getPrivilegedPassword())) {
-            final DatabaseGiveAccessDto access = DatabaseGiveAccessDto.builder()
-                    .userId(userId)
-                    .type(AccessTypeDto.WRITE_ALL)
-                    .build();
             final PreparedStatement statement1 = databaseMapper.rawGrantUserAccessQuery(connection, username, AccessTypeDto.WRITE_ALL);
             statement1.executeUpdate();
             final PreparedStatement statement2 = databaseMapper.rawGrantUserProcedure(connection, username);
@@ -156,13 +151,13 @@ public class MariaDbConfig {
         }
     }
 
-    public static String getPrivileges(String hostname, String database, String user, String username, String password)
+    public static String getPrivileges(String hostname, Integer port, String database, String username, String password)
             throws Exception {
-        final String jdbc = "jdbc:mariadb://" + hostname + "/" + database;
+        final String jdbc = "jdbc:mariadb://" + hostname + ":" + port  + "/" + database;
         log.trace("connect to database {}", jdbc);
         final List<String> usernames = new LinkedList<>();
         try (Connection connection = DriverManager.getConnection(jdbc, username, password)) {
-            final String query = "SHOW GRANTS FOR `" + user + "`;";
+            final String query = "SHOW GRANTS FOR `" + username + "`;";
             log.trace("prepare statement '{}'", query);
             final PreparedStatement statement = connection.prepareStatement(query);
             final ResultSet set = statement.executeQuery();
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
index d467a7936075c7531b1d36cea049a62fe8c8567c..be2861cfd0609f3c7ad0ef6b357aadbbe16dc4c9 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
@@ -271,7 +271,7 @@ public class UserEndpointUnitTest extends BaseUnitTest {
     @Test
     @WithMockUser(username = USER_1_USERNAME)
     public void password_succeeds() throws UserNotFoundException, ForeignUserException, KeycloakRemoteException,
-            at.tuwien.exception.AccessDeniedException {
+            at.tuwien.exception.AccessDeniedException, QueryMalformedException, DatabaseMalformedException {
         final UserPasswordDto request = UserPasswordDto.builder()
                 .password(USER_1_PASSWORD)
                 .build();
@@ -377,7 +377,7 @@ public class UserEndpointUnitTest extends BaseUnitTest {
 
     protected void password_generic(UUID id, UserDto user, Principal principal, UserPasswordDto data)
             throws UserNotFoundException, ForeignUserException, KeycloakRemoteException,
-            at.tuwien.exception.AccessDeniedException {
+            at.tuwien.exception.AccessDeniedException, QueryMalformedException, DatabaseMalformedException {
 
         /* mock */
         if (user != null) {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..427d46091de37806f48096f1ce7fb8fde789ffc6
--- /dev/null
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java
@@ -0,0 +1,52 @@
+
+package at.tuwien.mapper;
+
+import at.tuwien.BaseUnitTest;
+import at.tuwien.annotations.MockAmqp;
+import at.tuwien.annotations.MockOpensearch;
+import at.tuwien.api.database.DatabaseDto;
+import at.tuwien.api.user.UserBriefDto;
+import at.tuwien.api.user.UserDto;
+import at.tuwien.entities.container.Container;
+import at.tuwien.exception.QueryMalformedException;
+import lombok.extern.log4j.Log4j2;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@Log4j2
+@SpringBootTest
+@ExtendWith(SpringExtension.class)
+@MockAmqp
+@MockOpensearch
+public class ContainerMapperTest extends BaseUnitTest {
+
+    @Test
+    public void equals_fails() {
+
+        /* test */
+        assertNotEquals(CONTAINER_1, CONTAINER_2);
+    }
+
+    @Test
+    public void equals_identity_succeeds() {
+
+        /* test */
+        assertEquals(CONTAINER_1, CONTAINER_1);
+    }
+
+    @Test
+    public void equals_similar_succeeds() {
+        final Container tmp = Container.builder()
+                .id(CONTAINER_1_ID)
+                .build();
+
+        /* test */
+        assertEquals(CONTAINER_1, tmp);
+    }
+
+}
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java
index 73e17f82b88365ed4b6275a6bde94d19651f8bc2..34bf4677b1ba2d90837d5ef74de3da553bd81bca 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java
@@ -5,6 +5,8 @@ import at.tuwien.annotations.MockAmqp;
 import at.tuwien.annotations.MockOpensearch;
 import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.user.UserBriefDto;
+import at.tuwien.api.user.UserDto;
+import at.tuwien.exception.QueryMalformedException;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -13,6 +15,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 @Log4j2
 @SpringBootTest
@@ -43,4 +46,16 @@ public class DatabaseMapperTest extends BaseUnitTest {
         assertEquals(USER_1_USERNAME, owner.getUsername());
     }
 
+    @Test
+    public void userToRawCreateUserQuery_fails () {
+        final UserDto request = UserDto.builder()
+                .username("mock")
+                .build();
+
+        /* test */
+        assertThrows(QueryMalformedException.class, () -> {
+            databaseMapper.userToRawCreateUserQuery(null, request);
+        });
+    }
+
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index 410add53338a7d635d7f35b105aab86b5cad54f8..9903d8377d8a247f8792be19a962da440b3f542a 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -3,13 +3,13 @@ package at.tuwien.service;
 import at.tuwien.BaseUnitTest;
 import at.tuwien.annotations.MockAmqp;
 import at.tuwien.annotations.MockOpensearch;
-import at.tuwien.api.database.DatabaseCreateDto;
-import at.tuwien.api.database.DatabaseDto;
-import at.tuwien.api.database.DatabaseModifyVisibilityDto;
-import at.tuwien.api.database.DatabaseTransferDto;
+import at.tuwien.api.database.*;
+import at.tuwien.api.user.UserAttributesDto;
+import at.tuwien.api.user.UserDto;
 import at.tuwien.config.MariaDbConfig;
 import at.tuwien.entities.database.Database;
 import at.tuwien.exception.*;
+import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.repository.mdb.*;
 import at.tuwien.repository.sdb.DatabaseIdxRepository;
 import at.tuwien.service.impl.MariaDbServiceImpl;
@@ -27,6 +27,8 @@ import org.testcontainers.junit.jupiter.Container;
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 import java.sql.SQLException;
+import java.sql.SQLInvalidAuthorizationSpecException;
+import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
@@ -44,6 +46,15 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
     @MockBean
     private DatabaseIdxRepository databaseIdxRepository;
 
+    @MockBean
+    private KeycloakGateway keycloakGateway;
+
+    @MockBean
+    private UserService userService;
+
+    @Autowired
+    private DatabaseAccessRepository databaseAccessRepository;
+
     @Autowired
     private ContainerRepository containerRepository;
 
@@ -68,8 +79,10 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
         /* metadata database */
         imageRepository.save(IMAGE_1);
         containerRepository.save(CONTAINER_1_SIMPLE);
-        databaseRepository.save(DATABASE_3_SIMPLE);
+        databaseRepository.saveAll(List.of(DATABASE_1_SIMPLE, DATABASE_2_SIMPLE, DATABASE_3_SIMPLE));
         MariaDbConfig.dropAllDatabases(CONTAINER_1);
+        MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1);
+        MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_2);
         MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_3);
     }
 
@@ -99,6 +112,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
                 .thenReturn(DATABASE_1_DTO);
         when(databaseIdxRepository.save(any(DatabaseDto.class)))
                 .thenReturn(DATABASE_1_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         generic_create(DATABASE_1_CREATE, DATABASE_1);
@@ -113,6 +128,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
                 .thenReturn(DATABASE_1_DTO);
         when(databaseIdxRepository.save(any(DatabaseDto.class)))
                 .thenReturn(DATABASE_1_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         generic_create(DATABASE_1_CREATE, DATABASE_1);
@@ -129,6 +146,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
         when(databaseIdxRepository.save(any(DatabaseDto.class)))
                 .thenReturn(DATABASE_2_DTO)
                 .thenReturn(DATABASE_3_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         generic_create(DATABASE_2_CREATE, DATABASE_2);
@@ -145,12 +164,58 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
         when(databaseIdxRepository.save(any(DatabaseDto.class)))
                 .thenReturn(DATABASE_3_DTO)
                 .thenReturn(DATABASE_2_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         generic_create(DATABASE_3_CREATE, DATABASE_3);
         generic_create(DATABASE_2_CREATE, DATABASE_2);
     }
 
+    @Test
+    public void create_canLogin_succeeds() throws Exception {
+
+        /* mock */
+        MariaDbConfig.dropDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME);
+        databaseRepository.deleteAll();
+        when(databaseIdxRepository.save(any(DatabaseDto.class)))
+                .thenReturn(DATABASE_1_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
+        final Database database = generic_create(DATABASE_1_CREATE, DATABASE_1);
+
+
+        /* test */
+        MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), database.getInternalName(), USER_1_USERNAME, USER_1_PASSWORD);
+    }
+
+    @Test
+    public void updatePassword_canLogin_succeeds() throws Exception {
+        final UserDto request = UserDto.builder()
+                .id(USER_1_ID)
+                .username(USER_1_USERNAME)
+                .attributes(UserAttributesDto.builder()
+                        .mariadbPassword(USER_2_DATABASE_PASSWORD)
+                        .build())
+                .build();
+
+        /* mock */
+        MariaDbConfig.dropDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME);
+        MariaDbConfig.createDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME);
+        databaseAccessRepository.save(DATABASE_1_USER_1_READ_ACCESS);
+        when(databaseIdxRepository.save(any(DatabaseDto.class)))
+                .thenReturn(DATABASE_1_DTO);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
+        databaseService.updatePassword(request);
+
+        /* test */
+        assertThrows(SQLInvalidAuthorizationSpecException.class, () -> {
+            MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), DATABASE_1_INTERNALNAME, USER_1_USERNAME, USER_1_PASSWORD);
+        });
+        MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), DATABASE_1_INTERNALNAME, USER_1_USERNAME, USER_2_PASSWORD);
+    }
+
     @Test
     public void create_queryStore_succeeds() throws Exception {
 
@@ -193,17 +258,19 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
     @Test
     public void create_userProcedureUser_succeeds() throws SQLException, QueryMalformedException {
 
+        /* mock */
+        databaseAccessRepository.save(DATABASE_3_USER_1_WRITE_ALL_ACCESS);
+
         /* test */
         generic_user_insert("junit1", "junit1");
     }
 
     @Test
     public void delete_succeeds() throws QueryMalformedException, UserNotFoundException, DatabaseConnectionException,
-            DatabaseNotFoundException, ImageNotSupportedException, DatabaseMalformedException, SQLException {
+            DatabaseNotFoundException, ImageNotSupportedException, DatabaseMalformedException {
 
         /* mock */
         databaseRepository.save(DATABASE_1_SIMPLE);
-        MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1);
 
         /* test */
         databaseService.delete(DATABASE_1_ID, USER_1_ID);
@@ -231,8 +298,11 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
                 .build();
 
         /* mock */
-        MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1);
         databaseRepository.save(DATABASE_1_SIMPLE);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1_DTO);
+        when(userService.findByUsername(USER_2_USERNAME))
+                .thenReturn(USER_2_DTO);
 
         /* test */
         final Database response = databaseService.transfer(DATABASE_1_ID, request);
@@ -246,7 +316,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
     protected void generic_insert(String query, Long assertQueryId) throws SQLException, QueryMalformedException {
 
         /* mock */
-        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID);
+        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME);
 
         /* test */
         final Long response = MariaDbConfig.mockSystemQueryInsert(DATABASE_3, query);
@@ -254,19 +324,19 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
         assertEquals(assertQueryId, response);
     }
 
-    protected void generic_create(DatabaseCreateDto createDto, Database database)
-            throws Exception {
+    protected Database generic_create(DatabaseCreateDto createDto, Database database) throws Exception {
 
         /* test */
         final Database response = databaseService.create(createDto, USER_1_PRINCIPAL);
         assertEquals(database.getName(), response.getName());
         assertTrue(response.getInternalName().startsWith(database.getInternalName()));
+        return response;
     }
 
     protected void generic_system_insert(String username, String password) throws SQLException, QueryMalformedException {
 
         /* mock */
-        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID);
+        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME);
 
         /* test */
         final Long queryId = MariaDbConfig.mockSystemQueryInsert(DATABASE_3, QUERY_4_STATEMENT, username, password);
@@ -276,7 +346,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
     protected void generic_user_insert(String username, String password) throws SQLException, QueryMalformedException {
 
         /* mock */
-        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID);
+        mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME);
 
         /* test */
         final Long queryId = MariaDbConfig.mockUserQueryInsert(DATABASE_3, QUERY_4_STATEMENT, username, password);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
index a45007cafb1bd004ce11d248639b5ed235fe1b30..18817fad4388681da423710b20761a76760a3127 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
@@ -137,7 +137,8 @@ public class UserServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void updatePassword_succeeds() throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException {
+    public void updatePassword_succeeds() throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException,
+            QueryMalformedException, DatabaseMalformedException {
         final UserPasswordDto request = UserPasswordDto.builder()
                 .password(USER_1_PASSWORD)
                 .build();
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java
index 1c6f82290583d3618af9143696540a8f30d44a67..241ea9c4b538c3670f58a5807067cb2db4d35113 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java
@@ -1,17 +1,32 @@
 package at.tuwien.config;
 
+import at.tuwien.interceptor.KeycloakInterceptor;
 import lombok.Getter;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.DefaultUriBuilderFactory;
 
 @Getter
 @Configuration
 public class KeycloakConfig {
 
+    @Value("${fda.keycloak.endpoint}")
+    private String keycloakEndpoint;
+
     @Value("${fda.keycloak.username}")
-    private String username;
+    private String keycloakUsername;
 
     @Value("${fda.keycloak.password}")
-    private String password;
+    private String keycloakPassword;
+
+    @Bean("keycloakRestTemplate")
+    public RestTemplate brokerRestTemplate() {
+        final RestTemplate restTemplate = new RestTemplate();
+        restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint));
+        restTemplate.getInterceptors()
+                .add(new KeycloakInterceptor(keycloakUsername, keycloakPassword, keycloakEndpoint));
+        return restTemplate;
+    }
 }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java
index 3b9be44361f26dcba516db7629fee55ad7046d0e..e3bcf500207d61f8dfacff2f5be61bf4e2e75975 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java
@@ -8,6 +8,9 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class QueryConfig {
 
+    @Value("${fda.privileges}")
+    private String grantPrivileges;
+
     @Value("${fda.unsupported}")
     private String[] notSupportedKeywords;
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
index f5542abffecacda9b9b2f6735632a9407a17933c..3ab32919efadd0ecd1271b33d704baebd8cc32bc 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
@@ -9,6 +9,7 @@ import at.tuwien.exception.UserNotFoundException;
 import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.mapper.UserMapper;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
@@ -29,9 +30,9 @@ public class KeycloakGatewayImpl implements KeycloakGateway {
     private final RestTemplate restTemplate;
     private final KeycloakConfig keycloakConfig;
 
-    public KeycloakGatewayImpl(UserMapper userMapper, KeycloakConfig keycloakConfig) {
+    public KeycloakGatewayImpl(UserMapper userMapper, @Qualifier("keycloakRestTemplate") RestTemplate restTemplate, KeycloakConfig keycloakConfig) {
         this.userMapper = userMapper;
-        this.restTemplate = new RestTemplate();
+        this.restTemplate = restTemplate;
         this.keycloakConfig = keycloakConfig;
     }
 
@@ -39,8 +40,8 @@ public class KeycloakGatewayImpl implements KeycloakGateway {
         final HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
         final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>();
-        payload.add("username", keycloakConfig.getUsername());
-        payload.add("password", keycloakConfig.getPassword());
+        payload.add("username", keycloakConfig.getKeycloakUsername());
+        payload.add("password", keycloakConfig.getKeycloakPassword());
         payload.add("grant_type", "password");
         payload.add("client_id", "admin-cli");
         final ResponseEntity<TokenDto> response;
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e9e1d69db037a8e0402b6bb2e6ec358862b7f5
--- /dev/null
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java
@@ -0,0 +1,58 @@
+package at.tuwien.interceptor;
+
+import at.tuwien.api.keycloak.TokenDto;
+import at.tuwien.exception.AccessDeniedException;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.http.*;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.HttpServerErrorException;
+import org.springframework.web.client.ResourceAccessException;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+
+@Log4j2
+public class KeycloakInterceptor implements ClientHttpRequestInterceptor {
+
+    private final String adminUsername;
+    private final String adminPassword;
+    private final String keycloakEndpoint;
+
+    public KeycloakInterceptor(String adminUsername, String adminPassword, String keycloakEndpoint) {
+        this.adminUsername = adminUsername;
+        this.adminPassword = adminPassword;
+        this.keycloakEndpoint = keycloakEndpoint;
+    }
+
+    @Override
+    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
+            throws IOException {
+        log.trace("intercept keycloak request for admin username {}", adminUsername);
+        request.getHeaders().set("Authorization", "Bearer " + obtainToken().getAccessToken());
+        return execution.execute(request, body);
+    }
+
+    public TokenDto obtainToken() throws AccessDeniedException {
+        final RestTemplate restTemplate = new RestTemplate();
+        final HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>();
+        payload.add("username", adminUsername);
+        payload.add("password", adminPassword);
+        payload.add("grant_type", "password");
+        payload.add("client_id", "admin-cli");
+        final ResponseEntity<TokenDto> response;
+        try {
+            response = restTemplate.exchange(keycloakEndpoint + "/api/auth/realms/master/protocol/openid-connect/token",
+                    HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class);
+        } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) {
+            log.error("Failed to obtain admin token: {}", e.getMessage());
+            throw new AccessDeniedException("Failed to obtain admin token: " + e.getMessage());
+        }
+        return response.getBody();
+    }
+}
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
index 573941b00a110ef5a60ed2a703627d848a51b08a..db43743d78d1276a3bdb02595964cdd09d25bfb8 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java
@@ -3,6 +3,7 @@ package at.tuwien.service;
 import at.tuwien.api.database.DatabaseCreateDto;
 import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.DatabaseTransferDto;
+import at.tuwien.api.user.UserDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.exception.*;
 import org.springframework.stereotype.Service;
@@ -88,6 +89,8 @@ public interface DatabaseService {
             DatabaseMalformedException, AmqpException, ContainerConnectionException, UserNotFoundException,
             DatabaseNameExistsException, DatabaseConnectionException, QueryMalformedException, KeycloakRemoteException, AccessDeniedException;
 
+    void updatePassword(UserDto user) throws DatabaseMalformedException, QueryMalformedException;
+
     /**
      * Updates the visibility of the database.
      *
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java
index 0cbf5ef091e93c1ce67e947b11a7624f7ea639c4..7aee0608b04e7c150a5b772b11e954c69fa93fd0 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java
@@ -62,7 +62,7 @@ public interface UserService {
      * @param data The new password.
      * @throws UserNotFoundException The user was not found.
      */
-    void updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException;
+    void updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException, QueryMalformedException, DatabaseMalformedException;
 
     /**
      * Updates the user theme for a user with given id.
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
index 24b6de07cbd6296a5260f2f0199afcb5b1ce2fab..016bb85c43a93d7441e909572a44208268a024e8 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
@@ -4,6 +4,7 @@ import at.tuwien.api.database.DatabaseCreateDto;
 import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.DatabaseTransferDto;
 import at.tuwien.api.user.UserDto;
+import at.tuwien.config.QueryConfig;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.Database;
 import at.tuwien.exception.*;
@@ -27,10 +28,13 @@ import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
+import static java.util.stream.Collectors.groupingBy;
+
 @Log4j2
 @Service
 public class MariaDbServiceImpl extends HibernateConnector implements DatabaseService {
 
+    private final QueryConfig queryConfig;
     private final UserService userService;
     private final DatabaseMapper databaseMapper;
     private final ContainerService containerService;
@@ -38,9 +42,10 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
     private final DatabaseIdxRepository databaseIdxRepository;
 
     @Autowired
-    public MariaDbServiceImpl(UserService userService, DatabaseMapper databaseMapper,
+    public MariaDbServiceImpl(QueryConfig queryConfig, UserService userService, DatabaseMapper databaseMapper,
                               ContainerService containerService, DatabaseRepository databaseRepository,
                               DatabaseIdxRepository databaseIdxRepository) {
+        this.queryConfig = queryConfig;
         this.userService = userService;
         this.databaseMapper = databaseMapper;
         this.containerService = containerService;
@@ -132,7 +137,6 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
             throws ImageNotSupportedException, ContainerNotFoundException, DatabaseMalformedException, AmqpException,
             ContainerConnectionException, UserNotFoundException, DatabaseNameExistsException,
             DatabaseConnectionException, QueryMalformedException, KeycloakRemoteException, AccessDeniedException {
-        final UserDto user = userService.findByUsername(principal.getName());
         /* start the object */
         final Database database = databaseMapper.databaseCreateDtoToDatabase(createDto);
         final Container container = containerService.find(database.getCid());
@@ -149,15 +153,18 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
             final PreparedStatement preparedStatement1 = databaseMapper.databaseToRawCreateDatabaseQuery(connection, database);
             preparedStatement1.executeUpdate();
             /* create user */
-            final PreparedStatement preparedStatement2 = databaseMapper.userToRawCreateUserQuery(connection, user);
+            final PreparedStatement preparedStatement2 = databaseMapper.userToRawCreateUserQuery(connection, owner);
             preparedStatement2.executeUpdate();
+            /* give access */
+            final PreparedStatement preparedStatement3 = databaseMapper.rawGrantCreatorAccessQuery(connection, database.getInternalName(), principal.getName(), queryConfig.getGrantPrivileges());
+            preparedStatement3.executeUpdate();
         } catch (SQLException e) {
             log.error("Failed to create database with internal name {}, reason: {}", database.getInternalName(), e.getMessage());
             throw new DatabaseMalformedException("Failed to create database: " + e.getMessage(), e);
         } finally {
             dataSource.close();
         }
-        log.info("Created user {} on database with owner access", user.getUsername());
+        log.info("Created user {} on database with owner access", owner.getUsername());
         /* save in metadata database */
         final Database entity = databaseRepository.save(database);
         log.info("Created database with id {} in metadata database", entity.getId());
@@ -167,6 +174,32 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
         return entity;
     }
 
+    @Override
+    @Transactional(readOnly = true)
+    public void updatePassword(UserDto user) throws DatabaseMalformedException, QueryMalformedException {
+        /* start the object */
+        final List<Database> databases = databaseRepository.findReadAccess(user.getId())
+                .stream()
+                .distinct()
+                .toList();
+        log.trace("found {} distinct databases", databases.size());
+        for (Database database : databases) {
+            final ComboPooledDataSource dataSource = getPrivilegedDataSource(database.getContainer().getImage(), database.getContainer());
+            try {
+                final Connection connection = dataSource.getConnection();
+                /* update password database */
+                final PreparedStatement preparedStatement = databaseMapper.userToRawUpdateUserQuery(connection, user);
+                preparedStatement.executeUpdate();
+            } catch (SQLException e) {
+                log.error("Failed to update user password in database with internal name {}: {}", database.getInternalName(), e.getMessage());
+                throw new DatabaseMalformedException("Failed to update user password in database with internal name " + database.getInternalName() + ": " + e.getMessage(), e);
+            } finally {
+                dataSource.close();
+            }
+            log.debug("updated user password in database with internal name {}", database.getInternalName());
+        }
+    }
+
     @Override
     @Transactional
     public Database visibility(Long databaseId, DatabaseModifyVisibilityDto data) throws DatabaseNotFoundException {
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java
index d0223155279fe7ac24031f253f92248bcc2d9b5b..9ee82a910669b26c61bf3b1b3577db48a570bc48 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java
@@ -6,6 +6,7 @@ import at.tuwien.exception.*;
 import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.mapper.UserMapper;
 import at.tuwien.repository.sdb.UserIdxRepository;
+import at.tuwien.service.DatabaseService;
 import at.tuwien.service.UserService;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,13 +21,15 @@ public class UserServiceImpl implements UserService {
 
     private final UserMapper userMapper;
     private final KeycloakGateway keycloakGateway;
+    private final DatabaseService databaseService;
     private final UserIdxRepository userIdxRepository;
 
     @Autowired
-    public UserServiceImpl(UserMapper userMapper, KeycloakGateway keycloakGateway,
+    public UserServiceImpl(UserMapper userMapper, KeycloakGateway keycloakGateway, DatabaseService databaseService,
                            UserIdxRepository userIdxRepository) {
         this.userMapper = userMapper;
         this.keycloakGateway = keycloakGateway;
+        this.databaseService = databaseService;
         this.userIdxRepository = userIdxRepository;
     }
 
@@ -76,9 +79,12 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public void updatePassword(UUID id, UserPasswordDto data) throws KeycloakRemoteException, AccessDeniedException,
-            UserNotFoundException {
+            UserNotFoundException, QueryMalformedException, DatabaseMalformedException {
         /* save */
         keycloakGateway.updateUserCredentials(id, data);
+        final UserDto user = userMapper.keycloakUserDtoToUserDto(keycloakGateway.findById(id));
+        /* update in containers */
+        databaseService.updatePassword(user);
         log.info("Updated user password with id {}", id);
     }
 
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index 54f56a8ff25863b2e6018c4c28a4ee0fa9e9cff9..fb6568c9a0592634ff481a47814a0a37465611c2 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -223,7 +223,7 @@ public abstract class BaseTest {
     public final static UUID USER_1_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b");
     public final static String USER_1_EMAIL = "john.doe@example.com";
     public final static String USER_1_USERNAME = "junit1";
-    public final static String USER_1_PASSWORD = "s3cr3t1nf0rm4t10n";
+    public final static String USER_1_PASSWORD = "junit1";
     public final static String USER_1_PASSWORD_ENCODED = "$2a$10$0dtdedA/RLTrFbUsvpbUw.I73AXOKeQP3t5UXj96OvnDEaDb3d3M6";
     public final static String USER_1_DATABASE_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA" /* junit1 */;
     public final static String USER_1_FIRSTNAME = "John";
@@ -256,6 +256,7 @@ public abstract class BaseTest {
             .themeDark(USER_1_THEME_DARK)
             .orcid(USER_1_ORCID_UNCOMPRESSED)
             .affiliation(USER_1_AFFILIATION)
+            .mariadbPassword(USER_1_DATABASE_PASSWORD)
             .build();
 
     public final static UserDto USER_1_DTO = UserDto.builder()
@@ -277,6 +278,7 @@ public abstract class BaseTest {
             .build();
 
     public final static UserDetails USER_1_DETAILS = UserDetailsDto.builder()
+            .id(USER_1_ID.toString())
             .username(USER_1_USERNAME)
             .email(USER_1_EMAIL)
             .password(USER_1_PASSWORD)
@@ -311,7 +313,7 @@ public abstract class BaseTest {
     public final static String USER_2_ORCID = "0000000292726225";
     public final static String USER_2_ORCID_UNCOMPRESSED = "0000-0002-9272-6225";
     public final static String USER_2_ORCID_URL = "https://orcid.org/" + USER_2_ORCID_UNCOMPRESSED;
-    public final static String USER_2_PASSWORD = "s3cr3t1nf0rm4t10n";
+    public final static String USER_2_PASSWORD = "junit2";
     public final static String USER_2_DATABASE_PASSWORD = "*9AA70A8B0EEFAFCB5BED5BDEF6EE264D5DA915AE" /* junit2 */;
     public final static Boolean USER_2_VERIFIED = true;
     public final static Boolean USER_2_ENABLED = true;
@@ -324,6 +326,7 @@ public abstract class BaseTest {
             .themeDark(USER_2_THEME_DARK)
             .orcid(USER_2_ORCID_UNCOMPRESSED)
             .affiliation(USER_2_AFFILIATION)
+            .mariadbPassword(USER_2_DATABASE_PASSWORD)
             .build();
 
     public final static UserDto USER_2_DTO = UserDto.builder()
@@ -384,6 +387,7 @@ public abstract class BaseTest {
             .themeDark(USER_3_THEME_DARK)
             .orcid(USER_3_ORCID_UNCOMPRESSED)
             .affiliation(USER_3_AFFILIATION)
+            .mariadbPassword(USER_3_DATABASE_PASSWORD)
             .build();
 
     public final static UserDto USER_3_DTO = UserDto.builder()
@@ -396,6 +400,7 @@ public abstract class BaseTest {
             .build();
 
     public final static UserDetails USER_3_DETAILS = UserDetailsDto.builder()
+            .id(USER_3_ID.toString())
             .username(USER_3_USERNAME)
             .email(USER_3_EMAIL)
             .password(USER_3_PASSWORD)
@@ -429,6 +434,7 @@ public abstract class BaseTest {
             .themeDark(USER_4_THEME_DARK)
             .orcid(USER_4_ORCID_UNCOMPRESSED)
             .affiliation(USER_4_AFFILIATION)
+            .mariadbPassword(USER_4_DATABASE_PASSWORD)
             .build();
 
     public final static UserDto USER_4_DTO = UserDto.builder()
@@ -452,6 +458,7 @@ public abstract class BaseTest {
             .build();
 
     public final static UserDetails USER_4_DETAILS = UserDetailsDto.builder()
+            .id(USER_4_ID.toString())
             .username(USER_4_USERNAME)
             .email(USER_4_EMAIL)
             .password(USER_4_PASSWORD)
@@ -486,6 +493,7 @@ public abstract class BaseTest {
             .build();
 
     public final static UserDetails USER_5_DETAILS = UserDetailsDto.builder()
+            .id(USER_5_ID.toString())
             .username(USER_5_USERNAME)
             .email(USER_5_EMAIL)
             .password(USER_5_PASSWORD)
@@ -520,6 +528,7 @@ public abstract class BaseTest {
             .build();
 
     public final static UserDetails USER_6_DETAILS = UserDetailsDto.builder()
+            .id(USER_6_ID.toString())
             .username(USER_6_USERNAME)
             .email(USER_6_EMAIL)
             .password(USER_6_PASSWORD)