Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(revision 33803)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(revision 33804)
@@ -178,4 +178,9 @@
 
     @Override
+    public boolean hasOutstandingTasks() {
+        return jobDispatcher.getTaskCount() > jobDispatcher.getCompletedTaskCount();
+    }
+
+    @Override
     public void cancelOutstandingTasks() {
         jobDispatcher.getQueue().clear();
Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoader.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoader.java	(revision 33803)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoader.java	(revision 33804)
@@ -27,3 +27,14 @@
      */
     void cancelOutstandingTasks();
+
+    /**
+     * Determines whether this {@link TileLoader} has tasks which have not completed.
+     * @return whether this {@link TileLoader} has tasks which have not completed. This answer may well be
+     * "approximate" given that many implementations will be using mechanisms where a queue's state can change
+     * during the computation.
+     */
+    default boolean hasOutstandingTasks() {
+        // default implementation supplied just to make transition easier for external implementors
+        throw new UnsupportedOperationException("Not implemented");
+    }
 }
