Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 5966)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(working copy)
@@ -131,6 +131,7 @@
     private final Map<Layer, MapMode> lastMapMode = new HashMap<Layer, MapMode>();
     private final MapMode mapModeDraw;
     private final MapMode mapModeZoom;
+    public final MapMode mapModeLassoSelect; 
 
     /**
      * The status line below the map
@@ -207,7 +208,7 @@
 
         // toolBarActions, map mode buttons
         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));
@@ -375,8 +376,10 @@
             return false;
 
         MapMode oldMapMode = this.mapMode;
-        if (newMapMode == oldMapMode)
+        if (newMapMode == oldMapMode) {
+            newMapMode.reenterMode();
             return true;
+        }
         if (oldMapMode != null) {
             oldMapMode.exitMode();
         }
Index: src/org/openstreetmap/josm/actions/LassoModeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/LassoModeAction.java	(revision 5966)
+++ src/org/openstreetmap/josm/actions/LassoModeAction.java	(working copy)
@@ -5,6 +5,7 @@
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 public class LassoModeAction extends MapMode {
 
@@ -13,7 +14,7 @@
                 "rope",
                 tr("Lasso selection mode: select objects within a hand-drawn region"),
                 null,
-                null);
+                ImageProvider.getCursor("normal", "rope"));
     }
 
     @Override
@@ -33,4 +34,11 @@
         }
         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/SelectAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 5966)
+++ src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(working copy)
@@ -104,6 +104,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)
@@ -184,6 +185,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
@@ -890,6 +892,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/actions/mapmode/MapMode.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 5966)
+++ src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(working copy)
@@ -64,6 +64,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());
