Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideAbstractImage.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideAbstractImage.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideAbstractImage.java	(revision 34358)
@@ -25,4 +25,8 @@
 
 	protected String id;
+
+	private long ne;
+  private long pr;
+
 
 	/** The time the image was captured, in Epoch format. */
@@ -337,3 +341,33 @@
 		movingHe = tempHe + ca;
 	}
+
+	/**
+   * @return the ne
+   */
+  public long getNe() {
+    return ne;
+  }
+
+  /**
+   * @param ne the ne to set
+   */
+  public void setNe(long ne) {
+    this.ne = ne;
+  }
+
+  /**
+   * @return the pr
+   */
+  public long getPr() {
+    return pr;
+  }
+
+  /**
+   * @param pr the pr to set
+   */
+  public void setPr(long pr) {
+    this.pr = pr;
+  }
+
+
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideCubemap.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideCubemap.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideCubemap.java	(revision 34358)
@@ -20,5 +20,5 @@
 public class StreetsideCubemap extends StreetsideAbstractImage implements Comparable<StreetsideAbstractImage>{
 
-	private static Map<String,Map<String,BufferedImage>> face2TilesMap = new HashMap<String,Map<String,BufferedImage>>();
+	//private static Map<String,Map<String,BufferedImage>> face2TilesMap = new HashMap<String,Map<String,BufferedImage>>();
 
 	/**
@@ -43,9 +43,9 @@
 	public StreetsideCubemap(String quadId, LatLon latLon, double he) {
 		super(quadId, latLon, he);
-		face2TilesMap = new HashMap();
+		/*face2TilesMap = new HashMap();
 
 		EnumSet.allOf(CubemapUtils.CubemapFaces.class).forEach(face -> {
 			face2TilesMap.put(face.getValue(), new HashMap<String, BufferedImage>());
-		});
+		});*/
 
 	}
@@ -62,8 +62,8 @@
  	* @return the face2TilesMap
  	*/
-	public Map<String, Map<String,BufferedImage>> getFace2TilesMap() {
+	/*public Map<String, Map<String,BufferedImage>> getFace2TilesMap() {
 		return face2TilesMap;
 	}
-
+*/
 	/**
 	 * Comparison method for the StreetsideCubemap object.
@@ -132,5 +132,5 @@
 	 * resets the faces2TilesMap, emptying it for a new set of cubemap imagery
 	 */
-	public void resetFaces2TileMap() {
+	/*public void resetFaces2TileMap() {
 		face2TilesMap = new HashMap<>();
 
@@ -138,4 +138,4 @@
 			face2TilesMap.put(face.getValue(), new HashMap<String, BufferedImage>());
 		});
-	}
+	}*/
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java	(revision 34358)
@@ -59,13 +59,13 @@
    */
   protected StreetsideData() {
-    this.selectedImage = null;
-    this.bounds = new CopyOnWriteArrayList<>();
+    selectedImage = null;
+    bounds = new CopyOnWriteArrayList<>();
 
   // Adds the basic set of listeners.
   Arrays.stream(StreetsidePlugin.getStreetsideDataListeners()).forEach(this::addListener);
     if (Main.main != null) {
+      addListener(StreetsideViewerDialog.getInstance().getStreetsideViewerPanel());
       addListener(StreetsideMainDialog.getInstance());
       addListener(ImageInfoPanel.getInstance());
-      addListener(StreetsideViewerDialog.getInstance().getStreetsideViewerPanel());
     }
   }
@@ -135,9 +135,9 @@
    */
   public void addMultiSelectedImage(final StreetsideAbstractImage image) {
-    if (!this.multiSelectedImages.contains(image)) {
-      if (this.getSelectedImage() == null) {
+    if (!multiSelectedImages.contains(image)) {
+      if (getSelectedImage() == null) {
         this.setSelectedImage(image);
       } else {
-        this.multiSelectedImages.add(image);
+        multiSelectedImages.add(image);
       }
     }
@@ -152,9 +152,9 @@
    */
   public void addMultiSelectedImage(Collection<StreetsideAbstractImage> images) {
-    images.stream().filter(image -> !this.multiSelectedImages.contains(image)).forEach(image -> {
-      if (this.getSelectedImage() == null) {
+    images.stream().filter(image -> !multiSelectedImages.contains(image)).forEach(image -> {
+      if (getSelectedImage() == null) {
         this.setSelectedImage(image);
       } else {
-        this.multiSelectedImages.add(image);
+        multiSelectedImages.add(image);
       }
     });
@@ -190,5 +190,5 @@
    */
   public StreetsideAbstractImage getHighlightedImage() {
-    return this.highlightedImage;
+    return highlightedImage;
   }
 
@@ -317,10 +317,10 @@
    */
   public void setSelectedImage(StreetsideAbstractImage image, boolean zoom) {
-    StreetsideAbstractImage oldImage = this.selectedImage;
-    this.selectedImage = image;
-    this.multiSelectedImages.clear();
+    StreetsideAbstractImage oldImage = selectedImage;
+    selectedImage = image;
+    multiSelectedImages.clear();
     final MapView mv = StreetsidePlugin.getMapView();
     if (image != null) {
-      this.multiSelectedImages.add(image);
+      multiSelectedImages.add(image);
       if (mv != null && image instanceof StreetsideImage) {
         StreetsideImage streetsideImage = (StreetsideImage) image;
@@ -333,5 +333,5 @@
       mv.zoomTo(selectedImage.getMovingLatLon());
     }
-    fireSelectedImageChanged(oldImage, this.selectedImage);
+    fireSelectedImageChanged(oldImage, selectedImage);
     StreetsideLayer.invalidateInstance();
   }
@@ -368,4 +368,33 @@
   }
 
+  /**
+   * Downloads surrounding images of this mapillary image in background threads
+   * @param streetsideImage the image for which the surrounding images should be downloaded
+   */
+  public static void downloadSurroundingCubemaps(StreetsideImage streetsideImage) {
+      MainApplication.worker.execute(() -> {
+        final int prefetchCount = StreetsideProperties.PRE_FETCH_IMAGE_COUNT.get();
+        CacheAccess<String, BufferedImageCacheEntry> imageCache = Caches.ImageCache.getInstance().getCache();
+
+        StreetsideAbstractImage nextImage = streetsideImage.next();
+        StreetsideAbstractImage prevImage = streetsideImage.previous();
+
+        for (int i = 0; i < prefetchCount; i++) {
+          if (nextImage != null) {
+            if (nextImage instanceof StreetsideImage && imageCache.get(((StreetsideImage) nextImage).getId()) == null) {
+              CacheUtils.downloadCubemap((StreetsideImage) nextImage);
+            }
+            nextImage = nextImage.next();
+          }
+          if (prevImage != null) {
+            if (prevImage instanceof StreetsideImage && imageCache.get(((StreetsideImage) prevImage).getId()) == null) {
+              CacheUtils.downloadCubemap((StreetsideImage) prevImage);
+            }
+            prevImage = prevImage.previous();
+          }
+        }
+      });
+  }
+
   private void fireSelectedImageChanged(StreetsideAbstractImage oldImage, StreetsideAbstractImage newImage) {
 	listeners.stream().filter(Objects::nonNull).forEach(lis -> lis.selectedImageChanged(oldImage, newImage));
@@ -379,5 +408,5 @@
    */
   public Set<StreetsideAbstractImage> getMultiSelectedImages() {
-    return this.multiSelectedImages;
+    return multiSelectedImages;
   }
 
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideImage.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideImage.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideImage.java	(revision 34358)
@@ -42,7 +42,4 @@
   private double pi;
 
-  // Heading (equivalent to Mapillary cd attribute - not currently supported.
-  private double he;
-
   // Blurring instructions - not currently used by the plugin
   private String bl;
@@ -50,6 +47,4 @@
   // Undocumented Attributes
   private int ml;
-  private long ne;
-  private long pr;
   private List<String> nbn;
   private List<String> pbn;
@@ -239,32 +234,4 @@
 
   /**
-   * @return the ne
-   */
-  public long getNe() {
-    return ne;
-  }
-
-  /**
-   * @param ne the ne to set
-   */
-  public void setNe(long ne) {
-    this.ne = ne;
-  }
-
-  /**
-   * @return the pr
-   */
-  public long getPr() {
-    return pr;
-  }
-
-  /**
-   * @param pr the pr to set
-   */
-  public void setPr(long pr) {
-    this.pr = pr;
-  }
-
-  /**
    * @return the nbn
    */
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLayer.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLayer.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLayer.java	(revision 34358)
@@ -12,7 +12,5 @@
 import java.awt.RenderingHints;
 import java.awt.TexturePaint;
-import java.awt.event.ActionEvent;
 import java.awt.geom.Line2D;
-import java.awt.geom.Path2D;
 import java.awt.image.BufferedImage;
 import java.util.Comparator;
@@ -20,9 +18,6 @@
 import java.util.Optional;
 
-import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.Main;
@@ -42,6 +37,6 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils;
-import org.openstreetmap.josm.plugins.streetside.gui.StreetsideChangesetDialog;
 import org.openstreetmap.josm.plugins.streetside.gui.StreetsideMainDialog;
+import org.openstreetmap.josm.plugins.streetside.history.StreetsideRecord;
 import org.openstreetmap.josm.plugins.streetside.io.download.StreetsideDownloader;
 import org.openstreetmap.josm.plugins.streetside.io.download.StreetsideDownloader.DOWNLOAD_MODE;
@@ -57,6 +52,4 @@
 import org.openstreetmap.josm.tools.Logging;
 
-import org.openstreetmap.josm.plugins.streetside.history.StreetsideRecord;
-
 /**
  * This class represents the layer shown in JOSM. There can only exist one
@@ -140,5 +133,5 @@
 
 			// There is no delete image action for Streetside (Streetside functionality here removed).
-			getLocationChangeset().addChangesetListener(StreetsideChangesetDialog.getInstance());
+			//getLocationChangeset().addChangesetListener(StreetsideChangesetDialog.getInstance());
 		}
 		createHatchTexture();
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideSequence.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideSequence.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideSequence.java	(revision 34358)
@@ -7,4 +7,6 @@
 
 import org.openstreetmap.josm.plugins.streetside.model.UserProfile;
+
+import org.openstreetmap.josm.plugins.streetside.utils.StreetsideUtils;
 
 /**
@@ -86,5 +88,8 @@
    * @param images The set of {@link StreetsideAbstractImage} objects to be added.
    */
-  public synchronized void add(Collection<? extends StreetsideAbstractImage> images) {
+  @SuppressWarnings("unchecked")
+  public synchronized void add(final Collection<? extends StreetsideAbstractImage> images) {
+    Collection<? extends StreetsideAbstractImage> res = images;
+    res = StreetsideUtils.sortImagesInSequence((List<StreetsideAbstractImage>) images);
     this.images.addAll(images);
     images.forEach(img -> img.setSequence(this));
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideDownloadAction.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideDownloadAction.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideDownloadAction.java	(revision 34358)
@@ -47,9 +47,5 @@
   @Override
   public void actionPerformed(ActionEvent ae) {
-    if (!StreetsideLayer.hasInstance()) {
-      // A new streetside layer is created, so the active layer is not changed
-      StreetsideLayer.getInstance();
-      return;
-    } else if (!MainApplication.getLayerManager().containsLayer(StreetsideLayer.getInstance())) {
+    if (!StreetsideLayer.hasInstance() || !MainApplication.getLayerManager().containsLayer(StreetsideLayer.getInstance())) {
       MainApplication.getLayerManager().addLayer(StreetsideLayer.getInstance());
       return;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideSubmitCurrentChangesetAction.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideSubmitCurrentChangesetAction.java	(revision 34353)
+++ 	(revision )
@@ -1,122 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.actions;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.io.IOException;
-
-import javax.json.Json;
-import javax.swing.JOptionPane;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.util.EntityUtils;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.gui.Notification;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLocationChangeset;
-import org.openstreetmap.josm.plugins.streetside.gui.StreetsideChangesetDialog;
-import org.openstreetmap.josm.plugins.streetside.utils.PluginState;
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL.APIv3;
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideUtils;
-import org.openstreetmap.josm.plugins.streetside.utils.api.JsonLocationChangesetEncoder;
-import org.openstreetmap.josm.tools.I18n;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
-import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- * Imports a set of picture files into JOSM. They must be in jpg or png format.
- */
-public class StreetsideSubmitCurrentChangesetAction extends JosmAction {
-
-  private static final long serialVersionUID = 4995924098228082806L;
-  private final StreetsideChangesetDialog changesetDialog;
-
-  /**
-   * Main constructor.
-   * @param changesetDialog Streetside changeset dialog
-   */
-  public StreetsideSubmitCurrentChangesetAction(StreetsideChangesetDialog changesetDialog) {
-    super(
-      I18n.tr("Submit changeset"),
-      new ImageProvider("dialogs", "streetside-upload").setSize(ImageSizes.DEFAULT),
-      I18n.tr("Submit the current changeset"),
-      // CHECKSTYLE.OFF: LineLength
-      Shortcut.registerShortcut("Submit changeset to Streetside", I18n.tr("Submit the current changeset to Streetside"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
-      // CHECKSTYLE.ON: LineLength
-      false,
-      "streetsideSubmitChangeset",
-      false
-    );
-    this.changesetDialog = changesetDialog;
-    setEnabled(false);
-  }
-
-  @Override
-  public void actionPerformed(ActionEvent event) {
-    new Thread(() -> {
-      changesetDialog.setUploadPending(true);
-      String token = StreetsideProperties.ACCESS_TOKEN.get();
-      if (token != null && !token.trim().isEmpty()) {
-        PluginState.setSubmittingChangeset(true);
-        StreetsideUtils.updateHelpText();
-        HttpClientBuilder builder = HttpClientBuilder.create();
-        HttpPost httpPost = new HttpPost(APIv3.submitChangeset().toString());
-        httpPost.addHeader("content-type", "application/json");
-        httpPost.addHeader("Authorization", "Bearer " + token);
-        StreetsideLocationChangeset locationChangeset = StreetsideLayer.getInstance().getLocationChangeset();
-        String json = JsonLocationChangesetEncoder.encodeLocationChangeset(locationChangeset).build().toString();
-        Logging.info("Sending JSON to " + APIv3.submitChangeset() + "\n  " + json);
-        try (CloseableHttpClient httpClient = builder.build()) {
-          httpPost.setEntity(new StringEntity(json));
-          CloseableHttpResponse response = httpClient.execute(httpPost);
-          Logging.debug("HTTP request finished with response code " + response.getStatusLine().getStatusCode());
-          if (response.getStatusLine().getStatusCode() == 201) {
-            final String key = Json.createReader(response.getEntity().getContent()).readObject().getString("key");
-            final String state = Json.createReader(response.getEntity().getContent()).readObject().getString("state");
-            I18n.marktr("rejected");
-            I18n.marktr("pending");
-            I18n.marktr("approved");
-            final String message = I18n.tr("{0} images submitted, Changeset key: {1}, State: {2}", locationChangeset.size(), key, state);
-            Logging.debug(message);
-            new Notification(message)
-              .setDuration(Notification.TIME_LONG)
-              .setIcon("rejected".equals(state) ? JOptionPane.ERROR_MESSAGE : JOptionPane.INFORMATION_MESSAGE)
-              .show();
-            locationChangeset.cleanChangeset(); // TODO: Remove only uploaded changes. If the user made changes while uploading the changeset, these changes would also be removed, although they weren't uploaded. Alternatively: Disallow editing while uploading.
-          } else {
-            new Notification(
-              I18n.tr("Changeset upload failed with {0} error ''{1} {2}''!",
-                response.getStatusLine().getProtocolVersion(),
-                response.getStatusLine().getStatusCode(),
-                response.getStatusLine().getReasonPhrase()
-              )
-            ).setIcon(JOptionPane.ERROR_MESSAGE)
-              .setDuration(Notification.TIME_LONG)
-              .show();
-            Logging.error("Failed response " + EntityUtils.toString(response.getEntity()));
-          }
-        } catch (IOException e) {
-          Logging.log(Logging.LEVEL_ERROR, "Exception while trying to submit a changeset to streetside.com", e);
-          new Notification(
-            I18n.tr("An exception occured while trying to submit a changeset. If this happens repeatedly, consider reporting a bug via the Help menu. If this message appears for the first time, simply try it again. This might have been an issue with the internet connection.")
-          ).setDuration(Notification.TIME_LONG)
-            .setIcon(JOptionPane.ERROR_MESSAGE)
-            .show();
-        } finally {
-          PluginState.setSubmittingChangeset(false);
-        }
-      } else {
-        // TODO: currently no login for Microsoft
-        //PluginState.notLoggedInToStreetsideDialog();
-      }
-      changesetDialog.setUploadPending(false);
-    }, "Streetside changeset upload").start();
-  }
-}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/WalkThread.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/WalkThread.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/WalkThread.java	(revision 34358)
@@ -13,4 +13,6 @@
 import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils;
 import org.openstreetmap.josm.plugins.streetside.gui.StreetsideMainDialog;
+
+import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
 
 
@@ -57,13 +59,13 @@
           // Predownload next 10 thumbnails.
           preDownloadImages((StreetsideImage) image.next(), 10, CacheUtils.PICTURE.THUMBNAIL);
-          // TODO: WalkThread for cubemaps? @rrh
-      	  //preDownloadCubemaps((StreetsideImage) image.next(), 10, CacheUtils.PICTURE.CUBEMAP);
+          if(StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get()) {
+            preDownloadCubemaps((StreetsideImage) image.next(), 10);
+          }
           if (waitForFullQuality) {
             // Start downloading 3 next full images.
             StreetsideAbstractImage currentImage = image.next();
-        	preDownloadImages((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.FULL_IMAGE);
-        	// TODO: WalkThread for cubemaps? @rrh
-        	/*if (StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get().booleanValue()) {
-          	  preDownloadCubemaps((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.CUBEMAP);
+        	  preDownloadImages((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.FULL_IMAGE);
+        	  /*if (StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get().booleanValue()) {
+          	  preDownloadCubemaps((StreetsideImage) currentImage, 3);
             }*/
           }
@@ -98,48 +100,4 @@
         }
       }
-
-    	// TODO: WalkThread for cubemaps? @rrh
-      	/*while (!end && data.getSelectedImage().next() != null) {
-            StreetsideAbstractImage cubemap = data.getSelectedImage();
-            if (cubemap != null && cubemap.next() instanceof StreetsideCubemap) {
-              if (waitForFullQuality) {
-                // Start downloading 3 next full images.
-
-            	// TODO: cubemap handling @rrh
-            	preDownloadCubemaps((StreetsideCubemap) cubemap.next(), 6, CacheUtils.PICTURE.CUBEMAP);
-              }
-            }
-            try {
-              // Waits for full quality picture.
-              final BufferedImage[] displayCubemap = StreetsideMainDialog.getInstance().streetsideViewerDisplay.getCubemap();
-              if (waitForFullQuality && cubemap instanceof StreetsideCubemap) {
-                  // TODO: handle cubemap width? @rrh
-            	  while (displayCubemap == lastCubemap || displayCubemap == null || displayCubemap.getWidth() < 2048) {
-                  Thread.sleep(100);
-                }
-              } else { // Waits for thumbnail.
-            	  // TODO: handle cubemap width? @rrh
-            	  while (displayCubemap == lastCubemap || displayCubemap == null || displayCubemap.getWidth() < 320) {
-                  Thread.sleep(100);
-                }
-              }
-              while (paused) {
-                Thread.sleep(100);
-              }
-              wait(interval);
-              while (paused) {
-                Thread.sleep(100);
-              }
-              lastCubemap = StreetsideMainDialog.getInstance().streetsideViewerDisplay.getCubemap();
-              // TODO: forward / previous for cubemap? @rrh
-              if (goForward) {
-                data.selectNext(followSelected);
-              } else {
-                data.selectPrevious(followSelected);
-              }
-            } catch (InterruptedException e) {
-              return;
-            }
-          }*/
     } catch (NullPointerException e) {
       // TODO: Avoid NPEs instead of waiting until they are thrown and then catching them
@@ -149,5 +107,5 @@
   }
 
-  private void preDownloadCubemaps(StreetsideImage startImage, int n, CacheUtils.PICTURE type) {
+  private void preDownloadCubemaps(StreetsideImage startImage, int n) {
 	  if (n >= 1 && startImage != null) {
 
@@ -156,7 +114,7 @@
 					for (int k = 0; k < 4; k++) {
 
-						CacheUtils.downloadPicture(startImage, type);
+						CacheUtils.downloadPicture(startImage, CacheUtils.PICTURE.CUBEMAP);
 						if (startImage.next() instanceof StreetsideImage && n >= 2) {
-							preDownloadImages((StreetsideImage) startImage.next(), n - 1, type);
+							preDownloadCubemaps((StreetsideImage) startImage.next(), n - 1);
 						}
 					}
@@ -232,12 +190,4 @@
       SwingUtilities.invokeLater(this::end);
     }
-    // TODO: WalkThread for Cubemaps? @rrh
-    /*if (Platform.isEventDispatchThread()) {
-        end = true;
-        data.removeListener(this);
-        StreetsideViewerDialog.getInstance().setMode(StreetsideViewerDialog.MODE.NORMAL);
-      } else {
-        Platform.invokeLater(this::end);
-      }*/
   }
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cache/CacheUtils.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cache/CacheUtils.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cache/CacheUtils.java	(revision 34358)
@@ -57,6 +57,5 @@
 */
 public static void downloadCubemap(StreetsideImage cm) {
-	// TODO: causes errors. Analyze @rrh
-	//downloadPicture(cm, PICTURE.CUBEMAP);
+	downloadPicture(cm, PICTURE.CUBEMAP);
 }
 
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 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBuilder.java	(revision 34358)
@@ -4,4 +4,5 @@
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +35,35 @@
 	protected boolean cancelled;
 	private long startTime;
-
-	private CubemapBuilder() {
+  private Map<String, BufferedImage> tileImages = new HashMap<String,BufferedImage>();
+
+  /**
+   * @return the tileImages
+   */
+  public Map<String, BufferedImage> getTileImages() {
+    return tileImages;
+  }
+
+  /**
+   * @param tileImages the tileImages to set
+   */
+  public void setTileImages(Map<String, BufferedImage> tileImages) {
+    this.tileImages = tileImages;
+  }
+
+  /**
+   * @return the tileImages
+   */
+  /*public Map<String, BufferedImage> getTileImages() {
+    return tileImages;
+  }
+
+  *//**
+   * @param tileImages the tileImages to set
+   *//*
+  public void setTileImages(Map<String, BufferedImage> tileImages) {
+    this.tileImages = tileImages;
+  }*/
+
+  private CubemapBuilder() {
 		// private constructor to avoid instantiation
 	}
@@ -57,4 +87,7 @@
 			// set the cubeface images in JavaFX
 			downloadCubemapImages(cubemap.getId());
+
+			long runTime = (System.currentTimeMillis()-startTime)/1000;
+			Logging.debug("Completed downloading tiles for {0} in {1} seconds.",newImage.getId(),runTime);
 		}
 	}
@@ -62,5 +95,6 @@
 	public void reload(String imageId) {
 		if (cubemap != null && imageId.equals(cubemap.getId())) {
-			CubemapBuilder.getInstance().getCubemap().resetFaces2TileMap();
+			tileImages = new HashMap<String,BufferedImage>();
+		  //CubemapBuilder.getInstance().getCubemap().resetFaces2TileMap();
 			downloadCubemapImages(imageId);
 		}
@@ -103,5 +137,5 @@
 
 					Logging.debug(I18n.tr("Completed tile downloading task {0} in {1}", ff.get(),
-							CubemapUtils.msToString(startTime - System.currentTimeMillis())));
+							(startTime - System.currentTimeMillis())/ 1000));
 				}
 
@@ -125,5 +159,5 @@
 				for (Future<String> ff : results) {
 					Logging.debug(I18n.tr("Completed tile downloading task {0} in {1}", ff.get(),
-							CubemapUtils.msToString(startTime - System.currentTimeMillis())));
+							(startTime - System.currentTimeMillis())/ 1000));
 				}
 			}
@@ -137,5 +171,5 @@
 		long runTime = stopTime - startTime;
 
-		Logging.debug(I18n.tr("Tile imagery downloading tasks completed in {0}", CubemapUtils.msToString(runTime)));
+		Logging.debug(I18n.tr("Tile imagery downloading tasks completed in {0}", runTime/1000000));
 
 		if (fails > 0) {
@@ -153,10 +187,12 @@
 		int tileCount = 0;
 
-		for (int i = 0; i < CubemapUtils.NUM_SIDES; i++) {
+		/*for (int i = 0; i < CubemapUtils.NUM_SIDES; i++) {
 			String faceNumber = CubemapUtils.getFaceNumberForCount(i);
 			Map<String, BufferedImage> faceTileImages = CubemapBuilder.getInstance().getCubemap().getFace2TilesMap()
 					.get(faceNumber);
 			tileCount += faceTileImages.values().size();
-		}
+		}*/
+
+		tileCount = CubemapBuilder.getInstance().getTileImages().keySet().size();
 
 		int maxCols = StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get() ? 4 : 2;
@@ -168,12 +204,11 @@
 
 			buildCubemapFaces();
-		} else {
-			Logging.debug(I18n.tr("{0} tile images received for cubemap {1}", Integer.valueOf(tileCount).toString(),
-					CubemapBuilder.getInstance().getCubemap().getId()));
 		}
 	}
 
 	private void buildCubemapFaces() {
-		CubemapBox cmb = StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().getCubemapBox();
+
+	  Logging.debug("Assembling cubemap tile images");
+	  CubemapBox cmb = StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().getCubemapBox();
 		ImageView[] views = cmb.getViews();
 
@@ -187,7 +222,8 @@
 			for (int i = 0; i < CubemapUtils.NUM_SIDES; i++) {
 
-				Map<String, BufferedImage> tileImages = CubemapBuilder.getInstance().getCubemap().getFace2TilesMap()
-						.get(CubemapUtils.getFaceNumberForCount(i));
-				BufferedImage[] faceTileImages = new BufferedImage[maxCols * maxRows];
+				/*Map<String, BufferedImage> tileImages = CubemapBuilder.getInstance().getCubemap().getFace2TilesMap()
+						.get(CubemapUtils.getFaceNumberForCount(i));*/
+
+			  BufferedImage[] faceTileImages = new BufferedImage[maxCols * maxRows];
 
 				for (int j = 0; j < (maxCols * maxRows); j++) {
@@ -203,5 +239,7 @@
 				// rotate top cubeface 180 degrees - misalignment workaround
 				if (i == 4) {
+				  final long start = System.nanoTime();
 					finalImg = GraphicsUtils.rotateImage(finalImg);
+					Logging.debug(I18n.tr("Rotation took {0}", System.nanoTime() - start));
 				}
 				finalImages[i] = GraphicsUtils.convertBufferedImage2JavaFXImage(finalImg);
@@ -213,7 +251,7 @@
 				int tileCount = 0;
 
-				Map<String, Map<String, BufferedImage>> face2TilesMap = CubemapBuilder.getInstance().getCubemap()
-						.getFace2TilesMap();
-				Map<String, BufferedImage> tileImages = face2TilesMap.get(CubemapUtils.getFaceNumberForCount(i));
+				/*Map<String, Map<String, BufferedImage>> face2TilesMap = CubemapBuilder.getInstance().getCubemap()
+						.getFace2TilesMap();*/
+				//Map<String, BufferedImage> tileImages = face2TilesMap.get(CubemapUtils.getFaceNumberForCount(i));
 				BufferedImage[] faceTileImages = new BufferedImage[StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY
 						.get() ? 16 : 4];
@@ -241,13 +279,38 @@
 		}
 
-		StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().revalidate();
-		StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().repaint();
-		StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().revalidate();
-		StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().repaint();
-
-		long endTime = System.currentTimeMillis();
-		long runTime = endTime - startTime;
-		Logging.debug(I18n.tr("Completed downloading, assembling and setting cubemap imagery for cubemap {0} in {1}",
-				cubemap.getId(), CubemapUtils.msToString(runTime)));
+    StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().revalidate();
+    StreetsideViewerDialog.getInstance().getStreetsideViewerPanel().repaint();
+
+    /*if (!Platform.isFxApplicationThread()) {
+      Platform.runLater(new Runnable() {
+        @Override
+        public void run() {*/
+
+           //try {
+             /* GraphicsUtils.PlatformHelper.run(() -> {
+                StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().initialize();
+            });*/
+             //StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().initialize();
+             StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel()
+                .setScene(StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().getCubemapScene());
+            /*} catch (NonInvertibleTransformException nite) {
+              // TODO Auto-generated catch block
+              Logging.error(I18n.tr("Error setting scene in 360 viewer panel {0}", nite.getMessage()));
+            }*/
+        /*}
+      });
+    }*/
+
+    StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().revalidate();
+    StreetsideViewerPanel.getThreeSixtyDegreeViewerPanel().repaint();
+
+    long endTime = System.currentTimeMillis();
+    long runTime = (endTime - startTime) / 1000;
+    Logging.debug(
+      I18n.tr(
+        "Completed downloading, assembling and setting cubemap imagery for cubemap {0} in {1}", cubemap.getId(), runTime
+        )
+      );
+      CubemapBuilder.getInstance().setTileImages(new HashMap<String, BufferedImage>());
 	}
 
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapUtils.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapUtils.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapUtils.java	(revision 34358)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.plugins.streetside.cubemap;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -97,4 +100,7 @@
 		final StringBuilder sb = new StringBuilder();
 
+		Logging.debug(I18n.tr("convertDecimal2Quaternary input: {0}", Long.toString(inputNum)));
+
+
 		while (inputNum > 0) {
 			sb.append(inputNum % CubemapUtils.NUM_BASE);
@@ -104,4 +110,6 @@
 		sb.append("0");
 		res = sb.reverse().toString();
+
+		Logging.debug(I18n.tr("convertDecimal2Quaternary output: {0}", res));
 
 		return res;
@@ -216,26 +224,4 @@
 	}
 
-	public static String msToString(long ms) {
-        long totalSecs = ms/1000;
-        long hours = (totalSecs / 3600);
-        long mins = (totalSecs / 60) % 60;
-        long secs = totalSecs % 60;
-        String minsString = (mins == 0)
-            ? "00"
-            : ((mins < 10)
-               ? "0" + mins
-               : "" + mins);
-        String secsString = (secs == 0)
-            ? "00"
-            : ((secs < 10)
-               ? "0" + secs
-               : "" + secs);
-        if (hours > 0)
-            return hours + ":" + minsString + ":" + secsString;
-        else if (mins > 0)
-            return mins + ":" + secsString;
-        else return ":" + secsString;
-    }
-
 	public static String convertDoubleCountNrto16TileNr(String countNr) {
 		String tileAddress;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/GraphicsUtils.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/GraphicsUtils.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/GraphicsUtils.java	(revision 34358)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
+import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -42,5 +43,7 @@
 	public static BufferedImage buildMultiTiledCubemapFaceImage(BufferedImage[] tiles) {
 
-		BufferedImage res = null;
+		long start = System.currentTimeMillis();
+
+	  BufferedImage res = null;
 
 		int pixelBuffer = StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()?2:1;
@@ -63,5 +66,5 @@
             for (int j = 0; j < cols; j++) {
                 // TODO: this makes the image a mirror image. why!?!
-            	img.createGraphics().drawImage(tiles[num], chunkWidth * j, chunkHeight * i, null);
+            	img.createGraphics().drawImage(tiles[num], chunkWidth * j, (chunkHeight * i), null);
 
             	// TODO: remove file test!
@@ -101,6 +104,5 @@
         }
 
-        Logging.debug("Image concatenated.....");
-
+        Logging.debug(I18n.tr("Image concatenated in {0} millisecs.",(System.currentTimeMillis()-start)));
         return res;
 	}
@@ -117,5 +119,7 @@
 	private static BufferedImage[] cropMultiTiledImages(BufferedImage[] tiles, int pixelBuffer) {
 
-		BufferedImage[] res = new BufferedImage[tiles.length];
+		long start = System.currentTimeMillis();
+
+	  BufferedImage[] res = new BufferedImage[tiles.length];
 
 			for(int i=0; i<tiles.length;i++) {
@@ -126,4 +130,7 @@
 				}
 			}
+
+		Logging.debug("Images cropped in {0} millisecs.",(System.currentTimeMillis()-start));
+
 		return res;
 	}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/TileDownloadingTask.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/TileDownloadingTask.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/TileDownloadingTask.java	(revision 34358)
@@ -5,5 +5,4 @@
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Callable;
@@ -108,19 +107,19 @@
 		}
 
-		String faceId = CubemapUtils.getFaceIdFromTileId(tileId);
+		//String faceId = CubemapUtils.getFaceIdFromTileId(tileId);
 
-		Map<String, Map<String, BufferedImage>> faces2TilesMap = CubemapBuilder
-				.getInstance().getCubemap().getFace2TilesMap();
+		/*Map<String, Map<String, BufferedImage>> faces2TilesMap = CubemapBuilder
+				.getInstance().getCubemap().getFace2TilesMap();*/
 
-		if(faces2TilesMap.get(faceId)==null) {
-			faces2TilesMap.put(faceId, new HashMap<String,BufferedImage>());
-		}
-		faces2TilesMap.get(faceId).put(tileId, img);
+		/*if(CubemapBuilder.getInstance().getTileImages().get(tileId)==null) {
+		  CubemapBuilder.getInstance().getTileImages().put(tileId, new HashMap<String,BufferedImage>());
+		}*/
+		CubemapBuilder.getInstance().getTileImages().put(tileId, img);
 
 		fireTileAdded(tileId);
 
 		long endTime = System.currentTimeMillis();
-		long runTime = startTime - endTime;
-		Logging.debug("Loaded image for tile {0} in {1} seconds", tileId, CubemapUtils.msToString(runTime));
+		long runTime = (endTime-startTime)/1000;
+		Logging.debug("Loaded image for tile {0} in {1} seconds", tileId, runTime);
 
 		return tileId;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideChangesetDialog.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideChangesetDialog.java	(revision 34353)
+++ 	(revision )
@@ -1,144 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.gui;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.KeyEvent;
-import java.util.Collections;
-import java.util.Objects;
-
-import javax.swing.Box;
-import javax.swing.JPanel;
-import javax.swing.JProgressBar;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
-import javax.swing.JTree;
-import javax.swing.SwingUtilities;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeSelectionModel;
-
-import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLocationChangeset;
-import org.openstreetmap.josm.plugins.streetside.history.StreetsideRecord;
-import org.openstreetmap.josm.plugins.streetside.history.commands.StreetsideCommand;
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideChangesetListener;
-import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Shortcut;
-
-import org.openstreetmap.josm.plugins.streetside.actions.StreetsideSubmitCurrentChangesetAction;
-
-/**
- * Toggle dialog that shows you the latest {@link StreetsideCommand} done and
- * allows the user to revert them.
- *
- * @see StreetsideRecord
- * @see StreetsideCommand
- */
-public final class StreetsideChangesetDialog extends ToggleDialog implements StreetsideChangesetListener {
-  private static final long serialVersionUID = -3019715241209349372L;
-  private static StreetsideChangesetDialog instance;
-
-  private final DefaultTreeModel changesetTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
-
-  private final Component spacer = Box.createRigidArea(new Dimension(0, 3));
-
-  private final Container rootComponent = new JPanel(new BorderLayout());
-  private final SideButton submitButton = new SideButton(new StreetsideSubmitCurrentChangesetAction(this));
-  private final JProgressBar uploadPendingProgress = new JProgressBar();
-
-  /**
-   * Destroys the unique instance of the class.
-   */
-  public static void destroyInstance() {
-    StreetsideChangesetDialog.instance = null;
-  }
-
-  private StreetsideChangesetDialog() {
-    super(
-      tr("Current Streetside changeset"),
-      "streetside-upload",
-      tr("Open Streetside changeset dialog"),
-      Shortcut.registerShortcut(
-        tr("Streetside changeset"), tr("Open Streetside changeset dialog"), KeyEvent.VK_9, Shortcut.NONE
-      ),
-      200
-    );
-    createLayout(rootComponent, false, Collections.singletonList(submitButton));
-
-    final JTree changesetTree = new JTree(changesetTreeModel);
-    changesetTree.expandRow(0);
-    changesetTree.setShowsRootHandles(true);
-    changesetTree.setRootVisible(false);
-    changesetTree.setCellRenderer(new StreetsideImageTreeCellRenderer());
-    changesetTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
-
-    final JPanel treesPanel = new JPanel(new GridBagLayout());
-    treesPanel.add(spacer, GBC.eol());
-    treesPanel.add(changesetTree, GBC.eol().fill(GridBagConstraints.HORIZONTAL));
-    treesPanel.add(new JSeparator(), GBC.eol().fill(GridBagConstraints.HORIZONTAL));
-    treesPanel.add(Box.createRigidArea(new Dimension(0, 0)), GBC.std().weight(0, 1));
-    rootComponent.add(new JScrollPane(treesPanel), BorderLayout.CENTER);
-
-    uploadPendingProgress.setIndeterminate(true);
-    uploadPendingProgress.setString(tr("Submitting changeset to server…"));
-    uploadPendingProgress.setStringPainted(true);
-
-    setUploadPending(false);
-  }
-
-  /**
-   * Returns the unique instance of the class.
-   *
-   * @return The unique instance of the class.
-   */
-  public static synchronized StreetsideChangesetDialog getInstance() {
-    if (instance == null) {
-      instance = new StreetsideChangesetDialog();
-    }
-    return instance;
-  }
-
-  private void buildTree() {
-    final StreetsideLocationChangeset changeset = StreetsideLayer.getInstance().getLocationChangeset();
-    submitButton.setEnabled(!changeset.isEmpty());
-    DefaultMutableTreeNode changesetRoot = new DefaultMutableTreeNode();
-
-    changeset.parallelStream().filter(Objects::nonNull).forEach(img -> {
-      final DefaultMutableTreeNode node = new DefaultMutableTreeNode(img);
-      changesetRoot.add(node);
-    });
-
-    spacer.setVisible(changeset.isEmpty());
-
-    changesetTreeModel.setRoot(changesetRoot);
-  }
-
-  public void setUploadPending(final boolean isUploadPending) {
-    if (isUploadPending) {
-      rootComponent.add(uploadPendingProgress, BorderLayout.SOUTH);
-    } else {
-      rootComponent.remove(uploadPendingProgress);
-    }
-    submitButton.setEnabled(!isUploadPending && StreetsideLayer.hasInstance() && !StreetsideLayer.getInstance().getLocationChangeset().isEmpty());
-    rootComponent.revalidate();
-    rootComponent.repaint();
-  }
-
-  @Override
-  public void changesetChanged() {
-    if (!SwingUtilities.isEventDispatchThread()) {
-      SwingUtilities.invokeLater(this::buildTree);
-    } else {
-      buildTree();
-    }
-  }
-}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsidePreferenceSetting.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsidePreferenceSetting.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsidePreferenceSetting.java	(revision 34358)
@@ -248,10 +248,10 @@
       OAuthPortListener portListener = new OAuthPortListener(callback);
       portListener.start();
-      try {
+      /*try {
         // TODO: change URL RRH
         StreetsideUtils.browse(StreetsideURL.MainWebsite.connect("http://localhost:"+OAuthPortListener.PORT+'/'));
       } catch (IOException e) {
         Logging.error(e);
-      }
+      }*/
     }
   }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideViewerDialog.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideViewerDialog.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideViewerDialog.java	(revision 34358)
@@ -79,5 +79,4 @@
 
 	public StreetsideViewerPanel getStreetsideViewerPanel() {
-		// TODO: check if it's null @rrhs
 		return streetsideViewerPanel;
 	}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/dialog/ChooseGeoImageLayersDialog.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/dialog/ChooseGeoImageLayersDialog.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/dialog/ChooseGeoImageLayersDialog.java	(revision 34358)
@@ -59,5 +59,5 @@
     buttonPanel.add(cancelButton);
     final JButton importButton = new JButton(I18n.tr("Import"), new ImageProvider("copy").get());
-    importButton.addActionListener(e -> {
+    /*importButton.addActionListener(e -> {
       list.getSelectedValuesList().parallelStream().map(gil -> {
         StreetsideSequence seq = new StreetsideSequence();
@@ -88,5 +88,5 @@
       StreetsideLayer.invalidateInstance();
       dispose();
-    });
+    });*/
     buttonPanel.add(importButton);
     c.add(buttonPanel, BorderLayout.SOUTH);
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ImageInfoPanel.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ImageInfoPanel.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ImageInfoPanel.java	(revision 34358)
@@ -187,7 +187,7 @@
     if (newImageKey != null) {
       imageLinkChangeListener = b -> imgLinkAction.setURL(
-        StreetsideProperties.IMAGE_LINK_TO_BLUR_EDITOR.get()
+        /*StreetsideProperties.IMAGE_LINK_TO_BLUR_EDITOR.get()
         ? StreetsideURL.MainWebsite.blurEditImage(newImageKey)
-        : StreetsideURL.MainWebsite.browseImage(newImageKey)
+        :*/ StreetsideURL.MainWebsite.browseImage(newImageKey)
       );
       imageLinkChangeListener.valueChanged(null);
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/StreetsideViewerPanel.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/StreetsideViewerPanel.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/StreetsideViewerPanel.java	(revision 34358)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
 import org.openstreetmap.josm.plugins.streetside.actions.ImageReloadAction;
+import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder;
 import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
 import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
@@ -67,5 +68,5 @@
 
 	    StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction);
-		highResImageryCheck = new JCheckBox(I18n.tr("High resolution"));
+		  highResImageryCheck = new JCheckBox(I18n.tr("High resolution"));
 	    highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get());
 	    highResImageryCheck.addActionListener(
@@ -84,8 +85,12 @@
 	    checkPanel.add(privacyLink, BorderLayout.PAGE_END);
 
-	    add(checkPanel, BorderLayout.PAGE_START);
+	    //add(checkPanel, BorderLayout.PAGE_START);
 	    add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER);
 
-	    add(privacyLink, BorderLayout.PAGE_END);
+	    JPanel bottomPanel = new JPanel();
+	    bottomPanel.add(checkPanel, BorderLayout.NORTH);
+	    bottomPanel.add(privacyLink, BorderLayout.SOUTH);
+
+	    add(bottomPanel, BorderLayout.PAGE_END);
 	}
 
@@ -124,5 +129,6 @@
 
 		    //imgIdValue.setEnabled(newImage instanceof StreetsideImage);
-		    final String newImageId = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null;
+		    //final String newImageId = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null;
+		    final String newImageId = CubemapBuilder.getInstance().getCubemap() !=null ? CubemapBuilder.getInstance().getCubemap().getId() : newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null;;
 		    if (newImageId != null) {
 		      final String bubbleId = CubemapUtils.convertQuaternary2Decimal(newImageId);
@@ -130,4 +136,7 @@
 		        StreetsideURL.MainWebsite.streetsidePrivacyLink(bubbleId)
 		      );
+
+		      Logging.debug(I18n.tr("Privacy link invoked for Streetside image {0}", bubbleId));
+
 		      imageLinkChangeListener.valueChanged(null);
 		      StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener);
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 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ThreeSixtyDegreeViewerPanel.java	(revision 34358)
@@ -7,6 +7,4 @@
 import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
 import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox;
-import org.openstreetmap.josm.tools.I18n;
-import org.openstreetmap.josm.tools.Logging;
 
 import javafx.application.Platform;
@@ -31,4 +29,8 @@
 	private static final long serialVersionUID = -4940350009018422000L;
 
+	private static Scene cubemapScene;
+
+	private static Scene defaultScene;
+
 	private static Group root;
 	private static Group subGroup;
@@ -57,5 +59,5 @@
 	}
 
-	void initialize() {
+	public void initialize() {
 
 		root = new Group();
@@ -90,17 +92,17 @@
 			@Override
 			public void run() {
-				try {
-					// TODO: create Default Scene and replace with 360 degree scene @rrh
-					setScene(createScene());
-				} catch (NonInvertibleTransformException e) {
+				//try {
+					setScene(createDefaultScene());
+				  //setScene(createScene());
+				/*} catch (NonInvertibleTransformException e) {
 					Logging.error(I18n.tr("Error initializing StreetsideViewerPanel - JavaFX {0}", e.getMessage()));
-				}
+				}*/
 			}
 		});
 	}
 
-	private static Scene createScene() throws NonInvertibleTransformException {
-
-		/*root = new Group();
+	public static Scene createScene() /*throws NonInvertibleTransformException*/ {
+
+		root = new Group();
 
 		camera = new PerspectiveCamera(true);
@@ -126,5 +128,5 @@
 
 		subGroup = new Group();
-		subGroup.getChildren().add(cameraTransform);*/
+		subGroup.getChildren().add(cameraTransform);
 
 		final Scene scene = new Scene(new Group(root), 1024, 668, true, SceneAntialiasing.BALANCED);
@@ -220,5 +222,5 @@
 		subGroup.setAutoSizeChildren(true);
 
-		// TODO: attempt to prevent content from disappearing after resizing
+		// prevent content from disappearing after resizing
 		Platform.setImplicitExit(false);
 
@@ -230,5 +232,5 @@
 
 		// Load Cubemap box AFTER camera is initialized
-		final double size = 100000D;
+		//final double size = 100000D;
 
 		TextArea textArea = new TextArea();
@@ -237,6 +239,129 @@
 		VBox vbox = new VBox(textArea);
 
-		Scene scene = new Scene(vbox, 200, 100);
-		return scene;
+		root = new Group();
+
+    camera = new PerspectiveCamera(true);
+    cameraTransform.setTranslate(0, 0, 0);
+    cameraTransform.getChildren().addAll(camera);
+    camera.setNearClip(0.1);
+    camera.setFarClip(1000000.0);
+    camera.setFieldOfView(42);
+    camera.setTranslateZ(-cameraDistance);
+    final PointLight light = new PointLight(Color.WHITE);
+
+    cameraTransform.getChildren().add(light);
+    light.setTranslateX(camera.getTranslateX());
+    light.setTranslateY(camera.getTranslateY());
+    light.setTranslateZ(camera.getTranslateZ());
+
+    root.getChildren().add(cameraTransform);
+
+    // Load Cubemap box AFTER camera is initialized
+    final double size = 100000D;
+
+    cubemapBox = new CubemapBox(null, null, null, null, null, null, size, camera);
+
+    subGroup = new Group();
+    subGroup.getChildren().add(cameraTransform);
+
+    /*final Scene*/ cubemapScene = new Scene(new Group(root), 1024, 668, true, SceneAntialiasing.BALANCED);
+    cubemapScene.setFill(Color.TRANSPARENT);
+    cubemapScene.setCamera(camera);
+
+    // First person shooter keyboard movement
+    cubemapScene.setOnKeyPressed(event -> {
+      double change = 10.0;
+      // Add shift modifier to simulate "Running Speed"
+      if (event.isShiftDown()) {
+        change = 50.0;
+      }
+      // What key did the user press?
+      final KeyCode keycode = event.getCode();
+      // Step 2c: Add Zoom controls
+      if (keycode == KeyCode.W) {
+        camera.setTranslateZ(camera.getTranslateZ() + change);
+      }
+      if (keycode == KeyCode.S) {
+        camera.setTranslateZ(camera.getTranslateZ() - change);
+      }
+      // Step 2d: Add Strafe controls
+      if (keycode == KeyCode.A) {
+        camera.setTranslateX(camera.getTranslateX() - change);
+      }
+      if (keycode == KeyCode.D) {
+        camera.setTranslateX(camera.getTranslateX() + change);
+      }
+    });
+
+    cubemapScene.setOnMousePressed((MouseEvent me) -> {
+      mousePosX = me.getSceneX();
+      mousePosY = me.getSceneY();
+      mouseOldX = me.getSceneX();
+      mouseOldY = me.getSceneY();
+    });
+    cubemapScene.setOnMouseDragged((MouseEvent me) -> {
+      mouseOldX = mousePosX;
+      mouseOldY = mousePosY;
+      mousePosX = me.getSceneX();
+      mousePosY = me.getSceneY();
+      mouseDeltaX = mousePosX - mouseOldX;
+      mouseDeltaY = mousePosY - mouseOldY;
+
+      double modifier = 10.0;
+      final double modifierFactor = 0.1;
+
+      if (me.isControlDown()) {
+        modifier = 0.1;
+      }
+      if (me.isShiftDown()) {
+        modifier = 50.0;
+      }
+      if (me.isPrimaryButtonDown()) {
+        cameraTransform.ry.setAngle(
+            ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540)
+                % 360 - 180); // +
+        cameraTransform.rx.setAngle(
+            ((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540)
+                % 360 - 180); // -
+
+      } else if (me.isSecondaryButtonDown()) {
+        final double z = camera.getTranslateZ();
+        final double newZ = z + mouseDeltaX * modifierFactor * modifier;
+        camera.setTranslateZ(newZ);
+      } else if (me.isMiddleButtonDown()) {
+        cameraTransform.t.setX(cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // -
+        cameraTransform.t.setY(cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // -
+      }
+    });
+
+    /*scene.widthProperty().addListener(new ChangeListener<Number>() {
+        @Override public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth, Number newSceneWidth) {
+            System.out.println("Width: " + newSceneWidth);
+        }
+
+      @Override
+      public void changed(ObservableValue<? extends Number> observable, Number oldSceneWidth, Number newSceneWidth) {
+        draw();
+      }
+    });*/
+    /*scene.heightProperty().addListener(new ChangeListener<Number>() {
+        @Override public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight, Number newSceneHeight) {
+            //System.out.println("Height: " + newSceneHeight);
+          draw();
+        }
+    });*/
+
+    root.getChildren().addAll(cubemapBox, subGroup);
+    root.setAutoSizeChildren(true);
+
+    subGroup.setAutoSizeChildren(true);
+
+    // prevent content from disappearing after resizing
+    Platform.setImplicitExit(false);
+
+    //return scene;
+
+		defaultScene = new Scene(vbox, 200, 100);
+		return defaultScene;
 	}
 
@@ -381,3 +506,11 @@
 		return cubemapBox;
 	}
+
+  public Scene getDefaultScene() {
+    return defaultScene;
+  }
+
+  public Scene getCubemapScene() {
+    return cubemapScene;
+  }
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/BoundsDownloadRunnable.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/BoundsDownloadRunnable.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/BoundsDownloadRunnable.java	(revision 34358)
@@ -30,4 +30,5 @@
   public void run() {
     URL nextURL = getUrlGenerator().apply(bounds);
+    Logging.debug("nextURL: {0}", nextURL.toString());
     try {
       while (nextURL != null) {
@@ -73,5 +74,5 @@
       message.append(" (").append(info).append(')');
     }
-    Logging.info(message.toString());
+    Logging.debug(message.toString());
   }
 
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/ImageDetailsDownloadRunnable.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/ImageDetailsDownloadRunnable.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/ImageDetailsDownloadRunnable.java	(revision 34358)
@@ -13,5 +13,4 @@
 
 public class ImageDetailsDownloadRunnable extends BoundsDownloadRunnable {
-  //private static final Function<Bounds, URL> URL_GEN = APIv3::searchImages;
   private static final Function<Bounds, URL> URL_GEN = APIv3::searchStreetsideImages;
 
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/SequenceDownloadRunnable.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/SequenceDownloadRunnable.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/SequenceDownloadRunnable.java	(revision 34358)
@@ -66,11 +66,9 @@
 
     try {
-
-    JsonParser parser = mapper.getFactory().createParser(new BufferedInputStream(con.getInputStream()));
+      JsonParser parser = mapper.getFactory().createParser(new BufferedInputStream(con.getInputStream()));
     if(parser.nextToken() != JsonToken.START_ARRAY) {
       parser.close();
       throw new IllegalStateException("Expected an array");
     }
-
 
     StreetsideImage previous = null;
@@ -105,36 +103,35 @@
           List<StreetsideImage> tiles = new ArrayList<StreetsideImage>();
 
-        // TODO: set previous and next @rrh
+          EnumSet.allOf(CubemapUtils.CubemapFaces.class).forEach(face -> {
 
-					EnumSet.allOf(CubemapUtils.CubemapFaces.class).forEach(face -> {
-
-							for (int i = 0; i < 4; i++) {
-								// Initialize four-tiled cubemap faces (four images per cube side with 18-length
-								// Quadkey)
-								//if (StreetsideProperties.CUBEFACE_SIZE.get().intValue() == 4) {
-								if (!StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) {
-									StreetsideImage tile = new StreetsideImage(
-											String.valueOf(image.getId() + Integer.valueOf(i)));
-									tiles.add(tile);
-								}
-								// Initialize four-tiled cubemap faces (four images per cub eside with 20-length
-								// Quadkey)
-								//if (StreetsideProperties.CUBEFACE_SIZE.get().intValue() == 16) {
-								if (StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) {
-									for (int j = 0; j < 4; j++) {
-										StreetsideImage tile = new StreetsideImage(String.valueOf(image.getId()
-												+ face.getValue() + CubemapUtils.rowCol2StreetsideCellAddressMap
-														.get(String.valueOf(Integer.valueOf(i).toString() + Integer.valueOf(j).toString()))));
-										tiles.add(tile);
-									}
-								}
-							}
-					});
+            for (int i = 0; i < 4; i++) {
+              // Initialize four-tiled cubemap faces (four images per cube side with 18-length
+              // Quadkey)
+              // if (StreetsideProperties.CUBEFACE_SIZE.get().intValue() == 4) {
+              if (!StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) {
+                StreetsideImage tile = new StreetsideImage(String.valueOf(image.getId() + Integer.valueOf(i)));
+                tiles.add(tile);
+              }
+              // Initialize four-tiled cubemap faces (four images per cub eside with 20-length
+              // Quadkey)
+              // if (StreetsideProperties.CUBEFACE_SIZE.get().intValue() == 16) {
+              if (StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) {
+                for (int j = 0; j < 4; j++) {
+                  StreetsideImage tile = new StreetsideImage(
+                    String.valueOf(
+                      image.getId() + face.getValue() + CubemapUtils.rowCol2StreetsideCellAddressMap
+                        .get(String.valueOf(Integer.valueOf(i).toString() + Integer.valueOf(j).toString()))
+                      ));
+                  tiles.add(tile);
+                }
+              }
+            }
+          });
 
       	  bubbleImages.add(image);
           Logging.info("Added image with id <" + image.getId() + ">");
-          // TODO: double check whether this pre-caches successfullly @rrh
-          //StreetsideData.downloadSurroundingCubemaps(image);
-
+          if (StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get()) {
+            StreetsideData.downloadSurroundingCubemaps(image);
+          }
         }
       }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/MapObject.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/MapObject.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/MapObject.java	(revision 34358)
@@ -17,5 +17,5 @@
 public class MapObject extends KeyIndexedObject {
   private static final ImageIcon ICON_UNKNOWN_TYPE = ImageProvider.get("unknown-mapobject-type");
-  private static Function<String, URL> iconUrlGen = MainWebsite::mapObjectIcon;
+  //private static Function<String, URL> iconUrlGen = MainWebsite::mapObjectIcon;
 
   private final LatLon coordinate;
@@ -56,5 +56,5 @@
       return ICON_UNKNOWN_TYPE;
     } else if (cachedIcon == null) {
-      try {
+      /*try {
         final ImageIcon downloadedIcon = new ImageIcon(ImageIO.read(iconUrlGen.apply(objectTypeID)));
         MapObjectIconCache.getInstance().put(objectTypeID, downloadedIcon);
@@ -63,5 +63,5 @@
         Logging.log(Logging.LEVEL_WARN, "Failed to download icon " + objectTypeID, e);
         return ICON_UNKNOWN_TYPE;
-      }
+      }*/
     }
     return cachedIcon;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/oauth/StreetsideUser.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/oauth/StreetsideUser.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/oauth/StreetsideUser.java	(revision 34358)
@@ -33,8 +33,8 @@
 */
 public static synchronized String getUsername() {
- if (!isTokenValid) {
+ //if (!isTokenValid) {
    return null;
- }
- if (username == null) {
+ //}
+ /*if (username == null) {
    try {
      username = OAuthUtils
@@ -46,5 +46,5 @@
    }
  }
- return username;
+ return username;*/
 }
 
@@ -54,7 +54,7 @@
 */
 public static synchronized Map<String, String> getSecrets() {
- if (!isTokenValid)
+ //if (!isTokenValid)
    return null;
- Map<String, String> hash = new HashMap<>();
+ /*Map<String, String> hash = new HashMap<>();
  try {
    if (imagesHash == null)
@@ -72,5 +72,5 @@
  }
  hash.put("images_policy", imagesPolicy);
- return hash;
+ return hash;*/
 }
 
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideProperties.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideProperties.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideProperties.java	(revision 34358)
@@ -23,5 +23,5 @@
   public static final BooleanProperty CUBEMAP_LINK_TO_BLUR_EDITOR = new BooleanProperty("streetside.cubemap-link-to-blur-editor", true);
   public static final IntegerProperty TILE_DOWNLOAD_THREAD_PAUSE_LEN_SEC = new IntegerProperty("streetside.tile-download-thread-pause-len-sec", 60);
-  public static final BooleanProperty PREDOWNLOAD_CUBEMAPS = new BooleanProperty("streetside.predownload-cubemaps", true);
+  public static final BooleanProperty PREDOWNLOAD_CUBEMAPS = new BooleanProperty("streetside.predownload-cubemaps", false);
 
   /**
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideURL.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideURL.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideURL.java	(revision 34358)
@@ -23,5 +23,5 @@
 	/** Base URL of the Bing Bubble API. */
 	private static final String STREETSIDE_BASE_URL = "https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx";
-	private static final String BASE_API_V2_URL = "https://a.mapillary.com/v2/";
+	//private static final String BASE_API_V2_URL = "https://a.mapillary.com/v2/";
 	private static final String CLIENT_ID = "T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz";
 	private static final String BING_MAPS_KEY = "AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm";
@@ -36,5 +36,5 @@
 
 	public static final class APIv3 {
-		private static final String BASE_URL = "https://a.mapillary.com/v3/";
+		//private static final String BASE_URL = "https://a.mapillary.com/v3/";
 
 		private APIv3() {
@@ -42,11 +42,11 @@
 		}
 
-		public static URL getUser(String key) {
+		/*public static URL getUser(String key) {
 			return StreetsideURL.string2URL(APIv3.BASE_URL, "users/", key, StreetsideURL.queryString(null));
 		}
 
-		/**
+		*//**
 		 * @return the URL where you can create, get and approve changesets
-		 */
+		 *//*
 		public static URL submitChangeset() {
 			return StreetsideURL.string2URL(APIv3.BASE_URL, "changesets", APIv3.queryString(null));
@@ -59,5 +59,5 @@
 		public static URL searchImages(Bounds bounds) {
 			return StreetsideURL.string2URL(APIv3.BASE_URL, "images", APIv3.queryStreetsideString(bounds));
-		}
+		}*/
 
 		public static URL searchStreetsideImages(Bounds bounds) {
@@ -65,7 +65,7 @@
 		}
 
-		public static URL searchMapObjects(final Bounds bounds) {
+		/*public static URL searchMapObjects(final Bounds bounds) {
 			return StreetsideURL.string2URL(APIv3.BASE_URL, "objects", APIv3.queryString(bounds));
-		}
+		}*/
 
 		public static URL searchStreetsideSequences(final Bounds bounds) {
@@ -128,7 +128,7 @@
 		 * @return the URL where you'll find information about the user account as JSON
 		 */
-		public static URL userURL() {
+		/*public static URL userURL() {
 			return StreetsideURL.string2URL(APIv3.BASE_URL, "me", StreetsideURL.queryString(null));
-		}
+		}*/
 	}
 
@@ -152,5 +152,5 @@
 
 	public static final class MainWebsite {
-		private static final String BASE_URL = "https://www.mapillary.com/";
+		//private static final String BASE_URL = "https://www.mapillary.com/";
 
 		private MainWebsite() {
@@ -177,5 +177,5 @@
 		 * @throws IllegalArgumentException if the image key is <code>null</code>
 		 */
-		public static URL blurEditImage(final String key) {
+		/*public static URL blurEditImage(final String key) {
 			if (key == null) {
 				throw new IllegalArgumentException("The image key must not be null!");
@@ -189,5 +189,5 @@
 			}
 			return StreetsideURL.string2URL(MainWebsite.BASE_URL, "app/blur?focus=photo&pKey=", urlEncodedKey);
-		}
+		}*/
 
 		/**
@@ -217,5 +217,5 @@
 		 * @return the URL that the user should visit to start the OAuth authentication
 		 */
-		public static URL connect(String redirectURI) {
+		/*public static URL connect(String redirectURI) {
 			final HashMap<String, String> parts = new HashMap<>();
 			if (redirectURI != null && redirectURI.length() >= 1) {
@@ -229,5 +229,5 @@
 		public static URL mapObjectIcon(String key) {
 			return StreetsideURL.string2URL(MainWebsite.BASE_URL, "developer/api-documentation/images/traffic_sign/" + key + ".png");
-		}
+		}*/
 	}
 
@@ -286,7 +286,7 @@
 	 * @return the URL where you'll find the upload secrets as JSON
 	 */
-	public static URL uploadSecretsURL() {
+	/*public static URL uploadSecretsURL() {
 		return StreetsideURL.string2URL(StreetsideURL.BASE_API_V2_URL, "me/uploads/secrets", StreetsideURL.queryString(null));
-	}
+	}*/
 
 	/**
@@ -309,4 +309,7 @@
 			}
 		}
+
+		Logging.info(I18n.tr("queryString result: {0}", ret.toString()));
+
 		return ret.toString();
 	}
@@ -331,4 +334,6 @@
 			}
 		}
+		Logging.info(I18n.tr("queryStreetsideBoundsString result: {0}", ret.toString()));
+
 		return ret.toString();
 	}
@@ -343,4 +348,5 @@
 			Logging.error(e); // This should not happen, as the encoding is hard-coded
 		}
+		Logging.info(I18n.tr("queryById result: {0}", ret.toString()));
 		return ret.toString();
 	}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideUtils.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideUtils.java	(revision 34353)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideUtils.java	(revision 34358)
@@ -8,5 +8,8 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -16,5 +19,4 @@
 import org.apache.commons.imaging.common.RationalNumber;
 import org.apache.commons.imaging.formats.tiff.constants.GpsTagConstants;
-
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -283,3 +285,24 @@
     MainApplication.getMap().statusLine.setHelpText(ret.toString());
   }
+
+  public static List<StreetsideAbstractImage> sortImagesInSequence(List<StreetsideAbstractImage> images) {
+    List<StreetsideAbstractImage> res = new ArrayList<StreetsideAbstractImage>();
+    if (images != null && images.size() > 0) {
+      res.add(images.get(0));
+      images.remove(0);
+      String nextImageId = Long.toString(images.get(0).getNe());
+      if (nextImageId != null) {
+        Iterator<StreetsideAbstractImage> iter = images.iterator();
+        while (iter.hasNext()) {
+          StreetsideAbstractImage current = (StreetsideAbstractImage) iter.next();
+          if (nextImageId.equals(current.getId())) {
+            res.add(current);
+            images.remove(current);
+          }
+        }
+      }
+    }
+
+    return res;
+  }
 }
