diff -u -r -N orig/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
--- orig/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	2009-01-18 23:34:45.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	2009-01-19 23:01:43.250000000 +0100
@@ -23,6 +23,8 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
+
 /**
  * Bounding box selector.
  *
@@ -40,12 +42,10 @@
             new JTextField(11) };
     final JTextArea osmUrl = new JTextArea();
     final JTextArea showUrl = new JTextArea();
-    String noteUrl = tr("You can paste an URL here to download the area.");
 
     public void addGui(final DownloadDialog gui) {
 
         JPanel dlg = new JPanel(new GridBagLayout());
-        osmUrl.setText(noteUrl);
 
         final FocusListener dialogUpdater = new FocusAdapter() {
             @Override public void focusLost(FocusEvent e) {
@@ -79,7 +79,7 @@
             public void insertUpdate(DocumentEvent e) { dowork(); }
             public void removeUpdate(DocumentEvent e) { dowork(); }
             private void dowork() {
-                Bounds b = osmurl2bounds(osmUrl.getText());
+                Bounds b = OsmUrlToBounds.parse(osmUrl.getText());
                 if (b != null) {
                     gui.minlon = b.min.lon();
                     gui.minlat = b.min.lat();
@@ -118,7 +118,7 @@
         dlg.add(new JLabel(tr("max lon")), GBC.std().insets(10,0,5,0));
         dlg.add(latlon[3], GBC.eol());
 
-        dlg.add(new JLabel(tr("URL from www.openstreetmap.org")), GBC.eol().insets(10,20,5,0));
+        dlg.add(new JLabel(tr("URL from www.openstreetmap.org (you can paste an URL here to download the area)")), GBC.eol().insets(10,20,5,0));
         dlg.add(osmUrl, GBC.eop().insets(10,0,5,0).fill());
         dlg.add(showUrl, GBC.eop().insets(10,0,5,5));
         showUrl.setEditable(false);
@@ -172,43 +172,4 @@
         lon /= decimals;
         showUrl.setText("http://www.openstreetmap.org/?lat="+lat+"&lon="+lon+"&zoom="+zoom);
     }
-
-    public static Bounds osmurl2bounds(String url) {
-        int i = url.indexOf('?');
-        if (i == -1)
-            return null;
-        String[] args = url.substring(i+1).split("&");
-        HashMap<String, String> map = new HashMap<String, String>();
-        for (String arg : args) {
-            int eq = arg.indexOf('=');
-            if (eq != -1) {
-                map.put(arg.substring(0, eq), arg.substring(eq + 1));
-            }
-        }
-
-        Bounds b = null;
-        try {
-            if (map.containsKey("bbox")) {
-                String bbox[] = map.get("bbox").split(",");
-                b = new Bounds(
-                    new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])),
-                    new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2])));
-
-            } else {
-                double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom")));
-                b = new Bounds(
-                    new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size),
-                    new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size));
-            }
-        } catch (NumberFormatException x) {
-        } catch (NullPointerException x) {
-        }
-        return b;
-    }
-
-    private static double parseDouble(HashMap<String, String> map, String key) {
-        if (map.containsKey(key))
-            return Double.parseDouble(map.get(key));
-        return Double.parseDouble(map.get("m"+key));
-    }
 }
diff -u -r -N orig/src/org/openstreetmap/josm/gui/download/DownloadDialog.java trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
--- orig/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	2009-01-19 22:59:25.859375000 +0100
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	2009-01-19 23:05:16.859375000 +0100
@@ -4,24 +4,34 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Color;
+import java.awt.datatransfer.DataFlavor; 
+import java.awt.datatransfer.Transferable; 
+import java.awt.event.ActionEvent; 
+import java.awt.event.InputEvent; 
+import java.awt.event.KeyEvent; 
 import java.awt.Font;
 import java.awt.GridBagLayout;
+import java.awt.Toolkit;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.swing.AbstractAction;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
+import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.DownloadAction;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.plugins.PluginProxy;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
 
 /**
  * Main download dialog.
@@ -145,7 +155,40 @@
         Font labelFont = sizeCheck.getFont();
         sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()));
         add(sizeCheck, GBC.eop().insets(0,5,5,10));
-    }
+        
+        getInputMap(WHEN_IN_FOCUSED_WINDOW).put( 
+        KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "checkClipboardContents"); 
+       
+        getActionMap().put("checkClipboardContents", new AbstractAction() { 
+            public void actionPerformed(ActionEvent e) { 
+                checkClipboardContents(); 
+            } 
+        }); 
+    }
+    
+    private void checkClipboardContents() { 
+        String result = ""; 
+        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 
+ 
+        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor)) 
+            return; 
+         
+        try { 
+            result = (String)contents.getTransferData(DataFlavor.stringFlavor); 
+        } 
+        catch(Exception ex) { 
+            return; 
+        } 
+         
+        Bounds b = OsmUrlToBounds.parse(result); 
+        if (b != null) { 
+            minlon = b.min.lon(); 
+            minlat = b.min.lat(); 
+            maxlon = b.max.lon(); 
+            maxlat = b.max.lat(); 
+            boundingBoxChanged(null); 
+        } 
+    } 
 
     private void updateSizeCheck() {
         if ((maxlon-minlon)*(maxlat-minlat) > Main.pref.getDouble("osm-server.max-request-area", 0.25)) {
diff -u -r -N orig/src/org/openstreetmap/josm/Main.java trunk/src/org/openstreetmap/josm/Main.java
--- orig/src/org/openstreetmap/josm/Main.java	2009-01-18 23:34:45.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/Main.java	2009-01-19 23:06:11.671875000 +0100
@@ -49,7 +49,6 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.PleaseWaitDialog;
 import org.openstreetmap.josm.gui.SplashScreen;
-import org.openstreetmap.josm.gui.download.BoundingBoxSelection;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -60,6 +59,7 @@
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.plugins.PluginProxy;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
 import org.openstreetmap.josm.tools.PlatformHook;
 import org.openstreetmap.josm.tools.PlatformHookUnixoid;
 import org.openstreetmap.josm.tools.PlatformHookWindows;
@@ -493,7 +493,7 @@
 
     private static void downloadFromParamString(final boolean rawGps, String s) {
         if (s.startsWith("http:")) {
-            final Bounds b = BoundingBoxSelection.osmurl2bounds(s);
+            final Bounds b = OsmUrlToBounds.parse(s);
             if (b == null)
                 JOptionPane.showMessageDialog(Main.parent, tr("Ignoring malformed URL: \"{0}\"", s));
             else {
diff -u -r -N orig/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java
--- orig/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	1970-01-01 01:00:00.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	2009-01-19 23:11:06.718750000 +0100
@@ -0,0 +1,48 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others 
+package org.openstreetmap.josm.tools; 
+ 
+import java.util.HashMap; 
+ 
+import org.openstreetmap.josm.data.Bounds; 
+import org.openstreetmap.josm.data.coor.LatLon; 
+ 
+public class OsmUrlToBounds { 
+    public static Bounds parse(String url) { 
+        int i = url.indexOf('?'); 
+        if (i == -1) 
+            return null; 
+        String[] args = url.substring(i+1).split("&"); 
+        HashMap<String, String> map = new HashMap<String, String>(); 
+        for (String arg : args) { 
+            int eq = arg.indexOf('='); 
+            if (eq != -1) { 
+                map.put(arg.substring(0, eq), arg.substring(eq + 1)); 
+            } 
+        } 
+ 
+        Bounds b = null; 
+        try { 
+            if (map.containsKey("bbox")) { 
+                String bbox[] = map.get("bbox").split(","); 
+                b = new Bounds( 
+                    new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])), 
+                    new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2]))); 
+ 
+            } else { 
+                double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom"))); 
+                b = new Bounds( 
+                    new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size), 
+                    new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size)); 
+            } 
+        } catch (NumberFormatException x) { 
+        } catch (NullPointerException x) { 
+        } 
+        return b; 
+    } 
+     
+    private static double parseDouble(HashMap<String, String> map, String key) { 
+        if (map.containsKey(key)) 
+            return Double.parseDouble(map.get(key)); 
+        return Double.parseDouble(map.get("m"+key)); 
+    } 
+}
