Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 7816)
@@ -65,4 +65,5 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.ViewportData;
@@ -72,4 +73,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
@@ -692,10 +694,43 @@
 
     /**
-     * Add a new layer to the map. If no map exists, create one.
-     */
-    public final synchronized void addLayer(final Layer layer) {
+     * Add a new layer to the map.
+     * 
+     * If no map exists, create one.
+     * 
+     * @param layer the layer
+     * 
+     * @see #addLayer(org.openstreetmap.josm.gui.layer.Layer, org.openstreetmap.josm.data.ProjectionBounds)
+     * @see #addLayer(org.openstreetmap.josm.gui.layer.Layer, org.openstreetmap.josm.data.ViewportData)
+     */
+    public final void addLayer(final Layer layer) {
+        BoundingXYVisitor v = new BoundingXYVisitor();
+        layer.visitBoundingBox(v);
+        addLayer(layer, v.getBounds());
+    }
+
+    /**
+     * Add a new layer to the map.
+     * 
+     * If no map exists, create one.
+     * 
+     * @param layer the layer
+     * @param bounds the bounds of the layer (target zoom area)
+     */
+    public final synchronized void addLayer(final Layer layer, ProjectionBounds bounds) {
+        addLayer(layer, new ViewportData(bounds));
+    }
+
+    /**
+     * Add a new layer to the map.
+     * 
+     * If no map exists, create one.
+     * 
+     * @param layer the layer
+     * @param viewport the viewport to zoom to
+     */
+    public final synchronized void addLayer(final Layer layer, ViewportData viewport) {
         boolean noMap = map == null;
         if (noMap) {
-            createMapFrame(layer, null);
+            createMapFrame(layer, viewport);
         }
         layer.hookUpMapView();
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 7816)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.DataSource;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -250,5 +251,5 @@
         }
 
-        protected void computeBboxAndCenterScale(Bounds bounds) {
+        protected ProjectionBounds computeBbox(Bounds bounds) {
             BoundingXYVisitor v = new BoundingXYVisitor();
             if (bounds != null) {
@@ -257,4 +258,11 @@
                 v.computeBoundingBox(dataSet.getNodes());
             }
+            return v.getBounds();
+        }
+
+        protected void computeBboxAndCenterScale(Bounds bounds) {
+            ProjectionBounds pb = computeBbox(bounds);
+            BoundingXYVisitor v = new BoundingXYVisitor();
+            v.visit(pb);
             Main.map.mapView.recalculateCenterScale(v);
         }
@@ -267,13 +275,5 @@
                 //
                 final OsmDataLayer layer = createNewLayer(newLayerName);
-                final boolean isDisplayingMapView = Main.isDisplayingMapView();
-
-                Main.main.addLayer(layer);
-
-                // If the mapView is not there yet, we cannot calculate the bounds (see constructor of MapView).
-                // Otherwise jump to the current download.
-                if (isDisplayingMapView) {
-                    computeBboxAndCenterScale(bounds);
-                }
+                Main.main.addLayer(layer, computeBbox(bounds));
                 return layer;
             }
Index: /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java	(revision 7816)
@@ -84,3 +84,6 @@
     }
 
+    public boolean hasExtend() {
+        return minEast != maxEast || minNorth != maxNorth;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/ViewportData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/ViewportData.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/data/ViewportData.java	(revision 7816)
@@ -5,11 +5,20 @@
 
 /**
- * Simple data class that keeps map center and scale in one object.
+ * Data class to keep viewport information.
+ *
+ * This can be either a combination of map center and map scale or
+ * a rectangle in east-north coordinate space.
+ *
+ * Either of those will be null, so the consumer of the ViewportData
+ * object has to check, which one is set.
+ *
  * @since 5670 (creation)
- * @since 6992 (extraction in this package) 
+ * @since 6992 (extraction in this package)
  */
 public class ViewportData {
-    private EastNorth center;
-    private Double scale;
+    private final EastNorth center;
+    private final Double scale;
+
+    private final ProjectionBounds bounds;
 
     /**
@@ -21,4 +30,11 @@
         this.center = center;
         this.scale = scale;
+        this.bounds = null;
+    }
+
+    public ViewportData(ProjectionBounds bounds) {
+        this.center = null;
+        this.scale = null;
+        this.bounds = bounds;
     }
 
@@ -38,3 +54,11 @@
         return scale;
     }
+
+    /**
+     * Return the bounds in east-north coordinate space.
+     * @return the bounds
+     */
+    public ProjectionBounds getBounds() {
+        return bounds;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 7816)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.data.Data;
 import org.openstreetmap.josm.data.DataSource;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -39,4 +40,5 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
@@ -1348,3 +1350,15 @@
         invalidateEastNorthCache();
     }
+
+    public ProjectionBounds getDataSourceBoundingBox() {
+        BoundingXYVisitor bbox = new BoundingXYVisitor();
+        for (DataSource source : dataSources) {
+            bbox.visit(source.bounds);
+        }
+        if (bbox.hasExtend()) {
+            return bbox.getBounds();
+        }
+        return null;
+    }
+
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 7816)
@@ -85,7 +85,6 @@
     }
 
-    public boolean hasExtend()
-    {
-        return bounds != null && !bounds.getMin().equals(bounds.getMax());
+    public boolean hasExtend() {
+        return bounds != null && bounds.hasExtend();
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 7816)
@@ -37,10 +37,8 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.data.DataSource;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.ViewportData;
@@ -233,4 +231,5 @@
      */
     public MapView(final JPanel contentPane, final ViewportData viewportData) {
+        initialViewport = viewportData;
         Main.pref.addPreferenceChangeListener(this);
         final boolean unregisterTab = Shortcut.findShortcut(KeyEvent.VK_TAB, 0)!=null;
@@ -250,17 +249,4 @@
 
                 mapMover = new MapMover(MapView.this, contentPane);
-                if (viewportData != null) {
-                    zoomTo(viewportData.getCenter(), viewportData.getScale());
-                } else {
-                    OsmDataLayer layer = getEditLayer();
-                    if (layer != null) {
-                        if (!zoomToDataSetBoundingBox(layer.data)) {
-                            // no bounding box defined
-                            AutoScaleAction.autoScale("data");
-                        }
-                    } else {
-                        AutoScaleAction.autoScale("layer");
-                    }
-                }
             }
         });
@@ -542,4 +528,14 @@
      */
     @Override public void paint(Graphics g) {
+        if (initialViewport != null) {
+            if (initialViewport.getBounds() != null) {
+                BoundingXYVisitor box = new BoundingXYVisitor();
+                box.visit(initialViewport.getBounds());
+                recalculateCenterScale(box);
+            } else {
+                zoomTo(initialViewport.getCenter(), initialViewport.getScale(), true);
+            }
+            initialViewport = null;
+        }
         if (BugReportExceptionHandler.exceptionHandlingInProgress())
             return;
@@ -868,30 +864,4 @@
     }
 
-    /**
-     * Tries to zoom to the download boundingbox[es] of the current edit layer
-     * (aka {@link OsmDataLayer}). If the edit layer has multiple download bounding
-     * boxes it zooms to a large virtual bounding box containing all smaller ones.
-     *
-     * @return <code>true</code> if a zoom operation has been performed
-     */
-    public boolean zoomToDataSetBoundingBox(DataSet ds) {
-        // In case we already have an existing data layer ...
-        OsmDataLayer layer= getEditLayer();
-        if (layer == null)
-            return false;
-        Collection<DataSource> dataSources = ds.dataSources;
-        // ... with bounding box[es] of data loaded from OSM or a file...
-        BoundingXYVisitor bbox = new BoundingXYVisitor();
-        for (DataSource source : dataSources) {
-            bbox.visit(source.bounds);
-        }
-        if (bbox.hasExtend()) {
-            // ... we zoom to it's bounding box
-            recalculateCenterScale(bbox);
-            return true;
-        }
-        return false;
-    }
-
     public boolean addTemporaryLayer(MapViewPaintable mvp) {
         if (temporaryLayers.contains(mvp)) return false;
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 7816)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
+import org.openstreetmap.josm.data.ViewportData;
 import org.openstreetmap.josm.data.coor.CachedLatLon;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -182,4 +183,6 @@
     private Polygon paintPoly = null;
 
+    protected ViewportData initialViewport;
+
     /**
      * Constructs a new {@code NavigatableComponent}.
@@ -406,9 +409,21 @@
 
     /**
-     * Zoom to the given coordinate.
+     * Zoom to the given coordinate and scale.
+     *
      * @param newCenter The center x-value (easting) to zoom to.
      * @param newScale The scale to use.
      */
     public void zoomTo(EastNorth newCenter, double newScale) {
+        zoomTo(newCenter, newScale, false);
+    }
+
+    /**
+     * Zoom to the given coordinate and scale.
+     *
+     * @param newCenter The center x-value (easting) to zoom to.
+     * @param newScale The scale to use.
+     * @param initial true if this call initializes the viewport.
+     */
+    public void zoomTo(EastNorth newCenter, double newScale, boolean initial) {
         Bounds b = getProjection().getWorldBoundsLatLon();
         LatLon cl = Projections.inverseProject(newCenter);
@@ -446,6 +461,8 @@
 
         if (!newCenter.equals(center) || (scale != newScale)) {
-            pushZoomUndo(center, scale);
-            zoomNoUndoTo(newCenter, newScale);
+            if (!initial) {
+                pushZoomUndo(center, scale);
+            }
+            zoomNoUndoTo(newCenter, newScale, initial);
         }
     }
@@ -453,21 +470,29 @@
     /**
      * Zoom to the given coordinate without adding to the zoom undo buffer.
+     *
      * @param newCenter The center x-value (easting) to zoom to.
      * @param newScale The scale to use.
-     */
-    private void zoomNoUndoTo(EastNorth newCenter, double newScale) {
+     * @param initial true if this call initializes the viewport.
+     */
+    private void zoomNoUndoTo(EastNorth newCenter, double newScale, boolean intial) {
         if (!newCenter.equals(center)) {
             EastNorth oldCenter = center;
             center = newCenter;
-            firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
+            if (!intial) {
+                firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
+            }
         }
         if (scale != newScale) {
             double oldScale = scale;
             scale = newScale;
-            firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
-        }
-
-        repaint();
-        fireZoomChanged();
+            if (!intial) {
+                firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
+            }
+        }
+
+        if (!intial) {
+            repaint();
+            fireZoomChanged();
+        }
     }
 
@@ -595,5 +620,5 @@
             ZoomData zoom = zoomUndoBuffer.pop();
             zoomRedoBuffer.push(new ZoomData(center, scale));
-            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale());
+            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
         }
     }
@@ -603,5 +628,5 @@
             ZoomData zoom = zoomRedoBuffer.pop();
             zoomUndoBuffer.push(new ZoomData(center, scale));
-            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale());
+            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/io/OsmImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 7815)
+++ /trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 7816)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
@@ -32,6 +33,6 @@
     public static class OsmImporterData {
 
-        private OsmDataLayer layer;
-        private Runnable postLayerTask;
+        private final OsmDataLayer layer;
+        private final Runnable postLayerTask;
 
         public OsmImporterData(OsmDataLayer layer, Runnable postLayerTask) {
@@ -102,7 +103,13 @@
             @Override
             public void run() {
-                Main.main.addLayer(data.layer);
-                data.postLayerTask.run();
-                data.layer.onPostLoadFromFile();
+                OsmDataLayer layer = data.getLayer();
+                BoundingXYVisitor v = new BoundingXYVisitor();
+                v.visit(layer.data.getDataSourceBoundingBox());
+                if (!v.hasExtend()) {
+                    v.computeBoundingBox(layer.data.getNodes());
+                }
+                Main.main.addLayer(layer, v.getBounds());
+                data.getPostLayerTask().run();
+                data.getLayer().onPostLoadFromFile();
             }
         });
