Index: /trunk/src/org/openstreetmap/josm/data/APIDataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/APIDataSet.java	(revision 7119)
+++ /trunk/src/org/openstreetmap/josm/data/APIDataSet.java	(revision 7120)
@@ -76,6 +76,5 @@
             }
         }
-        OsmPrimitiveComparator c = new OsmPrimitiveComparator();
-        c.relationsFirst = true;
+        OsmPrimitiveComparator c = new OsmPrimitiveComparator(false, true);
         Collections.sort(toDelete, c);
         Collections.sort(toAdd, c);
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveComparator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveComparator.java	(revision 7119)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveComparator.java	(revision 7120)
@@ -8,14 +8,37 @@
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 
-/** Comparator, comparing by type and objects display names */
+/**
+ * Comparator, comparing pritimives by:<ul>
+ * <li>type and ids in "quick" mode</li>
+ * <li>type and objects display names instead</li>
+ * </ul>
+ * @since 4113
+ */
 public class OsmPrimitiveComparator implements Comparator<OsmPrimitive> {
-    private final Map<OsmPrimitive, String> cache= new HashMap<>();
-    private final DefaultNameFormatter df = DefaultNameFormatter.getInstance();
-    public boolean relationsFirst = false;
+    private final Map<OsmPrimitive, String> cache = new HashMap<>();
+    private final boolean relationsFirst;
+    private final boolean quick;
+
+    /**
+     * Constructs a new {@code OsmPrimitiveComparator}.
+     */
+    public OsmPrimitiveComparator() {
+        this(false, false);
+    }
+
+    /**
+     * Constructs a new {@code OsmPrimitiveComparator}.
+     * @param quick if {@code true}, sorts by type and ids (fast), otherwise sort by type and display names (slower)
+     * @param relationsFirst if {@code true}, always list relations first
+     */
+    public OsmPrimitiveComparator(boolean quick, boolean relationsFirst) {
+        this.quick = quick;
+        this.relationsFirst = relationsFirst;
+    }
 
     private String cachedName(OsmPrimitive p) {
         String name = cache.get(p);
         if (name == null) {
-            name = p.getDisplayName(df);
+            name = p.getDisplayName(DefaultNameFormatter.getInstance());
             cache.put(p, name);
         }
@@ -36,6 +59,14 @@
     }
 
+    private static int compareId(OsmPrimitive a, OsmPrimitive b) {
+        long idA = a.getUniqueId();
+        long idB = b.getUniqueId();
+        if (idA < idB) return -1;
+        if (idA > idB) return 1;
+        return 0;
+    }
+
     private int compareType(OsmPrimitive a, OsmPrimitive b) {
-        if(relationsFirst) {
+        if (relationsFirst) {
             // show relations before ways, then nodes
             if (a.getType().equals(OsmPrimitiveType.RELATION)) return -1;
@@ -58,5 +89,5 @@
     public int compare(OsmPrimitive a, OsmPrimitive b) {
         if (a.getType().equals(b.getType()))
-            return compareName(a, b);
+            return quick ? compareId(a, b) : compareName(a, b);
         return compareType(a, b);
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 7119)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 7120)
@@ -15,5 +15,4 @@
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -44,5 +43,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
@@ -585,9 +583,7 @@
          */
         public void sort() {
-            if (this.selection.size()>Main.pref.getInteger("selection.no_sort_above",100000)) return;
-            if (this.selection.size()>Main.pref.getInteger("selection.fast_sort_above",10000)) {
-                Collections.sort(this.selection, new OsmPrimitiveQuickComparator());
-            } else {
-                Collections.sort(this.selection, new OsmPrimitiveComparator());
+            if (this.selection.size() <= Main.pref.getInteger("selection.no_sort_above", 100000)) {
+                boolean quick = this.selection.size() > Main.pref.getInteger("selection.fast_sort_above", 10000);
+                Collections.sort(this.selection, new OsmPrimitiveComparator(quick, false));
             }
         }
@@ -778,33 +774,3 @@
         }
     }
-
-    /** Quicker comparator, comparing just by type and ID's */
-    private static class OsmPrimitiveQuickComparator implements Comparator<OsmPrimitive> {
-
-        private int compareId(OsmPrimitive a, OsmPrimitive b) {
-            long id_a=a.getUniqueId();
-            long id_b=b.getUniqueId();
-            if (id_a<id_b) return -1;
-            if (id_a>id_b) return 1;
-            return 0;
-        }
-
-        private int compareType(OsmPrimitive a, OsmPrimitive b) {
-            // show ways before relations, then nodes
-            if (a.getType().equals(OsmPrimitiveType.WAY)) return -1;
-            if (a.getType().equals(OsmPrimitiveType.NODE)) return 1;
-            // a is a relation
-            if (b.getType().equals(OsmPrimitiveType.WAY)) return 1;
-            // b is a node
-            return -1;
-        }
-
-        @Override
-        public int compare(OsmPrimitive a, OsmPrimitive b) {
-            if (a.getType().equals(b.getType()))
-                return compareId(a, b);
-            return compareType(a, b);
-        }
-    }
-
 }
