Index: src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 14764)
+++ src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(working copy)
@@ -334,6 +334,12 @@
             progressMonitor.subTask(msg + "... " + progressMonitor.getTicks() + '/' + progressMonitor.getTicksCount());
             try {
                 FetchResult result = ecs.take().get();
+                if (result.rc404 != null) {
+                    List<Long> toSplit = new ArrayList<>(result.rc404);
+                    int n = toSplit.size() / 2;
+                    jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(0, n)), progressMonitor)));
+                    jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(n, toSplit.size())), progressMonitor)));
+                }
                 if (result.missingPrimitives != null) {
                     missingPrimitives.addAll(result.missingPrimitives);
                 }
@@ -427,6 +433,8 @@
          */
         public final Set<PrimitiveId> missingPrimitives;
 
+        public Set<Long> rc404;
+
         /**
          * Constructs a {@code FetchResult}
          * @param dataSet The resulting data set
@@ -486,6 +494,11 @@
                 return multiGetIdPackage(type, pkg, progressMonitor);
             } catch (OsmApiException e) {
                 if (e.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) {
+                    if (pkg.size() > 4) {
+                        FetchResult res = new FetchResult(null, null);
+                        res.rc404 = pkg;
+                        return res;
+                    }
                     Logging.info(tr("Server replied with response code 404, retrying with an individual request for each object."));
                     return singleGetIdPackage(type, pkg, progressMonitor);
                 } else {
