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 31355)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31356)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryFilterDialog;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
+import org.openstreetmap.josm.plugins.mapillary.mode.SelectMode;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -75,5 +76,5 @@
   public ArrayList<Bounds> bounds;
 
-  private MouseAdapter mouseAdapter;
+  private MouseAdapter mode;
 
   private int highlightPointRadius = Main.pref.getInteger(
@@ -94,5 +95,5 @@
    */
   private void init() {
-    mouseAdapter = new MapillaryMouseAdapter();
+    mode = new SelectMode();
     try {
       CACHE = JCSCacheManager.getCache("Mapillary");
@@ -101,6 +102,6 @@
     }
     if (Main.map != null && Main.map.mapView != null) {
-      Main.map.mapView.addMouseListener(mouseAdapter);
-      Main.map.mapView.addMouseMotionListener(mouseAdapter);
+      Main.map.mapView.addMouseListener(mode);
+      Main.map.mapView.addMouseMotionListener(mode);
       Main.map.mapView.addLayer(this);
       MapView.addEditLayerChangeListener(this, false);
@@ -118,4 +119,12 @@
     createHatchTexture();
     data.dataUpdated();
+  }
+  
+  public void setMode(MouseAdapter mode) {
+    Main.map.mapView.removeMouseListener(this.mode);
+    Main.map.mapView.removeMouseMotionListener(this.mode);
+    this.mode = mode;
+    Main.map.mapView.addMouseListener(mode);
+    Main.map.mapView.addMouseMotionListener(mode);
   }
 
@@ -186,6 +195,6 @@
     MapillaryPlugin.setMenuEnabled(MapillaryPlugin.EXPORT_MENU, false);
     MapillaryPlugin.setMenuEnabled(MapillaryPlugin.ZOOM_MENU, false);
-    Main.map.mapView.removeMouseListener(mouseAdapter);
-    Main.map.mapView.removeMouseMotionListener(mouseAdapter);
+    Main.map.mapView.removeMouseListener(mode);
+    Main.map.mapView.removeMouseMotionListener(mode);
     MapView.removeEditLayerChangeListener(this);
     if (Main.map.mapView.getEditLayer() != null)
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryMouseAdapter.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryMouseAdapter.java	(revision 31355)
+++ 	(revision )
@@ -1,204 +1,0 @@
-package org.openstreetmap.josm.plugins.mapillary;
-
-import java.awt.Point;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.plugins.mapillary.commands.CommandMoveImage;
-import org.openstreetmap.josm.plugins.mapillary.commands.CommandTurnImage;
-import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecord;
-import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
-
-/**
- * Handles the input event related with the layer. Mainly clicks.
- * 
- * @author nokutu
- *
- */
-public class MapillaryMouseAdapter extends MouseAdapter {
-  private Point start;
-  private int lastButton;
-  private MapillaryAbstractImage closest;
-  private MapillaryAbstractImage lastClicked;
-  private MapillaryData mapillaryData;
-  private MapillaryRecord record;
-
-  private boolean nothingHighlighted;
-  private boolean imageHighlighted = false;
-
-  public MapillaryMouseAdapter() {
-    mapillaryData = MapillaryData.getInstance();
-    record = MapillaryRecord.getInstance();
-  }
-
-  @Override
-  public void mousePressed(MouseEvent e) {
-    lastButton = e.getButton();
-    if (e.getButton() != MouseEvent.BUTTON1)
-      return;
-    MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
-    if (Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && closestTemp != null
-        && Main.map.mapMode == Main.map.mapModeSelect) {
-      this.lastClicked = this.closest;
-      MapillaryData.getInstance().setSelectedImage(closestTemp);
-      return;
-    } else if (Main.map.mapView.getActiveLayer() != MapillaryLayer.getInstance())
-      return;
-    if (closestTemp instanceof MapillaryImage || closestTemp == null) {
-      MapillaryImage closest = (MapillaryImage) closestTemp;
-      // Doube click
-      if (e.getClickCount() == 2 && mapillaryData.getSelectedImage() != null && closest != null) {
-        for (MapillaryAbstractImage img : closest.getSequence().getImages()) {
-          mapillaryData.addMultiSelectedImage(img);
-        }
-      }
-      this.start = e.getPoint();
-      this.lastClicked = this.closest;
-      this.closest = closest;
-      if (mapillaryData.getMultiSelectedImages().contains(closest))
-        return;
-      // ctrl+click
-      if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK) && closest != null)
-        mapillaryData.addMultiSelectedImage(closest);
-      // shift + click
-      else if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.SHIFT_MASK)
-          && this.closest instanceof MapillaryImage && this.lastClicked instanceof MapillaryImage) {
-        if (this.closest != null && this.lastClicked != null
-            && ((MapillaryImage) this.closest).getSequence() == ((MapillaryImage) this.lastClicked).getSequence()) {
-          int i = ((MapillaryImage) this.closest).getSequence().getImages().indexOf(this.closest);
-          int j = ((MapillaryImage) this.lastClicked).getSequence().getImages().indexOf(this.lastClicked);
-          if (i < j)
-            mapillaryData.addMultiSelectedImage(new ArrayList<>(((MapillaryImage) this.closest).getSequence()
-                .getImages().subList(i, j + 1)));
-          else
-            mapillaryData.addMultiSelectedImage(new ArrayList<>(((MapillaryImage) this.closest).getSequence()
-                .getImages().subList(j, i + 1)));
-        }
-        // click
-      } else
-        mapillaryData.setSelectedImage(closest);
-      // If you select an imported image
-    } else if (closestTemp instanceof MapillaryImportedImage) {
-      MapillaryImportedImage closest = (MapillaryImportedImage) closestTemp;
-      this.start = e.getPoint();
-      this.lastClicked = this.closest;
-      this.closest = closest;
-      if (mapillaryData.getMultiSelectedImages().contains(closest))
-        return;
-      if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK) && closest != null)
-        mapillaryData.addMultiSelectedImage(closest);
-      else
-        mapillaryData.setSelectedImage(closest);
-    }
-  }
-
-  private MapillaryAbstractImage getClosest(Point clickPoint) {
-    double snapDistance = 10;
-    double minDistance = Double.MAX_VALUE;
-    MapillaryAbstractImage closest = null;
-    for (MapillaryAbstractImage image : mapillaryData.getImages()) {
-      Point imagePoint = Main.map.mapView.getPoint(image.getLatLon());
-      imagePoint.setLocation(imagePoint.getX(), imagePoint.getY());
-      double dist = clickPoint.distanceSq(imagePoint);
-      if (minDistance > dist && clickPoint.distance(imagePoint) < snapDistance && image.isVisible()) {
-        minDistance = dist;
-        closest = image;
-      }
-    }
-    return closest;
-  }
-
-  @Override
-  public void mouseDragged(MouseEvent e) {
-    if (Main.map.mapView.getActiveLayer() != MapillaryLayer.getInstance())
-      return;
-
-    if (!Main.pref.getBoolean("mapillary.developer"))
-      for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
-        if (img instanceof MapillaryImage)
-          return;
-      }
-    if (MapillaryData.getInstance().getSelectedImage() != null) {
-      if (lastButton == MouseEvent.BUTTON1 && !e.isShiftDown()) {
-        LatLon to = Main.map.mapView.getLatLon(e.getX(), e.getY());
-        LatLon from = Main.map.mapView.getLatLon(start.getX(), start.getY());
-        for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
-
-          img.move(to.getX() - from.getX(), to.getY() - from.getY());
-        }
-        Main.map.repaint();
-      } else if (lastButton == MouseEvent.BUTTON1 && e.isShiftDown()) {
-        this.closest
-            .turn(Math.toDegrees(Math.atan2((e.getX() - start.x), -(e.getY() - start.y))) - closest.getTempCa());
-        for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
-          img.turn(Math.toDegrees(Math.atan2((e.getX() - start.x), -(e.getY() - start.y))) - closest.getTempCa());
-        }
-        Main.map.repaint();
-      }
-    }
-  }
-
-  @Override
-  public void mouseReleased(MouseEvent e) {
-    if (mapillaryData.getSelectedImage() == null)
-      return;
-    if (mapillaryData.getSelectedImage().getTempCa() != mapillaryData.getSelectedImage().getCa()) {
-      double from = mapillaryData.getSelectedImage().getTempCa();
-      double to = mapillaryData.getSelectedImage().getCa();
-      record.addCommand(new CommandTurnImage(mapillaryData.getMultiSelectedImages(), to - from));
-    } else if (mapillaryData.getSelectedImage().getTempLatLon() != mapillaryData.getSelectedImage().getLatLon()) {
-      LatLon from = mapillaryData.getSelectedImage().getTempLatLon();
-      LatLon to = mapillaryData.getSelectedImage().getLatLon();
-      record.addCommand(new CommandMoveImage(mapillaryData.getMultiSelectedImages(), to.getX() - from.getX(), to.getY()
-          - from.getY()));
-    }
-    for (MapillaryAbstractImage img : mapillaryData.getMultiSelectedImages()) {
-      if (img != null)
-        img.stopMoving();
-    }
-  }
-
-  /**
-   * Checks if the mouse is over pictures.
-   */
-  @Override
-  public void mouseMoved(MouseEvent e) {
-    MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
-    if (Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && Main.map.mapMode != Main.map.mapModeSelect)
-      return;
-    if (closestTemp != null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && !imageHighlighted) {
-      Main.map.mapMode.putValue("active", Boolean.FALSE);
-      imageHighlighted = true;
-
-    } else if (closestTemp == null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && imageHighlighted
-        && nothingHighlighted) {
-      nothingHighlighted = false;
-      Main.map.mapMode.putValue("active", Boolean.TRUE);
-
-    } else if (imageHighlighted && !nothingHighlighted && Main.map.mapView != null
-        && Main.map.mapView.getEditLayer().data != null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer) {
-
-      for (OsmPrimitive primivitive : Main.map.mapView.getEditLayer().data.allPrimitives()) {
-        primivitive.setHighlighted(false);
-      }
-      imageHighlighted = false;
-      nothingHighlighted = true;
-    }
-
-    if (MapillaryData.getInstance().getHoveredImage() != closestTemp && closestTemp != null) {
-      MapillaryData.getInstance().setHighlightedImage(closestTemp);
-      MapillaryMainDialog.getInstance().setImage(closestTemp);
-      MapillaryMainDialog.getInstance().updateImage();
-    } else if (MapillaryData.getInstance().getHoveredImage() != closestTemp && closestTemp == null) {
-      MapillaryData.getInstance().setHighlightedImage(null);
-      MapillaryMainDialog.getInstance().setImage(MapillaryData.getInstance().getSelectedImage());
-      MapillaryMainDialog.getInstance().updateImage();
-    }
-    MapillaryData.getInstance().dataUpdated();
-  }
-}
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 31356)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/AbstractMode.java	(revision 31356)
@@ -0,0 +1,34 @@
+package org.openstreetmap.josm.plugins.mapillary.mode;
+
+import java.awt.Point;
+import java.awt.event.MouseAdapter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
+
+public abstract class AbstractMode extends MouseAdapter {
+
+  protected MapillaryData data;
+
+  public AbstractMode() {
+    super();
+  }
+
+  protected MapillaryAbstractImage getClosest(Point clickPoint) {
+    double snapDistance = 10;
+    double minDistance = Double.MAX_VALUE;
+    MapillaryAbstractImage closest = null;
+    for (MapillaryAbstractImage image : data.getImages()) {
+      Point imagePoint = Main.map.mapView.getPoint(image.getLatLon());
+      imagePoint.setLocation(imagePoint.getX(), imagePoint.getY());
+      double dist = clickPoint.distanceSq(imagePoint);
+      if (minDistance > dist && clickPoint.distance(imagePoint) < snapDistance && image.isVisible()) {
+        minDistance = dist;
+        closest = image;
+      }
+    }
+    return closest;
+  }
+
+}
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 31356)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/JoinMode.java	(revision 31356)
@@ -0,0 +1,25 @@
+package org.openstreetmap.josm.plugins.mapillary.mode;
+
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+
+public class JoinMode extends AbstractMode {
+  
+  @Override
+  public void mousePressed(MouseEvent e) {
+    
+  }
+  
+  @Override
+  public void mouseMoved(MouseEvent e) {
+    MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
+    if (!(Main.map.mapView.getActiveLayer() instanceof MapillaryLayer))
+      return;
+    data.setHighlightedImage(closestTemp);
+  }
+}
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 31356)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/mode/SelectMode.java	(revision 31356)
@@ -0,0 +1,191 @@
+package org.openstreetmap.josm.plugins.mapillary.mode;
+
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+import org.openstreetmap.josm.plugins.mapillary.commands.CommandMoveImage;
+import org.openstreetmap.josm.plugins.mapillary.commands.CommandTurnImage;
+import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecord;
+import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
+
+/**
+ * Handles the input event related with the layer. Mainly clicks.
+ * 
+ * @author nokutu
+ *
+ */
+public class SelectMode extends AbstractMode {
+  private Point start;
+  private int lastButton;
+  private MapillaryAbstractImage closest;
+  private MapillaryAbstractImage lastClicked;
+  private MapillaryRecord record;
+
+  private boolean nothingHighlighted;
+  private boolean imageHighlighted = false;
+
+  public SelectMode() {
+    data = MapillaryData.getInstance();
+    record = MapillaryRecord.getInstance();
+  }
+
+  @Override
+  public void mousePressed(MouseEvent e) {
+    lastButton = e.getButton();
+    if (e.getButton() != MouseEvent.BUTTON1)
+      return;
+    MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
+    if (Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && closestTemp != null
+        && Main.map.mapMode == Main.map.mapModeSelect) {
+      this.lastClicked = this.closest;
+      MapillaryData.getInstance().setSelectedImage(closestTemp);
+      return;
+    } else if (Main.map.mapView.getActiveLayer() != MapillaryLayer.getInstance())
+      return;
+    if (closestTemp instanceof MapillaryImage || closestTemp == null) {
+      MapillaryImage closest = (MapillaryImage) closestTemp;
+      // Doube click
+      if (e.getClickCount() == 2 && data.getSelectedImage() != null && closest != null) {
+        for (MapillaryAbstractImage img : closest.getSequence().getImages()) {
+          data.addMultiSelectedImage(img);
+        }
+      }
+      this.start = e.getPoint();
+      this.lastClicked = this.closest;
+      this.closest = closest;
+      if (data.getMultiSelectedImages().contains(closest))
+        return;
+      // ctrl+click
+      if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK) && closest != null)
+        data.addMultiSelectedImage(closest);
+      // shift + click
+      else if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.SHIFT_MASK)
+          && this.closest instanceof MapillaryImage && this.lastClicked instanceof MapillaryImage) {
+        if (this.closest != null && this.lastClicked != null
+            && ((MapillaryImage) this.closest).getSequence() == ((MapillaryImage) this.lastClicked).getSequence()) {
+          int i = ((MapillaryImage) this.closest).getSequence().getImages().indexOf(this.closest);
+          int j = ((MapillaryImage) this.lastClicked).getSequence().getImages().indexOf(this.lastClicked);
+          if (i < j)
+            data.addMultiSelectedImage(new ArrayList<>(((MapillaryImage) this.closest).getSequence()
+                .getImages().subList(i, j + 1)));
+          else
+            data.addMultiSelectedImage(new ArrayList<>(((MapillaryImage) this.closest).getSequence()
+                .getImages().subList(j, i + 1)));
+        }
+        // click
+      } else
+        data.setSelectedImage(closest);
+      // If you select an imported image
+    } else if (closestTemp instanceof MapillaryImportedImage) {
+      MapillaryImportedImage closest = (MapillaryImportedImage) closestTemp;
+      this.start = e.getPoint();
+      this.lastClicked = this.closest;
+      this.closest = closest;
+      if (data.getMultiSelectedImages().contains(closest))
+        return;
+      if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK) && closest != null)
+        data.addMultiSelectedImage(closest);
+      else
+        data.setSelectedImage(closest);
+    }
+  }
+
+  @Override
+  public void mouseDragged(MouseEvent e) {
+    if (Main.map.mapView.getActiveLayer() != MapillaryLayer.getInstance())
+      return;
+
+    if (!Main.pref.getBoolean("mapillary.developer"))
+      for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
+        if (img instanceof MapillaryImage)
+          return;
+      }
+    if (MapillaryData.getInstance().getSelectedImage() != null) {
+      if (lastButton == MouseEvent.BUTTON1 && !e.isShiftDown()) {
+        LatLon to = Main.map.mapView.getLatLon(e.getX(), e.getY());
+        LatLon from = Main.map.mapView.getLatLon(start.getX(), start.getY());
+        for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
+
+          img.move(to.getX() - from.getX(), to.getY() - from.getY());
+        }
+        Main.map.repaint();
+      } else if (lastButton == MouseEvent.BUTTON1 && e.isShiftDown()) {
+        this.closest
+            .turn(Math.toDegrees(Math.atan2((e.getX() - start.x), -(e.getY() - start.y))) - closest.getTempCa());
+        for (MapillaryAbstractImage img : MapillaryData.getInstance().getMultiSelectedImages()) {
+          img.turn(Math.toDegrees(Math.atan2((e.getX() - start.x), -(e.getY() - start.y))) - closest.getTempCa());
+        }
+        Main.map.repaint();
+      }
+    }
+  }
+
+  @Override
+  public void mouseReleased(MouseEvent e) {
+    if (data.getSelectedImage() == null)
+      return;
+    if (data.getSelectedImage().getTempCa() != data.getSelectedImage().getCa()) {
+      double from = data.getSelectedImage().getTempCa();
+      double to = data.getSelectedImage().getCa();
+      record.addCommand(new CommandTurnImage(data.getMultiSelectedImages(), to - from));
+    } else if (data.getSelectedImage().getTempLatLon() != data.getSelectedImage().getLatLon()) {
+      LatLon from = data.getSelectedImage().getTempLatLon();
+      LatLon to = data.getSelectedImage().getLatLon();
+      record.addCommand(new CommandMoveImage(data.getMultiSelectedImages(), to.getX() - from.getX(), to.getY()
+          - from.getY()));
+    }
+    for (MapillaryAbstractImage img : data.getMultiSelectedImages()) {
+      if (img != null)
+        img.stopMoving();
+    }
+  }
+
+  /**
+   * Checks if the mouse is over pictures.
+   */
+  @Override
+  public void mouseMoved(MouseEvent e) {
+    MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
+    if (Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && Main.map.mapMode != Main.map.mapModeSelect)
+      return;
+    if (closestTemp != null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && !imageHighlighted) {
+      Main.map.mapMode.putValue("active", Boolean.FALSE);
+      imageHighlighted = true;
+
+    } else if (closestTemp == null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer && imageHighlighted
+        && nothingHighlighted) {
+      nothingHighlighted = false;
+      Main.map.mapMode.putValue("active", Boolean.TRUE);
+
+    } else if (imageHighlighted && !nothingHighlighted && Main.map.mapView != null
+        && Main.map.mapView.getEditLayer().data != null && Main.map.mapView.getActiveLayer() instanceof OsmDataLayer) {
+
+      for (OsmPrimitive primivitive : Main.map.mapView.getEditLayer().data.allPrimitives()) {
+        primivitive.setHighlighted(false);
+      }
+      imageHighlighted = false;
+      nothingHighlighted = true;
+    }
+
+    if (MapillaryData.getInstance().getHoveredImage() != closestTemp && closestTemp != null) {
+      MapillaryData.getInstance().setHighlightedImage(closestTemp);
+      MapillaryMainDialog.getInstance().setImage(closestTemp);
+      MapillaryMainDialog.getInstance().updateImage();
+    } else if (MapillaryData.getInstance().getHoveredImage() != closestTemp && closestTemp == null) {
+      MapillaryData.getInstance().setHighlightedImage(null);
+      MapillaryMainDialog.getInstance().setImage(MapillaryData.getInstance().getSelectedImage());
+      MapillaryMainDialog.getInstance().updateImage();
+    }
+    MapillaryData.getInstance().dataUpdated();
+  }
+}
