Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 4093)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 4094)
@@ -8,4 +8,6 @@
 import java.text.MessageFormat;
 import java.util.Collection;
+import java.util.Set;
+import java.util.HashSet;
 import java.util.HashMap;
 import java.util.Map;
@@ -18,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSetMerger;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -193,16 +196,24 @@
         }
         Collection<Way> ways = ds.getWays();
+
         DataSetMerger merger;
         if (!ways.isEmpty()) {
-            reader = new MultiFetchServerObjectReader();
+            Set<Node> nodes = new HashSet<Node>();
             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();
+                // Ensure each node is only listed once
+                nodes.addAll(w.getNodes());
+            }
+            // Don't retrieve any nodes we've already grabbed
+            nodes.removeAll(targetLayer.data.getNodes());
+            if (!nodes.isEmpty()) {
+                reader = new MultiFetchServerObjectReader();
+                ((MultiFetchServerObjectReader)reader).append(nodes);
+                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);
