Index: /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 745)
+++ /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 746)
@@ -84,10 +84,11 @@
 			for (OsmPrimitive osm : sel)
 				osm.visit(v);
-			// special case to zoom nicely to one single node
-			if (v.min != null && v.max != null && v.min.north() == v.max.north() && v.min.east() == v.max.east()) {
-				EastNorth en = Main.proj.latlon2eastNorth(new LatLon(0.001, 0.001));
-				v.min = new EastNorth(v.min.east()-en.east(), v.min.north()-en.north());
-				v.max = new EastNorth(v.max.east()+en.east(), v.max.north()+en.north());
-			}
+			// increase bbox by 0.001 degrees on each side. this is required 
+			// especially if the bbox contains one single node, but helpful 
+			// in most other cases as well.
+			// if (v.min != null && v.max != null && v.min.north() == v.max.north() && v.min.east() == v.max.east()) {
+			EastNorth en = Main.proj.latlon2eastNorth(new LatLon(0.001, 0.001));
+			v.min = new EastNorth(v.min.east()-en.east(), v.min.north()-en.north());
+			v.max = new EastNorth(v.max.east()+en.east(), v.max.north()+en.north());
 		}
 		return v;
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 745)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 746)
@@ -58,14 +58,15 @@
 
 	public void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon) {
-    // Swap min and max if user has specified them the wrong way round
-    // (easy to do if you are crossing 0, for example)
-    if (minlat > maxlat) {
-      double t = minlat; minlat = maxlat; maxlat = t;
-    }
-    if (minlon > maxlon) {
-      double t = minlon; minlon = maxlon; maxlon = t;
-    }
+		// Swap min and max if user has specified them the wrong way round
+		// (easy to do if you are crossing 0, for example)
+		// FIXME should perhaps be done in download dialog?
+		if (minlat > maxlat) {
+			double t = minlat; minlat = maxlat; maxlat = t;
+		}
+		if (minlon > maxlon) {
+			double t = minlon; minlon = maxlon; maxlon = t;
+		}
     
-		Task task = new Task(action.dialog == null || action.dialog.newLayer.isSelected(), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
+		Task task = new Task(action != null && (action.dialog == null || action.dialog.newLayer.isSelected()), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
 		Main.worker.execute(task);
     }
Index: /trunk/src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 745)
+++ /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 746)
@@ -1,4 +1,7 @@
 // License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.data;
+
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RectangularShape;
 
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -66,3 +69,12 @@
 		return true;
 	}
+	
+	/**
+	 * Returns the lat/lon bounding box as an object of type Rectangle2D.Double
+	 * @return
+	 */
+	public Rectangle2D.Double asRect() {
+		return new Rectangle2D.Double(min.lon(), min.lat(), max.lon()-min.lon(), max.lat()-min.lat());
+	}
+
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 745)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 746)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.awt.Polygon;
+import java.awt.Shape;
+import java.awt.geom.Area;
 import java.util.Arrays;
 import java.util.Collection;
@@ -204,3 +207,18 @@
 	    return ds;
     }
+	
+	/**
+	 * Returns the total area of downloaded data (the "yellow rectangles").
+	 * @return Area object encompassing downloaded data.
+	 */
+	public Area getDataSourceArea()
+	{
+		Area a = new Area();
+		for (DataSource source : dataSources) {
+			// create area from data bounds
+			a.add(new Area(source.bounds.asRect()));
+		}
+		return a;
+		
+	}
 }
