Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 16967)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 16968)
@@ -18,5 +18,4 @@
 import java.util.LinkedList;
 import java.util.Optional;
-import java.util.Set;
 
 import javax.swing.JOptionPane;
@@ -30,4 +29,5 @@
 import org.openstreetmap.josm.command.ScaleCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -827,17 +827,21 @@
             showConfirmMoveDialog(ed);
         }
-        Set<Node> nodes = new HashSet<>();
+        final int moveCount = UndoRedoHandler.getInstance().getLastCommand().getParticipatingPrimitives().size();
+        if (UndoRedoHandler.getInstance().getLastCommand() instanceof MoveCommand) {
+            final double moveDistance = ((MoveCommand) UndoRedoHandler.getInstance().getLastCommand()).getDistance(n -> !n.isNew());
+            if (Double.isFinite(moveDistance) && moveDistance > Config.getPref().getInt("warn.move.maxdistance", 200)) {
+                final ConfirmMoveDialog ed = new ConfirmMoveDialog();
+                ed.setContent(trn(
+                        "You moved {0} element by a distance of {1}. "
+                                + "Moving elements by a large distance is often an error.\n" + "Really move them?",
+                        "You moved {0} elements by a distance of {1}. "
+                                + "Moving elements by a large distance is often an error.\n" + "Really move them?",
+                        moveCount, moveCount, SystemOfMeasurement.getSystemOfMeasurement().getDistText(moveDistance)));
+                ed.toggleEnable("movedLargeDistance");
+                showConfirmMoveDialog(ed);
+            }
+        }
         int max = Config.getPref().getInt("warn.move.maxelements", 20);
-        for (OsmPrimitive osm : getLayerManager().getEditDataSet().getSelected()) {
-            if (osm instanceof Way) {
-                nodes.addAll(((Way) osm).getNodes());
-            } else if (osm instanceof Node) {
-                nodes.add((Node) osm);
-            }
-            if (nodes.size() > max) {
-                break;
-            }
-        }
-        if (nodes.size() > max) {
+        if (moveCount > max) {
             final ConfirmMoveDialog ed = new ConfirmMoveDialog();
             ed.setContent(
Index: /trunk/src/org/openstreetmap/josm/command/MoveCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/MoveCommand.java	(revision 16967)
+++ /trunk/src/org/openstreetmap/josm/command/MoveCommand.java	(revision 16968)
@@ -11,4 +11,5 @@
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.function.Predicate;
 
 import javax.swing.Icon;
@@ -300,9 +301,26 @@
 
     /**
-     * Gets the offset.
-     * @return The current offset.
+     * Gets the current move offset.
+     * @return The current move offset.
      */
     protected EastNorth getOffset() {
         return new EastNorth(x, y);
+    }
+
+    /**
+     * Computes the move distance for one node matching the specified predicate
+     * @param predicate predicate to match
+     * @return distance in metres
+     */
+    public double getDistance(Predicate<Node> predicate) {
+        return nodes.stream()
+                .filter(predicate)
+                .filter(node -> node.getCoor() != null && node.getEastNorth() != null)
+                .findFirst()
+                .map(node -> {
+                    final Node old = new Node(node);
+                    old.setEastNorth(old.getEastNorth().add(-x, -y));
+                    return node.getCoor().greatCircleDistance(old.getCoor());
+                }).orElse(Double.NaN);
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/command/MoveCommandTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/command/MoveCommandTest.java	(revision 16967)
+++ /trunk/test/unit/org/openstreetmap/josm/command/MoveCommandTest.java	(revision 16968)
@@ -77,4 +77,5 @@
         assertEquals("east", 1, moveCommand.getOffset().east(), 0.0001);
         assertEquals("north", 2, moveCommand.getOffset().north(), 0.0001);
+        assertEquals("distance", 2.236068, moveCommand.getDistance(n -> true), 0.0001);
     }
 
@@ -89,4 +90,5 @@
         assertEquals("east", 4, testData.existingNode.getEastNorth().east(), 0.0001);
         assertEquals("north", 9, testData.existingNode.getEastNorth().north(), 0.0001);
+        assertEquals("distance", 2.236068, command.getDistance(n -> true), 0.0001);
     }
 
