Index: trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java	(revision 4496)
+++ trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java	(revision 4497)
@@ -10,4 +10,5 @@
 import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.lang.reflect.InvocationTargetException;
@@ -94,5 +95,5 @@
 
         JLabel lbl1 = new JLabel(tr("Object type:"));
-        OsmPrimitiveTypesComboBox cbType = new OsmPrimitiveTypesComboBox();
+        final OsmPrimitiveTypesComboBox cbType = new OsmPrimitiveTypesComboBox();
         cbType.addItem(trc("osm object types", "mixed"));
         cbType.setToolTipText(tr("Choose the OSM object type"));
@@ -113,7 +114,11 @@
         layer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
         layer.setSelected(Main.pref.getBoolean("download.newlayer"));
-        JCheckBox referrers = new JCheckBox(tr("Download referrers"));
-        referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well"));
+        final JCheckBox referrers = new JCheckBox(tr("Download referrers (parent relations)"));
+        referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well, i.e.,"
+                + "parent relations and for nodes, additionally, parent ways"));
         referrers.setSelected(Main.pref.getBoolean("downloadprimitive.referrers"));
+        JCheckBox full = new JCheckBox(tr("Download relation members"));
+        full.setToolTipText(tr("Select if the members of a relation should be downloaded as well"));
+        full.setSelected(Main.pref.getBoolean("downloadprimitive.full", true));
         HtmlPanel help = new HtmlPanel(tr("Object IDs can be separated by comma or space.<br/>"
                 + " Examples: <b><ul><li>1 2 5</li><li>1,2,5</li></ul><br/></b>"
@@ -129,7 +134,18 @@
                 .addComponent(cbId, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
             .addComponent(referrers)
+            .addComponent(full)
             .addComponent(layer)
             .addComponent(help)
         );
+
+        cbType.addActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent ae) {
+                referrers.setText(cbType.getType() == OsmPrimitiveType.NODE
+                        ? tr("Download referrers (parent relations and ways)")
+                        : tr("Download referrers (parent relations)"));
+            }
+        });
 
         layout.setHorizontalGroup(layout.createParallelGroup()
@@ -144,4 +160,5 @@
                 )
             .addComponent(referrers)
+            .addComponent(full)
             .addComponent(layer)
             .addComponent(help)
@@ -165,4 +182,5 @@
         Main.pref.putInteger("downloadprimitive.lasttype", cbType.getSelectedIndex());
         Main.pref.put("downloadprimitive.referrers", referrers.isSelected());
+        Main.pref.put("downloadprimitive.full", full.isSelected());
         Main.pref.put("download.newlayer", layer.isSelected());
 
@@ -179,8 +197,8 @@
         }
         remindPrimitivesHistory(cbId);
-        processItems(layer.isSelected(), tfId.getIds(), referrers.isSelected());
-    }
-
-    void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers) {
+        processItems(layer.isSelected(), tfId.getIds(), referrers.isSelected(), full.isSelected());
+    }
+
+    void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) {
         OsmDataLayer layer = getEditLayer();
         if ((layer == null) || newLayer) {
@@ -188,5 +206,5 @@
             Main.main.addLayer(layer);
         }
-        final DownloadPrimitivesTask task = new DownloadPrimitivesTask(layer, ids);
+        final DownloadPrimitivesTask task = new DownloadPrimitivesTask(layer, ids, full);
         Main.worker.submit(task);
 
Index: trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java	(revision 4496)
+++ trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java	(revision 4497)
@@ -39,4 +39,5 @@
 
     private OsmDataLayer layer;
+    private boolean fullRelation;
     private MultiFetchServerObjectReader multiObjectReader;
     private OsmServerObjectReader objectReader;
@@ -48,11 +49,14 @@
      * @param toUpdate 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) throws IllegalArgumentException {
+    public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId>  ids, boolean fullRelation) throws IllegalArgumentException {
         super(tr("Download objects"), false /* don't ignore exception */);
         ensureParameterNotNull(layer, "layer");
         this.ids = ids;
         this.layer = layer;
+        this.fullRelation = fullRelation;
     }
 
@@ -145,5 +149,5 @@
                     synchronized(this) {
                         if (canceled) return;
-                        objectReader = new OsmServerObjectReader(r.getId(), OsmPrimitiveType.RELATION, true /* full */);
+                        objectReader = new OsmServerObjectReader(r.getId(), OsmPrimitiveType.RELATION, fullRelation);
                     }
                     theirDataSet = objectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
