remove all gtk3 conditionals
[claws.git] / src / prefs_account.c
index 7f53ecb02ba144b1f0ddeeca68491391dd302b92..5f1cc8fdd9a9a0b7b000561ec479ee96d5022b29 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2015 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * 
  */
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
 #include "main.h"
 #include "prefs_gtk.h"
 #include "prefs_account.h"
+#include "prefs_receive.h"
 #include "prefs_common.h"
 #include "prefs_customheader.h"
 #include "account.h"
 #include "mainwindow.h"
 #include "manage_window.h"
+#include "folder.h"
 #include "foldersel.h"
 #include "inc.h"
 #include "menu.h"
 #include "smtp.h"
 #include "imap.h"
 #include "remotefolder.h"
-#include "base64.h"
 #include "combobox.h"
 #include "setup.h"
 #include "quote_fmt.h"
 #include "hooks.h"
+#include "privacy.h"
 #include "inputdialog.h"
 #include "ssl_certificate.h"
+#include "passwordstore.h"
+#include "file-utils.h"
 
 static gboolean cancelled;
 static gboolean new_account;
@@ -79,6 +83,12 @@ static GtkWidget *in_ssl_cert_browse_button;
 static GtkWidget *out_ssl_cert_browse_button;
 #endif
 
+struct AutocheckWidgets {
+       GtkWidget *autochk_hour_spinbtn;
+       GtkWidget *autochk_min_spinbtn;
+       GtkWidget *autochk_sec_spinbtn;
+};
+
 static GSList *prefs_pages = NULL;
 
 typedef struct BasicPage
@@ -114,6 +124,10 @@ typedef struct BasicPage
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkWidget *showpwd_checkbtn;
+       GtkWidget *auto_configure_btn;
+       GtkWidget *auto_configure_cancel_btn;
+       GtkWidget *auto_configure_lbl;
 } BasicPage;
 
 typedef struct ReceivePage
@@ -133,6 +147,8 @@ typedef struct ReceivePage
        GtkWidget *inbox_entry;
        GtkWidget *inbox_btn;
 
+       GtkWidget *autochk_frame;
+
        GtkWidget *local_frame;
        GtkWidget *local_inbox_label;
        GtkWidget *local_inbox_entry;
@@ -152,7 +168,11 @@ typedef struct ReceivePage
        GtkWidget *frame_maxarticle;
        GtkWidget *maxarticle_label;
        GtkWidget *maxarticle_spinbtn;
-       GtkObject *maxarticle_spinbtn_adj;
+       GtkAdjustment *maxarticle_spinbtn_adj;
+
+       GtkWidget *autochk_checkbtn;
+       GtkWidget *autochk_use_default_checkbtn;
+       struct AutocheckWidgets *autochk_widgets;
 } ReceivePage;
 
 typedef struct SendPage
@@ -261,9 +281,28 @@ typedef struct SSLPage
        GtkWidget *entry_out_cert_file;
        GtkWidget *entry_out_cert_pass;
 
+       GtkWidget *ssl_certs_auto_accept_checkbtn;
        GtkWidget *use_nonblocking_ssl_checkbtn;
 } SSLPage;
 
+typedef struct ProxyPage
+{
+       PrefsPage page;
+
+       GtkWidget *vbox;
+
+       GtkWidget *proxy_checkbtn;
+       GtkWidget *default_proxy_checkbtn;
+       GtkWidget *socks4_radiobtn;
+       GtkWidget *socks5_radiobtn;
+       GtkWidget *proxy_host_entry;
+       GtkWidget *proxy_port_spinbtn;
+       GtkWidget *proxy_auth_checkbtn;
+       GtkWidget *proxy_name_entry;
+       GtkWidget *proxy_pass_entry;
+       GtkWidget *proxy_send_checkbtn;
+} ProxyPage;
+
 typedef struct AdvancedPage
 {
     PrefsPage page;
@@ -299,7 +338,6 @@ typedef struct AdvancedPage
        GtkWidget *draft_folder_entry;
        GtkWidget *trash_folder_checkbtn;
        GtkWidget *trash_folder_entry;
-       GtkWidget *imap_use_trash_checkbtn;
 } AdvancedPage;
 
 static BasicPage basic_page;
@@ -311,6 +349,7 @@ static PrivacyPage privacy_page;
 #ifdef USE_GNUTLS
 static SSLPage ssl_page;
 #endif
+static ProxyPage proxy_page;
 static AdvancedPage advanced_page;
 
 struct BasicProtocol {
@@ -322,10 +361,8 @@ struct BasicProtocol {
 };
 
 static char *protocol_names[] = {
-       N_("POP3"),
-       NULL,           /* APOP, deprecated */
-       NULL,           /* RPOP, deprecated */
-       N_("IMAP4"),
+       N_("POP"),
+       N_("IMAP"),
        N_("News (NNTP)"),
        N_("Local mbox file"),
        N_("None (SMTP only)")
@@ -346,6 +383,9 @@ static void prefs_account_smtp_auth_type_set_data_from_optmenu
                                                        (PrefParam *pparam);
 static void prefs_account_smtp_auth_type_set_optmenu   (PrefParam *pparam);
 
+static void prefs_account_set_autochk_interval_from_widgets(PrefParam *pparam);
+static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam);
+
 static void prefs_account_enum_set_data_from_radiobtn  (PrefParam *pparam);
 static void prefs_account_enum_set_radiobtn            (PrefParam *pparam);
 
@@ -357,6 +397,10 @@ static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
                                           gpointer user_data);
 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
                                          gpointer user_data);
+static void prefs_account_showpwd_checkbtn_toggled(GtkToggleButton *button,
+                                         gpointer user_data);
+static void prefs_account_entry_changed_newline_check_cb(GtkWidget *entry,
+                                               gpointer user_data);
 static void prefs_account_filter_on_recv_toggled(GtkToggleButton *button,
                                          gpointer user_data);
 
@@ -421,7 +465,10 @@ static PrefParam basic_param[] = {
         &basic_page.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
 
        {"password", NULL, &tmp_ac_prefs.passwd, P_PASSWORD,
-        &basic_page.pass_entry, prefs_set_data_from_entry, prefs_set_entry},
+        NULL, NULL, NULL},
+
+       {"config_version", "-1", &tmp_ac_prefs.config_version, P_INT,
+               NULL, NULL, NULL},
 
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
@@ -493,6 +540,22 @@ static PrefParam receive_param[] = {
         &receive_page.low_bandwidth_checkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
 
+       {"autochk_use_default", "TRUE", &tmp_ac_prefs.autochk_use_default, P_BOOL,
+               &receive_page.autochk_use_default_checkbtn,
+               prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"autochk_use_custom", "FALSE", &tmp_ac_prefs.autochk_use_custom, P_BOOL,
+               &receive_page.autochk_checkbtn,
+               prefs_set_data_from_toggle, prefs_set_toggle},
+
+       /* Here we lie a bit, passing a pointer to our custom struct,
+        * disguised as a GtkWidget pointer, to get around the
+        * inflexibility of PrefParam system. */
+       {"autochk_interval", "600", &tmp_ac_prefs.autochk_itv, P_INT,
+               (GtkWidget **)&receive_page.autochk_widgets,
+               prefs_account_set_autochk_interval_from_widgets,
+               prefs_account_set_autochk_interval_to_widgets},
+
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
 
@@ -525,7 +588,7 @@ static PrefParam send_param[] = {
        {"smtp_user_id", NULL, &tmp_ac_prefs.smtp_userid, P_STRING,
         &send_page.smtp_uid_entry, prefs_set_data_from_entry, prefs_set_entry},
        {"smtp_password", NULL, &tmp_ac_prefs.smtp_passwd, P_PASSWORD,
-        &send_page.smtp_pass_entry, prefs_set_data_from_entry, prefs_set_entry},
+        NULL, NULL, NULL},
 
        {"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
         &send_page.pop_bfr_smtp_checkbtn,
@@ -717,6 +780,10 @@ static PrefParam ssl_param[] = {
         prefs_account_enum_set_data_from_radiobtn,
         prefs_account_enum_set_radiobtn},
 
+       {"ssl_certs_auto_accept", "0", &tmp_ac_prefs.ssl_certs_auto_accept, P_BOOL,
+        &ssl_page.ssl_certs_auto_accept_checkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
        {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL,
         &ssl_page.use_nonblocking_ssl_checkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -725,13 +792,13 @@ static PrefParam ssl_param[] = {
         &ssl_page.entry_in_cert_file, prefs_set_data_from_entry, prefs_set_entry},
 
        {"in_ssl_client_cert_pass", "", &tmp_ac_prefs.in_ssl_client_cert_pass, P_PASSWORD,
-        &ssl_page.entry_in_cert_pass, prefs_set_data_from_entry, prefs_set_entry},
+        NULL, NULL, NULL},
 
        {"out_ssl_client_cert_file", "", &tmp_ac_prefs.out_ssl_client_cert_file, P_STRING,
         &ssl_page.entry_out_cert_file, prefs_set_data_from_entry, prefs_set_entry},
 
        {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD,
-        &ssl_page.entry_out_cert_pass, prefs_set_data_from_entry, prefs_set_entry},
+        NULL, NULL, NULL},
 #else
        {"ssl_pop", "0", &tmp_ac_prefs.ssl_pop, P_ENUM,
         NULL, NULL, NULL},
@@ -757,6 +824,9 @@ static PrefParam ssl_param[] = {
        {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD,
         NULL, NULL, NULL},
 
+       {"ssl_certs_auto_accept", "0", &tmp_ac_prefs.ssl_certs_auto_accept, P_BOOL,
+        NULL, NULL, NULL},
+
        {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL,
         NULL, NULL, NULL},
 #endif /* USE_GNUTLS */
@@ -764,6 +834,48 @@ static PrefParam ssl_param[] = {
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
 
+static PrefParam proxy_param[] = {
+       /* SOCKS proxy */
+       {"use_proxy", "FALSE", &tmp_ac_prefs.use_proxy, P_BOOL,
+       &proxy_page.proxy_checkbtn,
+       prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"use_default_proxy", "TRUE", &tmp_ac_prefs.use_default_proxy, P_BOOL,
+       &proxy_page.default_proxy_checkbtn,
+       prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"use_proxy_for_send", "TRUE", &tmp_ac_prefs.use_proxy_for_send, P_BOOL,
+       &proxy_page.proxy_send_checkbtn,
+       prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"proxy_type", "1", &tmp_ac_prefs.proxy_info.proxy_type, P_ENUM,
+       &proxy_page.socks4_radiobtn,
+       prefs_account_enum_set_data_from_radiobtn,
+       prefs_account_enum_set_radiobtn},
+
+       {"proxy_host", "localhost", &tmp_ac_prefs.proxy_info.proxy_host, P_STRING,
+       &proxy_page.proxy_host_entry,
+       prefs_set_data_from_entry, prefs_set_entry},
+
+       {"proxy_port", "1080", &tmp_ac_prefs.proxy_info.proxy_port, P_USHORT,
+       &proxy_page.proxy_port_spinbtn,
+       prefs_set_data_from_spinbtn, prefs_set_spinbtn},
+
+       {"use_proxy_auth", "FALSE", &tmp_ac_prefs.proxy_info.use_proxy_auth, P_BOOL,
+       &proxy_page.proxy_auth_checkbtn,
+       prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"proxy_name", "", &tmp_ac_prefs.proxy_info.proxy_name, P_STRING,
+       &proxy_page.proxy_name_entry,
+       prefs_set_data_from_entry, prefs_set_entry},
+
+       {"proxy_pass", NULL, &tmp_ac_prefs.proxy_info.proxy_pass, P_PASSWORD,
+       NULL, NULL, NULL},
+
+
+       {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
+};
+
 static PrefParam advanced_param[] = {
        {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
         &advanced_page.smtpport_checkbtn,
@@ -805,6 +917,14 @@ static PrefParam advanced_param[] = {
         &advanced_page.domain_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 
+#ifdef USE_GNUTLS
+       {"gnutls_set_priority", "FALSE", &tmp_ac_prefs.set_gnutls_priority, P_BOOL,
+        NULL, NULL, NULL},
+
+       {"gnutls_priority", NULL, &tmp_ac_prefs.gnutls_priority, P_STRING,
+        NULL, NULL, NULL},
+#endif
+
 #ifndef G_OS_WIN32
        {"set_tunnelcmd", "FALSE", &tmp_ac_prefs.set_tunnelcmd, P_BOOL,
         &advanced_page.tunnelcmd_checkbtn,
@@ -851,10 +971,6 @@ static PrefParam advanced_param[] = {
         &advanced_page.trash_folder_entry,
         prefs_set_data_from_entry, prefs_set_entry},
         
-        {"imap_use_trash", "TRUE", &tmp_ac_prefs.imap_use_trash, P_BOOL,
-        &advanced_page.imap_use_trash_checkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-
 
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
@@ -885,8 +1001,15 @@ static void prefs_account_signature_edit_cb       (GtkWidget      *widget,
 static void pop_bfr_smtp_tm_set_sens           (GtkWidget      *widget,
                                                 gpointer        data);
 
+#if (defined USE_GNUTLS)
+static void auto_configure_cb                  (GtkWidget      *widget,
+                                                gpointer        data);
+
+#endif
 static void prefs_account_edit_custom_header   (void);
 
+static void prefs_account_receive_itv_spinbutton_value_changed_cb(GtkWidget *w,
+                                         gpointer data);
 
 #define COMBOBOX_PRIVACY_PLUGIN_ID 3
 
@@ -894,25 +1017,6 @@ static void prefs_account_edit_custom_header      (void);
  * system choice. */
 static void privacy_system_activated(GtkWidget *combobox)
 {
-       const gchar *system_id;
-       gboolean privacy_enabled = FALSE;
-       gint privacy_enabled_int;
-       GtkTreeIter iter;
-       GtkListStore *menu = GTK_LIST_STORE(gtk_combo_box_get_model(
-                               GTK_COMBO_BOX(combobox)));
-
-       gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combobox), &iter);
-
-       gtk_tree_model_get(GTK_TREE_MODEL(menu), &iter,
-                       COMBOBOX_PRIVACY_PLUGIN_ID, &system_id,
-                       COMBOBOX_DATA, &privacy_enabled_int,
-                       -1);
-       
-       privacy_enabled = strcmp(system_id, "");
-
-       if( privacy_enabled_int == 0 )
-               privacy_enabled = FALSE;
-
        gtk_widget_set_sensitive (privacy_page.save_clear_text_checkbtn, 
                !gtk_toggle_button_get_active(
                                GTK_TOGGLE_BUTTON(privacy_page.encrypt_to_self_checkbtn)));
@@ -951,7 +1055,10 @@ static void update_privacy_system_menu() {
                                COMBOBOX_SENS, TRUE,
                                COMBOBOX_PRIVACY_PLUGIN_ID, id,
                                -1);
+               g_free(id);
        }
+       g_slist_free(system_ids);
+
 }
 
 #define TABLE_YPAD 2
@@ -999,8 +1106,13 @@ static void basic_create_widget_func(PrefsPage * _page,
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkWidget *auto_configure_btn;
+       GtkWidget *auto_configure_cancel_btn;
+       GtkWidget *auto_configure_lbl;
+       GtkWidget *showpwd_checkbtn;
        GtkListStore *menu;
        GtkTreeIter iter;
+       gchar *buf;
 
        struct BasicProtocol *protocol_optmenu;
        gint i;
@@ -1108,10 +1220,29 @@ static void basic_create_widget_func(PrefsPage * _page,
        gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
        gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
 
+       auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_btn, FALSE, FALSE, 0);
+       auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_cancel_btn, FALSE, FALSE, 0);
+       auto_configure_lbl = gtk_label_new("");
+       gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT);
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_lbl, FALSE, FALSE, 0);
+#if (defined USE_GNUTLS)
+       gtk_widget_show(auto_configure_btn);
+       gtk_widget_show(auto_configure_lbl);
+       g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
+                         G_CALLBACK (auto_configure_cb), NULL);
+       g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked",
+                         G_CALLBACK (auto_configure_cb), NULL);
+#endif
+
        no_imap_warn_icon = gtk_image_new_from_stock
                         (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
-       no_imap_warn_label = gtk_label_new(_("<span weight=\"bold\">Warning: this version of Claws Mail\n"
-                         "has been built without IMAP and News support.</span>"));
+       buf = g_strconcat("<span weight=\"bold\">",
+                       _("Warning: this version of Claws Mail\n"
+                         "has been built without IMAP and News support."), "</span>", NULL);
+       no_imap_warn_label = gtk_label_new(buf);
+       g_free(buf);
        gtk_label_set_use_markup(GTK_LABEL(no_imap_warn_label), TRUE);
 
        gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_icon, FALSE, FALSE, 0);
@@ -1124,7 +1255,7 @@ static void basic_create_widget_func(PrefsPage * _page,
        protocol_optmenu->no_imap_warn_icon = no_imap_warn_icon;
        protocol_optmenu->no_imap_warn_label = no_imap_warn_label;
 
-       serv_table = gtk_table_new (6, 4, FALSE);
+       serv_table = gtk_table_new (10, 4, FALSE);
        gtk_widget_show (serv_table);
        gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
        gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
@@ -1179,9 +1310,17 @@ static void basic_create_widget_func(PrefsPage * _page,
        uid_entry = gtk_entry_new ();
        gtk_widget_show (uid_entry);
        gtk_widget_set_size_request (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
+       g_signal_connect(G_OBJECT(uid_entry), "changed",
+                       G_CALLBACK(prefs_account_entry_changed_newline_check_cb),
+                       GINT_TO_POINTER(ac_prefs->protocol));
+
        pass_entry = gtk_entry_new ();
        gtk_widget_show (pass_entry);
        gtk_widget_set_size_request (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
+       g_signal_connect(G_OBJECT(pass_entry), "changed",
+                       G_CALLBACK(prefs_account_entry_changed_newline_check_cb),
+                       GINT_TO_POINTER(ac_prefs->protocol));
+
 #ifndef GENERIC_UMPC
        gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 7, 8,
                          GTK_EXPAND | GTK_SHRINK | GTK_FILL,
@@ -1199,10 +1338,6 @@ static void basic_create_widget_func(PrefsPage * _page,
                          GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
 #endif
        gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
-#ifdef MAEMO
-       hildon_gtk_entry_set_input_mode(GTK_ENTRY(pass_entry), 
-               HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
-#endif
 
        nntpserv_label = gtk_label_new (_("News server"));
        gtk_widget_show (nntpserv_label);
@@ -1263,10 +1398,20 @@ static void basic_create_widget_func(PrefsPage * _page,
        gtk_table_attach (GTK_TABLE (serv_table), pass_label, 0, 1, 8, 9,
                          GTK_FILL, 0, 0, 0);
 #endif
+
+       showpwd_checkbtn = gtk_check_button_new_with_label (_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showpwd_checkbtn), FALSE);
+       gtk_widget_show(showpwd_checkbtn);
+       gtk_table_attach (GTK_TABLE (serv_table), showpwd_checkbtn, 3, 4, 9, 10,
+                       GTK_FILL, 0, 0, 0);
+       g_signal_connect(G_OBJECT(showpwd_checkbtn), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), pass_entry);
+
        SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, uid_label);
        SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, pass_label);
        SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, uid_entry);
        SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, pass_entry);
+       SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, showpwd_checkbtn);
        SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, nntpauth_onconnect_checkbtn);
 
        page->acname_entry   = acname_entry;
@@ -1296,10 +1441,13 @@ static void basic_create_widget_func(PrefsPage * _page,
        page->pass_label       = pass_label;
        page->uid_entry        = uid_entry;
        page->pass_entry       = pass_entry;
+       page->showpwd_checkbtn = showpwd_checkbtn;
+       page->auto_configure_btn = auto_configure_btn;
+       page->auto_configure_cancel_btn = auto_configure_cancel_btn;
+       page->auto_configure_lbl = auto_configure_lbl;
 
        if (new_account) {
                PrefsAccount *def_ac;
-               gchar *buf;
 
                prefs_set_dialog_to_default(basic_param);
                buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
@@ -1326,9 +1474,19 @@ static void basic_create_widget_func(PrefsPage * _page,
                                g_free(id);
                        }
                }
-       } else
+       } else {
                prefs_set_dialog(basic_param);
 
+               /* Passwords are handled outside of PrefParams. */
+               buf = passwd_store_get_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_RECV);
+               gtk_entry_set_text(GTK_ENTRY(page->pass_entry), buf != NULL ? buf : "");
+               if (buf != NULL) {
+                       memset(buf, 0, strlen(buf));
+                       g_free(buf);
+               }
+       }
+
        page->vbox = vbox1;
 
        page->page.widget = vbox1;
@@ -1341,9 +1499,9 @@ static void receive_create_widget_func(PrefsPage * _page,
        ReceivePage *page = (ReceivePage *) _page;
        PrefsAccount *ac_prefs = (PrefsAccount *) data;
 
-       GtkWidget *vbox1;
+       GtkWidget *vbox1, *vbox2, *vbox3, *vbox4;
+       GtkWidget *hbox1, *hbox2;
        GtkWidget *frame1;
-       GtkWidget *vbox2;
        GtkWidget *use_apop_checkbtn;
        GtkWidget *rmmail_checkbtn;
        GtkWidget *hbox_spc;
@@ -1351,13 +1509,11 @@ static void receive_create_widget_func(PrefsPage * _page,
        GtkWidget *leave_time_spinbtn;
        GtkWidget *leave_hour_label;
        GtkWidget *leave_hour_spinbtn;
-       GtkWidget *hbox1;
        GtkWidget *size_limit_checkbtn;
        GtkWidget *size_limit_spinbtn;
        GtkWidget *label;
        GtkWidget *filter_on_recv_checkbtn;
        GtkWidget *filterhook_on_recv_checkbtn;
-       GtkWidget *vbox3;
        GtkWidget *inbox_label;
        GtkWidget *inbox_entry;
        GtkWidget *inbox_btn;
@@ -1372,18 +1528,23 @@ static void receive_create_widget_func(PrefsPage * _page,
        GtkWidget *local_inbox_label;
        GtkWidget *local_inbox_entry;
        GtkWidget *local_inbox_btn;
+       GtkWidget *autochk_checkbtn;
+       GtkWidget *autochk_hour_spinbtn, *autochk_hour_label;
+       GtkWidget *autochk_min_spinbtn, *autochk_min_label;
+       GtkWidget *autochk_sec_spinbtn, *autochk_sec_label;
+       GtkWidget *autochk_use_default_checkbtn;
+       GtkObject *adj;
+       struct AutocheckWidgets *autochk_widgets;
 
        GtkWidget *optmenu;
        GtkListStore *menu;
        GtkTreeIter iter;
        GtkWidget *recvatgetall_checkbtn;
 
-       GtkWidget *hbox2;
-       GtkWidget *frame2;
+       GtkWidget *frame, *frame2;
        GtkWidget *maxarticle_label;
        GtkWidget *maxarticle_spinbtn;
-       GtkObject *maxarticle_spinbtn_adj;
-       CLAWS_TIP_DECL();
+       GtkAdjustment *maxarticle_spinbtn_adj;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1415,7 +1576,7 @@ static void receive_create_widget_func(PrefsPage * _page,
                          G_CALLBACK (prefs_account_select_folder_cb),
                          local_inbox_entry);
 
-       vbox2 = gtkut_get_options_frame(vbox1, &frame1, _("POP3"));
+       vbox2 = gtkut_get_options_frame(vbox1, &frame1, _("POP"));
        PACK_CHECK_BUTTON (vbox2, use_apop_checkbtn,
                           _("Use secure authentication (APOP)"));
 
@@ -1516,7 +1677,7 @@ static void receive_create_widget_func(PrefsPage * _page,
        gtk_box_pack_start (GTK_BOX (hbox2), maxarticle_label, FALSE, FALSE, 0);
 
        maxarticle_spinbtn_adj =
-               gtk_adjustment_new (300, 0, 10000, 10, 100, 0);
+               GTK_ADJUSTMENT(gtk_adjustment_new (300, 0, 10000, 10, 100, 0));
        maxarticle_spinbtn = gtk_spin_button_new
                (GTK_ADJUSTMENT (maxarticle_spinbtn_adj), 10, 0);
        gtk_widget_show (maxarticle_spinbtn);
@@ -1528,7 +1689,7 @@ static void receive_create_widget_func(PrefsPage * _page,
        gtk_spin_button_set_numeric
                (GTK_SPIN_BUTTON (maxarticle_spinbtn), TRUE);
 
-       vbox2 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
+       vbox2 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP"));
 
        hbox1 = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (hbox1);
@@ -1546,11 +1707,14 @@ static void receive_create_widget_func(PrefsPage * _page,
 
        COMBOBOX_ADD (menu, _("Automatic"), 0);
        COMBOBOX_ADD (menu, NULL, 0);
-       COMBOBOX_ADD (menu, "LOGIN", IMAP_AUTH_LOGIN);
+       COMBOBOX_ADD (menu, _("Plain text"), IMAP_AUTH_PLAINTEXT);
        COMBOBOX_ADD (menu, "CRAM-MD5", IMAP_AUTH_CRAM_MD5);
        COMBOBOX_ADD (menu, "ANONYMOUS", IMAP_AUTH_ANON);
        COMBOBOX_ADD (menu, "GSSAPI", IMAP_AUTH_GSSAPI);
        COMBOBOX_ADD (menu, "DIGEST-MD5", IMAP_AUTH_DIGEST_MD5);
+       COMBOBOX_ADD (menu, "SCRAM-SHA-1", IMAP_AUTH_SCRAM_SHA1);
+       COMBOBOX_ADD (menu, "PLAIN", IMAP_AUTH_PLAIN);
+       COMBOBOX_ADD (menu, "LOGIN", IMAP_AUTH_LOGIN);
 
        hbox1 = gtk_hbox_new (FALSE, 8);
        gtk_widget_show (hbox1);
@@ -1589,12 +1753,69 @@ static void receive_create_widget_func(PrefsPage * _page,
        gtk_widget_show (hbox1);
        gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
 
+       /* Auto-checking */
+       vbox4 = gtkut_get_options_frame(vbox1, &frame, _("Automatic checking"));
+
+       PACK_CHECK_BUTTON(vbox4, autochk_use_default_checkbtn,
+                       _("Use global settings"));
+
+       hbox2 = gtk_hbox_new(FALSE, 8);
+       gtk_box_pack_start(GTK_BOX(vbox4), hbox2, FALSE, FALSE, 0);
+
+       PACK_CHECK_BUTTON(hbox2, autochk_checkbtn,
+                       _("Check for new mail every"));
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_hour_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_hour_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_hour_spinbtn, FALSE, FALSE, 0);
+       autochk_hour_label = gtk_label_new(_("hours"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_hour_label, FALSE, FALSE, 0);
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_min_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_min_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_min_spinbtn, FALSE, FALSE, 0);
+       autochk_min_label = gtk_label_new(_("minutes"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_min_label, FALSE, FALSE, 0);
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_sec_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_sec_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_sec_spinbtn, FALSE, FALSE, 0);
+       autochk_sec_label = gtk_label_new(_("seconds"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_sec_label, FALSE, FALSE, 0);
+
+       autochk_widgets = g_new0(struct AutocheckWidgets, 1);
+       autochk_widgets->autochk_hour_spinbtn = autochk_hour_spinbtn;
+       autochk_widgets->autochk_min_spinbtn = autochk_min_spinbtn;
+       autochk_widgets->autochk_sec_spinbtn = autochk_sec_spinbtn;
+
+       gtk_widget_show_all(vbox4);
+
+       SET_TOGGLE_SENSITIVITY_REVERSE(autochk_use_default_checkbtn, hbox2);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_hour_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_min_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_sec_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_hour_label);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_min_label);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_sec_label);
+
        PACK_CHECK_BUTTON (vbox1, filter_on_recv_checkbtn,
                           _("Filter messages on receiving"));
 
        g_signal_connect(G_OBJECT(filter_on_recv_checkbtn), "toggled",
                         G_CALLBACK(prefs_account_filter_on_recv_toggled),
                         NULL);
+       g_signal_connect(G_OBJECT(autochk_hour_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
+       g_signal_connect(G_OBJECT(autochk_min_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
+       g_signal_connect(G_OBJECT(autochk_sec_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
 
        PACK_CHECK_BUTTON (vbox1, filterhook_on_recv_checkbtn,
                           _("Allow filtering using plugins on receiving"));
@@ -1616,6 +1837,8 @@ static void receive_create_widget_func(PrefsPage * _page,
        page->inbox_entry              = inbox_entry;
        page->inbox_btn                = inbox_btn;
 
+       page->autochk_frame            = frame;
+
        page->imap_frame               = imap_frame;
        page->imap_auth_type_optmenu   = optmenu;
 
@@ -1634,6 +1857,10 @@ static void receive_create_widget_func(PrefsPage * _page,
        page->maxarticle_spinbtn        = maxarticle_spinbtn;
        page->maxarticle_spinbtn_adj    = maxarticle_spinbtn_adj;
 
+       page->autochk_checkbtn = autochk_checkbtn;
+       page->autochk_widgets = autochk_widgets;
+       page->autochk_use_default_checkbtn = autochk_use_default_checkbtn;
+
        tmp_ac_prefs = *ac_prefs;
 
        if (new_account) {
@@ -1664,6 +1891,7 @@ static void send_create_widget_func(PrefsPage * _page,
        GtkWidget *checkbtn_msgid_with_addr;
        GtkWidget *vbox3;
        GtkWidget *smtp_auth_checkbtn;
+       GtkWidget *showpwd_checkbtn;
        GtkWidget *optmenu;
        GtkListStore *menu;
        GtkTreeIter iter;
@@ -1677,6 +1905,7 @@ static void send_create_widget_func(PrefsPage * _page,
        GtkWidget *pop_bfr_smtp_tm_spinbtn;
        GtkWidget *pop_auth_timeout_lbl;
        GtkWidget *pop_auth_minutes_lbl;
+       gchar *buf;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1690,7 +1919,7 @@ static void send_create_widget_func(PrefsPage * _page,
                           _("Send account mail address in Message-ID"));
 
        PACK_CHECK_BUTTON (vbox2, xmailer_checkbtn,
-                          _("Generate X-Mailer header"));
+                          _("Add user agent header"));
 
        hbox = gtk_hbox_new (FALSE, 12);
        gtk_widget_show (hbox);
@@ -1763,6 +1992,9 @@ static void send_create_widget_func(PrefsPage * _page,
        gtk_widget_show (smtp_uid_entry);
        gtk_widget_set_size_request (smtp_uid_entry, DEFAULT_ENTRY_WIDTH, -1);
        gtk_box_pack_start (GTK_BOX (hbox), smtp_uid_entry, TRUE, TRUE, 0);
+       g_signal_connect(G_OBJECT(smtp_uid_entry), "changed",
+                       G_CALLBACK(prefs_account_entry_changed_newline_check_cb),
+                       GINT_TO_POINTER(ac_prefs->protocol));
 
 #ifdef GENERIC_UMPC
        PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
@@ -1783,12 +2015,18 @@ static void send_create_widget_func(PrefsPage * _page,
        gtk_widget_show (smtp_pass_entry);
        gtk_widget_set_size_request (smtp_pass_entry, DEFAULT_ENTRY_WIDTH, -1);
        gtk_box_pack_start (GTK_BOX (hbox), smtp_pass_entry, TRUE, TRUE, 0);
-
        gtk_entry_set_visibility (GTK_ENTRY (smtp_pass_entry), FALSE);
-#ifdef MAEMO
-       hildon_gtk_entry_set_input_mode(GTK_ENTRY(smtp_pass_entry), 
-               HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
-#endif
+       g_signal_connect(G_OBJECT(smtp_pass_entry), "changed",
+                       G_CALLBACK(prefs_account_entry_changed_newline_check_cb),
+                       GINT_TO_POINTER(ac_prefs->protocol));
+
+       showpwd_checkbtn = gtk_check_button_new_with_label (_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showpwd_checkbtn), FALSE);
+       gtk_widget_show(showpwd_checkbtn);
+       gtk_box_pack_start(GTK_BOX (hbox), showpwd_checkbtn, FALSE, FALSE, 0);
+       g_signal_connect(G_OBJECT(showpwd_checkbtn), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), smtp_pass_entry);
+
        PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
 
        hbox = gtk_hbox_new (FALSE, 8);
@@ -1812,7 +2050,7 @@ static void send_create_widget_func(PrefsPage * _page,
        SET_TOGGLE_SENSITIVITY (smtp_auth_checkbtn, vbox4);
 
        PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_checkbtn,
-               _("Authenticate with POP3 before sending"));
+               _("Authenticate with POP before sending"));
        
        g_signal_connect (G_OBJECT (pop_bfr_smtp_checkbtn), "clicked",
                          G_CALLBACK (pop_bfr_smtp_tm_set_sens),
@@ -1827,7 +2065,7 @@ static void send_create_widget_func(PrefsPage * _page,
        gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
        gtk_widget_set_size_request (hbox_spc, 12, -1);
 
-       pop_auth_timeout_lbl = gtk_label_new(_("POP authentication timeout"));
+       pop_auth_timeout_lbl = gtk_label_new(_("POP authentication timeout"));
        gtk_widget_show (pop_auth_timeout_lbl);
        gtk_box_pack_start (GTK_BOX (hbox), pop_auth_timeout_lbl, FALSE, FALSE, 0);
 
@@ -1857,9 +2095,19 @@ static void send_create_widget_func(PrefsPage * _page,
 
        if (new_account) {
                prefs_set_dialog_to_default(send_param);
-       } else
+       } else {
                prefs_set_dialog(send_param);
 
+               /* Passwords are handled outside of PrefParams. */
+               buf = passwd_store_get_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_SEND);
+               gtk_entry_set_text(GTK_ENTRY(page->smtp_pass_entry), buf != NULL ? buf : "");
+               if (buf != NULL) {
+                       memset(buf, 0, strlen(buf));
+                       g_free(buf);
+               }
+       }
+
        pop_bfr_smtp_tm_set_sens (NULL, NULL);
 
        page->vbox = vbox1;
@@ -1981,7 +2229,7 @@ static void compose_create_widget_func(PrefsPage * _page,
        gtk_table_set_col_spacings (GTK_TABLE (table), 8);
 
        autocc_checkbtn = gtk_check_button_new_with_label (
-                               prefs_common_translated_header_name("Cc"));
+                               prefs_common_translated_header_name("Cc:"));
        gtk_widget_show (autocc_checkbtn);
        gtk_table_attach (GTK_TABLE (table), autocc_checkbtn, 0, 1, 0, 1,
                          GTK_FILL, 0, 0, 0);
@@ -1995,7 +2243,7 @@ static void compose_create_widget_func(PrefsPage * _page,
        SET_TOGGLE_SENSITIVITY (autocc_checkbtn, autocc_entry);
 
        autobcc_checkbtn = gtk_check_button_new_with_label (
-                               prefs_common_translated_header_name("Bcc"));
+                               prefs_common_translated_header_name("Bcc:"));
        gtk_widget_show (autobcc_checkbtn);
        gtk_table_attach (GTK_TABLE (table), autobcc_checkbtn, 0, 1, 1, 2,
                          GTK_FILL, 0, 0, 0);
@@ -2009,7 +2257,7 @@ static void compose_create_widget_func(PrefsPage * _page,
        SET_TOGGLE_SENSITIVITY (autobcc_checkbtn, autobcc_entry);
 
        autoreplyto_checkbtn = gtk_check_button_new_with_label (
-                               prefs_common_translated_header_name("Reply-To"));
+                               prefs_common_translated_header_name("Reply-To:"));
        gtk_widget_show (autoreplyto_checkbtn);
        gtk_table_attach (GTK_TABLE (table), autoreplyto_checkbtn, 0, 1, 2, 3,
                          GTK_FILL, 0, 0, 0);
@@ -2276,8 +2524,6 @@ static void privacy_create_widget_func(PrefsPage * _page,
 
        page->page.widget = vbox1;
 }
-       
-#ifdef USE_GNUTLS
 
 #define CREATE_RADIO_BUTTON(box, btn, btn_p, label, data)              \
 {                                                                      \
@@ -2290,6 +2536,8 @@ static void privacy_create_widget_func(PrefsPage * _page,
                           GINT_TO_POINTER (data));                     \
 }
 
+#ifdef USE_GNUTLS
+
 #define CREATE_RADIO_BUTTONS(box,                                      \
                             btn1, btn1_label, btn1_data,               \
                             btn2, btn2_label, btn2_data,               \
@@ -2390,44 +2638,46 @@ static void ssl_create_widget_func(PrefsPage * _page,
        GtkWidget *cert_table;
        GtkWidget *entry_in_cert_pass;
        GtkWidget *entry_out_cert_pass;
+       GtkWidget *showpwd_checkbtn;
 
        GtkWidget *vbox7;
+       GtkWidget *ssl_certs_auto_accept_checkbtn;
        GtkWidget *use_nonblocking_ssl_checkbtn;
        GtkWidget *hbox;
        GtkWidget *hbox_spc;
        GtkWidget *label;
-       CLAWS_TIP_DECL();
+       gchar *buf;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
 
-       vbox2 = gtkut_get_options_frame(vbox1, &pop_frame, _("POP3"));
+       vbox2 = gtkut_get_options_frame(vbox1, &pop_frame, _("POP"));
 
        CREATE_RADIO_BUTTONS(vbox2,
                             pop_nossl_radiobtn,
-                            _("Don't use SSL"),
+                            _("Don't use SSL/TLS"),
                             SSL_NONE,
                             pop_ssltunnel_radiobtn,
-                            _("Use SSL for POP3 connection"),
+                            _("Use SSL/TLS"),
                             SSL_TUNNEL,
                             pop_starttls_radiobtn,
-                            _("Use STARTTLS command to start SSL session"),
+                            _("Use STARTTLS command to start encrypted session"),
                             SSL_STARTTLS);
        g_signal_connect(G_OBJECT(pop_ssltunnel_radiobtn), "toggled",
                         G_CALLBACK(pop_ssltunnel_toggled), NULL);
        
-       vbox3 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
+       vbox3 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP"));
 
        CREATE_RADIO_BUTTONS(vbox3,
                             imap_nossl_radiobtn,
-                            _("Don't use SSL"),
+                            _("Don't use SSL/TLS"),
                             SSL_NONE,
                             imap_ssltunnel_radiobtn,
-                            _("Use SSL for IMAP4 connection"),
+                            _("Use SSL/TLS"),
                             SSL_TUNNEL,
                             imap_starttls_radiobtn,
-                            _("Use STARTTLS command to start SSL session"),
+                            _("Use STARTTLS command to start encrypted session"),
                             SSL_STARTTLS);
        g_signal_connect(G_OBJECT(imap_ssltunnel_radiobtn), "toggled",
                         G_CALLBACK(imap_ssltunnel_toggled), NULL);
@@ -2435,7 +2685,7 @@ static void ssl_create_widget_func(PrefsPage * _page,
        vbox4 = gtkut_get_options_frame(vbox1, &nntp_frame, _("NNTP"));
 
        nntp_nossl_radiobtn =
-               gtk_radio_button_new_with_label (NULL, _("Don't use SSL"));
+               gtk_radio_button_new_with_label (NULL, _("Don't use SSL/TLS"));
        gtk_widget_show (nntp_nossl_radiobtn);
        gtk_box_pack_start (GTK_BOX (vbox4), nntp_nossl_radiobtn,
                            FALSE, FALSE, 0);
@@ -2444,7 +2694,7 @@ static void ssl_create_widget_func(PrefsPage * _page,
                           GINT_TO_POINTER (SSL_NONE));
 
        CREATE_RADIO_BUTTON(vbox4, nntp_ssltunnel_radiobtn, nntp_nossl_radiobtn,
-                           _("Use SSL for NNTP connection"), SSL_TUNNEL);
+                           _("Use SSL/TLS"), SSL_TUNNEL);
        g_signal_connect(G_OBJECT(nntp_ssltunnel_radiobtn), "toggled",
                         G_CALLBACK(nntp_ssltunnel_toggled), NULL);
 
@@ -2452,13 +2702,13 @@ static void ssl_create_widget_func(PrefsPage * _page,
 
        CREATE_RADIO_BUTTONS(vbox5,
                             smtp_nossl_radiobtn,
-                            _("Don't use SSL (but, if necessary, use STARTTLS)"),
+                            _("Don't use SSL/TLS (but, if necessary, use STARTTLS)"),
                             SSL_NONE,
                             smtp_ssltunnel_radiobtn,
-                            _("Use SSL for SMTP connection"),
+                            _("Use SSL/TLS"),
                             SSL_TUNNEL,
                             smtp_starttls_radiobtn,
-                            _("Use STARTTLS command to start SSL session"),
+                            _("Use STARTTLS command to start encrypted session"),
                             SSL_STARTTLS);
        g_signal_connect(G_OBJECT(smtp_ssltunnel_radiobtn), "toggled",
                         G_CALLBACK(smtp_ssltunnel_toggled), NULL);
@@ -2489,9 +2739,15 @@ static void ssl_create_widget_func(PrefsPage * _page,
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
        entry_in_cert_pass = gtk_entry_new();
        gtk_entry_set_visibility(GTK_ENTRY(entry_in_cert_pass), FALSE);
+       showpwd_checkbtn = gtk_check_button_new_with_label (_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showpwd_checkbtn), FALSE);
+       g_signal_connect(G_OBJECT(showpwd_checkbtn), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), entry_in_cert_pass);
        gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
        gtk_table_attach(GTK_TABLE(cert_table), entry_in_cert_pass, 1, 2, 1, 2,
                         GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(cert_table), showpwd_checkbtn, 2, 3, 1, 2,
+                       GTK_FILL, 0, 0, 0);
 
        label = gtk_label_new(_("Certificate for sending"));
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
@@ -2511,9 +2767,16 @@ static void ssl_create_widget_func(PrefsPage * _page,
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
        entry_out_cert_pass = gtk_entry_new();
        gtk_entry_set_visibility(GTK_ENTRY(entry_out_cert_pass), FALSE);
+       showpwd_checkbtn = gtk_check_button_new_with_label (_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showpwd_checkbtn), FALSE);
+       g_signal_connect(G_OBJECT(showpwd_checkbtn), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), entry_out_cert_pass);
        gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 3, 4, GTK_FILL, 0, 0, 0);
        gtk_table_attach(GTK_TABLE(cert_table), entry_out_cert_pass, 1, 2, 3, 4,
                         GTK_FILL, 0, 0, 0);
+       gtk_table_attach(GTK_TABLE(cert_table), showpwd_checkbtn, 2, 3, 3, 4,
+                       GTK_FILL, 0, 0, 0);
+
        gtk_widget_show_all(cert_table);
 
        g_signal_connect(G_OBJECT(in_ssl_cert_browse_button), "clicked",
@@ -2525,8 +2788,11 @@ static void ssl_create_widget_func(PrefsPage * _page,
        gtk_widget_show (vbox7);
        gtk_box_pack_start (GTK_BOX (vbox1), vbox7, FALSE, FALSE, 0);
 
+       PACK_CHECK_BUTTON(vbox7, ssl_certs_auto_accept_checkbtn,
+                         _("Automatically accept valid SSL/TLS certificates"));
+
        PACK_CHECK_BUTTON(vbox7, use_nonblocking_ssl_checkbtn,
-                         _("Use non-blocking SSL"));
+                         _("Use non-blocking SSL/TLS"));
 
        hbox = gtk_hbox_new (FALSE, 0);
        gtk_widget_show (hbox);
@@ -2538,7 +2804,7 @@ static void ssl_create_widget_func(PrefsPage * _page,
        gtk_widget_set_size_request (hbox_spc, 16, -1);
 
        label = gtk_label_new
-               (_("Turn this off if you have SSL connection problems"));
+               (_("Turn this off if you have SSL/TLS connection problems"));
        gtk_widget_show (label);
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
        gtkut_widget_set_small_font_size (label);
@@ -2567,24 +2833,202 @@ static void ssl_create_widget_func(PrefsPage * _page,
        page->entry_out_cert_file     = entry_out_cert_file;
        page->entry_out_cert_pass     = entry_out_cert_pass;
 
+       page->ssl_certs_auto_accept_checkbtn = ssl_certs_auto_accept_checkbtn;
        page->use_nonblocking_ssl_checkbtn = use_nonblocking_ssl_checkbtn;
 
        tmp_ac_prefs = *ac_prefs;
 
        if (new_account) {
                prefs_set_dialog_to_default(ssl_param);
-       } else
+       } else {
                prefs_set_dialog(ssl_param);
 
+               /* Passwords are handled outside of PrefParams. */
+               buf = passwd_store_get_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_RECV_CERT);
+               gtk_entry_set_text(GTK_ENTRY(page->entry_in_cert_pass), buf != NULL ? buf : "");
+               if (buf != NULL) {
+                       memset(buf, 0, strlen(buf));
+                       g_free(buf);
+               }
+
+               buf = passwd_store_get_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_SEND_CERT);
+               gtk_entry_set_text(GTK_ENTRY(page->entry_out_cert_pass), buf != NULL ? buf : "");
+               if (buf != NULL) {
+                       memset(buf, 0, strlen(buf));
+                       g_free(buf);
+               }
+       }
+
        page->vbox = vbox1;
 
        page->page.widget = vbox1;
 }
 
 #undef CREATE_RADIO_BUTTONS
-#undef CREATE_RADIO_BUTTON
 #endif /* USE_GNUTLS */
-       
+
+static void proxy_create_widget_func(PrefsPage * _page,
+                                           GtkWindow * window,
+                                           gpointer data)
+{
+       ProxyPage *page = (ProxyPage *) _page;
+       PrefsAccount *ac_prefs = (PrefsAccount *) data;
+       GtkWidget *vbox1, *vbox2, *vbox3, *vbox4;
+       GtkWidget *proxy_frame;
+       GtkWidget *proxy_checkbtn;
+       GtkWidget *default_proxy_checkbtn;
+       GtkWidget *hbox;
+       GtkWidget *label;
+       GtkWidget *socks4_radiobtn;
+       GtkWidget *socks5_radiobtn;
+       GtkWidget *proxy_host_entry;
+       GtkWidget *proxy_port_spinbtn;
+       GtkWidget *proxy_auth_checkbtn;
+       GtkWidget *proxy_name_entry;
+       GtkWidget *proxy_pass_entry;
+       GtkWidget *proxy_send_checkbtn;
+       GtkWidget *table;
+       GtkWidget *button;
+       gchar *buf;
+
+       vbox1 = gtk_vbox_new (FALSE, VSPACING);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
+
+       proxy_checkbtn = gtk_check_button_new_with_label (_("Use proxy server"));
+       PACK_FRAME (vbox1, proxy_frame, NULL);
+       gtk_frame_set_label_widget (GTK_FRAME(proxy_frame), proxy_checkbtn);
+
+       vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+       gtk_container_add (GTK_CONTAINER (proxy_frame), vbox2);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+
+       default_proxy_checkbtn =
+               gtk_check_button_new_with_label (C_("In account preferences, referring to whether or not use proxy settings from common preferences", "Use default settings"));
+       CLAWS_SET_TIP(default_proxy_checkbtn,
+                       _("Use global proxy server settings"));
+       gtk_box_pack_start (GTK_BOX (vbox2), default_proxy_checkbtn, FALSE, FALSE, 0);
+
+       vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+       gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
+
+       hbox = gtk_hbox_new (FALSE, 8);
+       gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
+
+       socks4_radiobtn = gtk_radio_button_new_with_label(NULL, "SOCKS4");
+       gtk_box_pack_start (GTK_BOX (hbox), socks4_radiobtn, FALSE, FALSE, 0);
+       g_object_set_data(G_OBJECT(socks4_radiobtn), MENU_VAL_ID,
+                         GINT_TO_POINTER(PROXY_SOCKS4));
+
+       CREATE_RADIO_BUTTON(hbox, socks5_radiobtn, socks4_radiobtn, "SOCKS5",
+                           PROXY_SOCKS5);
+
+       hbox = gtk_hbox_new (FALSE, 8);
+       gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
+
+       label = gtk_label_new(_("Hostname"));
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
+       proxy_host_entry = gtk_entry_new();
+       gtk_widget_set_size_request(proxy_host_entry, DEFAULT_ENTRY_WIDTH, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), proxy_host_entry, TRUE, TRUE, 0);
+
+       label = gtk_label_new(_("Port"));
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
+       proxy_port_spinbtn = gtk_spin_button_new_with_range(0, 65535, 1080);
+       gtk_widget_set_size_request(proxy_port_spinbtn, 64, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), proxy_port_spinbtn, FALSE, FALSE, 0);
+
+       vbox4 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+       gtk_box_pack_start(GTK_BOX(vbox3), vbox4, FALSE, FALSE, 0);
+
+       PACK_CHECK_BUTTON (vbox4, proxy_auth_checkbtn, _("Use authentication"));
+
+       table = gtk_table_new(2, 4, FALSE);
+       gtk_box_pack_start (GTK_BOX (vbox4), table, FALSE, FALSE, 0);
+
+       label = gtk_label_new(_("Username"));
+       gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
+
+       proxy_name_entry = gtk_entry_new();
+       gtk_widget_set_size_request(proxy_name_entry, DEFAULT_ENTRY_WIDTH, -1);
+       gtk_table_attach(GTK_TABLE(table), proxy_name_entry, 1, 2, 0, 1,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
+
+       label = gtk_label_new(_("Password"));
+       gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
+
+       proxy_pass_entry = gtk_entry_new();
+       gtk_widget_set_size_request(proxy_pass_entry, DEFAULT_ENTRY_WIDTH, -1);
+       gtk_entry_set_visibility(GTK_ENTRY(proxy_pass_entry), FALSE);
+       gtk_table_attach(GTK_TABLE(table), proxy_pass_entry, 3, 4, 0, 1,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
+
+       button = gtk_check_button_new_with_label(_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
+       gtk_table_attach(GTK_TABLE(table), button, 3, 4, 1, 2,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
+       g_signal_connect(G_OBJECT(button), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), proxy_pass_entry);
+
+       gtk_box_pack_start(GTK_BOX(vbox2), gtk_hseparator_new(), FALSE, FALSE, 0);
+
+       PACK_CHECK_BUTTON(vbox2, proxy_send_checkbtn,
+                         _("Use proxy server for sending"));
+       CLAWS_SET_TIP(proxy_send_checkbtn,
+                       _("If disabled, messages will be sent using direct connection to configured outgoing server, bypassing any configured proxy server."));
+
+       SET_TOGGLE_SENSITIVITY(proxy_auth_checkbtn, table);
+       SET_TOGGLE_SENSITIVITY(socks5_radiobtn, vbox4);
+       SET_TOGGLE_SENSITIVITY(proxy_checkbtn, vbox2);
+       SET_TOGGLE_SENSITIVITY_REVERSE(default_proxy_checkbtn, vbox3);
+
+       gtk_widget_show_all(vbox1);
+
+       page->proxy_checkbtn = proxy_checkbtn;
+       page->default_proxy_checkbtn = default_proxy_checkbtn;
+       page->socks4_radiobtn = socks4_radiobtn;
+       page->socks5_radiobtn = socks5_radiobtn;
+       page->proxy_host_entry = proxy_host_entry;
+       page->proxy_port_spinbtn = proxy_port_spinbtn;
+       page->proxy_auth_checkbtn = proxy_auth_checkbtn;
+       page->proxy_name_entry = proxy_name_entry;
+       page->proxy_pass_entry = proxy_pass_entry;
+       page->proxy_send_checkbtn = proxy_send_checkbtn;
+       page->vbox = vbox1;
+       page->page.widget = vbox1;
+
+       tmp_ac_prefs = *ac_prefs;
+
+       if (new_account) {
+               prefs_set_dialog_to_default(proxy_param);
+       } else
+               prefs_set_dialog(proxy_param);
+
+               /* Passwords are handled outside of PrefParams. */
+               buf = passwd_store_get_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_PROXY_PASS);
+               gtk_entry_set_text(GTK_ENTRY(page->proxy_pass_entry),
+                               buf != NULL ? buf : "");
+               if (buf != NULL) {
+                       memset(buf, 0, strlen(buf));
+                       g_free(buf);
+               }
+
+       page->vbox = vbox1;
+
+       page->page.widget = vbox1;
+}
+
 static void advanced_create_widget_func(PrefsPage * _page,
                                            GtkWindow * window,
                                            gpointer data)
@@ -2627,10 +3071,8 @@ static void advanced_create_widget_func(PrefsPage * _page,
        GtkWidget *draft_folder_entry;
        GtkWidget *trash_folder_checkbtn;
        GtkWidget *trash_folder_entry;
-       GtkWidget *imap_use_trash_checkbtn;
-
-       CLAWS_TIP_DECL();
        GtkSizeGroup *size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
 #define PACK_HBOX(hbox) \
        { \
        hbox = gtk_hbox_new (FALSE, 8); \
@@ -2661,14 +3103,14 @@ static void advanced_create_widget_func(PrefsPage * _page,
        
        PACK_HBOX (hbox_popport);
        PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
-                          _("POP3 port"));
+                          _("POP port"));
        PACK_PORT_SPINBTN (hbox_popport, spinbtn_popport);
        SET_TOGGLE_SENSITIVITY (checkbtn_popport, spinbtn_popport);
        gtk_size_group_add_widget(size_group, checkbtn_popport);
 
        PACK_HBOX (hbox_imapport);
        PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
-                          _("IMAP4 port"));
+                          _("IMAP port"));
        PACK_PORT_SPINBTN (hbox_imapport, spinbtn_imapport);
        SET_TOGGLE_SENSITIVITY (checkbtn_imapport, spinbtn_imapport);
        gtk_size_group_add_widget(size_group, checkbtn_imapport);
@@ -2704,12 +3146,8 @@ static void advanced_create_widget_func(PrefsPage * _page,
        gtk_box_pack_start (GTK_BOX (hbox1), entry_tunnelcmd, TRUE, TRUE, 0);
        SET_TOGGLE_SENSITIVITY (checkbtn_tunnelcmd, entry_tunnelcmd);
 #endif
-       PACK_HBOX (hbox1);
-       PACK_CHECK_BUTTON (hbox1, imap_use_trash_checkbtn,
-                          _("Move deleted mails to trash and expunge immediately"));
-       CLAWS_SET_TIP(imap_use_trash_checkbtn,
-                            _("Moves deleted mails to trash instead of using the \\Deleted flag without expunging."));
 
+       PACK_HBOX (hbox1);
        PACK_CHECK_BUTTON (hbox1, checkbtn_crosspost, 
                           _("Mark cross-posted messages as read and color:"));
        g_signal_connect (G_OBJECT (checkbtn_crosspost), "toggled",
@@ -2723,8 +3161,6 @@ static void advanced_create_widget_func(PrefsPage * _page,
        menu = colorlabel_create_color_menu();
        gtk_cmoption_menu_set_menu (GTK_CMOPTION_MENU(colormenu_crosspost), menu);
        SET_TOGGLE_SENSITIVITY(checkbtn_crosspost, colormenu_crosspost);
-
-       PACK_HBOX (hbox1);
 #undef PACK_HBOX
 #undef PACK_PORT_SPINBTN
 
@@ -2803,7 +3239,6 @@ static void advanced_create_widget_func(PrefsPage * _page,
        page->draft_folder_entry  = draft_folder_entry;
        page->trash_folder_checkbtn = trash_folder_checkbtn;
        page->trash_folder_entry  = trash_folder_entry;
-       page->imap_use_trash_checkbtn = imap_use_trash_checkbtn;
 
        tmp_ac_prefs = *ac_prefs;
 
@@ -2815,6 +3250,8 @@ static void advanced_create_widget_func(PrefsPage * _page,
        page->vbox = vbox1;
 
        page->page.widget = vbox1;
+       
+       g_object_unref(G_OBJECT(size_group));
 }
        
 static gint prefs_basic_apply(void)
@@ -2835,6 +3272,7 @@ static gint prefs_basic_apply(void)
                alertpanel_error(_("Mail address is not entered."));
                return -1;
        }
+
        if (((protocol == A_POP3) || 
             (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn))) || 
             (protocol == A_NONE)) &&
@@ -2849,7 +3287,7 @@ static gint prefs_basic_apply(void)
        }
        if (protocol == A_POP3 &&
            *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
-               alertpanel_error(_("POP3 server is not entered."));
+               alertpanel_error(_("POP server is not entered."));
                return -1;
        }
        if (protocol == A_POP3 || protocol == A_LOCAL) {
@@ -2875,7 +3313,7 @@ static gint prefs_basic_apply(void)
        }
        if (protocol == A_IMAP4 &&
            *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
-               alertpanel_error(_("IMAP4 server is not entered."));
+               alertpanel_error(_("IMAP server is not entered."));
                return -1;
        }
        if (protocol == A_NNTP &&
@@ -2901,7 +3339,23 @@ static gint prefs_basic_apply(void)
                                protocol == A_IMAP4 ? "imap":"news",
                                tmp_ac_prefs.account_name ? tmp_ac_prefs.account_name : "(null)");
        
+       if (strchr(gtk_entry_get_text(GTK_ENTRY(basic_page.uid_entry)), '\n') != NULL) {
+               alertpanel_error(_("User ID cannot contain a newline character."));
+               return -1;
+       }
+
+       if (strchr(gtk_entry_get_text(GTK_ENTRY(basic_page.pass_entry)), '\n') != NULL) {
+               alertpanel_error(_("Password cannot contain a newline character."));
+               return -1;
+       }
+
        prefs_set_data_from_dialog(basic_param);
+
+       /* Passwords are stored outside of PrefParams. */
+       passwd_store_set_account(tmp_ac_prefs.account_id,
+                       PWS_ACCOUNT_RECV,
+                       gtk_entry_get_text(GTK_ENTRY(basic_page.pass_entry)),
+                       FALSE);
        
        if (protocol == A_IMAP4 || protocol == A_NNTP) {
                new_id = g_strdup_printf("#%s/%s",
@@ -2918,13 +3372,31 @@ static gint prefs_basic_apply(void)
 
 static gint prefs_receive_apply(void)
 {
+       if (strchr(gtk_entry_get_text(GTK_ENTRY(send_page.smtp_uid_entry)), '\n') != NULL) {
+               alertpanel_error(_("SMTP user ID cannot contain a newline character."));
+               return -1;
+       }
+
+       if (strchr(gtk_entry_get_text(GTK_ENTRY(send_page.smtp_pass_entry)), '\n') != NULL) {
+               alertpanel_error(_("SMTP password cannot contain a newline character."));
+               return -1;
+       }
+
        prefs_set_data_from_dialog(receive_param);
+
        return 0;
 }
 
 static gint prefs_send_apply(void)
 {
        prefs_set_data_from_dialog(send_param);
+
+       /* Passwords are stored outside of PrefParams. */
+       passwd_store_set_account(tmp_ac_prefs.account_id,
+                       PWS_ACCOUNT_SEND,
+                       gtk_entry_get_text(GTK_ENTRY(send_page.smtp_pass_entry)),
+                       FALSE);
+
        return 0;
 }
 
@@ -2950,12 +3422,62 @@ static gint prefs_privacy_apply(void)
 static gint prefs_ssl_apply(void)
 {
        prefs_set_data_from_dialog(ssl_param);
+
+       /* Passwords are stored outside of PrefParams. */
+       passwd_store_set_account(tmp_ac_prefs.account_id,
+                       PWS_ACCOUNT_RECV_CERT,
+                       gtk_entry_get_text(GTK_ENTRY(ssl_page.entry_in_cert_pass)),
+                       FALSE);
+       passwd_store_set_account(tmp_ac_prefs.account_id,
+                       PWS_ACCOUNT_SEND_CERT,
+                       gtk_entry_get_text(GTK_ENTRY(ssl_page.entry_out_cert_pass)),
+                       FALSE);
+
        return 0;
 }
 #endif
 
+static gint prefs_proxy_apply(void)
+{
+       prefs_set_data_from_dialog(proxy_param);
+
+       /* Passwords are stored outside of PrefParams. */
+       passwd_store_set_account(tmp_ac_prefs.account_id,
+                       PWS_ACCOUNT_PROXY_PASS,
+                       gtk_entry_get_text(GTK_ENTRY(proxy_page.proxy_pass_entry)),
+                       FALSE);
+
+       return 0;
+}
+
 static gint prefs_advanced_apply(void)
 {
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.domain_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.domain_entry)) == '\0') {
+               alertpanel_error(_("domain is not specified."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.sent_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.sent_folder_entry)) == '\0') {
+               alertpanel_error(_("sent folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.queue_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.queue_folder_entry)) == '\0') {
+               alertpanel_error(_("queue folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.draft_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.draft_folder_entry)) == '\0') {
+               alertpanel_error(_("draft folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.trash_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.trash_folder_entry)) == '\0') {
+               alertpanel_error(_("trash folder is not selected."));
+               return -1;
+       }
+
        prefs_set_data_from_dialog(advanced_param);
        return 0;
 }
@@ -2997,6 +3519,11 @@ static void ssl_destroy_widget_func(PrefsPage *_page)
 }
 #endif
 
+static void proxy_destroy_widget_func(PrefsPage *_page)
+{
+       /* ProxyPage *page = (ProxyPage *) _page; */
+}
+
 static void advanced_destroy_widget_func(PrefsPage *_page)
 {
        /* AdvancedPage *page = (AdvancedPage *) _page; */
@@ -3074,6 +3601,16 @@ static gboolean ssl_can_close_func(PrefsPage *_page)
 }
 #endif
 
+static gboolean proxy_can_close_func(PrefsPage *_page)
+{
+       ProxyPage *page = (ProxyPage *) _page;
+
+       if (!page->page.page_open)
+               return TRUE;
+
+       return prefs_proxy_apply() >= 0;
+}
+
 static gboolean advanced_can_close_func(PrefsPage *_page)
 {
        AdvancedPage *page = (AdvancedPage *) _page;
@@ -3175,6 +3712,17 @@ static void ssl_save_func(PrefsPage *_page)
 }
 #endif
 
+static void proxy_save_func(PrefsPage *_page)
+{
+       ProxyPage *page = (ProxyPage *) _page;
+
+       if (!page->page.page_open)
+               return;
+
+       if (prefs_proxy_apply() >= 0)
+               cancelled = FALSE;
+}
+
 static void advanced_save_func(PrefsPage *_page)
 {
        AdvancedPage *page = (AdvancedPage *) _page;
@@ -3300,7 +3848,7 @@ static void register_ssl_page(void)
        static gchar *path[3];
 
        path[0] = _("Account");
-       path[1] = _("SSL");
+       path[1] = _("SSL/TLS");
        path[2] = NULL;
         
        ssl_page.page.path = path;
@@ -3317,26 +3865,27 @@ static gboolean sslcert_get_client_cert_hook(gpointer source, gpointer data)
 {
        SSLClientCertHookData *hookdata = (SSLClientCertHookData *)source;
        PrefsAccount *account = (PrefsAccount *)hookdata->account;
+       gchar *pwd_id;
 
        hookdata->cert_path = NULL;
        hookdata->password = NULL;
 
        if (!g_list_find(account_get_list(), account)) {
-               g_warning("can't find sock account\n");
+               g_warning("can't find account");
                return TRUE;
        }
        
        if (hookdata->is_smtp) {
                if (account->out_ssl_client_cert_file && *account->out_ssl_client_cert_file)
                        hookdata->cert_path = account->out_ssl_client_cert_file;
-               if (account->out_ssl_client_cert_pass && *account->out_ssl_client_cert_pass)
-                       hookdata->password = account->out_ssl_client_cert_pass;
+               pwd_id = PWS_ACCOUNT_SEND_CERT;
        } else {
                if (account->in_ssl_client_cert_file && *account->in_ssl_client_cert_file)
                        hookdata->cert_path = account->in_ssl_client_cert_file;
-               if (account->in_ssl_client_cert_pass && *account->in_ssl_client_cert_pass)
-                       hookdata->password = account->in_ssl_client_cert_pass;
+               pwd_id = PWS_ACCOUNT_RECV_CERT;
        }
+
+       hookdata->password = passwd_store_get_account(account->account_id, pwd_id);
        return TRUE;
 }
 
@@ -3360,8 +3909,13 @@ static gboolean sslcert_get_password(gpointer source, gpointer data)
 { 
        struct GetPassData pass_data;
        /* do complicated stuff to be able to call GTK from the mainloop */
+#if !GLIB_CHECK_VERSION(2,32,0)
        pass_data.cond = g_cond_new();
-       pass_data.mutex = g_mutex_new();
+#else
+       pass_data.cond = g_new0(GCond, 1);
+       g_cond_init(pass_data.cond);
+#endif
+       pass_data.mutex = cm_mutex_new();
        pass_data.pass = (gchar **)source;
 
        g_mutex_lock(pass_data.mutex);
@@ -3369,14 +3923,37 @@ static gboolean sslcert_get_password(gpointer source, gpointer data)
        g_idle_add(do_get_pass, &pass_data);
 
        g_cond_wait(pass_data.cond, pass_data.mutex);
+#if !GLIB_CHECK_VERSION(2,32,0)
        g_cond_free(pass_data.cond);
+#else
+       g_cond_clear(pass_data.cond);
+       g_free(pass_data.cond);
+#endif
        g_mutex_unlock(pass_data.mutex);
-       g_mutex_free(pass_data.mutex);
+       cm_mutex_free(pass_data.mutex);
 
        return TRUE;
 }
 #endif
 
+static void register_proxy_page(void)
+{
+       static gchar *path[3];
+
+       path[0] = _("Account");
+       path[1] = _("Proxy");
+       path[2] = NULL;
+
+       proxy_page.page.path = path;
+       proxy_page.page.weight = 1000.0;
+       proxy_page.page.create_widget = proxy_create_widget_func;
+       proxy_page.page.destroy_widget = proxy_destroy_widget_func;
+       proxy_page.page.save_page = proxy_save_func;
+       proxy_page.page.can_close = proxy_can_close_func;
+
+       prefs_account_register_page((PrefsPage *) &proxy_page);
+}
+
 static void register_advanced_page(void)
 {
        static gchar *path[3];
@@ -3408,6 +3985,7 @@ void prefs_account_init()
        hooks_register_hook(SSLCERT_GET_CLIENT_CERT_HOOKLIST, sslcert_get_client_cert_hook, NULL);
        hooks_register_hook(SSL_CERT_GET_PASSWORD, sslcert_get_password, NULL);
 #endif
+       register_proxy_page();
        register_advanced_page();
 }
 
@@ -3424,6 +4002,7 @@ PrefsAccount *prefs_account_new(void)
        prefs_set_default(templates_param);
        prefs_set_default(privacy_param);
        prefs_set_default(ssl_param);
+       prefs_set_default(proxy_param);
        prefs_set_default(advanced_param);
        *ac_prefs = tmp_ac_prefs;
        ac_prefs->account_id = prefs_account_get_new_id();
@@ -3433,19 +4012,31 @@ PrefsAccount *prefs_account_new(void)
        return ac_prefs;
 }
 
-void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
+PrefsAccount *prefs_account_new_from_config(const gchar *label)
 {
        const gchar *p = label;
        gchar *rcpath;
        gint id;
        gchar **strv, **cur;
+       gsize len;
+       PrefsAccount *ac_prefs;
+
+       cm_return_val_if_fail(label != NULL, NULL);
 
-       cm_return_if_fail(ac_prefs != NULL);
-       cm_return_if_fail(label != NULL);
+       ac_prefs = g_new0(PrefsAccount, 1);
 
+       /* Load default values to tmp_ac_prefs first, ... */
        memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
-       tmp_ac_prefs.privacy_prefs = ac_prefs->privacy_prefs;
+       prefs_set_default(basic_param);
+       prefs_set_default(receive_param);
+       prefs_set_default(send_param);
+       prefs_set_default(compose_param);
+       prefs_set_default(templates_param);
+       prefs_set_default(privacy_param);
+       prefs_set_default(ssl_param);
+       prefs_set_default(advanced_param);
 
+       /* ... overriding them with values from stored config file. */
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
        prefs_read_config(basic_param, label, rcpath, NULL);
        prefs_read_config(receive_param, label, rcpath, NULL);
@@ -3454,25 +4045,23 @@ void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
        prefs_read_config(templates_param, label, rcpath, NULL);
        prefs_read_config(privacy_param, label, rcpath, NULL);
        prefs_read_config(ssl_param, label, rcpath, NULL);
+       prefs_read_config(proxy_param, label, rcpath, NULL);
        prefs_read_config(advanced_param, label, rcpath, NULL);
        g_free(rcpath);
 
        *ac_prefs = tmp_ac_prefs;
+
        while (*p && !g_ascii_isdigit(*p)) p++;
        id = atoi(p);
-       if (id < 0) g_warning("wrong account id: %d\n", id);
+       if (id < 0) g_warning("wrong account id: %d", id);
        ac_prefs->account_id = id;
 
-       if (ac_prefs->protocol == A_APOP) {
-               debug_print("converting protocol A_APOP to new prefs.\n");
-               ac_prefs->protocol = A_POP3;
-               ac_prefs->use_apop_auth = TRUE;
-       }
-
+       /* Now parse privacy_prefs. */
+       ac_prefs->privacy_prefs = g_hash_table_new(g_str_hash, g_str_equal);
        if (privacy_prefs != NULL) {
                strv = g_strsplit(privacy_prefs, ",", 0);
                for (cur = strv; *cur != NULL; cur++) {
-                       gchar *encvalue, *value;
+                       gchar *encvalue, *tmp;
 
                        encvalue = strchr(*cur, '=');
                        if (encvalue == NULL)
@@ -3480,17 +4069,60 @@ void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
                        encvalue[0] = '\0';
                        encvalue++;
 
-                       value = g_malloc0(strlen(encvalue));
-                       if (base64_decode(value, encvalue, strlen(encvalue)) > 0)
-                               g_hash_table_insert(ac_prefs->privacy_prefs, g_strdup(*cur), g_strdup(value));
-                       g_free(value);
+                       tmp = g_base64_decode_zero(encvalue, &len);
+                       if (len > 0)
+                               g_hash_table_insert(ac_prefs->privacy_prefs, g_strdup(*cur), tmp);
+                       else
+                               g_free(tmp);
                }
                g_strfreev(strv);
                g_free(privacy_prefs);
                privacy_prefs = NULL;
        }
 
+       /* For older configurations, move stored passwords into the
+        * password store. */
+       gboolean passwords_migrated = FALSE;
+
+       if (ac_prefs->passwd != NULL && strlen(ac_prefs->passwd) > 1) {
+               passwd_store_set_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_RECV, ac_prefs->passwd, TRUE);
+               passwords_migrated = TRUE;
+       }
+       if (ac_prefs->smtp_passwd != NULL && strlen(ac_prefs->smtp_passwd) > 1) {
+               passwd_store_set_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_SEND, ac_prefs->smtp_passwd, TRUE);
+               passwords_migrated = TRUE;
+       }
+       if (ac_prefs->in_ssl_client_cert_pass != NULL
+                       && strlen(ac_prefs->in_ssl_client_cert_pass) > 1) {
+               passwd_store_set_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_RECV_CERT, ac_prefs->in_ssl_client_cert_pass, TRUE);
+               passwords_migrated = TRUE;
+       }
+       if (ac_prefs->out_ssl_client_cert_pass != NULL
+                       && strlen(ac_prefs->out_ssl_client_cert_pass) > 1) {
+               passwd_store_set_account(ac_prefs->account_id,
+                               PWS_ACCOUNT_SEND_CERT, ac_prefs->out_ssl_client_cert_pass, TRUE);
+               passwords_migrated = TRUE;
+       }
+
+       /* Write out password store to file immediately, to prevent
+        * their loss. */
+       if (passwords_migrated)
+               passwd_store_write_config();
+
+       ac_prefs->receive_in_progress = FALSE;
+
        prefs_custom_header_read_config(ac_prefs);
+
+       /* Start the auto-check interval, if needed. */
+       if (!ac_prefs->autochk_use_default && ac_prefs->autochk_use_custom
+                       && ac_prefs->autochk_itv > PREFS_RECV_AUTOCHECK_MIN_INTERVAL) {
+               inc_account_autocheck_timer_set_interval(ac_prefs);
+       }
+
+       return ac_prefs;
 }
 
 static void create_privacy_prefs(gpointer key, gpointer _value, gpointer user_data)
@@ -3502,15 +4134,14 @@ static void create_privacy_prefs(gpointer key, gpointer _value, gpointer user_da
        if (str->len > 0)
                g_string_append_c(str, ',');
 
-       encvalue = g_malloc0(B64LEN(strlen(value)) + 1);
-       base64_encode(encvalue, (gchar *) value, strlen(value));
+       encvalue = g_base64_encode(value, strlen(value));
        g_string_append_printf(str, "%s=%s", (gchar *) key, encvalue);
        g_free(encvalue);
 }
 
 #define WRITE_PARAM(PARAM_TABLE) \
                if (prefs_write_param(PARAM_TABLE, pfile->fp) < 0) { \
-                       g_warning("failed to write configuration to file\n"); \
+                       g_warning("failed to write configuration to file"); \
                        prefs_file_close_revert(pfile); \
                        g_free(privacy_prefs); \
                        privacy_prefs = NULL; \
@@ -3550,14 +4181,15 @@ void prefs_account_write_config_all(GList *account_list)
                WRITE_PARAM(templates_param)
                WRITE_PARAM(privacy_param)
                WRITE_PARAM(ssl_param)
+               WRITE_PARAM(proxy_param)
                WRITE_PARAM(advanced_param)
 
                g_free(privacy_prefs);
                privacy_prefs = NULL;
 
                if (cur->next) {
-                       if (fputc('\n', pfile->fp) == EOF) {
-                               FILE_OP_ERROR(rcpath, "fputc");
+                       if (claws_fputc('\n', pfile->fp) == EOF) {
+                               FILE_OP_ERROR(rcpath, "claws_fputc");
                                prefs_file_close_revert(pfile);
                                return;
                        }
@@ -3565,7 +4197,9 @@ void prefs_account_write_config_all(GList *account_list)
        }
 
        if (prefs_file_close(pfile) < 0)
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
+
+       passwd_store_write_config();
 }
 #undef WRITE_PARAM
 
@@ -3591,6 +4225,7 @@ void prefs_account_free(PrefsAccount *ac_prefs)
        prefs_free(templates_param);
        prefs_free(privacy_param);
        prefs_free(ssl_param);
+       prefs_free(proxy_param);
        prefs_free(advanced_param);
 }
 
@@ -3643,6 +4278,9 @@ static void destroy_dialog(gpointer data)
                *ac_prefs = tmp_ac_prefs;
                if (update_fld_list)
                        folderview_rescan_tree(ac_prefs->folder, FALSE);
+
+               inc_account_autocheck_timer_set_interval(ac_prefs);
+
        } else /* the customhdr_list may have changed, update it anyway */
                ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
 
@@ -3677,7 +4315,7 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
 
        prefswindow_open_full(title, prefs_pages, ac_prefs, destroy_dialog,
                        &prefs_common.editaccountwin_width, &prefs_common.editaccountwin_height,
-                       TRUE, NULL, NULL);
+                       TRUE, NULL, NULL, NULL);
        g_free(title);
        gtk_main();
 
@@ -3685,11 +4323,18 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
 
        if (!cancelled && dirty != NULL)
                *dirty = TRUE;
-       if (cancelled && new_account) {
-               prefs_account_free(ac_prefs);
+       if (cancelled && new_account)
                return NULL;
-       } else 
+       else {
+               if (ac_prefs->recv_server)
+                       g_strstrip(ac_prefs->recv_server);
+               if (ac_prefs->smtp_server)
+                       g_strstrip(ac_prefs->smtp_server);
+               if (ac_prefs->nntp_server)
+                       g_strstrip(ac_prefs->nntp_server);
+
                return ac_prefs;
+       }
 }
 
 static void crosspost_color_toggled(void)
@@ -3740,7 +4385,7 @@ static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
        FolderItem *item;
        gchar *id;
 
-       item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE);
+       item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE, NULL);
        if (item && item->path) {
                id = folder_item_get_identifier(item);
                if (id) {
@@ -3750,6 +4395,108 @@ static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
        }
 }
 
+#if (defined USE_GNUTLS)
+static void auto_configure_cb (GtkWidget *widget, gpointer data)
+{
+       gchar *address = NULL;
+       AutoConfigureData *recv_data;
+       AutoConfigureData *send_data;
+       static GCancellable *recv_cancel = NULL;
+       static GCancellable *send_cancel = NULL;
+       RecvProtocol protocol;
+       struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
+
+       if (!recv_cancel) {
+               recv_cancel = g_cancellable_new();
+               send_cancel = g_cancellable_new();
+       }
+
+       if (widget == basic_page.auto_configure_cancel_btn) {
+               g_cancellable_cancel(recv_cancel);
+               g_cancellable_cancel(send_cancel);
+               g_object_unref(recv_cancel);
+               g_object_unref(send_cancel);
+               recv_cancel = NULL;
+               send_cancel = NULL;
+               return;
+       }
+
+       protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
+
+       address = gtk_editable_get_chars(GTK_EDITABLE(basic_page.addr_entry), 0, -1);
+
+       if (strchr(address, '@') == NULL) {
+               g_free(address);
+               gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+                          _("Failed (wrong address)"));
+               return;
+       }
+
+       if (protocol == A_POP3 || protocol == A_IMAP4) {
+               recv_data = g_new0(AutoConfigureData, 1);
+               recv_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
+               recv_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
+               recv_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
+               recv_data->cancel = recv_cancel;
+               switch(protocol) {
+               case A_POP3:
+                       recv_data->ssl_service = "pop3s";
+                       recv_data->tls_service = "pop3";
+                       recv_data->address = g_strdup(address);
+                       recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
+                       recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.popport_checkbtn);
+                       recv_data->port = GTK_SPIN_BUTTON(advanced_page.popport_spinbtn);
+                       recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_starttls_radiobtn);
+                       recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_ssltunnel_radiobtn);
+                       recv_data->default_port = 110;
+                       recv_data->default_ssl_port = 995;
+                       recv_data->uid_entry = GTK_ENTRY(basic_page.uid_entry);
+                       break;
+               case A_IMAP4:
+                       recv_data->ssl_service = "imaps";
+                       recv_data->tls_service = "imap";
+                       recv_data->address = g_strdup(address);
+                       recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
+                       recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.imapport_checkbtn);
+                       recv_data->port = GTK_SPIN_BUTTON(advanced_page.imapport_spinbtn);
+                       recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_starttls_radiobtn);
+                       recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_ssltunnel_radiobtn);
+                       recv_data->default_port = 143;
+                       recv_data->default_ssl_port = 993;
+                       recv_data->uid_entry = GTK_ENTRY(basic_page.uid_entry);
+                       break;
+               default:
+                       cm_return_if_fail(FALSE);
+               }
+               auto_configure_service(recv_data);
+       }
+
+       send_data = g_new0(AutoConfigureData, 1);
+       send_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
+       send_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
+       send_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
+       send_data->cancel = send_cancel;
+
+       send_data->ssl_service = NULL;
+       send_data->tls_service = "submission";
+       send_data->address = g_strdup(address);
+       send_data->hostname_entry = GTK_ENTRY(basic_page.smtpserv_entry);
+       send_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.smtpport_checkbtn);
+       send_data->port = GTK_SPIN_BUTTON(advanced_page.smtpport_spinbtn);
+       send_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.smtp_starttls_radiobtn);
+       send_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.smtp_ssltunnel_radiobtn);
+       send_data->default_port = 25;
+       send_data->default_ssl_port = -1;
+       send_data->uid_entry = NULL;
+       send_data->auth_checkbtn = GTK_TOGGLE_BUTTON(send_page.smtp_auth_checkbtn);
+
+       auto_configure_service(send_data);
+
+       g_free(address);
+}
+#endif
+
 static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
 {
        gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), TRUE);
@@ -3819,7 +4566,7 @@ static void prefs_account_signature_edit_cb(GtkWidget *widget, gpointer data)
 {
        const gchar *sigpath = gtk_entry_get_text(GTK_ENTRY(data));
        if (!is_file_exist(sigpath))
-               str_write_to_file(sigpath, "");
+               str_write_to_file(sigpath, "", TRUE);
        open_txt_editor(sigpath, prefs_common_get_ext_editor_cmd());
 }
 
@@ -3954,6 +4701,37 @@ static void prefs_account_smtp_auth_type_set_optmenu(PrefParam *pparam)
        combobox_select_by_data(optmenu, type);
 }
 
+static void prefs_account_set_autochk_interval_from_widgets(PrefParam *pparam)
+{
+       struct AutocheckWidgets *autochk_widgets =
+               (struct AutocheckWidgets *)*pparam->widget;
+
+       *(gint *)pparam->data =
+               (3600 * gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_hour_spinbtn)))
+               + (60 * gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_min_spinbtn)))
+               + gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_sec_spinbtn));
+}
+
+static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam)
+{
+       gint val = *((gint *)pparam->data);
+       struct AutocheckWidgets *autochk_widgets =
+               (struct AutocheckWidgets *)*pparam->widget;
+
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_hour_spinbtn),
+                       val / 3600);
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_min_spinbtn),
+                       (val % 3600) / 60);
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_sec_spinbtn),
+                       (val % 3600) % 60);
+}
+
 static void prefs_account_set_string_from_combobox(PrefParam *pparam)
 {
        GtkWidget *combobox;
@@ -4061,6 +4839,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 
        gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
        gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
+
        switch(protocol) {
        case A_NNTP:
 #ifndef HAVE_LIBETPAN
@@ -4108,6 +4887,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(basic_page.pass_label);
                gtk_widget_show(basic_page.uid_entry);
                gtk_widget_show(basic_page.pass_entry);
+               gtk_widget_show(basic_page.showpwd_checkbtn);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
                                           7, VSPACING_NARROW);
 
@@ -4115,6 +4895,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
                gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
                gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
+               gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, TRUE);
 
                /* update userid/passwd sensitive state */
 
@@ -4123,6 +4904,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_show(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4161,7 +4943,6 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
 #endif
-               gtk_widget_hide(advanced_page.imap_use_trash_checkbtn);
                gtk_widget_hide(receive_page.imapdir_label);
                gtk_widget_hide(receive_page.imapdir_entry);
                gtk_widget_hide(receive_page.subsonly_checkbtn);
@@ -4206,6 +4987,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(basic_page.pass_label);
                gtk_widget_hide(basic_page.uid_entry);
                gtk_widget_hide(basic_page.pass_entry);
+               gtk_widget_hide(basic_page.showpwd_checkbtn);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
                                           7, 0);
 
@@ -4213,9 +4995,11 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
                gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
                gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
+               gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, TRUE);
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_show(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4257,7 +5041,6 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
 #endif
-               gtk_widget_hide(advanced_page.imap_use_trash_checkbtn);
                gtk_widget_hide(receive_page.imapdir_label);
                gtk_widget_hide(receive_page.imapdir_entry);
                gtk_widget_hide(receive_page.subsonly_checkbtn);
@@ -4273,11 +5056,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                                GTK_TOGGLE_BUTTON(send_page.msgid_checkbtn), 
                                TRUE);
                gtk_widget_hide(send_page.msgid_checkbtn);
-               if (new_account)
-                       gtk_toggle_button_set_active(
-                               GTK_TOGGLE_BUTTON(send_page.xmailer_checkbtn),
-                               TRUE);
-               gtk_widget_hide(send_page.xmailer_checkbtn);
+               gtk_widget_show(send_page.xmailer_checkbtn);
                gtk_widget_hide(basic_page.nntpserv_label);
                gtk_widget_hide(basic_page.nntpserv_entry);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
@@ -4315,6 +5094,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(basic_page.pass_label);
                gtk_widget_show(basic_page.uid_entry);
                gtk_widget_show(basic_page.pass_entry);
+               gtk_widget_show(basic_page.showpwd_checkbtn);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
                                           7, VSPACING_NARROW);
 
@@ -4322,9 +5102,11 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
                gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
                gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
+               gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, TRUE);
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_show(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4366,7 +5148,6 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_show(advanced_page.tunnelcmd_entry);
 #endif
-               gtk_widget_show(advanced_page.imap_use_trash_checkbtn);
                gtk_widget_show(receive_page.imapdir_label);
                gtk_widget_show(receive_page.imapdir_entry);
                gtk_widget_show(receive_page.subsonly_checkbtn);
@@ -4414,6 +5195,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(basic_page.pass_label);
                gtk_widget_hide(basic_page.uid_entry);
                gtk_widget_hide(basic_page.pass_entry);
+               gtk_widget_hide(basic_page.showpwd_checkbtn);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
                                           7, VSPACING_NARROW);
 
@@ -4421,10 +5203,12 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_set_sensitive(basic_page.pass_label, FALSE);
                gtk_widget_set_sensitive(basic_page.uid_entry,  FALSE);
                gtk_widget_set_sensitive(basic_page.pass_entry, FALSE);
+               gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, FALSE);
                gtk_widget_set_sensitive(receive_page.pop3_frame, FALSE);
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_hide(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, FALSE);
                prefs_account_filter_on_recv_toggled
@@ -4460,13 +5244,13 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
 #endif
-               gtk_widget_hide(advanced_page.imap_use_trash_checkbtn);
                gtk_widget_hide(receive_page.imapdir_label);
                gtk_widget_hide(receive_page.imapdir_entry);
                gtk_widget_hide(receive_page.subsonly_checkbtn);
                gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
                break;
        case A_POP3:
+               /* continue to default: */
        default:
                gtk_widget_show(send_page.msgid_checkbtn);
                gtk_widget_show(send_page.xmailer_checkbtn);
@@ -4509,6 +5293,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(basic_page.pass_label);
                gtk_widget_show(basic_page.uid_entry);
                gtk_widget_show(basic_page.pass_entry);
+               gtk_widget_show(basic_page.showpwd_checkbtn);
                gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
                                           7, VSPACING_NARROW);
 
@@ -4516,10 +5301,12 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
                gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
                gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
+               gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, TRUE);
                gtk_widget_set_sensitive(receive_page.pop3_frame, TRUE);
                gtk_widget_show(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4560,7 +5347,6 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
 #endif
-               gtk_widget_hide(advanced_page.imap_use_trash_checkbtn);
                gtk_widget_hide(receive_page.imapdir_label);
                gtk_widget_hide(receive_page.imapdir_entry);
                gtk_widget_hide(receive_page.subsonly_checkbtn);
@@ -4576,13 +5362,14 @@ static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
 {
        gboolean auth;
 
-       if (!gtkut_widget_get_sensitive (GTK_WIDGET (button)))
+       if (!gtk_widget_get_sensitive (GTK_WIDGET (button)))
                return;
        auth = gtk_toggle_button_get_active (button);
        gtk_widget_set_sensitive(basic_page.uid_label,  auth);
        gtk_widget_set_sensitive(basic_page.pass_label, auth);
        gtk_widget_set_sensitive(basic_page.uid_entry,  auth);
        gtk_widget_set_sensitive(basic_page.pass_entry, auth);
+       gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, auth);
        gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, auth);
 }
 
@@ -4599,6 +5386,42 @@ static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
        gtk_widget_set_sensitive(basic_page.smtpserv_label, !use_mailcmd);
        gtk_widget_set_sensitive(basic_page.uid_entry,  !use_mailcmd);
        gtk_widget_set_sensitive(basic_page.pass_entry, !use_mailcmd);
+       gtk_widget_set_sensitive(basic_page.showpwd_checkbtn, !use_mailcmd);
+}
+
+static void prefs_account_showpwd_checkbtn_toggled(GtkToggleButton *button,
+               gpointer user_data)
+{
+       gboolean active = gtk_toggle_button_get_active(button);
+       GtkWidget *entry = GTK_WIDGET(user_data);
+
+       gtk_entry_set_visibility(GTK_ENTRY(entry), active);
+}
+
+static void prefs_account_entry_changed_newline_check_cb(GtkWidget *entry,
+               gpointer user_data)
+{
+       static GdkColor red;
+       static gboolean colors_initialised = FALSE;
+
+       if (strchr(gtk_entry_get_text(GTK_ENTRY(entry)), '\n') != NULL) {
+               /* Entry contains a newline, light it up. */
+               debug_print("found newline in string, painting entry red\n");
+               if (!colors_initialised) {
+                       if (!gdk_color_parse("#ff7070", &red)) {
+                               g_warning("color parse failed: red");
+                               return;
+                       }
+                       colors_initialised = gdk_colormap_alloc_color(
+                                       gdk_colormap_get_system(), &red, FALSE, TRUE);
+               }
+
+               if (colors_initialised) {
+                       gtk_widget_modify_base(entry, GTK_STATE_NORMAL, &red);
+               }
+       } else {
+               gtk_widget_modify_base(entry, GTK_STATE_NORMAL, NULL);
+       }
 }
 
 static void prefs_account_filter_on_recv_toggled(GtkToggleButton *button,
@@ -4660,6 +5483,52 @@ static void prefs_account_compose_default_dictionary_set_optmenu_from_string
 }
 #endif
 
+gchar *prefs_account_generate_msgid(PrefsAccount *account)
+{
+       gchar *addr, *tmbuf, *buf = NULL;
+       GDateTime *now;
+       gchar *user_addr = account->msgid_with_addr ? g_strdup(account->address) : NULL;
+
+       if (account->set_domain && account->domain) {
+               buf = g_strdup(account->domain);
+       } else if (!strncmp(get_domain_name(), "localhost", strlen("localhost"))) {
+               buf = g_strdup(
+                               strchr(account->address, '@') ?
+                               strchr(account->address, '@')+1 :
+                               account->address);
+       }
+
+       if (user_addr != NULL) {
+               addr = g_strdup_printf(".%s", user_addr);
+       } else {
+               addr = g_strdup_printf("@%s",
+                               buf != NULL && strlen(buf) > 0 ?
+                               buf : get_domain_name());
+       }
+
+       if (buf != NULL)
+               g_free(buf);
+       if (user_addr != NULL)
+               g_free(user_addr);
+
+       /* Replace all @ but the last one in addr, with underscores.
+        * RFC 2822 States that msg-id syntax only allows one @.
+        */
+       while (strchr(addr, '@') != NULL && strchr(addr, '@') != strrchr(addr, '@'))
+               *(strchr(addr, '@')) = '_';
+
+       now = g_date_time_new_now_local();
+       tmbuf = g_date_time_format(now, "%Y%m%d%H%M%S");
+       buf = g_strdup_printf("%s.%08x%s",
+                       tmbuf, (guint)rand(), addr);
+       g_date_time_unref(now);
+       g_free(tmbuf);
+       g_free(addr);
+
+       debug_print("Generated Message-ID string '%s'\n", buf);
+       return buf;
+}
+
 void prefs_account_register_page(PrefsPage *page)
 {
        prefs_pages = g_slist_append(prefs_pages, page);
@@ -4670,3 +5539,60 @@ void prefs_account_unregister_page(PrefsPage *page)
 {
        prefs_pages = g_slist_remove(prefs_pages, page);
 }
+
+gchar *prefs_account_cache_dir(PrefsAccount *ac_prefs, gboolean for_server)
+{
+       gchar *dir = NULL;
+#ifdef G_OS_WIN32
+       gchar *sanitized_server;
+#endif
+
+       if (ac_prefs->protocol == A_IMAP4) {
+#ifdef G_OS_WIN32
+               sanitized_server = g_strdup(ac_prefs->recv_server);
+               g_strdelimit(sanitized_server, ":", ',');
+#endif
+               if (for_server) {
+                       dir = g_strconcat(get_imap_cache_dir(),
+                                         G_DIR_SEPARATOR_S,
+#ifdef G_OS_WIN32
+                                         sanitized_server,
+#else
+                                         ac_prefs->recv_server,
+#endif
+                                         NULL);
+               } else {
+                       dir = g_strconcat(get_imap_cache_dir(),
+                                         G_DIR_SEPARATOR_S,
+#ifdef G_OS_WIN32
+                                         sanitized_server,
+#else
+                                         ac_prefs->recv_server,
+#endif
+                                         G_DIR_SEPARATOR_S,
+                                         ac_prefs->userid,
+                                         NULL);
+               }
+#ifdef G_OS_WIN32
+               g_free(sanitized_server);
+#endif
+       }
+
+       return dir;
+}
+
+static void prefs_account_receive_itv_spinbutton_value_changed_cb(GtkWidget *w, gpointer data)
+{
+       ReceivePage *page = (ReceivePage *)data;
+       gint seconds = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (page->autochk_widgets->autochk_sec_spinbtn));
+       gint minutes = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (page->autochk_widgets->autochk_min_spinbtn));
+       gint hours = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON(page->autochk_widgets->autochk_hour_spinbtn));
+       if (seconds < PREFS_RECV_AUTOCHECK_MIN_INTERVAL && minutes == 0 && hours == 0) {
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (page->autochk_widgets->autochk_sec_spinbtn),
+                               PREFS_RECV_AUTOCHECK_MIN_INTERVAL);
+       }
+}