Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RemoveVersionTest.java
===================================================================
--- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RemoveVersionTest.java	(revision 1469818)
+++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/RemoveVersionTest.java	(working copy)
@@ -20,8 +20,10 @@
 import java.util.List;
 
 import javax.jcr.Node;
+import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.Value;
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionHistory;
 import javax.jcr.version.VersionIterator;
@@ -163,4 +165,80 @@
             // ok
         }
     }
+
+	/**
+	 * Creates version graph with merge point for two branches. Delete two
+	 * intermediate branches and check if the predecessors and successors do not
+	 * have duplicates.
+	 * 
+	 * Tests error reported in https://issues.apache.org/jira/browse/JCR-3579
+	 * @see <a href="https://issues.apache.org/jira/browse/JCR-3579">JCR-3579</a>
+	 * 
+	 * @throws Exception
+	 *             if an error occurs
+	 */
+    public void testRemoveVersionDuplicatePredecessorsAndSuccessors() throws Exception {
+    	Session superuserW2 = getHelper().getSuperuserSession(workspaceName);
+        VersionManager mgr = superuser.getWorkspace().getVersionManager();
+        VersionManager mgrW2 = superuserW2.getWorkspace().getVersionManager();
+        
+        // create a versionable node in W1
+        Node n = testRootNode.addNode(nodeName1);
+        n.addMixin(mixVersionable);
+        superuser.save();
+        String path = n.getPath();
+        
+        // create version 1.0
+        mgr.checkpoint(path);
+        
+        // clone node to W2
+        superuserW2.getWorkspace().clone(superuser.getWorkspace().getName(), path, path, true);
+        assertTrue(superuserW2.nodeExists(path));
+        mgrW2.checkout(path);
+        
+		// create version 1.0.0
+        mgr.checkpoint(path);
+        
+        // create version 1.0.0
+        mgrW2.checkin(path);
+        mgrW2.checkout(path);
+        mgrW2.merge(path, superuser.getWorkspace().getName(), true);
+        
+        // get mergeFailed property
+        Property mergeFailedProperty = superuserW2.getNode(path).getProperty(jcrMergeFailed);
+        Value[] mergeFailedReferences = mergeFailedProperty.getValues();
+        
+        // perform doneMerge to version 1.1
+        for (int i = 0; i < mergeFailedReferences.length; i++) {
+            mgrW2.doneMerge(path, (Version) superuser.getNodeByIdentifier(mergeFailedReferences[i].getString()));
+        }
+
+        // create version 1.2
+        mgr.checkin(path);
+        // create version 1.1.0
+        mgrW2.checkin(path);
+        
+        // now we have a graph where two branches are merged (1.1 -> 1.1.0)
+        //           ->  1.1   ->  1.2
+        //          |      |
+        // root -> 1.0     |________
+        //          |               |
+        //           ->  1.0.0 -> 1.1.0
+        
+        
+        VersionHistory vh = mgr.getVersionHistory(path);
+        // remove versions 1.1 and 1.0.0
+        vh.removeVersion("1.1");
+        vh.removeVersion("1.0.0");
+        
+        // after the removal we have the following graph:
+        //           ->  1.2
+        //          |
+        // root -> 1.0     
+        //          |
+        //           ->  1.1.0
+
+        assertEquals("Version 1.0 should have 2 successors", 2, vh.getVersion("1.0").getSuccessors().length);
+        assertEquals("Version 1.1.0 should have 1 predecessor", 1, vh.getVersion("1.1.0").getPredecessors().length);
+   }
 }
\ No newline at end of file
