Index: /src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 27)
+++ /src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 28)
@@ -218,4 +218,5 @@
 	public void clearSelection() {
 		clearSelection(nodes);
+		clearSelection(pendingLineSegments);
 		clearSelection(tracks);
 		for (Track t : tracks)
@@ -242,12 +243,12 @@
 	 * to both datasets. So use mergeFrom only if you are about to abandon the
 	 * other dataset.
-	 * 
+	 *
 	 * Elements are tried to merged. 
 	 * Nodes are merged first, if their lat/lon are equal.
 	 * Line segments are merged, if they have the same nodes.
-	 * Tracs are merged, if they consist of the same line segments.
-	 * 
+	 * Tracks are merged, if they consist of the same line segments.
+	 *
 	 * Additional to that, every two objects with the same id are merged.
-	 * 
+	 *
 	 * @param ds	The DataSet to merge into this one.
 	 * @return A list of all primitives that were used in the conjunction. That
@@ -304,4 +305,5 @@
 					lsMap.put(otherLS, myLS);
 		// add pendings (ls from track are added later
+		data.addAll(new HashSet<LineSegment>(lsMap.values()));
 		for (LineSegment ls : ds.pendingLineSegments) {
 			if (!lsMap.containsKey(ls)) {
@@ -318,6 +320,6 @@
 			}
 		}
-		
-		
+
+
 		// merge tracks
 		LinkedList<Track> trackToAdd = new LinkedList<Track>();
Index: /src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 27)
+++ /src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 28)
@@ -84,3 +84,26 @@
 		return selected;
 	}
+
+
+	/**
+	 * Equal, if the id is equal. If both ids are 0, use the super classes equal
+	 * instead.
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (!(obj instanceof OsmPrimitive))
+			return false;
+		OsmPrimitive osm = (OsmPrimitive)obj;
+		if (id == 0 && osm.id == 0)
+			return super.equals(obj);
+		return id == osm.id;
+	}
+
+	/**
+	 * Return the id as hashcode or supers hashcode if 0.
+	 */
+	@Override
+	public int hashCode() {
+		return id == 0 ? super.hashCode() : (int)id;
+	}
 }
Index: /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 27)
+++ /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 28)
@@ -108,10 +108,13 @@
 			}
 		});
+		String oldComboEntry = combo.getEditor().getItem().toString();
 		dlg.setVisible(true);
 
 		Object answer = optionPane.getValue();
 		if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE ||
-				(answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION))
+				(answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) {
+			combo.getEditor().setItem(oldComboEntry);
 			return;
+		}
 
 		String value = combo.getEditor().getItem().toString();
Index: /src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmReader.java	(revision 27)
+++ /src/org/openstreetmap/josm/io/OsmReader.java	(revision 28)
@@ -96,5 +96,5 @@
 					String token = t.nextToken();
 					if (!" ".equals(token))
-						data.keys.put(Key.get(t.nextToken()), "yes");
+						data.keys.put(Key.get(token), "yes");
 				}
 			}
@@ -114,8 +114,18 @@
 			if (child.getName().equals("node"))
 				addNode(data, parseNode(child));
-			else if (child.getName().equals("segment"))
-				data.pendingLineSegments.add(parseLineSegment(child, data));
-			else if (child.getName().equals("track"))
-				data.tracks.add(parseTrack(child, data));
+			else if (child.getName().equals("segment")) {
+				LineSegment ls = parseLineSegment(child, data);
+				if (data.pendingLineSegments.contains(ls))
+					throw new JDOMException("Double segment definition "+ls.id);
+				for (Track t : data.tracks)
+					if (t.segments.contains(ls))
+						throw new JDOMException("Double segment definition "+ls.id);
+				data.pendingLineSegments.add(ls);
+			} else if (child.getName().equals("track")) {
+				Track track = parseTrack(child, data);
+				if (data.tracks.contains(track))
+					throw new JDOMException("Double track definition "+track.id);
+				data.tracks.add(track);
+			}
 		}
 
