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 54a395900607b08d244696a8f45168a8e2b2fc5c..82188978dee65caa7ba21e8904be81f90192bd55 100644
--- a/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java
+++ b/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java
@@ -27,7 +27,7 @@ import java.util.concurrent.TimeoutException;
 
 import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.logging.ISimpleLogger;
-import ch.systemsx.cisd.common.logging.ISimpleLogger.Level;
+import ch.systemsx.cisd.common.logging.LogLevel;
 
 /**
  * Concurrency related utility methods.
@@ -91,7 +91,7 @@ public final class ConcurrencyUtilities
             if (loggerOrNull != null)
             {
                 loggerOrNull
-                        .log(Level.DEBUG, String.format("%s took longer than %f s, cancelled.",
+                        .log(LogLevel.DEBUG, String.format("%s took longer than %f s, cancelled.",
                                 operationNameOrNull == null ? "UNKNOWN OPERATION" : operationNameOrNull,
                                 timeoutMillis / 1000f));
             }
@@ -101,7 +101,7 @@ public final class ConcurrencyUtilities
             future.cancel(true);
             if (loggerOrNull != null)
             {
-                loggerOrNull.log(Level.DEBUG, String.format("%s got interrupted.",
+                loggerOrNull.log(LogLevel.DEBUG, String.format("%s got interrupted.",
                         operationNameOrNull == null ? "UNKNOWN OPERATION" : operationNameOrNull));
             }
             return null;
@@ -110,7 +110,7 @@ public final class ConcurrencyUtilities
             final Throwable cause = ex.getCause();
             if (loggerOrNull != null)
             {
-                loggerOrNull.log(Level.ERROR, String.format("%s has caused an exception: %s",
+                loggerOrNull.log(LogLevel.ERROR, String.format("%s has caused an exception: %s",
                         operationNameOrNull == null ? "UNKNOWN OPERATION" : operationNameOrNull, cause.getClass()
                                 .getSimpleName(), cause.getMessage() != null ? cause.getMessage() : "<no message>"));
             }
diff --git a/common/source/java/ch/systemsx/cisd/common/logging/ConsoleLogger.java b/common/source/java/ch/systemsx/cisd/common/logging/ConsoleLogger.java
index 422e78c7b51fc2f293f20ddf5c03da8bacd633e2..15705b96b7837883a1ff28cc0b9475921be5eee3 100644
--- a/common/source/java/ch/systemsx/cisd/common/logging/ConsoleLogger.java
+++ b/common/source/java/ch/systemsx/cisd/common/logging/ConsoleLogger.java
@@ -24,7 +24,7 @@ package ch.systemsx.cisd.common.logging;
 public class ConsoleLogger implements ISimpleLogger
 {
 
-    public void log(Level level, String message)
+    public void log(LogLevel level, String message)
     {
         System.out.println(level.toString() + ": " + message);
     }
diff --git a/common/source/java/ch/systemsx/cisd/common/logging/ISimpleLogger.java b/common/source/java/ch/systemsx/cisd/common/logging/ISimpleLogger.java
index dc673bd1b801df82716e2dba1851f83ab43e1b7d..800e1977810e1ae691a5910d391cb31129644efa 100644
--- a/common/source/java/ch/systemsx/cisd/common/logging/ISimpleLogger.java
+++ b/common/source/java/ch/systemsx/cisd/common/logging/ISimpleLogger.java
@@ -24,10 +24,7 @@ package ch.systemsx.cisd.common.logging;
 public interface ISimpleLogger
 {
 
-    /** A simple form of log levels. */
-    public enum Level { ERROR, WARN, INFO, DEBUG }
-    
     /** Log <var>message</var> at log <var>level</var> out to some log file or display. */
-    public void log(Level level, String message);
+    public void log(LogLevel level, String message);
     
 }
diff --git a/common/source/java/ch/systemsx/cisd/common/logging/Log4jSimpleLogger.java b/common/source/java/ch/systemsx/cisd/common/logging/Log4jSimpleLogger.java
index 591d2d69e4fb4680d1c43bf0bb5cd038b9853aab..557cc23cb7b80de84de2155a7c5f1978ae3801e3 100644
--- a/common/source/java/ch/systemsx/cisd/common/logging/Log4jSimpleLogger.java
+++ b/common/source/java/ch/systemsx/cisd/common/logging/Log4jSimpleLogger.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.common.logging;
 
+import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.Priority;
 
@@ -30,20 +31,24 @@ public class Log4jSimpleLogger implements ISimpleLogger
 
     private final Logger log4jLogger;
 
-    private static final Priority toLog4jPriority(Level level)
+    static final Level toLog4jPriority(LogLevel level)
     {
         switch (level)
         {
-            case ERROR:
-                return org.apache.log4j.Level.ERROR;
-            case WARN:
-                return org.apache.log4j.Level.WARN;
-            case INFO:
-                return org.apache.log4j.Level.INFO;
+            case OFF:
+                return org.apache.log4j.Level.OFF;
+            case TRACE:
+                return org.apache.log4j.Level.TRACE;
             case DEBUG:
                 return org.apache.log4j.Level.DEBUG;
+            case INFO:
+                return org.apache.log4j.Level.INFO;
+            case WARN:
+                return org.apache.log4j.Level.WARN;
+            case ERROR:
+                return org.apache.log4j.Level.ERROR;
             default:
-                throw new IllegalArgumentException("Unknown log level " + level);
+                throw new IllegalArgumentException("Illegal log level " + level);
         }
     }
 
@@ -52,7 +57,7 @@ public class Log4jSimpleLogger implements ISimpleLogger
      * 
      * @param log4jLogger The log4j logger to use.
      * @param log4jOverridePriorityOrNull If not <code>null</code>, use this log level instead of the one provided to
-     *            the {@link ISimpleLogger#log(ch.systemsx.cisd.common.logging.ISimpleLogger.Level, String)}.
+     *            the {@link ISimpleLogger#log(ch.systemsx.cisd.common.logging.LogLevel, String)}.
      */
     public Log4jSimpleLogger(Logger log4jLogger, Priority log4jOverridePriorityOrNull)
     {
@@ -70,7 +75,7 @@ public class Log4jSimpleLogger implements ISimpleLogger
         this(log4jLogger, null);
     }
 
-    public void log(Level level, String message)
+    public void log(LogLevel level, String message)
     {
         if (log4jOverridePriorityOrNull != null)
         {
diff --git a/common/source/java/ch/systemsx/cisd/common/logging/LogAnnotation.java b/common/source/java/ch/systemsx/cisd/common/logging/LogAnnotation.java
index 881eec39a0de0babe9a0a3aab7a0d046f4d1c8c8..4e3b46f6c9d5813dc0066fab5801382fda94c027 100644
--- a/common/source/java/ch/systemsx/cisd/common/logging/LogAnnotation.java
+++ b/common/source/java/ch/systemsx/cisd/common/logging/LogAnnotation.java
@@ -22,7 +22,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-
 /**
  * Log annotation for methods invoked by {@link LogInvocationHandler}.
  *
@@ -34,4 +33,5 @@ import java.lang.annotation.Target;
 public @interface LogAnnotation
 {
     public LogCategory logCategory() default LogCategory.ACCESS;
+    public LogLevel logLevel() default LogLevel.UNDEFINED;
 }
diff --git a/common/source/java/ch/systemsx/cisd/common/logging/LogLevel.java b/common/source/java/ch/systemsx/cisd/common/logging/LogLevel.java
new file mode 100644
index 0000000000000000000000000000000000000000..4062e4ddd25aec4cef5458fd40d63e82e292af6f
--- /dev/null
+++ b/common/source/java/ch/systemsx/cisd/common/logging/LogLevel.java
@@ -0,0 +1,11 @@
+package ch.systemsx.cisd.common.logging;
+
+/** 
+ * A simple form of log levels.
+ * 
+ *  @author Bernd RInn
+ */
+public enum LogLevel
+{
+    UNDEFINED, OFF, TRACE, DEBUG, INFO, WARN, ERROR
+}
\ No newline at end of file
diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/DirectoryScanningTimerTask.java b/common/source/java/ch/systemsx/cisd/common/utilities/DirectoryScanningTimerTask.java
index 214dc8a2f4695fee4ec9489a8c3acd8d3f7c3e2b..c58fa5b39896c32dc3bb19184a187a4f54fe01d1 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/DirectoryScanningTimerTask.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/DirectoryScanningTimerTask.java
@@ -27,6 +27,7 @@ import org.apache.log4j.Logger;
 import ch.systemsx.cisd.common.logging.ISimpleLogger;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.logging.LogLevel;
 
 /**
  * A {@link TimerTask} that scans a source directory for entries that are accepted by some {@link FileFilter} and
@@ -304,7 +305,7 @@ public final class DirectoryScanningTimerTask extends TimerTask
     {
         return new ISimpleLogger()
             {
-                public void log(ISimpleLogger.Level dummyLevel, String message)
+                public void log(LogLevel dummyLevel, String message)
                 {
                     if (category == LogCategory.NOTIFY)
                     {
diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
index 42e1298841edfb91de7c622251379079a8780035..af65a6fe58d0fa4c2cd99dbc064b34b12d8264d9 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java
@@ -46,6 +46,7 @@ import org.apache.commons.lang.StringUtils;
 import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.logging.ISimpleLogger;
+import ch.systemsx.cisd.common.logging.LogLevel;
 
 /**
  * Some useful utility methods for files and directories.
@@ -398,7 +399,7 @@ public final class FileUtilities
                 {
                     if (loggerOrNull != null)
                     {
-                        loggerOrNull.log(ISimpleLogger.Level.INFO, String.format("Deleting file '%s'", file.getPath()));
+                        loggerOrNull.log(LogLevel.INFO, String.format("Deleting file '%s'", file.getPath()));
                     }
                     file.delete();
                 }
@@ -406,7 +407,7 @@ public final class FileUtilities
         }
         if (loggerOrNull != null)
         {
-            loggerOrNull.log(ISimpleLogger.Level.INFO, String.format("Deleting directory '%s'", path.getPath()));
+            loggerOrNull.log(LogLevel.INFO, String.format("Deleting directory '%s'", path.getPath()));
         }
         return path.delete();
     }
@@ -780,18 +781,18 @@ public final class FileUtilities
         {
             if (directory.isFile())
             {
-                logger.log(ISimpleLogger.Level.ERROR, String.format(
+                logger.log(LogLevel.ERROR, String.format(
                         "Failed to get listing of directory '%s' (path is file instead of directory).", directory));
             } else
             {
-                logger.log(ISimpleLogger.Level.ERROR, String.format(
+                logger.log(LogLevel.ERROR, String.format(
                         "Failed to get listing of directory '%s' (path not found).", directory));
             }
         } else
         {
             StringWriter exStackWriter = new StringWriter();
             exOrNull.printStackTrace(new PrintWriter(exStackWriter));
-            logger.log(ISimpleLogger.Level.ERROR, String.format(
+            logger.log(LogLevel.ERROR, String.format(
                     "Failed to get listing of directory '%s'. Exception: %s", directory, exStackWriter.toString()));
         }
     }