Index: src/org/openstreetmap/josm/actions/OverpassDownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OverpassDownloadAction.java	(revision 12587)
+++ src/org/openstreetmap/josm/actions/OverpassDownloadAction.java	(working copy)
@@ -7,6 +7,7 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
@@ -24,6 +25,8 @@
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
 import javax.swing.plaf.basic.BasicArrowButton;
 
 import org.openstreetmap.josm.Main;
@@ -39,6 +42,7 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.io.OverpassDownloadReader;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -157,6 +161,7 @@
         private static OverpassDownloadDialog instance;
         private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED =
                 new BooleanProperty("download.overpass.query-list.opened", false);
+        private static final String ACTION_IMG_SUBDIR = "dialogs";
 
         private OverpassDownloadDialog(Component parent) {
             super(parent, ht("/Action/OverpassDownload"));
@@ -176,9 +181,6 @@
 
         @Override
         protected void buildMainPanelAboveDownloadSelections(JPanel pnl) {
-            // needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes
-            pnl.add(new JLabel(), GBC.eol());
-
             DisableActionsFocusListener disableActionsFocusListener =
                     new DisableActionsFocusListener(slippyMapChooser.getNavigationComponentActionMap());
 
@@ -190,10 +192,14 @@
                 }
             };
 
-            JButton openQueryWizard = new JButton("Query Wizard");
+            JButton openQueryWizard = new JButton(tr("Query Wizard"));
             openQueryWizard.setToolTipText(tooltip);
             openQueryWizard.addActionListener(queryWizardAction);
 
+            // use eol() that is needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes
+            pnl.add(openQueryWizard, GBC.eol());
+            pnl.add(new JLabel(tr("Overpass query:")), GBC.std().insets(5, 5, 0, 0).anchor(GBC.NORTHWEST));
+
             // CHECKSTYLE.OFF: LineLength
             this.overpassQuery = new JosmTextArea(
                     "/*\n" +
@@ -215,23 +221,37 @@
                 }
             });
 
+
             this.overpassQueryList = new OverpassQueryList(this, this.overpassQuery);
-            overpassQueryList.setToolTipText(tr("Show/hide Overpass snippet list"));
-            overpassQueryList.setVisible(OVERPASS_QUERY_LIST_OPENED.get());
-            overpassQueryList.setPreferredSize(new Dimension(350, 300));
+            this.overpassQueryList.setPreferredSize(new Dimension(350, 300));
+
+            EditSnippetAction edit = new EditSnippetAction();
+            RemoveSnippetAction remove = new RemoveSnippetAction();
+            this.overpassQueryList.addSelectionListener(edit);
+            this.overpassQueryList.addSelectionListener(remove);
+
+            JPanel listPanel = new JPanel(new GridBagLayout());
+            listPanel.add(new JLabel(tr("Your saved queries:")), GBC.eol().insets(2).anchor(GBC.CENTER));
+            listPanel.add(this.overpassQueryList, GBC.eol().fill(GBC.BOTH));
+            listPanel.add(new JButton(new AddSnippetAction()), GBC.std().fill(GBC.HORIZONTAL));
+            listPanel.add(new JButton(edit), GBC.std().fill(GBC.HORIZONTAL));
+            listPanel.add(new JButton(remove), GBC.std().fill(GBC.HORIZONTAL));
+            listPanel.setVisible(OVERPASS_QUERY_LIST_OPENED.get());
+
             JScrollPane scrollPane = new JScrollPane(overpassQuery);
-            BasicArrowButton arrowButton = new BasicArrowButton(overpassQueryList.isVisible()
+            BasicArrowButton arrowButton = new BasicArrowButton(listPanel.isVisible()
                 ? BasicArrowButton.EAST
                 : BasicArrowButton.WEST);
+            arrowButton.setToolTipText(tr("Show/hide Overpass snippet list"));
             arrowButton.addActionListener(e -> {
-                if (overpassQueryList.isVisible()) {
-                    overpassQueryList.setVisible(false);
+                if (listPanel.isVisible()) {
+                    listPanel.setVisible(false);
                     arrowButton.setDirection(BasicArrowButton.WEST);
                     OVERPASS_QUERY_LIST_OPENED.put(Boolean.FALSE);
                 } else {
-                    overpassQueryList.setVisible(true);
+                    listPanel.setVisible(true);
                     arrowButton.setDirection(BasicArrowButton.EAST);
-                    OVERPASS_QUERY_LIST_OPENED.put(Boolean.FALSE);
+                    OVERPASS_QUERY_LIST_OPENED.put(Boolean.TRUE);
                 }
             });
 
@@ -241,14 +261,13 @@
 
             JPanel pane = new JPanel(new BorderLayout());
             pane.add(innerPanel, BorderLayout.CENTER);
-            pane.add(overpassQueryList, BorderLayout.EAST);
+            pane.add(listPanel, BorderLayout.EAST);
 
             GBC gbc = GBC.eol().fill(GBC.HORIZONTAL); gbc.ipady = 200;
-            pnl.add(openQueryWizard, GBC.std().insets(5, 5, 5, 5));
             pnl.add(pane, gbc);
         }
 
-        String getOverpassQuery() {
+        public String getOverpassQuery() {
             return overpassQuery.getText();
         }
 
@@ -280,5 +299,91 @@
         public void triggerDownload() {
             super.btnDownload.doClick();
         }
+
+        /**
+         * Action that delegates snippet creation to {@link OverpassQueryList#createNewItem()}.
+         */
+        class AddSnippetAction extends AbstractAction {
+
+            /**
+             * Constructs a new {@code AddSnippetAction}.
+             */
+            AddSnippetAction() {
+                super();
+                putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "add"));
+                putValue(SHORT_DESCRIPTION, tr("Add new snippet"));
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                overpassQueryList.createNewItem();
+            }
+        }
+
+        /**
+         * Action that delegates snippet removal to {@link OverpassQueryList#removeSelectedItem()}.
+         */
+        class RemoveSnippetAction extends AbstractAction implements ListSelectionListener {
+
+            /**
+             * Constructs a new {@code RemoveSnippetAction}.
+             */
+            RemoveSnippetAction() {
+                super();
+                putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "delete"));
+                putValue(SHORT_DESCRIPTION, tr("Delete selected snippet"));
+                checkEnabled();
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                overpassQueryList.removeSelectedItem();
+            }
+
+            /**
+             * Disables the action if no items are selected.
+             */
+            void checkEnabled() {
+                setEnabled(overpassQueryList.getSelectedItem().isPresent());
+            }
+
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                checkEnabled();
+            }
+        }
+
+        /**
+         * Action that delegates snippet edit to {@link OverpassQueryList#editSelectedItem()}.
+         */
+        class EditSnippetAction extends AbstractAction implements ListSelectionListener {
+
+            /**
+             * Constructs a new {@code EditSnippetAction}.
+             */
+            EditSnippetAction() {
+                super();
+                putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "edit"));
+                putValue(SHORT_DESCRIPTION, tr("Edit selected snippet"));
+                checkEnabled();
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                overpassQueryList.editSelectedItem();
+            }
+
+            /**
+             * Disables the action if no items are selected.
+             */
+            void checkEnabled() {
+                setEnabled(overpassQueryList.getSelectedItem().isPresent());
+            }
+
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                checkEnabled();
+            }
+        }
     }
 }
Index: src/org/openstreetmap/josm/gui/download/OverpassQueryList.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/OverpassQueryList.java	(revision 12587)
+++ src/org/openstreetmap/josm/gui/download/OverpassQueryList.java	(working copy)
@@ -19,6 +19,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
@@ -102,7 +103,7 @@
      */
     public synchronized Optional<SelectorItem> getSelectedItem() {
         int idx = lsResult.getSelectedIndex();
-        if (lsResultModel.getSize() == 0 || idx == -1) {
+        if (lsResultModel.getSize() <= idx || idx == -1) {
             return Optional.empty();
         }
 
@@ -147,7 +148,7 @@
      * Removes currently selected item, saves the current state to preferences and
      * updates the view.
      */
-    private synchronized void removeSelectedItem() {
+    public synchronized void removeSelectedItem() {
         Optional<SelectorItem> it = this.getSelectedItem();
 
         if (!it.isPresent()) {
@@ -159,6 +160,7 @@
 
         SelectorItem item = it.get();
         if (this.items.remove(item.getKey(), item)) {
+            clearSelection();
             savePreferences();
             filterItems();
         }
@@ -168,7 +170,7 @@
      * Opens {@link EditItemDialog} for the selected item, saves the current state
      * to preferences and updates the view.
      */
-    private synchronized void editSelectedItem() {
+    public synchronized void editSelectedItem() {
         Optional<SelectorItem> it = this.getSelectedItem();
 
         if (!it.isPresent()) {
@@ -201,7 +203,7 @@
      * Opens {@link EditItemDialog}, saves the state to preferences if a new item is added
      * and updates the view.
      */
-    private synchronized void createNewItem() {
+    public synchronized void createNewItem() {
         EditItemDialog dialog = new EditItemDialog(componentParent, tr("Add snippet"), tr("Add"));
         dialog.showDialog();
 
@@ -221,10 +223,11 @@
     @Override
     protected void filterItems() {
         String text = edSearchText.getText().toLowerCase(Locale.ENGLISH);
+        List<SelectorItem> matchingItems = this.items.values().stream()
+                .filter(item -> item.getKey().contains(text))
+                .collect(Collectors.toList());
 
-        super.lsResultModel.setItems(this.items.values().stream()
-                .filter(item -> item.getKey().contains(text))
-                .collect(Collectors.toList()));
+        super.lsResultModel.setItems(matchingItems);
     }
 
     private void doubleClickEvent() {
Index: src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java	(revision 12587)
+++ src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java	(working copy)
@@ -36,6 +36,7 @@
  */
 public final class OverpassQueryWizardDialog extends ExtendedDialog {
 
+    private final HistoryComboBox queryWizard;
     private static final String HEADLINE_START = "<h3>";
     private static final String HEADLINE_END = "</h3>";
     private static final String TR_START = "<tr>";
@@ -42,10 +43,11 @@
     private static final String TR_END = "</tr>";
     private static final String TD_START = "<td>";
     private static final String TD_END = "</td>";
-    private final HistoryComboBox queryWizard;
-    private final OverpassTurboQueryWizard overpassQueryBuilder;
+    private static final String SPAN_START = "<span>";
+    private static final String SPAN_END = "</span>";
     private static final CollectionProperty OVERPASS_WIZARD_HISTORY =
             new CollectionProperty("download.overpass.wizard", new ArrayList<String>());
+    private final transient OverpassTurboQueryWizard overpassQueryBuilder;
 
     // dialog buttons
     private static final int BUILD_QUERY = 0;
@@ -199,7 +201,7 @@
                 .append("<table>").append(TR_START).append(TD_START)
                 .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>type:node</i>", "<i>type:relation</i>", "<i>type:way</i>")))
                 .append(TD_END).append(TD_START)
-                .append("<span>").append(tr("Download objects of a certain type.")).append("</span>")
+                .append(SPAN_START).append(tr("Download objects of a certain type.")).append(SPAN_END)
                 .append(TD_END).append(TR_END)
                 .append(TR_START).append(TD_START)
                 .append(Utils.joinAsHtmlUnorderedList(
@@ -214,9 +216,9 @@
                                 "is set to 1000m, but it can be changed in the generated query.", "<i>tourism=hotel around Berlin</i> -"),
                         tr("{0} all objects within the current selection that have {1} as attribute.", "<i>tourism=hotel in bbox</i> -",
                                 "'tourism=hotel'"))))
-                .append("<span>")
+                .append(SPAN_START)
                 .append(tr("Instead of <i>location</i> any valid place name can be used like address, city, etc."))
-                .append("</span>")
+                .append(SPAN_END)
                 .append(TD_END).append(TR_END)
                 .append(TR_START).append(TD_START)
                 .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>key=value</i>", "<i>key=*</i>", "<i>key~regex</i>",
@@ -230,10 +232,10 @@
                         tr("<i>expression1 {0} expression2</i>", "or"),
                         tr("<i>expression1 {0} expression2</i>", "and"))))
                 .append(TD_END).append(TD_START)
-                .append("<span>")
+                .append(SPAN_START)
                 .append(tr("Basic logical operators can be used to create more sophisticated queries. Instead of \"or\" - \"|\", \"||\" " +
                         "can be used, and instead of \"and\" - \"&\", \"&&\"."))
-                .append("</span>")
+                .append(SPAN_END)
                 .append(TD_END).append(TR_END).append("</table>")
                 .append("</body>")
                 .append("</html>")
