Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBuilder.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBuilder.java	(revision 34773)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBuilder.java	(revision 34774)
@@ -10,4 +10,5 @@
 import java.util.Map;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
@@ -16,4 +17,6 @@
 
 import org.apache.log4j.Logger;
+import org.openstreetmap.josm.gui.MainApplication;
+import java.util.concurrent.ExecutionException;
 import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
 import org.openstreetmap.josm.plugins.streetside.StreetsideCubemap;
@@ -28,5 +31,4 @@
 
 // JavaFX access in Java 8
-@SuppressWarnings("restriction")
 public class CubemapBuilder implements ITileDownloadingTaskListener, StreetsideDataListener {
 
@@ -40,4 +42,5 @@
 
 	private Map<String, BufferedImage> tileImages = new ConcurrentHashMap<>();
+  private ExecutorService pool;
 
 	private int currentTileCount = 0;
@@ -112,4 +115,9 @@
 
 	public void downloadCubemapImages(String imageId) {
+    if(StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().getScene() != StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().getLoadingScene()) {
+      StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().setScene(
+  	      StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().getLoadingScene()
+  	  );
+	  }
 
 	  final int maxThreadCount = StreetsideProperties.DOWNLOAD_CUBEFACE_TILES_TOGETHER.get()?6:6 * CubemapUtils.getMaxCols() * CubemapUtils.getMaxRows();
@@ -124,7 +132,12 @@
     long startTime = System.currentTimeMillis();
 
+    if(CubemapBuilder.getInstance().getTileImages().keySet().size() > 0) {
+      pool.shutdownNow();
+      CubemapBuilder.getInstance().resetTileImages();
+    }
+
     try {
 
-      ExecutorService pool = Executors.newFixedThreadPool(maxThreadCount);
+      pool = Executors.newFixedThreadPool(maxThreadCount);
       List<Callable<List<String>>> tasks = new ArrayList<>(maxThreadCount);
 
@@ -151,19 +164,5 @@
             }
           }
-
-          List<Future<List<String>>> results = pool.invokeAll(tasks);
-          for (Future<List<String>> ff : results) {
-            if (StreetsideProperties.DEBUGING_ENABLED.get() && results!=null) {
-              logger.debug(
-                MessageFormat.format(
-                  "Completed tile downloading task {0} in {1} seconds.", ff.get().toString(),
-                  ((System.currentTimeMillis()) - startTime)/1000)
-                );
-            } else {
-              logger.error(MessageFormat.format("Results of downloading tasks for image id {0} are null!", imageId));
-            }
-          }
-
-          // launch 16-tiled (high-res) downloading tasks
+        // launch 16-tiled (high-res) downloading tasks
         } else if (StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) {
 
@@ -181,16 +180,23 @@
       } // finish preparing tasks for invocation
 
-      List<Future<List<String>>> results = pool.invokeAll(tasks);
-      for (Future<List<String>> ff : results) {
-        if (StreetsideProperties.DEBUGING_ENABLED.get() && results!=null) {
-          logger.debug(
-            MessageFormat.format(
-              "Completed tile downloading task {0} in {1} seconds.", ff.get().toString(),
-              ((System.currentTimeMillis()) - startTime)/1000)
-            );
-        } else {
-          logger.error(MessageFormat.format("Results of downloading tasks for image id {0} are null!", imageId));
+      // execute tasks
+			MainApplication.worker.submit(() -> {
+			  try {
+          List<Future<List<String>>> results = pool.invokeAll(tasks);
+          
+          if(StreetsideProperties.DEBUGING_ENABLED.get() && results != null) {
+            for (Future<List<String>> ff : results) {
+              try {
+                logger.debug(MessageFormat.format("Completed tile downloading task {0} in {1} seconds.",ff.get().toString(),
+                  (System.currentTimeMillis() - startTime)/1000));
+              } catch (ExecutionException e) {
+                logger.error(e);
+              }
+            }
+          }
+        } catch (InterruptedException e) {
+         logger.error(e);
         }
-      }
+			});
     } catch (Exception ee) {
       fails++;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ThreeSixtyDegreeViewerPanel.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ThreeSixtyDegreeViewerPanel.java	(revision 34773)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ThreeSixtyDegreeViewerPanel.java	(revision 34774)
@@ -11,4 +11,5 @@
 import javafx.scene.PointLight;
 import javafx.scene.Scene;
+import javafx.scene.control.Label;
 import javafx.scene.SceneAntialiasing;
 import javafx.scene.control.TextArea;
@@ -18,4 +19,6 @@
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
+import javafx.scene.text.Font;
+import javafx.scene.text.FontWeight;
 
 @SuppressWarnings("restriction")
@@ -27,4 +30,5 @@
 
   private static Scene defaultScene;
+  private static Scene loadingScene;
 
   private static Group root;
@@ -80,4 +84,6 @@
     subGroup.getChildren().add(cameraTransform);
 
+    createLoadingScene();
+
     Platform.runLater(new Runnable() {
       @Override
@@ -199,4 +205,11 @@
   }
 
+  private static void createLoadingScene() {
+    Label label = new Label(" Loading...");
+    label.setFont(Font.font(null, FontWeight.BOLD, 14));
+    VBox vbox = new VBox(label);
+    loadingScene = new Scene(vbox, 200, 100);
+  }
+
   public CubemapBox getCubemapBox() {
     if (cubemapBox == null) {
@@ -214,3 +227,7 @@
     return cubemapScene;
   }
+
+  public Scene getLoadingScene() {
+    return loadingScene;
+  }
 }
