Index: /src/org/openstreetmap/josm/Main.java
===================================================================
--- /src/org/openstreetmap/josm/Main.java	(revision 289)
+++ /src/org/openstreetmap/josm/Main.java	(revision 290)
@@ -173,9 +173,6 @@
 	public final void removeLayer(final Layer layer) {
 		map.mapView.removeLayer(layer);
-		if (layer instanceof OsmDataLayer) {
-			DataSet newDs = new DataSet();
-			newDs.listeners.addAll(ds.listeners);
-			ds = newDs;
-		}
+		if (layer instanceof OsmDataLayer)
+			ds = new DataSet();
 		if (map.mapView.getAllLayers().isEmpty())
 			setMapFrame(null);
@@ -278,5 +275,5 @@
 	public final OsmDataLayer editLayer() {
 		if (map == null || map.mapView.editLayer == null)
-			addLayer(new OsmDataLayer(ds, tr("unnamed"), null));
+			menu.newAction.actionPerformed(null);
 		return map.mapView.editLayer;
 	}
Index: /src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 290)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -40,5 +41,5 @@
 	public CombineWayAction() {
 		super(tr("Combine Way"), "combineway", tr("Combine several ways into one."), KeyEvent.VK_C, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
-		Main.ds.listeners.add(this);
+		DataSet.listeners.add(this);
 	}
 
Index: /src/org/openstreetmap/josm/actions/DiskAccessAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 290)
@@ -9,5 +9,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
 /**
@@ -16,43 +15,6 @@
 abstract public class DiskAccessAction extends JosmAction {
 
-	/**
-	 * Checks whether it is ok to launch a save (whether we have data,
-	 * there is no conflict etc...)
-	 * @return <code>true</code>, if it is save to save.
-	 */
-	public boolean checkSaveConditions() {
-        if (Main.map == null) {
-    		JOptionPane.showMessageDialog(Main.parent, tr("No document open so nothing to save."));
-    		return false;
-    	}
-    	if (isDataSetEmpty() && JOptionPane.NO_OPTION == JOptionPane.showConfirmDialog(Main.parent,tr("The document contains no data. Save anyway?"), tr("Empty document"), JOptionPane.YES_NO_OPTION))
-    		return false;
-    	if (!Main.map.conflictDialog.conflicts.isEmpty()) {
-    		int answer = JOptionPane.showConfirmDialog(Main.parent, 
-    				tr("There are unresolved conflicts. Conflicts will not be saved and handled as if you rejected all. Continue?"),tr("Conflicts"), JOptionPane.YES_NO_OPTION);
-    		if (answer != JOptionPane.YES_OPTION)
-    			return false;
-    	}
-    	return true;
-    }
-
-
 	public DiskAccessAction(String name, String iconName, String tooltip, int shortCut, int modifiers) {
 		super(name, iconName, tooltip, shortCut, modifiers, true);
-	}
-	
-	
-	/**
-	 * Check the data set if it would be empty on save. It is empty, if it contains
-	 * no objects (after all objects that are created and deleted without beeing 
-	 * transfered to the server have been removed).
-	 *  
-	 * @return <code>true</code>, if a save result in an empty data set.
-	 */
-	protected boolean isDataSetEmpty() {
-		for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives())
-			if (!osm.deleted || osm.id > 0)
-				return false;
-		return true;
 	}
 	
@@ -82,3 +44,4 @@
 		
 		return fc;
-	}}
+	}
+}
Index: /src/org/openstreetmap/josm/actions/NewAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/NewAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/NewAction.java	(revision 290)
@@ -8,4 +8,6 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 public class NewAction extends JosmAction {
@@ -16,9 +18,5 @@
 
 	public void actionPerformed(ActionEvent e) {
-		if (Main.breakBecauseUnsavedChanges())
-			return;
-		if (Main.map != null)
-			Main.main.removeLayer(Main.main.editLayer());
-		Main.main.editLayer(); // create new if empty
+		Main.main.addLayer(new OsmDataLayer(new DataSet(), tr("unnamed"), null));
 	}
 }
Index: /src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/OpenAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/OpenAction.java	(revision 290)
@@ -8,4 +8,5 @@
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
@@ -57,50 +58,52 @@
 	 */
 	public void openFile(File file) {
-		String fn = file.getName();
 		try {
-			if (asRawData(fn)) {
-				Collection<Collection<GpsPoint>> gpsData = null;
-				Collection<Marker> markerData = null;
-				if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
-					RawGpsReader r = null;
-					// Check to see if we are opening a compressed file
-					if(file.getName().endsWith(".gpx.gz")) {
-						r = new RawGpsReader(new GZIPInputStream(new FileInputStream(file)), file.getAbsoluteFile().getParentFile());
-					} else {
-						r = new RawGpsReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
-					}
-					gpsData = r.trackData;
-					markerData = r.markerData;
-				} else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
-					gpsData = new LinkedList<Collection<GpsPoint>>();
-					gpsData.add(new RawCsvReader(new FileReader(file)).parse());
-				} else
-					throw new IllegalStateException();
-				if ((gpsData != null) && (!gpsData.isEmpty()))
-					Main.main.addLayer(new RawGpsLayer(gpsData, tr("Tracks from {0}", file.getName()), file));
-				if ((markerData != null) && (!markerData.isEmpty()))
-					Main.main.addLayer(new MarkerLayer(markerData, tr ("Markers from {0}", file.getName()), file));
-				
-			} else {
-				DataSet dataSet;
-				if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
-					dataSet = OsmReader.parseDataSet(new FileInputStream(file), null, Main.pleaseWaitDlg);
-				} 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."));
-					return;
-				} else {
-					JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(file.getName().lastIndexOf('.')+1)));
-					return;
-				}
-				Main.main.addLayer(new OsmDataLayer(dataSet, file.getName(), file));
-			}
+			if (asRawData(file.getName()))
+				openFileAsRawGps(file);
+			else
+				openAsData(file);
 		} catch (SAXException x) {
 			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.parent, tr("Error while parsing {0}",fn)+": "+x.getMessage());
+			JOptionPane.showMessageDialog(Main.parent, tr("Error while parsing {0}",file.getName())+": "+x.getMessage());
 		} catch (IOException x) {
 			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.parent, tr("Could not read \"{0}\"",fn)+"\n"+x.getMessage());
+			JOptionPane.showMessageDialog(Main.parent, tr("Could not read \"{0}\"",file.getName())+"\n"+x.getMessage());
 		}
 	}
+
+	private void openAsData(File file) throws SAXException, IOException, FileNotFoundException {
+	    String fn = file.getName();
+	    if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
+	    	DataSet dataSet = OsmReader.parseDataSet(new FileInputStream(file), null, Main.pleaseWaitDlg);
+	    	OsmDataLayer layer = new OsmDataLayer(dataSet, file.getName(), file);
+            Main.main.addLayer(layer);
+	    } 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."));
+	    else
+	    	JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(file.getName().lastIndexOf('.')+1)));
+    }
+
+	private void openFileAsRawGps(File file) throws SAXException, IOException, FileNotFoundException {
+	    String fn = file.getName();
+	    Collection<Collection<GpsPoint>> gpsData = null;
+	    Collection<Marker> markerData = null;
+	    if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
+	    	RawGpsReader r = null;
+	    	if (file.getName().endsWith(".gpx.gz"))
+	    		r = new RawGpsReader(new GZIPInputStream(new FileInputStream(file)), file.getAbsoluteFile().getParentFile());
+	    	else
+	    		r = new RawGpsReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
+	    	gpsData = r.trackData;
+	    	markerData = r.markerData;
+	    } else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
+	    	gpsData = new LinkedList<Collection<GpsPoint>>();
+	    	gpsData.add(new RawCsvReader(new FileReader(file)).parse());
+	    } else
+	    	throw new IllegalStateException();
+	    if (gpsData != null && !gpsData.isEmpty())
+	    	Main.main.addLayer(new RawGpsLayer(gpsData, tr("Tracks from {0}", file.getName()), file));
+	    if (markerData != null && !markerData.isEmpty())
+	    	Main.main.addLayer(new MarkerLayer(markerData, tr ("Markers from {0}", file.getName()), file));
+    }
 
 	/**
Index: /src/org/openstreetmap/josm/actions/SaveAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/SaveAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/SaveAction.java	(revision 290)
@@ -3,16 +3,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
 
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.io.OsmWriter;
 
 /**
@@ -21,50 +14,18 @@
  * @author imi
  */
-public class SaveAction extends DiskAccessAction {
+public class SaveAction extends SaveActionBase {
     
 	/**
 	 * Construct the action with "Save" as label.
-	 * @param layer Save only this layer. If <code>null</code>, save the whole Main 
-	 * 		data set.
+	 * @param layer Save this layer.
 	 */
-	public SaveAction() {
-		super(tr("Save"), "save", tr("Save the current data."), KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK);
+	public SaveAction(OsmDataLayer layer) {
+		super(tr("Save"), "save", tr("Save the current data."), KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK, layer);
 	}
 	
-	public void actionPerformed(ActionEvent event) {
-		if (!checkSaveConditions())
-			return;
-
-		File file = Main.main.editLayer().associatedFile;
-		if (file == null)
-			file = SaveAsAction.openFileDialog();
-		if (file == null)
-			return;
-
-		save(file);
-		Main.main.editLayer().name = file.getName();
-		Main.main.editLayer().associatedFile = file;
-		Main.parent.repaint();
+	public File getFile(OsmDataLayer layer) {
+		if (layer.associatedFile != null)
+			return layer.associatedFile;
+		return openFileDialog();
 	}
-
-	public static void save(File file) {
-	    try {
-			OsmDataLayer layer = Main.main.editLayer();
-			if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(file.getPath())) {
-				GpxExportAction.exportGpx(file, layer);
-			} else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(file.getPath())) {
-				OsmWriter.output(new FileOutputStream(file), new OsmWriter.All(Main.ds, false));
-			} else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(file.getPath())) {
-				JOptionPane.showMessageDialog(Main.parent, tr("CSV output not supported yet."));
-				return;
-			} else {
-				JOptionPane.showMessageDialog(Main.parent, tr("Unknown file extension."));
-				return;
-			}
-			layer.cleanData(null, false);
-		} catch (IOException e) {
-			e.printStackTrace();
-			JOptionPane.showMessageDialog(Main.parent, tr("An error occurred while saving.")+"\n"+e.getMessage());
-		}
-    }
 }
Index: /src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- /src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 290)
+++ /src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 290)
@@ -0,0 +1,125 @@
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.OsmWriter;
+
+public abstract class SaveActionBase extends DiskAccessAction {
+
+	private OsmDataLayer layer;
+
+	public SaveActionBase(String name, String iconName, String tooltip, int shortCut, int modifiers, OsmDataLayer layer) {
+		super(name, iconName, tooltip, shortCut, modifiers);
+		this.layer = layer;
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		OsmDataLayer layer = this.layer;
+		if (layer == null && Main.map != null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer)
+			layer = (OsmDataLayer)Main.map.mapView.getActiveLayer();
+		if (layer == null)
+			layer = Main.main.editLayer();
+
+		if (!checkSaveConditions(layer))
+			return;
+
+		
+		File file = getFile(layer);
+		if (file == null)
+			return;
+
+		save(file, layer);
+
+		layer.name = file.getName();
+		layer.associatedFile = file;
+		Main.parent.repaint();
+	}
+	
+	protected abstract File getFile(OsmDataLayer layer);
+
+	/**
+	 * Checks whether it is ok to launch a save (whether we have data,
+	 * there is no conflict etc...)
+	 * @return <code>true</code>, if it is save to save.
+	 */
+	public boolean checkSaveConditions(OsmDataLayer layer) {
+        if (Main.map == null) {
+    		JOptionPane.showMessageDialog(Main.parent, tr("No document open so nothing to save."));
+    		return false;
+    	}
+    	if (isDataSetEmpty(layer) && JOptionPane.NO_OPTION == JOptionPane.showConfirmDialog(Main.parent,tr("The document contains no data. Save anyway?"), tr("Empty document"), JOptionPane.YES_NO_OPTION))
+    		return false;
+    	if (!Main.map.conflictDialog.conflicts.isEmpty()) {
+    		int answer = JOptionPane.showConfirmDialog(Main.parent, 
+    				tr("There are unresolved conflicts. Conflicts will not be saved and handled as if you rejected all. Continue?"),tr("Conflicts"), JOptionPane.YES_NO_OPTION);
+    		if (answer != JOptionPane.YES_OPTION)
+    			return false;
+    	}
+    	return true;
+    }
+
+	public static File openFileDialog() {
+        JFileChooser fc = createAndOpenFileChooser(false, false);
+    	if (fc == null)
+    		return null;
+    
+    	File file = fc.getSelectedFile();
+    
+    	String fn = file.getPath();
+    	if (fn.indexOf('.') == -1) {
+    		FileFilter ff = fc.getFileFilter();
+    		if (ff instanceof ExtensionFileFilter)
+    			fn = "." + ((ExtensionFileFilter)ff).defaultExtension;
+    		else
+    			fn += ".osm";
+    		file = new File(fn);
+    	}
+        return file;
+    }
+	
+	public static void save(File file, OsmDataLayer layer) {
+	    try {
+			if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(file.getPath())) {
+				GpxExportAction.exportGpx(file, layer);
+			} else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(file.getPath())) {
+				OsmWriter.output(new FileOutputStream(file), new OsmWriter.All(layer.data, false));
+			} else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(file.getPath())) {
+				JOptionPane.showMessageDialog(Main.parent, tr("CSV output not supported yet."));
+				return;
+			} else {
+				JOptionPane.showMessageDialog(Main.parent, tr("Unknown file extension."));
+				return;
+			}
+			((OsmDataLayer)layer).cleanData(null, false);
+		} catch (IOException e) {
+			e.printStackTrace();
+			JOptionPane.showMessageDialog(Main.parent, tr("An error occurred while saving.")+"\n"+e.getMessage());
+		}
+    }
+	
+	/**
+	 * Check the data set if it would be empty on save. It is empty, if it contains
+	 * no objects (after all objects that are created and deleted without beeing 
+	 * transfered to the server have been removed).
+	 *  
+	 * @return <code>true</code>, if a save result in an empty data set.
+	 */
+	private boolean isDataSetEmpty(OsmDataLayer layer) {
+		for (OsmPrimitive osm : layer.data.allNonDeletedPrimitives())
+			if (!osm.deleted || osm.id > 0)
+				return false;
+		return true;
+	}
+}
Index: /src/org/openstreetmap/josm/actions/SaveAsAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 290)
@@ -3,13 +3,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.io.File;
 
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -18,46 +14,16 @@
  * @author imi
  */
-public class SaveAsAction extends DiskAccessAction {
+public class SaveAsAction extends SaveActionBase {
     
 	/**
 	 * Construct the action with "Save" as label.
-	 * @param layer Save only this layer. If <code>null</code>, save the whole Main 
-	 * 		data set.
+	 * @param layer Save this layer.
 	 */
-	public SaveAsAction() {
-		super(tr("Save as"), "save_as", tr("Save the current data to a new file."), KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK);
+	public SaveAsAction(OsmDataLayer layer) {
+		super(tr("Save as"), "save_as", tr("Save the current data to a new file."), KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK, layer);
 	}
 	
-	public void actionPerformed(ActionEvent event) {
-		if (!checkSaveConditions())
-			return;
-
-		File file = openFileDialog();
-		if (file == null)
-			return;
-
-		SaveAction.save(file);
-		Main.main.editLayer().name = file.getName();
-		Main.main.editLayer().associatedFile = file;
-		Main.parent.repaint();
+	protected File getFile(OsmDataLayer layer) {
+		return openFileDialog();
 	}
-
-	public static File openFileDialog() {
-	    JFileChooser fc = createAndOpenFileChooser(false, false);
-		if (fc == null)
-			return null;
-
-		File file = fc.getSelectedFile();
-
-		String fn = file.getPath();
-		if (fn.indexOf('.') == -1) {
-			FileFilter ff = fc.getFileFilter();
-			if (ff instanceof ExtensionFileFilter)
-				fn = "." + ((ExtensionFileFilter)ff).defaultExtension;
-			else
-				fn += ".osm";
-			file = new File(fn);
-		}
-	    return file;
-    }
 }
Index: /src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 290)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -99,5 +100,5 @@
 	public SplitWayAction() {
 		super(tr("Split Way"), "splitway", tr("Split a way at the selected node."), KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
-		Main.ds.listeners.add(this);
+		DataSet.listeners.add(this);
 	}
 
Index: /src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 289)
+++ /src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 290)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Segment;
@@ -60,5 +61,5 @@
 	public AddWayAction(MapFrame mapFrame) {
 		super(tr("Add Way"), "addway", tr("Add a new way to the data."), KeyEvent.VK_W, mapFrame, ImageProvider.getCursor("normal", "way"));
-		Main.ds.listeners.add(this);
+		DataSet.listeners.add(this);
 	}
 
Index: /src/org/openstreetmap/josm/data/DataSetChecker.java
===================================================================
--- /src/org/openstreetmap/josm/data/DataSetChecker.java	(revision 290)
+++ /src/org/openstreetmap/josm/data/DataSetChecker.java	(revision 290)
@@ -0,0 +1,42 @@
+package org.openstreetmap.josm.data;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+public class DataSetChecker {
+
+	public static void check() {
+		if (Main.map == null)
+			return;
+
+		Set<OsmPrimitive> s = new HashSet<OsmPrimitive>();
+		for (Layer l : Main.map.mapView.getAllLayers()) {
+			if (l instanceof OsmDataLayer) {
+				for (OsmPrimitive osm : ((OsmDataLayer)l).data.allPrimitives()) {
+					if (s.contains(osm)) {
+		                JOptionPane.showMessageDialog(Main.parent, "cross references");
+		                return;
+					}
+					s.add(osm);
+				}
+			}
+		}
+		
+		if (Main.map.mapView.getActiveLayer() instanceof OsmDataLayer) {
+			OsmDataLayer l = (OsmDataLayer)Main.map.mapView.getActiveLayer();
+			if (l.data != Main.ds) {
+				JOptionPane.showMessageDialog(Main.parent, "Main.ds / active layer mismatch");
+				return;
+			}
+		}
+
+		JOptionPane.showMessageDialog(Main.parent, "working");
+	}
+}
Index: /src/org/openstreetmap/josm/data/coor/Coordinate.java
===================================================================
--- /src/org/openstreetmap/josm/data/coor/Coordinate.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/coor/Coordinate.java	(revision 290)
@@ -20,9 +20,9 @@
 	 * Either easting or latitude
 	 */
-	double x;
+	final double x;
 	/**
 	 * Either northing or longitude
 	 */
-	double y;
+	final double y;
 
 	/**
Index: /src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 290)
@@ -20,5 +20,5 @@
  * @author imi
  */
-public class DataSet {
+public class DataSet implements Cloneable {
 
 	/**
@@ -49,7 +49,10 @@
 	
 	/**
-	 * A list of listeners to selection changed events.
+	 * A list of listeners to selection changed events. The list is static,
+	 * as listeners register themself for any dataset selection changes that 
+	 * occour, regardless of the current active dataset. (However, the
+	 * selection does only change in the active layer)
 	 */
-	transient public Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
+	public static Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
 
 	/**
@@ -144,7 +147,20 @@
 	 * the event immediately. For more, @see SelectionChangedListener
 	 */
-	public void fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
+	public static void fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
 		for (SelectionChangedListener l : listeners)
 			l.selectionChanged(sel);
 	}
+
+	@Override public DataSet clone() {
+		DataSet ds = new DataSet();
+		for (Node n : nodes)
+			ds.nodes.add(new Node(n));
+		for (Segment s : segments)
+			ds.segments.add(new Segment(s));
+		for (Way w : ways)
+			ds.ways.add(new Way(w));
+		for (DataSource source : dataSources)
+			ds.dataSources.add(new DataSource(source.bounds, source.origin));
+	    return ds;
+    }
 }
Index: /src/org/openstreetmap/josm/data/osm/DataSource.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/DataSource.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/DataSource.java	(revision 290)
@@ -3,6 +3,15 @@
 import org.openstreetmap.josm.data.Bounds;
 
-public class DataSource {
-	public Bounds bounds;
-	public String origin;
+public class DataSource implements Cloneable {
+	public final Bounds bounds;
+	public final String origin;
+	
+	public DataSource(Bounds bounds, String origin) {
+	    this.bounds = bounds;
+	    this.origin = origin;
+    }
+
+	@Override protected Object clone() throws CloneNotSupportedException {
+	    return new DataSource(bounds, origin);
+    }
 }
Index: /src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/Node.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/Node.java	(revision 290)
@@ -12,5 +12,5 @@
  * @author imi
  */
-public class Node extends OsmPrimitive {
+public final class Node extends OsmPrimitive {
 	
 	public LatLon coor;
Index: /src/org/openstreetmap/josm/data/osm/Segment.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/Segment.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/Segment.java	(revision 290)
@@ -9,5 +9,5 @@
  * @author imi
  */
-public class Segment extends OsmPrimitive {
+public final class Segment extends OsmPrimitive {
 
 	/**
Index: /src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/Way.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/Way.java	(revision 290)
@@ -12,5 +12,5 @@
  * @author imi
  */
-public class Way extends OsmPrimitive {
+public final class Way extends OsmPrimitive {
 
 	/**
Index: /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 289)
+++ /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 290)
@@ -36,4 +36,6 @@
 	 */
 	protected NavigatableComponent nc;
+	
+	public boolean inactive;
 
 	protected static final double PHI = Math.toRadians(20);
@@ -41,11 +43,11 @@
 	public void visitAll(DataSet data) {
 		for (final OsmPrimitive osm : data.segments)
-			if (!osm.deleted)
+			if (!osm.deleted && !osm.selected)
 				osm.visit(this);
 		for (final OsmPrimitive osm : data.ways)
-			if (!osm.deleted)
+			if (!osm.deleted && !osm.selected)
 				osm.visit(this);
 		for (final OsmPrimitive osm : data.nodes)
-			if (!osm.deleted)
+			if (!osm.deleted && !osm.selected)
 				osm.visit(this);
 		for (final OsmPrimitive osm : data.getSelected())
@@ -61,6 +63,12 @@
 	 */
 	public void visit(Node n) {
-		drawNode(n, n.selected ? getPreferencesColor("selected", Color.WHITE)
-				: getPreferencesColor("node", Color.RED));
+		Color color = null;
+		if (inactive)
+			color = getPreferencesColor("inactive", Color.DARK_GRAY);
+		else if (n.selected)
+			color = getPreferencesColor("selected", Color.WHITE);
+		else
+			color = getPreferencesColor("node", Color.RED);
+		drawNode(n, color);
 	}
 
@@ -70,5 +78,12 @@
 	 */
 	public void visit(Segment ls) {
-		drawSegment(ls, getPreferencesColor("segment", darkgreen), Main.pref.getBoolean("draw.segment.direction"));
+		Color color;
+		if (inactive)
+			color = getPreferencesColor("inactive", Color.DARK_GRAY);
+		else if (ls.selected)
+			color = getPreferencesColor("selected", Color.WHITE);
+		else
+			color = getPreferencesColor("segment", darkgreen);
+		drawSegment(ls, color, Main.pref.getBoolean("draw.segment.direction"));
 	}
 
@@ -78,10 +93,14 @@
 	 */
 	public void visit(Way w) {
-		// only to overwrite with blue
-		Color wayColor = getPreferencesColor("way", darkblue);
-		for (Segment ls : w.segments) {
-			if (ls.incomplete) {
-				wayColor = getPreferencesColor("incomplete way", darkerblue);
-				break;
+		Color wayColor;
+		if (inactive)
+			wayColor = getPreferencesColor("inactive", Color.DARK_GRAY);
+		else {
+			wayColor = getPreferencesColor("way", darkblue);
+			for (Segment ls : w.segments) {
+				if (ls.incomplete) {
+					wayColor = getPreferencesColor("incomplete way", darkerblue);
+					break;
+				}
 			}
 		}
@@ -93,5 +112,5 @@
 			orderNumber++;
 			if (!ls.selected) // selected already in good color
-				drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.WHITE) : wayColor, showDirectionArrow);
+				drawSegment(ls, w.selected && !inactive ? getPreferencesColor("selected", Color.WHITE) : wayColor, showDirectionArrow);
 			if (!ls.incomplete && showOrderNumber)
 				drawOrderNumber(ls, orderNumber);
@@ -140,6 +159,4 @@
 		if (ls.incomplete)
 			return;
-		if (ls.selected)
-			col = getPreferencesColor("selected", Color.WHITE);
 		g.setColor(col);
 		Point p1 = nc.getPoint(ls.from.eastNorth);
Index: /src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- /src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 290)
@@ -46,4 +46,9 @@
 		
 		panel = new JPanel(new GridBagLayout());
+		
+		panel.add(new JLabel("<html><h2>You are running a beta version with a brand new feature <i>multiple data layers</i>.</h2>" +
+				"<h3>This is a major change, so expect some bugs, especally with undo/redo and the merging code.<br>" +
+				"If you can't work, downgrade to josm-1.5.jar, available at http://josm.openstreetmap.org/download/josm-1.5.jar<br><br>" +
+		"Imi.</h3>"), GBC.eol());
 
 		addGettingStarted();
Index: /src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MainMenu.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/MainMenu.java	(revision 290)
@@ -3,7 +3,11 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
 import javax.swing.Action;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
 
 import org.openstreetmap.josm.actions.AboutAction;
@@ -31,4 +35,5 @@
 import org.openstreetmap.josm.actions.UploadAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.data.DataSetChecker;
 
 /**
@@ -57,6 +62,6 @@
 	public final Action reorder = new ReorderAction();
 	public final Action upload = new UploadAction();
-	public final Action save = new SaveAction();
-	public final Action saveAs = new SaveAsAction();
+	public final Action save = new SaveAction(null);
+	public final Action saveAs = new SaveAsAction(null);
 	public final Action gpxExport = new GpxExportAction(null);
 	public final Action exit = new ExitAction();
@@ -128,5 +133,11 @@
 		layerMenu.setVisible(false);
 
-		//add(Box.createHorizontalGlue());
+		JMenuItem check = new JMenuItem("DEBUG: Check Dataset");
+		check.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				DataSetChecker.check();
+            }
+		});
+		helpMenu.add(check);
 
 		helpMenu.setMnemonic('H');
Index: /src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MapView.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/MapView.java	(revision 290)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.data.coor.EastNorth;
 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.visitor.BoundingXYVisitor;
@@ -81,5 +82,5 @@
 
 		// listend to selection changes to redraw the map
-		Main.ds.listeners.add(new SelectionChangedListener(){
+		DataSet.listeners.add(new SelectionChangedListener(){
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				repaint();
@@ -102,14 +103,7 @@
 	public void addLayer(Layer layer) {
 		if (layer instanceof OsmDataLayer) {
-			final OsmDataLayer dataLayer = (OsmDataLayer)layer;
-			if (editLayer != null) {
-				editLayer.mergeFrom(layer);
-				repaint();
-				return;
-			}
-			editLayer = dataLayer;
-			dataLayer.data.listeners.addAll(Main.ds.listeners);
-			Main.ds = dataLayer.data;
-			dataLayer.listenerModified.add(new ModifiedChangedListener(){
+			editLayer = (OsmDataLayer)layer;
+			Main.ds = editLayer.data;
+			editLayer.listenerModified.add(new ModifiedChangedListener(){
 				public void modifiedChanged(boolean value, OsmDataLayer source) {
 					JOptionPane.getFrameForComponent(Main.parent).setTitle((value?"*":"")+tr("Java OpenStreetMap - Editor"));
@@ -118,9 +112,5 @@
 		}
 
-		// add as a new layer
-		if (layer instanceof OsmDataLayer)
-			layers.add(0, layer);
-		else
-			layers.add(layers.size(), layer);
+		layers.add(layers.size(), layer);
 
 		for (LayerChangeListener l : listeners)
@@ -176,7 +166,9 @@
 		for (int i = layers.size()-1; i >= 0; --i) {
 			Layer l = layers.get(i);
-			if (l.visible)
+			if (l.visible && l != getActiveLayer())
 				l.paint(g, this);
 		}
+		if (getActiveLayer().visible)
+			getActiveLayer().paint(g, this);
 
 		// draw world borders
@@ -261,4 +253,9 @@
 		if (!layers.contains(layer))
 			throw new IllegalArgumentException("Layer must be in layerlist");
+		if (layer instanceof OsmDataLayer) {
+			editLayer = (OsmDataLayer)layer;
+			Main.ds = editLayer.data;
+			DataSet.fireSelectionChanged(Main.ds.getSelected());
+		}
 		Layer old = activeLayer;
 		activeLayer = layer;
@@ -266,4 +263,5 @@
 			for (LayerChangeListener l : listeners)
 				l.activeLayerChange(old, layer);
+		repaint();
 	}
 
Index: /src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 290)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.command.ConflictResolveCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -86,5 +87,5 @@
 		add(buttonPanel, BorderLayout.SOUTH);
 
-		Main.ds.listeners.add(new SelectionChangedListener(){
+		DataSet.listeners.add(new SelectionChangedListener(){
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				displaylist.clearSelection();
Index: /src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 290)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.tools.GBC;
@@ -141,20 +142,19 @@
 		revertButton.setToolTipText(tr("Revert the state of all currently selected objects to the version selected in the history list."));
 		revertButton.putClientProperty("help", "Dialog/History/Revert");
+		
+		DataSet.listeners.add(this);
 	}
 
 
 	@Override public void setVisible(boolean b) {
-		if (b) {
-			Main.ds.listeners.add(this);
-			selectionChanged(Main.ds.getSelected());
-		} else {
-			Main.ds.listeners.remove(this);
-		}
 		super.setVisible(b);
+		if (b)
+			update();
 	}
 
 
 	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-		update();
+		if (isVisible())
+			update();
 	}
 
Index: /src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 290)
@@ -75,4 +75,6 @@
 			if (instance.getSelectedValue() == null)
 				instance.setSelectedIndex(sel);
+			if (Main.map != null)
+				Main.map.mapView.setActiveLayer((Layer)instance.getSelectedValue());
 		}
 	}
Index: /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 290)
@@ -45,4 +45,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -346,4 +347,6 @@
 		buttonPanel.add(createButton(marktr("Delete"),tr("Delete the selected key in all objects"), KeyEvent.VK_D, buttonAction));
 		add(buttonPanel, BorderLayout.SOUTH);
+
+		DataSet.listeners.add(this);
 	}
 
@@ -359,14 +362,12 @@
 
 	@Override public void setVisible(boolean b) {
-		if (b) {
-			Main.ds.listeners.add(this);
+		super.setVisible(b);
+		if (b)
 			selectionChanged(Main.ds.getSelected());
-		} else {
-			Main.ds.listeners.remove(this);
-		}
-		super.setVisible(b);
 	}
 
 	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		if (!isVisible())
+			return;
 		if (propertyTable == null)
 			return; // selection changed may be received in base class constructor before init
Index: /src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 290)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
@@ -77,4 +78,6 @@
 		add(buttonPanel, BorderLayout.SOUTH);
 		selectionChanged(Main.ds.getSelected());
+
+		DataSet.listeners.add(this);
 	}
 
@@ -88,13 +91,8 @@
 
 	@Override public void setVisible(boolean b) {
-		if (b) {
-			Main.ds.listeners.add(this);
+		super.setVisible(b);
+		if (b)
 			selectionChanged(Main.ds.getSelected());
-		} else {
-			Main.ds.listeners.remove(this);
-		}
-		super.setVisible(b);
 	}
-
 
 
@@ -106,4 +104,6 @@
 		if (list == null)
 			return; // selection changed may be received in base class constructor before init
+		if (!isVisible())
+			return;
 		OsmPrimitive[] selArr = new OsmPrimitive[newSelection.size()];
 		selArr = newSelection.toArray(selArr);
Index: /src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 290)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
@@ -51,14 +52,12 @@
 		add(new JScrollPane(userTable), BorderLayout.CENTER);
 		selectionChanged(Main.ds.getSelected());
+		
+		DataSet.listeners.add(this);
 	}
 
 	@Override public void setVisible(boolean b) {
-		if (b) {
-			Main.ds.listeners.add(this);
+		super.setVisible(b);
+		if (b)
 			selectionChanged(Main.ds.getSelected());
-		} else {
-			Main.ds.listeners.remove(this);
-		}
-		super.setVisible(b);
 	}
 
@@ -68,4 +67,6 @@
 	 */
 	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		if (!isVisible())
+			return;
 		
 		class UserCount {
Index: /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 290)
@@ -260,5 +260,5 @@
 
 	@Override public Icon getIcon() {
-		return ImageProvider.get("layer", "tagimages");
+		return ImageProvider.get("layer", "tagimages_small");
 	}
 
Index: /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 290)
@@ -135,5 +135,5 @@
 	 */
 	@Override public Icon getIcon() {
-		return ImageProvider.get("layer", "osmdata");
+		return ImageProvider.get("layer", "osmdata_small");
 	}
 
@@ -144,4 +144,5 @@
 	 */
 	@Override public void paint(final Graphics g, final MapView mv) {
+		boolean inactive = Main.map.mapView.getActiveLayer() != this && Main.pref.getBoolean("draw.data.inactive_color", true);
 		if (Main.pref.getBoolean("draw.data.downloaded_area", false)) {
 			// FIXME this is inefficient; instead a proper polygon has to be built, and instead
@@ -153,5 +154,7 @@
 					Point p1 = mv.getPoint(en1);
 					Point p2 = mv.getPoint(en2);
-					g.setColor(SimplePaintVisitor.getPreferencesColor("downloaded Area", Color.YELLOW));
+					Color color = inactive ? SimplePaintVisitor.getPreferencesColor("inactive", Color.DARK_GRAY) :
+							SimplePaintVisitor.getPreferencesColor("downloaded Area", Color.YELLOW);
+					g.setColor(color);
 					g.drawRect(Math.min(p1.x,p2.x), Math.min(p1.y, p2.y), Math.abs(p2.x-p1.x), Math.abs(p2.y-p1.y));
 				}
@@ -160,4 +163,5 @@
 		mapPainter.setGraphics(g);
 		mapPainter.setNavigatableComponent(mv);
+		mapPainter.inactive = inactive;
 		mapPainter.visitAll(data);
 		Main.map.conflictDialog.paintConflicts(g, mv);
@@ -357,6 +361,6 @@
 				new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
 				new JSeparator(),
-				new JMenuItem(new SaveAction()),
-				new JMenuItem(new SaveAsAction()),
+				new JMenuItem(new SaveAction(this)),
+				new JMenuItem(new SaveAsAction(this)),
 				new JMenuItem(new GpxExportAction(this)),
 				new JSeparator(),
Index: /src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 290)
@@ -83,5 +83,5 @@
 				ds.ways.add(w);
 			}
-			Main.main.addLayer(new OsmDataLayer(ds, tr("Data Layer"), null));
+			Main.main.addLayer(new OsmDataLayer(ds, tr("Converted from: {0}", RawGpsLayer.this.name), null));
 			Main.main.removeLayer(RawGpsLayer.this);
 		}
@@ -115,5 +115,5 @@
 	 */
 	@Override public Icon getIcon() {
-		return ImageProvider.get("layer", "rawgps");
+		return ImageProvider.get("layer", "rawgps_small");
 	}
 
Index: /src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 290)
@@ -98,5 +98,5 @@
 	 */
 	@Override public Icon getIcon() {
-		return ImageProvider.get("layer", "marker");
+		return ImageProvider.get("layer", "marker_small");
 	}
 
Index: /src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- /src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 289)
+++ /src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 290)
@@ -19,4 +19,5 @@
 	private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
 	private JCheckBox sourceBounds = new JCheckBox(tr("Draw boundaries of downloaded data"));
+	private JCheckBox inactive = new JCheckBox(tr("Draw inactive layers in other color"));
 
 	public void addGui(PreferenceDialog gui) {
@@ -58,4 +59,9 @@
 		sourceBounds.setSelected(Main.pref.getBoolean("draw.data.downloaded_area", true));
 		gui.display.add(sourceBounds, GBC.eop().insets(20,0,0,0));
+		
+		// background layers in inactive color
+		inactive.setToolTipText(tr("Draw the inactive data layers in a different color."));
+		inactive.setSelected(Main.pref.getBoolean("draw.data.inactive_color", true));
+		gui.display.add(inactive, GBC.eop().insets(20,0,0,0));
 	}
 
@@ -67,4 +73,5 @@
 		Main.pref.put("draw.segment.order_number", segmentOrderNumber.isSelected());
 		Main.pref.put("draw.data.downloaded_area", sourceBounds.isSelected());
+		Main.pref.put("draw.data.inactive_color", inactive.isSelected());
     }
 }
Index: /src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- /src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 289)
+++ /src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 290)
@@ -102,7 +102,7 @@
     		Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
     		final DataSet data = OsmReader.parseDataSet(in, null, Main.pleaseWaitDlg);
-    		DataSource src = new DataSource();
-    		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));
+    		String origin = Main.pref.get("osm-server.url")+"/"+Main.pref.get("osm-server.version", "0.4");
+    		Bounds bounds = new Bounds(new LatLon(lat1, lon1), new LatLon(lat2, lon2));
+			DataSource src = new DataSource(bounds, origin);
     		data.dataSources.add(src);
     		in.close();
Index: /src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmReader.java	(revision 289)
+++ /src/org/openstreetmap/josm/io/OsmReader.java	(revision 290)
@@ -119,12 +119,11 @@
 					String origin = atts.getValue("origin");
 					if (bbox != null) {
-						DataSource src = new DataSource();
 						String[] b = bbox.split(",");
+						Bounds bounds = null;
 						if (b.length == 4)
-							src.bounds = new Bounds(
+							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;
+						DataSource src = new DataSource(bounds, origin);
 						ds.dataSources.add(src);
 					}
@@ -246,5 +245,5 @@
 	    for (Node node : Main.ds.nodes)
 	    	if (node.id == id)
-	    		return node;
+	    		return new Node(node);
 	    return null;
     }
@@ -260,5 +259,5 @@
 		for (Segment seg : Main.ds.segments)
 			if (seg.id == id)
-				return seg;
+				return new Segment(seg);
 		return null;
 	}
@@ -288,6 +287,6 @@
 	 * Parse the given input source and return the dataset.
 	 * @param ref The dataset that is search in for references first. If
-	 * 	the Reference is not found here, Main.ds is searched.
-	 * TODO: This has to be changed to support multiple layers.
+	 * 	the Reference is not found here, Main.ds is searched and a copy of the
+	 *  elemet found there is returned.
 	 */
 	public static DataSet parseDataSet(InputStream source, DataSet ref, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
Index: /test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java
===================================================================
--- /test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java	(revision 289)
+++ /test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java	(revision 290)
@@ -87,22 +87,10 @@
 	public void testFireSelectionChanged() {
 		TestSelectionChangeListener l = new TestSelectionChangeListener();
-		ds.listeners.add(l);
+		DataSet.listeners.add(l);
 		ds.setSelected(segment);
 		assertNotNull(l.called);
 		assertEquals(1, l.called.size());
 		assertSame(segment, l.called.iterator().next());
-	}
-
-	public void testAddAllSelectionListener() {
-		DataSet ds2 = new DataSet();
-		TestSelectionChangeListener l1 = new TestSelectionChangeListener();
-		TestSelectionChangeListener l2 = new TestSelectionChangeListener();
-		ds2.listeners.add(l1);
-		ds2.listeners.add(l2);
-		ds.listeners.addAll(ds2.listeners);
-		ds2.listeners.remove(l1);
-		ds.setSelected(node2);
-		assertNotNull(l1.called);
-		assertNotNull(l2.called);
+		DataSet.listeners.remove(l);
 	}
 }
