Index: src/org/openstreetmap/josm/actions/LassoModeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/LassoModeAction.java	(revision 5443)
+++ src/org/openstreetmap/josm/actions/LassoModeAction.java	(working copy)
@@ -31,4 +31,11 @@
         Main.map.mapModeSelect.exitMode();
         super.exitMode();
     }
+    
+    @Override
+    public void reenterMode() {
+        if (Main.map != null && Main.map.mapModeSelect.repeatedKeySwitchLassoOption) {
+            Main.map.selectMapMode(Main.map.mapModeSelect);
+        }
+    }
 }
Index: src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 5443)
+++ src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(working copy)
@@ -57,6 +57,12 @@
         putValue("active", false);
         Main.map.mapView.resetCursor(this);
     }
+    /**
+     * For optionlal overloading - called when action is repeated while mapmode
+     * is already active
+     */
+    public void reenterMode() {
+    }
 
     protected void updateStatusLine() {
         Main.map.statusLine.setHelpText(getModeHelpText());
Index: src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 5443)
+++ src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(working copy)
@@ -100,6 +100,7 @@
     }
 
     private boolean lassoMode = false;
+    public boolean repeatedKeySwitchLassoOption;
 
     // Cache previous mouse event (needed when only the modifier keys are
     // pressed but the mouse isn't moved)
@@ -180,6 +181,7 @@
         mv.addMouseMotionListener(this);
         mv.setVirtualNodesEnabled(Main.pref.getInteger("mappaint.node.virtual-size", 8) != 0);
         drawTargetHighlight = Main.pref.getBoolean("draw.target-highlight", true);
+        repeatedKeySwitchLassoOption = Main.pref.getBoolean("mappaint.select.toggle-lasso-on-repeated-S", true);
         cycleManager.init();
         virtualManager.init();
         // This is required to update the cursors when ctrl/shift/alt is pressed
@@ -873,6 +875,13 @@
         this.lassoMode = lassoMode;
     }
     
+    @Override 
+    public void reenterMode() { 
+        if (Main.map!=null && repeatedKeySwitchLassoOption) {
+            Main.map.selectMapMode(Main.map.mapModeLassoSelect);
+        } 
+    } 
+    
     CycleManager cycleManager = new CycleManager();
     VirtualManager virtualManager = new VirtualManager();
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 5443)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(working copy)
@@ -112,6 +112,7 @@
     public final SelectAction mapModeSelect;
     private final MapMode mapModeDraw;
     private final MapMode mapModeZoom;
+    public final MapMode mapModeLassoSelect; 
 
     /**
      * The panel list of all toggle dialog icons. To add new toggle dialog actions, use addToggleDialog
@@ -159,7 +160,7 @@
         // toolbar
         toolBarActions.setFloatable(false);
         addMapMode(new IconToggleButton(mapModeSelect = new SelectAction(this)));
-        addMapMode(new IconToggleButton(new LassoModeAction(), true));
+        addMapMode(new IconToggleButton(mapModeLassoSelect = new LassoModeAction(), true))  ;
         addMapMode(new IconToggleButton(mapModeDraw = new DrawAction(this)));
         addMapMode(new IconToggleButton(mapModeZoom = new ZoomAction(this)));
         addMapMode(new IconToggleButton(new DeleteAction(this), true));
@@ -361,8 +362,10 @@
             return false;
 
         MapMode oldMapMode = this.mapMode;
-        if (newMapMode == oldMapMode)
+        if (newMapMode == oldMapMode) {
+            newMapMode.reenterMode();
             return true;
+        }
         if (oldMapMode != null) {
             oldMapMode.exitMode();
         }
