Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 57)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 58)
@@ -43,4 +43,5 @@
 import org.openstreetmap.josm.gui.layer.RawGpsDataLayer;
 import org.openstreetmap.josm.io.OsmServerReader;
+import org.xml.sax.SAXException;
 
 /**
@@ -254,4 +255,8 @@
 					else
 						Main.main.getMapFrame().mapView.addLayer(layer);
+				} catch (SAXException x) {
+					closeDialog();
+					x.printStackTrace();
+					JOptionPane.showMessageDialog(Main.main, x.getMessage());
 				} catch (JDOMException x) {
 					closeDialog();
Index: src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenAction.java	(revision 57)
+++ src/org/openstreetmap/josm/actions/OpenAction.java	(revision 58)
@@ -24,6 +24,8 @@
 import org.openstreetmap.josm.io.GpxReader;
 import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.io.OsmReaderOld;
 import org.openstreetmap.josm.io.RawCsvReader;
 import org.openstreetmap.josm.io.RawGpsReader;
+import org.xml.sax.SAXException;
 
 /**
@@ -75,7 +77,24 @@
 				if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
 					dataSet = new GpxReader(new FileReader(filename)).parse();
-				else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn))
-					dataSet = new OsmReader(new FileReader(filename)).parse();
-				else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
+				else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
+					try {
+						// temporary allow loading of old xml format.
+						dataSet = OsmReader.parseDataSet(new FileReader(filename));
+					} catch (SAXException x) {
+						if (x.getMessage().equals("Unknown version: null")) {
+							int answer = JOptionPane.showConfirmDialog(Main.main, 
+									"This seems to be an old 0.2 API XML file.\n" +
+									"JOSM can try to open it with the old parser. This option\n" +
+									"will not be available in future JOSM version. You should\n" +
+									"immediatly save the file, if successfull imported.",
+									"Load as 0.2 API file?",
+									JOptionPane.YES_NO_OPTION);
+							if (answer != JOptionPane.YES_OPTION)
+								return;
+							dataSet = new OsmReaderOld(new FileReader(filename)).parse();
+						} else 
+							throw x;
+					}					
+				} else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
 					JOptionPane.showMessageDialog(Main.main, "CSV Data import for non-GPS data is not implemented yet.");
 					return;
@@ -92,4 +111,7 @@
 				Main.main.getMapFrame().mapView.addLayer(layer);
 
+		} catch (SAXException x) {
+			x.printStackTrace();
+			JOptionPane.showMessageDialog(Main.main, x.getMessage());
 		} catch (JDOMException x) {
 			x.printStackTrace();
Index: src/org/openstreetmap/josm/actions/SaveAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/SaveAction.java	(revision 57)
+++ src/org/openstreetmap/josm/actions/SaveAction.java	(revision 58)
@@ -68,5 +68,5 @@
 				new GpxWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
 			else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn))
-				new OsmWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
+				OsmWriter.output(fileWriter = new FileWriter(file), Main.main.ds, false);
 			else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
 				JOptionPane.showMessageDialog(Main.main, "CSV output not supported yet.");
Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(revision 57)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(revision 58)
@@ -17,6 +17,6 @@
 import org.jdom.JDOMException;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.PreferencesException;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Track;
 import org.openstreetmap.josm.gui.GBC;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
@@ -39,10 +39,31 @@
 
 	public void actionPerformed(ActionEvent e) {
+		
+		//TODO: Remove this in later versions (temporary only)
+		if (Main.pref.osmDataServer.endsWith("/0.2") || Main.pref.osmDataServer.endsWith("/0.2/")) {
+			int answer = JOptionPane.showConfirmDialog(Main.main, 
+					"You seem to have an outdated server entry in your preferences.\n" +
+					"\n" +
+					"As of JOSM Release 1.2, you must no longer specify the API version in\n" +
+					"the osm url. For the OSM standard server, use http://www.openstreetmap.org/api" +
+					"\n" +
+					"Fix settings and continue?", "Outdated server url detected.", JOptionPane.YES_NO_OPTION);
+			if (answer != JOptionPane.YES_OPTION)
+				return;
+			int cutPos = Main.pref.osmDataServer.endsWith("/0.2") ? 4 : 5;
+			Main.pref.osmDataServer = Main.pref.osmDataServer.substring(0, Main.pref.osmDataServer.length()-cutPos);
+			try {
+				Main.pref.save();
+			} catch (PreferencesException x) {
+				x.printStackTrace();
+				JOptionPane.showMessageDialog(Main.main, "Could not save the preferences chane:\n" +
+						x.getMessage());
+			}
+		}
+
 		final Collection<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
 		final Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
 		final Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
-		boolean acceptedTracks = false;
 		for (OsmPrimitive osm : Main.main.ds.allPrimitives()) {
-			boolean doSomething = true;
 			if (osm.id == 0 && !osm.isDeleted())
 				add.add(osm);
@@ -51,16 +72,4 @@
 			else if (osm.isDeleted() && osm.id != 0)
 				delete.add(osm);
-			else
-				doSomething = false;
-
-			if (osm instanceof Track && doSomething && !acceptedTracks) {
-				int answer = JOptionPane.showConfirmDialog(Main.main, 
-						"The server currently does not understand the concept of Tracks.\n" +
-						"All tracks will be ignored on upload. Continue anyway?",
-						"No Track support", JOptionPane.YES_NO_OPTION);
-				if (answer != JOptionPane.YES_OPTION)
-					return;
-				acceptedTracks = true;
-			}
 		}
 
@@ -88,5 +97,5 @@
 		}).start();
 	}
-	
+
 	/**
 	 * Displays a screen where the actions that would be taken are displayed and
Index: src/org/openstreetmap/josm/actions/mapmode/AddTrackAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddTrackAction.java	(revision 57)
+++ src/org/openstreetmap/josm/actions/mapmode/AddTrackAction.java	(revision 58)
@@ -46,5 +46,5 @@
 	 */
 	public AddTrackAction(MapFrame mapFrame) {
-		super("Add Track", "addtrack", "Combine line segments to a new track.", KeyEvent.VK_T, mapFrame);
+		super("Add Way", "addtrack", "Combine line segments to a new way.", KeyEvent.VK_W, mapFrame);
 		this.selectionManager = new SelectionManager(this, false, mv);
 	}
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 57)
+++ src/org/openstreetmap/josm/data/Preferences.java	(revision 58)
@@ -54,5 +54,5 @@
 	 * Base URL to the osm data server
 	 */
-	public String osmDataServer = "http://www.openstreetmap.org/api/0.2";
+	public String osmDataServer = "http://www.openstreetmap.org/api";
 	/**
 	 * The username to the osm server
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 57)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 58)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.util.HashMap;
 import java.util.Map;
 
@@ -10,9 +11,13 @@
  * An OSM primitive can be associated with a key/value pair. It can be created, deleted
  * and updated within the OSM-Server.
- * 
+ *
+ * Although OsmPrimitive is designed as a base class, it is not to be meant to subclass
+ * it by any other than from the package org.openstreetmap.josm.data.osm (thus the
+ * visibility of the constructor). The available primitives are a fixed set that are given
+ * by the server environment and not an extendible data stuff. 
+ *
  * @author imi
  */
 abstract public class OsmPrimitive {
-
 
 	/**
@@ -129,3 +134,14 @@
 		return id == 0 ? super.hashCode() : (int)id;
 	}
+
+	/**
+	 * Set the given value to the given key
+	 * @param key The key, for which the value is to be set.
+	 * @param value The value for the key.
+	 */
+	public void put(Key key, String value) {
+		if (keys == null)
+			keys = new HashMap<Key, String>();
+		keys.put(key, value);
+	}
 }
Index: src/org/openstreetmap/josm/data/osm/visitor/OsmXmlVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/OsmXmlVisitor.java	(revision 57)
+++ 	(revision )
@@ -1,93 +1,0 @@
-package org.openstreetmap.josm.data.osm.visitor;
-
-import java.util.Map.Entry;
-
-import org.jdom.Element;
-import org.openstreetmap.josm.data.osm.Key;
-import org.openstreetmap.josm.data.osm.LineSegment;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Track;
-
-
-/**
- * An visitor which is capable of convert the visited objects to osm xml syntax
- * using JDOM.
- *
- * @author imi
- */
-public class OsmXmlVisitor implements Visitor {
-
-	private final boolean reference;
-	
-	public Element element;
-
-	/**
-	 * The counter for ids for new objects. 
-	 */
-	private static int newCounter = -1;
-
-	/**
-	 * Specify, which output do you like to have.
-	 * 
-	 * @param reference <code>true</code> means, the xml output is only a reference
-	 * 		containing the id (for deletion and referencing etc).
-	 */
-	public OsmXmlVisitor(boolean reference) {
-		this.reference = reference;
-	}
-
-	
-	public void visit(Node n) {
-		element = new Element("node");
-		addCommon(n);
-		if (!reference) {
-			element.setAttribute("lat", ""+n.coor.lat);
-			element.setAttribute("lon", ""+n.coor.lon);
-		}
-	}
-
-	public void visit(LineSegment ls) {
-		element = new Element("segment");
-		addCommon(ls);
-		if (!reference) {
-			element.setAttribute("from", ""+ls.start.id);
-			element.setAttribute("to", ""+ls.end.id);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	public void visit(Track t) {
-		element = new Element("track");
-		addCommon(t);
-		if (!reference) {
-			for (LineSegment ls : t.segments) {
-				OsmXmlVisitor v = new OsmXmlVisitor(true);
-				v.visit(ls);
-				element.getChildren().add(v.element);
-			}
-		}
-	}
-
-	public void visit(Key k) {
-		//TODO
-		throw new RuntimeException("cannot add keys yet.");
-	}
-
-	/**
-	 * Add the common parts of the object.
-	 */
-	private void addCommon(OsmPrimitive osm) {
-		element.setAttribute("uid", ""+(osm.id == 0 ? newCounter-- : osm.id));
-		if (!reference && osm.keys != null) {
-			StringBuilder tags = new StringBuilder();
-			for (Entry<Key, String> e : osm.keys.entrySet()) {
-				tags.append(e.getKey().name);
-				tags.append("=");
-				tags.append(e.getValue());
-				tags.append(";");
-			}
-			element.setAttribute("tags", tags.toString());
-		}
-	}
-}
Index: src/org/openstreetmap/josm/data/projection/Projection.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Projection.java	(revision 57)
+++ src/org/openstreetmap/josm/data/projection/Projection.java	(revision 58)
@@ -13,5 +13,5 @@
 	public static double MAX_LAT = 85;
 	public static double MAX_LON = 180;
-	public static final double MAX_SERVER_PRECISION = 1e13;
+	public static final double MAX_SERVER_PRECISION = 1e12;
 	
 	/**
Index: src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReader.java	(revision 57)
+++ 	(revision )
@@ -1,245 +1,0 @@
-package org.openstreetmap.josm.io;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.StringTokenizer;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-import org.openstreetmap.josm.data.GeoPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Key;
-import org.openstreetmap.josm.data.osm.LineSegment;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Track;
-import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
-
-/**
- * Reads an osm xml stream and construct a DataSet out of it. 
- * 
- * @author imi
- */
-public class OsmReader {
-
-	/**
-	 * The data source from this reader.
-	 */
-	public Reader source;
-
-	/**
-	 * Construct a parser from a specific data source.
-	 * @param source The data source, as example a FileReader to read from a file.
-	 */
-	public OsmReader(Reader source) {
-		this.source = source;
-	}
-	static int i;
-	/**
-	 * Read the input stream and return a DataSet from the stream.
-	 */
-	public DataSet parse() throws JDOMException, IOException {
-		try {
-			final SAXBuilder builder = new SAXBuilder();
-			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);
-		} catch (ClassCastException cce) {
-			throw new JDOMException("ClassCastException. Probably a tag does not contain the correct type.", cce);
-		}
-	}
-
-
-	/**
-	 * Read one node.
-	 * @param e 	The element to parse
-	 * @return		The Waypoint read from the element
-	 * @throws JDOMException In case of a parsing error.
-	 */
-	private Node parseNode(Element e) throws JDOMException {
-		Node data = new Node();
-		data.coor = new GeoPoint(
-			Double.parseDouble(e.getAttributeValue("lat")),
-			Double.parseDouble(e.getAttributeValue("lon")));
-		if (Double.isNaN(data.coor.lat) || 
-				data.coor.lat < -90 || data.coor.lat > 90 ||
-				data.coor.lon < -180 || data.coor.lon > 180)
-			throw new JDOMException("Illegal lat or lon value: "+data.coor.lat+"/"+data.coor.lon);
-		parseCommon(data, e);
-		return data;
-	}
-
-	/**
-	 * Parse any (yet unknown) object and return it.
-	 */
-	private OsmPrimitive parseObject(Element e, DataSet data) throws JDOMException {
-		if (e.getName().equals("node"))
-			return parseNode(e);
-		else if (e.getName().equals("segment"))
-			return parseLineSegment(e, data);
-		else if (e.getName().equals("track"))
-			return parseTrack(e, data);
-		else if (e.getName().equals("property")) {
-			parseProperty(e, data);
-			return null;
-		}
-		throw new JDOMException("unknown tag: "+e.getName());
-	}
-	
-	/**
-	 * Read a data set from the element.
-	 * @param e 	The element to parse
-	 * @return		The DataSet read from the element
-	 * @throws JDOMException In case of a parsing error.
-	 */
-	private DataSet parseDataSet(Element e) throws JDOMException {
-		DataSet data = new DataSet();
-		AddVisitor visitor = new AddVisitor(data);
-		for (Object o : e.getChildren()) {
-			Element child = (Element)o;
-			OsmPrimitive osm = parseObject(child, data);
-			if (osm != null)
-				osm.visit(visitor);
-		}
-		
-		// clear all negative ids (new to this file)
-		for (OsmPrimitive osm : data.allPrimitives())
-			if (osm.id < 0)
-				osm.id = 0;
-
-		return data;
-	}
-
-	/**
-	 * Parse and return an line segment. The node information of the "from" and
-	 * "to" attributes must already be in the dataset.
-	 * @param e		The line segment element to parse.
-	 * @param data	The dataset to obtain the node information from.
-	 * @return The parsed line segment.
-	 * @throws JDOMException In case of parsing errors.
-	 */
-	private LineSegment parseLineSegment(Element e, DataSet data) throws JDOMException {
-		long startId = Long.parseLong(e.getAttributeValue("from"));
-		long endId = Long.parseLong(e.getAttributeValue("to"));
-		
-		Node start = null, end = null;
-		for (Node n : data.nodes) {
-			if (n.id == startId)
-				start = n;
-			if (n.id == endId)
-				end = n;
-		}
-		if (start == null || end == null)
-			throw new JDOMException("The 'from' or 'to' object has not been transfered before.");
-		LineSegment ls = new LineSegment(start, end);
-		parseCommon(ls, e);
-		return ls;
-	}
-
-	/**
-	 * Parse and read a track from the element.
-	 *
-	 * @param e		The element that contain the track.
-	 * @param data	The DataSet to get segment information from.
-	 * @return 		The parsed track.
-	 * @throws JDOMException In case of a parsing error.
-	 */
-	private Track parseTrack(Element e, DataSet data) throws JDOMException {
-		Track track = new Track();
-		parseCommon(track, e);
-		for (Object o : e.getChildren("segment")) {
-			Element child = (Element)o;
-			long id = Long.parseLong(child.getAttributeValue("uid"));
-			LineSegment ls = findLineSegment(data.lineSegments, id);
-			track.segments.add(ls);
-		}
-		return track;
-	}
-	
-	/**
-	 * Parse the common part (properties and uid) of the element.
-	 * @param data	To store the data in. 
-	 * @param e		The element to extract the common information.
-	 * @throws JDOMException In case of a parsing error
-	 */
-	private void parseCommon(OsmPrimitive data, Element e) {
-		String suid = e.getAttributeValue("uid");
-		if (suid != null)
-			data.id = Long.parseLong(suid);
-		
-		String propStr = e.getAttributeValue("tags");
-		if (propStr != null && !propStr.equals("")) {
-			data.keys = new HashMap<Key, String>();
-			StringTokenizer st = new StringTokenizer(propStr, ";");
-			while (st.hasMoreTokens()) {
-				String next = st.nextToken();
-				if (next.trim().equals(""))
-					continue;
-				int equalPos = next.indexOf('=');
-				if (equalPos == -1)
-					data.keys.put(Key.get(next), "");
-				else {
-					String keyStr = next.substring(0, equalPos);
-					data.keys.put(Key.get(keyStr), next.substring(equalPos+1));
-				}
-			}
-		}
-		
-		String action = e.getAttributeValue("action");
-		if ("delete".equals(action))
-			data.setDeleted(true);
-		else if ("modify".equals(action))
-			data.modified = data.modifiedProperties = true;
-		else if ("modify/property".equals(action))
-			data.modifiedProperties = true;
-		else if ("modify/object".equals(action))
-			data.modified = true;
-	}
-
-	/**
-	 * Parse a property tag and assign the property to a previous found object.
-	 */
-	private void parseProperty(Element e, DataSet data) throws JDOMException {
-		long id = Long.parseLong(e.getAttributeValue("uid"));
-		OsmPrimitive osm = findObject(data, id);
-		Key key = Key.get(e.getAttributeValue("key"));
-		String value = e.getAttributeValue("value");
-		if (value != null) {
-			if (osm.keys == null)
-				osm.keys = new HashMap<Key, String>();
-			osm.keys.put(key, value);
-		}
-	}
-
-	/**
-	 * Search for an object in the dataset by comparing the id.
-	 */
-	private OsmPrimitive findObject(DataSet data, long id) throws JDOMException {
-		for (OsmPrimitive osm : data.nodes)
-			if (osm.id == id)
-				return osm;
-		for (OsmPrimitive osm : data.lineSegments)
-			if (osm.id == id)
-				return osm;
-		for (OsmPrimitive osm : data.tracks)
-			if (osm.id == id)
-				return osm;
-		throw new JDOMException("Unknown object reference: "+id);
-	}
-
-	/**
-	 * Search for a segment in a collection by comparing the id.
-	 */
-	private LineSegment findLineSegment(Collection<LineSegment> segments, long id) throws JDOMException {
-		for (LineSegment ls : segments)
-			if (ls.id == id)
-				return ls;
-		throw new JDOMException("Unknown line segment reference: "+id);
-	}
-}
Index: src/org/openstreetmap/josm/io/OsmReaderOld.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReaderOld.java	(revision 58)
+++ src/org/openstreetmap/josm/io/OsmReaderOld.java	(revision 58)
@@ -0,0 +1,245 @@
+package org.openstreetmap.josm.io;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.openstreetmap.josm.data.GeoPoint;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Key;
+import org.openstreetmap.josm.data.osm.LineSegment;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Track;
+import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
+
+/**
+ * Reads the old osm 0.2 format. 
+ * 
+ * @author imi
+ */
+public class OsmReaderOld {
+
+	/**
+	 * The data source from this reader.
+	 */
+	public Reader source;
+
+	/**
+	 * Construct a parser from a specific data source.
+	 * @param source The data source, as example a FileReader to read from a file.
+	 */
+	public OsmReaderOld(Reader source) {
+		this.source = source;
+	}
+
+	/**
+	 * Read the input stream and return a DataSet from the stream.
+	 */
+	public DataSet parse() throws JDOMException, IOException {
+		try {
+			final SAXBuilder builder = new SAXBuilder();
+			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);
+		} catch (ClassCastException cce) {
+			throw new JDOMException("ClassCastException. Probably a tag does not contain the correct type.", cce);
+		}
+	}
+
+
+	/**
+	 * Read one node.
+	 * @param e 	The element to parse
+	 * @return		The Waypoint read from the element
+	 * @throws JDOMException In case of a parsing error.
+	 */
+	private Node parseNode(Element e) throws JDOMException {
+		Node data = new Node();
+		data.coor = new GeoPoint(
+			Double.parseDouble(e.getAttributeValue("lat")),
+			Double.parseDouble(e.getAttributeValue("lon")));
+		if (Double.isNaN(data.coor.lat) || 
+				data.coor.lat < -90 || data.coor.lat > 90 ||
+				data.coor.lon < -180 || data.coor.lon > 180)
+			throw new JDOMException("Illegal lat or lon value: "+data.coor.lat+"/"+data.coor.lon);
+		parseCommon(data, e);
+		return data;
+	}
+
+	/**
+	 * Parse any (yet unknown) object and return it.
+	 */
+	private OsmPrimitive parseObject(Element e, DataSet data) throws JDOMException {
+		if (e.getName().equals("node"))
+			return parseNode(e);
+		else if (e.getName().equals("segment"))
+			return parseLineSegment(e, data);
+		else if (e.getName().equals("track"))
+			return parseTrack(e, data);
+		else if (e.getName().equals("property")) {
+			parseProperty(e, data);
+			return null;
+		}
+		throw new JDOMException("unknown tag: "+e.getName());
+	}
+	
+	/**
+	 * Read a data set from the element.
+	 * @param e 	The element to parse
+	 * @return		The DataSet read from the element
+	 * @throws JDOMException In case of a parsing error.
+	 */
+	private DataSet parseDataSet(Element e) throws JDOMException {
+		DataSet data = new DataSet();
+		AddVisitor visitor = new AddVisitor(data);
+		for (Object o : e.getChildren()) {
+			Element child = (Element)o;
+			OsmPrimitive osm = parseObject(child, data);
+			if (osm != null)
+				osm.visit(visitor);
+		}
+		
+		// clear all negative ids (new to this file)
+		for (OsmPrimitive osm : data.allPrimitives())
+			if (osm.id < 0)
+				osm.id = 0;
+
+		return data;
+	}
+
+	/**
+	 * Parse and return an line segment. The node information of the "from" and
+	 * "to" attributes must already be in the dataset.
+	 * @param e		The line segment element to parse.
+	 * @param data	The dataset to obtain the node information from.
+	 * @return The parsed line segment.
+	 * @throws JDOMException In case of parsing errors.
+	 */
+	private LineSegment parseLineSegment(Element e, DataSet data) throws JDOMException {
+		long startId = Long.parseLong(e.getAttributeValue("from"));
+		long endId = Long.parseLong(e.getAttributeValue("to"));
+		
+		Node start = null, end = null;
+		for (Node n : data.nodes) {
+			if (n.id == startId)
+				start = n;
+			if (n.id == endId)
+				end = n;
+		}
+		if (start == null || end == null)
+			throw new JDOMException("The 'from' or 'to' object has not been transfered before.");
+		LineSegment ls = new LineSegment(start, end);
+		parseCommon(ls, e);
+		return ls;
+	}
+
+	/**
+	 * Parse and read a track from the element.
+	 *
+	 * @param e		The element that contain the track.
+	 * @param data	The DataSet to get segment information from.
+	 * @return 		The parsed track.
+	 * @throws JDOMException In case of a parsing error.
+	 */
+	private Track parseTrack(Element e, DataSet data) throws JDOMException {
+		Track track = new Track();
+		parseCommon(track, e);
+		for (Object o : e.getChildren("segment")) {
+			Element child = (Element)o;
+			long id = Long.parseLong(child.getAttributeValue("uid"));
+			LineSegment ls = findLineSegment(data.lineSegments, id);
+			track.segments.add(ls);
+		}
+		return track;
+	}
+	
+	/**
+	 * Parse the common part (properties and uid) of the element.
+	 * @param data	To store the data in. 
+	 * @param e		The element to extract the common information.
+	 * @throws JDOMException In case of a parsing error
+	 */
+	private void parseCommon(OsmPrimitive data, Element e) {
+		String suid = e.getAttributeValue("uid");
+		if (suid != null)
+			data.id = Long.parseLong(suid);
+		
+		String propStr = e.getAttributeValue("tags");
+		if (propStr != null && !propStr.equals("")) {
+			data.keys = new HashMap<Key, String>();
+			StringTokenizer st = new StringTokenizer(propStr, ";");
+			while (st.hasMoreTokens()) {
+				String next = st.nextToken();
+				if (next.trim().equals(""))
+					continue;
+				int equalPos = next.indexOf('=');
+				if (equalPos == -1)
+					data.keys.put(Key.get(next), "");
+				else {
+					String keyStr = next.substring(0, equalPos);
+					data.keys.put(Key.get(keyStr), next.substring(equalPos+1));
+				}
+			}
+		}
+		
+		String action = e.getAttributeValue("action");
+		if ("delete".equals(action))
+			data.setDeleted(true);
+		else if ("modify".equals(action))
+			data.modified = data.modifiedProperties = true;
+		else if ("modify/property".equals(action))
+			data.modifiedProperties = true;
+		else if ("modify/object".equals(action))
+			data.modified = true;
+	}
+
+	/**
+	 * Parse a property tag and assign the property to a previous found object.
+	 */
+	private void parseProperty(Element e, DataSet data) throws JDOMException {
+		long id = Long.parseLong(e.getAttributeValue("uid"));
+		OsmPrimitive osm = findObject(data, id);
+		Key key = Key.get(e.getAttributeValue("key"));
+		String value = e.getAttributeValue("value");
+		if (value != null) {
+			if (osm.keys == null)
+				osm.keys = new HashMap<Key, String>();
+			osm.keys.put(key, value);
+		}
+	}
+
+	/**
+	 * Search for an object in the dataset by comparing the id.
+	 */
+	private OsmPrimitive findObject(DataSet data, long id) throws JDOMException {
+		for (OsmPrimitive osm : data.nodes)
+			if (osm.id == id)
+				return osm;
+		for (OsmPrimitive osm : data.lineSegments)
+			if (osm.id == id)
+				return osm;
+		for (OsmPrimitive osm : data.tracks)
+			if (osm.id == id)
+				return osm;
+		throw new JDOMException("Unknown object reference: "+id);
+	}
+
+	/**
+	 * Search for a segment in a collection by comparing the id.
+	 */
+	private LineSegment findLineSegment(Collection<LineSegment> segments, long id) throws JDOMException {
+		for (LineSegment ls : segments)
+			if (ls.id == id)
+				return ls;
+		throw new JDOMException("Unknown line segment reference: "+id);
+	}
+}
Index: src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 57)
+++ src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 58)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.data.GeoPoint;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.xml.sax.SAXException;
 
 /**
@@ -47,5 +48,5 @@
 	 */
 	public Collection<Collection<GeoPoint>> parseRawGps() throws IOException, JDOMException {
-		String url = Main.pref.osmDataServer+"/trackpoints?bbox="+lon1+","+lat1+","+lon2+","+lat2+"&page=";
+		String url = Main.pref.osmDataServer+"/0.3/trackpoints?bbox="+lon1+","+lat1+","+lon2+","+lat2+"&page=";
 		Collection<Collection<GeoPoint>> data = new LinkedList<Collection<GeoPoint>>();
 		Collection<GeoPoint> list = new LinkedList<GeoPoint>();
@@ -78,9 +79,9 @@
 	 * @return A data set containing all data retrieved from that url
 	 */
-	public DataSet parseOsm() throws JDOMException, IOException {
-		Reader r = getReader(Main.pref.osmDataServer+"/map?bbox="+lon1+","+lat1+","+lon2+","+lat2);
+	public DataSet parseOsm() throws SAXException, IOException {
+		Reader r = getReader(Main.pref.osmDataServer+"/0.3/map?bbox="+lon1+","+lat1+","+lon2+","+lat2);
 		if (r == null)
 			return null;
-		DataSet data = new OsmReader(r).parse();
+		DataSet data = OsmReader.parseDataSet(r);
 		r.close();
 		return data;
@@ -95,4 +96,5 @@
 	 */
 	private Reader getReader(String urlStr) throws IOException {
+		System.out.println("download: "+urlStr);
 		initAuthentication();
 		URL url = new URL(urlStr);
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 57)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 58)
@@ -5,5 +5,6 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -13,9 +14,5 @@
 import java.util.LinkedList;
 
-import org.jdom.Document;
-import org.jdom.Element;
 import org.jdom.JDOMException;
-import org.jdom.output.Format;
-import org.jdom.output.XMLOutputter;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Key;
@@ -24,5 +21,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Track;
-import org.openstreetmap.josm.data.osm.visitor.OsmXmlVisitor;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 
@@ -72,9 +68,9 @@
 		if (n.id == 0 && !n.isDeleted()) {
 			setCredits(n);
-			sendRequest("PUT", "newnode", n, true);
+			sendRequest("PUT", "node", n, true);
 		} else if (n.isDeleted()) {
-			sendRequest("DELETE", "node/" + n.id, n, false);
+			sendRequest("DELETE", "node", n, false);
 		} else {
-			sendRequest("PUT", "node/" + n.id, n, true);
+			sendRequest("PUT", "node", n, true);
 		}
 		processed.add(n);
@@ -87,11 +83,26 @@
 		if (ls.id == 0 && !ls.isDeleted()) {
 			setCredits(ls);
-			sendRequest("PUT", "newsegment", ls, true);
+			sendRequest("PUT", "segment", ls, true);
 		} else if (ls.isDeleted()) {
-			sendRequest("DELETE", "segment/" + ls.id, ls, false);
+			sendRequest("DELETE", "segment", ls, false);
 		} else {
-			sendRequest("PUT", "segment/" + ls.id, ls, true);
+			sendRequest("PUT", "segment", ls, true);
 		}
 		processed.add(ls);
+	}
+
+	/**
+	 * Upload a whole way with the complete line segment id list.
+	 */
+	public void visit(Track w) {
+		if (w.id == 0 && !w.isDeleted()) {
+			setCredits(w);
+			sendRequest("PUT", "way", w, true);
+		} else if (w.isDeleted()) {
+			sendRequest("DELETE", "way", w, false);
+		} else {
+			sendRequest("PUT", "way", w, true);
+		}
+		processed.add(w);
 	}
 
@@ -107,7 +118,4 @@
 	}
 
-	public void visit(Track t) {
-		// not implemented in server
-	}
 
 	public void visit(Key k) {
@@ -145,5 +153,6 @@
 			OsmPrimitive osm, boolean addBody) {
 		try {
-			URL url = new URL(Main.pref.osmDataServer + "/" + urlSuffix);
+			URL url = new URL(Main.pref.osmDataServer + "/0.3/" + urlSuffix + "/" + osm.id);
+			System.out.println("upload to: "+url);
 			HttpURLConnection con = (HttpURLConnection) url.openConnection();
 			con.setConnectTimeout(20000);
@@ -154,13 +163,6 @@
 
 			if (addBody) {
-				OsmXmlVisitor visitor = new OsmXmlVisitor(false);
-				osm.visit(visitor);
-				Element root = new Element("osm");
-				root.setAttribute("version", "0.2");
-				root.getChildren().add(visitor.element);
-				XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
-				OutputStream out = con.getOutputStream();
-				Document doc = new Document(root);
-				xmlOut.output(doc, out);
+				Writer out = new OutputStreamWriter(con.getOutputStream());
+				OsmWriter.outputSingle(out, osm, true);
 				out.close();
 			}
@@ -169,8 +171,11 @@
 			if (retCode == 200 && osm.id == 0)
 				osm.id = readId(con.getInputStream());
+			System.out.println("got return: "+retCode+" with id "+osm.id);
 			con.disconnect();
 		} catch (UnknownHostException e) {
 			throw new RuntimeException("Unknown host: "+e.getMessage(), e);
 		} catch (Exception e) {
+			if (e instanceof RuntimeException)
+				throw (RuntimeException)e;
 			throw new RuntimeException(e.getMessage(), e);
 		}
Index: src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmWriter.java	(revision 57)
+++ 	(revision )
@@ -1,159 +1,0 @@
-package org.openstreetmap.josm.io;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.output.Format;
-import org.jdom.output.XMLOutputter;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Key;
-import org.openstreetmap.josm.data.osm.LineSegment;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Track;
-import org.openstreetmap.josm.data.osm.visitor.Visitor;
-
-
-/**
- * Save the dataset into a stream as osm intern xml format.
- * @author imi
- */
-public class OsmWriter implements Visitor {
-
-	/**
-	 * The output writer to write the xml stream to.
-	 */
-	private final Writer out;
-	/**
-	 * The commands that should be uploaded on the server.
-	 */
-	private DataSet ds;
-	/**
-	 * The counter for new created objects. Starting at -1 and goes down.
-	 */
-	private long newIdCounter = -1;
-	/**
-	 * All newly created ids and their primitive that uses it. This is a back reference
-	 * map to allow references to use the correnct primitives.
-	 */
-	private HashMap<OsmPrimitive, Long> usedNewIds = new HashMap<OsmPrimitive, Long>();
-
-	/**
-	 * Set from the visitor functions as result.
-	 */
-	private Element element;
-	/**
-	 * Filled with all generated properties tags.
-	 */
-	private Collection<Element> properties;
-	
-	public OsmWriter(Writer out, DataSet dataSet) {
-		this.out = out;
-		ds = dataSet;
-	}
-
-	/**
-	 * Output the data to the stream
-	 * @throws IOException In case of stream IO errors.
-	 */
-	@SuppressWarnings("unchecked")
-	public void output() throws IOException {
-		Element root = new Element("osm");
-		List<Element> list = root.getChildren();
-		properties = new LinkedList<Element>();
-		for (OsmPrimitive osm : ds.allPrimitives()) {
-			osm.visit(this);
-			list.add(element);
-		}
-		list.addAll(properties);
-
-		Document d = new Document(root);
-		XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
-		xmlOut.output(d, out);
-	}
-
-	/**
-	 * Create a properties element.
-	 */
-	private Element parseProperty(OsmPrimitive osm, long id, Entry<Key, String> entry) {
-		Element e = new Element("property");
-		Key key = entry.getKey();
-		e.setAttribute("uid", ""+id);
-		e.setAttribute("key", key.name);
-		e.setAttribute("value", entry.getValue());
-		return e;
-	}
-	
-	/**
-	 * Add the id attribute to the element and the properties to the collection.
-	 */
-	private void addProperties(Element e, OsmPrimitive osm) {
-		long id = osm.id;
-		if (id == 0) {
-			id = newIdCounter--;
-			usedNewIds.put(osm, id);
-		}
-		e.setAttribute("uid", ""+id);
-		if (osm.keys != null)
-			for (Entry<Key, String> entry : osm.keys.entrySet())
-				properties.add(parseProperty(osm, id, entry));
-		if (osm.isDeleted())
-			e.setAttribute("action", "delete");
-		else if (osm.modified && osm.modifiedProperties)
-			e.setAttribute("action", "modify");
-		else if (osm.modified && !osm.modifiedProperties)
-			e.setAttribute("action", "modify/object");
-		else if (!osm.modified && osm.modifiedProperties)
-			e.setAttribute("action", "modify/property");
-	}
-
-	/**
-	 * Create an node element. Add all properties of the node to the properties-list.
-	 */
-	public void visit(Node n) {
-		element = new Element("node");
-		addProperties(element, n);
-		element.setAttribute("lat", ""+n.coor.lat);
-		element.setAttribute("lon", ""+n.coor.lon);
-	}
-
-	/**
-	 * Create an line segment element. Add all properties of the node to the properties-list.
-	 */
-	public void visit(LineSegment ls) {
-		element = new Element("segment");
-		addProperties(element, ls);
-		element.setAttribute("from", ""+getUsedId(ls.start));
-		element.setAttribute("to", ""+getUsedId(ls.end));
-	}
-
-	/**
-	 * Return the id for the given osm primitive (may access the usedId map)
-	 */
-	private Long getUsedId(OsmPrimitive osm) {
-		return osm.id == 0 ? usedNewIds.get(osm) : osm.id;
-	}
-
-	/**
-	 * Create an track element. Add all properties of the node to the properties-list.
-	 */
-	@SuppressWarnings("unchecked")
-	public void visit(Track t) {
-		element = new Element("track");
-		addProperties(element, t);
-		for (LineSegment ls : t.segments)
-			element.getChildren().add(new Element("segment").setAttribute("uid", ""+getUsedId(ls)));
-	}
-
-	public void visit(Key k) {
-		element = new Element("property");
-		addProperties(element, k);
-	}
-}
