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 31448)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31449)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.plugins.mapillary.mode.JoinMode;
 import org.openstreetmap.josm.plugins.mapillary.mode.SelectMode;
+import org.openstreetmap.josm.plugins.mapillary.utils.PluginState;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -604,5 +605,7 @@
   public void updateHelpText() {
     String ret = "";
-    if (this.data.size() > 0)
+    if (PluginState.isDownloading())
+      ret += tr("Downloading");
+    else if (this.data.size() > 0)
       ret += tr("Total images: {0}", this.data.size());
     else
@@ -610,4 +613,6 @@
     if (this.mode != null)
       ret += " -- " + tr(this.mode.toString());
+    if (PluginState.isUploading())
+      ret += " -- " + PluginState.getUploadString();
     Main.map.statusLine.setHelpText(ret);
   }
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 31448)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java	(revision 31449)
@@ -6,7 +6,4 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.io.UnsupportedEncodingException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
 
 import javax.swing.JDialog;
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31448)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31449)
@@ -1,5 +1,3 @@
 package org.openstreetmap.josm.plugins.mapillary.downloads;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.concurrent.ThreadPoolExecutor;
@@ -16,4 +14,5 @@
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryFilterDialog;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
+import org.openstreetmap.josm.plugins.mapillary.utils.PluginState;
 
 /**
@@ -73,14 +72,16 @@
   @Override
   public void run() {
-    Main.map.statusLine.setHelpText(tr("Downloading images from Mapillary"));
     try {
+      PluginState.startDownload();
+      MapillaryLayer.getInstance().updateHelpText();
       downloadSequences();
-      Main.map.statusLine.setHelpText(tr("Downloading image's information"));
       completeImages();
       MapillaryMainDialog.getInstance().updateTitle();
-      Main.map.statusLine.setHelpText(tr("Downloading traffic signs"));
       downloadSigns();
     } catch (InterruptedException e) {
       Main.error("Mapillary download interrupted (probably because of closing the layer).");
+    } finally {
+      PluginState.finishDownload();
+      MapillaryLayer.getInstance().updateHelpText();
     }
     this.layer.updateHelpText();
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/OAuthUtils.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/OAuthUtils.java	(revision 31448)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/OAuthUtils.java	(revision 31449)
@@ -49,5 +49,7 @@
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 import org.openstreetmap.josm.plugins.mapillary.MapillarySequence;
+import org.openstreetmap.josm.plugins.mapillary.utils.PluginState;
 
 /**
@@ -164,7 +166,10 @@
 
     HttpResponse response = httpClient.execute(httpPost);
-    if (response.getStatusLine().toString().contains("204"))
+    if (response.getStatusLine().toString().contains("204")) {
       System.out.println("Succesfully uploaded image");
+      PluginState.imageUploaded();
+    }
     file.delete();
+    MapillaryLayer.getInstance().updateHelpText();
   }
 
@@ -194,4 +199,7 @@
     @Override
     public void run() {
+      PluginState.startUpload();
+      PluginState.imagesToUpload(this.images.size());
+      MapillaryLayer.getInstance().updateHelpText();
       for (MapillaryAbstractImage img : this.images) {
         if (!(img instanceof MapillaryImportedImage))
@@ -201,4 +209,6 @@
             this.uuid));
       }
+      this.ex.shutdown();
+      PluginState.finishUpload();
     }
   }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/PluginState.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/PluginState.java	(revision 31449)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/PluginState.java	(revision 31449)
@@ -0,0 +1,92 @@
+package org.openstreetmap.josm.plugins.mapillary.utils;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * @author nokutu
+ *
+ */
+public class PluginState {
+
+  private static int runningDownloads = 0;
+  private static int runningUploads = 0;
+  private static int imagesToUpload = 0;
+  private static int imagesUploaded = 0;
+
+  /**
+   * Called when a download is started.
+   */
+  public static void startDownload() {
+    runningDownloads++;
+  }
+
+  /**
+   * Called when a download is finished.
+   */
+  public static void finishDownload() {
+    runningDownloads--;
+  }
+
+  /**
+   * Checks if there is any running download.
+   *
+   * @return true if the plugin is downloading; false otherwise.
+   */
+  public static boolean isDownloading() {
+    return runningDownloads > 0;
+  }
+
+  /**
+   * Called when an upload is starting.
+   */
+  public static void startUpload() {
+    runningUploads++;
+  }
+
+  /**
+   * Called when an upload is finished.
+   */
+  public static void finishUpload() {
+    runningUploads--;
+    if (imagesUploaded >= imagesToUpload) {
+      imagesUploaded = 0;
+      imagesToUpload = 0;
+    }
+  }
+
+  /**
+   * Checks if there is any running upload.
+   *
+   * @return true if the plugin is uploading; false otherwise.
+   */
+  public static boolean isUploading() {
+    return runningUploads > 0;
+  }
+
+  /**
+   * Sets the amount of images that are going to be uploaded.
+   *
+   * @param amount
+   *          The amount of images that are going to be uploaded.
+   */
+  public static void imagesToUpload(int amount) {
+    imagesToUpload += amount;
+  }
+
+  /**
+   * Called when an image is uploaded.
+   */
+  public static void imageUploaded() {
+    imagesUploaded++;
+  }
+
+  /**
+   * Returns the string to be written in the status bar.
+   *
+   * @return The String that is going to be written in the status bar.
+   */
+  public static String getUploadString() {
+    return tr("Downloading: {0}", "(" + imagesUploaded + "/" + imagesToUpload
+        + ")");
+  }
+}
