Index: 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 (revision 1781247) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (working copy) @@ -52,6 +52,7 @@ import org.apache.jackrabbit.oak.commons.json.JsopTokenizer; import org.apache.jackrabbit.oak.commons.json.JsopWriter; import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore; +import org.apache.jackrabbit.oak.plugins.document.util.MergeSortedIterators; import org.apache.jackrabbit.oak.plugins.document.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1643,8 +1644,28 @@ } }; } else { - changes = mergeSorted(transform(copyOf(ranges), rangeToChanges), - ValueComparator.REVERSE); + changes = new Iterable>() { + private Iterable>> changesPerRange + = transform(copyOf(ranges), rangeToChanges); + @Override + public Iterator> iterator() { + final Iterator>> it + = checkNotNull(changesPerRange.iterator()); + return new MergeSortedIterators>(ValueComparator.REVERSE) { + @Override + public Iterator> nextIterator() { + while (it.hasNext()) { + Iterator> next = it.next().iterator(); + // check if this even has elements + if (next.hasNext()) { + return next; + } + } + return null; + } + }; + } + }; } return filter(changes, new Predicate>() { @Override