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 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31487)
@@ -20,5 +20,5 @@
 public class MapillaryData {
 
-  private final List<MapillaryAbstractImage> images;
+  private List<MapillaryAbstractImage> images;
   private MapillaryAbstractImage selectedImage;
   /** The image under the cursor */
@@ -64,4 +64,32 @@
   public synchronized void add(MapillaryAbstractImage image) {
     add(image, true);
+  }
+
+  /**
+   * Removes an image from the database.
+   *
+   * @param image
+   */
+  public synchronized void delete(MapillaryAbstractImage image) {
+    if (MapillaryMainDialog.getInstance().getImage() != null) {
+      MapillaryMainDialog.getInstance().setImage(null);
+      MapillaryMainDialog.getInstance().updateImage();
+    }
+    setSelectedImage(null);
+    this.images.remove(image);
+    if (image.getSequence() != null)
+      image.getSequence().remove(image);
+    if (Main.main != null)
+      dataUpdated();
+  }
+
+  /**
+   * Removes a set of images from the database.
+   *
+   * @param images
+   */
+  public synchronized void delete(List<MapillaryAbstractImage> images) {
+    for (MapillaryAbstractImage img : images)
+      delete(img);
   }
 
@@ -359,4 +387,13 @@
 
   /**
+   * Sets a new ArrayList object as the used set of images.
+   *
+   * @param images
+   */
+  public synchronized void setImages(List<MapillaryAbstractImage> images) {
+    this.images = new ArrayList<>(images);
+  }
+
+  /**
    * Returns the amount of images contained by this object.
    *
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 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31487)
@@ -5,4 +5,6 @@
 
 import org.openstreetmap.josm.plugins.mapillary.cache.CacheUtils;
+import org.openstreetmap.josm.plugins.mapillary.commands.CommandDeleteImage;
+import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecord;
 import org.openstreetmap.josm.plugins.mapillary.downloads.MapillaryDownloader;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryFilterDialog;
@@ -44,4 +46,5 @@
 import java.awt.Rectangle;
 import java.awt.TexturePaint;
+import java.awt.event.ActionEvent;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Area;
@@ -49,7 +52,10 @@
 import java.awt.image.BufferedImage;
 
+import javax.swing.AbstractAction;
 import javax.swing.ImageIcon;
 import javax.swing.Action;
 import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.KeyStroke;
 
 import java.util.List;
@@ -126,4 +132,11 @@
     }
     createHatchTexture();
+
+    MapillaryMainDialog.getInstance()
+        .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
+        .put(KeyStroke.getKeyStroke("DELETE"), "MapillaryDel");
+    MapillaryMainDialog.getInstance().getActionMap()
+        .put("MapillaryDel", new DeleteImageAction());
+
     if (Main.main != null)
       MapillaryData.dataUpdated();
@@ -176,4 +189,5 @@
   public void destroy() {
     setMode(null);
+
     AbstractMode.resetThread();
     MapillaryDownloader.stopAll();
@@ -593,3 +607,22 @@
     // Nothing
   }
+
+  /**
+   * Action used to delete images.
+   *
+   * @author nokutu
+   *
+   */
+  private class DeleteImageAction extends AbstractAction {
+
+    private static final long serialVersionUID = -982809854631863962L;
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      if (INSTANCE != null) {
+        MapillaryRecord.getInstance().addCommand(
+            new CommandDeleteImage(getData().getMultiSelectedImages()));
+      }
+    }
+  }
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandDeleteImage.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandDeleteImage.java	(revision 31487)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandDeleteImage.java	(revision 31487)
@@ -0,0 +1,59 @@
+package org.openstreetmap.josm.plugins.mapillary.commands;
+
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+
+/**
+ * @author nokutu
+ *
+ */
+public class CommandDeleteImage extends MapillaryExecutableCommand {
+
+  private HashMap<MapillaryAbstractImage, Integer> changesHash;
+
+  /**
+   * @param images
+   */
+  public CommandDeleteImage(List<MapillaryAbstractImage> images) {
+    super(images);
+    this.changesHash = new HashMap<>();
+  }
+
+  @Override
+  public void sum(MapillaryCommand command) {
+    // Ignored
+  }
+
+  @Override
+  public void execute() {
+    for (MapillaryAbstractImage img : this.images) {
+      this.changesHash.put(img, img.getSequence().getImages().indexOf(img));
+      MapillaryLayer.getInstance().getData().delete(img);
+    }
+  }
+
+  @Override
+  public String toString() {
+    return trn("Deleted {0} image", "Deleted {0} images", this.images.size(),
+        this.images.size());
+  }
+
+  @Override
+  public void undo() {
+    for (int i = this.images.size() - 1; i >= 0; i--) {
+      MapillaryAbstractImage img = this.images.get(i);
+      MapillaryLayer.getInstance().getData().add(img);
+      img.getSequence().getImages().add(this.changesHash.get(img), img);
+    }
+  }
+
+  @Override
+  public void redo() {
+    MapillaryLayer.getInstance().getData().delete(this.images);
+  }
+}
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandMoveImage.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandMoveImage.java	(revision 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandMoveImage.java	(revision 31487)
@@ -3,5 +3,4 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.util.ArrayList;
 import java.util.List;
 
@@ -31,5 +30,5 @@
   public CommandMoveImage(List<MapillaryAbstractImage> images, double x,
       double y) {
-    this.images = new ArrayList<MapillaryAbstractImage>(images);
+    super(images);
     this.x = x;
     this.y = y;
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandTurnImage.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandTurnImage.java	(revision 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandTurnImage.java	(revision 31487)
@@ -3,5 +3,4 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.util.ArrayList;
 import java.util.List;
 
@@ -27,5 +26,5 @@
    */
   public CommandTurnImage(List<MapillaryAbstractImage> images, double ca) {
-    this.images = new ArrayList<MapillaryAbstractImage>(images);
+    super(images);
     this.ca = ca;
   }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryCommand.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryCommand.java	(revision 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryCommand.java	(revision 31487)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.plugins.mapillary.commands;
 
+import java.util.ArrayList;
 import java.util.List;
 
@@ -13,4 +14,14 @@
 public abstract class MapillaryCommand {
   protected List<MapillaryAbstractImage> images;
+
+  /**
+   * Main constructor.
+   *
+   * @param images
+   *          The images that are affected by the command.
+   */
+  public MapillaryCommand(List<MapillaryAbstractImage> images) {
+    this.images = new ArrayList<MapillaryAbstractImage>(images);
+  }
 
   /**
@@ -28,5 +39,6 @@
    * they are summed in order to reduce them to just one command.
    *
-   * @param command The command to be summed to last command.
+   * @param command
+   *          The command to be summed to last command.
    */
   public abstract void sum(MapillaryCommand command);
@@ -39,3 +51,6 @@
       image.isModified = (image.tempLatLon == image.latLon || image.tempCa == image.ca);
   }
+
+  @Override
+  public abstract String toString();
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryExecutableCommand.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryExecutableCommand.java	(revision 31487)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryExecutableCommand.java	(revision 31487)
@@ -0,0 +1,28 @@
+package org.openstreetmap.josm.plugins.mapillary.commands;
+
+import java.util.List;
+
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+
+/**
+ * Superclass for those commands that must be executed after creation.
+ *
+ * @author nokutu
+ *
+ */
+public abstract class MapillaryExecutableCommand extends MapillaryCommand {
+
+  /**
+   * Main constructor.
+   *
+   * @param images
+   */
+  public MapillaryExecutableCommand(List<MapillaryAbstractImage> images) {
+    super(images);
+  }
+
+  /**
+   * Executes the command.
+   */
+  public abstract void execute();
+}
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryRecord.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryRecord.java	(revision 31486)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryRecord.java	(revision 31487)
@@ -69,4 +69,6 @@
    */
   public void addCommand(MapillaryCommand command) {
+    if (command instanceof MapillaryExecutableCommand)
+      ((MapillaryExecutableCommand) command).execute();
     // Checks if it is a continuation of last command
     if (this.position != -1) {
