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 31216)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 31217)
@@ -11,9 +11,12 @@
  */
 public class MapillaryImage {
-	private String key;
-	private LatLon latLon;
-	private Double ca;
+	private final String key;
+	private final LatLon latLon;
+	private final double ca;
+	private MapillarySequence sequence;
+	
 	private boolean isModified = false;
-	private MapillarySequence sequence;
+	private LatLon tempLatLon;
+	private double tempCa;
 
 	/**
@@ -32,5 +35,7 @@
 		this.key = key;
 		this.latLon = new LatLon(lat, lon);
+		this.tempLatLon = new LatLon(lat, lon);
 		this.ca = ca;
+		this.tempCa = ca;
 	}
 
@@ -50,5 +55,24 @@
 	 */
 	public LatLon getLatLon() {
-		return latLon;
+		return tempLatLon;
+	}
+	
+	/**
+	 * Moves the image temporally to another position
+	 * 
+	 * @param pos
+	 */
+	public void move(LatLon pos) {
+		this.tempLatLon = pos;
+		this.isModified = true;
+	}
+	
+	/**
+	 * Turns the image direction.
+	 * @param ca
+	 */
+	public void turn(double ca) {
+		this.tempCa = ca;
+		this.isModified = true;
 	}
 
@@ -59,5 +83,5 @@
 	 */
 	public Double getCa() {
-		return ca;
+		return tempCa;
 	}
 
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 31216)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31217)
@@ -33,6 +33,8 @@
 import java.awt.Image;
 import java.awt.Point;
+import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionAdapter;
 import java.awt.geom.AffineTransform;
 import java.awt.image.AffineTransformOp;
@@ -43,4 +45,5 @@
 import javax.swing.Action;
 import javax.swing.Icon;
+import javax.swing.SwingUtilities;
 
 import java.util.List;
@@ -48,5 +51,5 @@
 
 public class MapillaryLayer extends AbstractModifiableLayer implements
-		MouseListener, DataSetListener, EditLayerChangeListener {
+		DataSetListener, EditLayerChangeListener {
 
 	public final static int SEQUENCE_MAX_JUMP_DISTANCE = 100;
@@ -62,4 +65,6 @@
 	private MapillaryToggleDialog tgd;
 
+	private MouseAdapter mouseAdapter;
+
 	public MapillaryLayer() {
 		super(tr("Mapillary Images"));
@@ -75,4 +80,5 @@
 		INSTANCED = true;
 		MapillaryLayer.INSTANCE = this;
+		startMouseAdapter();
 		try {
 			CACHE = JCSCacheManager.getCache("Mapillary");
@@ -81,5 +87,6 @@
 		}
 		if (Main.map != null && Main.map.mapView != null) {
-			Main.map.mapView.addMouseListener(this);
+			Main.map.mapView.addMouseListener(mouseAdapter);
+			Main.map.mapView.addMouseMotionListener(mouseAdapter);
 			Main.map.mapView.addLayer(this);
 			MapView.addEditLayerChangeListener(this, false);
@@ -98,4 +105,62 @@
 	}
 
+	public void startMouseAdapter() {
+		mouseAdapter = new MouseAdapter() {
+
+			private Point start;
+			private int lastButton;
+
+			@Override
+			public void mousePressed(MouseEvent e) {
+				lastButton = e.getButton();
+				if (e.getButton() != MouseEvent.BUTTON1)
+					return;
+				if (Main.map.mapView.getActiveLayer() != MapillaryLayer
+						.getInstance())
+					return;
+				Point clickPoint = e.getPoint();
+				double snapDistance = 10;
+				double minDistance = Double.MAX_VALUE;
+				MapillaryImage closest = null;
+				for (MapillaryImage 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;
+					}
+				}
+				start = e.getPoint();
+				if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK))
+					mapillaryData.addMultiSelectedImage(closest);
+				else
+					mapillaryData.setSelectedImage(closest);
+			}
+
+			@Override
+			public void mouseDragged(MouseEvent e) {
+				if (MapillaryData.getInstance().getSelectedImage() != null) {
+					if (lastButton == MouseEvent.BUTTON1 && !e.isShiftDown()) {
+						MapillaryData
+								.getInstance()
+								.getSelectedImage()
+								.move(Main.map.mapView.getLatLon(e.getX(),
+										e.getY()));
+						Main.map.repaint();
+					} else if (lastButton == MouseEvent.BUTTON1 && e.isShiftDown()) {
+						MapillaryData
+						.getInstance()
+						.getSelectedImage().turn(Math.toDegrees(Math.atan2((e.getX() - start.x), -(e.getY() - start.y))));
+						Main.map.repaint();
+					}
+				}
+			}
+		};
+	}
+
 	public synchronized static MapillaryLayer getInstance() {
 		if (MapillaryLayer.INSTANCE == null)
@@ -139,5 +204,5 @@
 		MapillaryPlugin.setMenuEnabled(MapillaryPlugin.EXPORT_MENU, false);
 		MapillaryData.INSTANCE = null;
-		Main.map.mapView.removeMouseListener(this);
+		Main.map.mapView.removeMouseListener(mouseAdapter);
 		MapView.removeEditLayerChangeListener(this);
 		if (Main.map.mapView.getEditLayer() != null)
@@ -287,30 +352,4 @@
 
 	@Override
-	public void mouseClicked(MouseEvent e) {
-		if (e.getButton() != MouseEvent.BUTTON1)
-			return;
-		if (Main.map.mapView.getActiveLayer() != this)
-			return;
-		Point clickPoint = e.getPoint();
-		double snapDistance = 10;
-		double minDistance = Double.MAX_VALUE;
-		MapillaryImage closest = null;
-		for (MapillaryImage 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;
-			}
-		}
-		if (e.getModifiers() == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK))
-			mapillaryData.addMultiSelectedImage(closest);
-		else
-			mapillaryData.setSelectedImage(closest);
-	}
-
-	@Override
 	public Object getInfoComponent() {
 		StringBuilder sb = new StringBuilder();
@@ -333,25 +372,4 @@
 	}
 
-	// MouseListener
-	@Override
-	public void visitBoundingBox(BoundingXYVisitor v) {
-	}
-
-	@Override
-	public void mousePressed(MouseEvent e) {
-	}
-
-	@Override
-	public void mouseReleased(MouseEvent e) {
-	}
-
-	@Override
-	public void mouseEntered(MouseEvent e) {
-	}
-
-	@Override
-	public void mouseExited(MouseEvent e) {
-	}
-
 	// EditDataLayerChanged
 	@Override
@@ -411,3 +429,7 @@
 	public void otherDatasetChange(AbstractDatasetChangedEvent event) {
 	}
+
+	@Override
+	public void visitBoundingBox(BoundingXYVisitor v) {
+	}
 }
