Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31491)
@@ -5,4 +5,5 @@
 import javax.swing.ImageIcon;
 import javax.swing.JMenuItem;
+import javax.swing.SwingUtilities;
 
 import org.apache.commons.jcs.access.CacheAccess;
@@ -118,8 +119,7 @@
       IMPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, importAction, false,
           14);
-      UPLOAD_MENU = MainMenu.add(Main.main.menu.fileMenu, uploadAction,
-          false, 14);
-      ZOOM_MENU = MainMenu.add(Main.main.menu.viewMenu, zoomAction, false,
-          15);
+      UPLOAD_MENU = MainMenu.add(Main.main.menu.fileMenu, uploadAction, false,
+          14);
+      ZOOM_MENU = MainMenu.add(Main.main.menu.viewMenu, zoomAction, false, 15);
       DOWNLOAD_VIEW_MENU = MainMenu.add(Main.main.menu.fileMenu,
           this.downloadViewAction, false, 14);
@@ -182,7 +182,16 @@
    *          true to enable the JMenuItem; false to disable it.
    */
-  public static void setMenuEnabled(JMenuItem menu, boolean value) {
-    menu.setEnabled(value);
-    menu.getAction().setEnabled(value);
+  public static void setMenuEnabled(final JMenuItem menu, final boolean value) {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          setMenuEnabled(menu, value);
+        }
+      });
+    } else {
+      menu.setEnabled(value);
+      menu.getAction().setEnabled(value);
+    }
   }
 
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java	(revision 31491)
@@ -53,5 +53,5 @@
       if (dialog.sequence.isSelected()) {
         UploadUtils.uploadSequence(MapillaryLayer.getInstance().getData()
-            .getSelectedImage().getSequence());
+            .getSelectedImage().getSequence(), dialog.delete.isSelected());
       }
     }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryUploadDialog.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryUploadDialog.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryUploadDialog.java	(revision 31491)
@@ -1,8 +1,11 @@
 package org.openstreetmap.josm.plugins.mapillary.gui;
 
+import javax.swing.BoxLayout;
 import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
@@ -20,4 +23,6 @@
   /** Upload the whole sequence. */
   public JRadioButton sequence;
+  /** Whether the images must be deleted after upload or not */
+  public JCheckBox delete;
 
   /**
@@ -25,4 +30,6 @@
    */
   public MapillaryUploadDialog() {
+    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
+
     this.group = new ButtonGroup();
 
@@ -33,6 +40,10 @@
     this.group.add(this.sequence);
     add(this.sequence);
+    this.group.setSelected(this.sequence.getModel(), true);
 
-    this.group.setSelected(this.sequence.getModel(), true);
+    this.delete = new JCheckBox("Delete after uplaod");
+    this.delete.setSelected(Main.pref.getBoolean(
+        "mapillary.delete-after-upload", true));
+    add(this.delete);
 
   }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/MapillaryRecord.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/MapillaryRecord.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/MapillaryRecord.java	(revision 31491)
@@ -2,4 +2,6 @@
 
 import java.util.ArrayList;
+
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
@@ -70,31 +72,40 @@
    *          The command to be added.
    */
-  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) {
-      boolean equalSets = true;
-      for (MapillaryAbstractImage img : this.commandList.get(this.position).images)
-        if (!command.images.contains(img))
-          equalSets = false;
-      for (MapillaryAbstractImage img : command.images)
-        if (!this.commandList.get(this.position).images.contains(img))
-          equalSets = false;
-      if (equalSets
-          && this.commandList.get(this.position).getClass() == command
-              .getClass()) {
-        this.commandList.get(this.position).sum(command);
-        fireRecordChanged();
-        return;
+  public void addCommand(final MapillaryCommand command) {
+    if (!SwingUtilities.isEventDispatchThread()) {
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          addCommand(command);
+        }
+      });
+    } else {
+      if (command instanceof MapillaryExecutableCommand)
+        ((MapillaryExecutableCommand) command).execute();
+      // Checks if it is a continuation of last command
+      if (this.position != -1) {
+        boolean equalSets = true;
+        for (MapillaryAbstractImage img : this.commandList.get(this.position).images)
+          if (!command.images.contains(img))
+            equalSets = false;
+        for (MapillaryAbstractImage img : command.images)
+          if (!this.commandList.get(this.position).images.contains(img))
+            equalSets = false;
+        if (equalSets
+            && this.commandList.get(this.position).getClass() == command
+                .getClass()) {
+          this.commandList.get(this.position).sum(command);
+          fireRecordChanged();
+          return;
+        }
       }
+      // Adds the command to the last position of the list.
+      this.commandList.add(this.position + 1, command);
+      this.position++;
+      while (this.commandList.size() > this.position + 1) {
+        this.commandList.remove(this.position + 1);
+      }
+      fireRecordChanged();
     }
-    // Adds the command to the last position of the list.
-    this.commandList.add(this.position + 1, command);
-    this.position++;
-    while (this.commandList.size() > this.position + 1) {
-      this.commandList.remove(this.position + 1);
-    }
-    fireRecordChanged();
   }
 
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/commands/CommandImport.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/commands/CommandImport.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/history/commands/CommandImport.java	(revision 31491)
@@ -29,5 +29,5 @@
   @Override
   public void execute() {
-    this.redo();
+    MapillaryLayer.getInstance().getData().add(this.images);
   }
 
@@ -42,5 +42,5 @@
   @Override
   public void redo() {
-    MapillaryLayer.getInstance().getData().add(this.images);
+    this.execute();
   }
 
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java	(revision 31490)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java	(revision 31491)
@@ -41,4 +41,6 @@
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillarySequence;
+import org.openstreetmap.josm.plugins.mapillary.history.MapillaryRecord;
+import org.openstreetmap.josm.plugins.mapillary.history.commands.CommandDelete;
 import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryUtils;
 import org.openstreetmap.josm.plugins.mapillary.utils.PluginState;
@@ -141,7 +143,9 @@
    *          The sequence to upload. It must contain only
    *          {@link MapillaryImportedImage} objects.
-   */
-  public static void uploadSequence(MapillarySequence sequence) {
-    Main.worker.submit(new SequenceUploadThread(sequence.getImages()));
+   * @param delete
+   *          Whether the images must be deleted after upload or not.
+   */
+  public static void uploadSequence(MapillarySequence sequence, boolean delete) {
+    Main.worker.submit(new SequenceUploadThread(sequence.getImages(), delete));
   }
 
@@ -149,11 +153,14 @@
     private List<MapillaryAbstractImage> images;
     private UUID uuid;
+    private boolean delete;
     ThreadPoolExecutor ex;
 
-    private SequenceUploadThread(List<MapillaryAbstractImage> images) {
+    private SequenceUploadThread(List<MapillaryAbstractImage> images,
+        boolean delete) {
       this.images = images;
       this.uuid = UUID.randomUUID();
       this.ex = new ThreadPoolExecutor(8, 8, 25, TimeUnit.SECONDS,
           new ArrayBlockingQueue<Runnable>(15));
+      this.delete = delete;
     }
 
@@ -176,4 +183,12 @@
       }
       this.ex.shutdown();
+      try {
+        this.ex.awaitTermination(15, TimeUnit.SECONDS);
+      } catch (InterruptedException e) {
+        Main.error(e);
+      }
+      System.out.println(this.images.size());
+      if (this.delete)
+        MapillaryRecord.getInstance().addCommand(new CommandDelete(this.images));
     }
   }
