Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 4614)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 4615)
@@ -11,12 +11,16 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.Stack;
 
+import javax.swing.AbstractAction;
 import javax.swing.JCheckBox;
 import javax.swing.JTable;
+import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
@@ -44,4 +48,6 @@
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.tools.MultikeyActionsHandler;
+import org.openstreetmap.josm.tools.MultikeyShortcutAction;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -65,4 +71,7 @@
                 Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
         build();
+
+        MultikeyActionsHandler.getInstance().addAction(new EnableFilterAction());
+        MultikeyActionsHandler.getInstance().addAction(new HidingFilterAction());
     }
 
@@ -80,7 +89,14 @@
     }
 
-    protected String[] columnToolTips = {
-            tr("Enable filter"),
-            tr("Hide elements"),
+    private static final KeyStroke ENABLE_FILTER_SHORTCUT
+    = Shortcut.registerShortcut("core_multikey:enableFilter", "", 'E', Shortcut.GROUP_DIRECT, KeyEvent.CTRL_DOWN_MASK + KeyEvent.ALT_DOWN_MASK).getKeyStroke();
+
+    private static final KeyStroke HIDING_FILTER_SHORTCUT
+    = Shortcut.registerShortcut("core_multikey:hidingFilter", "", 'H', Shortcut.GROUP_DIRECT, KeyEvent.CTRL_DOWN_MASK + KeyEvent.ALT_DOWN_MASK).getKeyStroke();
+
+
+    protected final String[] columnToolTips = {
+            tr("Enable filter ({0}+{1})", KeyEvent.getKeyModifiersText(ENABLE_FILTER_SHORTCUT.getModifiers()), KeyEvent.getKeyText(ENABLE_FILTER_SHORTCUT.getKeyCode())),
+            tr("Hiding filter ({0}+{1})", KeyEvent.getKeyModifiersText(HIDING_FILTER_SHORTCUT.getModifiers()), KeyEvent.getKeyText(HIDING_FILTER_SHORTCUT.getKeyCode())),
             null,
             tr("Inverse filter"),
@@ -172,5 +188,5 @@
 
         createLayout(userTable, true, Arrays.asList(new SideButton[] {
-            addButton, editButton, deleteButton, upButton, downButton
+                addButton, editButton, deleteButton, upButton, downButton
         }));
     }
@@ -277,3 +293,78 @@
         filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
     }
+
+    abstract class AbstractFilterAction extends AbstractAction implements MultikeyShortcutAction {
+
+        protected Filter lastFilter;
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<MultikeyInfo> getMultikeyCombinations() {
+            List<MultikeyInfo> result = new ArrayList<MultikeyShortcutAction.MultikeyInfo>();
+
+            for (int i=0; i<filterModel.getRowCount(); i++) {
+                Filter filter = filterModel.getFilter(i);
+                MultikeyInfo info = new MultikeyInfo(i, filter.text);
+                result.add(info);
+            }
+
+            return result;
+        }
+
+        protected boolean isLastFilterValid() {
+            return lastFilter != null && filterModel.getFilters().contains(lastFilter);
+        }
+
+        @Override
+        public MultikeyInfo getLastMultikeyAction() {
+            if (isLastFilterValid())
+                return new MultikeyInfo(-1, lastFilter.text);
+            else
+                return null;
+        }
+
+    }
+
+    private class EnableFilterAction extends AbstractFilterAction  {
+
+        EnableFilterAction() {
+            putValue(SHORT_DESCRIPTION, tr("Enable filter"));
+            putValue(ACCELERATOR_KEY, ENABLE_FILTER_SHORTCUT);
+        }
+
+        @Override
+        public void executeMultikeyAction(int index, boolean repeatLastAction) {
+            if (index >= 0 && index < filterModel.getRowCount()) {
+                Filter filter = filterModel.getFilter(index);
+                filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED);
+                lastFilter = filter;
+            } else if (repeatLastAction && isLastFilterValid()) {
+                filterModel.setValueAt(!lastFilter.enable, filterModel.getFilters().indexOf(lastFilter), FilterTableModel.COL_ENABLED);
+            }
+        }
+    }
+
+    private class HidingFilterAction extends AbstractFilterAction {
+
+        public HidingFilterAction() {
+            putValue(SHORT_DESCRIPTION, tr("Hiding filter"));
+            putValue(ACCELERATOR_KEY, HIDING_FILTER_SHORTCUT);
+        }
+
+        @Override
+        public void executeMultikeyAction(int index, boolean repeatLastAction) {
+            if (index >= 0 && index < filterModel.getRowCount()) {
+                Filter filter = filterModel.getFilter(index);
+                filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING);
+                lastFilter = filter;
+            } else if (repeatLastAction && isLastFilterValid()) {
+                filterModel.setValueAt(!lastFilter.hiding, filterModel.getFilters().indexOf(lastFilter), FilterTableModel.COL_HIDING);
+            }
+        }
+
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 4614)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 4615)
@@ -36,4 +36,9 @@
  */
 public class FilterTableModel extends AbstractTableModel {
+
+    public static final int COL_ENABLED = 0;
+    public static final int COL_HIDING = 1;
+    public static final int COL_TEXT = 2;
+    public static final int COL_INVERTED = 3;
 
     // number of primitives that are disabled but not hidden
@@ -293,5 +298,5 @@
         Filter f = filters.get(row);
         switch (column) {
-        case 0:
+        case COL_ENABLED:
             f.enable = (Boolean) aValue;
             savePrefs();
@@ -299,14 +304,14 @@
             fireTableRowsUpdated(row, row);
             break;
-        case 1:
+        case COL_HIDING:
             f.hiding = (Boolean) aValue;
             savePrefs();
             updateFilters();
             break;
-        case 2:
+        case COL_TEXT:
             f.text = (String) aValue;
             savePrefs();
             break;
-        case 3:
+        case COL_INVERTED:
             f.inverted = (Boolean) aValue;
             savePrefs();
@@ -322,11 +327,11 @@
         Filter f = filters.get(row);
         switch (column) {
-        case 0:
+        case COL_ENABLED:
             return f.enable;
-        case 1:
+        case COL_HIDING:
             return f.hiding;
-        case 2:
+        case COL_TEXT:
             return f.text;
-        case 3:
+        case COL_INVERTED:
             return f.inverted;
         case 4:
@@ -397,3 +402,7 @@
         g.translate(-dx, -dy);
     }
+
+    public List<Filter> getFilters() {
+        return filters;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 4614)
+++ trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 4615)
@@ -15,6 +15,9 @@
 import javax.swing.Action;
 import javax.swing.JMenuItem;
+import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.KeyStroke;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 
 import org.openstreetmap.josm.Main;
@@ -131,7 +134,8 @@
 
         JMenuItem lbTitle = new JMenuItem((String) action.action.getValue(Action.SHORT_DESCRIPTION));
-        lbTitle.setHorizontalAlignment(JMenuItem.CENTER);
         lbTitle.setEnabled(false);
-        layers.add(lbTitle);
+        JPanel pnTitle = new JPanel();
+        pnTitle.add(lbTitle);
+        layers.add(pnTitle);
 
         char repeatKey = (char) action.shortcut.getKeyCode();
@@ -150,5 +154,4 @@
                 @Override
                 public void actionPerformed(ActionEvent e) {
-                    Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
                     action.action.executeMultikeyAction(info.getIndex(), false);
                 }
@@ -167,5 +170,4 @@
                     @Override
                     public void actionPerformed(ActionEvent e) {
-                        Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
                         action.action.executeMultikeyAction(-1, true);
                     }
@@ -174,4 +176,17 @@
             }
         }
+        layers.addPopupMenuListener(new PopupMenuListener() {
+
+            @Override
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
+
+            @Override
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
+            }
+
+            @Override
+            public void popupMenuCanceled(PopupMenuEvent e) {}
+        });
 
         layers.show(Main.parent, Integer.MAX_VALUE, Integer.MAX_VALUE);
