diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
index f939a99..7a6a75d 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
@@ -26,6 +26,7 @@ import javax.sql.DataSource;
 
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.RemovalListener;
 import com.google.common.cache.Weigher;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.mongodb.DB;
@@ -789,6 +790,11 @@ public class DocumentMK implements MicroKernel {
         }
 
         public <K extends CacheValue, V extends CacheValue> Cache<K, V> buildCache(long maxWeight) {
+            return buildCache(maxWeight, null);
+        }
+
+        public <K extends CacheValue, V extends CacheValue> Cache<K, V> buildCache(long maxWeight,
+                                                                                   RemovalListener removalListener ) {
             if (LIRS_CACHE) {
                 return CacheLIRS.newBuilder().
                         weigher(weigher).
@@ -797,12 +803,17 @@ public class DocumentMK implements MicroKernel {
                         recordStats().
                         build();
             }
-            return CacheBuilder.newBuilder().
+            CacheBuilder builder = CacheBuilder.newBuilder().
                     concurrencyLevel(CACHE_CONCURRENCY).
                     weigher(weigher).
                     maximumWeight(maxWeight).
-                    recordStats().
-                    build();
+                    recordStats();
+
+            if(removalListener != null){
+                builder.removalListener(removalListener);
+            }
+
+            return builder.build();
         }
     }
 
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
index fca7123..79273e0 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
@@ -81,17 +81,20 @@ class DocumentNodeState extends AbstractNodeState implements CacheValue {
 
     private final DocumentNodeStore store;
 
+    private final boolean seenFromFuture;
+
     DocumentNodeState(@Nonnull DocumentNodeStore store, @Nonnull String path,
                       @Nonnull Revision rev) {
-        this(store, path, rev, false);
+        this(store, path, rev, false, false);
     }
 
     DocumentNodeState(@Nonnull DocumentNodeStore store, @Nonnull String path,
-                      @Nonnull Revision rev, boolean hasChildren) {
+                      @Nonnull Revision rev, boolean hasChildren, boolean seenFromFuture) {
         this.store = checkNotNull(store);
         this.path = checkNotNull(path);
         this.rev = checkNotNull(rev);
         this.hasChildren = hasChildren;
+        this.seenFromFuture = seenFromFuture;
     }
 
     Revision getRevision() {
@@ -373,6 +376,10 @@ class DocumentNodeState extends AbstractNodeState implements CacheValue {
         return size;
     }
 
+    boolean isSeenFromFuture() {
+        return seenFromFuture;
+    }
+
     //------------------------------< internal >--------------------------------
 
     /**
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 1ae79d4..7cf5b40 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
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugins.document;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.jackrabbit.oak.api.CommitFailedException.MERGE;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
 import static org.apache.jackrabbit.oak.plugins.document.DocumentMK.FAST_DIFF;
 import static org.apache.jackrabbit.oak.plugins.document.DocumentMK.MANY_CHILDREN_THRESHOLD;
@@ -51,6 +52,8 @@ import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
 import com.google.common.cache.Cache;
+import com.google.common.cache.RemovalListener;
+import com.google.common.cache.RemovalNotification;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -355,14 +358,28 @@ public final class DocumentNodeStore
 
         //TODO Make stats collection configurable as it add slight overhead
 
-        nodeCache = builder.buildCache(builder.getNodeCacheSize());
-        nodeCacheStats = new CacheStats(nodeCache, "Document-NodeState",
-                builder.getWeigher(), builder.getNodeCacheSize());
-
         nodeChildrenCache = builder.buildCache(builder.getChildrenCacheSize());
         nodeChildrenCacheStats = new CacheStats(nodeChildrenCache, "Document-NodeChildren",
                 builder.getWeigher(), builder.getChildrenCacheSize());
 
+        nodeCache = builder.buildCache(builder.getNodeCacheSize(),
+                new RemovalListener<CacheValue, DocumentNodeState>() {
+            @Override
+            public void onRemoval(RemovalNotification<CacheValue, DocumentNodeState> notification) {
+                DocumentNodeState nodeState = notification.getValue();
+                PathRev pathRev = (PathRev) notification.getKey();
+                if(nodeState != null && pathRev != null && nodeState.isSeenFromFuture()) {
+                    nodeChildrenCache.invalidate(
+                            new PathRev(getParentPath(pathRev.getPath()),
+                            pathRev.getRevision())
+                    );
+                }
+            }
+        });
+
+        nodeCacheStats = new CacheStats(nodeCache, "Document-NodeState",
+                builder.getWeigher(), builder.getNodeCacheSize());
+
         docChildrenCache = builder.buildCache(builder.getDocChildrenCacheSize());
         docChildrenCacheStats = new CacheStats(docChildrenCache, "Document-DocChildren",
                 builder.getWeigher(), builder.getDocChildrenCacheSize());
@@ -1639,7 +1656,7 @@ public final class DocumentNodeStore
             if (PathUtils.denotesRoot(p)) {
                 continue;
             }
-            String parent = PathUtils.getParentPath(p);
+            String parent = getParentPath(p);
             if (path.equals(parent)) {
                 paths.add(p);
             }
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
index 5076502..857efaf 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
@@ -750,7 +750,8 @@ public final class NodeDocument extends Document implements CachedNodeDocument{
             return null;
         }
         String path = getPath();
-        DocumentNodeState n = new DocumentNodeState(nodeStore, path, readRevision, hasChildren());
+        boolean seenFromFuture = min.compareRevisionTime(readRevision) > 0;
+        DocumentNodeState n = new DocumentNodeState(nodeStore, path, readRevision, hasChildren(), seenFromFuture);
         Revision lastRevision = min;
         for (String key : keySet()) {
             if (!Utils.isPropertyName(key)) {
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PathRev.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PathRev.java
index fe2c756..d0c59c4 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PathRev.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/PathRev.java
@@ -46,6 +46,14 @@ public final class PathRev implements CacheValue {
                 + 32;                       // revision
     }
 
+    public String getPath() {
+        return path;
+    }
+
+    public Revision getRevision() {
+        return revision;
+    }
+
     //----------------------------< Object >------------------------------------
 
 
