Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 5345)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 5346)
@@ -15,5 +15,5 @@
  */
 public class HistoryNode extends HistoryOsmPrimitive {
-    /** the coordinates */
+    /** the coordinates. May be null for deleted nodes */
 
     private LatLon coords;
Index: trunk/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java	(revision 5345)
+++ trunk/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java	(revision 5346)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.IPrimitive;
@@ -556,9 +557,12 @@
             sb.append(name);
         }
-        sb.append(" (")
-        .append(node.getCoords().latToString(CoordinateFormat.getDefaultFormat()))
-        .append(", ")
-        .append(node.getCoords().lonToString(CoordinateFormat.getDefaultFormat()))
-        .append(")");
+        LatLon coord = node.getCoords();
+        if (coord != null) {
+            sb.append(" (")
+            .append(coord.latToString(CoordinateFormat.getDefaultFormat()))
+            .append(", ")
+            .append(coord.lonToString(CoordinateFormat.getDefaultFormat()))
+            .append(")");
+        }
         decorateNameWithId(sb, node);
         return sb.toString();
Index: trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 5345)
+++ trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 5346)
@@ -15,4 +15,5 @@
 
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.history.HistoryNode;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
@@ -256,22 +257,26 @@
             HistoryNode oppositeNode = (HistoryNode) opposite;
 
+            LatLon coord = node.getCoords();
+            LatLon oppositeCoord = oppositeNode.getCoords();
+            
             // display the coordinates
             //
-            lblLat.setText(node.getCoords().latToString(CoordinateFormat.DECIMAL_DEGREES));
-            lblLon.setText(node.getCoords().lonToString(CoordinateFormat.DECIMAL_DEGREES));
+            lblLat.setText(coord != null ? coord.latToString(CoordinateFormat.DECIMAL_DEGREES) : tr("Deleted"));
+            lblLon.setText(coord != null ? coord.lonToString(CoordinateFormat.DECIMAL_DEGREES) : tr("Deleted"));
 
             // update background color to reflect differences in the coordinates
             //
-            if (node.getCoords().lat() == oppositeNode.getCoords().lat()) {
+            if (coord == oppositeCoord || 
+                    (coord != null && oppositeCoord != null && coord.lat() == oppositeCoord.lat())) {
                 lblLat.setBackground(Color.WHITE);
             } else {
                 lblLat.setBackground(BGCOLOR_DIFFERENCE);
             }
-            if (node.getCoords().lon() == oppositeNode.getCoords().lon()) {
+            if (coord == oppositeCoord || 
+                    (coord != null && oppositeCoord != null && coord.lon() == oppositeCoord.lon())) {
                 lblLon.setBackground(Color.WHITE);
             } else {
                 lblLon.setBackground(BGCOLOR_DIFFERENCE);
             }
-
         }
 
@@ -322,13 +327,21 @@
             HistoryNode oppositeNode = (HistoryNode) opposite;
 
+            LatLon coord = node.getCoords();
+            LatLon oppositeCoord = oppositeNode.getCoords();
+            
             // update distance
             //
-            double distance = node.getCoords().greatCircleDistance(oppositeNode.getCoords());
-            if (distance > 0) {
-                lblDistance.setBackground(BGCOLOR_DIFFERENCE);
+            if (coord != null && oppositeCoord != null) {
+                double distance = coord.greatCircleDistance(oppositeCoord);
+                if (distance > 0) {
+                    lblDistance.setBackground(BGCOLOR_DIFFERENCE);
+                } else {
+                    lblDistance.setBackground(Color.WHITE);
+                }
+                lblDistance.setText(NavigatableComponent.getDistText(distance));
             } else {
-                lblDistance.setBackground(Color.WHITE);
+                lblDistance.setBackground(coord != oppositeCoord ? BGCOLOR_DIFFERENCE : Color.WHITE);
+                lblDistance.setText(tr("Deleted"));
             }
-            lblDistance.setText(NavigatableComponent.getDistText(distance));
         }
     }
Index: trunk/src/org/openstreetmap/josm/io/OsmChangesetContentParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmChangesetContentParser.java	(revision 5345)
+++ trunk/src/org/openstreetmap/josm/io/OsmChangesetContentParser.java	(revision 5346)
@@ -44,4 +44,5 @@
     private ChangesetDataSet data;
 
+    // FIXME: this class has many similarities with OsmHistoryReader.Parser and should be merged 
     private class Parser extends DefaultHandler {
 
@@ -103,8 +104,8 @@
         }
 
-        protected Double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
+        protected Double getAttributeDouble(Attributes attr, String name) throws SAXException{
             String v = attr.getValue(name);
             if (v == null) {
-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
+                return null;
             }
             double d = 0.0;
@@ -112,5 +113,5 @@
                 d = Double.parseDouble(v);
             } catch(NumberFormatException e) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double. Got ''{1}''.", name, v));
+                throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
             }
             return d;
@@ -160,8 +161,9 @@
             HistoryOsmPrimitive primitive = null;
             if (type.equals(OsmPrimitiveType.NODE)) {
-                double lat = getMandatoryAttributeDouble(atts, "lat");
-                double lon = getMandatoryAttributeDouble(atts, "lon");
+                Double lat = getAttributeDouble(atts, "lat");
+                Double lon = getAttributeDouble(atts, "lon");
+                LatLon coor = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
                 primitive = new HistoryNode(
-                        id,version,visible,user,changesetId,timestamp, new LatLon(lat,lon)
+                        id,version,visible,user,changesetId,timestamp,coor
                 );
 
Index: trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 5345)
+++ trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 5346)
@@ -42,4 +42,5 @@
     private final HistoryDataSet data;
 
+    // FIXME: this class has many similarities with OsmChangesetContentParser.Parser and should be merged 
     private class Parser extends DefaultHandler {
 
@@ -99,8 +100,8 @@
         }
 
-        protected Double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
-            String v = attr.getValue(name);
-            if (v == null) {
-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
+        protected Double getAttributeDouble(Attributes attr, String name) throws SAXException{
+            String v = attr.getValue(name);
+            if (v == null) {
+                return null;
             }
             double d = 0.0;
@@ -108,5 +109,5 @@
                 d = Double.parseDouble(v);
             } catch(NumberFormatException e) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double. Got ''{1}''.", name, v));
+                throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
             }
             return d;
@@ -154,8 +155,9 @@
             HistoryOsmPrimitive primitive = null;
             if (type.equals(OsmPrimitiveType.NODE)) {
-                double lat = getMandatoryAttributeDouble(atts, "lat");
-                double lon = getMandatoryAttributeDouble(atts, "lon");
+                Double lat = getAttributeDouble(atts, "lat");
+                Double lon = getAttributeDouble(atts, "lon");
+                LatLon coord = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
                 primitive = new HistoryNode(
-                        id,version,visible,user,changesetId,timestamp, new LatLon(lat,lon)
+                        id,version,visible,user,changesetId,timestamp,coord
                 );
 
