Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1411)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1412)
@@ -74,4 +74,5 @@
     private boolean drawTargetCursor;
     private Point mousePos;
+    private Point oldMousePos;
     private Color selectedColor;
 
@@ -247,11 +248,17 @@
         if(!Main.map.mapView.isDrawableLayer())
             return;
-        if(e.getClickCount() > 1) {
+        
+        if(e.getClickCount() > 1 && mousePos != null && mousePos.equals(oldMousePos)) {
             // A double click equals "user clicked last node again, finish way"
+            // Change draw tool only if mouse position is nearly the same, as
+            // otherwise fast clicks will count as a double click
             lastUsedNode = null;
             wayIsFinished = true;
+
             Main.map.selectSelectTool(true);
             return;
         }
+        oldMousePos = mousePos;
+        
         // we copy ctrl/alt/shift from the event just in case our global
         // AWTEvent didn't make it through the security manager. Unclear
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1411)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1412)
@@ -10,7 +10,9 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 
 import javax.swing.JOptionPane;
@@ -57,4 +59,5 @@
     private long mouseDownTime = 0;
     private boolean didMove = false;
+    private boolean cancelDrawMode = false;
     Node virtualNode = null;
     WaySegment virtualWay = null;
@@ -142,4 +145,5 @@
      */
     @Override public void mouseDragged(MouseEvent e) {
+        cancelDrawMode = true;
         if (mode == Mode.select) return;
 
@@ -279,4 +283,5 @@
      */
     @Override public void mousePressed(MouseEvent e) {
+        cancelDrawMode = false;
         if (! (Boolean)this.getValue("active")) return;
         if (e.getButton() != MouseEvent.BUTTON1)
@@ -329,7 +334,10 @@
         if (mode == Mode.select) {
             selectionManager.unregister(Main.map.mapView);
-            if(Main.ds.getSelected().size() == 0)
+
+            // Select Draw Tool if no selection has been made
+            if(Main.ds.getSelected().size() == 0 && !cancelDrawMode) {
                 Main.map.selectDrawTool(true);
                 return;
+            }
         }
         restoreCursor();
@@ -342,4 +350,17 @@
                     Main.map.mapView.getNearestCollection(e.getPoint()),
                     shift, ctrl);
+
+                // If the user double-clicked a node, change to draw mode
+                List<OsmPrimitive> sel = new ArrayList<OsmPrimitive>(Main.ds.getSelected());
+                if(e.getClickCount() >=2 && sel.size() == 1 && sel.get(0) instanceof Node) {
+                    // We need to do it like this as otherwise drawAction will see a double
+                    // click and switch back to SelectMode
+                    Main.worker.execute(new Runnable(){
+                        public void run() {
+                            Main.map.selectDrawTool(true);
+                        }
+                    });
+                    return;
+                }
             } else {
                 Collection<OsmPrimitive> selection = Main.ds.getSelected();
@@ -402,5 +423,5 @@
         }
     }
-    
+
     @Override public boolean layerIsSupported(Layer l) {
         return l instanceof OsmDataLayer;
