Index: oak-jcr/src/test/resources/logback-test.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/test/resources/logback-test.xml	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/test/resources/logback-test.xml	(revision )
@@ -25,12 +25,13 @@
     <appender name="file" class="ch.qos.logback.core.FileAppender">
         <file>target/unit-tests.log</file>
         <encoder>
-            <pattern>%date{HH:mm:ss.SSS} %-5level %-40([%thread] %F:%L) %msg%n</pattern>
+            <pattern>%date{HH:mm:ss.SSS} %-5level %-40([%thread] %F:%L) %marker %msg%n</pattern>
         </encoder>
     </appender>
 
     <logger name="org.apache.jackrabbit.test.api" level="DEBUG"/>
     <logger name="com.mongodb.tcp" level="ERROR"/>
+    <logger name="org.apache.jackrabbit.oak.jcr.operations" level="INFO"/>
 
     <root level="INFO">
         <!--
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java	(revision )
@@ -212,6 +212,11 @@
                 dlg.remove();
                 return null;
             }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Removing node [%s]",dlg.getPath());
+            }
         });
     }
 
@@ -282,8 +287,14 @@
                 }
                 return NodeImpl.createNode(added, sessionContext);
             }
-        });
+
+            @Override
+            public String description() {
+                return String.format("Adding node [%s]",oakPath);
-    }
+            }
+        }
+       );
+    }
 
     @Override
     public void orderBefore(final String srcChildRelPath, final String destChildRelPath) throws RepositoryException {
@@ -1291,7 +1302,7 @@
     }
 
     private Property internalSetProperty(
-            String jcrName, final Value value, final boolean exactTypeMatch)
+            final String jcrName, final Value value, final boolean exactTypeMatch)
             throws RepositoryException {
         final String oakName = getOakPathOrThrow(checkNotNull(jcrName));
         final PropertyState state = createSingleState(
@@ -1311,11 +1322,16 @@
                         dlg.setProperty(state, exactTypeMatch, false),
                         sessionContext);
             }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Setting property [%s/%s]",dlg.getPath(),jcrName);
+            }
         });
     }
 
     private Property internalSetProperty(
-            String jcrName, final Value[] values,
+            final String jcrName, final Value[] values,
             final int type, final boolean exactTypeMatch)
             throws RepositoryException {
         final String oakName = getOakPathOrThrow(checkNotNull(jcrName));
@@ -1336,6 +1352,11 @@
                         dlg.setProperty(state, exactTypeMatch, false),
                         sessionContext);
             }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Setting property [%s/%s]",dlg.getPath(),jcrName);
+            }
         });
     }
 
@@ -1371,7 +1392,14 @@
                 }
                 return new PropertyImpl(property, sessionContext);
             }
-        });
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Removing property [%s]",jcrName);
+            }
+        }
+
+        );
     }
 
     //-----------------------------------------------------< JackrabbitNode >---
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java	(revision )
@@ -59,7 +59,7 @@
         if (updateCount != sessionCount) {
             if (!exists()) {
                 throw new InvalidItemStateException(
-                        "This item does not exist anymore");
+                        "This item does not exist anymore : " + getPath());
             }
             updateCount = sessionCount;
         }
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java	(revision )
@@ -108,6 +108,11 @@
                 dlg.remove();
                 return null;
             }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Removing property [%s/%s] ",dlg.getPath(),dlg.getName());
+            }
         });
     }
 
@@ -446,6 +451,11 @@
                 dlg.setState(createSingleState(dlg.getName(), converted, type));
                 return null;
             }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Setting property [%s/%s]",dlg.getPath(),dlg.getName());
+            }
         });
     }
 
@@ -470,6 +480,11 @@
                 }
                 dlg.setState(createMultiState(dlg.getName(), converted, type));
                 return null;
+            }
+
+            @Override
+            public String description() throws RepositoryException {
+                return String.format("Setting property [%s/%s]",dlg.getPath(),dlg.getName());
             }
         });
     }
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java	(revision )
@@ -57,12 +57,15 @@
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
 
 /**
  * TODO document
  */
 public class SessionDelegate {
     static final Logger log = LoggerFactory.getLogger(SessionDelegate.class);
+    static final Logger operationLogger = LoggerFactory.getLogger("org.apache.jackrabbit.oak.jcr.operations");
 
     private final ContentSession contentSession;
     private final RefreshStrategy refreshStrategy;
@@ -128,6 +131,7 @@
         }
         try {
             sessionOpCount++;
+            logOperationDetails(sessionOperation);
             return sessionOperation.perform();
         } finally {
             sessionOpCount--;
@@ -423,6 +427,18 @@
     }
 
     //------------------------------------------------------------< internal >---
+
+    private <T> void logOperationDetails(SessionOperation<T> ops)  throws RepositoryException {
+        if(operationLogger.isDebugEnabled()){
+            Marker sessionMarker = MarkerFactory.getMarker(this.toString());
+            String desc = ops.description();
+
+            if(desc != null){
+                operationLogger.debug(sessionMarker,desc);
+            }
+        }
+    }
+
 
     /**
      * Wraps the given {@link CommitFailedException} instance using the
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java	(revision )
@@ -399,6 +399,11 @@
             public boolean isSave() {
                 return true;
             }
+
+            @Override
+            public String description() {
+                return "Session saved";
+            }
         });
     }
 
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/operation/SessionOperation.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/operation/SessionOperation.java	(revision c52145ab17785dd5aed6ed1b24421811d31d1d4d)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/operation/SessionOperation.java	(revision )
@@ -61,4 +61,8 @@
 
     public abstract T perform() throws RepositoryException;
 
+    public String description() throws RepositoryException{
+        return null;
+    }
+
 }
