diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java b/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java
index ee7035ddef358226f75bab5bbee99a4519d4c34d..757c6e3b66a3baa6427ecdbeb9ea30ebe0be4093 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/ThreadDump.java
@@ -17,11 +17,14 @@
 package ch.systemsx.cisd.common.utilities;
 
 import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.lang.Thread.State;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.log4j.Logger;
+
 /**
  * Helper class which dumps all threads onto the console or a {@link PrintWriter}.
  *
@@ -39,6 +42,22 @@ public class ThreadDump
         writer.flush();
     }
     
+    /**
+     * Dumps all threads onto the specified logger as an INFO message.
+     */
+    public static void dumpAllThreads(Logger logger)
+    {
+        if (logger.isInfoEnabled() == false)
+        {
+            return;
+        }
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter writer = new PrintWriter(stringWriter);
+        dumpAllThreads(writer);
+        writer.flush();
+        logger.info("Thread dump:\n" + stringWriter.toString());
+    }
+    
     /**
      * Dumps all threads onto the specified writer.
      */
@@ -50,8 +69,8 @@ public class ThreadDump
         {
             Thread thread = entry.getKey();
             State state = thread.getState();
-            writer.println(thread + " state: " + State.valueOf(state.name()) + " daemon: "
-                    + thread.isDaemon() + " alive: " + thread.isAlive() + " interrupted: "
+            writer.println(thread + ", state:" + State.valueOf(state.name()) + ", daemon:"
+                    + thread.isDaemon() + ", alive:" + thread.isAlive() + ", interrupted:"
                     + thread.isInterrupted());
             StackTraceElement[] stackTraceElements = entry.getValue();
             for (StackTraceElement stackTraceElement : stackTraceElements)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java
index b6a4a613257e8e2bd6f8ac001a509c4d3575d06d..8b72c9642a350d2a4d66347b6bbea9b9ee28bd7e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServerExceptionTranslatingAdvisor.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server;
 
 import org.aopalliance.intercept.MethodInterceptor;
 import org.aopalliance.intercept.MethodInvocation;
+import org.apache.log4j.Logger;
 import org.springframework.aop.ClassFilter;
 import org.springframework.aop.MethodMatcher;
 import org.springframework.aop.Pointcut;
@@ -29,6 +30,8 @@ import org.springframework.transaction.TransactionSystemException;
 import org.springframework.transaction.annotation.Transactional;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.logging.LogCategory;
+import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.ThreadDump;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 
@@ -50,6 +53,9 @@ public class ServerExceptionTranslatingAdvisor extends DefaultPointcutAdvisor
 
     private static final long serialVersionUID = 1L;
 
+    private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
+            ServerExceptionTranslatingAdvisor.class);
+
     public ServerExceptionTranslatingAdvisor()
     {
         super(new AllServerMethodsPointcut(), new UserFailureExceptionTranslatingInterceptor());
@@ -98,7 +104,7 @@ public class ServerExceptionTranslatingAdvisor extends DefaultPointcutAdvisor
         if (message.contains("deadlock detected")
                 || message.contains("Row was updated or deleted by another transaction"))
         {
-            ThreadDump.dumpAllThreads();
+            ThreadDump.dumpAllThreads(operationLog);
         }
     }