Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 6251)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 6252)
@@ -74,4 +74,7 @@
     private Stroke mainStroke;
 
+    /** settings value whether shared nodes should be ignored or not */
+    private boolean ignoreSharedNodes;
+
     /**
      * drawing settings for helper lines
@@ -214,4 +217,6 @@
         oldLineStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.ctrl.stroke.old-line", "1"));
         mainStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.stroke.main", "3"));
+
+        ignoreSharedNodes = Main.pref.getBoolean("extrude.ignore-shared-nodes", true);
     }
 
@@ -443,4 +448,6 @@
         Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
         boolean nodeOverlapsSegment = prevNode != null && Geometry.segmentsParallel(initialN1en, prevNode.getEastNorth(), initialN1en, newN1en);
+        // segmentAngleZero marks subset of nodeOverlapsSegment. nodeOverlapsSegment is true if angle between segments is 0 or PI, segmentAngleZero only if angle is 0
+        boolean segmentAngleZero = prevNode != null && Math.abs(Geometry.getCornerAngle(prevNode.getEastNorth(), initialN1en, newN1en)) < 1e-5;
         boolean hasOtherWays = this.hasNodeOtherWays(selectedSegment.getFirstNode(), selectedSegment.way);
 
@@ -449,4 +456,12 @@
             Node n1Old = selectedSegment.getFirstNode();
             cmds.add(new MoveCommand(n1Old, Main.getProjection().eastNorth2latlon(newN1en)));
+        } else if (ignoreSharedNodes && segmentAngleZero && !alwaysCreateNodes && hasOtherWays) {
+            // replace shared node with new one
+            Node n1Old = selectedSegment.getFirstNode();
+            Node n1New = new Node(Main.getProjection().eastNorth2latlon(newN1en));
+            wnew.addNode(insertionPoint, n1New);
+            wnew.removeNode(n1Old);
+            wayWasModified = true;
+            cmds.add(new AddCommand(n1New));
         } else {
             //introduce new node
@@ -461,4 +476,5 @@
         Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
         nodeOverlapsSegment = nextNode != null && Geometry.segmentsParallel(initialN2en, nextNode.getEastNorth(), initialN2en, newN2en);
+        segmentAngleZero = nextNode != null && Math.abs(Geometry.getCornerAngle(nextNode.getEastNorth(), initialN2en, newN2en)) < 1e-5;
         hasOtherWays = hasNodeOtherWays(selectedSegment.getSecondNode(), selectedSegment.way);
 
@@ -467,4 +483,12 @@
             Node n2Old = selectedSegment.getSecondNode();
             cmds.add(new MoveCommand(n2Old, Main.getProjection().eastNorth2latlon(newN2en)));
+        } else if (ignoreSharedNodes && segmentAngleZero && !alwaysCreateNodes && hasOtherWays) {
+            // replace shared node with new one
+            Node n2Old = selectedSegment.getSecondNode();
+            Node n2New = new Node(Main.getProjection().eastNorth2latlon(newN2en));
+            wnew.addNode(insertionPoint, n2New);
+            wnew.removeNode(n2Old);
+            wayWasModified = true;
+            cmds.add(new AddCommand(n2New));
         } else {
             //introduce new node
