Index: trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 13486)
@@ -41,4 +41,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -160,12 +161,13 @@
 
         // download incomplete relation or incomplete members if necessary
-        if (multipolygonRelation != null) {
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        if (multipolygonRelation != null && editLayer != null && editLayer.isDownloadable()) {
             if (!multipolygonRelation.isNew() && multipolygonRelation.isIncomplete()) {
                 MainApplication.worker.submit(
-                        new DownloadRelationTask(Collections.singleton(multipolygonRelation), getLayerManager().getEditLayer()));
+                        new DownloadRelationTask(Collections.singleton(multipolygonRelation), editLayer));
             } else if (multipolygonRelation.hasIncompleteMembers()) {
                 MainApplication.worker.submit(new DownloadRelationMemberTask(multipolygonRelation,
                         DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(Collections.singleton(multipolygonRelation)),
-                        getLayerManager().getEditLayer()));
+                        editLayer));
             }
         }
Index: trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 13486)
@@ -10,4 +10,5 @@
 
 import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -67,4 +68,8 @@
     protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
         updateEnabledStateOnModifiableSelection(selection);
+        if (isEnabled() && selection != null && !selection.isEmpty()
+                && DownloadPolicy.BLOCKED.equals(selection.iterator().next().getDataSet().getDownloadPolicy())) {
+            setEnabled(false);
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 13486)
@@ -359,5 +359,5 @@
     /**
      * Updates enabled state according to selected primitives, if any.
-     * Enables action if the colleciton is not empty and references primitives in a modifiable data layer.
+     * Enables action if the collection is not empty and references primitives in a modifiable data layer.
      * Can be called in {@link #updateEnabledState(Collection)} implementations.
      * @param selection the collection of selected primitives
Index: trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 13486)
@@ -47,5 +47,6 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getLayerManager().getEditLayer() != null && !Main.isOffline(OnlineResource.OSM_API));
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        setEnabled(editLayer != null && editLayer.isDownloadable() && !Main.isOffline(OnlineResource.OSM_API));
     }
 
@@ -53,5 +54,5 @@
     public void actionPerformed(ActionEvent e) {
         OsmDataLayer editLayer = getLayerManager().getEditLayer();
-        if (!isEnabled() || editLayer == null)
+        if (!isEnabled() || editLayer == null || !editLayer.isDownloadable())
             return;
 
Index: trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 13486)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -119,5 +120,11 @@
     @Override
     protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
-        setEnabled(selection != null && !selection.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
+        if (selection == null || selection.isEmpty()) {
+            setEnabled(false);
+        } else {
+            DataSet ds = selection.iterator().next().getDataSet();
+            setEnabled(!ds.isLocked() && !DownloadPolicy.BLOCKED.equals(ds.getDownloadPolicy())
+                    && !Main.isOffline(OnlineResource.OSM_API));
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 13486)
@@ -11,5 +11,4 @@
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.Future;
@@ -294,5 +293,8 @@
             OsmDataLayer layer = addNewLayerIfRequired(newLayerName);
             if (layer == null) {
-                layer = Optional.ofNullable(getEditLayer()).orElseGet(this::getFirstModifiableDataLayer);
+                layer = getEditLayer();
+                if (layer == null || !layer.isDownloadable()) {
+                    layer = getFirstModifiableDataLayer();
+                }
                 Collection<OsmPrimitive> primitivesToUpdate = searchPrimitivesToUpdate(bounds, layer.data);
                 layer.mergeFrom(dataSet);
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 13486)
@@ -62,4 +62,7 @@
         super("Download referrers", false /* don't ignore exception*/);
         CheckParameterUtil.ensureParameterNotNull(targetLayer, "targetLayer");
+        if (!targetLayer.isDownloadable()) {
+            throw new IllegalArgumentException("Non-downloadable layer: " + targetLayer);
+        }
         canceled = false;
         this.children = new HashMap<>();
Index: trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 13486)
@@ -7,7 +7,11 @@
 import javax.swing.AbstractAction;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.OsmPrimitiveAction;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
@@ -46,3 +50,12 @@
         setEnabled(!relations.isEmpty());
     }
+
+    protected final boolean canDownload() {
+        if (relations.isEmpty()) {
+            return false;
+        }
+        DataSet ds = relations.iterator().next().getDataSet();
+        return !Main.isOffline(OnlineResource.OSM_API)
+            && ds != null && !ds.isLocked() && !DownloadPolicy.BLOCKED.equals(ds.getDownloadPolicy());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 13486)
@@ -8,9 +8,7 @@
 import java.util.Collection;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
-import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
@@ -47,6 +45,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(!relations.isEmpty() && !Main.isOffline(OnlineResource.OSM_API)
-                && !relations.iterator().next().getDataSet().isLocked());
+        setEnabled(canDownload());
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 13486)
@@ -9,10 +9,8 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
-import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
@@ -67,6 +65,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(!relations.isEmpty() && !incompleteMembers.isEmpty() && !Main.isOffline(OnlineResource.OSM_API)
-                && !relations.iterator().next().getDataSet().isLocked());
+        setEnabled(!incompleteMembers.isEmpty() && canDownload());
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java	(revision 13486)
@@ -9,4 +9,5 @@
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
@@ -30,5 +31,5 @@
 /**
  * The asynchronous task for downloading relation members.
- *
+ * @since 2563
  */
 public class DownloadRelationMemberTask extends PleaseWaitRunnable {
@@ -44,6 +45,7 @@
         if (parent != null)
             this.parents.add(parent);
-        this.children = children;
-        this.curLayer = curLayer;
+        this.children = Objects.requireNonNull(children);
+        this.curLayer = Objects.requireNonNull(curLayer);
+        checkLayer();
     }
 
@@ -52,6 +54,7 @@
         if (parent != null)
             this.parents.add(parent);
-        this.children = children;
-        this.curLayer = curLayer;
+        this.children = Objects.requireNonNull(children);
+        this.curLayer = Objects.requireNonNull(curLayer);
+        checkLayer();
     }
 
@@ -67,6 +70,13 @@
         super(tr("Download relation members"), false /* don't ignore exception */);
         this.parents.addAll(parents);
-        this.children = children;
-        this.curLayer = curLayer;
+        this.children = Objects.requireNonNull(children);
+        this.curLayer = Objects.requireNonNull(curLayer);
+        checkLayer();
+    }
+
+    private void checkLayer() {
+        if (!curLayer.isDownloadable()) {
+            throw new IllegalArgumentException("Non-downloadable layer: " + curLayer);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java	(revision 13486)
@@ -27,5 +27,5 @@
  * The asynchronous task for fully downloading a collection of relations. Does a full download
  * for each relations and merges the relation into an {@link OsmDataLayer}
- *
+ * @since 2563
  */
 public class DownloadRelationTask extends PleaseWaitRunnable {
@@ -50,4 +50,7 @@
         this.relations = relations;
         this.layer = layer;
+        if (!layer.isDownloadable()) {
+            throw new IllegalArgumentException("Non-downloadable layer: " + layer);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java	(revision 13486)
@@ -78,4 +78,7 @@
         CheckParameterUtil.ensure(child, "child", "id > 0", ch -> ch.getUniqueId() > 0);
         CheckParameterUtil.ensureParameterNotNull(layer, "layer");
+        if (!layer.isDownloadable()) {
+            throw new IllegalArgumentException("Non-downloadable layer: " + layer);
+        }
         referrers = null;
         this.layer = layer;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserModel.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserModel.java	(revision 13486)
@@ -8,4 +8,5 @@
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -35,4 +36,8 @@
     }
 
+    /**
+     * Sets the relation.
+     * @param relation the relation
+     */
     public void setRelation(Relation relation) {
         this.relation = relation;
@@ -62,4 +67,8 @@
     }
 
+    /**
+     * Populates the model with parent referrers.
+     * @param parents parent referrers
+     */
     public void populate(List<Relation> parents) {
         referrers.clear();
@@ -93,8 +102,18 @@
     }
 
+    /**
+     * Determines if reloading the relation is possible/authorized.
+     * @return {@code true} if reloading the relation is possible/authorized
+     */
     public boolean canReload() {
-        return relation != null && !relation.isNew();
+        return relation != null && !relation.isNew()
+                && !relation.getDataSet().isLocked()
+                && !DownloadPolicy.BLOCKED.equals(relation.getDataSet().getDownloadPolicy());
     }
 
+    /**
+     * Returns the relation.
+     * @return the relation
+     */
     public Relation getRelation() {
         return relation;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java	(revision 13486)
@@ -8,8 +8,12 @@
 import javax.swing.event.TableModelListener;
 
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.OnlineResource;
 
 /**
@@ -49,3 +53,9 @@
 
     protected abstract void updateEnabledState();
+
+    protected final boolean canDownload() {
+        DataSet ds = editor.getRelation().getDataSet();
+        return !Main.isOffline(OnlineResource.OSM_API)
+            && ds != null && !ds.isLocked() && !DownloadPolicy.BLOCKED.equals(ds.getDownloadPolicy());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadIncompleteMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadIncompleteMembersAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadIncompleteMembersAction.java	(revision 13486)
@@ -15,5 +15,4 @@
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -59,5 +58,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(memberTableModel.hasIncompleteMembers() && !Main.isOffline(OnlineResource.OSM_API));
+        setEnabled(memberTableModel.hasIncompleteMembers() && canDownload());
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadSelectedIncompleteMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadSelectedIncompleteMembersAction.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/DownloadSelectedIncompleteMembersAction.java	(revision 13486)
@@ -7,5 +7,4 @@
 import java.awt.event.ActionEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
@@ -14,5 +13,4 @@
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -54,5 +52,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(memberTableModel.hasIncompleteSelectedMembers() && !Main.isOffline(OnlineResource.OSM_API));
+        setEnabled(memberTableModel.hasIncompleteSelectedMembers() && canDownload());
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java	(revision 13486)
@@ -53,4 +53,7 @@
         ensureParameterNotNull(layer, "layer");
         this.layer = layer;
+        if (!layer.isDownloadable()) {
+            throw new IllegalArgumentException("Non-downloadable layer: " + layer);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java	(revision 13485)
+++ trunk/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java	(revision 13486)
@@ -131,5 +131,5 @@
         // Append downloaded data to JOSM
         OsmDataLayer layer = MainApplication.getLayerManager().getEditLayer();
-        if (layer == null || this.newLayer)
+        if (layer == null || this.newLayer || !layer.isDownloadable())
             MainApplication.getLayerManager().addLayer(tmpLayer);
         else
