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 31395)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31396)
@@ -32,5 +32,5 @@
   private final List<MapillaryAbstractImage> multiSelectedImages;
 
-  private List<MapillaryDataListener> listeners = new ArrayList<>();
+  private List<MapillaryDataListener> listeners = new CopyOnWriteArrayList<>();
 
   /**
@@ -41,4 +41,6 @@
     multiSelectedImages = new ArrayList<>();
     selectedImage = null;
+    
+    addListener(MapillaryPlugin.walkAction);
   }
 
@@ -219,5 +221,5 @@
 
   /**
-   * Selects a new image.If the user does ctrl+click, this isn't triggered.
+   * Selects a new image.If the user does ctrl + click, this isn't triggered.
    *
    * @param image
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31395)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31396)
@@ -40,10 +40,9 @@
   public static final ImageIcon MAP_ICON_SELECTED = new ImageProvider(
       "mapiconselected.png").get();
-  /** Icon representing an imported iage in the map. */
+  /** Icon representing an imported image in the map. */
   public static final ImageIcon MAP_ICON_IMPORTED = new ImageProvider(
       "mapiconimported.png").get();
   /** Icon used to identify which images have signs on them */
   public static final ImageIcon MAP_SIGN = new ImageProvider("sign.png").get();
-  public static final int ICON_SIZE = 24;
 
   /** Cache that stores the pictures the downloaded pictures. */
@@ -57,4 +56,6 @@
   private final MapillaryImportIntoSequenceAction importIntoSequenceAction;
   private final MapillaryJoinAction joinAction;
+  /** Walk action */
+  public final static MapillaryWalkAction walkAction = new MapillaryWalkAction();
 
   /** Menu button for the {@link MapillaryDownloadAction} action. */
@@ -72,4 +73,6 @@
   /** Menu button for the {@link MapillaryJoinAction} action. */
   public static JMenuItem JOIN_MENU;
+  /** Menu button for the {@link MapillaryWalkAction} action. */
+  public static JMenuItem WALK_MENU;
 
   /**
@@ -101,4 +104,5 @@
           downloadViewAction, false, 14);
       JOIN_MENU = MainMenu.add(Main.main.menu.dataMenu, joinAction, false);
+      WALK_MENU = MainMenu.add(Main.main.menu.moreToolsMenu, walkAction, false);
     }
 
@@ -110,4 +114,5 @@
     DOWNLOAD_VIEW_MENU.setEnabled(false);
     JOIN_MENU.setEnabled(false);
+    WALK_MENU.setEnabled(false);
 
     try {
@@ -151,5 +156,5 @@
    *          The JMenuItem object that is going to be enabled or disabled.
    * @param value
-   *          true to enable de JMenuItem; false to disable it.
+   *          true to enable the JMenuItem; false to disable it.
    */
   public static void setMenuEnabled(JMenuItem menu, boolean value) {
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportIntoSequenceAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportIntoSequenceAction.java	(revision 31395)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportIntoSequenceAction.java	(revision 31396)
@@ -46,4 +46,7 @@
   private LinkedList<MapillaryImportedImage> images;
 
+  /**
+   * Main constructor.
+   */
   public MapillaryImportIntoSequenceAction() {
     super(tr("Import pictures into sequence"), new ImageProvider("icon24.png"),
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 31396)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java	(revision 31396)
@@ -0,0 +1,146 @@
+package org.openstreetmap.josm.plugins.mapillary.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.awt.image.BufferedImage;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryDataListener;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryPlugin;
+import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
+import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryWalkDialog;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Walks forward at a given interval.
+ * 
+ * @author nokutu
+ *
+ */
+public class MapillaryWalkAction extends JosmAction implements
+    MapillaryDataListener {
+
+  private static final long serialVersionUID = 3454223919402245818L;
+
+  /**
+   * 
+   */
+  public MapillaryWalkAction() {
+    super(tr("Walk mode"), new ImageProvider("icon24.png"), tr("Walk mode"),
+        Shortcut.registerShortcut("Mapillary walk", tr("Start walk mode"),
+            KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), false, "mapillaryWalk",
+        false);
+    this.setEnabled(false);
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent arg0) {
+    MapillaryWalkDialog dialog = new MapillaryWalkDialog();
+    JOptionPane pane = new JOptionPane(dialog, JOptionPane.PLAIN_MESSAGE,
+        JOptionPane.OK_CANCEL_OPTION);
+    JDialog dlg = pane.createDialog(Main.parent, tr("Export images"));
+    dlg.setMinimumSize(new Dimension(400, 150));
+    dlg.setVisible(true);
+    if (pane.getValue() != null
+        && (int) pane.getValue() == JOptionPane.OK_OPTION) {
+      new WalkThread((int) dialog.spin.getValue(),
+          dialog.waitForPicture.isSelected()).start();
+    }
+  }
+
+  @Override
+  public void imagesAdded() {
+    // Nothing
+  }
+
+  @Override
+  public void selectedImageChanged(MapillaryAbstractImage oldImage,
+      MapillaryAbstractImage newImage) {
+    if (newImage != null)
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.WALK_MENU, true);
+    else
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.WALK_MENU, false);
+  }
+
+  private class WalkThread extends Thread implements MapillaryDataListener {
+    private int interval;
+    private MapillaryData data;
+    private Lock lock = new ReentrantLock();
+    private boolean end = false;
+    private boolean waitForPicture;
+    private BufferedImage lastImage;
+
+    private WalkThread(int interval, boolean waitForPicture) {
+      this.interval = interval;
+      this.waitForPicture = waitForPicture;
+      data = MapillaryLayer.getInstance().getMapillaryData();
+      data.addListener(this);
+    }
+
+    @Override
+    public void run() {
+      try {
+        while (!end && data.getSelectedImage().next() != null) {
+          try {
+            synchronized (this) {
+              if (waitForPicture) {
+                while (MapillaryMainDialog.getInstance().mapillaryImageDisplay
+                    .getImage() == lastImage
+                    || MapillaryMainDialog.getInstance().mapillaryImageDisplay
+                        .getImage() == null
+                    || MapillaryMainDialog.getInstance().mapillaryImageDisplay
+                        .getImage().getWidth() < 2048)
+                  wait(100);
+              }
+              wait(interval);
+            }
+            lastImage = MapillaryMainDialog.getInstance().mapillaryImageDisplay
+                .getImage();
+            synchronized (lock) {
+              data.selectNext();
+            }
+          } catch (InterruptedException e) {
+            return;
+          }
+        }
+      } catch (NullPointerException e) {
+        return;
+      }
+    }
+
+    @Override
+    public void interrupt() {
+      end = true;
+      data.removeListener(this);
+      super.interrupt();
+    }
+
+    @Override
+    public void imagesAdded() {
+      // Nothing
+    }
+
+    @Override
+    public void selectedImageChanged(MapillaryAbstractImage oldImage,
+        MapillaryAbstractImage newImage) {
+      if (newImage != oldImage.next()) {
+        synchronized (lock) {
+          interrupt();
+        }
+      }
+    }
+  }
+}
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 31395)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31396)
@@ -65,5 +65,6 @@
   private JPanel buttonsPanel;
 
-  private MapillaryImageDisplay mapillaryImageDisplay;
+  /** Object containing the shown image and that handles zoom and drag */
+  public MapillaryImageDisplay mapillaryImageDisplay;
 
   private MapillaryCache imageCache;
@@ -257,6 +258,5 @@
             title += " -- " + mapillaryImage.getDate();
           setTitle(title);
-        }
-        else if (this.image instanceof MapillaryImportedImage) {
+        } else if (this.image instanceof MapillaryImportedImage) {
           MapillaryImportedImage mapillaryImportedImage = (MapillaryImportedImage) this.image;
           String title = tr(BASE_TITLE);
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java	(revision 31395)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java	(revision 31396)
@@ -67,5 +67,5 @@
       oauth.setText("Login");
     else
-       oauth.setText("Already loged in, click to relogin");
+       oauth.setText("Already loged in, click to relogin.");
     panel.add(oauth);
     gui.getDisplayPreference().addSubTab(this, "Mapillary", panel);
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 31396)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryWalkDialog.java	(revision 31396)
@@ -0,0 +1,38 @@
+package org.openstreetmap.josm.plugins.mapillary.gui;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerModel;
+import javax.swing.SpinnerNumberModel;
+
+/**
+ * Dialog to set the walk mode options.
+ * @author nokutu
+ *
+ */
+public class MapillaryWalkDialog extends JPanel {
+  
+  private static final long serialVersionUID = -6258767312211941358L;
+  
+  /** Spin containing the interval value. */
+  public SpinnerModel spin;
+  /** Whether it must wait for the picture to be downloaded */
+  public JCheckBox waitForPicture;
+
+  /**
+   * Main constructor
+   */
+  public MapillaryWalkDialog() {
+    JPanel interval = new JPanel();
+    spin = new SpinnerNumberModel(3000, 100, 15000, 100);
+    interval.add(new JLabel("Interval (miliseconds): "));
+    interval.add(new JSpinner(spin));
+    add(interval);
+    
+    waitForPicture = new JCheckBox("Wait for the picture to be downloaded");
+    waitForPicture.setSelected(true);
+    add(waitForPicture);
+  }
+}
