diff --git a/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java b/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java
index 40df5ac8f6cd7bb5ab5cd7f6e8794042a0a97dee..459c724a46489d32a0f36135392eb03f2df945b9 100644
--- a/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java
+++ b/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java
@@ -62,6 +62,12 @@ public final class ConcurrencyUtilities
          * Returns the log level to be used in error logging.
          */
         LogLevel getLogLevelForError();
+
+        /**
+         * Returns the log level to be used in successful operation (return {@link LogLevel#OFF} to
+         * switch off logging for successful operation).
+         */
+        LogLevel getLogLevelForSuccess();
     }
 
     /**
@@ -358,6 +364,14 @@ public final class ConcurrencyUtilities
                 return ExecutionResult.createTimedOut();
             } else
             {
+                if (logSettingsOrNull != null
+                        && logSettingsOrNull.getLogLevelForSuccess() != LogLevel.OFF)
+                {
+                    logSettingsOrNull.getLogger().log(
+                            logSettingsOrNull.getLogLevelForSuccess(),
+                            String.format("%s: call returns %s.", logSettingsOrNull
+                                    .getOperationName(), result.tryGetResult()));
+                }
                 return result;
             }
         } catch (InterruptedException ex)
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java
index df530f2538c2908a92916973d1d38b75146bc122..ec7d2f85a92bb02d22043ff3953fac2e2e38faf1 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java
@@ -66,7 +66,7 @@ public class ConcurrencyUtilitiesTest
     public void beforeMethod()
     {
         logger = new AssertingLogger();
-        createLogSettings(LogLevel.WARN);
+        createLogSettings(LogLevel.WARN, LogLevel.OFF);
     }
 
     @AfterClass
@@ -75,14 +75,14 @@ public class ConcurrencyUtilitiesTest
         Thread.interrupted();
     }
 
-    private void createLogSettings(final LogLevel level)
+    private void createLogSettings(final LogLevel levelForError, final LogLevel levelForSuccess)
     {
         logSettings = new ILogSettings()
             {
                 @Override
                 public LogLevel getLogLevelForError()
                 {
-                    return level;
+                    return levelForError;
                 }
 
                 @Override
@@ -96,6 +96,12 @@ public class ConcurrencyUtilitiesTest
                 {
                     return name;
                 }
+
+                @Override
+                public LogLevel getLogLevelForSuccess()
+                {
+                    return levelForSuccess;
+                }
             };
     }
 
@@ -123,6 +129,7 @@ public class ConcurrencyUtilitiesTest
     @Test
     public void testGetExecutionResultOK()
     {
+        createLogSettings(LogLevel.ERROR, LogLevel.INFO);
         final String valueProvided = "This is the execution return value";
         final ThreadPoolExecutor eservice =
                 new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2);
@@ -140,7 +147,8 @@ public class ConcurrencyUtilitiesTest
         assertNull(result.tryGetException());
         assertEquals(valueProvided, result.tryGetResult());
         assertTrue(future.isDone());
-        logger.assertNumberOfMessage(0);
+        logger.assertNumberOfMessage(1);
+        logger.assertEq(0, LogLevel.INFO, name + ": call returns " + valueProvided + ".");
     }
 
     @Test
@@ -273,7 +281,7 @@ public class ConcurrencyUtilitiesTest
     @Test(groups = "slow")
     public void testGetExecutionResultTimeoutWithoutCancelation()
     {
-        createLogSettings(LogLevel.INFO);
+        createLogSettings(LogLevel.INFO, LogLevel.OFF);
         final ThreadPoolExecutor eservice =
                 new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2);
         final Future<String> future = eservice.submit(new Callable<String>()
@@ -380,7 +388,7 @@ public class ConcurrencyUtilitiesTest
     @Test
     public void testGetExecutionResultInterrupted()
     {
-        createLogSettings(LogLevel.DEBUG);
+        createLogSettings(LogLevel.DEBUG, LogLevel.OFF);
         final ThreadPoolExecutor eservice =
                 new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2);
         final Thread thread = Thread.currentThread();
@@ -437,7 +445,7 @@ public class ConcurrencyUtilitiesTest
     @Test
     public void testGetExecutionResultException()
     {
-        createLogSettings(LogLevel.ERROR);
+        createLogSettings(LogLevel.ERROR, LogLevel.OFF);
         final ThreadPoolExecutor eservice =
                 new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2);
         final Future<String> future = eservice.submit(new Callable<String>()