Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 18553)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 18554)
@@ -43,4 +43,6 @@
 import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
 import org.openstreetmap.josm.data.osm.visitor.paint.WireframeMapRenderer;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.preferences.CachingProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -132,4 +134,8 @@
     }
 
+    /** Whether nodes should be merged with other primitives by default when they are being dragged */
+    private static final CachingProperty<Boolean> MERGE_BY_DEFAULT
+            = new BooleanProperty("edit.move.merge-by-default", false).cached();
+
     private boolean lassoMode;
     private boolean repeatedKeySwitchLassoOption;
@@ -320,5 +326,5 @@
                 // only consider merge if ctrl is pressed and there are nodes in
                 // the selection that could be merged
-                if (!platformMenuShortcutKeyMask || getLayerManager().getEditDataSet().getSelectedNodes().isEmpty()) {
+                if (!isMergeRequested() || getLayerManager().getEditDataSet().getSelectedNodes().isEmpty()) {
                     c = "move";
                     break;
@@ -497,4 +503,6 @@
             return;
 
+        updateKeyModifiers(e);
+
         cancelDrawMode = true;
         if (mode == Mode.SELECT) {
@@ -520,5 +528,5 @@
             // If ctrl is pressed we are in merge mode. Look for a nearby node,
             // highlight it and adjust the cursor accordingly.
-            final boolean canMerge = platformMenuShortcutKeyMask && !getLayerManager().getEditDataSet().getSelectedNodes().isEmpty();
+            final boolean canMerge = isMergeRequested() && !getLayerManager().getEditDataSet().getSelectedNodes().isEmpty();
             final OsmPrimitive p = canMerge ? findNodeToMergeTo(e.getPoint()) : null;
             boolean needsRepaint = removeHighlighting();
@@ -892,5 +900,5 @@
             // if small number of elements were moved,
             updateKeyModifiers(e);
-            if (platformMenuShortcutKeyMask) mergePrims(e.getPoint());
+            if (isMergeRequested()) mergePrims(e.getPoint());
         }
     }
@@ -939,4 +947,12 @@
                 .flatMap(n -> n.referrers(Way.class))
                 .anyMatch(Way::isDisabledAndHidden);
+    }
+
+    /**
+     * Check if dragged node should be merged when moving it over another primitive
+     * @return true if merge is requested
+     */
+    private boolean isMergeRequested() {
+        return MERGE_BY_DEFAULT.get() ^ platformMenuShortcutKeyMask;
     }
 
