Index: src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 16609)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(working copy)
@@ -60,7 +60,6 @@
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.CloseChangesetTask;
-import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -566,11 +565,10 @@
     /**
      * Downloads the objects contained in the selected changesets from the OSM server
      */
-    private class DownloadSelectedChangesetObjectsAction extends AbstractAction implements ListSelectionListener {
+    private class DownloadSelectedChangesetObjectsAction extends DownloadChangesetObjectsAction implements ListSelectionListener {
 
         DownloadSelectedChangesetObjectsAction() {
-            putValue(NAME, tr("Download changed objects"));
-            new ImageProvider("downloadprimitive").getResource().attachImageIcon(this);
+            super();
             putValue(SHORT_DESCRIPTION, tr("Download the current version of the changed objects in the selected changesets"));
             updateEnabledState();
         }
@@ -579,7 +577,7 @@
         public void actionPerformed(ActionEvent e) {
             if (!GraphicsEnvironment.isHeadless()) {
                 actDownloadSelectedContent.actionPerformed(e);
-                MainApplication.worker.submit(() -> {
+                GuiHelper.executeByMainWorkerInEDT(() -> {
                     final List<PrimitiveId> primitiveIds = model.getSelectedChangesets().stream()
                             .map(Changeset::getContent)
                             .filter(Objects::nonNull)
@@ -588,7 +586,7 @@
                             .map(HistoryOsmPrimitive::getPrimitiveId)
                             .distinct()
                             .collect(Collectors.toList());
-                    new DownloadPrimitivesWithReferrersTask(false, primitiveIds, true, true, null, null).run();
+                    downloadWithDialog(ChangesetCacheManager.getInstance(), primitiveIds);
                 });
             }
         }
Index: src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(revision 16609)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(working copy)
@@ -47,7 +47,6 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
-import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -247,11 +246,10 @@
         }
     }
 
-    class DownloadObjectAction extends AbstractAction implements ListSelectionListener {
+    class DownloadObjectAction extends DownloadChangesetObjectsAction implements ListSelectionListener {
 
         DownloadObjectAction() {
-            putValue(NAME, tr("Download objects"));
-            new ImageProvider("downloadprimitive").getResource().attachImageIcon(this, true);
+            super();
             putValue(SHORT_DESCRIPTION, tr("Download the current version of the selected objects"));
             updateEnabledState();
         }
@@ -260,7 +258,7 @@
         public void actionPerformed(ActionEvent e) {
             final List<PrimitiveId> primitiveIds = getSelectedPrimitives().stream().map(HistoryOsmPrimitive::getPrimitiveId)
                     .collect(Collectors.toList());
-            MainApplication.worker.submit(new DownloadPrimitivesWithReferrersTask(false, primitiveIds, true, true, null, null));
+            downloadWithDialog(ChangesetContentPanel.this, primitiveIds);
         }
 
         protected final void updateEnabledState() {
Index: src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetObjectsAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetObjectsAction.java	(nonexistent)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetObjectsAction.java	(working copy)
@@ -0,0 +1,79 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.gui.download.DownloadObjectDialog;
+import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
+import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Show download dialog with given ids and download them if user doesn't cancel.
+ *
+ */
+public abstract class DownloadChangesetObjectsAction extends AbstractAction {
+
+    /**
+     * Constructs a new {@code DownloadChangesetObjectsAction}.
+     */
+    protected DownloadChangesetObjectsAction() {
+        putValue(NAME, tr("Download changed objects ..."));
+        new ImageProvider("downloadprimitive").getResource().attachImageIcon(this);
+    }
+
+    /**
+     * We want our own class to have separate preference entries
+     */
+    private static class ChangesetDownloadObjectDialog extends DownloadObjectDialog {
+        private static final String prefListKey = "changesets.downloadprimitive.primitivesHistory";
+
+        ChangesetDownloadObjectDialog(Component parent) {
+            super(parent, "changesets.");
+        }
+
+        /**
+         * Fill dialog with ids from given collection.
+         * @param primitiveIds collection of primitive ids used to fill the dialog
+         */
+        void setupDialog(Collection<? extends PrimitiveId> primitiveIds) {
+            setupDialog();
+
+            tfId.tryToPasteFrom(idsToString(primitiveIds));
+            cbType.setSelectedIndex(3); // "mixed" because the ids are prefixed with the type
+        }
+
+        @Override
+        protected void restorePrimitivesHistory(HistoryComboBox cbHistory) {
+            cbHistory.setPossibleItemsTopDown(Config.getPref().getList(prefListKey, Collections.emptyList()));
+        }
+
+        @Override
+        protected void remindPrimitivesHistory(HistoryComboBox cbHistory) {
+            cbHistory.addCurrentItemToHistory();
+            Config.getPref().putList(prefListKey, cbHistory.getHistory());
+        }
+
+    }
+
+    protected void downloadWithDialog(Component parent, List<PrimitiveId> primitiveIds) {
+        if (primitiveIds == null || primitiveIds.isEmpty())
+            return;
+
+        ChangesetDownloadObjectDialog dialog = new ChangesetDownloadObjectDialog(parent);
+        dialog.setupDialog(primitiveIds);
+        if (dialog.showDialog().getValue() != dialog.getContinueButtonIndex())
+            return;
+        new DownloadPrimitivesWithReferrersTask(false, dialog.getOsmIds(), dialog.isReferrersRequested(),
+                dialog.isFullRelationRequested(), null, null).run();
+    }
+}
Index: src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(revision 16609)
+++ src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(working copy)
@@ -225,8 +225,7 @@
         if (buf.length() > Config.getPref().getInt("downloadprimitive.max-autopaste-length", 2000)) return;
         final List<SimplePrimitiveId> ids = SimplePrimitiveId.fuzzyParse(buf);
         if (!ids.isEmpty()) {
-            final String parsedText = ids.stream().map(x -> x.getType().getAPIName().charAt(0) + String.valueOf(x.getUniqueId()))
-                    .collect(Collectors.joining(", "));
+            final String parsedText = idsToString(ids);
             tfId.tryToPasteFrom(parsedText);
             final EnumSet<OsmPrimitiveType> types = ids.stream().map(SimplePrimitiveId::getType).collect(
                     Collectors.toCollection(() -> EnumSet.noneOf(OsmPrimitiveType.class)));
@@ -243,6 +242,11 @@
         }
     }
 
+    protected String idsToString(Collection<? extends PrimitiveId> primitiveIds) {
+        return primitiveIds.stream().map(pid -> pid.getType().getAPIName().substring(0, 1) + pid.getUniqueId())
+                .collect(Collectors.joining(", "));
+    }
+
     @Override public void windowClosed(WindowEvent e) {
         if (e != null && e.getComponent() == this && getValue() == getContinueButtonIndex()) {
             Config.getPref().putInt("downloadprimitive.lasttype", cbType.getSelectedIndex());
Index: src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(revision 16609)
+++ src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(working copy)
@@ -29,6 +29,8 @@
     protected final JCheckBox newLayer  = new JCheckBox(tr("Download as new layer"));
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
+    private final String prefKey;
+
     /**
      * Constructs a new DownloadObjectDialog with MainApplication.getMainFrame() as parent component.
      */
@@ -41,7 +43,12 @@
      * @param parent The parent component
      */
     public DownloadObjectDialog(Component parent) {
+        this(parent, "");
+    }
+
+    protected DownloadObjectDialog(Component parent, String prefKey) {
         super(parent, tr("Download object"), tr("Download object"), tr("Cancel"));
+        this.prefKey = prefKey;
         init();
         setButtonIcons("download", "cancel");
         setToolTipTexts(
@@ -60,14 +67,14 @@
     @Override
     protected Collection<Component> getComponentsBeforeHelp() {
         newLayer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
-        newLayer.setSelected(Config.getPref().getBoolean("download.newlayer"));
+        newLayer.setSelected(Config.getPref().getBoolean(prefKey + "download.newlayer"));
 
         referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well, i.e.,"
                 + "parent relations and for nodes, additionally, parent ways"));
-        referrers.setSelected(Config.getPref().getBoolean("downloadprimitive.referrers", true));
+        referrers.setSelected(Config.getPref().getBoolean(prefKey + "downloadprimitive.referrers", true));
 
         fullRel.setToolTipText(tr("Select if the members of a relation should be downloaded as well"));
-        fullRel.setSelected(Config.getPref().getBoolean("downloadprimitive.full", true));
+        fullRel.setSelected(Config.getPref().getBoolean(prefKey + "downloadprimitive.full", true));
 
         cbType.addItemListener(e -> referrers.setText(cbType.getType() == OsmPrimitiveType.NODE
                 ? tr("Download referrers (parent relations and ways)")
@@ -104,9 +111,9 @@
     public void windowClosed(WindowEvent e) {
         super.windowClosed(e);
         if (e != null && e.getComponent() == this && getValue() == 1) {
-            Config.getPref().putBoolean("downloadprimitive.referrers", referrers.isSelected());
-            Config.getPref().putBoolean("downloadprimitive.full", fullRel.isSelected());
-            Config.getPref().putBoolean("download.newlayer", newLayer.isSelected());
+            Config.getPref().putBoolean(prefKey + "downloadprimitive.referrers", referrers.isSelected());
+            Config.getPref().putBoolean(prefKey + "downloadprimitive.full", fullRel.isSelected());
+            Config.getPref().putBoolean(prefKey + "download.newlayer", newLayer.isSelected());
         }
     }
 }
