diff --git a/tine20/Tinebase/Frontend/Json.php b/tine20/Tinebase/Frontend/Json.php
index e210cb1b906..be6adb9cd0c 100644
--- a/tine20/Tinebase/Frontend/Json.php
+++ b/tine20/Tinebase/Frontend/Json.php
@@ -662,6 +662,11 @@ protected function _getLoginSuccessResponse($username)
             'jsonKey' => Tinebase_Core::get('jsonKey'),
             'welcomeMessage' => "Welcome to Tine 2.0!"
         );
+
+        try {
+            $response['assetHash'] = Tinebase_Frontend_Http_SinglePageApplication::getAssetHash();
+        } catch (Exception $e) {}
+        
         if (Tinebase_Core::get(Tinebase_Core::SESSION)->encourage_mfa) {
             $response['encourage_mfa'] = true;
         }
diff --git a/tine20/Tinebase/js/LoginPanel.js b/tine20/Tinebase/js/LoginPanel.js
index d824dc8959d..9d37658e0b5 100644
--- a/tine20/Tinebase/js/LoginPanel.js
+++ b/tine20/Tinebase/js/LoginPanel.js
@@ -551,12 +551,20 @@ Tine.Tinebase.LoginPanel = Ext.extend(Ext.Panel, {
     },
 
     onLoginSuccess: function(response) {
-        var responseData = Ext.util.JSON.decode(response.responseText);
+        const responseData = Ext.util.JSON.decode(response.responseText);
         if (responseData.success === true) {
             if (window.initialData?.afterLoginRedirect) {
                 return this.redirect(window.initialData.afterLoginRedirect);
             }
             Ext.MessageBox.wait(String.format(i18n._('Login successful. Loading {0}...'), Tine.title), i18n._('Please wait!'));
+            
+            if (responseData?.assetHash && Tine.clientVersion.assetHash !== responseData.assetHash) {
+                Tine.Tinebase.common.reload({
+                    keepRegistry: false,
+                    clearCache: true
+                });
+            }
+            
             window.document.title = this.originalTitle;
             response.responseData = responseData;
             this.onLogin.call(this.scope, response);