Index: trunk/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java	(revision 6220)
@@ -10,31 +10,26 @@
 import java.awt.event.WindowEvent;
 import java.awt.event.WindowListener;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ButtonModel;
 
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
 import org.openstreetmap.josm.tools.Shortcut;
+
 /**
  * This action toggles the visibility of the {@link ChangesetCacheManager} dialog.
- *
+ * @since 2685
  */
-public class ChangesetManagerToggleAction extends JosmAction {
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    //FIXME: replace with property Action.SELECTED_KEY when migrating to
-    // Java 6
-    private boolean selected;
+public class ChangesetManagerToggleAction extends ToggleAction {
     private WindowListener changesetCacheManagerClosedHandler;
 
+    /**
+     * Constructs a new {@code ChangesetManagerToggleAction}.
+     */
     public ChangesetManagerToggleAction() {
-        super(
-                tr("Changeset Manager"),
-                "dialogs/changeset/changesetmanager",
-                tr("Toggle visibility of Changeset Manager window"),
-                Shortcut.registerShortcut("menu:windows:changesetdialog",
-                        tr("Toggle visibility of Changeset Manager window"),
-                        KeyEvent.VK_C, Shortcut.ALT_CTRL),
-                true /* register shortcut */
+        super(tr("Changeset Manager"),
+              "dialogs/changeset/changesetmanager",
+              tr("Toggle visibility of Changeset Manager window"),
+              Shortcut.registerShortcut("menu:windows:changesetdialog",
+                      tr("Toggle visibility of Changeset Manager window"),
+                      KeyEvent.VK_C, Shortcut.ALT_CTRL),
+              true /* register shortcut */
         );
         notifySelectedState();
@@ -43,28 +38,9 @@
     }
 
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        toggleSelectedState();
         notifySelectedState();
-        if (selected) {
+        if (isSelected()) {
             ChangesetCacheManager.getInstance().addWindowListener(changesetCacheManagerClosedHandler);
             ChangesetCacheManager.getInstance().setVisible(true);
@@ -75,13 +51,8 @@
     }
 
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        toggleSelectedState();
-    }
-
     private class ChangesetCacheManagerClosedHandler extends WindowAdapter {
         @Override
         public void windowClosed(WindowEvent e) {
-            selected = false;
+            setSelected(false);
             notifySelectedState();
             ChangesetCacheManager.getInstance().removeWindowListener(changesetCacheManagerClosedHandler);
Index: trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 6220)
@@ -7,8 +7,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.List;
 
-import javax.swing.ButtonModel;
 import javax.swing.Icon;
 
@@ -16,56 +13,40 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-/*
-* Action that hides or shows toggle dialogs panel and other panels
-* to free more space for drawing (GIMP-like)
+/**
+* This action toggles visibility of dialogs panel and other panels to free more space for drawing (GIMP-like)
 * @author cmuelle8
+* @since 5965
 */
-public class DialogsToggleAction extends JosmAction {
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    private boolean selected;
+public class DialogsToggleAction extends ToggleAction {
 
+    /**
+     * Constructs a new {@code DialogsToggleAction}.
+     */
     public DialogsToggleAction() {
-        super(
-                tr("Toggle dialogs panel"),
-                (Icon) null, /* no icon */
-                tr("Toggle dialogs panel, maximize mapview"),
-                Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"),KeyEvent.VK_TAB, Shortcut.DIRECT),
-                true, "dialogspanel", /* register in toolbar */
-                false
+        super(tr("Toggle dialogs panel"),
+              (Icon) null, /* no icon */
+              tr("Toggle dialogs panel, maximize mapview"),
+              Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"),KeyEvent.VK_TAB, Shortcut.DIRECT),
+              true, "dialogspanel", /* register in toolbar */
+              false
         );
         putValue("help", ht("/Action/ToggleDialogsPanel"));
-        selected = Main.pref.getBoolean("draw.dialogspanel", true);
+        setSelected(Main.pref.getBoolean("draw.dialogspanel", true));
         notifySelectedState();
     }
 
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
-        Main.pref.put("draw.dialogspanel", selected);
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        toggleSelectedState();
+        Main.pref.put("draw.dialogspanel", isSelected());
         notifySelectedState();
         setMode();
     }
 
+    /**
+     * To call if this action must be initially run at JOSM startup.
+     */
     public void initial() {
-        if(selected) {
+        if (isSelected()) {
             setMode();
         }
@@ -74,4 +55,5 @@
     protected void setMode() {
         if (Main.isDisplayingMapView()) {
+            boolean selected = isSelected();
             Main.map.setDialogsPanelVisible(selected);
             Main.map.statusLine.setVisible(selected || Main.pref.getBoolean("statusbar.always-visible", true));
@@ -85,8 +67,3 @@
         }
     }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        toggleSelectedState();
-    }
 }
Index: trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 6220)
@@ -11,12 +11,11 @@
 import java.util.List;
 
-import javax.swing.ButtonModel;
-
 import org.openstreetmap.josm.Main;
 
-public class ExpertToggleAction extends JosmAction {
-
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    private boolean selected;
+/**
+ * This action toggles the Expert mode.
+ * @since 4840
+ */
+public class ExpertToggleAction extends ToggleAction {
 
     public interface ExpertModeChangeListener {
@@ -118,44 +117,23 @@
     }
 
+    /**
+     * Constructs a new {@code ExpertToggleAction}.
+     */
     public ExpertToggleAction() {
-        super(
-                tr("Expert Mode"),
-                "expert",
-                tr("Enable/disable expert mode"),
-                null,
-                false /* register toolbar */
+        super(tr("Expert Mode"),
+              "expert",
+              tr("Enable/disable expert mode"),
+              null,
+              false /* register toolbar */
         );
         putValue("toolbar", "expertmode");
         Main.toolbar.register(this);
-        selected = Main.pref.getBoolean("expert", false);
+        setSelected(Main.pref.getBoolean("expert", false));
         notifySelectedState();
     }
 
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-            model.setSelected(selected);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
     protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-        fireExpertModeChanged(selected);
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
-        Main.pref.put("expert", selected);
-        notifySelectedState();
+        super.notifySelectedState();
+        fireExpertModeChanged(isSelected());
     }
 
@@ -163,14 +141,20 @@
     public void actionPerformed(ActionEvent e) {
         toggleSelectedState();
+        Main.pref.put("expert", isSelected());
+        notifySelectedState();
     }
 
-    public boolean isSelected() {
-        return selected;
-    }
-
+    /**
+     * Replies the unique instance of this action.
+     * @return The unique instance of this action
+     */
     public static ExpertToggleAction getInstance() {
         return INSTANCE;
     }
 
+    /**
+     * Determines if expert mode is enabled.
+     * @return {@code true} if expert mode is enabled, {@code false} otherwise.
+     */
     public static boolean isExpert() {
         return INSTANCE.isSelected();
Index: trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java	(revision 6220)
@@ -16,5 +16,4 @@
 import java.util.List;
 
-import javax.swing.ButtonModel;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
@@ -25,17 +24,21 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class FullscreenToggleAction extends JosmAction {
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    private boolean selected;
+/**
+ * This class toggles the full-screen mode.
+ * @since 2533
+ */
+public class FullscreenToggleAction extends ToggleAction {
     private GraphicsDevice gd;
     private Rectangle prevBounds;
 
+    /**
+     * Constructs a new {@code FullscreenToggleAction}.
+     */
     public FullscreenToggleAction() {
-        super(
-                tr("Fullscreen view"),
-                null, /* no icon */
-                tr("Toggle fullscreen view"),
-                Shortcut.registerShortcut("menu:view:fullscreen", tr("Toggle fullscreen view"),KeyEvent.VK_F11, Shortcut.DIRECT),
-                false /* register */
+        super(tr("Fullscreen view"),
+              null, /* no icon */
+              tr("Toggle fullscreen view"),
+              Shortcut.registerShortcut("menu:view:fullscreen", tr("Toggle fullscreen view"),KeyEvent.VK_F11, Shortcut.DIRECT),
+              false /* register */
         );
         putValue("help", ht("/Action/FullscreenView"));
@@ -43,38 +46,23 @@
         Main.toolbar.register(this);
         gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
-        selected = Main.pref.getBoolean("draw.fullscreen", false);
+        setSelected(Main.pref.getBoolean("draw.fullscreen", false));
         notifySelectedState();
     }
 
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
-        Main.pref.put("draw.fullscreen", selected);
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        toggleSelectedState();
+        Main.pref.put("draw.fullscreen", isSelected());
         notifySelectedState();
         setMode();
     }
 
+    /**
+     * To call if this action must be initially run at JOSM startup.
+     */
     public void initial() {
-        if(selected)
+        if (isSelected()) {
             setMode();
+        }
     }
 
@@ -89,4 +77,6 @@
             }
         }
+        
+        boolean selected = isSelected();
 
         frame.dispose();
@@ -120,8 +110,3 @@
         frame.getJMenuBar().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");
     }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        toggleSelectedState();
-    }
 }
Index: trunk/src/org/openstreetmap/josm/actions/ToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ToggleAction.java	(revision 6220)
+++ trunk/src/org/openstreetmap/josm/actions/ToggleAction.java	(revision 6220)
@@ -0,0 +1,106 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.ButtonModel;
+import javax.swing.Icon;
+
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Abtract class for Toggle Actions.
+ * @since 6220
+ */
+public abstract class ToggleAction extends JosmAction {
+
+    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
+
+    /**
+     * Constructs a {@code ToggleAction}.
+     *
+     * @param name the action's text as displayed on the menu (if it is added to a menu)
+     * @param icon the icon to use
+     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
+     *           that html is not supported for menu actions on some platforms.
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *            do want a shortcut, remember you can always register it with group=none, so you
+     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *            the user CANNOT configure a shortcut for your action.
+     * @param registerInToolbar register this action for the toolbar preferences?
+     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
+     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     */
+    public ToggleAction(String name, Icon icon, String tooltip, Shortcut shortcut, boolean registerInToolbar, String toolbarId, boolean installAdapters) {
+        super(name, icon, tooltip, shortcut, registerInToolbar, toolbarId, installAdapters);
+    }
+
+    /**
+     * Constructs a {@code ToggleAction}.
+     *
+     * @param name the action's text as displayed on the menu (if it is added to a menu)
+     * @param iconName the name of icon to use
+     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
+     *           that html is not supported for menu actions on some platforms.
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *            do want a shortcut, remember you can always register it with group=none, so you
+     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *            the user CANNOT configure a shortcut for your action.
+     * @param registerInToolbar register this action for the toolbar preferences?
+     */
+    public ToggleAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
+        super(name, iconName, tooltip, shortcut, registerInToolbar);
+    }
+
+    protected final void setSelected(boolean selected) {
+        putValue(SELECTED_KEY, selected);
+    }
+
+    /**
+     * Determines if this action is currently being selected.
+     * @return {@code true} if this action is currently being selected, {@code false} otherwise
+     */
+    public final boolean isSelected() {
+        Object selected = getValue(SELECTED_KEY);
+        if (selected instanceof Boolean) {
+            return (Boolean) selected;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Adds a button model
+     * @param model The button model to add
+     */
+    public final void addButtonModel(ButtonModel model) {
+        if (model != null && !buttonModels.contains(model)) {
+            buttonModels.add(model);
+            model.setSelected(isSelected());
+        }
+    }
+
+    /**
+     * Removes a button model
+     * @param model The button model to remove
+     */
+    public final void removeButtonModel(ButtonModel model) {
+        if (model != null && buttonModels.contains(model)) {
+            buttonModels.remove(model);
+        }
+    }
+    
+    protected void notifySelectedState() {
+        boolean selected = isSelected();
+        for (ButtonModel model: buttonModels) {
+            if (model.isSelected() != selected) {
+                model.setSelected(selected);
+            }
+        }
+    }
+
+    protected final void toggleSelectedState() {
+        setSelected(!isSelected());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java	(revision 6220)
@@ -7,58 +7,35 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ButtonModel;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class ViewportFollowToggleAction extends JosmAction {
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    private boolean selected;
+/**
+ * This action toggles automatic moving of the map view to last placed node
+ * @since 3837
+ */
+public class ViewportFollowToggleAction extends ToggleAction {
+    
+    /**
+     * Constructs a new {@code ViewportFollowToggleAction}. 
+     */
     public ViewportFollowToggleAction() {
-        super(
-                tr("Viewport Following"),
-                "viewport-follow",
-                tr("Enable/disable automatic moving of the map view to last placed node"),
-                Shortcut.registerShortcut("menu:view:viewportfollow", tr("Toggle Viewport Following"),
-                KeyEvent.VK_F, Shortcut.CTRL_SHIFT),
-                true /* register shortcut */
+        super(tr("Viewport Following"),
+              "viewport-follow",
+              tr("Enable/disable automatic moving of the map view to last placed node"),
+              Shortcut.registerShortcut("menu:view:viewportfollow", tr("Toggle Viewport Following"),
+              KeyEvent.VK_F, Shortcut.CTRL_SHIFT),
+              true /* register shortcut */
         );
         putValue("help", ht("/Action/ViewportFollowing"));
-        selected = false;
+        setSelected(false);
         notifySelectedState();
     }
 
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-            model.setSelected(selected);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
-        Main.map.mapView.viewportFollowing = selected;
-        notifySelectedState();
-    }
     @Override
     public void actionPerformed(ActionEvent e) {
         toggleSelectedState();
+        Main.map.mapView.viewportFollowing = isSelected();
+        notifySelectedState();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java	(revision 6219)
+++ trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java	(revision 6220)
@@ -6,8 +6,4 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ButtonModel;
 
 import org.openstreetmap.josm.Main;
@@ -17,62 +13,24 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class WireframeToggleAction extends JosmAction {
-    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
-    //FIXME: replace with property Action.SELECTED_KEY when migrating to
-    // Java 6
-    private boolean selected;
+/**
+ * This class toggles the wireframe rendering mode.
+ * @since 2530
+ */
+public class WireframeToggleAction extends ToggleAction {
+
+    /**
+     * Constructs a new {@code WireframeToggleAction}.
+     */
     public WireframeToggleAction() {
-        super(
-                tr("Wireframe View"),
-                null, /* no icon */
-                tr("Enable/disable rendering the map as wireframe only"),
-                Shortcut.registerShortcut("menu:view:wireframe", tr("Toggle Wireframe view"),KeyEvent.VK_W, Shortcut.CTRL),
-                false /* register toolbar */
+        super(tr("Wireframe View"),
+              null, /* no icon */
+              tr("Enable/disable rendering the map as wireframe only"),
+              Shortcut.registerShortcut("menu:view:wireframe", tr("Toggle Wireframe view"),KeyEvent.VK_W, Shortcut.CTRL),
+              false /* register toolbar */
         );
         putValue("toolbar", "wireframe");
         Main.toolbar.register(this);
-        selected = MapRendererFactory.getInstance().isWireframeMapRendererActive();
+        setSelected(MapRendererFactory.getInstance().isWireframeMapRendererActive());
         notifySelectedState();
-    }
-
-    public void addButtonModel(ButtonModel model) {
-        if (model != null && !buttonModels.contains(model)) {
-            buttonModels.add(model);
-            model.setSelected(selected);
-        }
-    }
-
-    public void removeButtonModel(ButtonModel model) {
-        if (model != null && buttonModels.contains(model)) {
-            buttonModels.remove(model);
-        }
-    }
-
-    protected void notifySelectedState() {
-        for (ButtonModel model: buttonModels) {
-            if (model.isSelected() != selected) {
-                model.setSelected(selected);
-            }
-        }
-    }
-
-    protected void toggleSelectedState() {
-        selected = !selected;
-        //Main.pref.put("draw.wireframe", selected);
-         if (selected){
-         MapRendererFactory.getInstance().activate(WireframeMapRenderer.class);
-            } else {
-                MapRendererFactory.getInstance().activate(StyledMapRenderer.class);
-            }
-
-        notifySelectedState();
-        if (Main.isDisplayingMapView()) {
-            Main.map.mapView.repaint();
-        }
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        toggleSelectedState();
     }
 
@@ -82,6 +40,17 @@
     }
 
-    public boolean isSelected() {
-        return selected;
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        toggleSelectedState();
+        if (isSelected()) {
+            MapRendererFactory.getInstance().activate(WireframeMapRenderer.class);
+        } else {
+            MapRendererFactory.getInstance().activate(StyledMapRenderer.class);
+        }
+
+        notifySelectedState();
+        if (Main.isDisplayingMapView()) {
+            Main.map.mapView.repaint();
+        }
     }
 }
