Index: trunk/src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java	(revision 9324)
+++ trunk/src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java	(revision 9325)
@@ -92,11 +92,4 @@
             if (primitive instanceof Node && !primitive.isNew()) {
                 reader.append(primitive);
-            } else if (primitive instanceof Way) {
-                Way way = (Way) primitive;
-                for (Node node: way.getNodes()) {
-                    if (!node.isNew()) {
-                        reader.append(node);
-                    }
-                }
             }
         }
@@ -107,4 +100,5 @@
         for (OsmPrimitive primitive : toUpdate) {
             if (primitive instanceof Way && !primitive.isNew()) {
+                // this also adds way nodes
                 reader.append(primitive);
             }
@@ -116,4 +110,5 @@
         for (OsmPrimitive primitive : toUpdate) {
             if (primitive instanceof Relation && !primitive.isNew()) {
+                // this also adds relation members
                 reader.append(primitive);
             }
Index: trunk/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java	(revision 9324)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java	(revision 9325)
@@ -31,3 +31,10 @@
         return OverpassServerPreference.getOverpassServer();
     }
+
+    @Override
+    protected boolean recursesDown() {
+        // see https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Recurse_down_.28.3E.29 for documentation
+        // accomplished using >; in the query string above
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 9324)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 9325)
@@ -171,5 +171,5 @@
         if (way == null) return this;
         if (way.isNew()) return this;
-        for (Node node: way.getNodes()) {
+        for (Node node: !recursesDown() ? way.getNodes() : Collections.<Node>emptyList()) {
             if (!node.isNew()) {
                 remember(node.getPrimitiveId());
@@ -190,5 +190,5 @@
         if (relation.isNew()) return this;
         remember(relation.getPrimitiveId());
-        for (RelationMember member : relation.getMembers()) {
+        for (RelationMember member : !recursesDown() ? relation.getMembers() : Collections.<RelationMember>emptyList()) {
             if (OsmPrimitiveType.from(member.getMember()).equals(OsmPrimitiveType.RELATION)) {
                 // avoid infinite recursion in case of cyclic dependencies in relations
@@ -403,4 +403,13 @@
     public Set<PrimitiveId> getMissingPrimitives() {
         return missingPrimitives;
+    }
+
+    /**
+     * Whether this reader fetches nodes when loading ways, or members when loading relations.
+     *
+     * @return {@code true} if the reader recurses down
+     */
+    protected boolean recursesDown() {
+        return false;
     }
 
