diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
index 20ba3af39e5b8bdb4c76edb98ec721b2d3f177ce..3f6c1e08e6c600d8754d20e9742714ad3dc0234a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
@@ -101,19 +101,22 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor
 
     }
 
-    /**
-     * authenticate when the session has expired.
-     */
     @Override
-    public synchronized Object invoke(MethodInvocation invocation) throws Throwable
+    public Object invoke(MethodInvocation invocation) throws Throwable
     {
-        checkSessionToken();
+        String sessionToken = getSessionToken();
         try
         {
             return invocation.proceed();
         } catch (InvalidSessionException ise)
         {
-            authenticate();
+            synchronized (this)
+            {
+                if (sessionToken == sessionHolder.getSessionToken())
+                {
+                    authenticate();
+                }
+            }
             return invocation.proceed();
         }
     }
@@ -151,12 +154,21 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor
         service.registerDataStoreServer(sessionToken, dataStoreServerInfo);
     }
 
-    private final void checkSessionToken()
+    /**
+     * authenticates when the session has expired.
+     */
+    private final String getSessionToken()
     {
         if (sessionHolder.getSessionToken() == null)
         {
-            authenticate();
+            synchronized (this)
+            {
+                if (sessionHolder.getSessionToken() == null)
+                    authenticate();
+            }
         }
+
+        return sessionHolder.getSessionToken();
     }
 
     public final void setPort(int port)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
index 1697e4afdcb116f936edf31f5bab4c81e59cba5d..d858357f611a61c2a562d658e975939d9694a8df 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
@@ -30,7 +30,7 @@ public class OpenBISSessionHolder implements Serializable, ISessionTokenProvider
 {
     private static final long serialVersionUID = 1L;
 
-    private String sessionToken;
+    private volatile String sessionToken;
 
     private String dataStoreCode;