[balsa/wip/gtk4: 262/351] message: Declare it final



commit af79159b97d4984a1fadc0e25afd09265a5e2577
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Mar 29 16:19:44 2018 -0400

    message: Declare it final
    
        Use G_DECLARE_FINAL_TYPE for LibBalsaMessage, make it
        private, and provide a complete set of getters and setters.

 libbalsa/body.c                   |   39 +-
 libbalsa/filter.c                 |   43 +-
 libbalsa/mailbox.c                |   82 ++--
 libbalsa/mailbox_imap.c           |  154 +++--
 libbalsa/mailbox_local.c          |   77 ++-
 libbalsa/mailbox_maildir.c        |   16 +-
 libbalsa/mailbox_mbox.c           |   52 +-
 libbalsa/mailbox_mh.c             |   25 +-
 libbalsa/message.c                | 1264 +++++++++++++++++++++++++------------
 libbalsa/message.h                |  358 +++++------
 libbalsa/rfc3156.c                |   10 +-
 libbalsa/send.c                   |  214 ++++---
 libbalsa/source-viewer.c          |   16 +-
 src/balsa-message.c               |  108 ++--
 src/balsa-mime-widget-message.c   |    8 +-
 src/balsa-mime-widget-text.c      |    7 +-
 src/balsa-mime-widget-vcalendar.c |   32 +-
 src/balsa-mime-widget.c           |    2 +-
 src/balsa-print-object-header.c   |    8 +-
 src/main-window.c                 |    2 +-
 src/message-window.c              |   36 +-
 src/print-gtk.c                   |   13 +-
 src/sendmsg-window.c              |  323 ++++++----
 src/store-address.c               |   13 +-
 24 files changed, 1776 insertions(+), 1126 deletions(-)
---
diff --git a/libbalsa/body.c b/libbalsa/body.c
index d93e942..27656c0 100644
--- a/libbalsa/body.c
+++ b/libbalsa/body.c
@@ -213,9 +213,11 @@ libbalsa_message_body_set_multipart(LibBalsaMessageBody * body,
 static void
 libbalsa_message_body_set_text_rfc822headers(LibBalsaMessageBody *body)
 {
+    LibBalsaMailbox *mailbox;
     GMimeStream *headers;
 
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
     headers = libbalsa_message_body_get_stream(body, NULL);
 
     if (headers != NULL) {
@@ -232,7 +234,7 @@ libbalsa_message_body_set_text_rfc822headers(LibBalsaMessageBody *body)
        g_object_unref(dummy_msg);
     }
 
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
 }
 
 static void
@@ -507,6 +509,8 @@ libbalsa_message_body_get_part_stream(LibBalsaMessageBody * body,
         GMimeStream *stream_null;
         GMimeStream *stream_filter;
         GMimeFilter *filter_windows;
+        LibBalsaMailbox *mailbox;
+
 
         stream_null = g_mime_stream_null_new();
         stream_filter = g_mime_stream_filter_new(stream_null);
@@ -516,10 +520,11 @@ libbalsa_message_body_get_part_stream(LibBalsaMessageBody * body,
         g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
                                  filter_windows);
 
-        libbalsa_mailbox_lock_store(body->message->mailbox);
+        mailbox = libbalsa_message_get_mailbox(body->message);
+        libbalsa_mailbox_lock_store(mailbox);
         g_mime_stream_reset(stream);
         g_mime_stream_write_to_stream(stream, stream_filter);
-        libbalsa_mailbox_unlock_store(body->message->mailbox);
+        libbalsa_mailbox_unlock_store(mailbox);
         g_object_unref(stream_filter);
 
         charset = g_mime_filter_windows_real_charset(GMIME_FILTER_WINDOWS
@@ -543,15 +548,17 @@ libbalsa_message_body_get_message_part_stream(LibBalsaMessageBody * body,
                                               GError ** err)
 {
     GMimeStream *stream;
+    LibBalsaMailbox *mailbox;
     ssize_t bytes_written;
     GMimeMessage *msg = g_mime_message_part_get_message
         (GMIME_MESSAGE_PART(body->mime_part));
 
     stream = g_mime_stream_mem_new();
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
     bytes_written =
         g_mime_object_write_to_stream(GMIME_OBJECT(msg), stream);
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
     printf("Written %ld bytes of embedded message\n",
            (long) bytes_written);
 
@@ -573,7 +580,7 @@ libbalsa_message_body_get_stream(LibBalsaMessageBody * body, GError **err)
     g_return_val_if_fail(body != NULL, NULL);
     g_return_val_if_fail(body->message != NULL, NULL);
 
-    if (!body->message->mailbox) {
+    if (libbalsa_message_get_mailbox(body->message) == NULL) {
         if (err != NULL && *err == NULL) {
             g_set_error(err, LIBBALSA_MAILBOX_ERROR,
                         LIBBALSA_MAILBOX_ACCESS_ERROR,
@@ -620,6 +627,7 @@ libbalsa_message_body_get_content(LibBalsaMessageBody * body, gchar ** buf,
 {
     GMimeStream *stream, *stream_mem;
     GByteArray *array;
+    LibBalsaMailbox *mailbox;
     gssize len;
 
     g_return_val_if_fail(body != NULL, -1);
@@ -635,10 +643,11 @@ libbalsa_message_body_get_content(LibBalsaMessageBody * body, gchar ** buf,
     stream_mem = g_mime_stream_mem_new_with_byte_array(array);
     g_mime_stream_mem_set_owner(GMIME_STREAM_MEM(stream_mem), FALSE);
 
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
     g_mime_stream_reset(stream);
     len = g_mime_stream_write_to_stream(stream, stream_mem);
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
     g_object_unref(stream);
     g_object_unref(stream_mem);
 
@@ -662,6 +671,7 @@ GdkPixbuf *
 libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
 {
     GMimeStream *stream;
+    LibBalsaMailbox *mailbox;
     gchar *mime_type;
     GdkPixbufLoader *loader;
     GdkPixbuf *pixbuf = NULL;
@@ -670,7 +680,8 @@ libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
     if (!stream)
         return pixbuf;
 
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
     g_mime_stream_reset(stream);
 
     mime_type = libbalsa_message_body_get_mime_type(body);
@@ -704,7 +715,7 @@ libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
         g_object_unref(loader);
     }
 
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
     g_object_unref(stream);
 
     return pixbuf;
@@ -716,6 +727,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
                                   GError ** err)
 {
     GMimeStream *stream;
+    LibBalsaMailbox *mailbox;
     ssize_t len;
 
     stream = libbalsa_message_body_get_stream(body, err);
@@ -723,7 +735,8 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
         return FALSE;
     g_clear_error(err);
 
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
 
     if (stream) {
         g_mime_stream_reset(stream);
@@ -740,7 +753,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
         /* body->mime_part is neither a GMimePart nor a GMimeMessagePart. */
         len = g_mime_object_write_to_stream(body->mime_part, dest);
 
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
     g_object_unref(dest);
 
     if (len < 0)
diff --git a/libbalsa/filter.c b/libbalsa/filter.c
index bf78ad9..910775d 100644
--- a/libbalsa/filter.c
+++ b/libbalsa/filter.c
@@ -104,13 +104,15 @@ gboolean
 libbalsa_condition_matches(LibBalsaCondition* cond,
                           LibBalsaMessage * message)
 {
+    LibBalsaMessageHeaders *headers;
     gboolean match = FALSE;
     gchar * str;
     GString * body;
     gboolean will_ref;
 
-    g_return_val_if_fail(cond, FALSE);
-    g_return_val_if_fail(message->headers != NULL, FALSE);
+    g_return_val_if_fail(cond != NULL, FALSE);
+    headers = libbalsa_message_get_headers(message);
+    g_return_val_if_fail(headers != NULL, FALSE);
 
     switch (cond->type) {
     case CONDITION_STRING:
@@ -128,20 +130,14 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
             }
         }
         /* do the work */
-       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_TO)
-            && message->headers->to_list) {
-            str =
-                internet_address_list_to_string(message->headers->to_list,
-                                                FALSE);
-           match=libbalsa_utf8_strstr(str,cond->match.string.string);
+       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_TO) && headers->to_list != NULL) {
+            str = internet_address_list_to_string(headers->to_list, FALSE);
+           match = libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
             if(match) break;
        }
-       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_FROM)
-            && message->headers->from) {
-            str =
-                internet_address_list_to_string(message->headers->from,
-                                                FALSE);
+       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_FROM) && headers->from != NULL) {
+            str = internet_address_list_to_string(headers->from, FALSE);
            match=libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
            if (match) break;
@@ -153,11 +149,8 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
                 break;
             }
        }
-       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_CC)
-            && message->headers->cc_list) {
-            str =
-                internet_address_list_to_string(message->headers->cc_list,
-                                                FALSE);
+       if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_CC) && headers->cc_list != NULL) {
+            str = internet_address_list_to_string(headers->cc_list, FALSE);
            match=libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
            if (match) break;
@@ -177,10 +170,10 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
             }
        }
        if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_BODY)) {
-           if (!message->mailbox)
+           if (libbalsa_message_get_mailbox(message) == NULL)
                return FALSE; /* We don't want to match if an error occurred */
-            body =
-                content2reply(message->body_list, NULL, 0, FALSE, FALSE);
+            body = content2reply(libbalsa_message_get_body_list(message),
+                                 NULL, 0, FALSE, FALSE);
            if (body) {
                if (body->str)
                     match = libbalsa_utf8_strstr(body->str,
@@ -193,9 +186,9 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
     case CONDITION_REGEX:
         break;
     case CONDITION_DATE:
-        match = message->headers->date>=cond->match.date.date_low
+        match = headers->date >= cond->match.date.date_low
               && (cond->match.date.date_high==0 ||
-                   message->headers->date<=cond->match.date.date_high);
+                   headers->date <= cond->match.date.date_high);
         break;
     case CONDITION_FLAG:
         match = LIBBALSA_MESSAGE_HAS_FLAG(message, cond->match.flags);
@@ -371,9 +364,9 @@ libbalsa_condition_can_match(LibBalsaCondition * cond,
     switch (cond->type) {
     case CONDITION_STRING:
        return !(CONDITION_CHKMATCH(cond, CONDITION_MATCH_BODY)
-                && message->body_list == NULL)
+                && libbalsa_message_get_body_list(message) == NULL)
            && !(CONDITION_CHKMATCH(cond, CONDITION_MATCH_US_HEAD)
-                && message->mime_msg == NULL);
+                && libbalsa_message_get_mime_msg(message) == NULL);
     case CONDITION_AND:
     case CONDITION_OR:
        return libbalsa_condition_can_match(cond->match.andor.left,
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index abd592d..b65c166 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -326,27 +326,29 @@ libbalsa_mailbox_dispose(GObject *object)
 
 
 static gchar *
-get_from_field(LibBalsaMessage *message)
+get_from_field(LibBalsaMailbox *mailbox,
+               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;
     gchar *from;
+    LibBalsaMessageHeaders *headers;
 
-    g_return_val_if_fail(message->mailbox, NULL);
+    g_return_val_if_fail(libbalsa_message_get_mailbox(message) != NULL, NULL);
 
-    if (message->headers) {
+    headers = libbalsa_message_get_headers(message);
+    if (headers != NULL) {
         if (priv->view &&
             (priv->view->show == LB_MAILBOX_SHOW_TO)) {
-            address_list = message->headers->to_list;
+            address_list = headers->to_list;
         } else {
-            address_list = message->headers->from;
+            address_list = headers->from;
         }
     }
 
-    if (address_list) {
+    if (address_list != NULL) {
         gint i, len = internet_address_list_length(address_list);
 
         for (i = 0; i < len && name_str == NULL; i++) {
@@ -396,23 +398,25 @@ get_from_field(LibBalsaMessage *message)
 
 
 static void
-lbm_index_entry_populate_from_msg(LibBalsaMailboxIndexEntry *entry,
+lbm_index_entry_populate_from_msg(LibBalsaMailbox           *mailbox,
+                                  LibBalsaMailboxIndexEntry *entry,
                                   LibBalsaMessage           *msg)
 {
-    entry->from           = get_from_field(msg);
+    entry->from           = get_from_field(mailbox, msg);
     entry->subject        = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(msg));
-    entry->msg_date       = msg->headers->date;
+    entry->msg_date       = libbalsa_message_get_headers(msg)->date;
     entry->internal_date  = 0; /* FIXME */
-    entry->status_icon    = libbalsa_get_icon_from_flags(msg->flags);
+    entry->status_icon    = libbalsa_get_icon_from_flags(libbalsa_message_get_flags(msg));
     entry->attach_icon    = libbalsa_message_get_attach_icon(msg);
-    entry->size           = msg->length;
+    entry->size           = libbalsa_message_get_length(msg);
     entry->foreground     = NULL;
     entry->background     = NULL;
     entry->foreground_set = 0;
     entry->background_set = 0;
     entry->unseen         = LIBBALSA_MESSAGE_IS_UNREAD(msg);
     entry->idle_pending   = 0;
-    libbalsa_mailbox_msgno_changed(msg->mailbox, msg->msgno);
+
+    libbalsa_mailbox_msgno_changed(mailbox, libbalsa_message_get_msgno(msg));
 }
 
 
@@ -1027,7 +1031,7 @@ static void
 libbalsa_mailbox_real_release_message(LibBalsaMailbox *mailbox,
                                       LibBalsaMessage *message)
 {
-    g_clear_object(&message->mime_msg);
+    libbalsa_message_set_mime_msg(message, NULL);
 }
 
 
@@ -2156,9 +2160,9 @@ lbm_cache_message(LibBalsaMailbox *mailbox,
     if (!entry) {
         g_ptr_array_index(priv->mindex, msgno - 1) =
             entry                                  = g_new(LibBalsaMailboxIndexEntry, 1);
-        lbm_index_entry_populate_from_msg(entry, message);
+        lbm_index_entry_populate_from_msg(mailbox, entry, message);
     } else if (entry->idle_pending) {
-        lbm_index_entry_populate_from_msg(entry, message);
+        lbm_index_entry_populate_from_msg(mailbox, entry, message);
     }
 }
 
@@ -2234,11 +2238,9 @@ void
 libbalsa_mailbox_release_message(LibBalsaMailbox *mailbox,
                                  LibBalsaMessage *message)
 {
-    g_return_if_fail(mailbox != NULL);
     g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
-    g_return_if_fail(message != NULL);
     g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
-    g_return_if_fail(mailbox == message->mailbox);
+    g_return_if_fail(mailbox == libbalsa_message_get_mailbox(message));
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
     LIBBALSA_MAILBOX_GET_CLASS(mailbox)->release_message(mailbox, message);
@@ -2254,9 +2256,9 @@ libbalsa_mailbox_set_msg_headers(LibBalsaMailbox *mailbox,
     g_return_if_fail(message != NULL);
     g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
 
-    if (!message->has_all_headers) {
+    if (!libbalsa_message_get_has_all_headers(message)) {
         LIBBALSA_MAILBOX_GET_CLASS(mailbox)->fetch_headers(mailbox, message);
-        message->has_all_headers = 1;
+        libbalsa_message_set_has_all_headers(message, TRUE);
     }
 }
 
@@ -2266,14 +2268,16 @@ libbalsa_mailbox_get_message_part(LibBalsaMessage     *message,
                                   LibBalsaMessageBody *part,
                                   GError             **err)
 {
+    LibBalsaMailbox *mailbox;
+
     g_return_val_if_fail(message != NULL, FALSE);
-    g_return_val_if_fail(message->mailbox != NULL, FALSE);
-    g_return_val_if_fail(LIBBALSA_IS_MAILBOX(message->mailbox), FALSE);
-    g_assert(LIBBALSA_MAILBOX_GET_CLASS(message->mailbox) != NULL);
+
+    mailbox = libbalsa_message_get_mailbox(message);
+    g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), FALSE);
+    g_assert(LIBBALSA_MAILBOX_GET_CLASS(mailbox) != NULL);
     g_return_val_if_fail(part != NULL, FALSE);
 
-    return LIBBALSA_MAILBOX_GET_CLASS(message->mailbox)
-           ->get_message_part(message, part, err);
+    return LIBBALSA_MAILBOX_GET_CLASS(mailbox)->get_message_part(message, part, err);
 }
 
 
@@ -4403,29 +4407,32 @@ libbalsa_mailbox_set_msg_tree(LibBalsaMailbox *mailbox,
 
 static GMimeMessage *
 lbm_get_mime_msg(LibBalsaMailbox *mailbox,
-                 LibBalsaMessage *msg)
+                 LibBalsaMessage *message)
 {
     GMimeMessage *mime_msg;
 
-    if (!msg->mime_msg) {
-        libbalsa_mailbox_fetch_message_structure(mailbox, msg,
+    mime_msg = libbalsa_message_get_mime_msg(message);
+    if (mime_msg == NULL) {
+        libbalsa_mailbox_fetch_message_structure(mailbox, message,
                                                  LB_FETCH_RFC822_HEADERS);
     }
-    mime_msg = msg->mime_msg;
-    if (mime_msg) {
+    mime_msg = libbalsa_message_get_mime_msg(message);
+    if (mime_msg != NULL) {
         g_object_ref(mime_msg);
     } else {
         GMimeStream *stream;
         GMimeParser *parser;
 
-        stream = libbalsa_mailbox_get_message_stream(mailbox, msg->msgno,
-                                                     TRUE);
+        stream =
+            libbalsa_mailbox_get_message_stream(mailbox,
+                                                libbalsa_message_get_msgno(message),
+                                                TRUE);
         parser = g_mime_parser_new_with_stream(stream);
         g_object_unref(stream);
         mime_msg = g_mime_parser_construct_message(parser);
         g_object_unref(parser);
     }
-    libbalsa_mailbox_release_message(mailbox, msg);
+    libbalsa_mailbox_release_message(mailbox, message);
 
     return mime_msg;
 }
@@ -4554,15 +4561,16 @@ lbm_try_reassemble(LibBalsaMailbox *mailbox,
 
     if (partials->len == total) {
         LibBalsaMessage *message = libbalsa_message_new();
-        message->flags |= LIBBALSA_MESSAGE_FLAG_NEW;
+
+        libbalsa_message_set_flags(message, LIBBALSA_MESSAGE_FLAG_NEW);
 
         libbalsa_information(LIBBALSA_INFORMATION_MESSAGE,
                              _("Reconstructing message"));
         libbalsa_mailbox_lock_store(mailbox);
-        message->mime_msg =
+        libbalsa_message_set_mime_msg(message,
             g_mime_message_partial_reconstruct_message((GMimeMessagePartial
                                                         **) partials->
-                                                       pdata, total);
+                                                       pdata, total));
         libbalsa_message_copy(message, mailbox, NULL);
         libbalsa_mailbox_unlock_store(mailbox);
 
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 613d276..a4d7a3e 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -690,22 +690,25 @@ static void
 lbimap_update_flags(LibBalsaMessage *message,
                     ImapMessage     *imsg)
 {
-    message->flags = 0;
+    LibBalsaMessageFlag flags = 0;
+
     if (!IMSG_FLAG_SEEN(imsg->flags)) {
-        message->flags |= LIBBALSA_MESSAGE_FLAG_NEW;
+        flags |= LIBBALSA_MESSAGE_FLAG_NEW;
     }
     if (IMSG_FLAG_DELETED(imsg->flags)) {
-        message->flags |= LIBBALSA_MESSAGE_FLAG_DELETED;
+        flags |= LIBBALSA_MESSAGE_FLAG_DELETED;
     }
     if (IMSG_FLAG_FLAGGED(imsg->flags)) {
-        message->flags |= LIBBALSA_MESSAGE_FLAG_FLAGGED;
+        flags |= LIBBALSA_MESSAGE_FLAG_FLAGGED;
     }
     if (IMSG_FLAG_ANSWERED(imsg->flags)) {
-        message->flags |= LIBBALSA_MESSAGE_FLAG_REPLIED;
+        flags |= LIBBALSA_MESSAGE_FLAG_REPLIED;
     }
     if (IMSG_FLAG_RECENT(imsg->flags)) {
-        message->flags |= LIBBALSA_MESSAGE_FLAG_RECENT;
+        flags |= LIBBALSA_MESSAGE_FLAG_RECENT;
     }
+
+    libbalsa_message_set_flags(message, flags);
 }
 
 
@@ -861,18 +864,18 @@ imap_flags_cb(unsigned             cnt,
                connection is up. */
             ImapMessage *imsg =
                 imap_mbox_handle_get_msg(mimap->handle, seqno[i]);
-            if (!imsg) {
+            if (imsg == NULL) {
                 continue;
             }
 
-            flags = msg_info->message->flags;
+            flags = libbalsa_message_get_flags(msg_info->message);
             lbimap_update_flags(msg_info->message, imsg);
-            if (flags == msg_info->message->flags) {
+            if (flags == libbalsa_message_get_flags(msg_info->message)) {
                 continue;
             }
 
             libbalsa_mailbox_index_set_flags(mailbox, seqno[i],
-                                             msg_info->message->flags);
+                                             libbalsa_message_get_flags(msg_info->message));
             ++mimap->search_stamp;
         }
     }
@@ -1017,8 +1020,8 @@ imap_expunge_cb(ImapMboxHandle      *handle,
             &g_array_index(mimap->messages_info, struct message_info, i);
 
         g_assert(info != NULL);
-        if (info->message) {
-            info->message->msgno = i + 1;
+        if (info->message != NULL) {
+            libbalsa_message_set_msgno(info->message, i + 1);
         }
     }
 
@@ -1236,8 +1239,8 @@ free_messages_info(LibBalsaMailboxImap *mbox)
         gchar *msgid;
         struct message_info *msg_info =
             &g_array_index(messages_info, struct message_info, i);
-        if (msg_info->message) {
-            msg_info->message->mailbox = NULL;
+        if (msg_info->message != NULL) {
+            libbalsa_message_set_mailbox(msg_info->message, NULL);
             g_object_unref(msg_info->message);
         }
         msgid = g_ptr_array_index(mbox->msgids, i);
@@ -2238,7 +2241,7 @@ libbalsa_mailbox_imap_load_envelope(LibBalsaMailboxImap *mimap,
     gchar *hdr;
 
     g_return_val_if_fail(mimap->opened, FALSE);
-    imsg = mi_get_imsg(mimap, message->msgno);
+    imsg = mi_get_imsg(mimap, libbalsa_message_get_msgno(message));
 
     if (!imsg || !imsg->envelope) {
         /* Connection severed and and restore
@@ -2249,20 +2252,20 @@ libbalsa_mailbox_imap_load_envelope(LibBalsaMailboxImap *mimap,
 
     lbimap_update_flags(message, imsg);
 
-    lb_set_headers(message->headers, imsg->envelope, FALSE);
+    lb_set_headers(libbalsa_message_get_headers(message), imsg->envelope, FALSE);
     if ((hdr = imsg->fetched_header_fields) && *hdr && (*hdr != '\r')) {
         libbalsa_message_set_headers_from_string(message, hdr);
     }
-    envelope        = imsg->envelope;
-    message->length = imsg->rfc822size;
+    envelope = imsg->envelope;
+    libbalsa_message_set_length(message, imsg->rfc822size);
     libbalsa_message_set_subject_from_header(message, envelope->subject);
-    message->sender =
-        internet_address_new_list_from_imap_address_list(envelope->sender);
-    libbalsa_message_set_in_reply_to_from_string(message,
-                                                 envelope->in_reply_to);
-    if (envelope->message_id) {
-        message->message_id =
-            g_mime_utils_decode_message_id(envelope->message_id);
+    libbalsa_message_set_sender(message,
+        internet_address_new_list_from_imap_address_list(envelope->sender));
+    libbalsa_message_set_in_reply_to_from_string(message, envelope->in_reply_to);
+    if (envelope->message_id != NULL) {
+        gchar *message_id = g_mime_utils_decode_message_id(envelope->message_id);
+        libbalsa_message_set_message_id(message, message_id);
+        g_free(message_id);
     }
 
     return TRUE;
@@ -2285,18 +2288,20 @@ libbalsa_mailbox_imap_get_message(LibBalsaMailbox *mailbox,
     }
 
     if (!msg_info->message) {
-        LibBalsaMessage *msg = libbalsa_message_new();
-        msg->msgno   = msgno;
-        msg->mailbox = mailbox;
-        if (libbalsa_mailbox_imap_load_envelope(mimap, msg)) {
+        LibBalsaMessage *message;
+
+        message = libbalsa_message_new();
+        libbalsa_message_set_msgno(message, msgno);
+        libbalsa_message_set_mailbox(message, mailbox);
+        if (libbalsa_mailbox_imap_load_envelope(mimap, message)) {
             gchar *id;
-            msg_info->message = msg;
-            if (libbalsa_message_is_partial(msg, &id)) {
+            msg_info->message = message;
+            if (libbalsa_message_is_partial(message, &id)) {
                 libbalsa_mailbox_try_reassemble(mailbox, id);
                 g_free(id);
             }
         } else {
-            g_object_unref(G_OBJECT(msg));
+            g_object_unref(message);
         }
     }
     if (msg_info->message) {
@@ -2405,14 +2410,17 @@ get_struct_from_cache(LibBalsaMailbox  *mailbox,
                       LibBalsaMessage  *message,
                       LibBalsaFetchFlag flags)
 {
-    if (!message->mime_msg) {
+    GMimeMessage *mime_msg;
+    LibBalsaMessageHeaders *headers;
+
+    if ((mime_msg = libbalsa_message_get_mime_msg(message)) == NULL) {
         gchar **pair, *filename;
         int fd;
         GMimeStream *stream, *fstream;
         GMimeFilter *filter;
         GMimeParser *mime_parser;
         LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
-        ImapMessage *imsg          = mi_get_imsg(mimap, message->msgno);
+        ImapMessage *imsg          = mi_get_imsg(mimap, libbalsa_message_get_msgno(message));
 
         if (!imsg) {
             return FALSE;
@@ -2440,25 +2448,27 @@ get_struct_from_cache(LibBalsaMailbox  *mailbox,
         g_object_unref(fstream);
 
         g_mime_parser_set_scan_from(mime_parser, FALSE);
-        message->mime_msg = g_mime_parser_construct_message(mime_parser);
+        mime_msg = g_mime_parser_construct_message(mime_parser);
         g_object_unref(mime_parser);
+
+        libbalsa_message_set_mime_msg(message, mime_msg);
     }
 
     /* follow libbalsa_mailbox_local_fetch_structure here;
      * perhaps create common helper */
+    headers = libbalsa_message_get_headers(message);
     if (flags & LB_FETCH_STRUCTURE) {
         LibBalsaMessageBody *body = libbalsa_message_body_new(message);
         libbalsa_message_body_set_mime_body(body,
-                                            message->mime_msg->mime_part);
+                                            mime_msg->mime_part);
         libbalsa_message_append_part(message, body);
-        libbalsa_message_headers_from_gmime(message->headers,
-                                            message->mime_msg);
+        libbalsa_message_headers_from_gmime(headers,
+                                            mime_msg);
     }
     if (flags & LB_FETCH_RFC822_HEADERS) {
-        g_assert(message->headers != NULL);
-        message->headers->user_hdrs =
-            libbalsa_message_user_hdrs_from_gmime(message->mime_msg);
-        message->has_all_headers = 1;
+        g_assert(headers != NULL);
+        headers->user_hdrs = libbalsa_message_user_hdrs_from_gmime(mime_msg);
+        libbalsa_message_set_has_all_headers(message, TRUE);
     }
     return TRUE;
 }
@@ -2472,7 +2482,10 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox  *mailbox,
     ImapResponse rc;
     LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
     LibBalsaServer *server;
+    LibBalsaMessageHeaders *headers;
+    glong msgno;
     ImapFetchType ift = 0;
+
     g_return_val_if_fail(mimap->opened, FALSE);
 
     /* Work around some server bugs by fetching the RFC2822 form of
@@ -2484,17 +2497,19 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox  *mailbox,
        parts yet. Also, we save some RTTS for very small messages by
        fetching them in their entirety. */
     server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
+    headers = libbalsa_message_get_headers(message);
+    msgno = libbalsa_message_get_msgno(message);
     if (!imap_mbox_handle_can_do(mimap->handle, IMCAP_FETCHBODY) ||
         libbalsa_imap_server_has_bug(LIBBALSA_IMAP_SERVER(server),
                                      ISBUG_FETCH) ||
         (LIBBALSA_MESSAGE_GET_LENGTH(message) < 8192) ||
-        (message->headers &&
-         (!message->headers->content_type ||
-          g_mime_content_type_is_type(message->headers->content_type, "text", "*")))) {
+        (headers != NULL &&
+         (headers->content_type == NULL ||
+          g_mime_content_type_is_type(headers->content_type, "text", "*")))) {
         /* we could optimize this part a little bit: we do not need to
          * keep reopening the stream. */
         GMimeStream *stream =
-            libbalsa_mailbox_imap_get_message_stream(mailbox, message->msgno,
+            libbalsa_mailbox_imap_get_message_stream(mailbox, msgno,
                                                      FALSE);
         if (!stream) { /* oops, connection broken or the message disappeared? */
             return FALSE;
@@ -2514,12 +2529,10 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox  *mailbox,
     }
 
     II(rc, mimap->handle,
-       imap_mbox_handle_fetch_range(mimap->handle, message->msgno,
-                                    message->msgno, ift));
+       imap_mbox_handle_fetch_range(mimap->handle, msgno, msgno, ift));
     if (rc == IMR_OK) { /* translate ImapData to LibBalsaMessage */
         gchar *hdr;
-        ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle,
-                                                   message->msgno);
+        ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle, msgno);
         /* in case of msg number discrepancies: */
         g_return_val_if_fail(im != NULL, FALSE);
         if (flags & LB_FETCH_STRUCTURE) {
@@ -2530,7 +2543,7 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox  *mailbox,
         if ((flags & LB_FETCH_RFC822_HEADERS) &&
             (hdr = im->fetched_header_fields) && *hdr && (*hdr != '\r')) {
             libbalsa_message_set_headers_from_string(message, hdr);
-            message->has_all_headers = 1;
+            libbalsa_message_set_has_all_headers(message, TRUE);
         }
         return TRUE;
     }
@@ -2545,16 +2558,15 @@ libbalsa_mailbox_imap_fetch_headers(LibBalsaMailbox *mailbox,
 {
     LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
     ImapResponse rc;
+    glong msgno;
 
+    msgno = libbalsa_message_get_msgno(message);
     II(rc, mimap->handle,
-       imap_mbox_handle_fetch_range(mimap->handle,
-                                    message->msgno,
-                                    message->msgno,
+       imap_mbox_handle_fetch_range(mimap->handle, msgno, msgno,
                                     IMFETCH_RFC822HEADERS_SELECTED));
     if (rc == IMR_OK) { /* translate ImapData to LibBalsaMessage */
         const gchar *hdr;
-        ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle,
-                                                   message->msgno);
+        ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle, msgno);
         if ((hdr = im->fetched_header_fields) && *hdr && (*hdr != '\r')) {
             libbalsa_message_set_headers_from_string(message, hdr);
         }
@@ -2628,20 +2640,20 @@ print_structure(LibBalsaMessageBody *part,
 
 #endif
 static gchar *
-get_section_for(LibBalsaMessage     *msg,
+get_section_for(LibBalsaMessage     *message,
                 LibBalsaMessageBody *part)
 {
     GString *section = g_string_new("");
     LibBalsaMessageBody *parent;
 
-    parent = msg->body_list;
+    parent = libbalsa_message_get_body_list(message);
     if (libbalsa_message_body_is_multipart(parent)) {
         parent = parent->parts;
     }
 
     if (!is_child_of(parent, part, section, TRUE)) {
-        g_warning("Internal error, part %p not found in msg %p.\n",
-                  part, msg);
+        g_warning("Internal error, part %p not found in message %p.\n",
+                  part, message);
         g_string_free(section, TRUE);
         return g_strdup("1");
     }
@@ -2717,17 +2729,17 @@ get_parent(LibBalsaMessageBody *root,
 
 
 static gboolean
-lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *msg,
+lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *message,
                                  LibBalsaMessageBody *part,
                                  GError             **err)
 {
     GMimeStream *partstream = NULL;
-
     gchar **pair, *part_name;
-    LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(msg->mailbox);
+    LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(message);
+    LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
     FILE *fp;
     gchar *section;
-    ImapMessage *imsg = mi_get_imsg(mimap, msg->msgno);
+    ImapMessage *imsg = mi_get_imsg(mimap, libbalsa_message_get_msgno(message));
 
     if (!imsg) {
         g_set_error(err,
@@ -2738,7 +2750,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *msg,
     }
 
     /* look for a part cache */
-    section   = get_section_for(msg, part);
+    section   = get_section_for(message, part);
     pair      = get_cache_name_pair(mimap, "part", imsg->uid);
     part_name = g_strconcat(pair[0], G_DIR_SEPARATOR_S,
                             pair[1], "-", section, NULL);
@@ -2750,8 +2762,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *msg,
         ImapResponse rc;
         LibBalsaMessageBody *parent;
 
-        libbalsa_lock_mailbox(msg->mailbox);
-        mimap = LIBBALSA_MAILBOX_IMAP(msg->mailbox);
+        libbalsa_lock_mailbox(mailbox);
 
         dt.body = imap_message_get_body_from_section(imsg, section);
         if (!dt.body) {
@@ -2775,7 +2786,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *msg,
          * which has no headers. In this case, we have to fake them.
          * We could and probably should dump there first the headers
          * that we have already fetched... */
-        parent = get_parent(msg->body_list, part, NULL);
+        parent = get_parent(libbalsa_message_get_body_list(message), part, NULL);
         if (parent == NULL) {
             ifbo = IMFB_NONE;
         } else {
@@ -2788,13 +2799,14 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage     *msg,
         rc = IMR_OK;
         if (dt.body->octets > 0) {
             II(rc, mimap->handle,
-               imap_mbox_handle_fetch_body(mimap->handle, msg->msgno,
+               imap_mbox_handle_fetch_body(mimap->handle,
+                                           libbalsa_message_get_msgno(message),
                                            section, FALSE, ifbo, append_str, &dt));
         }
-        libbalsa_unlock_mailbox(msg->mailbox);
+        libbalsa_unlock_mailbox(mailbox);
         if (rc != IMR_OK) {
             fprintf(stderr, "Error fetching imap message no %lu section %s\n",
-                    msg->msgno, section);
+                    libbalsa_message_get_msgno(message), section);
             g_free(dt.block);
             g_free(section);
             g_strfreev(pair);
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index 2683868..7f09344 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -337,9 +337,9 @@ lbm_local_get_message_with_msg_info(LibBalsaMailboxLocal *local,
     g_object_add_weak_pointer(G_OBJECT(message),
                               (gpointer) & msg_info->message);
 
-    message->flags   = msg_info->flags & LIBBALSA_MESSAGE_FLAGS_REAL;
-    message->mailbox = LIBBALSA_MAILBOX(local);
-    message->msgno   = msgno;
+    libbalsa_message_set_flags(message, msg_info->flags & LIBBALSA_MESSAGE_FLAGS_REAL);
+    libbalsa_message_set_mailbox(message, LIBBALSA_MAILBOX(local));
+    libbalsa_message_set_msgno(message, msgno);
     libbalsa_message_load_envelope(message);
     lbml_add_message_to_pool(local, message);
 }
@@ -912,6 +912,7 @@ message_match_real(LibBalsaMailbox   *mailbox,
     LibBalsaMailboxLocalInfo *info =
         msgno <= priv->threading_info->len ?
         g_ptr_array_index(priv->threading_info, msgno - 1) : NULL;
+    LibBalsaMessageHeaders *headers;
 
     /* We may be able to match the msgno from info cached in entry or
      * info; if those are NULL, we'll need to fetch the message, so we
@@ -930,6 +931,9 @@ message_match_real(LibBalsaMailbox   *mailbox,
         return FALSE;   /* Can't match. */
 
     }
+
+    headers = libbalsa_message_get_headers(message);
+
     switch (cond->type) {
     case CONDITION_STRING:
         if (CONDITION_CHKMATCH(cond, (CONDITION_MATCH_TO |
@@ -954,10 +958,9 @@ message_match_real(LibBalsaMailbox   *mailbox,
         /* do the work */
         if (CONDITION_CHKMATCH(cond, CONDITION_MATCH_TO)) {
             g_assert(is_refed);
-            if (message->headers->to_list) {
+            if (headers->to_list != NULL) {
                 gchar *str =
-                    internet_address_list_to_string(message->headers->
-                                                    to_list, FALSE);
+                    internet_address_list_to_string(headers->to_list, FALSE);
                 match =
                     libbalsa_utf8_strstr(str, cond->match.string.string);
                 g_free(str);
@@ -982,10 +985,9 @@ message_match_real(LibBalsaMailbox   *mailbox,
         }
         if (CONDITION_CHKMATCH(cond, CONDITION_MATCH_CC)) {
             g_assert(is_refed);
-            if (message->headers->cc_list) {
+            if (headers->cc_list != NULL) {
                 gchar *str =
-                    internet_address_list_to_string(message->headers->
-                                                    cc_list, FALSE);
+                    internet_address_list_to_string(headers->cc_list, FALSE);
                 match =
                     libbalsa_utf8_strstr(str, cond->match.string.string);
                 g_free(str);
@@ -1018,12 +1020,13 @@ message_match_real(LibBalsaMailbox   *mailbox,
         if (CONDITION_CHKMATCH(cond, CONDITION_MATCH_BODY)) {
             GString *body;
             g_assert(is_refed);
-            if (!message->mailbox) {
+            if (libbalsa_message_get_mailbox(message) == NULL) {
                 /* No need to body-unref */
                 g_object_unref(message);
                 return FALSE; /* We don't want to match if an error occurred */
             }
-            body = content2reply(message->body_list, NULL, 0, FALSE, FALSE);
+            body = content2reply(libbalsa_message_get_body_list(message),
+                                 NULL, 0, FALSE, FALSE);
             if (body) {
                 if (body->str) {
                     match = libbalsa_utf8_strstr(body->str,
@@ -1103,15 +1106,16 @@ libbalsa_mailbox_local_cache_message(LibBalsaMailboxLocal *local,
         libbalsa_mailbox_local_get_instance_private(local);
     gpointer *entry;
     LibBalsaMailboxLocalInfo *info;
+    LibBalsaMessageHeaders *headers;
 
-    if (!message) {
+    if (message == NULL) {
         return;
     }
 
     libbalsa_mailbox_cache_message(LIBBALSA_MAILBOX(local), msgno,
                                    message);
 
-    if (!priv->threading_info) {
+    if (priv->threading_info == NULL) {
         return;
     }
 
@@ -1120,21 +1124,21 @@ libbalsa_mailbox_local_cache_message(LibBalsaMailboxLocal *local,
     }
     entry = &g_ptr_array_index(priv->threading_info, msgno - 1);
 
-    if (*entry) {
+    if (*entry != NULL) {
         return;
     }
 
     *entry                   = info = g_new(LibBalsaMailboxLocalInfo, 1);
-    info->message_id         = g_strdup(message->message_id);
-    info->refs_for_threading =
-        libbalsa_message_refs_for_threading(message);
 
+    info->message_id         = g_strdup(libbalsa_message_get_message_id(message));
+    info->refs_for_threading = libbalsa_message_refs_for_threading(message);
     info->sender = NULL;
-    if (message->headers->from) {
-        info->sender =
-            internet_address_list_to_string(message->headers->from, FALSE);
+
+    headers = libbalsa_message_get_headers(message);
+    if (headers->from != NULL) {
+        info->sender = internet_address_list_to_string(headers->from, FALSE);
     }
-    if (!info->sender) {
+    if (info->sender == NULL) {
         info->sender = g_strdup("");
     }
 }
@@ -1510,23 +1514,27 @@ libbalsa_mailbox_local_fetch_structure(LibBalsaMailbox  *mailbox,
                                        LibBalsaMessage  *message,
                                        LibBalsaFetchFlag flags)
 {
-    GMimeMessage *mime_message = message->mime_msg;
+    GMimeMessage *mime_message;
+    LibBalsaMessageHeaders *headers;
 
-    if (!mime_message || !mime_message->mime_part) {
+    mime_message = libbalsa_message_get_mime_msg(message);
+    if (mime_message == NULL || mime_message->mime_part == NULL) {
         return FALSE;
     }
 
+    headers = libbalsa_message_get_headers(message);
+
     if (flags & LB_FETCH_STRUCTURE) {
         LibBalsaMessageBody *body = libbalsa_message_body_new(message);
         libbalsa_message_body_set_mime_body(body,
                                             mime_message->mime_part);
         libbalsa_message_append_part(message, body);
-        libbalsa_message_headers_from_gmime(message->headers, mime_message);
+        libbalsa_message_headers_from_gmime(headers, mime_message);
     }
     if (flags & LB_FETCH_RFC822_HEADERS) {
-        message->headers->user_hdrs =
+        headers->user_hdrs =
             libbalsa_message_user_hdrs_from_gmime(mime_message);
-        message->has_all_headers = 1;
+        libbalsa_message_set_has_all_headers(message, TRUE);
     }
 
     return TRUE;
@@ -1537,11 +1545,15 @@ static void
 libbalsa_mailbox_local_fetch_headers(LibBalsaMailbox *mailbox,
                                      LibBalsaMessage *message)
 {
-    g_return_if_fail(message->headers->user_hdrs == NULL);
+    LibBalsaMessageHeaders *headers;
+    GMimeMessage *mime_msg;
+
+    headers = libbalsa_message_get_headers(message);
+    g_return_if_fail(headers->user_hdrs == NULL);
 
-    if (message->mime_msg) {
-        message->headers->user_hdrs =
-            libbalsa_message_user_hdrs_from_gmime(message->mime_msg);
+    mime_msg = libbalsa_message_get_mime_msg(message);
+    if (mime_msg != NULL) {
+        headers->user_hdrs = libbalsa_message_user_hdrs_from_gmime(mime_msg);
     } else {
         libbalsa_mailbox_fetch_message_structure(mailbox, message,
                                                  LB_FETCH_RFC822_HEADERS);
@@ -2513,10 +2525,9 @@ libbalsa_mailbox_local_messages_change_flags(LibBalsaMailbox    *mailbox,
         }
         ++changed;
 
-        if (msg_info->message) {
-            msg_info->message->flags = msg_info->flags;
+        if (msg_info->message != NULL) {
+            libbalsa_message_set_flags(msg_info->message, msg_info->flags);
         }
-
         libbalsa_mailbox_index_set_flags(mailbox, msgno, msg_info->flags);
 
         if (msg_info->loaded) {
diff --git a/libbalsa/mailbox_maildir.c b/libbalsa/mailbox_maildir.c
index 674e494..49084fd 100644
--- a/libbalsa/mailbox_maildir.c
+++ b/libbalsa/mailbox_maildir.c
@@ -613,7 +613,7 @@ libbalsa_mailbox_maildir_check(LibBalsaMailbox *mailbox)
     for (msgno = renumber; msgno <= mdir->msgno_2_msg_info->len; msgno++) {
         msg_info = message_info_from_msgno(mdir, msgno);
         if (msg_info->local_info.message) {
-            msg_info->local_info.message->msgno = msgno;
+            libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
         }
     }
 
@@ -632,8 +632,8 @@ free_message_info(struct message_info *msg_info)
     g_free(msg_info->key);
     g_free(msg_info->filename);
     if (msg_info->local_info.message) {
-        msg_info->local_info.message->mailbox = NULL;
-        msg_info->local_info.message->msgno   = 0;
+        libbalsa_message_set_mailbox(msg_info->local_info.message, NULL);
+        libbalsa_message_set_msgno(msg_info->local_info.message, 0);
         g_object_remove_weak_pointer(G_OBJECT(msg_info->local_info.message),
                                      (gpointer) & msg_info->local_info.message);
     }
@@ -845,7 +845,7 @@ libbalsa_mailbox_maildir_sync(LibBalsaMailbox *mailbox,
     for (msgno = renumber; msgno <= mdir->msgno_2_msg_info->len; msgno++) {
         msg_info = message_info_from_msgno(mdir, msgno);
         if (msg_info->local_info.message) {
-            msg_info->local_info.message->msgno = msgno;
+            libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
         }
     }
 
@@ -882,14 +882,14 @@ libbalsa_mailbox_maildir_fetch_message_structure(LibBalsaMailbox  *mailbox,
                                                  LibBalsaMessage  *message,
                                                  LibBalsaFetchFlag flags)
 {
-    if (!message->mime_msg) {
+    if (libbalsa_message_get_mime_msg(message) == NULL) {
         struct message_info *msg_info =
             message_info_from_msgno((LibBalsaMailboxMaildir *) mailbox,
-                                    message->msgno);
-        message->mime_msg =
+                                    libbalsa_message_get_msgno(message));
+        libbalsa_message_set_mime_msg(message,
             libbalsa_mailbox_local_get_mime_message(mailbox,
                                                     msg_info->subdir,
-                                                    msg_info->filename);
+                                                    msg_info->filename));
     }
 
     return LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_maildir_parent_class)->
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index 19ec09e..8cedc1c 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -559,10 +559,12 @@ parse_mailbox(LibBalsaMailboxMbox *mbox)
                         g_memdup(&msg_info, sizeof(msg_info)));
         mbox->messages_info_changed = TRUE;
 
-        msg->flags   = msg_info.orig_flags;
-        msg->length  = msg_info.end - (msg_info.start + msg_info.from_len);
-        msg->mailbox = LIBBALSA_MAILBOX(mbox);
-        msg->msgno   = ++msgno;
+        libbalsa_message_set_flags(msg, msg_info.orig_flags);
+        libbalsa_message_set_length(msg,
+                                    msg_info.end -
+                                    (msg_info.start + msg_info.from_len));
+        libbalsa_message_set_mailbox(msg, LIBBALSA_MAILBOX(mbox));
+        libbalsa_message_set_msgno(msg, ++msgno);
         /* We must drop the mime-stream lock to call
          * libbalsa_mailbox_local_cache_message, which calls
          * libbalsa_mailbox_cache_message(), as it may grab the
@@ -586,10 +588,14 @@ parse_mailbox(LibBalsaMailboxMbox *mbox)
 static void
 free_message_info(struct message_info *msg_info)
 {
-    if (msg_info->local_info.message) {
-        msg_info->local_info.message->mailbox = NULL;
-        msg_info->local_info.message->msgno   = 0;
-        g_object_remove_weak_pointer(G_OBJECT(msg_info->local_info.message),
+    LibBalsaMessage *message;
+
+    message = msg_info->local_info.message;
+
+    if (message != NULL) {
+        libbalsa_message_set_mailbox(message, NULL);
+        libbalsa_message_set_msgno(message, 0);
+        g_object_remove_weak_pointer(G_OBJECT(message),
                                      (gpointer) & msg_info->local_info.message);
         msg_info->local_info.message = NULL;
     }
@@ -1834,8 +1840,8 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox *mailbox,
             mbox->messages_info_changed = TRUE;
             continue;
         }
-        if (msg_info->local_info.message) {
-            msg_info->local_info.message->msgno = j + 1;
+        if (msg_info->local_info.message != NULL) {
+            libbalsa_message_set_msgno(msg_info->local_info.message, j + 1);
         }
 
         msg_info->status = msg_info->x_status = msg_info->mime_version = -1;
@@ -1869,16 +1875,17 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox *mailbox,
         msg_info->end        = g_mime_parser_tell(gmime_parser);
         msg_info->orig_flags = REAL_FLAGS(msg_info->local_info.flags);
         g_assert(mime_msg->mime_part != NULL);
-        if (!msg_info->local_info.message || !msg_info->local_info.message->mime_msg) {
+        if (msg_info->local_info.message == NULL ||
+            libbalsa_message_get_mime_msg(msg_info->local_info.message) == NULL) {
             g_object_unref(mime_msg);
         } else {
-            g_object_unref(msg_info->local_info.message->mime_msg);
-            msg_info->local_info.message->mime_msg = mime_msg;
+            libbalsa_message_set_mime_msg(msg_info->local_info.message, mime_msg);
             /*
              * reinit the message parts info
              */
-            libbalsa_message_body_set_mime_body(msg_info->local_info.message->body_list,
-                                                mime_msg->mime_part);
+            libbalsa_message_body_set_mime_body
+                (libbalsa_message_get_body_list(msg_info->local_info.message),
+                 mime_msg->mime_part);
         }
 
         j++;
@@ -1908,8 +1915,11 @@ libbalsa_mailbox_mbox_fetch_message_structure(LibBalsaMailbox  *mailbox,
                                               LibBalsaMessage  *message,
                                               LibBalsaFetchFlag flags)
 {
-    if (!message->mime_msg) {
-        message->mime_msg = lbm_mbox_get_mime_message(mailbox, message->msgno);
+    if (libbalsa_message_get_mime_msg(message) == NULL) {
+        libbalsa_message_set_mime_msg(message,
+                                      lbm_mbox_get_mime_message
+                                      (mailbox,
+                                       libbalsa_message_get_msgno(message)));
     }
 
     return LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_mbox_parent_class)->
@@ -2044,6 +2054,7 @@ lbm_mbox_add_message(LibBalsaMailboxLocal *local,
 {
     LibBalsaMailbox *mailbox = (LibBalsaMailbox *) local;
     LibBalsaMessage *message;
+    LibBalsaMessageHeaders *headers;
     gchar date_string[27];
     gchar *sender;
     gchar *address;
@@ -2060,10 +2071,11 @@ lbm_mbox_add_message(LibBalsaMailboxLocal *local,
     message = libbalsa_message_new();
     libbalsa_message_load_envelope_from_stream(message, stream);
 
-    ctime_r(&(message->headers->date), date_string);
+    headers = libbalsa_message_get_headers(message);
+    ctime_r(&(headers->date), date_string);
 
-    sender = message->headers->from ?
-        internet_address_list_to_string(message->headers->from, FALSE) :
+    sender = headers->from != NULL ?
+        internet_address_list_to_string(headers->from, FALSE) :
         g_strdup("none");
 
     g_object_unref(message);
diff --git a/libbalsa/mailbox_mh.c b/libbalsa/mailbox_mh.c
index e8d13c2..daed46a 100644
--- a/libbalsa/mailbox_mh.c
+++ b/libbalsa/mailbox_mh.c
@@ -533,8 +533,8 @@ lbm_mh_free_message_info(struct message_info *msg_info)
         return;
     }
     if (msg_info->local_info.message) {
-        msg_info->local_info.message->mailbox = NULL;
-        msg_info->local_info.message->msgno   = 0;
+        libbalsa_message_set_mailbox(msg_info->local_info.message, NULL);
+        libbalsa_message_set_msgno(msg_info->local_info.message, 0);
         g_object_remove_weak_pointer(G_OBJECT(msg_info->local_info.message),
                                      (gpointer) & msg_info->local_info.message);
     }
@@ -743,7 +743,7 @@ libbalsa_mailbox_mh_check(LibBalsaMailbox *mailbox)
     for (msgno = renumber; msgno <= mh->msgno_2_msg_info->len; msgno++) {
         msg_info = lbm_mh_message_info_from_msgno(mh, msgno);
         if (msg_info->local_info.message) {
-            msg_info->local_info.message->msgno = msgno;
+            libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
         }
     }
 
@@ -962,7 +962,7 @@ libbalsa_mailbox_mh_sync(LibBalsaMailbox *mailbox,
     for (msgno = 1; msgno <= mh->msgno_2_msg_info->len; msgno++) {
         msg_info = lbm_mh_message_info_from_msgno(mh, msgno);
         if (msg_info->local_info.message) {
-            msg_info->local_info.message->msgno = msgno;
+            libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
         }
     }
 
@@ -1085,24 +1085,25 @@ libbalsa_mailbox_mh_fetch_message_structure(LibBalsaMailbox  *mailbox,
                                             LibBalsaMessage  *message,
                                             LibBalsaFetchFlag flags)
 {
-    if (!message->mime_msg) {
+    if (libbalsa_message_get_mime_msg(message) == NULL) {
         struct message_info *msg_info;
         gchar *base_name;
+        GMimeMessage *mime_msg;
 
         msg_info =
             lbm_mh_message_info_from_msgno(LIBBALSA_MAILBOX_MH(mailbox),
-                                           message->msgno);
+                                           libbalsa_message_get_msgno(message));
 
-        base_name         = MH_BASENAME(msg_info);
-        message->mime_msg =
-            libbalsa_mailbox_local_get_mime_message(mailbox, base_name, NULL);
+        base_name = MH_BASENAME(msg_info);
+        mime_msg = libbalsa_mailbox_local_get_mime_message(mailbox, base_name, NULL);
         g_free(base_name);
 
-        if (message->mime_msg) {
-            g_mime_object_remove_header(GMIME_OBJECT(message->mime_msg),
+        if (mime_msg != NULL) {
+            g_mime_object_remove_header(GMIME_OBJECT(mime_msg),
                                         "Status");
-            g_mime_object_remove_header(GMIME_OBJECT(message->mime_msg),
+            g_mime_object_remove_header(GMIME_OBJECT(mime_msg),
                                         "X-Status");
+            libbalsa_message_set_mime_msg(message, mime_msg);
         }
     }
 
diff --git a/libbalsa/message.c b/libbalsa/message.c
index 9eec27e..b35f871 100644
--- a/libbalsa/message.c
+++ b/libbalsa/message.c
@@ -5,14 +5,14 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option) 
+ * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
- *  
+ *
  * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of 
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *  
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
@@ -26,10 +26,10 @@
    - Lack of inline functions in C increases program complexity. This cost
    can be accepted.
    - thorough analysis of memory usage is needed.
-*/
-   
+ */
+
 #if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
-# include "config.h"
+#   include "config.h"
 #endif                          /* HAVE_CONFIG_H */
 
 #include <ctype.h>
@@ -49,75 +49,132 @@
 
 #include <gmime/gmime.h>
 
-static void libbalsa_message_class_init(LibBalsaMessageClass * klass);
-static void libbalsa_message_init(LibBalsaMessage * message);
+static void libbalsa_message_class_init(LibBalsaMessageClass *klass);
+static void libbalsa_message_init(LibBalsaMessage *message);
 
-static void libbalsa_message_dispose(GObject * object);
-static void libbalsa_message_finalize(GObject * object);
+static void libbalsa_message_dispose(GObject *object);
+static void libbalsa_message_finalize(GObject *object);
 
 
-static GObjectClass *parent_class = NULL;
+struct _LibBalsaMessageClass {
+    GObjectClass parent_class;
 
-GType
-libbalsa_message_get_type()
-{
-    static GType libbalsa_message_type = 0;
+    /* deal with flags being set/unset */
+    /* Signal: */
+    void (*status_changed) (LibBalsaMessage    *message,
+                            LibBalsaMessageFlag flag,
+                            gboolean);
+};
 
-    if (!libbalsa_message_type) {
-       static const GTypeInfo libbalsa_message_info = {
-           sizeof(LibBalsaMessageClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_message_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaMessage),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_message_init
-       };
+struct _LibBalsaMessage {
+    GObject object;
 
-       libbalsa_message_type =
-           g_type_register_static(G_TYPE_OBJECT, "LibBalsaMessage",
-                                   &libbalsa_message_info, 0);
-    }
+    /* the mailbox this message belongs to */
+    LibBalsaMailbox *mailbox;
 
-    return libbalsa_message_type;
-}
+    /* flags */
+    LibBalsaMessageFlag flags;
+
+    /* headers */
+    LibBalsaMessageHeaders *headers;
+    int updated; /** whether complete headers have been fetched */
+
+    GMimeMessage *mime_msg;
+
+    /* sender address */
+    InternetAddressList *sender;
+
+    /* subject line; we still need it here for sending;
+     * although _SET_SUBJECT might resolve it(?)
+     * but we can set to to NULL unless there is no mailbox, like
+     * on sending. */
+    gchar *subj;
+
+    /* replied message ID's */
+    GList *references;
+
+    /* replied message ID; from address on date */
+    GList *in_reply_to;
+
+    /* message ID */
+    gchar *message_id;
+
+#ifdef HAVE_GPGME
+    /* GPG sign and/or encrypt message (sending) */
+    guint gpg_mode;
+
+    /* attach the GnuPG public key to the message (sending) */
+    gboolean att_pubkey;
+
+    /* protection (i.e. sign/encrypt) status (received message) */
+    LibBalsaMsgProtectState prot_state;
+
+    /* sender identity, required for choosing a forced GnuPG or S/MIME key */
+    LibBalsaIdentity *ident;
+#endif
+
+    /* request a DSN (sending) */
+    gboolean request_dsn;
+
+    /* a forced multipart subtype or NULL for mixed; used only for
+     * sending */
+    gchar *subtype;
+
+    /* additional message content type parameters; used only for sending */
+    GList *parameters;
+
+    /* message body */
+    guint body_ref;
+    LibBalsaMessageBody *body_list;
+
+    glong msgno;     /* message no; always copy for faster sorting;
+                      * counting starts at 1. */
+#if MESSAGE_COPY_CONTENT
+    glong length;   /* byte len */
+#endif
+
+    gchar *tempdir;     /* to hold named parts */
+
+    unsigned has_all_headers : 1;
+};
+
+G_DEFINE_TYPE(LibBalsaMessage,
+              libbalsa_message,
+              G_TYPE_OBJECT)
 
 static void
-libbalsa_message_init(LibBalsaMessage * message)
-{
-    message->headers = g_new0(LibBalsaMessageHeaders, 1);
-    message->flags = 0;
-    message->mailbox = NULL;
-    message->sender = NULL;
-    message->subj = NULL;
-    message->references = NULL;
-    message->in_reply_to = NULL;
-    message->message_id = NULL;
-    message->subtype = 0;
-    message->parameters = NULL;
-    message->body_ref = 0;
-    message->body_list = NULL;
+libbalsa_message_init(LibBalsaMessage *message)
+{
+    message->headers         = g_new0(LibBalsaMessageHeaders, 1);
+    message->flags           = 0;
+    message->mailbox         = NULL;
+    message->sender          = NULL;
+    message->subj            = NULL;
+    message->references      = NULL;
+    message->in_reply_to     = NULL;
+    message->message_id      = NULL;
+    message->subtype         = 0;
+    message->parameters      = NULL;
+    message->body_ref        = 0;
+    message->body_list       = NULL;
     message->has_all_headers = 0;
 #ifdef HAVE_GPGME
     message->prot_state = LIBBALSA_MSG_PROTECT_NONE;
-    message->ident = NULL;
+    message->ident      = NULL;
 #endif
 }
 
 
 static void
-libbalsa_message_class_init(LibBalsaMessageClass * klass)
+libbalsa_message_class_init(LibBalsaMessageClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
-    parent_class = g_type_class_peek_parent(klass);
-
-    object_class->dispose = libbalsa_message_dispose;
+    object_class->dispose  = libbalsa_message_dispose;
     object_class->finalize = libbalsa_message_finalize;
 }
 
+
 LibBalsaMessage *
 libbalsa_message_new(void)
 {
@@ -128,11 +185,12 @@ libbalsa_message_new(void)
     return message;
 }
 
+
 /*
  * libbalsa_message_dispose: must leave object in a sane state
  */
 static void
-libbalsa_message_dispose(GObject * object)
+libbalsa_message_dispose(GObject *object)
 {
     LibBalsaMessage *message;
 
@@ -144,14 +202,15 @@ libbalsa_message_dispose(GObject * object)
     g_clear_object(&message->ident);
 #endif
 
-    G_OBJECT_CLASS(parent_class)->dispose(object);
+    G_OBJECT_CLASS(libbalsa_message_parent_class)->dispose(object);
 }
 
 
-/* libbalsa_message_finalize:
-*/
+/*
+ * libbalsa_message_finalize:
+ */
 static void
-libbalsa_message_finalize(GObject * object)
+libbalsa_message_finalize(GObject *object)
 {
     LibBalsaMessage *message;
 
@@ -176,11 +235,12 @@ libbalsa_message_finalize(GObject * object)
         g_free(message->tempdir);
     }
 
-    G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_message_parent_class)->finalize(object);
 }
 
+
 static void
-lb_message_headers_extra_destroy(LibBalsaMessageHeaders * headers)
+lb_message_headers_extra_destroy(LibBalsaMessageHeaders *headers)
 {
     if (headers != NULL) {
         libbalsa_clear_list(&headers->user_hdrs, (GDestroyNotify) g_strfreev);
@@ -188,11 +248,13 @@ lb_message_headers_extra_destroy(LibBalsaMessageHeaders * headers)
     }
 }
 
-void 
-libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers)
+
+void
+libbalsa_message_headers_destroy(LibBalsaMessageHeaders *headers)
 {
     if (!headers)
-       return;
+        return;
+
 
     g_free(headers->subject);
     headers->subject = NULL;
@@ -210,17 +272,22 @@ libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers)
     g_free(headers);
 }
 
+
 const gchar *
-libbalsa_message_body_charset(LibBalsaMessageBody * body)
+libbalsa_message_body_charset(LibBalsaMessageBody *body)
 {
     const gchar *charset;
 
     if (!body)
-       return NULL;
+        return NULL;
 
-    if (body->charset) /* This overrides all! Important for non
-                        * us-ascii messages over IMAP. */
+
+    if (body->charset) {
+        /* This overrides all! Important for non
+         * us-ascii messages over IMAP. */
         return body->charset;
+    }
+
 
     if (GMIME_IS_PART(body->mime_part)) {
         GMimeContentType *type;
@@ -233,9 +300,11 @@ libbalsa_message_body_charset(LibBalsaMessageBody * body)
     if (charset)
         return charset;
 
+
     return libbalsa_message_body_charset(body->next);
 }
 
+
 /* UTF-8-aware header cleaning by Albrecht */
 static void
 canonize_header_value(gchar *value)
@@ -260,14 +329,16 @@ canonize_header_value(gchar *value)
     *dptr = '\0';
 }
 
+
 /* message_user_hdrs:
    returns allocated GList containing (header=>value) ALL headers pairs
    as generated by g_strsplit.
    The list has to be freed by the following chunk of code:
    g_list_free_full(list, (GDestroyNotify) g_strfreev)
-*/
+ */
 static gchar **
-libbalsa_create_hdr_pair(const gchar * name, gchar * value)
+libbalsa_create_hdr_pair(const gchar *name,
+                         gchar       *value)
 {
     gchar **item = g_new(gchar *, 3);
 
@@ -278,89 +349,101 @@ libbalsa_create_hdr_pair(const gchar * name, gchar * value)
     return item;
 }
 
-static GList*
-libbalsa_message_header_get_helper(LibBalsaMessageHeaders* headers,
-                                   const gchar *find)
+
+static GList *
+libbalsa_message_header_get_helper(LibBalsaMessageHeaders *headers,
+                                   const gchar            *find)
 {
     GList *list;
     for (list = headers->user_hdrs; list; list = list->next) {
-        const gchar * const *tmp = list->data;
-        
-        if (g_ascii_strcasecmp(tmp[0], find) == 0) 
+        const gchar *const *tmp = list->data;
+
+        if (g_ascii_strcasecmp(tmp[0], find) == 0)
             return list;
     }
     return NULL;
 }
 
+
 /** libbalsa_message_find_user_hdr:
     returns.... list element matching given header.
-*/
+ */
 static GList *
-libbalsa_message_find_user_hdr(LibBalsaMessage * message, const gchar * find)
+libbalsa_message_find_user_hdr(LibBalsaMessage *message,
+                               const gchar     *find)
 {
     LibBalsaMessageHeaders *headers = message->headers;
-    
+
     g_return_val_if_fail(headers, NULL);
-    if (!headers->user_hdrs && message->mailbox) 
+    if (!headers->user_hdrs && message->mailbox)
         libbalsa_mailbox_set_msg_headers(message->mailbox, message);
 
     return libbalsa_message_header_get_helper(headers, find);
 }
 
-/* 
+
+/*
  * Public user header methods
  */
-const gchar*
-libbalsa_message_header_get_one(LibBalsaMessageHeaders* headers,
-                                const gchar *find)
+const gchar *
+libbalsa_message_header_get_one(LibBalsaMessageHeaders *headers,
+                                const gchar            *find)
 {
     GList *header;
     const gchar *const *pair;
-    
+
     if (!(header = libbalsa_message_header_get_helper(headers, find)))
         return NULL;
 
+
     pair = header->data;
     return pair[1];
 }
 
-GList*
-libbalsa_message_header_get_all(LibBalsaMessageHeaders* headers,
-                                const gchar *find)
+
+GList *
+libbalsa_message_header_get_all(LibBalsaMessageHeaders *headers,
+                                const gchar            *find)
 {
     GList *header;
     const gchar *const *pair;
     GList *res = NULL;
-    
+
     if (!(header = libbalsa_message_header_get_helper(headers, find)))
         return NULL;
+
     pair = header->data;
-    for(pair++; *pair; pair++)
+    for (pair++; *pair; pair++) {
         res = g_list_append(res, g_strdup(*pair));
-    
+    }
+
     return res;
 }
 
+
 const gchar *
-libbalsa_message_get_user_header(LibBalsaMessage * message,
-                                 const gchar * name)
+libbalsa_message_get_user_header(LibBalsaMessage *message,
+                                 const gchar     *name)
 {
     GList *header;
     const gchar *const *pair;
-    
+
     g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
     g_return_val_if_fail(name != NULL, NULL);
 
     if (!(header = libbalsa_message_find_user_hdr(message, name)))
         return NULL;
 
+
     pair = header->data;
     return pair[1];
 }
 
+
 void
-libbalsa_message_set_user_header(LibBalsaMessage * message,
-                                 const gchar * name, const gchar * value)
+libbalsa_message_set_user_header(LibBalsaMessage *message,
+                                 const gchar     *name,
+                                 const gchar     *value)
 {
     LibBalsaMessageHeaders *headers;
     GList *header;
@@ -377,13 +460,15 @@ libbalsa_message_set_user_header(LibBalsaMessage * message,
         g_list_free_full(header, (GDestroyNotify) g_strfreev);
     }
 
-    if (value && *value)
+    if (value && *value) {
         headers->user_hdrs =
             g_list_prepend(headers->user_hdrs,
                            libbalsa_create_hdr_pair(name,
                                                     g_strdup(value)));
+    }
 }
 
+
 static GList *
 prepend_header_misc(GList      *res,
                     const char *name,
@@ -396,37 +481,41 @@ prepend_header_misc(GList      *res,
         "disposition-notification-to";
     unsigned i;
 
-    if (value[0] == '\0')
-       /* Empty header */
-       return res;
+    if (value[0] == '\0') {
+        /* Empty header */
+        return res;
+    }
+
 
     /* Standard Headers*/
-    for(i = 0; i < sizeof(lcname) - 1 && name[i] != '\0'; i++) {
+    for (i = 0; i < sizeof(lcname) - 1 && name[i] != '\0'; i++) {
         lcname[i] = tolower(name[i]);
     }
     lcname[i] = '\0';
 
-    if(strstr(ignored_headers, lcname) != NULL)
+    if (strstr(ignored_headers, lcname) != NULL)
         return res;
 
+
     return
         g_list_prepend(res,
                        libbalsa_create_hdr_pair(name,
                                                 g_mime_utils_header_decode_text(value)));
 }
 
-/* 
+
+/*
  * libbalsa_message_user_hdrs_from_gmime:
- * 
+ *
  * returns allocated GList containing (header=>value) ALL headers
  * pairs as generated by g_strsplit. The list has to be freed by the
  * following chunk of code (or something functionally similar):
  * g_list_free_full(list, (GDestroyNotify) g_strfreev)
-*/
+ */
 
 
 GList *
-libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
+libbalsa_message_user_hdrs_from_gmime(GMimeMessage *message)
 {
     GMimeHeaderList *hdrlist;
     GMimeHeaderIter iter;
@@ -436,30 +525,31 @@ libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
     g_return_val_if_fail(message != NULL, NULL);
 
     value = g_mime_message_get_message_id(message);
-    if (value)
-       res = g_list_prepend(res, libbalsa_create_hdr_pair("Message-ID",
-                                         g_strdup_printf("<%s>", value)));
+    if (value) {
+        res = g_list_prepend(res, libbalsa_create_hdr_pair("Message-ID",
+                                                           g_strdup_printf("<%s>", value)));
+    }
 
     /* FIXME: This duplicates References headers since they are
        already present in LibBalsaMessage::references field.  FWIW,
        mailbox driver does not copy references to user_headers.
-    */
+     */
     value = g_mime_object_get_header(GMIME_OBJECT(message), "References");
     if (value) {
 #if BALSA_NEEDS_SEPARATE_USER_HEADERS
-       GMimeReferences *references, *reference;
-       reference = references = g_mime_references_decode(value);
-       while (reference) {
-           res =
-               g_list_prepend(res,
-                              libbalsa_create_hdr_pair("References",
-                                                       g_strdup_printf
-                                                       ("<%s>",
-                                                        reference->
-                                                        msgid)));
-           reference = reference->next;
-       }
-       g_mime_references_clear(&references);
+        GMimeReferences *references, *reference;
+        reference = references = g_mime_references_decode(value);
+        while (reference) {
+            res =
+                g_list_prepend(res,
+                               libbalsa_create_hdr_pair("References",
+                                                        g_strdup_printf
+                                                            ("<%s>",
+                                                            reference->
+                                                            msgid)));
+            reference = reference->next;
+        }
+        g_mime_references_clear(&references);
 #else
         res = g_list_prepend(res,
                              libbalsa_create_hdr_pair("References",
@@ -472,37 +562,41 @@ libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
         res =
             g_list_prepend(res,
                            libbalsa_create_hdr_pair
-                           ("In-Reply-To",
-                            g_mime_utils_header_decode_text(value)));
+                               ("In-Reply-To",
+                               g_mime_utils_header_decode_text(value)));
     }
 
     hdrlist = g_mime_object_get_header_list (GMIME_OBJECT(message));
     if (g_mime_header_list_get_iter (hdrlist, &iter)) {
-       do {
+        do {
             res = prepend_header_misc(res,
                                       g_mime_header_iter_get_name (&iter),
                                       g_mime_header_iter_get_value (&iter));
-       } while (g_mime_header_iter_next (&iter));
+        } while (g_mime_header_iter_next (&iter));
     }
-    
+
     return g_list_reverse(res);
 }
 
+
 /* libbalsa_message_get_part_by_id:
    return a message part identified by Content-ID=id
    message must be referenced. (FIXME?)
-*/
+ */
 LibBalsaMessageBody *
-libbalsa_message_get_part_by_id(LibBalsaMessage* msg, const gchar* id)
+libbalsa_message_get_part_by_id(LibBalsaMessage *msg,
+                                const gchar     *id)
 {
     return libbalsa_message_body_get_by_id(msg->body_list, id);
 }
 
+
 /* libbalsa_message_save:
    return TRUE on success and FALSE on failure.
-*/
+ */
 gboolean
-libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
+libbalsa_message_save(LibBalsaMessage *message,
+                      const gchar     *filename)
 {
     FILE *outfile;
     int res;
@@ -511,12 +605,15 @@ libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
 
     g_return_val_if_fail(message->mailbox, FALSE);
 
-    if( (outfile = fopen(filename, "w")) == NULL) return FALSE;
+    if ((outfile = fopen(filename, "w")) == NULL)
+        return FALSE;
+
     g_return_val_if_fail(outfile, FALSE);
 
     msg_stream = libbalsa_message_stream(message);
     if (msg_stream == NULL)
-       return FALSE;
+        return FALSE;
+
     out_stream = g_mime_stream_file_new(outfile);
     libbalsa_mailbox_lock_store(message->mailbox);
     res = g_mime_stream_write_to_stream(msg_stream, out_stream);
@@ -528,37 +625,43 @@ libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
     return res >= 0;
 }
 
+
 LibBalsaMessageAttach
-libbalsa_message_get_attach_icon(LibBalsaMessage * message)
+libbalsa_message_get_attach_icon(LibBalsaMessage *message)
 {
 #ifdef HAVE_GPGME
-    if (libbalsa_message_is_pgp_encrypted(message))
-       return LIBBALSA_MESSAGE_ATTACH_ENCR;
-    else if (message->prot_state != LIBBALSA_MSG_PROTECT_NONE ||
-       libbalsa_message_is_pgp_signed(message)) {
-       switch (message->prot_state) {
-       case LIBBALSA_MSG_PROTECT_SIGN_GOOD:
-           return LIBBALSA_MESSAGE_ATTACH_GOOD;
-       case LIBBALSA_MSG_PROTECT_SIGN_NOTRUST:
-           return LIBBALSA_MESSAGE_ATTACH_NOTRUST;
-       case LIBBALSA_MSG_PROTECT_SIGN_BAD:
-           return LIBBALSA_MESSAGE_ATTACH_BAD;
-       case LIBBALSA_MSG_PROTECT_CRYPT:
-           return LIBBALSA_MESSAGE_ATTACH_ENCR;
-       default:
-           return LIBBALSA_MESSAGE_ATTACH_SIGN;
-       }
+    if (libbalsa_message_is_pgp_encrypted(message)) {
+        return LIBBALSA_MESSAGE_ATTACH_ENCR;
+    } else if ((message->prot_state != LIBBALSA_MSG_PROTECT_NONE) ||
+               libbalsa_message_is_pgp_signed(message)) {
+        switch (message->prot_state) {
+        case LIBBALSA_MSG_PROTECT_SIGN_GOOD:
+            return LIBBALSA_MESSAGE_ATTACH_GOOD;
+
+        case LIBBALSA_MSG_PROTECT_SIGN_NOTRUST:
+            return LIBBALSA_MESSAGE_ATTACH_NOTRUST;
+
+        case LIBBALSA_MSG_PROTECT_SIGN_BAD:
+            return LIBBALSA_MESSAGE_ATTACH_BAD;
+
+        case LIBBALSA_MSG_PROTECT_CRYPT:
+            return LIBBALSA_MESSAGE_ATTACH_ENCR;
+
+        default:
+            return LIBBALSA_MESSAGE_ATTACH_SIGN;
+        }
     } else
 #endif
     if (libbalsa_message_has_attachment(message))
-       return LIBBALSA_MESSAGE_ATTACH_ATTACH;
+        return LIBBALSA_MESSAGE_ATTACH_ATTACH;
     else
-       return LIBBALSA_MESSAGE_ATTACH_ICONS_NUM;
+        return LIBBALSA_MESSAGE_ATTACH_ICONS_NUM;
 }
 
+
 /* Tell the mailbox driver to change flags. */
 void
-libbalsa_message_change_flags(LibBalsaMessage * message,
+libbalsa_message_change_flags(LibBalsaMessage    *message,
                               LibBalsaMessageFlag set,
                               LibBalsaMessageFlag clear)
 {
@@ -578,8 +681,9 @@ libbalsa_message_change_flags(LibBalsaMessage * message,
                                         set, clear);
 }
 
+
 void
-libbalsa_message_reply(LibBalsaMessage * message)
+libbalsa_message_reply(LibBalsaMessage *message)
 {
     g_return_if_fail(message->mailbox);
     libbalsa_lock_mailbox(message->mailbox);
@@ -590,75 +694,87 @@ libbalsa_message_reply(LibBalsaMessage * message)
 
 /* libbalsa_message_body_ref:
    references the structure of given message possibly fetching also all
-   headers. 
+   headers.
    message parts can be fetched later on.
-*/
+ */
 gboolean
-libbalsa_message_body_ref(LibBalsaMessage * message, gboolean read,
-                          gboolean fetch_all_headers)
+libbalsa_message_body_ref(LibBalsaMessage *message,
+                          gboolean         read,
+                          gboolean         fetch_all_headers)
 {
     LibBalsaFetchFlag flags = 0;
-    gboolean retval = TRUE;
+    gboolean retval         = TRUE;
 
     g_return_val_if_fail(message, FALSE);
-    if (!message->mailbox) return FALSE;
+    if (!message->mailbox)
+        return FALSE;
+
     g_return_val_if_fail(MAILBOX_OPEN(message->mailbox), FALSE);
 
     libbalsa_lock_mailbox(message->mailbox);
 
-    if(fetch_all_headers && !message->has_all_headers)
-        flags |=  LB_FETCH_RFC822_HEADERS;
+    if (fetch_all_headers && !message->has_all_headers)
+        flags |= LB_FETCH_RFC822_HEADERS;
 
-    if (message->body_ref == 0 && !message->body_list)
+    if ((message->body_ref == 0) && !message->body_list) {
         /* not fetched yet */
         flags |= LB_FETCH_STRUCTURE;
+    }
 
-    if (flags)
+    if (flags) {
         retval =
             libbalsa_mailbox_fetch_message_structure(message->mailbox,
                                                      message, flags);
+    }
+
     if (retval)
-       message->body_ref++;
+        message->body_ref++;
     libbalsa_unlock_mailbox(message->mailbox);
-    
+
     return retval;
 }
 
 
 void
-libbalsa_message_body_unref(LibBalsaMessage * message)
+libbalsa_message_body_unref(LibBalsaMessage *message)
 {
     g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
 
     if (message->body_ref == 0)
-       return;
+        return;
 
-   if(message->mailbox) { libbalsa_lock_mailbox(message->mailbox); }
-   if (--message->body_ref == 0) {
-       libbalsa_message_body_free(message->body_list);
-       message->body_list = NULL;
-       if (message->mailbox)
-           libbalsa_mailbox_release_message(message->mailbox, message);
 
-       /* Free headers that we no longer need. */
-       lb_message_headers_extra_destroy(message->headers);
-       message->has_all_headers = 0;
-   }
-   if(message->mailbox) { libbalsa_unlock_mailbox(message->mailbox); }
+    if (message->mailbox)
+        libbalsa_lock_mailbox(message->mailbox);
+    if (--message->body_ref == 0) {
+        libbalsa_message_body_free(message->body_list);
+        message->body_list = NULL;
+        if (message->mailbox)
+            libbalsa_mailbox_release_message(message->mailbox, message);
+
+        /* Free headers that we no longer need. */
+        lb_message_headers_extra_destroy(message->headers);
+        message->has_all_headers = 0;
+    }
+    if (message->mailbox)
+        libbalsa_unlock_mailbox(message->mailbox);
 }
 
+
 gboolean
-libbalsa_message_is_multipart(LibBalsaMessage * message)
+libbalsa_message_is_multipart(LibBalsaMessage *message)
 {
     g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
 
     return message->headers->content_type ?
-       g_mime_content_type_is_type(message->headers->content_type,
-                                   "multipart", "*") : FALSE;
+           g_mime_content_type_is_type(message->headers->content_type,
+                                       "multipart", "*") : FALSE;
 }
 
+
 gboolean
-libbalsa_message_is_partial(LibBalsaMessage * message, gchar ** id)
+libbalsa_message_is_partial(LibBalsaMessage *message,
+                            gchar          **id)
 {
     GMimeContentType *content_type;
 
@@ -666,17 +782,19 @@ libbalsa_message_is_partial(LibBalsaMessage * message, gchar ** id)
 
     content_type = message->headers->content_type;
     if (!content_type
-       || !g_mime_content_type_is_type(content_type,
-                                       "message", "partial"))
-       return FALSE;
+        || !g_mime_content_type_is_type(content_type,
+                                        "message", "partial"))
+        return FALSE;
+
 
     if (id)
-       *id = g_strdup(g_mime_content_type_get_parameter(content_type,
-                                                        "id"));
+        *id = g_strdup(g_mime_content_type_get_parameter(content_type,
+                                                         "id"));
 
     return TRUE;
 }
 
+
 /* Go through all parts and try to figure out whether it is a message
    with attachments or not. It still yields insatsfactory
    results... */
@@ -685,23 +803,25 @@ has_attached_part(LibBalsaMessageBody *body)
 {
     LibBalsaMessageBody *lbbody;
     /* the condition matches the one used in add_multipart_mixed() */
-    for(lbbody=body; lbbody; lbbody = lbbody->next) {
+    for (lbbody = body; lbbody; lbbody = lbbody->next) {
         /* printf("part %s has disposition %s\n",
                lbbody->content_type, lbbody->content_dsp); */
-        if(!libbalsa_message_body_is_multipart(lbbody) &&
-           !libbalsa_message_body_is_inline(lbbody) ) {
+        if (!libbalsa_message_body_is_multipart(lbbody) &&
+            !libbalsa_message_body_is_inline(lbbody)) {
             /* puts("Attachment found!"); */
             return TRUE;
         }
-        if(lbbody->parts && has_attached_part(lbbody->parts))
+
+        if (lbbody->parts && has_attached_part(lbbody->parts))
             return TRUE;
     }
     /* no part was an  attachment */
     return FALSE;
 }
 
+
 gboolean
-libbalsa_message_has_attachment(LibBalsaMessage * message)
+libbalsa_message_has_attachment(LibBalsaMessage *message)
 {
     g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
 
@@ -709,42 +829,46 @@ libbalsa_message_has_attachment(LibBalsaMessage * message)
        has Content-type: multipart/mixed AND members with
        Content-disposition: attachment. Unfortunately, part list may
        not be available at this stage. */
-    if(!message->body_list) {
+    if (!message->body_list) {
         return message->headers->content_type &&
-            g_mime_content_type_is_type(message->headers->content_type,
-                                        "multipart", "mixed");
+               g_mime_content_type_is_type(message->headers->content_type,
+                                           "multipart", "mixed");
     } else {
         /* use "exact" algorithm */
         return (has_attached_part(message->body_list->next) ||
-               has_attached_part(message->body_list->parts));
+                has_attached_part(message->body_list->parts));
     }
- }
+}
+
 
 #ifdef HAVE_GPGME
 gboolean
-libbalsa_message_is_pgp_signed(LibBalsaMessage * message)
+libbalsa_message_is_pgp_signed(LibBalsaMessage *message)
 {
     g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
 
     return message->headers->content_type ?
-       g_mime_content_type_is_type(message->headers->content_type,
-                                   "multipart", "signed") : FALSE;
+           g_mime_content_type_is_type(message->headers->content_type,
+                                       "multipart", "signed") : FALSE;
 }
 
+
 gboolean
-libbalsa_message_is_pgp_encrypted(LibBalsaMessage * message)
+libbalsa_message_is_pgp_encrypted(LibBalsaMessage *message)
 {
     g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
 
     return message->headers->content_type ?
-       g_mime_content_type_is_type(message->headers->content_type,
-                                   "multipart", "encrypted") : FALSE;
+           g_mime_content_type_is_type(message->headers->content_type,
+                                       "multipart", "encrypted") : FALSE;
 }
+
+
 #endif
 
 void
-libbalsa_message_append_part(LibBalsaMessage * message,
-                            LibBalsaMessageBody * body)
+libbalsa_message_append_part(LibBalsaMessage     *message,
+                             LibBalsaMessageBody *body)
 {
     LibBalsaMessageBody *part;
 
@@ -752,83 +876,95 @@ libbalsa_message_append_part(LibBalsaMessage * message,
     g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
 
     if (message->body_list == NULL) {
-       message->body_list = body;
+        message->body_list = body;
     } else {
-       part = message->body_list;
-       while (part->next != NULL)
-           part = part->next;
-       part->next = body;
+        part = message->body_list;
+        while (part->next != NULL) {
+            part = part->next;
+        }
+        part->next = body;
     }
 }
 
+
 /* libbalsa_message_set_dispnotify:
    sets a disposition notify to a given address
    address can be NULL.
-*/
+ */
 void
-libbalsa_message_set_dispnotify(LibBalsaMessage * message,
-                                InternetAddress * ia)
+libbalsa_message_set_dispnotify(LibBalsaMessage *message,
+                                InternetAddress *ia)
 {
     g_return_if_fail(message);
 
     g_object_unref(message->headers->dispnotify_to);
     if (ia) {
-       message->headers->dispnotify_to = internet_address_list_new ();
-       internet_address_list_add (message->headers->dispnotify_to, ia);
+        message->headers->dispnotify_to = internet_address_list_new ();
+        internet_address_list_add (message->headers->dispnotify_to, ia);
     } else {
-       message->headers->dispnotify_to = NULL;
+        message->headers->dispnotify_to = NULL;
     }
 }
 
-#ifndef MESSAGE_COPY_CONTENT
+
 /* libbalsa_message_get_subject:
-   get constant pointer to the subject of the message; 
-*/
+   get constant pointer to the subject of the message;
+ */
+#ifdef MESSAGE_COPY_CONTENT
 const gchar *
-libbalsa_message_get_subject(LibBalsaMessage* msg)
+libbalsa_message_get_subject(LibBalsaMessage *message)
+{
+    return message->subj != NULL ? message->subj : _("(No subject)");
+}
+
+
+#else
+const gchar *
+libbalsa_message_get_subject(LibBalsaMessage *msg)
 {
     const gchar *ret;
-    if(!msg->subj &&
-       msg->mime_msg && msg->mailbox) { /* a message in a mailbox... */
+    if (!msg->subj &&
+        msg->mime_msg && msg->mailbox) { /* a message in a mailbox... */
         g_return_val_if_fail(MAILBOX_OPEN(msg->mailbox), NULL);
         ret = g_mime_message_get_subject(msg->mime_msg);
         libbalsa_message_set_subject_from_header(msg, ret);
-    } else
-       ret = msg->subj;
+    } else {
+        ret = msg->subj;
+    }
 
     return ret ? ret : _("(No subject)");
 }
 
 
 guint
-libbalsa_message_get_lines(LibBalsaMessage* msg)
+libbalsa_message_get_lines(LibBalsaMessage *msg)
 {
     /* set the line count */
     const char *value;
     if (!msg->mime_msg)
-       return 0;
+        return 0;
+
     value = g_mime_object_get_header(msg->mime_msg, "Lines");
     if (!value)
-       return 0;
+        return 0;
+
     return atoi(value);
 }
+
+
 glong
-libbalsa_message_get_length(LibBalsaMessage* msg)
+libbalsa_message_get_length(LibBalsaMessage *msg)
 {
     /* set the length */
     const char *value;
     if (!msg->mime_msg)
-       return 0;
+        return 0;
+
     value = g_mime_object_get_header(msg->mime_msg, "Content-Length");
     if (!value)
-       return 0;
-    return atoi(value);
-}
+        return 0;
 
-glong
-libbalsa_message_get_no(LibBalsaMessage* msg)
-{
-    return msg->msgno;
+    return atoi(value);
 }
 
 
@@ -837,22 +973,24 @@ libbalsa_message_get_no(LibBalsaMessage* msg)
 /* Populate headers from mime_msg, but only the members that are needed
  * all the time. */
 static InternetAddressList *
-lb_message_recipients(GMimeMessage * message, GMimeRecipientType type)
+lb_message_recipients(GMimeMessage      *message,
+                      GMimeRecipientType type)
 {
     const InternetAddressList *list;
     InternetAddressList *copy = NULL;
 
     if ((list = g_mime_message_get_recipients (message, type))) {
-       copy = internet_address_list_new ();
-       internet_address_list_append (copy, (InternetAddressList *) list);
+        copy = internet_address_list_new ();
+        internet_address_list_append (copy, (InternetAddressList *) list);
     }
-    
+
     return copy;
 }
 
+
 static void
 lb_message_headers_basic_from_gmime(LibBalsaMessageHeaders *headers,
-                                   GMimeMessage *mime_msg)
+                                    GMimeMessage           *mime_msg)
 {
     g_return_if_fail(headers);
     g_return_if_fail(mime_msg != NULL);
@@ -861,75 +999,84 @@ lb_message_headers_basic_from_gmime(LibBalsaMessageHeaders *headers,
         headers->from = internet_address_list_parse_string(mime_msg->from);
 
     if (!headers->date)
-       g_mime_message_get_date(mime_msg, &headers->date, NULL);
+        g_mime_message_get_date(mime_msg, &headers->date, NULL);
 
-    if (!headers->to_list)
+    if (!headers->to_list) {
         headers->to_list =
             lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_TO);
+    }
 
     if (!headers->content_type) {
-       /* If we could:
-        * headers->content_type =
-        *     g_mime_content_type_copy
-        *         (g_mime_object_get_content_type(mime_msg->mime_part));
-        */
-       GMimeContentType *content_type;
-       gchar *str;
-       g_return_if_fail(headers->content_type == NULL);
-       content_type = g_mime_object_get_content_type(mime_msg->mime_part);
-       str = g_mime_content_type_to_string(content_type);
-       headers->content_type = g_mime_content_type_new_from_string(str);
-       g_free(str);
+        /* If we could:
+         * headers->content_type =
+         *     g_mime_content_type_copy
+         *         (g_mime_object_get_content_type(mime_msg->mime_part));
+         */
+        GMimeContentType *content_type;
+        gchar *str;
+        g_return_if_fail(headers->content_type == NULL);
+        content_type          = g_mime_object_get_content_type(mime_msg->mime_part);
+        str                   = g_mime_content_type_to_string(content_type);
+        headers->content_type = g_mime_content_type_new_from_string(str);
+        g_free(str);
     }
 }
 
+
 /* Populate headers from mime_msg, but only the members not handled in
  * lb_message_headers_basic_from_gmime. */
 static void
 lb_message_headers_extra_from_gmime(LibBalsaMessageHeaders *headers,
-                                   GMimeMessage *mime_msg)
+                                    GMimeMessage           *mime_msg)
 {
     g_return_if_fail(headers);
     g_return_if_fail(mime_msg != NULL);
 
-    if (!headers->reply_to)
+    if (!headers->reply_to) {
         headers->reply_to =
-           internet_address_list_parse_string(mime_msg->reply_to);
+            internet_address_list_parse_string(mime_msg->reply_to);
+    }
 
-    if (!headers->dispnotify_to)
+    if (!headers->dispnotify_to) {
         headers->dispnotify_to =
             internet_address_list_parse_string(g_mime_object_get_header
-                                          (GMIME_OBJECT(mime_msg),
-                                           "Disposition-Notification-To"));
+                                                   (GMIME_OBJECT(mime_msg),
+                                                   "Disposition-Notification-To"));
+    }
 
-    if (!headers->cc_list)
+    if (!headers->cc_list) {
         headers->cc_list =
             lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_CC);
+    }
 
-    if (!headers->bcc_list)
+    if (!headers->bcc_list) {
         headers->bcc_list =
             lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_BCC);
+    }
 
     /* Get fcc from message */
-    if (!headers->fcc_url)
-       headers->fcc_url =
-           g_strdup(g_mime_object_get_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc"));
+    if (!headers->fcc_url) {
+        headers->fcc_url =
+            g_strdup(g_mime_object_get_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc"));
+    }
 }
 
+
 /* Populate headers from the info in mime_msg. */
 void
 libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
-                                   GMimeMessage *mime_msg)
+                                    GMimeMessage           *mime_msg)
 {
     lb_message_headers_basic_from_gmime(headers, mime_msg);
     lb_message_headers_extra_from_gmime(headers, mime_msg);
 }
 
+
 /* Populate message and message->headers from the info in mime_msg,
  * but only the members that are needed all the time. */
 void
-libbalsa_message_init_from_gmime(LibBalsaMessage * message,
-                                GMimeMessage *mime_msg)
+libbalsa_message_init_from_gmime(LibBalsaMessage *message,
+                                 GMimeMessage    *mime_msg)
 {
     const gchar *header;
 
@@ -942,28 +1089,30 @@ libbalsa_message_init_from_gmime(LibBalsaMessage * message,
 
     header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "Content-Length");
     if (header)
-       message->length = atoi(header);
+        message->length = atoi(header);
+
 #endif
     header = g_mime_message_get_message_id(mime_msg);
     if (header)
-       message->message_id = g_strdup(header);
+        message->message_id = g_strdup(header);
 
     header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "References");
     if (header)
-       libbalsa_message_set_references_from_string(message, header);
+        libbalsa_message_set_references_from_string(message, header);
 
     header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "In-Reply-To");
     if (header)
-       libbalsa_message_set_in_reply_to_from_string(message, header);
+        libbalsa_message_set_in_reply_to_from_string(message, header);
 
     lb_message_headers_basic_from_gmime(message->headers, mime_msg);
 }
 
+
 /* Create a newly allocated list of references for threading.
  * This is a deep copy, with its own strings: deallocate with
  * g_free and g_list_free. */
 GList *
-libbalsa_message_refs_for_threading(LibBalsaMessage * message)
+libbalsa_message_refs_for_threading(LibBalsaMessage *message)
 {
     GList *tmp;
     GList *foo;
@@ -971,71 +1120,77 @@ libbalsa_message_refs_for_threading(LibBalsaMessage * message)
     g_return_val_if_fail(message != NULL, NULL);
 
     if (message->in_reply_to && message->in_reply_to->next)
-       return NULL;
+        return NULL;
+
 
     tmp = g_list_copy(message->references);
 
     if (message->in_reply_to) {
-       /* some mailers provide in_reply_to but no references, and
-        * some apparently provide both but with the references in
-        * the wrong order; we'll just make sure it's the last item
-        * of this list */
-       foo = g_list_find_custom(tmp, message->in_reply_to->data,
-                                (GCompareFunc) strcmp);
-
-       if (foo) {
-           tmp = g_list_remove_link(tmp, foo);
-           g_list_free_1(foo);
-       }
-       tmp = g_list_append(tmp, message->in_reply_to->data);
+        /* some mailers provide in_reply_to but no references, and
+         * some apparently provide both but with the references in
+         * the wrong order; we'll just make sure it's the last item
+         * of this list */
+        foo = g_list_find_custom(tmp, message->in_reply_to->data,
+                                 (GCompareFunc) strcmp);
+
+        if (foo) {
+            tmp = g_list_remove_link(tmp, foo);
+            g_list_free_1(foo);
+        }
+        tmp = g_list_append(tmp, message->in_reply_to->data);
     }
 
-    for (foo = tmp; foo; foo = foo->next)
-       foo->data = g_strdup((gchar *) foo->data);
+    for (foo = tmp; foo; foo = foo->next) {
+        foo->data = g_strdup((gchar *) foo->data);
+    }
 
     return tmp;
 }
 
+
 static GList *
-references_decode(const gchar * str)
+references_decode(const gchar *str)
 {
     GMimeReferences *references, *reference;
     GList *list = NULL;
 
     reference = references = g_mime_references_decode(str);
     while (reference) {
-       list = g_list_prepend(list, g_strdup(reference->msgid));
-       reference = reference->next;
+        list      = g_list_prepend(list, g_strdup(reference->msgid));
+        reference = reference->next;
     }
     g_mime_references_clear(&references);
 
     return g_list_reverse(list);
 }
 
+
 void
-libbalsa_message_set_references_from_string(LibBalsaMessage * message,
-                                           const gchar *str)
+libbalsa_message_set_references_from_string(LibBalsaMessage *message,
+                                            const gchar     *str)
 {
- /* Empty references are acceptable but require no action. Similarly,
-    if references were set already, there is not reason to set them
-    again - they are immutable anyway. */
-    if(!message->references && str)
+    /* Empty references are acceptable but require no action. Similarly,
+       if references were set already, there is not reason to set them
+       again - they are immutable anyway. */
+    if (!message->references && str)
         message->references = references_decode(str);
 }
 
+
 void
-libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage * message,
-                                            const gchar * str)
+libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage *message,
+                                             const gchar     *str)
 {
     if (!message->in_reply_to && str) {
-       /* FIXME for Balsa's old non-compliant header */
-       gchar *p = strrchr(str, ';');
-       p = p ? g_strndup(str, p - str) : g_strdup(str);
-       message->in_reply_to = references_decode(p);
-       g_free(p);
+        /* FIXME for Balsa's old non-compliant header */
+        gchar *p = strrchr(str, ';');
+        p                    = p ? g_strndup(str, p - str) : g_strdup(str);
+        message->in_reply_to = references_decode(p);
+        g_free(p);
     }
 }
 
+
 /* set a header, if (all) or if it's needed all the time:
  *   headers->from
  *   headers->date
@@ -1050,8 +1205,10 @@ libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage * message,
  *   in_reply_to
  */
 static gboolean
-lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
-                 const gchar* value, gboolean all)
+lbmsg_set_header(LibBalsaMessage *message,
+                 const gchar     *name,
+                 const gchar     *value,
+                 gboolean         all)
 {
     gchar *val = NULL;
 
@@ -1071,99 +1228,99 @@ lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
     }
 
     if (g_ascii_strcasecmp(name, "Subject") == 0) {
-       if (!strcmp(value,
+        if (!strcmp(value,
                     "DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA")) {
             g_free(val);
-           return FALSE;
+            return FALSE;
         }
 #if MESSAGE_COPY_CONTENT
         libbalsa_message_set_subject_from_header(message, value);
 #endif
-    } else
-    if (g_ascii_strcasecmp(name, "Date") == 0) {
-       message->headers->date = g_mime_utils_header_decode_date(value, NULL);
-    } else
-    if (message->headers->from == NULL &&
-       g_ascii_strcasecmp(name, "From") == 0) {
+    } else if (g_ascii_strcasecmp(name, "Date") == 0) {
+        message->headers->date = g_mime_utils_header_decode_date(value, NULL);
+    } else if ((message->headers->from == NULL) &&
+               (g_ascii_strcasecmp(name, "From") == 0)) {
         message->headers->from = internet_address_list_parse_string(value);
-    } else
-    if (message->headers->to_list == NULL &&
-        g_ascii_strcasecmp(name, "To") == 0) {
-       message->headers->to_list = internet_address_list_parse_string(value);
-    } else
-    if (g_ascii_strcasecmp(name, "In-Reply-To") == 0) {
-       libbalsa_message_set_in_reply_to_from_string(message, value);
-    } else
-    if (message->message_id == NULL &&
-        g_ascii_strcasecmp(name, "Message-ID") == 0) {
-       message->message_id = g_mime_utils_decode_message_id(value);
-    } else
-    if (g_ascii_strcasecmp(name, "References") == 0) {
-       libbalsa_message_set_references_from_string(message, value);
-    } else
-    if (message->headers->content_type == NULL &&
-       g_ascii_strcasecmp(name, "Content-Type") == 0) {
-       message->headers->content_type =
-           g_mime_content_type_new_from_string(value);
-    } else
-    if (message->headers->dispnotify_to == NULL &&
-       g_ascii_strcasecmp(name, "Disposition-Notification-To") == 0) {
-       message->headers->dispnotify_to =
-           internet_address_list_parse_string(value);
+    } else if ((message->headers->to_list == NULL) &&
+               (g_ascii_strcasecmp(name, "To") == 0)) {
+        message->headers->to_list = internet_address_list_parse_string(value);
+    } else if (g_ascii_strcasecmp(name, "In-Reply-To") == 0) {
+        libbalsa_message_set_in_reply_to_from_string(message, value);
+    } else if ((message->message_id == NULL) &&
+               (g_ascii_strcasecmp(name, "Message-ID") == 0)) {
+        message->message_id = g_mime_utils_decode_message_id(value);
+    } else if (g_ascii_strcasecmp(name, "References") == 0) {
+        libbalsa_message_set_references_from_string(message, value);
+    } else if ((message->headers->content_type == NULL) &&
+               (g_ascii_strcasecmp(name, "Content-Type") == 0)) {
+        message->headers->content_type = g_mime_content_type_new_from_string(value);
+    } else if ((message->headers->dispnotify_to == NULL) &&
+               (g_ascii_strcasecmp(name, "Disposition-Notification-To") == 0)) {
+        message->headers->dispnotify_to = internet_address_list_parse_string(value);
     } else
 #ifdef MESSAGE_COPY_CONTENT
     if (g_ascii_strcasecmp(name, "Content-Length") == 0) {
-           message->length = atoi(value);
+        message->length = atoi(value);
     } else
 #endif
-    if (all)
+    if (all) {
         message->headers->user_hdrs =
             g_list_prepend(message->headers->user_hdrs,
-                           libbalsa_create_hdr_pair(name,
-                                                    g_strdup(value)));
+                           libbalsa_create_hdr_pair(name, g_strdup(value)));
+    }
 
     g_free(val);
 
     return TRUE;
 }
 
+
 static gboolean
 lb_message_set_headers_from_string(LibBalsaMessage *message,
-                                  const gchar *lines, gboolean all)
+                                   const gchar     *lines,
+                                   gboolean         all)
 {
     gchar *header, *value;
     const gchar *val, *eoh;
     do {
-        for(val = lines; *val && *val >32 && *val<127 && *val != ':'; val++)
-            ;
-        if(*val != ':') /* parsing error */
+        for (val = lines; *val && *val > 32 && *val < 127 && *val != ':'; val++) {
+        }
+        if (*val != ':')   /* parsing error */
             return FALSE;
-        for(eoh = val+1; *eoh && (eoh[0] != '\n' || isspace(eoh[1])); eoh++)
-            ;
-        header = g_strndup(lines, val-lines);
-        lines = eoh;
-        for(val=val+1; *val && isspace(*val); val++)
-            ;                           /* strip spaces at front... */
-        while(eoh>val && isspace(*eoh)) eoh--; /* .. and at the end */
-        value  = g_strndup(val, eoh-val+1);
-        
+
+        for (eoh = val + 1; *eoh && (eoh[0] != '\n' || isspace(eoh[1])); eoh++) {
+        }
+        header = g_strndup(lines, val - lines);
+        lines  = eoh;
+        for (val = val + 1; *val && isspace(*val); val++) {
+            /* strip spaces at front... */
+        }
+        while (eoh > val && isspace(*eoh)) {
+            eoh--;                             /* .. and at the end */
+        }
+        value = g_strndup(val, eoh - val + 1);
+
         lbmsg_set_header(message, header, value, all);
-        g_free(header); g_free(value);
-        if(!*lines || !*++lines) break;
-    } while(1);
+        g_free(header);
+        g_free(value);
+        if (!*lines || !*++lines)
+            break;
+    } while (1);
     return TRUE;
 }
 
+
 gboolean
 libbalsa_message_set_headers_from_string(LibBalsaMessage *message,
-                                         const gchar *lines)
+                                         const gchar     *lines)
 {
     return lb_message_set_headers_from_string(message, lines, TRUE);
 }
 
+
 void
-libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
-                                           GMimeStream *gmime_stream)
+libbalsa_message_load_envelope_from_stream(LibBalsaMessage *message,
+                                           GMimeStream     *gmime_stream)
 {
     GMimeStream *gmime_stream_filter;
     GMimeFilter *gmime_filter_crlf;
@@ -1183,7 +1340,7 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
         g_mime_filter_crlf_new(FALSE,
                                FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(gmime_stream_filter),
-                                                 gmime_filter_crlf);
+                             gmime_filter_crlf);
     g_object_unref(gmime_filter_crlf);
 
     /* Buffer the message stream, so we can read it line by line. */
@@ -1198,30 +1355,30 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
      */
     line = g_byte_array_new();
     do {
-       g_mime_stream_buffer_readln(gmime_stream_buffer, line);
-       while (g_mime_stream_read(gmime_stream_buffer,
-                                 (char *) &lookahead, 1) == 1 
+        g_mime_stream_buffer_readln(gmime_stream_buffer, line);
+        while (g_mime_stream_read(gmime_stream_buffer,
+                                  (char *) &lookahead, 1) == 1
                && (lookahead == ' ' || lookahead == '\t')) {
             g_byte_array_append(line, &lookahead, 1);
             g_mime_stream_buffer_readln(gmime_stream_buffer, line);
-       }
-       if (line->len == 0 || line->data[line->len-1]!='\n') {
-           /* EOF or read error; in either case, message has no body. */
-           break;
-       }
-       line->data[line->len-1]='\0'; /* terminate line by overwriting '\n' */
-       if (!lb_message_set_headers_from_string(message,
-                                               (gchar *) line->data,
-                                               FALSE)) {
-           /* Ignore error return caused by malformed header. */
-       }
-       if (lookahead == '\n') {/* end of header */
+        }
+        if ((line->len == 0) || (line->data[line->len - 1] != '\n')) {
+            /* EOF or read error; in either case, message has no body. */
+            break;
+        }
+        line->data[line->len - 1] = '\0'; /* terminate line by overwriting '\n' */
+        if (!lb_message_set_headers_from_string(message,
+                                                (gchar *) line->data,
+                                                FALSE)) {
+            /* Ignore error return caused by malformed header. */
+        }
+        if (lookahead == '\n') {/* end of header */
             /* Message looks valid--set its length. */
             message->length = g_mime_stream_length(gmime_stream);
-           break;
-       }
-       line->len = 0;
-       g_byte_array_append(line, &lookahead, 1);
+            break;
+        }
+        line->len = 0;
+        g_byte_array_append(line, &lookahead, 1);
     } while (TRUE);
     g_byte_array_free(line, TRUE);
 
@@ -1230,6 +1387,7 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
     libbalsa_mime_stream_shared_unlock(gmime_stream);
 }
 
+
 void
 libbalsa_message_load_envelope(LibBalsaMessage *message)
 {
@@ -1237,14 +1395,16 @@ libbalsa_message_load_envelope(LibBalsaMessage *message)
 
     gmime_stream = libbalsa_message_stream(message);
     if (!gmime_stream)
-       return;
+        return;
+
 
     libbalsa_message_load_envelope_from_stream(message, gmime_stream);
     g_object_unref(gmime_stream);
 }
 
+
 GMimeStream *
-libbalsa_message_stream(LibBalsaMessage * message)
+libbalsa_message_stream(LibBalsaMessage *message)
 {
     LibBalsaMailbox *mailbox;
     GMimeStream *mime_stream;
@@ -1258,6 +1418,7 @@ libbalsa_message_stream(LibBalsaMessage * message)
         return libbalsa_mailbox_get_message_stream(mailbox,
                                                    message->msgno, FALSE);
 
+
     mime_stream = g_mime_stream_mem_new();
     g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg),
                                   mime_stream);
@@ -1266,9 +1427,11 @@ libbalsa_message_stream(LibBalsaMessage * message)
     return mime_stream;
 }
 
+
 gboolean
-libbalsa_message_copy(LibBalsaMessage * message, LibBalsaMailbox * dest,
-                      GError ** err)
+libbalsa_message_copy(LibBalsaMessage *message,
+                      LibBalsaMailbox *dest,
+                      GError         **err)
 {
     LibBalsaMailbox *mailbox;
     gboolean retval;
@@ -1295,9 +1458,10 @@ libbalsa_message_copy(LibBalsaMessage * message, LibBalsaMailbox * dest,
     return retval;
 }
 
+
 void
-libbalsa_message_set_subject(LibBalsaMessage * message,
-                             const gchar * subject)
+libbalsa_message_set_subject(LibBalsaMessage *message,
+                             const gchar     *subject)
 {
     g_free(message->subj);
     message->subj = g_strdup(subject);
@@ -1305,9 +1469,10 @@ libbalsa_message_set_subject(LibBalsaMessage * message,
     canonize_header_value(message->subj);
 }
 
+
 void
-libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
-                                         const gchar * header)
+libbalsa_message_set_subject_from_header(LibBalsaMessage *message,
+                                         const gchar     *header)
 {
     if (header) {
         gchar *subject =
@@ -1317,13 +1482,322 @@ libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
     }
 }
 
+
 const gchar *
-libbalsa_message_get_tempdir(LibBalsaMessage * message)
+libbalsa_message_get_tempdir(LibBalsaMessage *message)
 {
-    if (!message->tempdir) {
+    if (!message->tempdir)
         if (!libbalsa_mktempdir(&message->tempdir))
             g_warning("Could not make tempdir");
-    }
 
     return message->tempdir;
 }
+
+
+/*
+ * Getters
+ */
+
+LibBalsaMailbox *
+libbalsa_message_get_mailbox(LibBalsaMessage *message)
+{
+    return message->mailbox;
+}
+
+
+LibBalsaMessageHeaders *
+libbalsa_message_get_headers(LibBalsaMessage *message)
+{
+    return message->headers;
+}
+
+
+LibBalsaMessageBody *
+libbalsa_message_get_body_list(LibBalsaMessage *message)
+{
+    return message->body_list;
+}
+
+
+GMimeMessage *
+libbalsa_message_get_mime_msg(LibBalsaMessage *message)
+{
+    return message->mime_msg;
+}
+
+
+LibBalsaMessageFlag
+libbalsa_message_get_flags(LibBalsaMessage *message)
+{
+    return message->flags;
+}
+
+
+const gchar *
+libbalsa_message_get_message_id(LibBalsaMessage *message)
+{
+    return message->message_id;
+}
+
+
+glong
+libbalsa_message_get_msgno(LibBalsaMessage *message)
+{
+    return message->msgno;
+}
+
+
+glong
+libbalsa_message_get_length(LibBalsaMessage *message)
+{
+    return message->length;
+}
+
+
+gboolean
+libbalsa_message_get_has_all_headers(LibBalsaMessage *message)
+{
+    return message->has_all_headers;
+}
+
+
+InternetAddressList *
+libbalsa_message_get_sender(LibBalsaMessage *message)
+{
+    return message->sender;
+}
+
+
+gboolean
+libbalsa_message_get_request_dsn(LibBalsaMessage *message)
+{
+    return message->request_dsn;
+}
+
+
+GList *
+libbalsa_message_get_references(LibBalsaMessage *message)
+{
+    return message->references;
+}
+
+
+#ifdef HAVE_GPGME
+LibBalsaIdentity *
+libbalsa_message_get_identity(LibBalsaMessage *message)
+{
+    return message->ident;
+}
+
+
+#endif
+
+GList *
+libbalsa_message_get_parameters(LibBalsaMessage *message)
+{
+    return message->parameters;
+}
+
+
+const gchar *
+libbalsa_message_get_subtype(LibBalsaMessage *message)
+{
+    return message->subtype;
+}
+
+
+guint
+libbalsa_message_get_gpg_mode(LibBalsaMessage *message)
+{
+    return message->gpg_mode;
+}
+
+
+GList *
+libbalsa_message_get_in_reply_to(LibBalsaMessage *message)
+{
+    return message->in_reply_to;
+}
+
+
+gboolean
+libbalsa_message_get_att_pubkey(LibBalsaMessage *message)
+{
+    return message->att_pubkey;
+}
+
+
+LibBalsaMsgProtectState
+libbalsa_message_get_prot_state(LibBalsaMessage *message)
+{
+    return message->prot_state;
+}
+
+
+guint
+libbalsa_message_get_body_ref(LibBalsaMessage *message)
+{
+    return message->body_ref;
+}
+
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_message_set_flags(LibBalsaMessage    *message,
+                           LibBalsaMessageFlag flags)
+{
+    message->flags = flags;
+}
+
+
+void
+libbalsa_message_set_mailbox(LibBalsaMessage *message,
+                             LibBalsaMailbox *mailbox)
+{
+    message->mailbox = mailbox;
+}
+
+
+void
+libbalsa_message_set_msgno(LibBalsaMessage *message,
+                           glong            msgno)
+{
+    message->msgno = msgno;
+}
+
+
+void
+libbalsa_message_set_has_all_headers(LibBalsaMessage *message,
+                                     gboolean         has_all_headers)
+{
+    message->has_all_headers = has_all_headers;
+}
+
+
+#if MESSAGE_COPY_CONTENT
+void
+libbalsa_message_set_length(LibBalsaMessage *message,
+                            glong            length)
+{
+    message->length = length;
+}
+
+
+#endif
+
+void
+libbalsa_message_set_mime_msg(LibBalsaMessage *message,
+                              GMimeMessage    *mime_message)
+{
+    g_set_object(&message->mime_msg, mime_message);
+}
+
+
+void
+libbalsa_message_set_sender(LibBalsaMessage     *message,
+                            InternetAddressList *sender)
+{
+    g_set_object(&message->sender, sender);
+}
+
+
+void
+libbalsa_message_set_message_id(LibBalsaMessage *message,
+                                const gchar     *message_id)
+{
+    g_free(message->message_id);
+    message->message_id = g_strdup(message_id);
+}
+
+
+void
+libbalsa_message_set_prot_state(LibBalsaMessage        *message,
+                                LibBalsaMsgProtectState prot_state)
+{
+    message->prot_state = prot_state;
+}
+
+
+void
+libbalsa_message_set_request_dsn(LibBalsaMessage *message,
+                                 gboolean         request_dsn)
+{
+    message->request_dsn = request_dsn;
+}
+
+
+void
+libbalsa_message_set_subtype(LibBalsaMessage *message,
+                             const gchar     *subtype)
+{
+    g_free(message->subtype);
+    message->subtype = g_strdup(subtype);
+}
+
+
+void
+libbalsa_message_set_parameters(LibBalsaMessage *message,
+                                GList           *parameters)
+{
+    g_list_free_full(message->parameters, (GDestroyNotify) g_strfreev);
+    message->parameters = parameters;
+}
+
+
+void
+libbalsa_message_set_body_list(LibBalsaMessage     *message,
+                               LibBalsaMessageBody *body_list)
+{
+    message->body_list = body_list;
+}
+
+
+void
+libbalsa_message_set_references(LibBalsaMessage *message,
+                                GList           *references)
+{
+    g_list_free_full(message->references, g_free);
+    /* We steal the GList and its data; see libbalsa_message_finalize */
+    message->references = references;
+}
+
+
+void
+libbalsa_message_set_in_reply_to(LibBalsaMessage *message,
+                                 GList           *in_reply_to)
+{
+    g_list_free_full(message->in_reply_to, g_free);
+    /* We steal the GList and its data; see libbalsa_message_finalize */
+    message->in_reply_to = in_reply_to;
+}
+
+
+void
+libbalsa_message_set_gpg_mode(LibBalsaMessage *message,
+                              guint            mode)
+{
+    message->gpg_mode = mode;
+}
+
+
+void
+libbalsa_message_set_att_pubkey(LibBalsaMessage *message,
+                                gboolean         att_pubkey)
+{
+    message->att_pubkey = att_pubkey;
+}
+
+
+#ifdef HAVE_GPGME
+void
+libbalsa_message_set_identity(LibBalsaMessage  *message,
+                              LibBalsaIdentity *ident)
+{
+    message->ident = g_object_ref(ident);
+}
+
+
+#endif
diff --git a/libbalsa/message.h b/libbalsa/message.h
index 02f3a72..40c07f0 100644
--- a/libbalsa/message.h
+++ b/libbalsa/message.h
@@ -5,14 +5,14 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option) 
+ * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
- *  
+ *
  * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of 
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *  
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
@@ -21,7 +21,7 @@
 #define __LIBBALSA_MESSAGE_H__
 
 #ifndef BALSA_VERSION
-# error "Include config.h before this file."
+#   error "Include config.h before this file."
 #endif
 
 #include <glib.h>
@@ -32,23 +32,19 @@
 #include <gmime/gmime.h>
 
 #ifdef HAVE_GPGME
-#include "rfc3156.h"
+#   include "rfc3156.h"
 #endif
 
 #define MESSAGE_COPY_CONTENT 1
-#define LIBBALSA_TYPE_MESSAGE \
-    (libbalsa_message_get_type())
-#define LIBBALSA_MESSAGE(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST(obj, LIBBALSA_TYPE_MESSAGE, LibBalsaMessage))
-#define LIBBALSA_MESSAGE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST(klass, LIBBALSA_TYPE_MESSAGE, \
-                             LibBalsaMessageClass))
-#define LIBBALSA_IS_MESSAGE(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE(obj, LIBBALSA_TYPE_MESSAGE))
-#define LIBBALSA_IS_MESSAGE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE(klass, LIBBALSA_TYPE_MESSAGE))
-
-typedef struct _LibBalsaMessageClass LibBalsaMessageClass;
+
+#define LIBBALSA_TYPE_MESSAGE libbalsa_message_get_type()
+
+G_DECLARE_FINAL_TYPE(LibBalsaMessage,
+                     libbalsa_message,
+                     LIBBALSA,
+                     MESSAGE,
+                     GObject)
+
 typedef enum _LibBalsaMessageFlag LibBalsaMessageFlag;
 
 enum _LibBalsaMessageFlag {
@@ -57,16 +53,16 @@ enum _LibBalsaMessageFlag {
     LIBBALSA_MESSAGE_FLAG_REPLIED = 1 << 2,
     LIBBALSA_MESSAGE_FLAG_FLAGGED = 1 << 3,
     LIBBALSA_MESSAGE_FLAG_RECENT  = 1 << 4,
-    LIBBALSA_MESSAGE_FLAG_SELECTED= 1 << 5,    /* pseudo flag */
-    LIBBALSA_MESSAGE_FLAG_INVALID = 1 << 6     /* pseudo flag */
+    LIBBALSA_MESSAGE_FLAG_SELECTED= 1 << 5,     /* pseudo flag */
+    LIBBALSA_MESSAGE_FLAG_INVALID = 1 << 6      /* pseudo flag */
 };
 
 #define LIBBALSA_MESSAGE_FLAGS_REAL \
-   (LIBBALSA_MESSAGE_FLAG_NEW       | \
-    LIBBALSA_MESSAGE_FLAG_DELETED   | \
-    LIBBALSA_MESSAGE_FLAG_REPLIED   | \
-    LIBBALSA_MESSAGE_FLAG_FLAGGED   | \
-    LIBBALSA_MESSAGE_FLAG_RECENT)
+    (LIBBALSA_MESSAGE_FLAG_NEW | \
+     LIBBALSA_MESSAGE_FLAG_DELETED | \
+     LIBBALSA_MESSAGE_FLAG_REPLIED | \
+     LIBBALSA_MESSAGE_FLAG_FLAGGED | \
+     LIBBALSA_MESSAGE_FLAG_RECENT)
 
 typedef enum _LibBalsaMessageStatus LibBalsaMessageStatus;
 enum _LibBalsaMessageStatus {
@@ -156,92 +152,8 @@ struct _LibBalsaMessageHeaders {
     GList *user_hdrs;
 };
 
-struct _LibBalsaMessage {
-    GObject object;
-
-    /* the mailbox this message belongs to */
-    LibBalsaMailbox *mailbox;
-
-    /* flags */
-    LibBalsaMessageFlag flags;
-
-    /* headers */
-    LibBalsaMessageHeaders *headers;
-    int updated; /** whether complete headers have been fetched */
-
-    GMimeMessage *mime_msg;
-
-    /* sender address */
-    InternetAddressList *sender;
-
-    /* subject line; we still need it here for sending;
-     * although _SET_SUBJECT might resolve it(?) 
-     * but we can set to to NULL unless there is no mailbox, like
-     * on sending. */
-    gchar *subj;
-#ifdef MESSAGE_COPY_CONTENT
-#define LIBBALSA_MESSAGE_GET_SUBJECT(m) \
-    ((m)->subj ? (m)->subj : _("(No subject)"))
-#else
-#define LIBBALSA_MESSAGE_GET_SUBJECT(m) libbalsa_message_get_subject(m)
-#endif
-
-    /* replied message ID's */
-    GList *references;
-
-    /* replied message ID; from address on date */
-    GList *in_reply_to;
-
-    /* message ID */
-    gchar *message_id;
-
-#ifdef HAVE_GPGME
-    /* GPG sign and/or encrypt message (sending) */
-    guint gpg_mode;
-
-    /* attach the GnuPG public key to the message (sending) */
-    gboolean att_pubkey;
-
-    /* protection (i.e. sign/encrypt) status (received message) */
-    LibBalsaMsgProtectState prot_state;
-
-    /* sender identity, required for choosing a forced GnuPG or S/MIME key */
-    LibBalsaIdentity *ident;
-#endif
-
-    /* request a DSN (sending) */
-    gboolean request_dsn;
-
-    /* a forced multipart subtype or NULL for mixed; used only for
-     * sending */
-    gchar *subtype;
-
-    /* additional message content type parameters; used only for sending */
-    GList *parameters;
-
-    /* message body */
-    guint body_ref;
-    LibBalsaMessageBody *body_list;
-    /*  GList *body_list; */
-
-    glong msgno;     /* message no; always copy for faster sorting;
-                     * counting starts at 1. */
-#if MESSAGE_COPY_CONTENT
-#define LIBBALSA_MESSAGE_GET_NO(m)      ((m)->msgno)
-    glong length;   /* byte len */
-#define LIBBALSA_MESSAGE_GET_LENGTH(m)  ((m)->length)
-#else
-#define LIBBALSA_MESSAGE_GET_LENGTH(m) libbalsa_message_get_length(m)
-#define LIBBALSA_MESSAGE_GET_NO(m)  libbalsa_message_get_no(m)
-#endif
-
-    gchar *tempdir;     /* to hold named parts */
-
-    unsigned has_all_headers:1;
-};
-
 #define LIBBALSA_MESSAGE_HAS_FLAG(message, mask) \
-    ((LIBBALSA_MESSAGE(message)->flags & mask) != 0)
+    ((libbalsa_message_get_flags(LIBBALSA_MESSAGE(message)) & mask) != 0)
 #define LIBBALSA_MESSAGE_IS_UNREAD(message) \
     LIBBALSA_MESSAGE_HAS_FLAG(message, LIBBALSA_MESSAGE_FLAG_NEW)
 #define LIBBALSA_MESSAGE_IS_DELETED(message) \
@@ -253,26 +165,18 @@ struct _LibBalsaMessage {
 #define LIBBALSA_MESSAGE_IS_RECENT(message) \
     LIBBALSA_MESSAGE_HAS_FLAG(message, LIBBALSA_MESSAGE_FLAG_RECENT)
 
-struct _LibBalsaMessageClass {
-    GObjectClass parent_class;
-
-    /* deal with flags being set/unset */
-    /* Signal: */
-    void (*status_changed) (LibBalsaMessage * message,
-                           LibBalsaMessageFlag flag, gboolean);
-};
-
-
-GType libbalsa_message_get_type(void);
+#define LIBBALSA_MESSAGE_GET_SUBJECT(m) libbalsa_message_get_subject(m)
+#define LIBBALSA_MESSAGE_GET_NO(m)      libbalsa_message_get_msgno(m)
+#define LIBBALSA_MESSAGE_GET_LENGTH(m)  libbalsa_message_get_length(m)
 
 /*
  * message headers
  */
-void libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers);
-void libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
-                                        GMimeMessage *msg);
-void libbalsa_message_init_from_gmime(LibBalsaMessage * message,
-                                     GMimeMessage * msg);
+void   libbalsa_message_headers_destroy(LibBalsaMessageHeaders *headers);
+void   libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
+                                           GMimeMessage           *msg);
+void   libbalsa_message_init_from_gmime(LibBalsaMessage *message,
+                                        GMimeMessage    *msg);
 GList *libbalsa_message_user_hdrs_from_gmime(GMimeMessage *msg);
 
 
@@ -281,84 +185,170 @@ GList *libbalsa_message_user_hdrs_from_gmime(GMimeMessage *msg);
  */
 LibBalsaMessage *libbalsa_message_new(void);
 
-gboolean libbalsa_message_save(LibBalsaMessage * message,
-                              const gchar *filename);
+gboolean         libbalsa_message_save(LibBalsaMessage *message,
+                                       const gchar     *filename);
 
-void libbalsa_message_reply(LibBalsaMessage * message);
+void libbalsa_message_reply(LibBalsaMessage *message);
 
-void libbalsa_message_append_part(LibBalsaMessage * message,
-                                 LibBalsaMessageBody * body);
+void libbalsa_message_append_part(LibBalsaMessage     *message,
+                                  LibBalsaMessageBody *body);
 
-gboolean libbalsa_message_body_ref(LibBalsaMessage * message, gboolean read,
-                                   gboolean fetch_all_headers);
-void libbalsa_message_body_unref(LibBalsaMessage * message);
+gboolean libbalsa_message_body_ref(LibBalsaMessage *message,
+                                   gboolean         read,
+                                   gboolean         fetch_all_headers);
+void libbalsa_message_body_unref(LibBalsaMessage *message);
 
 /*
  * misc message releated functions
  */
-const gchar *libbalsa_message_pathname(LibBalsaMessage * message);
-const gchar *libbalsa_message_body_charset(LibBalsaMessageBody * body);
-gboolean libbalsa_message_is_multipart(LibBalsaMessage * message);
-gboolean libbalsa_message_is_partial(LibBalsaMessage * message,
-                                    gchar ** id);
-gboolean libbalsa_message_has_attachment(LibBalsaMessage * message);
+const gchar *libbalsa_message_pathname(LibBalsaMessage *message);
+const gchar *libbalsa_message_body_charset(LibBalsaMessageBody *body);
+gboolean     libbalsa_message_is_multipart(LibBalsaMessage *message);
+gboolean     libbalsa_message_is_partial(LibBalsaMessage *message,
+                                         gchar          **id);
+gboolean     libbalsa_message_has_attachment(LibBalsaMessage *message);
+
 #ifdef HAVE_GPGME
-gboolean libbalsa_message_is_pgp_signed(LibBalsaMessage * message);
-gboolean libbalsa_message_is_pgp_encrypted(LibBalsaMessage * message);
+gboolean libbalsa_message_is_pgp_signed(LibBalsaMessage *message);
+gboolean libbalsa_message_is_pgp_encrypted(LibBalsaMessage *message);
+
 #endif
 
-const gchar* libbalsa_message_header_get_one(LibBalsaMessageHeaders* headers,
-                                             const gchar *find);
-GList* libbalsa_message_header_get_all(LibBalsaMessageHeaders* headers,
-                                       const gchar *find);
-const gchar *libbalsa_message_get_user_header(LibBalsaMessage * message,
-                                              const gchar * name);
-void libbalsa_message_set_user_header(LibBalsaMessage * message,
-                                      const gchar * name,
-                                      const gchar * value);
+const gchar *libbalsa_message_header_get_one(LibBalsaMessageHeaders *headers,
+                                             const gchar            *find);
+GList       *libbalsa_message_header_get_all(LibBalsaMessageHeaders *headers,
+                                             const gchar            *find);
+const gchar *libbalsa_message_get_user_header(LibBalsaMessage *message,
+                                              const gchar     *name);
+void         libbalsa_message_set_user_header(LibBalsaMessage *message,
+                                              const gchar     *name,
+                                              const gchar     *value);
 
 LibBalsaMessageBody *libbalsa_message_get_part_by_id(LibBalsaMessage *
                                                      message,
-                                                     const gchar * id);
+                                                     const gchar *id);
+
+void libbalsa_message_set_dispnotify(LibBalsaMessage *message,
+                                     InternetAddress *ia);
 
-void libbalsa_message_set_dispnotify(LibBalsaMessage *message, 
-                                    InternetAddress *ia);
+void libbalsa_message_set_subject(LibBalsaMessage *message,
+                                  const gchar     *subject);
+void libbalsa_message_set_subject_from_header(LibBalsaMessage *message,
+                                              const gchar     *header);
 
-void libbalsa_message_set_subject(LibBalsaMessage * message,
-                                  const gchar * subject);
-void libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
-                                              const gchar * header);
 /* use LIBBALSA_MESSAGE_GET_SUBJECT() macro, we may optimize this
    function out if we find a way.
-*/
+ */
+const gchar *libbalsa_message_get_subject(LibBalsaMessage *message);
+
 #ifndef MESSAGE_COPY_CONTENT
-const gchar* libbalsa_message_get_subject(LibBalsaMessage* message);
-guint libbalsa_message_get_lines(LibBalsaMessage* msg);
-glong libbalsa_message_get_length(LibBalsaMessage* msg);
+guint libbalsa_message_get_lines(LibBalsaMessage *msg);
+glong libbalsa_message_get_length(LibBalsaMessage *msg);
+
 #endif
-glong libbalsa_message_get_no(LibBalsaMessage* msg);
 LibBalsaMessageAttach libbalsa_message_get_attach_icon(LibBalsaMessage *
-                                                      message);
-#define libbalsa_message_date_to_utf8(m, f) libbalsa_date_to_utf8((m)->headers->date, (f))
+                                                       message);
+
+#define libbalsa_message_date_to_utf8(m, f) libbalsa_date_to_utf8(libbalsa_message_get_headers( \
+                                                                      m)->date, (f))
 #define libbalsa_message_headers_date_to_utf8(h, f) libbalsa_date_to_utf8((h)->date, (f))
 
-GList *libbalsa_message_refs_for_threading(LibBalsaMessage* msg);
-
-void libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
-                                                GMimeStream * stream);
-void libbalsa_message_load_envelope(LibBalsaMessage *message);
-gboolean libbalsa_message_set_headers_from_string(LibBalsaMessage *message,
-                                                  const gchar *str);
-void libbalsa_message_set_references_from_string(LibBalsaMessage * message,
-                                                const gchar *str);
-void libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage * message,
-                                                 const gchar *str);
-GMimeStream *libbalsa_message_stream(LibBalsaMessage * message);
-gboolean libbalsa_message_copy(LibBalsaMessage * message,
-                               LibBalsaMailbox * dest, GError ** err);
-void libbalsa_message_change_flags(LibBalsaMessage * message,
+GList       *libbalsa_message_refs_for_threading(LibBalsaMessage *msg);
+
+void         libbalsa_message_load_envelope_from_stream(LibBalsaMessage *message,
+                                                        GMimeStream     *stream);
+void         libbalsa_message_load_envelope(LibBalsaMessage *message);
+gboolean     libbalsa_message_set_headers_from_string(LibBalsaMessage *message,
+                                                      const gchar     *str);
+void         libbalsa_message_set_references_from_string(LibBalsaMessage *message,
+                                                         const gchar     *str);
+void         libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage *message,
+                                                          const gchar     *str);
+GMimeStream *libbalsa_message_stream(LibBalsaMessage *message);
+gboolean     libbalsa_message_copy(LibBalsaMessage *message,
+                                   LibBalsaMailbox *dest,
+                                   GError         **err);
+void libbalsa_message_change_flags(LibBalsaMessage    *message,
                                    LibBalsaMessageFlag set,
                                    LibBalsaMessageFlag clear);
 
-const gchar *libbalsa_message_get_tempdir(LibBalsaMessage * message);
-#endif                         /* __LIBBALSA_MESSAGE_H__ */
+const gchar *libbalsa_message_get_tempdir(LibBalsaMessage *message);
+
+/*
+ * Getters
+ */
+LibBalsaMailbox        *libbalsa_message_get_mailbox(LibBalsaMessage *message);
+LibBalsaMessageHeaders *libbalsa_message_get_headers(LibBalsaMessage *message);
+LibBalsaMessageBody    *libbalsa_message_get_body_list(LibBalsaMessage *message);
+GMimeMessage           *libbalsa_message_get_mime_msg(LibBalsaMessage *message);
+LibBalsaMessageFlag     libbalsa_message_get_flags(LibBalsaMessage *message);
+const gchar            *libbalsa_message_get_message_id(LibBalsaMessage *message);
+glong                   libbalsa_message_get_msgno(LibBalsaMessage *message);
+glong                   libbalsa_message_get_length(LibBalsaMessage *message);
+gboolean                libbalsa_message_get_has_all_headers(LibBalsaMessage *message);
+InternetAddressList    *libbalsa_message_get_sender(LibBalsaMessage *message);
+gboolean                libbalsa_message_get_request_dsn(LibBalsaMessage *message);
+GList                  *libbalsa_message_get_references(LibBalsaMessage *message);
+
+#ifdef HAVE_GPGME
+LibBalsaIdentity *libbalsa_message_get_identity(LibBalsaMessage *message);
+
+#endif
+GList                  *libbalsa_message_get_parameters(LibBalsaMessage *message);
+const gchar            *libbalsa_message_get_subtype(LibBalsaMessage *message);
+guint                   libbalsa_message_get_gpg_mode(LibBalsaMessage *message);
+GList                  *libbalsa_message_get_in_reply_to(LibBalsaMessage *message);
+gboolean                libbalsa_message_get_att_pubkey(LibBalsaMessage *message);
+LibBalsaMsgProtectState libbalsa_message_get_prot_state(LibBalsaMessage *message);
+guint                   libbalsa_message_get_body_ref(LibBalsaMessage *message);
+
+/*
+ * Setters
+ */
+void libbalsa_message_set_flags(LibBalsaMessage    *message,
+                                LibBalsaMessageFlag flags);
+void libbalsa_message_set_mailbox(LibBalsaMessage *message,
+                                  LibBalsaMailbox *mailbox);
+void libbalsa_message_set_msgno(LibBalsaMessage *message,
+                                glong            msgno);
+void libbalsa_message_set_has_all_headers(LibBalsaMessage *message,
+                                          gboolean         has_all_headers);
+
+#if MESSAGE_COPY_CONTENT
+void libbalsa_message_set_length(LibBalsaMessage *message,
+                                 glong            length);
+
+#endif
+
+void libbalsa_message_set_mime_msg(LibBalsaMessage *message,
+                                   GMimeMessage    *mime_message);
+void libbalsa_message_set_sender(LibBalsaMessage     *message,
+                                 InternetAddressList *sender);
+void libbalsa_message_set_message_id(LibBalsaMessage *message,
+                                     const gchar     *message_id);
+void libbalsa_message_set_prot_state(LibBalsaMessage        *message,
+                                     LibBalsaMsgProtectState prot_state);
+void libbalsa_message_set_request_dsn(LibBalsaMessage *message,
+                                      gboolean         request_dsn);
+void libbalsa_message_set_subtype(LibBalsaMessage *message,
+                                  const gchar     *subtype);
+void libbalsa_message_set_parameters(LibBalsaMessage *message,
+                                     GList           *parameters);
+void libbalsa_message_set_body_list(LibBalsaMessage     *message,
+                                    LibBalsaMessageBody *body_list);
+void libbalsa_message_set_references(LibBalsaMessage *message,
+                                     GList           *references);
+void libbalsa_message_set_in_reply_to(LibBalsaMessage *message,
+                                      GList           *in_reply_to);
+void libbalsa_message_set_gpg_mode(LibBalsaMessage *message,
+                                   guint            mode);
+void libbalsa_message_set_att_pubkey(LibBalsaMessage *message,
+                                     gboolean         att_pubkey);
+
+#ifdef HAVE_GPGME
+void libbalsa_message_set_identity(LibBalsaMessage  *message,
+                                   LibBalsaIdentity *identity);
+
+#endif
+
+#endif                          /* __LIBBALSA_MESSAGE_H__ */
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index 695f421..20de720 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -361,7 +361,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
        g_object_unref(G_OBJECT(body->parts->next->sig_info));
 
     /* verify the signature */
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    libbalsa_mailbox_lock_store(libbalsa_message_get_mailbox(body->message));
     result = g_mime_gpgme_mps_verify(GMIME_MULTIPART_SIGNED(body->mime_part), &error);
     if (!result) {
        if (error) {
@@ -375,7 +375,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
     }
 
     body->parts->next->sig_info = result;
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(libbalsa_message_get_mailbox(body->message));
     return TRUE;
 }
 
@@ -420,7 +420,7 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
                smime_encrypted = body->was_encrypted;
     }
 
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    libbalsa_mailbox_lock_store(libbalsa_message_get_mailbox(body->message));
     if (protocol == GPGME_PROTOCOL_OpenPGP) {
        mime_obj =
                g_mime_gpgme_mpe_decrypt(GMIME_MULTIPART_ENCRYPTED(body->mime_part),
@@ -430,7 +430,7 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
                g_mime_application_pkcs7_decrypt_verify(GMIME_PART(body->mime_part),
                        &sig_state, parent, &error);
     }
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(libbalsa_message_get_mailbox(body->message));
 
     /* check the result */
     if (mime_obj == NULL) {
@@ -456,7 +456,7 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
        body->was_encrypted = smime_encrypted;
     }
     if (body->was_encrypted)
-        body->message->prot_state = LIBBALSA_MSG_PROTECT_CRYPT;
+        libbalsa_message_set_prot_state(body->message, LIBBALSA_MSG_PROTECT_CRYPT);
 
     libbalsa_message_body_set_mime_body(body, mime_obj);
     if (sig_state) {
diff --git a/libbalsa/send.c b/libbalsa/send.c
index 2850ab9..39b3680 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -434,6 +434,7 @@ lbs_message_queue_real(LibBalsaMessage    *message,
                        GError            **error)
 {
     LibBalsaMsgCreateResult result;
+    GMimeMessage *mime_msg;
     guint big_message;
     gboolean rc;
 
@@ -445,23 +446,22 @@ lbs_message_queue_real(LibBalsaMessage    *message,
         return result;
     }
 
+    mime_msg = libbalsa_message_get_mime_msg(message);
     if (fccbox != NULL) {
-        g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-Fcc",
+        g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc",
                                  libbalsa_mailbox_get_url(fccbox));
     }
-    g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-DSN",
-                             message->request_dsn ? "1" : "0");
-    g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-SmtpServer",
+    g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-DSN",
+                             libbalsa_message_get_request_dsn(message) ? "1" : "0");
+    g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-SmtpServer",
                              libbalsa_smtp_server_get_name(smtp_server));
 
     big_message = libbalsa_smtp_server_get_big_message(smtp_server);
     if (big_message > 0) {
-        GMimeMessage *mime_msg;
         GMimeMessage **mime_msgs;
         size_t nparts;
         guint i;
 
-        mime_msg = message->mime_msg;
         mime_msgs =
             g_mime_message_partial_split_message(mime_msg, big_message,
                                                  &nparts);
@@ -477,13 +477,15 @@ lbs_message_queue_real(LibBalsaMessage    *message,
                 libbalsa_set_message_id(mime_msgs[i]);
             }
             if (rc) {
-                message->mime_msg = mime_msgs[i];
+                /* Temporarily modify message by changing its mime_msg: */
+                libbalsa_message_set_mime_msg(message, mime_msgs[i]);
                 rc = libbalsa_message_copy(message, outbox, error);
             }
             g_object_unref(mime_msgs[i]);
         }
         g_free(mime_msgs);
-        message->mime_msg = mime_msg;
+        /* Restore message's original mime_msg: */
+        libbalsa_message_set_mime_msg(message, mime_msg);
     } else {
         rc = libbalsa_message_copy(message, outbox, error);
     }
@@ -721,7 +723,7 @@ lbs_process_queue_msg(guint                    msgno,
        }
 
         dsn_header = libbalsa_message_get_user_header(msg, "X-Balsa-DSN");
-        msg->request_dsn = dsn_header != NULL ? atoi(dsn_header) != 0 : FALSE;
+        libbalsa_message_set_request_dsn(msg, dsn_header != NULL ? atoi(dsn_header) != 0 : FALSE);
        new_message = msg_queue_item_new(send_message_info);
        created = libbalsa_fill_msg_queue_item_from_queu(msg, new_message);
        libbalsa_message_body_unref(msg);
@@ -729,18 +731,27 @@ lbs_process_queue_msg(guint                  msgno,
        if (created != LIBBALSA_MESSAGE_CREATE_OK) {
                msg_queue_item_destroy(new_message);
        } else {
+                gboolean request_dsn;
+                LibBalsaMessageHeaders *headers;
+                InternetAddressList *from;
                const InternetAddress* ia;
                const gchar* mailbox;
 
                libbalsa_message_change_flags(msg, LIBBALSA_MESSAGE_FLAG_FLAGGED, 0);
                send_message_info->items = g_list_prepend(send_message_info->items, new_message);
                new_message->smtp_msg = net_client_smtp_msg_new(send_message_data_cb, new_message);
-               if (msg->request_dsn) {
-                       net_client_smtp_msg_set_dsn_opts(new_message->smtp_msg, msg->message_id, FALSE);
+               request_dsn = libbalsa_message_get_request_dsn(msg);
+               if (request_dsn) {
+                        const gchar *message_id = libbalsa_message_get_message_id(msg);
+                       net_client_smtp_msg_set_dsn_opts(new_message->smtp_msg,
+                                                         message_id, FALSE);
                }
 
                /* Add the sender info */
-               if (msg->headers->from && (ia = internet_address_list_get_address(msg->headers->from, 0))) {
+               headers = libbalsa_message_get_headers(msg);
+               from = headers->from;
+               if (from != NULL &&
+                    (ia = internet_address_list_get_address(from, 0)) != NULL) {
                        while (ia != NULL && INTERNET_ADDRESS_IS_GROUP(ia)) {
                                ia = internet_address_list_get_address(INTERNET_ADDRESS_GROUP(
                                        ia)->members, 0);
@@ -753,9 +764,9 @@ lbs_process_queue_msg(guint                    msgno,
                net_client_smtp_msg_set_sender(new_message->smtp_msg, mailbox);
 
                /* Now need to add the recipients to the message. */
-               add_recipients(new_message->smtp_msg, msg->headers->to_list, msg->request_dsn);
-               add_recipients(new_message->smtp_msg, msg->headers->cc_list, msg->request_dsn);
-               add_recipients(new_message->smtp_msg, msg->headers->bcc_list, msg->request_dsn);
+               add_recipients(new_message->smtp_msg, headers->to_list, request_dsn);
+               add_recipients(new_message->smtp_msg, headers->cc_list, request_dsn);
+               add_recipients(new_message->smtp_msg, headers->bcc_list, request_dsn);
 
                /* Estimate the size of the message.  This need not be exact but it's better to err
                 * on the large side since some message headers may be altered during the transfer. */
@@ -931,8 +942,12 @@ static inline void
 balsa_send_message_success(MessageQueueItem *mqi,
                                                   SendMessageInfo  *info)
 {
+    LibBalsaMailbox *mailbox;
+
+    mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
+
        /* sending message successful */
-       if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+       if (mailbox != NULL) {
                gboolean remove = TRUE;
                const gchar *fccurl = libbalsa_message_get_user_header(mqi->orig, "X-Balsa-Fcc");
 
@@ -947,7 +962,7 @@ balsa_send_message_success(MessageQueueItem *mqi,
                        }
 
                        libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_NEW | 
LIBBALSA_MESSAGE_FLAG_FLAGGED);
-                       libbalsa_mailbox_sync_storage(mqi->orig->mailbox, FALSE);
+                       libbalsa_mailbox_sync_storage(mailbox, FALSE);
                        remove = libbalsa_message_copy(mqi->orig, fccbox, &err);
                        if (!remove) {
                             libbalsa_information(LIBBALSA_INFORMATION_ERROR,
@@ -968,8 +983,12 @@ static inline void
 balsa_send_message_error(MessageQueueItem *mqi,
                                                 GError           *error)
 {
+    LibBalsaMailbox *mailbox;
+
+    mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
+
        /* sending message failed */
-       if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+       if (mailbox != NULL) {
                if (ERROR_IS_TRANSIENT(error)) {
                        /* Mark it as:
                         * - neither flagged nor deleted, so it can be resent later
@@ -1015,6 +1034,9 @@ balsa_send_message_real(SendMessageInfo *info)
         for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
             MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
             gboolean send_res;
+            LibBalsaMailbox *mailbox;
+
+            mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
 
             info->curr_msg++;
             g_debug("%s: %u/%u mqi = %p", __func__, info->msg_count, info->curr_msg, mqi);
@@ -1022,13 +1044,11 @@ balsa_send_message_real(SendMessageInfo *info)
             send_res = net_client_smtp_send_msg(info->session, mqi->smtp_msg, &error);
 
             g_mutex_lock(&send_messages_lock);
-            if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+            if (mailbox != NULL) {
                 libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_FLAGGED);
             } else {
-                g_message("mqi: %p mqi->orig: %p mqi->orig->mailbox: %p\n",
-                          mqi,
-                          mqi ? mqi->orig : NULL,
-                          mqi && mqi->orig ? mqi->orig->mailbox : NULL);
+                g_message("mqi: %p mqi->orig: %p mailbox: %p\n",
+                          mqi, mqi->orig, mailbox);
             }
 
             if (send_res) {
@@ -1052,8 +1072,12 @@ balsa_send_message_real(SendMessageInfo *info)
              * without changing flags. */
             for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
                 MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
+                LibBalsaMailbox *mailbox;
+
+                mailbox = mqi->orig != NULL ?
+                    libbalsa_message_get_mailbox(mqi->orig) : NULL;
 
-                if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+                if (mailbox != NULL) {
                     libbalsa_message_change_flags(mqi->orig,
                                                   0,
                                                   LIBBALSA_MESSAGE_FLAG_FLAGGED |
@@ -1096,12 +1120,14 @@ balsa_send_message_real(SendMessageInfo *info)
 
 
 static void
-message_add_references(const LibBalsaMessage *message,
+message_add_references(LibBalsaMessage *message,
                        GMimeMessage          *msg)
 {
+    GList *list;
+
     /* If the message has references set, add them to the envelope */
-    if (message->references != NULL) {
-        GList *list = message->references;
+    list = libbalsa_message_get_references(message);
+    if (list != NULL) {
         GString *str = g_string_new(NULL);
 
         do {
@@ -1114,10 +1140,10 @@ message_add_references(const LibBalsaMessage *message,
         g_string_free(str, TRUE);
     }
 
-    if (message->in_reply_to != NULL) {
+    list = libbalsa_message_get_in_reply_to(message);
+    if (list != NULL) {
         /* There's no specific header function for In-Reply-To */
-        g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To",
-                                 message->in_reply_to->data);
+        g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To", list->data);
     }
 }
 
@@ -1195,6 +1221,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
     GMimeObject *mime_root = NULL;
     GMimeMessage *mime_message;
     LibBalsaMessageBody *body;
+    LibBalsaMessageHeaders *headers;
     InternetAddressList *ia_list;
     gchar *tmp;
     GList *list;
@@ -1205,14 +1232,16 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
 
 #ifdef HAVE_GPGME
     /* attach the public key only if we send the message, not if we just postpone it */
-    if (!postponing && message->att_pubkey && ((message->gpg_mode & LIBBALSA_PROTECT_PROTOCOL) != 0)) {
+    if (!postponing &&
+        libbalsa_message_get_att_pubkey(message) &&
+        ((libbalsa_message_get_gpg_mode(message) & LIBBALSA_PROTECT_PROTOCOL) != 0)) {
        attach_pubkey = TRUE;
     }
 #endif
 
-    body = message->body_list;
+    body = libbalsa_message_get_body_list(message);
     if ((body != NULL) && ((body->next != NULL) || attach_pubkey)) {
-        mime_root = GMIME_OBJECT(g_mime_multipart_new_with_subtype(message->subtype));
+        mime_root = GMIME_OBJECT(g_mime_multipart_new_with_subtype(libbalsa_message_get_subtype(message)));
     }
 
     while (body != NULL) {
@@ -1349,14 +1378,16 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
             g_strfreev(mime_type);
         } else if (body->buffer != NULL) {
 #ifdef HAVE_GPGME
+            guint mode;
             guint use_gpg_mode;
             LibBalsaMsgCreateResult crypt_res = LIBBALSA_MESSAGE_CREATE_OK;
 
             /* in '2440 mode, touch *only* the first body! */
-            if (!postponing && (body == body->message->body_list) &&
-                (message->gpg_mode > 0) &&
-                ((message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) != 0)) {
-                use_gpg_mode = message->gpg_mode;
+            mode = libbalsa_message_get_gpg_mode(message);
+            if (!postponing && (body == libbalsa_message_get_body_list(body->message)) &&
+                (mode > 0) &&
+                ((mode & LIBBALSA_PROTECT_OPENPGP) != 0)) {
+                use_gpg_mode = mode;
             } else {
                 use_gpg_mode = 0;
             }
@@ -1405,7 +1436,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
 #endif
 
 #ifdef HAVE_GPGME
-    if ((message->body_list != NULL) && !postponing) {
+    if ((libbalsa_message_get_body_list(message) != NULL) && !postponing) {
         LibBalsaMsgCreateResult crypt_res =
             do_multipart_crypto(message, &mime_root, parent, error);
         if (crypt_res != LIBBALSA_MESSAGE_CREATE_OK) {
@@ -1416,7 +1447,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
 
     mime_message = g_mime_message_new(TRUE);
     if (mime_root != NULL) {
-        GList *param = message->parameters;
+        GList *param = libbalsa_message_get_parameters(message);
 
         while (param != NULL) {
             gchar **vals = (gchar **)param->data;
@@ -1430,17 +1461,16 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
     }
     message_add_references(message, mime_message);
 
-    if (message->headers->from != NULL) {
-        tmp = internet_address_list_to_string(message->headers->from,
-                                              TRUE);
+    headers = libbalsa_message_get_headers(message);
+    if (headers->from != NULL) {
+        tmp = internet_address_list_to_string(headers->from, TRUE);
         if (tmp != NULL) {
             g_mime_message_set_sender(mime_message, tmp);
             g_free(tmp);
         }
     }
-    if (message->headers->reply_to != NULL) {
-        tmp = internet_address_list_to_string(message->headers->reply_to,
-                                              TRUE);
+    if (headers->reply_to != NULL) {
+        tmp = internet_address_list_to_string(headers->reply_to, TRUE);
         if (tmp != NULL) {
             g_mime_message_set_reply_to(mime_message, tmp);
             g_free(tmp);
@@ -1452,32 +1482,31 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
                                    LIBBALSA_MESSAGE_GET_SUBJECT(message));
     }
 
-    g_mime_message_set_date(mime_message, message->headers->date,
-                            get_tz_offset(message->headers->date));
+    g_mime_message_set_date(mime_message, headers->date, get_tz_offset(headers->date));
 
-    if ((ia_list = message->headers->to_list)) {
+    if ((ia_list = headers->to_list) != NULL) {
         InternetAddressList *recipients =
             g_mime_message_get_recipients(mime_message,
                                           GMIME_RECIPIENT_TYPE_TO);
         internet_address_list_append(recipients, ia_list);
     }
 
-    if ((ia_list = message->headers->cc_list)) {
+    if ((ia_list = headers->cc_list) != NULL) {
         InternetAddressList *recipients =
             g_mime_message_get_recipients(mime_message,
                                           GMIME_RECIPIENT_TYPE_CC);
         internet_address_list_append(recipients, ia_list);
     }
 
-    if ((ia_list = message->headers->bcc_list)) {
+    if ((ia_list = headers->bcc_list) != NULL) {
         InternetAddressList *recipients =
             g_mime_message_get_recipients(mime_message,
                                           GMIME_RECIPIENT_TYPE_BCC);
         internet_address_list_append(recipients, ia_list);
     }
 
-    if (message->headers->dispnotify_to != NULL) {
-        tmp = internet_address_list_to_string(message->headers->dispnotify_to, TRUE);
+    if (headers->dispnotify_to != NULL) {
+        tmp = internet_address_list_to_string(headers->dispnotify_to, TRUE);
         if (tmp != NULL) {
             g_mime_object_append_header(GMIME_OBJECT(mime_message),
                                         "Disposition-Notification-To", tmp);
@@ -1485,7 +1514,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
         }
     }
 
-    for (list = message->headers->user_hdrs; list; list = list->next) {
+    for (list = headers->user_hdrs; list; list = list->next) {
         gchar **pair = list->data;
         g_strchug(pair[1]);
         g_mime_object_append_header(GMIME_OBJECT(mime_message), pair[0], pair[1]);
@@ -1498,7 +1527,8 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
     g_mime_object_append_header(GMIME_OBJECT(mime_message), "X-Mailer", tmp);
     g_free(tmp);
 
-    message->mime_msg = mime_message;
+    libbalsa_message_set_mime_msg(message, mime_message);
+    g_object_unref(mime_message);
 
     return LIBBALSA_MESSAGE_CREATE_OK;
 }
@@ -1518,7 +1548,7 @@ libbalsa_message_postpone(LibBalsaMessage *message,
                           gboolean         flow,
                           GError         **error)
 {
-    if (!message->mime_msg
+    if (!libbalsa_message_get_mime_msg(message)
         && (libbalsa_message_create_mime_message(message, flow,
                                                  TRUE, error) !=
             LIBBALSA_MESSAGE_CREATE_OK)) {
@@ -1529,7 +1559,7 @@ libbalsa_message_postpone(LibBalsaMessage *message,
         gint i;
 
         for (i = 0; extra_headers[i] && extra_headers[i + 1]; i += 2) {
-            g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), extra_headers[i],
+            g_mime_object_set_header(GMIME_OBJECT(libbalsa_message_get_mime_msg(message)), extra_headers[i],
                                      extra_headers[i + 1]);
         }
     }
@@ -1628,7 +1658,7 @@ libbalsa_create_msg(LibBalsaMessage *message,
                     gboolean         flow,
                     GError         **error)
 {
-    if (!message->mime_msg) {
+    if (libbalsa_message_get_mime_msg(message) == NULL) {
         LibBalsaMsgCreateResult res =
             libbalsa_message_create_mime_message(message, flow,
                                                  FALSE, error);
@@ -1637,7 +1667,7 @@ libbalsa_create_msg(LibBalsaMessage *message,
         }
     }
 
-    libbalsa_set_message_id(message->mime_msg);
+    libbalsa_set_message_id(libbalsa_message_get_mime_msg(message));
 
     return LIBBALSA_MESSAGE_CREATE_OK;
 }
@@ -1651,11 +1681,13 @@ libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage  *message,
     LibBalsaMsgCreateResult result = LIBBALSA_MESSAGE_CREATE_ERROR;
 
     mqi->orig = message;
-    if (message->mime_msg != NULL) {
+    if (libbalsa_message_get_mime_msg(message) != NULL) {
+        LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(message);
+
         msg_stream = g_mime_stream_mem_new();
-        libbalsa_mailbox_lock_store(message->mailbox);
-        g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), msg_stream);
-        libbalsa_mailbox_unlock_store(message->mailbox);
+        libbalsa_mailbox_lock_store(mailbox);
+        g_mime_object_write_to_stream(GMIME_OBJECT(libbalsa_message_get_mime_msg(message)), msg_stream);
+        libbalsa_mailbox_unlock_store(mailbox);
         g_mime_stream_reset(msg_stream);
     } else {
         msg_stream = libbalsa_message_stream(message);
@@ -1705,18 +1737,17 @@ lb_send_from(LibBalsaMessage * message, gpgme_protocol_t protocol)
 
     if ((protocol == GPGME_PROTOCOL_OpenPGP) &&
         ((key_id =
-          libbalsa_identity_get_force_gpg_key_id(message->ident)) != NULL)
+          libbalsa_identity_get_force_gpg_key_id(libbalsa_message_get_identity(message))) != NULL)
         && (key_id[0] != '\0')) {
         from_id = key_id;
     } else if ((protocol == GPGME_PROTOCOL_CMS) &&
                ((key_id =
-                 libbalsa_identity_get_force_smime_key_id(message->
-                                                          ident)) != NULL)
+                 libbalsa_identity_get_force_smime_key_id(libbalsa_message_get_identity(message))) != NULL)
                && (key_id[0] != '\0')) {
         from_id = key_id;
     } else {
         InternetAddress *ia =
-            internet_address_list_get_address(message->headers->from, 0);
+            internet_address_list_get_address(libbalsa_message_get_headers(message)->from, 0);
 
         while (INTERNET_ADDRESS_IS_GROUP(ia)) {
             ia = internet_address_list_get_address(((InternetAddressGroup
@@ -1773,7 +1804,7 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
                                GtkWindow       *parent,
                                GError         **error)
 {
-    gint mode = message->gpg_mode;
+    gint mode = libbalsa_message_get_gpg_mode(message);
     gboolean always_trust = (mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
 
     switch (mode & LIBBALSA_PROTECT_MODE) {
@@ -1789,27 +1820,25 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
     case LIBBALSA_PROTECT_ENCRYPT:
     case LIBBALSA_PROTECT_SIGN | LIBBALSA_PROTECT_ENCRYPT:
     {
+        LibBalsaMessageHeaders *headers;
         GList *encrypt_for = NULL;
         gboolean result;
 
+        headers = libbalsa_message_get_headers(message);
         /* build a list containing the addresses of all to:, cc:
            and the from: address. Note: don't add bcc: addresses
            as they would be visible in the encrypted block. */
-        encrypt_for = get_mailbox_names(encrypt_for,
-                                        message->headers->to_list);
-        encrypt_for = get_mailbox_names(encrypt_for,
-                                        message->headers->cc_list);
-        encrypt_for = get_mailbox_names(encrypt_for,
-                                        message->headers->from);
-        if (message->headers->bcc_list != NULL) {
+        encrypt_for = get_mailbox_names(encrypt_for, headers->to_list);
+        encrypt_for = get_mailbox_names(encrypt_for, headers->cc_list);
+        encrypt_for = get_mailbox_names(encrypt_for, headers->from);
+        if (headers->bcc_list != NULL) {
             libbalsa_information
                 (LIBBALSA_INFORMATION_WARNING,
                 ngettext("This message will not be encrypted "
                          "for the BCC: recipient.",
                          "This message will not be encrypted "
                          "for the BCC: recipients.",
-                         internet_address_list_length
-                             (message->headers->bcc_list)));
+                         internet_address_list_length(headers->bcc_list)));
         }
 
         if (mode & LIBBALSA_PROTECT_SIGN) {
@@ -1849,27 +1878,30 @@ do_multipart_crypto(LibBalsaMessage *message,
                     GtkWindow       *parent,
                     GError         **error)
 {
+    guint mode;
     gpgme_protocol_t protocol;
     gboolean always_trust;
 
+    mode = libbalsa_message_get_gpg_mode(message);
+
     /* check if we shall do any protection */
-    if (!(message->gpg_mode & LIBBALSA_PROTECT_MODE)) {
+    if ((mode & LIBBALSA_PROTECT_MODE) == 0) {
         return LIBBALSA_MESSAGE_CREATE_OK;
     }
 
     /* check which protocol should be used */
-    if (message->gpg_mode & LIBBALSA_PROTECT_RFC3156) {
+    if (mode & LIBBALSA_PROTECT_RFC3156) {
         protocol = GPGME_PROTOCOL_OpenPGP;
-    } else if (message->gpg_mode & LIBBALSA_PROTECT_SMIMEV3) {
+    } else if (mode & LIBBALSA_PROTECT_SMIMEV3) {
         protocol = GPGME_PROTOCOL_CMS;
-    } else if (message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) {
+    } else if (mode & LIBBALSA_PROTECT_OPENPGP) {
         return LIBBALSA_MESSAGE_CREATE_OK;  /* already done... */
     } else {
         return LIBBALSA_MESSAGE_ENCRYPT_ERROR;  /* hmmm.... */
     }
-    always_trust = (message->gpg_mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
+    always_trust = (mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
     /* sign and/or encrypt */
-    switch (message->gpg_mode & LIBBALSA_PROTECT_MODE) {
+    switch (mode & LIBBALSA_PROTECT_MODE) {
     case LIBBALSA_PROTECT_SIGN:       /* sign message */
         if (!libbalsa_sign_mime_object(mime_root,
                                        lb_send_from(message, protocol),
@@ -1881,27 +1913,26 @@ do_multipart_crypto(LibBalsaMessage *message,
     case LIBBALSA_PROTECT_ENCRYPT:
     case LIBBALSA_PROTECT_ENCRYPT | LIBBALSA_PROTECT_SIGN:
     {
+        LibBalsaMessageHeaders *headers;
         GList *encrypt_for = NULL;
         gboolean success;
 
+        headers = libbalsa_message_get_headers(message);
         /* build a list containing the addresses of all to:, cc:
            and the from: address. Note: don't add bcc: addresses
            as they would be visible in the encrypted block. */
-        encrypt_for = get_mailbox_names(encrypt_for,
-                                        message->headers->to_list);
-        encrypt_for = get_mailbox_names(encrypt_for,
-                                        message->headers->cc_list);
+        encrypt_for = get_mailbox_names(encrypt_for, headers->to_list);
+        encrypt_for = get_mailbox_names(encrypt_for, headers->cc_list);
         encrypt_for = g_list_append(encrypt_for,
                                     g_strdup(lb_send_from(message, protocol)));
-        if (message->headers->bcc_list
-            && (internet_address_list_length(message->headers->
-                                             bcc_list) > 0)) {
+        if (headers->bcc_list != NULL &&
+            (internet_address_list_length(headers-> bcc_list) > 0)) {
             libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                                  _(
                                      "This message will not be encrypted for the BCC: recipient(s)."));
         }
 
-        if (message->gpg_mode & LIBBALSA_PROTECT_SIGN) {
+        if (mode & LIBBALSA_PROTECT_SIGN) {
             success =
                 libbalsa_sign_encrypt_mime_object(mime_root,
                                                   lb_send_from(message, protocol),
@@ -1923,8 +1954,7 @@ do_multipart_crypto(LibBalsaMessage *message,
     }
 
     default:
-        g_error("illegal gpg_mode %d (" __FILE__ " line %d)",
-                message->gpg_mode, __LINE__);
+        g_error("illegal gpg_mode %d (" __FILE__ " line %d)", mode, __LINE__);
     }
 
     return LIBBALSA_MESSAGE_CREATE_OK;
diff --git a/libbalsa/source-viewer.c b/libbalsa/source-viewer.c
index ee4c53c..de4e84f 100644
--- a/libbalsa/source-viewer.c
+++ b/libbalsa/source-viewer.c
@@ -117,24 +117,28 @@ lsv_escape_change_state(GSimpleAction * action,
     LibBalsaSourceViewerInfo *lsvi =
         g_object_get_data(G_OBJECT(user_data), "lsvi");
     LibBalsaMessage *msg = lsvi->msg;
+    LibBalsaMailbox *mailbox;
     GMimeStream *msg_stream;
     GMimeStream *mem_stream;
     char *raw_message;
 
-    if (!msg->mailbox) {
+    mailbox = libbalsa_message_get_mailbox(msg);
+    if (mailbox == NULL) {
        libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                             _("Mailbox closed"));
        return;
     }
-    msg_stream = libbalsa_mailbox_get_message_stream(msg->mailbox, msg->msgno,
-                                                    TRUE);
+    msg_stream =
+        libbalsa_mailbox_get_message_stream(mailbox,
+                                            libbalsa_message_get_msgno(msg),
+                                            TRUE);
     if (msg_stream == NULL)
        return;
 
     mem_stream = g_mime_stream_mem_new();
-    libbalsa_mailbox_lock_store(msg->mailbox);
+    libbalsa_mailbox_lock_store(mailbox);
     g_mime_stream_write_to_stream(msg_stream, mem_stream);
-    libbalsa_mailbox_unlock_store(msg->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
     g_mime_stream_write(mem_stream, "", 1); /* close string */
     raw_message = (char *) GMIME_STREAM_MEM(mem_stream)->buffer->data;
 
@@ -208,7 +212,7 @@ libbalsa_show_message_source(GtkApplication  * application,
     GAction *escape_action;
 
     g_return_if_fail(msg);
-    g_return_if_fail(MAILBOX_OPEN(msg->mailbox));
+    g_return_if_fail(MAILBOX_OPEN(libbalsa_message_get_mailbox(msg)));
 
     text = gtk_text_view_new();
 
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 7a163d1..6a87db9 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -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, libbalsa_mailbox_get_name(mailbox));
+                         (unsigned int) libbalsa_message_get_msgno(message), 
libbalsa_mailbox_get_name(mailbox));
         return FALSE;
     }
 
@@ -1115,17 +1115,17 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
                                 libbalsa_mailbox_get_crypto_mode(mailbox),
                                 FALSE, 1);
     /* calculate the signature summary state if not set earlier */
-    if(message->prot_state == LIBBALSA_MSG_PROTECT_NONE) {
+    if(libbalsa_message_get_prot_state(message) == LIBBALSA_MSG_PROTECT_NONE) {
         LibBalsaMsgProtectState prot_state =
-            balsa_message_scan_signatures(message->body_list, message);
+            balsa_message_scan_signatures(libbalsa_message_get_body_list(message), message);
         /* update the icon if necessary */
-        if (message->prot_state != prot_state)
-            message->prot_state = prot_state;
+        if (libbalsa_message_get_prot_state(message) != prot_state)
+            libbalsa_message_set_prot_state(message, prot_state);
     }
 #endif
 
     /* may update the icon */
-    libbalsa_mailbox_msgno_update_attach(mailbox, message->msgno, message);
+    libbalsa_mailbox_msgno_update_attach(mailbox, libbalsa_message_get_msgno(message), message);
 
     display_headers(bm);
     display_content(bm);
@@ -1143,7 +1143,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
      * present.
      *
      */
-    if (is_new && message->headers->dispnotify_to)
+    if (is_new && libbalsa_message_get_headers(message)->dispnotify_to)
         handle_mdn_request (balsa_get_parent_window(GTK_WIDGET(bm)), message);
 
     if (!gtk_tree_model_get_iter_first (gtk_tree_view_get_model(GTK_TREE_VIEW(bm->treeview)),
@@ -1161,7 +1161,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
      * emit read message
      */
     if (is_new && !libbalsa_mailbox_get_readonly(mailbox))
-        libbalsa_mailbox_msgno_change_flags(mailbox, message->msgno, 0,
+        libbalsa_mailbox_msgno_change_flags(mailbox, libbalsa_message_get_msgno(message), 0,
                                             LIBBALSA_MESSAGE_FLAG_NEW);
 
     /* restore keyboard focus to the content, if it was there before */
@@ -1214,7 +1214,7 @@ balsa_message_set_displayed_headers(BalsaMessage * bmessage,
 
     if (bmessage->message) {
         if(sh == HEADERS_ALL)
-            libbalsa_mailbox_set_msg_headers(bmessage->message->mailbox,
+            libbalsa_mailbox_set_msg_headers(libbalsa_message_get_mailbox(bmessage->message),
                                              bmessage->message);
         display_headers(bmessage);
         gtk_tree_model_foreach
@@ -1241,7 +1241,7 @@ balsa_message_set_wrap(BalsaMessage * bm, gboolean wrap)
     /* This is easier than reformating all the widgets... */
     if (bm->message) {
         LibBalsaMessage *msg = bm->message;
-        balsa_message_set(bm, msg->mailbox, msg->msgno);
+        balsa_message_set(bm, libbalsa_message_get_mailbox(msg), libbalsa_message_get_msgno(msg));
     }
 }
 
@@ -1250,8 +1250,8 @@ static void
 display_headers(BalsaMessage * bm)
 {
     balsa_mime_widget_message_set_headers_d(bm, bm->bm_widget,
-                                            bm->message->headers,
-                                            bm->message->body_list,
+                                            libbalsa_message_get_headers(bm->message),
+                                            libbalsa_message_get_body_list(bm->message),
                                             LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
 }
 
@@ -1536,7 +1536,7 @@ display_content(BalsaMessage * bm)
        g_object_unref(bm->parts_popup);
     bm->parts_popup = gtk_menu_new();
     g_object_ref_sink(bm->parts_popup);
-    display_parts(bm, bm->message->body_list, NULL, NULL);
+    display_parts(bm, libbalsa_message_get_body_list(bm->message), NULL, NULL);
     if (bm->info_count > 1) {
        gtk_widget_show(bm->parts_popup);
        gtk_widget_show
@@ -2341,22 +2341,22 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
 
     /* Check if the dispnotify_to address is equal to the (in this order,
        if present) reply_to, from or sender address. */
-    if (message->headers->reply_to)
-        use_from = message->headers->reply_to;
-    else if (message->headers->from)
-        use_from = message->headers->from;
-    else if (message->sender)
-        use_from = message->sender;
+    if (libbalsa_message_get_headers(message)->reply_to)
+        use_from = libbalsa_message_get_headers(message)->reply_to;
+    else if (libbalsa_message_get_headers(message)->from)
+        use_from = libbalsa_message_get_headers(message)->from;
+    else if (libbalsa_message_get_sender(message))
+        use_from = libbalsa_message_get_sender(message);
     else
         use_from = NULL;
     /* note: neither Disposition-Notification-To: nor Reply-To:, From: or
        Sender: may be address groups */
     from = use_from ? internet_address_list_get_address (use_from, 0) : NULL;
-    dn = internet_address_list_get_address (message->headers->dispnotify_to, 0);
+    dn = internet_address_list_get_address (libbalsa_message_get_headers(message)->dispnotify_to, 0);
     suspicious = !libbalsa_ia_rfc2821_equal(dn, from);
 
     /* Try to find "my" identity first in the to, then in the cc list */
-    list = message->headers->to_list;
+    list = libbalsa_message_get_headers(message)->to_list;
     len = list ? internet_address_list_length(list) : 0;
     for (i = 0; i < len && !mdn_ident; i++) {
         GList * id_list;
@@ -2372,7 +2372,7 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
         }
     }
 
-    list = message->headers->cc_list;
+    list = libbalsa_message_get_headers(message)->cc_list;
     for (i = 0; i < len && !mdn_ident; i++) {
         GList * id_list;
 
@@ -2411,7 +2411,7 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
         gchar *reply_to;
         sender = from ? internet_address_to_string (from, FALSE) : NULL;
         reply_to =
-            internet_address_list_to_string (message->headers->dispnotify_to,
+            internet_address_list_to_string (libbalsa_message_get_headers(message)->dispnotify_to,
                                             FALSE);
         gtk_widget_show (create_mdn_dialog (parent, sender, reply_to, mdn,
                                                 mdn_ident));
@@ -2441,6 +2441,7 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
                                           gboolean manual)
 {
     LibBalsaMessage *message;
+    LibBalsaMessageHeaders *headers;
     LibBalsaMessageBody *body;
     gchar *date, *dummy;
     GString *report;
@@ -2450,27 +2451,28 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
 
     /* create a message with the header set from the incoming message */
     message = libbalsa_message_new();
-    message->headers->from = internet_address_list_new();
-    internet_address_list_add(message->headers->from,
+    headers = libbalsa_message_get_headers(message);
+    headers->from = internet_address_list_new();
+    internet_address_list_add(headers->from,
                               libbalsa_identity_get_address(balsa_app.current_ident));
-    message->headers->date = time(NULL);
+    headers->date = time(NULL);
     libbalsa_message_set_subject(message, "Message Disposition Notification");
-    message->headers->to_list = internet_address_list_new ();
-    internet_address_list_append(message->headers->to_list,
-                                 for_msg->headers->dispnotify_to);
+    headers->to_list = internet_address_list_new ();
+    internet_address_list_append(headers->to_list,
+                                 libbalsa_message_get_headers(for_msg)->dispnotify_to);
 
     /* RFC 2298 requests this mime type... */
-    message->subtype = g_strdup("report");
+    libbalsa_message_set_subtype(message, g_strdup("report"));
     params = g_new(gchar *, 3);
     params[0] = g_strdup("report-type");
     params[1] = g_strdup("disposition-notification");
     params[2] = NULL;
-    message->parameters = g_list_prepend(message->parameters, params);
+    libbalsa_message_set_parameters(message, g_list_prepend(libbalsa_message_get_parameters(message), 
params));
 
     /* the first part of the body is an informational note */
     body = libbalsa_message_body_new(message);
     date = libbalsa_message_date_to_utf8(for_msg, balsa_app.date_string);
-    dummy = internet_address_list_to_string(for_msg->headers->to_list, FALSE);
+    dummy = internet_address_list_to_string(libbalsa_message_get_headers(for_msg)->to_list, FALSE);
     body->buffer = g_strdup_printf(
         "The message sent on %s to %s with subject ā€œ%sā€ has been displayed.\n"
         "There is no guarantee that the message has been read or understood.\n\n",
@@ -2500,9 +2502,9 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
                            INTERNET_ADDRESS_MAILBOX
                            (libbalsa_identity_get_address
                             (balsa_app.current_ident))->addr);
-    if (for_msg->message_id)
+    if (libbalsa_message_get_message_id(for_msg))
         g_string_append_printf(report, "Original-Message-ID: <%s>\n",
-                               for_msg->message_id);
+                               libbalsa_message_get_message_id(for_msg));
     g_string_append_printf(report,
                           "Disposition: %s-action/MDN-sent-%sly; displayed",
                           manual ? "manual" : "automatic",
@@ -2639,7 +2641,7 @@ balsa_message_scan_signatures(LibBalsaMessageBody *body,
 {
     LibBalsaMsgProtectState result = LIBBALSA_MSG_PROTECT_NONE;
 
-    g_return_val_if_fail(message->headers != NULL, result);
+    g_return_val_if_fail(libbalsa_message_get_headers(message) != NULL, result);
 
     while (body) {
        LibBalsaMsgProtectState this_part_state =
@@ -2751,7 +2753,7 @@ libbalsa_msg_try_decrypt(LibBalsaMessage * message, LibBalsaMessageBody * body,
         * adds an extra ref) leads to a crash if we have both the encrypted and
         * the unencrypted version open as the body chain of the first one will be
         * unref'd. */
-       if (message->body_ref > chk_crypto->max_ref) {
+       if (libbalsa_message_get_body_ref(message) > chk_crypto->max_ref) {
            if (chk_crypto->chk_mode == LB_MAILBOX_CHK_CRYPT_ALWAYS) {
                libbalsa_information
                    (LIBBALSA_INFORMATION_ERROR,
@@ -2963,6 +2965,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
 {
     gpgme_error_t sig_res;
     GMimePartRfc2440Mode rfc2440mode;
+    LibBalsaMailbox *mailbox;
 
     /* multiparts or complete messages can not be RFC 2440 protected */
     if (body->body_type == LIBBALSA_MESSAGE_BODY_TYPE_MESSAGE ||
@@ -2991,9 +2994,11 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
     /* check if this is a RFC2440 part */
     if (!GMIME_IS_PART(body->mime_part))
        return;
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+
+    mailbox = libbalsa_message_get_mailbox(body->message);
+    libbalsa_mailbox_lock_store(mailbox);
     rfc2440mode = g_mime_part_check_rfc2440(GMIME_PART(body->mime_part));
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
 
     /* if not, or if we have more than one instance of this message open, eject
        (see remark for libbalsa_msg_try_decrypt above) - remember that
@@ -3001,7 +3006,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
        (i.e. RFC2440 stuff removed) one! */
     if (rfc2440mode == GMIME_PART_RFC2440_NONE)
        return;
-    if (message->body_ref > chk_crypto->max_ref) {
+    if (libbalsa_message_get_body_ref(message) > chk_crypto->max_ref) {
        if (chk_crypto->chk_mode == LB_MAILBOX_CHK_CRYPT_ALWAYS) {
             libbalsa_information
                 (LIBBALSA_INFORMATION_ERROR, "%s\n%s",
@@ -3020,7 +3025,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
     }
 
     /* do the rfc2440 stuff */
-    libbalsa_mailbox_lock_store(body->message->mailbox);
+    libbalsa_mailbox_lock_store(mailbox);
     if (rfc2440mode == GMIME_PART_RFC2440_SIGNED)
         sig_res =
             libbalsa_rfc2440_verify(GMIME_PART(body->mime_part),
@@ -3038,7 +3043,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
            body->charset = NULL;
        }
     }
-    libbalsa_mailbox_unlock_store(body->message->mailbox);
+    libbalsa_mailbox_unlock_store(mailbox);
 
     if (body->sig_info && sig_res == GPG_ERR_NO_ERROR) {
         if ((g_mime_gpgme_sigstat_get_summary(body->sig_info) & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
@@ -3122,7 +3127,7 @@ balsa_message_perform_crypto(LibBalsaMessage * message,
 {
     chk_crypto_t chk_crypto;
 
-    if (!message->body_list)
+    if (!libbalsa_message_get_body_list(message))
        return;
 
     /* check if the user requested to ignore any crypto stuff */
@@ -3133,15 +3138,16 @@ balsa_message_perform_crypto(LibBalsaMessage * message,
     chk_crypto.chk_mode = chk_mode;
     chk_crypto.no_mp_signed = no_mp_signed;
     chk_crypto.max_ref = max_ref;
-    chk_crypto.sender = balsa_message_sender_to_gchar(message->headers->from, -1);
+    chk_crypto.sender = balsa_message_sender_to_gchar(libbalsa_message_get_headers(message)->from, -1);
     chk_crypto.subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(message));
     libbalsa_utf8_sanitize(&chk_crypto.subject, balsa_app.convert_unknown_8bit,
                           NULL);
 
     /* do the real work */
-    message->body_list =
-       libbalsa_msg_perform_crypto_real(message, message->body_list,
-                                        &chk_crypto);
+    libbalsa_message_set_body_list(message,
+       libbalsa_msg_perform_crypto_real(message,
+                                         libbalsa_message_get_body_list(message),
+                                        &chk_crypto));
 
     /* clean up */
     g_free(chk_crypto.subject);
@@ -3183,15 +3189,15 @@ message_recheck_crypto_cb(GtkWidget * button, BalsaMessage * bm)
 
     /* calculate the signature summary state */
     prot_state =
-        balsa_message_scan_signatures(message->body_list, message);
+        balsa_message_scan_signatures(libbalsa_message_get_body_list(message), message);
 
     /* update the icon if necessary */
-    if (message->prot_state != prot_state)
-        message->prot_state = prot_state;
+    if (libbalsa_message_get_prot_state(message) != prot_state)
+        libbalsa_message_set_prot_state(message, prot_state);
 
     /* may update the icon */
-    libbalsa_mailbox_msgno_update_attach(bm->message->mailbox,
-                                        bm->message->msgno, bm->message);
+    libbalsa_mailbox_msgno_update_attach(libbalsa_message_get_mailbox(bm->message),
+                                        libbalsa_message_get_msgno(bm->message), bm->message);
 
     display_headers(bm);
     display_content(bm);
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index 9a282f9..a4a16f9 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -334,6 +334,7 @@ static void
 extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
 {
     LibBalsaMessage *message;
+    LibBalsaMessageHeaders *headers;
     LibBalsaMessageBody *body;
     gchar *data;
     GError *err = NULL;
@@ -341,8 +342,9 @@ extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
 
     /* create a message */
     message = libbalsa_message_new();
-    message->headers->from = internet_address_list_new();
-    internet_address_list_add(message->headers->from,
+    headers = libbalsa_message_get_headers(message);
+    headers->from = internet_address_list_new();
+    internet_address_list_add(headers->from,
                               libbalsa_identity_get_address(balsa_app.current_ident));
 
     data = libbalsa_message_body_get_parameter(mime_body, "subject");
@@ -352,7 +354,7 @@ extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
     }
 
     data = libbalsa_message_body_get_parameter(mime_body, "server");
-    message->headers->to_list = internet_address_list_parse_string(data);
+    headers->to_list = internet_address_list_parse_string(data);
     g_free(data);
 
     /* the original body my have some data to be returned as commands... */
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index d3eaf00..4a68617 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -1307,10 +1307,9 @@ check_text_encoding(BalsaMessage * bm, gchar *text_buf)
                                 &target_cs)
         && !g_object_get_data(G_OBJECT(bm->message),
                               BALSA_MIME_WIDGET_NEW_TEXT_NOTIFIED)) {
-        gchar *from =
-            balsa_message_sender_to_gchar(bm->message->headers->from, 0);
-        gchar *subject =
-            g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
+        LibBalsaMessageHeaders *headers = libbalsa_message_get_headers(bm->message);
+        gchar *from = balsa_message_sender_to_gchar(headers->from, 0);
+        gchar *subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
 
         libbalsa_utf8_sanitize(&from,    balsa_app.convert_unknown_8bit,
                                NULL);
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index b293abd..c61c2c7 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -75,18 +75,17 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
     /* a reply may be created only for unread requests */
     if ((vcal_obj->method == ITIP_REQUEST) &&
        LIBBALSA_MESSAGE_IS_UNREAD(lbm)) {
+        LibBalsaMessageHeaders *headers;
+
+        headers = libbalsa_message_get_headers(lbm);
        may_reply = TRUE;
-       if (lbm->headers) {
-           if (lbm->headers->reply_to)
-                sender =
-                    internet_address_list_get_address(lbm->headers->
-                                                      reply_to, 0);
-           else if (lbm->headers && lbm->headers->from)
-                sender =
-                    internet_address_list_get_address(lbm->headers->from,
-                                                      0);
-       } else if (lbm->sender)
-           sender = internet_address_list_get_address(lbm->sender, 0);
+       if (headers != NULL) {
+           if (headers->reply_to != NULL)
+                sender = internet_address_list_get_address(headers-> reply_to, 0);
+           else if (headers->from != NULL)
+                sender = internet_address_list_get_address(headers->from, 0);
+       } else if (libbalsa_message_get_sender(lbm))
+           sender = internet_address_list_get_address(libbalsa_message_get_sender(lbm), 0);
     }
 
     /* add events */
@@ -297,10 +296,10 @@ vevent_reply(GObject * button, GtkWidget * box)
 
     /* create a message with the header set from the incoming message */
     message = libbalsa_message_new();
-    message->headers->from = internet_address_list_new();
-    internet_address_list_add(message->headers->from, ia);
-    message->headers->to_list = internet_address_list_parse_string(rcpt);
-    message->headers->date = time(NULL);
+    libbalsa_message_get_headers(message)->from = internet_address_list_new();
+    internet_address_list_add(libbalsa_message_get_headers(message)->from, ia);
+    libbalsa_message_get_headers(message)->to_list = internet_address_list_parse_string(rcpt);
+    libbalsa_message_get_headers(message)->date = time(NULL);
 
     /* create the message subject */
     dummy = g_strdup_printf("%s: %s",
@@ -324,7 +323,8 @@ vevent_reply(GObject * button, GtkWidget * box)
     params[0] = g_strdup("method");
     params[1] = g_strdup("reply");
     params[2] = NULL;
-    message->parameters = g_list_prepend(message->parameters, params);
+    libbalsa_message_set_parameters(message,
+            g_list_prepend(libbalsa_message_get_parameters(message), params));
 
     result = libbalsa_message_send(message, balsa_app.outbox, NULL,
                                   balsa_find_sentbox_by_url,
diff --git a/src/balsa-mime-widget.c b/src/balsa-mime-widget.c
index ff98c99..35d2a70 100644
--- a/src/balsa-mime-widget.c
+++ b/src/balsa-mime-widget.c
@@ -189,7 +189,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
     /* on local mailboxes only, to avoid possibly long downloads */
     if ((content_type == NULL ||
         g_ascii_strcasecmp(content_type, "application/octet-stream") == 0)
-       && LIBBALSA_IS_MAILBOX_LOCAL(mime_body->message->mailbox)) {
+       && LIBBALSA_IS_MAILBOX_LOCAL(libbalsa_message_get_mailbox(mime_body->message))) {
         GError *err = NULL;
        GMimeStream *stream = 
             libbalsa_message_body_get_stream(mime_body, &err);
diff --git a/src/balsa-print-object-header.c b/src/balsa-print-object-header.c
index 4864d9e..f0f4c9f 100644
--- a/src/balsa-print-object-header.c
+++ b/src/balsa-print-object-header.c
@@ -332,9 +332,13 @@ balsa_print_object_header_from_message(GList *list,
                                       const gchar * subject,
                                       BalsaPrintSetup * psetup)
 {
+    LibBalsaMessageBody *body_list;
+    LibBalsaMessageHeaders *headers;
+
+    body_list = libbalsa_message_get_body_list(message);
+    headers = libbalsa_message_get_headers(message);
     return balsa_print_object_header_new_real(list, context,
-                                             message->body_list,
-                                             message->headers, subject,
+                                             body_list, headers, subject,
                                              psetup, FALSE);
 }
 
diff --git a/src/main-window.c b/src/main-window.c
index 13b9c92..0d2a390 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -4242,7 +4242,7 @@ bw_index_changed_cb(GtkWidget * widget, gpointer data)
     bw_enable_mailbox_menus(window, index);
 
     current_msgno = BALSA_MESSAGE(window->preview)->message ?
-        BALSA_MESSAGE(window->preview)->message->msgno : 0;
+        libbalsa_message_get_msgno(BALSA_MESSAGE(window->preview)->message) : 0;
 
     if (current_msgno != index->current_msgno)
         bw_idle_replace(window, index);
diff --git a/src/message-window.c b/src/message-window.c
index 4fcc744..097891b 100644
--- a/src/message-window.c
+++ b/src/message-window.c
@@ -115,7 +115,7 @@ message_window_idle_handler(MessageWindow * mw)
     mw->idle_handler_id = 0;
 
     msg = BALSA_MESSAGE(mw->bmessage);
-    if (!balsa_message_set(msg, mw->message->mailbox, mw->message->msgno)) {
+    if (!balsa_message_set(msg, libbalsa_message_get_mailbox(mw->message), 
libbalsa_message_get_msgno(mw->message))) {
         gtk_widget_destroy(mw->window);
         return FALSE;
     }
@@ -303,9 +303,9 @@ mw_menubar_foreach(GtkWidget *widget, gpointer data)
 static void
 mw_set_buttons_sensitive(MessageWindow * mw)
 {
-    LibBalsaMailbox *mailbox = mw->message->mailbox;
+    LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(mw->message);
     BalsaIndex *index = mw->bindex;
-    guint current_msgno = mw->message->msgno;
+    guint current_msgno = libbalsa_message_get_msgno(mw->message);
     gboolean enable;
 
     if (!mailbox) {
@@ -386,7 +386,7 @@ destroy_message_window(GtkWidget * widget, MessageWindow * mw)
 static void
 mw_expunged_cb(LibBalsaMailbox * mailbox, guint msgno, MessageWindow * mw)
 {
-    if (mw->message && (guint) mw->message->msgno == msgno)
+    if (mw->message && (guint) libbalsa_message_get_msgno(mw->message) == msgno)
         gtk_widget_destroy(mw->window);
 }
 
@@ -398,7 +398,7 @@ mw_reply_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+    sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message), libbalsa_message_get_msgno(mw->message),
                          SEND_REPLY);
 }
 
@@ -410,7 +410,7 @@ mw_reply_all_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+    sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message), libbalsa_message_get_msgno(mw->message),
                          SEND_REPLY_ALL);
 }
 
@@ -422,7 +422,7 @@ mw_reply_group_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+    sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message), libbalsa_message_get_msgno(mw->message),
                          SEND_REPLY_GROUP);
 }
 
@@ -434,7 +434,7 @@ mw_forward_attached_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_forward(mw->message->mailbox, mw->message->msgno, TRUE);
+    sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message), 
libbalsa_message_get_msgno(mw->message), TRUE);
 }
 
 static void
@@ -445,7 +445,7 @@ mw_forward_inline_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_forward(mw->message->mailbox, mw->message->msgno,
+    sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message), 
libbalsa_message_get_msgno(mw->message),
                            FALSE);
 }
 
@@ -458,7 +458,7 @@ mw_forward_default_activated(GSimpleAction * action, GVariant * parameter,
 
     g_return_if_fail(mw != NULL);
 
-    sendmsg_window_forward(mw->message->mailbox, mw->message->msgno,
+    sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message), 
libbalsa_message_get_msgno(mw->message),
                            balsa_app.forward_attached);
 }
 #endif
@@ -568,10 +568,10 @@ mw_set_selected(MessageWindow * mw, void (*select_func) (BalsaIndex *))
     LibBalsaMessage *message;
     MessageWindow *tmp;
 
-    balsa_index_set_next_msgno(mw->bindex, mw->message->msgno);
+    balsa_index_set_next_msgno(mw->bindex, libbalsa_message_get_msgno(mw->message));
     select_func(mw->bindex);
     msgno = balsa_index_get_next_msgno(mw->bindex);
-    message = libbalsa_mailbox_get_message(mw->message->mailbox, msgno);
+    message = libbalsa_mailbox_get_message(libbalsa_message_get_mailbox(mw->message), msgno);
     if (!message)
         return;
 
@@ -593,16 +593,18 @@ static void
 message_window_move_message(MessageWindow * mw, LibBalsaMailbox * mailbox)
 {
     GArray *messages;
+    glong msgno;
     LibBalsaMessage *original = mw->message;
 
     g_return_if_fail(mailbox != NULL);
 
     /* Transferring to same mailbox? */
-    if (mw->message->mailbox == mailbox)
+    if (libbalsa_message_get_mailbox(mw->message) == mailbox)
         return;
 
     messages = g_array_new(FALSE, FALSE, sizeof(guint));
-    g_array_append_val(messages, mw->message->msgno);
+    msgno = libbalsa_message_get_msgno(mw->message);
+    g_array_append_val(messages, msgno);
 
     if (balsa_app.mw_action_after_move == NEXT_UNREAD)
         /* Try selecting the next unread message. */
@@ -739,8 +741,10 @@ mw_select_part_cb(BalsaMessage * bm, gpointer data)
 
     /* set window title */
     if (bm && bm->message) {
-        from = internet_address_list_to_string(bm->message->headers->from,
-                                               FALSE);
+        LibBalsaMessageHeaders *headers;
+
+        headers = libbalsa_message_get_headers(bm->message);
+        from = internet_address_list_to_string(headers->from, FALSE);
         title = g_strdup_printf(_("Message from %s: %s"), from,
                                 LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
         g_free(from);
diff --git a/src/print-gtk.c b/src/print-gtk.c
index 74f32a6..5060f53 100644
--- a/src/print-gtk.c
+++ b/src/print-gtk.c
@@ -224,6 +224,7 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
     gchar *subject;
     gchar *date;
     GString *footer_string;
+    LibBalsaMessageHeaders *headers;
 
     /* initialise the context */
     page_setup = gtk_print_context_get_page_setup(context);
@@ -285,9 +286,9 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
        footer_string = g_string_new(date);
     g_free(date);
 
-    if (pdata->message->headers->from) {
-       gchar *from =
-           internet_address_list_to_string(pdata->message->headers->from, FALSE);
+    headers = libbalsa_message_get_headers(pdata->message);
+    if (headers->from != NULL) {
+       gchar *from = internet_address_list_to_string(headers->from, FALSE);
 
        libbalsa_utf8_sanitize(&from, balsa_app.convert_unknown_8bit,
                               NULL);
@@ -325,15 +326,15 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
 
     /* add the message headers */
     pdata->setup.c_y_pos = 0.0;        /* to simplify calculating the layout... */
-    pdata->print_parts = 
+    pdata->print_parts =
        balsa_print_object_header_from_message(NULL, context, pdata->message,
                                               subject, &pdata->setup);
     g_free(subject);
 
     /* add the mime bodies */
-    pdata->print_parts = 
+    pdata->print_parts =
        scan_body(pdata->print_parts, context, &pdata->setup,
-                 pdata->message->body_list, FALSE);
+                 libbalsa_message_get_body_list(pdata->message), FALSE);
 
     /* done */
     gtk_print_operation_set_n_pages(operation, pdata->setup.page_count);
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index 60b8282..7ed8499 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -483,10 +483,15 @@ sw_delete_draft(BalsaSendmsg * bsmsg)
     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);
+    if (message != NULL) {
+        LibBalsaMailbox *mailbox;
+
+        mailbox = libbalsa_message_get_mailbox(message);
+        if (mailbox != NULL && !libbalsa_mailbox_get_readonly(mailbox)) {
+            libbalsa_message_change_flags(message,
+                                          LIBBALSA_MESSAGE_FLAG_DELETED, 0);
+        }
+    }
 }
 
 static gboolean
@@ -602,24 +607,30 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
     }
     if(balsa_app.debug) g_message("balsa_sendmsg_destroy()_handler: Start.");
 
-    if (bsmsg->parent_message) {
-       if (bsmsg->parent_message->mailbox)
-           libbalsa_mailbox_close(bsmsg->parent_message->mailbox,
+    if (bsmsg->parent_message != NULL) {
+        LibBalsaMailbox *mailbox;
+
+        mailbox = libbalsa_message_get_mailbox(bsmsg->parent_message);
+       if (mailbox != NULL) {
+           libbalsa_mailbox_close(mailbox,
                    /* Respect pref setting: */
                                   balsa_app.expunge_on_close);
-       g_object_unref(G_OBJECT(bsmsg->parent_message));
-        bsmsg->parent_message = NULL;
+        }
+       g_clear_object(&bsmsg->parent_message);
     }
 
     if (bsmsg->draft_message) {
+        LibBalsaMailbox *mailbox;
+
         g_object_set_data(G_OBJECT(bsmsg->draft_message),
                           BALSA_SENDMSG_WINDOW_KEY, NULL);
-       if (bsmsg->draft_message->mailbox)
-           libbalsa_mailbox_close(bsmsg->draft_message->mailbox,
+        mailbox = libbalsa_message_get_mailbox(bsmsg->draft_message);
+       if (mailbox != NULL) {
+           libbalsa_mailbox_close(mailbox,
                    /* Respect pref setting: */
                                   balsa_app.expunge_on_close);
-       g_object_unref(G_OBJECT(bsmsg->draft_message));
-        bsmsg->draft_message = NULL;
+        }
+       g_clear_object(&bsmsg->draft_message);
     }
 
     if (balsa_app.debug)
@@ -1194,9 +1205,11 @@ update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
     } else {
         if ( (replen == 0 && reply_type) ||
              (fwdlen == 0 && forward_type) ) {
-            LibBalsaMessage *msg = bsmsg->parent_message ?
+            LibBalsaMessage *message = bsmsg->parent_message != NULL ?
                 bsmsg->parent_message : bsmsg->draft_message;
-            bsmsg_set_subject_from_body(bsmsg, msg->body_list, ident);
+            bsmsg_set_subject_from_body(bsmsg,
+                                        libbalsa_message_get_body_list(message),
+                                        ident);
         }
     }
 
@@ -2595,10 +2608,16 @@ create_info_pane(BalsaSendmsg * bsmsg)
         balsa_mblist_mru_add(&balsa_app.fcc_mru, "");
         balsa_app.fcc_mru = g_list_reverse(balsa_app.fcc_mru);
     }
-    if (bsmsg->draft_message && bsmsg->draft_message->headers &&
-       bsmsg->draft_message->headers->fcc_url)
-        balsa_mblist_mru_add(&balsa_app.fcc_mru,
-                             bsmsg->draft_message->headers->fcc_url);
+
+    if (bsmsg->draft_message != NULL) {
+        LibBalsaMessageHeaders *headers;
+
+        headers = libbalsa_message_get_headers(bsmsg->draft_message);
+        if (headers != NULL && headers->fcc_url != NULL) {
+            balsa_mblist_mru_add(&balsa_app.fcc_mru, headers->fcc_url);
+        }
+    }
+
     bsmsg->fcc[1] =
         balsa_mblist_mru_option_menu(GTK_WINDOW(bsmsg->window),
                                      &balsa_app.fcc_mru);
@@ -2976,7 +2995,7 @@ continue_body(BalsaSendmsg * bsmsg, LibBalsaMessage * message)
 {
     LibBalsaMessageBody *body;
 
-    body = message->body_list;
+    body = libbalsa_message_get_body_list(message);
     if (body) {
        if (libbalsa_message_body_type(body) == LIBBALSA_MESSAGE_BODY_TYPE_MULTIPART)
            body = body->parts;
@@ -3046,14 +3065,19 @@ continue_body(BalsaSendmsg * bsmsg, LibBalsaMessage * message)
 static gchar*
 message_part_get_subject(LibBalsaMessageBody *part)
 {
-    gchar *subject = NULL;
-    if(part->embhdrs && part->embhdrs->subject)
-        subject = g_strdup(part->embhdrs->subject);
-    else if(part->message && part->message->subj)
-        subject = g_strdup(part->message->subj);
-    else subject = g_strdup(_("No subject"));
-    libbalsa_utf8_sanitize(&subject, balsa_app.convert_unknown_8bit,
-                          NULL);
+    const gchar *subj = NULL;
+    gchar *subject;
+
+    if (part->embhdrs != NULL)
+        subj = part->embhdrs->subject;
+    if (subj == NULL && part->message != NULL)
+        subj = libbalsa_message_get_subject(part->message);
+    if (subj == NULL)
+        subj = _("No subject");
+
+    subject = g_strdup(subj);
+    libbalsa_utf8_sanitize(&subject, balsa_app.convert_unknown_8bit, NULL);
+
     return subject;
 }
 
@@ -3624,8 +3648,12 @@ quote_message_body(BalsaSendmsg * bsmsg,
 {
     GString *res;
     if(libbalsa_message_body_ref(message, FALSE, FALSE)) {
-        res = quote_body(bsmsg, message->headers, message->message_id,
-                         message->references, message->body_list, qtype);
+        res = quote_body(bsmsg,
+                         libbalsa_message_get_headers(message),
+                         libbalsa_message_get_message_id(message),
+                         libbalsa_message_get_references(message),
+                         libbalsa_message_get_body_list(message),
+                         qtype);
         libbalsa_message_body_unref(message);
     } else res = g_string_new("");
     return res;
@@ -3635,8 +3663,12 @@ static void
 fill_body_from_message(BalsaSendmsg *bsmsg, LibBalsaMessage *message,
                        QuoteType qtype)
 {
-    fill_body_from_part(bsmsg, message->headers, message->message_id,
-                        message->references, message->body_list, qtype);
+    fill_body_from_part(bsmsg,
+                        libbalsa_message_get_headers(message),
+                        libbalsa_message_get_message_id(message),
+                        libbalsa_message_get_references(message),
+                        libbalsa_message_get_body_list(message),
+                        qtype);
 }
 
 
@@ -3784,7 +3816,8 @@ bsmsg_set_subject_from_body(BalsaSendmsg * bsmsg,
         case SEND_FORWARD_ATTACH:
         case SEND_FORWARD_INLINE:
             headers =
-                part->embhdrs ? part->embhdrs : part->message->headers;
+                part->embhdrs != NULL? part->embhdrs :
+                libbalsa_message_get_headers(part->message);
             newsubject =
                 generate_forwarded_subject(subject, headers, ident);
             break;
@@ -3823,14 +3856,18 @@ sw_save_draft(BalsaSendmsg * bsmsg)
        return FALSE;
     }
 
-    if (bsmsg->draft_message) {
+    if (bsmsg->draft_message != NULL) {
+        LibBalsaMailbox *mailbox;
+
         g_object_set_data(G_OBJECT(bsmsg->draft_message),
                           BALSA_SENDMSG_WINDOW_KEY, NULL);
-       if (bsmsg->draft_message->mailbox)
-           libbalsa_mailbox_close(bsmsg->draft_message->mailbox,
+        mailbox = libbalsa_message_get_mailbox(bsmsg->draft_message);
+       if (mailbox != NULL) {
+           libbalsa_mailbox_close(mailbox,
                    /* Respect pref setting: */
                                   balsa_app.expunge_on_close);
-       g_object_unref(G_OBJECT(bsmsg->draft_message));
+        }
+       g_object_unref(bsmsg->draft_message);
     }
     bsmsg->state = SENDMSG_STATE_CLEAN;
 
@@ -3861,7 +3898,10 @@ sw_autosave_timeout_cb(BalsaSendmsg * bsmsg)
 static void
 setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
 {
-    g_return_if_fail(message->headers);
+    LibBalsaMessageHeaders *headers;
+
+    headers = libbalsa_message_get_headers(message);
+    g_return_if_fail(headers!= NULL);
 
     /* Try to make the blank line in the address view useful;
      * - never make it a Bcc: line;
@@ -3871,13 +3911,13 @@ setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
      * will be a To: line */
     libbalsa_address_view_set_from_list(bsmsg->recipient_view,
                                         "BCC:",
-                                        message->headers->bcc_list);
+                                        headers->bcc_list);
     libbalsa_address_view_set_from_list(bsmsg->recipient_view,
                                         "To:",
-                                        message->headers->to_list);
+                                        headers->to_list);
     libbalsa_address_view_set_from_list(bsmsg->recipient_view,
                                         "CC:",
-                                        message->headers->cc_list);
+                                        headers->cc_list);
 }
 
 
@@ -3888,30 +3928,33 @@ setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
  * the message.
  **/
 static gboolean
-set_identity_from_mailbox(BalsaSendmsg* bsmsg, LibBalsaMessage * message)
+set_identity_from_mailbox(BalsaSendmsg * bsmsg, LibBalsaMessage * message)
 {
-    if( message && message->mailbox && balsa_app.identities) {
-        const gchar *identity;
-        GList *ilist;
+    if (message != NULL && balsa_app.identities != NULL) {
+        LibBalsaMailbox *mailbox;
 
-        identity = libbalsa_mailbox_get_identity_name(message->mailbox);
-        if (identity == NULL)
-            return FALSE;
+        mailbox = libbalsa_message_get_mailbox(message);
+        if (mailbox != NULL) {
+            const gchar *identity;
+            GList *list;
 
-        for (ilist = balsa_app.identities;
-             ilist != NULL;
-             ilist = ilist->next) {
-            LibBalsaIdentity *ident = LIBBALSA_IDENTITY(ilist->data);
+            identity = libbalsa_mailbox_get_identity_name(mailbox);
+            if (identity == NULL)
+                return FALSE;
 
-            if (g_ascii_strcasecmp(libbalsa_identity_get_identity_name(ident),
-                                   identity) == 0) {
-                bsmsg->ident = ident;
-                return TRUE;
+            for (list = balsa_app.identities; list != NULL; list = list->next) {
+                LibBalsaIdentity *ident = LIBBALSA_IDENTITY(list->data);
+
+                if (g_ascii_strcasecmp(libbalsa_identity_get_identity_name(ident),
+                                       identity) == 0) {
+                    bsmsg->ident = ident;
+                    return TRUE;
+                }
             }
         }
     }
 
-    return FALSE; /* use default */
+    return FALSE;               /* use default */
 }
 
 /*
@@ -3963,21 +4006,24 @@ guess_identity_from_list(BalsaSendmsg * bsmsg, InternetAddressList * list,
 static gboolean
 guess_identity(BalsaSendmsg* bsmsg, LibBalsaMessage * message)
 {
-    if (!message  || !message->headers || !balsa_app.identities)
+    LibBalsaMessageHeaders *headers;
+
+    if (message == NULL || balsa_app.identities == NULL)
         return FALSE; /* use default */
 
+    headers = libbalsa_message_get_headers(message);
+    if (headers == NULL)
+        return FALSE;
+
     if (bsmsg->is_continue)
-        return guess_identity_from_list(bsmsg, message->headers->from,
-                                        FALSE);
+        return guess_identity_from_list(bsmsg, headers->from, FALSE);
 
     if (bsmsg->type != SEND_NORMAL)
        /* bsmsg->type == SEND_REPLY || bsmsg->type == SEND_REPLY_ALL ||
        *  bsmsg->type == SEND_REPLY_GROUP || bsmsg->type == SEND_FORWARD_ATTACH ||
        *  bsmsg->type == SEND_FORWARD_INLINE */
-        return guess_identity_from_list(bsmsg, message->headers->to_list,
-                                        TRUE)
-            || guess_identity_from_list(bsmsg, message->headers->cc_list,
-                                        TRUE);
+        return guess_identity_from_list(bsmsg, headers->to_list, TRUE)
+            || guess_identity_from_list(bsmsg, headers->cc_list, TRUE);
 
     return FALSE;
 }
@@ -4247,8 +4293,11 @@ insert_initial_sig(BalsaSendmsg *bsmsg)
 static void
 bsm_prepare_for_setup(LibBalsaMessage *message)
 {
-    if (message->mailbox)
-        libbalsa_mailbox_open(message->mailbox, NULL);
+    LibBalsaMailbox *mailbox;
+
+    mailbox = libbalsa_message_get_mailbox(message);
+    if (mailbox != NULL)
+        libbalsa_mailbox_open(mailbox, NULL);
     /* fill in that info:
      * ref the message so that we have all needed headers */
     libbalsa_message_body_ref(message, TRUE, TRUE);
@@ -4268,9 +4317,14 @@ bsm_finish_setup(BalsaSendmsg *bsmsg, LibBalsaMessageBody *part)
     g_return_if_fail(part != NULL);
     g_return_if_fail(part->message != NULL);
 
-    if (part->message->mailbox &&
-        !bsmsg->parent_message && !bsmsg->draft_message)
-        libbalsa_mailbox_close(part->message->mailbox, FALSE);
+    if (!bsmsg->parent_message && !bsmsg->draft_message) {
+        LibBalsaMailbox *mailbox;
+
+        mailbox = libbalsa_message_get_mailbox(part->message);
+        if (mailbox != NULL)
+            libbalsa_mailbox_close(mailbox, FALSE);
+    }
+
     /* ...but mark it as unmodified. */
     bsmsg->state = SENDMSG_STATE_CLEAN;
     bsmsg_set_subject_from_body(bsmsg, part, bsmsg->ident);
@@ -4817,6 +4871,7 @@ static LibBalsaMessage *
 bsmsg2message(BalsaSendmsg * bsmsg)
 {
     LibBalsaMessage *message;
+    LibBalsaMessageHeaders *headers;
     LibBalsaMessageBody *body;
     gchar *tmp;
     GtkTextIter start, end;
@@ -4827,21 +4882,22 @@ bsmsg2message(BalsaSendmsg * bsmsg)
 
     message = libbalsa_message_new();
 
-    message->headers->from = internet_address_list_new ();
-    internet_address_list_add(message->headers->from, ia);
+    headers = libbalsa_message_get_headers(message);
+    headers->from = internet_address_list_new ();
+    internet_address_list_add(headers->from, ia);
 
     tmp = gtk_editable_get_chars(GTK_EDITABLE(bsmsg->subject[1]), 0, -1);
     strip_chars(tmp, "\r\n");
     libbalsa_message_set_subject(message, tmp);
     g_free(tmp);
 
-    message->headers->to_list =
+    headers->to_list =
         libbalsa_address_view_get_list(bsmsg->recipient_view, "To:");
 
-    message->headers->cc_list =
+    headers->cc_list =
         libbalsa_address_view_get_list(bsmsg->recipient_view, "CC:");
 
-    message->headers->bcc_list =
+    headers->bcc_list =
         libbalsa_address_view_get_list(bsmsg->recipient_view, "BCC:");
 
 
@@ -4849,12 +4905,12 @@ bsmsg2message(BalsaSendmsg * bsmsg)
     bsmsg->fcc_url =
         g_strdup(balsa_mblist_mru_option_menu_get(bsmsg->fcc[1]));
 
-    message->headers->reply_to =
+    headers->reply_to =
         libbalsa_address_view_get_list(bsmsg->replyto_view, "Reply To:");
 
     if (bsmsg->req_mdn)
        libbalsa_message_set_dispnotify(message, ia);
-    message->request_dsn = bsmsg->req_dsn;
+    libbalsa_message_set_request_dsn(message, bsmsg->req_dsn);
 
     sw_set_header_from_path(message, "Face", libbalsa_identity_get_face_path(ident),
             /* Translators: please do not translate Face. */
@@ -4863,12 +4919,13 @@ bsmsg2message(BalsaSendmsg * bsmsg)
             /* Translators: please do not translate Face. */
                             _("Could not load X-Face header file %s: %s"));
 
-    message->references = bsmsg->references;
+    libbalsa_message_set_references(message, bsmsg->references);
     bsmsg->references = NULL; /* steal it */
 
-    if (bsmsg->in_reply_to)
-        message->in_reply_to =
-            g_list_prepend(NULL, g_strdup(bsmsg->in_reply_to));
+    if (bsmsg->in_reply_to != NULL)
+        libbalsa_message_set_in_reply_to(message,
+                                         g_list_prepend(NULL,
+                                                        g_strdup(bsmsg->in_reply_to)));
 
     body = libbalsa_message_body_new(message);
 
@@ -4899,7 +4956,7 @@ bsmsg2message(BalsaSendmsg * bsmsg)
 
     if (bsmsg->send_mp_alt)
         body->html_buffer =
-            libbalsa_text_to_html(message->subj, body->buffer,
+            libbalsa_text_to_html(libbalsa_message_get_subject(message), body->buffer,
                                   bsmsg->spell_check_lang);
     if (bsmsg->flow)
        body->buffer =
@@ -4922,16 +4979,16 @@ bsmsg2message(BalsaSendmsg * bsmsg)
         gtk_tree_model_foreach(BALSA_MSG_ATTACH_MODEL(bsmsg),
                                attachment2message, message);
 
-    message->headers->date = time(NULL);
+    headers->date = time(NULL);
 #ifdef HAVE_GPGME
     if (balsa_app.has_openpgp || balsa_app.has_smime) {
-        message->gpg_mode =
-            (bsmsg->gpg_mode & LIBBALSA_PROTECT_MODE) != 0 ? bsmsg->gpg_mode : 0;
-        message->att_pubkey = bsmsg->attach_pubkey;
-        message->ident = g_object_ref(ident);
+        libbalsa_message_set_gpg_mode(message,
+            (bsmsg->gpg_mode & LIBBALSA_PROTECT_MODE) != 0 ? bsmsg->gpg_mode : 0);
+        libbalsa_message_set_att_pubkey(message, bsmsg->attach_pubkey);
+        libbalsa_message_set_identity(message, ident);
     } else {
-        message->gpg_mode = 0;
-        message->att_pubkey = FALSE;
+        libbalsa_message_set_gpg_mode(message, 0);
+        libbalsa_message_set_att_pubkey(message, FALSE);
     }
 #endif
 
@@ -5224,7 +5281,7 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
     balsa_information_parented(GTK_WINDOW(bsmsg->window),
                                LIBBALSA_INFORMATION_DEBUG,
                                _("sending message with GPG mode %d"),
-                               message->gpg_mode);
+                               libbalsa_message_get_gpg_mode(message));
 #endif
 
     if(queue_only)
@@ -5239,13 +5296,19 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
                                        GTK_WINDOW(balsa_app.main_window),
                                        bsmsg->flow, &error);
     if (result == LIBBALSA_MESSAGE_CREATE_OK) {
-       if (bsmsg->parent_message && bsmsg->parent_message->mailbox
-            && !libbalsa_mailbox_get_readonly(bsmsg->parent_message->mailbox))
-           libbalsa_message_reply(bsmsg->parent_message);
+       if (bsmsg->parent_message != NULL) {
+            LibBalsaMailbox *mailbox;
+
+            mailbox = libbalsa_message_get_mailbox(bsmsg->parent_message);
+            if (mailbox != NULL &&
+                !libbalsa_mailbox_get_readonly(mailbox)) {
+                libbalsa_message_reply(bsmsg->parent_message);
+            }
+        }
         sw_delete_draft(bsmsg);
     }
 
-    g_object_unref(G_OBJECT(message));
+    g_object_unref(message);
 
     if (result != LIBBALSA_MESSAGE_CREATE_OK) {
         const char *msg;
@@ -6763,11 +6826,18 @@ BalsaSendmsg *
 sendmsg_window_reply(LibBalsaMailbox * mailbox, guint msgno,
                      SendType reply_type)
 {
-    LibBalsaMessage *message =
-        libbalsa_mailbox_get_message(mailbox, msgno);
-    BalsaSendmsg *bsmsg = sendmsg_window_new();
+    LibBalsaMessage *message;
+    LibBalsaMessageHeaders *headers;
+    BalsaSendmsg *bsmsg;
+    const gchar *message_id;
+    GList *references;
+    GList *in_reply_to;
 
-    g_assert(message);
+    message = libbalsa_mailbox_get_message(mailbox, msgno);
+    g_assert(message != NULL);
+    headers = libbalsa_message_get_headers(message);
+
+    bsmsg = sendmsg_window_new();
     switch(reply_type) {
     case SEND_REPLY:
     case SEND_REPLY_ALL:
@@ -6780,21 +6850,24 @@ sendmsg_window_reply(LibBalsaMailbox * mailbox, guint msgno,
 
     bsm_prepare_for_setup(message);
 
-    set_to(bsmsg, message->headers);
+    set_to(bsmsg, headers);
 
-    if (message->message_id)
-        set_in_reply_to(bsmsg, message->message_id, message->headers);
+    message_id = libbalsa_message_get_message_id(message);
+    if (message_id != NULL)
+        set_in_reply_to(bsmsg, message_id, headers);
     if (reply_type == SEND_REPLY_ALL)
-        set_cc_from_all_recipients(bsmsg, message->headers);
-    set_references_reply(bsmsg, message->references,
-                         message->in_reply_to
-                         ? message->in_reply_to->data : NULL,
-                         message->message_id);
+        set_cc_from_all_recipients(bsmsg, headers);
+
+    references = libbalsa_message_get_references(message);
+    in_reply_to = libbalsa_message_get_in_reply_to(message);
+    set_references_reply(bsmsg, references,
+                         in_reply_to != NULL ? in_reply_to->data : NULL,
+                         message_id);
     if(balsa_app.autoquote)
         fill_body_from_message(bsmsg, message, QUOTE_ALL);
     if (libbalsa_identity_get_sig_whenreply(bsmsg->ident))
         insert_initial_sig(bsmsg);
-    bsm_finish_setup(bsmsg, message->body_list);
+    bsm_finish_setup(bsmsg, libbalsa_message_get_body_list(message));
     g_idle_add((GSourceFunc) sw_grab_focus_to_text,
                g_object_ref(bsmsg->text));
     return bsmsg;
@@ -6853,12 +6926,16 @@ BalsaSendmsg*
 sendmsg_window_forward(LibBalsaMailbox *mailbox, guint msgno,
                        gboolean attach)
 {
-    LibBalsaMessage *message =
-        libbalsa_mailbox_get_message(mailbox, msgno);
-    BalsaSendmsg *bsmsg = sendmsg_window_new();
-    g_assert(message);
+    LibBalsaMessage *message;
+    BalsaSendmsg *bsmsg;
+    LibBalsaMessageBody *body_list;
 
+    message = libbalsa_mailbox_get_message(mailbox, msgno);
+    g_assert(message != NULL);
+
+    bsmsg = sendmsg_window_new();
     bsmsg->type = attach ? SEND_FORWARD_ATTACH : SEND_FORWARD_INLINE;
+    body_list = libbalsa_message_get_body_list(message);
     if (attach) {
        if(!attach_message(bsmsg, message))
             balsa_information_parented(GTK_WINDOW(bsmsg->window),
@@ -6866,11 +6943,11 @@ sendmsg_window_forward(LibBalsaMailbox *mailbox, guint msgno,
                                        _("Attaching message failed.\n"
                                          "Possible reason: not enough temporary space"));
         bsmsg->state = SENDMSG_STATE_CLEAN;
-        bsmsg_set_subject_from_body(bsmsg, message->body_list, bsmsg->ident);
+        bsmsg_set_subject_from_body(bsmsg, body_list, bsmsg->ident);
     } else {
         bsm_prepare_for_setup(message);
         fill_body_from_message(bsmsg, message, QUOTE_NOPREFIX);
-        bsm_finish_setup(bsmsg, message->body_list);
+        bsm_finish_setup(bsmsg, body_list);
     }
     if (libbalsa_identity_get_sig_whenforward(bsmsg->ident))
         insert_initial_sig(bsmsg);
@@ -6890,12 +6967,14 @@ sendmsg_window_forward(LibBalsaMailbox *mailbox, guint msgno,
 BalsaSendmsg*
 sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
 {
-    LibBalsaMessage *message =
-        libbalsa_mailbox_get_message(mailbox, msgno);
+    LibBalsaMessage *message;
     BalsaSendmsg *bsmsg;
+    LibBalsaMessageHeaders *headers;
+    GList *in_reply_to;
     const gchar *postpone_hdr;
     GList *list, *refs = NULL;
 
+    message = libbalsa_mailbox_get_message(mailbox, msgno);
     g_assert(message);
 
     if ((bsmsg = g_object_get_data(G_OBJECT(message),
@@ -6913,12 +6992,13 @@ sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
     set_identity(bsmsg, message);
     setup_headers_from_message(bsmsg, message);
 
+    headers = libbalsa_message_get_headers(message);
     libbalsa_address_view_set_from_list(bsmsg->replyto_view,
                                         "Reply To:",
-                                        message->headers->reply_to);
-    if (message->in_reply_to)
-        bsmsg->in_reply_to =
-            g_strconcat("<", message->in_reply_to->data, ">", NULL);
+                                        headers->reply_to);
+    in_reply_to = libbalsa_message_get_in_reply_to(message);
+    if (in_reply_to != NULL)
+        bsmsg->in_reply_to = g_strconcat("<", in_reply_to->data, ">", NULL);
 
 #ifdef HAVE_GPGME
     if ((postpone_hdr =
@@ -6964,12 +7044,15 @@ sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
          libbalsa_message_get_user_header(message, "X-Balsa-Send-Type")))
         bsmsg->type = atoi(postpone_hdr);
 
-    for (list = message->references; list; list = list->next)
+    list = libbalsa_message_get_references(message);
+    while (list != NULL) {
         refs = g_list_prepend(refs, g_strdup(list->data));
+        list = list->next;
+    }
     bsmsg->references = g_list_reverse(refs);
 
     continue_body(bsmsg, message);
-    bsm_finish_setup(bsmsg, message->body_list);
+    bsm_finish_setup(bsmsg, libbalsa_message_get_body_list(message));
     g_idle_add((GSourceFunc) sw_grab_focus_to_text,
                g_object_ref(bsmsg->text));
     return bsmsg;
diff --git a/src/store-address.c b/src/store-address.c
index a6cc2ea..e298123 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -330,12 +330,15 @@ store_address_note_frame(StoreAddressInfo *info)
     g_object_set(G_OBJECT(info->notebook), "margin", 4, NULL);
 
     for (list = info->message_list; list; list = list->next) {
+        LibBalsaMessageHeaders *headers;
+
         message = LIBBALSA_MESSAGE(list->data);
-       if (message->headers) {
-           store_address_add_list(info, _("From: "), message->headers->from);
-           store_address_add_list(info, _("To: "), message->headers->to_list);
-           store_address_add_list(info, _("CC: "), message->headers->cc_list);
-           store_address_add_list(info, _("BCC: "), message->headers->bcc_list);
+        headers = libbalsa_message_get_headers(message);
+       if (headers != NULL) {
+           store_address_add_list(info, _("From: "), headers->from);
+           store_address_add_list(info, _("To: "), headers->to_list);
+           store_address_add_list(info, _("CC: "), headers->cc_list);
+           store_address_add_list(info, _("BCC: "), headers->bcc_list);
        }
     }
 


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