Index: src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2083)
+++ src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(working copy)
@@ -30,6 +30,7 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
@@ -658,6 +659,7 @@
             }
             if(!toWay.isFirstLastNode(viaNode)) {
                 r.putError(tr("The \"to\" way doesn't start or end at a \"via\" node."), true);
+                return;
             }
         }
         else
@@ -665,17 +667,40 @@
             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;
+            String oneway = viaWay.get("oneway");
+            if (oneway == null) {
+                oneway = OsmUtils.falseval;
+            } else if (oneway.equals("-1")) {
+                oneway = OsmUtils.trueval;
             }
-            if(!toWay.isFirstLastNode(viaNode == firstNode ? lastNode : firstNode)) {
-                r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true);
+            if (OsmUtils.getOsmBoolean(oneway)) {
+                if (fromWay.isFirstLastNode(firstNode)) {
+                    viaNode = firstNode;
+                } else {
+                    r.putError(tr("The \"from\" way doesn't start or end at the \"via\" way."), true);
+                    return;
+                }
+
+                if (!toWay.isFirstLastNode(lastNode)) {
+                    r.putError(tr("The \"to\" way doesn't start or end at the \"via\" way."), true);
+                    return;
+                }
+            } else {
+                if (fromWay.isFirstLastNode(firstNode)) {
+                    viaNode = firstNode;
+                } else if (fromWay.isFirstLastNode(lastNode)) {
+                    viaNode = lastNode;
+                } 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);
+                    return;
+                }
             }
+            via = viaNode;
         }
 
         /* find the "direct" nodes before the via node */
