Index: trunk/src/org/openstreetmap/josm/data/osm/Tagged.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Tagged.java	(revision 17660)
+++ trunk/src/org/openstreetmap/josm/data/osm/Tagged.java	(revision 17662)
@@ -233,3 +233,58 @@
         return OsmUtils.isFalse(get(key));
     }
+
+    /**
+     * Returns a Tagged instance for the given tag map
+     * @param tags the tag map
+     * @return a Tagged instance for the given tag map
+     */
+    static Tagged ofMap(Map<String, String> tags) {
+        return new Tagged() {
+
+            @Override
+            public String get(String key) {
+                return tags.get(key);
+            }
+
+            @Override
+            public Map<String, String> getKeys() {
+                return tags;
+            }
+
+            @Override
+            public Collection<String> keySet() {
+                return tags.keySet();
+            }
+
+            @Override
+            public void put(String key, String value) {
+                tags.put(key, value);
+            }
+
+            @Override
+            public void setKeys(Map<String, String> keys) {
+                tags.putAll(keys);
+            }
+
+            @Override
+            public boolean hasKeys() {
+                return !tags.isEmpty();
+            }
+
+            @Override
+            public int getNumKeys() {
+                return tags.size();
+            }
+
+            @Override
+            public void remove(String key) {
+                tags.remove(key);
+            }
+
+            @Override
+            public void removeAll() {
+                tags.clear();
+            }
+        };
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 17660)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 17662)
@@ -48,4 +48,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.search.SearchCompiler;
@@ -135,4 +136,5 @@
     public transient TemplateEntry nameTemplate;
     public transient Match nameTemplateFilter;
+    public transient Match matchExpression;
 
     /**
@@ -288,4 +290,13 @@
     }
 
+    public void setMatch_expression(String filter) throws SAXException {
+        try {
+            this.matchExpression = SearchCompiler.compile(filter);
+        } catch (SearchParseError e) {
+            Logging.error("Error while parsing" + filter + ": " + e.getMessage());
+            throw new SAXException(e);
+        }
+    }
+
     private static class PresetPanel extends JPanel {
         private boolean hasElements;
@@ -646,4 +657,6 @@
         if ((onlyShowable && !isShowable()) || !typeMatches(t)) {
             return false;
+        } else if (matchExpression != null && !matchExpression.match(Tagged.ofMap(tags))) {
+            return false;
         } else {
             return TaggingPresetItem.matches(data, tags);
