Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 6737)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 6738)
@@ -114,4 +114,5 @@
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchAction;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchPrimitiveDialog;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -375,4 +376,5 @@
 
     public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
+    public final TaggingPresetSearchPrimitiveDialog.Action presetSearchPrimitiveAction = new TaggingPresetSearchPrimitiveDialog.Action();
     public final DialogsToggleAction dialogsToggleAction = new DialogsToggleAction();
     public FullscreenToggleAction fullscreenToggleAction = null;
@@ -640,4 +642,5 @@
         editMenu.addSeparator();
         add(editMenu, search);
+        add(editMenu, presetSearchPrimitiveAction);
         editMenu.addSeparator();
         add(editMenu, preferences);
@@ -700,4 +703,5 @@
 
         add(presetsMenu, presetSearchAction);
+        add(presetsMenu, presetSearchPrimitiveAction);
         add(presetsMenu, PreferencesAction.forPreferenceSubTab(tr("Preset preferences"),
                 tr("Click to open the tagging presets tab in the preferences"), TaggingPresetPreference.class));
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 6737)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 6738)
@@ -66,5 +66,5 @@
  * @since 294
  */
-public class TaggingPreset extends AbstractAction implements MapView.LayerChangeListener {
+public class TaggingPreset extends AbstractAction implements MapView.LayerChangeListener, Predicate<OsmPrimitive> {
 
     public static final int DIALOG_ANSWER_APPLY = 1;
@@ -463,4 +463,9 @@
     }
 
+    @Override
+    public boolean evaluate(OsmPrimitive p) {
+        return matches(EnumSet.of(TaggingPresetType.forPrimitive(p)), p.getKeys(), false);
+    }
+
     public boolean matches(Collection<TaggingPresetType> t, Map<String, String> tags, boolean onlyShowable) {
         if (onlyShowable && !isShowable())
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchDialog.java	(revision 6737)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchDialog.java	(revision 6738)
@@ -34,5 +34,5 @@
     private TaggingPresetSearchDialog() {
         super(Main.parent, tr("Presets"), new String[] {tr("Select"), tr("Cancel")});
-        selector = new TaggingPresetSelector();
+        selector = new TaggingPresetSelector(true, true);
         setContent(selector);
         DataSet.addSelectionListener(selector);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchPrimitiveDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchPrimitiveDialog.java	(revision 6738)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSearchPrimitiveDialog.java	(revision 6738)
@@ -0,0 +1,93 @@
+package org.openstreetmap.josm.gui.tagging;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.HashSet;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * A dialog that allows to select a preset and then selects all matching OSM objects.
+ * @see org.openstreetmap.josm.gui.tagging.TaggingPresetSearchDialog
+ */
+public final class TaggingPresetSearchPrimitiveDialog extends ExtendedDialog {
+
+    private TaggingPresetSelector selector;
+
+    private static TaggingPresetSearchPrimitiveDialog instance;
+
+    /**
+     * Returns the unique instance of {@code TaggingPresetSearchPrimitiveDialog}.
+     * @return the unique instance of {@code TaggingPresetSearchPrimitiveDialog}.
+     */
+    public static TaggingPresetSearchPrimitiveDialog getInstance() {
+        if (instance == null) {
+            instance = new TaggingPresetSearchPrimitiveDialog();
+        }
+        return instance;
+    }
+
+    TaggingPresetSearchPrimitiveDialog() {
+        super(Main.parent, tr("Presets"), new String[] {tr("Search"), tr("Cancel")});
+        selector = new TaggingPresetSelector(false, false);
+        setContent(selector);
+        selector.setDblClickListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                buttonAction(0, null);
+            }
+        });
+    }
+
+    @Override
+    public ExtendedDialog showDialog() {
+        selector.init();
+        super.showDialog();
+        selector.clearSelection();
+        return this;
+    }
+
+    @Override
+    protected void buttonAction(int buttonIndex, ActionEvent evt) {
+        super.buttonAction(buttonIndex, evt);
+        if (buttonIndex == 0) {
+            TaggingPreset preset = selector.getSelectedPreset();
+            if (preset != null) {
+                final HashSet<OsmPrimitive> matching = new HashSet<OsmPrimitive>(Utils.filter(Main.main.getCurrentDataSet().allPrimitives(), preset));
+                Main.main.getCurrentDataSet().setSelected(matching);
+            }
+        }
+    }
+
+    /**
+     * An action executing {@link TaggingPresetSearchPrimitiveDialog}.
+     */
+    public static class Action extends JosmAction {
+
+        /**
+         * Constructs a new {@link TaggingPresetSearchPrimitiveDialog.Action}.
+         */
+        public Action() {
+            super(tr("Search for objects by preset"), "dialogs/search", tr("Show preset search dialog"),
+                    Shortcut.registerShortcut("preset:search-objects", tr("Search for objects by preset"), KeyEvent.VK_F3, Shortcut.SHIFT), false);
+            putValue("toolbar", "presets/search-objects");
+            Main.toolbar.register(this);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (Main.main.hasEditLayer()) {
+                TaggingPresetSearchPrimitiveDialog.getInstance().showDialog();
+            }
+        }
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 6737)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 6738)
@@ -201,5 +201,5 @@
      * Constructs a new {@code TaggingPresetSelector}.
      */
-    public TaggingPresetSelector() {
+    public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) {
         super(new BorderLayout());
         if (TaggingPresetPreference.taggingPresets!=null) {
@@ -260,24 +260,28 @@
         pnChecks.setLayout(new BoxLayout(pnChecks, BoxLayout.Y_AXIS));
 
-        ckOnlyApplicable = new JCheckBox();
-        ckOnlyApplicable.setText(tr("Show only applicable to selection"));
-        pnChecks.add(ckOnlyApplicable);
-        ckOnlyApplicable.addItemListener(new ItemListener() {
-            @Override
-            public void itemStateChanged(ItemEvent e) {
-                filterPresets();
-            }
-        });
-
-        ckSearchInTags = new JCheckBox();
-        ckSearchInTags.setText(tr("Search in tags"));
-        ckSearchInTags.setSelected(SEARCH_IN_TAGS.get());
-        ckSearchInTags.addItemListener(new ItemListener() {
-            @Override
-            public void itemStateChanged(ItemEvent e) {
-                filterPresets();
-            }
-        });
-        pnChecks.add(ckSearchInTags);
+        if (displayOnlyApplicable) {
+            ckOnlyApplicable = new JCheckBox();
+            ckOnlyApplicable.setText(tr("Show only applicable to selection"));
+            pnChecks.add(ckOnlyApplicable);
+            ckOnlyApplicable.addItemListener(new ItemListener() {
+                @Override
+                public void itemStateChanged(ItemEvent e) {
+                    filterPresets();
+                }
+            });
+        }
+
+        if (displaySearchInTags) {
+            ckSearchInTags = new JCheckBox();
+            ckSearchInTags.setText(tr("Search in tags"));
+            ckSearchInTags.setSelected(SEARCH_IN_TAGS.get());
+            ckSearchInTags.addItemListener(new ItemListener() {
+                @Override
+                public void itemStateChanged(ItemEvent e) {
+                    filterPresets();
+                }
+            });
+            pnChecks.add(ckSearchInTags);
+        }
 
         add(pnChecks, BorderLayout.SOUTH);
@@ -317,6 +321,6 @@
         }
 
-        boolean onlyApplicable = ckOnlyApplicable.isSelected();
-        boolean inTags = ckSearchInTags.isSelected();
+        boolean onlyApplicable = ckOnlyApplicable != null && ckOnlyApplicable.isSelected();
+        boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
 
         List<PresetClassification> result = new ArrayList<PresetClassification>();
@@ -402,6 +406,8 @@
 
     public void init() {
-        ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
-        ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
+        if (ckOnlyApplicable != null) {
+            ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
+            ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
+        }
         edSearchText.setText("");
         filterPresets();
@@ -423,6 +429,8 @@
      */
     public void savePreferences() {
-        SEARCH_IN_TAGS.put(ckSearchInTags.isSelected());
-        if (ckOnlyApplicable.isEnabled()) {
+        if (ckSearchInTags != null) {
+            SEARCH_IN_TAGS.put(ckSearchInTags.isSelected());
+        }
+        if (ckOnlyApplicable != null && ckOnlyApplicable.isEnabled()) {
             ONLY_APPLICABLE.put(ckOnlyApplicable.isSelected());
         }
