Index: src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 12404)
+++ src/org/openstreetmap/josm/actions/search/SearchAction.java	(working copy)
@@ -454,6 +454,8 @@
                 .addKeyword("type:node", "type:node ", tr("all nodes"))
                 .addKeyword("type:way", "type:way ", tr("all ways"))
                 .addKeyword("type:relation", "type:relation ", tr("all relations"))
+                .addKeyword("preset:water", "preset:water", tr("all objects that use the water preset"))
+                .addKeyword("preset:\"fast food\"", "preset:\"fast food\"", tr("all objects that use the fast food preset"))
                 .addKeyword("closed", "closed ", tr("all closed ways"))
                 .addKeyword("untagged", "untagged ", tr("object without useful tags")),
                 GBC.eol());
@@ -888,4 +890,4 @@
     public List<ActionParameter<?>> getActionParameters() {
         return Collections.<ActionParameter<?>>singletonList(new SearchSettingsActionParameter(SEARCH_EXPRESSION));
     }
-}
+}
\ No newline at end of file
Index: src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 12404)
+++ src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(working copy)
@@ -20,6 +20,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.search.PushbackTokenizer.Range;
@@ -38,6 +39,8 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.UncheckedParseException;
@@ -115,7 +118,7 @@
         private final Collection<String> keywords = Arrays.asList("id", "version", "type", "user", "role",
                 "changeset", "nodes", "ways", "tags", "areasize", "waylength", "modified", "deleted", "selected",
                 "incomplete", "untagged", "closed", "new", "indownloadedarea",
-                "allindownloadedarea", "inview", "allinview", "timestamp", "nth", "nth%", "hasRole");
+                "allindownloadedarea", "inview", "allinview", "timestamp", "nth", "nth%", "hasRole", "preset");
 
         @Override
         public Match get(String keyword, PushbackTokenizer tokenizer) throws ParseError {
@@ -151,6 +154,8 @@
                         return new Version(tokenizer);
                     case "type":
                         return new ExactType(tokenizer.readTextOrNumber());
+                    case "preset":
+                        return new Preset(tokenizer.readTextOrNumber());
                     case "user":
                         return new UserMatch(tokenizer.readTextOrNumber());
                     case "role":
@@ -1554,6 +1559,44 @@
         }
     }
 
+    /**
+     * Matches presets.
+     */
+    private static class Preset extends Match {
+        private List<TaggingPreset> presets;
+
+        Preset(String presetName) throws ParseError {
+
+            if (presetName == null) {
+                throw new ParseError("The name of the preset is required");
+            }
+
+            this.presets = TaggingPresets.getTaggingPresets()
+                    .stream()
+                    .filter(preset -> presetName.equalsIgnoreCase(preset.getSimpleName()))
+                    .collect(Collectors.toList());
+
+            if (this.presets.isEmpty()) {
+                throw new ParseError(tr("Unknown preset name: ") + presetName);
+            }
+        }
+
+        /**
+         * Since presets can have common names, the primitive is considered to
+         * belong to a certain preset if it matches at least one of them.
+         */
+        @Override
+        public boolean match(OsmPrimitive osm) {
+            for (TaggingPreset p : this.presets) {
+                if (p.test(osm)) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+    }
+
     public static class ParseError extends Exception {
         public ParseError(String msg) {
             super(msg);
@@ -1803,4 +1846,4 @@
             return forKey + '"' + escapeStringForSearch(value) + '"';
         }
     }
-}
+}
\ No newline at end of file
Index: src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 12404)
+++ src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(working copy)
@@ -173,6 +173,14 @@
     }
 
     /**
+     * Returns the non translated name without any prefixes.
+     * @return returns the non translated name without any prefixes.
+     */
+    public String getSimpleName() {
+        return this.name;
+    }
+
+    /**
      * Returns the preset icon (16px).
      * @return The preset icon, or {@code null} if none defined
      * @since 6403
@@ -634,4 +642,4 @@
         ToolbarPreferences.ActionParser actionParser = new ToolbarPreferences.ActionParser(null);
         return actionParser.saveAction(new ToolbarPreferences.ActionDefinition(this));
     }
-}
+}
\ No newline at end of file
Index: test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java	(revision 12404)
+++ test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java	(working copy)
@@ -10,6 +10,7 @@
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.Collections;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -30,6 +31,10 @@
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WayData;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.gui.tagging.presets.items.Key;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -490,4 +495,93 @@
     public void testEnumExactKeyValueMode() {
         TestUtils.superficialEnumCodeCoverage(ExactKeyValue.Mode.class);
     }
-}
+
+    /**
+     * Robustness test for preset searching. Ensures that the query 'preset:' is not accepted.
+     * @throws ParseError always
+     */
+    @Test(expected = ParseError.class)
+    public void testPresetSearchMissingValue() throws ParseError {
+        SearchSetting settings = new SearchSetting();
+        settings.text = "preset:";
+        settings.mapCSSSearch = false;
+
+        SearchCompiler.compile(settings);
+    }
+
+    /**
+     * Robustness test for preset searching. Validates that it is not possible to search for
+     * non existing presets.
+     * @throws ParseError always
+     */
+    @Test(expected = ParseError.class)
+    public void testPresetNotExist() throws ParseError {
+        String testPresetName = "namethatshouldnotexist";
+        SearchSetting settings = new SearchSetting();
+        settings.text = "preset:" + testPresetName;
+        settings.mapCSSSearch = false;
+
+        // load presets
+        TaggingPresets.readFromPreferences();
+
+        SearchCompiler.compile(settings);
+    }
+
+    /**
+     * Robustness tests for preset searching. Ensures that combined presed names (having more than
+     * 1 words) must be enclosed in " .
+     * @throws ParseError always
+     */
+    @Test(expected = ParseError.class)
+    public void testPresetMultipleWords() throws ParseError{
+        String combinedPresetname = "Fast Food";
+        SearchSetting settings = new SearchSetting();
+        settings.text = "preset:" + combinedPresetname;
+        settings.mapCSSSearch = false;
+
+        SearchCompiler.compile(settings);
+    }
+
+    /**
+     * Ensures that correct primitives are matched against the specified preset.
+     * @throws ParseError if an error has been encountered while compiling
+     */
+    @Test
+    public void testPreset() throws ParseError {
+        final String presetName = "testPresetName";
+        final String key = "test_key1";
+        final String val = "test_val1";
+
+        Key key1 = new Key();
+        key1.key = key;
+        key1.value = val;
+
+        TaggingPreset testPreset = new TaggingPreset();
+        testPreset.name = presetName;
+        testPreset.types = Collections.singleton(TaggingPresetType.NODE);
+        testPreset.data.add(key1);
+
+        TaggingPresets.readFromPreferences();
+        TaggingPresets.addTaggingPresets(Collections.singleton(testPreset));
+
+        String[] queries = {
+                "preset:" + presetName,
+                "preset: " + presetName,
+                "preset:" + "\"" + presetName + "\""
+        };
+
+        for (int i = 0; i < queries.length; i++) {
+            SearchContext ctx = new SearchContext(queries[i]);
+            ctx.n1.put(key, val);
+            ctx.n2.put(key, val);
+
+            for (OsmPrimitive osm : new OsmPrimitive[] { ctx.n1, ctx.n2 }) {
+                ctx.match(osm, true);
+            }
+
+            for (OsmPrimitive osm : new OsmPrimitive[] { ctx.r1, ctx.r2, ctx.w1, ctx.w2 }) {
+                ctx.match(osm, false);
+            }
+        }
+    }
+}
\ No newline at end of file
