diff --git a/ChangeLog b/ChangeLog
index 3bc896e28998223d78c108c390172b02ad98ad05..6104ba5bb6b81796b37ab4005952c345e9cd7d8d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-05-18 jeromeg
+
+	* Improve the status dialog of the upload to ZimageZ.
+	* Remember the last ZimageZ user name and put it in the user field
+	  when displaying the dialog for the first time.
+
 2009-05-18 jeromeg
 
 	* lib/screenshooter-dialogs.c:
diff --git a/lib/screenshooter-actions.c b/lib/screenshooter-actions.c
index d3d3378a84413ffacb5daec92e5557db26f02ab8..4f4bf5666151c6e25f8e2078edb4cb83df772bf8 100644
--- a/lib/screenshooter-actions.c
+++ b/lib/screenshooter-actions.c
@@ -117,7 +117,7 @@ gboolean screenshooter_take_and_output_screenshot (ScreenshotData *sd)
             }
           else
             {
-              screenshooter_upload_to_zimagez (screenshot_path);
+              screenshooter_upload_to_zimagez (screenshot_path, sd->last_user);
             }
         }
 
diff --git a/lib/screenshooter-dialogs.c b/lib/screenshooter-dialogs.c
index 8e88f7cf56bf91811cbf7bb9f047fd4de4530117..bc42cbf6168ff8e836b3e771bbef6b890dad8632 100644
--- a/lib/screenshooter-dialogs.c
+++ b/lib/screenshooter-dialogs.c
@@ -773,7 +773,6 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData  *sd, gboolean plugin)
   gtk_table_attach_defaults (GTK_TABLE (capture_table), area_main_box, 0, 1, 0, 2);
 
   /* Create area label */
-
   area_label = gtk_label_new ("");
 
   gtk_label_set_markup (GTK_LABEL (area_label),
diff --git a/lib/screenshooter-global.h b/lib/screenshooter-global.h
index 4df10596464b842a6c7191cfa03129da8c722d22..0fd793c1b65bb2b84a0e6194df11a3499a894865 100644
--- a/lib/screenshooter-global.h
+++ b/lib/screenshooter-global.h
@@ -48,6 +48,7 @@ typedef struct
   gint close;
   gchar *screenshot_dir;
   gchar *app;
+  gchar *last_user;
   gboolean cli;
 }
 ScreenshotData;
diff --git a/lib/screenshooter-utils.c b/lib/screenshooter-utils.c
index 2ba37ffd72c6bada04f3d3673f869d6e46457844..6a2dd0e61dd3a599794821879f23ff74c3af2a69 100644
--- a/lib/screenshooter-utils.c
+++ b/lib/screenshooter-utils.c
@@ -65,6 +65,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
   gint close_app = 1;
   gchar *screenshot_dir = g_strdup (home_uri);
   gchar *app = g_strdup ("none");
+  gchar *last_user = g_strdup ("");
 
   if (G_LIKELY (file != NULL))
     {
@@ -86,6 +87,9 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
           g_free (app);
           app = g_strdup (xfce_rc_read_entry (rc, "app", "none"));
 
+          g_free (last_user);
+          last_user = g_strdup (xfce_rc_read_entry (rc, "last_user", ""));
+
           g_free (screenshot_dir);
           screenshot_dir =
             g_strdup (xfce_rc_read_entry (rc, "screenshot_dir", home_uri));
@@ -107,6 +111,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
   sd->close = close_app;
   sd->screenshot_dir = screenshot_dir;
   sd->app = app;
+  sd->last_user = last_user;
 }
 
 
@@ -138,6 +143,7 @@ screenshooter_write_rc_file (const gchar *file, ScreenshotData *sd)
   xfce_rc_write_int_entry (rc, "close", sd->close);
   xfce_rc_write_entry (rc, "screenshot_dir", sd->screenshot_dir);
   xfce_rc_write_entry (rc, "app", sd->app);
+  xfce_rc_write_entry (rc, "last_user", sd->last_user);
 
   TRACE ("Flush and close the rc file");
 
diff --git a/lib/screenshooter-zimagez.c b/lib/screenshooter-zimagez.c
index 0cff51f94e0431b6d1aa3e0d76ab8b5020f3dbef..d578653091bb96068c2dcc381d136abd585665f1 100644
--- a/lib/screenshooter-zimagez.c
+++ b/lib/screenshooter-zimagez.c
@@ -49,7 +49,8 @@ static void              open_url_hook             (GtkLinkButton     *button,
                                                     const gchar       *link,
                                                     gpointer           user_data);
 static void              open_zimagez_link         (gpointer           unused);
-static ScreenshooterJob *zimagez_upload_to_zimagez (const gchar       *file_name);
+static ScreenshooterJob *zimagez_upload_to_zimagez (const gchar       *file_name,
+                                                    gchar             *last_user);
 static gboolean          zimagez_upload_job        (ScreenshooterJob  *job,
                                                     GValueArray       *param_values,
                                                     GError           **error);
@@ -112,7 +113,8 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
   gchar *online_file_name = NULL;
   gchar *password = g_strdup ("");
   gchar *title = g_strdup ("");
-  gchar *user = g_strdup ("");
+  gchar *user;
+  gchar **last_user;
 
   gsize data_length;
 
@@ -130,13 +132,18 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
 
   g_return_val_if_fail (SCREENSHOOTER_IS_JOB (job), FALSE);
   g_return_val_if_fail (param_values != NULL, FALSE);
-  g_return_val_if_fail (param_values->n_values == 1, FALSE);
+  g_return_val_if_fail (param_values->n_values == 2, FALSE);
   g_return_val_if_fail (G_VALUE_HOLDS_STRING (&param_values->values[0]), FALSE);
+  g_return_val_if_fail (G_VALUE_HOLDS_POINTER (&param_values->values[1]), FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   if (exo_job_set_error_if_cancelled (EXO_JOB (job), error))
     return FALSE;
 
+  /* Get the last user */
+  last_user = g_value_get_pointer (g_value_array_get_nth (param_values, 1));
+  user = g_strdup (*last_user);
+
   /* Get the path of the image that is to be uploaded */
   image_path = g_value_get_string (g_value_array_get_nth (param_values, 0));
 
@@ -456,6 +463,9 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
 
   xmlrpc_DECREF (resultP);
 
+  g_free (*last_user);
+  *last_user = g_strdup (user);
+
   g_free (user);
   g_free (password);
   g_free (encoded_password);
@@ -580,12 +590,13 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
 
 
 static ScreenshooterJob
-*zimagez_upload_to_zimagez (const gchar *file_path)
+*zimagez_upload_to_zimagez (const gchar *file_path, gchar *last_user)
 {
   g_return_val_if_fail (file_path != NULL, NULL);
 
-  return screenshooter_simple_job_launch (zimagez_upload_job, 1,
-                                          G_TYPE_STRING, file_path);
+  return screenshooter_simple_job_launch (zimagez_upload_job, 2,
+                                          G_TYPE_STRING, file_path,
+                                          G_TYPE_POINTER, &last_user);
 }
 
 
@@ -977,6 +988,7 @@ static void cb_update_info (ExoJob *job, gchar *message, GtkWidget *label)
  * screenshooter_upload_to_zimagez:
  * @image_path: the local path of the image that should be uploaded to
  * ZimageZ.com.
+ * @last_user: the last user name used, to pre-fill the user field.
  *
  * Uploads the image whose path is @image_path: a dialog asks for the user
  * login, password, a title for the image and a comment; then the image is
@@ -985,11 +997,12 @@ static void cb_update_info (ExoJob *job, gchar *message, GtkWidget *label)
  *
  **/
 
-void screenshooter_upload_to_zimagez (const gchar *image_path)
+void screenshooter_upload_to_zimagez (const gchar *image_path, gchar *last_user)
 {
   ScreenshooterJob *job;
-  GtkWidget *dialog = NULL;
-  GtkWidget *label;
+  GtkWidget *dialog;
+  GtkWidget *label, *status_label;
+  GtkWidget *main_box, *main_alignment;
 
   g_return_if_fail (image_path != NULL);
 
@@ -1000,16 +1013,39 @@ void screenshooter_upload_to_zimagez (const gchar *image_path)
                                  NULL);
 
   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
-  gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 20);
   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG(dialog)->vbox), 12);
   gtk_window_set_deletable (GTK_WINDOW (dialog), FALSE);
   gtk_window_set_icon_name (GTK_WINDOW (dialog), "gtk-info");
 
+  /* Create the main alignment for the dialog */
+  main_alignment = gtk_alignment_new (0, 0, 1, 1);
+
+  gtk_alignment_set_padding (GTK_ALIGNMENT (main_alignment), 6, 0, 6, 6);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), main_alignment, TRUE, TRUE, 0);
+
+  /* Create the main box for the dialog */
+  main_box = gtk_vbox_new (FALSE, 10);
+
+  gtk_container_set_border_width (GTK_CONTAINER (main_box), 12);
+  gtk_container_add (GTK_CONTAINER (main_alignment), main_box);
+
+  /* Status label*/
+  status_label = gtk_label_new ("");
+
+  gtk_label_set_markup (GTK_LABEL (status_label),
+                        _("<span weight=\"bold\" stretch=\"semiexpanded\">"
+                          "Status</span>"));
+
+  gtk_misc_set_alignment (GTK_MISC (status_label), 0, 0);
+  gtk_container_add (GTK_CONTAINER (main_box), status_label);
+
+  /* Information label */
   label = gtk_label_new ("");
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label);
-  gtk_widget_show (label);
+  gtk_container_add (GTK_CONTAINER (main_box), label);
+
+  gtk_widget_show_all (GTK_DIALOG(dialog)->vbox);
 
-  job = zimagez_upload_to_zimagez (image_path);
+  job = zimagez_upload_to_zimagez (image_path, last_user);
 
   g_signal_connect (job, "ask", (GCallback) cb_ask_for_information, NULL);
   g_signal_connect (job, "image-uploaded", (GCallback) cb_image_uploaded, NULL);
diff --git a/lib/screenshooter-zimagez.h b/lib/screenshooter-zimagez.h
index f3ab8eece63bd7cc8bed3d3c12b0a1fa4052001c..9df035c43b4e2336863ab8405b93499cb28af459 100644
--- a/lib/screenshooter-zimagez.h
+++ b/lib/screenshooter-zimagez.h
@@ -35,7 +35,8 @@
 #include "sexy-url-label.h"
 
 
-void screenshooter_upload_to_zimagez (const gchar *image_path);
+void screenshooter_upload_to_zimagez (const gchar *image_path,
+                                      gchar       *last_user);
 
 
 #endif