diff --git a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
index 252852c..1e84ad3 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
@@ -50,7 +50,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  */
 public class ExtrudeAction extends MapMode implements MapViewPaintable {
 
-    enum Mode { extrude, translate, select }
+    enum Mode { extrude, translate, select, add_node }
 
     private Mode mode = Mode.select;
 
@@ -116,8 +116,10 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable {
             return tr("Move a segment along its normal, then release the mouse button.");
         else if (mode == Mode.extrude)
             return tr("Draw a rectangle of the desired size, then release the mouse button.");
+        else if (mode == Mode.add_node)
+            return tr("Release mouse button to add the node");
         else
-            return tr("Drag a way segment to make a rectangle. Ctrl-drag to move a segment along its normal.");
+            return tr("Drag a way segment to make a rectangle. Ctrl-drag to move a segment along its normal. Alt-click to add a node");
     }
 
     @Override public boolean layerIsSupported(Layer l) {
@@ -153,6 +155,9 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable {
 
         if (selectedSegment == null) {
             // If nothing gets caught, stay in select mode
+        } else if ((e.getModifiers() & ActionEvent.ALT_MASK) != 0) {
+            mode = Mode.add_node;
+            updateStatusLine();
         } else {
             // Otherwise switch to another mode
 
@@ -221,7 +226,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable {
         if (System.currentTimeMillis() - mouseDownTime < initialMoveDelay)
             return;
 
-        if (mode == Mode.select) {
+        if (mode == Mode.select || mode == Mode.add_node) {
             // Just sit tight and wait for mouse to be released.
         } else {
             //move and extrude mode - move the selected segment
@@ -291,6 +296,28 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable {
 
         if (mode == Mode.select) {
             // Nothing to be done
+        } else if (mode == Mode.add_node) {
+            // Should maybe do the same as in DrawAction and fetch all nearby segments?
+            WaySegment ws = Main.map.mapView.getNearestWaySegment(e.getPoint(), OsmPrimitive.isSelectablePredicate);
+            if (ws == null) {
+                mode = Mode.select;
+                return;
+            }
+
+            Node n = new Node(Main.map.mapView.getLatLon(e.getX(), e.getY()));
+
+            EastNorth A = ws.getFirstNode().getEastNorth();
+            EastNorth B = ws.getSecondNode().getEastNorth();
+            n.setEastNorth(Geometry.closestPointToSegment(A, B, n.getEastNorth()));
+
+            Way wnew = new Way(ws.way);
+            wnew.addNode(ws.lowerIndex+1, n);
+
+            SequenceCommand cmds = new SequenceCommand(tr("Add a new node to an existing way"),
+                    new AddCommand(n), new ChangeCommand(ws.way, wnew));
+
+            Main.main.undoRedo.add(cmds);
+            mode = Mode.select;
         } else {
             if (mode == Mode.extrude) {
                 if (e.getPoint().distance(initialMousePos) > 10 && newN1en != null) {
@@ -355,9 +382,9 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable {
             moveCommand = null;
             mode = Mode.select;
 
-            updateStatusLine();
             Main.map.mapView.repaint();
         }
+        updateStatusLine();
     }
 
     /**
