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 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31358)
@@ -163,20 +163,14 @@
    */
   public void selectNext() {
-    if (getSelectedImage() instanceof MapillaryImage) {
-      if (getSelectedImage() == null)
-        return;
-      if (((MapillaryImage) getSelectedImage()).getSequence() == null)
-        return;
-      if (selectedImage instanceof MapillaryImage
-          && ((MapillaryImage) selectedImage).getSequence() != null) {
-        MapillaryAbstractImage tempImage = selectedImage;
-        while (tempImage.next() != null) {
-          tempImage = tempImage.next();
-          if (tempImage.isVisible()) {
-            setSelectedImage(tempImage,
-                Main.pref.getBoolean("mapillary.move-to-picture", true));
-            break;
-          }
-        }
+    if (getSelectedImage() == null)
+      return;
+    if (getSelectedImage().getSequence() == null)
+      return;
+    MapillaryAbstractImage tempImage = selectedImage;
+    while (tempImage.next() != null) {
+      tempImage = tempImage.next();
+      if (tempImage.isVisible()) {
+        setSelectedImage(tempImage, Main.pref.getBoolean("mapillary.move-to-picture", true));
+        break;
       }
     }
@@ -189,20 +183,14 @@
    */
   public void selectPrevious() {
-    if (getSelectedImage() instanceof MapillaryImage) {
-      if (getSelectedImage() == null)
-        return;
-      if (((MapillaryImage) getSelectedImage()).getSequence() == null)
-        throw new IllegalStateException();
-      if (selectedImage instanceof MapillaryImage
-          && ((MapillaryImage) selectedImage).getSequence() != null) {
-        MapillaryAbstractImage tempImage = selectedImage;
-        while (tempImage.previous() != null) {
-          tempImage = tempImage.previous();
-          if (tempImage.isVisible()) {
-            setSelectedImage(tempImage,
-                Main.pref.getBoolean("mapillary.move-to-picture", true));
-            break;
-          }
-        }
+    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, Main.pref.getBoolean("mapillary.move-to-picture", true));
+        break;
       }
     }
@@ -242,13 +230,13 @@
         // Donwloadins thumbnails of surrounding pictures.
         if (mapillaryImage.next() != null) {
-          new MapillaryCache(((MapillaryImage) mapillaryImage.next()).getKey(),
-              MapillaryCache.Type.THUMBNAIL).submit(this, false);
+          new MapillaryCache(((MapillaryImage) mapillaryImage.next()).getKey(), MapillaryCache.Type.THUMBNAIL).submit(
+              this, false);
           if (mapillaryImage.next().next() != null)
-            new MapillaryCache(((MapillaryImage) mapillaryImage.next().next()).getKey(),
-                MapillaryCache.Type.THUMBNAIL).submit(this, false);
+            new MapillaryCache(((MapillaryImage) mapillaryImage.next().next()).getKey(), MapillaryCache.Type.THUMBNAIL)
+                .submit(this, false);
         }
         if (mapillaryImage.previous() != null) {
-          new MapillaryCache(((MapillaryImage) mapillaryImage.previous()).getKey(),
-              MapillaryCache.Type.THUMBNAIL).submit(this, false);
+          new MapillaryCache(((MapillaryImage) mapillaryImage.previous()).getKey(), MapillaryCache.Type.THUMBNAIL)
+              .submit(this, false);
           if (mapillaryImage.previous().previous() != null)
             new MapillaryCache(((MapillaryImage) mapillaryImage.previous().previous()).getKey(),
@@ -258,6 +246,5 @@
     }
     if (zoom)
-      Main.map.mapView.zoomTo(MapillaryData.getInstance().getSelectedImage()
-          .getLatLon());
+      Main.map.mapView.zoomTo(MapillaryData.getInstance().getSelectedImage().getLatLon());
     if (Main.map != null)
       Main.map.mapView.repaint();
@@ -265,6 +252,5 @@
   }
 
-  private void fireSelectedImageChanged(MapillaryAbstractImage oldImage,
-      MapillaryAbstractImage newImage) {
+  private void fireSelectedImageChanged(MapillaryAbstractImage oldImage, MapillaryAbstractImage newImage) {
     if (listeners.isEmpty())
       return;
@@ -323,6 +309,5 @@
    */
   @Override
-  public void loadingFinished(CacheEntry data, CacheEntryAttributes attributes,
-      LoadResult result) {
+  public void loadingFinished(CacheEntry data, CacheEntryAttributes attributes, LoadResult result) {
     // DO NOTHING
   }
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 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31358)
@@ -124,6 +124,8 @@
     Main.map.mapView.removeMouseMotionListener(this.mode);
     this.mode = mode;
+    Main.map.mapView.setNewCursor(mode.cursor, this);
     Main.map.mapView.addMouseListener(mode);
     Main.map.mapView.addMouseMotionListener(mode);
+    updateHelpText();
   }
 
@@ -552,8 +554,5 @@
   public void activeLayerChange(Layer oldLayer, Layer newLayer) {
     if (newLayer == this) {
-      if (data.size() > 0)
-        Main.map.statusLine.setHelpText(tr("Total images: {0}", data.size()));
-      else
-        Main.map.statusLine.setHelpText(tr("No images found"));
+      updateHelpText();
       MapillaryPlugin.setMenuEnabled(MapillaryPlugin.JOIN_MENU, true);
     } else
@@ -568,3 +567,14 @@
   public void layerRemoved(Layer oldLayer) {
   }
+  
+  public void updateHelpText() {
+    String ret = "";
+    if (data.size() > 0)
+      ret += tr("Total images: {0}", data.size());
+    else
+      ret += tr("No images found");
+    ret += " -- " + tr(mode.toString());
+    
+     Main.map.statusLine.setHelpText(ret);
+  }
 }
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 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31358)
@@ -39,12 +39,12 @@
   @Override
   public void run() {
-    Main.map.statusLine.setHelpText("Downloading images from Mapillary");
+    Main.map.statusLine.setHelpText(tr("Downloading images from Mapillary"));
     try {
       downloadSequences();
       if (imagesAdded) {
-        Main.map.statusLine.setHelpText("Downloading image's information");
+        Main.map.statusLine.setHelpText(tr("Downloading image's information"));
         completeImages();
         MapillaryMainDialog.getInstance().updateTitle();
-        Main.map.statusLine.setHelpText("Downloading signs");
+        Main.map.statusLine.setHelpText(tr("Downloading signs"));
         downloadSigns();
       }
@@ -52,8 +52,5 @@
       Main.error(e);
     }
-    if (layer.data.getImages().size() > 0)
-      Main.map.statusLine.setHelpText(tr("Total images: ") + layer.data.getImages().size());
-    else
-      Main.map.statusLine.setHelpText(tr("No images found"));
+    layer.updateHelpText();
     layer.data.dataUpdated();
     MapillaryFilterDialog.getInstance().refresh();
@@ -62,8 +59,10 @@
 
   private void downloadSequences() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
+        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
     while (!ex.isShutdown()) {
-      ex.execute(new MapillarySequenceDownloadThread(ex, urlSequences + "&page=" + page + "&limit=10", layer, this));
+      ex.execute(new MapillarySequenceDownloadThread(ex, urlSequences
+          + "&page=" + page + "&limit=10", layer, this));
       while (ex.getQueue().remainingCapacity() == 0)
         Thread.sleep(500);
@@ -75,8 +74,10 @@
 
   private void completeImages() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
+        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
     while (!ex.isShutdown()) {
-      ex.execute(new MapillaryImageInfoDownloaderThread(ex, urlImages + "&page=" + page + "&limit=20", layer));
+      ex.execute(new MapillaryImageInfoDownloaderThread(ex, urlImages
+          + "&page=" + page + "&limit=20", layer));
       while (ex.getQueue().remainingCapacity() == 0)
         Thread.sleep(100);
@@ -87,8 +88,10 @@
 
   private void downloadSigns() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
+        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
     while (!ex.isShutdown()) {
-      ex.execute(new MapillarySignDownloaderThread(ex, urlSigns + "&page=" + page + "&limit=20", layer));
+      ex.execute(new MapillarySignDownloaderThread(ex, urlSigns + "&page="
+          + page + "&limit=20", layer));
       while (ex.getQueue().remainingCapacity() == 0)
         Thread.sleep(100);
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 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31358)
@@ -137,31 +137,31 @@
         return;
       }
+      // Enables/disables next/previous buttons
+      this.nextButton.setEnabled(false);
+      this.previousButton.setEnabled(false);
+      if (image.getSequence() != null) {
+        MapillaryAbstractImage tempImage = image;
+        while (tempImage.next() != null) {
+          tempImage = tempImage.next();
+          if (tempImage.isVisible()) {
+            this.nextButton.setEnabled(true);
+            break;
+          }
+        }
+      }
+      if (image.getSequence() != null) {
+        MapillaryAbstractImage tempImage = image;
+        while (tempImage.previous() != null) {
+          tempImage = tempImage.previous();
+          if (tempImage.isVisible()) {
+            this.previousButton.setEnabled(true);
+            break;
+          }
+        }
+      }
       if (image instanceof MapillaryImage) {
         mapillaryImageDisplay.hyperlink.setVisible(true);
         MapillaryImage mapillaryImage = (MapillaryImage) this.image;
         updateTitle();
-        // Enables/disables next/previous buttons
-        this.nextButton.setEnabled(false);
-        this.previousButton.setEnabled(false);
-        if (((MapillaryImage) image).getSequence() != null) {
-          MapillaryAbstractImage tempImage = image;
-          while (tempImage.next() != null) {
-            tempImage = tempImage.next();
-            if (tempImage.isVisible()) {
-              this.nextButton.setEnabled(true);
-              break;
-            }
-          }
-        }
-        if (((MapillaryImage) image).getSequence() != null) {
-          MapillaryAbstractImage tempImage = image;
-          while (tempImage.previous() != null) {
-            tempImage = tempImage.previous();
-            if (tempImage.isVisible()) {
-              this.previousButton.setEnabled(true);
-              break;
-            }
-          }
-        }
 
         mapillaryImageDisplay.hyperlink.setURL(mapillaryImage.getKey());
@@ -182,6 +182,4 @@
       } else if (image instanceof MapillaryImportedImage) {
         mapillaryImageDisplay.hyperlink.setVisible(false);
-        this.nextButton.setEnabled(false);
-        this.previousButton.setEnabled(false);
         MapillaryImportedImage mapillaryImage = (MapillaryImportedImage) this.image;
         try {
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 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/AbstractMode.java	(revision 31358)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.plugins.mapillary.mode;
 
+import java.awt.Cursor;
 import java.awt.Graphics2D;
 import java.awt.Point;
@@ -14,4 +15,6 @@
 
   protected MapillaryData data = MapillaryData.getInstance();
+  
+  public int cursor = Cursor.DEFAULT_CURSOR;
 
   public AbstractMode() {
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/JoinMode.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/JoinMode.java	(revision 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/JoinMode.java	(revision 31358)
@@ -2,7 +2,9 @@
 
 import java.awt.Color;
+import java.awt.Cursor;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
 
 import org.openstreetmap.josm.Main;
@@ -18,4 +20,8 @@
   public MapillaryImportedImage lastClick;
   public MouseEvent lastPos;
+  
+  public JoinMode() {
+    cursor = Cursor.CROSSHAIR_CURSOR;
+  }
 
   @Override
@@ -24,9 +30,9 @@
       return;
     if (lastClick == null && data.getHighlighted() instanceof MapillaryImportedImage) {
-      if (data.getHighlighted().previous() == null || data.getHighlighted().next() == null)
-        lastClick = (MapillaryImportedImage) data.getHighlighted();
+      lastClick = (MapillaryImportedImage) data.getHighlighted();
     } else if (lastClick != null && data.getHighlighted() instanceof MapillaryImportedImage) {
-      if ((data.getHighlighted().previous() == null && lastClick.next() == null)
-          || (data.getHighlighted().next() == null && lastClick.previous() == null)) {
+      if (((data.getHighlighted().previous() == null && lastClick.next() == null) || (data.getHighlighted().next() == null && lastClick
+          .previous() == null))
+          && (data.getHighlighted().getSequence() != lastClick.getSequence() || lastClick.getSequence() == null)) {
         join(lastClick, (MapillaryImportedImage) data.getHighlighted());
       } else if (lastClick.next() == data.getHighlighted() || lastClick.previous() == data.getHighlighted())
@@ -81,5 +87,31 @@
 
   private void unjoin(MapillaryImportedImage img1, MapillaryImportedImage img2) {
-    // TODO
+    if (img1.next() != img2) {
+      MapillaryImportedImage temp = img1;
+      img1 = img2;
+      img2 = temp;
+    }
+
+    ArrayList<MapillaryAbstractImage> firstHalf = new ArrayList<>(img1.getSequence().getImages()
+        .subList(0, img1.getSequence().getImages().indexOf(img2)));
+    ArrayList<MapillaryAbstractImage> secondHalf = new ArrayList<>(img1.getSequence().getImages()
+        .subList(img1.getSequence().getImages().indexOf(img2), img1.getSequence().getImages().size()));
+
+    MapillarySequence seq1 = new MapillarySequence();
+    MapillarySequence seq2 = new MapillarySequence();
+
+    for (MapillaryAbstractImage img : firstHalf) {
+      img.setSequence(seq1);
+      seq1.add(img);
+    }
+    for (MapillaryAbstractImage img : secondHalf) {
+      img.setSequence(seq2);
+      seq2.add(img);
+    }
+  }
+  
+  @Override
+  public String toString() {
+    return "Join mode";
   }
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/SelectMode.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/SelectMode.java	(revision 31357)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/SelectMode.java	(revision 31358)
@@ -196,3 +196,8 @@
   public void paint(Graphics2D g, MapView mv, Bounds box) {
   }
+  
+  @Override
+  public String toString() {
+    return "Select mode";
+  }
 }
