Index: trunk/src/org/openstreetmap/josm/actions/JumpToAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JumpToAction.java	(revision 11300)
+++ trunk/src/org/openstreetmap/josm/actions/JumpToAction.java	(revision 11301)
@@ -9,4 +9,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Optional;
 
 import javax.swing.JLabel;
@@ -21,4 +22,5 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
@@ -91,10 +93,13 @@
         }
         MapView mv = Main.map.mapView;
-        LatLon curPos = mv.getProjection().eastNorth2latlon(mv.getCenter());
-        lat.setText(Double.toString(curPos.lat()));
-        lon.setText(Double.toString(curPos.lon()));
-
-        double dist = mv.getDist100Pixel();
-        zm.setText(Long.toString(Math.round(dist*100)/100));
+
+        final Optional<Bounds> boundsFromClipboard = Optional
+                .ofNullable(ClipboardUtils.getClipboardStringContent())
+                .map(OsmUrlToBounds::parse);
+        if (boundsFromClipboard.isPresent()) {
+            setBounds(boundsFromClipboard.get());
+        } else {
+            setBounds(mv.getState().getViewArea().getCornerBounds());
+        }
         updateUrl(true);
 
@@ -158,5 +163,5 @@
         }
 
-        double zoomFactor = 1/dist;
+        double zoomFactor = 1/ mv.getDist100Pixel();
         mv.zoomToFactor(mv.getProjection().latlon2eastNorth(ll), zoomFactor * zoomLvl);
     }
@@ -166,25 +171,13 @@
         String urlText = url.getText();
         Bounds b = OsmUrlToBounds.parse(urlText);
+        setBounds(b);
+    }
+
+    private void setBounds(Bounds b) {
         if (b != null) {
-            lat.setText(Double.toString((b.getMinLat() + b.getMaxLat())/2));
-            lon.setText(Double.toString((b.getMinLon() + b.getMaxLon())/2));
-
-            int zoomLvl = 16;
-            int hashIndex = urlText.indexOf("#map");
-            if (hashIndex >= 0) {
-                zoomLvl = Integer.parseInt(urlText.substring(hashIndex+5, urlText.indexOf('/', hashIndex)));
-            } else {
-                String[] args = urlText.substring(urlText.indexOf('?')+1).split("&");
-                for (String arg : args) {
-                    int eq = arg.indexOf('=');
-                    if (eq == -1 || !"zoom".equalsIgnoreCase(arg.substring(0, eq))) continue;
-
-                    zoomLvl = Integer.parseInt(arg.substring(eq + 1));
-                    break;
-                }
-            }
-
-            // 10 000 000 = 10 000 * 1000 = World * (km -> m)
-            zm.setText(Double.toString(Math.round(10000000d * Math.pow(2d, (-1d) * zoomLvl))));
+            final LatLon center = b.getCenter();
+            lat.setText(Double.toString(center.lat()));
+            lon.setText(Double.toString(center.lon()));
+            zm.setText(Double.toString(OsmUrlToBounds.getZoom(b)));
         }
     }
@@ -195,12 +188,6 @@
             double dlat = Double.parseDouble(lat.getText());
             double dlon = Double.parseDouble(lon.getText());
-            double m = Double.parseDouble(zm.getText());
-            // Inverse function to the one above. 18 is the current maximum zoom
-            // available on standard renderers, so choose this is in case m should be zero
-            int zoomLvl = 18;
-            if (m > 0)
-                zoomLvl = (int) Math.round((-1) * Math.log(m/10_000_000)/Math.log(2));
-
-            url.setText(OsmUrlToBounds.getURL(dlat, dlon, zoomLvl));
+            double zoomLvl = Double.parseDouble(zm.getText());
+            url.setText(OsmUrlToBounds.getURL(dlat, dlon, (int) zoomLvl));
         } catch (NumberFormatException x) {
             Main.debug(x.getMessage());
