diff --git a/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java b/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
index c43902a..bac3715 100644
--- a/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
+++ b/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
@@ -10,6 +10,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
 import java.util.Collection;
+import java.util.Objects;
 import java.util.concurrent.Future;
 import java.util.function.Consumer;
 
@@ -34,6 +35,9 @@ import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 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;
 import org.openstreetmap.josm.io.OverpassDownloadReader;
@@ -80,7 +84,8 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
      * The GUI representation of the Overpass download source.
      * @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";
         private static final AbstractProperty<Integer> PANEL_SIZE_PROPERTY =
@@ -103,17 +108,6 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
             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);
             this.overpassQuery.setFont(GuiHelper.getMonospacedFont(overpassQuery));
             this.overpassQuery.addFocusListener(new FocusAdapter() {
@@ -163,7 +157,10 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
             JPanel leftPanel = new JPanel(new GridBagLayout());
             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));
 
             add(leftPanel, BorderLayout.WEST);
@@ -173,6 +170,18 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
             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;
+        }
+
         @Override
         public OverpassDownloadData getData() {
             String query = overpassQuery.getText();
@@ -258,6 +267,7 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
          * @param query The query to set.
          */
         public void setOverpassQuery(String query) {
+            Objects.requireNonNull(query, "query");
             this.overpassQuery.setText(query);
         }
 
@@ -359,6 +369,11 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
                 checkEnabled();
             }
         }
+
+        @Override
+        public void submitWizardResult(String resultingQuery) {
+            setOverpassQuery(resultingQuery);
+        }
     }
 
     /**
@@ -381,4 +396,5 @@ public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSo
             return this.errorReporter;
         }
     }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java b/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
index 8682501..5432e15 100644
--- a/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
@@ -22,6 +22,7 @@ import javax.swing.text.JTextComponent;
 import org.openstreetmap.josm.Main;
 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;
 import org.openstreetmap.josm.tools.GBC;
@@ -64,16 +65,16 @@ public final class OverpassQueryWizardDialog extends ExtendedDialog {
             + "#desc {width: 350px;}"
             + "</style>\n";
 
-    private final OverpassDownloadSource.OverpassDownloadSourcePanel dsPanel;
+    private final OverpassWizardCallbacks dsPanel;
 
     /**
      * Create a new {@link OverpassQueryWizardDialog}
-     * @param dsPanel The Overpass download source panel.
+     * @param callbacks The Overpass download source panel.
      */
-    public OverpassQueryWizardDialog(OverpassDownloadSource.OverpassDownloadSourcePanel dsPanel) {
-        super(dsPanel.getParent(), tr("Overpass Turbo Query Wizard"),
+    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();
         this.overpassQueryBuilder = OverpassTurboQueryWizard.getInstance();
@@ -167,14 +168,8 @@ public final class OverpassQueryWizardDialog extends ExtendedDialog {
         final String wizardSearchTerm = this.queryWizard.getText();
 
         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();
     }
 
     private static JTextComponent buildDescriptionSection() {
diff --git a/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java b/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java
new file mode 100644
index 0000000..bf8b99a
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/download/overpass/OverpassWizardRegistration.java
@@ -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 xxx
+ */
+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 xxx
+     */
+    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 xxx
+     */
+    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 xxx
+     */
+    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();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/download/overpass/package-info.java b/src/org/openstreetmap/josm/gui/download/overpass/package-info.java
new file mode 100644
index 0000000..ad059b9
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/download/overpass/package-info.java
@@ -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;
