Index: /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java
===================================================================
--- /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java	(revision 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideData.java	(revision 34333)
@@ -290,5 +290,5 @@
 		throw new IllegalStateException();
 	}
-    StreetsideAbstractImage tempImage = selectedImage;
+    StreetsideAbstractImage tempImage = this.selectedImage;
     while (tempImage.previous() != null) {
       tempImage = tempImage.previous();
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideImage.java	(revision 34333)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.plugins.streetside;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
@@ -7,4 +10,7 @@
 import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
 import org.openstreetmap.josm.plugins.streetside.model.UserProfile;
+import org.openstreetmap.josm.tools.Logging;
+
+import org.openstreetmap.josm.plugins.streetside.model.ImageDetection;
 
 /**
@@ -59,7 +65,7 @@
   /**
    * Set of traffic signs in the image.
-   *//*
+   */
   private final List<ImageDetection> detections = Collections.synchronizedList(new ArrayList<>());
-*/
+
   /**
    * Main constructor of the class StreetsideImage
@@ -100,9 +106,9 @@
   }
 
-  /*public List<ImageDetection> getDetections() {
+  public List<ImageDetection> getDetections() {
     return detections;
-  }*/
-
-  /*public void setAllDetections(Collection<ImageDetection> newDetections) {
+  }
+
+  public void setAllDetections(Collection<ImageDetection> newDetections) {
     Logging.debug("Add {0} detections to image {1}", newDetections.size(), getId());
     synchronized (detections) {
@@ -110,5 +116,5 @@
       detections.addAll(newDetections);
     }
-  }*/
+  }
 
   public UserProfile getUser() {
@@ -119,5 +125,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
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsideLayer.java	(revision 34333)
@@ -81,12 +81,11 @@
   ) / 3;
 
-	private static final DataSetListenerAdapter DATASET_LISTENER =
-			new DataSetListenerAdapter(e -> {
-				if (e instanceof DataChangedEvent && StreetsideDownloader.getMode() == DOWNLOAD_MODE.OSM_AREA) {
-					// When more data is downloaded, a delayed update is thrown, in order to
-					// wait for the data bounds to be set.
-					MainApplication.worker.execute(StreetsideDownloader::downloadOSMArea);
-				}
-			});
+  private static final DataSetListenerAdapter DATASET_LISTENER = new DataSetListenerAdapter(e -> {
+    if (e instanceof DataChangedEvent && StreetsideDownloader.getMode() == DOWNLOAD_MODE.OSM_AREA) {
+      // When more data is downloaded, a delayed update is thrown, in order to
+      // wait for the data bounds to be set.
+      MainApplication.worker.execute(StreetsideDownloader::downloadOSMArea);
+    }
+  });
 
 	/** Unique instance of the class. */
@@ -207,5 +206,5 @@
 	 */
 	public StreetsideData getData() {
-		return this.data;
+		return data;
 	}
 
@@ -259,7 +258,7 @@
 
 
-	@Override
+  @Override
   public boolean isModified() {
-    return this.data.getImages().parallelStream().anyMatch(StreetsideAbstractImage::isModified);
+    return data.getImages().parallelStream().anyMatch(StreetsideAbstractImage::isModified);
   }
 
@@ -286,5 +285,5 @@
     big.drawLine(0, 15, 15, 0);
     Rectangle r = new Rectangle(0, 0, 15, 15);
-    this.hatched = new TexturePaint(bi, r);
+    hatched = new TexturePaint(bi, r);
   }
 
@@ -295,5 +294,5 @@
       // paint remainder
       g.setPaint(hatched);
-      g.fill(MapViewGeometryUtil.getNonDownloadedArea(mv, this.data.getBounds()));
+      g.fill(MapViewGeometryUtil.getNonDownloadedArea(mv, data.getBounds()));
     }
 
@@ -314,5 +313,6 @@
 
     // Draw sequence line
-    g.setStroke(new BasicStroke(2));
+    // TODO: reimplement sequence lines for Streetside
+    /*g.setStroke(new BasicStroke(2));
     final StreetsideAbstractImage selectedImage = getData().getSelectedImage();
     for (StreetsideSequence seq : getData().getSequences()) {
@@ -327,12 +327,12 @@
       }
       g.draw(MapViewGeometryUtil.getSequencePath(mv, seq));
-    }
-    for (StreetsideAbstractImage imageAbs : this.data.getImages()) {
+    }*/
+    for (StreetsideAbstractImage imageAbs : data.getImages()) {
       if (imageAbs.isVisible() && mv != null && mv.contains(mv.getPoint(imageAbs.getMovingLatLon()))) {
         drawImageMarker(g, imageAbs);
       }
     }
-    if (this.mode instanceof JoinMode) {
-      this.mode.paint(g, mv, box);
+    if (mode instanceof JoinMode) {
+      mode.paint(g, mv, box);
     }
   }
@@ -392,6 +392,6 @@
 
 
-		/*if (img instanceof StreetsideImage && !((StreetsideImage) img).getDetections().isEmpty()) {
-			final Path2D trafficSign = new Path2D.Double();
+		if (img instanceof StreetsideImage && !((StreetsideImage) img).getDetections().isEmpty()) {
+			Path2D trafficSign = new Path2D.Double();
 			trafficSign.moveTo(p.getX() - StreetsideLayer.TRAFFIC_SIGN_SIZE / 2d, p.getY() - StreetsideLayer.TRAFFIC_SIGN_HEIGHT_3RD);
 			trafficSign.lineTo(p.getX() + StreetsideLayer.TRAFFIC_SIGN_SIZE / 2d, p.getY() - StreetsideLayer.TRAFFIC_SIGN_HEIGHT_3RD);
@@ -403,5 +403,5 @@
 			g.setColor(Color.RED);
 			g.draw(trafficSign);
-		}*/
+		}
 	}
 
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/StreetsidePlugin.java	(revision 34333)
@@ -26,4 +26,6 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 
+import org.openstreetmap.josm.plugins.streetside.gui.StreetsideChangesetDialog;
+
 /**
  * This is the main class of the Streetside plugin.
@@ -48,5 +50,4 @@
       MainMenu.add(MainApplication.getMenu().dataMenu, new StreetsideJoinAction(), false);
       MainMenu.add(MainApplication.getMenu().moreToolsMenu, WALK_ACTION, false);
-      //MainMenu.add(MainApplication.getMenu().imagerySubMenu, new MapObjectLayerAction(), false);
       //MainMenu.add(MainApplication.getMenu().imagerySubMenu, new MapObjectLayerAction(), false);
     }
@@ -75,5 +76,5 @@
    * @return the {@link StreetsideWalkAction} for the plugin
    */
-  public static StreetsideWalkAction getStreetsideWalkAction() {
+  public static StreetsideWalkAction getWalkAction() {
     return WALK_ACTION;
   }
@@ -91,5 +92,5 @@
       MainApplication.getMap().addToggleDialog(StreetsideViewerDialog.getInstance(), false);
       //MainApplication.getMap().addToggleDialog(StreetsideHistoryDialog.getInstance(), false);
-      //MainApplication.getMap().addToggleDialog(StreetsideChangesetDialog.getInstance(), false);
+      MainApplication.getMap().addToggleDialog(StreetsideChangesetDialog.getInstance(), false);
       //MainApplication.getMap().addToggleDialog(StreetsideFilterDialog.getInstance(), false);
     }
@@ -97,5 +98,5 @@
       StreetsideMainDialog.destroyInstance();
       //StreetsideHistoryDialog.destroyInstance();
-      //StreetsideChangesetDialog.destroyInstance();
+      StreetsideChangesetDialog.destroyInstance();
       //StreetsideFilterDialog.destroyInstance();
       ImageInfoPanel.destroyInstance();
@@ -131,6 +132,7 @@
    * @return the {@link StreetsideZoomAction} for the plugin
    */
-  /*public static StreetsideZoomAction getZoomAction() {
+  public static StreetsideZoomAction getZoomAction() {
     return ZOOM_ACTION;
-  }*/
   }
+
+}
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/actions/WalkThread.java	(revision 34333)
@@ -2,16 +2,19 @@
 package org.openstreetmap.josm.plugins.streetside.actions;
 
-import java.awt.image.BufferedImage;
-
 import javax.swing.SwingUtilities;
 
+import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
 import org.openstreetmap.josm.plugins.streetside.StreetsideData;
 import org.openstreetmap.josm.plugins.streetside.StreetsideDataListener;
+import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
+import org.openstreetmap.josm.plugins.streetside.StreetsidePlugin;
+import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils;
+import org.openstreetmap.josm.plugins.streetside.cache.StreetsideCache;
+import org.openstreetmap.josm.plugins.streetside.gui.StreetsideMainDialog;
+import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.Logging;
+
 import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
-import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
-import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils;
-import org.openstreetmap.josm.plugins.streetside.gui.StreetsideMainDialog;
-
 
 /**
@@ -27,5 +30,4 @@
   private final boolean followSelected;
   private final boolean goForward;
-  private BufferedImage lastImage;
   private volatile boolean paused;
 
@@ -52,31 +54,29 @@
   public void run() {
     try {
-      while (!end && data.getSelectedImage().next() != null) {
-        StreetsideAbstractImage image = data.getSelectedImage();
-        if (image != null && image.next() instanceof StreetsideImage) {
-          // Predownload next 10 thumbnails.
-          preDownloadImages((StreetsideImage) image.next(), 10, CacheUtils.PICTURE.THUMBNAIL);
-          // TODO: WalkThread for cubemaps? @rrh
-      	  //preDownloadCubemaps((StreetsideImage) image.next(), 10, CacheUtils.PICTURE.CUBEMAP);
-          if (waitForFullQuality) {
-            // Start downloading 3 next full images.
-            StreetsideAbstractImage currentImage = image.next();
-        	preDownloadImages((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.FULL_IMAGE);
-        	// TODO: WalkThread for cubemaps? @rrh
-        	/*if (StreetsideProperties.PREDOWNLOAD_CUBEMAPS.get().booleanValue()) {
-          	  preDownloadCubemaps((StreetsideImage) currentImage, 3, CacheUtils.PICTURE.CUBEMAP);
-            }*/
-          }
+      StreetsideAbstractImage curSelection;
+      StreetsideImage curImage;
+      while (
+          !end &&
+          (curSelection = data.getSelectedImage().next()) != null &&
+          (curImage = curSelection instanceof StreetsideImage ? (StreetsideImage) curSelection : null) != null
+      ) {
+        // Predownload next 10 thumbnails.
+        preDownloadImages(curImage, 10, CacheUtils.PICTURE.THUMBNAIL, goForward);
+        if (waitForFullQuality) {
+          // Start downloading 3 next full images.
+          preDownloadImages(curImage, 3, CacheUtils.PICTURE.FULL_IMAGE, goForward);
         }
         try {
-          // Waits for full quality picture.
-          final BufferedImage displayImage = StreetsideMainDialog.getInstance().getStreetsideImageDisplay().getImage();
-          if (waitForFullQuality && image instanceof StreetsideImage) {
-            while (displayImage == lastImage || displayImage == null || displayImage.getWidth() < 2048) {
-              Thread.sleep(100);
-            }
-          } else { // Waits for thumbnail.
-            while (displayImage == lastImage || displayImage == null || displayImage.getWidth() < 320) {
-              Thread.sleep(100);
+          // Wait for picture for 1 minute.
+          final StreetsideCache cache = new StreetsideCache(curImage.getId(), waitForFullQuality ? StreetsideCache.Type.FULL_IMAGE : StreetsideCache.Type.THUMBNAIL);
+          int limit = 240; // 240 * 250 = 60000 ms
+          while (cache.get() == null) {
+            Thread.sleep(250);
+            if (limit-- < 0) {
+              new Notification(I18n.tr("Walk mode: Waiting for next image takes too long! Exiting walk mode…"))
+                  .setIcon(StreetsidePlugin.LOGO.get())
+                  .show();
+              end();
+              return;
             }
           }
@@ -84,9 +84,8 @@
             Thread.sleep(100);
           }
-          wait(interval);
+          Thread.sleep(interval);
           while (paused) {
             Thread.sleep(100);
           }
-          lastImage = StreetsideMainDialog.getInstance().getStreetsideImageDisplay().getImage();
           if (goForward) {
             data.selectNext(followSelected);
@@ -95,52 +94,12 @@
           }
         } catch (InterruptedException e) {
+          end();
           return;
         }
+
       }
-
-    	// TODO: WalkThread for cubemaps? @rrh
-      	/*while (!end && data.getSelectedImage().next() != null) {
-            StreetsideAbstractImage cubemap = data.getSelectedImage();
-            if (cubemap != null && cubemap.next() instanceof StreetsideCubemap) {
-              if (waitForFullQuality) {
-                // Start downloading 3 next full images.
-
-            	// TODO: cubemap handling @rrh
-            	preDownloadCubemaps((StreetsideCubemap) cubemap.next(), 6, CacheUtils.PICTURE.CUBEMAP);
-              }
-            }
-            try {
-              // Waits for full quality picture.
-              final BufferedImage[] displayCubemap = StreetsideMainDialog.getInstance().streetsideViewerDisplay.getCubemap();
-              if (waitForFullQuality && cubemap instanceof StreetsideCubemap) {
-                  // TODO: handle cubemap width? @rrh
-            	  while (displayCubemap == lastCubemap || displayCubemap == null || displayCubemap.getWidth() < 2048) {
-                  Thread.sleep(100);
-                }
-              } else { // Waits for thumbnail.
-            	  // TODO: handle cubemap width? @rrh
-            	  while (displayCubemap == lastCubemap || displayCubemap == null || displayCubemap.getWidth() < 320) {
-                  Thread.sleep(100);
-                }
-              }
-              while (paused) {
-                Thread.sleep(100);
-              }
-              wait(interval);
-              while (paused) {
-                Thread.sleep(100);
-              }
-              lastCubemap = StreetsideMainDialog.getInstance().streetsideViewerDisplay.getCubemap();
-              // TODO: forward / previous for cubemap? @rrh
-              if (goForward) {
-                data.selectNext(followSelected);
-              } else {
-                data.selectPrevious(followSelected);
-              }
-            } catch (InterruptedException e) {
-              return;
-            }
-          }*/
     } catch (NullPointerException e) {
+      Logging.warn(e);
+      end();
       // TODO: Avoid NPEs instead of waiting until they are thrown and then catching them
       return;
@@ -149,22 +108,5 @@
   }
 
-  private void preDownloadCubemaps(StreetsideImage startImage, int n, CacheUtils.PICTURE type) {
-	  if (n >= 1 && startImage != null) {
-
-		  for (int i = 0; i < 6; i++) {
-				for (int j = 0; j < 4; j++) {
-					for (int k = 0; k < 4; k++) {
-
-						CacheUtils.downloadPicture(startImage, type);
-						if (startImage.next() instanceof StreetsideImage && n >= 2) {
-							preDownloadImages((StreetsideImage) startImage.next(), n - 1, type);
-						}
-					}
-				}
-		  }
-	  }
-  }
-
-/**
+  /**
    * Downloads n images into the cache beginning from the supplied start-image (including the start-image itself).
    *
@@ -172,10 +114,12 @@
    * @param n the number of images to download
    * @param type the quality of the image (full or thumbnail)
+   * @param goForward true if the next images, false if the previous ones should be downloaded
    */
-  private static void preDownloadImages(StreetsideImage startImage, int n, CacheUtils.PICTURE type) {
+  private static void preDownloadImages(StreetsideImage startImage, int n, CacheUtils.PICTURE type, final boolean goForward) {
     if (n >= 1 && startImage != null) {
       CacheUtils.downloadPicture(startImage, type);
-      if (startImage.next() instanceof StreetsideImage && n >= 2) {
-        preDownloadImages((StreetsideImage) startImage.next(), n - 1, type);
+      final StreetsideAbstractImage nextImg = goForward ? startImage.next() : startImage.previous();
+      if (nextImg instanceof StreetsideImage && n >= 2) {
+        preDownloadImages((StreetsideImage) nextImg, n - 1, type, goForward);
       }
     }
@@ -224,5 +168,5 @@
    * Called when the walk stops by itself of forcefully.
    */
-  public void end() {
+  private void end() {
     if (SwingUtilities.isEventDispatchThread()) {
       end = true;
@@ -232,12 +176,4 @@
       SwingUtilities.invokeLater(this::end);
     }
-    // TODO: WalkThread for Cubemaps? @rrh
-    /*if (Platform.isEventDispatchThread()) {
-        end = true;
-        data.removeListener(this);
-        StreetsideViewerDialog.getInstance().setMode(StreetsideViewerDialog.MODE.NORMAL);
-      } else {
-        Platform.invokeLater(this::end);
-      }*/
   }
 }
Index: /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideExportDialog.java
===================================================================
--- /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideExportDialog.java	(revision 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideExportDialog.java	(revision 34333)
@@ -134,6 +134,5 @@
 
     private static final long serialVersionUID = 1035332841101190301L;
-
-	private String lastPath;
+    private String lastPath;
     private final StreetsideExportDialog dlg;
 
Index: /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideImageDisplay.java
===================================================================
--- /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideImageDisplay.java	(revision 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideImageDisplay.java	(revision 34333)
@@ -39,4 +39,6 @@
  *
  * @author nokutu
+ * @author renerr18
+ * 
  * @see StreetsideImageDisplay
  * @see StreetsideMainDialog
@@ -80,5 +82,5 @@
         visibleRect = StreetsideImageDisplay.this.visibleRect;
       }
-      mouseIsDragging = false;
+      this.mouseIsDragging = false;
       selectedRect = null;
       if (image != null && Math.min(getSize().getWidth(), getSize().getHeight()) > 0) {
@@ -89,7 +91,7 @@
         // borders, this point is not calculated
         // again if there was less than 1.5seconds since the last event.
-        if (e.getWhen() - lastTimeForMousePoint > 1500 || mousePointInImg == null) {
-          lastTimeForMousePoint = e.getWhen();
-          mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
+        if (e.getWhen() - this.lastTimeForMousePoint > 1500 || this.mousePointInImg == null) {
+          this.lastTimeForMousePoint = e.getWhen();
+          this.mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
         }
         // Set the zoom to the visible rectangle in image coordinates
@@ -121,7 +123,7 @@
         // cursor doesn't move on the image.
         Rectangle drawRect = calculateDrawImageRectangle(visibleRect);
-        visibleRect.x = mousePointInImg.x
+        visibleRect.x = this.mousePointInImg.x
             + ((drawRect.x - e.getX()) * visibleRect.width) / drawRect.width;
-        visibleRect.y = mousePointInImg.y
+        visibleRect.y = this.mousePointInImg.y
             + ((drawRect.y - e.getY()) * visibleRect.height) / drawRect.height;
         // The position is also limited by the image size
@@ -185,6 +187,6 @@
     public void mousePressed(MouseEvent e) {
       if (getImage() == null) {
-        mouseIsDragging = false;
-        selectedRect = null;
+        this.mouseIsDragging = false;
+       StreetsideImageDisplay.this.selectedRect = null;
         return;
       }
@@ -198,16 +200,16 @@
         return;
       if (e.getButton() == StreetsideProperties.PICTURE_DRAG_BUTTON.get()) {
-        mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
-        mouseIsDragging = true;
-        selectedRect = null;
+        this.mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
+        this.mouseIsDragging = true;
+        StreetsideImageDisplay.this.selectedRect = null;
       } else if (e.getButton() == StreetsideProperties.PICTURE_ZOOM_BUTTON.get()) {
         mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
-        checkPointInVisibleRect(mousePointInImg, visibleRect);
-        mouseIsDragging = false;
-        selectedRect = new Rectangle(mousePointInImg.x, mousePointInImg.y, 0, 0);
+        checkPointInVisibleRect(this.mousePointInImg, visibleRect);
+        this.mouseIsDragging = false;
+        StreetsideImageDisplay.this.selectedRect = new Rectangle(mousePointInImg.x, mousePointInImg.y, 0, 0);
         StreetsideImageDisplay.this.repaint();
       } else {
-        mouseIsDragging = false;
-        selectedRect = null;
+        this.mouseIsDragging = false;
+        StreetsideImageDisplay.this.selectedRect = null;
       }
     }
@@ -215,5 +217,5 @@
     @Override
     public void mouseDragged(MouseEvent e) {
-      if (!mouseIsDragging && selectedRect == null)
+      if (!this.mouseIsDragging && StreetsideImageDisplay.this.selectedRect == null)
         return;
       Image image;
@@ -224,12 +226,12 @@
       }
       if (image == null) {
-        mouseIsDragging = false;
-        selectedRect = null;
+        this.mouseIsDragging = false;
+        StreetsideImageDisplay.this.selectedRect = null;
         return;
       }
-      if (mouseIsDragging) {
+      if (this.mouseIsDragging) {
         Point p = comp2imgCoord(visibleRect, e.getX(), e.getY());
-        visibleRect.x += mousePointInImg.x - p.x;
-        visibleRect.y += mousePointInImg.y - p.y;
+        visibleRect.x += this.mousePointInImg.x - p.x;
+        visibleRect.y += this.mousePointInImg.y - p.y;
         checkVisibleRectPos(image, visibleRect);
         synchronized (StreetsideImageDisplay.this) {
@@ -237,16 +239,16 @@
         }
         StreetsideImageDisplay.this.repaint();
-      } else if (selectedRect != null) {
+      } else if (StreetsideImageDisplay.this.selectedRect != null) {
         Point p = comp2imgCoord(visibleRect, e.getX(), e.getY());
         checkPointInVisibleRect(p, visibleRect);
-        Rectangle rect = new Rectangle(p.x < mousePointInImg.x ? p.x
-            : mousePointInImg.x, p.y < mousePointInImg.y ? p.y
-            : mousePointInImg.y, p.x < mousePointInImg.x ? mousePointInImg.x
-            - p.x : p.x - mousePointInImg.x,
-            p.y < mousePointInImg.y ? mousePointInImg.y - p.y : p.y
-                - mousePointInImg.y);
+        Rectangle rect = new Rectangle(p.x < this.mousePointInImg.x ? p.x
+            : this.mousePointInImg.x, p.y < this.mousePointInImg.y ? p.y
+            : this.mousePointInImg.y, p.x < this.mousePointInImg.x ? this.mousePointInImg.x
+            - p.x : p.x - this.mousePointInImg.x,
+            p.y < this.mousePointInImg.y ? this.mousePointInImg.y - p.y : p.y
+                - this.mousePointInImg.y);
         checkVisibleRectSize(image, rect);
         checkVisibleRectPos(image, rect);
-        selectedRect = rect;
+        StreetsideImageDisplay.this.selectedRect = rect;
         StreetsideImageDisplay.this.repaint();
       }
@@ -255,5 +257,5 @@
     @Override
     public void mouseReleased(MouseEvent e) {
-      if (!mouseIsDragging && selectedRect == null)
+      if (!this.mouseIsDragging && StreetsideImageDisplay.this.selectedRect == null)
         return;
       Image image;
@@ -262,42 +264,42 @@
       }
       if (image == null) {
-        mouseIsDragging = false;
-        selectedRect = null;
+        this.mouseIsDragging = false;
+        StreetsideImageDisplay.this.selectedRect = null;
         return;
       }
-      if (mouseIsDragging) {
-        mouseIsDragging = false;
-      } else if (selectedRect != null) {
-        int oldWidth = selectedRect.width;
-        int oldHeight = selectedRect.height;
+      if (this.mouseIsDragging) {
+        this.mouseIsDragging = false;
+      } else if (StreetsideImageDisplay.this.selectedRect != null) {
+        int oldWidth = StreetsideImageDisplay.this.selectedRect.width;
+        int oldHeight = StreetsideImageDisplay.this.selectedRect.height;
         // Check that the zoom doesn't exceed 2:1
-        if (selectedRect.width < getSize().width / 2) {
-        	selectedRect.width = getSize().width / 2;
-        }
-        if (selectedRect.height < getSize().height / 2) {
-        	selectedRect.height = getSize().height / 2;
+        if (StreetsideImageDisplay.this.selectedRect.width < getSize().width / 2) {
+        	StreetsideImageDisplay.this.selectedRect.width = getSize().width / 2;
+        }
+        if (StreetsideImageDisplay.this.selectedRect.height < getSize().height / 2) {
+        	StreetsideImageDisplay.this.selectedRect.height = getSize().height / 2;
         }
         // Set the same ratio for the visible rectangle and the display
         // area
-        int hFact = selectedRect.height * getSize().width;
-        int wFact = selectedRect.width * getSize().height;
+        int hFact = StreetsideImageDisplay.this.selectedRect.height * getSize().width;
+        int wFact = StreetsideImageDisplay.this.selectedRect.width * getSize().height;
         if (hFact > wFact) {
-          selectedRect.width = hFact / getSize().height;
+        	StreetsideImageDisplay.this.selectedRect.width = hFact / getSize().height;
         } else {
-          selectedRect.height = wFact / getSize().width;
+        	StreetsideImageDisplay.this.selectedRect.height = wFact / getSize().width;
         }
         // Keep the center of the selection
-        if (selectedRect.width != oldWidth) {
-        	selectedRect.x -= (selectedRect.width - oldWidth) / 2;
-        }
-        if (selectedRect.height != oldHeight) {
-        	selectedRect.y -= (selectedRect.height - oldHeight) / 2;
-        }
-        checkVisibleRectSize(image, selectedRect);
-        checkVisibleRectPos(image, selectedRect);
+        if (StreetsideImageDisplay.this.selectedRect.width != oldWidth) {
+        	StreetsideImageDisplay.this.selectedRect.x -= (StreetsideImageDisplay.this.selectedRect.width - oldWidth) / 2;
+        }
+        if (StreetsideImageDisplay.this.selectedRect.height != oldHeight) {
+        	StreetsideImageDisplay.this.selectedRect.y -= (StreetsideImageDisplay.this.selectedRect.height - oldHeight) / 2;
+        }
+        checkVisibleRectSize(image, StreetsideImageDisplay.this.selectedRect);
+        checkVisibleRectPos(image, StreetsideImageDisplay.this.selectedRect);
         synchronized (StreetsideImageDisplay.this) {
-          visibleRect = selectedRect;
-        }
-        selectedRect = null;
+          StreetsideImageDisplay.this.visibleRect = StreetsideImageDisplay.this.selectedRect;
+        }
+        StreetsideImageDisplay.this.selectedRect = null;
         StreetsideImageDisplay.this.repaint();
       }
@@ -360,7 +362,7 @@
         this.detections.addAll(detections);
       }
-      selectedRect = null;
+      this.selectedRect = null;
       if (image != null)
-        visibleRect = new Rectangle(0, 0, image.getWidth(null),
+        this.visibleRect = new Rectangle(0, 0, image.getWidth(null),
             image.getHeight(null));
     }
@@ -374,5 +376,5 @@
    */
   public BufferedImage getImage() {
-    return image;
+    return this.image;
   }
 
@@ -402,9 +404,9 @@
           + target.height, visibleRect.x, visibleRect.y, visibleRect.x
           + visibleRect.width, visibleRect.y + visibleRect.height, null);
-      if (selectedRect != null) {
-        Point topLeft = img2compCoord(visibleRect, selectedRect.x,
-            selectedRect.y);
-        Point bottomRight = img2compCoord(visibleRect, selectedRect.x
-            + selectedRect.width, selectedRect.y + selectedRect.height);
+      if (this.selectedRect != null) {
+        Point topLeft = img2compCoord(visibleRect, this.selectedRect.x,
+            this.selectedRect.y);
+        Point bottomRight = img2compCoord(visibleRect, this.selectedRect.x
+            + this.selectedRect.width, this.selectedRect.y + this.selectedRect.height);
         g.setColor(new Color(128, 128, 128, 180));
         g.fillRect(target.x, target.y, target.width, topLeft.y - target.y);
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/StreetsideMainDialog.java	(revision 34333)
@@ -1,4 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.streetside.gui;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
 
 import java.awt.BorderLayout;
@@ -14,5 +18,4 @@
 import javax.imageio.ImageIO;
 import javax.swing.AbstractAction;
-import javax.swing.Action;
 import javax.swing.JComponent;
 import javax.swing.KeyStroke;
@@ -34,7 +37,6 @@
 import org.openstreetmap.josm.plugins.streetside.cache.StreetsideCache;
 import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.ImageInfoHelpPopup;
-import org.openstreetmap.josm.plugins.streetside.gui.imageinfo.StreetsideViewerHelpPopup;
+import org.openstreetmap.josm.plugins.streetside.model.UserProfile;
 import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
-import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -44,608 +46,569 @@
  *
  * @author nokutu
- * @author renerr18
  */
 public final class StreetsideMainDialog extends ToggleDialog implements
-		ICachedLoaderListener, StreetsideDataListener {
-
-	private static final long serialVersionUID = 2645654786827812861L;
-
-	public static final String BASE_TITLE = I18n.marktr("Microsoft Streetside image");
-	private static final String MESSAGE_SEPARATOR = " — ";
-
-	private static StreetsideMainDialog instance;
-
-	private volatile StreetsideAbstractImage image;
-
-	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 ImageInfoHelpPopup imageInfoHelp;
-
-	private StreetsideViewerHelpPopup streetsideViewerHelp;
-
-	/**
-	 * Buttons mode.
-	 *
-	 * @author nokutu
-	 */
-	public enum MODE {
-		/**
-		 * Standard mode to view pictures.
-		 */
-		NORMAL,
-		/**
-		 * Mode when in walk.
-		 */
-		WALK
-	}
-
-	/**
-	 * Object containing the shown image and that handles zoom and drag
-	 */
-	public StreetsideImageDisplay streetsideImageDisplay;
-
-	private StreetsideCache imageCache;
-	public StreetsideCache thumbnailCache;
-
-	private StreetsideMainDialog() {
-		super(I18n.tr(StreetsideMainDialog.BASE_TITLE), "streetside-main", I18n.tr("Open Streetside window"), null, 200,
-				true, StreetsidePreferenceSetting.class);
-		addShortcuts();
-
-		streetsideImageDisplay = new StreetsideImageDisplay();
-
-		blueButton.setForeground(Color.BLUE);
-		redButton.setForeground(Color.RED);
-
-		// TODO: Modes for cubemaps? @rrh
-		setMode(MODE.NORMAL);
-	}
-
-	/**
-	 * Adds the shortcuts to the buttons.
-	 */
-	private void addShortcuts() {
-		nextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-				KeyStroke.getKeyStroke("PAGE_DOWN"), "next");
-		nextButton.getActionMap().put("next", new NextPictureAction());
-		previousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-				KeyStroke.getKeyStroke("PAGE_UP"), "previous");
-		previousButton.getActionMap().put("previous",
-				new PreviousPictureAction());
-		blueButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-				KeyStroke.getKeyStroke("control PAGE_UP"), "blue");
-		blueButton.getActionMap().put("blue", new BlueAction());
-		redButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-				KeyStroke.getKeyStroke("control PAGE_DOWN"), "red");
-		redButton.getActionMap().put("red", new RedAction());
-	}
-
-	/**
-	 * Returns the unique instance of the class.
-	 *
-	 * @return The unique instance of the class.
-	 */
-	public static synchronized StreetsideMainDialog getInstance() {
-		if (StreetsideMainDialog.instance == null) {
-			StreetsideMainDialog.instance = new StreetsideMainDialog();
-		}
-		return StreetsideMainDialog.instance;
-	}
-
-	/**
-	 * @return true, iff the singleton instance is present
-	 */
-	public static boolean hasInstance() {
-		return StreetsideMainDialog.instance != null;
-	}
-
-	public synchronized void setImageInfoHelp(ImageInfoHelpPopup popup) {
-		imageInfoHelp = popup;
-	}
-
-	public synchronized void setStreetsideViewerHelp(StreetsideViewerHelpPopup popup) {
-		streetsideViewerHelp = popup;
-	}
-
-	/**
-	 * @return the streetsideViewerHelp
-	 */
-	public StreetsideViewerHelpPopup getStreetsideViewerHelp() {
-		return streetsideViewerHelp;
-	}
-
-	/**
-	 * Sets a new mode for the dialog.
-	 *
-	 * @param mode The mode to be set. Must not be {@code null}.
-	 */
-	public void setMode(MODE mode) {
-		switch (mode) {
-		case WALK:
-			createLayout(
-				streetsideImageDisplay,
-				Arrays.asList(playButton, pauseButton, stopButton)
-			);
-		case NORMAL:
-		default:
-			createLayout(
-		        streetsideImageDisplay,
-		        Arrays.asList(blueButton, previousButton, nextButton, redButton)
-		    );
-		}
-		disableAllButtons();
-		if (MODE.NORMAL.equals(mode)) {
-			updateImage();
-		} 	}
-
-	/**
-	 * Destroys the unique instance of the class.
-	 */
-	public static synchronized void destroyInstance() {
-		StreetsideMainDialog.instance = null;
-	}
-
-	/**
-	 * Downloads the full quality picture of the selected StreetsideImage and sets
-	 * in the StreetsideImageDisplay object.
-	 */
-	public synchronized void updateImage() {
-		updateImage(true);
-	}
-
-	/**
-	 * Downloads the picture of the selected StreetsideImage and sets in the
-	 * StreetsideImageDisplay object.
-	 *
-	 * @param fullQuality If the full quality picture must be downloaded or just the
-	 *                    thumbnail.
-	 */
-	public synchronized void updateImage(boolean fullQuality) {
-		if (!SwingUtilities.isEventDispatchThread()) {
-			SwingUtilities.invokeLater(this::updateImage);
-		} else {
-			if (!StreetsideLayer.hasInstance()) {
-				return;
-			}
-			if (image == null) {
-				streetsideImageDisplay.setImage(null, null);
-				setTitle(I18n.tr(StreetsideMainDialog.BASE_TITLE));
-				disableAllButtons();
-				return;
-			}
-
-			// TODO: help for cubemaps? @rrh
-			if (imageInfoHelp != null && StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.get() > 0 && imageInfoHelp.showPopup()) {
-				// Count down the number of times the popup will be displayed
-				StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.put(StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.get() - 1);
-			}
-
-			// Enables/disables next/previous buttons
-			nextButton.setEnabled(false);
-			previousButton.setEnabled(false);
-			if (image.getSequence() != null) {
-				StreetsideAbstractImage tempImage = image;
-				while (tempImage.next() != null) {
-					tempImage = tempImage.next();
-					if (tempImage.isVisible()) {
-						nextButton.setEnabled(true);
-						break;
-					}
-				}
-			}
-			if (image.getSequence() != null) {
-				StreetsideAbstractImage tempImage = image;
-				while (tempImage.previous() != null) {
-					tempImage = tempImage.previous();
-					if (tempImage.isVisible()) {
-						previousButton.setEnabled(true);
-						break;
-					}
-				}
-			}
-			if (image instanceof StreetsideImage) {
-				final StreetsideImage streetsideImage = (StreetsideImage) image;
-				// Downloads the thumbnail.
-				streetsideImageDisplay.setImage(null, null);
-				if (thumbnailCache != null) {
-					thumbnailCache.cancelOutstandingTasks();
-				}
-				thumbnailCache = new StreetsideCache(streetsideImage.getId(),
-						StreetsideCache.Type.THUMBNAIL);
-				try {
-					thumbnailCache.submit(this, false);
-				} catch (final IOException e) {
-					Logging.error(e);
-				}
-
-				// Downloads the full resolution image.
-				if (fullQuality || new StreetsideCache(streetsideImage.getId(),
-						StreetsideCache.Type.FULL_IMAGE).get() != null) {
-					if (imageCache != null) {
-						imageCache.cancelOutstandingTasks();
-					}
-					imageCache = new StreetsideCache(streetsideImage.getId(),
-							StreetsideCache.Type.FULL_IMAGE);
-					try {
-						imageCache.submit(this, false);
-					} catch (final IOException e) {
-						Logging.error(e);
-					}
-				}
-			// TODO: handle/convert/remove "imported images"
-			} /*else if (image instanceof StreetsideImportedImage) {
-				final StreetsideImportedImage streetsideImage = (StreetsideImportedImage) image;
-				try {
-					streetsideImageDisplay.setImage(streetsideImage.getImage(), null);
-				} catch (final IOException e) {
-					Logging.error(e);
-				}
-			}*/
-			updateTitle();
-		}
-	}
-
-	/**
-	 * Disables all the buttons in the dialog
-	 */
-	public /*private*/ void disableAllButtons() {
-		nextButton.setEnabled(false);
-		previousButton.setEnabled(false);
-		blueButton.setEnabled(false);
-		redButton.setEnabled(false);
-	}
-
-	/**
-	 * Sets a new StreetsideImage to be shown.
-	 *
-	 * @param image The image to be shown.
-	 */
-	public synchronized void setImage(StreetsideAbstractImage image) {
-		this.image = image;
-	}
-
-	/**
-	 * Updates the title of the dialog.
-	 */
-	// TODO: update title for 360 degree viewer? @rrh
-	public synchronized void updateTitle() {
-		if (!SwingUtilities.isEventDispatchThread()) {
-			SwingUtilities.invokeLater(this::updateTitle);
-		} else if (image != null) {
-			final StringBuilder title = new StringBuilder(I18n.tr(StreetsideMainDialog.BASE_TITLE));
-			if (image instanceof StreetsideImage) {
-				final StreetsideImage streetsideImage = (StreetsideImage) image;
-				if (streetsideImage.getCd() != 0) {
-					title.append(StreetsideMainDialog.MESSAGE_SEPARATOR).append(streetsideImage.getDate());
-				}
-				setTitle(title.toString());
-			} else if (image instanceof StreetsideImportedImage) {
-				final StreetsideImportedImage mapillaryImportedImage = (StreetsideImportedImage) image;
-				title.append(StreetsideMainDialog.MESSAGE_SEPARATOR).append(mapillaryImportedImage.getFile().getName());
-				title.append(StreetsideMainDialog.MESSAGE_SEPARATOR).append(mapillaryImportedImage.getDate());
-				setTitle(title.toString());
-			}
-		}
-	}
-
-	/**
-	 * Returns the {@link StreetsideAbstractImage} object which is being shown.
-	 *
-	 * @return The {@link StreetsideAbstractImage} object which is being shown.
-	 */
-	public synchronized StreetsideAbstractImage getImage() {
-		return image;
-	}
-
-	/**
-	 * Action class form the next image button.
-	 *
-	 * @author nokutu
-	 */
-	private static class NextPictureAction extends AbstractAction {
-
-		private static final long serialVersionUID = 6333692154558730392L;
-
-		/**
-		 * Constructs a normal NextPictureAction
-		 */
-		NextPictureAction() {
-			super(I18n.tr("Next picture"));
-			putValue(Action.SHORT_DESCRIPTION, I18n.tr("Shows the next picture in the sequence"));
-			new ImageProvider("help", "next").getResource().attachImageIcon(this, true);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			StreetsideLayer.getInstance().getData().selectNext();
-		}
-	}
-
-	/**
-	 * Action class for the previous image button.
-	 *
-	 * @author nokutu
-	 */
-	private static class PreviousPictureAction extends AbstractAction {
-
-		private static final long serialVersionUID = 4390593660514657107L;
-
-		/**
-		 * Constructs a normal PreviousPictureAction
-		 */
-		PreviousPictureAction() {
-			super(I18n.tr("Previous picture"));
-			putValue(Action.SHORT_DESCRIPTION, I18n.tr("Shows the previous picture in the sequence"));
-			new ImageProvider("help", "previous").getResource().attachImageIcon(this, true);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			StreetsideLayer.getInstance().getData().selectPrevious();
-		}
-	}
-
-	/**
-	 * Action class to jump to the image following the red line.
-	 *
-	 * @author nokutu
-	 */
-	private static class RedAction extends AbstractAction {
-
-		private static final long serialVersionUID = -1244456062285831231L;
-
-		/**
-		 * Constructs a normal RedAction
-		 */
-		RedAction() {
-			putValue(Action.NAME, I18n.tr("Jump to red"));
-			putValue(Action.SHORT_DESCRIPTION,
-					I18n.tr("Jumps to the picture at the other side of the red line"));
-			new ImageProvider("dialogs", "red").getResource().attachImageIcon(this, true);
-		}
-
-		// TODO: RedAction for cubemaps? @rrh
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			if (StreetsideMainDialog.getInstance().getImage() != null) {
-				StreetsideLayer.getInstance().getData()
-				.setSelectedImage(StreetsideLayer.getInstance().getNNearestImage(1), true);
-			}
-		}
-	}
-
-	/**
-	 * Action class to jump to the image following the blue line.
-	 *
-	 * @author nokutu
-	 */
-	private static class BlueAction extends AbstractAction {
-
-		private static final long serialVersionUID = 5951233534212838780L;
-
-		/**
-		 * Constructs a normal BlueAction
-		 */
-		BlueAction() {
-			putValue(Action.NAME, I18n.tr("Jump to blue"));
-			putValue(Action.SHORT_DESCRIPTION,
-					I18n.tr("Jumps to the picture at the other side of the blue line"));
-			new ImageProvider("dialogs", "blue").getResource().attachImageIcon(this, true);
-		}
-
-		// TODO: BlueAction for cubemaps?
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			if (StreetsideMainDialog.getInstance().getImage() != null) {
-				StreetsideLayer.getInstance().getData()
-				.setSelectedImage(StreetsideLayer.getInstance().getNNearestImage(2), true);
-			}
-		}
-	}
-
-	private static class StopAction extends AbstractAction implements WalkListener {
-
-		private static final long serialVersionUID = 8789972456611625341L;
-
-		private WalkThread thread;
-
-		/**
-		 * Constructs a normal StopAction
-		 */
-		StopAction() {
-			putValue(Action.NAME, I18n.tr("Stop"));
-			putValue(Action.SHORT_DESCRIPTION, I18n.tr("Stops the walk."));
-			new ImageProvider("dialogs/streetsideStop.png").getResource().attachImageIcon(this, true);
-			StreetsidePlugin.getStreetsideWalkAction().addListener(this);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			if (thread != null) {
-				thread.stopWalk();
-			}
-		}
-
-		@Override
-		public void walkStarted(WalkThread thread) {
-			this.thread = thread;
-		}
-	}
-
-	private static class PlayAction extends AbstractAction implements WalkListener {
-
-		private static final long serialVersionUID = -1572747020946842769L;
-
-		private transient WalkThread thread;
-
-		/**
-		 * Constructs a normal PlayAction
-		 */
-		PlayAction() {
-			putValue(Action.NAME, I18n.tr("Play"));
-			putValue(Action.SHORT_DESCRIPTION, I18n.tr("Continues with the paused walk."));
-			new ImageProvider("dialogs/streetsidePlay.png").getResource().attachImageIcon(this, true);
-			StreetsidePlugin.getStreetsideWalkAction().addListener(this);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			if (thread != null) {
-				thread.play();
-			}
-		}
-
-		@Override
-		public void walkStarted(WalkThread thread) {
-			if (thread != null) {
-				this.thread = thread;
-			}
-		}
-	}
-
-	private static class PauseAction extends AbstractAction implements WalkListener {
-
-		/**
-		 *
-		 */
-		private static final long serialVersionUID = -8758326399460817222L;
-		private WalkThread thread;
-
-		/**
-		 * Constructs a normal PauseAction
-		 */
-		PauseAction() {
-			putValue(Action.NAME, I18n.tr("Pause"));
-			putValue(Action.SHORT_DESCRIPTION, I18n.tr("Pauses the walk."));
-			new ImageProvider("dialogs/streetsidePause.png").getResource().attachImageIcon(this, true);
-			StreetsidePlugin.getStreetsideWalkAction().addListener(this);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			thread.pause();
-		}
-
-		@Override
-		public void walkStarted(WalkThread thread) {
-			this.thread = thread;
-		}
-	}
-
-	/**
-	 * When the pictures are returned from the cache, they are set in the
-	 * {@link StreetsideImageDisplay} object.
-	 */
-	@Override
-	public void loadingFinished(final CacheEntry data, final CacheEntryAttributes attributes, final LoadResult result) {
-		if (!SwingUtilities.isEventDispatchThread()) {
-			SwingUtilities.invokeLater(() -> loadingFinished(data, attributes, result));
-
-		} else if (data != null && result == LoadResult.SUCCESS) {
-			try {
-				final BufferedImage img = ImageIO.read(new ByteArrayInputStream(data.getContent()));
-				if (img == null) {
-					return;
-				}
-				if (
-						streetsideImageDisplay.getImage() == null
-						|| img.getHeight() > streetsideImageDisplay.getImage().getHeight()
-						) {
-					//final StreetsideAbstractImage mai = getImage();
-					streetsideImageDisplay.setImage(
-							img,
-							//mai instanceof StreetsideImage ? ((StreetsideImage) getImage()).getDetections() : null
-							null);
-				}
-			} catch (final IOException e) {
-				Logging.error(e);
-			}
-		}
-	}
-
-
-	/**
-	 * Creates the layout of the dialog.
-	 *
-	 * @param data    The content of the dialog
-	 * @param buttons The buttons where you can click
-	 */
-	public void createLayout(Component data, List<SideButton> buttons) {
-		removeAll();
-		createLayout(data, true, buttons);
-		add(titleBar, BorderLayout.NORTH);
-	}
-
-	@Override
-	public void selectedImageChanged(StreetsideAbstractImage oldImage, StreetsideAbstractImage newImage) {
-		setImage(newImage);
-		updateImage();
-	}
-
-	@Override
-	public void imagesAdded() {
-		// This method is enforced by StreetsideDataListener, but only selectedImageChanged() is needed
-	}
-
-	/**
-	 * @return the streetsideImageDisplay
-	 */
-	public StreetsideImageDisplay getStreetsideImageDisplay() {
-		return streetsideImageDisplay;
-	}
-
-	/**
-	 * @param streetsideImageDisplay the streetsideImageDisplay to set
-	 */
-	public void setStreetsideImageDisplay(StreetsideImageDisplay streetsideImageDisplay) {
-		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;
-	}*/
+        ICachedLoaderListener, StreetsideDataListener {
+
+  private static final long serialVersionUID = 6856496736429480600L;
+
+  private static final String BASE_TITLE = marktr("Streetside image");
+  private static final String MESSAGE_SEPARATOR = " — ";
+
+  private static StreetsideMainDialog instance;
+
+  private volatile StreetsideAbstractImage image;
+
+  private final SideButton nextButton = new SideButton(new NextPictureAction());
+  private 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 ImageInfoHelpPopup imageInfoHelp;
+
+  /**
+   * Buttons mode.
+   *
+   * @author nokutu
+   */
+  public enum MODE {
+    /**
+     * Standard mode to view pictures.
+     */
+    NORMAL,
+    /**
+     * Mode when in walk.
+     */
+    WALK
+  }
+
+  /**
+   * Object containing the shown image and that handles zoom and drag
+   */
+  public final StreetsideImageDisplay streetsideImageDisplay;
+
+  private StreetsideCache imageCache;
+  private StreetsideCache thumbnailCache;
+
+  private StreetsideMainDialog() {
+    super(tr(BASE_TITLE), "streetside-main", tr("Open Streetside window"), null, 200,
+        true, StreetsidePreferenceSetting.class);
+    addShortcuts();
+    streetsideImageDisplay = new StreetsideImageDisplay();
+
+    blueButton.setForeground(Color.BLUE);
+    redButton.setForeground(Color.RED);
+
+    setMode(MODE.NORMAL);
+  }
+
+  /**
+   * Adds the shortcuts to the buttons.
+   */
+  private void addShortcuts() {
+    nextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            KeyStroke.getKeyStroke("PAGE_DOWN"), "next");
+    nextButton.getActionMap().put("next", new NextPictureAction());
+    previousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            KeyStroke.getKeyStroke("PAGE_UP"), "previous");
+    previousButton.getActionMap().put("previous",
+            new PreviousPictureAction());
+    blueButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            KeyStroke.getKeyStroke("control PAGE_UP"), "blue");
+    blueButton.getActionMap().put("blue", new BlueAction());
+    redButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            KeyStroke.getKeyStroke("control PAGE_DOWN"), "red");
+    redButton.getActionMap().put("red", new RedAction());
+  }
+
+  /**
+   * Returns the unique instance of the class.
+   *
+   * @return The unique instance of the class.
+   */
+  public static synchronized StreetsideMainDialog getInstance() {
+    if (instance == null)
+      instance = new StreetsideMainDialog();
+    return instance;
+  }
+
+  /**
+   * @return true, iff the singleton instance is present
+   */
+  public static boolean hasInstance() {
+    return instance != null;
+  }
+
+  public synchronized void setImageInfoHelp(ImageInfoHelpPopup popup) {
+    imageInfoHelp = popup;
+  }
+
+  /**
+   * Sets a new mode for the dialog.
+   *
+   * @param mode The mode to be set. Must not be {@code null}.
+   */
+  public void setMode(MODE mode) {
+    switch (mode) {
+      case WALK:
+        createLayout(
+          streetsideImageDisplay,
+          Arrays.asList(playButton, pauseButton, stopButton)
+        );
+        break;
+      case NORMAL:
+      default:
+        createLayout(
+          streetsideImageDisplay,
+          Arrays.asList(blueButton, previousButton, nextButton, redButton)
+        );
+        break;
+    }
+    disableAllButtons();
+    if (MODE.NORMAL.equals(mode)) {
+      updateImage();
+    }
+    revalidate();
+    repaint();
+  }
+
+  /**
+   * Destroys the unique instance of the class.
+   */
+  public static synchronized void destroyInstance() {
+    instance = null;
+  }
+
+  /**
+   * Downloads the full quality picture of the selected StreetsideImage and sets
+   * in the StreetsideImageDisplay object.
+   */
+  public synchronized void updateImage() {
+    updateImage(true);
+  }
+
+  /**
+   * Downloads the picture of the selected StreetsideImage and sets in the
+   * StreetsideImageDisplay object.
+   *
+   * @param fullQuality If the full quality picture must be downloaded or just the
+   *                    thumbnail.
+   */
+  public synchronized void updateImage(boolean fullQuality) {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(this::updateImage);
+    } else {
+      if (!StreetsideLayer.hasInstance()) {
+        return;
+      }
+      if (image == null) {
+        streetsideImageDisplay.setImage(null, null);
+        setTitle(tr(BASE_TITLE));
+        disableAllButtons();
+        return;
+      }
+
+      if (imageInfoHelp != null && StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.get() > 0 && imageInfoHelp.showPopup()) {
+        // Count down the number of times the popup will be displayed
+        StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.put(StreetsideProperties.IMAGEINFO_HELP_COUNTDOWN.get() - 1);
+      }
+
+      // Enables/disables next/previous buttons
+      nextButton.setEnabled(false);
+      previousButton.setEnabled(false);
+      if (image.getSequence() != null) {
+        StreetsideAbstractImage tempImage = image;
+        while (tempImage.next() != null) {
+          tempImage = tempImage.next();
+          if (tempImage.isVisible()) {
+            nextButton.setEnabled(true);
+            break;
+          }
+        }
+      }
+      if (image.getSequence() != null) {
+        StreetsideAbstractImage tempImage = image;
+        while (tempImage.previous() != null) {
+          tempImage = tempImage.previous();
+          if (tempImage.isVisible()) {
+            previousButton.setEnabled(true);
+            break;
+          }
+        }
+      }
+      if (image instanceof StreetsideImage) {
+        StreetsideImage streetsideImage = (StreetsideImage) image;
+        // Downloads the thumbnail.
+        streetsideImageDisplay.setImage(null, null);
+        if (thumbnailCache != null)
+          thumbnailCache.cancelOutstandingTasks();
+        thumbnailCache = new StreetsideCache(streetsideImage.getId(),
+                StreetsideCache.Type.THUMBNAIL);
+        try {
+          thumbnailCache.submit(this, false);
+        } catch (IOException e) {
+          Logging.error(e);
+        }
+
+        // Downloads the full resolution image.
+        if (fullQuality || new StreetsideCache(streetsideImage.getId(),
+                StreetsideCache.Type.FULL_IMAGE).get() != null) {
+          if (imageCache != null)
+            imageCache.cancelOutstandingTasks();
+          imageCache = new StreetsideCache(streetsideImage.getId(),
+                  StreetsideCache.Type.FULL_IMAGE);
+          try {
+            imageCache.submit(this, false);
+          } catch (IOException e) {
+            Logging.error(e);
+          }
+        }
+      } else if (image instanceof StreetsideImportedImage) {
+        StreetsideImportedImage streetsideImage = (StreetsideImportedImage) image;
+        try {
+          streetsideImageDisplay.setImage(streetsideImage.getImage(), null);
+        } catch (IOException e) {
+          Logging.error(e);
+        }
+      }
+      updateTitle();
+    }
+
+  }
+
+  /**
+   * Disables all the buttons in the dialog
+   */
+  private void disableAllButtons() {
+    nextButton.setEnabled(false);
+    previousButton.setEnabled(false);
+    blueButton.setEnabled(false);
+    redButton.setEnabled(false);
+  }
+
+  /**
+   * Sets a new StreetsideImage to be shown.
+   *
+   * @param image The image to be shown.
+   */
+  public synchronized void setImage(StreetsideAbstractImage image) {
+    this.image = image;
+  }
+
+  /**
+   * Updates the title of the dialog.
+   */
+  public synchronized void updateTitle() {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(this::updateTitle);
+    } else if (image != null) {
+      StringBuilder title = new StringBuilder(tr(BASE_TITLE));
+      if (image instanceof StreetsideImage) {
+        StreetsideImage streetsideImage = (StreetsideImage) image;
+        UserProfile user = streetsideImage.getUser();
+        if (user != null) {
+          title.append(MESSAGE_SEPARATOR).append(user.getUsername());
+        }
+        if (streetsideImage.getCd() != 0) {
+          title.append(MESSAGE_SEPARATOR).append(streetsideImage.getDate());
+        }
+        setTitle(title.toString());
+      } else if (image instanceof StreetsideImportedImage) {
+        StreetsideImportedImage streetsideImportedImage = (StreetsideImportedImage) image;
+        title.append(MESSAGE_SEPARATOR).append(streetsideImportedImage.getFile().getName());
+        title.append(MESSAGE_SEPARATOR).append(streetsideImportedImage.getDate());
+        setTitle(title.toString());
+      }
+    }
+  }
+
+  /**
+   * Returns the {@link StreetsideAbstractImage} object which is being shown.
+   *
+   * @return The {@link StreetsideAbstractImage} object which is being shown.
+   */
+  public synchronized StreetsideAbstractImage getImage() {
+    return image;
+  }
+
+  /**
+   * Action class form the next image button.
+   *
+   * @author nokutu
+   */
+  private static class NextPictureAction extends AbstractAction {
+
+    private static final long serialVersionUID = 3023827221453154340L;
+
+    /**
+     * Constructs a normal NextPictureAction
+     */
+    NextPictureAction() {
+      super(tr("Next picture"));
+      putValue(SHORT_DESCRIPTION, tr("Shows the next picture in the sequence"));
+      new ImageProvider("dialogs", "next").getResource().attachImageIcon(this, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      StreetsideLayer.getInstance().getData().selectNext();
+    }
+  }
+
+  /**
+   * Action class for the previous image button.
+   *
+   * @author nokutu
+   */
+  private static class PreviousPictureAction extends AbstractAction {
+
+    private static final long serialVersionUID = -6420511632957956012L;
+
+    /**
+     * Constructs a normal PreviousPictureAction
+     */
+    PreviousPictureAction() {
+      super(tr("Previous picture"));
+      putValue(SHORT_DESCRIPTION, tr("Shows the previous picture in the sequence"));
+      new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      StreetsideLayer.getInstance().getData().selectPrevious();
+    }
+  }
+
+  /**
+   * Action class to jump to the image following the red line.
+   *
+   * @author nokutu
+   */
+  private static class RedAction extends AbstractAction {
+
+    private static final long serialVersionUID = -6480229431481386376L;
+
+    /**
+     * Constructs a normal RedAction
+     */
+    RedAction() {
+      putValue(NAME, tr("Jump to red"));
+      putValue(SHORT_DESCRIPTION,
+              tr("Jumps to the picture at the other side of the red line"));
+      new ImageProvider("dialogs", "red").getResource().attachImageIcon(this, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      if (StreetsideMainDialog.getInstance().getImage() != null) {
+        StreetsideLayer.getInstance().getData()
+                .setSelectedImage(StreetsideLayer.getInstance().getNNearestImage(1), true);
+      }
+    }
+  }
+
+  /**
+   * Action class to jump to the image following the blue line.
+   *
+   * @author nokutu
+   */
+  private static class BlueAction extends AbstractAction {
+
+    private static final long serialVersionUID = 6250690644594703314L;
+
+    /**
+     * Constructs a normal BlueAction
+     */
+    BlueAction() {
+      putValue(NAME, tr("Jump to blue"));
+      putValue(SHORT_DESCRIPTION,
+              tr("Jumps to the picture at the other side of the blue line"));
+      new ImageProvider("dialogs", "blue").getResource().attachImageIcon(this, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      if (StreetsideMainDialog.getInstance().getImage() != null) {
+        StreetsideLayer.getInstance().getData()
+                .setSelectedImage(StreetsideLayer.getInstance().getNNearestImage(2), true);
+      }
+    }
+  }
+
+  private static class StopAction extends AbstractAction implements WalkListener {
+
+    private static final long serialVersionUID = -6561451575815789198L;
+
+    private WalkThread thread;
+
+    /**
+     * Constructs a normal StopAction
+     */
+    StopAction() {
+      putValue(NAME, trc("as synonym to halt or stand still", "Stop"));
+      putValue(SHORT_DESCRIPTION, tr("Stops the walk."));
+      new ImageProvider("dialogs/streetsideStop.png").getResource().attachImageIcon(this, true);
+      StreetsidePlugin.getWalkAction().addListener(this);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      if (thread != null)
+        thread.stopWalk();
+    }
+
+    @Override
+    public void walkStarted(WalkThread thread) {
+      this.thread = thread;
+    }
+  }
+
+  private static class PlayAction extends AbstractAction implements WalkListener {
+
+    private static final long serialVersionUID = -17943404752082788L;
+    private transient WalkThread thread;
+
+    /**
+     * Constructs a normal PlayAction
+     */
+    PlayAction() {
+      putValue(NAME, tr("Play"));
+      putValue(SHORT_DESCRIPTION, tr("Continues with the paused walk."));
+      new ImageProvider("dialogs/streetsidePlay.png").getResource().attachImageIcon(this, true);
+      StreetsidePlugin.getWalkAction().addListener(this);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      if (thread != null)
+        thread.play();
+    }
+
+    @Override
+    public void walkStarted(WalkThread thread) {
+      if (thread != null)
+        this.thread = thread;
+    }
+  }
+
+  private static class PauseAction extends AbstractAction implements WalkListener {
+
+    private static final long serialVersionUID = 4400240686337741192L;
+
+    private WalkThread thread;
+
+    /**
+     * Constructs a normal PauseAction
+     */
+    PauseAction() {
+      putValue(NAME, tr("Pause"));
+      putValue(SHORT_DESCRIPTION, tr("Pauses the walk."));
+      new ImageProvider("dialogs/streetsidePause.png").getResource().attachImageIcon(this, true);
+      StreetsidePlugin.getWalkAction().addListener(this);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      thread.pause();
+    }
+
+    @Override
+    public void walkStarted(WalkThread thread) {
+      this.thread = thread;
+    }
+  }
+
+  /**
+   * When the pictures are returned from the cache, they are set in the
+   * {@link StreetsideImageDisplay} object.
+   */
+  /*@Override
+  public void loadingFinished(final CacheEntry data, final CacheEntryAttributes attributes, final LoadResult result) {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(() -> loadingFinished(data, attributes, result));
+    } else if (data != null && result == LoadResult.SUCCESS) {
+      try {
+        BufferedImage img = ImageIO.read(new ByteArrayInputStream(data.getContent()));
+        if (img == null) {
+          return;
+        }
+        if (
+          streetsideImageDisplay.getImage() == null
+          || img.getHeight() > this.streetsideImageDisplay.getImage().getHeight()
+        ) {
+          final StreetsideAbstractImage mai = getImage();
+          this.streetsideImageDisplay.setImage(
+            img,
+            mai instanceof StreetsideImage ? ((StreetsideImage) getImage()).getDetections() : null
+          );
+        }
+      } catch (IOException e) {
+        Logging.error(e);
+      }
+    }
+  }*/
+
+  /**
+   * When the pictures are returned from the cache, they are set in the
+   * {@link StreetsideImageDisplay} object.
+   */
+  @Override
+  public void loadingFinished(final CacheEntry data, final CacheEntryAttributes attributes, final LoadResult result) {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(() -> loadingFinished(data, attributes, result));
+
+    } else if (data != null && result == LoadResult.SUCCESS) {
+      try {
+        final BufferedImage img = ImageIO.read(new ByteArrayInputStream(data.getContent()));
+        if (img == null) {
+          return;
+        }
+        if (
+            streetsideImageDisplay.getImage() == null
+            || img.getHeight() > streetsideImageDisplay.getImage().getHeight()
+            ) {
+          //final StreetsideAbstractImage mai = getImage();
+          streetsideImageDisplay.setImage(
+              img,
+              //mai instanceof StreetsideImage ? ((StreetsideImage) getImage()).getDetections() : null
+              null);
+        }
+      } catch (final IOException e) {
+        Logging.error(e);
+      }
+    }
+  }
+
+  /**
+   * Creates the layout of the dialog.
+   *
+   * @param data    The content of the dialog
+   * @param buttons The buttons where you can click
+   */
+  public void createLayout(Component data, List<SideButton> buttons) {
+    removeAll();
+    createLayout(data, true, buttons);
+    add(titleBar, BorderLayout.NORTH);
+  }
+
+  @Override
+  public void selectedImageChanged(StreetsideAbstractImage oldImage, StreetsideAbstractImage newImage) {
+    setImage(newImage);
+    updateImage();
+  }
+
+  @Override
+  public void imagesAdded() {
+    // This method is enforced by StreetsideDataListener, but only selectedImageChanged() is needed
+  }
+
 }
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/gui/imageinfo/StreetsideViewerPanel.java	(revision 34333)
@@ -84,5 +84,5 @@
 	    checkPanel.add(privacyLink, BorderLayout.PAGE_END);
 
-	    add(checkPanel, BorderLayout.PAGE_START);
+	    add(checkPanel, BorderLayout.SOUTH);
 	    add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER);
 
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 34332)
+++ /applications/editors/josm/plugins/MicrosoftStreetside/src/org/openstreetmap/josm/plugins/streetside/io/download/SequenceDownloadRunnable.java	(revision 34333)
@@ -48,5 +48,7 @@
     }
 
-    StreetsideSequence seq = new StreetsideSequence(StreetsideSequenceIdGenerator.generateId());
+    StreetsideSequence seq = new StreetsideSequence(null);
+    // TODO: re-add sequenceID
+    //StreetsideSequence seq = new StreetsideSequence(StreetsideSequenceIdGenerator.generateId());
 
     // TODO: how can LatLon and heading / camera angles (he attribute) be set for a sequence?
