diff --git a/datastore/src/main/java/net/jami/datastore/dao/UserDao.java b/datastore/src/main/java/net/jami/datastore/dao/UserDao.java
index 144c74d80cd851eb2e716b464247d2f07856823f..ca2c69cc7478bc3d24f35ead311cf9b0b56972fe 100644
--- a/datastore/src/main/java/net/jami/datastore/dao/UserDao.java
+++ b/datastore/src/main/java/net/jami/datastore/dao/UserDao.java
@@ -88,10 +88,11 @@ public class UserDao extends AbstractDao<User> {
     public boolean updateObject(StatementList update, StatementList constraints) {
 
         String pw = update.getStatements().get(0).getValue();
-        String user = update.getStatements().get(1).getValue();
-        String needsPasswordReset = "";
-        if (update.getStatements().size() >= 3 && update.getStatements().get(2) != null)
-            needsPasswordReset = update.getStatements().get(2).getValue();
+        String user = constraints.getStatements().get(0).getValue();
+        String pwReset = "false";
+
+        if (update.getStatements().size() > 1)
+            pwReset = update.getStatements().get(1).getValue();
 
         SQLConnection connection = DataStore.connectionPool.getConnection();
 
@@ -102,10 +103,7 @@ public class UserDao extends AbstractDao<User> {
             ps.executeUpdate();
 
             ps = connection.getConnection().prepareStatement("UPDATE users SET needsPasswordReset = ? WHERE username = ?");
-            if (!needsPasswordReset.isEmpty())
-                ps.setString(1, needsPasswordReset);
-            else
-                ps.setString(1, "false");
+            ps.setString(1, pwReset);
 
             ps.setString(2, user);
             return ps.executeUpdate() != 0;
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java
index a8191bf5410ca4ad2bfc79c5756752c8888216da..74db4619971953668c256f21f00d8650059efde4 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java
@@ -61,6 +61,21 @@ public class UserServlet extends HttpServlet {
             user.setRevoked(certificateAuthority.getLatestCRL().get().getRevokedCertificate(user.getCertificate().getSerialNumber()) != null);
         }
         else user.setRevoked(false);
+
+        if (!user.getNeedsPasswordReset() && req.getParameter("needPW") != null) {
+            String password = PasswordGenerator.generatePassword();
+            StatementList update = new StatementList();
+            StatementElement st0 = new StatementElement("password","=",password,"");
+            update.addStatement(st0);
+            StatementList constraint = new StatementList();
+            StatementElement st = new StatementElement("username","=",req.getParameter("username"),"");
+            constraint.addStatement(st);
+            StatementElement st2 = new StatementElement("needsPasswordReset","=","true","");
+            update.addStatement(st2);
+            // refresh variable
+            dataStore.getUserDao().updateObject(update,constraint);
+            user = dataStore.getUserDao().getObjects(statementList).get(0);
+        }
         resp.getOutputStream().write(JsonStream.serialize(user).getBytes());
     }
 
@@ -99,7 +114,7 @@ public class UserServlet extends HttpServlet {
         update.addStatement(st0);
         StatementList constraint = new StatementList();
         StatementElement st1 = new StatementElement("username","=",username,"");
-        update.addStatement(st1);
+        constraint.addStatement(st1);
         if(dataStore.getUserDao().updateObject(update,constraint)) resp.setStatus(200);
         else resp.sendError(500,"could not update the users's data field!");
     }
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java
index dad2985e5e229abc9850ee81442655c056cea310..dfc1a9fcde91000b5bea1677aa4a9875de58e8d9 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java
@@ -97,7 +97,7 @@ public class UserServlet extends HttpServlet {
      */
     @Override
     @ScopedServletMethod(securityGroups = AccessLevel.USER)
-    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         String username = req.getAttribute("username").toString();
         //Check if he is AD/LDAP - then return a 403, because we can't set such password.
         StatementList select = new StatementList();
diff --git a/jams-server/src/main/resources/webapp/js/api.js b/jams-server/src/main/resources/webapp/js/api.js
index b1adf1cee1411510b2bdf17724887aeeb70175de..76d0e802317ffb7e5f39ded1ba7fc8280eac9d0f 100644
--- a/jams-server/src/main/resources/webapp/js/api.js
+++ b/jams-server/src/main/resources/webapp/js/api.js
@@ -73,7 +73,7 @@ function ajaxApiCall(api_path, request_type, data, credentials, callBackFunction
             },
             error: function (data, statusCode, jqXHR) {
                 callBackFunction(data, statusCode, jqXHR);
-                if(data.status == 401){
+                if(data.status == 401 && !url.includes("api/login")){
                     window.localStorage.removeItem('access_token');
                     window.location.replace(url_path + ":" + url_port+"/templates/signup.html");
                 }
diff --git a/jams-server/src/main/resources/webapp/js/auth.js b/jams-server/src/main/resources/webapp/js/auth.js
index 8e916e75b3823dd32b1e1d738e00f365df78b8a2..8fe5c73f9afd7e2eb2e42d96206868402ed1a081 100644
--- a/jams-server/src/main/resources/webapp/js/auth.js
+++ b/jams-server/src/main/resources/webapp/js/auth.js
@@ -92,7 +92,7 @@ function serverConfigStatus(data) {
         if (getAdminStatus() && (!current_uri.includes('search.html')) && (!current_uri.includes('user.html')) && (!current_uri.includes('config.html'))) {
             window.location.replace("search.html");
         }
-        else if (!getAdminStatus() && getUser() && (!current_uri.includes('user.html'))) {
+        else if (!getAdminStatus() && getUser() && JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1])).oneTimePassword == false && (!current_uri.includes('user.html'))) {
             window.location.replace("user.html?username=" + getUser());
         }
         else if (!getAdminStatus() && !getUser() && (!current_uri.includes('signup.html'))) {
diff --git a/jams-server/src/main/resources/webapp/js/new-password.js b/jams-server/src/main/resources/webapp/js/new-password.js
index 7fcc63ba73c3dfaded0dc1d505b45468cf4020d6..e77fb7ba415e2b7a78255f0d54a6499ffd8b9cff 100644
--- a/jams-server/src/main/resources/webapp/js/new-password.js
+++ b/jams-server/src/main/resources/webapp/js/new-password.js
@@ -60,6 +60,8 @@ document.getElementById("changePasswordButton").addEventListener('click', functi
 
 function updateLocalAccountPasswordCallBackHandler(data) {
     // now we can login normally
-    if (data.status != 500)
+    if (data.status != 500) {
+        window.localStorage.removeItem('access_token');
         ajaxApiCall(api_path_post_auth_login, "POST", jsonData, null, signinCallBackHandler);
+    }
 }
\ No newline at end of file
diff --git a/jams-server/src/main/resources/webapp/js/signup.js b/jams-server/src/main/resources/webapp/js/signup.js
index e73320ddf19ff1a38ba6c9c9edf5295e61519183..90c06c4a75549f565285ee6487cdc1889ede9b89 100644
--- a/jams-server/src/main/resources/webapp/js/signup.js
+++ b/jams-server/src/main/resources/webapp/js/signup.js
@@ -93,20 +93,16 @@ function createAdminCallBackHandler(data, statusCode, jqXHR) {
 
 function signinCallBackHandler(data, statusCode, jqXHR) {
 
-    var tokenJSON = '';
-    if (data.access_token) {
+    if (data.status == 401 || data.status == 405)
+        invalidLogin();
+    else if (data.access_token && jqXHR.status == 200) {
         setJWT(data);
-        tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1]));
-    }
-
-    if (jqXHR.status == 200 && tokenJSON != '' && tokenJSON.oneTimePassword == false) {
+        var tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1]));
 
-    // check server configuration status
-    getServerConfigStatus();
-  }  else if (jqXHR.status == 200 && tokenJSON != '' && tokenJSON.oneTimePassword == true) {
-      window.location.replace("new-password.html?username=" + getUser());
-  }
-  else {
-    invalidLogin();
-  }
+        if (tokenJSON.oneTimePassword == false)
+            getServerConfigStatus();
+        else {
+            window.location.replace("new-password.html?username=" + getUser());
+        }
+    }
 }
diff --git a/jams-server/src/main/resources/webapp/js/user.js b/jams-server/src/main/resources/webapp/js/user.js
index d9ed7fc1293ef4f1444aa2e7c7bf9e62ff2b8d72..b870f349f52b0e6cd2539eb199d4edd7144d5377 100644
--- a/jams-server/src/main/resources/webapp/js/user.js
+++ b/jams-server/src/main/resources/webapp/js/user.js
@@ -122,11 +122,9 @@ $(document).ready(function() {
             ajaxApiCall(api_path_delete_admin_user_revoke + "?username=" + encodeURIComponent(userData["username"]), 'DELETE', null, null, revokeUser);
         });
 
-        $( '.user-information' ).on( 'click', '.reset-password', function (e) {
+        $( '.user-information' ).on( 'click', '.reset-password', function () {
             if (getAdminStatus())
-                ajaxApiCall(api_path_get_admin_user, 'GET', userData, null, handleNewOTP);
-            else
-                ajaxApiCall(api_path_get_auth_user, 'GET', null, null, handleNewOTP);
+                ajaxApiCall(api_path_get_admin_user, 'GET', {"username":username, "needPW": "needPW"}, null, handleNewOTP);
         });
 
         // change device name
@@ -505,17 +503,17 @@ function isLocalDB(data, statusCode, jqXHR){
 }
 
 function handleNewOTP(data) {
-
     if (data.status == 200) {
-
-        if (data.getResponseHeader('needspasswordreset') == "false") {
+        var resultSet = JSON.parse(data.responseText.replace(/\s+/g, ' ').trim());
+        if (resultSet.needsPasswordReset == true) {
             $('#otpModalCenter').modal('show');
-            $('#user-pw-modal-body').text("User password reset. Here is the new one time password: " + data.getResponseHeader('password'));
-        } else if (data.getResponseHeader('needspasswordreset') == "true") {
+            $('#user-pw-modal-body').text("User password reset. Here is the new one time password: " + resultSet.password);
+        } else {
             // show modal
             $('#otpModalCenter').modal('show');
-            $('#user-pw-modal-body').text("User has not changed his temporary password. Current password: " + data.getResponseHeader('password'));
+            $('#user-pw-modal-body').text("User has not changed his temporary password. Current password: " + resultSet.password);
         }
+
     }
 }