Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java	(revision 11148)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java	(revision 11149)
@@ -32,11 +32,5 @@
     public void visit(Way w) {
         Set<Node> nodes = new HashSet<>();
-        int last = w.getNodesCount();
-        if (last < 2)
-            return;
-        if (w.firstNode() == w.lastNode())
-            last--; // closed way, ignore last node
-        nodes.add(w.firstNode());
-        for (int i = 1; i < last; i++) {
+        for (int i = 1; i < w.getNodesCount() - 1; i++) {
             Node n = w.getNode(i);
             if (nodes.contains(n)) {
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java	(revision 11148)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java	(revision 11149)
@@ -41,74 +41,6 @@
     }
 
-
     /**
-     * Self-Intersection at first (+ last) node of closed way
-     */
-    @Test
-    public void TestClosedWay() {
-        List<Node> nodes = createNodes();
-
-        Way w = (Way) OsmUtils.createPrimitive("way ");
-        List<Node> wayNodes = new ArrayList<>();
-        wayNodes.add(nodes.get(0));
-        wayNodes.add(nodes.get(1));
-        wayNodes.add(nodes.get(2));
-        wayNodes.add(nodes.get(0)); // problem
-        wayNodes.add(nodes.get(3));
-        wayNodes.add(nodes.get(4));
-        wayNodes.add(nodes.get(0));
-        w.setNodes(wayNodes);
-        SelfIntersectingWay test = new SelfIntersectingWay();
-        test.visit(w);
-        Assert.assertEquals(1, test.getErrors().size());
-        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
-    }
-
-    /**
-     * Self-Intersection at first node of unclosed way
-     */
-    @Test
-    public void TestUnclosedWayFirst() {
-        List<Node> nodes = createNodes();
-
-        Way w = (Way) OsmUtils.createPrimitive("way ");
-        List<Node> wayNodes = new ArrayList<>();
-        wayNodes.add(nodes.get(0));
-        wayNodes.add(nodes.get(1));
-        wayNodes.add(nodes.get(2));
-        wayNodes.add(nodes.get(0)); // problem
-        wayNodes.add(nodes.get(3));
-        wayNodes.add(nodes.get(4));
-        w.setNodes(wayNodes);
-        SelfIntersectingWay test = new SelfIntersectingWay();
-        test.visit(w);
-        Assert.assertEquals(1, test.getErrors().size());
-        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
-    }
-
-    /**
-     * Self-Intersection at first node of unclosed way
-     */
-    @Test
-    public void TestUnclosedWayLast() {
-        List<Node> nodes = createNodes();
-
-        Way w = (Way) OsmUtils.createPrimitive("way ");
-        List<Node> wayNodes = new ArrayList<>();
-        wayNodes.add(nodes.get(0));
-        wayNodes.add(nodes.get(1)); // problem
-        wayNodes.add(nodes.get(2));
-        wayNodes.add(nodes.get(3));
-        wayNodes.add(nodes.get(4));
-        wayNodes.add(nodes.get(1));
-        w.setNodes(wayNodes);
-        SelfIntersectingWay test = new SelfIntersectingWay();
-        test.visit(w);
-        Assert.assertEquals(1, test.getErrors().size());
-        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(1)));
-    }
-
-    /**
-     * Self-Intersection at normal node (not first / last)
+     * Self-Intersection at inner node (not first / last).
      */
     @Test
@@ -131,3 +63,70 @@
     }
 
+    /**
+     * First node is identical to an inner node ("P"-Shape).
+     * This is considered okay.
+     */
+    @Test
+    public void TestUnclosedWayFirst() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0)); // problem
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(0, test.getErrors().size());
+    }
+
+    /**
+     * Last node is identical to an inner node ("b"-Shape).
+     * This is considered okay.
+     */
+    @Test
+    public void TestUnclosedWayLast() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1)); // problem node
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        wayNodes.add(nodes.get(1));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(0, test.getErrors().size());
+    }
+
+    /**
+     * Both endpoints join at one inner node ("8"-shape).
+     * This is considered okay.
+     */
+    @Test
+    public void TestClosedWay() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0)); // problem
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        wayNodes.add(nodes.get(0));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(0, test.getErrors().size());
+    }
+
 }
