Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 305)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 306)
@@ -9,4 +9,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -101,6 +102,9 @@
 			if (s == null)
 				return;
-
-			if ((e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) == 0) {
+			
+			// see if another segment is also near
+			Segment other = Main.map.mapView.getNearestSegment(e.getPoint(), Collections.singleton(s));
+
+			if (other == null && (e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) == 0) {
 				// moving the new point to the perpendicular point
 				EastNorth A = s.from.eastNorth;
@@ -116,30 +120,13 @@
 			Collection<Command> cmds = new LinkedList<Command>();
 			cmds.add(c);
-			Segment s1 = new Segment(s);
-			s1.to = n;
-			Segment s2 = new Segment(s.from, s.to);
-			s2.from = n;
-			if (s.keys != null)
-				s2.keys = new HashMap<String, String>(s.keys);
-
-			cmds.add(new ChangeCommand(s, s1));
-			cmds.add(new AddCommand(s2));
-
-			// Add the segment to every way
-			for (Way wold : Main.ds.ways) {
-				if (wold.segments.contains(s)) {
-					Way wnew = new Way(wold);
-					Collection<Segment> segs = new ArrayList<Segment>(wnew.segments);
-					wnew.segments.clear();
-					for (Segment waySeg : segs) {
-						wnew.segments.add(waySeg);
-						if (waySeg == s)
-							wnew.segments.add(s2);
-					}
-					cmds.add(new ChangeCommand(wold, wnew));
-				}
-			}
-
-			c = new SequenceCommand(tr("Add node into segment"), cmds);
+			
+			// split the first segment
+			splitSegmentAtNode(s, n, cmds);
+			
+			// if a second segment was found, split that as well
+			if (other != null) splitSegmentAtNode(other, n, cmds);
+
+			c = new SequenceCommand(tr((other == null) ? 
+				"Add node into segment" : "Add common node into two segments"), cmds);
 		}
 
@@ -194,3 +181,30 @@
 		return way;
 	}
+	
+	private void splitSegmentAtNode(Segment s, Node n, Collection<Command> cmds) {
+		Segment s1 = new Segment(s);
+		s1.to = n;
+		Segment s2 = new Segment(s.from, s.to);
+		s2.from = n;
+		if (s.keys != null)
+			s2.keys = new HashMap<String, String>(s.keys);
+
+		cmds.add(new ChangeCommand(s, s1));
+		cmds.add(new AddCommand(s2));
+
+		// Add the segment to every way
+		for (Way wold : Main.ds.ways) {
+			if (wold.segments.contains(s)) {
+				Way wnew = new Way(wold);
+				Collection<Segment> segs = new ArrayList<Segment>(wnew.segments);
+				wnew.segments.clear();
+				for (Segment waySeg : segs) {
+					wnew.segments.add(waySeg);
+					if (waySeg == s)
+						wnew.segments.add(s2);
+				}
+				cmds.add(new ChangeCommand(wold, wnew));
+			}
+		}
+	}
 }
Index: src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 305)
+++ src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 306)
@@ -4,5 +4,7 @@
 import java.awt.Point;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 
 import javax.swing.JComponent;
@@ -172,12 +174,26 @@
 
 	/**
-	 * @return the nearest segment to the screen point given.
+	 * @return the nearest segment to the screen point given 
+	 * 
+	 * @param p the point for which to search the nearest segment.
 	 */
 	public final Segment getNearestSegment(Point p) {
+		List<Segment> e = Collections.emptyList();
+		return getNearestSegment(p, e);
+	}
+	
+	/**
+	 * @return the nearest segment to the screen point given that is not 
+	 * in ignoreThis.
+	 * 
+	 * @param p the point for which to search the nearest segment.
+	 * @param ignore a collection of segments which are not to be returned. Must not be null.
+	 */
+	public final Segment getNearestSegment(Point p, Collection<Segment> ignore) {
 		Segment minPrimitive = null;
 		double minDistanceSq = Double.MAX_VALUE;
 		// segments
 		for (Segment ls : Main.ds.segments) {
-			if (ls.deleted || ls.incomplete)
+			if (ls.deleted || ls.incomplete || ignore.contains(ls))
 				continue;
 			Point A = getPoint(ls.from.eastNorth);
