Index: src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(revision 16598)
+++ src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(working copy)
@@ -220,13 +220,15 @@
     }
 
     protected void tryToPasteFromClipboard(OsmIdTextField tfId, OsmPrimitiveTypesComboBox cbType) {
-        String buf = ClipboardUtils.getClipboardStringContent();
+        tryToPasteFromBuf(ClipboardUtils.getClipboardStringContent(), tfId, cbType);
+    }
+
+    protected void tryToPasteFromBuf(String buf, OsmIdTextField tfId, OsmPrimitiveTypesComboBox cbType) {
         if (buf == null || buf.isEmpty()) return;
         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 +245,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/dialogs/changeset/ChangesetCacheManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 16598)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(working copy)
@@ -57,6 +57,7 @@
 import org.openstreetmap.josm.gui.datatransfer.ChangesetTransferable;
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.dialogs.changeset.query.ChangesetQueryDialog;
+import org.openstreetmap.josm.gui.download.DownloadObjectDialog;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.CloseChangesetTask;
@@ -569,7 +570,7 @@
     private class DownloadSelectedChangesetObjectsAction extends AbstractAction implements ListSelectionListener {
 
         DownloadSelectedChangesetObjectsAction() {
-            putValue(NAME, tr("Download changed objects"));
+            putValue(NAME, tr("Download changed objects ..."));
             new ImageProvider("downloadprimitive").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download the current version of the changed objects in the selected changesets"));
             updateEnabledState();
@@ -579,7 +580,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 +589,14 @@
                             .map(HistoryOsmPrimitive::getPrimitiveId)
                             .distinct()
                             .collect(Collectors.toList());
-                    new DownloadPrimitivesWithReferrersTask(false, primitiveIds, true, true, null, null).run();
+                    if (primitiveIds.isEmpty())
+                        return;
+                    DownloadObjectDialog dialog = new DownloadObjectDialog(getInstance());
+                    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/changeset/ChangesetContentPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(revision 16598)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(working copy)
@@ -45,6 +45,7 @@
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.download.DownloadObjectDialog;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
@@ -250,7 +251,7 @@
     class DownloadObjectAction extends AbstractAction implements ListSelectionListener {
 
         DownloadObjectAction() {
-            putValue(NAME, tr("Download objects"));
+            putValue(NAME, tr("Download objects ..."));
             new ImageProvider("downloadprimitive").getResource().attachImageIcon(this, true);
             putValue(SHORT_DESCRIPTION, tr("Download the current version of the selected objects"));
             updateEnabledState();
@@ -260,7 +261,14 @@
         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));
+            if (primitiveIds.isEmpty())
+                return;
+            DownloadObjectDialog dialog = new DownloadObjectDialog(ChangesetContentPanel.this);
+            dialog.setupDialog(primitiveIds);
+            if (dialog.showDialog().getValue() != dialog.getContinueButtonIndex())
+                return;
+            MainApplication.worker.submit(new DownloadPrimitivesWithReferrersTask(false, dialog.getOsmIds(),
+                    dialog.isReferrersRequested(), dialog.isFullRelationRequested(), null, null));
         }
 
         protected final void updateEnabledState() {
Index: src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(revision 16598)
+++ src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(working copy)
@@ -11,6 +11,7 @@
 import javax.swing.JCheckBox;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
 import org.openstreetmap.josm.io.NetworkManager;
@@ -57,6 +58,16 @@
         buttons.get(0).setEnabled(!NetworkManager.isOffline(OnlineResource.OSM_API));
     }
 
+    /**
+     * Fill dialog with ids from given collection.
+     * @param primitiveIds collection of primitive ids used to fill the dialog
+     * @since xxx
+     */
+    public void setupDialog(Collection<? extends PrimitiveId> primitiveIds) {
+        setupDialog();
+        tryToPasteFromBuf(idsToString(primitiveIds), tfId, cbType);
+    }
+
     @Override
     protected Collection<Component> getComponentsBeforeHelp() {
         newLayer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
