Index: trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java	(revision 5028)
+++ trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java	(revision 5028)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import org.openstreetmap.josm.Main;
+
+public abstract class ParametrizedEnumProperty<T extends Enum<T>> {
+
+
+    private final T defaultValue;
+    private final Class<T> enumClass;
+
+    public ParametrizedEnumProperty(Class<T> enumClass, T defaultValue) {
+        this.defaultValue = defaultValue;
+        this.enumClass = enumClass;
+    }
+
+    protected abstract String getKey(String... params);
+
+    public T get(String... params) {
+        return parse(Main.pref.get(getKey(params), defaultValue.name()));
+    }
+
+    public boolean put(T value, String... params) {
+        return Main.pref.put(getKey(params), value.name());
+    }
+
+    protected T parse(String s) {
+        return Enum.valueOf(enumClass, s);
+    }
+
+
+}
Index: trunk/src/org/openstreetmap/josm/gui/SideButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/SideButton.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/SideButton.java	(revision 5028)
@@ -37,8 +37,9 @@
     {
         super(action);
-        if(!usename)
+        if(!usename) {
             setText(null);
-        fixIcon(action);
-        doStyle();
+            fixIcon(action);
+            doStyle();
+        }
     }
 
@@ -80,4 +81,6 @@
     }
 
+    // Used constructor with Action
+    @Deprecated
     public SideButton(String imagename, String property, String tooltip, ActionListener actionListener)
     {
@@ -88,4 +91,7 @@
         setToolTipText(tooltip);
     }
+
+    // Used constructor with Action
+    @Deprecated
     public SideButton(String name, String imagename, String property, String tooltip, Shortcut shortcut, ActionListener actionListener)
     {
@@ -100,4 +106,7 @@
         setup(name, property, tooltip, actionListener);
     }
+
+    // Used constructor with Action
+    @Deprecated
     public SideButton(String name, String imagename, String property, String tooltip, ActionListener actionListener)
     {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 5028)
@@ -8,5 +8,4 @@
 import java.awt.Graphics2D;
 import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
@@ -48,4 +47,5 @@
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.MultikeyActionsHandler;
 import org.openstreetmap.josm.tools.MultikeyShortcutAction;
@@ -141,17 +141,25 @@
         userTable.setDefaultRenderer(String.class, new StringRenderer());
 
-        addButton = new SideButton(marktr("Add"), "add", "SelectionList", tr("Add filter."),
-                new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
+        addButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Add"));
+                putValue(SHORT_DESCRIPTION,  tr("Add filter."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs","add"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 Filter filter = (Filter)SearchAction.showSearchDialog(new Filter());
                 if(filter != null){
                     filterModel.addFilter(filter);
                 }
-            }
-        });
-
-        editButton = new SideButton(marktr("Edit"), "edit", "SelectionList", tr("Edit filter."),
-                new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
+            }});
+        editButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Edit"));
+                putValue(SHORT_DESCRIPTION, tr("Edit filter."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 int index = userTable.getSelectionModel().getMinSelectionIndex();
                 if(index < 0) return;
@@ -163,8 +171,12 @@
             }
         });
-
-        deleteButton = new SideButton(marktr("Delete"), "delete", "SelectionList", tr("Delete filter."),
-                new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
+        deleteButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Delete"));
+                putValue(SHORT_DESCRIPTION, tr("Delete filter."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 int index = userTable.getSelectionModel().getMinSelectionIndex();
                 if(index < 0) return;
@@ -172,8 +184,12 @@
             }
         });
-
-        upButton = new SideButton(marktr("Up"), "up", "SelectionList", tr("Move filter up."),
-                new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
+        upButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Up"));
+                putValue(SHORT_DESCRIPTION, tr("Move filter up."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs", "up"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 int index = userTable.getSelectionModel().getMinSelectionIndex();
                 if(index < 0) return;
@@ -181,9 +197,14 @@
                 userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
             }
+
         });
-
-        downButton = new SideButton(marktr("Down"), "down", "SelectionList", tr("Move filter down."),
-                new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
+        downButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Down"));
+                putValue(SHORT_DESCRIPTION, tr("Move filter down."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs", "down"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 int index = userTable.getSelectionModel().getMinSelectionIndex();
                 if(index < 0) return;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 5028)
@@ -118,5 +118,5 @@
     ActivateLayerAction activateLayerAction;
     ShowHideLayerAction showHideLayerAction;
-    
+
     //TODO This duplicates ShowHide actions functionality
     /** stores which layer index to toggle and executes the ShowHide action if the layer is present */
@@ -160,5 +160,5 @@
         super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."),
                 Shortcut.registerShortcut("subwindow:layers", tr("Toggle: {0}", tr("Layers")), KeyEvent.VK_L,
-                Shortcut.ALT_SHIFT), 100, true);
+                        Shortcut.ALT_SHIFT), 100, true);
 
         // create the models
@@ -240,5 +240,5 @@
         MultikeyActionsHandler.getInstance().addAction(activateLayerAction);
         adaptTo(activateLayerAction, selectionModel);
-    
+
         JumpToMarkerActions.initialize();
 
@@ -445,9 +445,10 @@
          */
         public ShowHideLayerAction(boolean init) {
+            putValue(NAME, tr("Show/hide"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "showhide"));
             putValue(SHORT_DESCRIPTION, tr("Toggle visible state of the selected layer."));
             putValue("help", HelpUtil.ht("/Dialog/LayerList#ShowHideLayer"));
             multikeyShortcut = Shortcut.registerShortcut("core_multikey:showHideLayer", tr("Multikey: {0}",
-            tr("Show/hide layer")), KeyEvent.VK_S, Shortcut.SHIFT);
+                    tr("Show/hide layer")), KeyEvent.VK_S, Shortcut.SHIFT);
             if (init) {
                 updateEnabledState();
@@ -549,4 +550,5 @@
          */
         public LayerOpacityAction() {
+            putValue(NAME, tr("Opacity"));
             putValue(SHORT_DESCRIPTION, tr("Adjust opacity of the layer."));
             putValue(SMALL_ICON, ImageProvider.get("dialogs/layerlist", "transparency"));
@@ -640,8 +642,9 @@
 
         public ActivateLayerAction() {
+            putValue(NAME, tr("Activate"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "activate"));
             putValue(SHORT_DESCRIPTION, tr("Activate the selected layer"));
             multikeyShortcut = Shortcut.registerShortcut("core_multikey:activateLayer", tr("Multikey: {0}",
-            tr("Activate layer")), KeyEvent.VK_A, Shortcut.SHIFT);
+                    tr("Activate layer")), KeyEvent.VK_A, Shortcut.SHIFT);
             putValue("help", HelpUtil.ht("/Dialog/LayerList#ActivateLayer"));
         }
@@ -737,4 +740,5 @@
 
         public MergeAction() {
+            putValue(NAME, tr("Merge"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "mergedown"));
             putValue(SHORT_DESCRIPTION, tr("Merge this layer into another layer"));
@@ -799,9 +803,9 @@
             CheckParameterUtil.ensureParameterNotNull(layer, "layer");
             this.layer = layer;
+            updateEnabledState();
+        }
+
+        public DuplicateAction() {
             putValue(NAME, tr("Duplicate"));
-            updateEnabledState();
-        }
-
-        public DuplicateAction() {
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "duplicatelayer"));
             putValue(SHORT_DESCRIPTION, tr("Duplicate this layer"));
@@ -1033,4 +1037,5 @@
     class MoveUpAction extends AbstractAction implements  IEnabledStateUpdating{
         public MoveUpAction() {
+            putValue(NAME, tr("Move up"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "up"));
             putValue(SHORT_DESCRIPTION, tr("Move the selected layer one row up."));
@@ -1054,4 +1059,5 @@
     class MoveDownAction extends AbstractAction implements IEnabledStateUpdating {
         public MoveDownAction() {
+            putValue(NAME, tr("Move down"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "down"));
             putValue(SHORT_DESCRIPTION, tr("Move the selected layer one row down."));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5028)
@@ -134,9 +134,9 @@
 
         createLayout(displaylist, true, Arrays.asList(new SideButton[] {
-            new SideButton(newAction, false),
-            new SideButton(editAction, false),
-            new SideButton(duplicateAction, false),
-            new SideButton(deleteAction, false),
-            new SideButton(selectAction, false)
+                new SideButton(newAction, false),
+                new SideButton(editAction, false),
+                new SideButton(duplicateAction, false),
+                new SideButton(deleteAction, false),
+                new SideButton(selectAction, false)
         }));
 
@@ -282,5 +282,5 @@
         public EditAction() {
             putValue(SHORT_DESCRIPTION,tr( "Open an editor for the selected relation"));
-            //putValue(NAME, tr("Edit"));
+            putValue(NAME, tr("Edit"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
             setEnabled(false);
@@ -323,5 +323,5 @@
         public DeleteAction() {
             putValue(SHORT_DESCRIPTION,tr("Delete the selected relation"));
-            //putValue(NAME, tr("Delete"));
+            putValue(NAME, tr("Delete"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
             setEnabled(false);
@@ -334,11 +334,10 @@
                     Main.main.getEditLayer(),
                     toDelete
-            );
+                    );
         }
 
         public void actionPerformed(ActionEvent e) {
-            if (!isEnabled()) {
-                return;
-            }
+            if (!isEnabled())
+                return;
             List<Relation> toDelete = new LinkedList<Relation>();
             for (int i : displaylist.getSelectedIndices()) {
@@ -363,5 +362,5 @@
         public NewAction() {
             putValue(SHORT_DESCRIPTION,tr("Create a new relation"));
-            //putValue(NAME, tr("New"));
+            putValue(NAME, tr("New"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "addrelation"));
             updateEnabledState();
@@ -401,5 +400,5 @@
             putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
             putValue(SMALL_ICON, ImageProvider.get("duplicate"));
-            //putValue(NAME, tr("Duplicate"));
+            putValue(NAME, tr("Duplicate"));
             updateEnabledState();
         }
@@ -412,5 +411,5 @@
                     copy,
                     null /* no selected members */
-            );
+                    );
             editor.setVisible(true);
         }
@@ -537,5 +536,5 @@
                     model.getSelectedNonNewRelations(),
                     Main.map.mapView.getEditLayer())
-            );
+                    );
         }
     }
@@ -570,5 +569,5 @@
                     buildSetOfIncompleteMembers(rels),
                     Main.map.mapView.getEditLayer()
-            ));
+                    ));
         }
 
@@ -603,5 +602,5 @@
                     relations,
                     DefaultNameFormatter.getInstance().getRelationComparator()
-            );
+                    );
         }
 
@@ -794,5 +793,5 @@
         public RelationDialogPopupMenu(JList list) {
             super(list);
-            
+
             // -- download members action
             //
@@ -832,5 +831,5 @@
         popupMenu.addPopupMenuListener(l);
     }
-    
+
     public Collection<Relation> getSelectedRelations() {
         return model.getSelectedRelations();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 5028)
@@ -24,6 +24,7 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import javax.swing.AbstractAction;
@@ -35,17 +36,21 @@
 import javax.swing.JDialog;
 import javax.swing.JLabel;
+import javax.swing.JMenu;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButtonMenuItem;
 import javax.swing.JScrollPane;
-import javax.swing.JPanel;
 import javax.swing.JToggleButton;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.preferences.ParametrizedEnumProperty;
 import org.openstreetmap.josm.gui.MainMenu;
+import org.openstreetmap.josm.gui.ShowHideButtonListener;
+import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.DialogsPanel.Action;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.help.Helpful;
-import org.openstreetmap.josm.gui.ShowHideButtonListener;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -60,4 +65,24 @@
 public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener {
 
+    public enum ButtonHiddingType {
+        ALWAYS_SHOWN, ALWAYS_HIDDEN, DYNAMIC
+    }
+
+    private final ParametrizedEnumProperty<ButtonHiddingType> PROP_BUTTON_HIDING = new ParametrizedEnumProperty<ToggleDialog.ButtonHiddingType>(ButtonHiddingType.class, ButtonHiddingType.DYNAMIC) {
+        @Override
+        protected String getKey(String... params) {
+            return preferencePrefix + ".buttonhiding";
+        }
+        @Override
+        protected ButtonHiddingType parse(String s) {
+            try {
+                return super.parse(s);
+            } catch (IllegalArgumentException e) {
+                // Legacy settings
+                return Boolean.parseBoolean(s)?ButtonHiddingType.DYNAMIC:ButtonHiddingType.ALWAYS_HIDDEN;
+            }
+        }
+    };
+
     /** The action to toggle this dialog */
     protected ToggleDialogAction toggleAction;
@@ -87,5 +112,5 @@
      * Indicates whether dynamic button hiding is active or not.
      */
-    protected boolean isButtonHiding;
+    protected ButtonHiddingType buttonHiding;
 
     /** the preferred height if the toggle dialog is expanded */
@@ -103,4 +128,5 @@
     protected JToggleButton button;
     private JPanel buttonsPanel;
+    private List<javax.swing.Action> buttonActions = new ArrayList<javax.swing.Action>();
 
     /** holds the menu entry in the windows menu. Required to properly
@@ -143,5 +169,5 @@
         isDocked = Main.pref.getBoolean(preferencePrefix+".docked", true);
         isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
-        isButtonHiding = Main.pref.getBoolean(preferencePrefix+".buttonhiding", true);
+        buttonHiding = PROP_BUTTON_HIDING.get();
 
         /** show the minimize button */
@@ -416,18 +442,64 @@
                             }
                         }
+
+                        private void maybeShowPopup(MouseEvent e) {
+                            if (e.isPopupTrigger()) {
+                                JPopupMenu menu = new JPopupMenu();
+                                JMenu buttonHidingMenu = new JMenu(tr("Side buttons"));
+                                JRadioButtonMenuItem alwaysShown = new JRadioButtonMenuItem(new AbstractAction(tr("Always shown")) {
+                                    @Override
+                                    public void actionPerformed(ActionEvent e) {
+                                        setIsButtonHiding(ButtonHiddingType.ALWAYS_SHOWN);
+                                    }
+                                });
+                                JRadioButtonMenuItem dynamic = new JRadioButtonMenuItem(new AbstractAction(tr("Dynamic")) {
+                                    @Override
+                                    public void actionPerformed(ActionEvent e) {
+                                        setIsButtonHiding(ButtonHiddingType.DYNAMIC);
+                                    }
+                                });
+                                JRadioButtonMenuItem alwaysHidden = new JRadioButtonMenuItem(new AbstractAction(tr("Always hidden")) {
+                                    @Override
+                                    public void actionPerformed(ActionEvent e) {
+                                        setIsButtonHiding(ButtonHiddingType.ALWAYS_HIDDEN);
+                                    }
+                                });
+                                alwaysShown.setSelected(buttonHiding == ButtonHiddingType.ALWAYS_SHOWN);
+                                dynamic.setSelected(buttonHiding == ButtonHiddingType.DYNAMIC);
+                                alwaysHidden.setSelected(buttonHiding == ButtonHiddingType.ALWAYS_HIDDEN);
+                                buttonHidingMenu.add(alwaysShown);
+                                buttonHidingMenu.add(dynamic);
+                                buttonHidingMenu.add(alwaysHidden);
+                                menu.add(buttonHidingMenu);
+                                for (javax.swing.Action action: buttonActions) {
+                                    menu.add(action);
+                                }
+                                menu.show(TitleBar.this, e.getX(), e.getY());
+                            }
+                        }
+
+                        @Override
+                        public void mousePressed(MouseEvent e) {
+                            maybeShowPopup(e);
+                        }
+
+                        @Override
+                        public void mouseReleased(MouseEvent e) {
+                            maybeShowPopup(e);
+                        }
                     }
-            );
+                    );
 
             if(Main.pref.getBoolean("dialog.dynamic.buttons", true)) {
-                buttonsHide = new JButton(ImageProvider.get("misc", isButtonHiding ? "buttonhide" : "buttonshow"));
+                buttonsHide = new JButton(ImageProvider.get("misc", buttonHiding != ButtonHiddingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
                 buttonsHide.setToolTipText(tr("Toggle dynamic buttons"));
                 buttonsHide.setBorder(BorderFactory.createEmptyBorder());
                 buttonsHide.addActionListener(
-                    new ActionListener(){
-                        public void actionPerformed(ActionEvent e) {
-                            setIsButtonHiding(!isButtonHiding);
+                        new ActionListener(){
+                            public void actionPerformed(ActionEvent e) {
+                                setIsButtonHiding(buttonHiding == ButtonHiddingType.ALWAYS_SHOWN?ButtonHiddingType.DYNAMIC:ButtonHiddingType.ALWAYS_SHOWN);
+                            }
                         }
-                    }
-                );
+                        );
                 add(buttonsHide);
             }
@@ -444,5 +516,5 @@
                         }
                     }
-            );
+                    );
             add(sticky);
 
@@ -459,5 +531,5 @@
                         }
                     }
-            );
+                    );
             add(close);
             setToolTipText(tr("Click to minimize/maximize the panel content"));
@@ -578,5 +650,5 @@
     protected void setIsDocked(boolean val) {
         if(buttonsPanel != null && buttonsHide != null) {
-            buttonsPanel.setVisible(val ? !isButtonHiding : true);
+            buttonsPanel.setVisible(val ? buttonHiding == ButtonHiddingType.ALWAYS_SHOWN : true);
         }
         isDocked = val;
@@ -591,8 +663,9 @@
     }
 
-    protected void setIsButtonHiding(boolean val) {
-        isButtonHiding = val;
-        Main.pref.put(preferencePrefix+".buttonhiding", val);
-        buttonsHide.setIcon(ImageProvider.get("misc", val ? "buttonhide" : "buttonshow"));
+    protected void setIsButtonHiding(ButtonHiddingType val) {
+        buttonHiding = val;
+        PROP_BUTTON_HIDING.put(val);
+        buttonsHide.setIcon(ImageProvider.get("misc", val != ButtonHiddingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
+        buttonsPanel.setVisible(val != ButtonHiddingType.ALWAYS_HIDDEN);
         stateChanged();
     }
@@ -641,5 +714,5 @@
         return button;
     }
-    
+
     /***
      * The following methods are intended to be overridden, in order to customize
@@ -679,16 +752,24 @@
 
     protected Component createLayout(Component data, boolean scroll, Collection<SideButton> buttons) {
-        if(scroll)
+        if(scroll) {
             data = new JScrollPane(data);
+        }
         add(data, BorderLayout.CENTER);
         if(buttons != null && buttons.size() != 0) {
             buttonsPanel = new JPanel(Main.pref.getBoolean("dialog.align.left", false)
-                ? new FlowLayout(FlowLayout.LEFT) : new GridLayout(1,buttons.size()));
-            for(SideButton button : buttons)
+                    ? new FlowLayout(FlowLayout.LEFT) : new GridLayout(1,buttons.size()));
+            for(SideButton button : buttons) {
                 buttonsPanel.add(button);
+                javax.swing.Action action = button.getAction();
+                if (action != null) {
+                    buttonActions.add(action);
+                } else {
+                    System.err.println("Button " + button + " doesn't have action defined");
+                }
+            }
             add(buttonsPanel, BorderLayout.SOUTH);
             if(Main.pref.getBoolean("dialog.dynamic.buttons", true)) {
                 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_MOTION_EVENT_MASK);
-                buttonsPanel.setVisible(!isButtonHiding || !isDocked);
+                buttonsPanel.setVisible(buttonHiding == ButtonHiddingType.ALWAYS_SHOWN || !isDocked);
             }
         } else if(buttonsHide != null) {
@@ -700,5 +781,5 @@
     @Override
     public void eventDispatched(AWTEvent event) {
-        if(isShowing() && !isCollapsed && isDocked && isButtonHiding) {
+        if(isShowing() && !isCollapsed && isDocked && buttonHiding == ButtonHiddingType.DYNAMIC) {
             Rectangle b = this.getBounds();
             b.setLocation(getLocationOnScreen());
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 5027)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 5028)
@@ -20,4 +20,5 @@
 import java.util.Set;
 
+import javax.swing.AbstractAction;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
@@ -51,4 +52,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.xml.sax.SAXException;
@@ -61,5 +63,5 @@
  * @author frsantos
  */
-public class ValidatorDialog extends ToggleDialog implements ActionListener, SelectionChangedListener, LayerChangeListener {
+public class ValidatorDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
     /** Serializable ID */
     private static final long serialVersionUID = 2952292777351992696L;
@@ -105,6 +107,16 @@
 
         List<SideButton> buttons = new LinkedList<SideButton>();
-        selectButton = new SideButton(marktr("Select"), "select", "Validator",
-                tr("Set the selected elements on the map to the selected items in the list above."), this);
+
+        selectButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Select"));
+                putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs","select"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                setSelectedItems();
+            }
+        });
         selectButton.setEnabled(false);
         buttons.add(selectButton);
@@ -112,11 +124,30 @@
         buttons.add(new SideButton(Main.main.validator.validateAction));
 
-        fixButton = new SideButton(marktr("Fix"), "fix", "Validator", tr("Fix the selected issue."), this);
+        fixButton = new SideButton(new AbstractAction() {
+            {
+                putValue(NAME, marktr("Fix"));
+                putValue(SHORT_DESCRIPTION,  tr("Fix the selected issue."));
+                putValue(SMALL_ICON, ImageProvider.get("dialogs","fix"));
+            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                fixErrors(e);
+            }
+        });
         fixButton.setEnabled(false);
         buttons.add(fixButton);
 
         if (Main.pref.getBoolean(ValidatorPreference.PREF_USE_IGNORE, true)) {
-            ignoreButton = new SideButton(marktr("Ignore"), "delete", "Validator",
-                    tr("Ignore the selected issue next time."), this);
+            ignoreButton = new SideButton(new AbstractAction() {
+                {
+                    putValue(NAME, marktr("Ignore"));
+                    putValue(SHORT_DESCRIPTION,  tr("Ignore the selected issue next time."));
+                    putValue(SMALL_ICON, ImageProvider.get("dialogs","fix"));
+                }
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    ignoreErrors(e);
+                }
+            });
             ignoreButton.setEnabled(false);
             buttons.add(ignoreButton);
@@ -332,16 +363,4 @@
         }
         Main.main.getCurrentDataSet().setSelected(sel);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        String actionCommand = e.getActionCommand();
-        if (actionCommand.equals("Select")) {
-            setSelectedItems();
-        } else if (actionCommand.equals("Fix")) {
-            fixErrors(e);
-        } else if (actionCommand.equals("Ignore")) {
-            ignoreErrors(e);
-        }
     }
 
