Index: /trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 5409)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 5410)
@@ -121,6 +121,5 @@
 
     /**
-     * Create a new local node.
-     *
+     * Constructs a new local {@code Node} with id 0.
      */
     public Node() {
@@ -129,22 +128,25 @@
 
     /**
-     * Create an incomplete Node object
-     */
-    public Node(long id) {
+     * Constructs an incomplete {@code Node} object with the given id.
+     * @param id The id. Must be >= 0
+     * @throws IllegalArgumentException if id < 0
+     */
+    public Node(long id) throws IllegalArgumentException {
         super(id, false);
     }
 
     /**
-     * Create new node
-     * @param id
-     * @param version
-     */
-    public Node(long id, int version) {
+     * Constructs a new {@code Node} with the given id and version.
+     * @param id The id. Must be >= 0
+     * @param version The version
+     * @throws IllegalArgumentException if id < 0
+     */
+    public Node(long id, int version) throws IllegalArgumentException {
         super(id, version, false);
     }
 
     /**
-     *
-     * @param clone
+     * Constructs an identical clone of the argument.
+     * @param clone The node to clone
      * @param clearId If true, set version to 0 and id to new unique value
      */
@@ -158,5 +160,6 @@
 
     /**
-     * Create an identical clone of the argument (including the id)
+     * Constructs an identical clone of the argument (including the id).
+     * @param clone The node to clone, including its id
      */
     public Node(Node clone) {
@@ -164,4 +167,8 @@
     }
 
+    /**
+     * Constructs a new {@code Node} with the given lat/lon with id 0.
+     * @param latlon The {@link LatLon} coordinates
+     */
     public Node(LatLon latlon) {
         super(0, false);
@@ -169,4 +176,8 @@
     }
 
+    /**
+     * Constructs a new {@code Node} with the given east/north with id 0.
+     * @param eastNorth The {@link EastNorth} coordinates
+     */
     public Node(EastNorth eastNorth) {
         super(0, false);
@@ -181,13 +192,16 @@
     }
 
-    @Override public void visit(Visitor visitor) {
+    @Override
+    public void visit(Visitor visitor) {
         visitor.visit(this);
     }
 
-    @Override public void visit(PrimitiveVisitor visitor) {
+    @Override
+    public void visit(PrimitiveVisitor visitor) {
         visitor.visit(this);
     }
 
-    @Override public void cloneFrom(OsmPrimitive osm) {
+    @Override
+    public void cloneFrom(OsmPrimitive osm) {
         boolean locked = writeLock();
         try {
@@ -242,5 +256,6 @@
     }
 
-    @Override public String toString() {
+    @Override
+    public String toString() {
         String coorDesc = isLatLonKnown() ? "lat="+lat+",lon="+lon : "";
         return "{Node id=" + getUniqueId() + " version=" + getVersion() + " " + getFlagsAsString() + " "  + coorDesc+"}";
@@ -287,4 +302,10 @@
     public void updatePosition() {
     }
+    
+    @Override
+    public boolean isDrawable() {
+        // Not possible to draw a node without coordinates.
+        return super.isDrawable() && isLatLonKnown();
+    }
 
     /**
@@ -298,4 +319,9 @@
     }
 
+    /**
+     * Get debug info for bug #3892.
+     * @return debug info for bug #3892.
+     * @deprecated This method will be remove by the end of 2012 if no report appears.
+     */
     public String get3892DebugInfo() {
         StringBuilder builder = new StringBuilder();
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 5409)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 5410)
@@ -843,9 +843,11 @@
         {
             Point2D p = n.getEastNorth();
-            if (initial) {
-                path.moveTo(p.getX(), p.getY());
-                initial = false;
-            } else {
-                path.lineTo(p.getX(), p.getY());
+            if (p != null) {
+                if (initial) {
+                    path.moveTo(p.getX(), p.getY());
+                    initial = false;
+                } else {
+                    path.lineTo(p.getX(), p.getY());
+                }
             }
         }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 5409)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 5410)
@@ -214,9 +214,11 @@
             for (Node n : nodes) {
                 Point2D p = n.getEastNorth();
-                if (initial) {
-                    poly.moveTo(p.getX(), p.getY());
-                    initial = false;
-                } else {
-                    poly.lineTo(p.getX(), p.getY());
+                if (p != null) {
+                    if (initial) {
+                        poly.moveTo(p.getX(), p.getY());
+                        initial = false;
+                    } else {
+                        poly.lineTo(p.getX(), p.getY());
+                    }
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 5409)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 5410)
@@ -879,9 +879,11 @@
             EastNorth en2 = w.getNode(1).getEastNorth();
             EastNorth en3 = w.getNode(2).getEastNorth();
-            en1 = en1.sub(en2);
-            en2 = en2.sub(en3);
-            return en1.north() * en2.east() - en2.north() * en1.east() > 0 ? ROUNDABOUT_LEFT : ROUNDABOUT_RIGHT;
-        } else
-            return NONE;
+            if (en1 != null && en2 != null && en3 != null) {
+                en1 = en1.sub(en2);
+                en2 = en2.sub(en3);
+                return en1.north() * en2.east() - en2.north() * en1.east() > 0 ? ROUNDABOUT_LEFT : ROUNDABOUT_RIGHT;
+            }
+        }
+        return NONE;
     }
 
