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 31254)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31255)
@@ -103,4 +103,15 @@
 		return tempCa;
 	}
-
+	
+	@Override
+	public boolean equals(Object object) {
+		if (object instanceof MapillaryAbstractImage)
+			return this.getLatLon().equalsEpsilon(((MapillaryAbstractImage) object).getLatLon());
+		return false;
+	}
+	
+	@Override
+	public int hashCode() {
+		return this.getLatLon().hashCode();
+	}
 }
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 31254)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 31255)
@@ -65,16 +65,4 @@
 	}
 
-	@Override
-	public boolean equals(Object image) {
-		if (image instanceof MapillaryImage)
-			return this.key.equals(((MapillaryImage) image).getKey());
-		return false;
-	}
-
-	@Override
-	public int hashCode() {
-		return this.key.hashCode();
-	}
-
 	/**
 	 * If the MapillaryImage belongs to a MapillarySequence, returns the next
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 31254)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31255)
@@ -5,7 +5,4 @@
 import org.apache.commons.jcs.access.CacheAccess;
 import org.openstreetmap.josm.plugins.mapillary.cache.MapillaryCache;
-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.downloads.MapillaryDownloader;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryToggleDialog;
@@ -39,5 +36,4 @@
 import java.awt.Point;
 import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
 import java.awt.geom.AffineTransform;
 import java.awt.image.AffineTransformOp;
@@ -64,5 +60,4 @@
 
 	private final MapillaryData mapillaryData = MapillaryData.getInstance();
-	private final MapillaryRecord record = MapillaryRecord.getInstance();
 
 	private List<Bounds> bounds;
@@ -111,162 +106,8 @@
 
 	public void startMouseAdapter() {
-		mouseAdapter = new MouseAdapter() {
-
-			private Point start;
-			private int lastButton;
-			private MapillaryAbstractImage closest;
-			private MapillaryAbstractImage lastClicked;
-
-			@Override
-			public void mousePressed(MouseEvent e) {
-				lastButton = e.getButton();
-				if (e.getButton() != MouseEvent.BUTTON1)
-					return;
-				if (Main.map.mapView.getActiveLayer() != MapillaryLayer
-						.getInstance())
-					return;
-				MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
-				if (closestTemp instanceof MapillaryImage
-						|| closestTemp == null) {
-					MapillaryImage closest = (MapillaryImage) closestTemp;
-					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;
-					if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK)
-							&& closest != null)
-						mapillaryData.addMultiSelectedImage(closest);
-					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<MapillaryAbstractImage>(
-												((MapillaryImage) this.closest).getSequence()
-														.getImages()
-														.subList(i, j + 1)));
-							else
-								mapillaryData
-										.addMultiSelectedImage(new ArrayList<MapillaryAbstractImage>(
-												((MapillaryImage) this.closest).getSequence()
-														.getImages()
-														.subList(j, i + 1)));
-						}
-					} else
-						mapillaryData.setSelectedImage(closest);
-				} 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) {
-						minDistance = dist;
-						closest = image;
-					}
-				}
-				return closest;
-			}
-
-			@Override
-			public void mouseDragged(MouseEvent e) {
-				if (Main.map.mapView.getActiveLayer() != MapillaryLayer
-						.getInstance())
-					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();
-				}
-			}
-		};
-	}
-
+		mouseAdapter = new MapillaryMouseAdapter();
+	}
+
+			
 	public synchronized static MapillaryLayer getInstance() {
 		if (MapillaryLayer.INSTANCE == 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 31255)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryMouseAdapter.java	(revision 31255)
@@ -0,0 +1,181 @@
+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.plugins.mapillary.commands.CommandMoveImage;
+import org.openstreetmap.josm.plugins.mapillary.commands.CommandTurnImage;
+import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecord;
+
+public class MapillaryMouseAdapter extends MouseAdapter {
+	private Point start;
+	private int lastButton;
+	private MapillaryAbstractImage closest;
+	private MapillaryAbstractImage lastClicked;
+	private MapillaryData mapillaryData;
+	private MapillaryRecord record;
+	
+	public MapillaryMouseAdapter(){
+		mapillaryData = MapillaryData.getInstance();
+		record = MapillaryRecord.getInstance();
+	}
+
+	@Override
+	public void mousePressed(MouseEvent e) {
+		lastButton = e.getButton();
+		if (e.getButton() != MouseEvent.BUTTON1)
+			return;
+		if (Main.map.mapView.getActiveLayer() != MapillaryLayer
+				.getInstance())
+			return;
+		MapillaryAbstractImage closestTemp = getClosest(e.getPoint());
+		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<MapillaryAbstractImage>(
+										((MapillaryImage) this.closest).getSequence()
+												.getImages()
+												.subList(i, j + 1)));
+					else
+						mapillaryData
+								.addMultiSelectedImage(new ArrayList<MapillaryAbstractImage>(
+										((MapillaryImage) this.closest).getSequence()
+												.getImages()
+												.subList(j, i + 1)));
+				}
+			// click
+			} else
+				mapillaryData.setSelectedImage(closest);
+		// If you select and 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) {
+				minDistance = dist;
+				closest = image;
+			}
+		}
+		return closest;
+	}
+
+	@Override
+	public void mouseDragged(MouseEvent e) {
+		if (Main.map.mapView.getActiveLayer() != MapillaryLayer
+				.getInstance())
+			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();
+		}
+	}
+
+}
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java	(revision 31254)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java	(revision 31255)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
@@ -63,11 +64,13 @@
 						try {
 							readJPG(file);
-						} catch (ImageReadException e1) {
-							// TODO Auto-generated catch block
-							e1.printStackTrace();
-						} catch (IOException e1) {
-							// TODO Auto-generated catch block
-							e1.printStackTrace();
+						} catch (ImageReadException ex) {
+							Main.error(ex);
+						} catch (IOException ex) {
+							Main.error(ex);
 						}
+					}
+					else if (file.getPath().substring(file.getPath().length() - 4)
+							.equals(".png")) {
+						readPNG(file);
 					}
 				}
@@ -110,6 +113,20 @@
 						new MapillaryImportedImage(latValue, lonValue, caValue,
 								file));
+			} else {
+				LatLon pos = Main.map.mapView.getProjection().eastNorth2latlon(
+						Main.map.mapView.getCenter());
+				MapillaryData.getInstance().add(
+						new MapillaryImportedImage(pos.lat(), pos.lon(), 0,
+								file));
 			}
 		}
+	}
+	
+	private void readPNG(File file) {
+		LatLon pos = Main.map.mapView.getProjection().eastNorth2latlon(
+				Main.map.mapView.getCenter());
+		MapillaryData.getInstance().add(
+				new MapillaryImportedImage(pos.lat(), pos.lon(), 0,
+						file));
 	}
 
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java	(revision 31254)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java	(revision 31255)
@@ -24,4 +24,5 @@
 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.cache.MapillaryCache;
@@ -131,4 +132,14 @@
 						MapillaryCache.Type.FULL_IMAGE);
 				imageCache.submit(this, false);
+			}
+			else if (image instanceof MapillaryImportedImage) {
+				this.nextButton.setEnabled(false);
+				this.previousButton.setEnabled(false);
+				MapillaryImportedImage mapillaryImage = (MapillaryImportedImage) this.image;
+				try {
+					mapillaryImageDisplay.setImage(mapillaryImage.getImage());
+				} catch (IOException e) {
+					Main.error(e);
+				}
 			}
 		}
