Index: /src/org/openstreetmap/josm/Main.java
===================================================================
--- /src/org/openstreetmap/josm/Main.java	(revision 28)
+++ /src/org/openstreetmap/josm/Main.java	(revision 29)
@@ -16,9 +16,10 @@
 import org.openstreetmap.josm.actions.AboutAction;
 import org.openstreetmap.josm.actions.ExitAction;
-import org.openstreetmap.josm.actions.OpenGpxAction;
+import org.openstreetmap.josm.actions.OpenAction;
 import org.openstreetmap.josm.actions.OpenOsmServerAction;
 import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.SaveGpxAction;
+import org.openstreetmap.josm.actions.UndoAction;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.Preferences.PreferencesException;
@@ -76,8 +77,9 @@
 		// creating actions
 		OpenOsmServerAction openServerAction = new OpenOsmServerAction();
-		OpenGpxAction openGpxAction = new OpenGpxAction();
+		OpenAction openAction = new OpenAction();
 		SaveAction saveAction = new SaveAction();
 		SaveGpxAction saveGpxAction = new SaveGpxAction();
 		ExitAction exitAction = new ExitAction();
+		UndoAction undoAction = new UndoAction();
 		PreferencesAction preferencesAction = new PreferencesAction();
 		AboutAction aboutAction = new AboutAction();
@@ -89,5 +91,5 @@
 		JMenu fileMenu = new JMenu("Files");
 		fileMenu.setMnemonic('F');
-		fileMenu.add(openGpxAction);
+		fileMenu.add(openAction);
 		fileMenu.add(saveAction);
 		fileMenu.add(saveGpxAction);
@@ -95,4 +97,5 @@
 		fileMenu.add(exitAction);
 		mainMenu.add(fileMenu);
+
 		
 		JMenu connectionMenu = new JMenu("Connection");
@@ -103,4 +106,6 @@
 		JMenu editMenu = new JMenu("Edit");
 		editMenu.setMnemonic('E');
+		//editMenu.add(undoAction);
+		editMenu.addSeparator();
 		editMenu.add(preferencesAction);
 		mainMenu.add(editMenu);
@@ -116,7 +121,9 @@
 		toolBar.setFloatable(false);
 		toolBar.add(openServerAction);
-		toolBar.add(openGpxAction);
+		toolBar.add(openAction);
 		toolBar.add(saveAction);
 		toolBar.add(saveGpxAction);
+		toolBar.addSeparator();
+		//toolBar.add(undoAction);
 		toolBar.addSeparator();
 		toolBar.add(preferencesAction);
Index: /src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/OpenAction.java	(revision 29)
+++ /src/org/openstreetmap/josm/actions/OpenAction.java	(revision 29)
@@ -0,0 +1,118 @@
+package org.openstreetmap.josm.actions;
+
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Collection;
+
+import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+
+import org.jdom.JDOMException;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.GeoPoint;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.GBC;
+import org.openstreetmap.josm.gui.ImageProvider;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.RawGpsDataLayer;
+import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.io.RawGpsReader;
+
+/**
+ * Open a file chooser dialog and select an file to import. Than call the gpx-import
+ * driver. Finally open an internal frame into the main window with the gpx data shown.
+ * 
+ * @author imi
+ */
+public class OpenAction extends AbstractAction {
+
+	/**
+	 * Create an open action. The name is "Open GPX".
+	 */
+	public OpenAction() {
+		super("Open", ImageProvider.get("open"));
+		putValue(ACCELERATOR_KEY, KeyStroke.getAWTKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
+		putValue(MNEMONIC_KEY, KeyEvent.VK_O);
+		putValue(SHORT_DESCRIPTION, "Open a file.");
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		JFileChooser fc = new JFileChooser("data");
+		fc.setFileFilter(new FileFilter(){
+			@Override
+			public boolean accept(File f) {
+				String name = f.getName().toLowerCase();
+				return f.isDirectory() || name.endsWith(".gpx") || name.endsWith(".xml");
+			}
+			@Override
+			public String getDescription() {
+				return "GPX or XML Files";
+			}});
+		
+		// additional options
+		JCheckBox rawGps = new JCheckBox("Raw GPS data", true);
+		rawGps.setToolTipText("Check this, if the data were obtained from a gps device.");
+		JCheckBox newLayer = new JCheckBox("As Layer", true); 
+		newLayer.setToolTipText("Open as a new layer or replace all current layers.");
+		if (Main.main.getMapFrame() == null) {
+			newLayer.setEnabled(false);
+			newLayer.setSelected(false);
+		}
+		
+		JPanel p = new JPanel(new GridBagLayout());
+		p.add(new JLabel("Options"), GBC.eop());
+		p.add(rawGps, GBC.eol());
+		p.add(newLayer, GBC.eol());
+		p.add(Box.createVerticalGlue(), GBC.eol().fill());
+		fc.setAccessory(p);
+
+		if (fc.showOpenDialog(Main.main) != JFileChooser.APPROVE_OPTION)
+			return;
+		
+		File filename = fc.getSelectedFile();
+		if (filename == null)
+			return;
+
+		try {
+			Layer layer;
+			if (rawGps.isSelected()) {
+				Collection<Collection<GeoPoint>> data = new RawGpsReader(new FileReader(filename)).parse();
+				layer = new RawGpsDataLayer(data, filename.getName());
+			} else {
+				DataSet dataSet = filename.getName().toLowerCase().endsWith("gpx") ?
+						new GpxReader(new FileReader(filename)).parse() :
+						new OsmReader(new FileReader(filename)).parse();
+				Collection<OsmPrimitive> l = Main.main.ds.mergeFrom(dataSet);
+				layer = new OsmDataLayer(l, filename.getName());
+			}
+			
+			if (Main.main.getMapFrame() == null || !newLayer.isSelected())
+				Main.main.setMapFrame(filename.getName(), new MapFrame(layer));
+			else
+				Main.main.getMapFrame().mapView.addLayer(layer);
+
+		} catch (JDOMException x) {
+			x.printStackTrace();
+			JOptionPane.showMessageDialog(Main.main, x.getMessage());
+		} catch (IOException x) {
+			x.printStackTrace();
+			JOptionPane.showMessageDialog(Main.main, "Could not read '"+filename.getName()+"'\n"+x.getMessage());
+		}
+	}
+}
Index: c/org/openstreetmap/josm/actions/OpenGpxAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/OpenGpxAction.java	(revision 28)
+++ 	(revision )
@@ -1,116 +1,0 @@
-package org.openstreetmap.josm.actions;
-
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Collection;
-
-import javax.swing.AbstractAction;
-import javax.swing.Box;
-import javax.swing.JCheckBox;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-import javax.swing.filechooser.FileFilter;
-
-import org.jdom.JDOMException;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.GeoPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.GBC;
-import org.openstreetmap.josm.gui.ImageProvider;
-import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.RawGpsDataLayer;
-import org.openstreetmap.josm.io.GpxReader;
-import org.openstreetmap.josm.io.RawGpsReader;
-
-/**
- * Open a file chooser dialog and select an file to import. Than call the gpx-import
- * driver. Finally open an internal frame into the main window with the gpx data shown.
- * 
- * @author imi
- */
-public class OpenGpxAction extends AbstractAction {
-
-	/**
-	 * Create an open action. The name is "Open GPX".
-	 */
-	public OpenGpxAction() {
-		super("Open GPX", ImageProvider.get("opengpx"));
-		putValue(ACCELERATOR_KEY, KeyStroke.getAWTKeyStroke(KeyEvent.VK_O, 
-				InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
-		putValue(MNEMONIC_KEY, KeyEvent.VK_O);
-		putValue(SHORT_DESCRIPTION, "Open a file in GPX format.");
-	}
-
-	public void actionPerformed(ActionEvent e) {
-		JFileChooser fc = new JFileChooser("data");
-		fc.setFileFilter(new FileFilter(){
-			@Override
-			public boolean accept(File f) {
-				String name = f.getName().toLowerCase();
-				return f.isDirectory() || name.endsWith(".gpx") || name.endsWith(".xml");
-			}
-			@Override
-			public String getDescription() {
-				return "GPX or XML Files";
-			}});
-		
-		// additional options
-		JCheckBox rawGps = new JCheckBox("Raw GPS data", true);
-		rawGps.setToolTipText("Check this, if the data are obtained from a gps device.");
-		JCheckBox newLayer = new JCheckBox("As Layer", true); 
-		newLayer.setToolTipText("Open as a new layer or replace all current layers.");
-		if (Main.main.getMapFrame() == null) {
-			newLayer.setEnabled(false);
-			newLayer.setSelected(false);
-		}
-		
-		JPanel p = new JPanel(new GridBagLayout());
-		p.add(new JLabel("Options"), GBC.eop());
-		p.add(rawGps, GBC.eol());
-		p.add(newLayer, GBC.eol());
-		p.add(Box.createVerticalGlue(), GBC.eol().fill());
-		fc.setAccessory(p);
-
-		if (fc.showOpenDialog(Main.main) != JFileChooser.APPROVE_OPTION)
-			return;
-		
-		File gpxFile = fc.getSelectedFile();
-		if (gpxFile == null)
-			return;
-		
-		try {
-			Layer layer;
-			if (rawGps.isSelected()) {
-				Collection<Collection<GeoPoint>> data = new RawGpsReader(new FileReader(gpxFile)).parse();
-				layer = new RawGpsDataLayer(data, gpxFile.getName());
-			} else {
-				DataSet dataSet = new GpxReader(new FileReader(gpxFile)).parse();
-				Collection<OsmPrimitive> l = Main.main.ds.mergeFrom(dataSet);
-				layer = new OsmDataLayer(l, gpxFile.getName());
-			}
-			
-			if (Main.main.getMapFrame() == null || !newLayer.isSelected())
-				Main.main.setMapFrame(gpxFile.getName(), new MapFrame(layer));
-			else
-				Main.main.getMapFrame().mapView.addLayer(layer);
-			
-		} catch (JDOMException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, x.getMessage());
-		} catch (IOException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, "Could not read '"+gpxFile.getName()+"'\n"+x.getMessage());
-		}
-	}
-}
Index: /src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/UndoAction.java	(revision 29)
+++ /src/org/openstreetmap/josm/actions/UndoAction.java	(revision 29)
@@ -0,0 +1,43 @@
+package org.openstreetmap.josm.actions;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.util.LinkedList;
+
+import javax.swing.AbstractAction;
+import javax.swing.KeyStroke;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.gui.ImageProvider;
+
+
+/**
+ * Undoes the last command.
+ * 
+ * @author imi
+ */
+public class UndoAction extends AbstractAction {
+
+	/**
+	 * Construct the action with "Undo" as label.
+	 */
+	public UndoAction() {
+		super("Undo", ImageProvider.get("undo"));
+		putValue(ACCELERATOR_KEY, KeyStroke.getAWTKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK));
+		putValue(SHORT_DESCRIPTION, "Undo the last action.");
+	}
+	
+	public void actionPerformed(ActionEvent e) {
+		if (Main.main.getMapFrame() == null)
+			return;
+		LinkedList<Command> commands = Main.main.getMapFrame().mapView.editLayer().commands;
+		if (commands.isEmpty())
+			return;
+		Command c = commands.getLast();
+		//c.undoCommand();
+		commands.removeLast();
+		Main.main.getMapFrame().repaint();
+	}
+}
Index: /src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MapView.java	(revision 28)
+++ /src/org/openstreetmap/josm/gui/MapView.java	(revision 29)
@@ -141,4 +141,6 @@
 			for (LayerChangeListener l : listeners)
 				l.layerRemoved(layer);
+		if (layer == editLayer)
+			editLayer = null;
 	}
 
Index: /src/org/openstreetmap/josm/gui/dialogs/LayerList.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 28)
+++ /src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 29)
@@ -24,4 +24,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.ImageProvider;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -154,4 +155,5 @@
 				if (model.size() == 1) {
 					Main.main.setMapFrame(null, null);
+					Main.main.ds = new DataSet();
 				} else {
 					int sel = layers.getSelectedIndex();
Index: /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 28)
+++ /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 29)
@@ -13,4 +13,5 @@
 import java.awt.event.WindowFocusListener;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.TreeMap;
@@ -292,4 +293,5 @@
 		data.setRowCount(0);
 		TreeMap<String, Collection<String>> props = new TreeMap<String, Collection<String>>();
+		HashMap<String, Integer> valueCounts = new HashMap<String, Integer>();
 		for (OsmPrimitive osm : newSelection) {
 			if (osm.keys != null) {
@@ -301,11 +303,17 @@
 					}
 					value.add(e.getValue());
+					
+					Integer count = valueCounts.get(e.getValue());
+					if (count == null)
+						count = 0;
+					valueCounts.put(e.getValue(), count+1);
 				}
 			}
 		}
+		int selCount = newSelection.size();
 		for (Entry<String, Collection<String>> e : props.entrySet()) {
 			JComboBox value = new JComboBox(e.getValue().toArray());
 			value.setEditable(true);
-			if (e.getValue().size() > 1)
+			if (e.getValue().size() > 1 || valueCounts.get(e.getValue().iterator().next()) != selCount)
 				value.getEditor().setItem("<different>");
 			data.addRow(new Object[]{e.getKey(), value});
Index: /src/org/openstreetmap/josm/gui/layer/EditLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/EditLayer.java	(revision 28)
+++ /src/org/openstreetmap/josm/gui/layer/EditLayer.java	(revision 29)
@@ -42,5 +42,5 @@
 	 * All commands that were made on the dataset.
 	 */
-	public Collection<Command> commands = new LinkedList<Command>();
+	public LinkedList<Command> commands = new LinkedList<Command>();
 
 	/**
Index: /src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/GpxReader.java	(revision 28)
+++ /src/org/openstreetmap/josm/io/GpxReader.java	(revision 29)
@@ -34,5 +34,5 @@
 	 * The OSM namespace used (for extensions).
 	 */
-	private static final Namespace OSM = Namespace.getNamespace("osm");
+	private static final Namespace OSM = Namespace.getNamespace("osm", "http://www.openstreetmap.org");
 
 	/**
@@ -115,4 +115,6 @@
 	private void parseTrack(Element e, DataSet ds) {
 		Track track = new Track();
+		boolean pendingLS = false; // is this track just a fake?
+
 		for (Object o : e.getChildren()) {
 			Element child = (Element)o;
@@ -127,17 +129,22 @@
 					else {
 						LineSegment lineSegment = new LineSegment(start, node);
-						parseKeyValueExtensions(lineSegment, ((Element)w).getChild("extensions", GPX));
+						parseKeyValueExtensions(lineSegment, child.getChild("extensions", GPX));
 						track.add(lineSegment);
 						start = null;
 					}
 				}
-			} else if (child.getName().equals("extensions"))
+			} else if (child.getName().equals("extensions")) {
 				parseKeyValueExtensions(track, child);
-			else if (child.getName().equals("link"))
+				if (child.getChild("segment", OSM) != null)
+					pendingLS = true;
+			} else if (child.getName().equals("link"))
 				parseKeyValueLink(track, child);
 			else
 				parseKeyValueTag(track, child);
 		}
-		ds.tracks.add(track);
+		if (pendingLS && track.segments.size() == 1)
+			ds.pendingLineSegments.add(track.segments.get(0));
+		else
+			ds.tracks.add(track);
 	}
 	
@@ -175,10 +182,16 @@
 	private void parseKeyValueExtensions(OsmPrimitive osm, Element e) {
 		if (e != null) {
-			if (osm.keys == null)
-				osm.keys = new HashMap<Key, String>();
 			for (Object o : e.getChildren("property", OSM)) {
+				if (osm.keys == null)
+					osm.keys = new HashMap<Key, String>();
 				Element child = (Element)o;
-				Key key = Key.get(child.getAttributeValue("name"));
-				osm.keys.put(key, child.getAttributeValue("value"));
+				String keyname = child.getAttributeValue("key");
+				if (keyname != null) {
+					Key key = Key.get(keyname);
+					String value = child.getAttributeValue("value");
+					if (value == null)
+						value = "";
+					osm.keys.put(key, value);
+				}
 			}
 		}
Index: /src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- /src/org/openstreetmap/josm/io/GpxWriter.java	(revision 28)
+++ /src/org/openstreetmap/josm/io/GpxWriter.java	(revision 29)
@@ -100,16 +100,24 @@
 			// line segments
 			for (LineSegment ls : t.segments) {
-				Element lsElem = new Element("trkseg", GPX);
-				if (ls.keys != null)
-				addPropertyExtensions(lsElem, ls.keys);
-				lsElem.getChildren().add(parseWaypoint(ls.start, "trkpt"));
-				lsElem.getChildren().add(parseWaypoint(ls.end, "trkpt"));
+				tElem.getChildren().add(parseLineSegment(ls));
 				nodes.remove(ls.start);
 				nodes.remove(ls.end);
-				tElem.getChildren().add(lsElem);
 			}
+
 			e.getChildren().add(tElem);
 		}
 		
+		// encode pending line segments as tracks
+		for (LineSegment ls : Main.main.ds.pendingLineSegments) {
+			Element t = new Element("trk", GPX);
+			t.getChildren().add(parseLineSegment(ls));
+			nodes.remove(ls.start);
+			nodes.remove(ls.end);
+			Element ext = new Element("extensions", GPX);
+			ext.getChildren().add(new Element("segment", OSM));
+			t.getChildren().add(ext);
+			e.getChildren().add(t);
+		}
+
 		// waypoints (missing nodes)
 		for (Node n : nodes)
@@ -117,4 +125,18 @@
 
 		return e;
+	}
+
+
+	/**
+	 * Parse a line segment and store it into a JDOM-Element. Return that element.
+	 */
+	@SuppressWarnings("unchecked")
+	private Element parseLineSegment(LineSegment ls) {
+		Element lsElem = new Element("trkseg", GPX);
+		if (ls.keys != null)
+		addPropertyExtensions(lsElem, ls.keys);
+		lsElem.getChildren().add(parseWaypoint(ls.start, "trkpt"));
+		lsElem.getChildren().add(parseWaypoint(ls.end, "trkpt"));
+		return lsElem;
 	}
 
@@ -213,5 +235,5 @@
 		if (keys.isEmpty())
 			return;
-		Element extensions = e.getChild("extensions");
+		Element extensions = e.getChild("extensions", GPX);
 		if (extensions == null)
 			e.getChildren().add(extensions = new Element("extensions", GPX));
Index: /src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmReader.java	(revision 28)
+++ /src/org/openstreetmap/josm/io/OsmReader.java	(revision 29)
@@ -47,4 +47,6 @@
 			Element root = builder.build(source).getRootElement();
 			return parseDataSet(root);
+		} catch (NumberFormatException nfe) {
+			throw new JDOMException("NumberFormatException. Probably a tag is missing.", nfe);
 		} catch (NullPointerException npe) {
 			throw new JDOMException("NullPointerException. Probably a tag name mismatch.", npe);
@@ -96,5 +98,5 @@
 					String token = t.nextToken();
 					if (!" ".equals(token))
-						data.keys.put(Key.get(token), "yes");
+						data.keys.put(Key.get(token), "");
 				}
 			}
Index: /src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 28)
+++ /src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 29)
@@ -49,5 +49,5 @@
 	 */
 	public Collection<Collection<GeoPoint>> parseRawGps() throws IOException, JDOMException {
-		String url = urlStr+"trackpoints?bbox="+lat1+","+lon1+","+lat2+","+lon2+"&page=";
+		String url = urlStr+"trackpoints?bbox="+lon1+","+lat1+","+lon2+","+lat2+"&page=";
 		Collection<Collection<GeoPoint>> data = new LinkedList<Collection<GeoPoint>>();
 		Collection<GeoPoint> list = new LinkedList<GeoPoint>();
Index: /src/org/openstreetmap/josm/io/RawGpsReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 28)
+++ /src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 29)
@@ -9,4 +9,5 @@
 import org.jdom.Element;
 import org.jdom.JDOMException;
+import org.jdom.Namespace;
 import org.jdom.input.SAXBuilder;
 import org.openstreetmap.josm.data.GeoPoint;
@@ -34,4 +35,9 @@
 
 	/**
+	 * The gpx namespace.
+	 */
+	private Namespace GPX = Namespace.getNamespace("http://www.topografix.com/GPX/1/0");
+	
+	/**
 	 * Parse and return the read data
 	 */
@@ -52,5 +58,8 @@
 		Collection<Collection<GeoPoint>> data = new LinkedList<Collection<GeoPoint>>();
 
-		for (Object o : root.getChildren("wpt", GpxReader.GPX)) {
+		// workaround for bug where the server adds /gpx.asd to the namespace
+		GPX = Namespace.getNamespace(root.getNamespaceURI());
+		
+		for (Object o : root.getChildren("wpt", GPX)) {
 			Collection<GeoPoint> line = new LinkedList<GeoPoint>();
 			line.add(new GeoPoint(
@@ -59,12 +68,12 @@
 			data.add(line);
 		}
-		for (Object o : root.getChildren("rte", GpxReader.GPX)) {
-			Collection<GeoPoint> line = parseLine(((Element)o).getChildren("rtept", GpxReader.GPX));
+		for (Object o : root.getChildren("rte", GPX)) {
+			Collection<GeoPoint> line = parseLine(((Element)o).getChildren("rtept", GPX));
 			if (!line.isEmpty())
 				data.add(line);
 		}
-		for (Object o : root.getChildren("trk", GpxReader.GPX)) {
-			for (Object seg : ((Element)o).getChildren("trkseg", GpxReader.GPX)) {
-				Collection<GeoPoint> line = parseLine(((Element)seg).getChildren("trkpt", GpxReader.GPX));
+		for (Object o : root.getChildren("trk", GPX)) {
+			for (Object seg : ((Element)o).getChildren("trkseg", GPX)) {
+				Collection<GeoPoint> line = parseLine(((Element)seg).getChildren("trkpt", GPX));
 				if (!line.isEmpty())
 					data.add(line);
