* src/widgets/modest-header-view.c:
[modest] / src / modest-ui-actions.c
index 3cd52fc..46fb8e3 100644 (file)
@@ -154,60 +154,39 @@ static gboolean connect_to_get_msg (ModestWindow *win,
                                    gint num_of_uncached_msgs,
                                    TnyAccount *account);
 
-static gboolean remote_folder_is_pop (const TnyFolderStore *folder);
+static gboolean remote_folder_is_pop (TnyFolderStore *folder);
 
-static gboolean msgs_already_deleted_from_server ( TnyList *headers,
-                                                   const TnyFolderStore *src_folder);
+static void     do_create_folder (GtkWindow *window, 
+                                 TnyFolderStore *parent_folder, 
+                                 const gchar *suggested_name);
 
+static GtkWidget* get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog);
+
+static TnyAccount *get_account_from_folder_store (TnyFolderStore *folder_store);
+
+static void transfer_messages_helper (GtkWindow *win,
+                                     TnyFolder *src_folder,
+                                     TnyList *headers,
+                                     TnyFolder *dst_folder);
 
 /*
  * This function checks whether a TnyFolderStore is a pop account
  */
 static gboolean
-remote_folder_is_pop (const TnyFolderStore *folder)
+remote_folder_is_pop (TnyFolderStore *folder)
 {
         const gchar *proto = NULL;
         TnyAccount *account = NULL;
 
-        g_return_val_if_fail (TNY_IS_FOLDER_STORE(folder), FALSE);
-
-        if (TNY_IS_ACCOUNT (folder)) {
-                account = TNY_ACCOUNT(folder);
-                g_object_ref(account);
-        } else if (TNY_IS_FOLDER (folder)) {
-                account = tny_folder_get_account(TNY_FOLDER(folder));
-        }
-
-       if (!account && !TNY_IS_ACCOUNT(account)) {
-               g_warning ("%s: could not get account", __FUNCTION__);
-               return FALSE;
-       }
+        g_return_val_if_fail (TNY_IS_FOLDER_STORE (folder), FALSE);
        
-        proto = tny_account_get_proto(account);
+       account = get_account_from_folder_store (folder);
+        proto = tny_account_get_proto (account);
         g_object_unref (account);
 
-        return proto &&
-          (modest_protocol_info_get_transport_store_protocol (proto) == MODEST_PROTOCOL_STORE_POP);
-}
-
-/*
- * This functions checks whether if a list of messages are already
- * deleted from the server: that is, if the server is a POP account
- * and all messages are already cached.
- */
-static gboolean
-msgs_already_deleted_from_server (TnyList *headers, const TnyFolderStore *src_folder)
-{
-        g_return_val_if_fail (TNY_IS_FOLDER_STORE(src_folder), FALSE);
-        g_return_val_if_fail (TNY_IS_LIST(headers), FALSE);
-
-        gboolean src_is_pop = remote_folder_is_pop (src_folder);
-        gint uncached_msgs = header_list_count_uncached_msgs (headers);
-
-        return (src_is_pop && !uncached_msgs);
+        return (modest_protocol_info_get_transport_store_protocol (proto) == MODEST_PROTOCOL_STORE_POP);
 }
 
-
 /* FIXME: this should be merged with the similar code in modest-account-view-window */
 /* Show the account creation wizard dialog.
  * returns: TRUE if an account was created. FALSE if the user cancelled.
@@ -389,10 +368,8 @@ void
 modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win)
 {
        /* Close msg view window or select next */
-       if (modest_msg_view_window_last_message_selected (win) &&
-               modest_msg_view_window_first_message_selected (win)) {
-               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win));
-       } else if (!modest_msg_view_window_select_next_message (win)) {
+       if (!modest_msg_view_window_select_next_message (win) &&
+           !modest_msg_view_window_select_previous_message (win)) {
                gboolean ret_value;
                g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);       
        }
@@ -591,8 +568,6 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *
        modest_ui_actions_on_delete_message (action, win);
 }
 
-
-
 void
 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
 {      
@@ -728,7 +703,8 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                              const gchar *bcc_str,
                              const gchar *subject_str,
                              const gchar *body_str,
-                             GSList *attachments)
+                             GSList *attachments,
+                             gboolean set_as_modified)
 {
        gchar *account_name = NULL;
        TnyMsg *msg = NULL;
@@ -740,8 +716,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        ModestAccountMgr *mgr = modest_runtime_get_account_mgr();
        ModestTnyAccountStore *store = modest_runtime_get_account_store();
 
-       if (win) account_name = g_strdup (modest_window_get_active_account (win));
-       if (!account_name) account_name = modest_account_mgr_get_default_account(mgr);
+       account_name = modest_account_mgr_get_default_account(mgr);
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                goto cleanup;
@@ -784,11 +759,8 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                attachments = g_slist_next(attachments);
        }
        modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win);
+       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
 
-       if (win) {
-               gtk_window_set_transient_for (GTK_WINDOW (msg_win),
-                                             GTK_WINDOW (win));
-       }
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
@@ -810,9 +782,10 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
                if (!modest_ui_actions_run_account_setup_wizard (win))
                        return;
                
-       modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL);
+       modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL, FALSE);
 }
 
+
 gboolean 
 modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                                       TnyHeader *header,
@@ -834,6 +807,28 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
        return TRUE;
 }
 
+typedef struct {
+       guint idle_handler;
+       gchar *message;
+       GtkWidget *banner;
+} OpenMsgBannerInfo;
+
+gboolean
+open_msg_banner_idle (gpointer userdata)
+{
+       OpenMsgBannerInfo *banner_info = (OpenMsgBannerInfo *) 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);
+       
+       gdk_threads_leave ();
+
+       return FALSE;
+       
+}
+
 static void
 open_msg_cb (ModestMailOperation *mail_op, 
             TnyHeader *header,  
@@ -849,12 +844,13 @@ open_msg_cb (ModestMailOperation *mail_op,
        gchar *account = NULL;
        TnyFolder *folder;
        gboolean open_in_editor = FALSE;
+       OpenMsgBannerInfo *banner_info = (OpenMsgBannerInfo *) user_data;
        
        /* Do nothing if there was any problem with the mail
           operation. The error will be shown by the error_handler of
           the mail operation */
        if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
-               return;
+               goto banner_cleanup;
 
        parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
        folder = tny_header_get_folder (header);
@@ -935,8 +931,6 @@ open_msg_cb (ModestMailOperation *mail_op,
                win = modest_msg_edit_window_new (msg, account, TRUE);
 
 
-               /* Show banner */
-               modest_platform_information_banner (NULL, NULL, _("mail_ib_opening_draft_message"));
 
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
@@ -991,6 +985,20 @@ cleanup:
        g_free(account);
        g_object_unref (parent_win);
        g_object_unref (folder);
+banner_cleanup:
+       if (banner_info) {
+               g_free (banner_info->message);
+               if (banner_info->idle_handler > 0) {
+                       g_source_remove (banner_info->idle_handler);
+                       banner_info->idle_handler = 0;
+               }
+               if (banner_info->banner != NULL) {
+                       gtk_widget_destroy (banner_info->banner);
+                       g_object_unref (banner_info->banner);
+                       banner_info->banner = NULL;
+               }
+               g_slice_free (OpenMsgBannerInfo, banner_info);
+       }
 }
 
 void
@@ -999,19 +1007,25 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
 {
        const GError *error;
        GObject *win = NULL;
-       const gchar *err_msg;
 
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
-       /* Select error message */
-       if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT)
-               err_msg = _("emev_ni_ui_imap_msg_size_exceed_error");
-       else
-               err_msg = (const gchar *) user_data;
 
        /* Show error */
-       modest_platform_run_information_dialog ((GtkWindow *) win, err_msg);
+       if (error->code == TNY_SYSTEM_ERROR_MEMORY ||
+           error->code == TNY_IO_ERROR_WRITE ||
+           error->code == TNY_IO_ERROR_READ) {
+               ModestMailOperationStatus st = modest_mail_operation_get_status (mail_op);
+               /* If the mail op has been cancelled then it's not an error: don't show any message */
+               if (st != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+                       modest_platform_information_banner ((GtkWidget *) win,
+                                                           NULL, dgettext("ke-recv",
+                                                                          "cerm_device_memory_full"));
+               }
+       } else if (user_data) {
+               modest_platform_information_banner ((GtkWidget *) win, 
+                                                   NULL, user_data);
+       }
 
        if (win)
                g_object_unref (win);
@@ -1038,6 +1052,16 @@ get_account_from_header_list (TnyList *headers)
        return account;
 }
 
+static void 
+foreach_unregister_headers (gpointer data,
+                           gpointer user_data)
+{
+       ModestWindowMgr *mgr = (ModestWindowMgr *) user_data;
+       TnyHeader *header = TNY_HEADER (data);
+
+       modest_window_mgr_unregister_header (mgr, header);
+}
+
 static void
 open_msgs_performer(gboolean canceled, 
                    GError *err,
@@ -1051,12 +1075,16 @@ open_msgs_performer(gboolean canceled,
        ModestTransportStoreProtocol proto;
        TnyList *not_opened_headers;
        TnyConnectionStatus status;
+       gboolean show_open_draft = FALSE;
+       OpenMsgBannerInfo *banner_info = NULL;
 
        not_opened_headers = TNY_LIST (user_data);
 
        status = tny_account_get_connection_status (account);
        if (err || canceled) {
-               /* TODO: Show an error ? */
+               /* Unregister the already registered headers */
+               tny_list_foreach (not_opened_headers, foreach_unregister_headers, 
+                                 modest_runtime_get_window_mgr ());
                goto clean;
        }
 
@@ -1080,6 +1108,19 @@ open_msgs_performer(gboolean canceled,
                        g_object_unref (header);
                        g_object_unref (iter);
                } else {
+                       TnyHeader *header;
+                       TnyFolder *folder;
+                       TnyIterator *iter;
+                       TnyFolderType folder_type;
+
+                       iter = tny_list_create_iterator (not_opened_headers);
+                       header = TNY_HEADER (tny_iterator_get_current (iter));
+                       folder = tny_header_get_folder (header);
+                       folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+                       show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+                       g_object_unref (folder);
+                       g_object_unref (header);
+                       g_object_unref (iter);
                        error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
                }
        } else {
@@ -1093,11 +1134,18 @@ open_msgs_performer(gboolean canceled,
                                                               error_msg, g_free);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                         mail_op);
-               
+
+       if (show_open_draft) {
+               banner_info = g_slice_new (OpenMsgBannerInfo);
+               banner_info->message = g_strdup (_("mail_ib_opening_draft_message"));
+               banner_info->banner = NULL;
+               banner_info->idle_handler = g_timeout_add (500, open_msg_banner_idle, banner_info);
+       }
+
        modest_mail_operation_get_msgs_full (mail_op,
                                             not_opened_headers,
                                             open_msg_cb,
-                                            NULL,
+                                            banner_info,
                                             NULL);
 
        /* Frees */
@@ -1220,7 +1268,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
 
        /* Connect to the account and perform */
        if (uncached_msgs > 0) {
-               modest_platform_connect_and_perform ((GtkWindow *) win, g_object_ref (account), 
+               modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account), 
                                                     open_msgs_performer, g_object_ref (not_opened_headers));
        } else {
                /* Call directly the performer, do not need to connect */
@@ -1299,19 +1347,23 @@ reply_forward_cb (ModestMailOperation *mail_op,
        switch (rf_helper->action) {
        case ACTION_REPLY:
                new_msg = 
-                       modest_tny_msg_create_reply_msg (msg, header, from, signature,
+                       modest_tny_msg_create_reply_msg (msg, header, from, 
+                                                        (use_signature) ? signature : NULL,
                                                         rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_SENDER);
                break;
        case ACTION_REPLY_TO_ALL:
                new_msg = 
-                       modest_tny_msg_create_reply_msg (msg, header, from, signature, rf_helper->reply_forward_type,
+                       modest_tny_msg_create_reply_msg (msg, header, from, 
+                                                        (use_signature) ? signature : NULL, 
+                                                        rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_ALL);
                edit_type = MODEST_EDIT_TYPE_REPLY;
                break;
        case ACTION_FORWARD:
                new_msg = 
-                       modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
+                       modest_tny_msg_create_forward_msg (msg, from, (use_signature) ? signature : NULL, 
+                                                          rf_helper->reply_forward_type);
                edit_type = MODEST_EDIT_TYPE_FORWARD;
                break;
        default:
@@ -1636,17 +1688,21 @@ new_messages_arrived (ModestMailOperation *self,
                      gpointer user_data)
 {
        GObject *source;
+       gboolean show_visual_notifications;
 
        source = modest_mail_operation_get_source (self);
-
-       /* Notify new messages have been downloaded. Do not notify if
-          the send&receive was invoked by the user, i.e, if the mail
-          operation has a source (the main window) */
-       if ((new_headers != NULL) && (tny_list_get_length (new_headers) > 0) && !source)
-               modest_platform_on_new_headers_received (new_headers);
-
+       show_visual_notifications = (source) ? FALSE : TRUE;
        if (source)
                g_object_unref (source);
+
+       /* Notify new messages have been downloaded. If the
+          send&receive was invoked by the user then do not show any
+          visual notification, only play a sound and activate the LED
+          (for the Maemo version) */
+       if (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0)
+               modest_platform_on_new_headers_received (new_headers, 
+                                                        show_visual_notifications);
+
 }
 
 gboolean
@@ -1691,7 +1747,6 @@ do_send_receive_performer (gboolean canceled,
        info = (SendReceiveInfo *) user_data;
 
        if (err || canceled) {
-
                goto clean;
        }
 
@@ -1735,6 +1790,7 @@ do_send_receive_performer (gboolean canceled,
  */
 void
 modest_ui_actions_do_send_receive (const gchar *account_name, 
+                                  gboolean force_connection,
                                   ModestWindow *win)
 {
        gchar *acc_name = NULL;
@@ -1766,7 +1822,8 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
                                                                     TNY_ACCOUNT_TYPE_STORE);
 
        /* Invoke the connect and perform */
-       modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, info->account, 
+       modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, 
+                                            force_connection, info->account, 
                                             do_send_receive_performer, info);
 }
 
@@ -1797,9 +1854,12 @@ modest_ui_actions_do_cancel_send (const gchar *account_name,
                             MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                             "modest: could not find send queue for account\n");
        } else {
-               /* Keeep messages in outbox folder */
-               tny_send_queue_cancel (send_queue, FALSE, &error);
-       }       
+               /* Cancel the current send */
+               tny_account_cancel (TNY_ACCOUNT (transport_account));
+
+               /* Suspend all pending messages */
+               tny_send_queue_cancel (send_queue, TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, &error);
+       }
 
  frees:
        if (transport_account != NULL) 
@@ -1845,7 +1905,8 @@ modest_ui_actions_cancel_send (GtkAction *action,  ModestWindow *win)
  * updates
  */
 void
-modest_ui_actions_do_send_receive_all (ModestWindow *win)
+modest_ui_actions_do_send_receive_all (ModestWindow *win, 
+                                      gboolean force_connection)
 {
        GSList *account_names, *iter;
 
@@ -1854,7 +1915,7 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win)
 
        iter = account_names;
        while (iter) {                  
-               modest_ui_actions_do_send_receive ((const char*) iter->data, win);
+               modest_ui_actions_do_send_receive ((const char*) iter->data, force_connection, win);
                iter = g_slist_next (iter);
        }
 
@@ -1895,8 +1956,8 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
                        g_object_unref (folder_store);
        }       
        
-       /* Refresh the active account */
-       modest_ui_actions_do_send_receive (NULL, win);
+       /* Refresh the active account. Force the connection if needed */
+       modest_ui_actions_do_send_receive (NULL, TRUE, win);
 }
 
 
@@ -1975,7 +2036,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        TnyList *headers;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
-       
+
        if (!header)
                return;
 
@@ -2032,8 +2093,6 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 {
        ModestMainWindow *win = NULL;
        GtkWidget *header_view;
-       gboolean folder_empty = FALSE;
-       gboolean all_marked_as_deleted = FALSE;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
 
@@ -2048,14 +2107,12 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                if (current_folder != NULL && folder != current_folder) {
                        g_object_unref (current_folder);
                        return;
-               }
-               g_object_unref (current_folder);
+               } else if (current_folder)
+                       g_object_unref (current_folder);
        }
 
        /* Check if folder is empty and set headers view contents style */
-       folder_empty = (tny_folder_get_all_count (folder) == 0);
-       all_marked_as_deleted = modest_header_view_is_empty (MODEST_HEADER_VIEW(header_view));
-       if (folder_empty || all_marked_as_deleted)
+       if (tny_folder_get_all_count (folder) == 0)
                modest_main_window_set_contents_style (win,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
 }
@@ -2240,14 +2297,19 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
 
        edit_window = MODEST_MSG_EDIT_WINDOW (user_data);
 
-       /* If there was any error do nothing */
-       if (modest_mail_operation_get_error (mail_op) != NULL)
-               return;
-
-       modest_msg_edit_window_set_draft (edit_window, saved_draft);
+       /* It might not be a good idea to do nothing if there was an error,
+        * so let's at least show a generic error banner. */
+       /* TODO error while saving attachment, show "Saving draft failed" banner */
+       if (modest_mail_operation_get_error (mail_op) != NULL) {
+               g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_op))->message);
+               modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+       } else {
+               modest_msg_edit_window_set_draft (edit_window, saved_draft);
+       }
+       g_object_unref(edit_window);
 }
 
-void
+gboolean
 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 {
        TnyTransportAccount *transport_account;
@@ -2255,12 +2317,32 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        MsgData *data;
        gchar *account_name, *from;
        ModestAccountMgr *account_mgr;
-       char *info_text;
+/*     char *info_text; */
+       gboolean had_error = FALSE;
+       guint64 available_disk, expected_size;
+       gint parts_count;
+       guint64 parts_size;
+       ModestMainWindow *win;
 
-       g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
+       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);
+       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) {
+               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;
+       }
+
        account_name = g_strdup (data->account_name);
        account_mgr = modest_runtime_get_account_mgr();
        if (!account_name)
@@ -2270,7 +2352,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                modest_msg_edit_window_free_msg_data (edit_window, data);
-               return;
+               return FALSE;
        }
 
        if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
@@ -2286,12 +2368,12 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                g_printerr ("modest: no transport account found for '%s'\n", account_name);
                g_free (account_name);
                modest_msg_edit_window_free_msg_data (edit_window, data);
-               return;
+               return FALSE;
        }
        from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */         
-       mail_operation = modest_mail_operation_new (G_OBJECT(edit_window));
+       mail_operation = modest_mail_operation_new (NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_save_to_drafts (mail_operation,
@@ -2308,19 +2390,28 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                                              data->images,
                                              data->priority_flags,
                                              on_save_to_drafts_cb,
-                                             edit_window);
-       info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
-       modest_platform_information_banner (NULL, NULL, info_text);
+                                             g_object_ref(edit_window));
+
+       /* Use the main window as the parent of the banner, if the
+          main window does not exist it won't be shown, if the parent
+          window exists then it's properly shown. We don't use the
+          editor window because it could be closed (save to drafts
+          could happen after closing the window */
+       win = (ModestMainWindow *)
+               modest_window_mgr_get_main_window( modest_runtime_get_window_mgr(), FALSE);
+       if (win) {
+               modest_platform_information_banner (GTK_WIDGET (win), 
+                                                   NULL, _CS("sfil_ib_saving"));
+       }
+       modest_msg_edit_window_set_modified (edit_window, FALSE);
 
        /* Frees */
-       g_free (info_text);
        g_free (from);
        g_free (account_name);
        g_object_unref (G_OBJECT (transport_account));
        g_object_unref (G_OBJECT (mail_operation));
 
        modest_msg_edit_window_free_msg_data (edit_window, data);
-       modest_msg_edit_window_reset_modified (edit_window);
 
        /* ** FIXME **
         * If the drafts folder is selected then make the header view
@@ -2337,9 +2428,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         * we find a better solution it should be removed
         * See NB#65125 (commend #18) for details.
         */
-       ModestMainWindow *win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window(
-               modest_runtime_get_window_mgr(), FALSE));
-       if (win != NULL) {
+       if (!had_error && win != NULL) {
                ModestFolderView *view = MODEST_FOLDER_VIEW(modest_main_window_get_child_widget(
                        win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW));
                if (view != NULL) {
@@ -2358,28 +2447,49 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                        if (folder != NULL) g_object_unref(folder);
                }
        }
+
+       return !had_error;
 }
 
 /* For instance, when clicking the Send toolbar button when editing a message: */
-void
+gboolean
 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;
 
-       g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
 
        if (!modest_msg_edit_window_check_names (edit_window, TRUE))
-               return;
+               return TRUE;
        
        /* FIXME: Code added just for testing. The final version will
           use the send queue provided by tinymail and some
           classifier */
        MsgData *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) {
+               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;
+       }
+
        ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
        gchar *account_name = g_strdup (data->account_name);
        if (!account_name)
-               g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
+               account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
        if (!account_name) 
                account_name = modest_account_mgr_get_default_account (account_mgr);
@@ -2387,8 +2497,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        if (!account_name) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                /* Run account setup wizard */
-               if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window)))
-                       return;
+               if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window))) {
+                       return TRUE;
+               }
        }
        
        /* Get the currently-active transport account for this modest account: */
@@ -2399,15 +2510,16 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        }
        
        if (!transport_account) {
+               modest_msg_edit_window_free_msg_data (edit_window, data);
                /* Run account setup wizard */
                if (!modest_ui_actions_run_account_setup_wizard(MODEST_WINDOW(edit_window)))
-                       return;
+                       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 (G_OBJECT(edit_window));
+       ModestMailOperation *mail_operation = modest_mail_operation_new (NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
@@ -2427,6 +2539,15 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        if (modest_mail_operation_get_status (mail_operation) == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
                modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
 
+
+       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) {
+                       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;
+               }
+       }
                                             
        /* Free data: */
        g_free (from);
@@ -2435,10 +2556,15 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        g_object_unref (G_OBJECT (mail_operation));
 
        modest_msg_edit_window_free_msg_data (edit_window, data);
-       modest_msg_edit_window_set_sent (edit_window, TRUE);
 
-       /* Save settings and close the window: */
-       modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (edit_window));
+       if (!had_error) {
+               modest_msg_edit_window_set_sent (edit_window, TRUE);
+
+               /* Save settings and close the window: */
+               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (edit_window));
+       }
+
+       return !had_error;
 }
 
 void 
@@ -2587,16 +2713,91 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
 }
 
 static void
-modest_ui_actions_new_folder_error_handler (ModestMailOperation *mail_op,
-                                            gpointer user_data)
+do_create_folder_cb (ModestMailOperation *mail_op,
+                    TnyFolderStore *parent_folder, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
 {
-       ModestMainWindow *window = MODEST_MAIN_WINDOW (user_data);
-       const GError *error = modest_mail_operation_get_error (mail_op);
+       gchar *suggested_name = (gchar *) user_data;
+       GtkWindow *source_win = (GtkWindow *) modest_mail_operation_get_source (mail_op);
 
-       if(error) {
-               modest_platform_information_banner (GTK_WIDGET (window), NULL,
+       if (modest_mail_operation_get_error (mail_op)) {
+               /* Show an error */
+               modest_platform_information_banner (GTK_WIDGET (source_win), NULL,
                                                    _("mail_in_ui_folder_create_error"));
+
+               /* Try again */
+               do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+       } else {
+               /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
+                * FIXME: any other? */         
+               GtkWidget *folder_view;
+
+               if (MODEST_IS_MAIN_WINDOW(source_win)) 
+                       folder_view = 
+                               modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source_win),
+                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+               else
+                       folder_view =
+                               get_folder_view_from_move_to_dialog (GTK_WIDGET(source_win));
+               
+               /* Select the newly created folder */
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
+                                                 new_folder, FALSE);
+               g_object_unref (new_folder);
+       }
+       /* Free. Note that the first time it'll be NULL so noop */
+       g_free (suggested_name);
+       g_object_unref (source_win);
+}
+
+static void
+do_create_folder (GtkWindow *parent_window, 
+                 TnyFolderStore *parent_folder, 
+                 const gchar *suggested_name)
+{
+       gint result;
+       gchar *folder_name = NULL;
+
+       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
+                                                       parent_folder,
+                                                       (gchar *) suggested_name,
+                                                       &folder_name);
+       
+       if (result == GTK_RESPONSE_ACCEPT) {
+               ModestMailOperation *mail_op;
+               
+               mail_op  = modest_mail_operation_new (G_OBJECT(parent_window));
+                       
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                                mail_op);
+               modest_mail_operation_create_folder (mail_op,
+                                                    parent_folder,
+                                                    (const gchar *) folder_name,
+                                                    do_create_folder_cb,
+                                                    folder_name);
+               g_object_unref (mail_op);
+       }
+}
+
+static void
+create_folder_performer (gboolean canceled, 
+                        GError *err,
+                        GtkWindow *parent_window, 
+                        TnyAccount *account, 
+                        gpointer user_data)
+{
+       TnyFolderStore *parent_folder = TNY_FOLDER_STORE (user_data);
+
+       if (canceled || err) {
+               goto frees;
        }
+
+       /* Run the new folder dialog */
+       do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
+
+ frees:
+       g_object_unref (parent_folder);
 }
 
 static void
@@ -2608,65 +2809,12 @@ modest_ui_actions_create_folder(GtkWidget *parent_window,
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        
        if (parent_folder) {
-               gboolean finished = FALSE;
-               gint result;
-               gchar *folder_name = NULL, *suggested_name = NULL;
-               const gchar *proto_str = NULL;
-               TnyAccount *account;
-
-               if (TNY_IS_ACCOUNT (parent_folder))
-                       account = g_object_ref (parent_folder);
-               else
-                       account = tny_folder_get_account (TNY_FOLDER (parent_folder));
-               proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
-
-               if (proto_str && modest_protocol_info_get_transport_store_protocol (proto_str) ==
-                   MODEST_PROTOCOL_STORE_POP) {
-                       finished = TRUE;
-                       modest_platform_information_banner (NULL, NULL, _("mail_in_ui_folder_create_error"));
-               }
-               g_object_unref (account);
-
-               /* Run the new folder dialog */
-               while (!finished) {
-                       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
-                                                                       parent_folder,
-                                                                       suggested_name,
-                                                                       &folder_name);
-
-                       g_free (suggested_name);
-                       suggested_name = NULL;
-
-                       if (result == GTK_RESPONSE_ACCEPT) {
-                               ModestMailOperation *mail_op;
-                               TnyFolder *new_folder = NULL;
-
-                               mail_op  = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
-                                                                                         modest_ui_actions_new_folder_error_handler,
-                                                                                         parent_window, NULL);
-
-                               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
-                                                                mail_op);
-                               new_folder = modest_mail_operation_create_folder (mail_op,
-                                                                                 parent_folder,
-                                                                                 (const gchar *) folder_name);
-                               if (new_folder) {
-                                       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), 
-                                                                         new_folder, TRUE);
-
-                                       g_object_unref (new_folder);
-                                       finished = TRUE;
-                               }
-                               g_object_unref (mail_op);
-                       } else {
-                               finished = TRUE;
-                       }
-
-                       suggested_name = folder_name;
-                       folder_name = NULL;
-               }
-
-               g_object_unref (parent_folder);
+               /* The parent folder will be freed in the callback */
+               modest_platform_connect_if_remote_and_perform (GTK_WINDOW (parent_window), 
+                                                              TRUE,
+                                                              parent_folder,
+                                                              create_folder_performer, 
+                                                              parent_folder);
        }
 }
 
@@ -2717,15 +2865,28 @@ typedef struct {
 } RenameFolderInfo;
 
 static void
-on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
-               TnyAccount *account, gpointer user_data)
+on_rename_folder_cb (ModestMailOperation *mail_op, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
+{
+       /* Select now */
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data),
+                                         new_folder, FALSE);
+}
+
+static void
+on_rename_folder_performer (gboolean canceled, 
+                           GError *err, 
+                           GtkWindow *parent_window, 
+                           TnyAccount *account, 
+                           gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
        GtkTreeSelection *sel = NULL;
        GtkWidget *folder_view = NULL;
        RenameFolderInfo *data = (RenameFolderInfo*)user_data;
 
-       if (MODEST_IS_MAIN_WINDOW(parent_window)) {
+       if (!canceled && (err == NULL) && MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
                                MODEST_MAIN_WINDOW (parent_window),
@@ -2743,20 +2904,12 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
                gtk_tree_selection_unselect_all (sel);
 
-               /* Select *after* the changes */
-               modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view),
-                               TNY_FOLDER(data->folder), TRUE);
-
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
-                               TNY_FOLDER (data->folder),
-                               (const gchar *) (data->new_name));
-               
-               /* TODO folder view filter refilter */
-               /* 
-               GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view));
-               if (GTK_IS_TREE_MODEL_FILTER (tree_model))
-                       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model)); */
+                                                    TNY_FOLDER (data->folder),
+                                                    (const gchar *) (data->new_name),
+                                                    on_rename_folder_cb,
+                                                    folder_view);
        }
 
        g_object_unref (mail_op);
@@ -2810,8 +2963,8 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                        RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1);
                        rename_folder_data->folder = folder;
                        rename_folder_data->new_name = folder_name;
-                       modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), 
-                                       folder, on_rename_folder_cb, rename_folder_data);
+                       modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), TRUE,
+                                       folder, on_rename_folder_performer, rename_folder_data);
                }
        }
        g_object_unref (folder);
@@ -2828,21 +2981,68 @@ modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
        g_object_unref (win);
 }
 
-static gboolean
-delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) 
+typedef struct {
+       TnyFolderStore *folder;
+       gboolean move_to_trash;
+} DeleteFolderInfo;
+
+static void
+on_delete_folder_cb (gboolean canceled, 
+                 GError *err,
+                 GtkWindow *parent_window, 
+                 TnyAccount *account, 
+                 gpointer user_data)
+{
+       DeleteFolderInfo *info = (DeleteFolderInfo*) user_data;
+       GtkWidget *folder_view;
+       ModestMailOperation *mail_op;
+       GtkTreeSelection *sel;
+       
+       if (!MODEST_IS_MAIN_WINDOW(parent_window) || canceled || (err!=NULL)) {
+               g_object_unref (G_OBJECT (info->folder));
+               g_free (info);
+               return;
+       }
+       
+       folder_view = modest_main_window_get_child_widget (
+                       MODEST_MAIN_WINDOW (parent_window),
+                       MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+
+       /* Unselect the folder before deleting it to free the headers */
+       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
+       gtk_tree_selection_unselect_all (sel);
+
+       /* Create the mail operation */
+       mail_op =
+               modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
+                               modest_ui_actions_delete_folder_error_handler,
+                               NULL, NULL);
+
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                       mail_op);
+       modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (info->folder), info->move_to_trash);
+       
+       modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
+
+       g_object_unref (G_OBJECT (mail_op));
+       g_object_unref (G_OBJECT (info->folder));
+       g_free (info);
+}
+
+static void
+delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
 {
        TnyFolderStore *folder;
        GtkWidget *folder_view;
        gint response;
        gchar *message;
-        gboolean do_delete = TRUE;
-
-       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), FALSE);
+       
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
                                                           MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
-               return FALSE;
+               return;
 
        folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
 
@@ -2851,7 +3051,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                modest_platform_run_information_dialog (GTK_WINDOW (main_window),
                                                        _("mail_in_ui_folder_delete_error"));
                g_object_unref (G_OBJECT (folder));
-               return FALSE;
+               return;
        }
 
        /* Ask the user */      
@@ -2861,38 +3061,20 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                                                            (const gchar *) message);
        g_free (message);
 
-        if (response != GTK_RESPONSE_OK) {
-                do_delete = FALSE;
-        } else if (modest_tny_folder_store_is_remote(folder) &&
-                   !tny_device_is_online (modest_runtime_get_device())) {
-                TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder));
-                do_delete = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account);
-                g_object_unref(account);
-        }
-
-       if (do_delete) {
-               ModestMailOperation *mail_op;
-               GtkTreeSelection *sel;
-
-               /* Unselect the folder before deleting it to free the headers */
-               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-               gtk_tree_selection_unselect_all (sel);
-
-               /* Create the mail operation */
-               mail_op =
-                       modest_mail_operation_new_with_error_handling (G_OBJECT(main_window),
-                                                                      modest_ui_actions_delete_folder_error_handler,
-                                                                      NULL, NULL);
-
-               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                mail_op);
-               modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
-               g_object_unref (G_OBJECT (mail_op));
+       if (response == GTK_RESPONSE_OK) {
+               DeleteFolderInfo *info;
+               info = g_new0(DeleteFolderInfo, 1);
+               info->folder = folder;
+               info->move_to_trash = move_to_trash;
+               g_object_ref (G_OBJECT (info->folder));
+               TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder));
+               modest_platform_connect_if_remote_and_perform (GTK_WINDOW (main_window), 
+                                                              TRUE,
+                                                              TNY_FOLDER_STORE (account), 
+                                                              on_delete_folder_cb, info);
+               g_object_unref (account);
        }
-
        g_object_unref (G_OBJECT (folder));
-
-       return do_delete;
 }
 
 void 
@@ -2900,14 +3082,8 @@ modest_ui_actions_on_delete_folder (GtkAction *action,
                                     ModestMainWindow *main_window)
 {
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
-
-       if (delete_folder (main_window, FALSE)) {
-               GtkWidget *folder_view;
-
-               folder_view = modest_main_window_get_child_widget (main_window,
-                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-               modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
-       }
+       
+       delete_folder (main_window, FALSE);
 }
 
 void 
@@ -2919,26 +3095,6 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainW
 }
 
 
-static void
-show_error (GtkWidget *parent_widget, const gchar* text)
-{
-       modest_platform_information_banner(parent_widget, NULL, text);
-       
-#if 0
-       GtkDialog *dialog = GTK_DIALOG (hildon_note_new_information (parent_window, text)); */
-       /*
-         GtkDialog *dialog = GTK_DIALOG (gtk_message_dialog_new (parent_window,
-         (GtkDialogFlags)0,
-         GTK_MESSAGE_ERROR,
-         GTK_BUTTONS_OK,
-         text ));
-       */
-                
-       gtk_dialog_run (dialog);
-       gtk_widget_destroy (GTK_WIDGET (dialog));
-#endif
-}
-
 void
 modest_ui_actions_on_password_requested (TnyAccountStore *account_store, 
                                         const gchar* server_account_name,
@@ -2949,6 +3105,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                                         ModestMainWindow *main_window)
 {
        g_return_if_fail(server_account_name);
+       gboolean completed = FALSE;
        
        /* Initalize output parameters: */
        if (cancel)
@@ -3066,49 +3223,58 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 */
 
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
+
+       while (!completed) {
        
-       if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-               if (username) {
-                       *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
-                       
-                       modest_account_mgr_set_server_account_username (
-                                modest_runtime_get_account_mgr(), server_account_name, 
-                                *username);
-                                
-                       const gboolean username_was_changed = 
-                               (strcmp (*username, initial_username) != 0);
-                       if (username_was_changed) {
-                               g_warning ("%s: tinymail does not yet support changing the "
-                                       "username in the get_password() callback.\n", __FUNCTION__);
+               if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+                       if (username) {
+                               *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
+                               
+                               /* Note that an empty field becomes the "" string */
+                               if (*username && strlen (*username) > 0) {
+                                       modest_account_mgr_set_server_account_username (modest_runtime_get_account_mgr(), 
+                                                                                       server_account_name, 
+                                                                                       *username);
+                                       completed = TRUE;
+                               
+                                       const gboolean username_was_changed = 
+                                               (strcmp (*username, initial_username) != 0);
+                                       if (username_was_changed) {
+                                               g_warning ("%s: tinymail does not yet support changing the "
+                                                          "username in the get_password() callback.\n", __FUNCTION__);
+                                       }
+                               } else {
+                                       /* Show error */
+                                       modest_platform_information_banner (GTK_WIDGET (dialog), NULL, 
+                                                                           _("mcen_ib_username_pw_incorrect"));
+                                       completed = FALSE;
+                               }
                        }
-               }
                        
-               if (password) {
-                       *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
+                       if (password) {
+                               *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
                        
-                       /* We do not save the password in the configuration, 
-                        * because this function is only called for passwords that should 
-                        * not be remembered:
-                       modest_server_account_set_password (
+                               /* We do not save the password in the configuration, 
+                                * because this function is only called for passwords that should 
+                                * not be remembered:
+                                modest_server_account_set_password (
                                 modest_runtime_get_account_mgr(), server_account_name, 
                                 *password);
-                       */
+                                */
+                       }                       
+                       if (cancel)
+                               *cancel   = FALSE;                      
+               } else {
+                       modest_platform_information_banner(GTK_WIDGET (dialog), 
+                                                          NULL, _("mail_ib_login_cancelled"));
+                       completed = TRUE;
+                       if (username)
+                               *username = NULL;                       
+                       if (password)
+                               *password = NULL;                       
+                       if (cancel)
+                               *cancel   = TRUE;
                }
-               
-               if (cancel)
-                       *cancel   = FALSE;
-                       
-       } else {
-               show_error(GTK_WIDGET (main_window), _("mail_ib_login_cancelled"));
-               
-               if (username)
-                       *username = NULL;
-                       
-               if (password)
-                       *password = NULL;
-                       
-               if (cancel)
-                       *cancel   = TRUE;
        }
 
 /* This is not in the Maemo UI spec:
@@ -3140,9 +3306,11 @@ modest_ui_actions_on_cut (GtkAction *action,
                GtkTextBuffer *buffer;
 
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
-               gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
-               gtk_clipboard_set_can_store (clipboard, NULL, 0);
-               gtk_clipboard_store (clipboard);
+               if (modest_text_utils_buffer_selection_is_valid (buffer)) {
+                       gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
+                       gtk_clipboard_set_can_store (clipboard, NULL, 0);
+                       gtk_clipboard_store (clipboard);
+               }
        } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
                TnyList *header_list = modest_header_view_get_selected_headers (
                                MODEST_HEADER_VIEW (focused_widget));
@@ -3182,7 +3350,10 @@ modest_ui_actions_on_copy (GtkAction *action,
        focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
 
        if (GTK_IS_LABEL (focused_widget)) {
-               gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
+               gchar *selection;
+               selection = modest_text_utils_label_get_selection (GTK_LABEL (focused_widget));
+               gtk_clipboard_set_text (clipboard, selection, -1);
+               g_free (selection);
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
                gtk_clipboard_store (clipboard);
        } else if (GTK_IS_EDITABLE (focused_widget)) {
@@ -3196,9 +3367,11 @@ modest_ui_actions_on_copy (GtkAction *action,
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
-               gtk_text_buffer_copy_clipboard (buffer, clipboard);
-               gtk_clipboard_set_can_store (clipboard, NULL, 0);
-               gtk_clipboard_store (clipboard);
+               if (modest_text_utils_buffer_selection_is_valid (buffer)) {
+                       gtk_text_buffer_copy_clipboard (buffer, clipboard);
+                       gtk_clipboard_set_can_store (clipboard, NULL, 0);
+                       gtk_clipboard_store (clipboard);
+               }
        } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
                TnyList *header_list = modest_header_view_get_selected_headers (
                                MODEST_HEADER_VIEW (focused_widget));
@@ -3265,7 +3438,17 @@ modest_ui_actions_on_redo (GtkAction *action,
 
 
 static void
-destroy_information_note (ModestMailOperation *mail_op, gpointer user_data)
+destroy_information_note (ModestMailOperation *mail_op, 
+                         gpointer user_data)
+{
+       /* destroy information note */
+       gtk_widget_destroy (GTK_WIDGET(user_data));
+}
+
+static void
+destroy_folder_information_note (ModestMailOperation *mail_op, 
+                                TnyFolder *new_folder,
+                                gpointer user_data)
 {
        /* destroy information note */
        gtk_widget_destroy (GTK_WIDGET(user_data));
@@ -3410,7 +3593,7 @@ modest_ui_actions_on_paste (GtkAction *action,
                                                           src_folder,
                                                           folder_store,
                                                           delete,
-                                                          destroy_information_note,
+                                                          destroy_folder_information_note,
                                                           inf_note);
                }
 
@@ -3752,18 +3935,27 @@ modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
        modest_msg_edit_window_select_font (window);
 }
 
+
 void
 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
                                                  const gchar *display_name,
                                                  GtkWindow *window)
 {
+       /* don't update the display name if it was already set;
+        * updating the display name apparently is expensive */
+       const gchar* old_name = gtk_window_get_title (window);
+
+       if (display_name == NULL)
+               display_name = " ";
+
+       if (old_name && display_name && strcmp (old_name, display_name) == 0)
+               return; /* don't do anything */
+
        /* This is usually used to change the title of the main window, which
         * is the one that holds the folder view. Note that this change can
         * happen even when the widget doesn't have the focus. */
-       if (display_name)
-               gtk_window_set_title (window, display_name);
-       else
-               gtk_window_set_title (window, " ");
+       gtk_window_set_title (window, display_name);
+
 }
 
 void
@@ -3810,9 +4002,11 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        GtkWidget *folder_view = NULL;
        ModestTnyFolderRules rules;
 
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW(self));
+       
        if (!selected)
                return;
-
+       
        /* Get the OK button */
        dialog = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_DIALOG);
        if (!dialog)
@@ -3835,10 +4029,15 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
 
                if ((gpointer) local_account != (gpointer) folder_store &&
                    (gpointer) mmc_account != (gpointer) folder_store) {
+                       const char *proto_name = tny_account_get_proto (TNY_ACCOUNT (folder_store));
+                       ModestTransportStoreProtocol proto = MODEST_PROTOCOL_STORE_MAILDIR;
+                       if (proto_name != NULL) {
+                               proto = modest_protocol_info_get_transport_store_protocol (proto_name);
+                       }
                        is_local_account = FALSE;
                        /* New button should be dimmed on remote
-                          account root */
-                       new_sensitive = FALSE;
+                          POP account root */
+                       new_sensitive = (proto != MODEST_PROTOCOL_STORE_POP);
                }
                g_object_unref (local_account);
        }
@@ -3889,25 +4088,36 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                }
                g_object_unref (moved_folder);
        } else {
-               TnyHeader *header = NULL;
                TnyFolder *src_folder = NULL;
 
                /* Moving a message */
                if (MODEST_IS_MSG_VIEW_WINDOW (user_data)) {
-                       header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (user_data));
-                       src_folder = tny_header_get_folder (header);
-                       g_object_unref (header);
+
+                       TnyHeader *header = NULL;
+                       header = modest_msg_view_window_get_header
+                               (MODEST_MSG_VIEW_WINDOW (user_data));
+                       if (!TNY_IS_HEADER(header))
+                               g_warning ("%s: could not get source header", __FUNCTION__);
+                       else
+                               src_folder = tny_header_get_folder (header);
+
+                       if (header)
+                               g_object_unref (header);
                } else {
                        src_folder = 
-                               TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
+                               TNY_FOLDER (modest_folder_view_get_selected
+                                           (MODEST_FOLDER_VIEW (folder_view)));
                }
 
-               /* Do not allow to move the msg to the same folder */
-               /* Do not allow to move the msg to an account */
-               if ((gpointer) src_folder == (gpointer) folder_store ||
-                   TNY_IS_ACCOUNT (folder_store))
-                       ok_sensitive = FALSE;
-               g_object_unref (src_folder);
+               if (TNY_IS_FOLDER(src_folder)) {
+                       /* Do not allow to move the msg to the same folder */
+                       /* Do not allow to move the msg to an account */
+                       if ((gpointer) src_folder == (gpointer) folder_store ||
+                           TNY_IS_ACCOUNT (folder_store))
+                               ok_sensitive = FALSE;
+                       g_object_unref (src_folder);
+               } else
+                       g_warning ("%s: could not get source folder", __FUNCTION__);
        }
 
  end:
@@ -3917,6 +4127,16 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        gtk_widget_set_sensitive (new_button, new_sensitive);
 }
 
+
+#define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view"
+
+static GtkWidget*
+get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog)
+{
+       return GTK_WIDGET(g_object_get_data (G_OBJECT(move_to_dialog),
+                                            MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
+}
+
 static GtkWidget*
 create_move_to_dialog (GtkWindow *win,
                       GtkWidget *folder_view,
@@ -4005,9 +4225,16 @@ create_move_to_dialog (GtkWindow *win,
                }
        }
 
+       /* we keep a pointer to the embedded folder view, so we can retrieve it with
+        *   get_folder_view_from_move_to_dialog 
+        * (see above) later (needed for focus handling) 
+        */
+       g_object_set_data (G_OBJECT(dialog), MODEST_MOVE_TO_DIALOG_FOLDER_VIEW, *tree_view);
+
+       
        /* Hide special folders */
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (*tree_view), FALSE);
-       
+
        gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
 
        /* Add scroll to dialog */
@@ -4117,10 +4344,9 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
        return response;
 }
 
-
-
 static void
-move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
+move_to_cb (ModestMailOperation *mail_op, 
+           gpointer user_data)
 {
        MoveToHelper *helper = (MoveToHelper *) user_data;
 
@@ -4133,10 +4359,11 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
                if (MODEST_IS_MSG_VIEW_WINDOW (object)) {
                        ModestMsgViewWindow *self = MODEST_MSG_VIEW_WINDOW (object);
 
-                       if (!modest_msg_view_window_select_next_message (self))
-                               if (!modest_msg_view_window_select_previous_message (self))
-                                       /* No more messages to view, so close this window */
-                                       modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
+                       if (!modest_msg_view_window_select_next_message (self) &&
+                           !modest_msg_view_window_select_previous_message (self)) {
+                               /* No more messages to view, so close this window */
+                               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
+                       }
                } else if (MODEST_IS_MAIN_WINDOW (object) && helper->reference != NULL) {
                        GtkWidget *header_view;
                        GtkTreePath *path;
@@ -4159,22 +4386,37 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
        g_free (helper);
 }
 
+static void
+folder_move_to_cb (ModestMailOperation *mail_op, 
+                  TnyFolder *new_folder,
+                  gpointer user_data)
+{
+       GtkWidget *folder_view;
+       GObject *object;
+
+       object = modest_mail_operation_get_source (mail_op);
+       folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(object),
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+       g_object_ref (folder_view);
+       g_object_unref (object);
+       move_to_cb (mail_op, user_data);
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), new_folder, FALSE);
+       g_object_unref (folder_view);
+}
+
+static void
+msgs_move_to_cb (ModestMailOperation *mail_op, 
+                gpointer user_data)
+{
+       move_to_cb (mail_op, user_data);
+}
+
 void
 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, 
                                             gpointer user_data)
 {
        ModestWindow *main_window = NULL;
        GObject *win = NULL;
-       const GError *error = NULL;
-       const gchar *message = NULL;
-       
-       /* Get error message */
-       error = modest_mail_operation_get_error (mail_op);
-       if (error != NULL && error->message != NULL) {
-               message = error->message;
-       } else {
-               message = _("mail_in_ui_folder_move_target_error");
-       }
        
        /* Disable next automatic folder selection */
        main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
@@ -4194,7 +4436,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 
        /* Show notification dialog */
        win = modest_mail_operation_get_source (mail_op);
-       modest_platform_run_information_dialog ((GtkWindow *) win, message);
+       modest_platform_run_information_dialog ((GtkWindow *) win, _("mail_in_ui_folder_move_target_error"));
        if (win)
                g_object_unref (win);
 }
@@ -4287,6 +4529,7 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
 
                                tny_iterator_next (iter);
                        }
+                       g_object_unref (iter);
                        
                        tny_msg_rewrite_cache (msg);
                }
@@ -4294,7 +4537,6 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
                /* This string no longer exists, refer to NB#75415 for more info */
                /* modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); */
        }
-       g_object_unref (iter);
 
        modest_window_mgr_unregister_header (mgr, header);
 
@@ -4307,7 +4549,6 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
 {
        GtkWidget *header_view;
        TnyList *header_list;
-       TnyIterator *iter;
        TnyHeader *header;
        TnyHeaderFlags flags;
        ModestWindow *msg_view_window =  NULL;
@@ -4325,7 +4566,7 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
        }
        
        if (tny_list_get_length (header_list) == 1) {
-               iter = tny_list_create_iterator (header_list);
+               TnyIterator *iter = tny_list_create_iterator (header_list);
                header = TNY_HEADER (tny_iterator_get_current (iter));
                g_object_unref (iter);
        } else
@@ -4365,23 +4606,109 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
                g_object_unref (header_list);
 }
 
+/*
+ * Checks if we need a connection to do the transfer and if the user
+ * wants to connect to complete it
+ */
+void
+modest_ui_actions_xfer_messages_check (GtkWindow *parent_window,
+                                      TnyFolderStore *src_folder,
+                                      TnyList *headers,
+                                      TnyFolder *dst_folder,
+                                      gboolean delete_originals,
+                                      gboolean *need_connection,
+                                      gboolean *do_xfer)
+{
+       TnyAccount *src_account;
+       gint uncached_msgs = 0;
+
+       uncached_msgs = header_list_count_uncached_msgs (headers);
+
+       /* We don't need any further check if
+        *
+        * 1- the source folder is local OR
+        * 2- the device is already online
+        */
+       if (!modest_tny_folder_store_is_remote (src_folder) ||
+           tny_device_is_online (modest_runtime_get_device())) {
+               *need_connection = FALSE;
+               *do_xfer = TRUE;
+               return;
+       }
+
+       /* We must ask for a connection when
+        *
+        *   - the message(s) is not already cached   OR 
+        *   - the message(s) is cached but the leave_on_server setting
+        * is FALSE (because we need to sync the source folder to
+        * delete the message from the server (for IMAP we could do it
+        * offline, it'll take place the next time we get a
+        * connection)
+        */
+       src_account = get_account_from_folder_store (src_folder);
+       if (uncached_msgs > 0) {
+               guint num_headers;
+               const gchar *msg;
+
+               *need_connection = TRUE;
+               num_headers = tny_list_get_length (headers);
+               msg = ngettext ("mcen_nc_get_msg", "mcen_nc_get_msgs", num_headers);
+
+               if (modest_platform_run_confirmation_dialog (parent_window, msg) ==
+                   GTK_RESPONSE_CANCEL) {
+                       *do_xfer = FALSE;
+               } else {
+                       *do_xfer = TRUE;
+               }
+       } else {
+               /* The transfer is possible and the user wants to */
+               *do_xfer = TRUE;
+
+               if (remote_folder_is_pop (src_folder) && delete_originals) {
+                       const gchar *account_name;
+                       gboolean leave_on_server;
+                       
+                       account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (src_account);
+                       leave_on_server = modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
+                                                                                 account_name);
+                       
+                       if (leave_on_server == TRUE) {
+                               *need_connection = FALSE;
+                       } else {
+                               *need_connection = TRUE;
+                       }
+               } else {
+                       *need_connection = FALSE;
+               }
+       }
+
+       /* Frees */
+       g_object_unref (src_account);
+}
+
+
 /**
  * Utility function that transfer messages from both the main window
  * and the msg view window when using the "Move to" dialog
  */
 static void
-modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
-                                             ModestWindow *win)
-{
+xfer_messages_performer  (gboolean canceled, 
+                         GError *err,
+                         GtkWindow *parent_window, 
+                         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;
 
-       if (!TNY_IS_FOLDER (dst_folder)) {
-               modest_platform_information_banner (GTK_WIDGET (win),
-                                                   NULL,
-                                                   _CS("ckdg_ib_unable_to_move_to_current_location"));
+       if (canceled || err) {
+               /* Show the proper error message */
+               modest_ui_actions_on_account_connection_error (parent_window, account);
+               g_object_unref (dst_folder);
                return;
        }
 
@@ -4439,11 +4766,94 @@ modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
                                         headers,
                                         TNY_FOLDER (dst_folder),
                                         TRUE,
-                                        move_to_cb,
+                                        msgs_move_to_cb,
                                         helper);
 
        g_object_unref (G_OBJECT (mail_op));
        g_object_unref (headers);
+       g_object_unref (dst_folder);
+}
+
+typedef struct {
+       TnyFolder *src_folder;
+       TnyFolderStore *dst_folder;
+       gboolean delete_original;
+       GtkWidget *folder_view;
+} MoveFolderInfo;
+
+static void
+on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
+               TnyAccount *account, gpointer user_data)
+{
+       MoveFolderInfo *info = (MoveFolderInfo*)user_data;
+       GtkTreeSelection *sel;
+       ModestMailOperation *mail_op = NULL;
+       
+       if (canceled || err || !MODEST_IS_MAIN_WINDOW (parent_window)) {
+               g_object_unref (G_OBJECT (info->src_folder));
+               g_object_unref (G_OBJECT (info->dst_folder));
+               g_free (info);
+               return;
+       }
+       
+       MoveToHelper *helper = g_new0 (MoveToHelper, 1);
+       helper->banner = modest_platform_animation_banner (GTK_WIDGET (parent_window), NULL,
+                       _CS("ckct_nw_pasting"));
+       if (helper->banner != NULL)  {
+               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
+               gtk_widget_show (GTK_WIDGET(helper->banner));
+       }
+       /* Clean folder on header view before moving it */
+       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (info->folder_view));
+       gtk_tree_selection_unselect_all (sel);
+
+       /* Let gtk events run. We need that the folder
+          view frees its reference to the source
+          folder *before* issuing the mail operation
+          so we need the signal handler of selection
+          changed to happen before the mail
+          operation 
+       while (gtk_events_pending ())
+               gtk_main_iteration ();   */
+
+       mail_op =
+               modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
+                               modest_ui_actions_move_folder_error_handler,
+                               info->src_folder, NULL);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                       mail_op);
+
+       /* Select *after* the changes */
+       /* TODO: this function hangs UI after transfer */ 
+       /*                      modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
+       /*                                                        TNY_FOLDER (src_folder), TRUE); */
+
+       modest_mail_operation_xfer_folder (mail_op,
+                       TNY_FOLDER (info->src_folder),
+                       info->dst_folder,
+                       info->delete_original, 
+                       folder_move_to_cb, 
+                       helper);
+
+       if (modest_mail_operation_get_status (mail_op) == MODEST_MAIL_OPERATION_STATUS_SUCCESS) {       
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
+                                                 TNY_FOLDER (info->dst_folder), TRUE);
+       }
+       
+       /* Unref mail operation */
+       g_object_unref (G_OBJECT (mail_op));
+       g_object_unref (G_OBJECT (info->src_folder));
+       g_object_unref (G_OBJECT (info->dst_folder));
+       g_free (user_data);
+}
+
+static TnyAccount *
+get_account_from_folder_store (TnyFolderStore *folder_store) 
+{
+       if (TNY_IS_ACCOUNT (folder_store))
+               return g_object_ref (folder_store);
+       else
+               return tny_folder_get_account (TNY_FOLDER (folder_store));
 }
 
 /*
@@ -4457,9 +4867,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                                          ModestMainWindow *win)
 {
        ModestHeaderView *header_view = NULL;
-       ModestMailOperation *mail_op = NULL;
-       TnyFolderStore *src_folder;
-        gboolean online = (tny_device_is_online (modest_runtime_get_device()));
+       TnyFolderStore *src_folder = NULL;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
 
@@ -4471,89 +4879,88 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
 
        /* Get folder or messages to transfer */
        if (gtk_widget_is_focus (folder_view)) {
-               GtkTreeSelection *sel;
-                gboolean do_xfer = TRUE;
+               gboolean do_xfer = TRUE;
 
                /* Allow only to transfer folders to the local root folder */
                if (TNY_IS_ACCOUNT (dst_folder) && 
-                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) {
+                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder) &&
+                   !modest_tny_account_is_memory_card_account (TNY_ACCOUNT (dst_folder))) {
                        do_xfer = FALSE;
-                } else if (!TNY_IS_FOLDER (src_folder)) {
+               } else if (!TNY_IS_FOLDER (src_folder)) {
                        g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
-                        do_xfer = FALSE;
-                } else if (!online && modest_tny_folder_store_is_remote(src_folder)) {
-                        guint num_headers = tny_folder_get_all_count(TNY_FOLDER (src_folder));
-                       TnyAccount *account = tny_folder_get_account (TNY_FOLDER (src_folder));
-                        if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
-                                do_xfer = FALSE;
-                       g_object_unref (account);
-                }
+                       do_xfer = FALSE;
+               }
 
-                if (do_xfer) {
-                        MoveToHelper *helper = g_new0 (MoveToHelper, 1);
-                        helper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
-                                                                          _CS("ckct_nw_pasting"));
-                        if (helper->banner != NULL)  {
-                                gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
-                                gtk_widget_show (GTK_WIDGET(helper->banner));
-                        }
-                        /* Clean folder on header view before moving it */
-                        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-                        gtk_tree_selection_unselect_all (sel);
-
-                       /* Let gtk events run. We need that the folder
-                          view frees its reference to the source
-                          folder *before* issuing the mail operation
-                          so we need the signal handler of selection
-                          changed to happen before the mail
-                          operation */
-                       while (gtk_events_pending ())
-                               gtk_main_iteration ();
-
-                        mail_op =
-                          modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                                         modest_ui_actions_move_folder_error_handler,
-                                                                         src_folder, NULL);
-                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                         mail_op);
-
-                       /* Select *after* the changes */
-                       /* TODO: this function hangs UI after transfer */ 
-/*                     modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
-/*                                                       TNY_FOLDER (src_folder), TRUE); */
-                       
-                        modest_mail_operation_xfer_folder (mail_op,
-                                                           TNY_FOLDER (src_folder),
-                                                           dst_folder,
-                                                           TRUE, 
-                                                          move_to_cb, 
-                                                          helper);
-                        /* Unref mail operation */
-                        g_object_unref (G_OBJECT (mail_op));
-                }
+               if (do_xfer) {                  
+                       MoveFolderInfo *info = g_new0 (MoveFolderInfo, 1);
+                       DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
+
+                       info->src_folder = g_object_ref (src_folder);
+                       info->dst_folder = g_object_ref (dst_folder);
+                       info->delete_original = TRUE;
+                       info->folder_view = folder_view;
+
+                       connect_info->callback = on_move_folder_cb;
+                       connect_info->dst_account = get_account_from_folder_store (TNY_FOLDER_STORE (dst_folder));
+                       connect_info->data = info;
+
+                       modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
+                                                                  TNY_FOLDER_STORE (src_folder), 
+                                                                  connect_info);
+               }
        } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
-                gboolean do_xfer = TRUE;
-                /* Ask for confirmation if the source folder is remote and we're not connected */
-                if (!online && modest_tny_folder_store_is_remote(src_folder)) {
-                        TnyList *headers = modest_header_view_get_selected_headers(header_view);
-                        if (!msgs_already_deleted_from_server(headers, src_folder)) {
-                                guint num_headers = tny_list_get_length(headers);
-                               TnyAccount *account = get_account_from_header_list (headers);
-                                if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
-                                        do_xfer = FALSE;
-                               g_object_unref (account);
-                        }
-                        g_object_unref(headers);
-                }
-                if (do_xfer) /* Transfer messages */
-                        modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
+               TnyList *headers;
+
+               headers = modest_header_view_get_selected_headers(header_view);
+
+               /* Transfer the messages */
+               transfer_messages_helper (GTK_WINDOW (win), TNY_FOLDER (src_folder), 
+                                         headers, TNY_FOLDER (dst_folder));
+
+               g_object_unref (headers);
        }
 
-    if (src_folder)
-       g_object_unref (src_folder);
+       /* Frees */
+       g_object_unref (src_folder);
 }
 
 
+static void
+transfer_messages_helper (GtkWindow *win,
+                         TnyFolder *src_folder,
+                         TnyList *headers,
+                         TnyFolder *dst_folder)
+{
+       gboolean need_connection = TRUE;
+       gboolean do_xfer = TRUE;
+       
+       modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder), 
+                                              headers, TNY_FOLDER (dst_folder),
+                                              TRUE, &need_connection, 
+                                              &do_xfer);
+
+       /* If we don't want to transfer just return */
+       if (!do_xfer)
+               return;
+
+       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);
+               
+               modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
+                                                          TNY_FOLDER_STORE (src_folder), 
+                                                          connect_info);
+       } 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));
+               g_object_unref (src_account);
+       }
+}
+
 /*
  * UI handler for the "Move to" action when invoked from the
  * ModestMsgViewWindow
@@ -4563,34 +4970,25 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
                                              TnyFolderStore *dst_folder,
                                              ModestMsgViewWindow *win)
 {
+       TnyList *headers = NULL;
        TnyHeader *header = NULL;
        TnyFolder *src_folder = NULL;
-       TnyAccount *account = NULL;
-       gboolean do_xfer = FALSE;
+
+       g_return_if_fail (TNY_IS_FOLDER (dst_folder));
 
        /* Create header list */
-       header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));              
+       header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
        src_folder = TNY_FOLDER (tny_header_get_folder(header));
-       g_object_unref (header);
+       headers = tny_simple_list_new ();
+       tny_list_append (headers, G_OBJECT (header));
 
-       account = tny_folder_get_account (src_folder);
-       if (!modest_tny_folder_store_is_remote(TNY_FOLDER_STORE(src_folder))) {
-               /* Transfer if the source folder is local */
-               do_xfer = TRUE;
-       } else if (remote_folder_is_pop(TNY_FOLDER_STORE(src_folder))) {
-               /* Transfer if the source folder is POP (as it means
-                * that the message is already downloaded) */
-               do_xfer = TRUE;
-       } else if (connect_to_get_msg(MODEST_WINDOW(win), 1, account)) {
-               /* Transfer after asking confirmation */
-               do_xfer = TRUE;
-       }
-
-       if (do_xfer) {
-               modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
-        }
-       g_object_unref (account);
-       g_object_unref (src_folder);
+       /* Transfer the messages */
+       transfer_messages_helper (GTK_WINDOW (win), src_folder, headers, 
+                                 TNY_FOLDER (dst_folder));
+
+       /* Frees */
+       g_object_unref (header);
+       g_object_unref (headers);
 }
 
 void 
@@ -4632,17 +5030,17 @@ modest_ui_actions_on_move_to (GtkAction *action,
                return;
 
        dst_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
-        /* Do window specific stuff */
-        if (MODEST_IS_MAIN_WINDOW (win)) {
-                modest_ui_actions_on_main_window_move_to (action,
-                                                          folder_view,
-                                                          dst_folder,
-                                                          MODEST_MAIN_WINDOW (win));
-        } else {
-                modest_ui_actions_on_msg_view_window_move_to (action,
-                                                              dst_folder,
-                                                              MODEST_MSG_VIEW_WINDOW (win));
-        }
+       /* Do window specific stuff */
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               modest_ui_actions_on_main_window_move_to (action,
+                               folder_view,
+                               dst_folder,
+                               MODEST_MAIN_WINDOW (win));
+       } else {
+               modest_ui_actions_on_msg_view_window_move_to (action,
+                               dst_folder,
+                               MODEST_MSG_VIEW_WINDOW (win));
+       }
 
        if (dst_folder)
                g_object_unref (dst_folder);
@@ -4775,7 +5173,6 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               /* Show an error ? */
                goto out;
        }
 
@@ -4818,7 +5215,7 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
        g_object_unref (iter);
 
        /* Connect and perform the message retrieval */
-       modest_platform_connect_and_perform ((GtkWindow *) window, 
+       modest_platform_connect_and_perform ((GtkWindow *) window, TRUE,
                                             g_object_ref (account), 
                                             retrieve_msg_contents_performer, 
                                             g_object_ref (headers));
@@ -4829,13 +5226,31 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
 }
 
 void
+modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (window));
+
+       /* Update dimmed */
+       modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_TOOLBAR);
+}
+
+void
+modest_ui_actions_check_menu_dimming_rules (ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (window));
+
+       /* Update dimmed */
+       modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_MENU);
+}
+
+void
 modest_ui_actions_on_email_menu_activated (GtkAction *action,
                                          ModestWindow *window)
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
        
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4844,8 +5259,8 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4854,8 +5269,8 @@ modest_ui_actions_on_view_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4864,8 +5279,8 @@ modest_ui_actions_on_format_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4874,8 +5289,8 @@ modest_ui_actions_on_tools_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4884,8 +5299,8 @@ modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4894,8 +5309,8 @@ modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4904,8 +5319,8 @@ modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4914,17 +5329,8 @@ modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
-}
-
-void
-modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
-{
-       g_return_if_fail (MODEST_IS_WINDOW (window));
-
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");  
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -5018,7 +5424,7 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
        gchar *message = NULL;
 
        /* Don't show anything if the user cancelled something */
-       if (err->code == TNY_TRANSPORT_ACCOUNT_ERROR_SEND_USER_CANCEL)
+       if (err->code == TNY_SYSTEM_ERROR_CANCEL)
                return;
 
        /* Get the server name: */
@@ -5035,20 +5441,23 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
 
        /* Show the appropriate message text for the GError: */
        switch (err->code) {
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_HOST_LOOKUP_FAILED:
-               message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
-               break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_SERVICE_UNAVAILABLE:
+       case TNY_SERVICE_ERROR_CONNECT:
                message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
                break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_AUTHENTICATION_NOT_SUPPORTED:
+       case TNY_SERVICE_ERROR_AUTHENTICATE:
                message = g_strdup_printf (_("emev_ni_ui_smtp_authentication_fail_error"), server_name);
                break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND:
+       case TNY_SERVICE_ERROR_SEND:
                message = g_strdup (_("emev_ib_ui_smtp_send_error"));
                break;
+       case TNY_SERVICE_ERROR_UNAVAILABLE:
+               message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
+               break;
        default:
-               g_return_if_reached ();
+               g_warning ("%s: unexpected ERROR %d",
+                          __FUNCTION__, err->code);
+               message = g_strdup (_("emev_ib_ui_smtp_send_error"));
+               break;  
        }
        
        /* TODO if the username or the password where not defined we
@@ -5100,6 +5509,10 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
 #else
        gtk_widget_queue_draw (header_view);
 #endif         
+
+       /* Rerun dimming rules, because the message could become deletable for example */
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), 
+                                                MODEST_DIMMING_RULES_TOOLBAR);
        
        /* Free */
  frees:
@@ -5140,3 +5553,54 @@ modest_ui_actions_on_account_connection_error (GtkWindow *parent_window,
                g_free (error_note);
        }
 }
+
+gchar *
+modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
+{
+       gchar *msg = NULL;
+       TnyFolderStore *folder = NULL;
+       TnyAccount *account = NULL;
+       ModestTransportStoreProtocol proto;
+       TnyHeader *header = NULL;
+
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               GtkWidget *header_view;
+               TnyList* headers = NULL;
+               TnyIterator *iter;
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+               headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
+               if (!headers || tny_list_get_length (headers) == 0) {
+                       if (headers)
+                               g_object_unref (headers);
+                       return NULL;
+               }
+               iter = tny_list_create_iterator (headers);
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
+               g_object_unref (iter);
+               g_object_unref (headers);
+       } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
+               folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
+       }
+
+       /* Get the account type */
+       account = tny_folder_get_account (TNY_FOLDER (folder));
+       proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
+       if (proto == MODEST_PROTOCOL_STORE_POP) {
+               msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
+       } else if (proto == MODEST_PROTOCOL_STORE_IMAP) {
+               msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), 
+                                      tny_header_get_subject (header));
+       } else {
+               msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
+       }
+
+       /* Frees */
+       g_object_unref (account);
+       g_object_unref (folder);
+       g_object_unref (header);
+
+       return msg;
+}