diff --git a/.docs/changelog.md b/.docs/changelog.md
index e1452dd12c4d6a6de98438087f61a1853e90779f..3e3d479073ca75622e172a659e038b686ba7b1f1 100644
--- a/.docs/changelog.md
+++ b/.docs/changelog.md
@@ -2,7 +2,7 @@
 author: Martin Weise
 ---
 
-## v1.6.4 (2025-02-13)
+## v1.6.4 (2025-02-14)
 
 [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.4)
 
@@ -10,8 +10,8 @@ author: Martin Weise
 
 #### Fixes
 
-* Fixed a bug where the users were not synced with the Metadata Database and the API Password was not recommended on 
-  first login in [#489](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/489).
+* Fixed a bug where the users were not synced with the Metadata Database
+  in [#489](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/489).
 
 ## v1.6.3 (2025-02-05)
 
diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar
index 7b332886dd5aca385115460c47692fdef8522e0b..f370c8825750a431296ef68c3d482a2e4eee9389 100644
Binary files a/dbrepo-auth-service/listeners/target/create-event-listener.jar and b/dbrepo-auth-service/listeners/target/create-event-listener.jar differ
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 5ca14a5a34605e80ab48c5f2309f6dd15bea714f..3636aa63a300d62364ea11e1c77122b40053d0be 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
@@ -4,11 +4,11 @@ import at.tuwien.api.auth.CreateUserDto;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.UserDto;
-import at.tuwien.api.user.UserPasswordDto;
 import at.tuwien.api.user.UserUpdateDto;
-import at.tuwien.entities.database.Database;
 import at.tuwien.entities.user.User;
-import at.tuwien.exception.*;
+import at.tuwien.exception.AuthServiceException;
+import at.tuwien.exception.NotAllowedException;
+import at.tuwien.exception.UserNotFoundException;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.service.AuthenticationService;
 import at.tuwien.service.DatabaseService;
@@ -212,60 +212,4 @@ public class UserEndpoint extends AbstractEndpoint {
                         userService.modify(user, data)));
     }
 
-    @PutMapping("/{userId}/password")
-    @Transactional(rollbackFor = {Exception.class})
-    @PreAuthorize("isAuthenticated()")
-    @Observed(name = "dbrepo_user_password_modify")
-    @Operation(summary = "Update user password",
-            description = "Updates password of user with id. Requires authentication.",
-            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
-    @ApiResponses(value = {
-            @ApiResponse(responseCode = "202",
-                    description = "Modified user password"),
-            @ApiResponse(responseCode = "400",
-                    description = "Invalid password payload",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "403",
-                    description = "Not allowed to change foreign user password",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "404",
-                    description = "Failed to find database/user in metadata database",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "502",
-                    description = "Connection to auth service failed",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "503",
-                    description = "Failed to get user in auth service",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
-    })
-    public ResponseEntity<Void> password(@NotNull @PathVariable("userId") UUID userId,
-                                         @NotNull @Valid @RequestBody UserPasswordDto data,
-                                         @NotNull Principal principal) throws NotAllowedException,
-            UserNotFoundException, DatabaseNotFoundException, DataServiceException,
-            DataServiceConnectionException, AuthServiceException {
-        log.debug("endpoint modify a user password, userId={}, principal.name={}", userId, principal.getName());
-        final User user = userService.findById(userId);
-        if (!user.getUsername().equals(principal.getName())) {
-            log.error("Failed to modify user password: not current user");
-            throw new NotAllowedException("Failed to modify user password: not current user");
-        }
-        for (Database database : databaseService.findAllAtLestReadAccess(userId)) {
-            databaseService.updatePassword(database, user);
-        }
-        userService.updatePassword(user, data);
-        authenticationService.setupFinished(user);
-        return ResponseEntity.accepted()
-                .build();
-    }
-
 }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java
index 44e35f3a29ba8ee89f440540da98d249ead8a13d..aca2f9f356840af623ac0443fa6392092a5f865a 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java
@@ -4,6 +4,7 @@ import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.exception.*;
 import com.auth0.jwt.exceptions.TokenExpiredException;
 import io.swagger.v3.oas.annotations.Hidden;
+import jakarta.ws.rs.NotAuthorizedException;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -31,6 +32,20 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler {
         return new ResponseEntity<>(response, headers, response.getStatus());
     }
 
+    @Hidden
+    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
+    @ExceptionHandler(NotAuthorizedException.class)
+    public ResponseEntity<ApiErrorDto> handle(NotAuthorizedException e) {
+        final HttpHeaders headers = new HttpHeaders();
+        headers.set("Content-Type", "application/problem+json");
+        final ApiErrorDto response = ApiErrorDto.builder()
+                .status(HttpStatus.UNAUTHORIZED)
+                .message(e.getLocalizedMessage())
+                .code("error.authentication.invalid")
+                .build();
+        return new ResponseEntity<>(response, headers, response.getStatus());
+    }
+
     @Hidden
     @ResponseStatus(code = HttpStatus.NOT_FOUND)
     @ExceptionHandler(AccessNotFoundException.class)
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 de5c8993a118471b786710a72fbc8799499d4a82..c69701e6dd649565e8070c8c2403b0867c1aed19 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
@@ -3,10 +3,11 @@ package at.tuwien.endpoints;
 import at.tuwien.api.auth.CreateUserDto;
 import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.UserDto;
-import at.tuwien.api.user.UserPasswordDto;
 import at.tuwien.api.user.UserUpdateDto;
 import at.tuwien.entities.user.User;
-import at.tuwien.exception.*;
+import at.tuwien.exception.AuthServiceException;
+import at.tuwien.exception.NotAllowedException;
+import at.tuwien.exception.UserNotFoundException;
 import at.tuwien.service.AuthenticationService;
 import at.tuwien.service.DatabaseService;
 import at.tuwien.service.UserService;
@@ -32,7 +33,8 @@ import java.util.List;
 import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
 
 @Log4j2
 @SpringBootTest
@@ -227,44 +229,6 @@ public class UserEndpointUnitTest extends AbstractUnitTest {
         modify_generic(USER_1_ID, USER_1, USER_1_PRINCIPAL, request);
     }
 
-    @Test
-    @WithAnonymousUser
-    public void password_anonymous_fails() {
-        final UserPasswordDto request = UserPasswordDto.builder()
-                .password(USER_1_PASSWORD)
-                .build();
-
-        /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
-            password_generic(null, request);
-        });
-    }
-
-    @Test
-    @WithMockUser(username = USER_4_USERNAME)
-    public void password_noRoleForeign_fails() {
-        final UserPasswordDto request = UserPasswordDto.builder()
-                .password(USER_1_PASSWORD)
-                .build();
-
-        /* test */
-        assertThrows(NotAllowedException.class, () -> {
-            password_generic(USER_4_PRINCIPAL, request);
-        });
-    }
-
-    @Test
-    @WithMockUser(username = USER_1_USERNAME)
-    public void password_succeeds() throws NotAllowedException, DataServiceException, DataServiceConnectionException,
-            UserNotFoundException, DatabaseNotFoundException, AuthServiceException {
-        final UserPasswordDto request = UserPasswordDto.builder()
-                .password(USER_1_PASSWORD)
-                .build();
-
-        /* test */
-        password_generic(USER_1_PRINCIPAL, request);
-    }
-
     @Test
     @WithAnonymousUser
     public void create_anonymous_fails() {
@@ -364,30 +328,6 @@ public class UserEndpointUnitTest extends AbstractUnitTest {
         assertNotNull(body);
     }
 
-    protected void password_generic(Principal principal, UserPasswordDto data) throws NotAllowedException,
-            DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException,
-            AuthServiceException {
-
-        /* mock */
-        when(userService.findById(USER_1_ID))
-                .thenReturn(USER_1);
-        doNothing()
-                .when(authenticationService)
-                .setupFinished(USER_1);
-        doNothing()
-                .when(userService)
-                .updatePassword(USER_1, data);
-        when(databaseService.findAllAtLestReadAccess(USER_1_ID))
-                .thenReturn(List.of(DATABASE_1));
-        doNothing()
-                .when(databaseService)
-                .updatePassword(DATABASE_1, USER_1);
-
-        /* test */
-        final ResponseEntity<?> response = userEndpoint.password(USER_1_ID, data, principal);
-        assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
-    }
-
     protected void generic_create(CreateUserDto data) {
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java
index 06a4e377b02ed73f36af6761832a381c25aef990..87d7d0185a6399c5b66340d892281053448e689a 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java
@@ -4,6 +4,7 @@ import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.exception.*;
 import at.tuwien.test.AbstractUnitTest;
 import com.auth0.jwt.exceptions.TokenExpiredException;
+import jakarta.ws.rs.NotAuthorizedException;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -24,8 +25,7 @@ import java.util.Optional;
 
 import static at.tuwien.test.utils.EndpointUtils.getErrorCodes;
 import static at.tuwien.test.utils.EndpointUtils.getExceptions;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.*;
 
 @Log4j2
 @ExtendWith(SpringExtension.class)
@@ -51,7 +51,7 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
             Assertions.assertNotNull(exception.getDeclaredAnnotation(ResponseStatus.class).code());
             Assertions.assertNotEquals(exception.getDeclaredAnnotation(ResponseStatus.class).code(), HttpStatus.INTERNAL_SERVER_ERROR);
             Assertions.assertNotNull(exception.getDeclaredAnnotation(ResponseStatus.class).reason(), "Exception " + exception.getName() + " does not provide a reason code");
-            Assertions.assertTrue(errorCodes.contains(exception.getDeclaredAnnotation(ResponseStatus.class).reason()), "Exception code " + exception.getDeclaredAnnotation(ResponseStatus.class).reason() + " does have a reason code mapped in localized ui error messages");
+            assertTrue(errorCodes.contains(exception.getDeclaredAnnotation(ResponseStatus.class).reason()), "Exception code " + exception.getDeclaredAnnotation(ResponseStatus.class).reason() + " does have a reason code mapped in localized ui error messages");
             /* handler method */
             assertEquals(method.getDeclaredAnnotation(ResponseStatus.class).code(), exception.getDeclaredAnnotation(ResponseStatus.class).code());
         }
@@ -70,6 +70,19 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.token.expired", body.getCode());
     }
 
+    @Test
+    public void handle_notAuthorizedException_succeeds() {
+
+        /* test */
+        final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(new NotAuthorizedException("msg"));
+        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
+        final ApiErrorDto body = response.getBody();
+        assertNotNull(body);
+        assertNotNull(body.getMessage());
+        assertEquals(HttpStatus.UNAUTHORIZED, body.getStatus());
+        assertEquals("error.authentication.invalid", body.getCode());
+    }
+
     @Test
     public void handle_accessNotFoundException_succeeds() {
 
@@ -135,7 +148,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.auth.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_brokerServiceConnectionException_succeeds() {
 
@@ -149,7 +161,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.broker.connection", body.getCode());
     }
 
-
     @Test
     public void handle_brokerServiceException_succeeds() {
 
@@ -163,7 +174,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.broker.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_conceptNotFoundException_succeeds() {
 
@@ -177,7 +187,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.concept.missing", body.getCode());
     }
 
-
     @Test
     public void handle_containerAlreadyExistsException_succeeds() {
 
@@ -191,7 +200,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.container.exists", body.getCode());
     }
 
-
     @Test
     public void handle_containerNotFoundException_succeeds() {
 
@@ -205,7 +213,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.container.missing", body.getCode());
     }
 
-
     @Test
     public void handle_containerQuotaException_succeeds() {
 
@@ -219,7 +226,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.container.quota", body.getCode());
     }
 
-
     @Test
     public void handle_credentialsInvalidException_succeeds() {
 
@@ -233,7 +239,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.user.credentials", body.getCode());
     }
 
-
     @Test
     public void handle_dataServiceConnectionException_succeeds() {
 
@@ -247,7 +252,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.data.connection", body.getCode());
     }
 
-
     @Test
     public void handle_dataServiceException_succeeds() {
 
@@ -261,7 +265,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.data.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_databaseMalformedException_succeeds() {
 
@@ -275,7 +278,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.database.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_databaseNotFoundException_succeeds() {
 
@@ -289,7 +291,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.database.missing", body.getCode());
     }
 
-
     @Test
     public void handle_databaseUnavailableException_succeeds() {
 
@@ -303,7 +304,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.database.connection", body.getCode());
     }
 
-
     @Test
     public void handle_doiNotFoundException_succeeds() {
 
@@ -317,7 +317,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.doi.missing", body.getCode());
     }
 
-
     @Test
     public void handle_emailExistsException_succeeds() {
 
@@ -331,7 +330,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.user.email-exists", body.getCode());
     }
 
-
     @Test
     public void handle_exchangeNotFoundException_succeeds() {
 
@@ -345,7 +343,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.exchange.missing", body.getCode());
     }
 
-
     @Test
     public void handle_externalServiceException_succeeds() {
 
@@ -359,7 +356,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.external.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_filterBadRequestException_succeeds() {
 
@@ -373,7 +369,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.semantic.filter", body.getCode());
     }
 
-
     @Test
     public void handle_formatNotAvailableException_succeeds() {
 
@@ -387,7 +382,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.identifier.format", body.getCode());
     }
 
-
     @Test
     public void handle_identifierNotFoundException_succeeds() {
 
@@ -401,7 +395,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.identifier.missing", body.getCode());
     }
 
-
     @Test
     public void handle_identifierNotSupportedException_succeeds() {
 
@@ -415,7 +408,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.identifier.unsupported", body.getCode());
     }
 
-
     @Test
     public void handle_imageAlreadyExistsException_succeeds() {
 
@@ -429,7 +421,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.image.exists", body.getCode());
     }
 
-
     @Test
     public void handle_imageInvalidException_succeeds() {
 
@@ -443,7 +434,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.image.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_imageNotFoundException_succeeds() {
 
@@ -457,7 +447,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.image.missing", body.getCode());
     }
 
-
     @Test
     public void handle_licenseNotFoundException_succeeds() {
 
@@ -471,7 +460,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.license.missing", body.getCode());
     }
 
-
     @Test
     public void handle_malformedException_succeeds() {
 
@@ -485,7 +473,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.request.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_messageNotFoundException_succeeds() {
 
@@ -499,7 +486,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.message.missing", body.getCode());
     }
 
-
     @Test
     public void handle_metadataServiceConnectionException_succeeds() {
 
@@ -513,7 +499,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.metadata.connection", body.getCode());
     }
 
-
     @Test
     public void handle_metadataServiceException_succeeds() {
 
@@ -527,7 +512,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.metadata.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_notAllowedException_succeeds() {
 
@@ -541,7 +525,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.request.forbidden", body.getCode());
     }
 
-
     @Test
     public void handle_ontologyNotFoundException_succeeds() {
 
@@ -555,7 +538,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.ontology.missing", body.getCode());
     }
 
-
     @Test
     public void handle_orcidNotFoundException_succeeds() {
 
@@ -569,7 +551,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.orcid.missing", body.getCode());
     }
 
-
     @Test
     public void handle_paginationException_succeeds() {
 
@@ -583,7 +564,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.request.pagination", body.getCode());
     }
 
-
     @Test
     public void handle_queryMalformedException_succeeds() {
 
@@ -597,7 +577,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.query.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_queryNotFoundException_succeeds() {
 
@@ -611,7 +590,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.query.missing", body.getCode());
     }
 
-
     @Test
     public void handle_queryNotSupportedException_succeeds() {
 
@@ -625,7 +603,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.query.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_queryStoreCreateException_succeeds() {
 
@@ -639,7 +616,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.store.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_queryStoreGCException_succeeds() {
 
@@ -653,7 +629,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.store.clean", body.getCode());
     }
 
-
     @Test
     public void handle_queryStoreInsertException_succeeds() {
 
@@ -667,7 +642,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.store.insert", body.getCode());
     }
 
-
     @Test
     public void handle_queryStorePersistException_succeeds() {
 
@@ -681,7 +655,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.store.persist", body.getCode());
     }
 
-
     @Test
     public void handle_queueNotFoundException_succeeds() {
 
@@ -695,7 +668,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.queue.missing", body.getCode());
     }
 
-
     @Test
     public void handle_remoteUnavailableException_succeeds() {
 
@@ -709,7 +681,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.metadata.privileged", body.getCode());
     }
 
-
     @Test
     public void handle_rorNotFoundException_succeeds() {
 
@@ -723,7 +694,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.ror.missing", body.getCode());
     }
 
-
     @Test
     public void handle_searchServiceConnectionException_succeeds() {
 
@@ -737,7 +707,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.search.connection", body.getCode());
     }
 
-
     @Test
     public void handle_searchServiceException_succeeds() {
 
@@ -751,7 +720,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.search.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_semanticEntityNotFoundException_succeeds() {
 
@@ -765,7 +733,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.semantic.missing", body.getCode());
     }
 
-
     @Test
     public void handle_sortException_succeeds() {
 
@@ -779,7 +746,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.request.sort", body.getCode());
     }
 
-
     @Test
     public void handle_storageNotFoundException_succeeds() {
 
@@ -793,7 +759,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.storage.missing", body.getCode());
     }
 
-
     @Test
     public void handle_storageUnavailableException_succeeds() {
 
@@ -807,7 +772,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.storage.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_tableExistsException_succeeds() {
 
@@ -821,7 +785,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.table.exists", body.getCode());
     }
 
-
     @Test
     public void handle_tableMalformedException_succeeds() {
 
@@ -835,7 +798,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.table.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_tableNotFoundException_succeeds() {
 
@@ -849,7 +811,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.table.missing", body.getCode());
     }
 
-
     @Test
     public void handle_tableSchemaException_succeeds() {
 
@@ -863,7 +824,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.schema.table", body.getCode());
     }
 
-
     @Test
     public void handle_unitNotFoundException_succeeds() {
 
@@ -877,7 +837,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.unit.missing", body.getCode());
     }
 
-
     @Test
     public void handle_uriMalformedException_succeeds() {
 
@@ -891,7 +850,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.semantics.uri", body.getCode());
     }
 
-
     @Test
     public void handle_userExistsException_succeeds() {
 
@@ -905,7 +863,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.user.exists", body.getCode());
     }
 
-
     @Test
     public void handle_userNotFoundException_succeeds() {
 
@@ -919,7 +876,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.user.missing", body.getCode());
     }
 
-
     @Test
     public void handle_viewMalformedException_succeeds() {
 
@@ -933,7 +889,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.view.invalid", body.getCode());
     }
 
-
     @Test
     public void handle_viewNotFoundException_succeeds() {
 
@@ -947,7 +902,6 @@ public class ApiExceptionHandlerTest extends AbstractUnitTest {
         assertEquals("error.view.missing", body.getCode());
     }
 
-
     @Test
     public void handle_viewSchemaException_succeeds() {
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
index 790262c7399d36fb0d9a3cf6103f7899300daffb..8f7594634ba17248ac3024eb0c36b4d196b7b3b4 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
@@ -586,11 +586,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
         } catch (Exception e) {
             /* ignore */
         }
-        try {
-            userEndpoint.password(USER_1_ID, USER_1_PASSWORD_DTO, USER_1_PRINCIPAL);
-        } catch (Exception e) {
-            /* ignore */
-        }
 
         /* test */
         for (String metric : List.of("dbrepo_users_list", "dbrepo_user_find", "dbrepo_user_modify",
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java
index eb228ab3c3c3f781a585fa199b63c7a512d222c3..c224fa9a856e41e6c327fe6d05334fc953c91cea 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServicePersistenceTest.java
@@ -3,7 +3,6 @@ package at.tuwien.service;
 import at.tuwien.api.user.UserUpdateDto;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.AuthServiceException;
-import at.tuwien.exception.UserExistsException;
 import at.tuwien.exception.UserNotFoundException;
 import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.repository.UserRepository;
@@ -124,20 +123,4 @@ public class UserServicePersistenceTest extends AbstractUnitTest {
             userService.findById(USER_2_ID);
         });
     }
-
-    @Test
-    public void validateUsernameNotExists_succeeds() throws UserExistsException {
-
-        /* test */
-        userService.validateUsernameNotExists(USER_2_USERNAME);
-    }
-
-    @Test
-    public void validateUsernameNotExists_fails() {
-
-        /* test */
-        assertThrows(UserExistsException.class, () -> {
-            userService.validateUsernameNotExists(USER_1_USERNAME);
-        });
-    }
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java
index df13d00b0858a28dd4ccc38c5542601790dc964a..2744900d67cc742f74bdc3954cd20a8a6731c12b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java
@@ -3,7 +3,6 @@ package at.tuwien.service;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.AuthServiceException;
 import at.tuwien.exception.UserNotFoundException;
-import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.repository.UserRepository;
 import at.tuwien.test.AbstractUnitTest;
 import org.junit.jupiter.api.BeforeEach;
@@ -19,15 +18,13 @@ import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.when;
 
 @ExtendWith(SpringExtension.class)
 @SpringBootTest
 public class UserServiceUnitTest extends AbstractUnitTest {
 
-    @MockBean
-    private KeycloakGateway keycloakGateway;
-
     @MockBean
     private UserRepository userRepository;
 
@@ -92,22 +89,6 @@ public class UserServiceUnitTest extends AbstractUnitTest {
         assertEquals(USER_1_USERNAME, response.getUsername());
     }
 
-    @Test
-    public void updatePassword_succeeds() throws UserNotFoundException, AuthServiceException {
-
-        /* mock */
-        doNothing()
-                .when(keycloakGateway)
-                .setupFinished(USER_1_ID);
-        when(userRepository.findById(USER_1_ID))
-                .thenReturn(Optional.of(USER_1));
-        when(userRepository.save(any(User.class)))
-                .thenReturn(USER_1);
-
-        /* test */
-        userService.updatePassword(USER_1, USER_1_PASSWORD_DTO);
-    }
-
     @Test
     public void findByUsername_fails() {
 
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 c6ca0ff21eb02986f30d42ec0b8727b368d5bfe4..f38268c000aa85a663bacbb51511aeae8ef197d1 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
@@ -57,21 +57,5 @@ public interface UserService {
      */
     User modify(User user, UserUpdateDto data) throws UserNotFoundException, AuthServiceException;
 
-    /**
-     * Updates the user password for a user with given id in the metadata database.
-     *
-     * @param user The user.
-     * @param data The new password.
-     */
-    void updatePassword(User user, UserPasswordDto data);
-
-    /**
-     * Validates if a user with the given username already exists in the metadata database.
-     *
-     * @param username The username.
-     * @throws UserExistsException The user with this username already exists.
-     */
-    void validateUsernameNotExists(String username) throws UserExistsException;
-
     String getMariaDbPassword(String password);
 }
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 e79dd9bd842ac4cbb145f3b86f533962c23e2625..ad05c4fd469a381aca7b8f11bfd6d0e5b017b2ff 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
@@ -1,11 +1,9 @@
 package at.tuwien.service.impl;
 
 import at.tuwien.api.auth.CreateUserDto;
-import at.tuwien.api.user.UserPasswordDto;
 import at.tuwien.api.user.UserUpdateDto;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.AuthServiceException;
-import at.tuwien.exception.UserExistsException;
 import at.tuwien.exception.UserNotFoundException;
 import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.repository.UserRepository;
@@ -100,21 +98,6 @@ public class UserServiceImpl implements UserService {
         return user;
     }
 
-    @Override
-    public void updatePassword(User user, UserPasswordDto data) {
-        user.setMariadbPassword(getMariaDbPassword(data.getPassword()));
-        /* update at metadata database */
-        userRepository.save(user);
-        log.info("Updated password of user with id: {}", user.getId());
-    }
-
-    @Override
-    public void validateUsernameNotExists(String username) throws UserExistsException {
-        if (userRepository.existsByUsername(username)) {
-            throw new UserExistsException("User with username " + username + " already exists");
-        }
-    }
-
     @Override
     public String getMariaDbPassword(String password) {
         final byte[] utf8 = password.getBytes(StandardCharsets.UTF_8);
diff --git a/dbrepo-ui/components/user/UserToolbar.vue b/dbrepo-ui/components/user/UserToolbar.vue
index 54210130d32f9c1cbe73378138e6c0db28c8cc88..59c0f53221ebf0faca4a102b7d81e200b95c6b63 100644
--- a/dbrepo-ui/components/user/UserToolbar.vue
+++ b/dbrepo-ui/components/user/UserToolbar.vue
@@ -11,9 +11,6 @@
           <v-tab
             :text="$t('toolbars.user.info')"
             to="/user/info" />
-          <v-tab
-            :text="$t('toolbars.user.authentication')"
-            to="/user/authentication" />
         </v-tabs>
       </template>
     </v-toolbar>
diff --git a/dbrepo-ui/pages/user/authentication.vue b/dbrepo-ui/pages/user/authentication.vue
deleted file mode 100644
index 912c1878c4940556e1dae3e890e4087ca7af5984..0000000000000000000000000000000000000000
--- a/dbrepo-ui/pages/user/authentication.vue
+++ /dev/null
@@ -1,138 +0,0 @@
-<template>
-  <div
-    v-if="loggedIn">
-    <UserToolbar />
-    <v-window v-model="tab">
-      <v-window-item>
-        <v-card
-          :title="$t('pages.settings.subpages.authentication.title')"
-          :subtitle="$t('pages.settings.subpages.authentication.subtitle')"
-          variant="flat"
-          rounded="0">
-          <v-card-text>
-            <v-form
-              v-model="valid2">
-              <v-row dense>
-                <v-col md="6">
-                  <v-text-field
-                    v-model="password"
-                    type="password"
-                    :rules="[v => !!v || $t('validation.required')]"
-                    required
-                    :variant="inputVariant"
-                    persistent-hint
-                    :label="$t('pages.settings.subpages.authentication.password.label')"
-                    :hint="$t('pages.settings.subpages.authentication.password.hint')" />
-                </v-col>
-              </v-row>
-              <v-row dense>
-                <v-col md="6">
-                  <v-text-field
-                    v-model="password2"
-                    type="password"
-                    :rules="[v => !!v || $t('validation.required'), v => (!!v && v) === password || $t('Not matching!')]"
-                    required
-                    :variant="inputVariant"
-                    persistent-hint
-                    :label="$t('pages.settings.subpages.authentication.confirm.label')"
-                    :hint="$t('pages.settings.subpages.authentication.confirm.hint')" />
-                </v-col>
-              </v-row>
-              <v-row>
-                <v-col md="6">
-                  <v-btn
-                    size="small"
-                    color="secondary"
-                    :loading="loadingUpdate"
-                    :disabled="!valid2"
-                    variant="flat"
-                    type="submit"
-                    :text="$t('pages.settings.subpages.authentication.submit.text')"
-                    @click="changePassword" />
-                </v-col>
-              </v-row>
-            </v-form>
-          </v-card-text>
-        </v-card>
-      </v-window-item>
-    </v-window>
-    <v-breadcrumbs :items="items" class="pa-0 mt-2" />
-  </div>
-</template>
-
-<script setup>
-const { loggedIn, user } = useOidcAuth()
-</script>
-<script>
-import UserToolbar from '@/components/user/UserToolbar.vue'
-import { useCacheStore } from '@/stores/cache.js'
-
-export default {
-  components: {
-    UserToolbar
-  },
-  data () {
-    return {
-      tab: 0,
-      valid1: false,
-      valid2: false,
-      loadingUpdate: false,
-      items: [
-        {
-          title: this.$t('navigation.user'),
-          to: '/user'
-        },
-        {
-          title: this.$t('toolbars.user.authentication'),
-          to: `/user/authentication`,
-          disabled: true
-        }
-      ],
-      email: null,
-      password: null,
-      password2: null,
-      cacheStore: useCacheStore()
-    }
-  },
-  computed: {
-    cacheUser () {
-      return this.cacheStore.getUser
-    },
-    inputVariant () {
-      const runtimeConfig = useRuntimeConfig()
-      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
-    },
-    buttonVariant () {
-      const runtimeConfig = useRuntimeConfig()
-      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
-    }
-  },
-  methods: {
-    changePassword () {
-      this.loadingUpdate = true
-      const userService = useUserService()
-      userService.updatePassword(this.cacheUser.uid, {'password': this.password})
-        .then(() => {
-          const user = Object.assign({}, this.cacheUser)
-          user.setup_finished = true
-          this.cacheStore.setUser(user)
-          // fixme [mweise]: currently nuxt-oidc-auth cannot refresh the session correctly
-          const toast = useToastInstance()
-          toast.success(this.$t('success.user.password'))
-          this.loadingUpdate = false
-        })
-        .catch(({code, message}) => {
-          const toast = useToastInstance()
-          if (typeof code !== 'string') {
-            return
-          }
-          toast.error(message)
-          this.loadingUpdate = false
-        })
-        .finally(() => {
-          this.loadingUpdate = false
-        })
-    }
-  }
-}
-</script>
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 7b332886dd5aca385115460c47692fdef8522e0b..f370c8825750a431296ef68c3d482a2e4eee9389 100644
Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ
diff --git a/make/build.mk b/make/build.mk
index 270b2cee6fd80b9dea9a475399081ae34ad65c91..61f2f7448fb24d8ec5817a4a133c5b3e4680be1b 100644
--- a/make/build.mk
+++ b/make/build.mk
@@ -17,6 +17,7 @@ build-metadata-service: ## Build the Metadata Service.
 .PHONY: build-auth-event-listener
 build-auth-event-listener: ## Build the Auth Service Event Listener.
 	mvn -f ./dbrepo-auth-service/listeners/pom.xml clean package -DskipTests
+	cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./helm/dbrepo/files/create-event-listener.jar
 
 .PHONY: build-ui
 build-ui: ## Build the UI.