Index: test/java/org/apache/ivy/plugins/latest/LatestRevisionStrategyTest.java
===================================================================
--- test/java/org/apache/ivy/plugins/latest/LatestRevisionStrategyTest.java	(revision 1399299)
+++ test/java/org/apache/ivy/plugins/latest/LatestRevisionStrategyTest.java	(working copy)
@@ -84,6 +84,34 @@
         Collections.sort(shuffled, latestRevisionStrategy.new ArtifactInfoComparator());
         assertEquals(Arrays.asList(revs), shuffled);
     }
+    
+    /**
+     * The sort algorithm in Java 7 changed in a way that requires comparators to be a little
+     * stricter.  Running java 7 with {@code java.util.Arrays.useLegacyMergeSort=true} reverts
+     * to the previous behavior.
+     * 
+     * @see <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124">RFE: 6804124</a>
+     * @see <a href="https://issues.apache.org/jira/browse/IVY-1354">IVY-1354</a>
+     */
+    public void testJava7Sort() {
+        ArtifactInfo[] revs = toMockAI(new String[]{"latest.integration", "latest.milestone" });
+            
+        LatestRevisionStrategy latestRevisionStrategy = new LatestRevisionStrategy();
+        List sorted = latestRevisionStrategy.sort( revs );
+        
+        List expected = new ArrayList();
+        expected.add(revs[1]);
+        expected.add(revs[0]);
+        
+        assertEquals( expected, sorted );:q
+        
+        // Close to the same test as above, but does go through a few more layers
+        
+        ArtifactInfo latest = latestRevisionStrategy.findLatest(revs, new Date());
+        assertNotNull(latest);
+        assertEquals("latest.integration", latest.getRevision());
+                
+    }
 
     private static class MockArtifactInfo implements ArtifactInfo {
 
Index: src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java
===================================================================
--- src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java	(revision 1399299)
+++ src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java	(working copy)
@@ -15,6 +15,7 @@
  *  limitations under the License.
  *
  */
+
 package org.apache.ivy.plugins.version;
 
 import java.util.Comparator;
@@ -26,12 +27,16 @@
 import org.apache.ivy.core.module.status.StatusManager;
 
 public class LatestVersionMatcher extends AbstractVersionMatcher {
+    
+    private static final String PREFIX = "latest";
+    private static final String PREFIX_DOT = PREFIX + ".";
+    
     public LatestVersionMatcher() {
-        super("latest");
+        super(PREFIX);
     }
 
     public boolean isDynamic(ModuleRevisionId askedMrid) {
-        return askedMrid.getRevision().startsWith("latest.");
+        return askedMrid.getRevision().startsWith(PREFIX_DOT);
     }
 
     public boolean accept(ModuleRevisionId askedMrid, ModuleRevisionId foundMrid) {
@@ -41,22 +46,43 @@
     public boolean needModuleDescriptor(ModuleRevisionId askedMrid, ModuleRevisionId foundMrid) {
         List statuses = StatusManager.getCurrent().getStatuses();
         Status lowest = (Status) statuses.get(statuses.size() - 1);
-        String latestLowest = "latest." + lowest.getName();
+        String latestLowest = PREFIX_DOT + lowest.getName();
         return !latestLowest.equals(askedMrid.getRevision());
     }
 
     public boolean accept(ModuleRevisionId askedMrid, ModuleDescriptor foundMD) {
-        String askedStatus = askedMrid.getRevision().substring("latest.".length());
+        String askedStatus = askedMrid.getRevision().substring(PREFIX_DOT.length());
         return StatusManager.getCurrent().getPriority(askedStatus) >= StatusManager.getCurrent()
                 .getPriority(foundMD.getStatus());
     }
-
+    
     /**
      * If we don't need a module descriptor we can consider the dynamic revision to be greater. If
      * we need a module descriptor then we can't know which one is greater and return 0.
      */
     public int compare(ModuleRevisionId askedMrid, ModuleRevisionId foundMrid,
-            Comparator staticComparator) {
+                       Comparator staticComparator) {
+        
+        if ( isDynamic(askedMrid) && isDynamic(foundMrid) ) {
+            // both are dynamic status (latest.something) so we can look them 
+            // up in the status map and use their priorities to compare them
+            String askedRevision = askedMrid.getRevision().substring(PREFIX_DOT.length());
+            String foundRevision = foundMrid.getRevision().substring(PREFIX_DOT.length());
+            
+            int askedPriority = StatusManager.getCurrent().getPriority(askedRevision);
+            int foundPriority = StatusManager.getCurrent().getPriority(foundRevision);
+            
+            if ( askedPriority < foundPriority ) {
+                return -1;                
+            }
+            else if ( askedPriority == foundPriority ) {
+                return 0;
+            }
+            
+            return 1;
+        }
+        
+        // One or the other is a fixed version number
         return needModuleDescriptor(askedMrid, foundMrid) ? 0 : 1;
     }
 }
