Index: trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 8071)
@@ -0,0 +1,95 @@
+// 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.
+ * @since 8071
+ */
+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) {
+        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", "cancel"});
+        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;
+        }
+
+        new DownloadNotesTask().loadUrl(false, sb.toString(), null);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 8070)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 8071)
@@ -1684,4 +1684,5 @@
 
         String[] obsolete = {
+                "osm.notes.enableDownload" // was used prior to r8071 when notes was an hidden feature. To remove end of 2015
         };
         for (String key : obsolete) {
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 8070)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 8071)
@@ -78,4 +78,5 @@
 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;
@@ -152,4 +153,6 @@
     /** 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();
@@ -615,4 +618,5 @@
         add(fileMenu, download);
         add(fileMenu, downloadPrimitive);
+        add(fileMenu, searchNotes);
         add(fileMenu, downloadReferrers);
         add(fileMenu, update);
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 8070)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 8071)
@@ -243,8 +243,5 @@
         addToggleDialog(new ChangesetDialog(), true);
         addToggleDialog(new MapPaintDialog());
-        //TODO: remove this if statement once note support is complete
-        if(Main.pref.getBoolean("osm.notes.enableDownload", false)) {
-            addToggleDialog(noteDialog = new NotesDialog());
-        }
+        addToggleDialog(noteDialog = new NotesDialog());
         toolBarToggle.setFloatable(false);
 
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 8070)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 8071)
@@ -99,14 +99,8 @@
         cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"));
         cbDownloadGpxData.setToolTipText(tr("Select to download GPS traces in the selected download area."));
-        //TODO: uncomment this and remove logic below once notes are enabled
-        //pnl.add(cbDownloadGpxData,  GBC.std().insets(5,5,1,5));
+        pnl.add(cbDownloadGpxData,  GBC.std().insets(5,5,1,5));
         cbDownloadNotes = new JCheckBox(tr("Notes"));
         cbDownloadNotes.setToolTipText(tr("Select to download notes in the selected download area."));
-        if (Main.pref.getBoolean("osm.notes.enableDownload", false)) {
-            pnl.add(cbDownloadGpxData,  GBC.std().insets(5,5,1,5));
-            pnl.add(cbDownloadNotes, GBC.eol().insets(50, 5, 1, 5));
-        } else {
-            pnl.add(cbDownloadGpxData,  GBC.eol().insets(5,5,1,5));
-        }
+        pnl.add(cbDownloadNotes, GBC.eol().insets(50, 5, 1, 5));
 
         // hook for subclasses
@@ -205,4 +199,8 @@
     }
 
+    /**
+     * Constructs a new {@code DownloadDialog}.
+     * @param parent the parent component
+     */
     public DownloadDialog(Component parent) {
         super(JOptionPane.getFrameForComponent(parent),tr("Download"), ModalityType.DOCUMENT_MODAL);
@@ -247,6 +245,5 @@
     /**
      * Distributes a "bounding box changed" from one DownloadSelection
-     * object to the others, so they may update or clear their input
-     * fields.
+     * object to the others, so they may update or clear their input fields.
      *
      * @param eventSource - the DownloadSelection object that fired this notification.
@@ -347,9 +344,5 @@
         cbDownloadOsmData.setSelected(Main.pref.getBoolean("download.osm", true));
         cbDownloadGpxData.setSelected(Main.pref.getBoolean("download.gps", false));
-        //TODO: This is to make sure notes are not downloaded if the Notes checkbox isn't being displayed.
-        //      Make it look like the ones above when notes are enabled
-        boolean downloadNotes = Main.pref.getBoolean("download.notes", false)
-                && Main.pref.getBoolean("osm.notes.enableDownload", false);
-        cbDownloadNotes.setSelected(downloadNotes);
+        cbDownloadNotes.setSelected(Main.pref.getBoolean("download.notes", false));
         cbNewLayer.setSelected(Main.pref.getBoolean("download.newlayer", false));
         cbStartup.setSelected( isAutorunEnabled() );
@@ -485,11 +478,11 @@
             }
             if (!isDownloadOsmData() && !isDownloadGpxData() && !isDownloadNotes()) {
-                //TODO: When notes are enabled, change this message to include downloading notes
                 JOptionPane.showMessageDialog(
                         DownloadDialog.this,
-                        tr("<html>Neither <strong>{0}</strong> nor <strong>{1}</strong> is enabled.<br>"
-                                + "Please choose to either download OSM data, or GPX data, or both.</html>",
+                        tr("<html>Neither <strong>{0}</strong> nor <strong>{1}</strong> nor <strong>{2}</strong> is enabled.<br>"
+                                + "Please choose to either download OSM data, or GPX data, or Notes, or all.</html>",
                                 cbDownloadOsmData.getText(),
-                                cbDownloadGpxData.getText()
+                                cbDownloadGpxData.getText(),
+                                cbDownloadNotes.getText()
                         ),
                         tr("Error"),
