Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 4916)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 4917)
@@ -69,4 +69,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.Geometry;
 
 /**
@@ -98,4 +99,5 @@
     private Shortcut extraShortcut;
     private Shortcut backspaceShortcut;
+    private int snappingKeyCode;
     
     private JCheckBoxMenuItem snapCheckboxMenuItem;
@@ -110,5 +112,7 @@
         extraShortcut = Shortcut.registerShortcut("mapmode:drawfocus", tr("Mode: Draw Focus"), KeyEvent.VK_N, Shortcut.GROUP_EDIT);
         Main.registerActionShortcut(this, extraShortcut);
-        
+
+        snappingKeyCode = Shortcut.registerShortcut("mapmode:drawanglesnapping", tr("Mode: Draw Angle snapping"), KeyEvent.VK_TAB, Shortcut.GROUP_EDIT)
+                .getKeyStroke().getKeyCode();
         snapCheckboxMenuItem = MainMenu.addWithCheckbox(Main.main.menu.editMenu, new SnapChangeAction(),  MainMenu.WINDOW_MENU_GROUP.VOLATILE);
         snapHelper.setMenuCheckBox(snapCheckboxMenuItem);
@@ -224,5 +228,5 @@
     private Timer timer;
     void processKeyEvent(KeyEvent e) {
-        if (e.getKeyCode() != KeyEvent.VK_TAB) return;
+        if (e.getKeyCode() != snappingKeyCode) return;
         //e.consume(); // ticket #7250 -  TAB should work in other windows
 
@@ -250,10 +254,10 @@
     
     private void doKeyPressEvent(KeyEvent e) {
-        if (e.getKeyCode() != KeyEvent.VK_TAB) return;
+        if (e.getKeyCode() != snappingKeyCode) return;
         snapHelper.setFixedMode();
         computeHelperLine(); redrawIfRequired();
     }
     private void doKeyReleaseEvent(KeyEvent e) {
-        if (e.getKeyCode() != KeyEvent.VK_TAB) return;
+        if (e.getKeyCode() != snappingKeyCode) return;
         snapHelper.unFixOrTurnOff();
         computeHelperLine(); redrawIfRequired();
@@ -414,4 +418,7 @@
                     List<WaySegment> wss = Main.map.mapView.getNearestWaySegments(
                             Main.map.mapView.getPoint(n), OsmPrimitive.isSelectablePredicate);
+                    if (snapHelper.isActive()) { // 
+                        tryToMoveNodeOnIntersection(wss,n);
+                    }
                     insertNodeIntoAllNearbySegments(wss, n, newSelection, cmds, replacedWays, reuseWays);
                     }
@@ -952,4 +959,15 @@
         return a * d - b * c;
     }
+
+    private void tryToMoveNodeOnIntersection(List<WaySegment> wss, Node n) {
+        if (wss.isEmpty()) return;
+        WaySegment ws = wss.get(0);
+        EastNorth p1=ws.getFirstNode().getEastNorth();
+        EastNorth p2=ws.getSecondNode().getEastNorth();
+	if (snapHelper.dir2!=null && currentBaseNode!=null) {
+            EastNorth xPoint = Geometry.getSegmentSegmentIntersection(p1, p2, snapHelper.dir2, currentBaseNode.getEastNorth());
+            if (xPoint!=null) n.setEastNorth(xPoint);
+        }
+    }
 /**
      * Takes the data from computeHelperLine to determine which ways/nodes should be highlighted
@@ -1447,4 +1465,10 @@
                     }
                }));
+               add(new AbstractAction(tr("Disable")) {
+                public void actionPerformed(ActionEvent e) {
+                    saveAngles("180");
+                    init(); enableSnapping();
+                }
+               });
                add(new AbstractAction(tr("0,90,...")) {
                 public void actionPerformed(ActionEvent e) {
