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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideImage.java	(revision 34416)
@@ -63,8 +63,4 @@
   }
 
-  public StreetsideImage(String id, LatLon latLon) {
-    super(id, latLon, 0.0);
-  }
-
   public StreetsideImage(String id, double la, double lo) {
     super(id, new LatLon(la,lo), 0.0);
@@ -97,5 +93,4 @@
   public String toString() {
     return String.format(
-      // TODO: format date cd (Gradle build error command line)
       "Image[id=%s,lat=%f,lon=%f,he=%f,user=%s]",
       id, latLon.lat(), latLon.lon(), he, "null"//, cd
@@ -128,11 +123,5 @@
 
   private void checkModified() {
-    if (StreetsideLayer.hasInstance()) {
-      if (isModified()) {
-        StreetsideLayer.getInstance().getLocationChangeset().add(this);
-      } else {
-        StreetsideLayer.getInstance().getLocationChangeset().remove(this);
-      }
-    }
+    // modifications not currently supported in Streetside
   }
 
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLayer.java	(revision 34416)
@@ -43,5 +43,4 @@
 import org.openstreetmap.josm.plugins.streetside.io.download.StreetsideDownloader.DOWNLOAD_MODE;
 import org.openstreetmap.josm.plugins.streetside.mode.AbstractMode;
-import org.openstreetmap.josm.plugins.streetside.mode.JoinMode;
 import org.openstreetmap.josm.plugins.streetside.mode.SelectMode;
 import org.openstreetmap.josm.plugins.streetside.utils.MapViewGeometryUtil;
@@ -90,5 +89,4 @@
 
 	private volatile TexturePaint hatched;
-	private final StreetsideLocationChangeset locationChangeset = new StreetsideLocationChangeset();
 
 	private StreetsideLayer() {
@@ -190,14 +188,4 @@
 		return data;
 	}
-
-  /**
-   * Returns the {@link StreetsideLocationChangeset} object, which acts as the database of the
-   * Layer.
-   *
-   * @return The {@link StreetsideData} object that stores the database.
-   */
-  public StreetsideLocationChangeset getLocationChangeset() {
-    return locationChangeset;
-  }
 
   /**
@@ -314,7 +302,4 @@
         drawImageMarker(g, imageAbs);
       }
-    }
-    if (mode instanceof JoinMode) {
-      mode.paint(g, mv, box);
     }
   }
@@ -504,6 +489,6 @@
     }
     if (MainApplication.isDisplayingMapView()) {
-      StreetsideMainDialog.getInstance().redButton.setEnabled(nearestImages.length >= 1);
-      StreetsideMainDialog.getInstance().blueButton.setEnabled(nearestImages.length >= 2);
+      //StreetsideMainDialog.getInstance().redButton.setEnabled(nearestImages.length >= 1);
+      //StreetsideMainDialog.getInstance().blueButton.setEnabled(nearestImages.length >= 2);
     }
     if (nearestImages.length >= 1) {
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLocationChangeset.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLocationChangeset.java	(revision 34412)
+++ 	(revision )
@@ -1,53 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside;
-
-import java.util.AbstractSet;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideChangesetListener;
-
-public class StreetsideLocationChangeset extends AbstractSet<StreetsideImage> {
-  private final Set<StreetsideChangesetListener> listeners = new HashSet<>();
-  private final Set<StreetsideImage> changeset = Collections.newSetFromMap(new ConcurrentHashMap<>());
-
-  public void addChangesetListener(StreetsideChangesetListener listener) {
-    listeners.add(listener);
-  }
-
-  public void cleanChangeset() {
-    changeset.clear();
-    fireListeners();
-  }
-
-  private void fireListeners() {
-    listeners.forEach(StreetsideChangesetListener::changesetChanged);
-  }
-
-  @Override
-  public boolean add(StreetsideImage image) {
-    boolean add = changeset.add(image);
-    fireListeners();
-    return add;
-  }
-
-  @Override
-  public Iterator<StreetsideImage> iterator() {
-    return changeset.iterator();
-  }
-
-  @Override
-  public int size() {
-    return changeset.size();
-  }
-
-  @Override
-  public boolean remove(Object image) {
-    boolean remove = changeset.remove(image);
-    fireListeners();
-    return remove;
-  }
-}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsidePlugin.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsidePlugin.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsidePlugin.java	(revision 34416)
@@ -13,5 +13,4 @@
 import org.openstreetmap.josm.plugins.streetside.actions.StreetsideDownloadViewAction;
 import org.openstreetmap.josm.plugins.streetside.actions.StreetsideExportAction;
-import org.openstreetmap.josm.plugins.streetside.actions.StreetsideJoinAction;
 import org.openstreetmap.josm.plugins.streetside.actions.StreetsideWalkAction;
 import org.openstreetmap.josm.plugins.streetside.actions.StreetsideZoomAction;
@@ -20,10 +19,9 @@
 import org.openstreetmap.josm.plugins.streetside.gui.StreetsidePreferenceSetting;
 import org.openstreetmap.josm.plugins.streetside.gui.StreetsideViewerDialog;
+import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.ImageInfoHelpPopup;
 import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.ImageInfoPanel;
 import org.openstreetmap.josm.plugins.streetside.oauth.StreetsideUser;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
 import org.openstreetmap.josm.tools.ImageProvider;
-
-import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.ImageInfoHelpPopup;
 
 /**
@@ -45,5 +43,5 @@
       MainMenu.add(MainApplication.getMenu().viewMenu, ZOOM_ACTION, false, 15);
       MainMenu.add(MainApplication.getMenu().fileMenu, new StreetsideDownloadViewAction(), false, 14);
-      MainMenu.add(MainApplication.getMenu().dataMenu, new StreetsideJoinAction(), false);
+      //MainMenu.add(MainApplication.getMenu().dataMenu, new StreetsideJoinAction(), false);
       MainMenu.add(MainApplication.getMenu().moreToolsMenu, WALK_ACTION, false);
     }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideJoinAction.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/StreetsideJoinAction.java	(revision 34412)
+++ 	(revision )
@@ -1,56 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
-import org.openstreetmap.josm.plugins.streetside.mode.JoinMode;
-import org.openstreetmap.josm.plugins.streetside.mode.SelectMode;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
-
-/**
- * Changes the mode of the Layer, from Select mode to Join mode and vice versa.
- *
- * @author nokutu
- *
- */
-public class StreetsideJoinAction extends JosmAction {
-
-  private static final long serialVersionUID = -7082300908202843706L;
-
-  /**
-   * Main constructor.
-   */
-  public StreetsideJoinAction() {
-    super(tr("Join mode"), new ImageProvider("mapmode", "streetside-join").setSize(ImageSizes.DEFAULT),
-        tr("Join/unjoin pictures"), null, false, "streetsideJoin", true);
-  }
-
-  @Override
-  public void actionPerformed(ActionEvent arg0) {
-    if (StreetsideLayer.getInstance().mode instanceof SelectMode) {
-      StreetsideLayer.getInstance().setMode(new JoinMode());
-    } else {
-      StreetsideLayer.getInstance().setMode(new SelectMode());
-    }
-  }
-
-  @Override
-  protected boolean listenToSelectionChange() {
-    return false;
-  }
-
-  /**
-   * Enabled when mapillary layer is the active layer
-   */
-  @Override
-  protected void updateEnabledState() {
-    super.updateEnabledState();
-    setEnabled(MainApplication.getLayerManager().getActiveLayer() instanceof StreetsideLayer);
-  }
-}
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/WalkThread.java	(revision 34416)
@@ -3,7 +3,9 @@
 
 import java.awt.image.BufferedImage;
+import java.text.MessageFormat;
 
 import javax.swing.SwingUtilities;
 
+import org.apache.log4j.Logger;
 import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
 import org.openstreetmap.josm.plugins.streetside.StreetsideData;
@@ -30,4 +32,6 @@
   private BufferedImage lastImage;
   private volatile boolean paused;
+
+  final static Logger logger = Logger.getLogger(WalkThread.class);
 
   /**
@@ -65,7 +69,4 @@
             StreetsideAbstractImage currentImage = image.next();
         	  preDownloadImages((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.FULL_IMAGE);
-        	  /*if (StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get().booleanValue()) {
-          	  preDownloadCubemaps((StreetsideImage) currentImage, 3);
-            }*/
           }
         }
@@ -100,5 +101,8 @@
       }
     } catch (NullPointerException e) {
-      // TODO: Avoid NPEs instead of waiting until they are thrown and then catching them
+      if(StreetsideProperties.DEBUGING_ENABLED.get()) {
+        logger.debug(MessageFormat.format("Exception thrown in WalkThread: {0}", e.getMessage()));
+        e.printStackTrace();
+      }
       return;
     }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CameraTransformer.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CameraTransformer.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CameraTransformer.java	(revision 34416)
@@ -1,8 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.streetside.cubemap;
-
-/**
- * @author Dub
- */
 
 import javafx.scene.Group;
@@ -15,171 +11,171 @@
 public class CameraTransformer extends Group {
 
-	public enum RotateOrder {
-		XYZ, XZY, YXZ, YZX, ZXY, ZYX
-	}
+  public enum RotateOrder {
+    XYZ, XZY, YXZ, YZX, ZXY, ZYX
+  }
 
-	public Translate t = new Translate();
-	public Translate p = new Translate();
-	public Translate ip = new Translate();
-	public Rotate rx = new Rotate();
-	{
-		rx.setAxis(Rotate.X_AXIS);
-	}
-	public Rotate ry = new Rotate();
-	{
-		ry.setAxis(Rotate.Y_AXIS);
-	}
-	public Rotate rz = new Rotate();
-	{
-		rz.setAxis(Rotate.Z_AXIS);
-	}
-	public Scale s = new Scale();
+  public Translate t = new Translate();
+  public Translate p = new Translate();
+  public Translate ip = new Translate();
+  public Rotate rx = new Rotate();
+  {
+    rx.setAxis(Rotate.X_AXIS);
+  }
+  public Rotate ry = new Rotate();
+  {
+    ry.setAxis(Rotate.Y_AXIS);
+  }
+  public Rotate rz = new Rotate();
+  {
+    rz.setAxis(Rotate.Z_AXIS);
+  }
+  public Scale s = new Scale();
 
-	public CameraTransformer() {
-		super();
-		getTransforms().addAll(t, rz, ry, rx, s);
-	}
+  public CameraTransformer() {
+    super();
+    getTransforms().addAll(t, rz, ry, rx, s);
+  }
 
-	public CameraTransformer(CameraTransformer.RotateOrder rotateOrder) {
-		super();
-		switch (rotateOrder) {
-		case XYZ:
-			getTransforms().addAll(t, p, rz, ry, rx, s, ip);
-			break;
-		case XZY:
-			getTransforms().addAll(t, p, ry, rz, rx, s, ip);
-			break;
-		case YXZ:
-			getTransforms().addAll(t, p, rz, rx, ry, s, ip);
-			break;
-		case YZX:
-			getTransforms().addAll(t, p, rx, rz, ry, s, ip); // For Camera
-			break;
-		case ZXY:
-			getTransforms().addAll(t, p, ry, rx, rz, s, ip);
-			break;
-		case ZYX:
-			getTransforms().addAll(t, p, rx, ry, rz, s, ip);
-			break;
-		}
-	}
+  public CameraTransformer(CameraTransformer.RotateOrder rotateOrder) {
+    super();
+    switch (rotateOrder) {
+    case XYZ:
+      getTransforms().addAll(t, p, rz, ry, rx, s, ip);
+      break;
+    case XZY:
+      getTransforms().addAll(t, p, ry, rz, rx, s, ip);
+      break;
+    case YXZ:
+      getTransforms().addAll(t, p, rz, rx, ry, s, ip);
+      break;
+    case YZX:
+      getTransforms().addAll(t, p, rx, rz, ry, s, ip); // For Camera
+      break;
+    case ZXY:
+      getTransforms().addAll(t, p, ry, rx, rz, s, ip);
+      break;
+    case ZYX:
+      getTransforms().addAll(t, p, rx, ry, rz, s, ip);
+      break;
+    }
+  }
 
-	public void setTranslate(double x, double y, double z) {
-		t.setX(x);
-		t.setY(y);
-		t.setZ(z);
-	}
+  public void setTranslate(double x, double y, double z) {
+    t.setX(x);
+    t.setY(y);
+    t.setZ(z);
+  }
 
-	public void setTranslate(double x, double y) {
-		t.setX(x);
-		t.setY(y);
-	}
+  public void setTranslate(double x, double y) {
+    t.setX(x);
+    t.setY(y);
+  }
 
-	public void setTx(double x) {
-		t.setX(x);
-	}
+  public void setTx(double x) {
+    t.setX(x);
+  }
 
-	public void setTy(double y) {
-		t.setY(y);
-	}
+  public void setTy(double y) {
+    t.setY(y);
+  }
 
-	public void setTz(double z) {
-		t.setZ(z);
-	}
+  public void setTz(double z) {
+    t.setZ(z);
+  }
 
-	public void setRotate(double x, double y, double z) {
-		rx.setAngle(x);
-		ry.setAngle(y);
-		rz.setAngle(z);
-	}
+  public void setRotate(double x, double y, double z) {
+    rx.setAngle(x);
+    ry.setAngle(y);
+    rz.setAngle(z);
+  }
 
-	public void setRotateX(double x) {
-		rx.setAngle(x);
-	}
+  public void setRotateX(double x) {
+    rx.setAngle(x);
+  }
 
-	public void setRotateY(double y) {
-		ry.setAngle(y);
-	}
+  public void setRotateY(double y) {
+    ry.setAngle(y);
+  }
 
-	public void setRotateZ(double z) {
-		rz.setAngle(z);
-	}
+  public void setRotateZ(double z) {
+    rz.setAngle(z);
+  }
 
-	public void setRx(double x) {
-		rx.setAngle(x);
-	}
+  public void setRx(double x) {
+    rx.setAngle(x);
+  }
 
-	public void setRy(double y) {
-		ry.setAngle(y);
-	}
+  public void setRy(double y) {
+    ry.setAngle(y);
+  }
 
-	public void setRz(double z) {
-		rz.setAngle(z);
-	}
+  public void setRz(double z) {
+    rz.setAngle(z);
+  }
 
-	public void setScale(double scaleFactor) {
-		s.setX(scaleFactor);
-		s.setY(scaleFactor);
-		s.setZ(scaleFactor);
-	}
+  public void setScale(double scaleFactor) {
+    s.setX(scaleFactor);
+    s.setY(scaleFactor);
+    s.setZ(scaleFactor);
+  }
 
-	public void setScale(double x, double y, double z) {
-		s.setX(x);
-		s.setY(y);
-		s.setZ(z);
-	}
+  public void setScale(double x, double y, double z) {
+    s.setX(x);
+    s.setY(y);
+    s.setZ(z);
+  }
 
-	public void setSx(double x) {
-		s.setX(x);
-	}
+  public void setSx(double x) {
+    s.setX(x);
+  }
 
-	public void setSy(double y) {
-		s.setY(y);
-	}
+  public void setSy(double y) {
+    s.setY(y);
+  }
 
-	public void setSz(double z) {
-		s.setZ(z);
-	}
+  public void setSz(double z) {
+    s.setZ(z);
+  }
 
-	public void setPivot(double x, double y, double z) {
-		p.setX(x);
-		p.setY(y);
-		p.setZ(z);
-		ip.setX(-x);
-		ip.setY(-y);
-		ip.setZ(-z);
-	}
+  public void setPivot(double x, double y, double z) {
+    p.setX(x);
+    p.setY(y);
+    p.setZ(z);
+    ip.setX(-x);
+    ip.setY(-y);
+    ip.setZ(-z);
+  }
 
-	public void reset() {
-		t.setX(0.0);
-		t.setY(0.0);
-		t.setZ(0.0);
-		rx.setAngle(0.0);
-		ry.setAngle(0.0);
-		rz.setAngle(0.0);
-		s.setX(1.0);
-		s.setY(1.0);
-		s.setZ(1.0);
-		p.setX(0.0);
-		p.setY(0.0);
-		p.setZ(0.0);
-		ip.setX(0.0);
-		ip.setY(0.0);
-		ip.setZ(0.0);
-	}
+  public void reset() {
+    t.setX(0.0);
+    t.setY(0.0);
+    t.setZ(0.0);
+    rx.setAngle(0.0);
+    ry.setAngle(0.0);
+    rz.setAngle(0.0);
+    s.setX(1.0);
+    s.setY(1.0);
+    s.setZ(1.0);
+    p.setX(0.0);
+    p.setY(0.0);
+    p.setZ(0.0);
+    ip.setX(0.0);
+    ip.setY(0.0);
+    ip.setZ(0.0);
+  }
 
-	public void resetTSP() {
-		t.setX(0.0);
-		t.setY(0.0);
-		t.setZ(0.0);
-		s.setX(1.0);
-		s.setY(1.0);
-		s.setZ(1.0);
-		p.setX(0.0);
-		p.setY(0.0);
-		p.setZ(0.0);
-		ip.setX(0.0);
-		ip.setY(0.0);
-		ip.setZ(0.0);
-	}
+  public void resetTSP() {
+    t.setX(0.0);
+    t.setY(0.0);
+    t.setZ(0.0);
+    s.setX(1.0);
+    s.setY(1.0);
+    s.setZ(1.0);
+    p.setX(0.0);
+    p.setY(0.0);
+    p.setZ(0.0);
+    ip.setX(0.0);
+    ip.setY(0.0);
+    ip.setZ(0.0);
+  }
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBox.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBox.java	(revision 34416)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBox.java	(revision 34416)
@@ -0,0 +1,263 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.streetside.cubemap;
+
+import java.awt.image.BufferedImage;
+
+import javafx.animation.AnimationTimer;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.Group;
+import javafx.scene.PerspectiveCamera;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.transform.Affine;
+import javafx.scene.transform.Rotate;
+import javafx.scene.transform.Transform;
+
+/**
+ * @author renerr18
+ */
+@SuppressWarnings("restriction")
+public class CubemapBox extends Group {
+
+  public enum CubemapBoxImageType {
+    MULTIPLE, SINGLE
+  }
+
+  private final Affine affine = new Affine();
+
+  private final ImageView front = new ImageView(), right = new ImageView(), back = new ImageView(),
+    left = new ImageView(), up = new ImageView(), down = new ImageView();
+
+  {
+    front.setId(CubemapUtils.CubemapFaces.FRONT.getValue());
+    right.setId(CubemapUtils.CubemapFaces.RIGHT.getValue());
+    back.setId(CubemapUtils.CubemapFaces.BACK.getValue());
+    left.setId(CubemapUtils.CubemapFaces.LEFT.getValue());
+    up.setId(CubemapUtils.CubemapFaces.UP.getValue());
+    down.setId(CubemapUtils.CubemapFaces.DOWN.getValue());
+
+  }
+  private final ImageView[] views = new ImageView[] { front, right, back, left, up, down };
+
+  private Image frontImg, rightImg, backImg, leftImg, upImg, downImg, singleImg;
+
+  private final PerspectiveCamera camera;
+  private AnimationTimer timer;
+  private final CubemapBoxImageType imageType;
+
+ public CubemapBox(
+    Image frontImg, Image rightImg, Image backImg, Image leftImg, Image upImg, Image downImg, double size,
+    PerspectiveCamera camera) {
+
+    super();
+
+    imageType = CubemapBoxImageType.MULTIPLE;
+
+    this.frontImg = frontImg;
+    this.rightImg = rightImg;
+    this.backImg = backImg;
+    this.leftImg = leftImg;
+    this.upImg = upImg;
+    this.downImg = downImg;
+    this.size.set(size);
+    this.camera = camera;
+
+    loadImageViews();
+
+    getTransforms().add(affine);
+
+    getChildren().addAll(views);
+
+    startTimer();
+  }
+
+  public void loadImageViews() {
+
+    for (ImageView iv : views) {
+      iv.setSmooth(true);
+      iv.setPreserveRatio(true);
+    }
+
+    validateImageType();
+  }
+
+  private void layoutViews() {
+
+    for (ImageView v : views) {
+      v.setFitWidth(getSize());
+      v.setFitHeight(getSize());
+    }
+
+    back.setTranslateX(-0.5 * getSize());
+    back.setTranslateY(-0.5 * getSize());
+    back.setTranslateZ(-0.5 * getSize());
+
+    front.setTranslateX(-0.5 * getSize());
+    front.setTranslateY(-0.5 * getSize());
+    front.setTranslateZ(0.5 * getSize());
+    front.setRotationAxis(Rotate.Z_AXIS);
+    front.setRotate(-180);
+    front.getTransforms().add(new Rotate(180, front.getFitHeight() / 2, 0, 0, Rotate.X_AXIS));
+    front.setTranslateY(front.getTranslateY() - getSize());
+
+    up.setTranslateX(-0.5 * getSize());
+    up.setTranslateY(-1 * getSize());
+    up.setRotationAxis(Rotate.X_AXIS);
+    up.setRotate(-90);
+
+    down.setTranslateX(-0.5 * getSize());
+    down.setTranslateY(0);
+    down.setRotationAxis(Rotate.X_AXIS);
+    down.setRotate(90);
+
+    left.setTranslateX(-1 * getSize());
+    left.setTranslateY(-0.5 * getSize());
+    left.setRotationAxis(Rotate.Y_AXIS);
+    left.setRotate(90);
+
+    right.setTranslateX(0);
+    right.setTranslateY(-0.5 * getSize());
+    right.setRotationAxis(Rotate.Y_AXIS);
+    right.setRotate(-90);
+
+  }
+
+  /**
+   * for single image creates viewports and sets all views(image) to singleImg for multiple... sets images per view.
+   */
+  private void validateImageType() {
+    switch (imageType) {
+    case SINGLE:
+      loadSingleImageViewports();
+      break;
+    case MULTIPLE:
+      setMultipleImages();
+      break;
+    }
+  }
+
+  private void loadSingleImageViewports() {
+    layoutViews();
+    double width = singleImg.getWidth(), height = singleImg.getHeight();
+
+    // simple check to see if cells will be square
+    if (width / 4 != height / 3) {
+      throw new UnsupportedOperationException("Image does not comply with size constraints");
+    }
+    double cellSize = singleImg.getWidth() - singleImg.getHeight();
+
+    recalculateSize(cellSize);
+
+    double topx = cellSize, topy = 0,
+
+      botx = cellSize, boty = cellSize * 2,
+
+      leftx = 0, lefty = cellSize,
+
+      rightx = cellSize * 2, righty = cellSize,
+
+      fwdx = cellSize, fwdy = cellSize,
+
+      backx = cellSize * 3, backy = cellSize;
+
+    // add top padding x+, y+, width-, height
+    up.setViewport(new Rectangle2D(topx, topy, cellSize, cellSize));
+
+    // add left padding x, y+, width, height-
+    left.setViewport(new Rectangle2D(leftx, lefty, cellSize - 1, cellSize - 1));
+
+    // add front padding x+, y+, width-, height
+    front.setViewport(new Rectangle2D(fwdx, fwdy, cellSize, cellSize));
+
+    // add right padding x, y+, width, height-
+    right.setViewport(new Rectangle2D(rightx, righty, cellSize, cellSize));
+
+    // add back padding x, y+, width, height-
+    back.setViewport(new Rectangle2D(backx + 1, backy - 1, cellSize - 1, cellSize - 1));
+
+    // add bottom padding x+, y, width-, height-
+    down.setViewport(new Rectangle2D(botx, boty, cellSize, cellSize));
+
+    for (ImageView v : views) {
+      v.setImage(singleImg);
+    }
+  }
+
+  private void recalculateSize(double cell) {
+    double factor = Math.floor(getSize() / cell);
+    setSize(cell * factor);
+  }
+
+  public synchronized void setImage(BufferedImage img, int position) {
+    views[position].setImage(GraphicsUtils.convertBufferedImage2JavaFXImage(img));
+
+  }
+
+  private void setMultipleImages() {
+    GraphicsUtils.PlatformHelper.run(() -> {
+      layoutViews();
+      front.setImage(frontImg);
+      right.setImage(rightImg);
+      back.setImage(backImg);
+      left.setImage(leftImg);
+      up.setImage(upImg);
+      down.setImage(downImg);
+
+    });
+  }
+
+  public void startTimer() {
+    timer = new AnimationTimer() {
+      @Override
+      public void handle(long now) {
+        Transform ct = (camera != null) ? camera.getLocalToSceneTransform() : null;
+        if (ct != null) {
+          affine.setTx(ct.getTx());
+          affine.setTy(ct.getTy());
+          affine.setTz(ct.getTz());
+        }
+      }
+    };
+    timer.start();
+  }
+
+  /*
+   * Properties
+   */
+  private final DoubleProperty size = new SimpleDoubleProperty() {
+    @Override
+    protected void invalidated() {
+      switch (imageType) {
+      case SINGLE:
+        layoutViews();
+        break;
+      case MULTIPLE:
+        break;
+      }
+
+    }
+  };
+
+  public final double getSize() {
+    return size.get();
+  }
+
+  public final void setSize(double value) {
+    size.set(value);
+  }
+
+  public DoubleProperty sizeProperty() {
+    return size;
+  }
+
+  public ImageView[] getViews() {
+    return views;
+  }
+}
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/CubemapBuilder.java	(revision 34416)
@@ -19,5 +19,4 @@
 import org.openstreetmap.josm.plugins.streetside.gui.StreetsideViewerDialog;
 import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.StreetsideViewerPanel;
-import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
 
@@ -193,4 +192,27 @@
 		}
 	}
+
+	@Override
+  public void tilesAdded(String[] tileIds) {
+    // determine whether all tiles have been set for each of the
+    // six cubemap faces. If so, build the images for the faces
+    // and set the views in the cubemap box.
+
+    int tileCount = 0;
+
+    tileCount = CubemapBuilder.getInstance().getTileImages().keySet().size();
+
+    int maxCols = StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get() ? 4 : 2;
+    int maxRows = StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get() ? 4 : 2;
+
+    if (tileCount == (CubemapUtils.NUM_SIDES * maxCols * maxRows)) {
+      if (StreetsideProperties.DEBUGING_ENABLED.get()) {
+        logger.debug(MessageFormat.format("{0} tile images ready for building cumbemap faces for cubemap {1}.", tileCount,
+          CubemapBuilder.getInstance().getCubemap().getId()));
+      }
+
+      buildCubemapFaces();
+    }
+  }
 
 	private void buildCubemapFaces() {
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/ITileDownloadingTaskListener.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/ITileDownloadingTaskListener.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/cubemap/ITileDownloadingTaskListener.java	(revision 34416)
@@ -12,6 +12,12 @@
  /**
  * Fired when a cubemap tile image is downloaded by a download worker.
- * @param imageId image id 
+ * @param imageId image id
  */
  void tileAdded(String imageId);
+
+ /**
+  * Fired when multiple cubemap tile images are downloaded by a download worker.
+  * @param imageId image id
+  */
+  void tilesAdded(String[] imageId);
 }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideMainDialog.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideMainDialog.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideMainDialog.java	(revision 34416)
@@ -3,5 +3,4 @@
 
 import java.awt.BorderLayout;
-import java.awt.Color;
 import java.awt.Component;
 import java.awt.event.ActionEvent;
@@ -9,5 +8,4 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 
@@ -15,6 +13,4 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.JComponent;
-import javax.swing.KeyStroke;
 import javax.swing.SwingUtilities;
 
@@ -61,18 +57,18 @@
 	private volatile StreetsideAbstractImage image;
 
-	public final SideButton nextButton = new SideButton(new NextPictureAction());
+	/*public final SideButton nextButton = new SideButton(new NextPictureAction());
 	public final SideButton previousButton = new SideButton(new PreviousPictureAction());
-	/**
+	*//**
 	 * Button used to jump to the image following the red line
-	 */
+	 *//*
 	public final SideButton redButton = new SideButton(new RedAction());
-	/**
+	*//**
 	 * Button used to jump to the image following the blue line
-	 */
+	 *//*
 	public final SideButton blueButton = new SideButton(new BlueAction());
 
 	private final SideButton playButton = new SideButton(new PlayAction());
 	private final SideButton pauseButton = new SideButton(new PauseAction());
-	private final SideButton stopButton = new SideButton(new StopAction());
+	private final SideButton stopButton = new SideButton(new StopAction());*/
 
 	private ImageInfoHelpPopup imageInfoHelp;
@@ -111,8 +107,7 @@
 		streetsideImageDisplay = new StreetsideImageDisplay();
 
-		blueButton.setForeground(Color.BLUE);
-		redButton.setForeground(Color.RED);
-
-		// TODO: Modes for cubemaps? @rrh
+		/*blueButton.setForeground(Color.BLUE);
+		redButton.setForeground(Color.RED);*/
+
 		setMode(MODE.NORMAL);
 	}
@@ -122,5 +117,5 @@
 	 */
 	private void addShortcuts() {
-		nextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+		/*nextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
 				KeyStroke.getKeyStroke("PAGE_DOWN"), "next");
 		nextButton.getActionMap().put("next", new NextPictureAction());
@@ -134,5 +129,5 @@
 		redButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
 				KeyStroke.getKeyStroke("control PAGE_DOWN"), "red");
-		redButton.getActionMap().put("red", new RedAction());
+		redButton.getActionMap().put("red", new RedAction());*/
 	}
 
@@ -181,5 +176,5 @@
 			createLayout(
 				streetsideImageDisplay,
-				Arrays.asList(playButton, pauseButton, stopButton)
+				null//Arrays.asList(playButton, pauseButton, stopButton)
 			);
 		case NORMAL:
@@ -187,8 +182,8 @@
 			createLayout(
 		        streetsideImageDisplay,
-		        Arrays.asList(blueButton, previousButton, nextButton, redButton)
+		        null//Arrays.asList(blueButton, previousButton, nextButton, redButton)
 		    );
 		}
-		disableAllButtons();
+		//disableAllButtons();
 		if (MODE.NORMAL.equals(mode)) {
 			updateImage();
@@ -227,5 +222,5 @@
 				streetsideImageDisplay.setImage(null, null);
 				setTitle(I18n.tr(StreetsideMainDialog.BASE_TITLE));
-				disableAllButtons();
+				//disableAllButtons();
 				return;
 			}
@@ -238,6 +233,6 @@
 
 			// Enables/disables next/previous buttons
-			nextButton.setEnabled(false);
-			previousButton.setEnabled(false);
+			/*nextButton.setEnabled(false);
+			previousButton.setEnabled(false);*/
 			if (image.getSequence() != null) {
 				StreetsideAbstractImage tempImage = image;
@@ -245,5 +240,5 @@
 					tempImage = tempImage.next();
 					if (tempImage.isVisible()) {
-						nextButton.setEnabled(true);
+						//nextButton.setEnabled(true);
 						break;
 					}
@@ -255,5 +250,5 @@
 					tempImage = tempImage.previous();
 					if (tempImage.isVisible()) {
-						previousButton.setEnabled(true);
+						//previousButton.setEnabled(true);
 						break;
 					}
@@ -297,10 +292,10 @@
 	 * Disables all the buttons in the dialog
 	 */
-	public /*private*/ void disableAllButtons() {
+	/*public private void disableAllButtons() {
 		nextButton.setEnabled(false);
 		previousButton.setEnabled(false);
 		blueButton.setEnabled(false);
 		redButton.setEnabled(false);
-	}
+	}*/
 
 	/**
@@ -316,5 +311,4 @@
 	 * Updates the title of the dialog.
 	 */
-	// TODO: update title for 360 degree viewer? @rrh
 	public synchronized void updateTitle() {
 		if (!SwingUtilities.isEventDispatchThread()) {
@@ -442,5 +436,4 @@
 		}
 
-		// TODO: BlueAction for cubemaps?
 		@Override
 		public void actionPerformed(ActionEvent e) {
@@ -609,38 +602,3 @@
 		this.streetsideImageDisplay = streetsideImageDisplay;
 	}
-
-	/**
-	 * @return the streetsideImageDisplay
-	 */
-	/*public StreetsideViewerDisplay getStreetsideViewerDisplay() {
-		return streetsideViewerDisplay;
-	}*/
-
-	/**
-	 * @param streetsideImageDisplay the streetsideImageDisplay to set
-	 */
-	/*public void setStreetsideViewerDisplay(StreetsideViewerDisplay streetsideViewerDisplay) {
-		streetsideViewerDisplay = streetsideViewerDisplay;
-	}*/
-
-	/*private StreetsideViewerDisplay initStreetsideViewerDisplay() {
-		StreetsideViewerDisplay res = new StreetsideViewerDisplay();
-        //this.add(streetsideViewerDisplay);
-
-
-		Platform.runLater(new Runnable() {
-            @Override
-            public void run() {
-            	Scene scene;
-				try {
-					scene = StreetsideViewerDisplay.createScene();
-					res.setScene(scene);
-				} catch (NonInvertibleTransformException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-            }
-       });
-		return res;
-	}*/
 }
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideViewerDialog.java	(revision 34416)
@@ -31,5 +31,4 @@
 
 	private StreetsideViewerDialog() {
-	  // TODO: I18n support in all languages?
 	  super(StreetsideViewerDialog.BASE_TITLE, "streetside-viewer", "Open Streetside Viewer window",
 				null, 200, true, StreetsidePreferenceSetting.class);
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/AddTagToPrimitiveAction.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/AddTagToPrimitiveAction.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/AddTagToPrimitiveAction.java	(revision 34416)
@@ -47,5 +47,4 @@
           Main.parent,
           "<html>" +
-            // TODO: tr( RRH
             I18n.tr("A tag with key <i>{0}</i> is already present on the selected OSM object.", tag.getKey()) + "<br>" +
             I18n.tr(
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ImageInfoPanel.java	(revision 34416)
@@ -2,15 +2,10 @@
 package org.openstreetmap.josm.plugins.streetside.gui.imageinfo;
 
-import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.Insets;
 import java.awt.datatransfer.StringSelection;
-import java.awt.image.BufferedImage;
 import java.util.Collection;
 
-import javax.swing.ImageIcon;
-import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -29,5 +24,4 @@
 import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.SelectableLabel;
 import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton;
-import org.openstreetmap.josm.plugins.streetside.model.UserProfile;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL;
@@ -40,9 +34,5 @@
 
   private static ImageInfoPanel instance;
-  private static final ImageIcon EMPTY_USER_AVATAR = new ImageIcon(new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB));
-
-  private final JLabel numDetectionsLabel;
-  private final JCheckBox showDetectionsCheck;
-  private final JLabel usernameLabel;
+
   private final JTextPane imgKeyValue;
   private final WebLinkAction imgLinkAction;
@@ -55,5 +45,5 @@
   private ImageInfoPanel() {
     super(
-      I18n.tr("Streetside Image info"),
+      I18n.tr("Streetside 360° image info"),
       "streetside-info",
       I18n.tr("Displays detail information on the currently selected Streetside image"),
@@ -63,19 +53,4 @@
     SelectionEventManager.getInstance().addSelectionListener(this);
 
-    numDetectionsLabel = new JLabel();
-    numDetectionsLabel.setFont(numDetectionsLabel.getFont().deriveFont(Font.PLAIN));
-
-    showDetectionsCheck = new JCheckBox(I18n.tr("Show detections on top of image"));
-     showDetectionsCheck.setSelected(StreetsideProperties.SHOW_DETECTED_SIGNS.get());
-     showDetectionsCheck.addActionListener(
-      action -> StreetsideProperties.SHOW_DETECTED_SIGNS.put(showDetectionsCheck.isSelected())
-    );
-    StreetsideProperties.SHOW_DETECTED_SIGNS.addListener(
-      valueChange -> showDetectionsCheck.setSelected(StreetsideProperties.SHOW_DETECTED_SIGNS.get())
-    );
-
-    usernameLabel = new JLabel();
-    usernameLabel.setFont(usernameLabel.getFont().deriveFont(Font.PLAIN));
-
     imgKeyValue = new SelectableLabel();
 
@@ -88,49 +63,50 @@
     addStreetsideTagAction = new AddTagToPrimitiveAction(I18n.tr("Add Streetside tag"));
 
-    JPanel imgKey = new JPanel();
-    imgKey.add(imgKeyValue);
-    imgKey.add(copyButton);
-    JPanel imgButtons = new JPanel();
-    imgButtons.add(new StreetsideButton(imgLinkAction, true));
-    imgButtons.add(new StreetsideButton(addStreetsideTagAction, true));
     seqKeyValue = new SelectableLabel();
 
     JPanel root = new JPanel(new GridBagLayout());
+
     GridBagConstraints gbc = new GridBagConstraints();
     gbc.insets = new Insets(0, 5, 0, 5);
 
-    // Left column
+    gbc.fill = GridBagConstraints.HORIZONTAL;
     gbc.gridx = 0;
     gbc.gridy = 0;
-    gbc.anchor = GridBagConstraints.LINE_END;
-    gbc.gridwidth = 1;
-    gbc.gridheight = 2;
-    root.add(new JLabel(I18n.tr("Image detections")), gbc);
-    gbc.gridy += 2;
-    gbc.gridheight = 1;
-    root.add(new JLabel(I18n.tr("User")), gbc);
-    gbc.gridy++;
     root.add(new JLabel(I18n.tr("Image actions")), gbc);
-    gbc.gridy++;
+
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.weightx = 0.5;
+    gbc.gridx = 0;
+    gbc.gridy = 1;
     root.add(new JLabel(I18n.tr("Image key")), gbc);
-    gbc.gridy++;
+
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.weightx = 0.5;
+    gbc.gridx = 0;
+    gbc.gridy = 2;
     root.add(new JLabel(I18n.tr("Sequence key")), gbc);
 
-    // Right column
-    gbc.weightx = 1;
-    gbc.gridx++;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.gridx = 1;
     gbc.gridy = 0;
-    gbc.anchor = GridBagConstraints.LINE_START;
-    root.add(numDetectionsLabel, gbc);
-    gbc.gridy++;
-    root.add(showDetectionsCheck, gbc);
-    gbc.gridy++;
-    root.add(usernameLabel, gbc);
-    gbc.gridy++;
-    root.add(imgButtons, gbc);
-    gbc.gridy++;
-    root.add(imgKey, gbc);
-    gbc.gridy++;
+    root.add(new StreetsideButton(imgLinkAction, true), gbc);
+
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.weightx = 0.5;
+    gbc.gridx = 1;
+    gbc.gridy = 1;
+    root.add(imgKeyValue, gbc);
+
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.weightx = 0.5;
+    gbc.gridx = 1;
+    gbc.gridy = 2;
     root.add(seqKeyValue, gbc);
+
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.weightx = 0.5;
+    gbc.gridx = 2;
+    gbc.gridy = 1;
+    root.add(copyButton, gbc);
 
     createLayout(root, true, null);
@@ -184,12 +160,9 @@
     ));
 
-    numDetectionsLabel.setText(I18n.tr("{0} detections", newImage instanceof StreetsideImage ? /*((StreetsideImage) newImage).getDetections().size()*/0 : 0));
     imgKeyValue.setEnabled(newImage instanceof StreetsideImage);
     final String newImageKey = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null;
     if (newImageKey != null) {
       imageLinkChangeListener = b -> imgLinkAction.setURL(
-        /*StreetsideProperties.IMAGE_LINK_TO_BLUR_EDITOR.get()
-        ? StreetsideURL.MainWebsite.blurEditImage(newImageKey)
-        :*/ StreetsideURL.MainWebsite.browseImage(newImageKey)
+        StreetsideURL.MainWebsite.browseImage(newImageKey)
       );
       imageLinkChangeListener.valueChanged(null);
@@ -211,14 +184,4 @@
     }
 
-    final UserProfile user = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getUser() : null;
-    usernameLabel.setEnabled(user != null);
-    if (user != null) {
-      usernameLabel.setText(user.getUsername());
-      usernameLabel.setIcon(new ImageIcon(user.getAvatar().getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH)));
-    } else {
-      usernameLabel.setText("‹" + I18n.tr("unknown user") + "›");
-      usernameLabel.setIcon(EMPTY_USER_AVATAR);
-    }
-
     final boolean partOfSequence = newImage != null && newImage.getSequence() != null && newImage.getSequence().getId() != null;
     seqKeyValue.setEnabled(partOfSequence);
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/StreetsideViewerPanel.java	(revision 34416)
@@ -15,9 +15,9 @@
 import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
 import org.openstreetmap.josm.plugins.streetside.actions.ImageReloadAction;
+import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBox;
 import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder;
 import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
 import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
 import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton;
-import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL;
@@ -67,11 +67,9 @@
 	    JPanel checkPanel = new JPanel();
 
-	    // TODO: I18n for all languages?
-	    imgReloadAction = new ImageReloadAction(/*I18n.tr(*/"Reload"/*)*/);
+	    imgReloadAction = new ImageReloadAction("Reload");
 
 	    StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction);
 
-	    // TODO: I18n for all languages?
-      highResImageryCheck = new JCheckBox(/*I18n.tr(*/"High resolution"/*)*/);
+	    highResImageryCheck = new JCheckBox("High resolution");
 	    highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get());
 	    highResImageryCheck.addActionListener(
@@ -155,5 +153,5 @@
 	}
 
-	public CubemapBox getCubemapBox() {
+	public static CubemapBox getCubemapBox() {
 		return threeSixtyDegreeViewerPanel.getCubemapBox();
 	}
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/ThreeSixtyDegreeViewerPanel.java	(revision 34416)
@@ -2,9 +2,6 @@
 package org.openstreetmap.josm.plugins.streetside.gui.imageinfo;
 
-import java.awt.image.BufferedImage;
-
 import org.openstreetmap.josm.plugins.streetside.cubemap.CameraTransformer;
-import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
-import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox;
+import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBox;
 
 import javafx.application.Platform;
@@ -21,198 +18,42 @@
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
-import javafx.scene.transform.NonInvertibleTransformException;
-
 
 @SuppressWarnings("restriction")
 public class ThreeSixtyDegreeViewerPanel extends JFXPanel {
 
-	private static final long serialVersionUID = -4940350009018422000L;
-
-	private static Scene cubemapScene;
-
-	private static Scene defaultScene;
-
-	private static Group root;
-	private static Group subGroup;
-	private static CubemapBox cubemapBox;
-	private static PerspectiveCamera camera;
-	private static CameraTransformer cameraTransform = new CameraTransformer();
-
-	private static double mousePosX;
-	private static double mousePosY;
-	private static double mouseOldX;
-	private static double mouseOldY;
-	private static double mouseDeltaX;
-	private static double mouseDeltaY;
-	private static double cameraDistance = 5000;
-
-	// Supply Image Paths or a NullPointer will occur
-	private static Image front;
-	private static Image right;
-	private static Image back;
-	private static Image left;
-	private static Image up;
-	private static Image down;
-
-	public ThreeSixtyDegreeViewerPanel() {
-		// constructor
-	}
-
-	public void initialize() {
-
-		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);
-		// cameraTransform.ry.setAngle(-45.0);
-		// cameraTransform.rx.setAngle(-10.0);
-		// add a Point Light for better viewing of the grid coordinate system
-		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);
-
-		final double size = 100000D;
-
-		cubemapBox = new CubemapBox(front, right, back, left, up, down, size, camera);
-
-		subGroup = new Group();
-		subGroup.getChildren().add(cameraTransform);
-
-		Platform.runLater(new Runnable() {
-			@Override
-			public void run() {
-				setScene(createDefaultScene());
-			}
-		});
-	}
-
-	public static Scene createScene() /*throws NonInvertibleTransformException*/ {
-
-		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 scene = new Scene(new Group(root), 1024, 668, true, SceneAntialiasing.BALANCED);
-		scene.setFill(Color.TRANSPARENT);
-		scene.setCamera(camera);
-
-		// First person shooter keyboard movement
-		scene.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);
-			}
-		});
-
-		scene.setOnMousePressed((MouseEvent me) -> {
-			mousePosX = me.getSceneX();
-			mousePosY = me.getSceneY();
-			mouseOldX = me.getSceneX();
-			mouseOldY = me.getSceneY();
-		});
-		scene.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); // -
-			}
-		});
-
-		root.getChildren().addAll(cubemapBox, subGroup);
-		root.setAutoSizeChildren(true);
-
-		subGroup.setAutoSizeChildren(true);
-
-		// prevent content from disappearing after resizing
-		Platform.setImplicitExit(false);
-
-		return scene;
-	}
-
-	private static Scene createDefaultScene() {
-		// Load Cubemap box AFTER camera is initialized
-
-		TextArea textArea = new TextArea();
-		textArea.setText("No Streetside image selected.");
-
-		VBox vbox = new VBox(textArea);
-
-		root = new Group();
+  private static final long serialVersionUID = -4940350009018422000L;
+
+  private static Scene cubemapScene;
+
+  private static Scene defaultScene;
+
+  private static Group root;
+  private static Group subGroup;
+  private static CubemapBox cubemapBox;
+  private static PerspectiveCamera camera;
+  private static CameraTransformer cameraTransform = new CameraTransformer();
+
+  private static double mousePosX;
+  private static double mousePosY;
+  private static double mouseOldX;
+  private static double mouseOldY;
+  private static double mouseDeltaX;
+  private static double mouseDeltaY;
+  private static double cameraDistance = 5000;
+
+  private static Image front;
+  private static Image right;
+  private static Image back;
+  private static Image left;
+  private static Image up;
+  private static Image down;
+
+  public ThreeSixtyDegreeViewerPanel() {
+
+  }
+
+  public void initialize() {
+
+    root = new Group();
 
     camera = new PerspectiveCamera(true);
@@ -232,26 +73,62 @@
     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);
+    cubemapBox = new CubemapBox(front, right, back, left, up, down, size, camera);
 
     subGroup = new Group();
     subGroup.getChildren().add(cameraTransform);
 
-    /*final Scene*/ cubemapScene = new Scene(new Group(root), 1024, 668, true, SceneAntialiasing.BALANCED);
+    Platform.runLater(new Runnable() {
+      @Override
+      public void run() {
+        setScene(createDefaultScene());
+      }
+    });
+  }
+
+  private static Scene createDefaultScene() {
+
+    TextArea textArea = new TextArea();
+    textArea.setText("No Streetside image selected.");
+
+    VBox vbox = new VBox(textArea);
+
+    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);
+
+    final double size = 100000D;
+
+    cubemapBox = new CubemapBox(null, null, null, null, null, null, size, camera);
+
+    subGroup = new Group();
+    subGroup.getChildren().add(cameraTransform);
+
+    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);
@@ -260,5 +137,5 @@
         camera.setTranslateZ(camera.getTranslateZ() - change);
       }
-      // Step 2d: Add Strafe controls
+
       if (keycode == KeyCode.A) {
         camera.setTranslateX(camera.getTranslateX() - change);
@@ -294,9 +171,9 @@
       if (me.isPrimaryButtonDown()) {
         cameraTransform.ry.setAngle(
-            ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540)
-                % 360 - 180); // +
+          ((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); // -
+          ((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180
+        ); // -
 
       } else if (me.isSecondaryButtonDown()) {
@@ -319,126 +196,14 @@
 
     defaultScene = new Scene(vbox, 200, 100);
-		return defaultScene;
-	}
-
-	public static Scene createScene(BufferedImage img0, BufferedImage img1, BufferedImage img2, BufferedImage img3,
-			BufferedImage img4, BufferedImage img5) throws NonInvertibleTransformException {
-		front = GraphicsUtils.convertBufferedImage2JavaFXImage(img0);
-		right = GraphicsUtils.convertBufferedImage2JavaFXImage(img1);
-		back = GraphicsUtils.convertBufferedImage2JavaFXImage(img2);
-		left = GraphicsUtils.convertBufferedImage2JavaFXImage(img3);
-		up = GraphicsUtils.convertBufferedImage2JavaFXImage(img4);
-		down = GraphicsUtils.convertBufferedImage2JavaFXImage(img5);
-
-		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(front, right, back, left, up, down, size, camera);
-
-		final Group torusGroup = new Group();
-		torusGroup.getChildren().add(cameraTransform);
-
-		final Scene scene = new Scene(new Group(root), 1024, 668, true, SceneAntialiasing.BALANCED);
-		scene.setFill(Color.TRANSPARENT);
-		scene.setCamera(camera);
-
-		// First person shooter keyboard movement
-		scene.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);
-			}
-
-		});
-
-		scene.setOnMousePressed((MouseEvent me) -> {
-			mousePosX = me.getSceneX();
-			mousePosY = me.getSceneY();
-			mouseOldX = me.getSceneX();
-			mouseOldY = me.getSceneY();
-		});
-		scene.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); // -
-			}
-		});
-
-		root.getChildren().addAll(cubemapBox, torusGroup);
-		root.setAutoSizeChildren(true);
-
-		return scene;
-	}
-
-	public CubemapBox getCubemapBox() {
-		if (cubemapBox == null) {
-			// shouldn't happen
-			initialize();
-		}
-		return cubemapBox;
-	}
+    return defaultScene;
+  }
+
+  public CubemapBox getCubemapBox() {
+    if (cubemapBox == null) {
+      // shouldn't happen
+      initialize();
+    }
+    return cubemapBox;
+  }
 
   public Scene getDefaultScene() {
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/WebLinkAction.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/WebLinkAction.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/WebLinkAction.java	(revision 34416)
@@ -12,5 +12,4 @@
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideUtils;
-import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandMove.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandMove.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandMove.java	(revision 34416)
@@ -38,6 +38,6 @@
   @Override
   public void undo() {
-    for (StreetsideAbstractImage image : this.images) {
-      image.move(-this.x, -this.y);
+    for (StreetsideAbstractImage image : images) {
+      image.move(-x, -y);
       image.stopMoving();
     }
@@ -47,6 +47,6 @@
   @Override
   public void redo() {
-    for (StreetsideAbstractImage image : this.images) {
-      image.move(this.x, this.y);
+    for (StreetsideAbstractImage image : images) {
+      image.move(x, y);
       image.stopMoving();
     }
@@ -56,7 +56,6 @@
   @Override
   public String toString() {
-    // TODO: trn( RRH
-    return trn("Moved {0} image", "Moved {0} images", this.images.size(),
-        this.images.size());
+    return trn("Moved {0} image", "Moved {0} images", images.size(),
+        images.size());
   }
 
@@ -64,6 +63,6 @@
   public void sum(StreetsideCommand command) {
     if (command instanceof CommandMove) {
-      this.x += ((CommandMove) command).x;
-      this.y += ((CommandMove) command).y;
+      x += ((CommandMove) command).x;
+      y += ((CommandMove) command).y;
     }
   }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandTurn.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandTurn.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandTurn.java	(revision 34416)
@@ -33,6 +33,6 @@
   @Override
   public void undo() {
-    for (StreetsideAbstractImage image : this.images) {
-      image.turn(-this.ca);
+    for (StreetsideAbstractImage image : images) {
+      image.turn(-ca);
       image.stopMoving();
     }
@@ -42,6 +42,6 @@
   @Override
   public void redo() {
-    for (StreetsideAbstractImage image : this.images) {
-      image.turn(this.ca);
+    for (StreetsideAbstractImage image : images) {
+      image.turn(ca);
       image.stopMoving();
     }
@@ -51,7 +51,6 @@
   @Override
   public String toString() {
-    // TODO: trn( RRH
-    return trn("Turned {0} image", "Turned {0} images", this.images.size(),
-        this.images.size());
+    return trn("Turned {0} image", "Turned {0} images", images.size(),
+        images.size());
   }
 
@@ -59,5 +58,5 @@
   public void sum(StreetsideCommand command) {
     if (command instanceof CommandTurn) {
-      this.ca += ((CommandTurn) command).ca;
+      ca += ((CommandTurn) command).ca;
     }
   }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandUnjoin.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandUnjoin.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/history/commands/CommandUnjoin.java	(revision 34416)
@@ -40,5 +40,5 @@
   @Override
   public void execute() {
-    this.redo();
+    redo();
   }
 
@@ -59,5 +59,4 @@
   @Override
   public String toString() {
-    // TODO: tr( RRH
     return tr("2 images unjoined");
   }
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/SequenceDownloadRunnable.java	(revision 34416)
@@ -76,8 +76,4 @@
         if (node.get("id") != null && node.get("la") != null && node.get("lo") != null) {
           StreetsideImage image = new StreetsideImage(CubemapUtils.convertDecimal2Quaternary(node.path("id").asLong()), node.path("la").asDouble(), node.get("lo").asDouble());
-          if(previous!=null) {
-        	  // Analyze sequence behaviour
-        	  //previous.setNext(image.getId());
-          }
           previous = image;
           image.setAd(node.path("ad").asInt());
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/export/StreetsideExportDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/export/StreetsideExportDownloadThread.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/export/StreetsideExportDownloadThread.java	(revision 34416)
@@ -58,5 +58,5 @@
   @Override
   public void run() {
-    //CacheUtils.submit(image.getId(), StreetsideCache.Type.FULL_IMAGE, this);
+    // use "thumbnail" type here so that the tiles are not exported
     CacheUtils.submit(image.getId(), StreetsideCache.Type.THUMBNAIL, this);
   }
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/mode/JoinMode.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/mode/JoinMode.java	(revision 34412)
+++ 	(revision )
@@ -1,93 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.mode;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.event.MouseEvent;
-import java.util.Arrays;
-
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
-import org.openstreetmap.josm.plugins.streetside.StreetsideImportedImage;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
-import org.openstreetmap.josm.plugins.streetside.history.StreetsideRecord;
-import org.openstreetmap.josm.plugins.streetside.history.commands.CommandJoin;
-import org.openstreetmap.josm.plugins.streetside.history.commands.CommandUnjoin;
-
-/**
- * In this mode the user can join pictures to make sequences or unjoin them.
- *
- * @author nokutu
- *
- */
-public class JoinMode extends AbstractMode {
-
-  private StreetsideImportedImage lastClick;
-  private MouseEvent lastPos;
-
-  /**
-   * Main constructor.
-   */
-  public JoinMode() {
-    this.cursor = Cursor.CROSSHAIR_CURSOR;
-  }
-
-  @Override
-  public void mousePressed(MouseEvent e) {
-    final StreetsideAbstractImage highlighted = StreetsideLayer.getInstance().getData().getHighlightedImage();
-    if (highlighted == null) {
-      return;
-    }
-    if (this.lastClick == null && highlighted instanceof StreetsideImportedImage) {
-      this.lastClick = (StreetsideImportedImage) highlighted;
-    } else if (this.lastClick != null
-        && highlighted instanceof StreetsideImportedImage) {
-      if (
-        (
-          (highlighted.previous() == null && this.lastClick.next() == null) ||
-          (highlighted.next() == null && this.lastClick.previous() == null)
-        )
-        && highlighted.getSequence() != this.lastClick.getSequence()
-      ) {
-        StreetsideRecord.getInstance().addCommand(new CommandJoin(this.lastClick, highlighted));
-      } else if (this.lastClick.next() == highlighted || this.lastClick.previous() == highlighted) {
-        StreetsideRecord.getInstance().addCommand(
-          new CommandUnjoin(Arrays.asList(this.lastClick, highlighted))
-        );
-      }
-      this.lastClick = null;
-    }
-    StreetsideLayer.invalidateInstance();
-  }
-
-  @Override
-  public void mouseMoved(MouseEvent e) {
-    this.lastPos = e;
-    if (!(MainApplication.getLayerManager().getActiveLayer() instanceof StreetsideLayer))
-      return;
-    StreetsideAbstractImage closestTemp = getClosest(e.getPoint());
-    StreetsideLayer.getInstance().getData().setHighlightedImage(closestTemp);
-    StreetsideLayer.invalidateInstance();
-  }
-
-  @Override
-  public void paint(Graphics2D g, MapView mv, Bounds box) {
-    if (this.lastClick != null) {
-      g.setColor(Color.WHITE);
-      Point p0 = mv.getPoint(this.lastClick.getMovingLatLon());
-      Point p1 = this.lastPos.getPoint();
-      g.drawLine(p0.x, p0.y, p1.x, p1.y);
-    }
-  }
-
-  @Override
-  public String toString() {
-    return tr("Join mode");
-  }
-}
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/MapObject.java	(revision 34416)
@@ -10,5 +10,4 @@
 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 final LatLon coordinate;
@@ -49,12 +48,5 @@
       return ICON_UNKNOWN_TYPE;
     } else if (cachedIcon == null) {
-      /*try {
-        final ImageIcon downloadedIcon = new ImageIcon(ImageIO.read(iconUrlGen.apply(objectTypeID)));
-        MapObjectIconCache.getInstance().put(objectTypeID, downloadedIcon);
-        return downloadedIcon;
-      } catch (IOException e) {
-        logger.warn(I18n.tr("Failed to download icon " + objectTypeID, e));
-        return ICON_UNKNOWN_TYPE;
-      }*/
+      // downloading of map icons is not currently supported by Streetside
     }
     return cachedIcon;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/UserProfile.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/UserProfile.java	(revision 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/model/UserProfile.java	(revision 34416)
@@ -6,8 +6,9 @@
 import javax.swing.ImageIcon;
 
+// not currently used but kept in case Microsoft wants to support user logins
 public class UserProfile extends KeyIndexedObject implements Serializable {
-  
+
   private static final long serialVersionUID = 7993340649510343946L;
-  
+
   private final String username;
   private final ImageIcon avatar;
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/CubemapBox.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/CubemapBox.java	(revision 34412)
+++ 	(revision )
@@ -1,299 +1,0 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package org.openstreetmap.josm.plugins.streetside.utils;
-
-import java.awt.image.BufferedImage;
-
-import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
-import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
-
-import javafx.animation.AnimationTimer;
-import javafx.beans.property.DoubleProperty;
-import javafx.beans.property.SimpleDoubleProperty;
-import javafx.geometry.Rectangle2D;
-import javafx.scene.Group;
-import javafx.scene.PerspectiveCamera;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.transform.Affine;
-import javafx.scene.transform.Rotate;
-import javafx.scene.transform.Transform;
-
-/**
- *
- * @author Dub
- * @author renerr18
- */
-@SuppressWarnings("restriction")
-public class CubemapBox extends Group {
-
-  public enum CubemapBoxImageType {
-    MULTIPLE, SINGLE
-  }
-
-  private final Affine affine = new Affine();
-
-  private final ImageView front = new ImageView(), right = new ImageView(), back = new ImageView(),
-    left = new ImageView(), up = new ImageView(), down = new ImageView();
-
-  {
-    front.setId(CubemapUtils.CubemapFaces.FRONT.getValue());
-    right.setId(CubemapUtils.CubemapFaces.RIGHT.getValue());
-    back.setId(CubemapUtils.CubemapFaces.BACK.getValue());
-    left.setId(CubemapUtils.CubemapFaces.LEFT.getValue());
-    up.setId(CubemapUtils.CubemapFaces.UP.getValue());
-    down.setId(CubemapUtils.CubemapFaces.DOWN.getValue());
-
-  }
-  private final ImageView[] views = new ImageView[] { front, right, back, left, up, down };
-
-  private Image frontImg, rightImg, backImg, leftImg, upImg, downImg, singleImg;
-
-  // private WritableImage convertedImage;
-
-  private final PerspectiveCamera camera;
-  private AnimationTimer timer;
-  private final CubemapBoxImageType imageType;
-
-  public CubemapBox(Image singleImg, double size, PerspectiveCamera camera) {
-    super();
-    imageType = CubemapBoxImageType.SINGLE;
-
-    this.singleImg = singleImg;
-    this.size.set(size);
-    this.camera = camera;
-
-    getTransforms().add(affine);
-
-    loadImageViews();
-
-    getChildren().addAll(views);
-  }
-
-  // private constructor to prevent instantiation
-  public CubemapBox(double size, PerspectiveCamera camera) {
-    super();
-    imageType = CubemapBoxImageType.SINGLE;
-
-    this.size.set(size);
-    this.camera = camera;
-
-    getTransforms().add(affine);
-
-    loadImageViews();
-
-    getChildren().addAll(views);
-  }
-
-  public CubemapBox(
-    Image frontImg, Image rightImg, Image backImg, Image leftImg, Image upImg, Image downImg, double size,
-    PerspectiveCamera camera
-  ) {
-    super();
-    imageType = CubemapBoxImageType.MULTIPLE;
-
-    this.frontImg = frontImg;
-    this.rightImg = rightImg;
-    this.backImg = backImg;
-    this.leftImg = leftImg;
-    this.upImg = upImg;
-    this.downImg = downImg;
-    this.size.set(size);
-    this.camera = camera;
-
-    loadImageViews();
-
-    getTransforms().add(affine);
-
-    getChildren().addAll(views);
-
-    startTimer();
-  }
-
-  public void loadImageViews() {
-
-    for (ImageView iv : views) {
-      iv.setSmooth(true);
-      iv.setPreserveRatio(true);
-    }
-
-    validateImageType();
-  }
-
-  private void layoutViews() {
-
-    for (ImageView v : views) {
-      v.setFitWidth(getSize());
-      v.setFitHeight(getSize());
-    }
-
-    back.setTranslateX(-0.5 * getSize());
-    back.setTranslateY(-0.5 * getSize());
-    back.setTranslateZ(-0.5 * getSize());
-
-    front.setTranslateX(-0.5 * getSize());
-    front.setTranslateY(-0.5 * getSize());
-    front.setTranslateZ(0.5 * getSize());
-    front.setRotationAxis(Rotate.Z_AXIS);
-    front.setRotate(-180);
-    front.getTransforms().add(new Rotate(180, front.getFitHeight() / 2, 0, 0, Rotate.X_AXIS));
-    front.setTranslateY(front.getTranslateY() - getSize());
-
-    up.setTranslateX(-0.5 * getSize());
-    up.setTranslateY(-1 * getSize());
-    up.setRotationAxis(Rotate.X_AXIS);
-    up.setRotate(-90);
-
-    down.setTranslateX(-0.5 * getSize());
-    down.setTranslateY(0);
-    down.setRotationAxis(Rotate.X_AXIS);
-    down.setRotate(90);
-
-    left.setTranslateX(-1 * getSize());
-    left.setTranslateY(-0.5 * getSize());
-    left.setRotationAxis(Rotate.Y_AXIS);
-    left.setRotate(90);
-
-    right.setTranslateX(0);
-    right.setTranslateY(-0.5 * getSize());
-    right.setRotationAxis(Rotate.Y_AXIS);
-    right.setRotate(-90);
-
-  }
-
-  /**
-   * for single image creates viewports and sets all views(image) to singleImg for multiple... sets images per view.
-   */
-  private void validateImageType() {
-    switch (imageType) {
-    case SINGLE:
-      loadSingleImageViewports();
-      break;
-    case MULTIPLE:
-      setMultipleImages();
-      break;
-    }
-  }
-
-  private void loadSingleImageViewports() {
-    layoutViews();
-    double width = singleImg.getWidth(), height = singleImg.getHeight();
-
-    // simple check to see if cells will be square
-    if (width / 4 != height / 3) {
-      throw new UnsupportedOperationException("Image does not comply with size constraints");
-    }
-    double cellSize = singleImg.getWidth() - singleImg.getHeight();
-
-    recalculateSize(cellSize);
-
-    double topx = cellSize, topy = 0,
-
-      botx = cellSize, boty = cellSize * 2,
-
-      leftx = 0, lefty = cellSize,
-
-      rightx = cellSize * 2, righty = cellSize,
-
-      fwdx = cellSize, fwdy = cellSize,
-
-      backx = cellSize * 3, backy = cellSize;
-
-    // add top padding x+, y+, width-, height
-    up.setViewport(new Rectangle2D(topx, topy, cellSize, cellSize));
-
-    // add left padding x, y+, width, height-
-    left.setViewport(new Rectangle2D(leftx, lefty, cellSize - 1, cellSize - 1));
-
-    // add front padding x+, y+, width-, height
-    front.setViewport(new Rectangle2D(fwdx, fwdy, cellSize, cellSize));
-
-    // add right padding x, y+, width, height-
-    right.setViewport(new Rectangle2D(rightx, righty, cellSize, cellSize));
-
-    // add back padding x, y+, width, height-
-    back.setViewport(new Rectangle2D(backx + 1, backy - 1, cellSize - 1, cellSize - 1));
-
-    // add bottom padding x+, y, width-, height-
-    down.setViewport(new Rectangle2D(botx, boty, cellSize, cellSize));
-
-    for (ImageView v : views) {
-      v.setImage(singleImg);
-    }
-  }
-
-  private void recalculateSize(double cell) {
-    double factor = Math.floor(getSize() / cell);
-    setSize(cell * factor);
-  }
-
-  public synchronized void setImage(BufferedImage img, int position) {
-    views[position].setImage(GraphicsUtils.convertBufferedImage2JavaFXImage(img));
-
-  }
-
-  private void setMultipleImages() {
-    GraphicsUtils.PlatformHelper.run(() -> {
-      layoutViews();
-      front.setImage(frontImg);
-      right.setImage(rightImg);
-      back.setImage(backImg);
-      left.setImage(leftImg);
-      up.setImage(upImg);
-      down.setImage(downImg);
-
-    });
-  }
-
-  public void startTimer() {
-    timer = new AnimationTimer() {
-      @Override
-      public void handle(long now) {
-        Transform ct = (camera != null) ? camera.getLocalToSceneTransform() : null;
-        if (ct != null) {
-          affine.setTx(ct.getTx());
-          affine.setTy(ct.getTy());
-          affine.setTz(ct.getTz());
-        }
-      }
-    };
-    timer.start();
-  }
-
-  /*
-   * Properties
-   */
-  private final DoubleProperty size = new SimpleDoubleProperty() {
-    @Override
-    protected void invalidated() {
-      switch (imageType) {
-      case SINGLE:
-        layoutViews();
-        break;
-      case MULTIPLE:
-        break;
-      }
-
-    }
-  };
-
-  public final double getSize() {
-    return size.get();
-  }
-
-  public final void setSize(double value) {
-    size.set(value);
-  }
-
-  public DoubleProperty sizeProperty() {
-    return size;
-  }
-
-  public ImageView[] getViews() {
-    return views;
-  }
-}
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideProperties.java	(revision 34416)
@@ -58,4 +58,10 @@
   public static final StringProperty START_DIR =
     new StringProperty("streetside.start-directory", System.getProperty("user.home"));
+  public static final StringProperty URL_CLIENT_ID =
+    new StringProperty("streetside.url-clientid", System.getProperty("T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz"));
+  public static final StringProperty BING_MAPS_KEY =
+    new StringProperty("streetside.bing-maps-key", System.getProperty("AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm"));
+  public static final StringProperty TEST_BUBBLE_ID =
+    new StringProperty("streetside.test-bubble-id", System.getProperty("80848005"));
 
   /**
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 34412)
+++ applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/StreetsideURL.java	(revision 34416)
@@ -28,9 +28,6 @@
 	/** 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 CLIENT_ID = "T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz";
-	private static final String BING_MAPS_KEY = "AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm";
-	private static final String TEST_BUBBLE_ID = "80848005";
-
-	private static final String STREETSIDE_PRIVACY_URL = "https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=";
+	/** Base URL for Streetside privacy concerns. */
+  private static final String STREETSIDE_PRIVACY_URL = "https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=";
 
 	private static final int OSM_BBOX_NORTH = 3;
@@ -40,5 +37,4 @@
 
 	public static final class APIv3 {
-		//private static final String BASE_URL = "https://a.mapillary.com/v3/";
 
 		private APIv3() {
@@ -106,10 +102,4 @@
 		}
 
-		/**
-		 * @return the URL where you'll find information about the user account as JSON
-		 */
-		/*public static URL userURL() {
-			return StreetsideURL.string2URL(APIv3.BASE_URL, "me", StreetsideURL.queryString(null));
-		}*/
 	}
 
@@ -174,5 +164,5 @@
 				throw new IllegalArgumentException("The image id may not be null!");
 			}
-			return StreetsideURL.string2URL(MessageFormat.format("{0}{1}{2}{3}{4}",VirtualEarth.BASE_URL_PREFIX, "0", id, "01", VirtualEarth.BASE_URL_SUFFIX));
+			return StreetsideURL.string2URL(MessageFormat.format("{0}{1}{2}{3}{4}",VirtualEarth.BASE_URL_PREFIX, "0", id, "0101", VirtualEarth.BASE_URL_SUFFIX));
 		}
 
@@ -257,5 +247,5 @@
 	 */
 	static String queryString(Map<String, String> parts) {
-		final StringBuilder ret = new StringBuilder("?client_id=").append(StreetsideURL.CLIENT_ID);
+		final StringBuilder ret = new StringBuilder("?client_id=").append(StreetsideProperties.URL_CLIENT_ID.get());
 		if (parts != null) {
 			for (final Entry<String, String> entry : parts.entrySet()) {
@@ -292,5 +282,5 @@
 				.append("&c=1000")
 				.append("&appkey=")
-				.append(StreetsideURL.BING_MAPS_KEY);
+				.append(StreetsideProperties.BING_MAPS_KEY.get());
 			} catch (final UnsupportedEncodingException e) {
 				logger.error(e); // This should not happen, as the encoding is hard-coded
@@ -308,7 +298,7 @@
 		final StringBuilder ret = new StringBuilder("?id=");
 		try {
-			ret.append(URLEncoder.encode(StreetsideURL.TEST_BUBBLE_ID, StandardCharsets.UTF_8.name()));
+			ret.append(URLEncoder.encode(StreetsideProperties.TEST_BUBBLE_ID.get(), StandardCharsets.UTF_8.name()));
 			ret.append('&').append(URLEncoder.encode("appkey=", StandardCharsets.UTF_8.name())).append('=')
-			.append(URLEncoder.encode(StreetsideURL.BING_MAPS_KEY, StandardCharsets.UTF_8.name()));
+			.append(URLEncoder.encode(StreetsideProperties.BING_MAPS_KEY.get(), StandardCharsets.UTF_8.name()));
 		} catch (final UnsupportedEncodingException e) {
 			logger.error(e); // This should not happen, as the encoding is hard-coded
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/api/JsonLocationChangesetEncoder.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/api/JsonLocationChangesetEncoder.java	(revision 34412)
+++ 	(revision )
@@ -1,57 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.utils.api;
-
-import java.util.Objects;
-
-import javax.json.Json;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObjectBuilder;
-
-import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
-
-import org.openstreetmap.josm.plugins.streetside.StreetsideLocationChangeset;
-
-
-public final class JsonLocationChangesetEncoder {
-  private JsonLocationChangesetEncoder() {
-    // Private constructor to avoid instantiation
-  }
-
-  public static JsonObjectBuilder encodeLocationChangeset(StreetsideLocationChangeset changeset) {
-    Objects.requireNonNull(changeset);
-    final JsonArrayBuilder imgChanges = Json.createArrayBuilder();
-    for (StreetsideImage img : changeset) {
-      imgChanges.add(encodeImageChanges(img));
-    }
-    return Json.createObjectBuilder()
-      .add("type", "location")
-      .add("changes", imgChanges)
-      .add("request_comment", "JOSM-created");
-  }
-
-  private static JsonObjectBuilder encodeImageChanges(StreetsideImage img) {
-    Objects.requireNonNull(img);
-
-    final JsonObjectBuilder to = Json.createObjectBuilder();
-    if (!img.getTempLatLon().equalsEpsilon(img.getLatLon())) {
-      to.add("geometry", Json.createObjectBuilder()
-        .add("coordinates", Json.createArrayBuilder()
-          .add(img.getTempLatLon().getX())
-          .add(img.getTempLatLon().getY())
-        ).add("type", "Point")
-      );
-    }
-    if (Math.abs(img.getHe() - img.getTempHe()) > 1e-9) {
-      to.add("properties", Json.createObjectBuilder().add("ca", img.getTempHe()));
-    } else {
-      to.add("properties", Json.createObjectBuilder());
-    }
-    if (!img.getTempLatLon().equalsEpsilon(img.getLatLon())) {
-      to.add("type", "Feature");
-    }
-
-    return Json.createObjectBuilder()
-      .add("image_key", img.getId())
-      .add("to", to);
-  }
-}
Index: applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/api/JsonMapObjectDecoder.java
===================================================================
--- applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/utils/api/JsonMapObjectDecoder.java	(revision 34412)
+++ 	(revision )
@@ -1,61 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.streetside.utils.api;
-
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.JsonValue;
-
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.plugins.streetside.model.MapObject;
-import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL.APIv3;
-
-/**
- * Decodes the JSON returned by {@link APIv3} into Java objects.
- * Takes a {@link JsonObject} and {@link #decodeMapObject(JsonObject)} tries to convert it to a {@link MapObject}.
- */
-public final class JsonMapObjectDecoder {
-  private JsonMapObjectDecoder() {
-    // Private constructor to avoid instantiation
-  }
-
-  public static MapObject decodeMapObject(final JsonObject json) {
-    if (json == null || !"Feature".equals(json.getString("type", null))) {
-      return null;
-    }
-
-    final JsonValue properties = json.get("properties");
-    final JsonValue geometry = json.get("geometry");
-    if (properties instanceof JsonObject && geometry instanceof JsonObject) {
-      final String key = ((JsonObject) properties).getString("key", null);
-      final String packg = ((JsonObject) properties).getString("package", null);
-      final String value = ((JsonObject) properties).getString("value", null);
-      final Long firstSeenTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("first_seen_at", null));
-      final Long lastSeenTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("last_seen_at", null));
-      final Long updatedTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("updated_at", null));
-
-      final JsonValue coordVal = "Point".equals(((JsonObject) geometry).getString("type", null))
-        ? ((JsonObject) geometry).get("coordinates")
-        : null;
-      final LatLon coordinate = coordVal instanceof JsonArray ? JsonDecoder.decodeLatLon((JsonArray) coordVal) : null;
-
-      if (
-        key != null &&
-        packg != null &&
-        value != null &&
-        firstSeenTime != null &&
-        lastSeenTime != null &&
-        updatedTime != null &&
-        coordinate != null
-      ) {
-        return new MapObject(
-          coordinate,
-          key,
-          packg,
-          value,
-          firstSeenTime, lastSeenTime, updatedTime
-        );
-      }
-    }
-    return null;
-  }
-}
