Index: src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 0)
+++ src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(working copy)
@@ -0,0 +1,97 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
+import org.openstreetmap.josm.io.OsmApi;
+
+/**
+ * Action to use the Notes search API to download all
+ * notes matching a given search term
+ */
+public class SearchNotesDownloadAction extends JosmAction {
+
+    private static final String HISTORY_KEY = "osm.notes.searchHistory";
+
+    /** Constructs a new note search action */
+    public SearchNotesDownloadAction() {
+        super(tr("Search Notes..."), "note_search", tr("Download notes from the note search API"), null, false);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        Main.debug("searching for notes");
+
+        HistoryComboBox searchTermBox = new HistoryComboBox();
+        List<String> searchHistory = new LinkedList<>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
+        Collections.reverse(searchHistory);
+        searchTermBox.setPossibleItems(searchHistory);
+
+        JPanel contentPanel = new JPanel(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 1.0;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        contentPanel.add(new JLabel(tr("Search the OSM API for notes containing words:")), gc);
+        gc.gridy = 1;
+        contentPanel.add(searchTermBox, gc);
+
+        ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Search for notes"), new String[] {tr("Search for notes"), tr("Cancel")});
+        ed.setContent(contentPanel);
+        ed.setButtonIcons(new String[] {"note_search.png", "cancel.png"});
+        ed.showDialog();
+        if (ed.getValue() != 1) {
+            return;
+        }
+
+        String searchTerm = searchTermBox.getText();
+        if (searchTerm == null || searchTerm.trim().isEmpty()) {
+            Notification notification = new Notification(tr("You must enter a search term"));
+            notification.setIcon(JOptionPane.WARNING_MESSAGE);
+            notification.show();
+            return;
+        }
+
+        searchTermBox.addCurrentItemToHistory();
+        Main.pref.putCollection(HISTORY_KEY, searchTermBox.getHistory());
+
+        searchTerm = searchTerm.trim();
+        int noteLimit = Main.pref.getInteger("osm.notes.downloadLimit", 1000);
+        int closedLimit = Main.pref.getInteger("osm.notes.daysCloased", 7);
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(OsmApi.getOsmApi().getBaseUrl());
+        sb.append("notes/search?limit=");
+        sb.append(noteLimit);
+        sb.append("&closed=");
+        sb.append(closedLimit);
+        sb.append("&q=");
+        try {
+            sb.append(URLEncoder.encode(searchTerm, "UTF-8"));
+        } catch (UnsupportedEncodingException ex) {
+            Main.error(ex, true); //thrown if UTF-8 isn't supported which seems unlikely.
+            return;
+        }
+
+        DownloadNotesTask task = new DownloadNotesTask();
+        task.loadUrl(false, sb.toString(), null);
+    }
+}
Index: src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainMenu.java	(revision 7955)
+++ src/org/openstreetmap/josm/gui/MainMenu.java	(working copy)
@@ -77,6 +77,7 @@
 import org.openstreetmap.josm.actions.ReverseWayAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.SaveAsAction;
+import org.openstreetmap.josm.actions.SearchNotesDownloadAction;
 import org.openstreetmap.josm.actions.SelectAllAction;
 import org.openstreetmap.josm.actions.SelectNonBranchingWaySequencesAction;
 import org.openstreetmap.josm.actions.SessionLoadAction;
@@ -151,6 +152,8 @@
     public final DownloadAction download = new DownloadAction();
     /** File / Download object... **/
     public final DownloadPrimitiveAction downloadPrimitive = new DownloadPrimitiveAction();
+    /** File / Search Notes... **/
+    public final SearchNotesDownloadAction searchNotes = new SearchNotesDownloadAction();
     /** File / Download parent ways/relations... **/
     public final DownloadReferrersAction downloadReferrers = new DownloadReferrersAction();
     /** File / Close open changesets... **/
@@ -614,6 +617,10 @@
         fileMenu.addSeparator();
         add(fileMenu, download);
         add(fileMenu, downloadPrimitive);
+        //TODO: Remove conditional when notes are un-hidden
+        if (Main.pref.getBoolean("osm.notes.enableDownload", false)) {
+            add(fileMenu, searchNotes);
+        }
         add(fileMenu, downloadReferrers);
         add(fileMenu, update);
         add(fileMenu, updateSelection);
