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-06 15:16:18.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	2009-01-16 01:06:31.796875000 +0100
@@ -23,6 +23,7 @@
 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 +41,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 +78,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 +117,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);
@@ -166,43 +165,4 @@
         }
         showUrl.setText("http://www.openstreetmap.org/index.html?mlat="+lat+"&mlon="+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-06 15:16:18.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	2009-01-16 01:06:49.734375000 +0100
@@ -4,24 +4,40 @@
 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,8 +161,43 @@
         Font labelFont = sizeCheck.getFont();
         sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()));
         add(sizeCheck, GBC.eop().insets(0,5,5,10));
+        
+        checkClipboardContents();
+        
+        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)) {
             sizeCheck.setText(tr("Download area too large; will probably be rejected by server"));
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-11 11:16:42.000000000 +0100
+++ trunk/src/org/openstreetmap/josm/Main.java	2009-01-12 00:56:11.421875000 +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;
@@ -486,7 +486,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-16 01:02:51.156250000 +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;
+    }
+    
+    public 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));
+    }
+}
