diff --git src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
index 5bae4eb..99e52d0 100644
--- src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
+++ src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
@@ -9,6 +9,7 @@ import java.awt.Font;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Set;
@@ -26,14 +27,17 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.download.DownloadObjectDialog;
 import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
+import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
+import org.xml.sax.SAXException;
 
 /**
  * Download an OsmPrimitive by specifying type and ID
@@ -67,77 +71,115 @@ public class DownloadPrimitiveAction extends JosmAction {
      * @param full if the members of a relation should be downloaded as well
      */
     public static void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) {
-        OsmDataLayer layer = getEditLayer();
-        if ((layer == null) || newLayer) {
-            layer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
-            Main.main.addLayer(layer);
-        }
-        final DownloadPrimitivesTask task = new DownloadPrimitivesTask(layer, ids, full);
-        Main.worker.submit(task);
+ 
+        class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable {
+            final OsmDataLayer layer;
+            List<PrimitiveId> ids;
+            boolean full;
+            DownloadPrimitivesTask task;
+            
+            DownloadPrimitivesWithReferrersTask(final OsmDataLayer layer, List<PrimitiveId> ids,
+                    boolean full) { //, ProgressMonitor monitor) {
+                super(tr("Download objects"), false);
+                this.layer = layer;
+                this.ids = ids;
+                this.full = full;
+            }
+            
+            @Override
+            protected void cancel() {
+                // FIXME: how to do ?
+            }
 
-        if (downloadReferrers) {
-            for (PrimitiveId id : ids) {
-                Main.worker.submit(new DownloadReferrersTask(layer, id));
+            @Override
+            protected void realRun() throws SAXException, IOException, OsmTransferException {
+                task = new DownloadPrimitivesTask(layer, ids, full, getProgressMonitor().createSubTaskMonitor(1, false));
+                // FIXME: Need to run task in an other thread (like Main.worker.submit(task) ?
+                task.run();
+                getProgressMonitor().setTicksCount(ids.size());
+                for(PrimitiveId id : ids) {
+                    System.out.printf("referrers task %s\n", id.toString());
+                    // FIXME: In an other thread ?
+                    new DownloadReferrersTask(layer, id, getProgressMonitor().createSubTaskMonitor(1, false)).run();
+                }
             }
-        }
 
-        Runnable showErrorsAndWarnings = new Runnable() {
             @Override
-            public void run() {
-                final Set<PrimitiveId> errs = task.getMissingPrimitives();
-                if (errs != null && !errs.isEmpty()) {
-                    try {
-                        SwingUtilities.invokeAndWait(new Runnable() {
-                            @Override
-                            public void run() {
-                                reportProblemDialog(errs,
-                                        trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()),
-                                        trn("One object could not be downloaded.<br>",
-                                            "{0} objects could not be downloaded.<br>",
-                                            errs.size(),
-                                            errs.size())
-                                        + tr("The server replied with response code 404.<br>"
-                                            + "This usually means, the server does not know an object with the requested id."),
-                                        tr("missing objects:"),
-                                        JOptionPane.ERROR_MESSAGE
-                                ).showDialog();
+            protected void finish() {
+                // FIXME: Does all task are really finish ?
+                System.out.printf("call to finish\n");
+                Runnable showErrorsAndWarnings = new Runnable() {
+                    @Override
+                    public void run() {
+                        final Set<PrimitiveId> errs = task.getMissingPrimitives();
+                        if (errs != null && !errs.isEmpty()) {
+                            try {
+                                SwingUtilities.invokeAndWait(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        reportProblemDialog(errs,
+                                                trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()),
+                                                trn("One object could not be downloaded.<br>",
+                                                    "{0} objects could not be downloaded.<br>",
+                                                    errs.size(),
+                                                    errs.size())
+                                                + tr("The server replied with response code 404.<br>"
+                                                    + "This usually means, the server does not know an object with the requested id."),
+                                                tr("missing objects:"),
+                                                JOptionPane.ERROR_MESSAGE
+                                        ).showDialog();
+                                    }
+                                });
+                            } catch (InterruptedException ex) {
+                                Main.warn("InterruptedException while displaying error dialog");
+                            } catch (InvocationTargetException ex) {
+                                Main.warn(ex);
                             }
-                        });
-                    } catch (InterruptedException ex) {
-                        Main.warn("InterruptedException while displaying error dialog");
-                    } catch (InvocationTargetException ex) {
-                        Main.warn(ex);
-                    }
-                }
+                        }
 
-                final Set<PrimitiveId> del = new TreeSet<PrimitiveId>();
-                DataSet ds = getCurrentDataSet();
-                for (PrimitiveId id : ids) {
-                    OsmPrimitive osm = ds.getPrimitiveById(id);
-                    if (osm != null && osm.isDeleted()) {
-                        del.add(id);
-                    }
-                }
-                if (!del.isEmpty()) {
-                    SwingUtilities.invokeLater(new Runnable() {
-                        @Override
-                        public void run() {
-                            reportProblemDialog(del,
-                                    trn("Object deleted", "Objects deleted", del.size()),
-                                    trn(
-                                        "One downloaded object is deleted.",
-                                        "{0} downloaded objects are deleted.",
-                                        del.size(),
-                                        del.size()),
-                                    null,
-                                    JOptionPane.WARNING_MESSAGE
-                            ).showDialog();
+                        final Set<PrimitiveId> del = new TreeSet<PrimitiveId>();
+                        DataSet ds = getCurrentDataSet();
+                        for (PrimitiveId id : ids) {
+                            OsmPrimitive osm = ds.getPrimitiveById(id);
+                            if (osm != null && osm.isDeleted()) {
+                                del.add(id);
+                            }
                         }
-                    });
-                }
+                        if (!del.isEmpty()) {
+                            SwingUtilities.invokeLater(new Runnable() {
+                                @Override
+                                public void run() {
+                                    reportProblemDialog(del,
+                                            trn("Object deleted", "Objects deleted", del.size()),
+                                            trn(
+                                                "One downloaded object is deleted.",
+                                                "{0} downloaded objects are deleted.",
+                                                del.size(),
+                                                del.size()),
+                                            null,
+                                            JOptionPane.WARNING_MESSAGE
+                                    ).showDialog();
+                                }
+                            });
+                        }
+                    }
+                };
+                Main.worker.submit(showErrorsAndWarnings);
             }
-        };
-        Main.worker.submit(showErrorsAndWarnings);
+        }
+        
+        System.out.printf("DEBUG: DownloadPrimitiveAction.processItems\n");
+        OsmDataLayer layer = getEditLayer();
+        if ((layer == null) || newLayer) {
+            layer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
+            Main.main.addLayer(layer);
+        }
+
+        final DownloadPrimitivesWithReferrersTask task = 
+                new DownloadPrimitivesWithReferrersTask(layer, ids, full); //, monitor);
+        Main.worker.submit(task);
+
+        System.out.printf("task done\n");
     }
 
     private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
diff --git src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
index ce7c850..5111174 100644
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
@@ -141,6 +141,28 @@ public class DownloadReferrersTask extends PleaseWaitRunnable {
         parents = new DataSet();
     }
 
+    /**
+     * constructor
+     *
+     * @param targetLayer the target layer. Must not be null.
+     * @param primitiveId a PrimitiveId object.
+     * @exception IllegalArgumentException thrown if id &lt;= 0
+     * @exception IllegalArgumentException thrown if targetLayer == null
+     *
+     */
+    public DownloadReferrersTask(OsmDataLayer targetLayer, PrimitiveId primitiveId,
+            ProgressMonitor progressMonitor) throws IllegalArgumentException {
+        super("Download referrers", progressMonitor, false /* don't ignore exception*/);
+        CheckParameterUtil.ensureParameterNotNull(targetLayer, "targetLayer");
+        if (primitiveId.isNew())
+            throw new IllegalArgumentException(MessageFormat.format("Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId()));
+        canceled = false;
+        this.children = new HashMap<Long, OsmPrimitiveType>();
+        this.children.put(primitiveId.getUniqueId(), primitiveId.getType());
+        this.targetLayer = targetLayer;
+        parents = new DataSet();
+    }
+
     @Override
     protected void cancel() {
         canceled = true;
diff --git src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
index 519a151..3f8758d 100644
--- src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
+++ src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
@@ -58,6 +58,25 @@ public class DownloadPrimitivesTask extends PleaseWaitRunnable {
         this.fullRelation = fullRelation;
     }
 
+    /**
+     * Creates the  task
+     *
+     * @param layer the layer in which primitives are updated. Must not be null.
+     * @param ids a collection of primitives to update from the server. Set to
+     * the empty collection if null.
+     * @param fullRelation true if a full download is required, i.e.,
+     * a download including the immediate children of a relation.
+     * @throws IllegalArgumentException thrown if layer is null.
+     */
+    public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId> ids, boolean fullRelation,
+            ProgressMonitor progessMonitor) throws IllegalArgumentException {
+        super(tr("Download objects"), progessMonitor, false /* don't ignore exception */);
+        ensureParameterNotNull(layer, "layer");
+        this.ids = ids;
+        this.layer = layer;
+        this.fullRelation = fullRelation;
+    }
+
     @Override
     protected void cancel() {
         canceled = true;
