Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31409)
@@ -24,5 +24,5 @@
    * to prevent concurrency problems.
    */
-  public static Lock lock = new ReentrantLock();
+  public static Lock LOCK = new ReentrantLock();
 
   /** The time the image was captured, in Epoch format. */
@@ -281,5 +281,5 @@
    */
   public MapillaryAbstractImage next() {
-    synchronized (lock) {
+    synchronized (LOCK) {
       if (this.getSequence() == null)
         return null;
@@ -295,5 +295,5 @@
    */
   public MapillaryAbstractImage previous() {
-    synchronized (lock) {
+    synchronized (LOCK) {
       if (this.getSequence() == null)
         return null;
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31409)
@@ -209,4 +209,27 @@
   /**
    * If the selected MapillaryImage is part of a MapillarySequence then the
+   * following visible MapillaryImage is selected. In case there is none, does
+   * nothing.
+   *
+   * @param moveToPicture
+   *          True if the view must me moved to the next picture.
+   */
+  public void selectNext(boolean moveToPicture) {
+    if (getSelectedImage() == null)
+      return;
+    if (getSelectedImage().getSequence() == null)
+      return;
+    MapillaryAbstractImage tempImage = selectedImage;
+    while (tempImage.next() != null) {
+      tempImage = tempImage.next();
+      if (tempImage.isVisible()) {
+        setSelectedImage(tempImage, moveToPicture);
+        break;
+      }
+    }
+  }
+
+  /**
+   * If the selected MapillaryImage is part of a MapillarySequence then the
    * previous visible MapillaryImage is selected. In case there is none, does
    * nothing.
@@ -229,4 +252,27 @@
 
   /**
+   * If the selected MapillaryImage is part of a MapillarySequence then the
+   * previous visible MapillaryImage is selected. In case there is none, does
+   * nothing.
+   *
+   * @param moveToPicture
+   *          True if the view must me moved to the previous picture.
+   */
+  public void selectPrevious(boolean moveToPicture) {
+    if (getSelectedImage() == null)
+      return;
+    if (getSelectedImage().getSequence() == null)
+      throw new IllegalStateException();
+    MapillaryAbstractImage tempImage = selectedImage;
+    while (tempImage.previous() != null) {
+      tempImage = tempImage.previous();
+      if (tempImage.isVisible()) {
+        setSelectedImage(tempImage, moveToPicture);
+        break;
+      }
+    }
+  }
+
+  /**
    * Selects a new image.If the user does ctrl + click, this isn't triggered.
    *
@@ -248,9 +294,4 @@
    */
   public void setSelectedImage(MapillaryAbstractImage image, boolean zoom) {
-    if (image != null) {
-      System.out.println("----------------------------");
-      for (MapillaryAbstractImage img : getImages())
-        System.out.println(img.getSequence());
-    }
     MapillaryAbstractImage oldImage = selectedImage;
     selectedImage = image;
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 31409)
@@ -22,5 +22,5 @@
 
   /**
-   * Returns the localtion where the image was taken.
+   * Returns the location where the image was taken.
    *
    * @return A String containing the location where the picture was taken.
@@ -40,5 +40,5 @@
 
   /**
-   * Main contructor of the class MapillaryImage
+   * Main constructor of the class MapillaryImage
    *
    * @param key
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31409)
@@ -153,6 +153,6 @@
    */
   public synchronized static MapillaryLayer getInstance() {
-    if (MapillaryLayer.INSTANCE == null)
-      MapillaryLayer.INSTANCE = new MapillaryLayer();
+    if (INSTANCE == null)
+      INSTANCE = new MapillaryLayer();
     return MapillaryLayer.INSTANCE;
   }
@@ -171,4 +171,5 @@
   public void destroy() {
     setMode(null);
+    AbstractMode.resetThread();
     MapillaryDownloader.stopAll();
     MapillaryMainDialog.getInstance().setImage(null);
@@ -181,4 +182,5 @@
     if (Main.map.mapView.getEditLayer() != null)
       Main.map.mapView.getEditLayer().data.removeDataSetListener(this);
+    MapillaryData.INSTANCE = null;
     MapillaryLayer.INSTANCE = null;
     super.destroy();
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java	(revision 31409)
@@ -12,5 +12,4 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
-import org.openstreetmap.josm.plugins.mapillary.downloads.MapillaryDownloader;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -41,6 +40,5 @@
   public void actionPerformed(ActionEvent arg0) {
     if (MapillaryLayer.INSTANCE == null) {
-      if (Main.map.mapView.getEditLayer() != null)
-        MapillaryDownloader.automaticDownload();
+      MapillaryLayer.getInstance();
     } else {
       if (Main.map.mapView.getActiveLayer() != MapillaryLayer.getInstance())
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java	(revision 31409)
@@ -57,5 +57,5 @@
         && (int) pane.getValue() == JOptionPane.OK_OPTION) {
       thread = new WalkThread((int) dialog.spin.getValue(),
-          dialog.waitForPicture.isSelected());
+          dialog.waitForPicture.isSelected(), dialog.followSelection.isSelected());
       fireWalkStarted();
       thread.start();
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/WalkThread.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/WalkThread.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/WalkThread.java	(revision 31409)
@@ -4,4 +4,6 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
@@ -24,5 +26,6 @@
   private Lock lock = new ReentrantLock();
   private boolean end = false;
-  private boolean waitForPicture;
+  private final boolean waitForFullQuality;
+  private final boolean followSelected;
   private BufferedImage lastImage;
   private volatile boolean paused = false;
@@ -33,8 +36,10 @@
    * @param interval
    * @param waitForPicture
+   * @param followSelected
    */
-  public WalkThread(int interval, boolean waitForPicture) {
+  public WalkThread(int interval, boolean waitForPicture, boolean followSelected) {
     this.interval = interval;
-    this.waitForPicture = waitForPicture;
+    this.waitForFullQuality = waitForPicture;
+    this.followSelected = followSelected;
     data = MapillaryLayer.getInstance().getMapillaryData();
     data.addListener(this);
@@ -46,16 +51,24 @@
       while (!end && data.getSelectedImage().next() != null) {
         MapillaryAbstractImage image = data.getSelectedImage();
-        // Predownload next 5 pictures.
         if (image instanceof MapillaryImage) {
-          for (int i = 0; i < 5; i++) {
+          // Predownload next 10 thumbnails.
+          for (int i = 0; i < 10; i++) {
             if (image.next() == null)
               break;
             image = image.next();
-            Utils.downloadPicture((MapillaryImage) image);
+            Utils.downloadPicture((MapillaryImage) image, Utils.PICTURE.THUMBNAIL);
           }
         }
+        if (waitForFullQuality)
+          // Start downloading 3 next full images.
+          for (int i = 0; i < 3; i++) {
+            if (image.next() == null)
+              break;
+            image = image.next();
+            Utils.downloadPicture((MapillaryImage) image, Utils.PICTURE.FULL);
+          }
         try {
           synchronized (this) {
-            if (waitForPicture
+            if (waitForFullQuality
                 && data.getSelectedImage() instanceof MapillaryImage) {
               while (MapillaryMainDialog.getInstance().mapillaryImageDisplay
@@ -84,5 +97,5 @@
               .getImage();
           synchronized (lock) {
-            data.selectNext();
+            data.selectNext(followSelected);
           }
         } catch (InterruptedException e) {
@@ -93,14 +106,9 @@
       return;
     }
-    end = true;
-    data.removeListener(this);
-    MapillaryMainDialog.getInstance().setMode(MapillaryMainDialog.Mode.NORMAL);
+    end();
   }
 
   @Override
   public void interrupt() {
-    end = true;
-    data.removeListener(this);
-    MapillaryMainDialog.getInstance().setMode(MapillaryMainDialog.Mode.NORMAL);
     super.interrupt();
   }
@@ -139,5 +147,34 @@
    */
   public void stopWalk() {
-    this.interrupt();
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          stopWalk();
+        }
+      });
+    } else {
+      end();
+      this.interrupt();
+    }
+  }
+
+  /**
+   * Called when the walk stops by itself of forcefully.
+   */
+  public void end() {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          end();
+        }
+      });
+    } else {
+      end = true;
+      data.removeListener(this);
+      MapillaryMainDialog.getInstance()
+          .setMode(MapillaryMainDialog.Mode.NORMAL);
+    }
   }
 }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/cache/Utils.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/cache/Utils.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/cache/Utils.java	(revision 31409)
@@ -16,4 +16,14 @@
   private static IgnoreDownload IGNORE_DOWNLOAD = new IgnoreDownload();
 
+  /** Picture quality */
+  public enum PICTURE {
+    /** Thumbnail quality picture () */
+    THUMBNAIL,
+    /** Full quality picture () */
+    FULL,
+    /** Both of them */
+    BOTH;
+  }
+
   /**
    * Downloads the picture of the given image and does nothing when it is
@@ -23,8 +33,36 @@
    */
   public static void downloadPicture(MapillaryImage img) {
-    new MapillaryCache(img.getKey(), MapillaryCache.Type.THUMBNAIL).submit(
-        IGNORE_DOWNLOAD, false);
-    new MapillaryCache(img.getKey(), MapillaryCache.Type.FULL_IMAGE).submit(
-        IGNORE_DOWNLOAD, false);
+    downloadPicture(img, PICTURE.BOTH);
+  }
+
+  /**
+   * Downloads the picture of the given image and does nothing when it is
+   * downloaded.
+   *
+   * @param img
+   * @param pic
+   *          The picture type to be downloaded (full quality, thumbnail or
+   *          both.)
+   */
+  public static void downloadPicture(MapillaryImage img, PICTURE pic) {
+    if (pic == PICTURE.BOTH) {
+      if (new MapillaryCache(img.getKey(), MapillaryCache.Type.THUMBNAIL).get() == null)
+        new MapillaryCache(img.getKey(), MapillaryCache.Type.THUMBNAIL).submit(
+            IGNORE_DOWNLOAD, false);
+      if (new MapillaryCache(img.getKey(), MapillaryCache.Type.FULL_IMAGE)
+          .get() == null)
+        new MapillaryCache(img.getKey(), MapillaryCache.Type.FULL_IMAGE)
+            .submit(IGNORE_DOWNLOAD, false);
+    } else if (pic == PICTURE.THUMBNAIL
+        && new MapillaryCache(img.getKey(), MapillaryCache.Type.THUMBNAIL)
+            .get() == null) {
+      new MapillaryCache(img.getKey(), MapillaryCache.Type.THUMBNAIL).submit(
+          IGNORE_DOWNLOAD, false);
+    } else if (pic == PICTURE.FULL
+        && new MapillaryCache(img.getKey(), MapillaryCache.Type.FULL_IMAGE)
+            .get() == null) {
+      new MapillaryCache(img.getKey(), MapillaryCache.Type.FULL_IMAGE).submit(
+          IGNORE_DOWNLOAD, false);
+    }
   }
 
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31409)
@@ -34,7 +34,7 @@
   /** Client ID for the app */
   public final static String CLIENT_ID = "NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1YTA2NmNlODhlNWMwOTBm";
-  /** Executor that will run the petitions */
-  public final static ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(1,
-      1, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50));
+  /** Executor that will run the petitions. */
+  private static ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(3, 5,
+      100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50));
 
   /**
@@ -69,14 +69,38 @@
     if (view.getArea() > MapillaryDownloadViewAction.MAX_AREA)
       return;
-    for (Bounds bound : MapillaryLayer.getInstance().bounds) {
-      if (!view.intersects(bound))
-        continue;
-      if (bound.equals(view)) {
-        // Already downloaded
-        return;
+    if (isViewDownloaded(view))
+      return;
+    MapillaryLayer.getInstance().bounds.add(view);
+    getImages(view);
+  }
+
+  private static boolean isViewDownloaded(Bounds view) {
+    int n = 15;
+    boolean[][] inside = new boolean[n][n];
+    for (int i = 0; i < n; i++) {
+      for (int j = 0; j < n; j++) {
+        if (isInBounds(new LatLon(view.getMinLat()
+            + (view.getMaxLat() - view.getMinLat()) * ((double) i / n), view.getMinLon()
+ + (view.getMaxLon() - view.getMinLon())
+                * ((double) j / n)))) {
+          inside[i][j] = true;
+        }
       }
     }
-    MapillaryLayer.getInstance().bounds.add(view);
-    getImages(view);
+    for (int i = 0; i < n; i++) {
+      for (int j = 0; j < n; j++) {
+        if (!inside[i][j])
+          return false;
+      }
+    }
+    return true;
+  }
+
+  private static boolean isInBounds(LatLon latlon) {
+    for (Bounds bounds : MapillaryLayer.getInstance().bounds) {
+      if (bounds.contains(latlon))
+        return true;
+    }
+    return false;
   }
 
@@ -137,4 +161,6 @@
   public static void stopAll() {
     EXECUTOR.shutdownNow();
+    EXECUTOR = new ThreadPoolExecutor(3, 5, 100, TimeUnit.SECONDS,
+        new ArrayBlockingQueue<Runnable>(50));
   }
 }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java	(revision 31409)
@@ -13,7 +13,8 @@
 import java.util.List;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
@@ -32,9 +33,10 @@
   private static final String URL = MapillaryDownloader.BASE_URL + "search/s/";
 
+  /** Lock to prevent multiple downloads to be imported at the same time. */
+  private static final Lock LOCK = new ReentrantLock();
+
   private final String queryString;
   private final ExecutorService ex;
-  private final List<Bounds> bounds;
   private final MapillaryLayer layer;
-  private final MapillarySquareDownloadManagerThread manager;
 
   /**
@@ -43,15 +45,11 @@
    * @param ex
    * @param queryString
-   * @param layer
    * @param manager
    */
   public MapillarySequenceDownloadThread(ExecutorService ex,
-      String queryString, MapillaryLayer layer,
-      MapillarySquareDownloadManagerThread manager) {
+      String queryString) {
     this.queryString = queryString;
     this.ex = ex;
-    this.bounds = layer.bounds;
-    this.layer = layer;
-    this.manager = manager;
+    this.layer = MapillaryLayer.getInstance();
   }
 
@@ -98,27 +96,25 @@
         }
 
-        boolean imagesAdded = false;
-        MapillaryImage.lock.lock();
-        for (MapillaryImage img : finalImages) {
-          if (layer.getMapillaryData().getImages().contains(img)) {
-            // The image in finalImages is substituted by the one in the
-            // database, as they are equal.
-            img = (MapillaryImage) layer.getMapillaryData().getImages()
-                .get(layer.getMapillaryData().getImages().indexOf(img));
-            sequence.add(img);
-            ((MapillaryImage) layer.getMapillaryData().getImages()
-                .get(layer.getMapillaryData().getImages().indexOf(img)))
-                .setSequence(sequence);
-            finalImages.set(finalImages.indexOf(img), img);
-          } else {
-            img.setSequence(sequence);
-            imagesAdded = true;
-            sequence.add(img);
+        MapillaryImage.LOCK.lock();
+        synchronized (LOCK) {
+          for (MapillaryImage img : finalImages) {
+            if (layer.getMapillaryData().getImages().contains(img)) {
+              // The image in finalImages is substituted by the one in the
+              // database, as they represent the same picture.
+              img = (MapillaryImage) layer.getMapillaryData().getImages()
+                  .get(layer.getMapillaryData().getImages().indexOf(img));
+              sequence.add(img);
+              ((MapillaryImage) layer.getMapillaryData().getImages()
+                  .get(layer.getMapillaryData().getImages().indexOf(img)))
+                  .setSequence(sequence);
+              finalImages.set(finalImages.indexOf(img), img);
+            } else {
+              img.setSequence(sequence);
+              sequence.add(img);
+            }
           }
         }
-        MapillaryImage.lock.unlock();
-        if (manager != null) {
-          manager.imagesAdded = imagesAdded;
-        }
+        MapillaryImage.LOCK.unlock();
+
         layer.getMapillaryData().addWithoutUpdate(
             new ArrayList<MapillaryAbstractImage>(finalImages));
@@ -131,6 +127,6 @@
 
   private boolean isInside(MapillaryAbstractImage image) {
-    for (int i = 0; i < bounds.size(); i++)
-      if (bounds.get(i).contains(image.getLatLon()))
+    for (int i = 0; i < layer.bounds.size(); i++)
+      if (layer.bounds.get(i).contains(image.getLatLon()))
         return true;
     return false;
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31409)
@@ -31,6 +31,4 @@
   private final String signQueryString;
   private final MapillaryLayer layer;
-  /** Whether if new images have been added in the download or not. */
-  public boolean imagesAdded = false;
 
   /**
@@ -75,11 +73,9 @@
     try {
       downloadSequences();
-      if (imagesAdded) {
-        Main.map.statusLine.setHelpText(tr("Downloading image's information"));
-        completeImages();
-        MapillaryMainDialog.getInstance().updateTitle();
-        Main.map.statusLine.setHelpText(tr("Downloading traffic signs"));
-        downloadSigns();
-      }
+      Main.map.statusLine.setHelpText(tr("Downloading image's information"));
+      completeImages();
+      MapillaryMainDialog.getInstance().updateTitle();
+      Main.map.statusLine.setHelpText(tr("Downloading traffic signs"));
+      downloadSigns();
     } catch (InterruptedException e) {
       Main.error("Mapillary download interrupted (probably because of closing the layer).");
@@ -97,5 +93,5 @@
     while (!ex.isShutdown()) {
       ex.execute(new MapillarySequenceDownloadThread(ex, sequenceQueryString
-          + "&page=" + page + "&limit=10", layer, this));
+          + "&page=" + page + "&limit=10"));
       while (ex.getQueue().remainingCapacity() == 0)
         Thread.sleep(500);
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryTrafficSignDownloaderThread.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryTrafficSignDownloaderThread.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryTrafficSignDownloaderThread.java	(revision 31409)
@@ -19,5 +19,5 @@
 /**
  * Downloads the signs information in a given area.
- * 
+ *
  * @author nokutu
  *
@@ -32,5 +32,5 @@
   /**
    * Main constructor.
-   * 
+   *
    * @param ex
    *          {@link ExecutorService} object that is executing this thread.
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31409)
@@ -503,4 +503,5 @@
       });
     } else if (data != null && result == LoadResult.SUCCESS) {
+      System.out.println(attributes.getMetadata());
       try {
         BufferedImage img = ImageIO.read(new ByteArrayInputStream(data
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryWalkDialog.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryWalkDialog.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryWalkDialog.java	(revision 31409)
@@ -10,5 +10,5 @@
 /**
  * Dialog to set the walk mode options.
- * 
+ *
  * @author nokutu
  *
@@ -22,4 +22,6 @@
   /** Whether it must wait for the picture to be downloaded */
   public JCheckBox waitForPicture;
+  /** Whether the view must follow the selected image. */
+  public JCheckBox followSelection;
 
   /**
@@ -33,7 +35,11 @@
     add(interval);
 
-    waitForPicture = new JCheckBox("Wait for the picture to be downloaded");
+    waitForPicture = new JCheckBox("Wait for full quality pictures");
     waitForPicture.setSelected(true);
     add(waitForPicture);
+
+    followSelection = new JCheckBox("Follow selected image");
+    followSelection.setSelected(true);
+    add(followSelection);
   }
 }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/AbstractMode.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/AbstractMode.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/AbstractMode.java	(revision 31409)
@@ -26,6 +26,8 @@
     ZoomChangeListener {
 
+  private final static int DOWNLOAD_COOLDOWN = 2000;
+
   protected MapillaryData data = MapillaryData.getInstance();
-  private static final SemiautomaticThread semiautomaticThread = new SemiautomaticThread();
+  private static SemiautomaticThread semiautomaticThread = new SemiautomaticThread();
 
   /**
@@ -71,4 +73,12 @@
   }
 
+  /**
+   * Resets the semiautomatic mode thread.
+   */
+  public static void resetThread() {
+    semiautomaticThread.interrupt();
+    semiautomaticThread = new SemiautomaticThread();
+  }
+
   private static class SemiautomaticThread extends Thread {
 
@@ -82,5 +92,5 @@
       while (true) {
         if (moved
-            && Calendar.getInstance().getTimeInMillis() - lastDownload >= 2000) {
+            && Calendar.getInstance().getTimeInMillis() - lastDownload >= DOWNLOAD_COOLDOWN) {
           lastDownload = Calendar.getInstance().getTimeInMillis();
           MapillaryDownloader.completeView();
@@ -92,5 +102,4 @@
             wait(100);
           } catch (InterruptedException e) {
-            Main.error(e);
           }
         }
Index: /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillarySequenceDownloadThreadTest.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillarySequenceDownloadThreadTest.java	(revision 31408)
+++ /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillarySequenceDownloadThreadTest.java	(revision 31409)
@@ -62,5 +62,5 @@
         while (!ex.isShutdown() && MapillaryLayer.getInstance().getMapillaryData().getImages().size() <= 0 && page < 50) {
             System.out.println("Sending sequence-request "+page+" to Mapillary-servers…");
-            Thread downloadThread = new MapillarySequenceDownloadThread(ex, queryString+"&page="+page, MapillaryLayer.getInstance(), null);
+            Thread downloadThread = new MapillarySequenceDownloadThread(ex, queryString+"&page="+page);
             downloadThread.start();
             downloadThread.join();
