Index: /src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmReader.java	(revision 52)
+++ /src/org/openstreetmap/josm/io/OsmReader.java	(revision 53)
@@ -104,17 +104,7 @@
 		for (Object o : e.getChildren()) {
 			Element child = (Element)o;
-			if (child.getName().equals("deleted")) {
-				for (Object delObj : child.getChildren()) {
-					OsmPrimitive osm = parseObject((Element)delObj, data);
-					if (osm != null) {
-						osm.visit(visitor);
-						osm.setDeleted(true);
-					}
-				}
-			} else {
-				OsmPrimitive osm = parseObject(child, data);
-				if (osm != null)
-					osm.visit(visitor);
-			}
+			OsmPrimitive osm = parseObject(child, data);
+			if (osm != null)
+				osm.visit(visitor);
 		}
 		
@@ -201,4 +191,14 @@
 			}
 		}
+		
+		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;
 	}
 
Index: /src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmWriter.java	(revision 52)
+++ /src/org/openstreetmap/josm/io/OsmWriter.java	(revision 53)
@@ -69,21 +69,9 @@
 		List<Element> list = root.getChildren();
 		properties = new LinkedList<Element>();
-		for (OsmPrimitive osm : ds.allNonDeletedPrimitives()) {
+		for (OsmPrimitive osm : ds.allPrimitives()) {
 			osm.visit(this);
 			list.add(element);
 		}
 		list.addAll(properties);
-		properties = new LinkedList<Element>();
-		Element deleted = new Element("deleted");
-		Collection<Element> allDeleted = deleted.getChildren();
-		for (OsmPrimitive osm : ds.allPrimitives()) {
-			if (osm.isDeleted() && osm.id != 0) {
-				osm.visit(this);
-				allDeleted.add(element);
-			}
-		}
-		allDeleted.addAll(properties);
-		if (!allDeleted.isEmpty())
-			list.add(deleted);
 
 		Document d = new Document(root);
@@ -117,4 +105,12 @@
 			for (Entry<Key, String> entry : osm.keys.entrySet())
 				properties.add(parseProperty(osm, 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");
 	}
 
Index: /test/org/openstreetmap/josm/test/OsmWriterTest.java
===================================================================
--- /test/org/openstreetmap/josm/test/OsmWriterTest.java	(revision 52)
+++ /test/org/openstreetmap/josm/test/OsmWriterTest.java	(revision 53)
@@ -14,4 +14,8 @@
 import org.jdom.input.SAXBuilder;
 import org.openstreetmap.josm.data.osm.DataSet;
+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.io.OsmWriter;
 import org.openstreetmap.josm.test.framework.Bug;
@@ -24,4 +28,14 @@
 public class OsmWriterTest extends TestCase {
 
+	private Node n1;
+	private Node n2;
+	private Node n3;
+	private Node n4;
+	private Node n5;
+	private LineSegment ls1;
+	private LineSegment ls2;
+	private LineSegment ls3;
+	private Track t;
+	
 	private DataSet ds;
 	private Element osm;
@@ -79,4 +93,45 @@
 
 	
+	/**
+	 * Verify that action tag is set correctly.
+	 */
+	public void testActionTag() throws IOException, JDOMException {
+		int id = 1;
+		for (OsmPrimitive osm : ds.allPrimitives())
+			osm.id = id++; // make all objects "old".
+		n1.setDeleted(true);
+		ls1.modified = true;
+		ls1.modifiedProperties = true;
+		ls3.modified = true;
+		t.modifiedProperties = true;
+		reparse();
+		
+		boolean foundNode = false;
+		for (Element n : nodes) {
+			if (n.getAttributeValue("uid").equals(""+n1.id)) {
+				assertEquals("delete", n.getAttributeValue("action"));
+				foundNode = true;
+			}
+		}
+		assertTrue("Node found in output", foundNode);
+
+		boolean foundLs1 = false;
+		boolean foundLs3 = false;
+		for (Element lsElem : lineSegments) {
+			String idStr = lsElem.getAttributeValue("uid");
+			String action = lsElem.getAttributeValue("action");
+			if (idStr.equals(""+ls1.id)) {
+				assertEquals("Attribute action on modified data is ok", "modify", action);
+				foundLs1 = true;
+			} else if (idStr.equals(""+ls3.id)) {
+				assertEquals("Attribute action on modified/object data is ok", "modify/object", action);
+				foundLs3 = true;
+			}
+		}
+		assertTrue("LineSegments found in output", foundLs1 && foundLs3);
+		
+		assertEquals("Track found in output", 1, tracks.size());
+		assertEquals("Attribute action on modifiedProperty data is ok", "modify/property", tracks.get(0).getAttributeValue("action"));
+	}
 	
 	
@@ -85,6 +140,17 @@
 	protected void setUp() throws Exception {
 		super.setUp();
+		
 		// create some data
-		ds = DataSetTestCaseHelper.createCommon();
+		ds = new DataSet();
+		n1 = DataSetTestCaseHelper.createNode(ds);
+		n2 = DataSetTestCaseHelper.createNode(ds);
+		n3 = DataSetTestCaseHelper.createNode(ds);
+		n4 = DataSetTestCaseHelper.createNode(ds);
+		n5 = DataSetTestCaseHelper.createNode(ds);
+		ls1 = DataSetTestCaseHelper.createLineSegment(ds, n1, n2);
+		ls2 = DataSetTestCaseHelper.createLineSegment(ds, n2, n3);
+		ls3 = DataSetTestCaseHelper.createLineSegment(ds, n4, n5);
+		t = DataSetTestCaseHelper.createTrack(ds, ls1, ls2);
+		
 		reparse();
 	}
Index: /test/org/openstreetmap/josm/test/framework/DataSetTestCaseHelper.java
===================================================================
--- /test/org/openstreetmap/josm/test/framework/DataSetTestCaseHelper.java	(revision 52)
+++ /test/org/openstreetmap/josm/test/framework/DataSetTestCaseHelper.java	(revision 53)
@@ -1,3 +1,5 @@
 package org.openstreetmap.josm.test.framework;
+
+import java.util.Arrays;
 
 import org.openstreetmap.josm.data.GeoPoint;
@@ -33,9 +35,13 @@
 		LineSegment ls2 = createLineSegment(ds, n2, n3);
 		createLineSegment(ds, n4, n5);
+		createTrack(ds, ls1, ls2);
+		return ds;
+	}
+
+	public static Track createTrack(DataSet ds, LineSegment... lineSegments) {
 		Track t = new Track();
-		t.segments.add(ls1);
-		t.segments.add(ls2);
+		t.segments.addAll(Arrays.asList(lineSegments));
 		ds.tracks.add(t);
-		return ds;
+		return t;
 	}
 	
