Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 294)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 295)
@@ -34,5 +34,5 @@
 
 	public void actionPerformed(ActionEvent e) {
-		dialog = new DownloadDialog(Integer.parseInt(Main.pref.get("download.tab", "0")));
+		dialog = new DownloadDialog();
 		
 		JPanel downPanel = new JPanel(new GridBagLayout());
@@ -50,4 +50,5 @@
         while (!finish) {
             dlg.setVisible(true);
+            Main.pref.put("download.newlayer", dialog.newLayer.isSelected());
         	if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION) {
         		Main.pref.put("download.tab", Integer.toString(dialog.getSelectedTab()));
Index: src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenAction.java	(revision 294)
+++ src/org/openstreetmap/josm/actions/OpenAction.java	(revision 295)
@@ -102,5 +102,5 @@
 	    	throw new IllegalStateException();
 	    if (gpsData != null && !gpsData.isEmpty())
-	    	Main.main.addLayer(new RawGpsLayer(gpsData, tr("Tracks from {0}", file.getName()), file));
+	    	Main.main.addLayer(new RawGpsLayer(false, 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 294)
+++ src/org/openstreetmap/josm/actions/SaveAction.java	(revision 295)
@@ -24,5 +24,5 @@
 	}
 	
-	public File getFile(OsmDataLayer layer) {
+	@Override public File getFile(OsmDataLayer layer) {
 		if (layer.associatedFile != null)
 			return layer.associatedFile;
Index: src/org/openstreetmap/josm/actions/SaveAsAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 294)
+++ src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 295)
@@ -24,5 +24,5 @@
 	}
 	
-	protected File getFile(OsmDataLayer layer) {
+	@Override protected File getFile(OsmDataLayer layer) {
 		return openFileDialog();
 	}
Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 294)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 295)
@@ -12,4 +12,5 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.RawGpsLayer;
 import org.openstreetmap.josm.gui.layer.RawGpsLayer.GpsPoint;
@@ -23,9 +24,11 @@
 		private DownloadAction action;
 		private Collection<Collection<GpsPoint>> rawData;
+		private final boolean newLayer;
 
-		public Task(BoundingBoxDownloader reader, DownloadAction action) {
+		public Task(boolean newLayer, BoundingBoxDownloader reader, DownloadAction action) {
 			super(tr("Downloading GPS data"));
 			this.reader = reader;
 			this.action = action;
+			this.newLayer = newLayer;
 		}
 
@@ -38,6 +41,22 @@
 				return;
 			String name = action.dialog.minlat + " " + action.dialog.minlon + " x " + action.dialog.maxlat + " " + action.dialog.maxlon;
-			Main.main.addLayer(new RawGpsLayer(rawData, name, null));
+			RawGpsLayer layer = new RawGpsLayer(true, rawData, name, null);
+			if (newLayer || findMergeLayer() == null)
+	            Main.main.addLayer(layer);
+			else
+				findMergeLayer().mergeFrom(layer);
 		}
+
+		private Layer findMergeLayer() {
+			if (Main.map == null)
+				return null;
+	        Layer active = Main.map.mapView.getActiveLayer();
+	        if (active != null && active instanceof RawGpsLayer)
+	        	return active;
+	        for (Layer l : Main.map.mapView.getAllLayers())
+	        	if (l instanceof RawGpsLayer && ((RawGpsLayer)l).fromServer)
+	        		return l;
+	        return null;
+        }
 
 		@Override protected void cancel() {
@@ -50,5 +69,5 @@
 
 	public void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon) {
-		Task task = new Task(new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon), action);
+		Task task = new Task(action.dialog.newLayer.isSelected(), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon), action);
 		Main.worker.execute(task);
 	}
Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 294)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 295)
@@ -25,8 +25,10 @@
 		private BoundingBoxDownloader reader;
 		private DataSet dataSet;
+		private boolean newLayer;
 
-		public Task(BoundingBoxDownloader reader) {
+		public Task(boolean newLayer, BoundingBoxDownloader reader) {
 			super(tr("Downloading data"));
 			this.reader = reader;
+			this.newLayer = newLayer;
 		}
 
@@ -40,5 +42,9 @@
 			if (dataSet.allPrimitives().isEmpty())
 				errorMessage = tr("No data imported.");
-			Main.main.addLayer(new OsmDataLayer(dataSet, tr("Data Layer"), null));
+			OsmDataLayer layer = new OsmDataLayer(dataSet, tr("Data Layer"), null);
+			if (newLayer)
+				Main.main.addLayer(layer);
+			else
+				Main.main.editLayer().mergeFrom(layer);
 		}
 
@@ -51,5 +57,5 @@
 
 	public void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon) {
-		Task task = new Task(new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
+		Task task = new Task(action.dialog.newLayer.isSelected(), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
 		Main.worker.execute(task);
     }
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 294)
+++ src/org/openstreetmap/josm/data/Preferences.java	(revision 295)
@@ -1,7 +1,4 @@
 package org.openstreetmap.josm.data;
 
-import static org.xnap.commons.i18n.I18n.marktr;
-
-import java.awt.Color;
 import java.io.BufferedReader;
 import java.io.File;
@@ -20,6 +17,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
-import org.openstreetmap.josm.tools.ColorHelper;
 
 
@@ -181,13 +176,4 @@
 		properties.put("propertiesdialog.visible", "true");
 		properties.put("osm-server.url", "http://www.openstreetmap.org/api");
-		properties.put("color."+marktr("background"), ColorHelper.color2html(Color.black));
-		properties.put("color."+marktr("node"), ColorHelper.color2html(Color.red));
-		properties.put("color."+marktr("segment"), ColorHelper.color2html(SimplePaintVisitor.darkgreen));
-		properties.put("color."+marktr("way"), ColorHelper.color2html(SimplePaintVisitor.darkblue));
-		properties.put("color."+marktr("incomplete way"), ColorHelper.color2html(SimplePaintVisitor.darkerblue));
-		properties.put("color."+marktr("selected"), ColorHelper.color2html(Color.white));
-		properties.put("color."+marktr("gps point"), ColorHelper.color2html(Color.gray));
-		properties.put("color."+marktr("conflict"), ColorHelper.color2html(Color.gray));
-		properties.put("color."+marktr("scale"), ColorHelper.color2html(Color.white));
 		save();
 	}
Index: src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 294)
+++ src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 295)
@@ -57,4 +57,6 @@
 
 	public final List<DownloadSelection> downloadSelections = new ArrayList<DownloadSelection>();
+	public final JTabbedPane tabpane = new JTabbedPane();
+	public final JCheckBox newLayer;
 	
 	public double minlon;
@@ -63,7 +65,6 @@
 	public double maxlat;
 	
-	public JTabbedPane tabpane = new JTabbedPane();
 	
-	public DownloadDialog(int tabindex) {
+	public DownloadDialog() {
 		setLayout(new GridBagLayout());
 		
@@ -103,16 +104,16 @@
 			boundingBoxChanged(null);
 		}
-		
+
+		newLayer = new JCheckBox(tr("Download as new layer"), Main.pref.getBoolean("download.newlayer", true));
+		add(newLayer, GBC.eol().insets(0,5,0,0));
+
 		add(new JLabel(tr("Download Area")), GBC.eol().insets(0,5,0,0));
 		add(tabpane, GBC.eol().fill());
 		
 		try {
-			tabpane.setSelectedIndex(tabindex);
+			tabpane.setSelectedIndex(Integer.parseInt(Main.pref.get("download.tab", "0")));
 		} catch (Exception ex) {
-			// ignore
+			Main.pref.put("download.tab", "0");
 		}
-		//Dimension d = getPreferredSize();
-		//setPreferredSize(new Dimension((int)(d.width*1.5), d.height));
-		//wc.addInputFields(latlon, osmUrl, osmUrlRefresher);
 	}
 	
Index: src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 294)
+++ src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 295)
@@ -103,7 +103,9 @@
 	 */
 	public final Collection<Collection<GpsPoint>> data;
-
-	public RawGpsLayer(Collection<Collection<GpsPoint>> data, String name, File associatedFile) {
+	public final boolean fromServer;
+
+	public RawGpsLayer(boolean fromServer, Collection<Collection<GpsPoint>> data, String name, File associatedFile) {
 		super(name);
+		this.fromServer = fromServer;
 		this.associatedFile = associatedFile;
 		this.data = data;
Index: src/org/openstreetmap/josm/gui/preferences/ColorPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 294)
+++ src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 295)
@@ -2,4 +2,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.xnap.commons.i18n.I18n.marktr;
 
 import java.awt.Color;
@@ -27,4 +28,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
@@ -34,6 +36,5 @@
 	private DefaultTableModel tableModel;
 	private JTable colors;
-	public static final String PREF_COLOR_PREFIX = "color.";
-	
+
 	/**
 	 * Set the colors to be shown in the preference table. This method creates a table model if
@@ -89,8 +90,9 @@
 	public void addGui(final PreferenceDialog gui) {
 		// initial fill with colors from preferences:
-		Map<String,String> prefColorMap = new TreeMap<String, String>(Main.pref.getAllPrefix(PREF_COLOR_PREFIX));
+		Map<String,String> prefColorMap = new TreeMap<String, String>(Main.pref.getAllPrefix("color."));
+		fixColorPrefixes(prefColorMap);
 		Map<String,String> colorMap = new TreeMap<String, String>();
 		for(String key : prefColorMap.keySet()) {
-			colorMap.put(key.substring(PREF_COLOR_PREFIX.length()), prefColorMap.get(key));
+			colorMap.put(key.substring("color.".length()), prefColorMap.get(key));
 		}
 		setColorModel(colorMap);
@@ -137,9 +139,30 @@
     }
 
+	/**
+	 * Add all missing color entries.
+	 */
+	private void fixColorPrefixes(Map<String, String> prefColorMap) {
+		String[] cp = {
+			marktr("background"), ColorHelper.color2html(Color.black),
+			marktr("node"), ColorHelper.color2html(Color.red),
+			marktr("segment"), ColorHelper.color2html(SimplePaintVisitor.darkgreen),
+			marktr("way"), ColorHelper.color2html(SimplePaintVisitor.darkblue),
+			marktr("incomplete way"), ColorHelper.color2html(SimplePaintVisitor.darkerblue),
+			marktr("selected"), ColorHelper.color2html(Color.white),
+			marktr("gps point"), ColorHelper.color2html(Color.gray),
+			marktr("conflict"), ColorHelper.color2html(Color.gray),
+			marktr("scale"), ColorHelper.color2html(Color.white),
+			marktr("inactive"), ColorHelper.color2html(Color.darkGray),
+		};
+		for (int i = 0; i < cp.length/2; ++i)
+			if (!Main.pref.hasKey("color."+cp[i*2]))
+				Main.pref.put("color."+cp[i*2], cp[i*2+1]);
+    }
+
 	public void ok() {
 		for (int i = 0; i < colors.getRowCount(); ++i) {
 			String name = (String)colors.getValueAt(i, 0);
 			Color col = (Color)colors.getValueAt(i, 1);
-			Main.pref.put(PREF_COLOR_PREFIX + name, ColorHelper.color2html(col));
+			Main.pref.put("color." + name, ColorHelper.color2html(col));
 		}
     }
