Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 15352)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 15353)
@@ -203,4 +203,8 @@
     }
 
+    protected Collection<OsmPrimitive> searchPotentiallyDeletedPrimitives(DataSet ds) {
+        return downloadTask.searchPrimitivesToUpdate(currentBounds, ds);
+    }
+
     /**
      * Superclass of internal download task.
@@ -376,5 +380,5 @@
          * @return the primitives to update
          */
-        private Collection<OsmPrimitive> searchPrimitivesToUpdate(Bounds bounds, DataSet ds) {
+        protected Collection<OsmPrimitive> searchPrimitivesToUpdate(Bounds bounds, DataSet ds) {
             if (bounds == null)
                 return Collections.emptySet();
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java	(revision 15352)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java	(revision 15353)
@@ -252,8 +252,5 @@
                 }
             }
-            Set<Object> errors = new LinkedHashSet<>();
-            for (DownloadTask dt : tasks) {
-                errors.addAll(dt.getErrorObjects());
-            }
+            Set<Object> errors = tasks.stream().flatMap(t -> t.getErrorObjects().stream()).collect(Collectors.toSet());
             if (!errors.isEmpty()) {
                 final Collection<String> items = new ArrayList<>();
@@ -290,16 +287,26 @@
                 }
             }
-            final OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
-            if (editLayer != null && osmData) {
-                final Set<OsmPrimitive> myPrimitives = getCompletePrimitives(editLayer.getDataSet());
-                for (DownloadTask task : tasks) {
-                    if (task instanceof DownloadOsmTask) {
-                        DataSet ds = ((DownloadOsmTask) task).getDownloadedData();
-                        if (ds != null) {
-                            // myPrimitives.removeAll(ds.allPrimitives()) will do the same job but much slower
-                            for (OsmPrimitive primitive: ds.allPrimitives()) {
-                                myPrimitives.remove(primitive);
-                            }
-                        }
+            final DataSet editDataSet = MainApplication.getLayerManager().getEditDataSet();
+            if (editDataSet != null && osmData) {
+                final List<DownloadOsmTask> osmTasks = tasks.stream()
+                        .filter(t -> t instanceof DownloadOsmTask).map(t -> (DownloadOsmTask) t)
+                        .filter(t -> t.getDownloadedData() != null)
+                        .collect(Collectors.toList());
+                final Set<Bounds> tasksBounds = osmTasks.stream()
+                        .flatMap(t -> t.getDownloadedData().getDataSourceBounds().stream())
+                        .collect(Collectors.toSet());
+                final Set<Bounds> layerBounds = new LinkedHashSet<>(editDataSet.getDataSourceBounds());
+                final Set<OsmPrimitive> myPrimitives = new LinkedHashSet<>();
+                if (layerBounds.equals(tasksBounds)) {
+                    // the full edit layer is updated (we have downloaded again all its current bounds)
+                    myPrimitives.addAll(getCompletePrimitives(editDataSet));
+                    for (DownloadOsmTask task : osmTasks) {
+                        // myPrimitives.removeAll(ds.allPrimitives()) will do the same job but much slower
+                        task.getDownloadedData().allPrimitives().forEach(myPrimitives::remove);
+                    }
+                } else {
+                    // partial update, only check what has been downloaded
+                    for (DownloadOsmTask task : osmTasks) {
+                        myPrimitives.addAll(task.searchPotentiallyDeletedPrimitives(editDataSet));
                     }
                 }
