Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 7227)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 7232)
@@ -22,4 +22,5 @@
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
@@ -253,7 +254,6 @@
             if (dualAlignEnabled) {
                 rv.append(" ").append(tr("Dual alignment active."));
-                if (dualAlignSegmentCollapsed) {
+                if (dualAlignSegmentCollapsed)
                     rv.append(" ").append(tr("Segment collapsed due to its direction reversing."));
- 	        }
             }
         } else {
@@ -270,6 +270,10 @@
                 rv = new StringBuilder();
             }
-            if (dualAlignActive)
+            if (dualAlignActive) {
                 rv.append(" ").append(tr("Dual alignment active."));
+                if (dualAlignSegmentCollapsed) {
+                    rv.append(" ").append(tr("Segment collapsed due to its direction reversing."));
+                }
+            }
         }
         return rv.toString();
@@ -586,5 +590,7 @@
         wnew.addNode(selectedSegment.getSecondNode());
         wnew.addNode(third);
-        wnew.addNode(fourth);
+        if (newN1en.distance(newN2en)>1e-6) {
+            wnew.addNode(fourth); // rectangle can degrade to triangle for dual alignment
+        }
         // ... and close the way
         wnew.addNode(selectedSegment.getFirstNode());
@@ -687,15 +693,15 @@
 
     private void joinNodesIfCollapsed(List<Node> changedNodes) {
-        if (newN1en.distance(newN2en) < 1e-6) {
-            // If the dual alignment created moved two nodes  to the same point, merge them
-            Node targetNode = MergeNodesAction.selectTargetNode(changedNodes);
-            Node locNode = MergeNodesAction.selectTargetLocationNode(changedNodes);
-            Command mergeCmd = MergeNodesAction.mergeNodes(Main.main.getEditLayer(), changedNodes, targetNode, locNode);
-            if (mergeCmd!=null) {
-                Main.main.undoRedo.add(mergeCmd);
-            } else {
-                // undo extruding command itself
-                Main.main.undoRedo.undo();
-            }
+        if (!dualAlignActive || newN1en == null || newN2en == null) return;
+        if (newN1en.distance(newN2en) > 1e-6) return;
+        // If the dual alignment moved two nodes to the same point, merge them
+        Node targetNode = MergeNodesAction.selectTargetNode(changedNodes);
+        Node locNode = MergeNodesAction.selectTargetLocationNode(changedNodes);
+        Command mergeCmd = MergeNodesAction.mergeNodes(Main.main.getEditLayer(), changedNodes, targetNode, locNode);
+        if (mergeCmd!=null) {
+            Main.main.undoRedo.add(mergeCmd);
+        } else {
+            // undo extruding command itself
+            Main.main.undoRedo.undo();
         }
     }
@@ -848,4 +854,9 @@
         EastNorth n1en = selectedSegment.getFirstNode().getEastNorth();
         EastNorth n2en = selectedSegment.getSecondNode().getEastNorth();
+        if (n1en.distance(prevNode.getEastNorth())<1e-4 ||
+            n2en.distance(nextNode.getEastNorth())<1e-4 ) {
+            return false;
+        }
+
         boolean prevSegmentParallel = Geometry.segmentsParallel(n1en, prevNode.getEastNorth(), n1en, n2en);
         boolean nextSegmentParallel = Geometry.segmentsParallel(n2en, nextNode.getEastNorth(), n1en, n2en);
