Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1422)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1423)
@@ -147,13 +147,13 @@
         return nodes.size() >= 3 && lastNode() == firstNode();
     }
-    
+
     public Node lastNode() {
         return nodes.get(nodes.size()-1);
     }
-    
+
     public Node firstNode() {
         return nodes.get(0);
     }
-    
+
     public boolean isFirstLastNode(Node n) {
         return n == firstNode() || n == lastNode();
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1422)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1423)
@@ -518,5 +518,5 @@
         Way fromWay = null;
         Way toWay = null;
-        Node via = null;
+        OsmPrimitive via = null;
 
         /* find the "from", "via" and "to" elements */
@@ -557,4 +557,9 @@
                             toWay = w;
                         }
+                    } else if("via".equals(m.role)) {
+                        if(via != null)
+                            r.putError(tr("More than one \"via\" found."), true);
+                        else
+                            via = w;
                     }
                     else
@@ -565,9 +570,10 @@
                     Node n = (Node) m.member;
                     if("via".equals(m.role))
+                    {
                         if(via != null)
-                            System.out.println("More than one \"via\" found.");
-                        else {
+                            r.putError(tr("More than one \"via\" found."), true);
+                        else
                             via = n;
-                        }
+                    }
                     else
                         r.putError(tr("Unknown role ''{0}''.", m.role), true);
@@ -587,55 +593,59 @@
         }
         if (via == null) {
-            r.putError(tr("No \"via\" node found."), true);
+            r.putError(tr("No \"via\" node or way found."), true);
             return;
         }
 
-        /* check if "from" way starts or ends at via */
-        if(fromWay.nodes.get(0) != via && fromWay.nodes.get(fromWay.nodes.size()-1) != via) {
-            r.putError(tr("The \"from\" way doesn't start or end at a \"via\" node."), true);
-            return;
-        }
-        /* check if "to" way starts or ends at via */
-        /*if(toWay.nodes.get(0) != via && toWay.nodes.get(toWay.nodes.size()-1) != via) {
-            r.putError(tr("to way doesn't start or end at a via node"), true);
-            return;
-        }*/
+        Node viaNode;
+        if(via instanceof Node)
+        {
+            viaNode = (Node) via;
+            if(!fromWay.isFirstLastNode(viaNode)) {
+                r.putError(tr("The \"from\" way doesn't start or end at a \"via\" node."), true);
+                return;
+            }
+            if(!toWay.isFirstLastNode(viaNode))
+                r.putError(tr("The \"to\" way doesn't start or end at a \"via\" node."), true);
+        }
+        else
+        {
+            Way viaWay = (Way) via;
+            Node firstNode = viaWay.firstNode();
+            Node lastNode = viaWay.lastNode();
+            if(fromWay.isFirstLastNode(firstNode))
+                viaNode = firstNode;
+            else if(fromWay.isFirstLastNode(lastNode))
+                viaNode = firstNode;
+            else {
+                r.putError(tr("The \"from\" way doesn't start or end at the \"via\" way."), true);
+                return;
+            }
+            if(!toWay.isFirstLastNode(viaNode == firstNode ? lastNode : firstNode))
+                r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true);
+        }
 
         /* find the "direct" nodes before the via node */
         Node fromNode = null;
-        try
-        {
-            if(fromWay.nodes.get(0) == via) {
-                //System.out.println("From way heading away from via");
-                fromNode = fromWay.nodes.get(1);
-            } else {
-                //System.out.println("From way heading towards via");
-                fromNode = fromWay.nodes.get(fromWay.nodes.size()-2);
-            }
-        } catch (IndexOutOfBoundsException ioobe) {
-            r.putError(tr("The \"{0}\" way must contain at least 2 nodes.", "from"), true);
-        }
-
+        if(fromWay.firstNode() == via) {
+            //System.out.println("From way heading away from via");
+            fromNode = fromWay.nodes.get(1);
+        } else {
+            //System.out.println("From way heading towards via");
+            fromNode = fromWay.nodes.get(fromWay.nodes.size()-2);
+        }
+
+        Point pFrom = nc.getPoint(fromNode.eastNorth);
+        Point pVia = nc.getPoint(viaNode.eastNorth);
+
+        //if(restrictionDebug) {
         /* find the "direct" node after the via node */
-        Node toNode = null;
-        try
-        {
-            if(toWay.nodes.get(0) == via) {
-                //if(restrictionDebug)
-                //    System.out.println("To way heading away from via");
-                toNode = toWay.nodes.get(1);
-            } else {
-                //if(restrictionDebug)
-                //    System.out.println("To way heading towards via");
-                toNode = toWay.nodes.get(toWay.nodes.size()-2);
-            }
-        } catch (IndexOutOfBoundsException ioobe) {
-            r.putError(tr("The \"{0}\" way must contain at least 2 nodes.", "to"), true);
-        }
-
-        Point pFrom = nc.getPoint(fromNode.eastNorth);
-        Point pVia = nc.getPoint(via.eastNorth);
-
-        //if(restrictionDebug) {
+        //    Node toNode = null;
+        //    if(toWay.firstNode() == via) {
+        //      System.out.println("To way heading away from via");
+        //        toNode = toWay.nodes.get(1);
+        //    } else {
+        //        System.out.println("To way heading towards via");
+        //        toNode = toWay.nodes.get(toWay.nodes.size()-2);
+        //    }
         //    Point pTo = nc.getPoint(toNode.eastNorth);
 
@@ -681,5 +691,5 @@
            90degrees away from the first segment of the "from" way)
         */
-        double distanceFromWay=8;
+        double distanceFromWay=10;
         double vx2 = 0;
         double vy2 = 0;
