Index: trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 13929)
+++ trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 13930)
@@ -11,4 +11,5 @@
 import java.awt.event.FocusEvent;
 import java.util.Collection;
+import java.util.Objects;
 import java.util.concurrent.Future;
 import java.util.function.Consumer;
@@ -36,4 +37,7 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.download.DownloadSourceSizingPolicy.AdjustableDownloadSizePolicy;
+import org.openstreetmap.josm.gui.download.overpass.OverpassWizardRegistration;
+import org.openstreetmap.josm.gui.download.overpass.OverpassWizardRegistration.OverpassQueryWizard;
+import org.openstreetmap.josm.gui.download.overpass.OverpassWizardRegistration.OverpassWizardCallbacks;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
@@ -82,5 +86,6 @@
      * @since 12652
      */
-    public static class OverpassDownloadSourcePanel extends AbstractDownloadSourcePanel<OverpassDownloadData> {
+    public static class OverpassDownloadSourcePanel extends AbstractDownloadSourcePanel<OverpassDownloadData>
+            implements OverpassWizardCallbacks {
 
         private static final String SIMPLE_NAME = "overpassdownloadpanel";
@@ -104,15 +109,4 @@
             super(ds);
             setLayout(new BorderLayout());
-
-            String tooltip = tr("Build an Overpass query using the Overpass Turbo Query Wizard tool");
-
-            JButton openQueryWizard = new JButton(tr("Query Wizard"));
-            openQueryWizard.setToolTipText(tooltip);
-            openQueryWizard.addActionListener(new AbstractAction() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    new OverpassQueryWizardDialog(OverpassDownloadSourcePanel.this).showDialog();
-                }
-            });
 
             this.overpassQuery = new JosmTextArea(DOWNLOAD_QUERY.get(), 8, 80);
@@ -165,5 +159,8 @@
             leftPanel.add(new JLabel(tr("Overpass query:")), GBC.eol().insets(5, 1, 5, 1).anchor(GBC.NORTHWEST));
             leftPanel.add(new JLabel(), GBC.eol().fill(GBC.VERTICAL));
-            leftPanel.add(openQueryWizard, GBC.eol().anchor(GBC.CENTER));
+            OverpassWizardRegistration.getWizards()
+                .stream()
+                .map(this::generateWizardButton)
+                .forEach(button -> leftPanel.add(button, GBC.eol().anchor(GBC.CENTER)));
             leftPanel.add(new JLabel(), GBC.eol().fill(GBC.VERTICAL));
 
@@ -173,4 +170,16 @@
 
             setMinimumSize(new Dimension(450, 240));
+        }
+
+        private JButton generateWizardButton(OverpassQueryWizard wizard) {
+            JButton openQueryWizard = new JButton(wizard.getWizardName());
+            openQueryWizard.setToolTipText(wizard.getWizardTooltip().orElse(null));
+            openQueryWizard.addActionListener(new AbstractAction() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    wizard.startWizard(OverpassDownloadSourcePanel.this);
+                }
+            });
+            return openQueryWizard;
         }
 
@@ -260,4 +269,5 @@
          */
         public void setOverpassQuery(String query) {
+            Objects.requireNonNull(query, "query");
             this.overpassQuery.setText(query);
         }
@@ -360,4 +370,9 @@
                 checkEnabled();
             }
+        }
+
+        @Override
+        public void submitWizardResult(String resultingQuery) {
+            setOverpassQuery(resultingQuery);
         }
     }
@@ -383,3 +398,4 @@
         }
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java	(revision 13929)
+++ trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java	(revision 13930)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.data.preferences.ListProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.download.overpass.OverpassWizardRegistration.OverpassWizardCallbacks;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
@@ -65,14 +66,14 @@
             + "</style>\n";
 
-    private final OverpassDownloadSource.OverpassDownloadSourcePanel dsPanel;
+    private final OverpassWizardCallbacks dsPanel;
 
     /**
      * Create a new {@link OverpassQueryWizardDialog}
-     * @param dsPanel The Overpass download source panel.
-     */
-    public OverpassQueryWizardDialog(OverpassDownloadSource.OverpassDownloadSourcePanel dsPanel) {
-        super(dsPanel.getParent(), tr("Overpass Turbo Query Wizard"),
+     * @param callbacks The Overpass download source panel.
+     */
+    public OverpassQueryWizardDialog(OverpassWizardCallbacks callbacks) {
+        super(callbacks.getParent(), tr("Overpass Turbo Query Wizard"),
                 tr("Build query"), tr("Build query and execute"), tr("Cancel"));
-        this.dsPanel = dsPanel;
+        this.dsPanel = callbacks;
 
         this.queryWizard = new HistoryComboBox();
@@ -168,12 +169,6 @@
 
         Optional<String> q = this.tryParseSearchTerm(wizardSearchTerm);
-        if (q.isPresent()) {
-            String query = q.get();
-            dsPanel.setOverpassQuery(query);
-
-            return true;
-        }
-
-        return false;
+        q.ifPresent(dsPanel::submitWizardResult);
+        return q.isPresent();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java	(revision 13930)
+++ trunk/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java	(revision 13930)
@@ -0,0 +1,113 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.download.overpass;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.openstreetmap.josm.gui.download.OverpassQueryWizardDialog;
+
+/**
+ * Registers the overpass query wizards.
+ * @author Michael Zangl
+ * @since 13930
+ */
+public final class OverpassWizardRegistration {
+    /**
+     * A list of all reigstered wizards. Needs to be synchronized since plugin registration may happen outside main thread / asynchronously.
+     */
+    private static List<OverpassQueryWizard> wizards = Collections.synchronizedList(new ArrayList<>());
+
+    /**
+     * Registers a wizard to be added to the overpass download dialog
+     * <p>
+     * To be called by plugins during the JOSM boot process or at least before opening the download dialog for the first time.
+     * @param wizard The wizard to register
+     * @since 13930
+     */
+    public static void registerWizard(OverpassQueryWizard wizard) {
+        Objects.requireNonNull(wizard, "wizard");
+        wizards.add(wizard);
+    }
+
+    /**
+     * Gets all wizards that are currently registered.
+     * @return The list of wizards.
+     */
+    public static List<OverpassQueryWizard> getWizards() {
+        return Collections.unmodifiableList(wizards);
+    }
+
+    static {
+        // Register the default wizard
+        registerWizard(new OverpassQueryWizard() {
+            @Override
+            public void startWizard(OverpassWizardCallbacks callbacks) {
+                new OverpassQueryWizardDialog(callbacks).showDialog();
+            }
+
+            @Override
+            public Optional<String> getWizardTooltip() {
+                return Optional.of(tr("Build an Overpass query using the Overpass Turbo Query Wizard tool"));
+            }
+
+            @Override
+            public String getWizardName() {
+                return tr("Query Wizard");
+            }
+        });
+    }
+
+    private OverpassWizardRegistration() {
+        // hidden
+    }
+
+    /**
+     * Defines a query wizard that generates overpass queries.
+     * @author Michael Zangl
+     * @since 13930
+     */
+    public interface OverpassQueryWizard {
+        /**
+         * Get the name of the wizard
+         * @return The name
+         */
+        String getWizardName();
+
+        /**
+         * Get the tooltip text to display when hovering the wizard button.
+         * @return The tooltip text or an empty optional to display no tooltip.
+         */
+        Optional<String> getWizardTooltip();
+
+        /**
+         * Start the wizard.
+         * @param callbacks The callbacks to use to send back wizard results.
+         */
+        void startWizard(OverpassWizardCallbacks callbacks);
+    }
+
+    /**
+     * Wizard callbacks required by {@link OverpassQueryWizard#startWizard(OverpassWizardCallbacks)}
+     * @author Michael Zangl
+     * @since 13930
+     */
+    public interface OverpassWizardCallbacks {
+        /**
+         * Send the resulting query
+         * @param resultingQuery The query that is used by the wizard
+         */
+        void submitWizardResult(String resultingQuery);
+
+        /**
+         * Get the parent component to use when opening the wizard dialog.
+         * @return The component.
+         */
+        Component getParent();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/download/overpass/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/overpass/package-info.java	(revision 13930)
+++ trunk/src/org/openstreetmap/josm/gui/download/overpass/package-info.java	(revision 13930)
@@ -0,0 +1,7 @@
+// License: GPL. For details, see LICENSE file.
+/**
+ * This package contains all overpass query related classes.
+ * <p>
+ * Traditionally (and still now for compatibility), some of them are in the download package.
+ */
+package org.openstreetmap.josm.gui.download.overpass;
