* Fixes NB#86773, wait until the message is added to the queue to end the mail opera...
[modest] / src / modest-ui-actions.c
index ab114bd..82a7845 100644 (file)
@@ -82,6 +82,8 @@
 
 #include <gtkhtml/gtkhtml.h>
 
+#define MIN_FREE_SPACE 5 * 1024 * 1024
+
 typedef struct _GetMsgAsyncHelper {    
        ModestWindow *window;
        ModestMailOperation *mail_op;
@@ -102,6 +104,7 @@ typedef struct _ReplyForwardHelper {
        ReplyForwardAction action;
        gchar *account_name;
        GtkWidget *parent_window;
+       TnyHeader *header;
 } ReplyForwardHelper;
 
 typedef struct _MoveToHelper {
@@ -214,10 +217,17 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
                win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
                                                         TRUE);  /* create if not existent */
        
-       /* make sure the mainwindow is visible */
        gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
-       gtk_widget_show_all (GTK_WIDGET(win));
-       gtk_window_present (GTK_WINDOW(win));
+
+       /* make sure the mainwindow is visible. We need to present the
+          wizard again to give it the focus back. show_all are needed
+          in order to get the widgets properly drawn (MainWindow main
+          paned won't be in its right position and the dialog will be
+          missplaced */
+       gtk_widget_show_all (GTK_WIDGET (win));
+       gtk_widget_show_all (GTK_WIDGET (wizard));
+       gtk_window_present (GTK_WINDOW (win));
+       gtk_window_present (GTK_WINDOW (wizard));
        
        dialog_response = gtk_dialog_run (GTK_DIALOG (wizard));
        gtk_widget_destroy (GTK_WIDGET (wizard));
@@ -511,7 +521,6 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
 
                        /* Select next or previous row */
                        if (gtk_tree_row_reference_valid (next_row_reference)) {
-/*                             next_path = gtk_tree_row_reference_get_path (row_reference); */
                                gtk_tree_selection_select_path (sel, next_path);
                        }
                        else if (gtk_tree_row_reference_valid (prev_row_reference)) {                           
@@ -526,12 +535,14 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                        if (prev_row_reference != NULL) 
                                gtk_tree_row_reference_free (prev_row_reference);
                        if (prev_path != NULL) 
-                               gtk_tree_path_free (prev_path);                         
+                               gtk_tree_path_free (prev_path);
                }
                
                /* Update toolbar dimming state */
-               if (main_window)
+               if (main_window) {
+                       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
                        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+               }
 
                /* Free */
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
@@ -648,7 +659,6 @@ modest_ui_actions_on_accounts (GtkAction *action,
        } else {
                /* Show the list of accounts */
                GtkWindow *account_win = GTK_WINDOW (modest_account_view_window_new ());
-               gtk_window_set_transient_for (account_win, GTK_WINDOW (win));
                
                /* The accounts dialog must be modal */
                modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), account_win);
@@ -656,18 +666,6 @@ modest_ui_actions_on_accounts (GtkAction *action,
        }
 }
 
-#ifdef MODEST_PLATFORM_MAEMO
-static void
-on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
-{
-       /* Save any changes. */
-       modest_connection_specific_smtp_window_save_server_accounts (
-                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window));
-       gtk_widget_destroy (GTK_WIDGET (window));
-}
-#endif
-
-
 void
 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
 {
@@ -683,14 +681,10 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
                MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window), 
                modest_runtime_get_account_mgr());
 
-       /* Show the window: */  
-       gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
-       gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
+       /* Show the window: */
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
+                                    GTK_WINDOW (specific_window));
        gtk_widget_show (specific_window);
-    
-       /* Save changes when the window is hidden: */
-       g_signal_connect (specific_window, "hide", 
-               G_CALLBACK (on_smtp_servers_window_hide), win);
 #endif /* MODEST_PLATFORM_MAEMO */
 }
 
@@ -718,7 +712,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        /* we check for low-mem; in that case, show a warning, and don't allow
         * composing a message with attachments
         */
-       if (attachments && modest_platform_check_memory_low (win))
+       if (attachments && modest_platform_check_memory_low (win, TRUE))
                goto cleanup;
 
        account_name = modest_account_mgr_get_default_account(mgr);
@@ -749,7 +743,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                body = use_signature ? g_strconcat("\n", signature, NULL) : g_strdup("");
        }
 
-       msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL);
+       msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL, NULL, NULL);
        if (!msg) {
                g_printerr ("modest: failed to create new msg\n");
                goto cleanup;
@@ -767,7 +761,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                                attachments->data, allowed_size);
 
                if (total_size > allowed_size) {
-                       g_warning ("%s: total size: %u", 
+                       g_warning ("%s: total size: %u",
                                   __FUNCTION__, (unsigned int)total_size);
                        break;
                }
@@ -789,8 +783,6 @@ cleanup:
                g_object_unref (G_OBJECT(account));
        if (folder)
                g_object_unref (G_OBJECT(folder));
-       if (msg_win)
-               g_object_unref (G_OBJECT(msg_win));
        if (msg)
                g_object_unref (G_OBJECT(msg));
 }
@@ -817,6 +809,18 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
        /* If there is no message or the operation was not successful */
        status = modest_mail_operation_get_status (mail_op);
        if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+               const GError *error;
+
+               /* If it's a memory low issue, then show a banner */
+               error = modest_mail_operation_get_error (mail_op);
+               if (error && error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                   error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+                       GObject *source = modest_mail_operation_get_source (mail_op);
+                       modest_platform_run_information_dialog (GTK_IS_WINDOW (source) ? GTK_WINDOW (source) : NULL,
+                                                               dgettext("ke-recv","memr_ib_operation_disabled"),
+                                                               TRUE);
+                       g_object_unref (source);
+               }
 
                /* Remove the header from the preregistered uids */
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),  
@@ -849,7 +853,8 @@ open_msg_banner_idle (gpointer userdata)
        gdk_threads_enter ();
        banner_info->idle_handler = 0;
        banner_info->banner = modest_platform_animation_banner (NULL, NULL, banner_info->message);
-       g_object_ref (banner_info->banner);
+       if (banner_info)
+               g_object_ref (banner_info->banner);
        
        gdk_threads_leave ();
 
@@ -904,14 +909,16 @@ open_msg_cb (ModestMailOperation *mail_op,
                        char *msg_id;
                        account = g_strdup(modest_tny_account_get_parent_modest_account_name_for_server_account(
                                                   TNY_ACCOUNT(traccount)));
-                       send_queue = modest_runtime_get_send_queue(traccount);
-                       msg_id = modest_tny_send_queue_get_msg_id (header);
-                       status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
-                       /* Only open messages in outbox with the editor if they are in Failed state */
-                       if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
-                               open_in_editor = TRUE;
+                       send_queue = modest_runtime_get_send_queue(traccount, TRUE);
+                       if (TNY_IS_SEND_QUEUE (send_queue)) {
+                               msg_id = modest_tny_send_queue_get_msg_id (header);
+                               status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
+                               /* Only open messages in outbox with the editor if they are in Failed state */
+                               if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
+                                       open_in_editor = TRUE;
+                               }
+                               g_free(msg_id);
                        }
-                       g_free(msg_id);
                        g_object_unref(traccount);
                } else {
                        g_warning("Cannot get transport account for message in outbox!!");
@@ -928,43 +935,28 @@ open_msg_cb (ModestMailOperation *mail_op,
        
        if (open_in_editor) {
                ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-               gchar *from_header = NULL;
+               gchar *from_header = NULL, *acc_name;
 
                from_header = tny_header_dup_from (header);
 
                /* we cannot edit without a valid account... */
                if (!modest_account_mgr_has_accounts(mgr, TRUE)) {
                        if (!modest_ui_actions_run_account_setup_wizard(parent_win)) {
-                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), 
+                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
                                                                     header);
                                g_free (from_header);
                                goto cleanup;
                        }
                }
-               
-               if (from_header) {
-                       GSList *accounts = modest_account_mgr_account_names (mgr, TRUE);
-                       GSList *node = NULL;
-                       for (node = accounts; node != NULL; node = g_slist_next (node)) {
-                               gchar *from = modest_account_mgr_get_from_string (mgr, node->data);
-                               
-                               if (from && (strcmp (from_header, from) == 0)) {
-                                       g_free (account);
-                                       account = g_strdup (node->data);
-                                       g_free (from);
-                                       break;
-                               }
-                               g_free (from);
-                       }
-                       g_free (from_header);
-                       g_slist_foreach (accounts, (GFunc) g_free, NULL);
-                       g_slist_free (accounts);
+
+               acc_name = modest_utils_get_account_name_from_recipient (from_header);
+               g_free (from_header);
+               if (acc_name) {
+                       g_free (account);
+                       account = acc_name;
                }
 
                win = modest_msg_edit_window_new (msg, account, TRUE);
-
-
-
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                
@@ -985,7 +977,6 @@ open_msg_cb (ModestMailOperation *mail_op,
        if (win != NULL) {
                mgr = modest_runtime_get_window_mgr ();
                modest_window_mgr_register_window (mgr, win);
-               g_object_unref (win);
                gtk_widget_show_all (GTK_WIDGET(win));
        }
 
@@ -1004,15 +995,56 @@ cleanup:
 static gboolean
 is_memory_full_error (GError *error)
 {
-       if (error->code == TNY_SYSTEM_ERROR_MEMORY ||
-           error->code == TNY_IO_ERROR_WRITE ||
-           error->code == TNY_IO_ERROR_READ) {
+       gboolean enough_free_space = TRUE;
+       GnomeVFSURI *cache_dir_uri;
+       const gchar *cache_dir;
+       GnomeVFSFileSize free_space;
+
+       cache_dir = tny_account_store_get_cache_dir (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
+       cache_dir_uri = gnome_vfs_uri_new (cache_dir);
+       if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) {
+               if (free_space < MIN_FREE_SPACE)
+                       enough_free_space = FALSE;
+       }
+       gnome_vfs_uri_unref (cache_dir_uri);
+
+       if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
+            /* When asking for a mail and no space left on device
+               tinymail returns this error */
+            error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE ||
+            /* When the folder summary could not be read or
+               written */
+            error->code == TNY_IO_ERROR_WRITE ||
+            error->code == TNY_IO_ERROR_READ) && 
+           !enough_free_space) {
                return TRUE;
        } else {
                return FALSE;
        }
 }
 
+static gboolean
+check_memory_full_error (GtkWidget *parent_window, GError *err)
+{
+       if (err == NULL)
+               return FALSE;
+
+       if (is_memory_full_error (err))
+               modest_platform_information_banner (parent_window,
+                                                   NULL, dgettext("ke-recv",
+                                                                  "cerm_device_memory_full"));
+       else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
+               /* If the account was created in memory full
+                  conditions then tinymail won't be able to
+                  connect so it'll return this error code */                           
+               modest_platform_information_banner (parent_window,
+                                                   NULL, _("emev_ui_imap_inbox_select_error"));
+       else
+               return FALSE;
+
+       return TRUE;
+}
+
 void
 modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                                                 gpointer user_data)
@@ -1032,6 +1064,13 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, dgettext("ke-recv",
                                                                           "cerm_device_memory_full"));
+               } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
+                       modest_platform_information_banner ((GtkWidget *) win,
+                                                           NULL, _("emev_ui_imap_inbox_select_error"));
+               } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                          error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
+                       modest_platform_information_banner ((GtkWidget *) win,
+                                                           NULL, dgettext ("hildon-common-strings", "sfil_ni_unable_to_open_file_not_found"));
                } else if (user_data) {
                        modest_platform_information_banner ((GtkWidget *) win, 
                                                            NULL, user_data);
@@ -1146,11 +1185,8 @@ open_msgs_performer(gboolean canceled,
                open_msgs_helper_destroyer (helper);
 
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                goto clean;
        }
 
@@ -1355,7 +1391,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
                        }
                }
        }
-       
+
        /* Register the headers before actually creating the windows: */
        iter_not_opened = tny_list_create_iterator (not_opened_headers);
        while (!tny_iterator_is_done (iter_not_opened)) {
@@ -1403,7 +1439,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * opening
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
        /* Get headers */
@@ -1417,6 +1453,26 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
        g_object_unref(headers);
 }
 
+static ReplyForwardHelper*
+create_reply_forward_helper (ReplyForwardAction action, 
+                            ModestWindow *win,
+                            guint reply_forward_type,
+                            TnyHeader *header)
+{
+       ReplyForwardHelper *rf_helper = NULL;
+       const gchar *active_acc = modest_window_get_active_account (win);
+
+       rf_helper = g_slice_new0 (ReplyForwardHelper);
+       rf_helper->reply_forward_type = reply_forward_type;
+       rf_helper->action = action;
+       rf_helper->parent_window = (MODEST_IS_WINDOW (win)) ? GTK_WIDGET (win) : NULL;
+       rf_helper->header = (header) ? g_object_ref (header) : NULL;
+       rf_helper->account_name = (active_acc) ? 
+               g_strdup (active_acc) :
+               modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
+
+       return rf_helper;
+}
 
 static void
 free_reply_forward_helper (gpointer data)
@@ -1425,6 +1481,8 @@ free_reply_forward_helper (gpointer data)
 
        helper = (ReplyForwardHelper *) data;
        g_free (helper->account_name);
+       if (helper->header)
+               g_object_unref (helper->header);
        g_slice_free (ReplyForwardHelper, helper);
 }
 
@@ -1436,7 +1494,7 @@ reply_forward_cb (ModestMailOperation *mail_op,
                  GError *err,
                  gpointer user_data)
 {
-       TnyMsg *new_msg;
+       TnyMsg *new_msg = NULL;
        ReplyForwardHelper *rf_helper;
        ModestWindow *msg_win = NULL;
        ModestEditType edit_type;
@@ -1449,11 +1507,9 @@ reply_forward_cb (ModestMailOperation *mail_op,
        /* If there was any error. The mail operation could be NULL,
           this means that we already have the message downloaded and
           that we didn't do a mail operation to retrieve it */
-       if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
-               return;
-                       
-       g_return_if_fail (user_data != NULL);
        rf_helper = (ReplyForwardHelper *) user_data;
+       if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+               goto cleanup;
 
        from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
                                                   rf_helper->account_name);
@@ -1489,10 +1545,11 @@ reply_forward_cb (ModestMailOperation *mail_op,
                return;
        }
 
+       g_free (from);
        g_free (signature);
 
        if (!new_msg) {
-               g_printerr ("modest: failed to create message\n");
+               g_warning ("%s: failed to create message\n", __FUNCTION__);
                goto cleanup;
        }
 
@@ -1500,7 +1557,7 @@ reply_forward_cb (ModestMailOperation *mail_op,
                                                                       rf_helper->account_name,
                                                                       TNY_ACCOUNT_TYPE_STORE);
        if (!account) {
-               g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
+               g_warning ("%s: failed to get tnyaccount for '%s'\n", __FUNCTION__, rf_helper->account_name);
                goto cleanup;
        }
 
@@ -1520,13 +1577,10 @@ reply_forward_cb (ModestMailOperation *mail_op,
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
-       if (msg_win)
-               g_object_unref (msg_win);
        if (new_msg)
                g_object_unref (G_OBJECT (new_msg));
        if (account)
                g_object_unref (G_OBJECT (account));
-/*     g_object_unref (msg); */
        free_reply_forward_helper (rf_helper);
 }
 
@@ -1583,25 +1637,48 @@ connect_to_get_msg (ModestWindow *win,
        return modest_platform_connect_and_wait((GtkWindow *) win, account);
 }
 
+static void
+reply_forward_performer (gboolean canceled, 
+                        GError *err,
+                        GtkWindow *parent_window, 
+                        TnyAccount *account, 
+                        gpointer user_data)
+{
+       ReplyForwardHelper *rf_helper = NULL;
+       ModestMailOperation *mail_op;
+
+       rf_helper = (ReplyForwardHelper *) user_data;
+
+       if (canceled || err) {
+               free_reply_forward_helper (rf_helper);
+               return;
+       }
+
+       /* Retrieve the message */
+       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (parent_window),
+                                                                modest_ui_actions_disk_operations_error_handler,
+                                                                NULL, NULL);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
+       modest_mail_operation_get_msg (mail_op, rf_helper->header, TRUE, reply_forward_cb, rf_helper);
+
+       /* Frees */
+       g_object_unref(mail_op);
+}
+
 /*
  * Common code for the reply and forward actions
  */
 static void
 reply_forward (ReplyForwardAction action, ModestWindow *win)
 {
-       ModestMailOperation *mail_op = NULL;
-       TnyList *header_list = NULL;
        ReplyForwardHelper *rf_helper = NULL;
        guint reply_forward_type;
-       gboolean continue_download = TRUE;
-       gboolean do_retrieve = TRUE;
        
        g_return_if_fail (MODEST_IS_WINDOW(win));
-
                        
        /* we check for low-mem; in that case, show a warning, and don't allow
         * reply/forward (because it could potentially require a lot of memory */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
 
@@ -1611,113 +1688,118 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                        return;
        }
        
-       header_list = get_selected_headers (win);
-       if (!header_list)
-               return;
-
-       reply_forward_type = 
+       reply_forward_type =
                modest_conf_get_int (modest_runtime_get_conf (),
-                                    (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
+                                    (action == ACTION_FORWARD) ? 
+                                    MODEST_CONF_FORWARD_TYPE :
+                                    MODEST_CONF_REPLY_TYPE,
                                     NULL);
 
-       /* check if we need to download msg before asking about it */
-       do_retrieve = (action == ACTION_FORWARD) ||
-                       (reply_forward_type != MODEST_TNY_MSG_REPLY_TYPE_CITE);
-
-       if (do_retrieve){
-               gint num_of_unc_msgs;
-
-               /* check that the messages have been previously downloaded */
-               num_of_unc_msgs = header_list_count_uncached_msgs(header_list);
-               /* If there are any uncached message ask the user
-                * whether he/she wants to download them. */
-               if (num_of_unc_msgs) {
-                       TnyAccount *account = get_account_from_header_list (header_list);
-                       if (account) {
-                               continue_download = connect_to_get_msg (win, num_of_unc_msgs, account);
-                               g_object_unref (account);
-                       }
-               }
-       }
-
-       if (!continue_download) {
-               g_object_unref (header_list);
-               return;
-       }
-       
-       /* We assume that we can only select messages of the
-          same folder and that we reply all of them from the
-          same account. In fact the interface currently only
-          allows single selection */
-       
-       /* Fill helpers */
-       rf_helper = g_slice_new0 (ReplyForwardHelper);
-       rf_helper->reply_forward_type = reply_forward_type;
-       rf_helper->action = action;
-       rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
-       
-       if ((win != NULL) && (MODEST_IS_WINDOW (win)))
-               rf_helper->parent_window = GTK_WIDGET (win);
-       if (!rf_helper->account_name)
-               rf_helper->account_name =
-                       modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
-
-       if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
-               TnyMsg *msg;
-               TnyHeader *header;
+       if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+               TnyMsg *msg = NULL;
+               TnyHeader *header = NULL;
                /* Get header and message. Do not free them here, the
                   reply_forward_cb must do it */
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
-               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
-               if (!msg || !header) {
-                       if (msg)
-                               g_object_unref (msg);
-                       g_printerr ("modest: no message found\n");
-                       return;
-               } else {
+               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
+
+               if (msg && header) {
+                       /* Create helper */
+                       rf_helper = create_reply_forward_helper (action, win, 
+                                                                reply_forward_type, header);
                        reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper);
+               } else {
+                       g_warning("%s: no message or header found in viewer\n", __FUNCTION__);
                }
-               if (header)
+               
+               if (msg)
+                       g_object_unref (msg);
+               if (header)
                        g_object_unref (header);
        } else {
-               TnyHeader *header;
+               TnyHeader *header = NULL;
                TnyIterator *iter;
+               gboolean do_retrieve = TRUE;
+               TnyList *header_list = NULL;
+
+               header_list = get_selected_headers (win);
+               if (!header_list)
+                       return;
+               /* Check that only one message is selected for replying */
+               if (tny_list_get_length (header_list) != 1) {
+                       modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
+                                                           NULL, _("mcen_ib_select_one_message"));
+                       g_object_unref (header_list);
+                       return;
+               }
 
                /* Only reply/forward to one message */
                iter = tny_list_create_iterator (header_list);
                header = TNY_HEADER (tny_iterator_get_current (iter));
                g_object_unref (iter);
 
-               if (header) {
-                       /* Retrieve messages */
-                       if (do_retrieve) {
-                               mail_op = 
-                                       modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                                                      modest_ui_actions_disk_operations_error_handler, 
-                                                                                      NULL, NULL);
-                               modest_mail_operation_queue_add (
-                                       modest_runtime_get_mail_operation_queue (), mail_op);
-                               
-                               modest_mail_operation_get_msg (mail_op,
-                                                              header,
-                                                              reply_forward_cb,
-                                                              rf_helper);
-                               /* Clean */
-                               g_object_unref(mail_op);
-                       } else {
-                               /* we put a ref here to prevent double unref as the reply
-                                * forward callback unrefs the header at its end */
-                               reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
-                       }
+               /* Retrieve messages */
+               do_retrieve = (action == ACTION_FORWARD) ||
+                       (reply_forward_type != MODEST_TNY_MSG_REPLY_TYPE_CITE);
 
+               if (do_retrieve) {
+                       TnyAccount *account = NULL;
+                       TnyFolder *folder = NULL;
+                       gdouble download = TRUE;
+                       guint uncached_msgs = 0;
 
-                       g_object_unref (header);
+                       folder = tny_header_get_folder (header);
+                       if (!folder)
+                               goto do_retrieve_frees;
+                       account = tny_folder_get_account (folder);
+                       if (!account)
+                               goto do_retrieve_frees;
+
+                       uncached_msgs = header_list_count_uncached_msgs (header_list);
+
+                       if (uncached_msgs > 0) {
+                               /* Allways download if we are online. */
+                               if (!tny_device_is_online (modest_runtime_get_device ())) {
+                                       gint response;
+                                       
+                                       /* If ask for user permission to download the messages */
+                                       response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                                           ngettext("mcen_nc_get_msg",
+                                                                                                    "mcen_nc_get_msgs",
+                                                                                                    uncached_msgs));
+                                       
+                                       /* End if the user does not want to continue */
+                                       if (response == GTK_RESPONSE_CANCEL)
+                                               download = FALSE;
+                               }
+                       }
+                       
+                       if (download) {
+                               /* Create helper */
+                               rf_helper = create_reply_forward_helper (action, win, 
+                                                                        reply_forward_type, header);
+                               if (uncached_msgs > 0) {
+                                       modest_platform_connect_and_perform (GTK_WINDOW (win), 
+                                                                            TRUE, account, 
+                                                                            reply_forward_performer, 
+                                                                            rf_helper);
+                               } else {
+                                       reply_forward_performer (FALSE, NULL, GTK_WINDOW (win), 
+                                                                account, rf_helper);
+                               }
+                       }
+               do_retrieve_frees:
+                       if (account)
+                               g_object_unref (account);
+                       if (folder)
+                               g_object_unref (folder);
+               } else {
+                       reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
                }
-
+               /* Frees */
+               g_object_unref (header_list);
+               g_object_unref (header);
        }
-
-       /* Free */
-       g_object_unref (header_list);
 }
 
 void
@@ -1805,7 +1887,7 @@ modest_ui_actions_on_sort (GtkAction *action,
                }
 
                /* Show sorting dialog */
-               modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);     
+               modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);        
        }
 }
 
@@ -1877,11 +1959,8 @@ do_send_receive_performer (gboolean canceled,
 
        if (err || canceled) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                if (info->mail_op) {
                        modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (),
                                                            info->mail_op);
@@ -1994,7 +2073,7 @@ modest_ui_actions_do_cancel_send (const gchar *account_name,
        }
 
        /* Get send queue*/
-       send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account));
+       send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account, TRUE));
        if (!TNY_IS_SEND_QUEUE(send_queue)) {
                g_set_error (&error, MODEST_MAIL_OPERATION_ERROR,
                             MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
@@ -2161,8 +2240,10 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
                        GtkWidget *folder_view = 
                                modest_main_window_get_child_widget (main_window,
                                                                     MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-                       if (folder != NULL) 
+                       if (folder != NULL) {
                                modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), folder, FALSE);
+                               g_object_unref (folder);
+                       }
                        gtk_widget_grab_focus (GTK_WIDGET (folder_view));
                        return;
                }
@@ -2186,6 +2267,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                                       ModestMainWindow *main_window)
 {
        TnyList *headers;
+       GtkWidget *open_widget;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
@@ -2200,12 +2282,14 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        /* we check for low-mem; in that case, show a warning, and don't allow
         * activating headers
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(main_window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(main_window), TRUE))
                return;
 
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
+       open_widget = modest_window_get_action_widget (MODEST_WINDOW (main_window), "/MenuBar/EmailMenu/EmailOpenMenu");
+       if (!GTK_WIDGET_IS_SENSITIVE (open_widget))
+               return;
 
-/*     headers = tny_simple_list_new (); */
-/*     tny_list_prepend (headers, G_OBJECT (header)); */
        headers = modest_header_view_get_selected_headers (header_view);
 
        open_msgs_from_headers (headers, MODEST_WINDOW (main_window));
@@ -2250,23 +2334,36 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                     gpointer user_data)
 {
        ModestMainWindow *win = NULL;
-       GtkWidget *header_view;
+       GtkWidget *folder_view;
+       const GError *error;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
 
        win = MODEST_MAIN_WINDOW (user_data);
-       header_view = 
-               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
-       if (header_view) {
-               TnyFolder *current_folder;
+       /* Check if the operation failed due to memory low conditions */
+       error = modest_mail_operation_get_error (mail_op);
+       if (error && error->domain == MODEST_MAIL_OPERATION_ERROR && 
+           error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+               modest_platform_run_information_dialog (GTK_WINDOW (win),
+                                                       dgettext("ke-recv","memr_ib_operation_disabled"),
+                                                       TRUE);
+               return;
+       }
 
-               current_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
-               if (current_folder != NULL && folder != current_folder) {
-                       g_object_unref (current_folder);
-                       return;
-               } else if (current_folder)
+       folder_view = 
+               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+
+       if (folder_view) {
+               TnyFolderStore *current_folder;
+
+               current_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+               if (current_folder) {
+                       gboolean different = ((TnyFolderStore *) folder != current_folder);
                        g_object_unref (current_folder);
+                       if (different)
+                               return;
+               }
        }
 
        /* Check if folder is empty and set headers view contents style */
@@ -2303,11 +2400,16 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                }
        } else {
                if (TNY_IS_FOLDER (folder_store) && selected) {
-                       
+                       TnyAccount *account;
+                       const gchar *account_name = NULL;
+                       gboolean refresh;
+
                        /* Update the active account */
-                       TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
+                       account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
                        if (account) {
                                set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
+                               account_name = 
+                                       modest_tny_account_get_parent_modest_account_name_for_server_account (account);
                                g_object_unref (account);
                                account = NULL;
                        }
@@ -2318,6 +2420,8 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                        modest_main_window_set_contents_style (main_window, 
                                                               MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
 
+                       refresh = !modest_account_mgr_account_is_busy (modest_runtime_get_account_mgr (), account_name);
+
                        /* Set folder on header view. This function
                           will call tny_folder_refresh_async so we
                           pass a callback that will be called when
@@ -2325,6 +2429,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                           empty view if there are no messages */
                        modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
                                                       TNY_FOLDER (folder_store),
+                                                      refresh,
                                                       folder_refreshed_cb,
                                                       main_window);
                        
@@ -2433,7 +2538,7 @@ modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart
        /* we check for low-mem; in that case, show a warning, and don't allow
         * viewing attachments
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
        modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
@@ -2475,37 +2580,31 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
        g_object_unref(edit_window);
 }
 
-gboolean
-modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+static gboolean
+enough_space_for_message (ModestMsgEditWindow *edit_window,
+                         MsgData *data)
 {
-       TnyTransportAccount *transport_account;
-       ModestMailOperation *mail_operation;
-       MsgData *data;
-       gchar *account_name, *from;
-       ModestAccountMgr *account_mgr;
-/*     char *info_text; */
-       gboolean had_error = FALSE;
+       TnyAccountStore *acc_store;
        guint64 available_disk, expected_size;
        gint parts_count;
        guint64 parts_size;
-       ModestMainWindow *win;
-
-       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
-       
-       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
+       acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store());
+       available_disk = modest_utils_get_available_space (NULL);
        modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
        expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
+                                                     data->html_body,
+                                                     parts_count,
+                                                     parts_size);
 
-       if ((available_disk != -1) && expected_size > available_disk) {
-               modest_msg_edit_window_free_msg_data (edit_window, data);
+       /* Double check: memory full condition or message too big */
+       if (available_disk < MIN_FREE_SPACE || 
+           expected_size > available_disk) {
 
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
+               modest_platform_information_banner (NULL, NULL, 
+                                                   dgettext("ke-recv", 
+                                                            "cerm_device_memory_full"));
                return FALSE;
        }
 
@@ -2515,13 +2614,9 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         * MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h) this
         * should still allow for sending anything critical...
         */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window))) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
+       if ((expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) &&
+           modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE))
+               return FALSE;
 
        /*
         * djcb: we also make sure that the attachments are smaller than the max size
@@ -2534,6 +2629,29 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                        GTK_WINDOW(edit_window),
                        dgettext("ke-recv","memr_ib_operation_disabled"),
                        TRUE);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+{
+       TnyTransportAccount *transport_account;
+       ModestMailOperation *mail_operation;
+       MsgData *data;
+       gchar *account_name, *from;
+       ModestAccountMgr *account_mgr;
+       gboolean had_error = FALSE;
+       ModestMainWindow *win;
+
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
+       
+       data = modest_msg_edit_window_get_msg_data (edit_window);
+
+       /* Check size */
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                return FALSE;
        }
@@ -2556,7 +2674,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        transport_account =
                TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                     (modest_runtime_get_account_store(),
+                                     (modest_runtime_get_account_store (),
                                       account_name,
                                       TNY_ACCOUNT_TYPE_TRANSPORT));
        if (!transport_account) {
@@ -2654,62 +2772,27 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 {
        TnyTransportAccount *transport_account = NULL;
        gboolean had_error = FALSE;
-       guint64 available_disk, expected_size;
-       gint parts_count;
-       guint64 parts_size;
+       MsgData *data;
+       ModestAccountMgr *account_mgr;
+       gchar *account_name;
+       gchar *from;
+       ModestMailOperation *mail_operation;
 
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
 
        if (!modest_msg_edit_window_check_names (edit_window, TRUE))
                return TRUE;
        
-       MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
+       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
-       modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
-       expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
-
-       if ((available_disk != -1) && expected_size > available_disk) {
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
-
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
                return FALSE;
        }
 
-       
-       /*
-        * djcb: if we're in low-memory state, we only allow for sending messages
-        * smaller than MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h)
-        * this should still allow for sending anything critical... 
-        */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window))) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
-
-       /*
-        * djcb: we also make sure that the attachments are smaller than the max size
-        * this is for the case where we'd try to forward a message with attachments 
-        * bigger than our max allowed size, or sending an message from drafts which
-        * somehow got past our checks when attaching.
-        */
-       if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
-               modest_platform_run_information_dialog (
-                       GTK_WINDOW(edit_window),
-                       dgettext("ke-recv","memr_ib_operation_disabled"),
-                       TRUE);
-               modest_msg_edit_window_free_msg_data (edit_window, data);
-               return FALSE;
-       }
-
-       ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
-       gchar *account_name = g_strdup (data->account_name);
+       account_mgr = modest_runtime_get_account_mgr();
+       account_name = g_strdup (data->account_name);
        if (!account_name)
                account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
@@ -2726,9 +2809,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        
        /* Get the currently-active transport account for this modest account: */
        if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) != 0) {
-               transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                                         (modest_runtime_get_account_store(),
-                                                          account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
+               transport_account = 
+                       TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
+                                             (modest_runtime_get_account_store (), 
+                                              account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
        }
        
        if (!transport_account) {
@@ -2738,17 +2822,17 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
                        return TRUE;
        }
        
-       gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */
-       ModestMailOperation *mail_operation = modest_mail_operation_new (NULL);
+       from = modest_account_mgr_get_from_string (account_mgr, account_name);
+       mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
                                             transport_account,
                                             data->draft_msg,
                                             from,
-                                            data->to, 
+                                            data->to,
                                             data->cc, 
                                             data->bcc,
                                             data->subject, 
@@ -2764,7 +2848,8 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 
        if (modest_mail_operation_get_error (mail_operation) != NULL) {
                const GError *error = modest_mail_operation_get_error (mail_operation);
-               if (error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
+               if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                   error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
                        g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_operation))->message);
                        modest_platform_information_banner (NULL, NULL, _CS("sfil_ni_not_enough_memory"));
                        had_error = TRUE;
@@ -2909,7 +2994,7 @@ modest_ui_actions_on_insert_image (GtkAction *action,
        g_return_if_fail (GTK_IS_ACTION (action));
 
 
-       if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                return;
 
        if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
@@ -2925,7 +3010,7 @@ modest_ui_actions_on_attach_file (GtkAction *action,
        g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
        g_return_if_fail (GTK_IS_ACTION (action));
 
-       if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                return;
        
        modest_msg_edit_window_offer_attach_file (window);
@@ -2941,6 +3026,38 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
        modest_msg_edit_window_remove_attachments (window, NULL);
 }
 
+
+#ifdef MODEST_PLATFORM_MAEMO
+typedef struct {
+       guint handler;
+       gchar *name;
+       GtkWindow *win;
+       TnyFolderStore *folder;
+} CreateFolderHelper;
+
+static gboolean
+show_create_folder_in_timeout (gpointer data)
+{
+       CreateFolderHelper *helper = (CreateFolderHelper *) data;
+
+       /* Remove the timeout ASAP, we can not wait until the dialog
+          is shown because it could take a lot of time and so the
+          timeout could be called twice or more times */
+       g_source_remove (helper->handler);
+
+       gdk_threads_enter ();
+       do_create_folder (helper->win, helper->folder, helper->name);
+       gdk_threads_leave ();
+
+       g_object_unref (helper->win);
+       g_object_unref (helper->folder);
+       g_free (helper->name);
+       g_slice_free (CreateFolderHelper, helper);
+
+       return FALSE;
+}
+#endif
+
 static void
 do_create_folder_cb (ModestMailOperation *mail_op,
                     TnyFolderStore *parent_folder, 
@@ -2965,7 +3082,21 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                /* Try again. Do *NOT* show any error because the mail
                   operations system will do it for us because we
                   created the mail_op with new_with_error_handler */
+#ifdef MODEST_PLATFORM_MAEMO
+               CreateFolderHelper *helper;
+               helper = g_slice_new0 (CreateFolderHelper);
+               helper->name = g_strdup (suggested_name);
+               helper->folder = g_object_ref (parent_folder);
+               helper->win = g_object_ref (source_win);
+
+               /* Ugly but neccesary stuff. The problem is that the
+                  dialog when is shown calls a function that destroys
+                  all the temporary windows, so the banner is
+                  destroyed */
+               helper->handler = g_timeout_add (2000, show_create_folder_in_timeout, helper);
+#else
                do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+#endif
        } else {
                /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
                 * FIXME: any other? */         
@@ -3031,11 +3162,7 @@ create_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto frees;
        }
 
@@ -3091,11 +3218,15 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
        if (!error)
                g_return_if_reached ();
 
-       switch (error->code) {
-       case MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS:
+       if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+           error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
                message = _CS("ckdg_ib_folder_already_exists");
-               break;
-       default:
+       } else if (error->domain == TNY_ERROR_DOMAIN &&
+                  error->code == TNY_SERVICE_ERROR_STATE) {
+               /* This means that the folder is already in use (a
+                  message is opened for example */
+               message = _("emev_ni_internal_error");
+       } else {
                message = _("emev_ib_ui_imap_unable_to_rename");
        }
 
@@ -3116,6 +3247,11 @@ on_rename_folder_cb (ModestMailOperation *mail_op,
 {
        ModestFolderView *folder_view;
 
+       /* If the window was closed when renaming a folder this could
+          happen */
+       if (!MODEST_IS_FOLDER_VIEW (user_data))
+               return;
+
        folder_view = MODEST_FOLDER_VIEW (user_data);
        /* Note that if the rename fails new_folder will be NULL */
        if (new_folder) {
@@ -3123,6 +3259,7 @@ on_rename_folder_cb (ModestMailOperation *mail_op,
        } else {
                modest_folder_view_select_first_inbox_or_local (folder_view);
        }
+       gtk_widget_grab_focus (GTK_WIDGET (folder_view));       
 }
 
 static void
@@ -3139,11 +3276,7 @@ on_rename_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
        } else if (MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
@@ -3355,6 +3488,30 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainW
 }
 
 
+typedef struct _PasswordDialogFields {
+       GtkWidget *username;
+       GtkWidget *password;
+       GtkWidget *dialog;
+} PasswordDialogFields;
+
+static void
+password_dialog_check_field (GtkEditable *editable,
+                            PasswordDialogFields *fields)
+{
+       const gchar *value;
+       gboolean any_value_empty = FALSE;
+
+       value = gtk_entry_get_text (GTK_ENTRY (fields->username));
+       if ((value == NULL) || value[0] == '\0') {
+               any_value_empty = TRUE;
+       }
+       value = gtk_entry_get_text (GTK_ENTRY (fields->password));
+       if ((value == NULL) || value[0] == '\0') {
+               any_value_empty = TRUE;
+       }
+       gtk_dialog_set_response_sensitive (GTK_DIALOG (fields->dialog), GTK_RESPONSE_ACCEPT, !any_value_empty);
+}
+
 void
 modest_ui_actions_on_password_requested (TnyAccountStore *account_store, 
                                         const gchar* server_account_name,
@@ -3366,6 +3523,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 {
        g_return_if_fail(server_account_name);
        gboolean completed = FALSE;
+       PasswordDialogFields *fields = NULL;
        
        /* Initalize output parameters: */
        if (cancel)
@@ -3426,11 +3584,16 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
        /* Dim this if a connection has ever succeeded with this username,
         * as per the UI spec: */
-       const gboolean username_known = 
-               modest_account_mgr_get_server_account_username_has_succeeded(
-                       modest_runtime_get_account_mgr(), server_account_name);
-       gtk_widget_set_sensitive (entry_username, !username_known);
-       
+       /* const gboolean username_known =  */
+       /*      modest_account_mgr_get_server_account_username_has_succeeded( */
+       /*              modest_runtime_get_account_mgr(), server_account_name); */
+       /* gtk_widget_set_sensitive (entry_username, !username_known); */
+
+       /* We drop the username sensitive code and disallow changing it here
+        * as tinymail does not support really changing the username in the callback
+        */
+       gtk_widget_set_sensitive (entry_username, FALSE);
+
 #ifdef MODEST_PLATFORM_MAEMO
        /* Auto-capitalization is the default, so let's turn it off: */
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
@@ -3482,6 +3645,15 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                            TRUE, FALSE, 0);
 */
 
+       fields = g_slice_new0 (PasswordDialogFields);
+       fields->username = entry_username;
+       fields->password = entry_password;
+       fields->dialog = dialog;
+
+       g_signal_connect (entry_username, "changed", G_CALLBACK (password_dialog_check_field), fields);
+       g_signal_connect (entry_password, "changed", G_CALLBACK (password_dialog_check_field), fields);
+       password_dialog_check_field (NULL, fields);
+
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
 
        while (!completed) {
@@ -3545,6 +3717,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 */
 
        gtk_widget_destroy (dialog);
+       g_slice_free (PasswordDialogFields, fields);
        
        /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
 }
@@ -3724,8 +3897,10 @@ paste_as_attachment_free (gpointer data)
 {
        PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) data;
 
-       gtk_widget_destroy (helper->banner);
-       g_object_unref (helper->banner);
+       if (helper->banner) {
+               gtk_widget_destroy (helper->banner);
+               g_object_unref (helper->banner);
+       }
        g_free (helper);
 }
 
@@ -3779,7 +3954,6 @@ modest_ui_actions_on_paste (GtkAction *action,
                        mail_op = modest_mail_operation_new (G_OBJECT (window));
                        if (helper->banner != NULL) {
                                g_object_ref (G_OBJECT (helper->banner));
-                               gtk_window_set_modal (GTK_WINDOW (helper->banner), FALSE);
                                gtk_widget_show (GTK_WIDGET (helper->banner));
                        }
 
@@ -3914,9 +4088,9 @@ modest_ui_actions_on_select_all (GtkAction *action,
                /* Set focuse on header view */
                gtk_widget_grab_focus (header_view);
 
-
                /* Enable window dimming management */
                modest_window_enable_dimming (MODEST_WINDOW(window));
+               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
                modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
        }
 
@@ -4277,8 +4451,13 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                return;
 
        children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area));
+#ifdef MODEST_PLATFORM_MAEMO
        ok_button = GTK_WIDGET (children->next->next->data);
        new_button = GTK_WIDGET (children->next->data);
+#else
+       ok_button = GTK_WIDGET (children->data);
+       new_button = GTK_WIDGET (children->next->next->data);
+#endif
        g_list_free (children);
 
        /* check if folder_store is an remote account */
@@ -4415,12 +4594,24 @@ create_move_to_dialog (GtkWindow *win,
                                              GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
                                              NULL);
 
+#ifdef MODEST_PLATFORM_MAEMO
        gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_ok"), GTK_RESPONSE_ACCEPT);
        /* We do this manually so GTK+ does not associate a response ID for
         * the button. */
        new_button = gtk_button_new_from_stock (_("mcen_bd_new"));
        gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), new_button, FALSE, FALSE, 0);
        gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_cancel"), GTK_RESPONSE_REJECT);
+#else
+       /* We do this manually so GTK+ does not associate a response ID for
+        * the button. */
+       new_button = gtk_button_new_with_label (_("mcen_ti_new_folder"));
+       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), new_button, FALSE, FALSE, 0);
+       gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (dialog)->action_area), new_button, TRUE);
+       gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
+       gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
+       gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
+       gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 24);
+#endif
 
        /* Create scrolled window */
        scroll = gtk_scrolled_window_new (NULL, NULL);
@@ -4428,6 +4619,10 @@ create_move_to_dialog (GtkWindow *win,
                                         GTK_POLICY_AUTOMATIC,
                                         GTK_POLICY_AUTOMATIC);
 
+#ifndef MODEST_PLATFORM_MAEMO
+       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
+#endif
+
        /* Create folder view */
        *tree_view = modest_platform_create_folder_view (NULL);
 
@@ -4507,7 +4702,11 @@ create_move_to_dialog (GtkWindow *win,
                            scroll, TRUE, TRUE, 0);
 
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
+#ifdef MODEST_PLATFORM_MAEMO
        gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 300);
+#else
+       gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
+#endif
 
        return dialog;
 }
@@ -4576,6 +4775,21 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
 }
 
 static void
+move_to_helper_destroyer (gpointer user_data)
+{
+       MoveToHelper *helper = (MoveToHelper *) user_data;
+
+       /* Close the "Pasting" information banner */
+       if (helper->banner) {
+               gtk_widget_destroy (GTK_WIDGET (helper->banner));
+               g_object_unref (helper->banner);
+       }
+       if (helper->reference != NULL)
+               gtk_tree_row_reference_free (helper->reference);
+       g_free (helper);
+}
+
+static void
 move_to_cb (ModestMailOperation *mail_op, 
            gpointer user_data)
 {
@@ -4613,13 +4827,8 @@ move_to_cb (ModestMailOperation *mail_op,
                }
                g_object_unref (object);
         }
-
-       /* Close the "Pasting" information banner */
-       gtk_widget_destroy (GTK_WIDGET(helper->banner));
-       g_object_unref (helper->banner);
-       if (helper->reference != NULL)
-               gtk_tree_row_reference_free (helper->reference);
-       g_free (helper);
+       /* Destroy the helper */
+       move_to_helper_destroyer (helper);
 }
 
 static void
@@ -4730,7 +4939,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
                response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),_("mcen_nc_purge_file_text_inbox"));
 
                if (response == GTK_RESPONSE_OK) {
-                       modest_platform_information_banner (NULL, NULL, _("mcen_ib_removing_attachment"));
+                       GtkWidget *info;
+                       info =
+                               modest_platform_animation_banner (GTK_WIDGET (win), NULL, _("mcen_ib_removing_attachment"));
                        iter = tny_list_create_iterator (parts);
                        while (!tny_iterator_is_done (iter)) {
                                TnyMimePart *part;
@@ -4747,10 +4958,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
                        g_object_unref (iter);
                        
                        tny_msg_rewrite_cache (msg);
+
+                       gtk_widget_destroy (info);
                }
-     /* } else { */
-               /* This string no longer exists, refer to NB#75415 for more info */
-               /* modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); */
        }
 
        modest_window_mgr_unregister_header (mgr, header);
@@ -4811,7 +5021,7 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
                                                                         modest_ui_actions_disk_operations_error_handler,
                                                                         NULL, NULL);
                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-               modest_mail_operation_get_msg (mail_op, header, open_msg_for_purge_cb, win);
+               modest_mail_operation_get_msg (mail_op, header, FALSE, open_msg_for_purge_cb, win);
                
                g_object_unref (mail_op);
        }
@@ -4906,7 +5116,7 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
                             gpointer user_data)
 {
        ModestWindow *main_window = NULL;
-       
+
        /* Disable next automatic folder selection */
        main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
                                                         FALSE); /* don't create */
@@ -4918,8 +5128,14 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
                if (win)
                        g_object_unref (win);
        }
+       move_to_helper_destroyer (user_data);
 }
 
+typedef struct {
+       TnyFolderStore *dst_folder;
+       TnyList *headers;
+} XferMsgsHelper;
+
 /**
  * Utility function that transfer messages from both the main window
  * and the msg view window when using the "Move to" dialog
@@ -4931,29 +5147,25 @@ xfer_messages_performer  (gboolean canceled,
                          TnyAccount *account, 
                          gpointer user_data)
 {
-       TnyFolderStore *dst_folder = TNY_FOLDER_STORE (user_data);
        ModestWindow *win = MODEST_WINDOW (parent_window);
-       TnyList *headers = NULL;
        TnyAccount *dst_account = NULL;
        const gchar *proto_str = NULL;
        gboolean dst_is_pop = FALSE;
+       XferMsgsHelper *helper;
+       MoveToHelper *movehelper;
+       ModestMailOperation *mail_op;
 
-       if (canceled)
-               goto end;
+       helper = (XferMsgsHelper *) user_data;
 
-       if (err) {
-               if (is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               } else {
+       if (canceled || err) {
+               if (!check_memory_full_error ((GtkWidget *) parent_window, err)) {
                        /* Show the proper error message */
                        modest_ui_actions_on_account_connection_error (parent_window, account);
                }
                goto end;
        }
 
-       dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
+       dst_account = tny_folder_get_account (TNY_FOLDER (helper->dst_folder));
        proto_str = tny_account_get_proto (dst_account);
 
        /* tinymail will return NULL for local folders it seems */
@@ -4963,57 +5175,49 @@ xfer_messages_performer  (gboolean canceled,
 
        g_object_unref (dst_account);
 
-       /* Get selected headers */
-       headers = get_selected_headers (MODEST_WINDOW (win));
-       if (!headers) {
-               g_warning ("%s: no headers selected", __FUNCTION__);
-               goto end;
-       }
-
        if (dst_is_pop) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
                                                    ngettext("mail_in_ui_folder_move_target_error",
                                                             "mail_in_ui_folder_move_targets_error",
-                                                            tny_list_get_length (headers)));
-               g_object_unref (headers);
+                                                            tny_list_get_length (helper->headers)));
                goto end;
        }
 
-       MoveToHelper *helper = g_new0 (MoveToHelper, 1);
-       helper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
-                                                          _CS("ckct_nw_pasting"));
-       if (helper->banner != NULL)  {
-               g_object_ref (helper->banner);
-               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
-               gtk_widget_show (GTK_WIDGET(helper->banner));
+       movehelper = g_new0 (MoveToHelper, 1);
+       movehelper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
+                                                              _CS("ckct_nw_pasting"));
+       if (movehelper->banner != NULL)  {
+               g_object_ref (movehelper->banner);
+               gtk_widget_show (GTK_WIDGET (movehelper->banner));
        }
 
        if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *header_view = 
                        modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
                                                             MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-               helper->reference = get_next_after_selected_headers (MODEST_HEADER_VIEW (header_view));
+               movehelper->reference = get_next_after_selected_headers (MODEST_HEADER_VIEW (header_view));
        }
 
-       ModestMailOperation *mail_op = 
-               modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                              xfer_messages_error_handler,
-                                                              NULL, NULL);
+       /* Perform the mail operation */
+       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(win),
+                                                                xfer_messages_error_handler,
+                                                                movehelper, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
                                         mail_op);
 
        modest_mail_operation_xfer_msgs (mail_op, 
-                                        headers,
-                                        TNY_FOLDER (dst_folder),
+                                        helper->headers,
+                                        TNY_FOLDER (helper->dst_folder),
                                         TRUE,
                                         msgs_move_to_cb,
-                                        helper);
+                                        movehelper);
 
        g_object_unref (G_OBJECT (mail_op));
-       g_object_unref (headers);
  end:
-       g_object_unref (dst_folder);
+       g_object_unref (helper->dst_folder);
+       g_object_unref (helper->headers);
+       g_slice_free (XferMsgsHelper, helper);
 }
 
 typedef struct {
@@ -5043,7 +5247,6 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                        _CS("ckct_nw_pasting"));
        if (helper->banner != NULL)  {
                g_object_ref (helper->banner);
-               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
                gtk_widget_show (GTK_WIDGET(helper->banner));
        }
        /* Clean folder on header view before moving it */
@@ -5176,6 +5379,7 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
 {
        gboolean need_connection = TRUE;
        gboolean do_xfer = TRUE;
+       XferMsgsHelper *helper;
        
        modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder), 
                                               headers, TNY_FOLDER (dst_folder),
@@ -5186,11 +5390,16 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        if (!do_xfer)
                return;
 
+       /* Create the helper */
+       helper = g_slice_new (XferMsgsHelper);
+       helper->dst_folder = g_object_ref (dst_folder);
+       helper->headers = g_object_ref (headers);
+
        if (need_connection) {
                DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
                connect_info->callback = xfer_messages_performer;
                connect_info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
-               connect_info->data = g_object_ref (dst_folder);
+               connect_info->data = helper;
                
                modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
                                                           TNY_FOLDER_STORE (src_folder), 
@@ -5198,7 +5407,7 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        } else {
                TnyAccount *src_account = get_account_from_folder_store (TNY_FOLDER_STORE (src_folder));
                xfer_messages_performer (FALSE, NULL, GTK_WINDOW (win),
-                                        src_account, g_object_ref (dst_folder));
+                                        src_account, helper);
                g_object_unref (src_account);
        }
 }
@@ -5351,7 +5560,7 @@ modest_ui_actions_save_attachments (GtkAction *action,
 {
        if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
 
-               if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+               if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                        return;
 
                modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
@@ -5397,15 +5606,53 @@ modest_ui_actions_on_help (GtkAction *action,
 {
        const gchar *help_id;
 
-       g_return_if_fail (action);
        g_return_if_fail (win && GTK_IS_WINDOW(win));
        
        help_id = modest_window_mgr_get_help_id (modest_runtime_get_window_mgr(), win);
-       
-       if (help_id)
-               modest_platform_show_help (GTK_WINDOW (win), help_id);
+
+        if (help_id)
+                modest_platform_show_help (GTK_WINDOW (win), help_id);
+}
+
+void 
+modest_ui_actions_on_csm_help (GtkAction *action, 
+                              GtkWindow *win)
+{
+       const gchar* help_id = NULL;
+       GtkWidget *folder_view;
+       TnyFolderStore *folder_store;
+
+       g_return_if_fail (win && MODEST_IS_MAIN_WINDOW (win));
+
+       /* Get selected folder */
+       folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+       folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+
+       /* Switch help_id */
+       if (folder_store && TNY_IS_FOLDER (folder_store))
+               help_id = modest_tny_folder_get_help_id (TNY_FOLDER (folder_store));
+
+       if (folder_store)
+               g_object_unref (folder_store);
+
+        if (help_id)
+                modest_platform_show_help (GTK_WINDOW (win), help_id);
        else
-               g_warning ("%s: no help for window %p", __FUNCTION__, win);
+               modest_ui_actions_on_help (action, win);
+}
+
+static void     
+retrieve_contents_cb (ModestMailOperation *mail_op, 
+                     TnyHeader *header, 
+                     gboolean canceled,
+                     TnyMsg *msg,
+                     GError *err,
+                     gpointer user_data)
+{
+       /* We only need this callback to show an error in case of
+          memory low condition */
+       modest_ui_actions_msg_retrieval_check (mail_op, header, msg);
 }
 
 static void
@@ -5419,11 +5666,7 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto out;
        }
 
@@ -5432,7 +5675,7 @@ retrieve_msg_contents_performer (gboolean canceled,
                                                                 modest_ui_actions_disk_operations_error_handler, 
                                                                 NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
+       modest_mail_operation_get_msgs_full (mail_op, headers, retrieve_contents_cb, NULL, NULL);
 
        /* Frees */
        g_object_unref (mail_op);
@@ -5592,7 +5835,7 @@ modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * searching
         */
-       if (modest_platform_check_memory_low (window))
+       if (modest_platform_check_memory_low (window, TRUE))
                return;
        
        modest_platform_show_search_messages (GTK_WINDOW (window));
@@ -5607,7 +5850,7 @@ modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * for the addressbook
         */
-       if (modest_platform_check_memory_low (win))
+       if (modest_platform_check_memory_low (win, TRUE))
                return;
 
 
@@ -5689,9 +5932,12 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
        TnyTransportAccount *server_account;
        gchar *message = NULL;
 
-       /* Don't show anything if the user cancelled something or the send receive request is not
-        * interactive */
+       /* Don't show anything if the user cancelled something or the
+        * send receive request is not interactive. Authentication
+        * errors are managed by the account store so no need to show
+        * a dialog here again */
        if (err->code == TNY_SYSTEM_ERROR_CANCEL ||
+           err->code == TNY_SERVICE_ERROR_AUTHENTICATE ||
            !modest_tny_send_queue_get_requested_send_receive (MODEST_TNY_SEND_QUEUE (self)))
                return;
 
@@ -5709,9 +5955,6 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
        case TNY_SERVICE_ERROR_CONNECT:
                message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
                break;
-       case TNY_SERVICE_ERROR_AUTHENTICATE:
-               message = g_strdup_printf (_("emev_ni_ui_smtp_authentication_fail_error"), server_name);
-               break;
        case TNY_SERVICE_ERROR_SEND:
                message = g_strdup (dgettext("hildon-common-strings", "sfil_ib_unable_to_send"));
                break;
@@ -5724,10 +5967,6 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
                message = g_strdup (dgettext("hildon-common-strings", "sfil_ib_unable_to_send"));
                break;  
        }
-       
-       /* TODO if the username or the password where not defined we
-          should show the Accounts Settings dialog or the Connection
-          specific SMTP server window */
 
        modest_platform_run_information_dialog (NULL, message, FALSE);
        g_free (message);