Index: trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 525)
+++ trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 526)
@@ -26,5 +26,5 @@
 
 	public JosmAction(String name, String iconName, String tooltip, int shortCut, int modifier, boolean register) {
-		super(name, ImageProvider.get(iconName));
+		super(name, iconName == null ? null : ImageProvider.get(iconName));
 		setHelpId();
 		String scl = ShortCutLabel.name(shortCut, modifier);
Index: trunk/src/org/openstreetmap/josm/actions/MoveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 526)
+++ trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 526)
@@ -0,0 +1,89 @@
+//License: GPL. Copyright 2007 by Immanuel Scholz and others
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.MoveCommand;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
+
+/**
+ * Moves the selection
+ * 
+ * @author Frederik Ramm
+ */
+public class MoveAction extends JosmAction {
+
+	public enum Direction { UP, LEFT, RIGHT, DOWN };
+	private Direction myDirection;
+	
+	public MoveAction(Direction dir) {
+		super(tr("Move"), null, tr("Moves Objects"), 
+		(dir == Direction.UP) ? KeyEvent.VK_UP : 
+		(dir == Direction.DOWN) ? KeyEvent.VK_DOWN :
+		(dir == Direction.LEFT) ? KeyEvent.VK_LEFT :
+		KeyEvent.VK_RIGHT, 0, true);
+		myDirection = dir;
+	}
+
+	public void actionPerformed(ActionEvent event) {
+		
+		// find out how many "real" units the objects have to be moved in order to
+		// achive an 1-pixel movement
+		
+		EastNorth en1 = Main.map.mapView.getEastNorth(100, 100);
+		EastNorth en2 = Main.map.mapView.getEastNorth(101, 101);
+		
+		double distx = en2.east() - en1.east();
+		double disty = en2.north() - en1.north();
+		
+		switch (myDirection) {
+		case UP: 
+			distx = 0;
+			disty = -disty;
+			break;
+		case DOWN:
+			distx = 0;
+			break;
+		case LEFT:
+			disty = 0;
+			distx = -distx;
+		default:
+			disty = 0;
+		}
+		
+		Collection<OsmPrimitive> selection = Main.ds.getSelected();
+		Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
+		
+		Command c = !Main.main.undoRedo.commands.isEmpty()
+		? Main.main.undoRedo.commands.getLast() : null;
+
+		if (c instanceof MoveCommand && affectedNodes.equals(((MoveCommand)c).objects))
+			((MoveCommand)c).moveAgain(distx, disty);
+		else
+			Main.main.undoRedo.add(
+					c = new MoveCommand(selection, distx, disty));
+
+		for (Node n : affectedNodes) {
+			if (n.coor.isOutSideWorld()) {
+				// Revert move
+				((MoveCommand) c).moveAgain(-distx, -disty);
+				JOptionPane.showMessageDialog(Main.parent,
+						tr("Cannot move objects outside of the world."));
+				return;
+			}
+		}
+
+		Main.map.mapView.repaint();
+	}
+}
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 525)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 526)
@@ -59,8 +59,14 @@
 	/**
 	 * The time which needs to pass between click and release before something
-	 * counts as a move
-	 */
-	private int initialMoveDelay = 100;
-
+	 * counts as a move, in milliseconds
+	 */
+	private int initialMoveDelay = 200;
+
+	/**
+	 * The screen distance which needs to be travelled before something
+	 * counts as a move, in pixels
+	 */
+	private int initialMoveThreshold = 15;
+	private boolean initialMoveThresholdExceeded = false;
 	/**
 	 * Create a new SelectAction
@@ -73,5 +79,7 @@
 		putValue("help", "Action/Move/Move");
 		selectionManager = new SelectionManager(this, false, mapFrame.mapView);		
-		try { initialMoveDelay = Integer.parseInt(Main.pref.get("edit.initial-move-delay","100")); } catch (NumberFormatException x) {};
+		try { initialMoveDelay = Integer.parseInt(Main.pref.get("edit.initial-move-delay","200")); } catch (NumberFormatException x) {};
+		try { initialMoveThreshold = Integer.parseInt(Main.pref.get("edit.initial-move-threshold","15")); } catch (NumberFormatException x) {};
+		
 	}
 
@@ -134,4 +142,13 @@
 		if (mousePos == null) {
 			mousePos = e.getPoint();
+			return;
+		}
+		
+		if (!initialMoveThresholdExceeded) {
+			int dxp = mousePos.x - e.getX();
+			int dyp = mousePos.y - e.getY();
+			int dp = (int) Math.sqrt(dxp*dxp+dyp*dyp);
+			if (dp < initialMoveThreshold) return;
+			initialMoveThresholdExceeded = true;
 		}
 		
@@ -201,4 +218,5 @@
 		mouseDownTime = System.currentTimeMillis();
 		didMove = false;
+		initialMoveThresholdExceeded = false;
 
 		Collection<OsmPrimitive> osmColl =
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 525)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 526)
@@ -10,8 +10,10 @@
 import javax.swing.BoxLayout;
 import javax.swing.ButtonGroup;
+import javax.swing.JButton;
 import javax.swing.JPanel;
 import javax.swing.JToolBar;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.MoveAction;
 import org.openstreetmap.josm.actions.mapmode.DeleteAction;
 import org.openstreetmap.josm.actions.mapmode.DrawAction;
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 525)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 526)
@@ -9,4 +9,5 @@
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.awt.event.KeyEvent;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -14,8 +15,11 @@
 import java.util.LinkedList;
 
+import javax.swing.JComponent;
 import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.actions.MoveAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
@@ -30,4 +34,6 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.ModifiedChangedListener;
+
+import com.sun.corba.se.impl.oa.poa.ActiveObjectMap.Key;
 
 /**
@@ -82,4 +88,14 @@
 
 				new MapMover(MapView.this, Main.contentPane);
+				Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, java.awt.event.InputEvent.SHIFT_MASK), "UP");
+				Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, java.awt.event.InputEvent.SHIFT_MASK), "DOWN");
+				Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, java.awt.event.InputEvent.SHIFT_MASK), "LEFT");
+				Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, java.awt.event.InputEvent.SHIFT_MASK), "RIGHT");
+
+				Main.contentPane.getActionMap().put("UP", new MoveAction(MoveAction.Direction.UP));
+				Main.contentPane.getActionMap().put("DOWN", new MoveAction(MoveAction.Direction.DOWN));
+				Main.contentPane.getActionMap().put("LEFT", new MoveAction(MoveAction.Direction.LEFT));
+				Main.contentPane.getActionMap().put("RIGHT", new MoveAction(MoveAction.Direction.RIGHT));
+				
 
 				MapSlider zoomSlider = new MapSlider(MapView.this);
