Index: utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java
===================================================================
--- utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java	(revision 27323)
+++ utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java	(working copy)
@@ -457,5 +457,36 @@
        // System.out.printf("Intersected intercount %d %s\n",interCount, point.toString());
         if (interCount%2 == 1) return 1; else return 0;
     }
+    
+    public static Collection<OsmPrimitive> selectAllInside(Collection<OsmPrimitive> selected, DataSet dataset) {
+        Set<Way> selectedWays = OsmPrimitive.getFilteredSet(selected, Way.class);
+        Set<Relation> selectedRels = OsmPrimitive.getFilteredSet(selected, Relation.class);
 
+        for (Relation r: selectedRels) {
+            if (!r.isMultipolygon()) selectedRels.remove(r);
+        }
+
+        Set<Way> newWays = new HashSet<Way>();
+        Set<Node> newNodes = new HashSet<Node>();
+        // select ways attached to already selected ways
+        if (!selectedWays.isEmpty()) {
+            for (Way w: selectedWays) {
+                addAllInsideWay(dataset,w,newWays,newNodes);
+            }
+        }
+        if (!selectedRels.isEmpty()) {
+            for (Relation r: selectedRels) {
+                addAllInsideMultipolygon(dataset,r,newWays,newNodes);
+            }
+        }
+        
+        Set<OsmPrimitive> insideSelection = new HashSet<OsmPrimitive>();
+        if (!newWays.isEmpty() || !newNodes.isEmpty()) {
+            insideSelection.addAll(newWays);
+            insideSelection.addAll(newNodes);
+        }
+        return insideSelection;
+    }
+
+
 }
Index: utilsplugin2/src/utilsplugin2/selection/SelectAllInsideAction.java
===================================================================
--- utilsplugin2/src/utilsplugin2/selection/SelectAllInsideAction.java	(revision 27323)
+++ utilsplugin2/src/utilsplugin2/selection/SelectAllInsideAction.java	(working copy)
@@ -14,10 +14,7 @@
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.*;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -31,32 +28,14 @@
                 KeyEvent.VK_I, Shortcut.GROUP_EDIT ,KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK), true);
         putValue("help", ht("/Action/SelectAllInside"));
     }
-
+    
+    @Override
     public void actionPerformed(ActionEvent e) {
         long t=System.currentTimeMillis();
-        Set<Way> selectedWays = OsmPrimitive.getFilteredSet(getCurrentDataSet().getSelected(), Way.class);
-        Set<Relation> selectedRels = OsmPrimitive.getFilteredSet(getCurrentDataSet().getSelected(), Relation.class);
-
-        for (Relation r: selectedRels) {
-            if (!r.isMultipolygon()) selectedRels.remove(r);
-        }
-
-        Set<Way> newWays = new HashSet<Way>();
-        Set<Node> newNodes = new HashSet<Node>();
-        // select ways attached to already selected ways
-        if (!selectedWays.isEmpty()) {
-            for (Way w: selectedWays) {
-                NodeWayUtils.addAllInsideWay(getCurrentDataSet(),w,newWays,newNodes);
-            }
-        }
-        if (!selectedRels.isEmpty()) {
-            for (Relation r: selectedRels) {
-                NodeWayUtils.addAllInsideMultipolygon(getCurrentDataSet(),r,newWays,newNodes);
-            }
-        }
-        if (!newWays.isEmpty() || !newNodes.isEmpty()) {
-            getCurrentDataSet().addSelected(newWays);
-            getCurrentDataSet().addSelected(newNodes);
+        Collection<OsmPrimitive> insideSelected = NodeWayUtils.selectAllInside(getCurrentDataSet().getSelected(), getCurrentDataSet());
+        
+        if (!insideSelected.isEmpty()) {
+            getCurrentDataSet().addSelected(insideSelected);
         } else{
         JOptionPane.showMessageDialog(Main.parent,
                tr("Nothing found. Please select some closed ways or multipolygons to find all primitives inside them!"),
Index: utilsplugin2/src/utilsplugin2/UtilsPlugin2.java
===================================================================
--- utilsplugin2/src/utilsplugin2/UtilsPlugin2.java	(revision 27323)
+++ utilsplugin2/src/utilsplugin2/UtilsPlugin2.java	(working copy)
@@ -1,14 +1,20 @@
 // License: GPL v2 or later. See LICENSE file for details.
 package utilsplugin2;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import utilsplugin2.selection.*;
 import utilsplugin2.dumbutils.*;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
+import org.openstreetmap.josm.actions.search.SearchCompiler.PluginMatch;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -83,7 +89,10 @@
         
         selectURL = MainMenu.add(toolsMenu, new ChooseURLAction());
         
-
+        /* FIXME: how to do this? PluginMatch is abstract, so getKeyword() can't be static,
+         * move this all to core using getDeclaredMethod().invoke? */
+        InsideSelectedMatch m = new InsideSelectedMatch();
+        SearchCompiler.addPluginMatch(m.getKeyword(), InsideSelectedMatch.class);
     }
 
     @Override
@@ -121,4 +130,30 @@
         return new UtilsPluginPreferences();
     }
 
+    public static class InsideSelectedMatch extends PluginMatch {
+        private Collection<OsmPrimitive> insideSelected = null;
+        
+        private void init() {
+            insideSelected = NodeWayUtils.selectAllInside(
+                    Main.main.getCurrentDataSet().getSelected(), Main.main.getCurrentDataSet());
+        }
+        
+        @Override
+        public String getKeyword() {
+            return "insideselected";
+        }
+
+        @Override
+        public String getDescription() {
+            return tr("find all objects inside the selected areas");
+        }
+
+        @Override
+        public boolean match(OsmPrimitive osm) {
+            if (insideSelected == null) {
+                init();
+            }
+            return insideSelected.contains(osm);
+        }
+    }
 }
