Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 1198)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 1200)
@@ -91,5 +91,5 @@
             name = get("name");
             if (name == null)
-                name = id == 0 ? "" : ""+id;
+                name = id == 0 ? tr("node") : ""+id;
             name += " (" + coor.latToString(mCord) + ", " + coor.lonToString(mCord) + ")";
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1198)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1200)
@@ -1,8 +1,11 @@
 // License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.data.osm;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -34,4 +37,9 @@
      */
     public Map<String, String> keys;
+
+    /**
+     * The key/value list for this primitive.
+     */
+    public Collection<String> errors;
 
     /**
@@ -314,3 +322,16 @@
         }
     }
+
+    public void putError(String text, Boolean isError)
+    {
+        if(errors == null)
+            errors = new ArrayList<String>();
+        String s = isError ? tr("Error: {0}", text) : tr("Warning: {0}", text);
+System.out.println(s);
+        errors.add(s);
+    }
+    public void clearErrors()
+    {
+        errors = null;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 1198)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 1200)
@@ -78,5 +78,4 @@
         } else {
             name = get("type");
-            // FIXME add names of members
             if (name == null)
                 name = tr("relation");
@@ -89,4 +88,6 @@
             int mbno = members.size();
             name += trn("{0} member", "{0} members", mbno, mbno) + ")";
+            if(errors != null)
+                name = "*"+name;
         }
         return name;
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1198)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1200)
@@ -113,5 +113,6 @@
 
             int nodesNo = new HashSet<Node>(nodes).size();
-            name += trn(" ({0} node)", " ({0} nodes)", nodesNo, nodesNo);
+            String nodes = trn("{0} node", "{0} nodes", nodesNo, nodesNo);
+            name += (name.length() > 0) ? " ("+nodes+")" : nodes;
         }
         return name;
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1198)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1200)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.BasicStroke;
@@ -212,5 +213,5 @@
     }
 
-    public Collection<Way> joinWays(Collection<Way> join)
+    public Collection<Way> joinWays(Collection<Way> join, OsmPrimitive errs)
     {
         Collection<Way> res = new LinkedList<Way>();
@@ -290,5 +291,9 @@
             if(!w.isClosed())
             {
-System.out.println("ERROR: multipolygon way is not closed." + w);
+                if(errs != null)
+                {
+                    errs.putError(tr("multipolygon way ''{0}'' is not closed.",
+                    w.getName()), true);
+                }
             }
             res.add(w);
@@ -296,4 +301,19 @@
 
         return res;
+    }
+
+    public void drawSelectedRelation(Relation r)
+    {
+        for (RelationMember m : r.members)
+        {
+            if (!m.member.incomplete && !m.member.deleted
+            && !(m.member instanceof Relation))
+            {
+                /* nodes drawn on second call */
+                if(!(m.member instanceof Node))
+                    drawSelected(m.member, styles.get(m.member), true, true);
+                alreadyDrawn.add(m.member);
+            }
+        }
     }
 
@@ -348,17 +368,5 @@
         {
             if(r.selected)
-            {
-                for (RelationMember m : r.members)
-                {
-                    if (!m.member.incomplete && !m.member.deleted
-                    && !(m.member instanceof Relation))
-                    {
-                        /* nodes drawn on second call */
-                        if(!(m.member instanceof Node))
-                            drawSelected(m.member, styles.get(m.member), true, true);
-                        alreadyDrawn.add(m.member);
-                    }
-                }
-            }
+                drawSelectedRelation(r);
             return;
         }
@@ -368,8 +376,16 @@
         Collection<Way> innerclosed = new LinkedList<Way>();
         Collection<Way> outerclosed = new LinkedList<Way>();
+        Boolean incomplete = false;
+
+        r.clearErrors();
 
         for (RelationMember m : r.members)
         {
-            if (!m.member.incomplete && !m.member.deleted)
+            if(m.member.incomplete)
+                incomplete = true;
+            else if(m.member.deleted)
+                r.putError(tr("Deleted member ''{0}'' in relation.",
+                m.member.getName()), true);
+            else
             {
                 if(m.member instanceof Way)
@@ -378,5 +394,6 @@
                     if(w.nodes.size() < 2)
                     {
-System.out.println("ERROR: Way with less than two points " + w);
+                        r.putError(tr("Way ''{0}'' with less than two points.",
+                        w.getName()), true);
                     }
                     else if("inner".equals(m.role))
@@ -386,5 +403,6 @@
                     else
                     {
-System.out.println("ERROR: No useful role for Way " + w);
+                        r.putError(tr("No useful role ''{0}'' for Way ''{1}''.",
+                        m.role == null ? "" : m.role, w.getName()), true);
                         if(m.role == null || m.role.length() == 0)
                             outer.add(w);
@@ -396,5 +414,6 @@
                 {
                     /* nodes drawn on second call */
-System.out.println("ERROR: Non-Way in multipolygon " + m.member);
+                    r.putError(tr("Non-Way ''{0}'' in multipolygon.",
+                    m.member.getName()), true);
                 }
             }
@@ -426,5 +445,5 @@
             if(join.size() != 0)
             {
-                for(Way w : joinWays(join))
+                for(Way w : joinWays(join, incomplete ? null : r))
                     outerclosed.add(w);
             }
@@ -439,5 +458,5 @@
             if(join.size() != 0)
             {
-                for(Way w : joinWays(join))
+                for(Way w : joinWays(join, incomplete ? null : r))
                     innerclosed.add(w);
             }
@@ -504,5 +523,6 @@
                     if(wayStyle.equals(innerStyle))
                     {
-System.out.println("WARNING: Inner waystyle equals multipolygon for way " + wInner);
+                        r.putError(tr("Style for inner way ''{0}'' equals multipolygon.",
+                        wInner.getName()), false);
                         if(!r.selected)
                             alreadyDrawnAreas.add(wInner);
@@ -528,5 +548,6 @@
                     && !wayStyle.equals(outerStyle))
                     {
-System.out.println("ERROR: Outer waystyle does not match multipolygon for way " + wOuter);
+                        r.putError(tr("Style for outer way ''{0}'' mismatches.",
+                        wOuter.getName()), true);
                     }
                     if(r.selected)
@@ -540,4 +561,6 @@
             }
         }
+        else if(r.selected)
+            drawSelectedRelation(r);
     }
 
