Index: src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 13211)
+++ src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(working copy)
@@ -3,10 +3,7 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
+import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.JOptionPane;
@@ -13,6 +10,7 @@
 
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.io.AsynchronousUploadPrimitivesTask;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 
 /**
@@ -273,19 +271,29 @@
 
     @Override
     protected Collection<Layer> realRemoveSingleLayer(Layer layer) {
-        if (layer == activeLayer || layer == editLayer) {
-            Layer nextActive = suggestNextActiveLayer(layer);
-            setActiveLayer(nextActive, true);
-        }
+        if ((layer instanceof OsmDataLayer) && (((OsmDataLayer) layer).isReadOnly())) {
+            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(MainApplication.parent,
+                    tr("Trying to delete the layer with background upload. " +
+                            "Please wait till the upload is finished.")));
 
-        Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
-        if (getLayers().isEmpty()) {
-            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
-            for (LayerAvailabilityListener l : layerAvailabilityListeners) {
-                l.afterLastLayerRemoved(e);
+            // Return an empty collection for
+            // allowing to delete other layers
+            return new ArrayList<>();
+        } else {
+            if (layer == activeLayer || layer == editLayer) {
+                Layer nextActive = suggestNextActiveLayer(layer);
+                setActiveLayer(nextActive, true);
             }
+
+            Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
+            if (getLayers().isEmpty()) {
+                LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
+                for (LayerAvailabilityListener l : layerAvailabilityListeners) {
+                    l.afterLastLayerRemoved(e);
+                }
+            }
+            return toDelete;
         }
-        return toDelete;
     }
 
     /**
@@ -408,11 +416,18 @@
 
     @Override
     protected synchronized void realResetState() {
-        // active and edit layer are unset automatically
-        super.realResetState();
+        // Reset state iff no asynchronous upload is under progress
+        if (!AsynchronousUploadPrimitivesTask.getCurrentAsynchronousUploadTask().isPresent()) {
+            // active and edit layer are unset automatically
+            super.realResetState();
 
-        activeLayerChangeListeners.clear();
-        layerAvailabilityListeners.clear();
+            activeLayerChangeListeners.clear();
+            layerAvailabilityListeners.clear();
+        } else {
+            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(MainApplication.parent,
+                    tr("A background upload is already in progress. " +
+                            "Cannot reset state till the upload is finished.")));
+        }
     }
 
     /**
