Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 2949)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 2950)
@@ -21,8 +21,11 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
 import org.openstreetmap.josm.io.OsmServerBackreferenceReader;
+import org.openstreetmap.josm.io.OsmServerReader;
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -37,5 +40,5 @@
     private boolean cancelled;
     private Exception lastException;
-    private OsmServerBackreferenceReader reader;
+    private OsmServerReader reader;
     /** the target layer */
     private OsmDataLayer targetLayer;
@@ -184,10 +187,24 @@
     protected void downloadParents(long id, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException{
         reader = new OsmServerBackreferenceReader(id, type);
-        DataSet ds = reader.parseOsm(progressMonitor);
+        DataSet ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
         synchronized(this) { // avoid race condition in cancel()
             reader = null;
         }
-        DataSetMerger visitor = new DataSetMerger(parents, ds);
-        visitor.merge();
+        Collection<Way> ways = ds.getWays();
+        DataSetMerger merger;
+        if (!ways.isEmpty()) {
+            reader = new MultiFetchServerObjectReader();
+            for (Way w: ways) {
+                ((MultiFetchServerObjectReader)reader).append(w.getNodes());
+            }
+            DataSet wayNodes = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
+            synchronized(this) { // avoid race condition in cancel()
+                reader = null;
+            }
+            merger = new DataSetMerger(ds, wayNodes);
+            merger.merge();
+        }
+        merger = new DataSetMerger(parents, ds);
+        merger.merge();
     }
 
@@ -207,5 +224,5 @@
                 }
                 progressMonitor.subTask(msg);
-                downloadParents(entry.getKey(), entry.getValue(), progressMonitor.createSubTaskMonitor(1, false));
+                downloadParents(entry.getKey(), entry.getValue(), progressMonitor);
                 i++;
             }
