Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 9939)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 9940)
@@ -773,7 +773,3 @@
         return Collections.<ActionParameter<?>>singletonList(new SearchSettingsActionParameter(SEARCH_EXPRESSION));
     }
-
-    public static String escapeStringForSearch(String s) {
-        return s.replace("\\", "\\\\").replace("\"", "\\\"");
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 9939)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 9940)
@@ -1745,3 +1745,23 @@
         return searchFlags;
     }
+
+    static String escapeStringForSearch(String s) {
+        return s.replace("\\", "\\\\").replace("\"", "\\\"");
+    }
+
+    /**
+     * Builds a search string for the given tag. If value is empty, the existence of the key is checked.
+     *
+     * @param key   the tag key
+     * @param value the tag value
+     * @return a search string for the given tag
+     */
+    public static String buildSearchStringForTag(String key, String value) {
+        final String forKey = '"' + escapeStringForSearch(key) + '"' + '=';
+        if (value == null || value.isEmpty()) {
+            return forKey + "*";
+        } else {
+            return forKey + '"' + escapeStringForSearch(value) + '"';
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 9939)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 9940)
@@ -1401,7 +1401,5 @@
             String token = new StringBuilder(t).append(val).toString();
             if (consideredTokens.add(token)) {
-                s.append(sep).append('(').append(t).append('"').append(
-                        org.openstreetmap.josm.actions.search.SearchAction.escapeStringForSearch(key)).append("\"=\"").append(
-                        org.openstreetmap.josm.actions.search.SearchAction.escapeStringForSearch(val)).append("\")");
+                s.append(sep).append('(').append(t).append(SearchCompiler.buildSearchStringForTag(key, val)).append(")");
                 sep = " OR ";
             }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 9939)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 9940)
@@ -8,4 +8,6 @@
 import java.util.Map;
 
+import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.preferences.CollectionProperty;
@@ -14,4 +16,5 @@
 
     private final Map<Tag, Void> recentTags;
+    private SearchCompiler.Match tagsToIgnore;
 
     RecentTagCollection(final int capacity) {
@@ -23,4 +26,5 @@
             }
         };
+        tagsToIgnore = new SearchCompiler.Never();
     }
 
@@ -31,5 +35,5 @@
             String key = it.next();
             String value = it.next();
-            recentTags.put(new Tag(key, value), null);
+            add(new Tag(key, value));
         }
     }
@@ -44,6 +48,8 @@
     }
 
-    public void add(Tag key) {
-        recentTags.put(key, null);
+    public void add(Tag tag) {
+        if (!tagsToIgnore.match(tag)) {
+            recentTags.put(tag, null);
+        }
     }
 
@@ -55,3 +61,26 @@
         return new ArrayList<>(recentTags.keySet());
     }
+
+    public void setTagsToIgnore(SearchCompiler.Match tagsToIgnore) {
+        this.tagsToIgnore = tagsToIgnore;
+        final Iterator<Tag> it = recentTags.keySet().iterator();
+        while (it.hasNext()) {
+            if (tagsToIgnore.match(it.next())) {
+                it.remove();
+            }
+        }
+    }
+
+    public void setTagsToIgnore(SearchAction.SearchSetting tagsToIgnore) throws SearchCompiler.ParseError {
+        setTagsToIgnore(tagsToIgnore.text.isEmpty() ? new SearchCompiler.Never() : SearchCompiler.compile(tagsToIgnore));
+    }
+
+    public SearchAction.SearchSetting ignoreTag(Tag tagToIgnore, SearchAction.SearchSetting settingToUpdate) throws SearchCompiler.ParseError {
+        final String forTag = SearchCompiler.buildSearchStringForTag(tagToIgnore.getKey(), tagToIgnore.getValue());
+        settingToUpdate.text = settingToUpdate.text.isEmpty()
+                ? forTag
+                : settingToUpdate.text + " OR " + forTag;
+        setTagsToIgnore(settingToUpdate);
+        return settingToUpdate;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 9939)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 9940)
@@ -37,4 +37,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.TreeMap;
 
@@ -57,4 +58,5 @@
 import javax.swing.KeyStroke;
 import javax.swing.ListCellRenderer;
+import javax.swing.SwingUtilities;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.text.JTextComponent;
@@ -62,4 +64,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -71,4 +75,5 @@
 import org.openstreetmap.josm.data.preferences.EnumProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
@@ -125,6 +130,8 @@
             DEFAULT_LRU_TAGS_NUMBER);
     /** The preference storage of recent tags */
-    public static final CollectionProperty COLLECTION_PROPERTY = new CollectionProperty("properties.recent-tags",
+    public static final CollectionProperty PROPERTY_RECENT_TAGS = new CollectionProperty("properties.recent-tags",
             Collections.<String>emptyList());
+    public static final StringProperty PROPERTY_TAGS_TO_IGNORE = new StringProperty("properties.recent-tags.ignore",
+            new SearchAction.SearchSetting().writeToString());
 
     /**
@@ -159,4 +166,5 @@
 
     final RecentTagCollection recentTags = new RecentTagCollection(MAX_LRU_TAGS_NUMBER);
+    SearchAction.SearchSetting tagsToIgnore;
 
     // Copy of recently added tags, used to cache initial status
@@ -286,7 +294,33 @@
      */
     public void loadTagsIfNeeded() {
+        loadTagsToIgnore();
         if (PROPERTY_REMEMBER_TAGS.get() && recentTags.isEmpty()) {
-            recentTags.loadFromPreference(COLLECTION_PROPERTY);
-        }
+            recentTags.loadFromPreference(PROPERTY_RECENT_TAGS);
+        }
+    }
+
+    void loadTagsToIgnore() {
+        final SearchAction.SearchSetting searchSetting = Utils.firstNonNull(
+                SearchAction.SearchSetting.readFromString(PROPERTY_TAGS_TO_IGNORE.get()), new SearchAction.SearchSetting());
+        if (!Objects.equals(tagsToIgnore, searchSetting)) {
+            try {
+                tagsToIgnore = searchSetting;
+                recentTags.setTagsToIgnore(tagsToIgnore);
+            } catch (SearchCompiler.ParseError parseError) {
+                warnAboutParseError(parseError);
+                tagsToIgnore = new SearchAction.SearchSetting();
+                recentTags.setTagsToIgnore(new SearchCompiler.Never());
+            }
+        }
+    }
+
+    private void warnAboutParseError(SearchCompiler.ParseError parseError) {
+        Main.warn(parseError);
+        JOptionPane.showMessageDialog(
+                Main.parent,
+                parseError.getMessage(),
+                tr("Error"),
+                JOptionPane.ERROR_MESSAGE
+        );
     }
 
@@ -296,5 +330,5 @@
     public void saveTagsIfNeeded() {
         if (PROPERTY_REMEMBER_TAGS.get() && !recentTags.isEmpty()) {
-            recentTags.saveToPreference(COLLECTION_PROPERTY);
+            recentTags.saveToPreference(PROPERTY_RECENT_TAGS);
         }
     }
@@ -924,5 +958,7 @@
                         public void mouseClicked(MouseEvent e) {
                             action.actionPerformed(null);
-                            if (e.isShiftDown()) {
+                            if (SwingUtilities.isRightMouseButton(e)) {
+                                new TagPopupMenu(t).show(e.getComponent(), e.getX(), e.getY());
+                            } else if (e.isShiftDown()) {
                                 // add tags on Shift-Click
                                 performTagAdding();
@@ -952,4 +988,54 @@
         }
 
+        class TagPopupMenu extends JPopupMenu {
+
+            TagPopupMenu(Tag t) {
+                add(new IgnoreTagAction(tr("Ignore key ''{0}''", t.getKey()), new Tag(t.getKey(), "")));
+                add(new IgnoreTagAction(tr("Ignore tag ''{0}''", t), t));
+                add(new EditIgnoreTagsAction());
+            }
+        }
+
+        class IgnoreTagAction extends AbstractAction {
+            final Tag tag;
+
+            IgnoreTagAction(String name, Tag tag) {
+                super(name);
+                this.tag = tag;
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    recentTags.ignoreTag(tag, tagsToIgnore);
+                    PROPERTY_TAGS_TO_IGNORE.put(tagsToIgnore.writeToString());
+                } catch (SearchCompiler.ParseError parseError) {
+                    throw new IllegalStateException(parseError);
+                }
+            }
+        }
+
+        class EditIgnoreTagsAction extends AbstractAction {
+
+            EditIgnoreTagsAction() {
+                super(tr("Edit ignore list"));
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                final SearchAction.SearchSetting newTagsToIngore = SearchAction.showSearchDialog(tagsToIgnore);
+                if (newTagsToIngore == null) {
+                    return;
+                }
+                try {
+                    tagsToIgnore = newTagsToIngore;
+                    recentTags.setTagsToIgnore(tagsToIgnore);
+                    PROPERTY_TAGS_TO_IGNORE.put(tagsToIgnore.writeToString());
+                } catch (SearchCompiler.ParseError parseError) {
+                    warnAboutParseError(parseError);
+                }
+            }
+        }
+
         public void destroyActions() {
             for (JosmAction action : recentTagsActions) {
Index: /trunk/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java	(revision 9939)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java	(revision 9940)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
@@ -427,3 +428,21 @@
         assertEquals("foo1 || (bar1 && bar2 && (baz1 ^ baz2)) || foo2", c4.toString());
     }
+
+    /**
+     * Tests {@code buildSearchStringForTag}.
+     * @throws ParseError if an error has been encountered while compiling
+     */
+    @Test
+    public void testBuildSearchStringForTag() throws ParseError {
+        final Tag tag1 = new Tag("foo=", "bar\"");
+        final Tag tag2 = new Tag("foo=", "=bar");
+        final String search1 = SearchCompiler.buildSearchStringForTag(tag1.getKey(), tag1.getValue());
+        assertEquals("\"foo=\"=\"bar\\\"\"", search1);
+        assertTrue(SearchCompiler.compile(search1).match(tag1));
+        assertFalse(SearchCompiler.compile(search1).match(tag2));
+        final String search2 = SearchCompiler.buildSearchStringForTag(tag1.getKey(), "");
+        assertEquals("\"foo=\"=*", search2);
+        assertTrue(SearchCompiler.compile(search2).match(tag1));
+        assertTrue(SearchCompiler.compile(search2).match(tag2));
+    }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java	(revision 9939)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java	(revision 9940)
@@ -12,4 +12,6 @@
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.preferences.CollectionProperty;
@@ -30,7 +32,9 @@
     /**
      * Performs various tests on a {@link RecentTagCollection}.
-      */
+     *
+     * @throws SearchCompiler.ParseError if an error has been encountered while compiling
+     */
     @Test
-    public void test() {
+    public void test() throws SearchCompiler.ParseError {
         final RecentTagCollection recentTags = new RecentTagCollection(2);
         assertTrue(recentTags.isEmpty());
@@ -55,4 +59,22 @@
         assertEquals(Collections.singletonList(new Tag("key=", "=value")), recentTags.toList());
 
+        recentTags.add(foo);
+        recentTags.add(bar);
+        recentTags.add(baz);
+        final SearchAction.SearchSetting searchSetting = new SearchAction.SearchSetting();
+        recentTags.ignoreTag(baz, searchSetting);
+        recentTags.ignoreTag(new Tag("something", "else"), searchSetting);
+        assertEquals("\"name\"=\"baz\" OR \"something\"=\"else\"", searchSetting.text);
+        assertEquals(Collections.singletonList(bar), recentTags.toList());
+        recentTags.add(baz);
+        assertEquals(Collections.singletonList(bar), recentTags.toList());
+        searchSetting.text = "";
+        recentTags.setTagsToIgnore(searchSetting);
+        assertEquals(Collections.singletonList(bar), recentTags.toList());
+        recentTags.add(baz);
+        assertEquals(Arrays.asList(bar, baz), recentTags.toList());
+        recentTags.ignoreTag(new Tag("name", /*all values */""), searchSetting);
+        assertEquals(Collections.emptyList(), recentTags.toList());
+
     }
 }
