diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
index 0e15bc9..043f344 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
@@ -74,6 +74,7 @@ import org.apache.jackrabbit.oak.commons.json.JsopTokenizer;
 import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
 import org.apache.jackrabbit.oak.plugins.blob.MarkSweepGarbageCollector;
 import org.apache.jackrabbit.oak.plugins.document.Checkpoints.Info;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobReferenceIterator;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache;
@@ -1526,14 +1527,14 @@ public final class DocumentNodeStore
             long writeTime = clock.getTime() - time;
             time = clock.getTime();
             // pull in changes from other cluster nodes
-            backgroundRead(true);
+            BackgroundReadStats readStats = backgroundRead(true);
             long readTime = clock.getTime() - time;
-            String msg = "Background operations stats (clean:{}, split:{}, write:{}, read:{})";
+            String msg = "Background operations stats (clean:{}, split:{}, write:{}, read:{} {})";
             if (clock.getTime() - start > TimeUnit.SECONDS.toMillis(10)) {
                 // log as info if it took more than 10 seconds
-                LOG.info(msg, cleanTime, splitTime, writeTime, readTime);
+                LOG.info(msg, cleanTime, splitTime, writeTime, readTime, readStats);
             } else {
-                LOG.debug(msg, cleanTime, splitTime, writeTime, readTime);
+                LOG.debug(msg, cleanTime, splitTime, writeTime, readTime, readStats);
             }
         } catch (RuntimeException e) {
             if (isDisposed.get()) {
@@ -1587,11 +1588,13 @@ public final class DocumentNodeStore
      * @param dispatchChange whether to dispatch external changes
      *                       to {@link #dispatcher}.
      */
-    void backgroundRead(boolean dispatchChange) {
+    BackgroundReadStats backgroundRead(boolean dispatchChange) {
+        BackgroundReadStats stats = new BackgroundReadStats();
+        long time = clock.getTime();
         String id = Utils.getIdFromPath("/");
         NodeDocument doc = store.find(Collection.NODES, id, asyncDelay);
         if (doc == null) {
-            return;
+            return stats;
         }
         Map<Integer, Revision> lastRevMap = doc.getLastRev();
 
@@ -1624,9 +1627,14 @@ public final class DocumentNodeStore
             }
         }
 
+        stats.readHead = clock.getTime() - time;
+        time = clock.getTime();
+
         if (!externalChanges.isEmpty()) {
             // invalidate caches
-            store.invalidateCache();
+            stats.cacheStats = store.invalidateCache();
+            stats.cacheInvalidationTime = clock.getTime() - time;
+            time = clock.getTime();
             // TODO only invalidate affected items
             docChildrenCache.invalidateAll();
 
@@ -1649,8 +1657,36 @@ public final class DocumentNodeStore
             } finally {
                 backgroundOperationLock.writeLock().unlock();
             }
+            stats.dispatchChanges = clock.getTime() - time;
+            time = clock.getTime();
         }
         revisionComparator.purge(revisionPurgeMillis());
+        stats.purge = clock.getTime() - time;
+
+        return stats;
+    }
+
+    private static class BackgroundReadStats {
+        CacheInvalidationStats cacheStats;
+        long readHead;
+        long cacheInvalidationTime;
+        long dispatchChanges;
+        long purge;
+
+        @Override
+        public String toString() {
+            String cacheStatsMsg = "NOP";
+            if (cacheStats != null){
+                cacheStatsMsg = cacheStats.summaryReport();
+            }
+            return  "ReadStats{" +
+                    "cacheStats:" + cacheStatsMsg +
+                    ", head:" + readHead +
+                    ", cache:" + cacheInvalidationTime +
+                    ", dispatch:" + dispatchChanges +
+                    ", purge:" + purge +
+                    '}';
+        }
     }
 
     /**
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
index 99bb432..b026d93 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
@@ -23,6 +23,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.cache.CacheStats;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 
 /**
  * The interface for the backend storage for documents.
@@ -213,7 +214,7 @@ public interface DocumentStore {
     /**
      * Invalidate the document cache.
      */
-    void invalidateCache();
+    CacheInvalidationStats invalidateCache();
 
     /**
      * Invalidate the document cache for the given key.
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java
new file mode 100644
index 0000000..449209f
--- /dev/null
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheInvalidationStats.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.document.cache;
+
+public interface CacheInvalidationStats {
+
+    String summaryReport();
+}
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
index a8d6cec..9d28cee 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
 import com.google.common.base.Splitter;
 import com.mongodb.ReadPreference;
 import com.mongodb.WriteConcern;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 
 /**
  * Emulates a MongoDB store (possibly consisting of multiple shards and
@@ -298,8 +299,8 @@ public class MemoryDocumentStore implements DocumentStore {
     }
 
     @Override
-    public void invalidateCache() {
-        // there is no cache, so nothing to invalidate
+    public CacheInvalidationStats invalidateCache() {
+        return null;
     }
 
     @Override
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java
index 6b55abd..d4b6a56 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/CacheInvalidator.java
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.plugins.document.CachedNodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,7 +66,7 @@ abstract class CacheInvalidator {
         return new SimpleInvalidator(documentStore);
     }
 
-    static class InvalidationResult {
+    static class InvalidationResult implements CacheInvalidationStats{
         int invalidationCount;
         int upToDateCount;
         int cacheSize;
@@ -84,6 +85,11 @@ abstract class CacheInvalidator {
                     ", cacheEntriesProcessedCount=" + cacheEntriesProcessedCount +
                     '}';
         }
+
+        @Override
+        public String summaryReport() {
+            return toString();
+        }
     }
 
     private static class SimpleInvalidator extends CacheInvalidator {
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
index a3664eb..80079b2 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
@@ -58,6 +58,7 @@ import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
 import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.apache.jackrabbit.oak.plugins.document.cache.ForwardingListener;
 import org.apache.jackrabbit.oak.plugins.document.cache.NodeDocOffHeapCache;
 import org.apache.jackrabbit.oak.plugins.document.cache.OffHeapCache;
@@ -260,10 +261,10 @@ public class MongoDocumentStore implements DocumentStore {
     }
 
     @Override
-    public void invalidateCache() {
+    public CacheInvalidationStats invalidateCache() {
         //TODO Check if we should use LinearInvalidator for small cache sizes as
         //that would lead to lesser number of queries
-        CacheInvalidator.createHierarchicalInvalidator(this).invalidateCache();
+        return CacheInvalidator.createHierarchicalInvalidator(this).invalidateCache();
     }
 
     @Override
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
index b845394..1e57893 100755
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
@@ -64,6 +64,7 @@ import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
 import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
 import org.slf4j.Logger;
@@ -261,8 +262,9 @@ public class RDBDocumentStore implements DocumentStore {
     }
 
     @Override
-    public void invalidateCache() {
+    public CacheInvalidationStats invalidateCache() {
         nodesCache.invalidateAll();
+        return null;
     }
 
     @Override
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
index 0482bae..e7ea406 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -221,10 +222,10 @@ public class LoggingDocumentStoreWrapper implements DocumentStore {
     }
 
     @Override
-    public void invalidateCache() {
+    public CacheInvalidationStats invalidateCache() {
         try {
             logMethod("invalidateCache");
-            store.invalidateCache();
+            return store.invalidateCache();
         } catch (Exception e) {
             logException(e);
             throw convert(e);
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
index d5840e9..32a105d 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 
 /**
  * Implements a <code>DocumentStore</code> wrapper which synchronizes on all
@@ -98,8 +99,8 @@ public class SynchronizingDocumentStoreWrapper implements DocumentStore {
     }
 
     @Override
-    public synchronized void invalidateCache() {
-        store.invalidateCache();
+    public synchronized CacheInvalidationStats invalidateCache() {
+        return store.invalidateCache();
     }
 
     @Override
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
index bb57176..a6d40d9 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
@@ -34,6 +34,7 @@ import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 
 /**
  * A MicroKernel wrapper that can be used to log and also time MicroKernel
@@ -249,11 +250,12 @@ public class TimingDocumentStoreWrapper implements DocumentStore {
     }
 
     @Override
-    public void invalidateCache() {
+    public CacheInvalidationStats invalidateCache() {
         try {
             long start = now();
-            base.invalidateCache();
+            CacheInvalidationStats result = base.invalidateCache();
             updateAndLogTimes("invalidateCache", start, 0, 0);
+            return result;
         } catch (Exception e) {
             throw convert(e);
         }
diff --git oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
index 93c27ba..98f444e 100644
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
@@ -56,6 +56,7 @@ import com.google.common.collect.Sets;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.util.TimingDocumentStoreWrapper;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
@@ -89,10 +90,11 @@ public class DocumentNodeStoreTest {
         DocumentStore docStore = new MemoryDocumentStore();
         DocumentStore testStore = new TimingDocumentStoreWrapper(docStore) {
             @Override
-            public void invalidateCache() {
+            public CacheInvalidationStats invalidateCache() {
                 super.invalidateCache();
                 semaphore.acquireUninterruptibly();
                 semaphore.release();
+                return null;
             }
         };
         final DocumentNodeStore store1 = new DocumentMK.Builder().setAsyncDelay(0)
