[balsa/wip/gtk4: 243/351] mailbox: Declare it derivable



commit 9edbf2c177e063f60c2cde2dd640174e2153642b
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Sun Mar 25 13:00:08 2018 -0400

    mailbox: Declare it derivable
    
    Use G_DECLARE_DERIVABLE_TYPE for LibBalsaMailbox, make it
    private, and provide a complete set of getters and setters.

 libbalsa/filter-file.c                   |   22 +-
 libbalsa/libbalsa.c                      |   53 --
 libbalsa/mailbox-filter.c                |    5 +-
 libbalsa/mailbox.c                       | 1065 +++++++++++++++++++++---------
 libbalsa/mailbox.h                       |  143 ++---
 libbalsa/mailbox_imap.c                  |  107 ++--
 libbalsa/mailbox_local.c                 |  127 +++--
 libbalsa/mailbox_local.h                 |    3 +-
 libbalsa/mailbox_maildir.c               |   30 +-
 libbalsa/mailbox_mbox.c                  |   28 +-
 libbalsa/mailbox_mh.c                    |   19 +-
 libbalsa/mailbox_pop3.c                  |  157 +++--
 libbalsa/message.c                       |    4 +-
 libbalsa/send.c                          |   19 +-
 libinit_balsa/assistant_page_directory.c |   20 +-
 libinit_balsa/assistant_page_user.c      |    2 +-
 src/balsa-app.c                          |   11 +-
 src/balsa-index.c                        |   38 +-
 src/balsa-mblist.c                       |   19 +-
 src/balsa-message.c                      |    8 +-
 src/balsa-mime-widget-text.c             |    3 +-
 src/filter-edit-callbacks.c              |    8 +-
 src/filter-run-callbacks.c               |   17 +-
 src/filter-run-dialog.c                  |   13 +-
 src/folder-conf.c                        |   10 +-
 src/mailbox-conf.c                       |   73 ++-
 src/mailbox-node.c                       |   53 +-
 src/main-window.c                        |   51 +-
 src/main.c                               |   17 +-
 src/message-window.c                     |    5 +-
 src/pref-manager.c                       |   11 +-
 src/save-restore.c                       |   54 +-
 src/save-restore.h                       |    2 +-
 src/sendmsg-window.c                     |   14 +-
 34 files changed, 1346 insertions(+), 865 deletions(-)
---
diff --git a/libbalsa/filter-file.c b/libbalsa/filter-file.c
index d0c874e..d50dbc2 100644
--- a/libbalsa/filter-file.c
+++ b/libbalsa/filter-file.c
@@ -115,6 +115,9 @@ libbalsa_mailbox_filters_load_config(LibBalsaMailbox* mbox)
     LibBalsaFilter* fil;
     gboolean def;
     GSList * lst;
+    GSList * filters;
+
+    filters = libbalsa_mailbox_get_filters(mbox);
 
     /* We load the associated filters */
     libbalsa_conf_get_vector_with_default(MAILBOX_FILTERS_KEY,&nb_filters,
@@ -126,25 +129,26 @@ libbalsa_mailbox_filters_load_config(LibBalsaMailbox* mbox)
                LibBalsaMailboxFilter* mf = g_new(LibBalsaMailboxFilter,1);
 
                mf->actual_filter = fil;
-               mbox->filters=g_slist_prepend(mbox->filters, mf);
+               filters = g_slist_prepend(filters, mf);
            }
            else
                libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                                     _("Invalid filters %s for mailbox %s"),
-                                     filters_names[i], mbox->name);
+                                     filters_names[i],
+                                     libbalsa_mailbox_get_name(mbox));
        }
-       mbox->filters=g_slist_reverse(mbox->filters);
+       libbalsa_mailbox_set_filters(mbox, g_slist_reverse(filters));
     }
     g_strfreev(filters_names);
     if (!def) {
        libbalsa_conf_get_vector_with_default(MAILBOX_FILTERS_WHEN_KEY,
                                              &nb_filters,&filters_names,&def);
-       if (def)
-           for(lst = mbox->filters; lst != NULL; lst = lst->next)
+       if (def) {
+           for(lst = filters; lst != NULL; lst = lst->next)
                FILTER_WHEN_SETFLAG((LibBalsaMailboxFilter*)lst->data,
                                    FILTER_WHEN_NEVER);
-       else {
-           lst=mbox->filters;
+        } else {
+           lst = filters;
            for (i=0;i<nb_filters && lst != NULL;i++) {
                ((LibBalsaMailboxFilter*)lst->data)->when =
                     atoi(filters_names[i]);
@@ -170,7 +174,7 @@ libbalsa_mailbox_filters_save_config(LibBalsaMailbox * mbox)
      * Note : in all the following we never copy the filters name, so we don't have to (and me must not!) 
free any gchar *
      * That's why we only free g_slist and gchar **
      */
-    for (fil = mbox->filters; fil != NULL; fil = fil->next) {
+    for (fil = libbalsa_mailbox_get_filters(mbox); fil != NULL; fil = fil->next) {
        names=g_slist_prepend(names,
                               ((LibBalsaMailboxFilter*)fil->data)->actual_filter->name);
        nb_filters++;
@@ -187,7 +191,7 @@ libbalsa_mailbox_filters_save_config(LibBalsaMailbox * mbox)
     libbalsa_conf_set_vector(MAILBOX_FILTERS_KEY,nb_filters,
                             (const gchar**)filters_names);
 
-    fil=mbox->filters;
+    fil=libbalsa_mailbox_get_filters(mbox);
     for (i=0;i<nb_filters;i++) {
        filters_names[i]=
             g_strdup_printf("%d",
diff --git a/libbalsa/libbalsa.c b/libbalsa/libbalsa.c
index 7b0b461..f8ca04d 100644
--- a/libbalsa/libbalsa.c
+++ b/libbalsa/libbalsa.c
@@ -723,59 +723,6 @@ libbalsa_am_i_subthread(void)
     return g_thread_self() != main_thread_id;
 }
 
-
-#include "libbalsa_private.h"  /* for prototypes */
-static GMutex mailbox_mutex;
-static GCond  mailbox_cond;
-
-/* Lock/unlock a mailbox; no argument checking--we'll assume the caller
- * took care of that. 
- */
-#define LIBBALSA_DEBUG_THREADS FALSE
-void
-libbalsa_lock_mailbox(LibBalsaMailbox * mailbox)
-{
-       GThread *thread_id = g_thread_self();
-
-    g_mutex_lock(&mailbox_mutex);
-
-    if (mailbox->thread_id && mailbox->thread_id != thread_id)
-        while (mailbox->lock)
-            g_cond_wait(&mailbox_cond, &mailbox_mutex);
-
-    /* We'll assume that no-one would destroy a mailbox while we've been
-     * trying to lock it. If they have, we have larger problems than
-     * this reference! */
-    mailbox->lock++;
-    mailbox->thread_id = thread_id;
-
-    g_mutex_unlock(&mailbox_mutex);
-}
-
-void
-libbalsa_unlock_mailbox(LibBalsaMailbox * mailbox)
-{
-       GThread *self;
-
-    self = g_thread_self();
-
-    g_mutex_lock(&mailbox_mutex);
-
-    if (mailbox->lock == 0 || self != mailbox->thread_id) {
-       g_warning("Not holding mailbox lock!!!");
-        g_mutex_unlock(&mailbox_mutex);
-       return;
-    }
-
-    if(--mailbox->lock == 0) {
-        mailbox->thread_id = 0;
-        g_cond_broadcast(&mailbox_cond);
-    }
-
-    g_mutex_unlock(&mailbox_mutex);
-}
-
-
 /* Initialized by the front end. */
 void (*libbalsa_progress_set_text) (LibBalsaProgress * progress,
                                     const gchar * text, guint total);
diff --git a/libbalsa/mailbox-filter.c b/libbalsa/mailbox-filter.c
index 6647021..efe083d 100644
--- a/libbalsa/mailbox-filter.c
+++ b/libbalsa/mailbox-filter.c
@@ -97,9 +97,12 @@ mailbox_filters_section_lookup(const gchar * name)
 void
 config_mailbox_filters_load(LibBalsaMailbox * mbox)
 {
+    const gchar *url;
     gchar * group;
 
-    group = mailbox_filters_section_lookup(mbox->url ? mbox->url : mbox->name);
+    url = libbalsa_mailbox_get_url(mbox);
+    group = mailbox_filters_section_lookup(url != NULL ? url :
+                                           libbalsa_mailbox_get_name(mbox));
     if (group) {
        libbalsa_conf_push_group(group);
        g_free(group);
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 3a8046c..a4209f4 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -104,58 +104,77 @@ static void  mbox_drag_source_init(GtkTreeDragSourceIface *iface);
 /* GtkTreeSortable function prototypes */
 static void  mbox_sortable_init(GtkTreeSortableIface *iface);
 
-GType
-libbalsa_mailbox_get_type(void)
-{
-    static GType mailbox_type = 0;
-
-    if (!mailbox_type) {
-        static const GTypeInfo mailbox_info = {
-            sizeof(LibBalsaMailboxClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-            (GClassInitFunc) libbalsa_mailbox_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-            sizeof(LibBalsaMailbox),
-            0,                  /* n_preallocs */
-            (GInstanceInitFunc) libbalsa_mailbox_init
-        };
-
-        static const GInterfaceInfo mbox_model_info = {
-            (GInterfaceInitFunc) mbox_model_init,
-            NULL,
-            NULL
-        };
+typedef struct _LibBalsaMailboxPrivate LibBalsaMailboxPrivate;
+struct _LibBalsaMailboxPrivate {
+    gint stamp; /* used to determine iterators' validity. Increased on each
+                 * modification of mailbox. */
     
-        static const GInterfaceInfo mbox_drag_source_info = {
-            (GInterfaceInitFunc) mbox_drag_source_init,
-            NULL,
-            NULL
-        };
-
-        static const GInterfaceInfo mbox_sortable_info = {
-            (GInterfaceInitFunc) mbox_sortable_init,
-            NULL,
-            NULL
-        };
+    gchar *config_prefix;       /* unique string identifying mailbox */
+                                /* in the config file                */
+    gchar *name;                /* displayed name for a special mailbox; */
+                                /* Isn't it a GUI thing?                 */
+    gchar *url; /* Unique resource locator, file://, imap:// etc */
+    guint open_ref;
     
-        mailbox_type =
-            g_type_register_static(G_TYPE_OBJECT, "LibBalsaMailbox",
-                                   &mailbox_info, 0);
-        g_type_add_interface_static(mailbox_type,
-                                    GTK_TYPE_TREE_MODEL,
-                                    &mbox_model_info);
-        g_type_add_interface_static(mailbox_type,
-                                    GTK_TYPE_TREE_DRAG_SOURCE,
-                                    &mbox_drag_source_info);
-        g_type_add_interface_static(mailbox_type,
-                                    GTK_TYPE_TREE_SORTABLE,
-                                    &mbox_sortable_info);
-    }
+    GRecMutex rec_mutex;
+
+    gboolean is_directory;
+    gboolean readonly;
+
+    GPtrArray *mindex;  /* the basic message index used for index
+                         * displaying/columns of GtkTreeModel interface
+                         * and NOTHING else. */
+    GNode *msg_tree; /* the possibly filtered tree of messages */
+    LibBalsaCondition *view_filter; /* to choose a subset of messages
+                                     * to be displayed, e.g., only
+                                     * undeleted. */
+    LibBalsaCondition *persistent_view_filter; /* the part of the view 
+                                                * filter that will persist 
+                                                * to the next time the
+                                                * mailbox is opened */
+    gboolean view_filter_pending;  /* a view filter has been set
+                                    * but the view has not been updated */
+
+    /* info fields */
+    gboolean has_unread_messages;
+    glong unread_messages; /* number of unread messages in the mailbox */
+    unsigned first_unread; /* set to 0 if there is no unread present.
+                            * used for automatical scrolling down on opening.
+                            */
+    /* Associated filters (struct mailbox_filter) */
+    GSList * filters;
+    gboolean filters_loaded;
 
-    return mailbox_type;
-}
+    LibBalsaMailboxView *view;
+    LibBalsaMailboxState state;
+
+    /* Whether to reassemble a message from its parts. */
+    gboolean no_reassemble;
+
+    /* Whether the tree has been changed since some event. */
+    gboolean msg_tree_changed;
+
+    /* Array of msgnos that need to be displayed. */
+    GArray *msgnos_pending;
+    /* Array of msgnos that have been changed. */
+    GArray *msgnos_changed;
+
+    guint changed_idle_id;
+    guint queue_check_idle_id;
+    guint need_threading_idle_id;
+};
+
+G_DEFINE_TYPE_WITH_CODE(LibBalsaMailbox,
+                        libbalsa_mailbox,
+                        G_TYPE_OBJECT,
+                        G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
+                                              mbox_model_init)
+                        G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_DRAG_SOURCE,
+                                              mbox_drag_source_init)
+                        G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_SORTABLE,
+                                              mbox_sortable_init)
+                        G_ADD_PRIVATE(LibBalsaMailbox)
+                       )
 
 static void
 libbalsa_mailbox_class_init(LibBalsaMailboxClass * klass)
@@ -236,28 +255,29 @@ libbalsa_mailbox_class_init(LibBalsaMailboxClass * klass)
 static void
 libbalsa_mailbox_init(LibBalsaMailbox * mailbox)
 {
-    mailbox->lock = FALSE;
-    mailbox->is_directory = FALSE;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_rec_mutex_init(&priv->rec_mutex);
+    priv->is_directory = FALSE;
 
-    mailbox->config_prefix = NULL;
-    mailbox->name = NULL;
-    mailbox->url = NULL;
+    priv->config_prefix = NULL;
+    priv->name = NULL;
+    priv->url = NULL;
 
-    mailbox->open_ref = 0;
-    mailbox->has_unread_messages = FALSE;
-    mailbox->unread_messages = 0;
+    priv->open_ref = 0;
+    priv->has_unread_messages = FALSE;
+    priv->unread_messages = 0;
 
-    mailbox->readonly = FALSE;
-    mailbox->disconnected = FALSE;
+    priv->readonly = FALSE;
 
-    mailbox->filters=NULL;
-    mailbox->filters_loaded = FALSE;
-    mailbox->view=NULL;
-    /* mailbox->stamp is incremented before we use it, so it won't be
+    priv->filters=NULL;
+    priv->filters_loaded = FALSE;
+    priv->view=NULL;
+    /* priv->stamp is incremented before we use it, so it won't be
      * zero for a long, long time... */
-    mailbox->stamp = g_random_int() / 2;
+    priv->stamp = g_random_int() / 2;
 
-    mailbox->no_reassemble = FALSE;
+    priv->no_reassemble = FALSE;
 }
 
 /*
@@ -274,29 +294,32 @@ static void
 libbalsa_mailbox_dispose(GObject * object)
 {
     LibBalsaMailbox *mailbox = LIBBALSA_MAILBOX(object);
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
 
-    while (mailbox->open_ref > 0)
+    g_rec_mutex_clear(&priv->rec_mutex);
+
+    while (priv->open_ref > 0)
         libbalsa_mailbox_close(mailbox, FALSE);
 
-    if (mailbox->msgnos_pending != NULL) {
+    if (priv->msgnos_pending != NULL) {
         g_signal_handlers_disconnect_by_func(mailbox,
                                              lbm_get_index_entry_expunged_cb,
-                                             mailbox->msgnos_pending);
-        g_array_free(mailbox->msgnos_pending, TRUE);
-        mailbox->msgnos_pending = NULL;
+                                             priv->msgnos_pending);
+        g_array_free(priv->msgnos_pending, TRUE);
+        priv->msgnos_pending = NULL;
     }
 
-    if (mailbox->msgnos_changed != NULL) {
+    if (priv->msgnos_changed != NULL) {
         g_signal_handlers_disconnect_by_func(mailbox,
                                              lbm_msgno_changed_expunged_cb,
-                                             mailbox->msgnos_changed);
-        g_array_free(mailbox->msgnos_changed, TRUE);
-        mailbox->msgnos_changed = NULL;
+                                             priv->msgnos_changed);
+        g_array_free(priv->msgnos_changed, TRUE);
+        priv->msgnos_changed = NULL;
     }
 
-    libbalsa_clear_source_id(&mailbox->changed_idle_id);
-    libbalsa_clear_source_id(&mailbox->queue_check_idle_id);
-    libbalsa_clear_source_id(&mailbox->need_threading_idle_id);
+    libbalsa_clear_source_id(&priv->changed_idle_id);
+    libbalsa_clear_source_id(&priv->queue_check_idle_id);
+    libbalsa_clear_source_id(&priv->need_threading_idle_id);
 
     G_OBJECT_CLASS(parent_class)->dispose(object);
 }
@@ -305,6 +328,8 @@ libbalsa_mailbox_dispose(GObject * object)
 static gchar*
 get_from_field(LibBalsaMessage *message)
 {
+    LibBalsaMailbox *mailbox = message->mailbox;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     InternetAddressList *address_list = NULL;
     const gchar *name_str = NULL;
     gboolean append_dots = FALSE;
@@ -313,8 +338,8 @@ get_from_field(LibBalsaMessage *message)
     g_return_val_if_fail(message->mailbox, NULL);
 
     if (message->headers) {
-        if (message->mailbox->view &&
-            message->mailbox->view->show == LB_MAILBOX_SHOW_TO)
+        if (priv->view &&
+            priv->view->show == LB_MAILBOX_SHOW_TO)
             address_list = message->headers->to_list;
         else
             address_list = message->headers->from;
@@ -408,12 +433,14 @@ lbm_index_entry_free(LibBalsaMailboxIndexEntry *entry)
 void
 libbalsa_mailbox_index_entry_clear(LibBalsaMailbox * mailbox, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
     g_return_if_fail(msgno > 0);
 
-    if (msgno <= mailbox->mindex->len) {
+    if (msgno <= priv->mindex->len) {
         LibBalsaMailboxIndexEntry **entry = (LibBalsaMailboxIndexEntry **)
-            & g_ptr_array_index(mailbox->mindex, msgno - 1);
+            & g_ptr_array_index(priv->mindex, msgno - 1);
         lbm_index_entry_free(*entry);
         *entry = NULL;
 
@@ -428,12 +455,13 @@ void
 libbalsa_mailbox_index_set_flags(LibBalsaMailbox *mailbox,
                                  unsigned msgno, LibBalsaMessageFlag f)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry;
 
-    if (msgno > mailbox->mindex->len)
+    if (msgno > priv->mindex->len)
         return;
 
-    entry = g_ptr_array_index(mailbox->mindex, msgno-1);
+    entry = g_ptr_array_index(priv->mindex, msgno-1);
     if (VALID_ENTRY(entry)) {
         entry->status_icon = 
             libbalsa_get_icon_from_flags(f);
@@ -449,22 +477,21 @@ libbalsa_mailbox_index_set_flags(LibBalsaMailbox *mailbox,
 static void
 libbalsa_mailbox_finalize(GObject * object)
 {
-    LibBalsaMailbox *mailbox;
+    LibBalsaMailbox *mailbox = (LibBalsaMailbox *) object;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
 
-    g_return_if_fail(object != NULL);
-
-    mailbox = LIBBALSA_MAILBOX(object);
+    g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
 
-    g_free(mailbox->config_prefix);
-    g_free(mailbox->name);
-    g_free(mailbox->url);
+    g_free(priv->config_prefix);
+    g_free(priv->name);
+    g_free(priv->url);
 
-    libbalsa_condition_unref(mailbox->view_filter);
-    libbalsa_condition_unref(mailbox->persistent_view_filter);
+    libbalsa_condition_unref(priv->view_filter);
+    libbalsa_condition_unref(priv->persistent_view_filter);
 
-    g_slist_free_full(mailbox->filters, g_free);
+    g_slist_free_full(priv->filters, g_free);
 
-    libbalsa_mailbox_view_free(mailbox->view);
+    libbalsa_mailbox_view_free(priv->view);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
@@ -528,13 +555,15 @@ libbalsa_mailbox_new_from_config(const gchar * group)
 static void
 libbalsa_mailbox_free_mindex(LibBalsaMailbox *mailbox)
 {
-    if(mailbox->mindex) {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    if(priv->mindex) {
         unsigned i;
         /* we could have used g_ptr_array_foreach but it is >=2.4.0 */
-        for(i=0; i<mailbox->mindex->len; i++)
-            lbm_index_entry_free(g_ptr_array_index(mailbox->mindex, i));
-        g_ptr_array_free(mailbox->mindex, TRUE);
-        mailbox->mindex = NULL;
+        for(i=0; i<priv->mindex->len; i++)
+            lbm_index_entry_free(g_ptr_array_index(priv->mindex, i));
+        g_ptr_array_free(priv->mindex, TRUE);
+        priv->mindex = NULL;
     }
 }
 
@@ -544,6 +573,7 @@ static gboolean lbm_set_threading(LibBalsaMailbox * mailbox,
 gboolean
 libbalsa_mailbox_open(LibBalsaMailbox * mailbox, GError **err)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gboolean retval;
 
     g_return_val_if_fail(mailbox != NULL, FALSE);
@@ -552,26 +582,26 @@ libbalsa_mailbox_open(LibBalsaMailbox * mailbox, GError **err)
 
     libbalsa_lock_mailbox(mailbox);
 
-    if (mailbox->open_ref > 0) {
-        mailbox->open_ref++;
+    if (priv->open_ref > 0) {
+        priv->open_ref++;
        libbalsa_mailbox_check(mailbox);
         retval = TRUE;
     } else {
        LibBalsaMailboxState saved_state;
 
-        mailbox->stamp++;
-        if(mailbox->mindex) g_warning("mindex set - I leak memory");
-        mailbox->mindex = g_ptr_array_new();
+        priv->stamp++;
+        if(priv->mindex) g_warning("mindex set - I leak memory");
+        priv->mindex = g_ptr_array_new();
 
-       saved_state = mailbox->state;
-       mailbox->state = LB_MAILBOX_STATE_OPENING;
+       saved_state = priv->state;
+       priv->state = LB_MAILBOX_STATE_OPENING;
         retval =
             LIBBALSA_MAILBOX_GET_CLASS(mailbox)->open_mailbox(mailbox, err);
         if(retval) {
-            mailbox->open_ref++;
-           mailbox->state = LB_MAILBOX_STATE_OPEN;
+            priv->open_ref++;
+           priv->state = LB_MAILBOX_STATE_OPEN;
        } else {
-           mailbox->state = saved_state;
+           priv->state = saved_state;
             libbalsa_mailbox_free_mindex(mailbox);
        }
     }
@@ -588,7 +618,9 @@ libbalsa_mailbox_open(LibBalsaMailbox * mailbox, GError **err)
 gboolean
 libbalsa_mailbox_is_valid(LibBalsaMailbox * mailbox)
 {
-    if(mailbox->open_ref == 0) return TRUE;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    if(priv->open_ref == 0) return TRUE;
     if(MAILBOX_CLOSED(mailbox)) return FALSE;
     return TRUE;
 }
@@ -596,16 +628,20 @@ libbalsa_mailbox_is_valid(LibBalsaMailbox * mailbox)
 gboolean
 libbalsa_mailbox_is_open(LibBalsaMailbox *mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_val_if_fail(mailbox != NULL, FALSE);
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), FALSE);
     
 
-    return mailbox->open_ref>0; /* this will break unlisted mailbox types */
+    return priv->open_ref>0; /* this will break unlisted mailbox types */
 }
     
 void
 libbalsa_mailbox_close(LibBalsaMailbox * mailbox, gboolean expunge)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(mailbox != NULL);
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
     g_return_if_fail(MAILBOX_OPEN(mailbox));
@@ -614,18 +650,18 @@ libbalsa_mailbox_close(LibBalsaMailbox * mailbox, gboolean expunge)
     g_object_ref(mailbox);
     libbalsa_lock_mailbox(mailbox);
 
-    if (--mailbox->open_ref == 0) {
-       mailbox->state = LB_MAILBOX_STATE_CLOSING;
+    if (--priv->open_ref == 0) {
+       priv->state = LB_MAILBOX_STATE_CLOSING;
         /* do not try expunging read-only mailboxes, it's a waste of time */
-        expunge = expunge && !mailbox->readonly;
+        expunge = expunge && !priv->readonly;
         LIBBALSA_MAILBOX_GET_CLASS(mailbox)->close_mailbox(mailbox, expunge);
-        if(mailbox->msg_tree) {
-            g_node_destroy(mailbox->msg_tree);
-            mailbox->msg_tree = NULL;
+        if(priv->msg_tree) {
+            g_node_destroy(priv->msg_tree);
+            priv->msg_tree = NULL;
         }
         libbalsa_mailbox_free_mindex(mailbox);
-        mailbox->stamp++;
-       mailbox->state = LB_MAILBOX_STATE_CLOSED;
+        priv->stamp++;
+       priv->state = LB_MAILBOX_STATE_CLOSED;
     }
 
     libbalsa_unlock_mailbox(mailbox);
@@ -636,10 +672,12 @@ void
 libbalsa_mailbox_set_unread_messages_flag(LibBalsaMailbox * mailbox,
                                           gboolean has_unread)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(mailbox != NULL);
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
 
-    mailbox->has_unread_messages = (has_unread != FALSE);
+    priv->has_unread_messages = (has_unread != FALSE);
     libbalsa_mailbox_changed(mailbox);
 }
 
@@ -674,6 +712,8 @@ libbalsa_mailbox_progress_notify(LibBalsaMailbox       *mailbox,
 void
 libbalsa_mailbox_check(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(mailbox != NULL);
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
@@ -681,7 +721,7 @@ libbalsa_mailbox_check(LibBalsaMailbox * mailbox)
     libbalsa_lock_mailbox(mailbox);
 
     /* Remove any scheduled idle callback. */
-    libbalsa_clear_source_id(&mailbox->queue_check_idle_id);
+    libbalsa_clear_source_id(&priv->queue_check_idle_id);
 
     LIBBALSA_MAILBOX_GET_CLASS(mailbox)->check(mailbox);
 
@@ -691,9 +731,11 @@ libbalsa_mailbox_check(LibBalsaMailbox * mailbox)
 static gboolean
 lbm_changed_idle_cb(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     libbalsa_lock_mailbox(mailbox);
     g_signal_emit(mailbox, libbalsa_mailbox_signals[CHANGED], 0);
-    mailbox->changed_idle_id = 0;
+    priv->changed_idle_id = 0;
     libbalsa_unlock_mailbox(mailbox);
     return FALSE;
 }
@@ -701,9 +743,11 @@ lbm_changed_idle_cb(LibBalsaMailbox * mailbox)
 static void
 lbm_changed_schedule_idle(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     libbalsa_lock_mailbox(mailbox);
-    if (!mailbox->changed_idle_id)
-        mailbox->changed_idle_id =
+    if (!priv->changed_idle_id)
+        priv->changed_idle_id =
             g_idle_add((GSourceFunc) lbm_changed_idle_cb, mailbox);
     libbalsa_unlock_mailbox(mailbox);
 }
@@ -711,11 +755,13 @@ lbm_changed_schedule_idle(LibBalsaMailbox * mailbox)
 void
 libbalsa_mailbox_changed(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     libbalsa_lock_mailbox(mailbox);
     if (!g_signal_has_handler_pending
         (mailbox, libbalsa_mailbox_signals[CHANGED], 0, TRUE)) {
         /* No one cares, so don't set any message counts--that might
-         * cause mailbox->view to be created. */
+         * cause priv->view to be created. */
         libbalsa_unlock_mailbox(mailbox);
         return;
     }
@@ -725,11 +771,11 @@ libbalsa_mailbox_changed(LibBalsaMailbox * mailbox)
         libbalsa_mailbox_set_total(mailbox,
                                    libbalsa_mailbox_total_messages
                                    (mailbox));
-        libbalsa_mailbox_set_unread(mailbox, mailbox->unread_messages);
-    } else if (mailbox->has_unread_messages
+        libbalsa_mailbox_set_unread(mailbox, priv->unread_messages);
+    } else if (priv->has_unread_messages
                && libbalsa_mailbox_get_unread(mailbox) <= 0) {
         /* Mail has arrived in a closed mailbox since our last check;
-         * total is unknown, but mailbox->has_unread_messages is valid. */
+         * total is unknown, but priv->has_unread_messages is valid. */
         libbalsa_mailbox_set_total(mailbox, -1);
         libbalsa_mailbox_set_unread(mailbox, 1);
     }
@@ -790,6 +836,7 @@ libbalsa_mailbox_can_match(LibBalsaMailbox * mailbox,
 static gboolean
 lbm_run_filters_on_reception_idle_cb(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GSList *filters;
     guint progress_count;
     GSList *lst;
@@ -805,12 +852,12 @@ lbm_run_filters_on_reception_idle_cb(LibBalsaMailbox * mailbox)
         return FALSE;
     g_object_remove_weak_pointer(G_OBJECT(mailbox), (gpointer) &mailbox);
 
-    if (!mailbox->filters_loaded) {
+    if (!priv->filters_loaded) {
         config_mailbox_filters_load(mailbox);
-        mailbox->filters_loaded = TRUE;
+        priv->filters_loaded = TRUE;
     }
 
-    filters = libbalsa_mailbox_filters_when(mailbox->filters,
+    filters = libbalsa_mailbox_filters_when(priv->filters,
                                             FILTER_WHEN_INCOMING);
 
     if (!filters)
@@ -841,7 +888,7 @@ lbm_run_filters_on_reception_idle_cb(LibBalsaMailbox * mailbox)
                                             (TRUE,
                                              LIBBALSA_MESSAGE_FLAG_DELETED));
 
-    text = g_strdup_printf(_("Applying filter rules to %s"), mailbox->name);
+    text = g_strdup_printf(_("Applying filter rules to %s"), priv->name);
     total = libbalsa_mailbox_total_messages(mailbox);
     progress_total = progress_count * total;
     libbalsa_progress_set_text(&progress, text, progress_total);
@@ -905,6 +952,8 @@ void
 libbalsa_mailbox_save_config(LibBalsaMailbox * mailbox,
                              const gchar * group)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(mailbox != NULL);
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
@@ -912,8 +961,8 @@ libbalsa_mailbox_save_config(LibBalsaMailbox * mailbox,
     /* These are incase this section was used for another
      * type of mailbox that has now been deleted...
      */
-    g_free(mailbox->config_prefix);
-    mailbox->config_prefix = g_strdup(group);
+    g_free(priv->config_prefix);
+    priv->config_prefix = g_strdup(group);
     libbalsa_conf_private_remove_group(group);
     libbalsa_conf_remove_group(group);
 
@@ -995,6 +1044,8 @@ libbalsa_mailbox_real_messages_copy(LibBalsaMailbox * mailbox,
                                     GArray * msgnos,
                                     LibBalsaMailbox * dest, GError ** err)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+    LibBalsaMailboxPrivate *dest_priv = libbalsa_mailbox_get_instance_private(dest);
     gchar *text;
     guint successfully_copied;
     struct MsgCopyData mcd;
@@ -1004,8 +1055,8 @@ libbalsa_mailbox_real_messages_copy(LibBalsaMailbox * mailbox,
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(dest) != NULL);
     g_return_val_if_fail(dest != mailbox, FALSE);
 
-    text = g_strdup_printf(_("Copying from %s to %s"), mailbox->name,
-                           dest->name);
+    text = g_strdup_printf(_("Copying from %s to %s"), priv->name,
+                           dest_priv->name);
     mcd.progress = LIBBALSA_PROGRESS_INIT;
     libbalsa_progress_set_text(&mcd.progress, text, msgnos->len);
     g_free(text);
@@ -1047,25 +1098,29 @@ static void
 libbalsa_mailbox_real_save_config(LibBalsaMailbox * mailbox,
                                   const gchar * group)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
     libbalsa_conf_set_string("Type",
                              g_type_name(G_OBJECT_TYPE(mailbox)));
-    libbalsa_conf_set_string("Name", mailbox->name);
+    libbalsa_conf_set_string("Name", priv->name);
 }
 
 static void
 libbalsa_mailbox_real_load_config(LibBalsaMailbox * mailbox,
                                   const gchar * group)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
 
-    g_free(mailbox->config_prefix);
-    mailbox->config_prefix = g_strdup(group);
+    g_free(priv->config_prefix);
+    priv->config_prefix = g_strdup(group);
 
-    g_free(mailbox->name);
-    mailbox->name = libbalsa_conf_get_string("Name=Mailbox");
+    g_free(priv->name);
+    priv->name = libbalsa_conf_get_string("Name=Mailbox");
 }
 
 static gboolean
@@ -1161,7 +1216,7 @@ lbm_node_has_unseen_child(LibBalsaMailbox * lmm, GNode * node)
 {
     for (node = node->children; node; node = node->next) {
        LibBalsaMailboxIndexEntry *entry =
-           /* g_ptr_array_index(lmm->mindex, msgno - 1); ?? */
+           /* g_ptr_array_index(priv->mindex, msgno - 1); ?? */
            lbm_get_index_entry(lmm, GPOINTER_TO_UINT(node->data));
        if ((entry && entry->unseen) || lbm_node_has_unseen_child(lmm, node))
            return TRUE;
@@ -1169,7 +1224,7 @@ lbm_node_has_unseen_child(LibBalsaMailbox * lmm, GNode * node)
     return FALSE;
 }
 
-/* Protects access to mailbox->msgnos_changed; may be locked
+/* Protects access to priv->msgnos_changed; may be locked
  * with or without the gdk lock, so WE MUST NOT GRAB THE GDK LOCK WHILE
  * HOLDING IT. */
 
@@ -1181,8 +1236,10 @@ static void lbm_update_msgnos(LibBalsaMailbox * mailbox, guint seqno,
 static void
 lbm_msgno_changed_expunged_cb(LibBalsaMailbox * mailbox, guint seqno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_mutex_lock(&msgnos_changed_lock);
-    lbm_update_msgnos(mailbox, seqno, mailbox->msgnos_changed);
+    lbm_update_msgnos(mailbox, seqno, priv->msgnos_changed);
     g_mutex_unlock(&msgnos_changed_lock);
 }
 
@@ -1191,15 +1248,17 @@ static void
 lbm_msgno_row_changed(LibBalsaMailbox * mailbox, guint msgno,
                       GtkTreeIter * iter)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     if (!iter->user_data)
         iter->user_data =
-            g_node_find(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
+            g_node_find(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
                         GUINT_TO_POINTER(msgno));
 
     if (iter->user_data) {
         GtkTreePath *path;
 
-        iter->stamp = mailbox->stamp;
+        iter->stamp = priv->stamp;
         path = gtk_tree_model_get_path(GTK_TREE_MODEL(mailbox), iter);
         g_signal_emit(mailbox, libbalsa_mbox_model_signals[ROW_CHANGED], 0,
                       path, iter);
@@ -1211,27 +1270,28 @@ lbm_msgno_row_changed(LibBalsaMailbox * mailbox, guint msgno,
 static gboolean
 lbm_msgnos_changed_idle_cb(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     guint i;
 
-    if (!mailbox->msgnos_changed)
+    if (!priv->msgnos_changed)
         return FALSE;
 
 #define DEBUG FALSE
 #if DEBUG
-    g_print("%s %s %d requested\n", __func__, mailbox->name,
-            mailbox->msgnos_changed->len);
+    g_print("%s %s %d requested\n", __func__, priv->name,
+            priv->msgnos_changed->len);
 #endif
 
     g_mutex_lock(&msgnos_changed_lock);
-    for (i = 0; i < mailbox->msgnos_changed->len; i++) {
-        guint msgno = g_array_index(mailbox->msgnos_changed, guint, i);
+    for (i = 0; i < priv->msgnos_changed->len; i++) {
+        guint msgno = g_array_index(priv->msgnos_changed, guint, i);
         GtkTreeIter iter;
 
         if (!MAILBOX_OPEN(mailbox))
             break;
 
 #if DEBUG
-        g_print("%s %s msgno %d\n", __func__, mailbox->name, msgno);
+        g_print("%s %s msgno %d\n", __func__, priv->name, msgno);
 #endif
         g_mutex_unlock(&msgnos_changed_lock);
         iter.user_data = NULL;
@@ -1240,10 +1300,10 @@ lbm_msgnos_changed_idle_cb(LibBalsaMailbox * mailbox)
     }
 
 #if DEBUG
-    g_print("%s %s %d processed\n", __func__, mailbox->name,
-            mailbox->msgnos_changed->len);
+    g_print("%s %s %d processed\n", __func__, priv->name,
+            priv->msgnos_changed->len);
 #endif
-    mailbox->msgnos_changed->len = 0;
+    priv->msgnos_changed->len = 0;
     g_mutex_unlock(&msgnos_changed_lock);
 
     g_object_unref(mailbox);
@@ -1255,27 +1315,29 @@ static void
 lbm_msgno_changed(LibBalsaMailbox * mailbox, guint seqno,
                   GtkTreeIter * iter)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     if (libbalsa_am_i_subthread()) {
         g_mutex_lock(&msgnos_changed_lock);
-        if (!mailbox->msgnos_changed) {
-            mailbox->msgnos_changed =
+        if (!priv->msgnos_changed) {
+            priv->msgnos_changed =
                 g_array_new(FALSE, FALSE, sizeof(guint));
             g_signal_connect(mailbox, "message-expunged",
                              G_CALLBACK(lbm_msgno_changed_expunged_cb),
                              NULL);
         }
-        if (mailbox->msgnos_changed->len == 0)
+        if (priv->msgnos_changed->len == 0)
             g_idle_add((GSourceFunc) lbm_msgnos_changed_idle_cb,
                        g_object_ref(mailbox));
 
-        g_array_append_val(mailbox->msgnos_changed, seqno);
+        g_array_append_val(priv->msgnos_changed, seqno);
         g_mutex_unlock(&msgnos_changed_lock);
 
         /* Not calling lbm_msgno_row_changed, so we must make sure
          * iter->user_data is set: */
         if (!iter->user_data)
             iter->user_data =
-                g_node_find(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
+                g_node_find(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
                             GUINT_TO_POINTER(seqno));
         return;
     }
@@ -1286,9 +1348,10 @@ lbm_msgno_changed(LibBalsaMailbox * mailbox, guint seqno,
 void
 libbalsa_mailbox_msgno_changed(LibBalsaMailbox * mailbox, guint seqno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
 
-    if (!mailbox->msg_tree) {
+    if (!priv->msg_tree) {
         return;
     }
 
@@ -1308,11 +1371,13 @@ libbalsa_mailbox_msgno_changed(LibBalsaMailbox * mailbox, guint seqno)
 static gboolean
 lbm_need_threading_idle_cb(LibBalsaMailbox *mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     libbalsa_lock_mailbox(mailbox);
 
-    lbm_set_threading(mailbox, mailbox->view->threading_type);
+    lbm_set_threading(mailbox, priv->view->threading_type);
 
-    mailbox->need_threading_idle_id = 0;
+    priv->need_threading_idle_id = 0;
 
     libbalsa_unlock_mailbox(mailbox);
 
@@ -1323,21 +1388,22 @@ void
 libbalsa_mailbox_msgno_inserted(LibBalsaMailbox *mailbox, guint seqno,
                                 GNode * parent, GNode ** sibling)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GtkTreePath *path;
 
-    if (!mailbox->msg_tree)
+    if (!priv->msg_tree)
         return;
 #undef SANITY_CHECK
 #ifdef SANITY_CHECK
-    g_return_if_fail(!g_node_find(mailbox->msg_tree,
+    g_return_if_fail(!g_node_find(priv->msg_tree,
                                   G_PRE_ORDER, G_TRAVERSE_ALL,
                                   GUINT_TO_POINTER(seqno)));
 #endif
 
     /* Insert node into the message tree before getting path. */
     iter.user_data = g_node_new(GUINT_TO_POINTER(seqno));
-    iter.stamp = mailbox->stamp;
+    iter.stamp = priv->stamp;
     *sibling = g_node_insert_after(parent, *sibling, iter.user_data);
 
     if (g_signal_has_handler_pending(mailbox,
@@ -1350,36 +1416,37 @@ libbalsa_mailbox_msgno_inserted(LibBalsaMailbox *mailbox, guint seqno,
     }
 
     libbalsa_lock_mailbox(mailbox);
-    if (mailbox->need_threading_idle_id == 0) {
-        mailbox->need_threading_idle_id =
+    if (priv->need_threading_idle_id == 0) {
+        priv->need_threading_idle_id =
             g_idle_add((GSourceFunc) lbm_need_threading_idle_cb, mailbox);
     }
     libbalsa_unlock_mailbox(mailbox);
 
-    mailbox->msg_tree_changed = TRUE;
+    priv->msg_tree_changed = TRUE;
 }
 
 static void
 libbalsa_mailbox_msgno_filt_in(LibBalsaMailbox *mailbox, guint seqno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GtkTreePath *path;
 
-    if (!mailbox->msg_tree) {
+    if (!priv->msg_tree) {
         return;
     }
 
     /* Insert node into the message tree before getting path. */
     iter.user_data = g_node_new(GUINT_TO_POINTER(seqno));
-    iter.stamp = mailbox->stamp;
-    g_node_prepend(mailbox->msg_tree, iter.user_data);
+    iter.stamp = priv->stamp;
+    g_node_prepend(priv->msg_tree, iter.user_data);
 
     path = gtk_tree_model_get_path(GTK_TREE_MODEL(mailbox), &iter);
     g_signal_emit(mailbox, libbalsa_mbox_model_signals[ROW_INSERTED], 0,
                   path, &iter);
     gtk_tree_path_free(path);
 
-    mailbox->msg_tree_changed = TRUE;
+    priv->msg_tree_changed = TRUE;
     lbm_changed_schedule_idle(mailbox);
 }
 
@@ -1406,6 +1473,7 @@ decrease_post(GNode *node, gpointer data)
 void
 libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GtkTreePath *path;
     struct remove_data dt;
@@ -1415,7 +1483,7 @@ libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
     g_signal_emit(mailbox, libbalsa_mailbox_signals[MESSAGE_EXPUNGED],
                   0, seqno);
 
-    if (!mailbox->msg_tree) {
+    if (!priv->msg_tree) {
         return;
     }
 
@@ -1423,16 +1491,16 @@ libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
     dt.seqno = seqno;
     dt.node = NULL;
 
-    g_node_traverse(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+    g_node_traverse(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
                     decrease_post, &dt);
 
-    if (seqno <= mailbox->mindex->len) {
-        lbm_index_entry_free(g_ptr_array_index(mailbox->mindex,
+    if (seqno <= priv->mindex->len) {
+        lbm_index_entry_free(g_ptr_array_index(priv->mindex,
                                                seqno - 1));
-        g_ptr_array_remove_index(mailbox->mindex, seqno - 1);
+        g_ptr_array_remove_index(priv->mindex, seqno - 1);
     }
 
-    mailbox->msg_tree_changed = TRUE;
+    priv->msg_tree_changed = TRUE;
 
     if (!dt.node) {
         /* It's ok, apparently the view did not include this message */
@@ -1440,7 +1508,7 @@ libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
     }
 
     iter.user_data = dt.node;
-    iter.stamp = mailbox->stamp;
+    iter.stamp = priv->stamp;
     path = gtk_tree_model_get_path(GTK_TREE_MODEL(mailbox), &iter);
 
     /* First promote any children to the node's parent; we'll insert
@@ -1466,8 +1534,8 @@ libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
     }
 
     libbalsa_lock_mailbox(mailbox);
-    if (mailbox->need_threading_idle_id == 0) {
-        mailbox->need_threading_idle_id =
+    if (priv->need_threading_idle_id == 0) {
+        priv->need_threading_idle_id =
             g_idle_add((GSourceFunc) lbm_need_threading_idle_cb, mailbox);
     }
     libbalsa_unlock_mailbox(mailbox);
@@ -1485,22 +1553,23 @@ libbalsa_mailbox_msgno_removed(LibBalsaMailbox * mailbox, guint seqno)
     }
     
     gtk_tree_path_free(path);
-    mailbox->stamp++;
+    priv->stamp++;
 }
 
 static void
 libbalsa_mailbox_msgno_filt_out(LibBalsaMailbox * mailbox, GNode * node)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GtkTreePath *path;
     GNode *child, *parent;
 
-    if (!mailbox->msg_tree) {
+    if (!priv->msg_tree) {
         return;
     }
 
     iter.user_data = node;
-    iter.stamp = mailbox->stamp;
+    iter.stamp = priv->stamp;
     path = gtk_tree_model_get_path(GTK_TREE_MODEL(mailbox), &iter);
 
     /* First promote any children to the node's parent; we'll insert
@@ -1538,9 +1607,9 @@ libbalsa_mailbox_msgno_filt_out(LibBalsaMailbox * mailbox, GNode * node)
     }
     
     gtk_tree_path_free(path);
-    mailbox->stamp++;
+    priv->stamp++;
 
-    mailbox->msg_tree_changed = TRUE;
+    priv->msg_tree_changed = TRUE;
     lbm_changed_schedule_idle(mailbox);
 }
 
@@ -1557,12 +1626,13 @@ lbm_msgno_filt_check(LibBalsaMailbox * mailbox, guint seqno,
                      LibBalsaMailboxSearchIter * search_iter,
                      gboolean hold_selected)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gboolean match;
     GNode *node;
 
     match = search_iter ?
         libbalsa_mailbox_message_match(mailbox, seqno, search_iter) : TRUE;
-    node = g_node_find(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
+    node = g_node_find(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
                        GUINT_TO_POINTER(seqno));
     if (node) {
         if (!match) {
@@ -1615,9 +1685,11 @@ libbalsa_mailbox_msgno_filt_check(LibBalsaMailbox * mailbox, guint seqno,
                                   LibBalsaMailboxSearchIter * search_iter,
                                   gboolean hold_selected)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
 
-    if (!mailbox->msg_tree) {
+    if (!priv->msg_tree) {
         return;
     }
 
@@ -1658,9 +1730,11 @@ libbalsa_mailbox_search_iter_new(LibBalsaCondition * condition)
 LibBalsaMailboxSearchIter *
 libbalsa_mailbox_search_iter_view(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), NULL);
 
-    return libbalsa_mailbox_search_iter_new(mailbox->view_filter);
+    return libbalsa_mailbox_search_iter_new(priv->view_filter);
 }
 
 /* Increment reference count of a LibBalsaMailboxSearchIter, if it is
@@ -1748,17 +1822,18 @@ gboolean
 libbalsa_mailbox_msgno_find(LibBalsaMailbox * mailbox, guint seqno,
                             GtkTreePath ** path, GtkTreeIter * iter)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter tmp_iter;
 
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), FALSE);
     g_return_val_if_fail(seqno > 0, FALSE);
 
-    if (!mailbox->msg_tree || !(tmp_iter.user_data =
-        g_node_find(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
+    if (!priv->msg_tree || !(tmp_iter.user_data =
+        g_node_find(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
                     GINT_TO_POINTER(seqno))))
         return FALSE;
 
-    tmp_iter.stamp = mailbox->stamp;
+    tmp_iter.stamp = priv->stamp;
 
     if (path)
         *path =
@@ -1876,11 +1951,12 @@ libbalsa_mailbox_total_messages(LibBalsaMailbox * mailbox)
 gboolean
 libbalsa_mailbox_sync_storage(LibBalsaMailbox * mailbox, gboolean expunge)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gboolean retval = TRUE;
 
     g_return_val_if_fail(mailbox != NULL, FALSE);
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), FALSE);
-    g_return_val_if_fail(!mailbox->readonly, TRUE);
+    g_return_val_if_fail(!priv->readonly, TRUE);
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
     libbalsa_lock_mailbox(mailbox);
@@ -1902,15 +1978,16 @@ static void
 lbm_cache_message(LibBalsaMailbox * mailbox, guint msgno,
                   LibBalsaMessage * message)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry;
 
-    if (mailbox->mindex->len < msgno)
-        g_ptr_array_set_size(mailbox->mindex, msgno);
+    if (priv->mindex->len < msgno)
+        g_ptr_array_set_size(priv->mindex, msgno);
 
-    entry = g_ptr_array_index(mailbox->mindex, msgno - 1);
+    entry = g_ptr_array_index(priv->mindex, msgno - 1);
 
     if (!entry) {
-        g_ptr_array_index(mailbox->mindex, msgno - 1) =
+        g_ptr_array_index(priv->mindex, msgno - 1) =
             entry = g_new(LibBalsaMailboxIndexEntry, 1);
         lbm_index_entry_populate_from_msg(entry, message);
     } else if (entry->idle_pending)
@@ -1920,6 +1997,7 @@ lbm_cache_message(LibBalsaMailbox * mailbox, guint msgno,
 LibBalsaMessage *
 libbalsa_mailbox_get_message(LibBalsaMailbox * mailbox, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMessage *message;
 
     g_return_val_if_fail(mailbox != NULL, NULL);
@@ -1930,7 +2008,7 @@ libbalsa_mailbox_get_message(LibBalsaMailbox * mailbox, guint msgno)
 
     if (!MAILBOX_OPEN(mailbox)) {
         g_message(_("libbalsa_mailbox_get_message: mailbox %s is closed"),
-                  mailbox->name);
+                  priv->name);
         libbalsa_unlock_mailbox(mailbox);
         return NULL;
     }
@@ -1943,7 +2021,7 @@ libbalsa_mailbox_get_message(LibBalsaMailbox * mailbox, guint msgno)
 
     message = LIBBALSA_MAILBOX_GET_CLASS(mailbox)->get_message(mailbox,
                                                                msgno);
-    if (message && mailbox->mindex)
+    if (message && priv->mindex)
         /* Cache the message info, if we do not already have it. */
         lbm_cache_message(mailbox, msgno, message);
 
@@ -2044,6 +2122,7 @@ libbalsa_mailbox_messages_change_flags(LibBalsaMailbox * mailbox,
                                        LibBalsaMessageFlag set,
                                        LibBalsaMessageFlag clear)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gboolean retval;
     guint i;
     gboolean real_flag;
@@ -2052,7 +2131,7 @@ libbalsa_mailbox_messages_change_flags(LibBalsaMailbox * mailbox,
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
     real_flag = (set | clear) & LIBBALSA_MESSAGE_FLAGS_REAL;
-    g_return_val_if_fail(!mailbox->readonly || !real_flag, FALSE);
+    g_return_val_if_fail(!priv->readonly || !real_flag, FALSE);
 
     if (msgnos->len == 0)
        return TRUE;
@@ -2063,7 +2142,7 @@ libbalsa_mailbox_messages_change_flags(LibBalsaMailbox * mailbox,
     retval = LIBBALSA_MAILBOX_GET_CLASS(mailbox)->
        messages_change_flags(mailbox, msgnos, set, clear);
 
-    if (retval && mailbox->mindex && mailbox->view_filter) {
+    if (retval && priv->mindex && priv->view_filter) {
         LibBalsaMailboxSearchIter *iter_view =
             libbalsa_mailbox_search_iter_view(mailbox);
         for (i = 0; i < msgnos->len; i++) {
@@ -2162,23 +2241,24 @@ libbalsa_mailbox_set_view_filter(LibBalsaMailbox *mailbox,
                                  LibBalsaCondition *cond,
                                  gboolean update_immediately)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gboolean retval = FALSE;
 
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
     libbalsa_lock_mailbox(mailbox);
 
-    if (!libbalsa_condition_compare(mailbox->view_filter, cond))
-        mailbox->view_filter_pending = TRUE;
+    if (!libbalsa_condition_compare(priv->view_filter, cond))
+        priv->view_filter_pending = TRUE;
 
-    libbalsa_condition_unref(mailbox->view_filter);
-    mailbox->view_filter = libbalsa_condition_ref(cond);
+    libbalsa_condition_unref(priv->view_filter);
+    priv->view_filter = libbalsa_condition_ref(cond);
 
-    if (update_immediately && mailbox->view_filter_pending) {
+    if (update_immediately && priv->view_filter_pending) {
         LIBBALSA_MAILBOX_GET_CLASS(mailbox)->update_view_filter(mailbox,
                                                                 cond);
-        retval = lbm_set_threading(mailbox, mailbox->view->threading_type);
-        mailbox->view_filter_pending = FALSE;
+        retval = lbm_set_threading(mailbox, priv->view->threading_type);
+        priv->view_filter_pending = FALSE;
     }
 
     libbalsa_unlock_mailbox(mailbox);
@@ -2189,9 +2269,11 @@ libbalsa_mailbox_set_view_filter(LibBalsaMailbox *mailbox,
 void
 libbalsa_mailbox_make_view_filter_persistent(LibBalsaMailbox * mailbox)
 {
-    libbalsa_condition_unref(mailbox->persistent_view_filter);
-    mailbox->persistent_view_filter =
-        libbalsa_condition_ref(mailbox->view_filter);
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    libbalsa_condition_unref(priv->persistent_view_filter);
+    priv->persistent_view_filter =
+        libbalsa_condition_ref(priv->view_filter);
 }
 
 /* Test message flags. */
@@ -2235,8 +2317,10 @@ static void lbm_sort(LibBalsaMailbox * mbox, GNode * parent);
 static void
 lbm_check_and_sort(LibBalsaMailbox * mailbox)
 {
-    if (mailbox->msg_tree)
-        lbm_sort(mailbox, mailbox->msg_tree);
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    if (priv->msg_tree)
+        lbm_sort(mailbox, priv->msg_tree);
 
     libbalsa_mailbox_changed(mailbox);
 }
@@ -2331,13 +2415,15 @@ libbalsa_mailbox_view_free(LibBalsaMailboxView * view)
 static LibBalsaMailboxView *
 lbm_get_view(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     if (!mailbox)
        return &libbalsa_mailbox_view_default;
 
-    if (!mailbox->view)
-        mailbox->view = libbalsa_mailbox_view_new();
+    if (!priv->view)
+        priv->view = libbalsa_mailbox_view_new();
 
-    return mailbox->view;
+    return priv->view;
 }
 
 /* Set methods; NULL mailbox is valid, and changes the default value. */
@@ -2473,11 +2559,12 @@ gboolean
 libbalsa_mailbox_set_crypto_mode(LibBalsaMailbox * mailbox,
                                 LibBalsaChkCryptoMode gpg_chk_mode)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxView *view;
 
-    g_return_val_if_fail(mailbox != NULL && mailbox->view != NULL, FALSE);
+    g_return_val_if_fail(mailbox != NULL && priv->view != NULL, FALSE);
 
-    view = mailbox->view;
+    view = priv->view;
     if (view->gpg_chk_mode != gpg_chk_mode) {
        view->gpg_chk_mode = gpg_chk_mode;
        return TRUE;
@@ -2542,8 +2629,10 @@ libbalsa_mailbox_set_mtime(LibBalsaMailbox * mailbox, time_t mtime)
 const gchar *
 libbalsa_mailbox_get_identity_name(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->identity_name :
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->identity_name :
        libbalsa_mailbox_view_default.identity_name;
 }
 
@@ -2551,67 +2640,85 @@ libbalsa_mailbox_get_identity_name(LibBalsaMailbox * mailbox)
 LibBalsaMailboxThreadingType
 libbalsa_mailbox_get_threading_type(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->threading_type :
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->threading_type :
        libbalsa_mailbox_view_default.threading_type;
 }
 
 LibBalsaMailboxSortType
 libbalsa_mailbox_get_sort_type(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->sort_type : libbalsa_mailbox_view_default.sort_type;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->sort_type : libbalsa_mailbox_view_default.sort_type;
 }
 
 LibBalsaMailboxSortFields
 libbalsa_mailbox_get_sort_field(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->sort_field :
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->sort_field :
        libbalsa_mailbox_view_default.sort_field;
 }
 
 LibBalsaMailboxShow
 libbalsa_mailbox_get_show(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->show : libbalsa_mailbox_view_default.show;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->show : libbalsa_mailbox_view_default.show;
 }
 
 LibBalsaMailboxSubscribe
 libbalsa_mailbox_get_subscribe(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->subscribe : libbalsa_mailbox_view_default.subscribe;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->subscribe : libbalsa_mailbox_view_default.subscribe;
 }
 
 gboolean
 libbalsa_mailbox_get_exposed(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->exposed : libbalsa_mailbox_view_default.exposed;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->exposed : libbalsa_mailbox_view_default.exposed;
 }
 
 gboolean
 libbalsa_mailbox_get_open(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->open : libbalsa_mailbox_view_default.open;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->open : libbalsa_mailbox_view_default.open;
 }
 
 gint
 libbalsa_mailbox_get_filter(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->filter : libbalsa_mailbox_view_default.filter;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->filter : libbalsa_mailbox_view_default.filter;
 }
 
 #ifdef HAVE_GPGME
 LibBalsaChkCryptoMode
 libbalsa_mailbox_get_crypto_mode(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->gpg_chk_mode :
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->gpg_chk_mode :
        libbalsa_mailbox_view_default.gpg_chk_mode;
 }
 #endif
@@ -2619,9 +2726,11 @@ libbalsa_mailbox_get_crypto_mode(LibBalsaMailbox * mailbox)
 gint
 libbalsa_mailbox_get_unread(LibBalsaMailbox * mailbox)
 {
-    if (mailbox && mailbox->view) {
-        mailbox->view->used = 1;
-       return mailbox->view->unread;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    if (mailbox && priv->view) {
+        priv->view->used = 1;
+       return priv->view->unread;
     } else 
         return libbalsa_mailbox_view_default.unread;
 }
@@ -2629,15 +2738,19 @@ libbalsa_mailbox_get_unread(LibBalsaMailbox * mailbox)
 gint
 libbalsa_mailbox_get_total(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->total : libbalsa_mailbox_view_default.total;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->total : libbalsa_mailbox_view_default.total;
 }
 
 time_t
 libbalsa_mailbox_get_mtime(LibBalsaMailbox * mailbox)
 {
-    return (mailbox && mailbox->view) ?
-       mailbox->view->mtime : libbalsa_mailbox_view_default.mtime;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (mailbox && priv->view) ?
+       priv->view->mtime : libbalsa_mailbox_view_default.mtime;
 }
 
 /* End of get methods. */
@@ -2654,9 +2767,9 @@ libbalsa_mailbox_get_mtime(LibBalsaMailbox * mailbox)
     ((iter)!= NULL && \
      (iter)->user_data != NULL && \
      LIBBALSA_IS_MAILBOX(tree_model) && \
-     ((LibBalsaMailbox *) tree_model)->stamp == (iter)->stamp)
+     ((LibBalsaMailboxPrivate *) libbalsa_mailbox_get_instance_private(((LibBalsaMailbox *) 
tree_model)))->stamp == (iter)->stamp)
 #define VALIDATE_ITER(iter, tree_model) \
-    ((iter)->stamp = ((LibBalsaMailbox *) tree_model)->stamp)
+    ((iter)->stamp = ((LibBalsaMailboxPrivate *) libbalsa_mailbox_get_instance_private((LibBalsaMailbox *) 
tree_model))->stamp)
 #define INVALIDATE_ITER(iter) ((iter)->stamp = 0)
 
 static GtkTreeModelFlags mbox_model_get_flags  (GtkTreeModel      *tree_model);
@@ -2808,6 +2921,8 @@ mbox_model_get_path_helper(GNode * node, GNode * msg_tree)
 static GtkTreePath *
 mbox_model_get_path(GtkTreeModel * tree_model, GtkTreeIter * iter)
 {
+    LibBalsaMailbox *mailbox = (LibBalsaMailbox *) tree_model;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GNode *node;
 #ifdef SANITY_CHECK
     GNode *parent_node;
@@ -2824,9 +2939,7 @@ mbox_model_get_path(GtkTreeModel * tree_model, GtkTreeIter * iter)
 
     g_return_val_if_fail(node->parent != NULL, NULL);
 
-    return mbox_model_get_path_helper(node,
-                                      LIBBALSA_MAILBOX(tree_model)->
-                                      msg_tree);
+    return mbox_model_get_path_helper(node, priv->msg_tree);
 }
 
 /* mbox_model_get_value: 
@@ -2838,36 +2951,39 @@ static GdkPixbuf *status_icons[LIBBALSA_MESSAGE_STATUS_ICONS_NUM];
 static GdkPixbuf *attach_icons[LIBBALSA_MESSAGE_ATTACH_ICONS_NUM];
 
 
-/* Protects access to mailbox->msgnos_pending; */
+/* Protects access to priv->msgnos_pending; */
 static GMutex get_index_entry_lock;
 
 static void
 lbm_get_index_entry_expunged_cb(LibBalsaMailbox * mailbox, guint seqno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_mutex_lock(&get_index_entry_lock);
-    lbm_update_msgnos(mailbox, seqno, mailbox->msgnos_pending);
+    lbm_update_msgnos(mailbox, seqno, priv->msgnos_pending);
     g_mutex_unlock(&get_index_entry_lock);
 }
 
 static void
 lbm_get_index_entry_real(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     guint i;
 
 #if DEBUG
-    g_print("%s %s %d requested\n", __func__, mailbox->name,
-            mailbox->msgnos_pending->len);
+    g_print("%s %s %d requested\n", __func__, priv->name,
+            priv->msgnos_pending->len);
 #endif
     g_mutex_lock(&get_index_entry_lock);
-    for (i = 0; i < mailbox->msgnos_pending->len; i++) {
-        guint msgno = g_array_index(mailbox->msgnos_pending, guint, i);
+    for (i = 0; i < priv->msgnos_pending->len; i++) {
+        guint msgno = g_array_index(priv->msgnos_pending, guint, i);
         LibBalsaMessage *message;
 
         if (!MAILBOX_OPEN(mailbox))
             break;
 
 #if DEBUG
-        g_print("%s %s msgno %d\n", __func__, mailbox->name, msgno);
+        g_print("%s %s msgno %d\n", __func__, priv->name, msgno);
 #endif
         g_mutex_unlock(&get_index_entry_lock);
         if ((message = libbalsa_mailbox_get_message(mailbox, msgno)))
@@ -2878,10 +2994,10 @@ lbm_get_index_entry_real(LibBalsaMailbox * mailbox)
     }
 
 #if DEBUG
-    g_print("%s %s %d processed\n", __func__, mailbox->name,
-            mailbox->msgnos_pending->len);
+    g_print("%s %s %d processed\n", __func__, priv->name,
+            priv->msgnos_pending->len);
 #endif
-    mailbox->msgnos_pending->len = 0;
+    priv->msgnos_pending->len = 0;
     g_mutex_unlock(&get_index_entry_lock);
 
     g_object_unref(mailbox);
@@ -2891,26 +3007,27 @@ lbm_get_index_entry_real(LibBalsaMailbox * mailbox)
 static LibBalsaMailboxIndexEntry *
 lbm_get_index_entry(LibBalsaMailbox * lmm, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(lmm);
     LibBalsaMailboxIndexEntry *entry;
 
-    if (!lmm->mindex)
+    if (!priv->mindex)
         return NULL;
 
-    if (lmm->mindex->len < msgno )
-        g_ptr_array_set_size(lmm->mindex, msgno);
+    if (priv->mindex->len < msgno )
+        g_ptr_array_set_size(priv->mindex, msgno);
 
-    entry = g_ptr_array_index(lmm->mindex, msgno - 1);
+    entry = g_ptr_array_index(priv->mindex, msgno - 1);
     if (entry)
         return entry->idle_pending ? NULL : entry;
 
     g_mutex_lock(&get_index_entry_lock);
-    if (!lmm->msgnos_pending) {
-        lmm->msgnos_pending = g_array_new(FALSE, FALSE, sizeof(guint));
+    if (!priv->msgnos_pending) {
+        priv->msgnos_pending = g_array_new(FALSE, FALSE, sizeof(guint));
         g_signal_connect(lmm, "message-expunged",
                          G_CALLBACK(lbm_get_index_entry_expunged_cb), NULL);
     }
 
-    if (!lmm->msgnos_pending->len) {
+    if (!priv->msgnos_pending->len) {
         GThread *get_index_entry_thread;
 
         g_object_ref(lmm);
@@ -2921,10 +3038,10 @@ lbm_get_index_entry(LibBalsaMailbox * lmm, guint msgno)
         g_thread_unref(get_index_entry_thread);
     }
 
-    g_array_append_val(lmm->msgnos_pending, msgno);
+    g_array_append_val(priv->msgnos_pending, msgno);
     /* Make sure we have a "pending" index entry before releasing the
      * lock. */
-    g_ptr_array_index(lmm->mindex, msgno - 1) =
+    g_ptr_array_index(priv->mindex, msgno - 1) =
         lbm_index_entry_new_pending();
     g_mutex_unlock(&get_index_entry_lock);
 
@@ -3046,14 +3163,15 @@ mbox_model_iter_children(GtkTreeModel      *tree_model,
                          GtkTreeIter       *iter,
                          GtkTreeIter       *parent)
 {
+    LibBalsaMailboxPrivate *priv =
+        libbalsa_mailbox_get_instance_private(((LibBalsaMailbox *) tree_model));
     GNode *node;
 
     INVALIDATE_ITER(iter);
     g_return_val_if_fail(parent == NULL ||
                          VALID_ITER(parent, tree_model), FALSE);
 
-    node = parent ? parent->user_data
-                  : LIBBALSA_MAILBOX(tree_model)->msg_tree;
+    node = parent ? parent->user_data : priv->msg_tree;
     node = node->children;
     if (node) {
         iter->user_data = node;
@@ -3081,12 +3199,13 @@ static gint
 mbox_model_iter_n_children(GtkTreeModel      *tree_model,
                            GtkTreeIter       *iter)
 {
+    LibBalsaMailboxPrivate *priv =
+        libbalsa_mailbox_get_instance_private(((LibBalsaMailbox *) tree_model));
     GNode *node;
 
     g_return_val_if_fail(iter == NULL || VALID_ITER(iter, tree_model), 0);
 
-    node = iter ? iter->user_data
-                : LIBBALSA_MAILBOX(tree_model)->msg_tree;
+    node = iter ? iter->user_data : priv->msg_tree;
 
     return node ? g_node_n_children(node) : 0;
 }
@@ -3097,19 +3216,20 @@ mbox_model_iter_nth_child(GtkTreeModel  * tree_model,
                           GtkTreeIter   * parent,
                           gint            n)
 {
+    LibBalsaMailboxPrivate *priv =
+        libbalsa_mailbox_get_instance_private(((LibBalsaMailbox *) tree_model));
     GNode *node;
 
     INVALIDATE_ITER(iter);
-    if(!LIBBALSA_MAILBOX(tree_model)->msg_tree) 
+    if(!priv->msg_tree) 
         return FALSE; /* really, this should be never called when
                        * msg_tree == NULL but the FALSE response is
                        * fair as well and only a bit dirtier.
                        * I have more critical problems to debug now. */
     g_return_val_if_fail(parent == NULL
-                         ||VALID_ITER(parent, tree_model), FALSE);
+                         || VALID_ITER(parent, tree_model), FALSE);
 
-    node = parent ? parent->user_data
-                  : LIBBALSA_MAILBOX(tree_model)->msg_tree;
+    node = parent ? parent->user_data : priv->msg_tree;
     if(!node) /* the tree has been destroyed already (mailbox has been
                * closed), there is nothing to iterate over. This happens
                * only if mailbox is closed but a view is still active. 
@@ -3130,6 +3250,8 @@ mbox_model_iter_parent(GtkTreeModel     * tree_model,
                        GtkTreeIter      * iter,
                        GtkTreeIter      * child)
 {
+    LibBalsaMailboxPrivate *priv =
+        libbalsa_mailbox_get_instance_private(((LibBalsaMailbox *) tree_model));
     GNode *node;
 
     INVALIDATE_ITER(iter);
@@ -3138,7 +3260,7 @@ mbox_model_iter_parent(GtkTreeModel     * tree_model,
 
     node = child->user_data;
     node = node->parent;
-    if (node && node != LIBBALSA_MAILBOX(tree_model)->msg_tree) {
+    if (node && node != priv->msg_tree) {
         iter->user_data = node;
         VALIDATE_ITER(iter, tree_model);
         return TRUE;
@@ -3314,25 +3436,26 @@ mbox_compare_func(const SortTuple * a,
                   const SortTuple * b,
                   LibBalsaMailbox * mbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mbox);
     guint msgno_a;
     guint msgno_b;
     gint retval;
 
     msgno_a = GPOINTER_TO_UINT(a->node->data);
     msgno_b = GPOINTER_TO_UINT(b->node->data);
-    if (mbox->view->sort_field == LB_MAILBOX_SORT_NO)
+    if (priv->view->sort_field == LB_MAILBOX_SORT_NO)
        retval = msgno_a - msgno_b;
     else {
        LibBalsaMailboxIndexEntry *message_a;
        LibBalsaMailboxIndexEntry *message_b;
 
-       message_a = g_ptr_array_index(mbox->mindex, msgno_a - 1);
-       message_b = g_ptr_array_index(mbox->mindex, msgno_b - 1);
+       message_a = g_ptr_array_index(priv->mindex, msgno_a - 1);
+       message_b = g_ptr_array_index(priv->mindex, msgno_b - 1);
 
        if (!(VALID_ENTRY(message_a) && VALID_ENTRY(message_b)))
            return 0;
 
-       switch (mbox->view->sort_field) {
+       switch (priv->view->sort_field) {
        case LB_MAILBOX_SORT_SENDER:
            retval = mbox_compare_from(message_a, message_b);
            break;
@@ -3352,7 +3475,7 @@ mbox_compare_func(const SortTuple * a,
 
         if (retval == 0) {
             /* resolve ties using previous sort column */
-            switch (mbox->view->sort_field_prev) {
+            switch (priv->view->sort_field_prev) {
             case LB_MAILBOX_SORT_SENDER:
                 retval = mbox_compare_from(message_a, message_b);
                 break;
@@ -3372,7 +3495,7 @@ mbox_compare_func(const SortTuple * a,
         }
     }
 
-    if (mbox->view->sort_type == LB_MAILBOX_SORT_TYPE_DESC) {
+    if (priv->view->sort_type == LB_MAILBOX_SORT_TYPE_DESC) {
         retval = -retval;
     }
 
@@ -3388,12 +3511,13 @@ mbox_compare_func(const SortTuple * a,
 static gboolean
 lbm_has_valid_index_entry(LibBalsaMailbox * mailbox, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry;
 
-    if (msgno > mailbox->mindex->len)
+    if (msgno > priv->mindex->len)
         return FALSE;
 
-    entry = g_ptr_array_index(mailbox->mindex, msgno - 1);
+    entry = g_ptr_array_index(priv->mindex, msgno - 1);
 
     return VALID_ENTRY(entry);
 }
@@ -3401,11 +3525,12 @@ lbm_has_valid_index_entry(LibBalsaMailbox * mailbox, guint msgno)
 static void
 lbm_sort(LibBalsaMailbox * mbox, GNode * parent)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mbox);
     GArray *sort_array;
     GPtrArray *node_array;
     GNode *node, *tmp_node, *prev;
     guint i, j;
-    gboolean sort_no = mbox->view->sort_field == LB_MAILBOX_SORT_NO;
+    gboolean sort_no = priv->view->sort_field == LB_MAILBOX_SORT_NO;
 #if !defined(LOCAL_MAILBOX_SORTED_JUST_ONCE_ON_OPENING)
     gboolean can_sort_all = sort_no || LIBBALSA_IS_MAILBOX_IMAP(mbox);
 #else
@@ -3466,7 +3591,7 @@ lbm_sort(LibBalsaMailbox * mbox, GNode * parent)
             else
                 node = parent->children = tmp_node;
             tmp_node->prev = prev;
-            mbox->msg_tree_changed = TRUE;
+            priv->msg_tree_changed = TRUE;
         } else
             g_assert(prev == NULL || prev->next == tmp_node);
         prev = tmp_node;
@@ -3490,7 +3615,7 @@ lbm_sort(LibBalsaMailbox * mbox, GNode * parent)
             j++;
         }
 
-        iter.stamp = mbox->stamp;
+        iter.stamp = priv->stamp;
         iter.user_data = parent;
         path = parent->parent ? mbox_model_get_path(GTK_TREE_MODEL(mbox), &iter)
                               : gtk_tree_path_new();
@@ -3514,11 +3639,12 @@ mbox_get_sort_column_id(GtkTreeSortable * sortable,
                         GtkSortType     * order)
 {
     LibBalsaMailbox *mbox = (LibBalsaMailbox *) sortable;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mbox);
 
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX(sortable), FALSE);
 
     if (sort_column_id) {
-        switch (mbox->view->sort_field) {
+        switch (priv->view->sort_field) {
         default:
         case LB_MAILBOX_SORT_NO:
             *sort_column_id = LB_MBOX_MSGNO_COL;
@@ -3539,7 +3665,7 @@ mbox_get_sort_column_id(GtkTreeSortable * sortable,
     }
 
     if (order)
-        *order = (mbox->view->sort_type ==
+        *order = (priv->view->sort_type ==
                   LB_MAILBOX_SORT_TYPE_DESC ? GTK_SORT_DESCENDING :
                   GTK_SORT_ASCENDING);
 
@@ -3553,13 +3679,14 @@ mbox_set_sort_column_id(GtkTreeSortable * sortable,
                         GtkSortType       order)
 {
     LibBalsaMailbox *mbox = (LibBalsaMailbox *) sortable;
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mbox);
     LibBalsaMailboxView *view;
     LibBalsaMailboxSortFields new_field;
     LibBalsaMailboxSortType new_type;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX(sortable));
 
-    view = mbox->view;
+    view = priv->view;
 
     switch (sort_column_id) {
     default:
@@ -3605,7 +3732,7 @@ mbox_set_sort_column_id(GtkTreeSortable * sortable,
             return;
     }
     libbalsa_lock_mailbox(mbox);
-    lbm_sort(mbox, mbox->msg_tree);
+    lbm_sort(mbox, priv->msg_tree);
     libbalsa_unlock_mailbox(mbox);
 
     libbalsa_mailbox_changed(mbox);
@@ -3640,6 +3767,7 @@ void
 libbalsa_mailbox_unlink_and_prepend(LibBalsaMailbox * mailbox,
                                     GNode * node, GNode * parent)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GtkTreePath *path;
     GNode *current_parent;
@@ -3650,13 +3778,13 @@ libbalsa_mailbox_unlink_and_prepend(LibBalsaMailbox * mailbox,
     g_return_if_fail(!parent || !g_node_is_ancestor(node, parent));
 #endif
 
-    iter.stamp = mailbox->stamp;
+    iter.stamp = priv->stamp;
 
-    path = mbox_model_get_path_helper(node, mailbox->msg_tree);
+    path = mbox_model_get_path_helper(node, priv->msg_tree);
     current_parent = node->parent;
     g_node_unlink(node);
     if (path) {
-        /* The node was in mailbox->msg_tree. */
+        /* The node was in priv->msg_tree. */
         g_signal_emit(mailbox,
                       libbalsa_mbox_model_signals[ROW_DELETED], 0, path);
         if (!current_parent->children) {
@@ -3676,9 +3804,9 @@ libbalsa_mailbox_unlink_and_prepend(LibBalsaMailbox * mailbox,
     }
 
     g_node_prepend(parent, node);
-    path = mbox_model_get_path_helper(parent, mailbox->msg_tree);
+    path = mbox_model_get_path_helper(parent, priv->msg_tree);
     if (path) {
-        /* The parent is in mailbox->msg_tree. */
+        /* The parent is in priv->msg_tree. */
         if (!node->next) {
             /* It is the first child. */
             iter.user_data = parent;
@@ -3697,7 +3825,7 @@ libbalsa_mailbox_unlink_and_prepend(LibBalsaMailbox * mailbox,
                           0, path, &iter);
         gtk_tree_path_free(path);
 
-        mailbox->msg_tree_changed = TRUE;
+        priv->msg_tree_changed = TRUE;
     }
 }
 
@@ -3787,6 +3915,7 @@ lbm_update_msg_tree_move(GNode * new_node,
 static void
 lbm_update_msg_tree(LibBalsaMailbox * mailbox, GNode * new_tree)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     struct lbm_update_msg_tree_info mti;
 
     mti.mailbox = mailbox;
@@ -3798,13 +3927,13 @@ lbm_update_msg_tree(LibBalsaMailbox * mailbox, GNode * new_tree)
     g_node_traverse(new_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
                     (GNodeTraverseFunc) lbm_update_msg_tree_populate, &mti);
     /* Remove deadwood. */
-    g_node_traverse(mailbox->msg_tree, G_POST_ORDER, G_TRAVERSE_ALL, -1,
+    g_node_traverse(priv->msg_tree, G_POST_ORDER, G_TRAVERSE_ALL, -1,
                     (GNodeTraverseFunc) lbm_update_msg_tree_prune, &mti);
 
     /* Clear the nodes array and repopulate it with nodes in the current
      * tree. */
     memset(mti.nodes, 0, sizeof(GNode *) * mti.total);
-    g_node_traverse(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+    g_node_traverse(priv->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
                     (GNodeTraverseFunc) lbm_update_msg_tree_populate, &mti);
     /* Check parent-child relationships. */
     g_node_traverse(new_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
@@ -3816,19 +3945,20 @@ lbm_update_msg_tree(LibBalsaMailbox * mailbox, GNode * new_tree)
 static void
 lbm_set_msg_tree(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GtkTreeIter iter;
     GNode *node;
     GtkTreePath *path;
 
-    iter.stamp = ++mailbox->stamp;
+    iter.stamp = ++priv->stamp;
 
-    if (!mailbox->msg_tree)
+    if (!priv->msg_tree)
         return;
 
     path = gtk_tree_path_new();
     gtk_tree_path_down(path);
 
-    for (node = mailbox->msg_tree->children; node; node = node->next) {
+    for (node = priv->msg_tree->children; node; node = node->next) {
         iter.user_data = node;
         g_signal_emit(mailbox,
                       libbalsa_mbox_model_signals[ROW_INSERTED], 0, path,
@@ -3846,17 +3976,19 @@ lbm_set_msg_tree(LibBalsaMailbox * mailbox)
 void
 libbalsa_mailbox_set_msg_tree(LibBalsaMailbox * mailbox, GNode * new_tree)
 {
-    if (mailbox->msg_tree && mailbox->msg_tree->children) {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    if (priv->msg_tree && priv->msg_tree->children) {
         lbm_update_msg_tree(mailbox, new_tree);
         g_node_destroy(new_tree);
     } else {
-        if (mailbox->msg_tree)
-            g_node_destroy(mailbox->msg_tree);
-        mailbox->msg_tree = new_tree;
+        if (priv->msg_tree)
+            g_node_destroy(priv->msg_tree);
+        priv->msg_tree = new_tree;
         lbm_set_msg_tree(mailbox);
     }
 
-    mailbox->msg_tree_changed = TRUE;
+    priv->msg_tree_changed = TRUE;
 }
 
 static GMimeMessage *
@@ -3905,6 +4037,7 @@ lbm_try_reassemble_func(GMimeObject * parent, GMimeObject * mime_part,
 static void
 lbm_try_reassemble(LibBalsaMailbox * mailbox, const gchar * id)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     gchar *text;
     guint total_messages;
     LibBalsaProgress progress;
@@ -3914,7 +4047,7 @@ lbm_try_reassemble(LibBalsaMailbox * mailbox, const gchar * id)
     GArray *messages = g_array_new(FALSE, FALSE, sizeof(guint));
 
     text = g_strdup_printf(_("Searching %s for partial messages"),
-                           mailbox->name);
+                           priv->name);
     total_messages = libbalsa_mailbox_total_messages(mailbox);
     libbalsa_progress_set_text(&progress, text, total_messages);
     g_free(text);
@@ -4054,9 +4187,10 @@ void
 libbalsa_mailbox_try_reassemble(LibBalsaMailbox * mailbox,
                                 const gchar * id)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GSList *ids;
 
-    if (mailbox->no_reassemble)
+    if (priv->no_reassemble)
         return;
 
     ids = g_object_get_data(G_OBJECT(mailbox), LBM_TRY_REASSEMBLE_IDS);
@@ -4110,8 +4244,9 @@ libbalsa_mailbox_unregister_msgnos(LibBalsaMailbox * mailbox,
 LibBalsaMessageStatus
 libbalsa_mailbox_msgno_get_status(LibBalsaMailbox * mailbox, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry =
-        g_ptr_array_index(mailbox->mindex, msgno - 1);
+        g_ptr_array_index(priv->mindex, msgno - 1);
     return VALID_ENTRY(entry) ?
         entry->status_icon : LIBBALSA_MESSAGE_STATUS_ICONS_NUM;
 }
@@ -4119,8 +4254,9 @@ libbalsa_mailbox_msgno_get_status(LibBalsaMailbox * mailbox, guint msgno)
 const gchar *
 libbalsa_mailbox_msgno_get_subject(LibBalsaMailbox * mailbox, guint msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry =
-        g_ptr_array_index(mailbox->mindex, msgno - 1);
+        g_ptr_array_index(priv->mindex, msgno - 1);
     return VALID_ENTRY(entry) ? entry->subject : NULL;
 }
 
@@ -4129,13 +4265,14 @@ void
 libbalsa_mailbox_msgno_update_attach(LibBalsaMailbox * mailbox,
                                     guint msgno, LibBalsaMessage * message)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     LibBalsaMailboxIndexEntry *entry;
     LibBalsaMessageAttach attach_icon;
 
-    if (!mailbox || !mailbox->mindex || mailbox->mindex->len < msgno)
+    if (!mailbox || !priv->mindex || priv->mindex->len < msgno)
        return;
 
-    entry = g_ptr_array_index(mailbox->mindex, msgno - 1);
+    entry = g_ptr_array_index(priv->mindex, msgno - 1);
     if (!VALID_ENTRY(entry))
        return;
 
@@ -4163,6 +4300,7 @@ lbm_check_real(LibBalsaMailbox * mailbox)
 static gboolean
 lbm_check_idle(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GThread *check_thread;
 
     check_thread = g_thread_new("lbm_check_real", (GThreadFunc) lbm_check_real,
@@ -4170,7 +4308,7 @@ lbm_check_idle(LibBalsaMailbox * mailbox)
     g_thread_unref(check_thread);
 
     libbalsa_lock_mailbox(mailbox);
-    mailbox->queue_check_idle_id = 0;
+    priv->queue_check_idle_id = 0;
     libbalsa_unlock_mailbox(mailbox);
 
     return FALSE;
@@ -4179,9 +4317,11 @@ lbm_check_idle(LibBalsaMailbox * mailbox)
 static void
 lbm_queue_check(LibBalsaMailbox * mailbox)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     libbalsa_lock_mailbox(mailbox);
-    if (!mailbox->queue_check_idle_id)
-        mailbox->queue_check_idle_id =
+    if (!priv->queue_check_idle_id)
+        priv->queue_check_idle_id =
             g_idle_add((GSourceFunc) lbm_check_idle, mailbox);
     libbalsa_unlock_mailbox(mailbox);
 }
@@ -4202,13 +4342,14 @@ libbalsa_mailbox_search_iter_step(LibBalsaMailbox * mailbox,
                                   gboolean forward,
                                   guint stop_msgno)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GNode *node;
     gboolean retval = FALSE;
     gint total;
 
     node = iter->user_data;
     if (!node)
-        node = mailbox->msg_tree;
+        node = priv->msg_tree;
 
     total = libbalsa_mailbox_total_messages(mailbox);
     for (;;) {
@@ -4252,6 +4393,7 @@ gint
 libbalsa_mailbox_move_duplicates(LibBalsaMailbox * mailbox,
                                  LibBalsaMailbox * dest, GError ** err)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     GArray *msgnos = NULL;
     gint retval;
 
@@ -4261,7 +4403,7 @@ libbalsa_mailbox_move_duplicates(LibBalsaMailbox * mailbox,
         msgnos =
             LIBBALSA_MAILBOX_GET_CLASS(mailbox)->duplicate_msgnos(mailbox);
 
-    if (mailbox->state == LB_MAILBOX_STATE_CLOSED) {
+    if (priv->state == LB_MAILBOX_STATE_CLOSED) {
         /* duplicate msgnos was interrupted */
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
                     LIBBALSA_MAILBOX_DUPLICATES_ERROR,
@@ -4310,8 +4452,10 @@ void
 libbalsa_mailbox_cache_message(LibBalsaMailbox * mailbox, guint msgno,
                                LibBalsaMessage * message)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
-    if (!mailbox->mindex)
+    if (!priv->mindex)
         return;
     g_return_if_fail(msgno > 0);
     g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
@@ -4323,18 +4467,19 @@ static void
 lbm_set_color(LibBalsaMailbox * mailbox, GArray * msgnos,
               const gchar * color, gboolean foreground)
 {
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
     guint i;
 
     for (i = 0; i < msgnos->len; i++) {
         guint msgno = g_array_index(msgnos, guint, i);
         LibBalsaMailboxIndexEntry *entry;
 
-        if (msgno > mailbox->mindex->len)
+        if (msgno > priv->mindex->len)
             return;
 
-        entry = g_ptr_array_index(mailbox->mindex, msgno - 1);
+        entry = g_ptr_array_index(priv->mindex, msgno - 1);
         if (!entry)
-            entry = g_ptr_array_index(mailbox->mindex, msgno - 1) =
+            entry = g_ptr_array_index(priv->mindex, msgno - 1) =
                 g_new0(LibBalsaMailboxIndexEntry, 1);
 
         if (foreground) {
@@ -4371,3 +4516,273 @@ void libbalsa_mailbox_test_can_reach(LibBalsaMailbox          * mailbox,
 
     LIBBALSA_MAILBOX_GET_CLASS(mailbox)->test_can_reach(mailbox, cb, cb_data);
 }
+
+/*
+ * Getters
+ */
+
+GSList *
+libbalsa_mailbox_get_filters(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->filters;
+}
+
+const gchar *
+libbalsa_mailbox_get_name(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->name;
+}
+
+const gchar *
+libbalsa_mailbox_get_url(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->url;
+}
+
+glong
+libbalsa_mailbox_get_unread_messages(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->unread_messages;
+}
+
+guint
+libbalsa_mailbox_get_first_unread(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->first_unread;
+}
+
+LibBalsaCondition *
+libbalsa_mailbox_get_view_filter(LibBalsaMailbox * mailbox,
+                                 gboolean persistent)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return persistent ?  priv->persistent_view_filter : priv->view_filter;
+}
+
+GNode *
+libbalsa_mailbox_get_msg_tree(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->msg_tree;
+}
+
+gboolean
+libbalsa_mailbox_get_msg_tree_changed(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->msg_tree_changed;
+}
+
+LibBalsaMailboxState
+libbalsa_mailbox_get_state(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->state;
+}
+
+LibBalsaMailboxIndexEntry *
+libbalsa_mailbox_get_index_entry(LibBalsaMailbox * mailbox, guint msgno)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return (LibBalsaMailboxIndexEntry *) g_ptr_array_index(priv->mindex, msgno - 1);
+}
+
+LibBalsaMailboxView *
+libbalsa_mailbox_get_view(LibBalsaMailbox * mailbox)
+{
+    return lbm_get_view(mailbox);
+}
+
+gint
+libbalsa_mailbox_get_stamp(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->stamp;
+}
+
+guint
+libbalsa_mailbox_get_open_ref(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->open_ref;
+}
+
+gboolean
+libbalsa_mailbox_get_readonly(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->readonly;
+}
+
+const gchar *
+libbalsa_mailbox_get_config_prefix(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->config_prefix;
+}
+
+gboolean
+libbalsa_mailbox_get_has_unread_messages(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    return priv->has_unread_messages;
+}
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_mailbox_clear_unread_messages(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->unread_messages = 0;
+}
+
+void
+libbalsa_mailbox_set_filters(LibBalsaMailbox * mailbox, GSList * filters)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    libbalsa_clear_slist(&priv->filters, g_free);
+    priv->filters = filters;
+}
+
+void
+libbalsa_mailbox_set_url(LibBalsaMailbox * mailbox, const gchar * url)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_free(priv->url);
+    priv->url = g_strdup(url);
+}
+
+void
+libbalsa_mailbox_set_first_unread(LibBalsaMailbox * mailbox, guint first)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->first_unread = first;
+}
+
+void
+libbalsa_mailbox_set_msg_tree_changed(LibBalsaMailbox * mailbox, gboolean changed)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->msg_tree_changed = changed;
+}
+
+void
+libbalsa_mailbox_set_is_directory(LibBalsaMailbox * mailbox, gboolean is_directory)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->is_directory = is_directory;
+}
+
+void
+libbalsa_mailbox_set_readonly(LibBalsaMailbox * mailbox, gboolean readonly)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->readonly = readonly;
+}
+
+void
+libbalsa_mailbox_set_no_reassemble(LibBalsaMailbox * mailbox, gboolean no_reassemble)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->no_reassemble = no_reassemble;
+}
+
+void
+libbalsa_mailbox_set_name(LibBalsaMailbox * mailbox, const gchar * name)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_free(priv->name);
+    priv->name = g_strdup(name);
+}
+
+void
+libbalsa_mailbox_set_view(LibBalsaMailbox * mailbox, LibBalsaMailboxView * view)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    libbalsa_mailbox_view_free(priv->view);
+    priv->view = view;
+}
+
+void
+libbalsa_mailbox_set_has_unread_messages(LibBalsaMailbox * mailbox,
+                                         gboolean has_unread_messages)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->has_unread_messages = has_unread_messages;
+}
+
+void
+libbalsa_mailbox_set_config_prefix(LibBalsaMailbox * mailbox,
+                                   const gchar * config_prefix)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_free(priv->config_prefix);
+    priv->config_prefix = g_strdup(config_prefix);
+}
+
+/*
+ * Incrementers
+ */
+
+void
+libbalsa_mailbox_add_to_unread_messages(LibBalsaMailbox * mailbox, glong count)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    priv->unread_messages += count;
+}
+
+/*
+ * Locking
+ */
+
+void
+libbalsa_lock_mailbox(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_rec_mutex_lock(&priv->rec_mutex);
+}
+
+void
+libbalsa_unlock_mailbox(LibBalsaMailbox * mailbox)
+{
+    LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+
+    g_rec_mutex_unlock(&priv->rec_mutex);
+}
diff --git a/libbalsa/mailbox.h b/libbalsa/mailbox.h
index 834c41a..62d9753 100644
--- a/libbalsa/mailbox.h
+++ b/libbalsa/mailbox.h
@@ -28,24 +28,19 @@
 #include <gdk/gdk.h>
 #include <gmime/gmime.h>
 
-#define LIBBALSA_TYPE_MAILBOX \
-    (libbalsa_mailbox_get_type())
-#define LIBBALSA_MAILBOX(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIBBALSA_TYPE_MAILBOX, LibBalsaMailbox))
-#define LIBBALSA_MAILBOX_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST ((klass), LIBBALSA_TYPE_MAILBOX, \
-                              LibBalsaMailboxClass))
-#define LIBBALSA_IS_MAILBOX(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIBBALSA_TYPE_MAILBOX))
-#define LIBBALSA_IS_MAILBOX_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE ((klass), LIBBALSA_TYPE_MAILBOX))
-#define LIBBALSA_MAILBOX_GET_CLASS(mailbox) \
-    (G_TYPE_INSTANCE_GET_CLASS ((mailbox), LIBBALSA_TYPE_MAILBOX, \
-                               LibBalsaMailboxClass))
-
-#define MAILBOX_OPEN(mailbox)     (mailbox->state != LB_MAILBOX_STATE_CLOSED)
-
-#define MAILBOX_CLOSED(mailbox)   (mailbox->state == LB_MAILBOX_STATE_CLOSED)
+#define LIBBALSA_TYPE_MAILBOX (libbalsa_mailbox_get_type())
+
+G_DECLARE_DERIVABLE_TYPE(LibBalsaMailbox,
+                         libbalsa_mailbox,
+                         LIBBALSA,
+                         MAILBOX,
+                         GObject)
+
+#define MAILBOX_OPEN(mailbox) \
+        (libbalsa_mailbox_get_state(mailbox) != LB_MAILBOX_STATE_CLOSED)
+
+#define MAILBOX_CLOSED(mailbox) \
+        (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSED)
 
 #define RETURN_IF_MAILBOX_CLOSED(mailbox)\
 do {\
@@ -145,7 +140,6 @@ enum LibBalsaMailboxCapability {
 /*
  * structures
  */
-typedef struct _LibBalsaMailboxClass LibBalsaMailboxClass;
 
 typedef struct _LibBalsaMailboxView LibBalsaMailboxView;
 struct _LibBalsaMailboxView {
@@ -184,69 +178,6 @@ struct _LibBalsaMailboxView {
     time_t mtime;       /* Mailbox mtime when counts were cached. */
 };
 
-struct _LibBalsaMailbox {
-    GObject object;
-    gint stamp; /* used to determine iterators' validity. Increased on each
-                 * modification of mailbox. */
-    
-    gchar *config_prefix;       /* unique string identifying mailbox */
-                                /* in the config file                */
-    gchar *name;                /* displayed name for a special mailbox; */
-                                /* Isn't it a GUI thing?                 */
-    gchar *url; /* Unique resource locator, file://, imap:// etc */
-    guint open_ref;
-    
-    int lock; /* 0 if mailbox is unlocked; */
-              /* >0 if mailbox is (recursively locked). */
-    GThread *thread_id; /* id of thread that locked the mailbox */
-    gboolean is_directory;
-    gboolean readonly;
-    gboolean disconnected;
-
-    GPtrArray *mindex;  /* the basic message index used for index
-                         * displaying/columns of GtkTreeModel interface
-                         * and NOTHING else. */
-    GNode *msg_tree; /* the possibly filtered tree of messages;
-                      * gdk lock MUST BE HELD when accessing. */
-    LibBalsaCondition *view_filter; /* to choose a subset of messages
-                                     * to be displayed, e.g., only
-                                     * undeleted. */
-    LibBalsaCondition *persistent_view_filter; /* the part of the view 
-                                                * filter that will persist 
-                                                * to the next time the
-                                                * mailbox is opened */
-    gboolean view_filter_pending;  /* a view filter has been set
-                                    * but the view has not been updated */
-
-    /* info fields */
-    gboolean has_unread_messages;
-    glong unread_messages; /* number of unread messages in the mailbox */
-    unsigned first_unread; /* set to 0 if there is no unread present.
-                            * used for automatical scrolling down on opening.
-                            */
-    /* Associated filters (struct mailbox_filter) */
-    GSList * filters;
-    gboolean filters_loaded;
-
-    LibBalsaMailboxView *view;
-    LibBalsaMailboxState state;
-
-    /* Whether to reassemble a message from its parts. */
-    gboolean no_reassemble;
-
-    /* Whether the tree has been changed since some event. */
-    gboolean msg_tree_changed;
-
-    /* Array of msgnos that need to be displayed. */
-    GArray *msgnos_pending;
-    /* Array of msgnos that have been changed. */
-    GArray *msgnos_changed;
-
-    guint changed_idle_id;
-    guint queue_check_idle_id;
-    guint need_threading_idle_id;
-};
-
 /* Search iter */
 struct _LibBalsaMailboxSearchIter {
     gint ref_count;
@@ -330,8 +261,6 @@ struct _LibBalsaMailboxClass {
                             gpointer                   cb_data);
 };
 
-GType libbalsa_mailbox_get_type(void);
-
 LibBalsaMailbox *libbalsa_mailbox_new_from_config(const gchar * prefix);
 
 /* 
@@ -672,4 +601,50 @@ typedef enum {
 
 extern gchar **libbalsa_mailbox_date_format;
 
+/*
+ * Getters
+ */
+GSList * libbalsa_mailbox_get_filters(LibBalsaMailbox * mailbox);
+const gchar * libbalsa_mailbox_get_name(LibBalsaMailbox * mailbox);
+const gchar * libbalsa_mailbox_get_url(LibBalsaMailbox * mailbox);
+glong libbalsa_mailbox_get_unread_messages(LibBalsaMailbox * mailbox);
+guint libbalsa_mailbox_get_first_unread(LibBalsaMailbox * mailbox);
+LibBalsaCondition * libbalsa_mailbox_get_view_filter(LibBalsaMailbox * mailbox,
+                                                     gboolean persistent);
+GNode * libbalsa_mailbox_get_msg_tree(LibBalsaMailbox * mailbox);
+gboolean libbalsa_mailbox_get_msg_tree_changed(LibBalsaMailbox * mailbox);
+LibBalsaMailboxState libbalsa_mailbox_get_state(LibBalsaMailbox * mailbox);
+LibBalsaMailboxIndexEntry *libbalsa_mailbox_get_index_entry(LibBalsaMailbox * mailbox,
+                                                            guint msgno);
+LibBalsaMailboxView * libbalsa_mailbox_get_view(LibBalsaMailbox * mailbox);
+gint libbalsa_mailbox_get_stamp(LibBalsaMailbox * mailbox);
+guint libbalsa_mailbox_get_open_ref(LibBalsaMailbox * mailbox);
+gboolean libbalsa_mailbox_get_readonly(LibBalsaMailbox * mailbox);
+const gchar * libbalsa_mailbox_get_config_prefix(LibBalsaMailbox * mailbox);
+gboolean libbalsa_mailbox_get_has_unread_messages(LibBalsaMailbox * mailbox);
+
+/*
+ * Setters
+ */
+void libbalsa_mailbox_clear_unread_messages(LibBalsaMailbox * mailbox);
+void libbalsa_mailbox_set_filters(LibBalsaMailbox * mailbox, GSList * filters);
+void libbalsa_mailbox_set_url(LibBalsaMailbox * mailbox, const gchar * url);
+void libbalsa_mailbox_set_first_unread(LibBalsaMailbox * mailbox, guint first);
+void libbalsa_mailbox_set_msg_tree_changed(LibBalsaMailbox * mailbox, gboolean changed);
+void libbalsa_mailbox_set_is_directory(LibBalsaMailbox * mailbox, gboolean is_directory);
+void libbalsa_mailbox_set_readonly(LibBalsaMailbox * mailbox, gboolean readonly);
+void libbalsa_mailbox_set_no_reassemble(LibBalsaMailbox * mailbox,
+                                        gboolean no_reassemble);
+void libbalsa_mailbox_set_name(LibBalsaMailbox * mailbox, const gchar * name);
+void libbalsa_mailbox_set_view(LibBalsaMailbox * mailbox, LibBalsaMailboxView * view);
+void libbalsa_mailbox_set_has_unread_messages(LibBalsaMailbox * mailbox,
+                                              gboolean has_unread_messages);
+void libbalsa_mailbox_set_config_prefix(LibBalsaMailbox * mailbox,
+                                        const gchar * config_prefix);
+
+/*
+ * Incrementers
+ */
+void libbalsa_mailbox_add_to_unread_messages(LibBalsaMailbox * mailbox, glong count);
+
 #endif                         /* __LIBBALSA_MAILBOX_H__ */
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 6a25505..d76946c 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -79,6 +79,8 @@ struct _LibBalsaMailboxImap {
 
     ImapAclType rights;     /* RFC 4314 'myrights' */
     GList *acls;            /* RFC 4314 acl's */
+
+    gboolean disconnected;
 };
 
 struct _LibBalsaMailboxImapClass {
@@ -191,7 +193,7 @@ static struct message_info *message_info_from_msgno(
 
     if (msgno > mimap->messages_info->len) {
         printf("%s %s msgno %d > messages_info len %d\n", __func__,
-               LIBBALSA_MAILBOX(mimap)->name, msgno,
+               libbalsa_mailbox_get_name(LIBBALSA_MAILBOX(mimap)), msgno,
                mimap->messages_info->len);
         msg_info = NULL;
     } else
@@ -301,6 +303,7 @@ libbalsa_mailbox_imap_init(LibBalsaMailboxImap * mailbox)
     mailbox->handle_refs = 0;
     mailbox->sort_ranks = g_array_new(FALSE, FALSE, sizeof(guint));
     mailbox->sort_field = -1;  /* Initially invalid. */
+    mailbox->disconnected = FALSE;
 }
 
 static void
@@ -338,7 +341,7 @@ libbalsa_mailbox_imap_finalize(GObject * object)
 
     mailbox = LIBBALSA_MAILBOX_IMAP(object);
 
-    g_assert(LIBBALSA_MAILBOX(mailbox)->open_ref == 0);
+    g_assert(libbalsa_mailbox_get_open_ref(LIBBALSA_MAILBOX(mailbox)) == 0);
 
     g_free(mailbox->path);
     g_array_free(mailbox->sort_ranks, TRUE);
@@ -364,9 +367,11 @@ void
 libbalsa_mailbox_imap_update_url(LibBalsaMailboxImap* mailbox)
 {
     LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
+    gchar *url;
 
-    g_free(LIBBALSA_MAILBOX(mailbox)->url);
-    LIBBALSA_MAILBOX(mailbox)->url = libbalsa_imap_url(s, mailbox->path);
+    url = libbalsa_imap_url(s, mailbox->path);
+    libbalsa_mailbox_set_url(LIBBALSA_MAILBOX(mailbox), url);
+    g_free(url);
 }
 
 void
@@ -718,6 +723,7 @@ mi_get_imsg(LibBalsaMailboxImap *mimap, unsigned msgno)
     ImapMessage* imsg;
     struct collect_seq_data csd;
     ImapResponse rc;
+    GNode *msg_tree;
 
     /* This test too weak: I can imagine unsolicited ENVELOPE
      * responses sent from server that wil create the ImapMessage
@@ -728,8 +734,10 @@ mi_get_imsg(LibBalsaMailboxImap *mimap, unsigned msgno)
     csd.msgno_arr    = g_malloc(MAX_CHUNK_LENGTH*sizeof(csd.msgno_arr[0]));
     csd.cnt          = 0;
     csd.has_it       = 0;
-    if(LIBBALSA_MAILBOX(mimap)->msg_tree) {
-        g_node_traverse(LIBBALSA_MAILBOX(mimap)->msg_tree,
+
+    msg_tree = libbalsa_mailbox_get_msg_tree(LIBBALSA_MAILBOX(mimap));
+    if (msg_tree != NULL) {
+        g_node_traverse(msg_tree,
                         G_PRE_ORDER, G_TRAVERSE_ALL, -1, collect_seq_cb,
                         &csd);
         if(csd.cnt>MAX_CHUNK_LENGTH) csd.cnt = MAX_CHUNK_LENGTH;
@@ -774,12 +782,12 @@ idle_unread_update_cb(LibBalsaMailbox *mailbox)
     glong unread;
 
     libbalsa_lock_mailbox(mailbox);
-    unread = mailbox->unread_messages;
+    unread = libbalsa_mailbox_get_unread_messages(mailbox);
     
     lbm_imap_get_unseen(LIBBALSA_MAILBOX_IMAP(mailbox));
-    if(unread != mailbox->unread_messages)
+    if(unread != libbalsa_mailbox_get_unread_messages(mailbox))
         libbalsa_mailbox_set_unread_messages_flag(mailbox,
-                                                  mailbox->unread_messages>0);
+                                                  libbalsa_mailbox_get_unread_messages(mailbox)>0);
     LIBBALSA_MAILBOX_IMAP(mailbox)->unread_update_id = 0;
     libbalsa_unlock_mailbox(mailbox);
     return FALSE;
@@ -827,6 +835,7 @@ imap_exists_idle(gpointer data)
     LibBalsaMailboxImap *mimap = (LibBalsaMailboxImap*)data;
     LibBalsaMailbox *mailbox = LIBBALSA_MAILBOX(mimap);
     unsigned cnt;
+    GNode *msg_tree;
 
     libbalsa_lock_mailbox(mailbox);
 
@@ -868,12 +877,13 @@ imap_exists_idle(gpointer data)
             }
         } 
 
-        if (mailbox->msg_tree)
-            sibling = g_node_last_child(mailbox->msg_tree);
+        msg_tree = libbalsa_mailbox_get_msg_tree(LIBBALSA_MAILBOX(mimap));
+        if (msg_tree != NULL)
+            sibling = g_node_last_child(msg_tree);
         for(i=mimap->messages_info->len+1; i <= cnt; i++) {
             g_array_append_val(mimap->messages_info, a);
             g_ptr_array_add(mimap->msgids, NULL);
-            libbalsa_mailbox_msgno_inserted(mailbox, i, mailbox->msg_tree,
+            libbalsa_mailbox_msgno_inserted(mailbox, i, msg_tree,
                                             &sibling);
         }
         ++mimap->search_stamp;
@@ -976,6 +986,7 @@ libbalsa_mailbox_imap_get_selected_handle(LibBalsaMailboxImap *mimap,
     LibBalsaImapServer *imap_server;
     ImapResponse rc;
     unsigned uidval;
+    gboolean readonly;
 
     g_return_val_if_fail(LIBBALSA_MAILBOX_IMAP(mimap), NULL);
 
@@ -991,8 +1002,8 @@ libbalsa_mailbox_imap_get_selected_handle(LibBalsaMailboxImap *mimap,
             return NULL;
     }
     II(rc,mimap->handle,
-       imap_mbox_select(mimap->handle, mimap->path,
-                        &(LIBBALSA_MAILBOX(mimap)->readonly)));
+       imap_mbox_select(mimap->handle, mimap->path, &readonly));
+    libbalsa_mailbox_set_readonly(LIBBALSA_MAILBOX(mimap), readonly);
     if (rc != IMR_OK) {
        gchar *msg = imap_mbox_handle_get_last_msg(mimap->handle);
        g_set_error(err, LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_OPEN_ERROR,
@@ -1007,7 +1018,7 @@ libbalsa_mailbox_imap_get_selected_handle(LibBalsaMailboxImap *mimap,
     if (imap_mbox_get_my_rights(mimap->handle, &mimap->rights, FALSE) ==
         IMR_OK) {
         if (!IMAP_RIGHTS_CAN_WRITE(mimap->rights))
-            LIBBALSA_MAILBOX(mimap)->readonly = TRUE;
+            libbalsa_mailbox_set_readonly(LIBBALSA_MAILBOX(mimap), TRUE);
         if (mimap->rights & IMAP_ACL_ADMIN)
             imap_mbox_get_acl(mimap->handle, mimap->path, &mimap->acls);
     }
@@ -1037,26 +1048,29 @@ lbm_imap_get_unseen(LibBalsaMailboxImap * mimap)
 {
     LibBalsaMailbox *mailbox;
     guint i, count, total;
+    guint first_unread;
 
     if (!mimap->handle)
        return;
 
     mailbox = LIBBALSA_MAILBOX(mimap);
     total = imap_mbox_handle_get_exists(mimap->handle);
-    mailbox->first_unread = total;
+    first_unread = total;
     for(i=count=0; i<total; i++) {
         if(imap_mbox_handle_msgno_has_flags(mimap->handle,
                                             i+1,
                                             0, IMSGF_SEEN|IMSGF_DELETED)) {
             count++;
-            if(mailbox->first_unread>i)
-                mailbox->first_unread = i+1;
+            if (first_unread > i)
+                first_unread = i + 1;
         }
     }
-    if(count == 0)
-        mailbox->first_unread = 0;
-    mailbox->unread_messages = count;
+    if (count == 0)
+        first_unread = 0;
 
+    libbalsa_mailbox_set_first_unread(mailbox, first_unread);
+    libbalsa_mailbox_clear_unread_messages(mailbox);
+    libbalsa_mailbox_add_to_unread_messages(mailbox, count);
     libbalsa_mailbox_set_unread_messages_flag(mailbox, count > 0);
 }
 
@@ -1078,13 +1092,13 @@ libbalsa_mailbox_imap_open(LibBalsaMailbox * mailbox, GError **err)
 
     mimap->handle = libbalsa_mailbox_imap_get_selected_handle(mimap, err);
     if (!mimap->handle) {
-        mimap->opened         = FALSE;
-       mailbox->disconnected = TRUE;
+        mimap->opened       = FALSE;
+        mimap->disconnected = TRUE;
        return FALSE;
     }
 
-    mimap->opened         = TRUE;
-    mailbox->disconnected = FALSE;
+    mimap->opened       = TRUE;
+    mimap->disconnected = FALSE;
     total_messages = imap_mbox_handle_get_exists(mimap->handle);
     mimap->messages_info = g_array_sized_new(FALSE, TRUE,
                                             sizeof(struct message_info),
@@ -1110,17 +1124,19 @@ libbalsa_mailbox_imap_open(LibBalsaMailbox * mailbox, GError **err)
             g_object_set_data(G_OBJECT(mailbox), "cache-manager", NULL);
     }
 
-    mailbox->first_unread = imap_mbox_handle_first_unseen(mimap->handle);
+    libbalsa_mailbox_set_first_unread(mailbox,
+                                      imap_mbox_handle_first_unseen(mimap->handle));
     libbalsa_mailbox_run_filters_on_reception(mailbox);
     lbm_imap_get_unseen(mimap);
     if (mimap->search_stamp)
        ++mimap->search_stamp;
     else
-       mimap->search_stamp = mailbox->stamp;
+       mimap->search_stamp = libbalsa_mailbox_get_stamp(mailbox);
 
 #ifdef DEBUG
     g_print(_("%s: Opening %s Refcount: %d\n"),
-           "LibBalsaMailboxImap", mailbox->name, mailbox->open_ref);
+           "LibBalsaMailboxImap", libbalsa_mailbox_get_name(mailbox),
+            libbalsa_mailbox_get_open_ref(mailbox));
 #endif
     return TRUE;
 }
@@ -1608,7 +1624,7 @@ GHashTable * libbalsa_mailbox_imap_get_matchings(LibBalsaMailboxImap* mbox,
        libbalsa_information(LIBBALSA_INFORMATION_DEBUG,
                             _("IMAP SEARCH command failed for mailbox %s\n"
                               "falling back to default searching method"),
-                            LIBBALSA_MAILBOX(mbox)->url);
+                            libbalsa_mailbox_get_url(LIBBALSA_MAILBOX(mbox)));
     };
     res = cbdata->res;
     g_free(cbdata);
@@ -1670,7 +1686,7 @@ libbalsa_mailbox_imap_load_config(LibBalsaMailbox * mailbox,
        libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                              _("No path found for mailbox “%s”, "
                               "using “%s”"),
-                            mailbox->name, mimap->path);
+                            libbalsa_mailbox_get_name(mailbox), mimap->path);
     }
 
     remote = LIBBALSA_MAILBOX_REMOTE(mailbox);
@@ -1735,11 +1751,10 @@ libbalsa_mailbox_imap_force_disconnect(LibBalsaMailboxImap* mimap)
     g_return_if_fail(mimap != NULL);
 
     if (mimap->handle) {/* we do not attempt to reconnect here */
-        printf("Disconnecting %s (%u)\n", LIBBALSA_MAILBOX(mimap)->name,
-               (unsigned)time(NULL));
+        const gchar *name = libbalsa_mailbox_get_name(LIBBALSA_MAILBOX(mimap));
+        printf("Disconnecting %s (%u)\n", name, (unsigned)time(NULL));
         imap_handle_force_disconnect(mimap->handle);
-        printf("Disconnected %s (%u)\n", LIBBALSA_MAILBOX(mimap)->name,
-               (unsigned)time(NULL));
+        printf("Disconnected %s (%u)\n", name, (unsigned)time(NULL));
     }
 }
 
@@ -1752,12 +1767,13 @@ libbalsa_mailbox_imap_reconnect(LibBalsaMailboxImap* mimap)
         imap_mbox_is_disconnected (mimap->handle)) {
         const gchar *host =
             libbalsa_server_get_host(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mimap));
+        gboolean readonly;
 
         printf("Reconnecting %s (%u)\n", host, (unsigned)time(NULL));
-        if (imap_mbox_handle_reconnect
-            (mimap->handle, &(LIBBALSA_MAILBOX(mimap)->readonly))
+        if (imap_mbox_handle_reconnect(mimap->handle, &readonly)
             == IMAP_SUCCESS)
             printf("Reconnected %s (%u)\n", host, (unsigned)time(NULL));
+        libbalsa_mailbox_set_readonly(LIBBALSA_MAILBOX(mimap), readonly);
     }
 }
 
@@ -3153,11 +3169,11 @@ lbmi_get_imap_sort_key(LibBalsaMailbox *mbox)
 {
     ImapSortKey key = (ImapSortKey) LB_MBOX_FROM_COL;
 
-    switch (mbox->view->sort_field) {
+    switch (libbalsa_mailbox_get_view(mbox)->sort_field) {
     default:
     case LB_MAILBOX_SORT_NO:     key = IMSO_MSGNO;   break;
     case LB_MAILBOX_SORT_SENDER:    
-        key = mbox->view->show == LB_MAILBOX_SHOW_TO
+        key = libbalsa_mailbox_get_view(mbox)->show == LB_MAILBOX_SHOW_TO
             ? IMSO_TO : IMSO_FROM;                   break;
     case LB_MAILBOX_SORT_SUBJECT: key = IMSO_SUBJECT; break;
     case LB_MAILBOX_SORT_DATE:    key = IMSO_DATE;    break;
@@ -3174,10 +3190,11 @@ libbalsa_mailbox_imap_set_threading(LibBalsaMailbox *mailbox,
     LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
     GNode * new_tree = NULL;
     guint msgno;
-    ImapSearchKey *filter = lbmi_build_imap_query(mailbox->view_filter, NULL);
+    ImapSearchKey *filter =
+        lbmi_build_imap_query(libbalsa_mailbox_get_view_filter(mailbox, FALSE), NULL);
     ImapResponse rc;
     
-    mailbox->view->threading_type = thread_type;
+    libbalsa_mailbox_get_view(mailbox)->threading_type = thread_type;
     switch(thread_type) {
     case LB_MAILBOX_THREADING_SIMPLE:
     case LB_MAILBOX_THREADING_JWZ:
@@ -3196,7 +3213,7 @@ libbalsa_mailbox_imap_set_threading(LibBalsaMailbox *mailbox,
             II(rc,mimap->handle,
                imap_mbox_sort_filter(mimap->handle,
                                      lbmi_get_imap_sort_key(mailbox),
-                                     mailbox->view->sort_type ==
+                                     libbalsa_mailbox_get_view(mailbox)->sort_type ==
                                      LB_MAILBOX_SORT_TYPE_ASC,
                                      filter));
             if(rc == IMR_OK)
@@ -3251,7 +3268,7 @@ lbmi_compare_func(const SortTuple * a,
     retval = g_array_index(mimap->sort_ranks, guint, seqnoa - 1) -
        g_array_index(mimap->sort_ranks, guint, seqnob - 1);
 
-    return mbox->view->sort_type == LB_MAILBOX_SORT_TYPE_ASC ?
+    return libbalsa_mailbox_get_view(mbox)->sort_type == LB_MAILBOX_SORT_TYPE_ASC ?
         retval : -retval;
 }
 
@@ -3261,7 +3278,7 @@ libbalsa_mailbox_imap_sort(LibBalsaMailbox *mbox, GArray *array)
     LibBalsaMailboxImap *mimap;
 
     mimap = LIBBALSA_MAILBOX_IMAP(mbox);
-    if (mimap->sort_field != mbox->view->sort_field) {
+    if (mimap->sort_field != libbalsa_mailbox_get_view(mbox)->sort_field) {
        /* Cached ranks are invalid. */
         unsigned *msgno_arr;
         guint i, len;
@@ -3270,7 +3287,7 @@ libbalsa_mailbox_imap_sort(LibBalsaMailbox *mbox, GArray *array)
         msgno_arr = g_malloc(len * sizeof(unsigned));
         for (i = 0; i < len; i++)
             msgno_arr[i] = i + 1;
-        if (mbox->view->sort_field != LB_MAILBOX_SORT_NO) {
+        if (libbalsa_mailbox_get_view(mbox)->sort_field != LB_MAILBOX_SORT_NO) {
             ImapResponse rc;
            /* Server-side sort of the whole mailbox. */
             II(rc, LIBBALSA_MAILBOX_IMAP(mbox)->handle,
@@ -3283,7 +3300,7 @@ libbalsa_mailbox_imap_sort(LibBalsaMailbox *mbox, GArray *array)
            g_array_index(mimap->sort_ranks, guint, msgno_arr[i] - 1) = i;
        g_free(msgno_arr);
        /* Validate the cache. */
-        mimap->sort_field = mbox->view->sort_field;
+        mimap->sort_field = libbalsa_mailbox_get_view(mbox)->sort_field;
     }
     g_array_sort_with_data(array, (GCompareDataFunc) lbmi_compare_func,
                            mimap);
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index ce6c61f..194e59a 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -227,6 +227,21 @@ libbalsa_mailbox_local_new(const gchar * path, gboolean create)
     }
 }
 
+/*
+ * libbalsa_mailbox_local_get_path
+ */
+const gchar *
+libbalsa_mailbox_local_get_path(LibBalsaMailboxLocal * local)
+{
+    static const gchar prefix[] = "file://";
+    const gchar *url;
+
+    url = libbalsa_mailbox_get_url(LIBBALSA_MAILBOX(local));
+    g_assert(g_str_has_prefix(url, prefix));
+
+    return url + sizeof prefix - 1;
+}
+
 /* libbalsa_mailbox_local_set_path:
    returrns errno on error, 0 on success
    FIXME: proper suport for maildir and mh
@@ -244,7 +259,7 @@ libbalsa_mailbox_local_set_path(LibBalsaMailboxLocal * mailbox,
     klass = LIBBALSA_MAILBOX_LOCAL_GET_CLASS(mailbox);
     g_assert(klass != NULL);
 
-    if (LIBBALSA_MAILBOX(mailbox)->url != NULL) {
+    if (libbalsa_mailbox_get_url(LIBBALSA_MAILBOX(mailbox)) != NULL) {
         const gchar *cur_path = libbalsa_mailbox_local_get_path(mailbox);
         if (strcmp(path, cur_path) == 0)
             return 0;
@@ -257,11 +272,14 @@ libbalsa_mailbox_local_set_path(LibBalsaMailboxLocal * mailbox,
 
     /* update mailbox data */
     if (i == 0) {
+        gchar *url;
+
         if (klass->set_path)
             klass->set_path(mailbox, path);
-        g_free(LIBBALSA_MAILBOX(mailbox)->url);
-        LIBBALSA_MAILBOX(mailbox)->url =
-            g_strconcat("file://", path, NULL);
+        url = g_strconcat("file://", path, NULL);
+        libbalsa_mailbox_set_url(LIBBALSA_MAILBOX(mailbox), url);
+        g_free(url);
+
         return 0;
     } else
         return errno ? errno : -1;
@@ -330,15 +348,16 @@ libbalsa_mailbox_local_load_message(LibBalsaMailboxLocal * local,
                                     msg_info)
 {
     LibBalsaMailbox *mbx = LIBBALSA_MAILBOX(local);
+    LibBalsaCondition *view_filter;
     gboolean match;
 
     msg_info->loaded = TRUE;
 
     if ((msg_info->flags & LIBBALSA_MESSAGE_FLAG_NEW)
         && !(msg_info->flags & LIBBALSA_MESSAGE_FLAG_DELETED)) {
-        mbx->unread_messages++;
-        if (mbx->first_unread == 0)
-            mbx->first_unread = msgno;
+        libbalsa_mailbox_add_to_unread_messages(mbx, 1);
+        if (libbalsa_mailbox_get_first_unread(mbx) == 0)
+            libbalsa_mailbox_set_first_unread(mbx, msgno);
     }
 
     if (msg_info->flags & LIBBALSA_MESSAGE_FLAG_RECENT) {
@@ -353,14 +372,15 @@ libbalsa_mailbox_local_load_message(LibBalsaMailboxLocal * local,
         }
     }
 
-    if (!mbx->view_filter)
+    view_filter = libbalsa_mailbox_get_view_filter(mbx, FALSE);
+    if (view_filter == NULL)
         match = TRUE;
-    else if (!libbalsa_condition_is_flag_only(mbx->view_filter,
+    else if (!libbalsa_condition_is_flag_only(view_filter,
                                               mbx, msgno, &match))
-        match = message_match_real(mbx, msgno, mbx->view_filter);
+        match = message_match_real(mbx, msgno, view_filter);
 
     if (match)
-        libbalsa_mailbox_msgno_inserted(mbx, msgno, mbx->msg_tree,
+        libbalsa_mailbox_msgno_inserted(mbx, msgno, libbalsa_mailbox_get_msg_tree(mbx),
                                         sibling);
 }
 
@@ -447,12 +467,15 @@ libbalsa_mailbox_local_load_config(LibBalsaMailbox * mailbox,
                                   const gchar * prefix)
 {
     gchar* path;
+    gchar *url;
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX_LOCAL(mailbox));
 
-    g_free(mailbox->url);
 
     path = libbalsa_conf_get_string("Path");
-    mailbox->url = g_strconcat("file://", path, NULL);
+    url = g_strconcat("file://", path, NULL);
+    libbalsa_mailbox_set_url(mailbox, url);
+    g_free(url);
     g_free(path);
 
     if (LIBBALSA_MAILBOX_CLASS(parent_class)->load_config)
@@ -535,13 +558,14 @@ lbm_local_save_tree(LibBalsaMailboxLocal * local)
 
     g_assert(LIBBALSA_MAILBOX_LOCAL_GET_CLASS(local) != NULL);
 
-    if (!mailbox->msg_tree || !mailbox->msg_tree_changed)
+    if (!libbalsa_mailbox_get_msg_tree(mailbox) ||
+        !libbalsa_mailbox_get_msg_tree_changed(mailbox))
         return;
-    mailbox->msg_tree_changed = FALSE;
+    libbalsa_mailbox_set_msg_tree_changed(mailbox, FALSE);
 
     filename = lbm_local_get_cache_filename(local);
 
-    if (!mailbox->msg_tree->children
+    if (!libbalsa_mailbox_get_msg_tree(mailbox)->children
         || (libbalsa_mailbox_get_threading_type(mailbox) ==
             LB_MAILBOX_THREADING_FLAT
             && libbalsa_mailbox_get_sort_field(mailbox) ==
@@ -559,7 +583,7 @@ lbm_local_save_tree(LibBalsaMailboxLocal * local)
                              &save_info);
 
     /* Pre-order is required for the file to be created correctly. */
-    g_node_traverse(mailbox->msg_tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+    g_node_traverse(libbalsa_mailbox_get_msg_tree(mailbox), G_PRE_ORDER, G_TRAVERSE_ALL, -1,
                     (GNodeTraverseFunc) lbm_local_save_tree_func,
                     &save_info);
 
@@ -580,6 +604,7 @@ lbm_local_restore_tree(LibBalsaMailboxLocal * local, guint * total)
 {
     LibBalsaMailbox *mailbox = LIBBALSA_MAILBOX(local);
     gchar *filename;
+    const gchar *mailbox_name;
     gchar *name;
     struct stat st;
     gchar *contents;
@@ -594,7 +619,8 @@ lbm_local_restore_tree(LibBalsaMailboxLocal * local, guint * total)
     g_assert(LIBBALSA_MAILBOX_LOCAL_GET_CLASS(local) != NULL);
 
     filename = lbm_local_get_cache_filename(local);
-    name = mailbox->name ? g_strdup(mailbox->name) :
+    mailbox_name = libbalsa_mailbox_get_name(mailbox);
+    name = mailbox_name != NULL ? g_strdup(mailbox_name) :
         g_path_get_basename(libbalsa_mailbox_local_get_path(local));
 
     if (stat(filename, &st) < 0
@@ -639,7 +665,7 @@ lbm_local_restore_tree(LibBalsaMailboxLocal * local, guint * total)
     *total = info->value.total;
 
     seen = g_new0(guint8, *total);
-    parent = mailbox->msg_tree;
+    parent = libbalsa_mailbox_get_msg_tree(mailbox);
     sibling = NULL;
     get_info = LIBBALSA_MAILBOX_LOCAL_GET_CLASS(local)->get_info;
     while (++info < (LibBalsaMailboxLocalTreeInfo *) (contents + length)) {
@@ -689,10 +715,13 @@ lbm_local_restore_tree(LibBalsaMailboxLocal * local, guint * total)
                                              LIBBALSA_MESSAGE_FLAG_NEW,
                                              LIBBALSA_MESSAGE_FLAG_DELETED))
         {
-            ++mailbox->unread_messages;
-            if (mailbox->first_unread == 0 ||
-                mailbox->first_unread > info->msgno)
-                mailbox->first_unread = info->msgno;
+            guint first_unread;
+
+            libbalsa_mailbox_add_to_unread_messages(mailbox, 1);
+
+            first_unread = libbalsa_mailbox_get_first_unread(mailbox);
+            if (first_unread == 0 || first_unread > info->msgno)
+                libbalsa_mailbox_set_first_unread(mailbox, info->msgno);
         }
     }
 
@@ -710,7 +739,7 @@ lbm_local_save_tree_real(LibBalsaMailboxLocal * local)
 
     libbalsa_lock_mailbox(mailbox);
 
-    if (MAILBOX_OPEN(mailbox) && mailbox->msg_tree_changed)
+    if (MAILBOX_OPEN(mailbox) && libbalsa_mailbox_get_msg_tree_changed(mailbox))
         lbm_local_save_tree(local);
     local->save_tree_id = 0;
 
@@ -751,7 +780,8 @@ libbalsa_mailbox_local_close_mailbox(LibBalsaMailbox * mailbox,
 
     /* Restore the persistent view before saving the tree. */
     libbalsa_mailbox_set_view_filter(mailbox,
-                                     mailbox->persistent_view_filter, TRUE);
+                                     libbalsa_mailbox_get_view_filter(mailbox, TRUE),
+                                     TRUE);
 
     if (local->thread_id) {
         /* Rethread immediately. */
@@ -824,7 +854,7 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
     gboolean match = FALSE;
     gboolean is_refed = FALSE;
     LibBalsaMailboxIndexEntry *entry =
-        g_ptr_array_index(mailbox->mindex, msgno-1);
+        libbalsa_mailbox_get_index_entry(mailbox, msgno);
     LibBalsaMailboxLocalInfo *info =
         msgno <= local->threading_info->len ?
         g_ptr_array_index(local->threading_info, msgno - 1) : NULL;
@@ -837,7 +867,7 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
         if (!message)
             return FALSE;
         libbalsa_mailbox_local_cache_message(local, msgno, message);
-        entry = g_ptr_array_index(mailbox->mindex, msgno-1);
+        entry = libbalsa_mailbox_get_index_entry(mailbox, msgno);
         info  = g_ptr_array_index(local->threading_info, msgno - 1);
     }
 
@@ -1043,7 +1073,7 @@ lbml_load_messages_idle_cb(LibBalsaMailbox * mailbox)
     libbalsa_lock_mailbox(mailbox);
     local->load_messages_id = 0;
 
-    if (!mailbox->msg_tree) {
+    if (!libbalsa_mailbox_get_msg_tree(mailbox)) {
        /* Mailbox is closed, or no view has been created. */
         libbalsa_unlock_mailbox(mailbox);
        return FALSE;
@@ -1052,7 +1082,7 @@ lbml_load_messages_idle_cb(LibBalsaMailbox * mailbox)
     lastno = libbalsa_mailbox_total_messages(mailbox);
     msgno = local->msgno;
     new_messages = lastno - msgno;
-    lastn = g_node_last_child(mailbox->msg_tree);
+    lastn = g_node_last_child(libbalsa_mailbox_get_msg_tree(mailbox));
     get_info = LIBBALSA_MAILBOX_LOCAL_GET_CLASS(local)->get_info;
     while (++msgno <= lastno){
         LibBalsaMailboxLocalMessageInfo *msg_info = get_info(local, msgno);
@@ -1067,8 +1097,8 @@ lbml_load_messages_idle_cb(LibBalsaMailbox * mailbox)
     if (new_messages) {
        libbalsa_mailbox_run_filters_on_reception(mailbox);
        libbalsa_mailbox_set_unread_messages_flag(mailbox,
-                                                 mailbox->
-                                                 unread_messages > 0);
+                                                 libbalsa_mailbox_get_unread_messages
+                                                  (mailbox) > 0);
     }
 
     libbalsa_unlock_mailbox(mailbox);
@@ -1148,7 +1178,7 @@ libbalsa_mailbox_local_set_threading(LibBalsaMailbox * mailbox,
 #if defined(DEBUG_LOADING_AND_THREADING)
     printf("before load_messages: time=%lu\n", (unsigned long) time(NULL));
 #endif
-    if (!mailbox->msg_tree) {   /* first reference */
+    if (!libbalsa_mailbox_get_msg_tree(mailbox)) {   /* first reference */
         guint total = 0;
         gboolean natural = (thread_type == LB_MAILBOX_THREADING_FLAT
                             && libbalsa_mailbox_get_sort_field(mailbox) ==
@@ -1160,7 +1190,7 @@ libbalsa_mailbox_local_set_threading(LibBalsaMailbox * mailbox,
             libbalsa_mailbox_set_msg_tree(mailbox, g_node_new(NULL));
             total = 0;
         }
-        mailbox->msg_tree_changed = FALSE;
+        libbalsa_mailbox_set_msg_tree_changed (mailbox, FALSE);
 
         if (total < libbalsa_mailbox_total_messages(mailbox)) {
             if (!natural)
@@ -1228,7 +1258,7 @@ lbm_local_update_view_filter(LibBalsaMailbox * mailbox,
         && !libbalsa_condition_is_flag_only(view_filter, NULL, 0, NULL)) {
         gchar *text;
 
-        text = g_strdup_printf(_("Filtering %s"), mailbox->name);
+        text = g_strdup_printf(_("Filtering %s"), libbalsa_mailbox_get_name(mailbox));
         libbalsa_progress_set_text(&progress, text, total);
         g_free(text);
         is_flag_only = FALSE;
@@ -1317,7 +1347,7 @@ libbalsa_mailbox_local_prepare_threading(LibBalsaMailbox * mailbox,
     libbalsa_lock_mailbox(mailbox);
     libbalsa_mailbox_local_set_threading_info(local);
 
-    text = g_strdup_printf(_("Preparing %s"), mailbox->name);
+    text = g_strdup_printf(_("Preparing %s"), libbalsa_mailbox_get_name(mailbox));
     total = libbalsa_mailbox_total_messages(mailbox);
     libbalsa_progress_set_text(&progress, text, total - start);
     g_free(text);
@@ -1455,7 +1485,7 @@ static void
 lbml_info_setup(LibBalsaMailbox * mailbox, ThreadingInfo * ti)
 {
     ti->mailbox = mailbox;
-    ti->root = g_node_new(mailbox->msg_tree);
+    ti->root = g_node_new(libbalsa_mailbox_get_msg_tree(mailbox));
     ti->id_table = g_hash_table_new(g_str_hash, g_str_equal);
     ti->subject_table = NULL;
 }
@@ -1484,7 +1514,7 @@ lbml_threading_jwz(LibBalsaMailbox * mailbox)
     lbml_info_setup(mailbox, &ti);
 
     /* Traverse the mailbox's msg_tree, to build the second tree. */
-    g_node_traverse(mailbox->msg_tree, G_POST_ORDER, G_TRAVERSE_ALL, -1,
+    g_node_traverse(libbalsa_mailbox_get_msg_tree(mailbox), G_POST_ORDER, G_TRAVERSE_ALL, -1,
                    (GNodeTraverseFunc) lbml_set_parent, &ti);
     /* Prune the second tree. */
     g_node_traverse(ti.root, G_POST_ORDER, G_TRAVERSE_ALL, -1,
@@ -1995,7 +2025,7 @@ static void
 lbml_threading_simple(LibBalsaMailbox * mailbox,
                      LibBalsaMailboxThreadingType type)
 {
-    GNode *msg_tree = mailbox->msg_tree;
+    GNode *msg_tree = libbalsa_mailbox_get_msg_tree(mailbox);
     ThreadingInfo ti;
 
     lbml_info_setup(mailbox, &ti);
@@ -2040,9 +2070,10 @@ lbml_thread_message(GNode * node, ThreadingInfo * ti)
         return FALSE;
 
     if (ti->type == LB_MAILBOX_THREADING_FLAT) {
-        if (node->parent != ti->mailbox->msg_tree)
+        if (node->parent != libbalsa_mailbox_get_msg_tree(ti->mailbox))
             libbalsa_mailbox_unlink_and_prepend(ti->mailbox, node,
-                                                ti->mailbox->msg_tree);
+                                                libbalsa_mailbox_get_msg_tree
+                                                (ti->mailbox));
     } else {
         LibBalsaMailboxLocalInfo *info;
         GList *refs;
@@ -2058,7 +2089,7 @@ lbml_thread_message(GNode * node, ThreadingInfo * ti)
                                          g_list_last(refs)->data);
 
         if (!parent)
-            parent = ti->mailbox->msg_tree;
+            parent = libbalsa_mailbox_get_msg_tree(ti->mailbox);
         if (parent != node->parent && parent != node
             && !g_node_is_ancestor(node, parent))
             libbalsa_mailbox_unlink_and_prepend(ti->mailbox, node, parent);
@@ -2105,7 +2136,7 @@ libbalsa_mailbox_local_get_message_stream(LibBalsaMailbox * mailbox,
     int fd;
     GMimeStream *stream = NULL;
 
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
     filename = g_build_filename(path, name1, name2, NULL);
 
     fd = open(filename, O_RDONLY);
@@ -2136,7 +2167,7 @@ lbm_local_sync_real(LibBalsaMailboxLocal * local)
         !libbalsa_mailbox_sync_storage(mailbox, FALSE))   /* cannot sync */
        libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                             _("Failed to sync mailbox “%s”"),
-                            mailbox->name);
+                            libbalsa_mailbox_get_name(mailbox));
     local->sync_id = 0;
     local->sync_time += time(NULL)-tstart;
     local->sync_cnt++;
@@ -2271,16 +2302,16 @@ libbalsa_mailbox_local_messages_change_flags(LibBalsaMailbox * mailbox,
             is_unread_undeleted =
                 (msg_info->flags & LIBBALSA_MESSAGE_FLAG_NEW)
                 && !(msg_info->flags & LIBBALSA_MESSAGE_FLAG_DELETED);
-            mailbox->unread_messages +=
-                is_unread_undeleted - was_unread_undeleted;
+            libbalsa_mailbox_add_to_unread_messages(mailbox,
+                is_unread_undeleted - was_unread_undeleted);
         }
     }
     libbalsa_unlock_mailbox(mailbox);
 
     if (changed > 0) {
-        libbalsa_mailbox_set_unread_messages_flag(mailbox,
-                                                  mailbox->unread_messages
-                                                  > 0);
+       libbalsa_mailbox_set_unread_messages_flag(mailbox,
+                                                 libbalsa_mailbox_get_unread_messages
+                                                  (mailbox) > 0);
         lbm_local_sync_queue(local);
     }
 
diff --git a/libbalsa/mailbox_local.h b/libbalsa/mailbox_local.h
index 89d9988..2caad75 100644
--- a/libbalsa/mailbox_local.h
+++ b/libbalsa/mailbox_local.h
@@ -101,8 +101,7 @@ gint libbalsa_mailbox_local_set_path(LibBalsaMailboxLocal * mailbox,
 void libbalsa_mailbox_local_set_threading_info(LibBalsaMailboxLocal *
                                                local);
 
-#define libbalsa_mailbox_local_get_path(mbox) \
-       ((const gchar *) (LIBBALSA_MAILBOX(mbox))->url+7)
+const gchar *libbalsa_mailbox_local_get_path(LibBalsaMailboxLocal * local);
 
 void libbalsa_mailbox_local_load_messages(LibBalsaMailbox * mailbox,
                                          guint last_msgno);
diff --git a/libbalsa/mailbox_maildir.c b/libbalsa/mailbox_maildir.c
index 78e7f43..97f7524 100644
--- a/libbalsa/mailbox_maildir.c
+++ b/libbalsa/mailbox_maildir.c
@@ -264,7 +264,7 @@ libbalsa_mailbox_maildir_new(const gchar * path, gboolean create)
 
     mailbox = g_object_new(LIBBALSA_TYPE_MAILBOX_MAILDIR, NULL);
 
-    mailbox->is_directory = TRUE;
+    libbalsa_mailbox_set_is_directory(mailbox, TRUE);
 
     if (libbalsa_mailbox_local_set_path(LIBBALSA_MAILBOX_LOCAL(mailbox),
                                         path, create) != 0) {
@@ -326,8 +326,10 @@ static void
 lbm_maildir_remove_files(LibBalsaMailboxLocal *mailbox)
 {
     const gchar* path;
+
     g_return_if_fail(LIBBALSA_IS_MAILBOX_MAILDIR(mailbox));
-    path = libbalsa_mailbox_local_get_path(mailbox);
+
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
     g_print("DELETE MAILDIR\n");
 
     if (!libbalsa_delete_directory_contents(path)) {
@@ -386,6 +388,7 @@ static LibBalsaMessageFlag parse_filename(const gchar *subdir,
 static void lbm_maildir_parse(LibBalsaMailboxMaildir * mdir,
                               const gchar *subdir, guint * fileno)
 {
+    const gchar *local_path;
     gchar *path;
     GDir *dir;
     GHashTable *messages_info;
@@ -396,8 +399,8 @@ static void lbm_maildir_parse(LibBalsaMailboxMaildir * mdir,
     LibBalsaMessageFlag flags;
     LibBalsaMailbox *mailbox = (LibBalsaMailbox *) mdir;
 
-    path = g_build_filename(libbalsa_mailbox_local_get_path(mailbox),
-                           subdir, NULL);
+    local_path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
+    path = g_build_filename(local_path, subdir, NULL);
     dir = g_dir_open(path, 0, NULL);
     g_free(path);
     if (dir == NULL)
@@ -477,7 +480,7 @@ libbalsa_mailbox_maildir_open(LibBalsaMailbox * mailbox, GError **err)
     g_return_val_if_fail(LIBBALSA_IS_MAILBOX_MAILDIR(mailbox), FALSE);
 
     mdir = LIBBALSA_MAILBOX_MAILDIR(mailbox);
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
 
     if (stat(path, &st) == -1) {
        g_set_error(err, LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_OPEN_ERROR,
@@ -492,16 +495,17 @@ libbalsa_mailbox_maildir_open(LibBalsaMailbox * mailbox, GError **err)
     if (stat(mdir->tmpdir, &st) != -1)
        libbalsa_mailbox_set_mtime(mailbox, st.st_mtime);
 
-    mailbox->readonly = 
+    libbalsa_mailbox_set_readonly(mailbox,
        !(access(mdir->curdir, W_OK) == 0 &&
           access(mdir->newdir, W_OK) == 0 &&
-          access(mdir->tmpdir, W_OK) == 0);
+          access(mdir->tmpdir, W_OK) == 0));
 
-    mailbox->unread_messages = 0;
+    libbalsa_mailbox_clear_unread_messages(mailbox);
     lbm_maildir_parse_subdirs(mdir);
 #ifdef DEBUG
     g_print(_("%s: Opening %s Refcount: %d\n"),
-           "LibBalsaMailboxMaildir", mailbox->name, mailbox->open_ref);
+           "LibBalsaMailboxMaildir", libbalsa_mailbox_get_name(mailbox),
+            libbalsa_mailbox_get_open_ref(mailbox));
 #endif
     return TRUE;
 }
@@ -570,7 +574,7 @@ libbalsa_mailbox_maildir_check(LibBalsaMailbox * mailbox)
     }
 
     /* Was any message removed? */
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
     renumber = mdir->msgno_2_msg_info->len + 1;
     for (msgno = 1; msgno <= mdir->msgno_2_msg_info->len; ) {
        gchar *filename;
@@ -748,7 +752,7 @@ libbalsa_mailbox_maildir_sync(LibBalsaMailbox * mailbox, gboolean expunge)
      * record mtime of dirs
      */
     LibBalsaMailboxMaildir *mdir = LIBBALSA_MAILBOX_MAILDIR(mailbox);
-    const gchar *path = libbalsa_mailbox_local_get_path(mailbox);
+    const gchar *path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
     GSList *removed_list = NULL;
     gboolean ok = TRUE;
     GSList *l;
@@ -771,7 +775,7 @@ libbalsa_mailbox_maildir_sync(LibBalsaMailbox * mailbox, gboolean expunge)
            continue;
        }
 
-       if (mailbox->state == LB_MAILBOX_STATE_CLOSING)
+       if (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSING)
            msg_info->local_info.flags &= ~LIBBALSA_MESSAGE_FLAG_RECENT;
        if (((msg_info->local_info.flags & LIBBALSA_MESSAGE_FLAG_RECENT)
              && strcmp(msg_info->subdir, "new") != 0)
@@ -813,7 +817,7 @@ libbalsa_mailbox_maildir_sync(LibBalsaMailbox * mailbox, gboolean expunge)
 
         /* Reparse, to get the fileno entries right. */
         lbm_maildir_parse_subdirs(mdir);
-        mailbox->msg_tree_changed = TRUE;
+        libbalsa_mailbox_set_msg_tree_changed(mailbox, TRUE);
 
         if (stat(mdir->tmpdir, &st) == 0)
             libbalsa_mailbox_set_mtime(mailbox, st.st_mtime);
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index 315a085..f81e26c 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -225,7 +225,7 @@ libbalsa_mailbox_mbox_new(const gchar * path, gboolean create)
 
     mailbox = g_object_new(LIBBALSA_TYPE_MAILBOX_MBOX, NULL);
 
-    mailbox->is_directory = FALSE;
+    libbalsa_mailbox_set_is_directory(mailbox, FALSE);
 
     if (libbalsa_mailbox_local_set_path(LIBBALSA_MAILBOX_LOCAL(mailbox),
                                         path, create) != 0) {
@@ -321,14 +321,16 @@ libbalsa_mailbox_mbox_remove_files(LibBalsaMailboxLocal *mailbox)
 
 static int mbox_lock(LibBalsaMailbox * mailbox, GMimeStream *stream)
 {
-    const gchar *path = libbalsa_mailbox_local_get_path(mailbox);
+    const gchar *path =
+        libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
     int fd = GMIME_STREAM_FS(stream)->fd;
     return libbalsa_lock_file(path, fd, FALSE, TRUE, 1);
 }
 
 static void mbox_unlock(LibBalsaMailbox * mailbox, GMimeStream *stream)
 {
-    const gchar *path = libbalsa_mailbox_local_get_path(mailbox);
+    const gchar *path =
+        libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
     int fd = GMIME_STREAM_FS(stream)->fd;
     libbalsa_unlock_file(path, fd, 1);
 }
@@ -692,11 +694,12 @@ libbalsa_mailbox_mbox_open(LibBalsaMailbox * mailbox, GError **err)
     LibBalsaMailboxMbox *mbox = LIBBALSA_MAILBOX_MBOX(mailbox);
     struct stat st;
     const gchar* path;
+    gboolean readonly;
     int fd;
     GMimeStream *gmime_stream;
     time_t t0;
 
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
 
     if (stat(path, &st) == -1) {
        g_set_error(err, LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_OPEN_ERROR,
@@ -704,8 +707,9 @@ libbalsa_mailbox_mbox_open(LibBalsaMailbox * mailbox, GError **err)
        return FALSE;
     }
 
-    mailbox->readonly = access (path, W_OK);
-    fd = open(path, mailbox->readonly ? O_RDONLY : O_RDWR);
+    readonly = access (path, W_OK);
+    libbalsa_mailbox_set_readonly(mailbox, readonly);
+    fd = open(path, readonly ? O_RDONLY : O_RDWR);
     if (fd == -1) {
        g_set_error(err, LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_OPEN_ERROR,
                    _("Cannot open mailbox."));
@@ -742,7 +746,7 @@ libbalsa_mailbox_mbox_open(LibBalsaMailbox * mailbox, GError **err)
 
     mbox->msgno_2_msg_info = g_ptr_array_new();
 
-    mailbox->unread_messages = 0;
+    libbalsa_mailbox_clear_unread_messages(mailbox);
     time(&t0);
 
     if (st.st_size > 0) {
@@ -991,7 +995,7 @@ libbalsa_mailbox_mbox_check(LibBalsaMailbox * mailbox)
     g_assert(LIBBALSA_IS_MAILBOX_MBOX(mailbox));
 
     mbox = LIBBALSA_MAILBOX_MBOX(mailbox);
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
     if (mbox->gmime_stream ?
         fstat(GMIME_STREAM_FS(mbox->gmime_stream)->fd, &st) :
         stat(path, &st)) {
@@ -1088,7 +1092,7 @@ libbalsa_mailbox_mbox_check(LibBalsaMailbox * mailbox)
 
         if ((msg_info->local_info.flags & LIBBALSA_MESSAGE_FLAG_NEW)
             && !(msg_info->local_info.flags & LIBBALSA_MESSAGE_FLAG_DELETED))
-            --mailbox->unread_messages;
+            libbalsa_mailbox_add_to_unread_messages(mailbox, -1);
 
        /* We must drop the mime-stream lock to call
         * libbalsa_mailbox_local_msgno_removed(), as it will grab the
@@ -1445,7 +1449,7 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
        return TRUE;
     mbox_stream = mbox->gmime_stream;
 
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path(LIBBALSA_MAILBOX_LOCAL(mailbox));
 
     /* lock mailbox file */
     if (mbox_lock(mailbox, mbox_stream) != 0)
@@ -1470,7 +1474,7 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
     for (i = j = 0; i < messages; i++)
     {
        msg_info = message_info_from_msgno(mbox, i + 1);
-       if (mailbox->state == LB_MAILBOX_STATE_CLOSING)
+       if (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSING)
            msg_info->local_info.flags &= ~LIBBALSA_MESSAGE_FLAG_RECENT;
        if (expunge && (msg_info->local_info.flags & LIBBALSA_MESSAGE_FLAG_DELETED))
            break;
@@ -1656,7 +1660,7 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
     unlink(tempfile); /* remove partial copy of the mailbox */
     g_free(tempfile);
 
-    if (mailbox->state == LB_MAILBOX_STATE_CLOSING) {
+    if (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSING) {
        /* Just shorten the msg_info array. */
        for (j = first; j < mbox->msgno_2_msg_info->len; ) {
            msg_info = message_info_from_msgno(mbox, j + 1);
diff --git a/libbalsa/mailbox_mh.c b/libbalsa/mailbox_mh.c
index 4ed62f1..f6a50ca 100644
--- a/libbalsa/mailbox_mh.c
+++ b/libbalsa/mailbox_mh.c
@@ -221,7 +221,7 @@ libbalsa_mailbox_mh_new(const gchar * path, gboolean create)
 
     mailbox = g_object_new(LIBBALSA_TYPE_MAILBOX_MH, NULL);
 
-    mailbox->is_directory = TRUE;
+    libbalsa_mailbox_set_is_directory(mailbox, TRUE);
 
     if (libbalsa_mailbox_local_set_path(LIBBALSA_MAILBOX_LOCAL(mailbox),
                                         path, create) != 0) {
@@ -340,7 +340,7 @@ lbm_mh_parse_mailbox(LibBalsaMailboxMh * mh, gboolean add_msg_info)
     GDir *dir;
     const gchar *filename;
 
-    path = libbalsa_mailbox_local_get_path(mh);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mh);
 
     if ((dir = g_dir_open(path, 0, NULL)) == NULL)
        return;
@@ -515,7 +515,7 @@ libbalsa_mailbox_mh_open(LibBalsaMailbox * mailbox, GError **err)
     struct stat st;
     const gchar* path;
    
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
 
     if (stat(path, &st) == -1) {
        g_set_error(err, LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_OPEN_ERROR,
@@ -531,8 +531,8 @@ libbalsa_mailbox_mh_open(LibBalsaMailbox * mailbox, GError **err)
     mh->msgno_2_msg_info = g_ptr_array_new();
     mh->last_fileno = 0;
     
-    mailbox->readonly = access (path, W_OK);
-    mailbox->unread_messages = 0;
+    libbalsa_mailbox_set_readonly(mailbox, access(path, W_OK));
+    libbalsa_mailbox_clear_unread_messages(mailbox);
     lbm_mh_parse_both(mh);
 
 #ifdef DEBUG
@@ -613,7 +613,8 @@ libbalsa_mailbox_mh_check(LibBalsaMailbox * mailbox)
 {
     struct stat st, st_sequences;
     LibBalsaMailboxMh *mh = LIBBALSA_MAILBOX_MH(mailbox);
-    const gchar *path = libbalsa_mailbox_local_get_path(mailbox);
+    const gchar *path =
+        libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
     int modified = 0;
     guint renumber, msgno;
     struct message_info *msg_info;
@@ -819,14 +820,14 @@ libbalsa_mailbox_mh_sync(LibBalsaMailbox * mailbox, gboolean expunge)
     recent.first  = recent.last = -1;
     recent.line   = g_mime_stream_mem_new();
 
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
 
     msgno = 1;
     while (msgno <= mh->msgno_2_msg_info->len) {
        msg_info = lbm_mh_message_info_from_msgno(mh, msgno);
        if (msg_info->local_info.flags == LIBBALSA_MESSAGE_FLAG_INVALID)
            msg_info->local_info.flags = msg_info->orig_flags;
-       if (mailbox->state == LB_MAILBOX_STATE_CLOSING)
+       if (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSING)
            msg_info->local_info.flags &= ~LIBBALSA_MESSAGE_FLAG_RECENT;
 
        if (expunge && (msg_info->local_info.flags
@@ -891,7 +892,7 @@ libbalsa_mailbox_mh_sync(LibBalsaMailbox * mailbox, gboolean expunge)
     }
 
     /* open tempfile */
-    path = libbalsa_mailbox_local_get_path(mailbox);
+    path = libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox);
     fd = libbalsa_mailbox_mh_open_temp(path, &name_used);
     if (fd == -1)
     {
diff --git a/libbalsa/mailbox_pop3.c b/libbalsa/mailbox_pop3.c
index a8a7eab..d5230ab 100644
--- a/libbalsa/mailbox_pop3.c
+++ b/libbalsa/mailbox_pop3.c
@@ -45,13 +45,13 @@ static LibBalsaMailboxClass *parent_class = NULL;
 struct _LibBalsaMailboxPop3Class {
     LibBalsaMailboxRemoteClass klass;
 
-    void (*config_changed) (LibBalsaMailboxPop3* mailbox);
+    void (*config_changed) (LibBalsaMailboxPop3* mailbox_pop3);
 };
 
 static void libbalsa_mailbox_pop3_dispose(GObject * object);
 static void libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class *
                                             klass);
-static void libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox);
+static void libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox_pop3);
 
 static gboolean libbalsa_mailbox_pop3_open(LibBalsaMailbox * mailbox,
                                           GError **err);
@@ -117,17 +117,17 @@ libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
 }
 
 static void
-libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox)
+libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox_pop3)
 {
     LibBalsaMailboxRemote *remote;
-    mailbox->check = FALSE;
-    mailbox->delete_from_server = FALSE;
-    mailbox->inbox = NULL;
-    mailbox->msg_size_limit = -1;
-
-    mailbox->filter = FALSE;
-    mailbox->filter_cmd = NULL;
-    remote = LIBBALSA_MAILBOX_REMOTE(mailbox);
+    mailbox_pop3->check = FALSE;
+    mailbox_pop3->delete_from_server = FALSE;
+    mailbox_pop3->inbox = NULL;
+    mailbox_pop3->msg_size_limit = -1;
+
+    mailbox_pop3->filter = FALSE;
+    mailbox_pop3->filter_cmd = NULL;
+    remote = LIBBALSA_MAILBOX_REMOTE(mailbox_pop3);
     remote->server = libbalsa_server_new();
 }
 
@@ -144,11 +144,11 @@ libbalsa_mailbox_pop3_dispose(GObject * object)
 LibBalsaMailboxPop3*
 libbalsa_mailbox_pop3_new(void)
 {
-    LibBalsaMailboxPop3 *mailbox;
+    LibBalsaMailboxPop3 *mailbox_pop3;
 
-    mailbox = g_object_new(LIBBALSA_TYPE_MAILBOX_POP3, NULL);
+    mailbox_pop3 = g_object_new(LIBBALSA_TYPE_MAILBOX_POP3, NULL);
 
-    return mailbox;
+    return mailbox_pop3;
 }
 
 
@@ -427,16 +427,26 @@ message_cb(const gchar                    *buffer,
 
                notify_progress(fd);
                if (fd->filter_path == NULL) {
-                       GError *add_err = NULL;
+                    GError *add_err = NULL;
+                    LibBalsaMailbox *mailbox;
+                    LibBalsaMailbox *inbox;
+
+                    mailbox = fd->mailbox;
+                    inbox = LIBBALSA_MAILBOX_POP3(mailbox)->inbox;
 
                    g_mime_stream_reset(fd->handler->mbx_stream);
-                   result = libbalsa_mailbox_add_message(LIBBALSA_MAILBOX_POP3(fd->mailbox)->inbox, 
fd->handler->mbx_stream,
-                       LIBBALSA_MESSAGE_FLAG_NEW | LIBBALSA_MESSAGE_FLAG_RECENT, &add_err);
+                   result =
+                        libbalsa_mailbox_add_message(inbox, fd->handler->mbx_stream,
+                                                     LIBBALSA_MESSAGE_FLAG_NEW |
+                                                     LIBBALSA_MESSAGE_FLAG_RECENT,
+                                                     &add_err);
                    if (!result) {
                        libbalsa_information(LIBBALSA_INFORMATION_WARNING, _("Error appending message %d from 
%s to %s: %s"),
-                               info->id, fd->mailbox->name, LIBBALSA_MAILBOX_POP3(fd->mailbox)->inbox->name,
-                                       (add_err != NULL) ? add_err->message : "?");
-                       g_error_free(add_err);
+                               info->id,
+                                libbalsa_mailbox_get_name(mailbox),
+                                libbalsa_mailbox_get_name(inbox),
+                                add_err != NULL ? add_err->message : "?");
+                       g_clear_error(&add_err);
                    }
                }
 
@@ -458,20 +468,21 @@ message_cb(const gchar                    *buffer,
 
 
 static NetClientPop *
-libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
-                                                         const LibBalsaMailboxPop3 *mbox,
-                                                         const gchar               *name,
-                                                         GList                    **msg_list)
+libbalsa_mailbox_pop3_startup(LibBalsaServer      *server,
+                              LibBalsaMailboxPop3 *mailbox_pop3,
+                              const gchar         *name,
+                              GList              **msg_list)
 {
+        LibBalsaMailbox *mailbox = (LibBalsaMailbox *) mailbox_pop3;
        NetClientPop *pop;
        GError *error = NULL;
        guint allow_auth;
 
        /* create the mailbox connection */
        if (libbalsa_server_get_security(server) == NET_CLIENT_CRYPT_ENCRYPTED) {
-               pop = net_client_pop_new(libbalsa_server_get_host(server), 995U, 
libbalsa_server_get_security(server), mbox->enable_pipe);
+               pop = net_client_pop_new(libbalsa_server_get_host(server), 995U, 
libbalsa_server_get_security(server), mailbox_pop3->enable_pipe);
        } else {
-               pop = net_client_pop_new(libbalsa_server_get_host(server), 110U, 
libbalsa_server_get_security(server), mbox->enable_pipe);
+               pop = net_client_pop_new(libbalsa_server_get_host(server), 110U, 
libbalsa_server_get_security(server), mailbox_pop3->enable_pipe);
        }
        if (pop == NULL) {
                return NULL;
@@ -480,7 +491,7 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        /* configure the mailbox connection; allow all (including plain text) auth methods even for 
unencrypted connections so using
         * e.g. popfile on localhost is possible, i.e. the user is responsible for choosing a proper security 
mode */
        allow_auth = NET_CLIENT_POP_AUTH_ALL;
-       if (mbox->disable_apop) {
+       if (mailbox_pop3->disable_apop) {
                allow_auth &= ~NET_CLIENT_POP_AUTH_APOP;
        }
        net_client_pop_allow_auth(pop, TRUE, allow_auth);
@@ -504,7 +515,7 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        g_signal_connect(G_OBJECT(pop), "auth", G_CALLBACK(libbalsa_server_get_auth), server);
 
        /* connect server */
-       libbalsa_mailbox_progress_notify(LIBBALSA_MAILBOX(mbox), LIBBALSA_NTFY_INIT, INFINITY, _("Connecting 
%s…"), libbalsa_server_get_host(server));
+       libbalsa_mailbox_progress_notify(mailbox, LIBBALSA_NTFY_INIT, INFINITY, _("Connecting %s…"), 
libbalsa_server_get_host(server));
        if (!net_client_pop_connect(pop, NULL, &error)) {
                libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("POP3 mailbox %s: cannot connect %s: %s"), 
name, libbalsa_server_get_host(server),
                        error->message);
@@ -515,8 +526,8 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        }
 
        /* load message list */
-       libbalsa_mailbox_progress_notify(LIBBALSA_MAILBOX(mbox), LIBBALSA_NTFY_UPDATE, INFINITY, _("List 
messages…"));
-       if (!net_client_pop_list(pop, msg_list, !mbox->delete_from_server, &error)) {
+       libbalsa_mailbox_progress_notify(mailbox, LIBBALSA_NTFY_UPDATE, INFINITY, _("List messages…"));
+       if (!net_client_pop_list(pop, msg_list, !mailbox_pop3->delete_from_server, &error)) {
                libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("POP3 mailbox %s error: %s"), name, 
error->message);
                g_error_free(error);
                net_client_shutdown(NET_CLIENT(pop));
@@ -530,10 +541,10 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
 
 static GList *
 update_msg_list(struct fetch_data         *fd,
-                               const LibBalsaMailboxPop3 *mbox,
-                               GHashTable               **current_uids,
-                               LibBalsaServer            *server,
-                               GList                     *msg_list)
+                const LibBalsaMailboxPop3 *mailbox_pop3,
+                GHashTable               **current_uids,
+                LibBalsaServer            *server,
+                GList                     *msg_list)
 {
        GHashTable *uids = NULL;
        gchar *uid_prefix = NULL;
@@ -541,7 +552,7 @@ update_msg_list(struct fetch_data         *fd,
        GList *p;
 
        /* load uid's if messages shall be left on the server */
-       if (!mbox->delete_from_server) {
+       if (!mailbox_pop3->delete_from_server) {
                uid_prefix = g_strconcat(libbalsa_server_get_username(server), "@", 
libbalsa_server_get_host(server), NULL);
                prefix_len = strlen(uid_prefix);
                uids = mp_load_uids(uid_prefix);
@@ -558,7 +569,8 @@ update_msg_list(struct fetch_data         *fd,
                GList* next = p->next;
 
                /* check for oversized message */
-               if ((mbox->msg_size_limit > 0) && (msg_info->size >= (gsize) mbox->msg_size_limit)) {
+               if ((mailbox_pop3->msg_size_limit > 0) &&
+                        (msg_info->size >= (gsize) mailbox_pop3->msg_size_limit)) {
                        gchar *size_str;
 
                        size_str = libbalsa_size_to_gchar(msg_info->size);
@@ -569,7 +581,7 @@ update_msg_list(struct fetch_data         *fd,
                }
 
                /* check if we already know this message */
-               if (!skip && !mbox->delete_from_server) {
+               if (!skip && !mailbox_pop3->delete_from_server) {
                        gchar *full_uid = g_strconcat(uid_prefix, " ", msg_info->uid, NULL);
 
                        g_hash_table_insert(*current_uids, full_uid, GINT_TO_POINTER(1));
@@ -590,7 +602,7 @@ update_msg_list(struct fetch_data         *fd,
        }
 
        /* copy all keys /not/ starting with the prefix from the old to the current hash table, and drop the 
old table */
-       if (!mbox->delete_from_server && (msg_list != NULL)) {
+       if (!mailbox_pop3->delete_from_server && (msg_list != NULL)) {
                GHashTableIter iter;
                gpointer key;
 
@@ -614,19 +626,21 @@ update_msg_list(struct fetch_data         *fd,
 static void
 libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
 {
-       LibBalsaMailboxPop3 *mbox = LIBBALSA_MAILBOX_POP3(mailbox);
+       LibBalsaMailboxPop3 *mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
        LibBalsaServer *server;
        NetClientPop *pop;
        GList *msg_list;
 
-       if (!mbox->check || (mbox->inbox == NULL)) {
+       if (!mailbox_pop3->check || (mailbox_pop3->inbox == NULL)) {
                return;
        }
 
-       server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mbox);
+       server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox_pop3);
 
        /* open the mailbox connection and get the messages list (note: initiates the progress dialogue) */
-       pop = libbalsa_mailbox_pop3_startup(server, mbox, mailbox->name, &msg_list);
+       pop = libbalsa_mailbox_pop3_startup(server, mailbox_pop3,
+                                            libbalsa_mailbox_get_name(mailbox),
+                                            &msg_list);
 
        /* proceed on success only */
        if (pop != NULL) {
@@ -642,7 +656,8 @@ libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
                /* nothing to do if no messages are on the server */
                if (msg_list != NULL) {
                        /* load uid's if messages shall be left on the server */
-                       msg_list = update_msg_list(&fd, mbox, &current_uids, server, msg_list);
+                       msg_list = update_msg_list(&fd, mailbox_pop3, &current_uids,
+                                                   server, msg_list);
                }
 
                /* download messages unless the list is empty */
@@ -654,13 +669,13 @@ libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
                                ngettext("%lu new message (%s)", "%lu new messages (%s)", fd.total_messages),
                                (unsigned long) fd.total_messages, fd.total_size_msg);
 
-                       if (mbox->filter) {
-                               fd.filter_path = mbox->filter_cmd;
+                       if (mailbox_pop3->filter) {
+                               fd.filter_path = mailbox_pop3->filter_cmd;
                        }
 
                        if (result) {
                                result = net_client_pop_retr(pop, msg_list, message_cb, &fd, &err);
-                               if (result && mbox->delete_from_server) {
+                               if (result && mailbox_pop3->delete_from_server) {
                                        libbalsa_mailbox_progress_notify(mailbox, LIBBALSA_NTFY_UPDATE, 
INFINITY,
                                                _("Deleting messages on server…"));
                                        result = net_client_pop_dele(pop, msg_list, &err);
@@ -673,7 +688,7 @@ libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
                }
 
                /* store uid list */
-               if (result && !mbox->delete_from_server) {
+               if (result && !mailbox_pop3->delete_from_server) {
                        gchar *uid_prefix = g_strconcat(libbalsa_server_get_username(server), "@", 
libbalsa_server_get_host(server), NULL);
 
                        mp_save_uids(current_uids, uid_prefix, &err);
@@ -703,21 +718,21 @@ static void
 libbalsa_mailbox_pop3_save_config(LibBalsaMailbox * mailbox,
                                  const gchar * prefix)
 {
-    LibBalsaMailboxPop3 *pop;
+    LibBalsaMailboxPop3 *mailbox_pop3;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
 
-    pop = LIBBALSA_MAILBOX_POP3(mailbox);
+    mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
     libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox));
 
-    libbalsa_conf_set_bool("Check", pop->check);
-    libbalsa_conf_set_bool("Delete", pop->delete_from_server);
-    libbalsa_conf_set_bool("DisableApop", pop->disable_apop);
-    libbalsa_conf_set_bool("EnablePipe", pop->enable_pipe);
-    libbalsa_conf_set_bool("Filter", pop->filter);
-    if(pop->filter_cmd)
-        libbalsa_conf_set_string("FilterCmd", pop->filter_cmd);
+    libbalsa_conf_set_bool("Check", mailbox_pop3->check);
+    libbalsa_conf_set_bool("Delete", mailbox_pop3->delete_from_server);
+    libbalsa_conf_set_bool("DisableApop", mailbox_pop3->disable_apop);
+    libbalsa_conf_set_bool("EnablePipe", mailbox_pop3->enable_pipe);
+    libbalsa_conf_set_bool("Filter", mailbox_pop3->filter);
+    if(mailbox_pop3->filter_cmd)
+        libbalsa_conf_set_string("FilterCmd", mailbox_pop3->filter_cmd);
 
     if (LIBBALSA_MAILBOX_CLASS(parent_class)->save_config)
        LIBBALSA_MAILBOX_CLASS(parent_class)->save_config(mailbox, prefix);
@@ -728,22 +743,22 @@ static void
 libbalsa_mailbox_pop3_load_config(LibBalsaMailbox * mailbox,
                                  const gchar * prefix)
 {
-    LibBalsaMailboxPop3 *pop;
+    LibBalsaMailboxPop3 *mailbox_pop3;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
 
-    pop = LIBBALSA_MAILBOX_POP3(mailbox);
+    mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
     libbalsa_server_load_config(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox));
 
-    pop->check = libbalsa_conf_get_bool("Check=false");
-    pop->delete_from_server = libbalsa_conf_get_bool("Delete=false");
-    pop->disable_apop = libbalsa_conf_get_bool("DisableApop=false");
-    pop->enable_pipe = libbalsa_conf_get_bool("EnablePipe=false");
-    pop->filter = libbalsa_conf_get_bool("Filter=false");
-    pop->filter_cmd = libbalsa_conf_get_string("FilterCmd");
-    if(pop->filter_cmd && *pop->filter_cmd == '\0') {
-       g_free(pop->filter_cmd); pop->filter_cmd = NULL;
+    mailbox_pop3->check = libbalsa_conf_get_bool("Check=false");
+    mailbox_pop3->delete_from_server = libbalsa_conf_get_bool("Delete=false");
+    mailbox_pop3->disable_apop = libbalsa_conf_get_bool("DisableApop=false");
+    mailbox_pop3->enable_pipe = libbalsa_conf_get_bool("EnablePipe=false");
+    mailbox_pop3->filter = libbalsa_conf_get_bool("Filter=false");
+    mailbox_pop3->filter_cmd = libbalsa_conf_get_string("FilterCmd");
+    if (mailbox_pop3->filter_cmd != NULL && mailbox_pop3->filter_cmd[0] == '\0') {
+       g_free(mailbox_pop3->filter_cmd); mailbox_pop3->filter_cmd = NULL;
     }
 
     if (LIBBALSA_MAILBOX_CLASS(parent_class)->load_config)
@@ -754,18 +769,18 @@ void
 libbalsa_mailbox_pop3_set_inbox(LibBalsaMailbox *mailbox,
                                 LibBalsaMailbox *inbox)
 {
-    LibBalsaMailboxPop3 *pop;
+    LibBalsaMailboxPop3 *mailbox_pop3;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
 
-    pop = LIBBALSA_MAILBOX_POP3(mailbox);
+    mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
-       pop->inbox=inbox;
+       mailbox_pop3->inbox=inbox;
 }
 
 void
-libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPop3 *pop,
+libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPop3 *mailbox_pop3,
                                          gint sz_limit)
 {
-    pop->msg_size_limit = sz_limit;
+    mailbox_pop3->msg_size_limit = sz_limit;
 }
diff --git a/libbalsa/message.c b/libbalsa/message.c
index 949eaf6..9eec27e 100644
--- a/libbalsa/message.c
+++ b/libbalsa/message.c
@@ -566,11 +566,11 @@ libbalsa_message_change_flags(LibBalsaMessage * message,
     g_return_if_fail(LIBBALSA_IS_MAILBOX(message->mailbox));
     g_return_if_fail(message->msgno > 0);
 
-    if (message->mailbox->readonly) {
+    if (libbalsa_mailbox_get_readonly(message->mailbox)) {
         libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                              _("Mailbox (%s) is read-only: "
                                "cannot change flags."),
-                             message->mailbox->name);
+                             libbalsa_mailbox_get_name(message->mailbox));
         return;
     }
 
diff --git a/libbalsa/send.c b/libbalsa/send.c
index e23703c..2850ab9 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -447,7 +447,7 @@ lbs_message_queue_real(LibBalsaMessage    *message,
 
     if (fccbox != NULL) {
         g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-Fcc",
-                                 fccbox->url);
+                                 libbalsa_mailbox_get_url(fccbox));
     }
     g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-DSN",
                              message->request_dsn ? "1" : "0");
@@ -645,9 +645,9 @@ lbs_check_reachable_cb(GObject  *object,
        } else {
         libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                              _("Cannot reach SMTP server %s (%s), any queued message will remain in %s."),
-                                                        libbalsa_smtp_server_get_name(smtp_server),
-                                                        
libbalsa_server_get_host(LIBBALSA_SERVER(smtp_server)),
-                                                        send_info->outbox->name);
+                             libbalsa_smtp_server_get_name(smtp_server),
+                             libbalsa_server_get_host(LIBBALSA_SERVER(smtp_server)),
+                             libbalsa_mailbox_get_name(send_info->outbox));
        }
 
        if (!thread_started) {
@@ -938,20 +938,23 @@ balsa_send_message_success(MessageQueueItem *mqi,
 
                if (fccurl != NULL) {
                        LibBalsaMailbox *fccbox = info->finder(fccurl);
+                        const gchar *fccname = libbalsa_mailbox_get_name(fccbox);
                        GError *err = NULL;
 
                        if (!info->no_dialog) {
                                libbalsa_progress_dialog_update(&send_progress_dialog, info->progress_id, 
FALSE, NAN,
-                                       _("Save message in %s…"), fccbox->name);
+                                       _("Save message in %s…"), fccname);
                        }
 
                        libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_NEW | 
LIBBALSA_MESSAGE_FLAG_FLAGGED);
                        libbalsa_mailbox_sync_storage(mqi->orig->mailbox, FALSE);
                        remove = libbalsa_message_copy(mqi->orig, fccbox, &err);
                        if (!remove) {
-                               libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Saving sent message to %s 
failed: %s"), fccbox->name,
-                                       err ? err->message : "?");
-                               g_clear_error(&err);
+                            libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+                                                 _("Saving sent message to %s failed: %s"),
+                                                 fccname,
+                                                 err != NULL ? err->message : "?");
+                            g_clear_error(&err);
                        }
                }
 
diff --git a/libinit_balsa/assistant_page_directory.c b/libinit_balsa/assistant_page_directory.c
index 405c07f..4c4f2f6 100644
--- a/libinit_balsa/assistant_page_directory.c
+++ b/libinit_balsa/assistant_page_directory.c
@@ -139,14 +139,18 @@ unconditional_mailbox(const gchar * path, const gchar * prettyname,
     if (*box == NULL) {
         if (strcmp("/var/spool/mail/", path)) {
             char tmp[32] = "/tmp/balsa.XXXXXX";
+
            /* Don't fail if you can't create the spool mailbox. */
            close(mkstemp(tmp));
-               *box = libbalsa_mailbox_local_new(tmp, FALSE);
-               if (*box) {
-                       free((*box)->url);
-                       (*box)->url = g_strdup_printf("file://%s",path);
-               }
-               unlink(tmp);
+            *box = libbalsa_mailbox_local_new(tmp, FALSE);
+            if (*box != NULL) {
+                gchar *url;
+
+                url = g_strdup_printf("file://%s", path);
+                libbalsa_mailbox_set_url(*box, url);
+                g_free(url);
+            }
+            unlink(tmp);
        }
     }
     if ( *box == NULL) {
@@ -157,11 +161,11 @@ unconditional_mailbox(const gchar * path, const gchar * prettyname,
         return;
     }
 
-    (*box)->name = g_strdup(gettext(prettyname));
+    libbalsa_mailbox_set_name(*box, gettext(prettyname));
 
     config_mailbox_add(*box, (char *) prettyname);
     if (box == &balsa_app.outbox)
-        (*box)->no_reassemble = TRUE;
+        libbalsa_mailbox_set_no_reassemble(*box, TRUE);
 }
 
 static void
diff --git a/libinit_balsa/assistant_page_user.c b/libinit_balsa/assistant_page_user.c
index 1c10402..f34af91 100644
--- a/libinit_balsa/assistant_page_user.c
+++ b/libinit_balsa/assistant_page_user.c
@@ -207,7 +207,7 @@ create_pop3_mbx(const gchar *name, const gchar* host, gint security,
     libbalsa_server_set_host(server, host, FALSE);
     libbalsa_server_set_security(server, security);
     libbalsa_server_set_remember_passwd(server, remember);
-    mbx->name               = g_strdup(name && *name ? name : host);
+    libbalsa_mailbox_set_name(mbx, name != NULL && name[0] != '\0' ? name : host);
     pop->check              = TRUE;
     pop->disable_apop       = FALSE;
     pop->delete_from_server = TRUE;
diff --git a/src/balsa-app.c b/src/balsa-app.c
index 3fd52b7..3d31060 100644
--- a/src/balsa-app.c
+++ b/src/balsa-app.c
@@ -72,7 +72,7 @@ ask_password_real(LibBalsaServer * server, LibBalsaMailbox * mbox)
        prompt =
            g_strdup_printf(_("Opening remote mailbox %s.\n"
                               "The _password for %s@%s:"),
-                           mbox->name, libbalsa_server_get_username(server), 
libbalsa_server_get_host(server));
+                           libbalsa_mailbox_get_name(mbox), libbalsa_server_get_username(server), 
libbalsa_server_get_host(server));
     else
        prompt =
            g_strdup_printf(_("_Password for %s@%s (%s):"), libbalsa_server_get_username(server),
@@ -627,7 +627,8 @@ find_url(GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter,
     LibBalsaMailbox *mailbox;
 
     gtk_tree_model_get(model, iter, 0, &mbnode, -1);
-    if ((mailbox = mbnode->mailbox) && !strcmp(mailbox->url, bf->data)) {
+    if ((mailbox = mbnode->mailbox) != NULL &&
+        strcmp(libbalsa_mailbox_get_url(mailbox), bf->data) == 0) {
         bf->mbnode = mbnode;
         return TRUE;
     }
@@ -697,9 +698,9 @@ balsa_get_short_mailbox_name(const gchar *url)
     if ((mbnode = balsa_find_url(url)) && mbnode->mailbox) {
         if (mbnode->server) {
             return g_strconcat(libbalsa_server_get_host(mbnode->server), ":",
-                               mbnode->mailbox->name, NULL);
+                               libbalsa_mailbox_get_name(mbnode->mailbox), NULL);
         } else {
-            return g_strdup(mbnode->mailbox->name);
+            return g_strdup(libbalsa_mailbox_get_name(mbnode->mailbox));
         }
     }
     return g_strdup(url);
@@ -785,7 +786,7 @@ ba_remove_children_mailbox_nodes(GtkTreeModel * model, GtkTreeIter * parent,
        } else {
            printf("sparing %s %s\n",
                   mbnode->mailbox ? "mailbox" : "folder ",
-                  mbnode->mailbox ? mbnode->mailbox->name : mbnode->name);
+                  mbnode->mailbox ? libbalsa_mailbox_get_name(mbnode->mailbox) : mbnode->name);
            valid = gtk_tree_model_iter_next(model, &iter);
        }
        g_object_unref(mbnode); 
diff --git a/src/balsa-index.c b/src/balsa-index.c
index 5c1516c..51c1b9e 100644
--- a/src/balsa-index.c
+++ b/src/balsa-index.c
@@ -823,6 +823,7 @@ static gboolean
 bndx_scroll_on_open_idle(BalsaIndex *index)
 {
     LibBalsaMailbox *mailbox;
+    guint msgno;
     GtkTreeView *tree_view = GTK_TREE_VIEW(index);
     GtkTreePath *path;
     gpointer view_on_open;
@@ -832,9 +833,8 @@ bndx_scroll_on_open_idle(BalsaIndex *index)
 
     balsa_index_update_tree(index, balsa_app.expand_tree);
     mailbox = index->mailbox_node->mailbox;
-    if (mailbox->first_unread) {
-       unsigned msgno = mailbox->first_unread;
-       mailbox->first_unread = 0;
+    if ((msgno = libbalsa_mailbox_get_first_unread(mailbox))) {
+       libbalsa_mailbox_set_first_unread(mailbox, 0);
         if(!libbalsa_mailbox_msgno_find(mailbox, msgno, &path, NULL))
             return FALSE; /* Oops! */
     } else {
@@ -916,7 +916,7 @@ bndx_mailbox_row_inserted_cb(LibBalsaMailbox * mailbox, GtkTreePath * path,
 {
     guint msgno;
 
-    if (mailbox->state != LB_MAILBOX_STATE_OPEN)
+    if (libbalsa_mailbox_get_state(mailbox) != LB_MAILBOX_STATE_OPEN)
         return;
 
     gtk_tree_model_get(GTK_TREE_MODEL(mailbox), iter,
@@ -1375,6 +1375,7 @@ static gboolean
 bndx_mailbox_changed_idle(BalsaIndex * bindex)
 {
     LibBalsaMailbox *mailbox;
+    guint msgno;
     GtkTreePath *path;
 
     if (bndx_clear_if_last_ref(&bindex))
@@ -1383,12 +1384,11 @@ bndx_mailbox_changed_idle(BalsaIndex * bindex)
     bindex->has_mailbox_changed_idle = FALSE;
 
     mailbox = bindex->mailbox_node->mailbox;
-    if (mailbox->first_unread
-        && libbalsa_mailbox_msgno_find(mailbox, mailbox->first_unread,
-                                       &path, NULL)) {
+    if ((msgno = libbalsa_mailbox_get_first_unread(mailbox)) > 0
+        && libbalsa_mailbox_msgno_find(mailbox, msgno, &path, NULL)) {
         bndx_expand_to_row(bindex, path);
         gtk_tree_path_free(path);
-        mailbox->first_unread = 0;
+        libbalsa_mailbox_set_first_unread(mailbox, 0);
     }
 
     if (bndx_find_current_msgno(bindex, &path, NULL)) {
@@ -1905,6 +1905,7 @@ bndx_do_popup(BalsaIndex * index, const GdkEvent * event)
     GtkWidget *submenu;
     LibBalsaMailbox* mailbox;
     gboolean any;
+    gboolean readonly;
     gboolean any_deleted = FALSE;
     gboolean any_not_deleted = FALSE;
     GArray *selected = balsa_index_selected_msgnos_new(index);
@@ -1929,17 +1930,18 @@ bndx_do_popup(BalsaIndex * index, const GdkEvent * event)
                           GINT_TO_POINTER(any));
 
     mailbox = index->mailbox_node->mailbox;
+    readonly = libbalsa_mailbox_get_readonly(mailbox);
     gtk_widget_set_sensitive(index->delete_item,
-                             any_not_deleted && !mailbox->readonly);
+                             any_not_deleted && !readonly);
     gtk_widget_set_sensitive(index->undelete_item,
-                             any_deleted && !mailbox->readonly);
+                             any_deleted && !readonly);
     gtk_widget_set_sensitive(index->move_to_trash_item,
                              any && mailbox != balsa_app.trash
-                             && !mailbox->readonly);
+                             && !readonly);
     gtk_widget_set_sensitive(index->toggle_item,
-                             any && !mailbox->readonly);
+                             any && !readonly);
     gtk_widget_set_sensitive(index->move_to_item,
-                             any && !mailbox->readonly);
+                             any && !readonly);
 
     submenu =
         balsa_mblist_mru_menu(GTK_WINDOW
@@ -2068,6 +2070,7 @@ balsa_index_transfer(BalsaIndex *index, GArray * msgnos,
     gboolean success;
     LibBalsaMailbox *from_mailbox;
     GError *e = NULL;
+    const gchar *to_mailbox_name;
 
     if (msgnos->len == 0)
         return;
@@ -2077,13 +2080,14 @@ balsa_index_transfer(BalsaIndex *index, GArray * msgnos,
         libbalsa_mailbox_messages_copy(from_mailbox, msgnos, to_mailbox, &e) :
         libbalsa_mailbox_messages_move(from_mailbox, msgnos, to_mailbox, &e);
 
+    to_mailbox_name = libbalsa_mailbox_get_name(to_mailbox);
     if (!success) {
        balsa_information
             (LIBBALSA_INFORMATION_WARNING,
              ngettext("Failed to copy %d message to mailbox “%s”: %s",
                       "Failed to copy %d messages to mailbox “%s”: %s",
                       msgnos->len),
-             msgnos->len, to_mailbox->name, e ? e->message : "?");
+             msgnos->len, to_mailbox_name, e ? e->message : "?");
        return;
     }
 
@@ -2093,7 +2097,7 @@ balsa_index_transfer(BalsaIndex *index, GArray * msgnos,
         enable_empty_trash(balsa_app.main_window, TRASH_FULL);
     balsa_information(LIBBALSA_INFORMATION_MESSAGE,
                       copy ? _("Copied to “%s”.")
-                      : _("Moved to “%s”."), to_mailbox->name);
+                      : _("Moved to “%s”."), to_mailbox_name);
     if (!copy)
        /* Note when message was flagged as deleted, for use in
         * auto-expunge. */
@@ -2189,14 +2193,14 @@ balsa_index_expunge(BalsaIndex * index)
     g_return_if_fail(index != NULL);
 
     mailbox = index->mailbox_node->mailbox;
-    if (mailbox->readonly)
+    if (libbalsa_mailbox_get_readonly(mailbox))
        return;
 
     rc = libbalsa_mailbox_sync_storage(mailbox, TRUE);
     if (!rc)
        balsa_information(LIBBALSA_INFORMATION_WARNING,
                          _("Committing mailbox %s failed."),
-                         mailbox->name);
+                         libbalsa_mailbox_get_name(mailbox));
 }
 
 /* Message window */
diff --git a/src/balsa-mblist.c b/src/balsa-mblist.c
index d3a4f12..db71f19 100644
--- a/src/balsa-mblist.c
+++ b/src/balsa-mblist.c
@@ -958,8 +958,8 @@ bmbl_mailbox_changed_cb(LibBalsaMailbox * mailbox, gpointer data)
         g_idle_add((GSourceFunc) update_mailbox_idle, umd);
     }
 
-    umd->notify = (mailbox->state == LB_MAILBOX_STATE_OPEN
-                   || mailbox->state == LB_MAILBOX_STATE_CLOSED);
+    umd->notify = (libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_OPEN
+                   || libbalsa_mailbox_get_state(mailbox) == LB_MAILBOX_STATE_CLOSED);
 
     G_UNLOCK(mblist_update);
 }
@@ -1254,7 +1254,7 @@ bmbl_store_redraw_mbnode(GtkTreeIter * iter, BalsaMailboxNode * mbnode)
                ? BALSA_PIXMAP_MBOX_TRAY_FULL
                 : BALSA_PIXMAP_MBOX_TRAY_EMPTY;
 
-            name = mailbox->name;
+            name = libbalsa_mailbox_get_name(mailbox);
 
             /* Make sure the show column is set before showing the
              * mailbox in the list. */
@@ -1403,6 +1403,7 @@ bmbl_node_style(GtkTreeModel * model, GtkTreeIter * iter)
         /* Set the style appropriate for unread_messages; we do this
          * even if the state hasn't changed, because we might be
          * rerendering after hiding or showing the info columns. */
+        name = libbalsa_mailbox_get_name(mailbox);
         if (unread_messages > 0) {
             gboolean display_info;
 
@@ -1411,17 +1412,14 @@ bmbl_node_style(GtkTreeModel * model, GtkTreeIter * iter)
             display_info = GPOINTER_TO_INT(g_object_get_data
                                            (G_OBJECT(model),
                                             BALSA_MBLIST_DISPLAY_INFO));
-            name = (!display_info && total_messages >= 0) ?
-                (tmp = g_strdup_printf("%s (%d)", mailbox->name,
-                                      unread_messages))
-                : mailbox->name;
+            if (!display_info && total_messages >= 0)
+                name = tmp = g_strdup_printf("%s (%d)", name, unread_messages);
 
             weight = PANGO_WEIGHT_BOLD;
             mbnode->style |= MBNODE_STYLE_NEW_MAIL;
         } else {
             icon = (mailbox == balsa_app.inbox) ?
                 BALSA_PIXMAP_MBOX_IN : BALSA_PIXMAP_MBOX_TRAY_EMPTY;
-            name = mailbox->name;
             weight = PANGO_WEIGHT_NORMAL;
             mbnode->style &= ~MBNODE_STYLE_NEW_MAIL;
         }
@@ -1666,7 +1664,8 @@ bmbl_mru_menu(GtkWindow * window, GList ** url_list,
         if (mailbox || (allow_empty && !*url)) {
             mru = bmbl_mru_new(url_list, user_func, user_data, url);
             item =
-                gtk_menu_item_new_with_label(mailbox ? mailbox->name : "");
+                gtk_menu_item_new_with_label(mailbox != NULL ?
+                                             libbalsa_mailbox_get_name(mailbox) : "");
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
             g_signal_connect_data(item, "activate",
                                   G_CALLBACK(bmbl_mru_activate_cb), mru,
@@ -1835,7 +1834,7 @@ bmbl_mru_activated_cb(GtkTreeView * tree_view, GtkTreePath * path,
 
     if (mbnode->mailbox) {
         ((BalsaMBListMRUEntry *) data)->url =
-            g_strdup(mbnode->mailbox->url);
+            g_strdup(libbalsa_mailbox_get_url(mbnode->mailbox));
         bmbl_mru_activate_cb(NULL, data);
 
         gtk_dialog_response(GTK_DIALOG
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 94a2d9a..7a163d1 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -1094,7 +1094,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
        balsa_information(LIBBALSA_INFORMATION_WARNING,
                           _("Could not access message %u "
                             "in mailbox “%s”."),
-                         msgno, mailbox->name);
+                         msgno, libbalsa_mailbox_get_name(mailbox));
         return FALSE;
     }
 
@@ -1106,7 +1106,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
        balsa_information(LIBBALSA_INFORMATION_WARNING,
                           _("Could not access message %u "
                             "in mailbox “%s”."),
-                         (unsigned int) message->msgno, mailbox->name);
+                         (unsigned int) message->msgno, libbalsa_mailbox_get_name(mailbox));
         return FALSE;
     }
 
@@ -1160,7 +1160,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
     /*
      * emit read message
      */
-    if (is_new && !mailbox->readonly)
+    if (is_new && !libbalsa_mailbox_get_readonly(mailbox))
         libbalsa_mailbox_msgno_change_flags(mailbox, message->msgno, 0,
                                             LIBBALSA_MESSAGE_FLAG_NEW);
 
@@ -1571,7 +1571,7 @@ balsa_message_copy_part(const gchar *url, LibBalsaMessageBody *part)
     if (!libbalsa_mailbox_add_message(mailbox, stream, 0, &err)) {
        libbalsa_information(LIBBALSA_INFORMATION_ERROR,
                             _("Appending message to %s failed: %s"),
-                            mailbox->name,
+                            libbalsa_mailbox_get_name(mailbox),
                             err ? err->message : "?");
        g_clear_error(&err);
     }
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index 2acf011..d3eaf00 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -782,9 +782,8 @@ check_call_url(GtkGestureMultiPress *multi_press,
 
     gesture = GTK_GESTURE(multi_press);
     event = gtk_gesture_get_last_event(gesture, gtk_gesture_get_last_updated_sequence(gesture));
-    g_return_if_fail(event != NULL);
 
-    if (!gdk_event_get_state(event, &state)) {
+    if (event == NULL || !gdk_event_get_state(event, &state)) {
         return;
     }
 
diff --git a/src/filter-edit-callbacks.c b/src/filter-edit-callbacks.c
index 6d63d85..ddc4a93 100644
--- a/src/filter-edit-callbacks.c
+++ b/src/filter-edit-callbacks.c
@@ -1327,6 +1327,7 @@ update_filters_mailbox(GtkTreeModel * model, GtkTreePath * path,
     BalsaMailboxNode *mbnode;
     LibBalsaMailbox *mailbox;
     gchar *tmp;
+    const gchar *url;
 
     gtk_tree_model_get(model, iter, 0, &mbnode, -1);
     mailbox = mbnode->mailbox;
@@ -1335,13 +1336,14 @@ update_filters_mailbox(GtkTreeModel * model, GtkTreePath * path,
        return FALSE;
 
     /* First we free the filters list (which is now obsolete) */
-    libbalsa_clear_slist(&mailbox->filters, g_free);
+    libbalsa_mailbox_set_filters(mailbox, NULL);
     /* Second we replace old filters name by the new ones
      * Note : deleted filters are also removed */
     if (!filters_names_changes)
        return FALSE;
-    tmp = mailbox_filters_section_lookup(mailbox->url ?
-                                        mailbox->url : mailbox->name);
+    url = libbalsa_mailbox_get_url(mailbox);
+    tmp = mailbox_filters_section_lookup(url != NULL ?  url :
+                                         libbalsa_mailbox_get_name(mailbox));
     if (tmp) {
        gchar **filters_names = NULL;
        gboolean def;
diff --git a/src/filter-run-callbacks.c b/src/filter-run-callbacks.c
index 8b355f0..cf510fb 100644
--- a/src/filter-run-callbacks.c
+++ b/src/filter-run-callbacks.c
@@ -146,8 +146,9 @@ static
 void save_filters(BalsaFilterRunDialog * p)
 {
     if (p->filters_modified) {
-       g_slist_free_full(p->mbox->filters, g_free);
-       p->mbox->filters = build_selected_filters_list(p->selected_filters,FALSE);
+       libbalsa_mailbox_set_filters(p->mbox,
+                                     build_selected_filters_list(p->selected_filters,
+                                                                 FALSE));
        config_mailbox_filters_save(p->mbox);
        p->filters_modified=FALSE;
     }
@@ -209,7 +210,7 @@ fr_apply_selected_pressed_func(GtkTreeModel * model, GtkTreePath * path,
     if (fil->action == FILTER_RUN
         || fil->action == FILTER_TRASH
         || (fil->action == FILTER_COLOR && fil->action_string[0])
-        || strcmp(fil->action_string, p->mbox->url) != 0)
+        || strcmp(fil->action_string, libbalsa_mailbox_get_url(p->mbox)) != 0)
         p->filters = g_slist_append(p->filters, fil);
 }
 
@@ -233,7 +234,7 @@ fr_apply_selected_pressed(BalsaFilterRunDialog * p)
     else
         balsa_information(LIBBALSA_INFORMATION_MESSAGE,
                           _("Filter applied to “%s”."),
-                          p->mbox->name);
+                          libbalsa_mailbox_get_name(p->mbox));
 
     g_slist_free(p->filters);
 }
@@ -255,7 +256,7 @@ fr_apply_now_pressed(BalsaFilterRunDialog* p)
     else
         balsa_information(LIBBALSA_INFORMATION_MESSAGE,
                           _("Filter applied to “%s”."),
-                          p->mbox->name);
+                          libbalsa_mailbox_get_name(p->mbox));
 }
 
 static void
@@ -269,7 +270,7 @@ fr_add_pressed_func(GtkTreeModel * model, GtkTreePath * path,
     if (fil->action == FILTER_RUN
         || fil->action == FILTER_TRASH
         || (fil->action == FILTER_COLOR && fil->action_string[0])
-        || strcmp(fil->action_string, p->mbox->url) != 0) {
+        || strcmp(fil->action_string, libbalsa_mailbox_get_url(p->mbox)) != 0) {
         /* Ok we can add the filter to this mailbox, there is no recursion problem */
         LibBalsaMailboxFilter *mf = g_new(LibBalsaMailboxFilter, 1);
         GtkTreeModel *sel_model =
@@ -297,7 +298,7 @@ fr_add_pressed_func(GtkTreeModel * model, GtkTreePath * path,
                             "the filter “%s” is “%s”.\n"
                             "You can’t associate it with the same "
                             "mailbox (that causes recursion)."),
-                          fil->name, p->mbox->name);
+                          fil->name, libbalsa_mailbox_get_name(p->mbox));
 
     if (!libbalsa_mailbox_can_match(p->mbox, fil->condition))
        balsa_information(LIBBALSA_INFORMATION_WARNING,
@@ -307,7 +308,7 @@ fr_add_pressed_func(GtkTreeModel * model, GtkTreePath * path,
                            " regular expressions match with IMAP mailboxes,"
                            " it is done by a very slow method; if possible, use substring match"
                            " instead."),
-                         fil->name, p->mbox->name);
+                         fil->name, libbalsa_mailbox_get_name(p->mbox));
 }
 
 void
diff --git a/src/filter-run-dialog.c b/src/filter-run-dialog.c
index eafda90..83ba204 100644
--- a/src/filter-run-dialog.c
+++ b/src/filter-run-dialog.c
@@ -180,6 +180,7 @@ balsa_filter_run_dialog_new(LibBalsaMailbox * mbox, GtkWindow * parent)
     BalsaFilterRunDialog *p;
     gchar * dialog_title;
     gboolean use_headerbar = TRUE;
+    GSList *filters;
 
     g_return_val_if_fail(mbox, NULL);
 
@@ -194,18 +195,19 @@ balsa_filter_run_dialog_new(LibBalsaMailbox * mbox, GtkWindow * parent)
     p->mbox=mbox;
     libbalsa_mailbox_open(p->mbox, NULL); 
     dialog_title=g_strconcat(_("Filters of Mailbox: "),
-                             p->mbox->name,NULL);
+                             libbalsa_mailbox_get_name(p->mbox),NULL);
     gtk_window_set_title(GTK_WINDOW(p),dialog_title);
     gtk_window_set_role(GTK_WINDOW(p), "filter-run");
     g_free(dialog_title);
 
     /* Load associated filters if needed */
-    if (!p->mbox->filters)
+    if (libbalsa_mailbox_get_filters(p->mbox) == NULL)
        config_mailbox_filters_load(p->mbox);
 
     /* Populate the lists */
-    populate_available_filters_list(p->available_filters,mbox->filters);
-    populate_selected_filters_list(p->selected_filters,mbox->filters);
+    filters = libbalsa_mailbox_get_filters(mbox);
+    populate_available_filters_list(p->available_filters, filters);
+    populate_selected_filters_list(p->selected_filters, filters);
 
     return GTK_WIDGET(p);
 }
@@ -495,7 +497,8 @@ filters_run_dialog(LibBalsaMailbox * mbox,
     /* We look for an existing dialog box for this mailbox */
     for (lst = fr_dialogs_opened; lst != NULL; lst = lst->next) {
         BalsaFilterRunDialog *dialog = lst->data;
-        if (strcmp(dialog->mbox->url, mbox->url) == 0)
+        if (strcmp(libbalsa_mailbox_get_url(dialog->mbox),
+                   libbalsa_mailbox_get_url(mbox)) == 0)
             break;
     }
     if (lst) {
diff --git a/src/folder-conf.c b/src/folder-conf.c
index ff11dd9..43daaaf 100644
--- a/src/folder-conf.c
+++ b/src/folder-conf.c
@@ -69,7 +69,7 @@ struct _SubfolderDialogData {
     FOLDER_CONF_COMMON;
     BalsaMailboxConfView *mcv;
     GtkWidget *parent_folder, *folder_name, *host_label;
-    gchar *old_folder, *old_parent;
+    const gchar *old_folder, *old_parent;
     BalsaMailboxNode *parent;   /* (new) parent of the mbnode.  */
     /* Used for renaming and creation */
 };
@@ -774,7 +774,7 @@ folder_conf_imap_sub_node(BalsaMailboxNode * mn)
            return;
        }
        sdd->parent = mn->parent;
-       sdd->old_folder = mn->mailbox->name;
+       sdd->old_folder = libbalsa_mailbox_get_name(mn->mailbox);
     } else {
        /* create */
         sdd->old_folder = NULL;
@@ -871,20 +871,22 @@ folder_conf_imap_sub_node(BalsaMailboxNode * mn)
         GString *rights_str;
         gchar * rights;
         gchar * quotas;
+        gboolean readonly;
 
         ++row;
         (void) libbalsa_create_grid_label(_("Permissions:"), grid, row);
 
         /* mailbox closed: no detailed permissions available */
+        readonly = libbalsa_mailbox_get_readonly(mn->mailbox);
         if (!libbalsa_mailbox_imap_is_connected(LIBBALSA_MAILBOX_IMAP(mn->mailbox))) {
-            rights_str = g_string_new(std_acls[mn->mailbox->readonly ? 1 : 3]);
+            rights_str = g_string_new(std_acls[readonly ? 1 : 3]);
             rights_str =
                 g_string_append(rights_str,
                                 _("\ndetailed permissions are available only for open folders"));
         } else {
             rights = libbalsa_imap_get_rights(LIBBALSA_MAILBOX_IMAP(mn->mailbox));
             if (!rights) {
-                rights_str = g_string_new(std_acls[mn->mailbox->readonly ? 1 : 3]);
+                rights_str = g_string_new(std_acls[readonly ? 1 : 3]);
                 rights_str =
                     g_string_append(rights_str,
                                     _("\nthe server does not support ACLs"));
diff --git a/src/mailbox-conf.c b/src/mailbox-conf.c
index faef9e5..eeae7a1 100644
--- a/src/mailbox-conf.c
+++ b/src/mailbox-conf.c
@@ -436,7 +436,7 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
            LIBBALSA_INFORMATION_ERROR,
            _("Mailbox “%s” is used by Balsa and I cannot remove it.\n"
              "If you really want to remove it, assign its function\n"
-             "to some other mailbox."), mailbox->name);
+             "to some other mailbox."), libbalsa_mailbox_get_name(mailbox));
        return;
     }
 
@@ -454,13 +454,14 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
                                        "on disk you may “Add Mailbox” "
                                        "to access the mailbox again.\n"
                                        "What would you like to do?"),
-                                     mailbox->name);
+                                     libbalsa_mailbox_get_name(mailbox));
         gtk_dialog_add_buttons(GTK_DIALOG(ask),
                                _("Remove from _list"), 0,
                                _("Remove from list and _disk"), 1,
                                _("_Cancel"), GTK_RESPONSE_CANCEL,
                                NULL);
-    } else if (LIBBALSA_IS_MAILBOX_IMAP(mailbox) && !mailbox->config_prefix) {
+    } else if (LIBBALSA_IS_MAILBOX_IMAP(mailbox) &&
+               libbalsa_mailbox_get_config_prefix(mailbox) == NULL) {
        /* deleting remote IMAP mailbox in a folder set */
         ask = gtk_message_dialog_new(GTK_WINDOW(balsa_app.main_window), 0,
                                      GTK_MESSAGE_QUESTION,
@@ -476,7 +477,7 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
                                        "later to add a mailbox "
                                        "with this name.\n"
                                       "What would you like to do?"),
-                                    mailbox->name, mailbox->name);
+                                    libbalsa_mailbox_get_name(mailbox), libbalsa_mailbox_get_name(mailbox));
         gtk_dialog_add_buttons(GTK_DIALOG(ask),
                                _("_Remove from server"), 0,
                                _("_Cancel"), GTK_RESPONSE_CANCEL,
@@ -492,7 +493,7 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
                                        "later to access "
                                        "this mailbox again.\n"
                                       "What would you like to do?"),
-                                    mailbox->name);
+                                    libbalsa_mailbox_get_name(mailbox));
         gtk_dialog_add_buttons(GTK_DIALOG(ask),
                                _("_Remove from list"), 0,
                                _("_Cancel"), GTK_RESPONSE_CANCEL,
@@ -512,7 +513,7 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
        return;
 
     /* Save the mailbox URL */
-    url = g_strdup(mailbox->url ? mailbox->url : mailbox->name);
+    url = g_strdup(libbalsa_mailbox_get_url(mailbox) ? libbalsa_mailbox_get_url(mailbox) : 
libbalsa_mailbox_get_name(mailbox));
 
     /* Delete it from the config file and internal nodes */
     config_mailbox_delete(mailbox);
@@ -522,7 +523,8 @@ mailbox_conf_delete(BalsaMailboxNode * mbnode)
        balsa_mblist_close_mailbox(mailbox);
 
     /* Remove mailbox on IMAP server */
-    if (LIBBALSA_IS_MAILBOX_IMAP(mailbox) && !mailbox->config_prefix) {
+    if (LIBBALSA_IS_MAILBOX_IMAP(mailbox) &&
+        libbalsa_mailbox_get_config_prefix(mailbox) == NULL) {
         GError *err = NULL;
        BalsaMailboxNode *parent = mbnode->parent;
         if(libbalsa_imap_delete_folder(LIBBALSA_MAILBOX_IMAP(mailbox),
@@ -737,11 +739,11 @@ mailbox_conf_set_values(MailboxConfWindow *mcw)
 
        g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
 
-       if (mcw->mailbox_name && mailbox->name)
-               gtk_entry_set_text(GTK_ENTRY(mcw->mailbox_name), mailbox->name);
+       if (mcw->mailbox_name && libbalsa_mailbox_get_name(mailbox))
+               gtk_entry_set_text(GTK_ENTRY(mcw->mailbox_name), libbalsa_mailbox_get_name(mailbox));
 
        if (LIBBALSA_IS_MAILBOX_LOCAL(mailbox)) {
-               if (mailbox->url) {
+               if (libbalsa_mailbox_get_url(mailbox)) {
                        GtkFileChooser *chooser = GTK_FILE_CHOOSER(mcw->window);
                        LibBalsaMailboxLocal *local = LIBBALSA_MAILBOX_LOCAL(mailbox);
                        const gchar *path = libbalsa_mailbox_local_get_path(local);
@@ -897,10 +899,8 @@ update_pop_mailbox(MailboxConfWindow *mcw)
        bsc = &mcw->mb_data.pop3.bsc;
 
        /* basic data */
-       g_free(LIBBALSA_MAILBOX(mailbox)->name);
-       LIBBALSA_MAILBOX(mailbox)->name =
-            gtk_editable_get_chars(GTK_EDITABLE(mcw->mailbox_name), 0, -1);
-
+        libbalsa_mailbox_set_name((LibBalsaMailbox *) mailbox,
+                                  gtk_entry_get_text(GTK_ENTRY(mcw->mailbox_name)));
        libbalsa_server_set_host(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server)), FALSE);
         libbalsa_server_set_security(server, 
gtk_combo_box_get_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security)) + 1);
 
@@ -935,6 +935,7 @@ static void
 update_imap_mailbox(MailboxConfWindow *mcw)
 {
     gchar *path;
+    gchar *name = NULL;
     LibBalsaMailboxImap *mailbox;
     LibBalsaServer* server;
 
@@ -948,8 +949,9 @@ update_imap_mailbox(MailboxConfWindow *mcw)
                                  G_CALLBACK(config_mailbox_update),
                                 mailbox);
     }
-    g_free(LIBBALSA_MAILBOX(mailbox)->name);
-    fill_in_imap_data(mcw, &LIBBALSA_MAILBOX(mailbox)->name, &path);
+    fill_in_imap_data(mcw, &name, &path);
+    libbalsa_mailbox_set_name((LibBalsaMailbox *) mailbox, name);
+    g_free(name);
     libbalsa_server_set_username(server,
                                 gtk_entry_get_text(GTK_ENTRY
                                                    (mcw->mb_data.imap.username)));
@@ -1008,8 +1010,9 @@ mailbox_conf_update(MailboxConfWindow *mcw)
        mbnode = balsa_find_mailbox(mailbox);
         filename =
             gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(mcw->window));
-       path = g_strdup(libbalsa_mailbox_local_get_path(mailbox));
-        if (strcmp(filename, path)) {
+       path =
+            g_strdup(libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mailbox));
+        if (strcmp(filename, path) != 0) {
             /* rename */
             int i;
            gchar *file_dir, *path_dir;
@@ -1046,13 +1049,12 @@ mailbox_conf_update(MailboxConfWindow *mcw)
         name = mcw->mailbox_name ?
             gtk_editable_get_chars(GTK_EDITABLE(mcw->mailbox_name), 0, -1)
             : g_path_get_basename(filename);
-       if (strcmp(name, mailbox->name)) {
+       if (strcmp(name, libbalsa_mailbox_get_name(mailbox)) != 0) {
            /* Change name. */
-            g_free(mailbox->name);
-           mailbox->name = name;
+           libbalsa_mailbox_set_name(mailbox, name);
            balsa_mblist_mailbox_node_redraw(mbnode);
-       } else
-           g_free(name);
+       }
+        g_free(name);
 
        g_object_unref(mbnode);
         g_free(filename);
@@ -1065,7 +1067,7 @@ mailbox_conf_update(MailboxConfWindow *mcw)
        return;
     }
 
-    if (mailbox->config_prefix)
+    if (libbalsa_mailbox_get_config_prefix(mailbox) != NULL)
        config_mailbox_update(mailbox);
 
     if (LIBBALSA_IS_MAILBOX_POP3(mcw->mailbox))
@@ -1088,9 +1090,9 @@ mailbox_conf_add(MailboxConfWindow * mcw)
     if ( LIBBALSA_IS_MAILBOX_LOCAL(mcw->mailbox) ) {
        LibBalsaMailboxLocal *ml  = LIBBALSA_MAILBOX_LOCAL(mcw->mailbox);
        gchar *path;
+       gchar *basename;
 
-        path =
-            gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(mcw->window));
+        path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(mcw->window));
 
         if (libbalsa_mailbox_local_set_path(ml, path, TRUE) != 0) {
             g_free(path);
@@ -1102,7 +1104,9 @@ mailbox_conf_add(MailboxConfWindow * mcw)
             !libbalsa_path_is_below_dir(path,
                                         balsa_app.local_mail_directory);
         printf("Save to config: %d\n", save_to_config);
-       mcw->mailbox->name = g_path_get_basename(path);
+       basename = g_path_get_basename(path);
+       libbalsa_mailbox_set_name(mcw->mailbox, basename);
+        g_free(basename);
         g_free(path);
 
        balsa_mailbox_local_append(mcw->mailbox);
@@ -1201,7 +1205,8 @@ create_local_mailbox_dialog(MailboxConfWindow *mcw)
     grid = libbalsa_create_grid();
 
     /* mailbox name */
-    if(mcw->mailbox && mcw->mailbox->config_prefix) {
+    if (mcw->mailbox != NULL &&
+        libbalsa_mailbox_get_config_prefix(mcw->mailbox) != NULL) {
         label = libbalsa_create_grid_label(_("_Mailbox Name:"), grid, ++row);
         mcw->mailbox_name =
             libbalsa_create_grid_entry(grid,
@@ -1627,6 +1632,7 @@ mailbox_conf_view_check(BalsaMailboxConfView * view_info,
                        LibBalsaMailbox * mailbox)
 {
     gboolean changed;
+    LibBalsaMailboxView *view;
     GtkComboBox *combo_box;
     GtkTreeIter iter;
     gint active;
@@ -1637,12 +1643,13 @@ mailbox_conf_view_check(BalsaMailboxConfView * view_info,
 
     changed = FALSE;
 
-    libbalsa_mailbox_view_free(mailbox->view);
-    g_print("%s set view on %s\n", __func__, mailbox->name);
-    mailbox->view = config_load_mailbox_view(mailbox->url);
-    if (!mailbox->view) {
+    g_print("%s set view on %s\n", __func__, libbalsa_mailbox_get_name(mailbox));
+    view = config_load_mailbox_view(libbalsa_mailbox_get_url(mailbox));
+    if (view != NULL) {
+        libbalsa_mailbox_set_view(mailbox, view);
+    } else {
        /* The mailbox may not have its URL yet */
-       mailbox->view = libbalsa_mailbox_view_new();
+       libbalsa_mailbox_set_view(mailbox, libbalsa_mailbox_view_new());
     }
 
     combo_box = GTK_COMBO_BOX(view_info->identity_combo_box);
diff --git a/src/mailbox-node.c b/src/mailbox-node.c
index fcaf96e..f1bbe64 100644
--- a/src/mailbox-node.c
+++ b/src/mailbox-node.c
@@ -195,7 +195,7 @@ balsa_mailbox_node_dispose(GObject * object)
     if (mailbox != NULL) {
         libbalsa_mailbox_set_open(mailbox,
                                   libbalsa_mailbox_is_open(mailbox));
-        config_save_mailbox_view(mailbox->url, mailbox->view);
+        config_save_mailbox_view(libbalsa_mailbox_get_url(mailbox), libbalsa_mailbox_get_view(mailbox));
        if (balsa_app.main_window != NULL) {
            balsa_window_close_mbnode(balsa_app.main_window, mn);
         }
@@ -402,8 +402,10 @@ load_mailbox_view(BalsaMailboxNode * mbnode)
 {
     LibBalsaMailbox *mailbox = mbnode->mailbox;
 
-    if (!mailbox->view)
-        mailbox->view = config_load_mailbox_view(mailbox->url);
+    if (!libbalsa_mailbox_get_view(mailbox))
+        libbalsa_mailbox_set_view(mailbox,
+                                  config_load_mailbox_view
+                                  (libbalsa_mailbox_get_url(mailbox)));
 }
 
 static gboolean
@@ -430,10 +432,10 @@ imap_scan_attach_mailbox(BalsaMailboxNode * mbnode, imap_scan_item * isi)
     libbalsa_mailbox_imap_set_path(m, isi->fn);
     if(balsa_app.debug)
         printf("imap_scan_attach_mailbox: add mbox of name %s "
-              "(full path %s)\n", isi->fn, mailbox->url);
+              "(full path %s)\n", isi->fn, libbalsa_mailbox_get_url(mailbox));
     /* avoid allocating the name again: */
-    mailbox->name = mbnode->name;
-    mbnode->name = NULL;
+    libbalsa_mailbox_set_name(mailbox, mbnode->name);
+    g_clear_pointer(&mbnode->name, g_free);
     mbnode->mailbox = mailbox;
     load_mailbox_view(mbnode);
     if (isi->special) {
@@ -443,7 +445,7 @@ imap_scan_attach_mailbox(BalsaMailboxNode * mbnode, imap_scan_item * isi)
         *isi->special = mailbox;
        g_object_add_weak_pointer(G_OBJECT(m), (gpointer) isi->special);
         if (isi->special == &balsa_app.outbox)
-            mailbox->no_reassemble = TRUE;
+            libbalsa_mailbox_set_no_reassemble(mailbox, TRUE);
     }
 
     return TRUE;
@@ -562,7 +564,8 @@ balsa_mailbox_node_new_from_mailbox(LibBalsaMailbox * mb)
     if (LIBBALSA_IS_MAILBOX_MH(mb) || LIBBALSA_IS_MAILBOX_MAILDIR(mb)) {
        /* Mh and Maildir mailboxes are directories, and may be nested,
         * so we need to be able to append a subtree. */
-       mbn->name = g_strdup(libbalsa_mailbox_local_get_path(mb));
+       mbn->name =
+            g_strdup(libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mb));
        mbn->dir = g_strdup(mbn->name);
        g_signal_connect(G_OBJECT(mbn), "append-subtree", 
                          G_CALLBACK(read_dir_cb), NULL);
@@ -735,7 +738,7 @@ balsa_mailbox_local_append(LibBalsaMailbox* mbx)
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_LOCAL(mbx));
 
-    dir = g_strdup(libbalsa_mailbox_local_get_path(mbx));
+    dir = g_strdup(libbalsa_mailbox_local_get_path((LibBalsaMailboxLocal *) mbx));
     while (dir[1] /* i.e. dir != "/" */
            && !(parent = find_dir(dir))) {
         gchar* tmp =  g_path_get_dirname(dir);
@@ -882,17 +885,19 @@ bmbn_scan_children_idle(BalsaMailboxNode ** mbnode)
             gboolean has_unread_messages = FALSE;
 
             if (mn->mailbox)
-                has_unread_messages = mn->mailbox->has_unread_messages;
+                has_unread_messages =
+                    libbalsa_mailbox_get_has_unread_messages(mn->mailbox);
             balsa_mailbox_node_rescan(mn);
             if (!l->data)
                 continue;
             if (mn->mailbox)
-                mn->mailbox->has_unread_messages = has_unread_messages;
+                libbalsa_mailbox_set_has_unread_messages
+                    (mn->mailbox, has_unread_messages);
             mn->scanned = TRUE;
         } else if (balsa_app.debug)
             g_print("%s: %s “%s” was already scanned\n", __func__,
                     mn->mailbox ? "mailbox" : "folder",
-                    mn->mailbox ? mn->mailbox->name : mn->name);
+                    mn->mailbox ? libbalsa_mailbox_get_name(mn->mailbox) : mn->name);
         g_object_remove_weak_pointer(G_OBJECT(mn), & l->data);
     }
     g_slist_free(list);
@@ -1175,15 +1180,25 @@ remove_special_mailbox_by_url(const gchar* url, LibBalsaMailbox *** special)
 {
     LibBalsaMailbox **mailbox;
 
-    if (balsa_app.trash && strcmp(url, balsa_app.trash->url) == 0)
+    if (balsa_app.trash && strcmp(url,
+                                  libbalsa_mailbox_get_url(balsa_app.trash))
+            == 0)
        mailbox = &balsa_app.trash;
-    else if (balsa_app.inbox && strcmp(url, balsa_app.inbox->url) == 0)
+    else if (balsa_app.inbox && strcmp(url,
+                                       libbalsa_mailbox_get_url(balsa_app.inbox))
+            == 0)
        mailbox = &balsa_app.inbox;
-    else if (balsa_app.outbox && strcmp(url, balsa_app.outbox->url) == 0)
+    else if (balsa_app.outbox && strcmp(url,
+                                        libbalsa_mailbox_get_url(balsa_app.outbox))
+            == 0)
        mailbox = &balsa_app.outbox;
-    else if (balsa_app.sentbox && strcmp(url, balsa_app.sentbox->url) == 0)
+    else if (balsa_app.sentbox && strcmp(url,
+                                         libbalsa_mailbox_get_url(balsa_app.sentbox))
+            == 0)
        mailbox = &balsa_app.sentbox;
-    else if (balsa_app.draftbox && strcmp(url, balsa_app.draftbox->url) == 0)
+    else if (balsa_app.draftbox && strcmp(url,
+                                          libbalsa_mailbox_get_url(balsa_app.draftbox))
+            == 0)
        mailbox = &balsa_app.draftbox;
     else
         mailbox = NULL;
@@ -1232,13 +1247,13 @@ add_local_mailbox(BalsaMailboxNode *root, const gchar * name,
            printf("Not accessible mailbox %s\n", path);
            return NULL;
        }
-       mailbox->name = g_strdup(name);
+       libbalsa_mailbox_set_name(mailbox, name);
        
        mbnode = balsa_mailbox_node_new_from_mailbox(mailbox);
        
        if (balsa_app.debug)
            g_print(_("Local mailbox %s loaded as: %s\n"),
-                   mailbox->name,
+                   libbalsa_mailbox_get_name(mailbox),
                    g_type_name(G_OBJECT_TYPE(mailbox)));
         if (balsa_app.check_mail_upon_startup
             && libbalsa_mailbox_get_subscribe(mailbox) !=
diff --git a/src/main-window.c b/src/main-window.c
index c872a8c..13b9c92 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -2453,7 +2453,7 @@ bw_enable_mailbox_menus(BalsaWindow * window, BalsaIndex * index)
     }
     bw_action_set_enabled(window, "mailbox-expunge",
     /* cppcheck-suppress nullPointer */
-                          mailbox && !mailbox->readonly);
+                          mailbox && !libbalsa_mailbox_get_readonly(mailbox));
 
     bw_actions_set_enabled(window, mailbox_actions,
                            G_N_ELEMENTS(mailbox_actions), enable);
@@ -2509,7 +2509,8 @@ bw_enable_message_menus(BalsaWindow * window, guint msgno)
     bw_actions_set_enabled(window, message_actions,
                            G_N_ELEMENTS(message_actions), enable);
 
-    enable_mod = (enable && !bindex->mailbox_node->mailbox->readonly);
+    enable_mod =
+        (enable && !libbalsa_mailbox_get_readonly(bindex->mailbox_node->mailbox));
     bw_actions_set_enabled(window, modify_message_actions,
                            G_N_ELEMENTS(modify_message_actions),
                            enable_mod);
@@ -2761,7 +2762,7 @@ bw_notebook_label_new(BalsaMailboxNode * mbnode)
 
     box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
 
-    lab = gtk_label_new(mbnode->mailbox->name);
+    lab = gtk_label_new(libbalsa_mailbox_get_name(mbnode->mailbox));
     gtk_widget_set_name(lab, "balsa-notebook-tab-label");
 
     /* Try to make text not bold: */
@@ -2792,7 +2793,7 @@ bw_notebook_label_new(BalsaMailboxNode * mbnode)
                      G_CALLBACK(bw_mailbox_tab_close_cb), mbnode);
     gtk_box_pack_start(GTK_BOX(box), but);
 
-    gtk_widget_set_tooltip_text(box, mbnode->mailbox->url);
+    gtk_widget_set_tooltip_text(box, libbalsa_mailbox_get_url(mbnode->mailbox));
     return box;
 }
 
@@ -2948,7 +2949,7 @@ balsa_window_real_open_mbnode(BalsaWindow * window,
          (balsa_app.layout_type == LAYOUT_WIDE_SCREEN)
          ? BALSA_INDEX_NARROW : BALSA_INDEX_WIDE);
 
-    message = g_strdup_printf(_("Opening %s"), mailbox->name);
+    message = g_strdup_printf(_("Opening %s"), libbalsa_mailbox_get_name(mailbox));
     balsa_window_increase_activity(window, message);
 
     info = g_new(BalsaWindowRealOpenMbnodeInfo, 1);
@@ -3178,7 +3179,7 @@ bw_check_mailbox_progress_cb(LibBalsaMailbox* mailbox, gint action, gdouble frac
 {
        gchar *progress_id;
 
-       progress_id = g_strdup_printf("POP3: %s", mailbox->name);
+       progress_id = g_strdup_printf("POP3: %s", libbalsa_mailbox_get_name(mailbox));
        if (action == LIBBALSA_NTFY_INIT) {
                libbalsa_progress_dialog_ensure(&progress_dialog, _("Checking Mail…"), 
GTK_WINDOW(balsa_app.main_window), progress_id);
        }
@@ -3235,7 +3236,7 @@ bw_check_mailbox_list(struct check_messages_thread_info *info, GList *mailbox_li
                        g_signal_connect(G_OBJECT(mailbox), "progress-notify", 
G_CALLBACK(bw_check_mailbox_progress_cb), mailbox);
         }
         bw_pop_mbox->thread = g_thread_new(NULL, (GThreadFunc) bw_check_mailbox, mailbox);
-        g_debug("launched thread %p for checking POP3 mailbox %s", bw_pop_mbox->thread, mailbox->name);
+        g_debug("launched thread %p for checking POP3 mailbox %s", bw_pop_mbox->thread, 
libbalsa_mailbox_get_name(mailbox));
         check_mbx = g_list_prepend(check_mbx, bw_pop_mbox);
     }
 
@@ -3373,10 +3374,10 @@ check_new_messages_count(LibBalsaMailbox * mailbox, gboolean notify)
     if (notify) {
         gint num_new, has_new;
 
-        num_new = mailbox->unread_messages - info->unread_messages;
+        num_new = libbalsa_mailbox_get_unread_messages(mailbox) - info->unread_messages;
         if (num_new < 0)
             num_new = 0;
-        has_new = mailbox->has_unread_messages - info->has_unread_messages;
+        has_new = libbalsa_mailbox_get_has_unread_messages(mailbox) - info->has_unread_messages;
         if (has_new < 0)
             has_new = 0;
 
@@ -3384,8 +3385,8 @@ check_new_messages_count(LibBalsaMailbox * mailbox, gboolean notify)
            bw_display_new_mail_notification(num_new, has_new);
     }
 
-    info->unread_messages = mailbox->unread_messages;
-    info->has_unread_messages = mailbox->has_unread_messages;
+    info->unread_messages = libbalsa_mailbox_get_unread_messages(mailbox);
+    info->has_unread_messages = libbalsa_mailbox_get_has_unread_messages(mailbox);
 }
 
 /* this one is called only in the threaded code */
@@ -3395,7 +3396,7 @@ bw_mailbox_check(LibBalsaMailbox * mailbox, struct check_messages_thread_info *i
     if (libbalsa_mailbox_get_subscribe(mailbox) == LB_MAILBOX_SUBSCRIBE_NO)
         return;
 
-    g_debug("checking mailbox %s", mailbox->name);
+    g_debug("checking mailbox %s", libbalsa_mailbox_get_name(mailbox));
     if (LIBBALSA_IS_MAILBOX_IMAP(mailbox)) {
        if ((info->window != NULL) && !info->window->network_available) {
                return;
@@ -3403,12 +3404,12 @@ bw_mailbox_check(LibBalsaMailbox * mailbox, struct check_messages_thread_info *i
 
        if (info->with_progress_dialog) {
                libbalsa_progress_dialog_update(&progress_dialog, _("Mailboxes"), FALSE, INFINITY,
-                       _("IMAP mailbox: %s"), mailbox->url);
+                       _("IMAP mailbox: %s"), libbalsa_mailbox_get_url(mailbox));
        }
     } else if (LIBBALSA_IS_MAILBOX_LOCAL(mailbox)) {
        if (info->with_progress_dialog) {
                libbalsa_progress_dialog_update(&progress_dialog, _("Mailboxes"), FALSE, INFINITY,
-                       _("Local mailbox: %s"), mailbox->name);
+                       _("Local mailbox: %s"), libbalsa_mailbox_get_name(mailbox));
        }
     } else {
        g_assert_not_reached();
@@ -4192,12 +4193,12 @@ bw_notebook_switch_page_cb(GtkWidget * notebook,
     time(&index->mailbox_node->last_use);
 
     mailbox = index->mailbox_node->mailbox;
-    if (mailbox->name) {
-        if (mailbox->readonly) {
+    if (libbalsa_mailbox_get_name(mailbox)) {
+        if (libbalsa_mailbox_get_readonly(mailbox)) {
             title =
-                g_strdup_printf(_("Balsa: %s (read-only)"), mailbox->name);
+                g_strdup_printf(_("Balsa: %s (read-only)"), libbalsa_mailbox_get_name(mailbox));
         } else {
-            title = g_strdup_printf(_("Balsa: %s"), mailbox->name);
+            title = g_strdup_printf(_("Balsa: %s"), libbalsa_mailbox_get_name(mailbox));
         }
         gtk_window_set_title(GTK_WINDOW(window), title);
         g_free(title);
@@ -4223,7 +4224,7 @@ bw_notebook_switch_page_cb(GtkWidget * notebook,
     balsa_index_ensure_visible(index);
 
     g_free(balsa_app.current_mailbox_url);
-    balsa_app.current_mailbox_url = g_strdup(mailbox->url);
+    balsa_app.current_mailbox_url = g_strdup(libbalsa_mailbox_get_url(mailbox));
 }
 
 static void
@@ -4677,19 +4678,19 @@ void
 balsa_window_set_statusbar(BalsaWindow * window, LibBalsaMailbox * mailbox)
 {
     gint total_messages = libbalsa_mailbox_total_messages(mailbox);
-    gint unread_messages = mailbox->unread_messages;
+    gint unread_messages = libbalsa_mailbox_get_unread_messages(mailbox);
     gint hidden_messages;
     GString *desc = g_string_new(NULL);
     GtkStatusbar *statusbar;
     guint context_id;
 
     hidden_messages =
-        mailbox->msg_tree ? total_messages -
-        (g_node_n_nodes(mailbox->msg_tree, G_TRAVERSE_ALL) - 1) : 0;
+        libbalsa_mailbox_get_msg_tree(mailbox) ? total_messages -
+        (g_node_n_nodes(libbalsa_mailbox_get_msg_tree(mailbox), G_TRAVERSE_ALL) - 1) : 0;
 
     /* xgettext: this is the first part of the message
      * "Shown mailbox: %s with %d messages, %d new, %d hidden". */
-    g_string_append_printf(desc, _("Shown mailbox: %s "), mailbox->name);
+    g_string_append_printf(desc, _("Shown mailbox: %s "), libbalsa_mailbox_get_name(mailbox));
     if (total_messages > 0) {
         /* xgettext: this is the second part of the message
          * "Shown mailbox: %s with %d messages, %d new, %d hidden". */
@@ -4754,13 +4755,13 @@ balsa_window_next_unread(BalsaWindow * window)
                                    GTK_MESSAGE_QUESTION,
                                    GTK_BUTTONS_YES_NO,
                                    _("The next unread message is in %s"),
-                                   mailbox->name);
+                                   libbalsa_mailbox_get_name(mailbox));
 #if HAVE_MACOSX_DESKTOP
         libbalsa_macosx_menu_for_parent(dialog, GTK_WINDOW(window));
 #endif
         gtk_message_dialog_format_secondary_text
             (GTK_MESSAGE_DIALOG(dialog),
-             _("Do you want to select %s?"), mailbox->name);
+             _("Do you want to select %s?"), libbalsa_mailbox_get_name(mailbox));
         gtk_dialog_set_default_response(GTK_DIALOG(dialog),
                                         GTK_RESPONSE_YES);
         response = gtk_dialog_run(GTK_DIALOG(dialog));
diff --git a/src/main.c b/src/main.c
index 77746dd..8c202f1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -173,7 +173,7 @@ initial_open_unread_mailboxes()
         for (l = gl; l; l = l->next) {
             LibBalsaMailbox *mailbox = LIBBALSA_MAILBOX(l->data);
 
-            printf("opening %s..\n", mailbox->name);
+            printf("opening %s..\n", libbalsa_mailbox_get_name(mailbox));
             balsa_mblist_open_mailbox(mailbox);
         }
         g_list_free(gl);
@@ -188,7 +188,7 @@ initial_open_inbox()
     if (!balsa_app.inbox)
        return FALSE;
 
-    printf("opening %s..\n", balsa_app.inbox->name);
+    printf("opening %s..\n", libbalsa_mailbox_get_name(balsa_app.inbox));
     balsa_mblist_open_mailbox_hidden(balsa_app.inbox);
 
     return FALSE;
@@ -200,9 +200,12 @@ balsa_get_stats(long *unread, long *unsent)
 
     if(balsa_app.inbox && libbalsa_mailbox_open(balsa_app.inbox, NULL) ) {
         /* set threading type to load messages */
+        LibBalsaMailboxView *view;
+
+        view = libbalsa_mailbox_get_view(balsa_app.inbox);
         libbalsa_mailbox_set_threading(balsa_app.inbox,
-                                       balsa_app.inbox->view->threading_type);
-        *unread = balsa_app.inbox->unread_messages;
+                                       view->threading_type);
+        *unread = libbalsa_mailbox_get_unread_messages(balsa_app.inbox);
         libbalsa_mailbox_close(balsa_app.inbox, FALSE);
     } else *unread = -1;
     if(balsa_app.draftbox && libbalsa_mailbox_open(balsa_app.outbox, NULL)){
@@ -265,7 +268,7 @@ scan_mailboxes_idle_cb()
         gl = balsa_mblist_find_all_unread_mboxes(NULL);
         for (l = gl; l; l = l->next) {
             LibBalsaMailbox *mailbox = l->data;
-            g_ptr_array_add(url_array, g_strdup(mailbox->url));
+            g_ptr_array_add(url_array, g_strdup(libbalsa_mailbox_get_url(mailbox)));
         }
         g_list_free(gl);
     }
@@ -295,7 +298,7 @@ scan_mailboxes_idle_cb()
     }
 
     if (cmd_open_inbox || balsa_app.open_inbox_upon_startup) {
-        g_ptr_array_add(url_array, g_strdup(balsa_app.inbox->url));
+        g_ptr_array_add(url_array, g_strdup(libbalsa_mailbox_get_url(balsa_app.inbox)));
     }
 
     if (url_array->len) {
@@ -348,7 +351,7 @@ periodic_expunge_cb(void)
     for (l = list; l; l = l->next) {
         BalsaMailboxNode *mbnode = l->data;
         if (mbnode->mailbox && libbalsa_mailbox_is_open(mbnode->mailbox)
-            && !mbnode->mailbox->readonly) {
+            && !libbalsa_mailbox_get_readonly(mbnode->mailbox)) {
             time_t tm = time(NULL);
             if (tm-mbnode->last_use > balsa_app.expunge_timeout)
                 libbalsa_mailbox_sync_storage(mbnode->mailbox, TRUE);
diff --git a/src/message-window.c b/src/message-window.c
index fa55c31..4fcc744 100644
--- a/src/message-window.c
+++ b/src/message-window.c
@@ -319,7 +319,8 @@ mw_set_buttons_sensitive(MessageWindow * mw)
     enable = index && balsa_index_previous_msgno(index, current_msgno) > 0;
     mw_set_enabled(mw, "previous-message", enable);
 
-    enable = index && index->mailbox_node->mailbox->unread_messages > 0;
+    enable = index != NULL &&
+        libbalsa_mailbox_get_unread_messages(index->mailbox_node->mailbox) > 0;
     mw_set_enabled(mw, "next-unread", enable);
 
     enable = index
@@ -885,7 +886,7 @@ message_window_new(LibBalsaMailbox * mailbox, guint msgno)
                           &move_menu);
     gtk_menu_item_set_submenu(GTK_MENU_ITEM(move_menu), submenu);
 
-    if (mailbox->readonly) {
+    if (libbalsa_mailbox_get_readonly(mailbox)) {
        gtk_widget_set_sensitive(move_menu, FALSE);
        mw_disable_trash(mw);
     }
diff --git a/src/pref-manager.c b/src/pref-manager.c
index 294a92d..d71c964 100644
--- a/src/pref-manager.c
+++ b/src/pref-manager.c
@@ -332,7 +332,10 @@ update_view_defaults(const gchar * group, const gchar * url,
     LibBalsaMailboxView *view;
 
     mailbox = balsa_find_mailbox_by_url(url);
-    view = mailbox ? mailbox->view : config_load_mailbox_view(url);
+    view =
+        mailbox !=
+        NULL ? libbalsa_mailbox_get_view(mailbox) :
+        config_load_mailbox_view(url);
 
     if (!view)
         return FALSE;
@@ -961,7 +964,7 @@ static void
 add_other_server(BalsaMailboxNode * mbnode, GtkTreeModel * model)
 {
     gchar *protocol = NULL;
-    gchar *name = NULL;
+    const gchar *name = NULL;
     gboolean append = FALSE;
 
     if (mbnode) {
@@ -969,7 +972,7 @@ add_other_server(BalsaMailboxNode * mbnode, GtkTreeModel * model)
         if (mailbox) {
             if (LIBBALSA_IS_MAILBOX_IMAP(mailbox)) {
                 protocol = "IMAP";
-                name = mailbox->name;
+                name = libbalsa_mailbox_get_name(mailbox);
                 append = TRUE;
             }
         } else
@@ -3557,7 +3560,7 @@ update_mail_servers(void)
         gtk_list_store_append(GTK_LIST_STORE(model), &iter);
         gtk_list_store_set(GTK_LIST_STORE(model), &iter,
                            MS_PROT_COLUMN, protocol,
-                           MS_NAME_COLUMN, mbnode->mailbox->name,
+                           MS_NAME_COLUMN, libbalsa_mailbox_get_name(mbnode->mailbox),
                            MS_DATA_COLUMN, mbnode, -1);
     }
     /*
diff --git a/src/save-restore.c b/src/save-restore.c
index 5bc287f..b01e085 100644
--- a/src/save-restore.c
+++ b/src/save-restore.c
@@ -70,12 +70,19 @@ static void config_filters_load(void);
     g_strdup(BALSA_MAILBOX_NODE(mn)->config_prefix) : \
     config_get_unused_group(FOLDER_SECTION_PREFIX)
 
-#define mailbox_section_path(mbox) \
-    LIBBALSA_MAILBOX(mbox)->config_prefix ? \
-    g_strdup(LIBBALSA_MAILBOX(mbox)->config_prefix) : \
-    config_get_unused_group(MAILBOX_SECTION_PREFIX)
+static gchar *
+mailbox_section_path(LibBalsaMailbox * mailbox)
+{
+    const gchar *config_prefix;
+
+    config_prefix = libbalsa_mailbox_get_config_prefix(LIBBALSA_MAILBOX(mailbox));
+
+    return config_prefix != NULL ? g_strdup(config_prefix) :
+        config_get_unused_group(MAILBOX_SECTION_PREFIX);
+}
 
-gint config_load(void)
+gint
+config_load(void)
 {
     return config_global_load();
 }
@@ -187,17 +194,19 @@ config_mailbox_set_as_special(LibBalsaMailbox * mailbox, specialType which)
     default:
        return;
     }
-    if ((old_mailbox = *special)) {
+    if ((old_mailbox = *special) != NULL) {
+        gchar *basename;
+
         *special = NULL;
-        g_free(old_mailbox->config_prefix);
-        old_mailbox->config_prefix = NULL;
+        libbalsa_mailbox_set_config_prefix(old_mailbox, NULL);
 
-        g_free(old_mailbox->name);
-        old_mailbox->name = g_path_get_basename(old_mailbox->url);
+        basename = g_path_get_basename(libbalsa_mailbox_get_url(old_mailbox));
+        libbalsa_mailbox_set_name(old_mailbox, basename);
+        g_free(basename);
 
         if (!LIBBALSA_IS_MAILBOX_LOCAL(old_mailbox)
             || !libbalsa_path_is_below_dir(libbalsa_mailbox_local_get_path
-                                           (old_mailbox),
+                                           ((LibBalsaMailboxLocal *) old_mailbox),
                                            balsa_app.local_mail_directory))
             config_mailbox_add(old_mailbox, NULL);
 
@@ -209,8 +218,7 @@ config_mailbox_set_as_special(LibBalsaMailbox * mailbox, specialType which)
        g_object_unref(mbnode);
     }
     config_mailbox_delete(mailbox);
-    g_free(mailbox->name);
-    mailbox->name = g_strdup(specialNames[which]);
+    libbalsa_mailbox_set_name(mailbox, specialNames[which]);
     config_mailbox_add(mailbox, specialNames[which]);
 
     *special = mailbox;
@@ -223,7 +231,8 @@ config_mailbox_set_as_special(LibBalsaMailbox * mailbox, specialType which)
 
     switch(which) {
     case SPECIAL_SENT: 
-       balsa_mblist_mru_add(&balsa_app.fcc_mru, mailbox->url); break;
+       balsa_mblist_mru_add(&balsa_app.fcc_mru, libbalsa_mailbox_get_url(mailbox));
+        break;
     case SPECIAL_TRASH:
         libbalsa_filters_set_trash(balsa_app.trash); break;
     default: break;
@@ -309,7 +318,8 @@ gint config_folder_add(BalsaMailboxNode * mbnode, const char *key_arg)
 }                              /* config_mailbox_add */
 
 /* removes from the configuration only */
-gint config_mailbox_delete(const LibBalsaMailbox * mailbox)
+gint
+config_mailbox_delete(LibBalsaMailbox * mailbox)
 {
     gchar *tmp;                        /* the key in the mailbox section name */
     gint res;
@@ -406,7 +416,7 @@ config_mailbox_init(const gchar * prefix)
            special = &balsa_app.inbox;
        else if (strcmp(OUTBOX_NAME, key) == 0) {
            special = &balsa_app.outbox;
-            mailbox->no_reassemble = TRUE;
+            libbalsa_mailbox_set_no_reassemble(mailbox, TRUE);
         } else if (strcmp(SENTBOX_NAME, key) == 0)
            special = &balsa_app.sentbox;
        else if (strcmp(DRAFTS_NAME, key) == 0)
@@ -1922,11 +1932,15 @@ config_filters_save(void)
 void
 config_mailbox_filters_save(LibBalsaMailbox * mbox)
 {
+    const gchar *url;
     gchar * tmp;
 
-    g_return_if_fail(mbox);
-    tmp = mailbox_filters_section_lookup(mbox->url ? mbox->url : mbox->name);
-    if (!mbox->filters) {
+    g_return_if_fail(LIBBALSA_IS_MAILBOX(mbox));
+
+    url = libbalsa_mailbox_get_url(mbox);
+    tmp = mailbox_filters_section_lookup(url !=NULL ? url :
+                                         libbalsa_mailbox_get_name(mbox));
+    if (libbalsa_mailbox_get_filters(mbox) == NULL) {
        if (tmp) {
            libbalsa_conf_remove_group(tmp);
            g_free(tmp);
@@ -1938,7 +1952,7 @@ config_mailbox_filters_save(LibBalsaMailbox * mbox)
        tmp=config_get_unused_group(MAILBOX_FILTERS_SECTION_PREFIX);
        libbalsa_conf_push_group(tmp);
        g_free(tmp);
-       libbalsa_conf_set_string(MAILBOX_FILTERS_URL_KEY,mbox->url);
+       libbalsa_conf_set_string(MAILBOX_FILTERS_URL_KEY, url);
     }
     else {
        libbalsa_conf_push_group(tmp);
diff --git a/src/save-restore.h b/src/save-restore.h
index adc2c92..26419eb 100644
--- a/src/save-restore.h
+++ b/src/save-restore.h
@@ -47,7 +47,7 @@ void config_defclient_save(void);
 
 gchar *mailbox_get_pkey(const LibBalsaMailbox * mbox);
 gint config_mailbox_add(LibBalsaMailbox * mailbox, const char *key_arg);
-gint config_mailbox_delete(const LibBalsaMailbox * mailbox);
+gint config_mailbox_delete(LibBalsaMailbox * mailbox);
 gint config_mailbox_update(LibBalsaMailbox * mailbox);
 
 gint config_folder_add(BalsaMailboxNode * mbnode, const char *key_arg);
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index fa3b982..60b8282 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -480,8 +480,11 @@ address_book_response(GtkWidget * ab, gint response,
 static void
 sw_delete_draft(BalsaSendmsg * bsmsg)
 {
-    LibBalsaMessage *message = bsmsg->draft_message;
-    if (message && message->mailbox && !message->mailbox->readonly)
+    LibBalsaMessage *message;
+
+    message = bsmsg->draft_message;
+    if (message != NULL && message->mailbox != NULL
+        && !libbalsa_mailbox_get_readonly(message->mailbox))
         libbalsa_message_change_flags(message,
                                       LIBBALSA_MESSAGE_FLAG_DELETED, 0);
 }
@@ -2582,8 +2585,9 @@ create_info_pane(BalsaSendmsg * bsmsg)
 #undef REPLY_TO_ROW
 
     /* fcc: mailbox folder where the message copy will be written to */
-    if (!balsa_app.fcc_mru)
-        balsa_mblist_mru_add(&balsa_app.fcc_mru, balsa_app.sentbox->url);
+    if (balsa_app.fcc_mru == NULL)
+        balsa_mblist_mru_add(&balsa_app.fcc_mru,
+                             libbalsa_mailbox_get_url(balsa_app.sentbox));
     balsa_mblist_mru_add(&balsa_app.fcc_mru, "");
     if (balsa_app.copy_to_sentbox) {
         /* move the NULL option to the bottom */
@@ -5236,7 +5240,7 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
                                        bsmsg->flow, &error);
     if (result == LIBBALSA_MESSAGE_CREATE_OK) {
        if (bsmsg->parent_message && bsmsg->parent_message->mailbox
-            && !bsmsg->parent_message->mailbox->readonly)
+            && !libbalsa_mailbox_get_readonly(bsmsg->parent_message->mailbox))
            libbalsa_message_reply(bsmsg->parent_message);
         sw_delete_draft(bsmsg);
     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]