diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index f1b45b8..f9697b9 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -499,7 +499,6 @@ public class JoinAreasAction extends JosmAction {
                 }
                 if (ds != null) {
                     ds.setSelected(allWays);
-                    Main.map.mapView.repaint();
                 }
             } else {
                 new Notification(
diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
index 6d4eed1..59a9d47 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchAction.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchAction.java
@@ -529,7 +529,90 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
     }
 
     static void search(SearchSetting s) {
-        SearchTask.newSearchTask(s).run();
+        SearchTask.newSearchTask(s, new SelectSearchReceiver()).run();
+    }
+
+    /**
+     * Performs the search specified by the search string {@code search} and the search mode {@code mode} and returns the result of the search.
+     *
+     * @param search the search string to use
+     * @param mode the search mode to use
+     * @return The result of the search.
+     */
+    public static Collection<OsmPrimitive> searchAndReturn(String search, SearchMode mode) {
+        final SearchSetting searchSetting = new SearchSetting();
+        searchSetting.text = search;
+        searchSetting.mode = mode;
+        CapturingSearchReceiver receiver = new CapturingSearchReceiver();
+        SearchTask.newSearchTask(searchSetting, receiver).run();
+        return receiver.result;
+    }
+
+    /**
+     * Interfaces implementing this may receive the result of the current search.
+     * @author Michael Zangl
+     * @since xxx
+     */
+    interface SearchReceiver {
+        /**
+         * Receive the search result
+         * @param ds The data set searched on.
+         * @param result The result collection, including the initial collection.
+         * @param foundMatches The number of matches added to the result.
+         * @param setting The setting used.
+         */
+        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting);
+    }
+
+    /**
+     * Select the search result and display a status text for it.
+     * @since xxx
+     */
+    private static class SelectSearchReceiver implements SearchReceiver {
+
+        @Override
+        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting) {
+            ds.setSelected(result);
+            if (foundMatches == 0) {
+                final String msg;
+                final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
+                if (setting.mode == SearchMode.replace) {
+                    msg = tr("No match found for ''{0}''", text);
+                } else if (setting.mode == SearchMode.add) {
+                    msg = tr("Nothing added to selection by searching for ''{0}''", text);
+                } else if (setting.mode == SearchMode.remove) {
+                    msg = tr("Nothing removed from selection by searching for ''{0}''", text);
+                } else if (setting.mode == SearchMode.in_selection) {
+                    msg = tr("Nothing found in selection by searching for ''{0}''", text);
+                } else {
+                    msg = null;
+                }
+                Main.map.statusLine.setHelpText(msg);
+                JOptionPane.showMessageDialog(
+                        Main.parent,
+                        msg,
+                        tr("Warning"),
+                        JOptionPane.WARNING_MESSAGE
+                );
+            } else {
+                Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
+            }
+        }
+    }
+
+    /**
+     * This class stores the result of the search in a local variable.
+     * @author Michael Zangl
+     * @since xxx
+     */
+    private static final class CapturingSearchReceiver implements SearchReceiver {
+        private Collection<OsmPrimitive> result;
+
+        @Override
+        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches,
+                SearchSetting setting) {
+                    this.result = result;
+        }
     }
 
     static final class SearchTask extends PleaseWaitRunnable {
@@ -539,24 +622,37 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         private final Predicate<OsmPrimitive> predicate;
         private boolean canceled;
         private int foundMatches;
+        private SearchReceiver resultReceiver;
 
-        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate) {
+        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate,
+                SearchReceiver resultReceiver) {
             super(tr("Searching"));
             this.ds = ds;
             this.setting = setting;
             this.selection = selection;
             this.predicate = predicate;
+            this.resultReceiver = resultReceiver;
         }
 
-        static SearchTask newSearchTask(SearchSetting setting) {
+        static SearchTask newSearchTask(SearchSetting setting, SearchReceiver resultReceiver) {
             final DataSet ds = Main.getLayerManager().getEditDataSet();
+            return newSearchTask(setting, ds, resultReceiver);
+        }
+
+        /**
+         * Create a new search task for the given search setting.
+         * @param setting The setting to use
+         * @param ds The data set to search on
+         * @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, new Predicate<OsmPrimitive>() {
                 @Override
                 public boolean evaluate(OsmPrimitive o) {
                     return ds.isSelected(o);
                 }
-            });
+            }, resultReceiver);
         }
 
         @Override
@@ -613,7 +709,6 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
                         e.getMessage(),
                         tr("Error"),
                         JOptionPane.ERROR_MESSAGE
-
                 );
             }
         }
@@ -623,31 +718,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
             if (canceled) {
                 return;
             }
-            ds.setSelected(selection);
-            if (foundMatches == 0) {
-                final String msg;
-                final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
-                if (setting.mode == SearchMode.replace) {
-                    msg = tr("No match found for ''{0}''", text);
-                } else if (setting.mode == SearchMode.add) {
-                    msg = tr("Nothing added to selection by searching for ''{0}''", text);
-                } else if (setting.mode == SearchMode.remove) {
-                    msg = tr("Nothing removed from selection by searching for ''{0}''", text);
-                } else if (setting.mode == SearchMode.in_selection) {
-                    msg = tr("Nothing found in selection by searching for ''{0}''", text);
-                } else {
-                    msg = null;
-                }
-                Main.map.statusLine.setHelpText(msg);
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        msg,
-                        tr("Warning"),
-                        JOptionPane.WARNING_MESSAGE
-                );
-            } else {
-                Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
-            }
+            resultReceiver.receiveSearchResult(ds, selection, foundMatches, setting);
         }
     }
 
diff --git a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
index 32ffc60..231f693 100644
--- a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -13,10 +14,13 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Unit tests of {@link JoinAreasAction} class.
@@ -64,18 +68,16 @@ public class JoinAreasActionTest {
             assertEquals(10, ds.getWays().size());
             Layer layer = new OsmDataLayer(ds, null, null);
             Main.getLayerManager().addLayer(layer);
-            try {
-                for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
-                    System.out.print("Joining ways " + ref);
-                    SearchAction.search("type:way ref="+ref, SearchAction.SearchMode.replace);
-                    assertEquals(2, ds.getSelectedWays().size());
-                    Main.main.menu.joinAreas.join(ds.getSelectedWays());
-                    assertEquals(1, ds.getSelectedWays().size());
-                    System.out.println(" ==> OK");
-                }
-            } finally {
-                // Ensure we clean the place before leaving, even if test fails.
-                Main.getLayerManager().removeLayer(layer);
+            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, SearchAction.SearchMode.replace);
+                assertEquals(2, found.size());
+
+                Main.main.menu.joinAreas.join(Utils.filteredCollection(found, Way.class));
+
+                Collection<OsmPrimitive> found2 = SearchAction.searchAndReturn("type:way ref="+ref, SearchAction.SearchMode.replace);
+                assertEquals(1, found2.size());
+                System.out.println(" ==> OK");
             }
         }
     }
