Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 8979)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 8980)
@@ -9,4 +9,5 @@
 import java.awt.GridBagLayout;
 import java.awt.Point;
+import java.awt.TextField;
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
@@ -14,4 +15,6 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.net.HttpURLConnection;
 import java.net.URI;
@@ -42,4 +45,5 @@
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
+import javax.swing.RowFilter;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -48,4 +52,5 @@
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
 
 import org.openstreetmap.josm.Main;
@@ -57,4 +62,5 @@
 import org.openstreetmap.josm.actions.relation.SelectRelationAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
@@ -68,4 +74,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
@@ -85,9 +92,12 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
+import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
+import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.GBC;
@@ -128,5 +138,7 @@
      * The tag data of selected objects.
      */
-    private final DefaultTableModel tagData = new ReadOnlyTableModel();
+    private final ReadOnlyTableModel tagData = new ReadOnlyTableModel();
+    private final TableRowSorter<ReadOnlyTableModel> tagRowSorter = new TableRowSorter<>(tagData);
+    private final JosmTextField tagTableFilter;
 
     /**
@@ -243,4 +255,6 @@
         buildMembershipTable();
 
+        tagTableFilter = setupFilter();
+
         // combine both tables and wrap them in a scrollPane
         boolean top = Main.pref.getBoolean("properties.presets.top", true);
@@ -252,4 +266,5 @@
         }
         bothTables.add(selectSth, GBC.eol().fill().insets(10, 10, 10, 10));
+        bothTables.add(tagTableFilter, GBC.eol().fill(GBC.HORIZONTAL));
         bothTables.add(tagTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
         bothTables.add(tagTable, GBC.eol().fill(GBC.BOTH));
@@ -294,4 +309,5 @@
         tagTable.getColumnModel().getColumn(0).setCellRenderer(cellRenderer);
         tagTable.getColumnModel().getColumn(1).setCellRenderer(cellRenderer);
+        tagTable.setRowSorter(tagRowSorter);
     }
 
@@ -456,4 +472,8 @@
     }
 
+    public void setFilter(final SearchCompiler.Match filter) {
+        this.tagRowSorter.setRowFilter(new SearchBasedRowFilter(filter));
+    }
+
     /**
      * Assigns all needed keys like Enter and Spacebar to most important actions.
@@ -498,4 +518,17 @@
                 KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "onHelp");
         getActionMap().put("onHelp", helpAction);
+    }
+
+    private JosmTextField setupFilter() {
+        final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
+        f.setToolTipText(tr("Tag filter"));
+        final CompileSearchTextDecorator decorator = CompileSearchTextDecorator.decorate(f);
+        f.addPropertyChangeListener("filter", new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                setFilter(decorator.getMatch());
+            }
+        });
+        return f;
     }
 
@@ -686,4 +719,5 @@
         tagTable.setVisible(hasTags);
         tagTable.getTableHeader().setVisible(hasTags);
+        tagTableFilter.setVisible(hasTags);
         selectSth.setVisible(!hasSelection);
         pluginHook.setVisible(hasSelection);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java	(revision 8980)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java	(revision 8980)
@@ -0,0 +1,88 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import javax.swing.RowFilter;
+import javax.swing.table.TableModel;
+
+import org.openstreetmap.josm.actions.search.SearchCompiler;
+import org.openstreetmap.josm.data.osm.Tagged;
+
+/**
+ * A {@link RowFilter} implementation which matches tags w.r.t. the specified filter's
+ * {@link SearchCompiler.Match#match(org.openstreetmap.josm.data.osm.Tagged)} method.
+ *
+ * <p>An {@link javax.swing.RowFilter.Entry}'s column 0 is considered as key, and column 1 is considered as value.</p>
+ */
+class SearchBasedRowFilter extends RowFilter<TableModel, Integer> {
+
+    final SearchCompiler.Match filter;
+
+    /**
+     * Constructs a new {@code SearchBasedRowFilter} with the given filter.
+     * @param filter the filter used to match tags
+     */
+    public SearchBasedRowFilter(SearchCompiler.Match filter) {
+        this.filter = filter;
+    }
+
+    @Override
+    public boolean include(Entry entry) {
+        final String key = entry.getStringValue(0);
+        final String value = entry.getStringValue(1);
+        return filter.match(new OneKeyValue(key, value));
+    }
+
+    static class OneKeyValue implements Tagged {
+        private final String key;
+        private final String value;
+
+        public OneKeyValue(String key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        @Override
+        public void setKeys(Map<String, String> keys) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Map<String, String> getKeys() {
+            return Collections.singletonMap(key, value);
+        }
+
+        @Override
+        public void put(String key, String value) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String get(String k) {
+            return key.equals(k) ? value : null;
+        }
+
+        @Override
+        public void remove(String key) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean hasKeys() {
+            return true;
+        }
+
+        @Override
+        public Collection<String> keySet() {
+            return Collections.singleton(key);
+        }
+
+        @Override
+        public void removeAll() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
