Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 13949)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 13950)
@@ -45,7 +45,7 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.ParameterizedAction;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Filter;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.search.PushbackTokenizer;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
@@ -626,6 +626,7 @@
      * @return The result of the search.
      * @since 10457
-     */
-    public static Collection<OsmPrimitive> searchAndReturn(String search, SearchMode mode) {
+     * @since 13950 (signature)
+     */
+    public static Collection<IPrimitive> searchAndReturn(String search, SearchMode mode) {
         final SearchSetting searchSetting = new SearchSetting();
         searchSetting.text = search;
@@ -678,4 +679,5 @@
      * @since 10457
      * @since 10600 (functional interface)
+     * @since 13950 (signature)
      */
     @FunctionalInterface
@@ -689,5 +691,6 @@
          * @param parent parent component
          */
-        void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting, Component parent);
+        void receiveSearchResult(OsmData<?, ?, ?, ?> ds, Collection<IPrimitive> result,
+                int foundMatches, SearchSetting setting, Component parent);
     }
 
@@ -698,5 +701,6 @@
 
         @Override
-        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting, Component parent) {
+        public void receiveSearchResult(OsmData<?, ?, ?, ?> ds, Collection<IPrimitive> result,
+                int foundMatches, SearchSetting setting, Component parent) {
             ds.setSelected(result);
             MapFrame map = MainApplication.getMap();
@@ -732,8 +736,8 @@
      */
     private static final class CapturingSearchReceiver implements SearchReceiver {
-        private Collection<OsmPrimitive> result;
+        private Collection<IPrimitive> result;
 
         @Override
-        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches,
+        public void receiveSearchResult(OsmData<?, ?, ?, ?> ds, Collection<IPrimitive> result, int foundMatches,
                 SearchSetting setting, Component parent) {
                     this.result = result;
@@ -742,14 +746,14 @@
 
     static final class SearchTask extends PleaseWaitRunnable {
-        private final DataSet ds;
+        private final OsmData<?, ?, ?, ?> ds;
         private final SearchSetting setting;
-        private final Collection<OsmPrimitive> selection;
-        private final Predicate<OsmPrimitive> predicate;
+        private final Collection<IPrimitive> selection;
+        private final Predicate<IPrimitive> predicate;
         private boolean canceled;
         private int foundMatches;
         private final SearchReceiver resultReceiver;
 
-        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate,
-                SearchReceiver resultReceiver) {
+        private SearchTask(OsmData<?, ?, ?, ?> ds, SearchSetting setting, Collection<IPrimitive> selection,
+                Predicate<IPrimitive> predicate, SearchReceiver resultReceiver) {
             super(tr("Searching"));
             this.ds = ds;
@@ -761,5 +765,5 @@
 
         static SearchTask newSearchTask(SearchSetting setting, SearchReceiver resultReceiver) {
-            final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            final OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
             if (ds == null) {
                 throw new IllegalStateException("No active dataset");
@@ -775,7 +779,7 @@
          * @return A new search task.
          */
-        private static SearchTask newSearchTask(SearchSetting setting, final DataSet ds, SearchReceiver resultReceiver) {
-            final Collection<OsmPrimitive> selection = new HashSet<>(ds.getAllSelected());
-            return new SearchTask(ds, setting, selection, ds::isSelected, resultReceiver);
+        private static SearchTask newSearchTask(SearchSetting setting, final OsmData<?, ?, ?, ?> ds, SearchReceiver resultReceiver) {
+            final Collection<IPrimitive> selection = new HashSet<>(ds.getAllSelected());
+            return new SearchTask(ds, setting, selection, IPrimitive::isSelected, resultReceiver);
         }
 
@@ -797,14 +801,14 @@
                 }
 
-                Collection<OsmPrimitive> all;
+                Collection<? extends IPrimitive> all;
                 if (setting.allElements) {
                     all = ds.allPrimitives();
                 } else {
-                    all = ds.getPrimitives(OsmPrimitive::isSelectable);
+                    all = ds.getPrimitives(p -> p.isSelectable()); // Do not use method reference before Java 11!
                 }
                 final ProgressMonitor subMonitor = getProgressMonitor().createSubTaskMonitor(all.size(), false);
                 subMonitor.beginTask(trn("Searching in {0} object", "Searching in {0} objects", all.size(), all.size()));
 
-                for (OsmPrimitive osm : all) {
+                for (IPrimitive osm : all) {
                     if (canceled) {
                         return;
Index: /trunk/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java	(revision 13949)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java	(revision 13950)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -85,10 +86,10 @@
             for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
                 System.out.print("Joining ways " + ref);
-                Collection<OsmPrimitive> found = SearchAction.searchAndReturn("type:way ref="+ref, SearchMode.replace);
+                Collection<IPrimitive> found = SearchAction.searchAndReturn("type:way ref="+ref, SearchMode.replace);
                 assertEquals(2, found.size());
 
                 MainApplication.getMenu().joinAreas.join(Utils.filteredCollection(found, Way.class));
 
-                Collection<OsmPrimitive> found2 = SearchAction.searchAndReturn("type:way ref="+ref, SearchMode.replace);
+                Collection<IPrimitive> found2 = SearchAction.searchAndReturn("type:way ref="+ref, SearchMode.replace);
                 assertEquals(1, found2.size());
                 System.out.println(" ==> OK");
