diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index b57ec52..22c867e 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -74,7 +74,6 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 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;
 import org.openstreetmap.josm.data.validation.OsmValidator;
@@ -768,9 +767,7 @@ public abstract class Main {
      * @see #addLayer(Layer, ViewportData)
      */
     public final void addLayer(final Layer layer) {
-        BoundingXYVisitor v = new BoundingXYVisitor();
-        layer.visitBoundingBox(v);
-        addLayer(layer, v.getBounds());
+        addLayer(layer, layer.getViewProjectionBounds());
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
index 2fbbd13..324ca12 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
@@ -258,7 +258,7 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
                 //
                 final OsmDataLayer layer = createNewLayer(newLayerName);
                 if (Main.main != null)
-                    Main.main.addLayer(layer, computeBbox(bounds));
+                    Main.main.addLayer(layer);
                 return layer;
             }
             return null;
diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
index 45f505c..4f4253f 100644
--- a/src/org/openstreetmap/josm/gui/layer/Layer.java
+++ b/src/org/openstreetmap/josm/gui/layer/Layer.java
@@ -22,6 +22,7 @@ import org.openstreetmap.josm.actions.GpxExportAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.actions.SaveAsAction;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
@@ -592,4 +593,17 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
             return LayerPositionStrategy.AFTER_LAST_VALIDATION_LAYER;
         }
     }
+
+    /**
+     * Gets the {@link ProjectionBounds} for this layer to be visible to the user. This can be the exact bounds, the UI handles padding. Return
+     * <code>null</code> if you cannot provide this information. The default implementation uses the bounds from
+     * {@link #visitBoundingBox(BoundingXYVisitor)}.
+     * @return  The bounds for this layer.
+     * @since xxx
+     */
+    public ProjectionBounds getViewProjectionBounds() {
+        BoundingXYVisitor v = new BoundingXYVisitor();
+        visitBoundingBox(v);
+        return v.getBounds();
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
index 0f60228..142e410 100644
--- a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
@@ -48,6 +48,7 @@ import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction;
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.DataSource;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -1078,4 +1079,14 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
         dialog.setUploadedPrimitives(new APIDataSet(data));
         return dialog;
     }
+
+    @Override
+    public ProjectionBounds getViewProjectionBounds() {
+        BoundingXYVisitor v = new BoundingXYVisitor();
+        v.visit(data.getDataSourceBoundingBox());
+        if (!v.hasExtend()) {
+            v.computeBoundingBox(data.getNodes());
+        }
+        return v.getBounds();
+    }
 }
diff --git a/src/org/openstreetmap/josm/io/OsmImporter.java b/src/org/openstreetmap/josm/io/OsmImporter.java
index 92857ba..68c9e8b 100644
--- a/src/org/openstreetmap/josm/io/OsmImporter.java
+++ b/src/org/openstreetmap/josm/io/OsmImporter.java
@@ -14,7 +14,6 @@ import javax.swing.JOptionPane;
 import org.openstreetmap.josm.Main;
 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.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -96,12 +95,7 @@ public class OsmImporter extends FileImporter {
             @Override
             public void run() {
                 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());
+                Main.main.addLayer(layer);
                 data.getPostLayerTask().run();
                 data.getLayer().onPostLoadFromFile();
             }
