Index: trunk/src/org/openstreetmap/josm/actions/PasteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PasteAction.java	(revision 810)
+++ trunk/src/org/openstreetmap/josm/actions/PasteAction.java	(revision 811)
@@ -12,4 +12,7 @@
 import java.util.LinkedList;
 import java.util.List;
+
+import java.awt.event.MouseMotionListener;
+import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
@@ -38,5 +41,4 @@
 
 		/* Find the middle of the pasteBuffer area */ 
-		EastNorth centre = Main.map.mapView.getCenter();
 		double maxEast = -1E100, minEast = 1E100, maxNorth = -1E100, minNorth = 1E100;
 		for (Node n : pasteBuffer.nodes) {
@@ -48,6 +50,14 @@
 			if (north < minNorth) { minNorth = north; } 
 		}
-		double offsetEast = centre.east() - (maxEast + minEast)/2.0;
-		double offsetNorth = centre.north() - (maxNorth + minNorth)/2.0; 
+
+		EastNorth mPosition;
+		if((e.getModifiers() & ActionEvent.CTRL_MASK) ==0){
+			mPosition = Main.map.mapView.getCenter();
+		} else {
+			mPosition = Main.map.mapView.getEastNorth(Main.map.mapView.lastMEvent.getX(), Main.map.mapView.lastMEvent.getY());
+		};
+
+		double offsetEast  = mPosition.east() - (maxEast + minEast)/2.0;
+		double offsetNorth = mPosition.north() - (maxNorth + minNorth)/2.0;
 		
 		HashMap<OsmPrimitive,OsmPrimitive> map = new HashMap<OsmPrimitive,OsmPrimitive>(); 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 810)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 811)
@@ -10,4 +10,6 @@
 import java.awt.Point;
 import java.awt.Transparency;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
@@ -84,4 +86,9 @@
 	private Layer activeLayer;
 	
+	/**
+	 * The last event performed by mouse.
+	 */
+	public MouseEvent lastMEvent;
+
 	private LinkedList<MapViewPaintable> temporaryLayers = new LinkedList<MapViewPaintable>();
 	
@@ -127,4 +134,14 @@
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				repaint();
+			}
+		});
+
+		//store the last mouse action
+		this.addMouseMotionListener(new MouseMotionListener() {
+			public void mouseDragged(MouseEvent e) {
+				mouseMoved(e);
+			}
+			public void mouseMoved(MouseEvent e) {
+				lastMEvent = e;
 			}
 		});
