Index: src/org/openstreetmap/josm/actions/GroupAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/GroupAction.java	(revision 134)
+++ src/org/openstreetmap/josm/actions/GroupAction.java	(revision 135)
@@ -3,4 +3,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -8,4 +9,5 @@
 import java.util.List;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Icon;
@@ -30,12 +32,8 @@
 	private PropertyChangeListener forwardActiveListener = new PropertyChangeListener(){
 		public void propertyChange(PropertyChangeEvent evt) {
-			if (evt.getPropertyName().equals("active")) {
+			if (evt.getPropertyName().equals("active"))
 				putValue("active", evt.getNewValue());
-				if (evt.getNewValue() == Boolean.FALSE)
-					cycle = false;
-			}
 		}
 	};
-	public boolean cycle;
 
 	protected void setCurrent(int current) {
@@ -53,11 +51,12 @@
 		String idName = getClass().getName();
 		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(shortCut, modifiers), idName);
-        Main.contentPane.getActionMap().put(idName, this);
+		Main.contentPane.getActionMap().put(idName, this);
 		shortCutName = ShortCutLabel.name(shortCut, modifiers);
-		addPropertyChangeListener(new PropertyChangeListener(){
-			public void propertyChange(PropertyChangeEvent evt) {
-				if (evt.getPropertyName().equals("active") && evt.getNewValue() == Boolean.FALSE)
-					cycle = false;
-            }
+		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(shortCut, KeyEvent.SHIFT_DOWN_MASK), idName+".cycle");
+		Main.contentPane.getActionMap().put(idName+".cycle", new AbstractAction(){
+			public void actionPerformed(ActionEvent e) {
+				setCurrent((current+1)%actions.size());
+				actions.get(current).actionPerformed(e);
+			}
 		});
 	}
@@ -68,11 +67,6 @@
 			b.setSelected(!b.isSelected());
 			openPopup(b);
-		} else {
-			if (cycle)
-				setCurrent((current+1)%actions.size());
-			else
-				cycle = true;
+		} else
 			actions.get(current).actionPerformed(e);
-		}
 	}
 
Index: src/org/openstreetmap/josm/gui/MapMover.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapMover.java	(revision 134)
+++ src/org/openstreetmap/josm/gui/MapMover.java	(revision 135)
@@ -32,9 +32,10 @@
         }
 	    public void actionPerformed(ActionEvent e) {
-	    	if (action.equals("+") || action.equals("-")) {
+	    	System.out.println("e="+e.toString()+" action="+e.getActionCommand());
+	    	if (action.equals(".") || action.equals(",")) {
 	    		Point mouse = nc.getMousePosition();
 	    		if (mouse == null)
 	    			mouse = new Point((int)nc.getBounds().getCenterX(), (int)nc.getBounds().getCenterY());
-	    		MouseWheelEvent we = new MouseWheelEvent(nc, e.getID(), e.getWhen(), e.getModifiers(), mouse.x, mouse.y, 0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, 1, action.equals("+") ? -1 : 1);
+	    		MouseWheelEvent we = new MouseWheelEvent(nc, e.getID(), e.getWhen(), e.getModifiers(), mouse.x, mouse.y, 0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, 1, action.equals(",") ? -1 : 1);
 	    		mouseWheelMoved(we);
 	    	} else {
@@ -78,6 +79,6 @@
 		nc.addMouseWheelListener(this);
 		
-		String[] n = {"+","-","up","right","down","left"};
-		int[] k = {KeyEvent.VK_PLUS, KeyEvent.VK_MINUS, KeyEvent.VK_UP, KeyEvent.VK_RIGHT, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT};
+		String[] n = {",",".","up","right","down","left"};
+		int[] k = {KeyEvent.VK_COMMA, KeyEvent.VK_PERIOD, KeyEvent.VK_UP, KeyEvent.VK_RIGHT, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT};
 
 		for (int i = 0; i < n.length; ++i) {
