Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 7217)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 7218)
@@ -49,4 +49,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.gui.util.ModifierListener;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -65,5 +66,5 @@
  * feature "selection remove" is disabled on this platform.
  */
-public class SelectAction extends MapMode implements ModifierListener, SelectionEnded {
+public class SelectAction extends MapMode implements ModifierListener, KeyPressReleaseListener, SelectionEnded {
     // "select" means the selection rectangle and "move" means either dragging
     // or select if no mouse movement occurs (i.e. just clicking)
@@ -102,4 +103,5 @@
 
     private boolean lassoMode = false;
+    public boolean repeatedKeySwitchLassoOption;
 
     // Cache previous mouse event (needed when only the modifier keys are
@@ -182,8 +184,10 @@
         initialMoveDelay = Main.pref.getInteger("edit.initial-move-delay", 200);
         initialMoveThreshold = Main.pref.getInteger("edit.initial-move-threshold", 5);
+        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
         Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addKeyListener(this);
     }
 
@@ -196,4 +200,5 @@
         mv.setVirtualNodesEnabled(false);
         Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeKeyListener(this);
         removeHighlighting();
     }
@@ -627,4 +632,20 @@
         updateKeyModifiers(e);
         selectPrims(selectionManager.getSelectedObjects(alt), true, true);
+    }
+
+    @Override
+    public void doKeyPressed(KeyEvent e) {
+        if (!Main.isDisplayingMapView() ||
+                !repeatedKeySwitchLassoOption || !getShortcut().isEvent(e)) return;
+        e.consume();
+        if (!lassoMode) {
+            Main.map.selectMapMode(Main.map.mapModeSelectLasso);
+        } else {
+            Main.map.selectMapMode(Main.map.mapModeSelect);
+        }
+    }
+
+    @Override
+    public void doKeyReleased(KeyEvent e) {
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 7217)
+++ /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 7218)
@@ -135,4 +135,6 @@
     // Map modes
     public final SelectAction mapModeSelect;
+    public LassoModeAction mapModeSelectLasso;
+
     private final Map<Layer, MapMode> lastMapMode = new HashMap<>();
     private final MapMode mapModeDraw;
@@ -216,5 +218,5 @@
         // toolBarActions, map mode buttons
         addMapMode(new IconToggleButton(mapModeSelect = new SelectAction(this)));
-        addMapMode(new IconToggleButton(new LassoModeAction(), true));
+        addMapMode(new IconToggleButton(mapModeSelectLasso = new LassoModeAction(), true));
         addMapMode(new IconToggleButton(mapModeDraw = new DrawAction(this)));
         addMapMode(new IconToggleButton(mapModeZoom = new ZoomAction(this)));
