Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 284)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 286)
@@ -47,14 +47,21 @@
 			dlg.setSize(dlg.getWidth(),600);
 
-		dlg.setVisible(true);
-		if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION) {
-			Main.pref.put("download.tab", Integer.toString(dialog.getSelectedTab()));
-			for (DownloadTask task : dialog.downloadTasks) {
-				Main.pref.put("download."+task.getPreferencesSuffix(), task.getCheckBox().isSelected());
-				if (task.getCheckBox().isSelected()) {
-					task.download(this, dialog.minlat, dialog.minlon, dialog.maxlat, dialog.maxlon);
-				}
-			}
-		}
+		boolean finish = false;
+        while (!finish) {
+            dlg.setVisible(true);
+        	if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION) {
+        		Main.pref.put("download.tab", Integer.toString(dialog.getSelectedTab()));
+        		for (DownloadTask task : dialog.downloadTasks) {
+        			Main.pref.put("download."+task.getPreferencesSuffix(), task.getCheckBox().isSelected());
+        			if (task.getCheckBox().isSelected()) {
+        				task.download(this, dialog.minlat, dialog.minlon, dialog.maxlat, dialog.maxlon);
+        				finish = true;
+        			}
+        		}
+        	} else
+        		finish = true;
+        	if (!finish)
+        		JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one task to download"));
+        }
 	}
 }
Index: src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenAction.java	(revision 284)
+++ src/org/openstreetmap/josm/actions/OpenAction.java	(revision 286)
@@ -19,5 +19,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.RawGpsLayer;
@@ -87,7 +86,4 @@
 				if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
 					dataSet = OsmReader.parseDataSet(new FileInputStream(file), null, Main.pleaseWaitDlg);
-					DataSource src = new DataSource();
-					src.sourceSpec = "File " + fn;
-					dataSet.dataSources.add(src);
 				} else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
 					JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("CSV Data import for non-GPS data is not implemented yet."));
Index: src/org/openstreetmap/josm/data/osm/DataSource.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSource.java	(revision 284)
+++ src/org/openstreetmap/josm/data/osm/DataSource.java	(revision 286)
@@ -4,7 +4,5 @@
 
 public class DataSource {
-
-	public Bounds sourceBounds;
-	public String sourceSpec;
-	
+	public Bounds bounds;
+	public String origin;
 }
Index: src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 284)
+++ src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 286)
@@ -65,6 +65,5 @@
 	public JTabbedPane tabpane = new JTabbedPane();
 	
-	public DownloadDialog(int tabindex)
-	{
+	public DownloadDialog(int tabindex) {
 		setLayout(new GridBagLayout());
 		
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 284)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 286)
@@ -148,7 +148,7 @@
 			// of drawing the outline, the outlying areas should perhaps be shaded.
 			for (DataSource src : data.dataSources) {
-				if (src.sourceBounds != null) {
-					EastNorth en1 = Main.proj.latlon2eastNorth(src.sourceBounds.min);
-					EastNorth en2 = Main.proj.latlon2eastNorth(src.sourceBounds.max);
+				if (src.bounds != null) {
+					EastNorth en1 = Main.proj.latlon2eastNorth(src.bounds.min);
+					EastNorth en2 = Main.proj.latlon2eastNorth(src.bounds.max);
 					Point p1 = mv.getPoint(en1);
 					Point p2 = mv.getPoint(en2);
Index: src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 284)
+++ src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 286)
@@ -103,6 +103,6 @@
     		final DataSet data = OsmReader.parseDataSet(in, null, Main.pleaseWaitDlg);
     		DataSource src = new DataSource();
-    		src.sourceSpec = "Server";
-    		src.sourceBounds = new Bounds(new LatLon(lat1, lon1), new LatLon(lat2, lon2));
+    		src.origin = Main.pref.get("osm-server.url")+"/"+Main.pref.get("osm-server.version", "0.4");
+    		src.bounds = new Bounds(new LatLon(lat1, lon1), new LatLon(lat2, lon2));
     		data.dataSources.add(src);
     		in.close();
Index: src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReader.java	(revision 284)
+++ src/org/openstreetmap/josm/io/OsmReader.java	(revision 286)
@@ -16,6 +16,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -67,4 +69,5 @@
 	private Map<Long, Node> nodes = new HashMap<Long, Node>();
 
+	// TODO: What the hack? Is this really from me? Please, clean this up!
 	private static class OsmPrimitiveData extends OsmPrimitive {
 		@Override public void visit(Visitor visitor) {}
@@ -112,4 +115,18 @@
 					if (!allowedVersions.contains(atts.getValue("version")))
 						throw new SAXException(tr("Unknown version")+": "+atts.getValue("version"));
+				} else if (qName.equals("bound")) {
+					String bbox = atts.getValue("box");
+					String origin = atts.getValue("origin");
+					if (bbox != null) {
+						DataSource src = new DataSource();
+						String[] b = bbox.split(",");
+						if (b.length == 4)
+							src.bounds = new Bounds(
+									new LatLon(Double.parseDouble(b[0]),Double.parseDouble(b[1])),
+									new LatLon(Double.parseDouble(b[2]),Double.parseDouble(b[3])));
+						if (origin != null)
+							src.origin = origin;
+						ds.dataSources.add(src);
+					}
 				} else if (qName.equals("node")) {
 					current = new Node(new LatLon(getDouble(atts, "lat"), getDouble(atts, "lon")));
Index: src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmWriter.java	(revision 284)
+++ src/org/openstreetmap/josm/io/OsmWriter.java	(revision 286)
@@ -7,4 +7,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -77,4 +78,16 @@
 		private boolean shouldWrite(OsmPrimitive osm) {
 	        return osm.id != 0 || !osm.deleted;
+        }
+
+		@Override public void header(PrintWriter out) {
+	        super.header(out);
+			for (DataSource s : ds.dataSources) {
+				out.print("  <bound box='"+
+						s.bounds.min.lat()+","+
+						s.bounds.min.lon()+","+
+						s.bounds.max.lat()+","+
+						s.bounds.max.lon()+"' ");
+				out.println("origin='"+XmlWriter.encode(s.origin)+"' />");
+			}
         }
 	}
