diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
index 5b6962d..7c080c4 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
@@ -22,9 +22,11 @@ import static com.google.common.collect.Iterables.transform;
 
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
+import java.util.Map;
 import java.util.NavigableMap;
 import java.util.Set;
 import java.util.SortedSet;
+import java.util.TreeMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 
 import javax.annotation.CheckForNull;
@@ -33,7 +35,6 @@ import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
 /**
@@ -277,6 +278,8 @@ class Branch {
         abstract boolean isModified(String path);
 
         abstract Iterable<String> getModifiedPaths();
+
+        abstract boolean isLeafCommit();
     }
 
     /**
@@ -307,6 +310,11 @@ class Branch {
             return modifications;
         }
 
+        @Override
+        boolean isLeafCommit() {
+            return true;
+        }
+
         //------------------< LastRevTracker >----------------------------------
 
         @Override
@@ -327,7 +335,7 @@ class Branch {
         RebaseCommit(Revision base, Revision commit,
                      NavigableMap<Revision, BranchCommit> previous) {
             super(base, commit);
-            this.previous = Maps.newTreeMap(previous);
+            this.previous = squash(previous);
         }
 
         @Override
@@ -348,6 +356,11 @@ class Branch {
         }
 
         @Override
+        boolean isLeafCommit() {
+            return false;
+        }
+
+        @Override
         Iterable<String> getModifiedPaths() {
             Iterable<Iterable<String>> paths = transform(previous.values(),
                     new Function<BranchCommit, Iterable<String>>() {
@@ -359,6 +372,16 @@ class Branch {
             return Iterables.concat(paths);
         }
 
+        private static NavigableMap<Revision, BranchCommit> squash(NavigableMap<Revision, BranchCommit> previous) {
+            NavigableMap<Revision, BranchCommit> result = new TreeMap<Revision, BranchCommit>(previous.comparator());
+            for (Map.Entry<Revision, BranchCommit> e : previous.entrySet()){
+                if (e.getValue().isLeafCommit()){
+                    result.put(e.getKey(), e.getValue());
+                }
+            }
+            return result;
+        }
+
         //------------------< LastRevTracker >----------------------------------
 
         @Override
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 78acb48..6ba0f3e 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
@@ -1076,7 +1076,6 @@ public class DocumentNodeStoreTest {
         store.dispose();
     }
 
-    @Ignore("OAK-2513")
     @Test
     public void slowRebase() throws Exception {
         final int NUM_NODES = DocumentRootBuilder.UPDATE_LIMIT / 2;
