Index: src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 4396)
+++ src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(working copy)
@@ -273,8 +273,15 @@
     private boolean giveUserFeedback(MouseEvent e, int modifiers) {
         boolean needsRepaint = false;
 
+        // the target highlight will always be wrong, regardless if already selected values
+        // are preferred or not. The reason for this is that in when moving primitives they
+        // need to, otherwise it's hard to move the selection (#6334). However, when in select
+        // mode this makes it hard to select primitives close to each other (#6764). Deciding
+        // if a move or selection occurs can only be done after the mouse button has been
+        // released so it's impossible to always get the highlighting right. It's currently set
+        // to highlight the other primitive, but use the selected on move.
         Collection<OsmPrimitive> c = MapView.asColl(
-                mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, true));
+                mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, false));
 
         updateKeyModifiers(modifiers);
         determineMapMode(!c.isEmpty());
@@ -664,8 +671,15 @@
         mouseDownTime = System.currentTimeMillis();
         lastMousePos = e.getPoint();
 
+        // this is used for most actions but may be overwritten on mouse release in order
+        // to cycle through close primitives. Note that already selected primitives need
+        // to be preferred, otherwise it gets hard to move the selection (see #6334).
+        // Compare to the large comment in giveUserFeedback if you change this.
         Collection<OsmPrimitive> c = MapView.asColl(
                 mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, true));
+        System.out.println("--");
+        System.out.println(mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, false));
+        System.out.println(mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, true));
 
         determineMapMode(!c.isEmpty());
         switch(mode) {
@@ -684,8 +698,7 @@
             if (!cancelDrawMode && c.iterator().next() instanceof Way) {
                 setupVirtual(e);
             }
-
-            selectPrims(cycleSetup(c, e), e, false, false);
+            selectPrims(c, e, false, false);
             break;
         case select:
         default:
@@ -722,8 +735,15 @@
                 virtualNode = null;
 
                 // do nothing if the click was to short too be recognized as a drag,
-                // but the release position is farther than 10px away from the press position
+                // but the release position is farther than 10px away from the press position.
+                // if it's within that radius, so some selection magic:
                 if (lastMousePos == null || lastMousePos.distanceSq(e.getPoint()) < 100) {
+                    // do NOT prefer already selected primitives here. Otherwise it gets very hard to
+                    // select primitives that are close to each other (see #6764). Compare to the large
+                    // comment in giveUserFeedback if you change this.
+                    Collection<OsmPrimitive> single = MapView.asColl(
+                            mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, false));
+                    cycleSetup(single, e);
                     selectPrims(cyclePrims(cycleList, e), e, true, false);
 
                     // If the user double-clicked a node, change to draw mode
