[evolution-data-server] Use GObject properties instead of CamelArg.



commit bcd1f61f19fd7c7639874c25d48f04fc5d1b8001
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Apr 24 16:35:29 2010 -0400

    Use GObject properties instead of CamelArg.
    
    Persistent properties are implemented as normal GObject properties, but
    with a special GParamFlag: CAMEL_PARAM_PERSISTENT.
    
    Currently all persistent properties are of type boolean, so the state
    file read/write logic has been scaled down to support only booleans.

 camel/Makefile.am                                  |    2 -
 camel/camel-arg.c                                  |  131 ----
 camel/camel-arg.h                                  |  118 ----
 camel/camel-certdb.h                               |    7 +-
 camel/camel-data-cache.c                           |   19 +
 camel/camel-data-wrapper.c                         |    3 +-
 camel/camel-data-wrapper.h                         |    7 +-
 camel/camel-db.c                                   |   10 +-
 camel/camel-db.h                                   |   10 +-
 camel/camel-disco-diary.c                          |   19 +-
 camel/camel-disco-diary.h                          |    8 -
 camel/camel-disco-folder.c                         |  216 ++++---
 camel/camel-disco-folder.h                         |   18 +-
 camel/camel-disco-store.c                          |    4 +-
 camel/camel-disco-store.h                          |    4 -
 camel/camel-folder-search.c                        |   29 +-
 camel/camel-folder-summary.c                       |  226 ++++---
 camel/camel-folder.c                               |  597 +++++++++--------
 camel/camel-folder.h                               |   63 +--
 camel/camel-gpg-context.c                          |    6 +
 camel/camel-index.c                                |    8 +
 camel/camel-object.c                               |  721 +++++++++-----------
 camel/camel-object.h                               |   55 +-
 camel/camel-offline-folder.c                       |  182 +++---
 camel/camel-offline-folder.h                       |   29 +-
 camel/camel-offline-journal.c                      |    6 +-
 camel/camel-offline-store.c                        |    4 +-
 camel/camel-offline-store.h                        |    4 -
 camel/camel-sasl.c                                 |   25 +
 camel/camel-service.c                              |  123 ----
 camel/camel-service.h                              |   22 +-
 camel/camel-session.h                              |    5 +
 camel/camel-store-summary.h                        |    5 +
 camel/camel-store.c                                |   17 +-
 camel/camel-store.h                                |    9 +-
 camel/camel-stream-filter.c                        |    8 +
 camel/camel-stream-fs.c                            |    6 +
 camel/camel-stream-mem.c                           |    6 +
 camel/camel-transport.h                            |    9 +-
 camel/camel-vee-folder.c                           |  376 +++++------
 camel/camel-vee-folder.h                           |    7 +-
 camel/camel-vee-store.c                            |   73 ++-
 camel/camel-vee-summary.c                          |   49 +-
 camel/camel-vtrash-folder.c                        |  111 +---
 camel/camel.h                                      |    1 -
 camel/providers/groupwise/camel-groupwise-folder.c |  456 ++++++++-----
 camel/providers/groupwise/camel-groupwise-folder.h |    5 +-
 .../providers/groupwise/camel-groupwise-journal.c  |   15 +-
 camel/providers/groupwise/camel-groupwise-store.c  |   26 +-
 camel/providers/imap/camel-imap-command.c          |    6 +-
 camel/providers/imap/camel-imap-folder.c           |  529 +++++++++------
 camel/providers/imap/camel-imap-folder.h           |   78 +--
 camel/providers/imap/camel-imap-journal.c          |   29 +-
 camel/providers/imap/camel-imap-private.h          |    1 +
 camel/providers/imap/camel-imap-search.c           |   12 +-
 camel/providers/imap/camel-imap-store.c            |  138 +----
 camel/providers/imap/camel-imap-store.h            |    4 +-
 camel/providers/imap/camel-imap-summary.c          |    9 +-
 camel/providers/imap/camel-imap-wrapper.c          |    7 +-
 camel/providers/imapx/camel-imapx-folder.c         |   53 ++-
 camel/providers/imapx/camel-imapx-server.c         |  171 ++++--
 camel/providers/imapx/camel-imapx-store.c          |   10 +-
 camel/providers/imapx/camel-imapx-summary.c        |    7 +-
 camel/providers/imapx/camel-imapx-utils.c          |   15 +-
 camel/providers/local/camel-local-folder.c         |  310 +++++----
 camel/providers/local/camel-local-folder.h         |   40 +-
 camel/providers/local/camel-local-store.c          |   20 +-
 camel/providers/local/camel-maildir-folder.c       |   51 +-
 camel/providers/local/camel-maildir-summary.c      |    5 +-
 camel/providers/local/camel-mbox-folder.c          |   14 +-
 camel/providers/local/camel-mbox-store.c           |   10 +-
 camel/providers/local/camel-mbox-summary.c         |   25 +-
 camel/providers/local/camel-mh-folder.c            |   13 +-
 camel/providers/local/camel-mh-summary.c           |    5 +-
 camel/providers/local/camel-spool-folder.c         |   13 +-
 camel/providers/local/camel-spool-summary.c        |    5 +-
 camel/providers/nntp/camel-nntp-folder.c           |   84 ++-
 camel/providers/nntp/camel-nntp-store.c            |   10 +-
 camel/providers/nntp/camel-nntp-summary.c          |    9 +-
 camel/providers/pop3/camel-pop3-folder.c           |   58 ++-
 docs/reference/camel/camel-docs.sgml               |    1 -
 docs/reference/camel/camel-sections.txt            |  100 ++-
 docs/reference/camel/tmpl/camel-arg.sgml           |  127 ----
 docs/reference/camel/tmpl/camel-certdb.sgml        |   28 +
 .../reference/camel/tmpl/camel-cipher-context.sgml |   14 +
 docs/reference/camel/tmpl/camel-data-cache.sgml    |   18 +
 docs/reference/camel/tmpl/camel-data-wrapper.sgml  |   25 +
 docs/reference/camel/tmpl/camel-disco-diary.sgml   |   10 -
 docs/reference/camel/tmpl/camel-disco-folder.sgml  |   23 +
 .../reference/camel/tmpl/camel-folder-summary.sgml |   51 +-
 docs/reference/camel/tmpl/camel-folder.sgml        |  102 +++-
 docs/reference/camel/tmpl/camel-gpg-context.sgml   |    9 +
 docs/reference/camel/tmpl/camel-index.sgml         |   10 +
 docs/reference/camel/tmpl/camel-object.sgml        |   66 +--
 .../reference/camel/tmpl/camel-offline-folder.sgml |   23 +
 docs/reference/camel/tmpl/camel-sasl.sgml          |   45 ++
 docs/reference/camel/tmpl/camel-service.sgml       |   61 +-
 docs/reference/camel/tmpl/camel-session.sgml       |   26 +
 docs/reference/camel/tmpl/camel-store-summary.sgml |   27 +
 docs/reference/camel/tmpl/camel-store.sgml         |   25 +
 docs/reference/camel/tmpl/camel-stream-filter.sgml |   18 +
 docs/reference/camel/tmpl/camel-stream-fs.sgml     |    9 +
 docs/reference/camel/tmpl/camel-stream-mem.sgml    |    9 +
 docs/reference/camel/tmpl/camel-transport.sgml     |   25 +
 docs/reference/camel/tmpl/camel-unused.sgml        |  269 ++++++++
 docs/reference/camel/tmpl/camel-vee-folder.sgml    |   48 ++-
 106 files changed, 3715 insertions(+), 3055 deletions(-)
---
diff --git a/camel/Makefile.am b/camel/Makefile.am
index b19f81c..a411f4e 100644
--- a/camel/Makefile.am
+++ b/camel/Makefile.am
@@ -159,7 +159,6 @@ libcamel_1_2_la_CPPFLAGS = \
 
 libcamel_1_2_la_SOURCES = 			\
 	camel-address.c				\
-	camel-arg.c				\
 	camel-block-file.c			\
 	camel-certdb.c				\
 	camel-charset-map.c			\
@@ -232,7 +231,6 @@ libcamel_1_2_la_SOURCES = 			\
 
 libcamelinclude_HEADERS =			\
 	camel-address.h				\
-	camel-arg.h				\
 	camel-block-file.h			\
 	camel-certdb.h				\
 	camel-charset-map.h			\
diff --git a/camel/camel-certdb.h b/camel/camel-certdb.h
index 2f578d0..4f3c0ee 100644
--- a/camel/camel-certdb.h
+++ b/camel/camel-certdb.h
@@ -86,7 +86,12 @@ typedef struct {
 	GByteArray *rawcert;
 } CamelCert;
 
-typedef enum _CamelCertDBLock {
+/**
+ * CamelCertDBLock:
+ *
+ * Since: 3.0
+ **/
+typedef enum {
 	CCD_DB_LOCK,
 	CCD_IO_LOCK,
 	CCD_ALLOC_LOCK,
diff --git a/camel/camel-data-cache.c b/camel/camel-data-cache.c
index dbc3a56..2f27a51 100644
--- a/camel/camel-data-cache.c
+++ b/camel/camel-data-cache.c
@@ -188,6 +188,16 @@ camel_data_cache_new (const gchar *path,
 	return g_object_new (CAMEL_TYPE_DATA_CACHE, "path", path, NULL);
 }
 
+/**
+ * camel_data_cache_get_path:
+ * @cdc: a #CamelDataCache
+ *
+ * Returns the path to the data cache.
+ *
+ * Returns: the path to the data cache
+ *
+ * Since: 3.0
+ **/
 const gchar *
 camel_data_cache_get_path (CamelDataCache *cdc)
 {
@@ -196,6 +206,15 @@ camel_data_cache_get_path (CamelDataCache *cdc)
 	return cdc->priv->path;
 }
 
+/**
+ * camel_data_cache_set_path:
+ * @cdc: a #CamelDataCache
+ * @path: path to the data cache
+ *
+ * Sets the path to the data cache.
+ *
+ * Since: 3.0
+ **/
 void
 camel_data_cache_set_path (CamelDataCache *cdc,
                            const gchar *path)
diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c
index c5d3284..2fb2f2e 100644
--- a/camel/camel-data-wrapper.c
+++ b/camel/camel-data-wrapper.c
@@ -453,7 +453,8 @@ camel_data_wrapper_lock (CamelDataWrapper *data_wrapper,
  * @data_wrapper: a #CamelDataWrapper
  * @lock: lock type to unlock
  *
- * Unlocks #data_wrapper's #lock, previously locked with camel_data_wrapper_lock().
+ * Unlocks #data_wrapper's #lock, previously locked with
+ * camel_data_wrapper_lock().
  *
  * Since: 3.0
  **/
diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h
index 2310797..9924b29 100644
--- a/camel/camel-data-wrapper.h
+++ b/camel/camel-data-wrapper.h
@@ -59,7 +59,12 @@ typedef struct _CamelDataWrapper CamelDataWrapper;
 typedef struct _CamelDataWrapperClass CamelDataWrapperClass;
 typedef struct _CamelDataWrapperPrivate CamelDataWrapperPrivate;
 
-typedef enum _CamelDataWrapperLock {
+/**
+ * CamelDataWrapperLock:
+ *
+ * Since: 3.0
+ **/
+typedef enum {
 	CDW_STREAM_LOCK
 } CamelDataWrapperLock;
 
diff --git a/camel/camel-db.c b/camel/camel-db.c
index 3374857..1f5f275 100644
--- a/camel/camel-db.c
+++ b/camel/camel-db.c
@@ -1153,7 +1153,7 @@ camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, CamelException *
  * Since: 2.24
  **/
 GPtrArray *
-camel_db_get_folder_deleted_uids (CamelDB *db, gchar *folder_name, CamelException *ex)
+camel_db_get_folder_deleted_uids (CamelDB *db, const gchar *folder_name, CamelException *ex)
 {
 	 gchar *sel_query;
 	 gint ret;
@@ -1198,7 +1198,7 @@ read_preview_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name)
  * Since: 2.28
  **/
 GHashTable *
-camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex)
+camel_db_get_folder_preview (CamelDB *db, const gchar *folder_name, CamelException *ex)
 {
 	 gchar *sel_query;
 	 gint ret;
@@ -1223,7 +1223,7 @@ camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex
  * Since: 2.28
  **/
 gint
-camel_db_write_preview_record (CamelDB *db, gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex)
+camel_db_write_preview_record (CamelDB *db, const gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex)
 {
 	gchar *query;
 	gint ret;
@@ -1261,7 +1261,7 @@ read_vuids_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name)
  * Since: 2.24
  **/
 GPtrArray *
-camel_db_get_vuids_from_vfolder (CamelDB *db, gchar *folder_name, gchar *filter, CamelException *ex)
+camel_db_get_vuids_from_vfolder (CamelDB *db, const gchar *folder_name, gchar *filter, CamelException *ex)
 {
 	 gchar *sel_query;
 	 gchar *cond = NULL;
@@ -1954,7 +1954,7 @@ camel_db_delete_vuids (CamelDB *cdb, const gchar * folder_name, const gchar *has
  * Since: 2.24
  **/
 gint
-camel_db_clear_folder_summary (CamelDB *cdb, gchar *folder, CamelException *ex)
+camel_db_clear_folder_summary (CamelDB *cdb, const gchar *folder, CamelException *ex)
 {
 	gint ret;
 
diff --git a/camel/camel-db.h b/camel/camel-db.h
index 9465f06..254c13e 100644
--- a/camel/camel-db.h
+++ b/camel/camel-db.h
@@ -218,7 +218,7 @@ gint camel_db_begin_transaction (CamelDB *cdb, CamelException *ex);
 gint camel_db_add_to_transaction (CamelDB *cdb, const gchar *query, CamelException *ex);
 gint camel_db_end_transaction (CamelDB *cdb, CamelException *ex);
 gint camel_db_abort_transaction (CamelDB *cdb, CamelException *ex);
-gint camel_db_clear_folder_summary (CamelDB *cdb, gchar *folder, CamelException *ex);
+gint camel_db_clear_folder_summary (CamelDB *cdb, const gchar *folder, CamelException *ex);
 gint camel_db_rename_folder (CamelDB *cdb, const gchar *old_folder, const gchar *new_folder, CamelException *ex);
 
 gint camel_db_delete_folder (CamelDB *cdb, const gchar *folder, CamelException *ex);
@@ -256,7 +256,7 @@ gint camel_db_create_vfolder (CamelDB *db, const gchar *folder_name, CamelExcept
 gint camel_db_recreate_vfolder (CamelDB *db, const gchar *folder_name, CamelException *ex);
 gint camel_db_delete_uid_from_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex);
 gint camel_db_delete_uid_from_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex);
-GPtrArray * camel_db_get_vuids_from_vfolder (CamelDB *db, gchar *folder_name, gchar *filter, CamelException *ex);
+GPtrArray * camel_db_get_vuids_from_vfolder (CamelDB *db, const gchar *folder_name, gchar *filter, CamelException *ex);
 gint camel_db_add_to_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex);
 gint camel_db_add_to_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex);
 
@@ -264,7 +264,7 @@ gint camel_db_get_folder_uids (CamelDB *db, const gchar *folder_name, const gcha
 gint camel_db_get_folder_uids_flags (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *summary, GHashTable *table, CamelException *ex);
 
 GPtrArray * camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, CamelException *ex);
-GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, gchar *folder_name, CamelException *ex);
+GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, const gchar *folder_name, CamelException *ex);
 
 gchar * camel_db_sqlize_string (const gchar *string);
 void camel_db_free_sqlized_string (gchar *string);
@@ -278,8 +278,8 @@ gint camel_db_start_in_memory_transactions (CamelDB *cdb, CamelException *ex);
 gint camel_db_flush_in_memory_transactions (CamelDB *cdb, const gchar * folder_name, CamelException *ex);
 
 GHashTable *
-camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex);
-gint camel_db_write_preview_record (CamelDB *db, gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex);
+camel_db_get_folder_preview (CamelDB *db, const gchar *folder_name, CamelException *ex);
+gint camel_db_write_preview_record (CamelDB *db, const gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex);
 
 gint
 camel_db_reset_folder_version (CamelDB *cdb, const gchar *folder_name, gint reset_version, CamelException *ex);
diff --git a/camel/camel-disco-diary.c b/camel/camel-disco-diary.c
index 2b9e03f..882c1a0 100644
--- a/camel/camel-disco-diary.c
+++ b/camel/camel-disco-diary.c
@@ -130,10 +130,12 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action,
 	{
 		CamelFolder *folder = va_arg (ap, CamelFolder *);
 		GPtrArray *uids = va_arg (ap, GPtrArray *);
+		const gchar *full_name;
 
 		d(printf(" folder expunge '%s'\n", folder->full_name));
 
-		status = camel_file_util_encode_string (diary->file, folder->full_name);
+		full_name = camel_folder_get_full_name (folder);
+		status = camel_file_util_encode_string (diary->file, full_name);
 		if (status != -1)
 			status = diary_encode_uids (diary, uids);
 		break;
@@ -143,10 +145,12 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action,
 	{
 		CamelFolder *folder = va_arg (ap, CamelFolder *);
 		gchar *uid = va_arg (ap, gchar *);
+		const gchar *full_name;
 
 		d(printf(" folder append '%s'\n", folder->full_name));
 
-		status = camel_file_util_encode_string (diary->file, folder->full_name);
+		full_name = camel_folder_get_full_name (folder);
+		status = camel_file_util_encode_string (diary->file, full_name);
 		if (status != -1)
 			status = camel_file_util_encode_string (diary->file, uid);
 		break;
@@ -158,15 +162,18 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action,
 		CamelFolder *destination = va_arg (ap, CamelFolder *);
 		GPtrArray *uids = va_arg (ap, GPtrArray *);
 		gboolean delete_originals = va_arg (ap, gboolean);
+		const gchar *full_name;
 
-		d(printf(" folder transfer '%s' to '%s'\n", source->full_name, destination->full_name));
-
-		status = camel_file_util_encode_string (diary->file, source->full_name);
+		full_name = camel_folder_get_full_name (source);
+		status = camel_file_util_encode_string (diary->file, full_name);
 		if (status == -1)
 			break;
-		status = camel_file_util_encode_string (diary->file, destination->full_name);
+
+		full_name = camel_folder_get_full_name (destination);
+		status = camel_file_util_encode_string (diary->file, full_name);
 		if (status == -1)
 			break;
+
 		status = diary_encode_uids (diary, uids);
 		if (status == -1)
 			break;
diff --git a/camel/camel-disco-diary.h b/camel/camel-disco-diary.h
index 91dc285..8f12183 100644
--- a/camel/camel-disco-diary.h
+++ b/camel/camel-disco-diary.h
@@ -67,14 +67,6 @@ typedef enum {
 	CAMEL_DISCO_DIARY_FOLDER_TRANSFER
 } CamelDiscoDiaryAction;
 
-typedef enum {
-	CAMEL_DISCO_DIARY_ARG_NONE = 0,
-
-	CAMEL_DISCO_DIARY_ARG_FOLDER,
-	CAMEL_DISCO_DIARY_ARG_UID,
-	CAMEL_DISCO_DIARY_ARG_UID_LIST
-} CamelDiscoDiaryArgType;
-
 struct _CamelDiscoDiary {
 	CamelObject parent;
 
diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c
index 1095312..19d9b70 100644
--- a/camel/camel-disco-folder.c
+++ b/camel/camel-disco-folder.c
@@ -32,15 +32,14 @@
 #include "camel-exception.h"
 #include "camel-session.h"
 
-static GSList *disco_folder_properties;
+#define CAMEL_DISCO_FOLDER_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), CAMEL_TYPE_DISCO_FOLDER, CamelDiscoFolderPrivate))
 
-static CamelProperty disco_property_list[] = {
-	{ CAMEL_DISCO_FOLDER_OFFLINE_SYNC, "offline_sync", N_("Copy folder content locally for offline operation") },
+struct _CamelDiscoFolderPrivate {
+	gboolean offline_sync;
 };
 
-/* Forward Declarations */
-static gboolean disco_expunge (CamelFolder *folder, CamelException *ex);
-
 struct _cdf_sync_msg {
 	CamelSessionThreadMsg msg;
 
@@ -48,8 +47,18 @@ struct _cdf_sync_msg {
 	CamelFolderChangeInfo *changes;
 };
 
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+	PROP_0,
+	PROP_OFFLINE_SYNC = 0x2400
+};
+
 G_DEFINE_TYPE (CamelDiscoFolder, camel_disco_folder, CAMEL_TYPE_FOLDER)
 
+/* Forward Declarations */
+static gboolean disco_expunge (CamelFolder *folder, CamelException *ex);
+
 static void
 cdf_sync_offline(CamelSession *session, CamelSessionThreadMsg *mm)
 {
@@ -94,10 +103,17 @@ static CamelSessionThreadOps cdf_sync_ops = {
 static void
 cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer dummy)
 {
-	if (changes->uid_added->len > 0
-	    && (((CamelDiscoFolder *)folder)->offline_sync
-		|| camel_url_get_param(((CamelService *)folder->parent_store)->url, "offline_sync"))) {
-		CamelSession *session = ((CamelService *)folder->parent_store)->session;
+	CamelStore *parent_store;
+	gboolean offline_sync;
+
+	parent_store = camel_folder_get_parent_store (folder);
+
+	offline_sync = camel_disco_folder_get_offline_sync (
+		CAMEL_DISCO_FOLDER (folder));
+
+	if (changes->uid_added->len > 0 && (offline_sync
+		|| camel_url_get_param (CAMEL_SERVICE (parent_store)->url, "offline_sync"))) {
+		CamelSession *session = CAMEL_SERVICE (parent_store)->session;
 		struct _cdf_sync_msg *m;
 
 		m = camel_session_thread_msg_new(session, &cdf_sync_ops, sizeof(*m));
@@ -108,79 +124,38 @@ cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer
 	}
 }
 
-static gint
-disco_getv (CamelObject *object,
-            CamelException *ex,
-            CamelArgGetV *args)
+static void
+disco_folder_set_property (GObject *object,
+                           guint property_id,
+                           const GValue *value,
+                           GParamSpec *pspec)
 {
-	gint i, count=0;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES:
-		case CAMEL_FOLDER_ARG_PROPERTIES: {
-			CamelArgGetV props;
-
-			props.argc = 1;
-			props.argv[0] = *arg;
-			CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, ex, &props);
-			*arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(disco_folder_properties));
-			break; }
-			/* disco args */
-		case CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC:
-			*arg->ca_int = ((CamelDiscoFolder *)object)->offline_sync;
-			break;
-		default:
-			count++;
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
+	switch (property_id) {
+		case PROP_OFFLINE_SYNC:
+			camel_disco_folder_set_offline_sync (
+				CAMEL_DISCO_FOLDER (object),
+				g_value_get_boolean (value));
+			return;
 	}
 
-	if (count)
-		return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, ex, args);
-
-	return 0;
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
-static gint
-disco_setv (CamelObject *object,
-            CamelException *ex,
-            CamelArgV *args)
+static void
+disco_folder_get_property (GObject *object,
+                           guint property_id,
+                           GValue *value,
+                           GParamSpec *pspec)
 {
-	gint save = 0;
-	gint i;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArg *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC:
-			if (((CamelDiscoFolder *)object)->offline_sync != arg->ca_int) {
-				((CamelDiscoFolder *)object)->offline_sync = arg->ca_int;
-				save = 1;
-			}
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
+	switch (property_id) {
+		case PROP_OFFLINE_SYNC:
+			g_value_set_boolean (
+				value, camel_disco_folder_get_offline_sync (
+				CAMEL_DISCO_FOLDER (object)));
+			return;
 	}
 
-	if (save)
-		camel_object_state_write(object);
-
-	return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->setv(object, ex, args);
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static gboolean
@@ -188,8 +163,11 @@ disco_refresh_info (CamelFolder *folder,
                     CamelException *ex)
 {
 	CamelDiscoFolderClass *disco_folder_class;
+	CamelStore *parent_store;
+
+	parent_store = camel_folder_get_parent_store (folder);
 
-	if (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store)) != CAMEL_DISCO_STORE_ONLINE)
+	if (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store)) != CAMEL_DISCO_STORE_ONLINE)
 		return TRUE;
 
 	disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder);
@@ -203,17 +181,19 @@ disco_sync (CamelFolder *folder,
             CamelException *ex)
 {
 	CamelDiscoFolderClass *disco_folder_class;
+	CamelStore *parent_store;
 
 	if (expunge && !disco_expunge (folder, ex)) {
 		if (camel_exception_is_set (ex))
 			return FALSE;
 	}
 
-	camel_object_state_write(folder);
+	camel_object_state_write (CAMEL_OBJECT (folder));
 
+	parent_store = camel_folder_get_parent_store (folder);
 	disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder);
 
-	switch (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store))) {
+	switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
 	case CAMEL_DISCO_STORE_ONLINE:
 		return disco_folder_class->sync_online (folder, ex);
 
@@ -232,15 +212,16 @@ disco_expunge_uids (CamelFolder *folder,
                     GPtrArray *uids,
                     CamelException *ex)
 {
-	CamelDiscoStore *disco = CAMEL_DISCO_STORE (folder->parent_store);
 	CamelDiscoFolderClass *disco_folder_class;
+	CamelStore *parent_store;
 
 	if (uids->len == 0)
 		return TRUE;
 
+	parent_store = camel_folder_get_parent_store (folder);
 	disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder);
 
-	switch (camel_disco_store_status (disco)) {
+	switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
 	case CAMEL_DISCO_STORE_ONLINE:
 		return disco_folder_class->expunge_uids_online (
 			folder, uids, ex);
@@ -293,12 +274,13 @@ disco_append_message (CamelFolder *folder,
                       gchar **appended_uid,
                       CamelException *ex)
 {
-	CamelDiscoStore *disco = CAMEL_DISCO_STORE (folder->parent_store);
 	CamelDiscoFolderClass *disco_folder_class;
+	CamelStore *parent_store;
 
+	parent_store = camel_folder_get_parent_store (folder);
 	disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder);
 
-	switch (camel_disco_store_status (disco)) {
+	switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
 	case CAMEL_DISCO_STORE_ONLINE:
 		return disco_folder_class->append_online (
 			folder, message, info, appended_uid, ex);
@@ -323,12 +305,13 @@ disco_transfer_messages_to (CamelFolder *source,
                             gboolean delete_originals,
                             CamelException *ex)
 {
-	CamelDiscoStore *disco = CAMEL_DISCO_STORE (source->parent_store);
 	CamelDiscoFolderClass *disco_folder_class;
+	CamelStore *parent_store;
 
+	parent_store = camel_folder_get_parent_store (source);
 	disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (source);
 
-	switch (camel_disco_store_status (disco)) {
+	switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
 	case CAMEL_DISCO_STORE_ONLINE:
 		return disco_folder_class->transfer_online (
 			source, uids, dest, transferred_uids,
@@ -358,7 +341,9 @@ disco_prepare_for_offline (CamelDiscoFolder *disco_folder,
 	gint i;
 	gboolean success = TRUE;
 
-	camel_operation_start(NULL, _("Preparing folder '%s' for offline"), folder->full_name);
+	camel_operation_start (
+		NULL, _("Preparing folder '%s' for offline"),
+		camel_folder_get_full_name (folder));
 
 	if (expression)
 		uids = camel_folder_search_by_expression (folder, expression, ex);
@@ -398,13 +383,14 @@ disco_refresh_info_online (CamelFolder *folder,
 static void
 camel_disco_folder_class_init (CamelDiscoFolderClass *class)
 {
-	CamelObjectClass *camel_object_class;
+	GObjectClass *object_class;
 	CamelFolderClass *folder_class;
-	gint ii;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = disco_getv;
-	camel_object_class->setv = disco_setv;
+	g_type_class_add_private (class, sizeof (CamelDiscoFolderPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = disco_folder_set_property;
+	object_class->get_property = disco_folder_get_property;
 
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->refresh_info = disco_refresh_info;
@@ -416,23 +402,61 @@ camel_disco_folder_class_init (CamelDiscoFolderClass *class)
 	class->prepare_for_offline = disco_prepare_for_offline;
 	class->refresh_info_online = disco_refresh_info_online;
 
-	for (ii = 0; ii < G_N_ELEMENTS (disco_property_list); ii++) {
-		disco_property_list[ii].description =
-			_(disco_property_list[ii].description);
-		disco_folder_properties = g_slist_prepend (
-			disco_folder_properties, &disco_property_list[ii]);
-	}
+	g_object_class_install_property (
+		object_class,
+		PROP_OFFLINE_SYNC,
+		g_param_spec_boolean (
+			"offline-sync",
+			"Offline Sync",
+			N_("Copy folder content locally for offline operation"),
+			FALSE,
+			G_PARAM_READWRITE |
+			CAMEL_PARAM_PERSISTENT));
 }
 
 static void
 camel_disco_folder_init (CamelDiscoFolder *disco_folder)
 {
+	disco_folder->priv = CAMEL_DISCO_FOLDER_GET_PRIVATE (disco_folder);
+
 	camel_object_hook_event (
 		disco_folder, "folder_changed",
 		(CamelObjectEventHookFunc) cdf_folder_changed, NULL);
 }
 
 /**
+ * camel_disco_folder_get_offline_sync:
+ * @disco_folder: a #CamelDiscoFolder
+ *
+ * Since: 3.0
+ **/
+gboolean
+camel_disco_folder_get_offline_sync (CamelDiscoFolder *disco_folder)
+{
+	g_return_val_if_fail (CAMEL_IS_DISCO_FOLDER (disco_folder), FALSE);
+
+	return disco_folder->priv->offline_sync;
+}
+
+/**
+ * camel_disco_folder_set_offline_sync:
+ * @disco_folder: a #CamelDiscoFolder
+ * @offline_sync: whether to synchronize for offline use
+ *
+ * Since: 3.0
+ **/
+void
+camel_disco_folder_set_offline_sync (CamelDiscoFolder *disco_folder,
+                                     gboolean offline_sync)
+{
+	g_return_if_fail (CAMEL_IS_DISCO_FOLDER (disco_folder));
+
+	disco_folder->priv->offline_sync = offline_sync;
+
+	g_object_notify (G_OBJECT (disco_folder), "offline-sync");
+}
+
+/**
  * camel_disco_folder_expunge_uids:
  * @folder: a (disconnectable) folder
  * @uids: array of UIDs to expunge
diff --git a/camel/camel-disco-folder.h b/camel/camel-disco-folder.h
index e2b34d7..56ee026 100644
--- a/camel/camel-disco-folder.h
+++ b/camel/camel-disco-folder.h
@@ -55,20 +55,11 @@ G_BEGIN_DECLS
 
 typedef struct _CamelDiscoFolder CamelDiscoFolder;
 typedef struct _CamelDiscoFolderClass CamelDiscoFolderClass;
-
-enum {
-	CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC = CAMEL_FOLDER_ARG_LAST,
-	CAMEL_DISCO_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100
-};
-
-enum {
-	CAMEL_DISCO_FOLDER_OFFLINE_SYNC = CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC | CAMEL_ARG_BOO
-};
+typedef struct _CamelDiscoFolderPrivate CamelDiscoFolderPrivate;
 
 struct _CamelDiscoFolder {
 	CamelFolder parent;
-
-	guint offline_sync:1;
+	CamelDiscoFolderPrivate *priv;
 };
 
 struct _CamelDiscoFolderClass {
@@ -137,6 +128,11 @@ struct _CamelDiscoFolderClass {
 };
 
 GType		camel_disco_folder_get_type	(void);
+gboolean	camel_disco_folder_get_offline_sync
+						(CamelDiscoFolder *disco_folder);
+void		camel_disco_folder_set_offline_sync
+						(CamelDiscoFolder *disco_folder,
+						 gboolean offline_sync);
 gboolean	camel_disco_folder_expunge_uids	(CamelFolder *folder,
 						 GPtrArray *uids,
 						 CamelException *ex);
diff --git a/camel/camel-disco-store.c b/camel/camel-disco-store.c
index 4a29c2c..fe315d1 100644
--- a/camel/camel-disco-store.c
+++ b/camel/camel-disco-store.c
@@ -239,7 +239,7 @@ disco_store_set_status (CamelDiscoStore *disco_store,
 				for (i=0;i<folders->len;i++) {
 					folder = folders->pdata[i];
 					if (G_TYPE_CHECK_INSTANCE_TYPE(folder, CAMEL_TYPE_DISCO_FOLDER)
-					    && (sync || ((CamelDiscoFolder *)folder)->offline_sync)) {
+					    && (sync || camel_disco_folder_get_offline_sync (CAMEL_DISCO_FOLDER (folder)))) {
 						camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder, "", &x);
 						camel_exception_clear(&x);
 					}
@@ -402,7 +402,7 @@ camel_disco_store_prepare_for_offline (CamelDiscoStore *disco_store,
 				for (i=0;i<folders->len;i++) {
 					folder = folders->pdata[i];
 					if (G_TYPE_CHECK_INSTANCE_TYPE(folder, CAMEL_TYPE_DISCO_FOLDER)
-					    && (sync || ((CamelDiscoFolder *)folder)->offline_sync)) {
+					    && (sync || camel_disco_folder_get_offline_sync (CAMEL_DISCO_FOLDER (folder)))) {
 						camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder, "(match-all)", &x);
 						camel_exception_clear(&x);
 					}
diff --git a/camel/camel-disco-store.h b/camel/camel-disco-store.h
index 66ebc2a..609c02e 100644
--- a/camel/camel-disco-store.h
+++ b/camel/camel-disco-store.h
@@ -58,10 +58,6 @@ struct _CamelDiscoDiary;
 typedef struct _CamelDiscoStore CamelDiscoStore;
 typedef struct _CamelDiscoStoreClass CamelDiscoStoreClass;
 
-enum {
-	CAMEL_DISCO_STORE_ARG_FIRST  = CAMEL_STORE_ARG_FIRST + 100
-};
-
 typedef enum {
 	CAMEL_DISCO_STORE_ONLINE,
 	CAMEL_DISCO_STORE_OFFLINE,
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index bfca34b..09f9daf 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -495,6 +495,12 @@ camel_folder_search_count (CamelFolderSearch *search,
 		e_sexp_result_free(search->sexp, r);
 
 	} else {
+		CamelStore *parent_store;
+		const gchar *full_name;
+
+		full_name = camel_folder_get_full_name (search->folder);
+		parent_store = camel_folder_get_parent_store (search->folder);
+
 		/* Sync the db, so that we search the db for changes */
 		camel_folder_summary_save_to_db (search->folder->summary, ex);
 
@@ -503,13 +509,13 @@ camel_folder_search_count (CamelFolderSearch *search,
 			sql_query = camel_sexp_to_sql (expr);
 		else
 			sql_query = camel_sexp_to_sql_sexp (expr);
-		tmp1 = camel_db_sqlize_string(search->folder->full_name);
+		tmp1 = camel_db_sqlize_string (full_name);
 		tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query?sql_query:"");
 		camel_db_free_sqlized_string (tmp1);
 		g_free (sql_query);
 		dd(printf("Equivalent sql %s\n", tmp));
 
-		cdb = (CamelDB *) (search->folder->parent_store->cdb_r);
+		cdb = (CamelDB *) (parent_store->cdb_r);
 		camel_db_count_message_info  (cdb, tmp, &count, ex);
 		if (ex && camel_exception_is_set(ex)) {
 			const gchar *exception = camel_exception_get_description (ex);
@@ -661,6 +667,12 @@ camel_folder_search_search (CamelFolderSearch *search,
 		e_sexp_result_free(search->sexp, r);
 
 	} else {
+		CamelStore *parent_store;
+		const gchar *full_name;
+
+		full_name = camel_folder_get_full_name (search->folder);
+		parent_store = camel_folder_get_parent_store (search->folder);
+
 		/* Sync the db, so that we search the db for changes */
 		camel_folder_summary_save_to_db (search->folder->summary, ex);
 
@@ -669,14 +681,14 @@ camel_folder_search_search (CamelFolderSearch *search,
 			sql_query = camel_sexp_to_sql (expr);
 		else
 			sql_query = camel_sexp_to_sql_sexp (expr);
-		tmp1 = camel_db_sqlize_string(search->folder->full_name);
+		tmp1 = camel_db_sqlize_string (full_name);
 		tmp = g_strdup_printf ("SELECT uid FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query?sql_query:"");
 		camel_db_free_sqlized_string (tmp1);
 		g_free (sql_query);
 		dd(printf("Equivalent sql %s\n", tmp));
 
 		matches = g_ptr_array_new();
-		cdb = (CamelDB *) (search->folder->parent_store->cdb_r);
+		cdb = (CamelDB *) (parent_store->cdb_r);
 		camel_db_select (cdb, tmp, (CamelDBSelectCB) read_uid_callback, matches, ex);
 		if (ex && camel_exception_is_set(ex)) {
 			const gchar *exception = camel_exception_get_description (ex);
@@ -1816,16 +1828,19 @@ read_uid_callback (gpointer  ref, gint ncol, gchar ** cols, gchar **name)
 static ESExpResult *
 search_message_location (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search)
 {
+	CamelStore *parent_store;
 	ESExpResult *r;
 	gboolean same = FALSE;
 
+	parent_store = camel_folder_get_parent_store (search->folder);
+
 	if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
-		if (argv[0]->value.string && search->folder && search->folder->parent_store && camel_folder_get_full_name (search->folder)) {
-			CamelFolderInfo *fi = camel_store_get_folder_info (search->folder->parent_store, camel_folder_get_full_name (search->folder), 0, NULL);
+		if (argv[0]->value.string && search->folder && parent_store && camel_folder_get_full_name (search->folder)) {
+			CamelFolderInfo *fi = camel_store_get_folder_info (parent_store, camel_folder_get_full_name (search->folder), 0, NULL);
 			if (fi) {
 				same = g_str_equal (fi->uri ? fi->uri : "", argv[0]->value.string);
 
-				camel_store_free_folder_info (search->folder->parent_store, fi);
+				camel_store_free_folder_info (parent_store, fi);
 			}
 		}
 	}
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index 550b108..5a60dbc 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -292,16 +292,19 @@ summary_header_to_db (CamelFolderSummary *s,
                       CamelException *ex)
 {
 	CamelFIRecord * record = g_new0 (CamelFIRecord, 1);
+	CamelStore *parent_store;
 	CamelDB *db;
-	gchar *table_name;
+	const gchar *table_name;
 
-	/* Though we are going to read, we do this during write, so lets use it that way */
-	db = s->folder->parent_store->cdb_w;
-	table_name = s->folder->full_name;
+	/* Though we are going to read, we do this during write,
+	 * so lets use it that way. */
+	table_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	db = parent_store->cdb_w;
 
 	io(printf("Savining header to db\n"));
 
-	record->folder_name = table_name;
+	record->folder_name = g_strdup (table_name);
 
 	/* we always write out the current version */
 	record->version = CAMEL_FOLDER_SUMMARY_VERSION;
@@ -1278,15 +1281,17 @@ message_info_from_uid (CamelFolderSummary *s, const gchar *uid)
 	if (!info) {
 		CamelDB *cdb;
 		CamelException ex;
-		gchar *folder_name;
+		CamelStore *parent_store;
+		const gchar *folder_name;
 		struct _db_pass_data data;
 
 		d(printf ("\ncamel_folder_summary_uid called \n"));
 		camel_exception_init (&ex);
 		s->flags &= ~CAMEL_SUMMARY_DIRTY;
 
-		folder_name = s->folder->full_name;
-		cdb = s->folder->parent_store->cdb_r;
+		folder_name = camel_folder_get_full_name (s->folder);
+		parent_store = camel_folder_get_parent_store (s->folder);
+		cdb = parent_store->cdb_r;
 
 		data.summary = s;
 		data.add = FALSE;
@@ -1561,7 +1566,6 @@ remove_cache (CamelSession *session, CamelSessionThreadMsg *msg)
 	if (time(NULL) - s->cache_load_time < SUMMARY_CACHE_DROP)
 		return;
 
-	dd(printf("removing cache for  %s %d %p ", s->folder ? s->folder->full_name : s->summary_path, g_hash_table_size (s->loaded_infos), (gpointer) s->loaded_infos));
 	/* FIXME[disk-summary] hack. fix it */
 	camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
 
@@ -1596,6 +1600,7 @@ static gboolean
 cfs_try_release_memory (CamelFolderSummary *s)
 {
 	struct _folder_summary_free_msg *m;
+	CamelStore *parent_store;
 	CamelSession *session;
 
 	/* If folder is freed or if the cache is nil then clean up */
@@ -1605,7 +1610,8 @@ cfs_try_release_memory (CamelFolderSummary *s)
 		return FALSE;
 	}
 
-	session = ((CamelService *)((CamelFolder *)s->folder)->parent_store)->session;
+	parent_store = camel_folder_get_parent_store (s->folder);
+	session = CAMEL_SERVICE (parent_store)->session;
 
 	if (time(NULL) - s->cache_load_time < SUMMARY_CACHE_DROP)
 		return TRUE;
@@ -1663,7 +1669,12 @@ msg_update_preview (const gchar *uid, gpointer value, CamelFolder *folder)
 {
 	CamelMessageInfoBase *info = (CamelMessageInfoBase *)camel_folder_summary_uid (folder->summary, uid);
 	CamelMimeMessage *msg;
+	CamelStore *parent_store;
 	CamelException ex;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
 
 	camel_exception_init(&ex);
 	msg = camel_folder_get_message (folder, uid, &ex);
@@ -1671,7 +1682,7 @@ msg_update_preview (const gchar *uid, gpointer value, CamelFolder *folder)
 		g_warning ("Error fetching message: %s", camel_exception_get_description(&ex));
 	else {
 		if (camel_mime_message_build_preview ((CamelMimePart *)msg, (CamelMessageInfo *)info) && info->preview)
-			camel_db_write_preview_record (folder->parent_store->cdb_w, folder->full_name, info->uid, info->preview, NULL);
+			camel_db_write_preview_record (parent_store->cdb_w, full_name, info->uid, info->preview, NULL);
 	}
 	camel_exception_clear(&ex);
 	camel_message_info_free(info);
@@ -1705,9 +1716,13 @@ preview_update_exec (CamelSession *session, CamelSessionThreadMsg *msg)
 	GPtrArray *uids_uncached= camel_folder_get_uncached_uids (m->folder, m->folder->summary->uids, NULL);
 	GHashTable *hash = camel_folder_summary_get_hashtable (m->folder->summary);
 	GHashTable *preview_data;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint i;
 
-	preview_data = camel_db_get_folder_preview (m->folder->parent_store->cdb_r, m->folder->full_name, NULL);
+	full_name = camel_folder_get_full_name (m->folder);
+	parent_store = camel_folder_get_parent_store (m->folder);
+	preview_data = camel_db_get_folder_preview (parent_store->cdb_r, full_name, NULL);
 	if (preview_data) {
 		g_hash_table_foreach_remove (preview_data, (GHRFunc)fill_mi, m->folder);
 		g_hash_table_destroy (preview_data);
@@ -1723,9 +1738,9 @@ preview_update_exec (CamelSession *session, CamelSessionThreadMsg *msg)
 	}
 
 	camel_folder_lock (m->folder, CF_REC_LOCK);
-	camel_db_begin_transaction (m->folder->parent_store->cdb_w, NULL);
+	camel_db_begin_transaction (parent_store->cdb_w, NULL);
 	g_hash_table_foreach (hash, (GHFunc)msg_update_preview, m->folder);
-	camel_db_end_transaction (m->folder->parent_store->cdb_w, NULL);
+	camel_db_end_transaction (parent_store->cdb_w, NULL);
 	camel_folder_unlock (m->folder, CF_REC_LOCK);
 	camel_folder_free_uids(m->folder, uids_uncached);
 	camel_folder_summary_free_hashtable (hash);
@@ -1749,7 +1764,8 @@ static gint
 cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex)
 {
 	CamelDB *cdb;
-	gchar *folder_name;
+	CamelStore *parent_store;
+	const gchar *folder_name;
 	gint ret = 0;
 	struct _db_pass_data data;
 
@@ -1757,8 +1773,9 @@ cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex)
 	 * load better. */
 	d(printf ("\ncamel_folder_summary_reload_from_db called \n"));
 
-	folder_name = s->folder->full_name;
-	cdb = s->folder->parent_store->cdb_r;
+	folder_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_r;
 
 	/* FIXME FOR SANKAR: No need to pass the address of summary here. */
 	data.summary = s;
@@ -1770,10 +1787,10 @@ cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex)
 	if (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->need_preview) {
 		struct _preview_update_msg *m;
 
-		m = camel_session_thread_msg_new(((CamelService *)s->folder->parent_store)->session, &preview_update_ops, sizeof(*m));
+		m = camel_session_thread_msg_new(((CamelService *)parent_store)->session, &preview_update_ops, sizeof(*m));
 		m->folder = s->folder;
 		camel_exception_init(&m->ex);
-		camel_session_thread_queue(((CamelService *)s->folder->parent_store)->session, &m->msg, 0);
+		camel_session_thread_queue(((CamelService *)parent_store)->session, &m->msg, 0);
 	}
 
 	return ret == 0 ? 0 : -1;
@@ -1802,7 +1819,7 @@ camel_folder_summary_add_preview (CamelFolderSummary *s, CamelMessageInfo *info)
  * before any mass operation or when all message infos will be needed,
  * for better performance.
  *
- * Since: 2.31
+ * Since: 3.0
  **/
 void
 camel_folder_summary_prepare_fetch_all (CamelFolderSummary *s, CamelException *ex)
@@ -1821,19 +1838,6 @@ camel_folder_summary_prepare_fetch_all (CamelFolderSummary *s, CamelException *e
 	s->cache_load_time = time (NULL);
 }
 
-#if 0
-static void
-camel_folder_summary_dump (CamelFolderSummary *s)
-{
-	gint i;
-
-	printf("Dumping %s\n", s->folder ? s->folder->full_name:"nil");
-	for (i=0; i<s->uids->len; i++)
-		printf("%s\t", (gchar *)s->uids->pdata[i]);
-	printf("\n");
-}
-#endif
-
 /**
  * camel_folder_summary_get_flag_cache:
  *
@@ -1857,7 +1861,8 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s,
                                    CamelException *ex)
 {
 	CamelDB *cdb;
-	gchar *folder_name;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint ret = 0;
 	CamelException ex2;
 	struct _CamelFolderSummaryPrivate *p = CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s);
@@ -1866,32 +1871,31 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s,
 	d(printf ("\ncamel_folder_summary_load_from_db called \n"));
 	s->flags &= ~CAMEL_SUMMARY_DIRTY;
 
-	ret = camel_folder_summary_header_load_from_db (s, s->folder->parent_store, s->folder->full_name, ex);
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	ret = camel_folder_summary_header_load_from_db (s, parent_store, full_name, ex);
 
 	if (ret)
 		return ret;
 
-	folder_name = s->folder->full_name;
-	cdb = s->folder->parent_store->cdb_r;
+	cdb = parent_store->cdb_r;
 
 	camel_exception_init (&ex2);
 
 	ret = camel_db_get_folder_uids_flags (
-		cdb, folder_name, s->sort_by, s->collate,
+		cdb, full_name, s->sort_by, s->collate,
 		s->uids, p->flag_cache, &ex2);
 
 	if (camel_exception_is_set (&ex2) && camel_exception_get_description (&ex2) &&
 	    strstr (camel_exception_get_description (&ex2), "no such table") != NULL) {
 		/* create table the first time it is accessed and missing */
-		ret = camel_db_prepare_message_info_table (cdb, folder_name, ex);
+		ret = camel_db_prepare_message_info_table (cdb, full_name, ex);
 	} else if (ex) {
 		camel_exception_xfer (ex, &ex2);
 	}
 
 	camel_exception_clear (&ex2);
 
-	/* camel_folder_summary_dump (s); */
-
 #if 0
 	data.summary = s;
 	data.add = TRUE;
@@ -2105,11 +2109,15 @@ camel_folder_summary_migrate_infos(CamelFolderSummary *s)
 	gint i;
 	CamelMessageInfo *mi;
 	CamelMessageInfoBase *info;
+	CamelStore *parent_store;
 	gint ret = 0;
-	CamelDB *cdb = s->folder->parent_store->cdb_w;
+	CamelDB *cdb;
 	CamelFIRecord *record;
 	CamelException ex;
 
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
+
 	/* Kick off the gc thread cycle. */
 	if (s->timeout_handle)
 		g_source_remove (s->timeout_handle);
@@ -2259,10 +2267,15 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data)
 	CamelException *ex = args->ex;
 	CamelMessageInfoBase *mi = (CamelMessageInfoBase *)value;
 	CamelFolderSummary *s = (CamelFolderSummary *)mi->summary;
-	gchar *folder_name = s->folder->full_name;
-	CamelDB *cdb = s->folder->parent_store->cdb_w;
+	CamelStore *parent_store;
+	const gchar *full_name;
+	CamelDB *cdb;
 	CamelMIRecord *mir;
 
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
+
 	if (!args->migration && !mi->dirty)
 		return;
 
@@ -2278,7 +2291,7 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data)
 	}
 
 	if (!args->migration) {
-			if (camel_db_write_message_info_record (cdb, folder_name, mir, ex) != 0) {
+			if (camel_db_write_message_info_record (cdb, full_name, mir, ex) != 0) {
 					camel_db_camel_mir_free (mir);
 					return;
 			}
@@ -2290,7 +2303,7 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data)
 
 			if (args->progress > CAMEL_DB_IN_MEMORY_TABLE_LIMIT) {
 			    g_print ("BULK INsert limit reached \n");
-				camel_db_flush_in_memory_transactions (cdb, folder_name, ex);
+				camel_db_flush_in_memory_transactions (cdb, full_name, ex);
 				camel_db_start_in_memory_transactions (cdb, ex);
 				args->progress = 0;
 			} else {
@@ -2311,18 +2324,22 @@ save_message_infos_to_db (CamelFolderSummary *s,
                           gboolean fresh_mirs,
                           CamelException *ex)
 {
-	CamelDB *cdb = s->folder->parent_store->cdb_w;
-	gchar *folder_name;
+	CamelStore *parent_store;
+	CamelDB *cdb;
+	const gchar *full_name;
 	SaveToDBArgs args;
 
 	args.ex = ex;
 	args.migration = fresh_mirs;
 	args.progress = 0;
 
-	folder_name = s->folder->full_name;
-	if (camel_db_prepare_message_info_table (cdb, folder_name, ex) != 0) {
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
+
+	if (camel_db_prepare_message_info_table (cdb, full_name, ex) != 0)
 		return -1;
-	}
+
 	camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
 	/* Push MessageInfo-es */
 	g_hash_table_foreach (s->loaded_infos, save_to_db_cb, &args);
@@ -2336,7 +2353,14 @@ save_message_infos_to_db (CamelFolderSummary *s,
 static void
 msg_save_preview (const gchar *uid, gpointer value, CamelFolder *folder)
 {
-	camel_db_write_preview_record (folder->parent_store->cdb_w, folder->full_name, uid, (gchar *)value, NULL);
+	CamelStore *parent_store;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	camel_db_write_preview_record (
+		parent_store->cdb_w, full_name, uid, (gchar *)value, NULL);
 }
 
 /**
@@ -2348,18 +2372,22 @@ gint
 camel_folder_summary_save_to_db (CamelFolderSummary *s,
                                  CamelException *ex)
 {
-	CamelDB *cdb = s->folder->parent_store->cdb_w;
+	CamelStore *parent_store;
+	CamelDB *cdb;
 	CamelFIRecord *record;
 	gint ret, count;
 
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
+
 	d(printf ("\ncamel_folder_summary_save_to_db called \n"));
 	if (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->need_preview && g_hash_table_size(CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates)) {
-		camel_db_begin_transaction (s->folder->parent_store->cdb_w, NULL);
+		camel_db_begin_transaction (parent_store->cdb_w, NULL);
 		camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
 		g_hash_table_foreach (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates, (GHFunc)msg_save_preview, s->folder);
 		g_hash_table_remove_all (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates);
 		camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
-		camel_db_end_transaction (s->folder->parent_store->cdb_w, NULL);
+		camel_db_end_transaction (parent_store->cdb_w, NULL);
 	}
 
 	if (!(s->flags & CAMEL_SUMMARY_DIRTY))
@@ -2371,8 +2399,6 @@ camel_folder_summary_save_to_db (CamelFolderSummary *s,
 	if (!count)
 		return camel_folder_summary_header_save_to_db (s, ex);
 
-	dd(printf("Saving %d/%d dirty records of %s\n", count, g_hash_table_size (s->loaded_infos), s->folder->full_name));
-
 	camel_db_begin_transaction (cdb, ex);
 
 	ret = save_message_infos_to_db (s, FALSE, ex);
@@ -2384,10 +2410,13 @@ camel_folder_summary_save_to_db (CamelFolderSummary *s,
 	}
 
 	if (ex && camel_exception_is_set (ex) && strstr (camel_exception_get_description (ex), "26 columns but 28 values") != NULL) {
+		const gchar *full_name;
+
 		/* This is an error is previous migration. Let remigrate this folder alone. */
 		camel_db_abort_transaction (cdb, ex);
-		camel_db_reset_folder_version (cdb, s->folder->full_name, 0, ex);
-		g_warning ("Fixing up a broken summary migration on %s\n", s->folder->full_name);
+		full_name = camel_folder_get_full_name (s->folder);
+		camel_db_reset_folder_version (cdb, full_name, 0, ex);
+		g_warning ("Fixing up a broken summary migration on %s\n", full_name);
 		/* Begin everything again. */
 		camel_db_begin_transaction (cdb, ex);
 
@@ -2433,10 +2462,14 @@ gint
 camel_folder_summary_header_save_to_db (CamelFolderSummary *s,
                                         CamelException *ex)
 {
-	CamelDB *cdb = s->folder->parent_store->cdb_w;
+	CamelStore *parent_store;
 	CamelFIRecord *record;
+	CamelDB *cdb;
 	gint ret;
 
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
+
 	d(printf ("\ncamel_folder_summary_header_save_to_db called \n"));
 
 	record = CAMEL_FOLDER_SUMMARY_GET_CLASS (s)->summary_header_to_db (s, ex);
@@ -3123,8 +3156,9 @@ camel_folder_summary_clear(CamelFolderSummary *s)
 void
 camel_folder_summary_clear_db (CamelFolderSummary *s)
 {
+	CamelStore *parent_store;
 	CamelDB *cdb;
-	gchar *folder_name;
+	const gchar *folder_name;
 
 	/* FIXME: This is non-sense. Neither an exception is passed,
 	nor a value returned. How is the caller supposed to know,
@@ -3133,8 +3167,9 @@ camel_folder_summary_clear_db (CamelFolderSummary *s)
 	d(printf ("\ncamel_folder_summary_load_from_db called \n"));
 	s->flags &= ~CAMEL_SUMMARY_DIRTY;
 
-	folder_name = s->folder->full_name;
-	cdb = s->folder->parent_store->cdb_w;
+	folder_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	cdb = parent_store->cdb_w;
 
 	camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
 	if (camel_folder_summary_count(s) == 0) {
@@ -3188,6 +3223,8 @@ summary_remove_uid (CamelFolderSummary *s, const gchar *uid)
 void
 camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info)
 {
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gboolean found;
 	gint ret;
 
@@ -3201,7 +3238,10 @@ camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info)
 	s->meta_summary->msg_expunged = TRUE;
 	camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
 
-	if (!ret && camel_db_delete_uid (s->folder->parent_store->cdb_w, s->folder->full_name, camel_message_info_uid(info), NULL) != 0)
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+
+	if (!ret && camel_db_delete_uid (parent_store->cdb_w, full_name, camel_message_info_uid(info), NULL) != 0)
 		return;
 
 	if (found)
@@ -3218,32 +3258,36 @@ camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info)
 void
 camel_folder_summary_remove_uid(CamelFolderSummary *s, const gchar *uid)
 {
-		CamelMessageInfo *oldinfo;
-		gchar *olduid;
+	CamelMessageInfo *oldinfo;
+	gchar *olduid;
 
-		camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
-		camel_folder_summary_lock (s, CFS_REF_LOCK);
-		if (g_hash_table_lookup_extended(s->loaded_infos, uid, (gpointer)&olduid, (gpointer)&oldinfo)) {
-				/* make sure it doesn't vanish while we're removing it */
-				camel_message_info_ref (oldinfo);
-				camel_folder_summary_unlock (s, CFS_REF_LOCK);
-				camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
-				camel_folder_summary_remove(s, oldinfo);
-				camel_message_info_free(oldinfo);
-		} else {
-				gchar *tmpid = g_strdup (uid);
-				gint ret;
-				/* Info isn't loaded into the memory. We must just remove the UID*/
-				ret = summary_remove_uid (s, uid);
-				camel_folder_summary_unlock (s, CFS_REF_LOCK);
-				camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
+	camel_folder_summary_lock (s, CFS_SUMMARY_LOCK);
+	camel_folder_summary_lock (s, CFS_REF_LOCK);
+	if (g_hash_table_lookup_extended(s->loaded_infos, uid, (gpointer)&olduid, (gpointer)&oldinfo)) {
+		/* make sure it doesn't vanish while we're removing it */
+		camel_message_info_ref (oldinfo);
+		camel_folder_summary_unlock (s, CFS_REF_LOCK);
+		camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
+		camel_folder_summary_remove(s, oldinfo);
+		camel_message_info_free(oldinfo);
+	} else {
+		CamelStore *parent_store;
+		const gchar *full_name;
+		gchar *tmpid = g_strdup (uid);
+		gint ret;
+		/* Info isn't loaded into the memory. We must just remove the UID*/
+		ret = summary_remove_uid (s, uid);
+		camel_folder_summary_unlock (s, CFS_REF_LOCK);
+		camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK);
 
-				if (!ret && camel_db_delete_uid (s->folder->parent_store->cdb_w, s->folder->full_name, tmpid, NULL) != 0) {
-						g_free(tmpid);
-						return;
-				}
-				g_free (tmpid);
+		full_name = camel_folder_get_full_name (s->folder);
+		parent_store = camel_folder_get_parent_store (s->folder);
+		if (!ret && camel_db_delete_uid (parent_store->cdb_w, full_name, tmpid, NULL) != 0) {
+			g_free(tmpid);
+			return;
 		}
+		g_free (tmpid);
+	}
 }
 
 /* _fast doesn't deal with db and leaves it to the caller. */
@@ -3350,8 +3394,9 @@ camel_folder_summary_remove_range (CamelFolderSummary *s, gint start, gint end)
 
 		gint i;
 		CamelDB *cdb;
+		CamelStore *parent_store;
 		CamelException ex; /* May be this should come from the caller  */
-		gchar *folder_name;
+		const gchar *folder_name;
 		GSList *uids = NULL;
 
 		end = MIN(end+1, s->uids->len);
@@ -3370,8 +3415,9 @@ camel_folder_summary_remove_range (CamelFolderSummary *s, gint start, gint end)
 		}
 		camel_exception_init (&ex);
 
-		folder_name = s->folder->full_name;
-		cdb = s->folder->parent_store->cdb_w;
+		folder_name = camel_folder_get_full_name (s->folder);
+		parent_store = camel_folder_get_parent_store (s->folder);
+		cdb = parent_store->cdb_w;
 
 		/* FIXME[disk-summary] lifecycle of infos should be checked.
 		 * Add should add to db and del should del to db. Sync only
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index 776a6ed..c0f6070 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -57,6 +57,20 @@ struct _CamelFolderPrivate {
 	gint frozen;
 	struct _CamelFolderChangeInfo *changed_frozen; /* queues changed events */
 	gboolean skip_folder_lock;
+
+	CamelStore *parent_store;
+
+	gchar *name;
+	gchar *full_name;
+	gchar *description;
+};
+
+enum {
+	PROP_0,
+	PROP_DESCRIPTION,
+	PROP_FULL_NAME,
+	PROP_NAME,
+	PROP_PARENT_STORE
 };
 
 G_DEFINE_ABSTRACT_TYPE (CamelFolder, camel_folder, CAMEL_TYPE_OBJECT)
@@ -116,15 +130,95 @@ folder_transfer_message_to (CamelFolder *source,
 }
 
 static void
+folder_set_parent_store (CamelFolder *folder,
+                         CamelStore *parent_store)
+{
+	g_return_if_fail (CAMEL_IS_STORE (parent_store));
+	g_return_if_fail (folder->priv->parent_store == NULL);
+
+	folder->priv->parent_store = g_object_ref (parent_store);
+}
+
+static void
+folder_set_property (GObject *object,
+                     guint property_id,
+                     const GValue *value,
+                     GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_DESCRIPTION:
+			camel_folder_set_description (
+				CAMEL_FOLDER (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_FULL_NAME:
+			camel_folder_set_full_name (
+				CAMEL_FOLDER (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_NAME:
+			camel_folder_set_name (
+				CAMEL_FOLDER (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_PARENT_STORE:
+			folder_set_parent_store (
+				CAMEL_FOLDER (object),
+				g_value_get_object (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+folder_get_property (GObject *object,
+                     guint property_id,
+                     GValue *value,
+                     GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_DESCRIPTION:
+			g_value_set_string (
+				value, camel_folder_get_description (
+				CAMEL_FOLDER (object)));
+			return;
+
+		case PROP_FULL_NAME:
+			g_value_set_string (
+				value, camel_folder_get_full_name (
+				CAMEL_FOLDER (object)));
+			return;
+
+		case PROP_NAME:
+			g_value_set_string (
+				value, camel_folder_get_name (
+				CAMEL_FOLDER (object)));
+			return;
+
+		case PROP_PARENT_STORE:
+			g_value_set_object (
+				value, camel_folder_get_parent_store (
+				CAMEL_FOLDER (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
 folder_dispose (GObject *object)
 {
 	CamelFolder *folder;
 
 	folder = CAMEL_FOLDER (object);
 
-	if (folder->parent_store != NULL) {
-		g_object_unref (folder->parent_store);
-		folder->parent_store = NULL;
+	if (folder->priv->parent_store != NULL) {
+		g_object_unref (folder->priv->parent_store);
+		folder->priv->parent_store = NULL;
 	}
 
 	if (folder->summary) {
@@ -146,9 +240,9 @@ folder_finalize (GObject *object)
 	folder = CAMEL_FOLDER (object);
 	priv = CAMEL_FOLDER_GET_PRIVATE (object);
 
-	g_free (folder->name);
-	g_free (folder->full_name);
-	g_free (folder->description);
+	g_free (priv->name);
+	g_free (priv->full_name);
+	g_free (priv->description);
 
 	camel_folder_change_info_free (priv->changed_frozen);
 
@@ -159,180 +253,6 @@ folder_finalize (GObject *object)
 	G_OBJECT_CLASS (camel_folder_parent_class)->finalize (object);
 }
 
-static gint
-folder_getv (CamelObject *object,
-             CamelException *ex,
-             CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i;
-	guint32 tag;
-	gint unread = -1, deleted = 0, junked = 0, junked_not_deleted = 0, visible = 0, count = -1;
-
-	for (i = 0; i < args->argc; i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-			/* CamelObject args */
-		case CAMEL_OBJECT_ARG_DESCRIPTION:
-			if (folder->description == NULL)
-				folder->description = g_strdup_printf ("%s", folder->full_name);
-			*arg->ca_str = folder->description;
-			break;
-
-			/* CamelFolder args */
-		case CAMEL_FOLDER_ARG_NAME:
-			*arg->ca_str = folder->name;
-			break;
-		case CAMEL_FOLDER_ARG_FULL_NAME:
-			*arg->ca_str = folder->full_name;
-			break;
-		case CAMEL_FOLDER_ARG_STORE:
-			*arg->ca_object = folder->parent_store;
-			break;
-		case CAMEL_FOLDER_ARG_PERMANENTFLAGS:
-			*arg->ca_int = folder->permanent_flags;
-			break;
-		case CAMEL_FOLDER_ARG_TOTAL:
-			*arg->ca_int = camel_folder_summary_count (folder->summary);
-			break;
-		case CAMEL_FOLDER_ARG_UNREAD:
-		case CAMEL_FOLDER_ARG_DELETED:
-		case CAMEL_FOLDER_ARG_JUNKED:
-		case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-		case CAMEL_FOLDER_ARG_VISIBLE:
-			/* This is so we can get the values atomically, and also so we can calculate them only once */
-
-			/* FIXME[disk-summary] Add a better base class
-			 * function to get counts specific to normal/vee
-			 * folder. */
-			if (unread == -1) {
-
-				if (1) {
-					unread = folder->summary->unread_count;
-					deleted = folder->summary->deleted_count;
-					junked = folder->summary->junk_count;
-					junked_not_deleted = folder->summary->junk_not_deleted_count;
-					visible = folder->summary->visible_count;
-				} else {
-					/* count = camel_folder_summary_count (folder->summary);
-					for (j = 0; j < count; j++) {
-						if ((info = camel_folder_summary_index (folder->summary, j))) {
-							guint32 flags = camel_message_info_flags (info);
-
-							if ((flags & (CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0)
-								unread++;
-							if (flags & CAMEL_MESSAGE_DELETED)
-								deleted++;
-							if (flags & CAMEL_MESSAGE_JUNK) {
-								junked++;
-								if (!(flags & CAMEL_MESSAGE_DELETED))
-									junked_not_deleted++;
-							}
-							if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0)
-								visible++;
-							camel_message_info_free (info);
-						}
-
-					}*/
-                                        /* FIXME[disk-summary] I added it for
-					 * vfolders summary storage, does it
-					 * harm ? */
-					if (unread == -1) {
-						/*unread = folder->summary->unread_count;*/
-						/*
-						folder->summary->junk_count = junked;
-						folder->summary->deleted_count = deleted;
-						printf ("*************************** %s %d %d %d\n", folder->full_name, folder->summary->unread_count, unread, count);
-						folder->summary->unread_count = unread; */
-					}
-				}
-
-			}
-
-			switch (tag & CAMEL_ARG_TAG) {
-			case CAMEL_FOLDER_ARG_UNREAD:
-				count = unread == -1 ? 0 : unread;
-				break;
-			case CAMEL_FOLDER_ARG_DELETED:
-				count = deleted == -1 ? 0 : deleted;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED:
-				count = junked == -1 ? 0 : junked;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-				count = junked_not_deleted == -1 ? 0 : junked_not_deleted;
-				break;
-			case CAMEL_FOLDER_ARG_VISIBLE:
-				count = visible == -1 ? 0 : visible;
-				break;
-			}
-
-			*arg->ca_int = count;
-			break;
-		case CAMEL_FOLDER_ARG_UID_ARRAY: {
-/*			gint j;
-			CamelMessageInfo *info;
-			GPtrArray *array;
-
-			count = camel_folder_summary_count (folder->summary);
-			array = g_ptr_array_new ();
-			g_ptr_array_set_size (array, count);
-			for (j=0; j<count; j++) {
-				if ((info = camel_folder_summary_index (folder->summary, j))) {
-					array->pdata[i] = g_strdup (camel_message_info_uid (info));
-					camel_message_info_free (info);
-				}
-			}
-			*arg->ca_ptr = array;*/
-			/* WTH this is reqd ?, let it crash to find out who uses this */
-			g_assert_not_reached ();
-			break; }
-		case CAMEL_FOLDER_ARG_INFO_ARRAY:
-			*arg->ca_ptr = camel_folder_summary_array (folder->summary);
-			break;
-		case CAMEL_FOLDER_ARG_PROPERTIES:
-			*arg->ca_ptr = NULL;
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return CAMEL_OBJECT_CLASS (camel_folder_parent_class)->getv (object, ex, args);
-}
-
-static void
-folder_free (CamelObject *object,
-             guint32 tag,
-             gpointer val)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-
-	switch (tag & CAMEL_ARG_TAG) {
-	case CAMEL_FOLDER_ARG_UID_ARRAY: {
-		GPtrArray *array = val;
-		gint i;
-
-		for (i=0; i<array->len; i++)
-			g_free (array->pdata[i]);
-		g_ptr_array_free (array, TRUE);
-		break; }
-	case CAMEL_FOLDER_ARG_INFO_ARRAY:
-		camel_folder_free_summary (folder, val);
-		break;
-	case CAMEL_FOLDER_ARG_PROPERTIES:
-		g_slist_free (val);
-		break;
-	default:
-		CAMEL_OBJECT_CLASS (camel_folder_parent_class)->free (object, tag, val);
-	}
-}
-
 static gboolean
 folder_refresh_info (CamelFolder *folder,
                      CamelException *ex)
@@ -340,24 +260,6 @@ folder_refresh_info (CamelFolder *folder,
 	return TRUE;
 }
 
-static const gchar *
-folder_get_name (CamelFolder *folder)
-{
-	return folder->name;
-}
-
-static const gchar *
-folder_get_full_name (CamelFolder *folder)
-{
-	return folder->full_name;
-}
-
-static CamelStore *
-folder_get_parent_store (CamelFolder * folder)
-{
-	return folder->parent_store;
-}
-
 static gint
 folder_get_message_count (CamelFolder *folder)
 {
@@ -666,11 +568,10 @@ folder_rename (CamelFolder *folder,
 
 	d (printf ("CamelFolder:rename ('%s')\n", new));
 
-	g_free (folder->full_name);
-	folder->full_name = g_strdup (new);
-	g_free (folder->name);
+	camel_folder_set_full_name (folder, new);
+
 	tmp = strrchr (new, '/');
-	folder->name = g_strdup (tmp?tmp+1:new);
+	camel_folder_set_name (folder, (tmp != NULL) ? tmp + 1 : new);
 }
 
 static void
@@ -734,17 +635,12 @@ camel_folder_class_init (CamelFolderClass *class)
 	g_type_class_add_private (class, sizeof (CamelFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = folder_set_property;
+	object_class->get_property = folder_get_property;
 	object_class->dispose = folder_dispose;
 	object_class->finalize = folder_finalize;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = folder_getv;
-	camel_object_class->free = folder_free;
-
 	class->refresh_info = folder_refresh_info;
-	class->get_name = folder_get_name;
-	class->get_full_name = folder_get_full_name;
-	class->get_parent_store = folder_get_parent_store;
 	class->get_message_count = folder_get_message_count;
 	class->get_permanent_flags = folder_get_permanent_flags;
 	class->get_message_flags = folder_get_message_flags;
@@ -772,12 +668,77 @@ camel_folder_class_init (CamelFolderClass *class)
 	class->is_frozen = folder_is_frozen;
 	class->get_quota_info = folder_get_quota_info;
 
+	camel_object_class = CAMEL_OBJECT_CLASS (class);
 	camel_object_class_add_event (
 		camel_object_class, "folder_changed", folder_changed);
 	camel_object_class_add_event (
 		camel_object_class, "deleted", NULL);
 	camel_object_class_add_event (
 		camel_object_class, "renamed", NULL);
+
+	/**
+	 * CamelFolder:description
+	 *
+	 * The folder's description.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_DESCRIPTION,
+		g_param_spec_string (
+			"description",
+			"Description",
+			"The folder's description",
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	/**
+	 * CamelFolder:full-name
+	 *
+	 * The folder's fully qualified name.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_FULL_NAME,
+		g_param_spec_string (
+			"full-name",
+			"Full Name",
+			"The folder's fully qualified name",
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	/**
+	 * CamelFolder:name
+	 *
+	 * The folder's short name.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_NAME,
+		g_param_spec_string (
+			"name",
+			"Name",
+			"The folder's short name",
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	/**
+	 * CamelFolder:parent-store
+	 *
+	 * The #CamelStore to which the folder belongs.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_PARENT_STORE,
+		g_param_spec_object (
+			"parent-store",
+			"Parent Store",
+			"The store to which the folder belongs",
+			CAMEL_TYPE_STORE,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
 }
 
 static void
@@ -832,34 +793,6 @@ camel_folder_get_filename (CamelFolder *folder,
 }
 
 /**
- * camel_folder_construct:
- * @folder: a #CamelFolder to construct
- * @parent_store: parent #CamelStore object of the folder
- * @full_name: full name of the folder
- * @name: short name of the folder
- *
- * Initalizes the folder by setting the parent store and name.
- **/
-void
-camel_folder_construct (CamelFolder *folder,
-                        CamelStore *parent_store,
-                        const gchar *full_name,
-                        const gchar *name)
-{
-	g_return_if_fail (CAMEL_IS_FOLDER (folder));
-	g_return_if_fail (CAMEL_IS_STORE (parent_store));
-	g_return_if_fail (folder->parent_store == NULL);
-	g_return_if_fail (folder->name == NULL);
-
-	folder->parent_store = parent_store;
-	if (parent_store)
-		g_object_ref (parent_store);
-
-	folder->name = g_strdup (name);
-	folder->full_name = g_strdup (full_name);
-}
-
-/**
  * camel_folder_sync:
  * @folder: a #CamelFolder
  * @expunge: whether or not to expunge deleted messages
@@ -927,43 +860,114 @@ camel_folder_refresh_info (CamelFolder *folder,
  * camel_folder_get_name:
  * @folder: a #CamelFolder
  *
- * Get the (short) name of the folder. The fully qualified name
- * can be obtained with the #camel_folder_get_full_name method.
+ * Returns the short name of the folder.  The fully qualified name
+ * can be obtained with camel_folder_get_full_name().
  *
  * Returns: the short name of the folder
  **/
 const gchar *
 camel_folder_get_name (CamelFolder *folder)
 {
-	CamelFolderClass *class;
-
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
 
-	class = CAMEL_FOLDER_GET_CLASS (folder);
-	g_return_val_if_fail (class->get_name != NULL, NULL);
+	return folder->priv->name;
+}
+
+/**
+ * camel_folder_set_name:
+ * @folder: a #CamelFolder
+ * @name: a name for the folder
+ *
+ * Sets the short name of the folder.
+ *
+ * Since: 3.0
+ **/
+void
+camel_folder_set_name (CamelFolder *folder,
+                       const gchar *name)
+{
+	g_return_if_fail (CAMEL_IS_FOLDER (folder));
 
-	return class->get_name (folder);
+	g_free (folder->priv->name);
+	folder->priv->name = g_strdup (name);
+
+	g_object_notify (G_OBJECT (folder), "name");
 }
 
 /**
  * camel_folder_get_full_name:
  * @folder: a #CamelFolder
  *
- * Get the full name of the folder.
+ * Returns the fully qualified name of the folder.
  *
- * Returns: the full name of the folder
+ * Returns: the fully qualified name of the folder
  **/
 const gchar *
 camel_folder_get_full_name (CamelFolder *folder)
 {
-	CamelFolderClass *class;
+	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
+
+	return folder->priv->full_name;
+}
 
+/**
+ * camel_folder_set_full_name:
+ * @folder: a #CamelFolder
+ * @full_name: a fully qualified name for the folder
+ *
+ * Sets the fully qualified name of the folder.
+ *
+ * Since: 3.0
+ **/
+void
+camel_folder_set_full_name (CamelFolder *folder,
+                            const gchar *full_name)
+{
+	g_return_if_fail (CAMEL_IS_FOLDER (folder));
+
+	g_free (folder->priv->full_name);
+	folder->priv->full_name = g_strdup (full_name);
+
+	g_object_notify (G_OBJECT (folder), "full-name");
+}
+
+/**
+ * camel_folder_get_description:
+ * @folder: a #CamelFolder
+ *
+ * Returns a description of the folder suitable for displaying to the user.
+ *
+ * Returns: a description of the folder
+ *
+ * Since: 3.0
+ **/
+const gchar *
+camel_folder_get_description (CamelFolder *folder)
+{
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
 
-	class = CAMEL_FOLDER_GET_CLASS (folder);
-	g_return_val_if_fail (class->get_full_name != NULL, NULL);
+	return folder->priv->description;
+}
+
+/**
+ * camel_folder_set_description:
+ * @folder: a #CamelFolder
+ * @description: a description of the folder
+ *
+ * Sets a description of the folder suitable for displaying to the user.
+ *
+ * Since: 3.0
+ **/
+void
+camel_folder_set_description (CamelFolder *folder,
+                              const gchar *description)
+{
+	g_return_if_fail (CAMEL_IS_FOLDER (folder));
 
-	return class->get_full_name (folder);
+	g_free (folder->priv->description);
+	folder->priv->description = g_strdup (description);
+
+	g_object_notify (G_OBJECT (folder), "description");
 }
 
 /**
@@ -975,14 +979,9 @@ camel_folder_get_full_name (CamelFolder *folder)
 CamelStore *
 camel_folder_get_parent_store (CamelFolder *folder)
 {
-	CamelFolderClass *class;
-
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
 
-	class = CAMEL_FOLDER_GET_CLASS (folder);
-	g_return_val_if_fail (class->get_parent_store != NULL, NULL);
-
-	return class->get_parent_store (folder);
+	return folder->priv->parent_store;
 }
 
 /**
@@ -1047,13 +1046,10 @@ camel_folder_get_message_count (CamelFolder *folder)
 gint
 camel_folder_get_unread_message_count (CamelFolder *folder)
 {
-	gint count = -1;
-
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
+	g_return_val_if_fail (folder->summary != NULL, -1);
 
-	camel_object_get (folder, NULL, CAMEL_FOLDER_UNREAD, &count, 0);
-
-	return count;
+	return folder->summary->unread_count;
 }
 
 /**
@@ -1066,13 +1062,10 @@ camel_folder_get_unread_message_count (CamelFolder *folder)
 gint
 camel_folder_get_deleted_message_count (CamelFolder *folder)
 {
-	gint count = -1;
-
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
+	g_return_val_if_fail (folder->summary != NULL, -1);
 
-	camel_object_get (folder, NULL, CAMEL_FOLDER_DELETED, &count, 0);
-
-	return count;
+	return folder->summary->deleted_count;
 }
 
 /**
@@ -1450,7 +1443,8 @@ camel_folder_get_message (CamelFolder *folder,
 	camel_folder_unlock (folder, CF_REC_LOCK);
 
 	if (ret && camel_debug_start (":folder")) {
-		printf ("CamelFolder:get_message ('%s', '%s') =\n", folder->full_name, uid);
+		printf ("CamelFolder:get_message ('%s', '%s') =\n",
+			camel_folder_get_full_name (folder), uid);
 		camel_mime_message_dump (ret, FALSE);
 		camel_debug_end ();
 	}
@@ -1846,7 +1840,7 @@ camel_folder_transfer_messages_to (CamelFolder *source,
 		return TRUE;
 	}
 
-	if (source->parent_store == dest->parent_store) {
+	if (source->priv->parent_store == dest->priv->parent_store) {
 		/* If either folder is a vtrash, we need to use the
 		 * vtrash transfer method. */
 		if (CAMEL_IS_VTRASH_FOLDER (dest))
@@ -1874,6 +1868,8 @@ void
 camel_folder_delete (CamelFolder *folder)
 {
 	CamelFolderClass *class;
+	CamelStore *parent_store;
+	const gchar *full_name;
 
 	g_return_if_fail (CAMEL_IS_FOLDER (folder));
 
@@ -1893,7 +1889,9 @@ camel_folder_delete (CamelFolder *folder)
 	camel_folder_unlock (folder, CF_REC_LOCK);
 
 	/* Delete the references of the folder from the DB.*/
-	camel_db_delete_folder (folder->parent_store->cdb_w, folder->full_name, NULL);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	camel_db_delete_folder (parent_store->cdb_w, full_name, NULL);
 
 	camel_object_trigger_event (folder, "deleted", NULL);
 }
@@ -1913,6 +1911,7 @@ camel_folder_rename (CamelFolder *folder,
                      const gchar *new)
 {
 	CamelFolderClass *class;
+	CamelStore *parent_store;
 	gchar *old;
 
 	g_return_if_fail (CAMEL_IS_FOLDER (folder));
@@ -1921,10 +1920,13 @@ camel_folder_rename (CamelFolder *folder,
 	class = CAMEL_FOLDER_GET_CLASS (folder);
 	g_return_if_fail (class->rename != NULL);
 
-	old = g_strdup (folder->full_name);
+	old = g_strdup (camel_folder_get_full_name (folder));
 
 	class->rename (folder, new);
-	camel_db_rename_folder (folder->parent_store->cdb_w, old, new, NULL);
+
+	parent_store = camel_folder_get_parent_store (folder);
+	camel_db_rename_folder (parent_store->cdb_w, old, new, NULL);
+
 	camel_object_trigger_event (folder, "renamed", old);
 
 	g_free (old);
@@ -1992,10 +1994,17 @@ camel_folder_is_frozen (CamelFolder *folder)
 	return class->is_frozen (folder);
 }
 
-/* FIXME: This function shouldn't be needed, but it's used in CamelVeeFolder */
+/**
+ * camel_folder_get_frozen_count:
+ * @folder: a #CamelFolder
+ *
+ * Since: 3.0
+ **/
 gint
 camel_folder_get_frozen_count (CamelFolder *folder)
 {
+	/* FIXME This function shouldn't be needed,
+	 *       but it's used in CamelVeeFolder */
 	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0);
 
 	return folder->priv->frozen;
@@ -2115,15 +2124,25 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg)
 {
 	struct _folder_filter_msg *m = (struct _folder_filter_msg *) tmsg;
 	CamelMessageInfo *info;
+	CamelStore *parent_store;
 	gint i, status = 0;
 	CamelURL *uri;
 	gchar *source_url;
 	CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-	CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin;
+	CamelJunkPlugin *csp;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (m->folder);
+	parent_store = camel_folder_get_parent_store (m->folder);
+	csp = CAMEL_SERVICE (parent_store)->session->junk_plugin;
 
 	if (m->junk) {
 		/* Translators: The %s is replaced with a folder name where the operation is running. */
-		camel_operation_start (NULL, ngettext ("Learning new spam message in '%s'", "Learning new spam messages in '%s'", m->junk->len), m->folder->full_name);
+		camel_operation_start (
+			NULL, ngettext (
+			"Learning new spam message in '%s'",
+			"Learning new spam messages in '%s'",
+			m->junk->len), full_name);
 
 		for (i = 0; i < m->junk->len; i ++) {
 			CamelMimeMessage *msg = camel_folder_get_message (m->folder, m->junk->pdata[i], &ex);
@@ -2142,7 +2161,11 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg)
 
 	if (m->notjunk) {
 		/* Translators: The %s is replaced with a folder name where the operation is running. */
-		camel_operation_start (NULL, ngettext ("Learning new ham message in '%s'", "Learning new ham messages in '%s'", m->notjunk->len), m->folder->full_name);
+		camel_operation_start (
+			NULL, ngettext (
+			"Learning new ham message in '%s'",
+			"Learning new ham messages in '%s'",
+			m->notjunk->len), full_name);
 		for (i = 0; i < m->notjunk->len; i ++) {
 			CamelMimeMessage *msg = camel_folder_get_message (m->folder, m->notjunk->pdata[i], &ex);
 			gint pc = 100 * i / m->notjunk->len;
@@ -2163,18 +2186,24 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg)
 
 	if (m->driver && m->recents) {
 		/* Translators: The %s is replaced with a folder name where the operation is running. */
-		camel_operation_start (NULL, ngettext ("Filtering new message in '%s'", "Filtering new messages in '%s'", m->recents->len), m->folder->full_name);
+		camel_operation_start (
+			NULL, ngettext (
+			"Filtering new message in '%s'",
+			"Filtering new messages in '%s'",
+			m->recents->len), full_name);
 
-		source_url = camel_service_get_url ((CamelService *)m->folder->parent_store);
+		source_url = camel_service_get_url (CAMEL_SERVICE (parent_store));
 		uri = camel_url_new (source_url, NULL);
 		g_free (source_url);
-		if (m->folder->full_name && m->folder->full_name[0] != '/') {
-			gchar *tmp = alloca (strlen (m->folder->full_name)+2);
 
-			sprintf (tmp, "/%s", m->folder->full_name);
+		if (full_name != NULL && *full_name != '/') {
+			gchar *tmp;
+
+			tmp = alloca (strlen (full_name) + 2);
+			sprintf (tmp, "/%s", full_name);
 			camel_url_set_path (uri, tmp);
 		} else
-			camel_url_set_path (uri, m->folder->full_name);
+			camel_url_set_path (uri, full_name);
 		source_url = camel_url_to_string (uri, CAMEL_URL_HIDE_ALL);
 		camel_url_free (uri);
 
@@ -2241,15 +2270,19 @@ static gboolean
 folder_changed (CamelObject *obj, gpointer event_data)
 {
 	CamelFolder *folder = (CamelFolder *)obj;
+	CamelStore *parent_store;
 	CamelFolderChangeInfo *changed = event_data;
 	struct _CamelFolderChangeInfoPrivate *p = changed->priv;
-	CamelSession *session = ((CamelService *)folder->parent_store)->session;
+	CamelSession *session;
 	CamelFilterDriver *driver = NULL;
 	GPtrArray *junk = NULL;
 	GPtrArray *notjunk = NULL;
 	GPtrArray *recents = NULL;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	session = CAMEL_SERVICE (parent_store)->session;
+
 	d (printf ("folder_changed (%p:'%s', %p), frozen=%d\n", obj, folder->full_name, event_data, folder->priv->frozen));
 	d (printf (" added %d removed %d changed %d recent %d filter %d\n",
 		 changed->uid_added->len, changed->uid_removed->len,
diff --git a/camel/camel-folder.h b/camel/camel-folder.h
index 7e210ea..3f0f377 100644
--- a/camel/camel-folder.h
+++ b/camel/camel-folder.h
@@ -61,43 +61,11 @@ typedef struct _CamelFolder CamelFolder;
 typedef struct _CamelFolderClass CamelFolderClass;
 typedef struct _CamelFolderPrivate CamelFolderPrivate;
 
-enum {
-	CAMEL_FOLDER_ARG_FIRST = CAMEL_ARG_FIRST + 0x1000,
-	CAMEL_FOLDER_ARG_NAME = CAMEL_FOLDER_ARG_FIRST,
-	CAMEL_FOLDER_ARG_FULL_NAME,
-	CAMEL_FOLDER_ARG_STORE,
-	CAMEL_FOLDER_ARG_PERMANENTFLAGS,
-	CAMEL_FOLDER_ARG_TOTAL,
-	CAMEL_FOLDER_ARG_UNREAD, /* unread messages */
-	CAMEL_FOLDER_ARG_DELETED, /* deleted messages */
-	CAMEL_FOLDER_ARG_JUNKED, /* junked messages */
-	CAMEL_FOLDER_ARG_VISIBLE, /* visible !(deleted or junked) */
-	CAMEL_FOLDER_ARG_UID_ARRAY,
-	CAMEL_FOLDER_ARG_INFO_ARRAY,
-	CAMEL_FOLDER_ARG_PROPERTIES,
-	CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED, /* junked, but not deleted messages */
-	CAMEL_FOLDER_ARG_LAST = CAMEL_ARG_FIRST + 0x2000
-};
-
-enum {
-	CAMEL_FOLDER_NAME = CAMEL_FOLDER_ARG_NAME | CAMEL_ARG_STR,
-	CAMEL_FOLDER_FULL_NAME = CAMEL_FOLDER_ARG_FULL_NAME | CAMEL_ARG_STR,
-	CAMEL_FOLDER_STORE = CAMEL_FOLDER_ARG_STORE | CAMEL_ARG_OBJ,
-	CAMEL_FOLDER_PERMANENTFLAGS = CAMEL_FOLDER_ARG_PERMANENTFLAGS | CAMEL_ARG_INT,
-	CAMEL_FOLDER_TOTAL = CAMEL_FOLDER_ARG_TOTAL | CAMEL_ARG_INT,
-	CAMEL_FOLDER_UNREAD = CAMEL_FOLDER_ARG_UNREAD | CAMEL_ARG_INT,
-	CAMEL_FOLDER_DELETED = CAMEL_FOLDER_ARG_DELETED | CAMEL_ARG_INT,
-	CAMEL_FOLDER_JUNKED = CAMEL_FOLDER_ARG_JUNKED | CAMEL_ARG_INT,
-	CAMEL_FOLDER_JUNKED_NOT_DELETED = CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED | CAMEL_ARG_INT,
-	CAMEL_FOLDER_VISIBLE = CAMEL_FOLDER_ARG_VISIBLE | CAMEL_ARG_INT,
-
-	CAMEL_FOLDER_UID_ARRAY = CAMEL_FOLDER_ARG_UID_ARRAY | CAMEL_ARG_PTR,
-	CAMEL_FOLDER_INFO_ARRAY = CAMEL_FOLDER_ARG_INFO_ARRAY | CAMEL_ARG_PTR,
-
-	/* GSList of settable folder properties */
-	CAMEL_FOLDER_PROPERTIES = CAMEL_FOLDER_ARG_PROPERTIES | CAMEL_ARG_PTR
-};
-
+/**
+ * CamelFolderLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CF_CHANGE_LOCK,
 	CF_REC_LOCK
@@ -131,12 +99,6 @@ struct _CamelFolder {
 	CamelObject parent;
 	CamelFolderPrivate *priv;
 
-	/* get these via the :get() method, they might not be set otherwise */
-	gchar *name;
-	gchar *full_name;
-	gchar *description;
-
-	struct _CamelStore *parent_store;
 	CamelFolderSummary *summary;
 
 	guint32 folder_flags;
@@ -162,10 +124,6 @@ struct _CamelFolderClass {
 	gboolean	(*sync)			(CamelFolder *folder,
 						 gboolean expunge,
 						 CamelException *ex);
-	const gchar *	(*get_name)		(CamelFolder *folder);
-	const gchar *	(*get_full_name)	(CamelFolder *folder);
-	struct _CamelStore *
-			(*get_parent_store)	(CamelFolder *folder);
 	gboolean	(*expunge)		(CamelFolder *folder,
 						 CamelException *ex);
 	gint		(*get_message_count)	(CamelFolder *folder);
@@ -255,10 +213,6 @@ struct _CamelFolderClass {
 };
 
 GType		camel_folder_get_type		(void);
-void		camel_folder_construct		(CamelFolder *folder,
-						 struct _CamelStore *parent_store,
-						 const gchar *full_name,
-						 const gchar *name);
 gboolean	camel_folder_refresh_info	(CamelFolder *folder,
 						 CamelException *ex);
 gboolean	camel_folder_sync		(CamelFolder *folder,
@@ -276,7 +230,14 @@ gboolean	camel_folder_expunge		(CamelFolder *folder,
 
 /* folder name operations */
 const gchar *	camel_folder_get_name		(CamelFolder *folder);
+void		camel_folder_set_name		(CamelFolder *folder,
+						 const gchar *name);
 const gchar *	camel_folder_get_full_name	(CamelFolder *folder);
+void		camel_folder_set_full_name	(CamelFolder *folder,
+						 const gchar *full_name);
+const gchar *	camel_folder_get_description	(CamelFolder *folder);
+void		camel_folder_set_description	(CamelFolder *folder,
+						 const gchar *description);
 
 /* various properties accessors */
 guint32		camel_folder_get_permanent_flags(CamelFolder *folder);
diff --git a/camel/camel-gpg-context.c b/camel/camel-gpg-context.c
index 0f7cc41..18d1430 100644
--- a/camel/camel-gpg-context.c
+++ b/camel/camel-gpg-context.c
@@ -2199,6 +2199,12 @@ camel_gpg_context_new (CamelSession *session)
 		"session", session, NULL);
 }
 
+/**
+ * camel_gpg_context_get_always_trust:
+ * @context: a #CamelGpgContext
+ *
+ * Since: 3.0
+ **/
 gboolean
 camel_gpg_context_get_always_trust (CamelGpgContext *context)
 {
diff --git a/camel/camel-index.c b/camel/camel-index.c
index f65d0a3..b323bce 100644
--- a/camel/camel-index.c
+++ b/camel/camel-index.c
@@ -119,6 +119,14 @@ camel_index_rename (CamelIndex *idx, const gchar *path)
 	}
 }
 
+/**
+ * camel_index_set_normalize:
+ * @idx: a #CamelIndex
+ * @func: normalization function
+ * @data: user data for @func
+ *
+ * Since: 3.0
+ **/
 void
 camel_index_set_normalize (CamelIndex *idx, CamelIndexNorm func, gpointer data)
 {
diff --git a/camel/camel-object.c b/camel/camel-object.c
index 978d0a7..020f9d1 100644
--- a/camel/camel-object.c
+++ b/camel/camel-object.c
@@ -34,9 +34,21 @@
 #include "camel-object.h"
 
 #define d(x)
-#define b(x)			/* object bag */
 #define h(x)			/* hooks */
 
+#define CAMEL_OBJECT_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), CAMEL_TYPE_OBJECT, CamelObjectPrivate))
+
+struct _CamelObjectPrivate {
+	gchar *state_filename;
+};
+
+enum {
+	PROP_0,
+	PROP_STATE_FILENAME
+};
+
 G_DEFINE_ABSTRACT_TYPE (CamelObject, camel_object, G_TYPE_OBJECT)
 
 /* ** Quickie type system ************************************************* */
@@ -76,10 +88,6 @@ typedef struct _CamelHookPair
 	gpointer data;
 } CamelHookPair;
 
-/* meta-data stuff */
-static CamelHookPair *co_metadata_pair(CamelObject *obj, gint create);
-
-static const gchar meta_name[] = "object:meta";
 #define CAMEL_OBJECT_STATE_FILE_MAGIC "CLMD"
 
 /* ********************************************************************** */
@@ -92,13 +100,6 @@ static void camel_object_free_hooks(CamelObject *o);
 
 /* ********************************************************************** */
 
-#define CLASS_LOCK(k) (g_mutex_lock((((CamelObjectClass *)k)->lock)))
-#define CLASS_UNLOCK(k) (g_mutex_unlock((((CamelObjectClass *)k)->lock)))
-#define REF_LOCK() (g_mutex_lock(ref_lock))
-#define REF_UNLOCK() (g_mutex_unlock(ref_lock))
-#define TYPE_LOCK() (g_static_rec_mutex_lock(&type_lock))
-#define TYPE_UNLOCK() (g_static_rec_mutex_unlock(&type_lock))
-
 static struct _CamelHookPair *
 pair_alloc(void)
 {
@@ -137,83 +138,6 @@ hooks_free(CamelHookList *hooks)
 
 /* ************************************************************************ */
 
-/* CamelObject base methods */
-
-static gint
-cobject_getv (CamelObject *o,
-              CamelException *ex,
-              CamelArgGetV *args)
-{
-	CamelObjectClass *class;
-	gint i;
-	guint32 tag;
-
-	class = CAMEL_OBJECT_GET_CLASS (o);
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_DESCRIPTION:
-			*arg->ca_str = (gchar *) G_OBJECT_CLASS_NAME (class);
-			break;
-		case CAMEL_OBJECT_ARG_STATE_FILE: {
-			CamelHookPair *pair = co_metadata_pair(o, FALSE);
-
-			if (pair) {
-				*arg->ca_str = g_strdup(pair->func.filename);
-				camel_object_unget_hooks(o);
-			}
-			break; }
-		}
-	}
-
-	/* could have flags or stuff here? */
-	return 0;
-}
-
-static gint
-cobject_setv (CamelObject *o,
-              CamelException *ex,
-              CamelArgV *args)
-{
-	gint i;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArg *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_STATE_FILE: {
-			CamelHookPair *pair;
-
-			/* We store the filename on the meta-data hook-pair */
-			pair = co_metadata_pair(o, TRUE);
-			g_free(pair->func.filename);
-			pair->func.filename = g_strdup(arg->ca_str);
-			camel_object_unget_hooks(o);
-			break; }
-		}
-	}
-
-	/* could have flags or stuff here? */
-	return 0;
-}
-
-static void
-cobject_free(CamelObject *o, guint32 tag, gpointer value)
-{
-	switch (tag & CAMEL_ARG_TAG) {
-	case CAMEL_OBJECT_ARG_STATE_FILE:
-		g_free(value);
-		break;
-	}
-}
-
 /* State file for CamelObject data.  Any later versions should only append data.
 
    version:uint32
@@ -230,170 +154,248 @@ cobject_free(CamelObject *o, guint32 tag, gpointer value)
 
 */
 
+/* XXX This is a holdover from Camel's old homegrown type system.
+ *     CamelArg was a kind of primitive version of GObject properties.
+ *     The argument ID and data type were encoded into a 32-bit integer.
+ *     Unfortunately the encoding was also used in the binary state file
+ *     format, so we still need the secret decoder ring. */
+enum camel_arg_t {
+	CAMEL_ARG_END = 0,
+	CAMEL_ARG_IGNORE = 1,	/* override/ignore an arg in-place */
+
+	CAMEL_ARG_FIRST = 1024,	/* 1024 args reserved for arg system */
+
+	CAMEL_ARG_TYPE = 0xf0000000, /* type field for tags */
+	CAMEL_ARG_TAG = 0x0fffffff, /* tag field for args */
+
+	CAMEL_ARG_OBJ = 0x00000000, /* object */
+	CAMEL_ARG_INT = 0x10000000, /* gint */
+	CAMEL_ARG_DBL = 0x20000000, /* gdouble */
+	CAMEL_ARG_STR = 0x30000000, /* c string */
+	CAMEL_ARG_PTR = 0x40000000, /* ptr */
+	CAMEL_ARG_BOO = 0x50000000  /* bool */
+};
+
+#define CAMEL_ARGV_MAX (20)
+
 static gint
-cobject_state_read(CamelObject *obj, FILE *fp)
+cobject_state_read (CamelObject *object, FILE *fp)
 {
-	guint32 i, count, version;
+	GValue value;
+	GObjectClass *class;
+	GParamSpec **properties;
+	guint32 count, version;
+	guint ii, jj, n_properties;
 
-	/* NB: for later versions, just check the version is 1 .. known version */
-	if (camel_file_util_decode_uint32(fp, &version) == -1
-	    || version > 1
-	    || camel_file_util_decode_uint32(fp, &count) == -1)
+	if (camel_file_util_decode_uint32 (fp, &version) == -1)
 		return -1;
 
-	for (i=0;i<count;i++) {
-		gchar *name = NULL, *value = NULL;
+	if (version > 1)
+		return -1;
 
-		if (camel_file_util_decode_string(fp, &name) == 0
-		    && camel_file_util_decode_string(fp, &value) == 0) {
-			/* XXX This no longer does anything.
-			 *     We're just eating dead data. */
-			g_free(name);
-			g_free(value);
-		} else {
-			g_free(name);
-			g_free(value);
+	if (camel_file_util_decode_uint32 (fp, &count) == -1)
+		return -1;
 
+	/* XXX Camel no longer supports meta-data in state
+	 *     files, so we're just eating dead data here. */
+	for (ii = 0; ii < count; ii++) {
+		gchar *name = NULL;
+		gchar *value = NULL;
+		gboolean success;
+
+		success =
+			camel_file_util_decode_string (fp, &name) == 0 &&
+			camel_file_util_decode_string (fp, &value) == 0;
+
+		g_free (name);
+		g_free (value);
+
+		if (!success)
 			return -1;
-		}
 	}
 
-	if (version > 0) {
-		CamelArgV *argv;
+	if (version == 0)
+		return 0;
 
-		if (camel_file_util_decode_uint32(fp, &count) == -1
-			|| count == 0 || count > 1024) {
-			/* maybe it was just version 0 afterall */
-			return 0;
-		}
+	if (camel_file_util_decode_uint32 (fp, &count) == -1)
+		return 0;
 
-		count = MIN(count, CAMEL_ARGV_MAX);
+	if (count == 0 || count > 1024)
+		/* Maybe it was just version 0 afterall. */
+		return 0;
 
-		/* we batch up the properties and set them in one go */
-		argv = g_try_malloc(sizeof(CamelArgV) -
-			((CAMEL_ARGV_MAX - count) * sizeof(CamelArg)));
-		if (argv == NULL)
-			return -1;
+	count = MIN (count, CAMEL_ARGV_MAX);
+	memset (&value, 0, sizeof (GValue));
 
-		argv->argc = 0;
-		for (i=0;i<count;i++) {
-			if (camel_file_util_decode_uint32(fp, &argv->argv[argv->argc].tag) == -1)
-				goto cleanup;
+	class = G_OBJECT_GET_CLASS (object);
+	properties = g_object_class_list_properties (class, &n_properties);
 
-			/* so far,only do strings and ints, doubles could be added,
-			   object's would require a serialisation interface */
+	for (ii = 0; ii < count; ii++) {
+		gboolean property_set = FALSE;
+		guint32 tag, v_uint32;
 
-			switch (argv->argv[argv->argc].tag & CAMEL_ARG_TYPE) {
-			case CAMEL_ARG_INT:
+		if (camel_file_util_decode_uint32 (fp, &tag) == -1)
+			goto exit;
+
+		/* Record state file values into GValues.
+		 * XXX We currently only support booleans. */
+		switch (tag & CAMEL_ARG_TYPE) {
 			case CAMEL_ARG_BOO:
-				if (camel_file_util_decode_uint32(fp, (guint32 *) &argv->argv[argv->argc].ca_int) == -1)
-					goto cleanup;
-				break;
-			case CAMEL_ARG_STR:
-				if (camel_file_util_decode_string(fp, &argv->argv[argv->argc].ca_str) == -1)
-					goto cleanup;
+				if (camel_file_util_decode_uint32 (fp, &v_uint32) == -1)
+					goto exit;
+				g_value_init (&value, G_TYPE_BOOLEAN);
+				g_value_set_boolean (&value, (gboolean) v_uint32);
 				break;
 			default:
-				goto cleanup;
-			}
-
-			argv->argc++;
+				g_warn_if_reached ();
+				goto exit;
 		}
 
-		camel_object_setv(obj, NULL, argv);
-	cleanup:
-		for (i=0;i<argv->argc;i++) {
-			if ((argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR)
-				g_free(argv->argv[i].ca_str);
+		/* Now we have to match the legacy numeric CamelArg tag
+		 * value with a GObject property.  The GObject property
+		 * IDs have been set to the same legacy tag values, but
+		 * we have to access a private GParamSpec field to get
+		 * to them (pspec->param_id). */
+
+		tag &= CAMEL_ARG_TAG;  /* filter out the type code */
+
+		for (jj = 0; jj < n_properties; jj++) {
+			GParamSpec *pspec = properties[jj];
+
+			if (pspec->param_id != tag)
+				continue;
+
+			/* Sanity check. */
+			g_warn_if_fail (pspec->flags & CAMEL_PARAM_PERSISTENT);
+
+			g_object_set_property (
+				G_OBJECT (object), pspec->name, &value);
+
+			property_set = TRUE;
+			break;
 		}
-		g_free(argv);
+
+		if (!property_set)
+			g_warning (
+				"Could not find a corresponding %s "
+				"property for state file tag 0x%x",
+				G_OBJECT_TYPE_NAME (object), tag);
+
+		g_value_unset (&value);
 	}
 
+exit:
+	g_free (properties);
+
 	return 0;
 }
 
-/* TODO: should pass exception around */
 static gint
-cobject_state_write(CamelObject *obj, FILE *fp)
+cobject_state_write (CamelObject *object, FILE *fp)
 {
-	gint32 count, i;
-	gint res = -1;
-	GSList *props = NULL, *l;
-	CamelArgGetV *arggetv = NULL;
-	CamelArgV *argv = NULL;
-
-	/* current version is 1 */
-	if (camel_file_util_encode_uint32(fp, 1) == -1
-	    || camel_file_util_encode_uint32(fp, 0) == -1)
-		goto abort;
-
-	camel_object_get(obj, NULL, CAMEL_OBJECT_PERSISTENT_PROPERTIES, &props, NULL);
-
-	/* we build an arggetv to query the object atomically,
-	   we also need an argv to store the results - bit messy */
-
-	count = g_slist_length(props);
-	count = MIN(count, CAMEL_ARGV_MAX);
-
-	arggetv = g_malloc0(sizeof(CamelArgGetV) -
-		((CAMEL_ARGV_MAX - count) * sizeof(CamelArgGet)));
-	argv = g_malloc0(sizeof(CamelArgV) -
-		((CAMEL_ARGV_MAX - count) * sizeof(CamelArg)));
-	l = props;
-	i = 0;
-	while (l) {
-		CamelProperty *prop = l->data;
-
-		argv->argv[i].tag = prop->tag;
-		arggetv->argv[i].tag = prop->tag;
-		arggetv->argv[i].ca_ptr = &argv->argv[i].ca_ptr;
-
-		i++;
-		l = l->next;
-	}
-	arggetv->argc = i;
-	argv->argc = i;
-
-	camel_object_getv(obj, NULL, arggetv);
+	GValue value;
+	GObjectClass *class;
+	GParamSpec **properties;
+	guint ii, n_properties;
+	guint32 n_persistent = 0;
+
+	memset (&value, 0, sizeof (GValue));
+
+	class = G_OBJECT_GET_CLASS (object);
+	properties = g_object_class_list_properties (class, &n_properties);
+
+	/* Version = 1 */
+	if (camel_file_util_encode_uint32 (fp, 1) == -1)
+		goto exit;
+
+	/* No meta-data items. */
+	if (camel_file_util_encode_uint32 (fp, 0) == -1)
+		goto exit;
+
+	/* Count persistent properties. */
+	for (ii = 0; ii < n_properties; ii++)
+		if (properties[ii]->flags & CAMEL_PARAM_PERSISTENT)
+			n_persistent++;
+
+	if (camel_file_util_encode_uint32 (fp, n_persistent) == -1)
+		goto exit;
+
+	/* Write a tag + value pair for each persistent property.
+	 * Tags identify the property ID and data type; they're an
+	 * artifact of CamelArgs.  The persistent GObject property
+	 * IDs are set to match the legacy CamelArg tag values. */
+
+	for (ii = 0; ii < n_properties; ii++) {
+		GParamSpec *pspec = properties[ii];
+		guint32 tag, v_uint32;
+
+		if ((pspec->flags & CAMEL_PARAM_PERSISTENT) == 0)
+			continue;
+
+		g_value_init (&value, pspec->value_type);
+
+		g_object_get_property (
+			G_OBJECT (object), pspec->name, &value);
+
+		tag = pspec->param_id;
+
+		/* Record the GValue to the state file.
+		 * XXX We currently only support booleans. */
+		switch (pspec->value_type) {
+			case G_TYPE_BOOLEAN:
+				tag |= CAMEL_ARG_BOO;
+				v_uint32 = g_value_get_boolean (&value);
+				if (camel_file_util_encode_uint32 (fp, tag) == -1)
+					goto exit;
+				if (camel_file_util_encode_uint32 (fp, v_uint32) == -1)
+					goto exit;
+				break;
+			default:
+				g_warn_if_reached ();
+				goto exit;
+		}
 
-	if (camel_file_util_encode_uint32(fp, count) == -1)
-		goto abort;
+		g_value_unset (&value);
+	}
 
-	for (i=0;i<argv->argc;i++) {
-		CamelArg *arg = &argv->argv[i];
+exit:
+	g_free (properties);
 
-		if (camel_file_util_encode_uint32(fp, arg->tag) == -1)
-			goto abort;
+	return 0;
+}
 
-		switch (arg->tag & CAMEL_ARG_TYPE) {
-		case CAMEL_ARG_INT:
-		case CAMEL_ARG_BOO:
-			if (camel_file_util_encode_uint32(fp, arg->ca_int) == -1)
-				goto abort;
-			break;
-		case CAMEL_ARG_STR:
-			if (camel_file_util_encode_string(fp, arg->ca_str) == -1)
-				goto abort;
-			break;
-		}
+static void
+object_set_property (GObject *object,
+                     guint property_id,
+                     const GValue *value,
+                     GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_STATE_FILENAME:
+			camel_object_set_state_filename (
+				CAMEL_OBJECT (object),
+				g_value_get_string (value));
+			return;
 	}
 
-	res = 0;
-abort:
-	for (i=0;i<argv->argc;i++) {
-		CamelArg *arg = &argv->argv[i];
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
 
-		if ((argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR)
-			camel_object_free(obj, arg->tag, arg->ca_str);
+static void
+object_get_property (GObject *object,
+                     guint property_id,
+                     GValue *value,
+                     GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_STATE_FILENAME:
+			g_value_set_string (
+				value, camel_object_get_state_filename (
+				CAMEL_OBJECT (object)));
+			return;
 	}
 
-	g_free(argv);
-	g_free(arggetv);
-
-	if (props)
-		camel_object_free(obj, CAMEL_OBJECT_PERSISTENT_PROPERTIES, props);
-
-	return res;
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static void
@@ -411,28 +413,60 @@ object_dispose (GObject *object)
 }
 
 static void
+object_finalize (GObject *object)
+{
+	CamelObjectPrivate *priv;
+
+	priv = CAMEL_OBJECT_GET_PRIVATE (object);
+
+	g_free (priv->state_filename);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (camel_object_parent_class)->finalize (object);
+}
+
+static void
 camel_object_class_init (CamelObjectClass *class)
 {
 	GObjectClass *object_class;
 
+	g_type_class_add_private (class, sizeof (CamelObjectPrivate));
+
 	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = object_set_property;
+	object_class->get_property = object_get_property;
 	object_class->dispose = object_dispose;
+	object_class->finalize = object_finalize;
 
 	class->hooks = NULL;
 
-	class->getv = cobject_getv;
-	class->setv = cobject_setv;
-	class->free = cobject_free;
-
 	class->state_read = cobject_state_read;
 	class->state_write = cobject_state_write;
 
 	camel_object_class_add_event (class, "finalize", NULL);
+
+	/**
+	 * CamelObject:state-filename
+	 *
+	 * The file in which to store persistent property values for this
+	 * instance.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_STATE_FILENAME,
+		g_param_spec_string (
+			"state-filename",
+			"State Filename",
+			"File containing persistent property values",
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
 }
 
 static void
 camel_object_init (CamelObject *object)
 {
+	object->priv = CAMEL_OBJECT_GET_PRIVATE (object);
 }
 
 static CamelHookPair *
@@ -758,191 +792,80 @@ trigger:
 	g_object_unref(obj);
 }
 
-/* get/set arg methods */
-gint
-camel_object_set (gpointer vo,
-                  CamelException *ex,
-                  ...)
-{
-	CamelObjectClass *class;
-	CamelArgV args;
-	CamelObject *o = vo;
-	gint ret = 0;
-
-	g_return_val_if_fail(CAMEL_IS_OBJECT(o), -1);
-
-	camel_argv_start(&args, ex);
-
-	class = CAMEL_OBJECT_GET_CLASS (o);
-	g_return_val_if_fail (class->setv != NULL, -1);
-
-	while (camel_argv_build(&args) && ret == 0)
-		ret = class->setv(o, ex, &args);
-	if (ret == 0)
-		ret = class->setv(o, ex, &args);
-
-	camel_argv_end(&args);
-
-	return ret;
-}
-
-gint
-camel_object_setv (gpointer vo,
-                   CamelException *ex,
-                   CamelArgV *args)
-{
-	CamelObjectClass *class;
-
-	g_return_val_if_fail(CAMEL_IS_OBJECT(vo), -1);
-
-	class = CAMEL_OBJECT_GET_CLASS (vo);
-	g_return_val_if_fail (class->setv != NULL, -1);
-
-	return class->setv (vo, ex, args);
-}
-
-gint
-camel_object_get (gpointer vo,
-                  CamelException *ex,
-                  ...)
-{
-	CamelObjectClass *class;
-	CamelObject *o = vo;
-	CamelArgGetV args;
-	gint ret = 0;
-
-	g_return_val_if_fail(CAMEL_IS_OBJECT(o), -1);
-
-	camel_argv_start(&args, ex);
-
-	class = CAMEL_OBJECT_GET_CLASS (o);
-	g_return_val_if_fail (class->getv != NULL, -1);
-
-	while (camel_arggetv_build(&args) && ret == 0)
-		ret = class->getv(o, ex, &args);
-	if (ret == 0)
-		ret = class->getv(o, ex, &args);
-
-	camel_argv_end(&args);
-
-	return ret;
-}
-
-gint
-camel_object_getv (gpointer vo,
-                   CamelException *ex,
-                   CamelArgGetV *args)
-{
-	CamelObjectClass *class;
-
-	g_return_val_if_fail(CAMEL_IS_OBJECT(vo), -1);
-
-	class = CAMEL_OBJECT_GET_CLASS (vo);
-	g_return_val_if_fail (class->getv != NULL, -1);
-
-	return class->getv (vo, ex, args);
-}
-
-/* NB: If this doesn't return NULL, then you must unget_hooks when done */
-static CamelHookPair *
-co_metadata_pair(CamelObject *obj, gint create)
-{
-	CamelHookPair *pair;
-	CamelHookList *hooks;
-
-	if (obj->hooks == NULL && !create)
-		return NULL;
-
-	hooks = camel_object_get_hooks(obj);
-	pair = hooks->list;
-	while (pair) {
-		if (pair->name == meta_name)
-			return pair;
-
-		pair = pair->next;
-	}
-
-	if (create) {
-		pair = pair_alloc();
-		pair->name = meta_name;
-		pair->data = NULL;
-		pair->flags = 0;
-		pair->func.filename = NULL;
-		pair->next = hooks->list;
-		hooks->list = pair;
-		hooks->list_length++;
-	} else {
-		camel_object_unget_hooks(obj);
-	}
-
-	return pair;
-}
-
 /**
  * camel_object_state_read:
- * @vo:
+ * @object: a #CamelObject
  *
- * Read persistent object state from object_set(CAMEL_OBJECT_STATE_FILE).
+ * Read persistent object state from #CamelObject:state-filename.
  *
  * Returns: -1 on error.
  **/
-gint camel_object_state_read(gpointer vo)
+gint
+camel_object_state_read (CamelObject *object)
 {
-	CamelObject *obj = vo;
+	CamelObjectClass *class;
+	const gchar *state_filename;
 	gint res = -1;
-	gchar *file;
 	FILE *fp;
 	gchar magic[4];
 
-	camel_object_get(vo, NULL, CAMEL_OBJECT_STATE_FILE, &file, NULL);
-	if (file == NULL)
+	g_return_val_if_fail (CAMEL_IS_OBJECT (object), -1);
+
+	class = CAMEL_OBJECT_GET_CLASS (object);
+
+	state_filename = camel_object_get_state_filename (object);
+	if (state_filename == NULL)
 		return 0;
 
-	fp = g_fopen(file, "rb");
+	fp = g_fopen (state_filename, "rb");
 	if (fp != NULL) {
-		if (fread(magic, 4, 1, fp) == 1
-		    && memcmp(magic, CAMEL_OBJECT_STATE_FILE_MAGIC, 4) == 0)
-			res = CAMEL_OBJECT_GET_CLASS (obj)->state_read(obj, fp);
-		else
-			res = -1;
-		fclose(fp);
+		if (fread (magic, 4, 1, fp) == 1
+		    && memcmp (magic, CAMEL_OBJECT_STATE_FILE_MAGIC, 4) == 0)
+			res = class->state_read (object, fp);
+		fclose (fp);
 	}
 
-	camel_object_free(vo, CAMEL_OBJECT_STATE_FILE, file);
-
 	return res;
 }
 
 /**
  * camel_object_state_write:
- * @vo:
+ * @object: a #CamelObject
  *
- * Write persistent state to the file as set by object_set(CAMEL_OBJECT_STATE_FILE).
+ * Write persistent object state #CamelObject:state-filename.
  *
  * Returns: -1 on error.
  **/
-gint camel_object_state_write(gpointer vo)
+gint
+camel_object_state_write (CamelObject *object)
 {
-	CamelObject *obj = vo;
+	CamelObjectClass *class;
+	const gchar *state_filename;
+	gchar *savename, *dirname;
 	gint res = -1;
-	gchar *file, *savename, *dirname;
 	FILE *fp;
 
-	camel_object_get(vo, NULL, CAMEL_OBJECT_STATE_FILE, &file, NULL);
-	if (file == NULL)
+	g_return_val_if_fail (CAMEL_IS_OBJECT (object), -1);
+
+	class = CAMEL_OBJECT_GET_CLASS (object);
+
+	state_filename = camel_object_get_state_filename (object);
+	if (state_filename == NULL)
 		return 0;
 
-	savename = camel_file_util_savename(file);
-	dirname = g_path_get_dirname(savename);
-	g_mkdir_with_parents(dirname, 0700);
-	g_free(dirname);
-	fp = g_fopen(savename, "wb");
+	savename = camel_file_util_savename (state_filename);
+
+	dirname = g_path_get_dirname (savename);
+	g_mkdir_with_parents (dirname, 0700);
+	g_free (dirname);
+
+	fp = g_fopen (savename, "wb");
 	if (fp != NULL) {
-		if (fwrite(CAMEL_OBJECT_STATE_FILE_MAGIC, 4, 1, fp) == 1
-		    && CAMEL_OBJECT_GET_CLASS (obj)->state_write(obj, fp) == 0) {
-			if (fclose(fp) == 0) {
+		if (fwrite (CAMEL_OBJECT_STATE_FILE_MAGIC, 4, 1, fp) == 1
+		    && class->state_write (object, fp) == 0) {
+			if (fclose (fp) == 0) {
 				res = 0;
-				g_rename(savename, file);
+				g_rename (savename, state_filename);
 			}
 		} else {
 			fclose(fp);
@@ -951,32 +874,50 @@ gint camel_object_state_write(gpointer vo)
 		g_warning("Could not save object state file to '%s': %s", savename, g_strerror(errno));
 	}
 
-	g_free(savename);
-	camel_object_free(vo, CAMEL_OBJECT_STATE_FILE, file);
+	g_free (savename);
 
 	return res;
 }
 
-/* free an arg object, you can only free objects 1 at a time */
-void camel_object_free(gpointer vo, guint32 tag, gpointer value)
+/**
+ * camel_object_get_state_filename:
+ * @object: a #CamelObject
+ *
+ * Returns the name of the file in which persistent property values for
+ * @object are stored.  The file is used by camel_object_state_write()
+ * and camel_object_state_read() to save and restore object state.
+ *
+ * Returns: the name of the persistent property file
+ *
+ * Since: 3.0
+ **/
+const gchar *
+camel_object_get_state_filename (CamelObject *object)
 {
-	g_return_if_fail(CAMEL_IS_OBJECT(vo));
-
-	/* We could also handle freeing of args differently
+	g_return_val_if_fail (CAMEL_IS_OBJECT (object), NULL);
 
-	   Add a 'const' bit to the arg type field,
-	   specifying that the object should not be freed.
-
-	   And, add free handlers for any pointer objects which are
-	   not const.  The free handlers would be hookpairs off of the
-	   class.
+	return object->priv->state_filename;
+}
 
-	   Then we handle the basic types OBJ,STR here, and pass PTR
-	   types to their appropriate handler, without having to pass
-	   through the invocation heirarchy of the free method.
+/**
+ * camel_object_set_state_filename:
+ * @object: a #CamelObject
+ * @state_filename: path to a local file
+ *
+ * Sets the name of the file in which persistent property values for
+ * @object are stored.  The file is used by camel_object_state_write()
+ * and camel_object_state_read() to save and restore object state.
+ *
+ * Since: 3.0
+ **/
+void
+camel_object_set_state_filename (CamelObject *object,
+                                 const gchar *state_filename)
+{
+	g_return_if_fail (CAMEL_IS_OBJECT (object));
 
-	   This would also let us copy and do other things with args
-	   we can't do, but i can't see a use for that yet ...  */
+	g_free (object->priv->state_filename);
+	object->priv->state_filename = g_strdup (state_filename);
 
-	CAMEL_OBJECT_GET_CLASS (vo)->free (vo, tag, value);
+	g_object_notify (G_OBJECT (object), "state-filename");
 }
diff --git a/camel/camel-object.h b/camel/camel-object.h
index 30eb955..d90a224 100644
--- a/camel/camel-object.h
+++ b/camel/camel-object.h
@@ -34,7 +34,6 @@
 #include <stdlib.h>		/* gsize */
 #include <stdarg.h>
 
-#include <camel/camel-arg.h>
 #include <camel/camel-exception.h>
 
 /* Standard GObject macros */
@@ -60,29 +59,32 @@ G_BEGIN_DECLS
 
 typedef struct _CamelObject CamelObject;
 typedef struct _CamelObjectClass CamelObjectClass;
+typedef struct _CamelObjectPrivate CamelObjectPrivate;
+
 typedef guint CamelObjectHookID;
 
 typedef gboolean (*CamelObjectEventPrepFunc) (CamelObject *, gpointer);
 typedef void (*CamelObjectEventHookFunc) (CamelObject *, gpointer, gpointer);
 
-/* camel object args. */
-enum {
-	/* Get a description of the object. */
-	CAMEL_OBJECT_ARG_DESCRIPTION = CAMEL_ARG_FIRST,
-	CAMEL_OBJECT_ARG_STATE_FILE,
-	CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES
-};
-
-enum {
-	CAMEL_OBJECT_DESCRIPTION = CAMEL_OBJECT_ARG_DESCRIPTION | CAMEL_ARG_STR,
-	/* sets where the persistent data should reside, otherwise it isn't persistent */
-	CAMEL_OBJECT_STATE_FILE = CAMEL_OBJECT_ARG_STATE_FILE | CAMEL_ARG_STR,
-	/* returns a GSList CamelProperties of persistent properties */
-	CAMEL_OBJECT_PERSISTENT_PROPERTIES = CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES
-};
+/**
+ * CamelParamFlags:
+ * @CAMEL_PARAM_PERSISTENT:
+ *     The parameter is persistent, which means its value is saved to
+ *     #CamelObject:state-filename during camel_object_state_write(),
+ *     and restored during camel_object_state_read().
+ *
+ * These flags extend #GParamFlags.  Most of the time you will use them
+ * in conjunction with g_object_class_install_property().
+ *
+ * Since: 3.0
+ **/
+typedef enum {
+	CAMEL_PARAM_PERSISTENT = 1 << (G_PARAM_USER_SHIFT + 0)
+} CamelParamFlags;
 
 struct _CamelObject {
 	GObject parent;
+	CamelObjectPrivate *priv;
 
 	/* current hooks on this object */
 	struct _CamelHookList *hooks;
@@ -94,12 +96,6 @@ struct _CamelObjectClass {
 	/* available hooks for this class */
 	struct _CamelHookPair *hooks;
 
-	/* get/set interface */
-	gint (*setv)(CamelObject *, CamelException *ex, CamelArgV *args);
-	gint (*getv)(CamelObject *, CamelException *ex, CamelArgGetV *args);
-	/* we only free 1 at a time, and only pointer types, obviously */
-	void (*free)(CamelObject *, guint32 tag, gpointer ptr);
-
 	/* persistence stuff */
 	gint (*state_read)(CamelObject *, FILE *fp);
 	gint (*state_write)(CamelObject *, FILE *fp);
@@ -115,18 +111,13 @@ void camel_object_remove_event(gpointer obj, CamelObjectHookID id);
 void camel_object_unhook_event(gpointer obj, const gchar *name, CamelObjectEventHookFunc hook, gpointer data);
 void camel_object_trigger_event(gpointer obj, const gchar *name, gpointer event_data);
 
-/* get/set methods */
-gint camel_object_set(gpointer obj, CamelException *ex, ...);
-gint camel_object_setv(gpointer obj, CamelException *ex, CamelArgV *);
-gint camel_object_get(gpointer obj, CamelException *ex, ...);
-gint camel_object_getv(gpointer obj, CamelException *ex, CamelArgGetV *);
-
 /* reads/writes the state from/to the CAMEL_OBJECT_STATE_FILE */
-gint camel_object_state_read(gpointer vo);
-gint camel_object_state_write(gpointer vo);
+gint		camel_object_state_read		(CamelObject *object);
+gint		camel_object_state_write	(CamelObject *object);
 
-/* free a retrieved object.  May be a noop for static data. */
-void camel_object_free(gpointer vo, guint32 tag, gpointer value);
+const gchar *	camel_object_get_state_filename	(CamelObject *object);
+void		camel_object_set_state_filename	(CamelObject *object,
+						 const gchar *state_filename);
 
 G_END_DECLS
 
diff --git a/camel/camel-offline-folder.c b/camel/camel-offline-folder.c
index 53c812c..6918ad3 100644
--- a/camel/camel-offline-folder.c
+++ b/camel/camel-offline-folder.c
@@ -30,11 +30,14 @@
 #include "camel-operation.h"
 #include "camel-service.h"
 #include "camel-session.h"
+#include "camel-store.h"
 
-static GSList *offline_folder_props = NULL;
+#define CAMEL_OFFLINE_FOLDER_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), CAMEL_TYPE_OFFLINE_FOLDER, CamelOfflineFolderPrivate))
 
-static CamelProperty offline_prop_list[] = {
-	{ CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE, "sync_offline", N_("Copy folder content locally for offline operation") },
+struct _CamelOfflineFolderPrivate {
+	gboolean offline_sync;
 };
 
 struct _offline_downsync_msg {
@@ -44,6 +47,13 @@ struct _offline_downsync_msg {
 	CamelFolderChangeInfo *changes;
 };
 
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+	PROP_0,
+	PROP_OFFLINE_SYNC = 0x2400
+};
+
 G_DEFINE_TYPE (CamelOfflineFolder, camel_offline_folder, CAMEL_TYPE_FOLDER)
 
 static void
@@ -89,10 +99,17 @@ static CamelSessionThreadOps offline_downsync_ops = {
 static void
 offline_folder_changed (CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer dummy)
 {
-	CamelOfflineFolder *offline = (CamelOfflineFolder *) folder;
-	CamelService *service = (CamelService *) folder->parent_store;
+	CamelStore *parent_store;
+	CamelService *service;
+	gboolean offline_sync;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	service = CAMEL_SERVICE (parent_store);
 
-	if (changes->uid_added->len > 0 && (offline->sync_offline || camel_url_get_param (service->url, "sync_offline"))) {
+	offline_sync = camel_offline_folder_get_offline_sync (
+		CAMEL_OFFLINE_FOLDER (folder));
+
+	if (changes->uid_added->len > 0 && (offline_sync || camel_url_get_param (service->url, "sync_offline"))) {
 		CamelSession *session = service->session;
 		struct _offline_downsync_msg *m;
 
@@ -105,78 +122,38 @@ offline_folder_changed (CamelFolder *folder, CamelFolderChangeInfo *changes, gpo
 	}
 }
 
-static gint
-offline_folder_getv (CamelObject *object,
-                     CamelException *ex,
-                     CamelArgGetV *args)
+static void
+offline_folder_set_property (GObject *object,
+                             guint property_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
 {
-	CamelArgGetV props;
-	gint i, count = 0;
-	guint32 tag;
-
-	for (i = 0; i < args->argc; i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES:
-		case CAMEL_FOLDER_ARG_PROPERTIES:
-			props.argc = 1;
-			props.argv[0] = *arg;
-			((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, ex, &props);
-			*arg->ca_ptr = g_slist_concat (*arg->ca_ptr, g_slist_copy (offline_folder_props));
-			break;
-		case CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE:
-			*arg->ca_int = ((CamelOfflineFolder *) object)->sync_offline;
-			break;
-		default:
-			count++;
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
+	switch (property_id) {
+		case PROP_OFFLINE_SYNC:
+			camel_offline_folder_set_offline_sync (
+				CAMEL_OFFLINE_FOLDER (object),
+				g_value_get_boolean (value));
+			return;
 	}
 
-	if (count)
-		return ((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, ex, args);
-
-	return 0;
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
-static gint
-offline_folder_setv (CamelObject *object,
-                     CamelException *ex,
-                     CamelArgV *args)
+static void
+offline_folder_get_property (GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
 {
-	CamelOfflineFolder *folder = (CamelOfflineFolder *) object;
-	gboolean save = FALSE;
-	guint32 tag;
-	gint i;
-
-	for (i = 0; i < args->argc; i++) {
-		CamelArg *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE:
-			if (folder->sync_offline != arg->ca_int) {
-				folder->sync_offline = arg->ca_int;
-				save = TRUE;
-			}
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
+	switch (property_id) {
+		case PROP_OFFLINE_SYNC:
+			g_value_set_boolean (
+				value, camel_offline_folder_get_offline_sync (
+				CAMEL_OFFLINE_FOLDER (object)));
+			return;
 	}
 
-	if (save)
-		camel_object_state_write (object);
-
-	return ((CamelObjectClass *) camel_offline_folder_parent_class)->setv (object, ex, args);
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static gboolean
@@ -188,7 +165,9 @@ offline_folder_downsync (CamelOfflineFolder *offline,
 	GPtrArray *uids, *uncached_uids = NULL;
 	gint i;
 
-	camel_operation_start (NULL, _("Syncing messages in folder '%s' to disk"), folder->full_name);
+	camel_operation_start (
+		NULL, _("Syncing messages in folder '%s' to disk"),
+		camel_folder_get_full_name (folder));
 
 	if (expression)
 		uids = camel_folder_search_by_expression (folder, expression, ex);
@@ -226,32 +205,71 @@ done:
 static void
 camel_offline_folder_class_init (CamelOfflineFolderClass *class)
 {
-	CamelObjectClass *camel_object_class;
-	gint ii;
+	GObjectClass *object_class;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = offline_folder_getv;
-	camel_object_class->setv = offline_folder_setv;
+	g_type_class_add_private (class, sizeof (CamelOfflineFolderPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = offline_folder_set_property;
+	object_class->get_property = offline_folder_get_property;
 
 	class->downsync = offline_folder_downsync;
 
-	for (ii = 0; ii < G_N_ELEMENTS (offline_prop_list); ii++) {
-		offline_prop_list[ii].description =
-			_(offline_prop_list[ii].description);
-		offline_folder_props = g_slist_prepend (
-			offline_folder_props, &offline_prop_list[ii]);
-	}
+	g_object_class_install_property (
+		object_class,
+		PROP_OFFLINE_SYNC,
+		g_param_spec_boolean (
+			"offline-sync",
+			"Offline Sync",
+			N_("Copy folder content locally for offline operation"),
+			FALSE,
+			G_PARAM_READWRITE |
+			CAMEL_PARAM_PERSISTENT));
 }
 
 static void
 camel_offline_folder_init (CamelOfflineFolder *folder)
 {
+	folder->priv = CAMEL_OFFLINE_FOLDER_GET_PRIVATE (folder);
+
 	camel_object_hook_event (
 		folder, "folder_changed",
 		(CamelObjectEventHookFunc) offline_folder_changed, NULL);
 }
 
 /**
+ * camel_offline_folder_get_offline_sync:
+ * @offline_folder: a #CamelOfflineFolder
+ *
+ * Since: 3.0
+ **/
+gboolean
+camel_offline_folder_get_offline_sync (CamelOfflineFolder *offline_folder)
+{
+	g_return_val_if_fail (CAMEL_IS_OFFLINE_FOLDER (offline_folder), FALSE);
+
+	return offline_folder->priv->offline_sync;
+}
+
+/**
+ * camel_offline_folder_set_offline_sync:
+ * @offline_folder: a #CamelOfflineFolder
+ * @offline_sync: whether to synchronize for offline use
+ *
+ * Since: 3.0
+ **/
+void
+camel_offline_folder_set_offline_sync (CamelOfflineFolder *offline_folder,
+                                       gboolean offline_sync)
+{
+	g_return_if_fail (CAMEL_IS_OFFLINE_FOLDER (offline_folder));
+
+	offline_folder->priv->offline_sync = offline_sync;
+
+	g_object_notify (G_OBJECT (offline_folder), "offline-sync");
+}
+
+/**
  * camel_offline_folder_downsync:
  * @offline: a #CamelOfflineFolder object
  * @expression: search expression describing which set of messages to downsync (%NULL for all)
diff --git a/camel/camel-offline-folder.h b/camel/camel-offline-folder.h
index 51de524..7afece9 100644
--- a/camel/camel-offline-folder.h
+++ b/camel/camel-offline-folder.h
@@ -52,31 +52,30 @@ G_BEGIN_DECLS
 
 typedef struct _CamelOfflineFolder CamelOfflineFolder;
 typedef struct _CamelOfflineFolderClass CamelOfflineFolderClass;
-
-enum {
-	CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE = CAMEL_FOLDER_ARG_LAST,
-	CAMEL_OFFLINE_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100
-};
-
-enum {
-	CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE = CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE | CAMEL_ARG_BOO
-};
+typedef struct _CamelOfflineFolderPrivate CamelOfflineFolderPrivate;
 
 struct _CamelOfflineFolder {
 	CamelFolder parent;
-
-	guint sync_offline:1;
+	CamelOfflineFolderPrivate *priv;
 };
 
 struct _CamelOfflineFolderClass {
 	CamelFolderClass parent_class;
 
-	gboolean (* downsync) (CamelOfflineFolder *folder, const gchar *expression, CamelException *ex);
+	gboolean	(*downsync)		(CamelOfflineFolder *folder,
+						 const gchar *expression,
+						 CamelException *ex);
 };
 
-GType camel_offline_folder_get_type (void);
-
-gboolean camel_offline_folder_downsync (CamelOfflineFolder *offline, const gchar *expression, CamelException *ex);
+GType		camel_offline_folder_get_type	(void);
+gboolean	camel_offline_folder_get_offline_sync
+						(CamelOfflineFolder *offline);
+void		camel_offline_folder_set_offline_sync
+						(CamelOfflineFolder *offline,
+						 gboolean offline_sync);
+gboolean	camel_offline_folder_downsync	(CamelOfflineFolder *offline,
+						 const gchar *expression,
+						 CamelException *ex);
 
 G_END_DECLS
 
diff --git a/camel/camel-offline-journal.c b/camel/camel-offline-journal.c
index 810f1a4..b232c06 100644
--- a/camel/camel-offline-journal.c
+++ b/camel/camel-offline-journal.c
@@ -141,7 +141,8 @@ camel_offline_journal_write (CamelOfflineJournal *journal,
 		camel_exception_setv (
 			ex, CAMEL_EXCEPTION_SYSTEM,
 			_("Cannot write offline journal for folder '%s': %s"),
-			journal->folder->full_name, g_strerror (errno));
+			camel_folder_get_full_name (journal->folder),
+			g_strerror (errno));
 		return -1;
 	}
 
@@ -165,7 +166,8 @@ camel_offline_journal_write (CamelOfflineJournal *journal,
 	camel_exception_setv (
 		ex, CAMEL_EXCEPTION_SYSTEM,
 		_("Cannot write offline journal for folder '%s': %s"),
-		journal->folder->full_name, g_strerror (errno));
+		camel_folder_get_full_name (journal->folder),
+		g_strerror (errno));
 
 	fclose (fp);
 
diff --git a/camel/camel-offline-store.c b/camel/camel-offline-store.c
index d9cf25d..bb0a892 100644
--- a/camel/camel-offline-store.c
+++ b/camel/camel-offline-store.c
@@ -124,7 +124,7 @@ camel_offline_store_set_network_state (CamelOfflineStore *store,
 					folder = folders->pdata[i];
 
 					if (G_TYPE_CHECK_INSTANCE_TYPE (folder, CAMEL_TYPE_OFFLINE_FOLDER)
-					    && (sync || ((CamelOfflineFolder *) folder)->sync_offline)) {
+					    && (sync || camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (folder)))) {
 						camel_offline_folder_downsync ((CamelOfflineFolder *) folder, NULL, &lex);
 						camel_exception_clear (&lex);
 					}
@@ -183,7 +183,7 @@ camel_offline_store_prepare_for_offline (CamelOfflineStore *store,
 					folder = folders->pdata[i];
 
 					if (G_TYPE_CHECK_INSTANCE_TYPE (folder, CAMEL_TYPE_OFFLINE_FOLDER)
-					    && (sync || ((CamelOfflineFolder *) folder)->sync_offline)) {
+					    && (sync || camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (folder)))) {
 						camel_offline_folder_downsync ((CamelOfflineFolder *) folder, NULL, &lex);
 						camel_exception_clear (&lex);
 					}
diff --git a/camel/camel-offline-store.h b/camel/camel-offline-store.h
index 148b645..43b0f63 100644
--- a/camel/camel-offline-store.h
+++ b/camel/camel-offline-store.h
@@ -54,10 +54,6 @@ typedef struct _CamelOfflineStore CamelOfflineStore;
 typedef struct _CamelOfflineStoreClass CamelOfflineStoreClass;
 
 enum {
-	CAMEL_OFFLINE_STORE_ARG_FIRST  = CAMEL_STORE_ARG_FIRST + 100
-};
-
-enum {
 	CAMEL_OFFLINE_STORE_NETWORK_AVAIL,
 	CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL
 };
diff --git a/camel/camel-sasl.c b/camel/camel-sasl.c
index 76846ca..f1ae5f3 100644
--- a/camel/camel-sasl.c
+++ b/camel/camel-sasl.c
@@ -393,6 +393,13 @@ camel_sasl_get_authenticated (CamelSasl *sasl)
 	return sasl->priv->authenticated;
 }
 
+/**
+ * camel_sasl_set_authenticated:
+ * @sasl: a #CamelSasl
+ * @authenticated: whether we have successfully authenticated
+ *
+ * Since: 3.0
+ **/
 void
 camel_sasl_set_authenticated (CamelSasl *sasl,
                               gboolean authenticated)
@@ -404,6 +411,12 @@ camel_sasl_set_authenticated (CamelSasl *sasl,
 	g_object_notify (G_OBJECT (sasl), "authenticated");
 }
 
+/**
+ * camel_sasl_get_mechanism:
+ * @sasl: a #CamelSasl
+ *
+ * Since: 3.0
+ **/
 const gchar *
 camel_sasl_get_mechanism (CamelSasl *sasl)
 {
@@ -412,6 +425,12 @@ camel_sasl_get_mechanism (CamelSasl *sasl)
 	return sasl->priv->mechanism;
 }
 
+/**
+ * camel_sasl_get_service:
+ * @sasl: a #CamelSasl
+ *
+ * Since: 3.0
+ **/
 CamelService *
 camel_sasl_get_service (CamelSasl *sasl)
 {
@@ -420,6 +439,12 @@ camel_sasl_get_service (CamelSasl *sasl)
 	return sasl->priv->service;
 }
 
+/**
+ * camel_sasl_get_service_name:
+ * @sasl: a #CamelSasl
+ *
+ * Since: 3.0
+ **/
 const gchar *
 camel_sasl_get_service_name (CamelSasl *sasl)
 {
diff --git a/camel/camel-service.c b/camel/camel-service.c
index cc2986c..bab7359 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -83,124 +83,6 @@ service_finalize (GObject *object)
 	G_OBJECT_CLASS (camel_service_parent_class)->finalize (object);
 }
 
-static gint
-service_setv (CamelObject *object,
-              CamelException *ex,
-              CamelArgV *args)
-{
-	CamelService *service = (CamelService *) object;
-	CamelURL *url = service->url;
-	gboolean reconnect = FALSE;
-	guint32 tag;
-	gint i;
-
-	for (i = 0; i < args->argc; i++) {
-		tag = args->argv[i].tag;
-
-		/* make sure this is an arg we're supposed to handle */
-		if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST ||
-		    (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100)
-			continue;
-
-		if (tag == CAMEL_SERVICE_USERNAME) {
-			/* set the username */
-			if (strcmp (url->user, args->argv[i].ca_str) != 0) {
-				camel_url_set_user (url, args->argv[i].ca_str);
-				reconnect = TRUE;
-			}
-		} else if (tag == CAMEL_SERVICE_AUTH) {
-			/* set the auth mechanism */
-			if (strcmp (url->authmech, args->argv[i].ca_str) != 0) {
-				camel_url_set_authmech (url, args->argv[i].ca_str);
-				reconnect = TRUE;
-			}
-		} else if (tag == CAMEL_SERVICE_HOSTNAME) {
-			/* set the hostname */
-			if (strcmp (url->host, args->argv[i].ca_str) != 0) {
-				camel_url_set_host (url, args->argv[i].ca_str);
-				reconnect = TRUE;
-			}
-		} else if (tag == CAMEL_SERVICE_PORT) {
-			/* set the port */
-			if (url->port != args->argv[i].ca_int) {
-				camel_url_set_port (url, args->argv[i].ca_int);
-				reconnect = TRUE;
-			}
-		} else if (tag == CAMEL_SERVICE_PATH) {
-			/* set the path */
-			if (strcmp (url->path, args->argv[i].ca_str) != 0) {
-				camel_url_set_path (url, args->argv[i].ca_str);
-				reconnect = TRUE;
-			}
-		} else {
-			/* error? */
-			continue;
-		}
-
-		/* let our parent know that we've handled this arg */
-		camel_argv_ignore (args, i);
-	}
-
-	/* FIXME: what if we are in the process of connecting? */
-	if (reconnect && service->status == CAMEL_SERVICE_CONNECTED) {
-		/* reconnect the service using the new URL */
-		if (camel_service_disconnect (service, TRUE, ex))
-			camel_service_connect (service, ex);
-	}
-
-	/* Chain up to parent's setv() method. */
-	return CAMEL_OBJECT_CLASS (camel_service_parent_class)->setv (object, ex, args);
-}
-
-static gint
-service_getv (CamelObject *object,
-              CamelException *ex,
-              CamelArgGetV *args)
-{
-	CamelService *service = (CamelService *) object;
-	CamelURL *url = service->url;
-	guint32 tag;
-	gint i;
-
-	for (i = 0; i < args->argc; i++) {
-		tag = args->argv[i].tag;
-
-		/* make sure this is an arg we're supposed to handle */
-		if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST ||
-		    (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100)
-			continue;
-
-		switch (tag) {
-		case CAMEL_SERVICE_USERNAME:
-			/* get the username */
-			*args->argv[i].ca_str = url->user;
-			break;
-		case CAMEL_SERVICE_AUTH:
-			/* get the auth mechanism */
-			*args->argv[i].ca_str = url->authmech;
-			break;
-		case CAMEL_SERVICE_HOSTNAME:
-			/* get the hostname */
-			*args->argv[i].ca_str = url->host;
-			break;
-		case CAMEL_SERVICE_PORT:
-			/* get the port */
-			*args->argv[i].ca_int = url->port;
-			break;
-		case CAMEL_SERVICE_PATH:
-			/* get the path */
-			*args->argv[i].ca_str = url->path;
-			break;
-		default:
-			/* error? */
-			break;
-		}
-	}
-
-	/* Chain up to parent's getv() method. */
-	return CAMEL_OBJECT_CLASS (camel_service_parent_class)->getv (object, ex, args);
-}
-
 static gboolean
 service_construct (CamelService *service,
                    CamelSession *session,
@@ -332,17 +214,12 @@ static void
 camel_service_class_init (CamelServiceClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 
 	g_type_class_add_private (class, sizeof (CamelServicePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = service_finalize;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->setv = service_setv;
-	camel_object_class->getv = service_getv;
-
 	class->construct = service_construct;
 	class->connect = service_connect;
 	class->disconnect = service_disconnect;
diff --git a/camel/camel-service.h b/camel/camel-service.h
index aadd3a7..6817055 100644
--- a/camel/camel-service.h
+++ b/camel/camel-service.h
@@ -61,21 +61,6 @@ typedef struct _CamelService CamelService;
 typedef struct _CamelServiceClass CamelServiceClass;
 typedef struct _CamelServicePrivate CamelServicePrivate;
 
-enum {
-	CAMEL_SERVICE_ARG_FIRST  = CAMEL_ARG_FIRST + 100,
-	CAMEL_SERVICE_ARG_USERNAME,
-	CAMEL_SERVICE_ARG_AUTH,
-	CAMEL_SERVICE_ARG_HOSTNAME,
-	CAMEL_SERVICE_ARG_PORT,
-	CAMEL_SERVICE_ARG_PATH
-};
-
-#define CAMEL_SERVICE_USERNAME     (CAMEL_SERVICE_ARG_USERNAME | CAMEL_ARG_STR)
-#define CAMEL_SERVICE_AUTH         (CAMEL_SERVICE_ARG_AUTH | CAMEL_ARG_STR)
-#define CAMEL_SERVICE_HOSTNAME     (CAMEL_SERVICE_ARG_HOSTNAME | CAMEL_ARG_STR)
-#define CAMEL_SERVICE_PORT         (CAMEL_SERVICE_ARG_PORT | CAMEL_ARG_INT)
-#define CAMEL_SERVICE_PATH         (CAMEL_SERVICE_ARG_PATH | CAMEL_ARG_STR)
-
 typedef enum {
 	CAMEL_SERVICE_DISCONNECTED,
 	CAMEL_SERVICE_CONNECTING,
@@ -83,7 +68,12 @@ typedef enum {
 	CAMEL_SERVICE_DISCONNECTING
 } CamelServiceConnectionStatus;
 
-typedef enum _CamelServiceLock {
+/**
+ * CamelServiceLock:
+ *
+ * Since: 3.0
+ **/
+typedef enum {
 	CS_REC_CONNECT_LOCK,
 	CS_CONNECT_OP_LOCK
 } CamelServiceLock;
diff --git a/camel/camel-session.h b/camel/camel-session.h
index 7c8c02a..628f647 100644
--- a/camel/camel-session.h
+++ b/camel/camel-session.h
@@ -75,6 +75,11 @@ enum {
 	CAMEL_SESSION_PASSPHRASE = 1 << 4
 };
 
+/**
+ * CamelSessionLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CS_SESSION_LOCK,
 	CS_THREAD_LOCK
diff --git a/camel/camel-store-summary.h b/camel/camel-store-summary.h
index 9070264..6f68ef1 100644
--- a/camel/camel-store-summary.h
+++ b/camel/camel-store-summary.h
@@ -102,6 +102,11 @@ typedef enum _CamelStoreSummaryFlags {
 	CAMEL_STORE_SUMMARY_FRAGMENT = 1<<1 /* path name is stored in fragment rather than path */
 } CamelStoreSummaryFlags;
 
+/**
+ * CamelStoreSummaryLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CSS_SUMMARY_LOCK,
 	CSS_IO_LOCK,
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 6b3dfb5..f4d2e92 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -603,14 +603,17 @@ camel_store_rename_folder (CamelStore *store,
 	if (store->folders) {
 		folders = camel_object_bag_list(store->folders);
 		for (i=0;i<folders->len;i++) {
+			const gchar *full_name;
+
 			folder = folders->pdata[i];
-			namelen = strlen(folder->full_name);
+			full_name = camel_folder_get_full_name (folder);
+
+			namelen = strlen (full_name);
 			if ((namelen == oldlen &&
-			     strcmp(folder->full_name, old_name) == 0)
+			     strcmp (full_name, old_name) == 0)
 			    || ((namelen > oldlen)
-				&& strncmp(folder->full_name, old_name, oldlen) == 0
-				&& folder->full_name[oldlen] == '/')) {
-				d(printf("Found subfolder of '%s' == '%s'\n", old_name, folder->full_name));
+				&& strncmp (full_name, old_name, oldlen) == 0
+				&& full_name[oldlen] == '/')) {
 				camel_folder_lock (folder, CF_REC_LOCK);
 			} else {
 				g_ptr_array_remove_index_fast(folders, i);
@@ -630,11 +633,13 @@ camel_store_rename_folder (CamelStore *store,
 			CamelRenameInfo reninfo;
 
 			for (i=0;i<folders->len;i++) {
+				const gchar *full_name;
 				gchar *new;
 
 				folder = folders->pdata[i];
+				full_name = camel_folder_get_full_name (folder);
 
-				new = g_strdup_printf("%s%s", new_name, folder->full_name+strlen(old_name));
+				new = g_strdup_printf("%s%s", new_name, full_name+strlen(old_name));
 				camel_object_bag_rekey(store->folders, folder, new);
 				camel_folder_rename(folder, new);
 				g_free(new);
diff --git a/camel/camel-store.h b/camel/camel-store.h
index 14bc6e3..65bc51f 100644
--- a/camel/camel-store.h
+++ b/camel/camel-store.h
@@ -58,10 +58,11 @@
 
 G_BEGIN_DECLS
 
-enum {
-	CAMEL_STORE_ARG_FIRST = CAMEL_SERVICE_ARG_FIRST + 100
-};
-
+/**
+ * CamelStoreLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CS_FOLDER_LOCK
 } CamelStoreLock;
diff --git a/camel/camel-stream-filter.c b/camel/camel-stream-filter.c
index c781240..d501e92 100644
--- a/camel/camel-stream-filter.c
+++ b/camel/camel-stream-filter.c
@@ -339,6 +339,8 @@ camel_stream_filter_init (CamelStreamFilter *stream)
  * Create a new #CamelStreamFilter object.
  *
  * Returns: a new #CamelStreamFilter object.
+ *
+ * Since: 3.0
  **/
 CamelStream *
 camel_stream_filter_new (CamelStream *source)
@@ -356,6 +358,12 @@ camel_stream_filter_new (CamelStream *source)
 	return stream;
 }
 
+/**
+ * camel_stream_filter_get_source:
+ * @stream: a #CamelStreamFilter
+ *
+ * Since: 3.0
+ **/
 CamelStream *
 camel_stream_filter_get_source (CamelStreamFilter *stream)
 {
diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c
index 9920374..ab46e4d 100644
--- a/camel/camel-stream-fs.c
+++ b/camel/camel-stream-fs.c
@@ -324,6 +324,12 @@ camel_stream_fs_new_with_name_and_bounds (const gchar *name,
 	return stream;
 }
 
+/**
+ * camel_stream_fs_get_fd:
+ * @stream: a #CamelStream
+ *
+ * Since: 3.0
+ **/
 gint
 camel_stream_fs_get_fd (CamelStreamFs *stream)
 {
diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c
index 59a036f..0372098 100644
--- a/camel/camel-stream-mem.c
+++ b/camel/camel-stream-mem.c
@@ -303,6 +303,12 @@ camel_stream_mem_set_secure(CamelStreamMem *mem)
 
 /* note: with these functions the caller is the 'owner' of the buffer */
 
+/**
+ * camel_stream_mem_get_byte_array:
+ * @mem: a #CamelStreamMem
+ *
+ * Since: 3.0
+ **/
 GByteArray *
 camel_stream_mem_get_byte_array (CamelStreamMem *mem)
 {
diff --git a/camel/camel-transport.h b/camel/camel-transport.h
index f1b6e8d..654c642 100644
--- a/camel/camel-transport.h
+++ b/camel/camel-transport.h
@@ -59,10 +59,11 @@ typedef struct _CamelTransport CamelTransport;
 typedef struct _CamelTransportClass CamelTransportClass;
 typedef struct _CamelTransportPrivate CamelTransportPrivate;
 
-enum {
-	CAMEL_TRANSPORT_ARG_FIRST  = CAMEL_SERVICE_ARG_FIRST + 100
-};
-
+/**
+ * CamelTransportLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CT_SEND_LOCK
 } CamelTransportLock;
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index 937d34c..6f9b8fd 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -128,8 +128,10 @@ expression_is_correlating (const gchar *expr)
 static void
 folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], CamelVeeFolder *vf, gboolean use_db)
 {
-	CamelFolder *folder = (CamelFolder *)vf;
+	CamelFolder *folder = CAMEL_FOLDER (vf);
+	CamelStore *parent_store;
 	CamelVeeMessageInfo *vinfo;
+	const gchar *full_name;
 	const gchar *vuid;
 	gchar *oldkey;
 	gpointer oldval;
@@ -137,6 +139,8 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8],
 	CamelVeeFolder *folder_unmatched = vf->parent_vee_store ? vf->parent_vee_store->folder_unmatched : NULL;
 	GHashTable *unmatched_uids = vf->parent_vee_store ? vf->parent_vee_store->unmatched_uids : NULL;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	vinfo = vee_folder_add_uid (vf, sub, uid, hash);
 	if (vinfo == NULL)
 		return;
@@ -145,7 +149,10 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8],
 	camel_message_info_free ((CamelMessageInfo *) vinfo);
 	if (use_db) {
 		CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-		camel_db_add_to_vfolder_transaction (folder->parent_store->cdb_w, folder->full_name, vuid, &ex);
+
+		full_name = camel_folder_get_full_name (folder);
+		camel_db_add_to_vfolder_transaction (
+			parent_store->cdb_w, full_name, vuid, &ex);
 		camel_exception_clear (&ex);
 	}
 	camel_folder_change_info_add_uid (vf->changes,  vuid);
@@ -159,10 +166,18 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8],
 		vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid);
 		if (vinfo) {
 			CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-			camel_folder_change_info_remove_uid (folder_unmatched->changes, vuid);
-			camel_db_delete_uid_from_vfolder_transaction (folder->parent_store->cdb_w, ((CamelFolder *)folder_unmatched)->full_name, vuid, &ex);
-			camel_folder_summary_remove_uid_fast (((CamelFolder *)folder_unmatched)->summary, vuid);
-			camel_folder_free_message_info ((CamelFolder *)folder_unmatched, (CamelMessageInfo *)vinfo);
+
+			full_name = camel_folder_get_full_name (
+				CAMEL_FOLDER (folder_unmatched));
+			camel_folder_change_info_remove_uid (
+				folder_unmatched->changes, vuid);
+			camel_db_delete_uid_from_vfolder_transaction (
+				parent_store->cdb_w, full_name, vuid, &ex);
+			camel_folder_summary_remove_uid_fast (
+				CAMEL_FOLDER (folder_unmatched)->summary, vuid);
+			camel_folder_free_message_info (
+				CAMEL_FOLDER (folder_unmatched),
+				(CamelMessageInfo *) vinfo);
 			camel_exception_clear (&ex);
 		}
 	}
@@ -174,6 +189,8 @@ static void
 folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], gint keep, CamelVeeFolder *vf, gboolean use_db)
 {
 	CamelFolder *folder = (CamelFolder *)vf;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gchar *vuid, *oldkey;
 	gpointer oldval;
 	gint n;
@@ -185,13 +202,16 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
 	memcpy (vuid, hash, 8);
 	strcpy (vuid+8, uid);
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	camel_folder_change_info_remove_uid (vf->changes, vuid);
 	if (use_db) {
 		/* FIXME[disk-summary] Handle exception */
 		CamelException ex = CAMEL_EXCEPTION_INITIALISER;
+
+		full_name = camel_folder_get_full_name (folder);
 		camel_db_delete_uid_from_vfolder_transaction (
-			folder->parent_store->cdb_w,
-			folder->full_name, vuid, &ex);
+			parent_store->cdb_w, full_name, vuid, &ex);
 		camel_exception_clear (&ex);
 	}
 	camel_folder_summary_remove_uid_fast (folder->summary, vuid);
@@ -221,10 +241,18 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
 			vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid);
 			if (vinfo) {
 				CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-				camel_folder_change_info_remove_uid (folder_unmatched->changes, vuid);
-				camel_db_delete_uid_from_vfolder_transaction (folder->parent_store->cdb_w, ((CamelFolder *)folder_unmatched)->full_name, vuid, &ex);
-				camel_folder_summary_remove_uid_fast (((CamelFolder *)folder_unmatched)->summary, vuid);
-				camel_folder_free_message_info ((CamelFolder *)folder_unmatched, (CamelMessageInfo *)vinfo);
+
+				full_name = camel_folder_get_full_name (
+					CAMEL_FOLDER (folder_unmatched));
+				camel_folder_change_info_remove_uid (
+					folder_unmatched->changes, vuid);
+				camel_db_delete_uid_from_vfolder_transaction (
+					parent_store->cdb_w, full_name, vuid, &ex);
+				camel_folder_summary_remove_uid_fast (
+					CAMEL_FOLDER (folder_unmatched)->summary, vuid);
+				camel_folder_free_message_info (
+					CAMEL_FOLDER (folder_unmatched),
+					(CamelMessageInfo *) vinfo);
 				camel_exception_clear (&ex);
 			}
 		}
@@ -280,6 +308,7 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg)
 	CamelFolder *folder = (CamelFolder *)m->vee_folder;
 	CamelVeeFolder *vf = m->vee_folder;
 	CamelFolderChangeInfo *changes = m->changes;
+	CamelStore *parent_store;
 	gchar *vuid = NULL, hash[8];
 	const gchar *uid;
 	CamelVeeMessageInfo *vinfo;
@@ -362,10 +391,11 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg)
 	if (folder_unmatched != NULL)
 		camel_vee_folder_lock (folder_unmatched, CVF_SUMMARY_LOCK);
 
-	if (matches_changed || matches_added || changes->uid_removed->len||present)
-		camel_db_begin_transaction (folder->parent_store->cdb_w, NULL);
+	if (matches_changed || matches_added || changes->uid_removed->len||present) {
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_begin_transaction (parent_store->cdb_w, NULL);
+	}
 
-	dd (printf ("Vfolder '%s' subfolder changed '%s'\n", folder->full_name, sub->full_name));
 	dd (printf (" changed %u added %u removed %u\n", changes->uid_changed->len, changes->uid_added->len, changes->uid_removed->len));
 
 	/* Always remove removed uid's, in any case */
@@ -503,8 +533,10 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg)
 		vf->changes = camel_folder_change_info_new ();
 	}
 
-	if (matches_changed || matches_added || changes->uid_removed->len || present)
-		camel_db_end_transaction (folder->parent_store->cdb_w, NULL);
+	if (matches_changed || matches_added || changes->uid_removed->len || present) {
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_end_transaction (parent_store->cdb_w, NULL);
+	}
 	camel_vee_folder_unlock (vf, CVF_SUMMARY_LOCK);
 
 	/* Cleanup stuff on our folder */
@@ -655,9 +687,20 @@ unmatched_check_uid (gchar *uidin, gpointer value, struct _update_data *u)
 		CamelVeeMessageInfo *mi = (CamelVeeMessageInfo *)camel_folder_summary_uid (((CamelFolder *)u->folder_unmatched)->summary, uid);
 		if (mi) {
 			CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-			camel_db_delete_uid_from_vfolder_transaction (((CamelFolder *)u->folder_unmatched)->parent_store->cdb_w, ((CamelFolder *)u->folder_unmatched)->full_name, uid, &ex);
-			camel_folder_summary_remove_uid_fast (((CamelFolder *)u->folder_unmatched)->summary, uid);
-			camel_folder_change_info_remove_uid (u->folder_unmatched->changes, uid);
+			CamelStore *parent_store;
+			const gchar *full_name;
+
+			full_name = camel_folder_get_full_name (
+				CAMEL_FOLDER (u->folder_unmatched));
+			parent_store = camel_folder_get_parent_store (
+				CAMEL_FOLDER (u->folder_unmatched));
+
+			camel_db_delete_uid_from_vfolder_transaction (
+				parent_store->cdb_w, full_name, uid, &ex);
+			camel_folder_summary_remove_uid_fast (
+				((CamelFolder *)u->folder_unmatched)->summary, uid);
+			camel_folder_change_info_remove_uid (
+				u->folder_unmatched->changes, uid);
 			camel_message_info_free ((CamelMessageInfo *)mi);
 			camel_exception_clear (&ex);
 		}
@@ -679,7 +722,16 @@ folder_added_uid (gchar *uidin, gpointer value, struct _update_data *u)
 		 * testing atm */
 		if (u->rebuilt && !u->correlating) {
 			CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-			camel_db_add_to_vfolder_transaction (((CamelFolder *) u->vee_folder)->parent_store->cdb_w, ((CamelFolder *) u->vee_folder)->full_name, camel_message_info_uid (mi), &ex);
+			CamelStore *parent_store;
+			const gchar *full_name;
+
+			full_name = camel_folder_get_full_name (
+				CAMEL_FOLDER (u->vee_folder));
+			parent_store = camel_folder_get_parent_store (
+				CAMEL_FOLDER (u->vee_folder));
+			camel_db_add_to_vfolder_transaction (
+				parent_store->cdb_w, full_name,
+				camel_message_info_uid (mi), &ex);
 			camel_exception_clear (&ex);
 		}
 		if (!CAMEL_IS_VEE_FOLDER (u->source) && u->unmatched_uids != NULL) {
@@ -723,15 +775,17 @@ summary_header_to_db (CamelFolderSummary *s,
                       CamelException *ex)
 {
 	CamelFIRecord * record = g_new0 (CamelFIRecord, 1);
+	CamelStore *parent_store;
 	CamelDB *db;
-	gchar *table_name;
+	const gchar *full_name;
 	guint32 visible, unread, deleted, junked, junked_not_deleted;
 
 	/* We do this during write, so lets use write handle, though we gonna read */
-	db = s->folder->parent_store->cdb_w;
-	table_name = s->folder->full_name;
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	db = parent_store->cdb_w;
 
-	record->folder_name = table_name;
+	record->folder_name = g_strdup (full_name);
 
 	/* we always write out the current version */
 	record->version = 13;  /* FIXME: CAMEL_FOLDER_SUMMARY_VERSION; */
@@ -740,12 +794,13 @@ summary_header_to_db (CamelFolderSummary *s,
 	record->time = s->time;
 
 	record->saved_count = s->uids->len;
-	camel_object_get (s->folder, NULL,
-				 CAMEL_FOLDER_DELETED, &deleted,
-				 CAMEL_FOLDER_VISIBLE, &visible,
-				 CAMEL_FOLDER_JUNKED, &junked,
-				 CAMEL_FOLDER_JUNKED_NOT_DELETED, &junked_not_deleted,
-				 CAMEL_FOLDER_UNREAD, &unread, NULL);
+
+	unread = s->unread_count;
+	deleted = s->deleted_count;
+	junked = s->junk_count;
+	junked_not_deleted = s->junk_not_deleted_count;
+	visible = s->visible_count;
+
 	if (1) { /* We always would do this. Just refactor the code again. */
 		/*!(((CamelVeeSummary *) s)->force_counts) && !g_getenv ("FORCE_VFOLDER_COUNT")) {*/
 		/* We should be in sync always. so use the count. Don't search.*/
@@ -775,7 +830,6 @@ summary_header_to_db (CamelFolderSummary *s,
 		record->jnd_count = s->junk_not_deleted_count;
 	}
 
-	d (printf ("%s %d %d %d %d %d\n", s->folder->full_name, record->junk_count, record->deleted_count, record->unread_count, record->visible_count, record->jnd_count));
 	return record;
 }
 
@@ -894,9 +948,14 @@ vee_folder_finalize (GObject *object)
 
 	/* Save the counts to DB */
 	if (!vf->deleted) {
+		CamelFolder *folder;
+		CamelStore *parent_store;
 		CamelException ex = CAMEL_EXCEPTION_INITIALISER;
-		record = summary_header_to_db (((CamelFolder *)vf)->summary, NULL);
-		camel_db_write_folder_info_record (((CamelFolder *) vf)->parent_store->cdb_w, record, &ex);
+
+		folder = CAMEL_FOLDER (vf);
+		parent_store = camel_folder_get_parent_store (folder);
+		record = summary_header_to_db (folder->summary, NULL);
+		camel_db_write_folder_info_record (parent_store->cdb_w, record, &ex);
 		g_free (record);
 		camel_exception_clear (&ex);
 	}
@@ -932,108 +991,6 @@ vee_folder_finalize (GObject *object)
 	G_OBJECT_CLASS (camel_vee_folder_parent_class)->finalize (object);
 }
 
-/* This entire code will be useless, since we sync the counts always. */
-static gint
-vee_folder_getv (CamelObject *object,
-                 CamelException *ex,
-                 CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	CamelVeeFolder *vf = (CamelVeeFolder *)folder;
-	gint i;
-	guint32 tag;
-	gint unread = -1, deleted = 0, junked = 0, visible = 0, count = -1, junked_not_deleted = -1;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		/* NB: this is a copy of camel-folder.c with the unread count logic altered.
-		   makes sure its still atomically calculated */
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_FOLDER_ARG_UNREAD:
-		case CAMEL_FOLDER_ARG_DELETED:
-		case CAMEL_FOLDER_ARG_JUNKED:
-		case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-		case CAMEL_FOLDER_ARG_VISIBLE:
-
-			if (vf->expression && vf->priv->unread_vfolder == -1)
-				camel_vee_summary_load_check_unread_vfolder ((CamelVeeSummary *)folder->summary);
-
-			/* This is so we can get the values atomically, and also so we can calculate them only once */
-			if (unread == -1) {
-				gint j;
-				CamelMessageInfoBase *info;
-				CamelVeeMessageInfo *vinfo;
-
-				unread = deleted = visible = junked = junked_not_deleted = 0;
-				camel_folder_summary_prepare_fetch_all (folder->summary, ex);
-				count = camel_folder_summary_count (folder->summary);
-				for (j=0; j<count; j++) {
-					if ((info = (CamelMessageInfoBase *) camel_folder_summary_index (folder->summary, j))) {
-						guint32 flags;
-
-						vinfo = (CamelVeeMessageInfo *) info;
-						flags = vinfo->old_flags; /* ? vinfo->old_flags : camel_message_info_flags (info); */
-
-						if ((flags & (CAMEL_MESSAGE_SEEN)) == 0)
-							unread++;
-						if (flags & CAMEL_MESSAGE_DELETED)
-							deleted++;
-						if (flags & CAMEL_MESSAGE_JUNK) {
-							junked++;
-								if (!(flags & CAMEL_MESSAGE_DELETED))
-									junked_not_deleted++;
-						}
-						if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0)
-							visible++;
-						camel_message_info_free (info);
-					}
-				}
-			}
-
-			switch (tag & CAMEL_ARG_TAG) {
-			case CAMEL_FOLDER_ARG_UNREAD:
-				if (vf->priv->unread_vfolder == 1)
-					count = unread == -1 ? 0 : unread - junked_not_deleted;
-				else
-					count = unread == -1 ? 0 : unread;
-				break;
-			case CAMEL_FOLDER_ARG_DELETED:
-				count = deleted == -1 ? 0 : deleted;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED:
-				count = junked == -1 ? 0 : junked;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-				count = junked_not_deleted == -1 ? 0 : junked_not_deleted;
-				break;
-			case CAMEL_FOLDER_ARG_VISIBLE:
-				if (vf->priv->unread_vfolder == 1)
-					count = unread == -1 ? 0 : unread - junked_not_deleted;
-				else
-					count = visible == -1 ? 0 : visible;
-
-				break;
-			}
-			folder->summary->unread_count = unread == -1 ? 0 : unread;
-			folder->summary->deleted_count = deleted == -1 ? 0 : deleted;
-			junked = folder->summary->junk_count = junked == -1 ? 0 : junked;
-			folder->summary->junk_not_deleted_count = junked_not_deleted == -1 ? 0 : junked_not_deleted;
-			folder->summary->visible_count = visible == -1 ? 0 : visible;
-			*arg->ca_int = count;
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return ((CamelObjectClass *)camel_vee_folder_parent_class)->getv (object, ex, args);
-}
-
 static gboolean
 vee_folder_refresh_info (CamelFolder *folder,
                          CamelException *ex)
@@ -1088,7 +1045,7 @@ vee_folder_sync (CamelFolder *folder,
 			if (strncmp (camel_exception_get_description (ex), "no such table", 13)) {
 				const gchar *desc;
 
-				camel_object_get (f, NULL, CAMEL_OBJECT_DESCRIPTION, &desc, NULL);
+				desc = camel_folder_get_description (f);
 				camel_exception_setv (ex, ex->id, _("Error storing '%s': %s"), desc, ex->desc);
 				g_warning ("%s", camel_exception_get_description (ex));
 			} else
@@ -1103,26 +1060,10 @@ vee_folder_sync (CamelFolder *folder,
 		node = node->next;
 	}
 
-#if 0
-	/* Seems like we are doing something wrong with this, as folder_changed happens after this, the counts are misleading.
-	 * Anyways we do a force sync on exit, it should be all fine.
-	  */
-	record = summary_header_to_db (folder->summary, ex);
-	camel_db_write_folder_info_record (folder->parent_store->cdb, record, ex);
-	g_free (record);
-#endif
-	/* It makes no sense to clear the folders_changed list without
-	 * actually rebuilding. */
-#if 0
-	if (node == NULL) {
-		camel_vee_folder_lock (vf, CVF_CHANGED_LOCK);
-		g_list_free (p->folders_changed);
-		p->folders_changed = NULL;
-		camel_vee_folder_unlock (vf, CVF_CHANGED_LOCK);
-	}
-#endif
 	if (vf->priv->unread_vfolder == 1) {
 		/* Cleanup Junk/Trash uids */
+		CamelStore *parent_store;
+		const gchar *full_name;
 		GSList *del = NULL;
 		gint i, count;
 
@@ -1139,13 +1080,16 @@ vee_folder_sync (CamelFolder *folder,
 			}
 			camel_message_info_free (mi);
 		}
-		camel_db_delete_vuids (folder->parent_store->cdb_w, folder->full_name, "", del, ex);
+
+		full_name = camel_folder_get_full_name (folder);
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_delete_vuids (parent_store->cdb_w, full_name, "", del, ex);
 		g_slist_foreach (del, (GFunc) camel_pstring_free, NULL);
 		g_slist_free (del);
 	}
 	camel_vee_folder_unlock (vf, CVF_SUBFOLDER_LOCK);
 
-	camel_object_state_write (vf);
+	camel_object_state_write (CAMEL_OBJECT (vf));
 
 	return TRUE;
 }
@@ -1176,7 +1120,7 @@ vee_folder_get_message (CamelFolder *folder,
 		camel_exception_setv (
 			ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
 			_("No such message %s in %s"), uid,
-			folder->name);
+			camel_folder_get_name (folder));
 	}
 
 	return msg;
@@ -1457,15 +1401,24 @@ vee_folder_set_expression (CamelVeeFolder *vee_folder,
 
 	/* Recreate the table when the query changes, only if we are not setting it first */
 	if (vee_folder->expression) {
-		CamelFolderSummary *s = ((CamelFolder *)vee_folder)->summary;
-		camel_folder_summary_clear (s);
-		camel_db_recreate_vfolder (((CamelFolder *) vee_folder)->parent_store->cdb_w, ((CamelFolder *) vee_folder)->full_name, &ex);
+		CamelFolderSummary *summary;
+		CamelStore *parent_store;
+		CamelFolder *folder;
+		const gchar *full_name;
+
+		folder = CAMEL_FOLDER (vee_folder);
+		full_name = camel_folder_get_full_name (folder);
+		parent_store = camel_folder_get_parent_store (folder);
+		summary = folder->summary;
+
+		camel_folder_summary_clear (summary);
+		camel_db_recreate_vfolder (parent_store->cdb_w, full_name, &ex);
 		camel_exception_clear (&ex);
-		s->junk_count = 0;
-		s->deleted_count = 0;
-		s->unread_count = 0;
-		s->visible_count = 0;
-		s->junk_not_deleted_count = 0;
+		summary->junk_count = 0;
+		summary->deleted_count = 0;
+		summary->unread_count = 0;
+		summary->visible_count = 0;
+		summary->junk_not_deleted_count = 0;
 	}
 
 	g_free (vee_folder->expression);
@@ -1724,8 +1677,6 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder,
 		}
 
 	}
-	dd (printf ("vee_folder_rebuild_folder (%s <- %s %s): match %d, correlating %d, rebuilded %d\n",
-		folder->full_name, source->full_name, shash, match->len, correlating, rebuilded));
 
 	u.source = source;
 	u.vee_folder = vee_folder;
@@ -1816,13 +1767,20 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder,
 
 	/* now matchhash contains any new uid's, add them, etc */
 	if (rebuilded && !correlating) {
-		camel_db_begin_transaction (folder->parent_store->cdb_w, NULL);
+		CamelStore *parent_store;
 
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_begin_transaction (parent_store->cdb_w, NULL);
 	}
+
 	g_hash_table_foreach (matchhash, (GHFunc)folder_added_uid, &u);
 
-	if (rebuilded && !correlating)
-		camel_db_end_transaction (folder->parent_store->cdb_w, NULL);
+	if (rebuilded && !correlating) {
+		CamelStore *parent_store;
+
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_end_transaction (parent_store->cdb_w, NULL);
+	}
 
 	if (folder_unmatched != NULL) {
 		/* scan unmatched, remove any that have vanished, etc */
@@ -1869,9 +1827,14 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder,
 	if (del_list) {
 		if (!correlating) {
 			CamelException ex = CAMEL_EXCEPTION_INITIALISER;
+			CamelStore *parent_store;
+			const gchar *full_name;
+
+			full_name = camel_folder_get_full_name (folder);
+			parent_store = camel_folder_get_parent_store (folder);
 			camel_db_delete_vuids (
-				folder->parent_store->cdb_w,
-				folder->full_name, shash, del_list, &ex);
+				parent_store->cdb_w,
+				full_name, shash, del_list, &ex);
 			camel_exception_clear (&ex);
 		}
 		((CamelVeeSummary *)folder->summary)->force_counts = TRUE;
@@ -1912,11 +1875,15 @@ vee_folder_folder_changed (CamelVeeFolder *vee_folder,
 {
 	CamelVeeFolderPrivate *p = CAMEL_VEE_FOLDER_GET_PRIVATE (vee_folder);
 	struct _folder_changed_msg *m;
-	CamelSession *session = ((CamelService *)((CamelFolder *)vee_folder)->parent_store)->session;
+	CamelStore *parent_store;
+	CamelSession *session;
 
 	if (p->destroyed)
 		return;
 
+	parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (vee_folder));
+	session = CAMEL_SERVICE (parent_store)->session;
+
 	m = camel_session_thread_msg_new (session, &folder_changed_ops, sizeof (*m));
 	m->changes = camel_folder_change_info_new ();
 	camel_folder_change_info_cat (m->changes, changes);
@@ -1949,7 +1916,6 @@ static void
 camel_vee_folder_class_init (CamelVeeFolderClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
 	g_type_class_add_private (class, sizeof (CamelVeeFolderPrivate));
@@ -1957,9 +1923,6 @@ camel_vee_folder_class_init (CamelVeeFolderClass *class)
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = vee_folder_finalize;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = vee_folder_getv;
-
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->refresh_info = vee_folder_refresh_info;
 	folder_class->sync = vee_folder_sync;
@@ -2014,17 +1977,19 @@ camel_vee_folder_init (CamelVeeFolder *vee_folder)
 }
 
 void
-camel_vee_folder_construct (CamelVeeFolder *vf, CamelStore *parent_store, const gchar *full, const gchar *name, guint32 flags)
+camel_vee_folder_construct (CamelVeeFolder *vf, guint32 flags)
 {
 	CamelFolder *folder = (CamelFolder *)vf;
+	CamelStore *parent_store;
 
 	vf->flags = flags;
-	camel_folder_construct (folder, parent_store, full, name);
 
 	folder->summary = camel_vee_summary_new (folder);
 
+	parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (vf));
+
 	if (CAMEL_IS_VEE_STORE (parent_store))
-		vf->parent_vee_store = (CamelVeeStore *)parent_store;
+		vf->parent_vee_store = CAMEL_VEE_STORE (parent_store);
 }
 
 /**
@@ -2053,17 +2018,22 @@ camel_vee_folder_new (CamelStore *parent_store, const gchar *full, guint32 flags
 			name = full;
 		else
 			name++;
-		vf = g_object_new (CAMEL_TYPE_VEE_FOLDER, NULL);
-		camel_vee_folder_construct (vf, parent_store, full, name, flags);
+		vf = g_object_new (
+			CAMEL_TYPE_VEE_FOLDER,
+			"name", name, "full-name", full,
+			"parent-store", parent_store, NULL);
+		camel_vee_folder_construct (vf, flags);
 	}
 
 	d (printf ("returning folder %s %p, count = %d\n", full, vf, camel_folder_get_message_count ((CamelFolder *)vf)));
 
 	if (vf) {
+		CamelObject *object = CAMEL_OBJECT (vf);
+
 		tmp = g_strdup_printf ("%s/%s.cmeta", ((CamelService *)parent_store)->url->path, full);
-		camel_object_set (vf, NULL, CAMEL_OBJECT_STATE_FILE, tmp, NULL);
+		camel_object_set_state_filename (object, tmp);
 		g_free (tmp);
-		if (camel_object_state_read (vf) == -1) {
+		if (camel_object_state_read (object) == -1) {
 			/* setup defaults: we have none currently */
 		}
 	}
@@ -2126,8 +2096,6 @@ camel_vee_folder_add_folder (CamelVeeFolder *vf, CamelFolder *sub)
 
 	camel_vee_folder_unlock (vf, CVF_SUBFOLDER_LOCK);
 
-	d (printf ("camel_vee_folder_add_folder (%s, %s)\n", ((CamelFolder *)vf)->full_name, sub->full_name));
-
 	camel_object_hook_event ((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc)folder_changed, vf);
 	camel_object_hook_event ((CamelObject *)sub, "deleted", (CamelObjectEventHookFunc)subfolder_deleted, vf);
 	camel_object_hook_event ((CamelObject *)sub, "renamed", (CamelObjectEventHookFunc)folder_renamed, vf);
@@ -2289,10 +2257,12 @@ camel_vee_folder_set_folders (CamelVeeFolder *vf, GList *folders)
 void
 camel_vee_folder_hash_folder (CamelFolder *folder, gchar buffer[8])
 {
+	CamelStore *parent_store;
 	GChecksum *checksum;
 	guint8 *digest;
 	gsize length;
 	gint state = 0, save = 0;
+	const gchar *full_name;
 	gchar *tmp;
 	gint i;
 
@@ -2300,11 +2270,13 @@ camel_vee_folder_hash_folder (CamelFolder *folder, gchar buffer[8])
 	digest = g_alloca (length);
 
 	checksum = g_checksum_new (G_CHECKSUM_MD5);
-	tmp = camel_service_get_url ((CamelService *)folder->parent_store);
+	parent_store = camel_folder_get_parent_store (folder);
+	tmp = camel_service_get_url (CAMEL_SERVICE (parent_store));
 	g_checksum_update (checksum, (guchar *) tmp, -1);
 	g_free (tmp);
-	tmp = folder->full_name;
-	g_checksum_update (checksum, (guchar *) tmp, -1);
+
+	full_name = camel_folder_get_full_name (folder);
+	g_checksum_update (checksum, (guchar *) full_name, -1);
 	g_checksum_get_digest (checksum, digest, &length);
 	g_checksum_free (checksum);
 
@@ -2388,34 +2360,46 @@ camel_vee_folder_sync_headers (CamelFolder *vf,
                                CamelException *ex)
 {
 	CamelFIRecord * record;
+	CamelStore *parent_store;
 	time_t start, end;
 
 	/* Save the counts to DB */
 	start = time (NULL);
 	record = summary_header_to_db (vf->summary, ex);
-	camel_db_write_folder_info_record (vf->parent_store->cdb_w, record, ex);
+	parent_store = camel_folder_get_parent_store (vf);
+	camel_db_write_folder_info_record (parent_store->cdb_w, record, ex);
 	end = time (NULL);
-	dd (printf ("Sync for vfolder '%s': %ld secs\n", vf->full_name, end-start));
 
 	g_free (record);
 }
 
-/* FIXME: This shouldn't be needed */
+/**
+ * camel_vee_folder_get_unread_vfolder:
+ * @folder: a #CamelVeeFolder
+ *
+ * Since: 3.0
+ **/
 gint
 camel_vee_folder_get_unread_vfolder (CamelVeeFolder *folder)
 {
-	g_return_val_if_fail (folder != NULL, 0);
+	/* FIXME: This shouldn't be needed */
 	g_return_val_if_fail (CAMEL_IS_VEE_FOLDER (folder), 0);
 
 	return folder->priv->unread_vfolder;
 }
 
-/* FIXME: This shouldn't be needed */
+/**
+ * camel_vee_folder_set_unread_vfolder:
+ * @folder: a #CamelVeeFolder
+ * @unread_vfolder: %TRUE if %folder is for unread messages
+ *
+ * Since: 3.0
+ **/
 void
 camel_vee_folder_set_unread_vfolder (CamelVeeFolder *folder,
                                      gint unread_vfolder)
 {
-	g_return_if_fail (folder != NULL);
+	/* FIXME: This shouldn't be needed */
 	g_return_if_fail (CAMEL_IS_VEE_FOLDER (folder));
 
 	folder->priv->unread_vfolder = unread_vfolder;
diff --git a/camel/camel-vee-folder.h b/camel/camel-vee-folder.h
index da0e2c9..90f0bec 100644
--- a/camel/camel-vee-folder.h
+++ b/camel/camel-vee-folder.h
@@ -56,6 +56,11 @@ typedef struct _CamelVeeFolder CamelVeeFolder;
 typedef struct _CamelVeeFolderClass CamelVeeFolderClass;
 typedef struct _CamelVeeFolderPrivate CamelVeeFolderPrivate;
 
+/**
+ * CamelVeeFolderLock:
+ *
+ * Since: 3.0
+ **/
 typedef enum {
 	CVF_SUMMARY_LOCK,
 	CVF_SUBFOLDER_LOCK,
@@ -102,7 +107,7 @@ struct _CamelVeeFolderClass {
 
 GType	      camel_vee_folder_get_type		(void);
 CamelFolder  *camel_vee_folder_new		(CamelStore *parent_store, const gchar *full, guint32 flags);
-void         camel_vee_folder_construct		(CamelVeeFolder *vf, CamelStore *parent_store, const gchar *full, const gchar *name, guint32 flags);
+void         camel_vee_folder_construct		(CamelVeeFolder *vf, guint32 flags);
 
 CamelFolder *camel_vee_folder_get_location(CamelVeeFolder *vf, const struct _CamelVeeMessageInfo *vinfo, gchar **realuid);
 
diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c
index 53b385a..71ae5bd 100644
--- a/camel/camel-vee-store.c
+++ b/camel/camel-vee-store.c
@@ -49,7 +49,13 @@ static gint
 vee_folder_cmp (gconstpointer ap,
                 gconstpointer bp)
 {
-	return strcmp (((CamelFolder **)ap)[0]->full_name, ((CamelFolder **)bp)[0]->full_name);
+	const gchar *full_name_a;
+	const gchar *full_name_b;
+
+	full_name_a = camel_folder_get_full_name (((CamelFolder **) ap)[0]);
+	full_name_b = camel_folder_get_full_name (((CamelFolder **) bp)[0]);
+
+	return g_strcmp0 (full_name_a, full_name_b);
 }
 
 static void
@@ -127,8 +133,11 @@ vee_store_construct (CamelService *service,
 	/* Set up unmatched folder */
 #ifndef VEE_UNMATCHED_ENABLE
 	vee_store->unmatched_uids = g_hash_table_new (g_str_hash, g_str_equal);
-	vee_store->folder_unmatched = g_object_new (CAMEL_TYPE_VEE_FOLDER, NULL);
-	camel_vee_folder_construct (vee_store->folder_unmatched, store, CAMEL_UNMATCHED_NAME, _("Unmatched"), CAMEL_STORE_FOLDER_PRIVATE);
+	vee_store->folder_unmatched = g_object_new (
+		CAMEL_TYPE_VEE_FOLDER,
+		"full-name", CAMEL_UNMATCHED_NAME,
+		"name", _("Unmatched"), "parent-store", store, NULL);
+	camel_vee_folder_construct (vee_store->folder_unmatched, CAMEL_STORE_FOLDER_PRIVATE);
 	camel_db_create_vfolder (store->cdb_r, _("Unmatched"), NULL);
 #endif
 
@@ -154,9 +163,13 @@ vee_store_get_folder (CamelStore *store,
 
 	vf = (CamelVeeFolder *)camel_vee_folder_new (store, folder_name, flags);
 	if (vf && ((vf->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0)) {
+		const gchar *full_name;
+
+		full_name = camel_folder_get_full_name (CAMEL_FOLDER (vf));
+
 		/* Check that parents exist, if not, create dummy ones */
-		name = alloca (strlen (((CamelFolder *)vf)->full_name)+1);
-		strcpy (name, ((CamelFolder *)vf)->full_name);
+		name = alloca (strlen (full_name) + 1);
+		strcpy (name, full_name);
 		p = name;
 		while ( (p = strchr (p, '/'))) {
 			*p = 0;
@@ -174,7 +187,7 @@ vee_store_get_folder (CamelStore *store,
 			*p++='/';
 		}
 
-		change_folder (store, ((CamelFolder *)vf)->full_name, CHANGE_ADD, camel_folder_get_message_count ((CamelFolder *)vf));
+		change_folder (store, full_name, CHANGE_ADD, camel_folder_get_message_count ((CamelFolder *)vf));
 	}
 
 	return (CamelFolder *)vf;
@@ -249,13 +262,13 @@ vee_store_delete_folder (CamelStore *store,
 
 	folder = camel_object_bag_get (store->folders, folder_name);
 	if (folder) {
-		gchar *statefile;
+		CamelObject *object = CAMEL_OBJECT (folder);
+		const gchar *state_filename;
 
-		camel_object_get (folder, NULL, CAMEL_OBJECT_STATE_FILE, &statefile, NULL);
-		if (statefile) {
-			g_unlink (statefile);
-			camel_object_free (folder, CAMEL_OBJECT_STATE_FILE, statefile);
-			camel_object_set (folder, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL);
+		state_filename = camel_object_get_state_filename (object);
+		if (state_filename != NULL) {
+			g_unlink (state_filename);
+			camel_object_set_state_filename (object, NULL);
 		}
 
 		if ((((CamelVeeFolder *)folder)->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0) {
@@ -294,47 +307,51 @@ vee_store_get_folder_info (CamelStore *store,
 	qsort (folders->pdata, folders->len, sizeof (folders->pdata[0]), vee_folder_cmp);
 	for (i=0;i<folders->len;i++) {
 		CamelVeeFolder *folder = folders->pdata[i];
+		const gchar *full_name;
+		const gchar *name;
 		gint add = FALSE;
-		gchar *name = ((CamelFolder *)folder)->full_name, *pname, *tmp;
+		gchar *pname, *tmp;
 		CamelFolderInfo *pinfo;
 
-		d (printf ("folder '%s'\n", name));
+		name = camel_folder_get_name (CAMEL_FOLDER (folder));
+		full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder));
 
 		/* check we have to include this one */
 		if (top) {
-			gint namelen = strlen (name);
+			gint namelen = strlen (full_name);
 			gint toplen = strlen (top);
 
 			add = ((namelen == toplen
-				&& strcmp (name, top) == 0)
+				&& strcmp (full_name, top) == 0)
 			       || ((namelen > toplen)
-				   && strncmp (name, top, toplen) == 0
-				   && name[toplen] == '/'
+				   && strncmp (full_name, top, toplen) == 0
+				   && full_name[toplen] == '/'
 				   && ((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE)
-				       || strchr (name+toplen+1, '/') == NULL)));
+				       || strchr (full_name+toplen+1, '/') == NULL)));
 		} else {
 			add = (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE)
-				|| strchr (name, '/') == NULL;
+				|| strchr (full_name, '/') == NULL;
 		}
 
 		d (printf ("%sadding '%s'\n", add?"":"not ", name));
 
 		if (add) {
+			CamelStore *parent_store;
+
 			/* ensures unread is correct */
 			if ((flags & CAMEL_STORE_FOLDER_INFO_FAST) == 0)
 				camel_folder_refresh_info ((CamelFolder *)folder, NULL);
 
+			parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (folder));
+
 			info = camel_folder_info_new ();
 			url = camel_url_new ("vfolder:", NULL);
-			camel_url_set_path (url, ((CamelService *)((CamelFolder *)folder)->parent_store)->url->path);
-			camel_url_set_fragment (url, ((CamelFolder *)folder)->full_name);
+			camel_url_set_path (url, ((CamelService *) parent_store)->url->path);
+			camel_url_set_fragment (url, full_name);
 			info->uri = camel_url_to_string (url, 0);
 			camel_url_free (url);
-/*
-			info->url = g_strdup_printf ("vfolder:%s#%s", ((CamelService *)((CamelFolder *)folder)->parent_store)->url->path,
-			((CamelFolder *)folder)->full_name);*/
-			info->full_name = g_strdup (((CamelFolder *)folder)->full_name);
-			info->name = g_strdup (((CamelFolder *)folder)->name);
+			info->full_name = g_strdup (full_name);
+			info->name = g_strdup (name);
 			info->unread = camel_folder_get_unread_message_count ((CamelFolder *)folder);
 			info->flags = CAMEL_FOLDER_NOCHILDREN|CAMEL_FOLDER_VIRTUAL;
 			g_hash_table_insert (infos_hash, info->full_name, info);
@@ -346,7 +363,7 @@ vee_store_get_folder_info (CamelStore *store,
 		}
 
 		/* check for parent, if present, update flags and if adding, update parent linkage */
-		pname = g_strdup (((CamelFolder *)folder)->full_name);
+		pname = g_strdup (full_name);
 		d (printf ("looking up parent of '%s'\n", pname));
 		tmp = strrchr (pname, '/');
 		if (tmp) {
diff --git a/camel/camel-vee-summary.c b/camel/camel-vee-summary.c
index d2ba26f..a1675bd 100644
--- a/camel/camel-vee-summary.c
+++ b/camel/camel-vee-summary.c
@@ -148,7 +148,10 @@ vee_info_set_user_flag(CamelMessageInfo *mi, const gchar *name, gboolean value)
 	CamelVeeFolder *vf = (CamelVeeFolder *)mi->summary->folder;
 
 	if (camel_debug("vfolderexp"))
-		printf("Expression for vfolder '%s' is '%s'\n", mi->summary->folder->full_name, g_strescape(vf->expression, ""));
+		printf (
+			"Expression for vfolder '%s' is '%s'\n",
+			camel_folder_get_full_name (mi->summary->folder),
+			g_strescape (vf->expression, ""));
 
 	if (camel_vee_folder_get_unread_vfolder (vf) == -1)
 		camel_vee_summary_load_check_unread_vfolder (CAMEL_VEE_SUMMARY (mi->summary));
@@ -234,7 +237,10 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set)
 	gboolean hacked_unread_folder = FALSE;
 
 	if (camel_debug("vfolderexp"))
-		printf("Expression for vfolder '%s' is '%s'\n", mi->summary->folder->full_name, g_strescape(vf->expression, ""));
+		printf (
+			"Expression for vfolder '%s' is '%s'\n",
+			camel_folder_get_full_name (mi->summary->folder),
+			g_strescape (vf->expression, ""));
 
 	if (camel_vee_folder_get_unread_vfolder (vf) == -1)
 		camel_vee_summary_load_check_unread_vfolder (CAMEL_VEE_SUMMARY (mi->summary));
@@ -249,12 +255,12 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set)
 		CamelVeeSummary *vsummary = (CamelVeeSummary *)mi->summary;
 
 		HANDLE_NULL_INFO(FALSE);
-		camel_object_get(rmi->summary->folder, NULL,
-				 CAMEL_FOLDER_DELETED, &old_deleted,
-				 CAMEL_FOLDER_VISIBLE, &old_visible,
-				 CAMEL_FOLDER_JUNKED, &old_junked,
-				 CAMEL_FOLDER_JUNKED_NOT_DELETED, &old_junked_not_deleted,
-				 CAMEL_FOLDER_UNREAD, &old_unread, NULL);
+
+		old_unread = rmi->summary->unread_count;
+		old_deleted = rmi->summary->deleted_count;
+		old_junked = rmi->summary->junk_count;
+		old_junked_not_deleted = rmi->summary->junk_not_deleted_count;
+		old_visible = rmi->summary->visible_count;
 
 		if (hacked_unread_folder)
 			camel_vee_folder_mask_event_folder_changed ((CamelVeeFolder *)mi->summary->folder, rmi->summary->folder);
@@ -267,12 +273,12 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set)
 		if (hacked_unread_folder)
 			camel_vee_folder_unmask_event_folder_changed ((CamelVeeFolder *)mi->summary->folder, rmi->summary->folder);
 
-		camel_object_get(rmi->summary->folder, NULL,
-				 CAMEL_FOLDER_DELETED, &deleted,
-				 CAMEL_FOLDER_VISIBLE, &visible,
-				 CAMEL_FOLDER_JUNKED, &junked,
-				 CAMEL_FOLDER_JUNKED_NOT_DELETED, &junked_not_deleted,
-				 CAMEL_FOLDER_UNREAD, &unread, NULL);
+		unread = rmi->summary->unread_count;
+		deleted = rmi->summary->deleted_count;
+		junked = rmi->summary->junk_count;
+		junked_not_deleted = rmi->summary->junk_not_deleted_count;
+		visible = rmi->summary->visible_count;
+
 		if (hacked_unread_folder && !vsummary->fake_visible_count)
 			vsummary->fake_visible_count = mi->summary->visible_count;
 
@@ -404,6 +410,8 @@ CamelFolderSummary *
 camel_vee_summary_new(CamelFolder *parent)
 {
 	CamelVeeSummary *s;
+	CamelStore *parent_store;
+	const gchar *full_name;
 
 	s = g_object_new (CAMEL_TYPE_VEE_SUMMARY, NULL);
 	s->summary.folder = parent;
@@ -413,10 +421,13 @@ camel_vee_summary_new(CamelFolder *parent)
         /* FIXME[disk-summary] fix exceptions and note return values */
 	/* FIXME[disk-summary] if Evo's junk/trash vfolders make it VJunk
 	 * VTrash instead of .#evolution/Junk-or-whatever */
-	camel_db_create_vfolder (parent->parent_store->cdb_w, parent->full_name, NULL);
+	full_name = camel_folder_get_full_name (parent);
+	parent_store = camel_folder_get_parent_store (parent);
+	camel_db_create_vfolder (parent_store->cdb_w, full_name, NULL);
 
 	/* FIXME[disk-summary] handle excep and ret */
-	camel_folder_summary_header_load_from_db ((CamelFolderSummary *)s, parent->parent_store, parent->full_name, NULL);
+	camel_folder_summary_header_load_from_db ((CamelFolderSummary *)s, parent_store, full_name, NULL);
+
 	return &s->summary;
 }
 
@@ -430,10 +441,14 @@ camel_vee_summary_get_ids (CamelVeeSummary *summary, gchar hash[8])
 {
 	gchar *shash = g_strdup_printf("%c%c%c%c%c%c%c%c", hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7]);
 	CamelFolderSummary *cfs = (CamelFolderSummary *)summary;
+	CamelStore *parent_store;
 	GPtrArray *array;
+	const gchar *full_name;
 
 	/* FIXME[disk-summary] fix exception passing */
-	array = camel_db_get_vuids_from_vfolder(cfs->folder->parent_store->cdb_r, cfs->folder->full_name, shash, NULL);
+	full_name = camel_folder_get_full_name (cfs->folder);
+	parent_store = camel_folder_get_parent_store (cfs->folder);
+	array = camel_db_get_vuids_from_vfolder (parent_store->cdb_r, full_name, shash, NULL);
 
 	g_free(shash);
 
diff --git a/camel/camel-vtrash-folder.c b/camel/camel-vtrash-folder.c
index 0337603..94e61bc 100644
--- a/camel/camel-vtrash-folder.c
+++ b/camel/camel-vtrash-folder.c
@@ -79,97 +79,6 @@ transfer_messages (CamelFolder *folder,
 	g_free(md);
 }
 
-/* This entire code will be useless, since we sync the counts always. */
-static gint
-vtrash_folder_getv (CamelObject *object,
-                    CamelException *ex,
-                    CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i;
-	guint32 tag;
-	gint unread = -1, deleted = 0, junked = 0, visible = 0, count = -1, junked_not_deleted = -1;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		/* NB: this is a copy of camel-folder.c with the unread count logic altered.
-		   makes sure its still atomically calculated */
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_FOLDER_ARG_UNREAD:
-		case CAMEL_FOLDER_ARG_DELETED:
-		case CAMEL_FOLDER_ARG_JUNKED:
-		case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-		case CAMEL_FOLDER_ARG_VISIBLE:
-
-			/* This is so we can get the values atomically, and also so we can calculate them only once */
-			if (unread == -1) {
-				gint j;
-				CamelMessageInfoBase *info;
-				CamelVeeMessageInfo *vinfo;
-
-				unread = deleted = visible = junked = junked_not_deleted = 0;
-				camel_folder_summary_prepare_fetch_all (folder->summary, ex);
-				count = camel_folder_summary_count(folder->summary);
-				for (j=0; j<count; j++) {
-					if ((info = (CamelMessageInfoBase *) camel_folder_summary_index(folder->summary, j))) {
-						guint32 flags;
-
-						vinfo = (CamelVeeMessageInfo *) info;
-						flags = vinfo->old_flags;/* ? vinfo->old_flags : camel_message_info_flags(info); */
-
-						if ((flags & (CAMEL_MESSAGE_SEEN)) == 0)
-							unread++;
-						if (flags & CAMEL_MESSAGE_DELETED)
-							deleted++;
-						if (flags & CAMEL_MESSAGE_JUNK) {
-							junked++;
-								if (!(flags & CAMEL_MESSAGE_DELETED))
-									junked_not_deleted++;
-						}
-						if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0)
-							visible++;
-						camel_message_info_free(info);
-					}
-				}
-			}
-
-			switch (tag & CAMEL_ARG_TAG) {
-			case CAMEL_FOLDER_ARG_UNREAD:
-				count = unread == -1 ? 0 : unread;
-				break;
-			case CAMEL_FOLDER_ARG_DELETED:
-				count = deleted == -1 ? 0 : deleted;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED:
-				count = junked == -1 ? 0 : junked;
-				break;
-			case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED:
-				count = junked_not_deleted == -1 ? 0 : junked_not_deleted;
-				break;
-			case CAMEL_FOLDER_ARG_VISIBLE:
-				count = visible == -1 ? 0 : visible;
-				break;
-			}
-			folder->summary->unread_count = unread == -1 ? 0 : unread;
-			folder->summary->deleted_count = deleted == -1 ? 0 : deleted;
-			junked = folder->summary->junk_count = junked == -1 ? 0 : junked;
-			folder->summary->junk_not_deleted_count = junked_not_deleted == -1 ? 0 : junked_not_deleted;
-			folder->summary->visible_count = visible == -1 ? 0 : visible;
-			*arg->ca_int = count;
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return CAMEL_OBJECT_CLASS (camel_vtrash_folder_parent_class)->getv (object, ex, args);
-}
-
 static gboolean
 vtrash_folder_append_message (CamelFolder *folder,
                               CamelMimeMessage *message,
@@ -269,13 +178,8 @@ vtrash_folder_transfer_messages_to (CamelFolder *source,
 static void
 camel_vtrash_folder_class_init (CamelVTrashFolderClass *class)
 {
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
-	/* Not required from here on. We don't count */
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = vtrash_folder_getv;
-
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->append_message = vtrash_folder_append_message;
 	folder_class->transfer_messages_to = vtrash_folder_transfer_messages_to;
@@ -303,9 +207,18 @@ camel_vtrash_folder_new (CamelStore *parent_store, camel_vtrash_folder_t type)
 
 	g_assert(type < CAMEL_VTRASH_FOLDER_LAST);
 
-	vtrash = g_object_new (CAMEL_TYPE_VTRASH_FOLDER, NULL);
-	camel_vee_folder_construct(CAMEL_VEE_FOLDER (vtrash), parent_store, vdata[type].full_name, _(vdata[type].name),
-				   CAMEL_STORE_FOLDER_PRIVATE|CAMEL_STORE_FOLDER_CREATE|CAMEL_STORE_VEE_FOLDER_AUTO|CAMEL_STORE_VEE_FOLDER_SPECIAL);
+	vtrash = g_object_new (
+		CAMEL_TYPE_VTRASH_FOLDER,
+		"full-name", vdata[type].full_name,
+		"name", gettext (vdata[type].name),
+		"parent-store", parent_store, NULL);
+
+	camel_vee_folder_construct (
+		CAMEL_VEE_FOLDER (vtrash),
+		CAMEL_STORE_FOLDER_PRIVATE |
+		CAMEL_STORE_FOLDER_CREATE |
+		CAMEL_STORE_VEE_FOLDER_AUTO |
+		CAMEL_STORE_VEE_FOLDER_SPECIAL);
 
 	((CamelFolder *)vtrash)->folder_flags |= vdata[type].flags;
 	camel_vee_folder_set_expression((CamelVeeFolder *)vtrash, vdata[type].expr);
diff --git a/camel/camel.h b/camel/camel.h
index 3465e86..0c74c3d 100644
--- a/camel/camel.h
+++ b/camel/camel.h
@@ -27,7 +27,6 @@
 #define __CAMEL_H_INSIDE__
 
 #include <camel/camel-address.h>
-#include <camel/camel-arg.h>
 #include <camel/camel-block-file.h>
 #include <camel/camel-certdb.h>
 #include <camel/camel-charset-map.h>
diff --git a/camel/providers/groupwise/camel-groupwise-folder.c b/camel/providers/groupwise/camel-groupwise-folder.c
index 0b642d0..d30c29c 100644
--- a/camel/providers/groupwise/camel-groupwise-folder.c
+++ b/camel/providers/groupwise/camel-groupwise-folder.c
@@ -78,7 +78,6 @@ extern gint camel_application_is_exiting;
 
 /*prototypes*/
 static gboolean groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *destination, GPtrArray **transferred_uids, gboolean delete_originals, CamelException *ex);
-static gint gw_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
 void convert_to_calendar (EGwItem *item, gchar **str, gint *len);
 static void convert_to_task (EGwItem *item, gchar **str, gint *len);
 static void convert_to_note (EGwItem *item, gchar **str, gint *len);
@@ -113,15 +112,22 @@ static CamelMimeMessage *
 groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelException *ex )
 {
 	CamelMimeMessage *msg = NULL;
-	CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE(folder->parent_store);
-	CamelGroupwiseStorePrivate  *priv = gw_store->priv;
+	CamelGroupwiseFolder *gw_folder;
+	CamelGroupwiseStore *gw_store;
 	CamelGroupwiseMessageInfo *mi = NULL;
+	CamelStore *parent_store;
 	gchar *container_id;
 	EGwConnectionStatus status;
 	EGwConnection *cnc;
 	EGwItem *item;
 	CamelStream *stream, *cache_stream;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
 
 	/* see if it is there in cache */
 
@@ -184,9 +190,9 @@ groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelExcept
 		return NULL;
 	}
 
-	container_id =  g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name));
+	container_id =  g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name));
 
-	cnc = cnc_lookup (priv);
+	cnc = cnc_lookup (gw_store->priv);
 
 	status = e_gw_connection_get_item (cnc, container_id, uid, GET_ITEM_VIEW_WITH_CACHE, &item);
 	if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
@@ -212,7 +218,7 @@ groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelExcept
 	}
 
 	if (msg) {
-		camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (priv));
+		camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (gw_store->priv));
 		mi->info.dirty = TRUE;
 		camel_folder_summary_touch (folder->summary);
 	}
@@ -453,13 +459,19 @@ groupwise_msg_set_recipient_list (CamelMimeMessage *msg, EGwItem *item)
 static void
 groupwise_folder_rename (CamelFolder *folder, const gchar *new)
 {
-	CamelGroupwiseFolder *gw_folder = (CamelGroupwiseFolder *)folder;
-	CamelGroupwiseStore *gw_store = (CamelGroupwiseStore *) folder->parent_store;
-	CamelGroupwiseStorePrivate *priv = gw_store->priv;
-
-	gchar *folder_dir, *summary_path, *state_file, *storage_path = storage_path_lookup (priv);
+	CamelGroupwiseFolder *gw_folder;
+	CamelGroupwiseStore *gw_store;
+	CamelStore *parent_store;
+	gchar *folder_dir, *summary_path, *state_file, *storage_path;
 	gchar *folders;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
+	storage_path = storage_path_lookup (gw_store->priv);
+
 	folders = g_strconcat (storage_path, "/folders", NULL);
 	folder_dir = e_path_to_physical (folders, new);
 	g_free (folders);
@@ -474,7 +486,7 @@ groupwise_folder_rename (CamelFolder *folder, const gchar *new)
 	camel_folder_summary_set_filename (folder->summary, summary_path);
 
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
-	camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
 	g_free (state_file);
 
 	g_free (summary_path);
@@ -617,20 +629,23 @@ static void
 move_to_mailbox (CamelFolder *folder, CamelMessageInfo *info, CamelException *ex)
 {
 	CamelFolder *dest;
+	CamelStore *parent_store;
 	GPtrArray *uids;
 	const gchar *uid = camel_message_info_uid (info);
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	uids = g_ptr_array_new ();
 	g_ptr_array_add (uids, (gpointer) uid);
 
-	dest = camel_store_get_folder (folder->parent_store, "Mailbox", 0, ex);
+	dest = camel_store_get_folder (parent_store, "Mailbox", 0, ex);
 	camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_JUNK_LEARN|CAMEL_GW_MESSAGE_NOJUNK|CAMEL_GW_MESSAGE_JUNK, 0);
 	if (dest)
 		groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex);
 	else
 		g_warning ("No Mailbox folder found");
 
-	update_junk_list (folder->parent_store, info, REMOVE_JUNK_ENTRY);
+	update_junk_list (parent_store, info, REMOVE_JUNK_ENTRY);
 }
 
 static void
@@ -638,25 +653,28 @@ move_to_junk (CamelFolder *folder, CamelMessageInfo *info, CamelException *ex)
 {
 	CamelFolder *dest;
 	CamelFolderInfo *fi;
+	CamelStore *parent_store;
 	GPtrArray *uids;
 	const gchar *uid = camel_message_info_uid (info);
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	uids = g_ptr_array_new ();
 	g_ptr_array_add (uids, (gpointer) uid);
 
-	dest = camel_store_get_folder (folder->parent_store, JUNK_FOLDER, 0, ex);
+	dest = camel_store_get_folder (parent_store, JUNK_FOLDER, 0, ex);
 
 	if (dest)
 		groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex);
 	else {
-		fi = create_junk_folder (folder->parent_store);
-		dest = camel_store_get_folder (folder->parent_store, JUNK_FOLDER, 0, ex);
+		fi = create_junk_folder (parent_store);
+		dest = camel_store_get_folder (parent_store, JUNK_FOLDER, 0, ex);
 		if (!dest)
 			g_warning ("Could not get JunkFolder:Message not moved");
 		else
 			groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex);
 	}
-	update_junk_list (folder->parent_store, info, ADD_JUNK_ENTRY);
+	update_junk_list (parent_store, info, ADD_JUNK_ENTRY);
 }
 
 /********************* back to folder functions*************************/
@@ -665,20 +683,27 @@ static gboolean
 groupwise_sync_summary (CamelFolder *folder, CamelException *ex)
 {
 	CamelStoreInfo *si;
+	CamelStore *parent_store;
 	guint32 unread, total;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
 
 	camel_folder_summary_save_to_db (folder->summary, ex);
 
-	si = camel_store_summary_path ((CamelStoreSummary *) ((CamelGroupwiseStore *) folder->parent_store)->summary, folder->full_name);
-	camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL);
+	si = camel_store_summary_path ((CamelStoreSummary *) ((CamelGroupwiseStore *) parent_store)->summary, full_name);
+
+	total = camel_folder_summary_count (folder->summary);
+	unread = folder->summary->unread_count;
 	
 	if (si) {
 		si->unread = unread;
 		si->total = total;
 	}
 
-	camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary);
-	camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary);
+	camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary);
+	camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary);
 
 	return TRUE;
 }
@@ -746,22 +771,28 @@ groupwise_sync_all (CamelFolder *folder, gboolean expunge, CamelException *ex)
 static gboolean
 groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_single, CamelException *ex)
 {
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
-	CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
-	CamelGroupwiseStorePrivate *priv = gw_store->priv;
+	CamelGroupwiseStore *gw_store;
+	CamelGroupwiseFolder *gw_folder;
 	CamelMessageInfo *info = NULL;
 	CamelGroupwiseMessageInfo *gw_info;
+	CamelStore *parent_store;
 	GList *read_items = NULL, *deleted_read_items = NULL, *unread_items = NULL;
 	flags_diff_t diff, unset_flags;
 	const gchar *container_id;
 	CamelFolderChangeInfo *changes;
 	EGwConnectionStatus status;
 	EGwConnection *cnc;
+	const gchar *full_name;
 	gint count, i;
 	gboolean success;
-
 	GList *deleted_items, *deleted_head;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
 	deleted_items = deleted_head = NULL;
 
 	if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
@@ -775,8 +806,8 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_
 	}
 	camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
 
-	cnc = cnc_lookup (priv);
-	container_id =  camel_groupwise_store_container_id_lookup (gw_store, folder->full_name);
+	cnc = cnc_lookup (gw_store->priv);
+	container_id =  camel_groupwise_store_container_id_lookup (gw_store, full_name);
 
 	if (folder->folder_flags & CAMEL_FOLDER_HAS_BEEN_DELETED)
 		return TRUE;
@@ -925,7 +956,7 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_
 
 	if (deleted_items) {
 		camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
-		if (!strcmp (folder->full_name, "Trash")) {
+		if (!strcmp (full_name, "Trash")) {
 			status = e_gw_connection_purge_selected_items (cnc, deleted_items);
 			if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
 				status = e_gw_connection_purge_selected_items (cnc, deleted_items);
@@ -967,7 +998,7 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_
 		camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
 		status = e_gw_connection_purge_deleted_items (cnc);
 		if (status == E_GW_CONNECTION_STATUS_OK) {
-			g_message ("Purged deleted items in %s", folder->name);
+			g_message ("Purged deleted items in %s", camel_folder_get_name (folder));
 		}
 		camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
 	}
@@ -990,15 +1021,18 @@ camel_gw_folder_new(CamelStore *store, const gchar *folder_name, const gchar *fo
 	gchar *summary_file, *state_file, *journal_file;
 	gchar *short_name;
 
-	folder = g_object_new (CAMEL_TYPE_GROUPWISE_FOLDER, NULL);
-
-	gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
 	short_name = strrchr (folder_name, '/');
 	if (short_name)
 		short_name++;
 	else
 		short_name = (gchar *) folder_name;
-	camel_folder_construct (folder, store, folder_name, short_name);
+
+	folder = g_object_new (
+		CAMEL_TYPE_GROUPWISE_FOLDER,
+		"name", short_name, "full-name", folder_name,
+		"parent_store", store, NULL);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
 
 	summary_file = g_strdup_printf ("%s/summary",folder_dir);
 	folder->summary = camel_groupwise_summary_new(folder, summary_file);
@@ -1013,9 +1047,9 @@ camel_gw_folder_new(CamelStore *store, const gchar *folder_name, const gchar *fo
 
 	/* set/load persistent state */
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
-	camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
 	g_free(state_file);
-	camel_object_state_read(folder);
+	camel_object_state_read (CAMEL_OBJECT (folder));
 
 	gw_folder->cache = camel_data_cache_new (folder_dir ,ex);
 	if (!gw_folder->cache) {
@@ -1061,13 +1095,16 @@ update_update (CamelSession *session, CamelSessionThreadMsg *msg)
 	struct _folder_update_msg *m = (struct _folder_update_msg *)msg;
 	EGwConnectionStatus status;
 	CamelException *ex = NULL;
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (m->folder->parent_store);
-
+	CamelGroupwiseStore *gw_store;
+	CamelStore *parent_store;
 	GList *item_list, *items_full_list = NULL, *last_element=NULL;
 	gint cursor = 0;
 	const gchar *position = E_GW_CURSOR_POSITION_END;
 	gboolean done;
 
+	parent_store = camel_folder_get_parent_store (m->folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
 	/* Hold the connect_lock.
 	   In case if user went offline, don't do anything.
 	   m->cnc would have become invalid, as the store disconnect unrefs it.
@@ -1078,7 +1115,9 @@ update_update (CamelSession *session, CamelSessionThreadMsg *msg)
 		goto end1;
 	}
 
-	camel_operation_start (NULL, _("Checking for deleted messages %s"), m->folder->name);
+	camel_operation_start (
+		NULL, _("Checking for deleted messages %s"),
+		camel_folder_get_name (m->folder));
 
 	status = e_gw_connection_create_cursor (m->cnc, m->container_id, "id", NULL, &cursor);
 	if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
@@ -1184,7 +1223,15 @@ groupwise_refresh_info(CamelFolder *folder, CamelException *ex)
 {
 	CamelGroupwiseSummary *summary = (CamelGroupwiseSummary *) folder->summary;
 	CamelStoreInfo *si;
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
+	CamelGroupwiseStore *gw_store;
+	CamelStore *parent_store;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
 	/*
 	 * Checking for the summary->time_string here since the first the a
 	 * user views a folder, the read cursor is in progress, and the getQM
@@ -1192,19 +1239,22 @@ groupwise_refresh_info(CamelFolder *folder, CamelException *ex)
 	 */
 	if (summary->time_string && (strlen (summary->time_string) > 0))  {
 		groupwise_refresh_folder(folder, ex);
-		si = camel_store_summary_path ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary, folder->full_name);
+		si = camel_store_summary_path ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary, full_name);
 		if (si) {
 			guint32 unread, total;
-			camel_object_get (folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL);
+
+			total = camel_folder_summary_count (folder->summary);
+			unread = folder->summary->unread_count;
+
 			if (si->total != total || si->unread != unread) {
 				si->total = total;
 				si->unread = unread;
-				camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary);
+				camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary);
 			}
-			camel_store_summary_info_free ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary, si);
+			camel_store_summary_info_free ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary, si);
 		}
 		/* camel_folder_summary_save_to_db (folder->summary, ex); */
-		camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary);
+		camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary);
 	} else {
 		/* We probably could not get the messages the first time. (get_folder) failed???!
 		 * so do a get_folder again. And hope that it works
@@ -1302,17 +1352,18 @@ update_summary_string (CamelFolder *folder, const gchar *time_string, CamelExcep
 static void
 groupwise_refresh_folder(CamelFolder *folder, CamelException *ex)
 {
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
-	CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
-	CamelGroupwiseStorePrivate *priv = gw_store->priv;
+	CamelGroupwiseStore *gw_store;
+	CamelGroupwiseFolder *gw_folder;
 	CamelGroupwiseSummary *summary = (CamelGroupwiseSummary *)folder->summary;
-	EGwConnection *cnc = cnc_lookup (priv);
-	CamelSession *session = ((CamelService *)folder->parent_store)->session;
-	gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_PROXY;
+	EGwConnection *cnc;
+	CamelSession *session;
+	CamelStore *parent_store;
+	gboolean is_proxy;
 	gboolean is_locked = TRUE;
 	gint status;
 	GList *list = NULL;
 	GSList *new_items = NULL, *modified_items = NULL, *merged = NULL;
+	const gchar *full_name;
 	gchar *container_id = NULL;
 	gchar *old_sync_time = NULL, *new_sync_time = NULL, *modified_sync_time = NULL;
 	struct _folder_update_msg *msg;
@@ -1320,6 +1371,17 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex)
 	EGwContainer *container;
 	gint new_item_count = 0;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	session = CAMEL_SERVICE (parent_store)->session;
+	is_proxy = (parent_store->flags & CAMEL_STORE_PROXY);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
+	cnc = cnc_lookup (gw_store->priv);
+
 	/* Sync-up the (un)read changes before getting updates,
 	so that the getFolderList will reflect the most recent changes too */
 	groupwise_sync_all (folder, FALSE, ex);
@@ -1329,10 +1391,10 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex)
 		return;
 	}
 
-	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name));
+	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name));
 
 	if (!container_id) {
-		d (printf ("\nERROR - Container id not present. Cannot refresh info for %s\n", folder->full_name));
+		d (printf ("\nERROR - Container id not present. Cannot refresh info for %s\n", full_name));
 		return;
 	}
 
@@ -1348,7 +1410,7 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex)
 	if (!camel_groupwise_store_connected (gw_store, ex))
 		goto end1;
 
-	if (!strcmp (folder->full_name, "Trash")) {
+	if (!strcmp (full_name, "Trash")) {
 #if 0
 		status = e_gw_connection_get_items (cnc, container_id, "peek recipient distribution created delivered attachments subject status size", NULL, &list);
 		if (status != E_GW_CONNECTION_STATUS_OK) {
@@ -1377,7 +1439,7 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex)
 	if (!is_proxy) {
 		const gchar *source;
 
-		if (!strcmp (folder->full_name, RECEIVED) || !strcmp(folder->full_name, SENT)) {
+		if (!strcmp (full_name, RECEIVED) || !strcmp(full_name, SENT)) {
 			source = NULL;
 		} else {
 			source = "sent received";
@@ -1555,10 +1617,11 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
 {
 	CamelGroupwiseMessageInfo *mi = NULL;
 	CamelMessageInfo *pmi = NULL;
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
-	CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder);
-	CamelGroupwiseStorePrivate *priv = gw_store->priv;
-	EGwConnection *cnc = cnc_lookup (priv);
+	CamelGroupwiseStore *gw_store;
+	CamelGroupwiseFolder *gw_folder;
+	CamelOfflineFolder *offline_folder;
+	CamelStore *parent_store;
+	EGwConnection *cnc;
 	guint32 item_status, status_flags = 0;
 	CamelFolderChangeInfo *changes = NULL;
 	gboolean exists = FALSE;
@@ -1569,26 +1632,39 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
 	EGwConnectionStatus status;
 	GList *item_list = list;
 	gint total_items = g_list_length (item_list), i=0;
+	gboolean is_proxy;
+	const gchar *full_name;
+
+	gboolean folder_needs_caching;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
 
-	gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_WRITE;
+	is_proxy = (parent_store->flags & CAMEL_STORE_WRITE);
 
-	gint folder_needs_caching;
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
 
-	camel_object_get (folder, NULL, CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE, &folder_needs_caching, NULL);
+	cnc = cnc_lookup (gw_store->priv);
+
+	offline_folder = CAMEL_OFFLINE_FOLDER (folder);
+	folder_needs_caching = camel_offline_folder_get_offline_sync (offline_folder);
 
 	changes = camel_folder_change_info_new ();
-	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name));
+	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name));
 	if (!container_id) {
 		d (printf("\nERROR - Container id not present. Cannot refresh info\n"));
 		camel_folder_change_info_free (changes);
 		return;
 	}
 
-	if (!strcmp (folder->full_name, JUNK_FOLDER)) {
+	if (!strcmp (full_name, JUNK_FOLDER)) {
 		is_junk = TRUE;
 	}
 
-	camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name);
+	camel_operation_start (
+		NULL, _("Fetching summary information for new messages in %s"),
+		camel_folder_get_name (folder));
 
 	for (; item_list != NULL; item_list = g_list_next (item_list) ) {
 		EGwItem *temp_item;
@@ -1630,7 +1706,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
 		item_status = e_gw_item_get_item_status (item);
 	
 		/* skip the deleted items */	
-		if (item_status & E_GW_ITEM_STAT_DELETED && strcmp (folder->full_name, "Trash")) {
+		if (item_status & E_GW_ITEM_STAT_DELETED && strcmp (full_name, "Trash")) {
 			i++;
 			continue;
 		}
@@ -1757,7 +1833,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
 		}
 
 		/********************* Summary ends *************************/
-		if (!strcmp (folder->full_name, "Junk Mail"))
+		if (!strcmp (full_name, "Junk Mail"))
 			continue;
 
 		if (folder_needs_caching) {
@@ -1769,7 +1845,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
 
 						mail_msg = groupwise_folder_item_to_msg (folder, item, ex);
 						if (mail_msg)
-								camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (priv));
+								camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (gw_store->priv));
 
 						CAMEL_GROUPWISE_FOLDER_REC_LOCK (folder, cache_lock);
 						if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", id, NULL))) {
@@ -1832,28 +1908,36 @@ void
 gw_update_summary (CamelFolder *folder, GList *list,CamelException *ex)
 {
 	CamelGroupwiseMessageInfo *mi = NULL;
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
+	CamelGroupwiseStore *gw_store;
 	guint32 item_status, status_flags = 0;
 	CamelFolderChangeInfo *changes = NULL;
+	CamelStore *parent_store;
 	gboolean exists = FALSE;
 	GString *str = g_string_new (NULL);
 	const gchar *priority = NULL;
 	gchar *container_id = NULL;
 	gboolean is_junk = FALSE;
 	GList *item_list = list;
+	const gchar *full_name;
+	gboolean is_proxy;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
 
-	gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_WRITE;
+	is_proxy = (parent_store->flags & CAMEL_STORE_WRITE);
+
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
 
 	/*Assert lock???*/
 	changes = camel_folder_change_info_new ();
-	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name));
+	container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name));
 	if (!container_id) {
 		d (printf("\nERROR - Container id not present. Cannot refresh info\n"));
 		camel_folder_change_info_free (changes);
 		return;
 	}
 
-	if (!strcmp (folder->full_name, JUNK_FOLDER)) {
+	if (!strcmp (full_name, JUNK_FOLDER)) {
 		is_junk = TRUE;
 	}
 
@@ -1907,7 +1991,7 @@ gw_update_summary (CamelFolder *folder, GList *list,CamelException *ex)
 		if (item_status & E_GW_ITEM_STAT_REPLIED)
 			status_flags |= CAMEL_MESSAGE_ANSWERED;
 
-		if (!strcmp (folder->full_name, "Trash"))
+		if (!strcmp (full_name, "Trash"))
 			status_flags |= CAMEL_MESSAGE_SEEN;
 
 		mi->info.flags |= status_flags;
@@ -2000,14 +2084,14 @@ groupwise_folder_item_to_msg( CamelFolder *folder,
 		CamelException *ex )
 {
 	CamelMimeMessage *msg = NULL;
-	CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE(folder->parent_store);
-	CamelGroupwiseStorePrivate  *priv = gw_store->priv;
+	CamelGroupwiseStore *gw_store;
 	const gchar *container_id = NULL;
 	GSList *attach_list = NULL;
 	EGwItemType type;
 	EGwConnectionStatus status;
 	EGwConnection *cnc;
 	CamelMultipart *multipart = NULL;
+	CamelStore *parent_store;
 	gchar *body = NULL;
 	gint body_len = 0;
 	const gchar *uid = NULL, *message_id, *parent_threads;
@@ -2016,10 +2100,16 @@ groupwise_folder_item_to_msg( CamelFolder *folder,
 	gboolean is_text_html_embed = FALSE;
 	gboolean is_base64_encoded = FALSE;
 	CamelStream *temp_stream;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
 
 	uid = e_gw_item_get_id(item);
-	cnc = cnc_lookup (priv);
-	container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name);
+	cnc = cnc_lookup (gw_store->priv);
+	container_id = camel_groupwise_store_container_id_lookup (gw_store, full_name);
 
 	/* The item is already in calendar. We need to ignore the mime 822 since it would not have the item id of the appointmnet
 	   in calendar */
@@ -2364,11 +2454,13 @@ gw_update_all_items (CamelFolder *folder, GList *item_list, CamelException *ex)
 	camel_object_trigger_event (folder, "folder_changed", changes);
 
 	if (item_list) {
-		CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store);
+		CamelStore *parent_store;
 
-		camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
+		parent_store = camel_folder_get_parent_store (folder);
+
+		camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		gw_update_cache (folder, item_list, ex, TRUE);
-		camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 
 		g_list_foreach (item_list, (GFunc)g_free, NULL);
 		g_list_free (item_list);
@@ -2383,48 +2475,57 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message,
 		CamelException *ex)
 {
 	const gchar *container_id = NULL;
-	CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(folder->parent_store);
-	CamelGroupwiseStorePrivate  *priv = gw_store->priv;
-	CamelOfflineStore *offline = (CamelOfflineStore *) folder->parent_store;
+	CamelGroupwiseStore *gw_store;
+	CamelOfflineStore *offline;
+	CamelStore *parent_store;
 	EGwConnectionStatus status = { 0, };
 	EGwConnection *cnc;
 	EGwItem *item;
+	const gchar *full_name;
+	const gchar *name;
 	gchar *id;
 	gboolean is_ok = FALSE;
 
-	if (!strcmp (folder->name, RECEIVED))
+	name = camel_folder_get_name (folder);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	if (!strcmp (name, RECEIVED))
 		is_ok = TRUE;
-	if (!strcmp (folder->name, SENT))
+	if (!strcmp (name, SENT))
 		is_ok = TRUE;
 
 	if (!is_ok) {
 		camel_exception_setv (
 			ex, CAMEL_EXCEPTION_SYSTEM,
 			_("Cannot append message to folder '%s': %s"),
-			folder->full_name, e_gw_connection_get_error_message (status));
+			full_name, e_gw_connection_get_error_message (status));
 		return FALSE;
 	}
 
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+	offline = CAMEL_OFFLINE_STORE (parent_store);
+
 	if (offline->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
 		camel_groupwise_journal_append ((CamelGroupwiseJournal *) ((CamelGroupwiseFolder *)folder)->journal, message, info, appended_uid, ex);
 		return FALSE;
 	}
-	cnc = cnc_lookup (priv);
+	cnc = cnc_lookup (gw_store->priv);
 
-	camel_service_lock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+	camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 	/*Get the container id*/
-	container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name);
+	container_id = camel_groupwise_store_container_id_lookup (gw_store, full_name);
 
 	item = camel_groupwise_util_item_from_message (cnc, message, CAMEL_ADDRESS (message->from));
 	/*Set the source*/
 	/* FIXME: use flags and avoid such name comparisons in future */
-	if (!strcmp (folder->name, RECEIVED))
+	if (!strcmp (name, RECEIVED))
 		e_gw_item_set_source (item, "received");
-	if (!strcmp (folder->name, SENT))
+	if (!strcmp (name, SENT))
 		e_gw_item_set_source (item, "sent");
-	if (!strcmp (folder->name, DRAFT))
+	if (!strcmp (name, DRAFT))
 		e_gw_item_set_source (item, "draft");
-	if (!strcmp (folder->name, PERSONAL))
+	if (!strcmp (name, PERSONAL))
 		e_gw_item_set_source (item, "personal");
 	/*set container id*/
 	e_gw_item_set_container_id (item, container_id);
@@ -2437,7 +2538,7 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message,
 
 		if (appended_uid)
 			*appended_uid = NULL;
-		camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		return FALSE;
 	}
 
@@ -2447,19 +2548,19 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message,
 		camel_exception_setv (
 			ex, CAMEL_EXCEPTION_SYSTEM,
 			_("Cannot append message to folder '%s': %s"),
-			folder->full_name, e_gw_connection_get_error_message (status));
+			full_name, e_gw_connection_get_error_message (status));
 
 		if (appended_uid)
 			*appended_uid = NULL;
 
-		camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		return FALSE;
 	}
 
 	if (appended_uid)
 		*appended_uid = g_strdup (id);
 	g_free (id);
-	camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+	camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 
 	return TRUE;
 }
@@ -2491,15 +2592,27 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 	gint count, index = 0;
 	GList *item_ids = NULL;
 	const gchar *source_container_id = NULL, *dest_container_id = NULL;
-	CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(source->parent_store);
-	CamelOfflineStore *offline = (CamelOfflineStore *) destination->parent_store;
-	CamelGroupwiseStorePrivate  *priv = gw_store->priv;
+	CamelGroupwiseStore *gw_store;
+	CamelOfflineStore *offline;
+	CamelStore *source_parent_store;
+	CamelStore *destination_parent_store;
 	EGwConnectionStatus status = E_GW_CONNECTION_STATUS_OK;
 	EGwConnection *cnc;
 	CamelFolderChangeInfo *changes = NULL;
 	gboolean destination_is_trash;
+	const gchar *source_full_name;
+	const gchar *destination_full_name;
+
+	source_full_name = camel_folder_get_full_name (source);
+	source_parent_store = camel_folder_get_parent_store (source);
 
-	if (destination == camel_store_get_trash (source->parent_store, NULL))
+	destination_full_name = camel_folder_get_full_name (destination);
+	destination_parent_store = camel_folder_get_parent_store (destination);
+
+	gw_store = CAMEL_GROUPWISE_STORE (source_parent_store);
+	offline = CAMEL_OFFLINE_STORE (destination_parent_store);
+
+	if (destination == camel_store_get_trash (source_parent_store, NULL))
 		destination_is_trash = TRUE;
 	else
 		destination_is_trash = FALSE;
@@ -2517,12 +2630,12 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 		*transferred_uids = NULL;
 
 	if (delete_originals)
-		source_container_id = camel_groupwise_store_container_id_lookup (gw_store, source->full_name);
+		source_container_id = camel_groupwise_store_container_id_lookup (gw_store, source_full_name);
 	else
 		source_container_id = NULL;
-	dest_container_id = camel_groupwise_store_container_id_lookup (gw_store, destination->full_name);
+	dest_container_id = camel_groupwise_store_container_id_lookup (gw_store, destination_full_name);
 
-	camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+	camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 	/* check for offline operation */
 	if (offline->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
 		CamelGroupwiseJournal *journal = (CamelGroupwiseJournal *) ((CamelGroupwiseFolder *) destination)->journal;
@@ -2549,7 +2662,7 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 				break;
 
 			if (delete_originals) {
-				if (!strcmp(source->full_name, SENT)) {
+				if (!strcmp(source_full_name, SENT)) {
 					camel_exception_set (
 						ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
 						_("This message is not available in offline mode."));
@@ -2561,11 +2674,11 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 			}
 		}
 
-		camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 		return TRUE;
 	}
 
-	cnc = cnc_lookup (priv);
+	cnc = cnc_lookup (gw_store->priv);
 	index = 0;
 	while (index < uids->len) {
 		CamelMessageInfo *info = NULL;
@@ -2603,9 +2716,9 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 					*/
 
 					wrapper = g_list_prepend (wrapper, (gchar *)uid);
-					camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+					camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 					e_gw_connection_mark_read (cnc, wrapper);
-					camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+					camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 					g_list_free (wrapper);
 					wrapper = NULL;
 				}
@@ -2619,9 +2732,9 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 
 				if (unset_flags.bits & CAMEL_MESSAGE_SEEN) {
 					wrapper = g_list_prepend (wrapper, (gchar *)uid);
-					camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+					camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 					e_gw_connection_mark_unread (cnc, wrapper);
-					camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+					camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 					g_list_free (wrapper);
 					wrapper = NULL;
 				}
@@ -2634,16 +2747,16 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 				camel_folder_change_info_remove_uid (changes, uids->pdata[index]);
 		} else {
 				if (delete_originals) {
-						if (strcmp(source->full_name, "Sent Items")) {
-								status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index],
-												dest_container_id, source_container_id);
-						} else {
-								gchar *container_id = NULL;
-								container_id = e_gw_connection_get_container_id (cnc, "Mailbox");
-								status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index],
-												dest_container_id, container_id);
-								g_free (container_id);
-						}
+					if (strcmp(source_full_name, "Sent Items")) {
+							status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index],
+											dest_container_id, source_container_id);
+					} else {
+							gchar *container_id = NULL;
+							container_id = e_gw_connection_get_container_id (cnc, "Mailbox");
+							status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index],
+											dest_container_id, container_id);
+							g_free (container_id);
+					}
 
 				} else
 						status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index],
@@ -2651,10 +2764,6 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 
 				if (status == E_GW_CONNECTION_STATUS_OK) {
 						if (delete_originals) {
-								/*if ( !strcmp(source->full_name, SENT) ) {
-								  camel_folder_delete_message(source, uids->pdata[index]);
-								  } else {*/
-
 								if (!(gw_info->info.flags & CAMEL_MESSAGE_SEEN))
 										source->summary->unread_count --;
 
@@ -2682,7 +2791,7 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 
 	groupwise_store_set_current_folder (gw_store, source);
 
-	camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK);
+	camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK);
 
 	return TRUE;
 }
@@ -2690,11 +2799,11 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 static gboolean
 groupwise_expunge (CamelFolder *folder, CamelException *ex)
 {
-	CamelGroupwiseStore *groupwise_store = CAMEL_GROUPWISE_STORE(folder->parent_store);
-	CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
-	CamelGroupwiseStorePrivate  *priv = groupwise_store->priv;
+	CamelGroupwiseStore *gw_store;
+	CamelGroupwiseFolder *gw_folder;
 	CamelGroupwiseMessageInfo *ginfo;
 	CamelMessageInfo *info;
+	CamelStore *parent_store;
 	gchar *container_id;
 	EGwConnection *cnc;
 	EGwConnectionStatus status;
@@ -2702,14 +2811,21 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex)
 	gint i, max;
 	gboolean delete = FALSE;
 	GList *deleted_items, *deleted_head;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	gw_folder = CAMEL_GROUPWISE_FOLDER (folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
 
 	deleted_items = deleted_head = NULL;
-	cnc = cnc_lookup (priv);
+	cnc = cnc_lookup (gw_store->priv);
 	if (!cnc)
 		return TRUE;
 
-	if (!strcmp (folder->full_name, "Trash")) {
-		camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+	if (!strcmp (full_name, "Trash")) {
+		camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		status = e_gw_connection_purge_deleted_items (cnc);
 		if (status == E_GW_CONNECTION_STATUS_OK) {
 			camel_folder_freeze (folder);
@@ -2717,13 +2833,13 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex)
 			camel_folder_thaw (folder);
 		} else
 			g_warning ("Could not Empty Trash\n");
-		camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		return TRUE;
 	}
 
 	changes = camel_folder_change_info_new ();
 
-	container_id =  g_strdup (camel_groupwise_store_container_id_lookup (groupwise_store, folder->full_name));
+	container_id =  g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name));
 
 	camel_folder_summary_prepare_fetch_all (folder->summary, ex);
 	max = camel_folder_summary_count (folder->summary);
@@ -2741,9 +2857,9 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex)
 			}
 			if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) {
 				/* Read the FIXME below */
-				camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+				camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 				status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
-				camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+				camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 				if (status == E_GW_CONNECTION_STATUS_OK) {
 					gchar *uid;
 					while (deleted_items) {
@@ -2766,9 +2882,9 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex)
 
 	if (deleted_items) {
 		/* FIXME: Put these in a function and reuse it inside the above loop, here and in groupwise_sync*/
-		camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+		camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
-		camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK);
+		camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 		if (status == E_GW_CONNECTION_STATUS_OK) {
 			gchar *uid;
 			while (deleted_items) {
@@ -2823,19 +2939,36 @@ groupwise_folder_dispose (GObject *object)
 }
 
 static void
+groupwise_folder_constructed (GObject *object)
+{
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelURL *url;
+	const gchar *full_name;
+	gchar *description;
+
+	folder = CAMEL_FOLDER (object);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	url = CAMEL_SERVICE (parent_store)->url;
+
+	description = g_strdup_printf (
+		"%s %s:%s", url->user, url->host, full_name);
+	camel_folder_set_description (folder, description);
+	g_free (description);
+}
+
+static void
 camel_groupwise_folder_class_init (CamelGroupwiseFolderClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
 	g_type_class_add_private (class, sizeof (CamelGroupwiseFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = groupwise_folder_dispose;
-
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = gw_getv;
+	object_class->constructed = groupwise_folder_constructed;
 
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->get_message = groupwise_folder_get_message;
@@ -2874,43 +3007,6 @@ camel_groupwise_folder_init (CamelGroupwiseFolder *gw_folder)
 	gw_folder->need_rescan = TRUE;
 }
 
-static gint
-gw_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i, count = 0;
-	guint32 tag;
-
-	for (i=0; i<args->argc; i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-
-			case CAMEL_OBJECT_ARG_DESCRIPTION:
-				if (folder->description == NULL) {
-					CamelURL *uri = ((CamelService *)folder->parent_store)->url;
-
-					folder->description = g_strdup_printf("%s %s:%s", uri->user, uri->host, folder->full_name);
-				}
-				*arg->ca_str = folder->description;
-				break;
-			default:
-				count++;
-				continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	if (count)
-		return ((CamelObjectClass *)camel_groupwise_folder_parent_class)->getv(object, ex, args);
-
-	return 0;
-
-}
-
 void
 convert_to_calendar (EGwItem *item, gchar **str, gint *len)
 {
diff --git a/camel/providers/groupwise/camel-groupwise-folder.h b/camel/providers/groupwise/camel-groupwise-folder.h
index 937818e..53ad62e 100644
--- a/camel/providers/groupwise/camel-groupwise-folder.h
+++ b/camel/providers/groupwise/camel-groupwise-folder.h
@@ -73,10 +73,7 @@ struct _CamelGroupwiseFolder {
 
 struct _CamelGroupwiseFolderClass {
 	CamelOfflineFolderClass parent_class;
-
-	/* Virtual methods */
-
-} ;
+};
 
 GType camel_groupwise_folder_get_type (void);
 
diff --git a/camel/providers/groupwise/camel-groupwise-journal.c b/camel/providers/groupwise/camel-groupwise-journal.c
index a854978..9f1cb2c 100644
--- a/camel/providers/groupwise/camel-groupwise-journal.c
+++ b/camel/providers/groupwise/camel-groupwise-journal.c
@@ -207,15 +207,18 @@ groupwise_entry_play_transfer (CamelOfflineJournal *journal, CamelGroupwiseJourn
 	CamelMessageInfoBase *info;
 	GPtrArray *xuids, *uids;
 	CamelFolder *src;
+	CamelStore *parent_store;
 	const gchar *name;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	if (!(info = (CamelMessageInfoBase *) camel_folder_summary_uid (folder->summary, entry->uid))) {
 		/* Note: this should never happen, but rather than crash lets make a new info */
 		info = camel_message_info_new (NULL);
 	}
 
-	name = camel_groupwise_store_folder_lookup ((CamelGroupwiseStore *) folder->parent_store, entry->source_container);
-	if (name && (src = camel_store_get_folder (folder->parent_store, name, 0, ex))) {
+	name = camel_groupwise_store_folder_lookup ((CamelGroupwiseStore *) parent_store, entry->source_container);
+	if (name && (src = camel_store_get_folder (parent_store, name, 0, ex))) {
 		uids = g_ptr_array_sized_new (1);
 		g_ptr_array_add (uids, entry->original_uid);
 
@@ -370,10 +373,14 @@ camel_groupwise_journal_transfer (CamelGroupwiseJournal *groupwise_journal, Came
 				  CamelException *ex)
 {
 	CamelOfflineJournal *journal = (CamelOfflineJournal *) groupwise_journal;
-	CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(journal->folder->parent_store);
+	CamelGroupwiseStore *gw_store;
 	CamelGroupwiseJournalEntry *entry;
+	CamelStore *parent_store;
 	gchar *uid;
 
+	parent_store = camel_folder_get_parent_store (journal->folder);
+	gw_store = CAMEL_GROUPWISE_STORE (parent_store);
+
 	if (!update_cache (groupwise_journal, message, mi, &uid, ex))
 		return;
 
@@ -381,7 +388,7 @@ camel_groupwise_journal_transfer (CamelGroupwiseJournal *groupwise_journal, Came
 	entry->type = CAMEL_GROUPWISE_JOURNAL_ENTRY_APPEND;
 	entry->uid = uid;
 	entry->original_uid = g_strdup (original_uid);
-	entry->source_container = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, ((CamelFolder *)source_folder)->name));
+	entry->source_container = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, camel_folder_get_name (((CamelFolder *)source_folder))));
 
 	camel_dlist_addtail (&journal->queue, (CamelDListNode *) entry);
 
diff --git a/camel/providers/groupwise/camel-groupwise-store.c b/camel/providers/groupwise/camel-groupwise-store.c
index b152258..25b78e8 100644
--- a/camel/providers/groupwise/camel-groupwise-store.c
+++ b/camel/providers/groupwise/camel-groupwise-store.c
@@ -635,7 +635,9 @@ groupwise_get_folder (CamelStore *store, const gchar *folder_name, guint32 flags
 			return NULL;
 		}
 
-		camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name);
+		camel_operation_start (
+			NULL, _("Fetching summary information for new messages in %s"),
+			camel_folder_get_name (folder));
 		camel_folder_summary_clear (folder->summary);
 
 		while (!done) {
@@ -716,8 +718,13 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin
 	const gchar *position = E_GW_CURSOR_POSITION_END;
 	gint count = 0, cursor, summary_count = 0;
 	CamelStoreInfo *si = NULL;
+	const gchar *full_name;
+	const gchar *name;
 	guint total = 0;
 
+	name = camel_folder_get_name (folder);
+	full_name = camel_folder_get_full_name (folder);
+
 	camel_exception_clear (ex);
 
 	camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK);
@@ -734,9 +741,9 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin
 		}
 	}
 
-	container_id =	g_strdup (g_hash_table_lookup (priv->name_hash, folder->full_name));
+	container_id =	g_strdup (g_hash_table_lookup (priv->name_hash, full_name));
 
-	si = camel_store_summary_path ((CamelStoreSummary *)gw_store->summary, folder->name);
+	si = camel_store_summary_path ((CamelStoreSummary *)gw_store->summary, name);
 	if (si) {
 		total = si->total;
 		camel_store_summary_info_free ((CamelStoreSummary *)(gw_store)->summary, si);
@@ -748,7 +755,7 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin
 
 	summary_count = camel_folder_summary_count (folder->summary);
 	if (!summary_count || !summary->time_string) {
-			d(g_print ("\n\n** %s **: Summary missing???? Reloading summary....\n\n", folder->name);)
+			d(g_print ("\n\n** %s **: Summary missing???? Reloading summary....\n\n", name);)
 
 					status = e_gw_connection_create_cursor (priv->cnc, container_id,
 									CREATE_CURSOR_VIEW,
@@ -765,7 +772,9 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin
 					return;
 			}
 
-			camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name);
+			camel_operation_start (
+				NULL, _("Fetching summary information for new messages in %s"),
+				camel_folder_get_name (folder));
 
 			while (!done) {
 					status = e_gw_connection_read_cursor (priv->cnc, container_id,
@@ -919,7 +928,7 @@ convert_to_folder_info (CamelGroupwiseStore *store, EGwContainer *container, con
 	si->info.flags = fi->flags;
 	/*refresh info*/
 	if (store->current_folder
-	    && !strcmp (store->current_folder->full_name, fi->full_name)
+	    && !strcmp (camel_folder_get_full_name (store->current_folder), fi->full_name)
 	    && type != E_GW_CONTAINER_TYPE_INBOX) {
 		CAMEL_FOLDER_GET_CLASS (store->current_folder)->refresh_info (store->current_folder, ex);
 	}
@@ -1421,11 +1430,12 @@ groupwise_get_trash (CamelStore *store, CamelException *ex)
 {
 	CamelFolder *folder = camel_store_get_folder(store, "Trash", 0, ex);
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		 gchar *state = g_build_filename((CAMEL_GROUPWISE_STORE(store))->priv->storage_path, "folders", "Trash", "cmeta", NULL);
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 
 		return folder;
 	} else
diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c
index fba6122..8c98e9f 100644
--- a/camel/providers/imap/camel-imap-command.c
+++ b/camel/providers/imap/camel-imap-command.c
@@ -97,11 +97,15 @@ camel_imap_command (CamelImapStore *store,
 		cmd = imap_command_strdup_vprintf (store, fmt, ap);
 		va_end (ap);
 	} else {
+		const gchar *full_name;
+
 		g_object_ref (folder);
 		if (store->current_folder)
 			g_object_unref (store->current_folder);
 		store->current_folder = folder;
-		cmd = imap_command_strdup_printf (store, "SELECT %F", folder->full_name);
+
+		full_name = camel_folder_get_full_name (folder);
+		cmd = imap_command_strdup_printf (store, "SELECT %F", full_name);
 	}
 
 	if (!imap_command_start (store, folder, cmd, ex)) {
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index fce9a39..007b869 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -62,14 +62,14 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_IMAP_FOLDER, CamelImapFolderPrivate))
 
-extern gint camel_application_is_exiting;
-
-static CamelProperty imap_property_list[] = {
-	{ CAMEL_IMAP_FOLDER_CHECK_FOLDER, "check_folder", N_("Always check for new mail in this folder") },
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+	PROP_0,
+	PROP_CHECK_FOLDER = 0x2500
 };
 
-static gint imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
-static gint imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+extern gint camel_application_is_exiting;
 
 static gboolean imap_rescan (CamelFolder *folder, gint exists, CamelException *ex);
 static gboolean imap_refresh_info (CamelFolder *folder, CamelException *ex);
@@ -132,6 +132,40 @@ static CamelImapMessageInfo * imap_folder_summary_uid_or_error(
 G_DEFINE_TYPE (CamelImapFolder, camel_imap_folder, CAMEL_TYPE_OFFLINE_FOLDER)
 
 static void
+imap_folder_set_property (GObject *object,
+                          guint property_id,
+                          const GValue *value,
+                          GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CHECK_FOLDER:
+			camel_imap_folder_set_check_folder (
+				CAMEL_IMAP_FOLDER (object),
+				g_value_get_boolean (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+imap_folder_get_property (GObject *object,
+                          guint property_id,
+                          GValue *value,
+                          GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CHECK_FOLDER:
+			g_value_set_boolean (
+				value, camel_imap_folder_get_check_folder (
+				CAMEL_IMAP_FOLDER (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
 imap_folder_dispose (GObject *object)
 {
 	CamelImapFolder *imap_folder;
@@ -180,22 +214,39 @@ imap_folder_finalize (GObject *object)
 }
 
 static void
+imap_folder_constructed (GObject *object)
+{
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelURL *url;
+	const gchar *full_name;
+	gchar *description;
+
+	folder = CAMEL_FOLDER (object);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	url = CAMEL_SERVICE (parent_store)->url;
+
+	description = g_strdup_printf (
+		"%s %s:%s", url->user, url->host, full_name);
+	camel_folder_set_description (folder, description);
+	g_free (description);
+}
+
+static void
 camel_imap_folder_class_init (CamelImapFolderClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
-	gint i;
 
 	g_type_class_add_private (class, sizeof (CamelImapFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = imap_folder_set_property;
+	object_class->get_property = imap_folder_get_property;
 	object_class->dispose = imap_folder_dispose;
 	object_class->finalize = imap_folder_finalize;
-
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = imap_getv;
-	camel_object_class->setv = imap_setv;
+	object_class->constructed = imap_folder_constructed;
 
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->get_message = imap_get_message;
@@ -215,10 +266,16 @@ camel_imap_folder_class_init (CamelImapFolderClass *class)
 	folder_class->get_uncached_uids = imap_get_uncached_uids;
 	folder_class->get_filename = imap_get_filename;
 
-	/* only localize here, do not create GSList, we do not want to leak */
-	for (i = 0; i < G_N_ELEMENTS (imap_property_list); i++)
-		imap_property_list[i].description =
-			_(imap_property_list[i].description);
+	g_object_class_install_property (
+		object_class,
+		PROP_CHECK_FOLDER,
+		g_param_spec_boolean (
+			"check-folder",
+			"Check Folder",
+			N_("Always check for new mail in this folder"),
+			FALSE,
+			G_PARAM_READWRITE |
+			CAMEL_PARAM_PERSISTENT));
 }
 
 static void
@@ -291,13 +348,16 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name,
 		return NULL;
 	}
 
-	folder = g_object_new (CAMEL_TYPE_IMAP_FOLDER, NULL);
 	short_name = strrchr (folder_name, '/');
 	if (short_name)
 		short_name++;
 	else
 		short_name = folder_name;
-	camel_folder_construct (folder, parent, folder_name, short_name);
+	folder = g_object_new (
+		CAMEL_TYPE_IMAP_FOLDER,
+		"full-name", folder_name,
+		"name", short_name,
+		"parent-store", parent, NULL);
 
 	summary_file = g_strdup_printf ("%s/summary", folder_dir);
 	folder->summary = camel_imap_summary_new (folder, summary_file);
@@ -317,9 +377,9 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name,
 
 	/* set/load persistent state */
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
-	camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
 	g_free(state_file);
-	camel_object_state_read(folder);
+	camel_object_state_read (CAMEL_OBJECT (folder));
 
 	imap_folder->cache = camel_imap_message_cache_new (folder_dir, folder->summary, ex);
 	if (!imap_folder->cache) {
@@ -345,6 +405,59 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name,
 	return folder;
 }
 
+gboolean
+camel_imap_folder_get_check_folder (CamelImapFolder *imap_folder)
+{
+	g_return_val_if_fail (CAMEL_IS_IMAP_FOLDER (imap_folder), FALSE);
+
+	return imap_folder->priv->check_folder;
+}
+
+void
+camel_imap_folder_set_check_folder (CamelImapFolder *imap_folder,
+                                    gboolean check_folder)
+{
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	const gchar *full_name;
+
+	g_return_if_fail (CAMEL_IS_IMAP_FOLDER (imap_folder));
+
+	imap_folder->priv->check_folder = check_folder;
+
+	folder = CAMEL_FOLDER (imap_folder);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	/* Update the summary so the value is restored
+	 * correctly the next time the folder is loaded. */
+	if (CAMEL_IS_IMAP_STORE (parent_store)) {
+		CamelImapStore *imap_store;
+		CamelStoreSummary *summary;
+		CamelStoreInfo *si;
+
+		imap_store = CAMEL_IMAP_STORE (parent_store);
+		summary = CAMEL_STORE_SUMMARY (imap_store->summary);
+
+		si = camel_store_summary_path (summary, full_name);
+		if (si != NULL) {
+			guint32 old_flags = si->flags;
+
+			si->flags &= ~CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW;
+			si->flags |= check_folder ? CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW : 0;
+
+			if (si->flags != old_flags) {
+				camel_store_summary_touch (summary);
+				camel_store_summary_save (summary);
+			}
+
+			camel_store_summary_info_free (summary, si);
+		}
+	}
+
+	g_object_notify (G_OBJECT (imap_folder), "check-folder");
+}
+
 /* Called with the store's connect_lock locked */
 gboolean
 camel_imap_folder_selected (CamelFolder *folder,
@@ -395,18 +508,6 @@ camel_imap_folder_selected (CamelFolder *folder,
 	if (camel_strstrcase (response->status, "OK [READ-ONLY]"))
 		imap_folder->read_only = TRUE;
 
-/*FIXME what to do here.
-	  if (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store)) == CAMEL_DISCO_STORE_RESYNCING) {
-		if (validity != imap_summary->validity) {
-			camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID,
-					      _("Folder was destroyed and recreated on server."));
-			return;
-		}
-
-		 FIXME: find missing UIDs ?
-		return;
-	} */
-
 	if (!imap_summary->validity)
 		imap_summary->validity = validity;
 	else if (validity != imap_summary->validity) {
@@ -423,7 +524,11 @@ camel_imap_folder_selected (CamelFolder *folder,
 	if (exists < count)
 		imap_folder->need_rescan = TRUE;
 	else if (count != 0 && !imap_folder->need_rescan) {
-		CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+		CamelStore *parent_store;
+		CamelImapStore *store;
+
+		parent_store = camel_folder_get_parent_store (folder);
+		store = CAMEL_IMAP_STORE (parent_store);
 
 		/* Similarly, if the UID of the highest message we
 		 * know about has changed, then that indicates that
@@ -490,119 +595,18 @@ imap_get_filename (CamelFolder *folder,
 	return camel_imap_message_cache_get_filename (imap_folder->cache, uid, "", ex);
 }
 
-static gint
-imap_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i, count=0;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES:
-		case CAMEL_FOLDER_ARG_PROPERTIES: {
-			CamelArgGetV props;
-			gint i;
-
-			props.argc = 1;
-			props.argv[0] = *arg;
-			((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, ex, &props);
-
-			for (i = 0; i < G_N_ELEMENTS (imap_property_list); i++)
-				*arg->ca_ptr = g_slist_append (*arg->ca_ptr, &imap_property_list[i]);
-			break; }
-			/* imap args */
-		case CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER:
-			/* The internal value has precedence before the one stored in the summary. */
-			*arg->ca_int = ((CamelImapFolder *)object)->check_folder;
-			break;
-			/* CamelObject args */
-		case CAMEL_OBJECT_ARG_DESCRIPTION:
-			if (folder->description == NULL) {
-				CamelURL *uri = ((CamelService *)folder->parent_store)->url;
-
-				/* what if the full name doesn't incclude /'s?  does it matter? */
-				folder->description = g_strdup_printf("%s %s:%s", uri->user, uri->host, folder->full_name);
-			}
-			*arg->ca_str = folder->description;
-			break;
-		default:
-			count++;
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	if (count)
-		return ((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, ex, args);
-
-	return 0;
-}
-
-static gint
-imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
-{
-	gint save = 0;
-	gint i;
-	guint32 tag;
-
-	for (i = 0; i < args->argc; i++) {
-		CamelArg *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER:
-			if (((CamelImapFolder *)object)->check_folder != arg->ca_int) {
-				CamelFolder *folder = (CamelFolder *)object;
-
-				((CamelImapFolder *)object)->check_folder = arg->ca_int;
-				save = 1;
-
-				/* store both to the summary and to folder cmeta, to have this value restored correctly next time folder is fully loaded */
-				if (folder->parent_store && CAMEL_IS_IMAP_STORE (folder->parent_store)) {
-					CamelStoreInfo *si;
-					CamelStoreSummary *sm = CAMEL_STORE_SUMMARY (((CamelImapStore *)(folder->parent_store))->summary);
-
-					si = camel_store_summary_path (sm, folder->full_name);
-					if (si) {
-						if ((si->flags & CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW) != 0 ? 1 : 0 != (arg->ca_int) ? 1 : 0) {
-							si->flags = (si->flags & (~CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW)) | ((arg->ca_int) ? CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW : 0);
-							camel_store_summary_touch (sm);
-							camel_store_summary_save (sm);
-						}
-
-						camel_store_summary_info_free (sm, si);
-					}
-				}
-			}
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	if (save)
-		camel_object_state_write (object);
-
-	return ((CamelObjectClass *)camel_imap_folder_parent_class)->setv (object, ex, args);
-}
-
 static void
 imap_rename (CamelFolder *folder, const gchar *new)
 {
+	CamelStore *parent_store;
 	CamelImapFolder *imap_folder = (CamelImapFolder *)folder;
-	CamelImapStore *imap_store = (CamelImapStore *)folder->parent_store;
+	CamelImapStore *imap_store;
 	gchar *folder_dir, *summary_path, *state_file;
 	gchar *folders;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	imap_store = CAMEL_IMAP_STORE (parent_store);
+
 	folders = g_strconcat (imap_store->storage_path, "/folders", NULL);
 	folder_dir = imap_path_to_physical (folders, new);
 	g_free (folders);
@@ -615,7 +619,7 @@ imap_rename (CamelFolder *folder, const gchar *new)
 	camel_folder_summary_set_filename(folder->summary, summary_path);
 
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
-	camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
 	g_free(state_file);
 
 	g_free(summary_path);
@@ -628,13 +632,20 @@ imap_rename (CamelFolder *folder, const gchar *new)
 static gboolean
 get_folder_status (CamelFolder *folder, guint32 *total, guint32 *unread, CamelException *ex)
 {
-	CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *imap_store;
 	CamelImapResponse *response;
+	const gchar *full_name;
 	gboolean res = FALSE;
 
 	g_return_val_if_fail (folder != NULL, FALSE);
 
-	response = camel_imap_command (imap_store, folder, ex, "STATUS %F (MESSAGES UNSEEN)", folder->full_name);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	imap_store = CAMEL_IMAP_STORE (parent_store);
+
+	response = camel_imap_command (imap_store, folder, ex, "STATUS %F (MESSAGES UNSEEN)", full_name);
 
 	if (response) {
 		gint i;
@@ -700,12 +711,17 @@ static gboolean
 imap_refresh_info (CamelFolder *folder,
                    CamelException *ex)
 {
-	CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *imap_store;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
 	CamelImapResponse *response;
 	CamelStoreInfo *si;
+	const gchar *full_name;
 	gint check_rescan = -1;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	imap_store = CAMEL_IMAP_STORE (parent_store);
+
 	if (CAMEL_OFFLINE_STORE (imap_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
 
@@ -727,8 +743,10 @@ imap_refresh_info (CamelFolder *folder,
 	/* try to store local changes first, as the summary contains new local messages */
 	replay_offline_journal (imap_store, imap_folder, ex);
 
+	full_name = camel_folder_get_full_name (folder);
+
 	if (imap_store->current_folder != folder
-	    || g_ascii_strcasecmp(folder->full_name, "INBOX") == 0) {
+	    || g_ascii_strcasecmp (full_name, "INBOX") == 0) {
 		response = camel_imap_command (imap_store, folder, ex, NULL);
 		if (response) {
 			camel_imap_folder_selected (folder, response, ex);
@@ -745,7 +763,7 @@ imap_refresh_info (CamelFolder *folder,
 #if 0
 		/* on some servers need to CHECKpoint INBOX to recieve new messages?? */
 		/* rfc2060 suggests this, but havent seen a server that requires it */
-		if (g_ascii_strcasecmp(folder->full_name, "INBOX") == 0) {
+		if (g_ascii_strcasecmp (full_name, "INBOX") == 0) {
 			response = camel_imap_command (imap_store, folder, ex, "CHECK");
 			camel_imap_response_free (imap_store, response);
 		}
@@ -754,19 +772,21 @@ imap_refresh_info (CamelFolder *folder,
 		camel_imap_response_free (imap_store, response);
 	}
 
-	si = camel_store_summary_path((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, folder->full_name);
+	si = camel_store_summary_path((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, full_name);
 	if (si) {
 		guint32 unread, total;
 
-		camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL);
+		total = camel_folder_summary_count (folder->summary);
+		unread = folder->summary->unread_count;
+
 		if (si->total != total
 		    || si->unread != unread) {
 			si->total = total;
 			si->unread = unread;
-			camel_store_summary_touch((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary);
+			camel_store_summary_touch((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary);
 			check_rescan = 0;
 		}
-		camel_store_summary_info_free((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, si);
+		camel_store_summary_info_free((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, si);
 	}
 
 	if (check_rescan && !camel_application_is_exiting && !camel_exception_is_set (ex)) {
@@ -778,7 +798,9 @@ imap_refresh_info (CamelFolder *folder,
 			/* Check whether there are changes in total/unread messages in the folders
 			   and if so, then rescan whole summary */
 			if (get_folder_status (folder, &server_total, &server_unread, ex)) {
-				camel_object_get (folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL);
+
+				total = camel_folder_summary_count (folder->summary);
+				unread = folder->summary->unread_count;
 
 				if (total != server_total || unread != server_unread)
 					check_rescan = 1;
@@ -792,7 +814,7 @@ done:
 	camel_service_unlock (CAMEL_SERVICE (imap_store), CS_REC_CONNECT_LOCK);
 
 	camel_folder_summary_save_to_db (folder->summary, ex);
-	camel_store_summary_save ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary);
+	camel_store_summary_save ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary);
 
 	return TRUE;
 }
@@ -878,8 +900,9 @@ merge_custom_flags (CamelMessageInfo *mi, const gchar *custom_flags)
 static gboolean
 imap_rescan (CamelFolder *folder, gint exists, CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelImapStore *store;
 	struct {
 		gchar *uid;
 		guint32 flags;
@@ -896,6 +919,9 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex)
 	CamelFolderChangeInfo *changes = NULL;
 	gboolean success;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (camel_application_is_exiting)
 		return TRUE;
 
@@ -909,7 +935,9 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex)
 	}
 
 	/* Check UIDs and flags of all messages we already know of. */
-	camel_operation_start (NULL, _("Scanning for changed messages in %s"), folder->name);
+	camel_operation_start (
+		NULL, _("Scanning for changed messages in %s"),
+		camel_folder_get_name (folder));
 	uid = camel_folder_summary_uid_from_index (folder->summary, summary_len - 1);
 
 	if (!uid) {
@@ -999,7 +1027,8 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex)
 		info = camel_folder_summary_uid (folder->summary, uid);
 		if (!info) {
 			if (g_getenv("CRASH_IMAP")) { /* Debug logs to tackle on hard to get imap crasher */
-				printf("CRASH: %s: %s", folder->full_name, uid);
+				printf ("CRASH: %s: %s",
+					camel_folder_get_full_name (folder), uid);
 				g_assert(0);
 			} else
 				continue;
@@ -1357,24 +1386,30 @@ static gboolean
 imap_sync_offline (CamelFolder *folder,
                    CamelException *ex)
 {
+	CamelStore *parent_store;
+
+	parent_store = camel_folder_get_parent_store (folder);
+
 	if (folder->summary && (folder->summary->flags & CAMEL_SUMMARY_DIRTY) != 0) {
 		CamelStoreInfo *si;
+		const gchar *full_name;
 
 		/* ... and store's summary when folder's summary is dirty */
-		si = camel_store_summary_path ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, folder->full_name);
+		full_name = camel_folder_get_full_name (folder);
+		si = camel_store_summary_path ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, full_name);
 		if (si) {
 			if (si->total != folder->summary->saved_count || si->unread != folder->summary->unread_count) {
 				si->total = folder->summary->saved_count;
 				si->unread = folder->summary->unread_count;
-				camel_store_summary_touch ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary);
+				camel_store_summary_touch ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary);
 			}
 
-			camel_store_summary_info_free ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, si);
+			camel_store_summary_info_free ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, si);
 		}
 	}
 
 	camel_folder_summary_save_to_db (folder->summary, ex);
-	camel_store_summary_save((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary);
+	camel_store_summary_save((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary);
 
 	return TRUE;
 }
@@ -1384,7 +1419,8 @@ imap_sync (CamelFolder *folder,
            gboolean expunge,
            CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapMessageInfo *info;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
 	gboolean success;
@@ -1394,6 +1430,9 @@ imap_sync (CamelFolder *folder,
 	gchar *set, *flaglist, *uid;
 	gint i, j, max;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (folder->permanent_flags == 0 || CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
 		if (expunge) {
 			if (!imap_expunge (folder, ex))
@@ -1564,9 +1603,14 @@ imap_expunge_uids_offline (CamelFolder *folder,
                            CamelException *ex)
 {
 	CamelFolderChangeInfo *changes;
+	CamelStore *parent_store;
 	GSList *list = NULL;
+	const gchar *full_name;
 	gint i;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
 	qsort (uids->pdata, uids->len, sizeof (gpointer), uid_compar);
 
 	changes = camel_folder_change_info_new ();
@@ -1579,7 +1623,8 @@ imap_expunge_uids_offline (CamelFolder *folder,
 		 * the cached data may be useful in replaying a COPY later.
 		 */
 	}
-	camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, list, ex);
+
+	camel_db_delete_uids (parent_store->cdb_w, full_name, list, ex);
 	g_slist_free(list);
 	camel_folder_summary_save_to_db (folder->summary, ex);
 
@@ -1597,15 +1642,23 @@ imap_expunge_uids_online (CamelFolder *folder,
                           GPtrArray *uids,
                           CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelImapStore *store;
 	CamelImapResponse *response;
 	gint uid = 0;
 	gchar *set;
-	gboolean full_expunge = (store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0;
+	gboolean full_expunge;
 	CamelFolderChangeInfo *changes;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint i;
 	GSList *list=NULL;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	store = CAMEL_IMAP_STORE (parent_store);
+	full_expunge = (store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0;
+
 	camel_service_lock (CAMEL_SERVICE (store), CS_REC_CONNECT_LOCK);
 
 	if ((store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0) {
@@ -1667,7 +1720,8 @@ imap_expunge_uids_online (CamelFolder *folder,
 		 * the cached data may be useful in replaying a COPY later.
 		 */
 	}
-	camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, list, ex);
+
+	camel_db_delete_uids (parent_store->cdb_w, full_name, list, ex);
 	g_slist_free (list);
 	camel_folder_summary_save_to_db (folder->summary, ex);
 	camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes);
@@ -1680,16 +1734,20 @@ static gboolean
 imap_expunge (CamelFolder *folder,
               CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
 	GPtrArray *uids;
+	const gchar *full_name;
 	gboolean success;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
 	camel_folder_summary_save_to_db (folder->summary, ex);
-	uids = camel_db_get_folder_deleted_uids (folder->parent_store->cdb_r, folder->full_name, ex);
+	uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, ex);
 	if (!uids)
 		return TRUE;
 
-	if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_AVAIL)
+	if (CAMEL_OFFLINE_STORE (parent_store)->state == CAMEL_OFFLINE_STORE_NETWORK_AVAIL)
 		success = imap_expunge_uids_online (folder, uids, ex);
 	else
 		success = imap_expunge_uids_offline (folder, uids, ex);
@@ -1701,16 +1759,20 @@ imap_expunge (CamelFolder *folder,
 }
 
 gboolean
-imap_expunge_uids_resyncing (CamelFolder *folder,
-                             GPtrArray *uids,
-                             CamelException *ex)
+camel_imap_expunge_uids_resyncing (CamelFolder *folder,
+                                   GPtrArray *uids,
+                                   CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelImapStore *store;
 	GPtrArray *keep_uids, *mark_uids;
 	CamelImapResponse *response;
 	gchar *result;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (imap_folder->read_only)
 		return TRUE;
 
@@ -1947,15 +2009,20 @@ do_append (CamelFolder *folder,
            gchar **uid,
            CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapResponse *response, *response2;
 	CamelStream *memstream;
 	CamelMimeFilter *crlf_filter;
 	CamelStream *streamfilter;
 	GByteArray *ba;
+	const gchar *full_name;
 	gchar *flagstr, *end;
 	guint32 flags = 0;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	/* encode any 8bit parts so we avoid sending embedded nul-chars and such  */
 	camel_mime_message_encode_8bit_parts (message);
 
@@ -1989,9 +2056,11 @@ retry:
 	else
 		flagstr = NULL;
 
-	response = camel_imap_command (store, NULL, ex, "APPEND %F%s%s {%d}",
-				       folder->full_name, flagstr ? " " : "",
-				       flagstr ? flagstr : "", ba->len);
+	full_name = camel_folder_get_full_name (folder);
+	response = camel_imap_command (
+		store, NULL, ex, "APPEND %F%s%s {%d}",
+		full_name, flagstr ? " " : "",
+		flagstr ? flagstr : "", ba->len);
 	g_free (flagstr);
 
 	if (!response) {
@@ -2059,12 +2128,16 @@ imap_append_online (CamelFolder *folder,
                     gchar **appended_uid,
                     CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapResponse *response;
 	gboolean success = TRUE;
 	gchar *uid;
 	gint count;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
 		return imap_append_offline (folder, message, info, appended_uid, ex);
 	}
@@ -2108,16 +2181,20 @@ imap_append_online (CamelFolder *folder,
 }
 
 gboolean
-imap_append_resyncing (CamelFolder *folder,
-                       CamelMimeMessage *message,
-                       const CamelMessageInfo *info,
-                       gchar **appended_uid,
-                       CamelException *ex)
+camel_imap_append_resyncing (CamelFolder *folder,
+                             CamelMimeMessage *message,
+                             const CamelMessageInfo *info,
+                             gchar **appended_uid,
+                             CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapResponse *response;
 	gchar *uid;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	response = do_append (folder, message, info, &uid, ex);
 	if (!response)
 		return FALSE;
@@ -2151,7 +2228,8 @@ imap_transfer_offline (CamelFolder *source,
                        gboolean delete_originals,
                        CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapMessageCache *sc = CAMEL_IMAP_FOLDER (source)->cache;
 	CamelImapMessageCache *dc = CAMEL_IMAP_FOLDER (dest)->cache;
 	CamelFolderChangeInfo *changes;
@@ -2160,6 +2238,9 @@ imap_transfer_offline (CamelFolder *source,
 	gchar *uid, *destuid;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (source);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	/* We grab the store's command lock first, and then grab the
 	 * source and destination cache_locks. This way we can't
 	 * deadlock in the case where we're simultaneously also trying
@@ -2283,6 +2364,7 @@ handle_copyuid_copy_user_tags (CamelImapResponse *response,
                                CamelFolder *source,
                                CamelFolder *destination)
 {
+	CamelStore *parent_store;
 	gchar *validity, *srcset, *destset;
 	GPtrArray *src, *dest;
 	gint i;
@@ -2304,8 +2386,10 @@ handle_copyuid_copy_user_tags (CamelImapResponse *response,
 		goto lose;
 
 	/* first do NOOP on the destination folder, so server has enough time to propagate our copy command there */
-	camel_imap_response_free (CAMEL_IMAP_STORE (destination->parent_store),
-				  camel_imap_command (CAMEL_IMAP_STORE (destination->parent_store), destination, NULL, "NOOP"));
+	parent_store = camel_folder_get_parent_store (destination);
+	camel_imap_response_free (
+		CAMEL_IMAP_STORE (parent_store), camel_imap_command (
+		CAMEL_IMAP_STORE (parent_store), destination, NULL, "NOOP"));
 
 	camel_exception_init (&ex);
 	/* refresh folder's summary first, we copied messages there on the server,
@@ -2398,11 +2482,18 @@ do_copy (CamelFolder *source,
          gint delete_originals,
          CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapResponse *response;
+	const gchar *full_name;
 	gchar *uidset;
 	gint uid = 0, last=0, i;
 
+	parent_store = camel_folder_get_parent_store (source);
+	store = CAMEL_IMAP_STORE (parent_store);
+
+	full_name = camel_folder_get_full_name (destination);
+
 	while (uid < uids->len && !camel_exception_is_set (ex)) {
 		uidset = imap_uid_array_to_set (source->summary, uids, uid, UID_SET_LIMIT, &uid);
 
@@ -2411,14 +2502,14 @@ do_copy (CamelFolder *source,
 			response = camel_imap_command (
 				store, source, ex,
 				"UID XGWMOVE %s %F", uidset,
-				destination->full_name);
+				full_name);
 			/* returns only 'A00012 OK UID XGWMOVE completed' '* 2 XGWMOVE' so nothing useful */
 			camel_imap_response_free (store, response);
 		} else {
 			response = camel_imap_command (
 				store, source, ex,
 				"UID COPY %s %F", uidset,
-				destination->full_name);
+				full_name);
 			if (response && (store->capabilities & IMAP_CAPABILITY_UIDPLUS))
 				handle_copyuid (response, source, destination);
 			if (response)
@@ -2445,10 +2536,14 @@ imap_transfer_online (CamelFolder *source,
                       gboolean delete_originals,
                       CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	gboolean success = TRUE;
 	gint count;
 
+	parent_store = camel_folder_get_parent_store (source);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return imap_transfer_offline (
 			source, uids, dest, transferred_uids,
@@ -2479,12 +2574,12 @@ imap_transfer_online (CamelFolder *source,
 }
 
 gboolean
-imap_transfer_resyncing (CamelFolder *source,
-                         GPtrArray *uids,
-                         CamelFolder *dest,
-                         GPtrArray **transferred_uids,
-                         gboolean delete_originals,
-                         CamelException *ex)
+camel_imap_transfer_resyncing (CamelFolder *source,
+                               GPtrArray *uids,
+                               CamelFolder *dest,
+                               GPtrArray **transferred_uids,
+                               gboolean delete_originals,
+                               CamelException *ex)
 {
 	GPtrArray *realuids;
 	gint first, i;
@@ -2880,13 +2975,19 @@ get_message (CamelImapFolder *imap_folder, const gchar *uid,
 	     CamelMessageContentInfo *ci,
 	     CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (CAMEL_FOLDER (imap_folder)->parent_store);
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelDataWrapper *content;
 	CamelMimeMessage *msg;
 	CamelStream *stream;
 	gchar *section_text, *part_spec;
 	gint ret;
 
+	folder = CAMEL_FOLDER (imap_folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	part_spec = content_info_get_part_spec(ci);
 	d(printf("get message '%s'\n", part_spec));
 	section_text = g_strdup_printf ("%s%s%s", part_spec, *part_spec ? "." : "",
@@ -2998,13 +3099,17 @@ imap_get_message (CamelFolder *folder,
                   const gchar *uid,
                   CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelImapStore *store;
 	CamelImapMessageInfo *mi;
 	CamelMimeMessage *msg = NULL;
 	CamelStream *stream = NULL;
 	gint retry;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	mi = imap_folder_summary_uid_or_error(folder->summary, uid, ex);
 	if (!mi)
 	  return NULL;
@@ -3455,7 +3560,8 @@ imap_update_summary (CamelFolder *folder,
                      CamelFolderChangeInfo *changes,
                      CamelException *ex)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
 	GPtrArray *fetch_data = NULL, *messages = NULL, *needheaders;
 	guint32 flags, uidval;
@@ -3468,6 +3574,9 @@ imap_update_summary (CamelFolder *folder,
 	GData *data;
 	gint k = 0, ct;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (store->server_level >= IMAP_LEVEL_IMAP4REV1) {
 		if (store->headers == IMAP_FETCH_ALL_HEADERS)
 			header_spec = g_string_new ("HEADER");
@@ -3516,7 +3625,9 @@ imap_update_summary (CamelFolder *folder,
 		g_string_free (header_spec, TRUE);
 		return FALSE;
 	}
-	camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name);
+	camel_operation_start (
+		NULL, _("Fetching summary information for new messages in %s"),
+		camel_folder_get_name (folder));
 
 	/* Parse the responses. We can't add a message to the summary
 	 * until we've gotten its headers, and there's no guarantee
@@ -3592,7 +3703,9 @@ imap_update_summary (CamelFolder *folder,
 		qsort (needheaders->pdata, needheaders->len,
 		       sizeof (gpointer), uid_compar);
 
-		camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name);
+		camel_operation_start (
+			NULL, _("Fetching summary information for new messages in %s"),
+			camel_folder_get_name (folder));
 
 		while (uid < needheaders->len && !camel_application_is_exiting) {
 			uidset = imap_uid_array_to_set (folder->summary, needheaders, uid, UID_SET_LIMIT, &uid);
@@ -3816,8 +3929,10 @@ camel_imap_folder_changed (CamelFolder *folder, gint exists,
 
 	changes = camel_folder_change_info_new ();
 	if (expunged) {
+		CamelStore *parent_store;
 		gint i, id;
 		GSList *deleted = NULL;
+		const gchar *full_name;
 
 		for (i = 0; i < expunged->len; i++) {
 			id = g_array_index (expunged, int, i);
@@ -3837,7 +3952,9 @@ camel_imap_folder_changed (CamelFolder *folder, gint exists,
 		}
 
 		/* Delete all in one transaction */
-		camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, deleted, ex);
+		full_name = camel_folder_get_full_name (folder);
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_delete_uids (parent_store->cdb_w, full_name, deleted, ex);
 		g_slist_foreach (deleted, (GFunc) g_free, NULL);
 		g_slist_free (deleted);
 	}
@@ -3880,13 +3997,17 @@ camel_imap_folder_fetch_data (CamelImapFolder *imap_folder, const gchar *uid,
 			      CamelException *ex)
 {
 	CamelFolder *folder = CAMEL_FOLDER (imap_folder);
-	CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapResponse *response;
 	CamelStream *stream;
 	GData *fetch_data;
 	gchar *found_uid;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	/* EXPUNGE responses have to modify the cache, which means
 	 * they have to grab the cache_lock while holding the
 	 * connect_lock.
@@ -4119,10 +4240,14 @@ parse_fetch_response (CamelImapFolder *imap_folder, gchar *response)
 static CamelFolderQuotaInfo *
 imap_get_quota_info (CamelFolder *folder)
 {
-	CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *imap_store;
 	CamelImapResponse *response;
 	CamelFolderQuotaInfo *res = NULL, *last = NULL;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	imap_store = CAMEL_IMAP_STORE (parent_store);
+
 	if (CAMEL_OFFLINE_STORE (imap_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return NULL;
 
diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h
index c47959d..60ce871 100644
--- a/camel/providers/imap/camel-imap-folder.h
+++ b/camel/providers/imap/camel-imap-folder.h
@@ -54,22 +54,12 @@ G_BEGIN_DECLS
 
 struct _CamelIMAP4Journal;
 
-enum {
-	CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER = CAMEL_OFFLINE_FOLDER_ARG_LAST,
-	CAMEL_IMAP_FOLDER_ARG_LAST = CAMEL_OFFLINE_FOLDER_ARG_LAST + 0x100
-};
-
-enum {
-	CAMEL_IMAP_FOLDER_CHECK_FOLDER = CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER | CAMEL_ARG_BOO
-};
-
 typedef struct _CamelImapFolder CamelImapFolder;
 typedef struct _CamelImapFolderClass CamelImapFolderClass;
 typedef struct _CamelImapFolderPrivate CamelImapFolderPrivate;
 
 struct _CamelImapFolder {
 	CamelOfflineFolder parent;
-
 	CamelImapFolderPrivate *priv;
 
 	CamelFolderSearch *search;
@@ -79,43 +69,49 @@ struct _CamelImapFolder {
 	guint need_rescan:1;
 	guint need_refresh:1;
 	guint read_only:1;
-	guint check_folder:1;
 };
 
 struct _CamelImapFolderClass {
 	CamelOfflineFolderClass parent_class;
 };
 
-/* public methods */
-CamelFolder *camel_imap_folder_new (CamelStore *parent,
-				    const gchar *folder_name,
-				    const gchar *folder_dir,
-				    CamelException *ex);
-
-gboolean camel_imap_folder_selected (CamelFolder *folder,
-				 CamelImapResponse *response,
-				 CamelException *ex);
-
-gboolean camel_imap_folder_changed (CamelFolder *folder, gint exists,
-				GArray *expunged, CamelException *ex);
-
-CamelStream *camel_imap_folder_fetch_data (CamelImapFolder *imap_folder,
-					   const gchar *uid,
-					   const gchar *section_text,
-					   gboolean cache_only,
-					   CamelException *ex);
-gboolean
-imap_append_resyncing (CamelFolder *folder, CamelMimeMessage *message,
-		       const CamelMessageInfo *info, gchar **appended_uid,
-		       CamelException *ex);
-gboolean
-imap_transfer_resyncing (CamelFolder *source, GPtrArray *uids,
-			 CamelFolder *dest, GPtrArray **transferred_uids,
-			 gboolean delete_originals, CamelException *ex);
-gboolean
-imap_expunge_uids_resyncing (CamelFolder *folder, GPtrArray *uids, CamelException *ex);
-
-GType camel_imap_folder_get_type (void);
+GType		camel_imap_folder_get_type	(void);
+CamelFolder *	camel_imap_folder_new		(CamelStore *parent,
+						 const gchar *folder_name,
+						 const gchar *folder_dir,
+						 CamelException *ex);
+gboolean	camel_imap_folder_get_check_folder
+						(CamelImapFolder *imap_folder);
+void		camel_imap_folder_set_check_folder
+						(CamelImapFolder *imap_folder,
+						 gboolean check_folder);
+gboolean	camel_imap_folder_selected	(CamelFolder *folder,
+						 CamelImapResponse *response,
+						 CamelException *ex);
+gboolean	camel_imap_folder_changed	(CamelFolder *folder,
+						 gint exists,
+						 GArray *expunged,
+						 CamelException *ex);
+CamelStream *	camel_imap_folder_fetch_data	(CamelImapFolder *imap_folder,
+						 const gchar *uid,
+						 const gchar *section_text,
+						 gboolean cache_only,
+						 CamelException *ex);
+gboolean	camel_imap_append_resyncing	(CamelFolder *folder,
+						 CamelMimeMessage *message,
+						 const CamelMessageInfo *info,
+						 gchar **appended_uid,
+						 CamelException *ex);
+gboolean	camel_imap_transfer_resyncing	(CamelFolder *source,
+						 GPtrArray *uids,
+						 CamelFolder *dest,
+						 GPtrArray **transferred_uids,
+						 gboolean delete_originals,
+						 CamelException *ex);
+gboolean	camel_imap_expunge_uids_resyncing
+						(CamelFolder *folder,
+						 GPtrArray *uids,
+						 CamelException *ex);
 
 G_END_DECLS
 
diff --git a/camel/providers/imap/camel-imap-journal.c b/camel/providers/imap/camel-imap-journal.c
index 340aa02..3421098 100644
--- a/camel/providers/imap/camel-imap-journal.c
+++ b/camel/providers/imap/camel-imap-journal.c
@@ -281,25 +281,28 @@ journal_decode_folder (CamelIMAPJournal *journal, const gchar *name)
 	CamelOfflineJournal *offline = CAMEL_OFFLINE_JOURNAL (journal);
 
 	folder = g_hash_table_lookup (journal->folders, name);
-	if (!folder && offline->folder && g_str_equal (offline->folder->full_name, name)) {
+	if (!folder && offline->folder && g_str_equal (camel_folder_get_full_name (offline->folder), name)) {
 		folder = offline->folder;
 	}
 	if (!folder) {
+		CamelStore *parent_store;
 		CamelException ex;
 		gchar *msg;
 
 		camel_exception_init (&ex);
-		folder = camel_store_get_folder (CAMEL_STORE (CAMEL_OFFLINE_JOURNAL (journal)->folder->parent_store),
-						 name, 0, &ex);
+		parent_store = camel_folder_get_parent_store (
+			CAMEL_OFFLINE_JOURNAL (journal)->folder);
+		folder = camel_store_get_folder (parent_store, name, 0, &ex);
 		if (folder)
 			g_hash_table_insert (journal->folders, (gchar *) name, folder);
 		else {
 			msg = g_strdup_printf (_("Could not open '%s':\n%s\nChanges made to this folder will not be resynchronized."),
 					       name, camel_exception_get_description (&ex));
 			camel_exception_clear (&ex);
-			camel_session_alert_user (camel_service_get_session (CAMEL_SERVICE (CAMEL_OFFLINE_JOURNAL (journal)->folder->parent_store)),
-						  CAMEL_SESSION_ALERT_WARNING,
-						  msg, FALSE);
+			camel_session_alert_user (
+				camel_service_get_session (CAMEL_SERVICE (parent_store)),
+				CAMEL_SESSION_ALERT_WARNING,
+				msg, FALSE);
 			g_free (msg);
 		}
 	}
@@ -316,7 +319,8 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep
 
 	switch (imap_entry->type) {
 	case CAMEL_IMAP_JOURNAL_ENTRY_EXPUNGE:
-		imap_expunge_uids_resyncing (journal->folder, imap_entry->uids, ex);
+		camel_imap_expunge_uids_resyncing (
+			journal->folder, imap_entry->uids, ex);
 		return 0;
 	case CAMEL_IMAP_JOURNAL_ENTRY_APPEND:
 	{
@@ -329,7 +333,8 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep
 			return -1;
 
 		info = camel_folder_get_message_info (journal->folder, imap_entry->append_uid);
-		imap_append_resyncing (journal->folder, message, info, &ret_uid, ex);
+		camel_imap_append_resyncing (
+			journal->folder, message, info, &ret_uid, ex);
 		camel_folder_free_message_info (journal->folder, info);
 
 		if (ret_uid) {
@@ -352,7 +357,9 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep
 		}
 
 		camel_exception_clear (ex);
-		if (!imap_transfer_resyncing (journal->folder, imap_entry->uids, destination, &ret_uids, imap_entry->move, ex))
+		if (!camel_imap_transfer_resyncing (
+			journal->folder, imap_entry->uids, destination,
+			&ret_uids, imap_entry->move, ex))
 			return -1;
 
 		if (ret_uids) {
@@ -419,10 +426,12 @@ camel_imap_journal_log (CamelOfflineJournal *journal, CamelOfflineAction action,
 		case CAMEL_IMAP_JOURNAL_ENTRY_TRANSFER:
 		{
 			CamelFolder *dest = va_arg (ap, CamelFolder *);
+			const gchar *full_name;
 
+			full_name = camel_folder_get_full_name (dest);
 			entry->uids = copy_uids_array (va_arg (ap, GPtrArray *));
 			entry->move = va_arg (ap, gboolean);
-			entry->dest_folder_name = g_strdup (dest->full_name);
+			entry->dest_folder_name = g_strdup (full_name);
 			break;
 		}
 	}
diff --git a/camel/providers/imap/camel-imap-private.h b/camel/providers/imap/camel-imap-private.h
index c2a4901..82de48a 100644
--- a/camel/providers/imap/camel-imap-private.h
+++ b/camel/providers/imap/camel-imap-private.h
@@ -16,6 +16,7 @@ struct _CamelImapFolderPrivate {
 	GStaticRecMutex cache_lock;	/* for locking the cache object */
 #endif
 	GHashTable *ignore_recent;	/* hash table of UIDs to ignore as recent when updating folder */
+	gboolean check_folder;		/* persistent property */
 };
 
 #ifdef ENABLE_THREADS
diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c
index ea9b967..b64b4c0 100644
--- a/camel/providers/imap/camel-imap-search.c
+++ b/camel/providers/imap/camel-imap-search.c
@@ -319,11 +319,15 @@ sync_match(CamelImapSearch *is, struct _match_record *mr)
 	CamelImapResponse *response = NULL;
 	guint32 uid;
 	CamelFolder *folder = ((CamelFolderSearch *)is)->folder;
-	CamelImapStore *store = (CamelImapStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	struct _camel_search_words *words;
 	GString *search;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	if (mr->lastuid >= is->lastuid && mr->validity == is->validity)
 		return 0;
 
@@ -421,7 +425,8 @@ get_match(CamelImapSearch *is, gint argc, struct _ESExpResult **argv)
 static ESExpResult *
 imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s)
 {
-	CamelImapStore *store = CAMEL_IMAP_STORE (s->folder->parent_store);
+	CamelStore *parent_store;
+	CamelImapStore *store;
 	CamelImapSearch *is = (CamelImapSearch *)s;
 	gchar *uid;
 	ESExpResult *r;
@@ -431,6 +436,9 @@ imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, Cam
 	struct _match_record *mr;
 	guint32 uidn, *uidp;
 
+	parent_store = camel_folder_get_parent_store (s->folder);
+	store = CAMEL_IMAP_STORE (parent_store);
+
 	d(printf("Performing body search '%s'\n", argv[0]->value.string));
 
 	/* TODO: Cache offline searches too? */
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 4ad0ca1..60c4441 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -70,9 +70,6 @@ static gboolean construct (CamelService *service, CamelSession *session,
 		       CamelProvider *provider, CamelURL *url,
 		       CamelException *ex);
 
-static gint imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
-static gint imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
-
 static gchar *imap_get_name (CamelService *service, gboolean brief);
 
 static gboolean imap_noop (CamelStore *store, CamelException *ex);
@@ -152,7 +149,6 @@ static void
 camel_imap_store_class_init (CamelImapStoreClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
@@ -160,10 +156,6 @@ camel_imap_store_class_init (CamelImapStoreClass *class)
 	object_class->dispose = imap_store_dispose;
 	object_class->finalize = imap_store_finalize;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->setv = imap_setv;
-	camel_object_class->getv = imap_getv;
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = construct;
 	service_class->query_auth_types = query_auth_types;
@@ -288,126 +280,6 @@ construct (CamelService *service, CamelSession *session,
 	return TRUE;
 }
 
-static gint
-imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
-{
-	CamelImapStore *store = (CamelImapStore *) object;
-	guint32 tag, flags;
-	gint i;
-
-	for (i = 0; i < args->argc; i++) {
-		tag = args->argv[i].tag;
-
-		/* make sure this is an arg we're supposed to handle */
-		if ((tag & CAMEL_ARG_TAG) <= CAMEL_IMAP_STORE_ARG_FIRST ||
-		    (tag & CAMEL_ARG_TAG) >= CAMEL_IMAP_STORE_ARG_FIRST + 100)
-			continue;
-
-		switch (tag) {
-		case CAMEL_IMAP_STORE_NAMESPACE:
-			if (strcmp (store->users_namespace, args->argv[i].ca_str) != 0) {
-				g_free (store->users_namespace);
-				store->users_namespace = g_strdup (args->argv[i].ca_str);
-				/* the current imap code will need to do a reconnect for this to take effect */
-				/*reconnect = TRUE;*/
-			}
-			break;
-		case CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_OVERRIDE_NAMESPACE : 0;
-			flags |= (store->parameters & ~IMAP_PARAM_OVERRIDE_NAMESPACE);
-
-			if (store->parameters != flags) {
-				store->parameters = flags;
-				/* the current imap code will need to do a reconnect for this to take effect */
-				/*reconnect = TRUE;*/
-			}
-			break;
-		case CAMEL_IMAP_STORE_CHECK_ALL:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_CHECK_ALL : 0;
-			flags |= (store->parameters & ~IMAP_PARAM_CHECK_ALL);
-			store->parameters = flags;
-			/* no need to reconnect for this option to take effect... */
-			break;
-		case CAMEL_IMAP_STORE_CHECK_LSUB:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_CHECK_LSUB : 0;
-			store->parameters = flags | (store->parameters & ~IMAP_PARAM_CHECK_LSUB);
-			break;
-		case CAMEL_IMAP_STORE_FILTER_INBOX:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_INBOX : 0;
-			flags |= (store->parameters & ~IMAP_PARAM_FILTER_INBOX);
-			store->parameters = flags;
-			/* no need to reconnect for this option to take effect... */
-			break;
-		case CAMEL_IMAP_STORE_FILTER_JUNK:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_JUNK : 0;
-			store->parameters = flags | (store->parameters & ~IMAP_PARAM_FILTER_JUNK);
-			break;
-		case CAMEL_IMAP_STORE_FILTER_JUNK_INBOX:
-			flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_JUNK_INBOX : 0;
-			store->parameters = flags | (store->parameters & ~IMAP_PARAM_FILTER_JUNK_INBOX);
-			break;
-		default:
-			/* error?? */
-			continue;
-		}
-
-		/* let our parent know that we've handled this arg */
-		camel_argv_ignore (args, i);
-	}
-
-	/* FIXME: if we need to reconnect for a change to take affect,
-           we need to do it here... or, better yet, somehow chain it
-           up to CamelService's setv implementation. */
-
-	return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->setv (object, ex, args);
-}
-
-static gint
-imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
-{
-	CamelImapStore *store = (CamelImapStore *) object;
-	guint32 tag;
-	gint i;
-
-	for (i = 0; i < args->argc; i++) {
-		tag = args->argv[i].tag;
-
-		/* make sure this is an arg we're supposed to handle */
-		if ((tag & CAMEL_ARG_TAG) <= CAMEL_IMAP_STORE_ARG_FIRST ||
-		    (tag & CAMEL_ARG_TAG) >= CAMEL_IMAP_STORE_ARG_FIRST + 100)
-			continue;
-
-		switch (tag) {
-		case CAMEL_IMAP_STORE_NAMESPACE:
-			*args->argv[i].ca_str = store->users_namespace;
-			break;
-		case CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_OVERRIDE_NAMESPACE ? TRUE : FALSE;
-			break;
-		case CAMEL_IMAP_STORE_CHECK_ALL:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_CHECK_ALL ? TRUE : FALSE;
-			break;
-		case CAMEL_IMAP_STORE_CHECK_LSUB:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_CHECK_LSUB ? TRUE : FALSE;
-			break;
-		case CAMEL_IMAP_STORE_FILTER_INBOX:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_INBOX ? TRUE : FALSE;
-			break;
-		case CAMEL_IMAP_STORE_FILTER_JUNK:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_JUNK ? TRUE : FALSE;
-			break;
-		case CAMEL_IMAP_STORE_FILTER_JUNK_INBOX:
-			*args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_JUNK_INBOX ? TRUE : FALSE;
-			break;
-		default:
-			/* error? */
-			break;
-		}
-	}
-
-	return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->getv (object, ex, args);
-}
-
 static gchar *
 imap_get_name (CamelService *service, gboolean brief)
 {
@@ -1667,12 +1539,13 @@ imap_get_trash(CamelStore *store, CamelException *ex)
 	CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_trash(store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Trash.cmeta", NULL);
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
@@ -1684,12 +1557,13 @@ imap_get_junk(CamelStore *store, CamelException *ex)
 	CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_junk(store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Junk.cmeta", NULL);
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h
index e24c244..a8b18a2 100644
--- a/camel/providers/imap/camel-imap-store.h
+++ b/camel/providers/imap/camel-imap-store.h
@@ -73,7 +73,7 @@ G_END_DECLS
 
 G_BEGIN_DECLS
 
-enum {
+/*enum {
 	CAMEL_IMAP_STORE_ARG_FIRST  = CAMEL_OFFLINE_STORE_ARG_FIRST + 100,
 	CAMEL_IMAP_STORE_ARG_NAMESPACE,
 	CAMEL_IMAP_STORE_ARG_OVERRIDE_NAMESPACE,
@@ -82,7 +82,7 @@ enum {
 	CAMEL_IMAP_STORE_ARG_FILTER_JUNK,
 	CAMEL_IMAP_STORE_ARG_FILTER_JUNK_INBOX,
 	CAMEL_IMAP_STORE_ARG_CHECK_LSUB
-};
+};*/
 
 #define CAMEL_IMAP_STORE_NAMESPACE           (CAMEL_IMAP_STORE_ARG_NAMESPACE | CAMEL_ARG_STR)
 #define CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE  (CAMEL_IMAP_STORE_ARG_OVERRIDE_NAMESPACE | CAMEL_ARG_INT)
diff --git a/camel/providers/imap/camel-imap-summary.c b/camel/providers/imap/camel-imap-summary.c
index afc22e7..d05e058 100644
--- a/camel/providers/imap/camel-imap-summary.c
+++ b/camel/providers/imap/camel-imap-summary.c
@@ -154,17 +154,22 @@ uid_compare (gconstpointer va, gconstpointer vb)
  * Returns: A new CamelImapSummary object.
  **/
 CamelFolderSummary *
-camel_imap_summary_new (struct _CamelFolder *folder, const gchar *filename)
+camel_imap_summary_new (CamelFolder *folder, const gchar *filename)
 {
+	CamelStore *parent_store;
 	CamelFolderSummary *summary;
 	CamelException ex;
 	camel_exception_init (&ex);
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	summary = g_object_new (CAMEL_TYPE_IMAP_SUMMARY, NULL);
 	summary->folder = folder;
 	/* Don't do DB sort. Its pretty slow to load */
 	if (folder && 0) {
-		camel_db_set_collate (folder->parent_store->cdb_r, "uid", "imap_uid_sort", (CamelDBCollate)sort_uid_cmp);
+		camel_db_set_collate (
+			parent_store->cdb_r, "uid", "imap_uid_sort",
+			(CamelDBCollate) sort_uid_cmp);
 		summary->sort_by = "uid";
 		summary->collate = "imap_uid_sort";
 	}
diff --git a/camel/providers/imap/camel-imap-wrapper.c b/camel/providers/imap/camel-imap-wrapper.c
index ce42c85..cb32cb5 100644
--- a/camel/providers/imap/camel-imap-wrapper.c
+++ b/camel/providers/imap/camel-imap-wrapper.c
@@ -160,9 +160,10 @@ camel_imap_wrapper_new (CamelImapFolder *imap_folder,
 	CamelStream *stream;
 	gboolean sync_offline = FALSE;
 
-	store = CAMEL_FOLDER (imap_folder)->parent_store;
-	sync_offline = (camel_url_get_param (((CamelService *) store)->url, "sync_offline") != NULL ||
-					((CamelOfflineFolder *)imap_folder)->sync_offline);
+	store = camel_folder_get_parent_store (CAMEL_FOLDER (imap_folder));
+	sync_offline =
+		camel_url_get_param (((CamelService *) store)->url, "sync_offline") != NULL ||
+		camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (imap_folder));
 
 	imap_wrapper = g_object_new (CAMEL_TYPE_IMAP_WRAPPER, NULL);
 	camel_data_wrapper_set_mime_type_field (CAMEL_DATA_WRAPPER (imap_wrapper), type);
diff --git a/camel/providers/imapx/camel-imapx-folder.c b/camel/providers/imapx/camel-imapx-folder.c
index 1390485..24ee68a 100644
--- a/camel/providers/imapx/camel-imapx-folder.c
+++ b/camel/providers/imapx/camel-imapx-folder.c
@@ -58,8 +58,11 @@ camel_imapx_folder_new(CamelStore *store, const gchar *folder_dir, const gchar *
 	else
 		short_name = folder_name;
 
-	folder = g_object_new (CAMEL_TYPE_IMAPX_FOLDER, NULL);
-	camel_folder_construct(folder, store, folder_name, short_name);
+	folder = g_object_new (
+		CAMEL_TYPE_IMAPX_FOLDER,
+		"name", short_name,
+		"full_name", folder_name,
+		"parent-store", store, NULL);
 	ifolder = (CamelIMAPXFolder *) folder;
 
 	((CamelIMAPXFolder *)folder)->raw_name = g_strdup(folder_name);
@@ -82,9 +85,9 @@ camel_imapx_folder_new(CamelStore *store, const gchar *folder_dir, const gchar *
 	}
 
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
-	camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
 	g_free(state_file);
-	camel_object_state_read(folder);
+	camel_object_state_read (CAMEL_OBJECT (folder));
 
 	ifolder->search = camel_folder_search_new ();
 	ifolder->search_lock = g_mutex_new ();
@@ -144,7 +147,11 @@ imapx_folder_finalize (GObject *object)
 static gboolean
 imapx_refresh_info (CamelFolder *folder, CamelException *ex)
 {
-	CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *istore;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	istore = CAMEL_IMAPX_STORE (parent_store);
 
 	if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
@@ -159,7 +166,11 @@ imapx_refresh_info (CamelFolder *folder, CamelException *ex)
 static gboolean
 imapx_expunge (CamelFolder *folder, CamelException *ex)
 {
-	CamelIMAPXStore *is = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *is;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	is = CAMEL_IMAPX_STORE (parent_store);
 
 	if (CAMEL_OFFLINE_STORE (is)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
@@ -173,9 +184,13 @@ imapx_expunge (CamelFolder *folder, CamelException *ex)
 static gboolean
 imapx_sync (CamelFolder *folder, gboolean expunge, CamelException *ex)
 {
-	CamelIMAPXStore *is = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *is;
 	CamelException eex = CAMEL_EXCEPTION_INITIALISER;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	is = CAMEL_IMAPX_STORE (parent_store);
+
 	if (CAMEL_OFFLINE_STORE (is)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
 
@@ -202,11 +217,15 @@ imapx_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
 	CamelMimeMessage *msg = NULL;
 	CamelStream *stream = NULL;
-	CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *istore;
 	CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder;
 	const gchar *path = NULL;
 	gboolean offline_message = FALSE;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	istore = CAMEL_IMAPX_STORE (parent_store);
+
 	if (!strchr (uid, '-'))
 		path = "cur";
 	else {
@@ -250,7 +269,11 @@ imapx_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
 static gboolean
 imapx_sync_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
-	CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *istore;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	istore = CAMEL_IMAPX_STORE (parent_store);
 
 	if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
@@ -266,7 +289,11 @@ imapx_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 		      CamelFolder *dest, GPtrArray **transferred_uids,
 		      gboolean delete_originals, CamelException *ex)
 {
-	CamelIMAPXStore *istore = (CamelIMAPXStore *) source->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *istore;
+
+	parent_store = camel_folder_get_parent_store (source);
+	istore = CAMEL_IMAPX_STORE (parent_store);
 
 	if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
@@ -282,7 +309,11 @@ imapx_transfer_messages_to (CamelFolder *source, GPtrArray *uids,
 static gboolean
 imapx_append_message(CamelFolder *folder, CamelMimeMessage *message, const CamelMessageInfo *info, gchar **appended_uid, CamelException *ex)
 {
-	CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store;
+	CamelStore *parent_store;
+	CamelIMAPXStore *istore;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	istore = CAMEL_IMAPX_STORE (parent_store);
 
 	if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
 		return TRUE;
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index bc068df..ec5159d 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -500,7 +500,9 @@ imapx_command_addv(CamelIMAPXCommand *ic, const gchar *fmt, va_list ap)
 	CamelSasl *A;
 	gchar buffer[16];
 	CamelFolder *folder;
+	CamelStore *parent_store;
 	gchar *fname = NULL, *encoded = NULL;
+	const gchar *full_name;
 	CamelException ex = CAMEL_EXCEPTION_INITIALISER;
 
 	c(printf("adding command, fmt = '%s'\n", fmt));
@@ -603,12 +605,14 @@ imapx_command_addv(CamelIMAPXCommand *ic, const gchar *fmt, va_list ap)
 				case 'f': /* imap folder name */
 					folder = va_arg(ap, CamelFolder *);
 					c(printf("got folder '%s'\n", s));
-					fname = camel_imapx_store_summary_full_from_path(((CamelIMAPXStore *) folder->parent_store)->summary, folder->full_name);
+					full_name = camel_folder_get_full_name (folder);
+					parent_store = camel_folder_get_parent_store (folder);
+					fname = camel_imapx_store_summary_full_from_path(((CamelIMAPXStore *) parent_store)->summary, full_name);
 					if (fname) {
 						encoded = camel_utf8_utf7(fname);
 						g_free (fname);
 					} else
-						encoded = camel_utf8_utf7 (folder->full_name);
+						encoded = camel_utf8_utf7 (full_name);
 
 					camel_stream_printf((CamelStream *)ic->mem, "\"%s\"", encoded?encoded:"");
 
@@ -811,7 +815,7 @@ imapx_command_start_next(CamelIMAPXServer *is, CamelException *ex)
 	c(printf("** Starting next command\n"));
 	if (is->literal != NULL || is->select_pending != NULL) {
 		c(if (is->select_pending))
-			c(printf("* no, waiting for literal/pending select '%s'\n", is->select_pending->full_name));
+			c(printf("* no, waiting for literal/pending select '%s'\n", camel_folder_get_full_name (is->select_pending)));
 
 		/* TODO prolly start the store operations which do not require any folder to be selected */
 		return;
@@ -974,9 +978,13 @@ found:
 static gboolean
 imapx_job_matches (const gchar *folder_name, CamelIMAPXJob *job, guint32 type, const gchar *uid)
 {
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (job->folder);
+
 	switch (job->type) {
 		case IMAPX_JOB_GET_MESSAGE:
-			if (folder_name	&& strcmp(job->folder->full_name, folder_name) == 0
+			if (folder_name	&& strcmp(full_name, folder_name) == 0
 					&& strcmp(job->u.get_message.uid, uid) == 0)
 				return TRUE;
 			break;
@@ -985,7 +993,7 @@ imapx_job_matches (const gchar *folder_name, CamelIMAPXJob *job, guint32 type, c
 		case IMAPX_JOB_SYNC_CHANGES:
 		case IMAPX_JOB_EXPUNGE:
 			if (folder_name
-					&& strcmp(job->folder->full_name, folder_name) == 0)
+					&& strcmp(full_name, folder_name) == 0)
 				return TRUE;
 			break;
 		case IMAPX_JOB_LIST:
@@ -1117,7 +1125,10 @@ imapx_untagged(CamelIMAPXServer *imap, CamelException *ex)
 			camel_folder_change_info_remove_uid (imap->changes, uid);
 
 			if (imapx_idle_supported (imap) && imapx_in_idle (imap)) {
-				camel_db_delete_uids (imap->store->cdb_w, imap->select_folder->full_name, imap->expunged, NULL);
+				const gchar *full_name;
+
+				full_name = camel_folder_get_full_name (imap->select_folder);
+				camel_db_delete_uids (imap->store->cdb_w, full_name, imap->expunged, NULL);
 				imapx_update_store_summary (imap->select_folder);
 				camel_object_trigger_event(imap->select_folder, "folder_changed", imap->changes);
 
@@ -1568,8 +1579,12 @@ imapx_completion(CamelIMAPXServer *imap, guchar *token, gint len, CamelException
 	if (camel_folder_change_info_changed (imap->changes)) {
 		if (imap->changes->uid_changed->len)
 			camel_folder_summary_save_to_db (imap->select_folder->summary, NULL);
-		else
-			camel_db_delete_uids (imap->store->cdb_w, imap->select_folder->full_name, imap->expunged, NULL);
+		else {
+			const gchar *full_name;
+
+			full_name = camel_folder_get_full_name (imap->select_folder);
+			camel_db_delete_uids (imap->store->cdb_w, full_name, imap->expunged, NULL);
+		}
 
 		if (imap->expunged) {
 			g_slist_foreach (imap->expunged, (GFunc) g_free, NULL);
@@ -1796,8 +1811,11 @@ imapx_job_idle_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 {
 	CamelIMAPXCommand *ic;
 	CamelIMAPXCommandPart *cp;
+	const gchar *full_name;
 
-	ic = camel_imapx_command_new ("IDLE", job->folder->full_name, "IDLE");
+	full_name = camel_folder_get_full_name (job->folder);
+
+	ic = camel_imapx_command_new ("IDLE", full_name, "IDLE");
 	ic->job = job;
 	ic->pri = job->pri;
 	ic->complete = imapx_command_idle_done;
@@ -1977,6 +1995,7 @@ imapx_idle_supported (CamelIMAPXServer *is)
 static void
 imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 {
+	const gchar *full_name;
 
 	if (camel_exception_is_set (ic->ex) || ic->status->result != IMAPX_OK) {
 		CamelDList failed;
@@ -1991,7 +2010,8 @@ imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 
 		if (is->select_pending) {
 			while (cn) {
-				if (cw->select && strcmp(cw->select, is->select_pending->full_name) == 0) {
+				full_name = camel_folder_get_full_name (is->select_pending);
+				if (cw->select && strcmp(cw->select, full_name) == 0) {
 					camel_dlist_remove((CamelDListNode *)cw);
 					camel_dlist_addtail(&failed, (CamelDListNode *)cw);
 				}
@@ -2021,8 +2041,10 @@ imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 		CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) is->select_pending;
 		c(printf("Select ok!\n"));
 
+		full_name = camel_folder_get_full_name (is->select_folder);
+
 		is->select_folder = is->select_pending;
-		is->select = g_strdup(is->select_folder->full_name);
+		is->select = g_strdup(full_name);
 		is->state = IMAPX_SELECTED;
 		ifolder->exists_on_server = is->exists;
 #if 0
@@ -2047,6 +2069,9 @@ static void
 imapx_select (CamelIMAPXServer *is, CamelFolder *folder, gboolean forced, CamelException *ex)
 {
 	CamelIMAPXCommand *ic;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
 
 	/* Select is complicated by the fact we may have commands
 	   active on the server for a different selection.
@@ -2063,7 +2088,7 @@ imapx_select (CamelIMAPXServer *is, CamelFolder *folder, gboolean forced, CamelE
 	if (is->select_pending)
 		return;
 
-	if (is->select && strcmp(is->select, folder->full_name) == 0 && !forced)
+	if (is->select && strcmp(is->select, full_name) == 0 && !forced)
 		return;
 
 	if (!camel_dlist_empty(&is->active))
@@ -2403,6 +2428,7 @@ static void
 imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 {
 	CamelIMAPXJob *job = ic->job;
+	const gchar *full_name;
 	gboolean failed = FALSE;
 
 	/* We either have more to fetch (partial mode?), we are complete,
@@ -2411,6 +2437,8 @@ imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 
 	job->commands--;
 
+	full_name = camel_folder_get_full_name (job->folder);
+
 	if (camel_exception_is_set (ic->ex) || ic->status->result != IMAPX_OK) {
 		failed = TRUE;
 		job->u.get_message.body_len = -1;
@@ -2421,7 +2449,7 @@ imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 			if (job->op)
 				camel_operation_progress (job->op, (job->u.get_message.fetch_offset *100)/job->u.get_message.size);
 
-			ic = camel_imapx_command_new("FETCH", job->folder->full_name,
+			ic = camel_imapx_command_new("FETCH", full_name,
 					"UID FETCH %t (BODY.PEEK[]", job->u.get_message.uid);
 			camel_imapx_command_add(ic, "<%u.%u>", job->u.get_message.fetch_offset, MULTI_SIZE);
 			camel_imapx_command_add(ic, ")");
@@ -2483,11 +2511,14 @@ static void
 imapx_job_get_message_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 {
 	CamelIMAPXCommand *ic;
+	const gchar *full_name;
 	gint i;
 
+	full_name = camel_folder_get_full_name (job->folder);
+
 	if (job->u.get_message.use_multi_fetch) {
 		for (i=0; i < 3 && job->u.get_message.fetch_offset < job->u.get_message.size;i++) {
-			ic = camel_imapx_command_new("FETCH", job->folder->full_name,
+			ic = camel_imapx_command_new("FETCH", full_name,
 					"UID FETCH %t (BODY.PEEK[]", job->u.get_message.uid);
 			camel_imapx_command_add(ic, "<%u.%u>", job->u.get_message.fetch_offset, MULTI_SIZE);
 			camel_imapx_command_add(ic, ")");
@@ -2499,7 +2530,7 @@ imapx_job_get_message_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 			imapx_command_queue(is, ic);
 		}
 	} else {
-		ic = camel_imapx_command_new("FETCH", job->folder->full_name,
+		ic = camel_imapx_command_new("FETCH", full_name,
 				"UID FETCH %t (BODY.PEEK[])", job->u.get_message.uid);
 		ic->complete = imapx_command_fetch_message_done;
 		ic->job = job;
@@ -2516,9 +2547,12 @@ imapx_command_copy_messages_step_start (CamelIMAPXServer *is, CamelIMAPXJob *job
 {
 	CamelIMAPXCommand *ic;
 	GPtrArray *uids = job->u.copy_messages.uids;
+	const gchar *full_name;
 	gint i = index;
 
-	ic = camel_imapx_command_new ("COPY", job->folder->full_name, "UID COPY ");
+	full_name = camel_folder_get_full_name (job->folder);
+
+	ic = camel_imapx_command_new ("COPY", full_name, "UID COPY ");
 	ic->complete = imapx_command_copy_messages_step_done;
 	ic->job = job;
 	ic->pri = job->pri;
@@ -2777,9 +2811,12 @@ imapx_command_step_fetch_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 	camel_folder_change_info_clear(job->u.refresh_info.changes);
 
 	if (i<infos->len) {
+		const gchar *full_name;
+
 		camel_imapx_command_free (ic);
 
-		ic = camel_imapx_command_new("FETCH", job->folder->full_name, "UID FETCH ");
+		full_name = camel_folder_get_full_name (job->folder);
+		ic = camel_imapx_command_new("FETCH", full_name, "UID FETCH ");
 		ic->complete = imapx_command_step_fetch_done;
 		ic->job = job;
 		ic->pri = job->pri - 1;
@@ -2950,7 +2987,10 @@ imapx_job_scan_changes_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 		}
 
 		if (removed) {
-			camel_db_delete_uids (is->store->cdb_w, s->folder->full_name, removed, NULL);
+			const gchar *full_name;
+
+			full_name = camel_folder_get_full_name (s->folder);
+			camel_db_delete_uids (is->store->cdb_w, full_name, removed, NULL);
 			g_slist_foreach (removed, (GFunc) g_free, NULL);
 			g_slist_free (removed);
 		}
@@ -2965,7 +3005,9 @@ imapx_job_scan_changes_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 
 		/* If we have any new messages, download their headers, but only a few (100?) at a time */
 		if (fetch_new) {
-			camel_operation_start (job->op, _("Fetching summary information for new messages in %s"), job->folder->name);
+			camel_operation_start (
+				job->op, _("Fetching summary information for new messages in %s"),
+				camel_folder_get_name (job->folder));
 			imapx_uidset_init(&job->u.refresh_info.uidset, BATCH_FETCH_COUNT, 0);
 			/* command will be free'ed in step_fetch_done */
 			imapx_command_step_fetch_done(is, ic);
@@ -2993,10 +3035,15 @@ static void
 imapx_job_scan_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 {
 	CamelIMAPXCommand *ic;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (job->folder);
 
-	camel_operation_start (job->op, _("Scanning for changed messages in %s"), job->folder->name);
+	camel_operation_start (
+		job->op, _("Scanning for changed messages in %s"),
+		camel_folder_get_name (job->folder));
 
-	ic = camel_imapx_command_new ("FETCH", job->folder->full_name,
+	ic = camel_imapx_command_new ("FETCH", full_name,
 				     "FETCH 1:* (UID FLAGS)");
 	ic->job = job;
 	ic->complete = imapx_job_scan_changes_done;
@@ -3040,9 +3087,12 @@ imapx_job_fetch_new_messages_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 	CamelIMAPXCommand *ic;
 	CamelFolder *folder = job->folder;
 	CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder;
+	const gchar *full_name;
 	guint32 total, diff;
 	gchar *uid = NULL;
 
+	full_name = camel_folder_get_full_name (folder);
+
 	total = camel_folder_summary_count (folder->summary);
 	diff = ifolder->exists_on_server - total;
 
@@ -3051,17 +3101,19 @@ imapx_job_fetch_new_messages_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 	else
 		uid = g_strdup ("1");
 
-	camel_operation_start (job->op, _("Fetching summary information for new messages in %s"), folder->name);
+	camel_operation_start (
+		job->op, _("Fetching summary information for new messages in %s"),
+		camel_folder_get_name (folder));
 
 	if (diff > BATCH_FETCH_COUNT) {
-		ic = camel_imapx_command_new ("FETCH", job->folder->full_name,
+		ic = camel_imapx_command_new ("FETCH", full_name,
 				     "FETCH %s:* (UID FLAGS)", uid);
 		imapx_uidset_init(&job->u.refresh_info.uidset, BATCH_FETCH_COUNT, 0);
 		job->u.refresh_info.infos = g_array_new (0, 0, sizeof(struct _refresh_info));
 		ic->pri = job->pri;
 		ic->complete = imapx_command_step_fetch_done;
 	} else {
-		ic = camel_imapx_command_new ("FETCH", job->folder->full_name,
+		ic = camel_imapx_command_new ("FETCH", full_name,
 					"UID FETCH %s:* (RFC822.SIZE RFC822.HEADER FLAGS)", uid);
 		ic->pri = job->pri;
 		ic->complete = imapx_command_fetch_new_messages_done;
@@ -3079,6 +3131,9 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 	CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) job->folder;
 	CamelFolder *folder = job->folder;
 	CamelException *ex = job->ex;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
 
 	total = camel_folder_summary_count (folder->summary);
 	/* Check if there are any new messages. The old imap doc says one needs to reselect in case of inbox to fetch
@@ -3109,7 +3164,7 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 		guint32 unread;
 		CamelIMAPXCommand *ic;
 
-		ic = camel_imapx_command_new ("STATUS", folder->full_name, "STATUS %f (MESSAGES UNSEEN)", folder);
+		ic = camel_imapx_command_new ("STATUS", full_name, "STATUS %f (MESSAGES UNSEEN)", folder);
 		ic->job = job;
 		ic->pri = job->pri;
 		ic->complete = imapx_command_status_done;
@@ -3126,7 +3181,7 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job)
 		}
 		camel_imapx_command_free (ic);
 
-		camel_object_get (folder, NULL, CAMEL_FOLDER_UNREAD, &unread, NULL);
+		unread = folder->summary->unread_count;
 		if (ifolder->exists_on_server == total && unread == ifolder->unread_on_server)
 			goto exception;
 	}
@@ -3151,9 +3206,14 @@ imapx_command_expunge_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 	} else {
 		GPtrArray *uids;
 		CamelFolder *folder = ic->job->folder;
+		CamelStore *parent_store;
+		const gchar *full_name;
+
+		full_name = camel_folder_get_full_name (folder);
+		parent_store = camel_folder_get_parent_store (folder);
 
 		camel_folder_summary_save_to_db (folder->summary, ic->job->ex);
-		uids = camel_db_get_folder_deleted_uids (folder->parent_store->cdb_r, folder->full_name, ic->job->ex);
+		uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, ic->job->ex);
 
 		if (uids && uids->len)	{
 			CamelFolderChangeInfo *changes;
@@ -3175,7 +3235,7 @@ imapx_command_expunge_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 				removed = g_slist_prepend (removed, (gpointer) uids->pdata[i]);
 			}
 
-			camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, removed, ic->job->ex);
+			camel_db_delete_uids (parent_store->cdb_w, full_name, removed, ic->job->ex);
 			camel_folder_summary_save_to_db (folder->summary, ic->job->ex);
 			camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes);
 			camel_folder_change_info_free (changes);
@@ -3194,11 +3254,13 @@ static void
 imapx_job_expunge_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 {
 	CamelIMAPXCommand *ic;
+	const gchar *full_name;
 
 	imapx_server_sync_changes (is, job->folder, job->pri, job->ex);
 
 	/* TODO handle UIDPLUS capability */
-	ic = camel_imapx_command_new("EXPUNGE", job->folder->full_name, "EXPUNGE");
+	full_name = camel_folder_get_full_name (job->folder);
+	ic = camel_imapx_command_new("EXPUNGE", full_name, "EXPUNGE");
 	ic->job = job;
 	ic->pri = job->pri;
 	ic->complete = imapx_command_expunge_done;
@@ -3412,11 +3474,12 @@ static void
 imapx_job_noop_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 {
 	CamelIMAPXCommand *ic;
+	const gchar *full_name = NULL;
 
-	if (job->folder)
-		ic = camel_imapx_command_new ("NOOP", job->folder->full_name, "NOOP");
-	else
-		ic = camel_imapx_command_new ("NOOP", NULL, "NOOP");
+	if (job->folder != NULL)
+		full_name = camel_folder_get_full_name (job->folder);
+
+	ic = camel_imapx_command_new ("NOOP", full_name, "NOOP");
 
 	ic->job = job;
 	ic->complete = imapx_command_noop_done;
@@ -3456,10 +3519,15 @@ static void
 imapx_command_sync_changes_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 {
 	CamelIMAPXJob *job = ic->job;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gboolean failed = FALSE;
 
 	job->commands--;
 
+	full_name = camel_folder_get_full_name (job->folder);
+	parent_store = camel_folder_get_parent_store (job->folder);
+
 	/* If this worked, we should really just update the changes that we sucessfully
 	   stored, so we dont have to worry about sending them again ...
 	   But then we'd have to track which uid's we actually updated, so its easier
@@ -3505,20 +3573,20 @@ imapx_command_sync_changes_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic)
 			CamelStoreInfo *si;
 
 			/* ... and store's summary when folder's summary is dirty */
-			si = camel_store_summary_path ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary, job->folder->full_name);
+			si = camel_store_summary_path ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary, full_name);
 			if (si) {
 				if (si->total != job->folder->summary->saved_count || si->unread != job->folder->summary->unread_count) {
 					si->total = job->folder->summary->saved_count;
 					si->unread = job->folder->summary->unread_count;
-					camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary);
+					camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary);
 				}
 
-				camel_store_summary_info_free ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary, si);
+				camel_store_summary_info_free ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary, si);
 			}
 		}
 
 		camel_folder_summary_save_to_db (job->folder->summary, job->ex);
-		camel_store_summary_save((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary);
+		camel_store_summary_save((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary);
 
 		imapx_job_done (is, job);
 	}
@@ -3531,8 +3599,11 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 	guint32 i, j;
 	struct _uidset_state ss;
 	GPtrArray *uids = job->u.sync_changes.changed_uids;
+	const gchar *full_name;
 	gint on;
 
+	full_name = camel_folder_get_full_name (job->folder);
+
 	for (on=0;on<2;on++) {
 		guint32 orset = on?job->u.sync_changes.on_set:job->u.sync_changes.off_set;
 		GArray *user_set = on?job->u.sync_changes.on_user:job->u.sync_changes.off_user;
@@ -3563,7 +3634,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 				if ( (on && (((flags ^ sflags) & flags) & flag))
 				     || (!on && (((flags ^ sflags) & ~flags) & flag))) {
 					if (ic == NULL) {
-						ic = camel_imapx_command_new("STORE", job->folder->full_name, "UID STORE ");
+						ic = camel_imapx_command_new("STORE", full_name, "UID STORE ");
 						ic->complete = imapx_command_sync_changes_done;
 						ic->job = job;
 						ic->pri = job->pri;
@@ -3591,7 +3662,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
 					CamelIMAPXMessageInfo *info = c->infos->pdata[i];
 
 					if (ic == NULL) {
-						ic = camel_imapx_command_new("STORE", job->folder->full_name, "UID STORE ");
+						ic = camel_imapx_command_new("STORE", full_name, "UID STORE ");
 						ic->complete = imapx_command_sync_changes_done;
 						ic->job = job;
 						ic->pri = job->pri;
@@ -3946,8 +4017,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat
 	gchar *cache_file = NULL;
 	CamelMessageInfo *mi;
 	gboolean registered;
+	const gchar *full_name;
 	EFlag *flag = NULL;
 
+	full_name = camel_folder_get_full_name (folder);
+
 	cache_file = camel_data_cache_get_filename  (ifolder->cache, "cur", uid, NULL);
 	if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) {
 		g_free (cache_file);
@@ -3957,7 +4031,7 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat
 
 	QUEUE_LOCK (is);
 
-	if ((job = imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_GET_MESSAGE, uid))) {
+	if ((job = imapx_is_job_in_queue (is, full_name, IMAPX_JOB_GET_MESSAGE, uid))) {
 		flag = g_hash_table_lookup (is->uid_eflags, uid);
 	
 		if (pri > job->pri)
@@ -4163,10 +4237,13 @@ camel_imapx_server_refresh_info (CamelIMAPXServer *is, CamelFolder *folder, Came
 {
 	CamelIMAPXJob *job;
 	gboolean registered = TRUE;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
 
 	QUEUE_LOCK (is);
 
-	if (imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_REFRESH_INFO, NULL)) {
+	if (imapx_is_job_in_queue (is, full_name, IMAPX_JOB_REFRESH_INFO, NULL)) {
 		QUEUE_UNLOCK (is);
 		return;
 	}
@@ -4180,7 +4257,7 @@ camel_imapx_server_refresh_info (CamelIMAPXServer *is, CamelFolder *folder, Came
 	job->u.refresh_info.changes = camel_folder_change_info_new();
 	job->pri = IMAPX_PRIORITY_REFRESH_INFO;
 
-	if (g_ascii_strcasecmp(folder->full_name, "INBOX") == 0)
+	if (g_ascii_strcasecmp(full_name, "INBOX") == 0)
 		job->pri += 10;
 
 	registered = imapx_register_job (is, job);
@@ -4231,8 +4308,11 @@ imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, gint pri, C
 	GArray *on_user = NULL, *off_user = NULL;
 	CamelIMAPXMessageInfo *info;
 	CamelIMAPXJob *job;
+	const gchar *full_name;
 	gboolean registered;
 
+	full_name = camel_folder_get_full_name (folder);
+
 	/* We calculate two masks, a mask of all flags which have been
 	   turned off and a mask of all flags which have been turned
 	   on. If either of these aren't 0, then we have work to do,
@@ -4338,7 +4418,7 @@ imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, gint pri, C
 
 	QUEUE_LOCK (is);
 
-	if ((job = imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_SYNC_CHANGES, NULL))) {
+	if ((job = imapx_is_job_in_queue (is, full_name, IMAPX_JOB_SYNC_CHANGES, NULL))) {
 		if (pri > job->pri)
 			job->pri = pri;
 
@@ -4386,11 +4466,14 @@ camel_imapx_server_expunge(CamelIMAPXServer *is, CamelFolder *folder, CamelExcep
 {
 	CamelIMAPXJob *job;
 	gboolean registered;
+	const gchar *full_name;
+
+	full_name = camel_folder_get_full_name (folder);
 
 	/* Do we really care to wait for this one to finish? */
 	QUEUE_LOCK (is);
 
-	if (imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_EXPUNGE, NULL)) {
+	if (imapx_is_job_in_queue (is, full_name, IMAPX_JOB_EXPUNGE, NULL)) {
 		QUEUE_UNLOCK (is);
 		return;
 	}
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index b766778..007cfb4 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -246,12 +246,13 @@ imapx_get_junk(CamelStore *store, CamelException *ex)
 	folder = store_class->get_junk (store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = g_build_filename(((CamelIMAPXStore *)store)->storage_path, "system", "Junk.cmeta", NULL);
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
@@ -267,12 +268,13 @@ imapx_get_trash (CamelStore *store, CamelException *ex)
 	folder = store_class->get_trash (store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = g_build_filename(((CamelIMAPXStore *)store)->storage_path, "system", "Trash.cmeta", NULL);
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
diff --git a/camel/providers/imapx/camel-imapx-summary.c b/camel/providers/imapx/camel-imapx-summary.c
index 5fd38f2..38e726c 100644
--- a/camel/providers/imapx/camel-imapx-summary.c
+++ b/camel/providers/imapx/camel-imapx-summary.c
@@ -158,18 +158,21 @@ uid_compare (gconstpointer va, gconstpointer vb)
  * Returns: A new CamelIMAPXSummary object.
  **/
 CamelFolderSummary *
-camel_imapx_summary_new (struct _CamelFolder *folder, const gchar *filename)
+camel_imapx_summary_new (CamelFolder *folder, const gchar *filename)
 {
+	CamelStore *parent_store;
 	CamelFolderSummary *summary;
 	CamelException ex;
 	camel_exception_init (&ex);
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	summary = g_object_new (CAMEL_TYPE_IMAPX_SUMMARY, NULL);
 
 	summary->folder = folder;
 	/* Don't do DB sort. Its pretty slow to load */
 	if (folder && 0) {
-		camel_db_set_collate (folder->parent_store->cdb_r, "uid", "imapx_uid_sort", (CamelDBCollate)sort_uid_cmp);
+		camel_db_set_collate (parent_store->cdb_r, "uid", "imapx_uid_sort", (CamelDBCollate)sort_uid_cmp);
 		summary->sort_by = "uid";
 		summary->collate = "imapx_uid_sort";
 	}
diff --git a/camel/providers/imapx/camel-imapx-utils.c b/camel/providers/imapx/camel-imapx-utils.c
index 569ceab..386d97f 100644
--- a/camel/providers/imapx/camel-imapx-utils.c
+++ b/camel/providers/imapx/camel-imapx-utils.c
@@ -347,18 +347,25 @@ void
 imapx_update_store_summary (CamelFolder *folder)
 {
 	CamelStoreInfo *si;
+	CamelStore *parent_store;
+	const gchar *full_name;
 
-	si = camel_store_summary_path ((CamelStoreSummary *) ((CamelIMAPXStore *) folder->parent_store)->summary, folder->full_name);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	si = camel_store_summary_path ((CamelStoreSummary *) ((CamelIMAPXStore *) parent_store)->summary, full_name);
 	if (si) {
 		guint32 unread, total;
 
-		camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL);
+		total = camel_folder_summary_count (folder->summary);
+		unread = folder->summary->unread_count;
+
 		if (si->unread != unread || si->total != total) {
 			si->unread = unread;
 			si->total = total;
 
-			camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) folder->parent_store)->summary);
-			camel_store_summary_save ((CamelStoreSummary *)((CamelIMAPXStore *) folder->parent_store)->summary);
+			camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary);
+			camel_store_summary_save ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary);
 		}
 	}
 }
diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c
index d9f903c..0884c19 100644
--- a/camel/providers/local/camel-local-folder.c
+++ b/camel/providers/local/camel-local-folder.c
@@ -55,10 +55,12 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_LOCAL_FOLDER, CamelLocalFolderPrivate))
 
-static GSList *local_folder_properties;
-
-static gint local_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args);
-static gint local_setv(CamelObject *object, CamelException *ex, CamelArgV *args);
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+	PROP_0,
+	PROP_INDEX_BODY = 0x2400
+};
 
 static gint local_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex);
 static void local_unlock(CamelLocalFolder *lf);
@@ -77,13 +79,43 @@ static GPtrArray * local_get_uncached_uids (CamelFolder *folder, GPtrArray * uid
 static void local_delete(CamelFolder *folder);
 static void local_rename(CamelFolder *folder, const gchar *newname);
 
-static CamelProperty local_property_list[] = {
-	{ CAMEL_LOCAL_FOLDER_INDEX_BODY, "index_body", N_("Index message body data") },
-};
-
 G_DEFINE_TYPE (CamelLocalFolder, camel_local_folder, CAMEL_TYPE_FOLDER)
 
 static void
+local_folder_set_property (GObject *object,
+                           guint property_id,
+                           const GValue *value,
+                           GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_INDEX_BODY:
+			camel_local_folder_set_index_body (
+				CAMEL_LOCAL_FOLDER (object),
+				g_value_get_boolean (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+local_folder_get_property (GObject *object,
+                           guint property_id,
+                           GValue *value,
+                           GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_INDEX_BODY:
+			g_value_set_boolean (
+				value, camel_local_folder_get_index_body (
+				CAMEL_LOCAL_FOLDER (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
 local_folder_dispose (GObject *object)
 {
 	CamelFolder *folder;
@@ -138,22 +170,83 @@ local_folder_finalize (GObject *object)
 }
 
 static void
+local_folder_constructed (GObject *object)
+{
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelURL *url;
+	const gchar *full_name;
+	const gchar *tmp;
+	gchar *description;
+	gchar *path;
+
+	folder = CAMEL_FOLDER (object);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	url = CAMEL_SERVICE (parent_store)->url;
+	if (url->path == NULL)
+		return;
+
+	path = g_strdup_printf ("%s/%s", url->path, full_name);
+
+	if ((tmp = getenv ("HOME")) && strncmp (tmp, path, strlen (tmp)) == 0)
+		/* Translators: This is used for a folder description,
+		 * for folders being under $HOME.  The first %s is replaced
+		 * with a relative path under $HOME, the second %s is
+		 * replaced with a protocol name, like mbox/maldir/... */
+		description = g_strdup_printf (
+			_("~%s (%s)"),
+			path + strlen (tmp),
+			url->protocol);
+	else if ((tmp = "/var/spool/mail") && strncmp (tmp, path, strlen (tmp)) == 0)
+		/* Translators: This is used for a folder description, for
+		 * folders being under /var/spool/mail.  The first %s is
+		 * replaced with a relative path under /var/spool/mail,
+		 * the second %s is replaced with a protocol name, like
+		 * mbox/maldir/... */
+		description = g_strdup_printf (
+			_("mailbox: %s (%s)"),
+			path + strlen (tmp),
+			url->protocol);
+	else if ((tmp = "/var/mail") && strncmp (tmp, path, strlen (tmp)) == 0)
+		/* Translators: This is used for a folder description, for
+		 * folders being under /var/mail.  The first %s is replaced
+		 * with a relative path under /var/mail, the second %s is
+		 * replaced with a protocol name, like mbox/maldir/... */
+		description = g_strdup_printf (
+			_("mailbox: %s (%s)"),
+			path + strlen (tmp),
+			url->protocol);
+	else
+		/* Translators: This is used for a folder description.
+		 * The first %s is replaced with a folder's full path,
+		 * the second %s is replaced with a protocol name, like
+		 * mbox/maldir/... */
+		description = g_strdup_printf (
+			_("%s (%s)"), path,
+			url->protocol);
+
+	camel_folder_set_description (folder, description);
+
+	g_free (description);
+	g_free (path);
+}
+
+static void
 camel_local_folder_class_init (CamelLocalFolderClass *class)
 {
 	GObjectClass *object_class;
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
-	gint ii;
 
 	g_type_class_add_private (class, sizeof (CamelLocalFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = local_folder_set_property;
+	object_class->get_property = local_folder_get_property;
 	object_class->dispose = local_folder_dispose;
 	object_class->finalize = local_folder_finalize;
-
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = local_getv;
-	camel_object_class->setv = local_setv;
+	object_class->constructed = local_folder_constructed;
 
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->refresh_info = local_refresh_info;
@@ -170,12 +263,16 @@ camel_local_folder_class_init (CamelLocalFolderClass *class)
 	class->lock = local_lock;
 	class->unlock = local_unlock;
 
-	for (ii = 0; ii < G_N_ELEMENTS (local_property_list); ii++) {
-		local_property_list[ii].description =
-			_(local_property_list[ii].description);
-		local_folder_properties = g_slist_prepend (
-			local_folder_properties, &local_property_list[ii]);
-	}
+	g_object_class_install_property (
+		object_class,
+		PROP_INDEX_BODY,
+		g_param_spec_boolean (
+			"index-body",
+			"Index Body",
+			N_("Index message body data"),
+			FALSE,
+			G_PARAM_READWRITE |
+			CAMEL_PARAM_PERSISTENT));
 }
 
 static void
@@ -199,12 +296,11 @@ camel_local_folder_init (CamelLocalFolder *local_folder)
 }
 
 CamelLocalFolder *
-camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, const gchar *full_name, guint32 flags, CamelException *ex)
+camel_local_folder_construct(CamelLocalFolder *lf, guint32 flags, CamelException *ex)
 {
-	CamelFolderInfo *fi;
 	CamelFolder *folder;
+	CamelFolderInfo *fi;
 	const gchar *root_dir_path;
-	gchar *name;
 	gchar *tmp, *statepath;
 #ifndef G_OS_WIN32
 	gchar folder_path[PATH_MAX];
@@ -212,13 +308,17 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con
 #endif
 	gint forceindex, len;
 	CamelURL *url;
-	CamelLocalStore *ls = (CamelLocalStore *)parent_store;
+	CamelLocalStore *ls;
+	CamelStore *parent_store;
+	const gchar *full_name;
+	const gchar *name;
 
-	folder = (CamelFolder *)lf;
+	folder = CAMEL_FOLDER (lf);
+	name = camel_folder_get_name (folder);
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
 
-	name = g_path_get_basename(full_name);
-
-	camel_folder_construct(folder, parent_store, full_name, name);
+	ls = CAMEL_LOCAL_STORE (parent_store);
 
 	root_dir_path = camel_local_store_get_toplevel_dir(ls);
 	/* strip the trailing '/' which is always present */
@@ -235,15 +335,15 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con
 	lf->index_path = camel_local_store_get_meta_path(ls, full_name, ".ibex");
 	statepath = camel_local_store_get_meta_path(ls, full_name, ".cmeta");
 
-	camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, statepath, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (lf), statepath);
 	g_free(statepath);
 
 	lf->flags = flags;
 
-	if (camel_object_state_read(lf) == -1) {
+	if (camel_object_state_read (CAMEL_OBJECT (lf)) == -1) {
 		/* No metadata - load defaults and persitify */
-		camel_object_set(lf, NULL, CAMEL_LOCAL_FOLDER_INDEX_BODY, TRUE, 0);
-		camel_object_state_write(lf);
+		camel_local_folder_set_index_body (lf, TRUE);
+		camel_object_state_write (CAMEL_OBJECT (lf));
 	}
 #ifndef G_OS_WIN32
 	/* follow any symlinks to the mailbox */
@@ -291,7 +391,6 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con
 			/* we sync here so that any hard work setting up the folder isn't lost */
 			if (camel_local_summary_sync((CamelLocalSummary *)folder->summary, FALSE, lf->changes, ex) == -1) {
 				g_object_unref (CAMEL_OBJECT (folder));
-				g_free(name);
 				return NULL;
 			}
 		}
@@ -325,10 +424,32 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con
 		camel_object_trigger_event(CAMEL_OBJECT (parent_store), "folder_created", fi);
 		camel_folder_info_free(fi);
 	}
-	g_free(name);
+
 	return lf;
 }
 
+gboolean
+camel_local_folder_get_index_body (CamelLocalFolder *local_folder)
+{
+	g_return_val_if_fail (CAMEL_IS_LOCAL_FOLDER (local_folder), FALSE);
+
+	return (local_folder->flags & CAMEL_STORE_FOLDER_BODY_INDEX);
+}
+
+void
+camel_local_folder_set_index_body (CamelLocalFolder *local_folder,
+                                   gboolean index_body)
+{
+	g_return_if_fail (CAMEL_IS_LOCAL_FOLDER (local_folder));
+
+	if (index_body)
+		local_folder->flags |= CAMEL_STORE_FOLDER_BODY_INDEX;
+	else
+		local_folder->flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX;
+
+	g_object_notify (G_OBJECT (local_folder), "index-body");
+}
+
 /* lock the folder, may be called repeatedly (with matching unlock calls),
    with type the same or less than the first call */
 gint camel_local_folder_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex)
@@ -359,117 +480,6 @@ gint camel_local_folder_unlock(CamelLocalFolder *lf)
 }
 
 static gint
-local_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_OBJECT_ARG_DESCRIPTION:
-			if (folder->description == NULL) {
-				const gchar *tmp;
-				gchar *path;
-
-				/* check some common prefixes to shorten the name */
-				tmp = ((CamelService *)folder->parent_store)->url->path;
-				if (tmp == NULL)
-					goto skip;
-
-				path = g_alloca (strlen (tmp) + strlen (folder->full_name) + 1);
-				sprintf (path, "%s/%s", tmp, folder->full_name);
-
-				if ((tmp = getenv("HOME")) && strncmp(tmp, path, strlen(tmp)) == 0)
-					/* Translators: This is used for a folder description, for folders being under $HOME.
-					   The first %s is replaced with a relative path under $HOME,
-					   the second %s is replaced with a protocol name, like mbox/maldir/... */
-					folder->description = g_strdup_printf(_("~%s (%s)"), path+strlen(tmp),
-									      ((CamelService *)folder->parent_store)->url->protocol);
-				else if ((tmp = "/var/spool/mail") && strncmp(tmp, path, strlen(tmp)) == 0)
-					/* Translators: This is used for a folder description, for folders being under /var/spool/mail.
-					   The first %s is replaced with a relative path under /var/spool/mail,
-					   the second %s is replaced with a protocol name, like mbox/maldir/... */
-					folder->description = g_strdup_printf(_("mailbox: %s (%s)"), path+strlen(tmp),
-									      ((CamelService *)folder->parent_store)->url->protocol);
-				else if ((tmp = "/var/mail") && strncmp(tmp, path, strlen(tmp)) == 0)
-					/* Translators: This is used for a folder description, for folders being under /var/mail.
-					   The first %s is replaced with a relative path under /var/mail,
-					   the second %s is replaced with a protocol name, like mbox/maldir/... */
-					folder->description = g_strdup_printf(_("mailbox: %s (%s)"), path+strlen(tmp),
-									      ((CamelService *)folder->parent_store)->url->protocol);
-				else
-					/* Translators: This is used for a folder description.
-					   The first %s is replaced with a folder's full path,
-					   the second %s is replaced with a protocol name, like mbox/maldir/... */
-					folder->description = g_strdup_printf(_("%s (%s)"), path,
-									      ((CamelService *)folder->parent_store)->url->protocol);
-			}
-			*arg->ca_str = folder->description;
-			break;
-
-		case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES:
-		case CAMEL_FOLDER_ARG_PROPERTIES: {
-			CamelArgGetV props;
-
-			props.argc = 1;
-			props.argv[0] = *arg;
-			((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, ex, &props);
-			*arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(local_folder_properties));
-
-			break; }
-
-		case CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY:
-			/* FIXME: remove this from sotre flags */
-			*arg->ca_int = (((CamelLocalFolder *)folder)->flags & CAMEL_STORE_FOLDER_BODY_INDEX) != 0;
-			break;
-
-		default: skip:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return ((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, ex, args);
-}
-
-static gint
-local_setv(CamelObject *object, CamelException *ex, CamelArgV *args)
-{
-	gint i;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArg *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY:
-			/* FIXME: implement */
-			/* TODO: When turning on (off?) the index, we want to launch a task for it,
-			   and make sure we dont have multiple tasks doing the same job */
-			if (arg->ca_int)
-				((CamelLocalFolder *)object)->flags |= CAMEL_STORE_FOLDER_BODY_INDEX;
-			else
-				((CamelLocalFolder *)object)->flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX;
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return ((CamelObjectClass *)camel_local_folder_parent_class)->setv(object, ex, args);
-}
-
-static gint
 local_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex)
 {
 	return 0;
@@ -517,7 +527,7 @@ local_sync(CamelFolder *folder, gboolean expunge, CamelException *ex)
 	if (camel_local_folder_lock(lf, CAMEL_LOCK_WRITE, ex) == -1)
 		return FALSE;
 
-	camel_object_state_write(lf);
+	camel_object_state_write (CAMEL_OBJECT (lf));
 
 	/* if sync fails, we'll pass it up on exit through ex */
 	camel_local_summary_sync((CamelLocalSummary *)folder->summary, expunge, lf->changes, ex);
@@ -557,7 +567,11 @@ local_rename(CamelFolder *folder, const gchar *newname)
 {
 	CamelLocalFolder *lf = (CamelLocalFolder *)folder;
 	gchar *statepath;
-	CamelLocalStore *ls = (CamelLocalStore *)folder->parent_store;
+	CamelLocalStore *ls;
+	CamelStore *parent_store;
+
+	parent_store = camel_folder_get_parent_store (folder);
+	ls = CAMEL_LOCAL_STORE (parent_store);
 
 	d(printf("renaming local folder paths to '%s'\n", newname));
 
@@ -571,7 +585,7 @@ local_rename(CamelFolder *folder, const gchar *newname)
 	lf->summary_path = camel_local_store_get_meta_path(ls, newname, ".ev-summary");
 	lf->index_path = camel_local_store_get_meta_path(ls, newname, ".ibex");
 	statepath = camel_local_store_get_meta_path(ls, newname, ".cmeta");
-	camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, statepath, NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (lf), statepath);
 	g_free(statepath);
 
 	/* FIXME: Poke some internals, sigh */
diff --git a/camel/providers/local/camel-local-folder.h b/camel/providers/local/camel-local-folder.h
index 4314854..19d405b 100644
--- a/camel/providers/local/camel-local-folder.h
+++ b/camel/providers/local/camel-local-folder.h
@@ -47,16 +47,6 @@
 
 G_BEGIN_DECLS
 
-enum {
-	CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY = CAMEL_FOLDER_ARG_LAST,
-
-	CAMEL_LOCAL_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100
-};
-
-enum {
-	CAMEL_LOCAL_FOLDER_INDEX_BODY = CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY | CAMEL_ARG_BOO
-};
-
 typedef struct _CamelLocalFolder CamelLocalFolder;
 typedef struct _CamelLocalFolderClass CamelLocalFolderClass;
 typedef struct _CamelLocalFolderPrivate CamelLocalFolderPrivate;
@@ -95,19 +85,31 @@ struct _CamelLocalFolderClass {
 	void (*unlock)(CamelLocalFolder *);
 };
 
-/* public methods */
-/* flags are taken from CAMEL_STORE_FOLDER_* flags */
-CamelLocalFolder *camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store,
-					       const gchar *full_name, guint32 flags, CamelException *ex);
+GType		camel_local_folder_get_type	(void);
 
-GType camel_local_folder_get_type(void);
+/* flags are taken from CAMEL_STORE_FOLDER_* flags */
+CamelLocalFolder *
+		camel_local_folder_construct	(CamelLocalFolder *local_folder,
+						 guint32 flags,
+						 CamelException *ex);
+gboolean	camel_local_folder_get_index_body
+						(CamelLocalFolder *local_folder);
+void		camel_local_folder_set_index_body
+						(CamelLocalFolder *local_folder,
+						 gboolean index_body);
 
 /* Lock the folder for internal use.  May be called repeatedly */
 /* UNIMPLEMENTED */
-gint camel_local_folder_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex);
-gint camel_local_folder_unlock(CamelLocalFolder *lf);
-
-void set_cannot_get_message_ex (CamelException *ex, ExceptionId exId, const gchar *msgID, const gchar *folder_path, const gchar *detailErr);
+gint		camel_local_folder_lock		(CamelLocalFolder *local_folder,
+						 CamelLockType type,
+						 CamelException *ex);
+gint		camel_local_folder_unlock	(CamelLocalFolder *local_folder);
+
+void		set_cannot_get_message_ex	(CamelException *ex,
+						 ExceptionId exId,
+						 const gchar *msgID,
+						 const gchar *folder_path,
+						 const gchar *detailErr);
 
 G_END_DECLS
 
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c
index 072407c..83476ee 100644
--- a/camel/providers/local/camel-local-store.c
+++ b/camel/providers/local/camel-local-store.c
@@ -200,12 +200,13 @@ local_get_trash (CamelStore *store,
 	folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_trash (store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = camel_local_store_get_meta_path(store, CAMEL_VTRASH_NAME, ".cmeta");
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
@@ -221,12 +222,13 @@ local_get_junk (CamelStore *store,
 	folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_junk (store, ex);
 
 	if (folder) {
+		CamelObject *object = CAMEL_OBJECT (folder);
 		gchar *state = camel_local_store_get_meta_path(store, CAMEL_VJUNK_NAME, ".cmeta");
 
-		camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL);
+		camel_object_set_state_filename (object, state);
 		g_free(state);
 		/* no defaults? */
-		camel_object_state_read(folder);
+		camel_object_state_read (object);
 	}
 
 	return folder;
@@ -462,8 +464,14 @@ delete_folder (CamelStore *store,
 	str = NULL;
 	camel_exception_init (&lex);
 	if ((lf = camel_store_get_folder (store, folder_name, 0, &lex))) {
-		camel_object_get (lf, NULL, CAMEL_OBJECT_STATE_FILE, &str, NULL);
-		camel_object_set (lf, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL);
+		CamelObject *object = CAMEL_OBJECT (lf);
+		const gchar *state_filename;
+
+		state_filename = camel_object_get_state_filename (object);
+		str = g_strdup (state_filename);
+
+		camel_object_set_state_filename (object, NULL);
+
 		g_object_unref (lf);
 	} else {
 		camel_exception_clear (&lex);
diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c
index ee070d7..dcab594 100644
--- a/camel/providers/local/camel-maildir-folder.c
+++ b/camel/providers/local/camel-maildir-folder.c
@@ -52,47 +52,12 @@ static gboolean maildir_transfer_messages_to (CamelFolder *source, GPtrArray *ui
 
 G_DEFINE_TYPE (CamelMaildirFolder, camel_maildir_folder, CAMEL_TYPE_LOCAL_FOLDER)
 
-static gint
-maildir_folder_getv (CamelObject *object,
-                     CamelException *ex,
-                     CamelArgGetV *args)
-{
-	CamelFolder *folder = (CamelFolder *)object;
-	gint i;
-	guint32 tag;
-
-	for (i=0;i<args->argc;i++) {
-		CamelArgGet *arg = &args->argv[i];
-
-		tag = arg->tag;
-
-		switch (tag & CAMEL_ARG_TAG) {
-		case CAMEL_FOLDER_ARG_NAME:
-			if (!strcmp(folder->full_name, "."))
-				*arg->ca_str = _("Inbox");
-			else
-				*arg->ca_str = folder->name;
-			break;
-		default:
-			continue;
-		}
-
-		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
-	}
-
-	return ((CamelObjectClass *)camel_maildir_folder_parent_class)->getv(object, ex, args);
-}
-
 static void
 camel_maildir_folder_class_init (CamelMaildirFolderClass *class)
 {
-	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 	CamelLocalFolderClass *local_folder_class;
 
-	camel_object_class = CAMEL_OBJECT_CLASS (class);
-	camel_object_class->getv = maildir_folder_getv;
-
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->append_message = maildir_append_message;
 	folder_class->get_message = maildir_get_message;
@@ -117,18 +82,28 @@ camel_maildir_folder_new (CamelStore *parent_store,
                           CamelException *ex)
 {
 	CamelFolder *folder;
+	gchar *basename;
 
 	d(printf("Creating maildir folder: %s\n", full_name));
 
-	folder = g_object_new (CAMEL_TYPE_MAILDIR_FOLDER, NULL);
+	if (g_strcmp0 (full_name, ".") == 0)
+		basename = g_strdup (_("Inbox"));
+	else
+		basename = g_path_get_basename (full_name);
+
+	folder = g_object_new (
+		CAMEL_TYPE_MAILDIR_FOLDER,
+		"name", basename, "full-name", full_name,
+		"parent-store", parent_store, NULL);
 
 	if (parent_store->flags & CAMEL_STORE_FILTER_INBOX
 	    && strcmp(full_name, ".") == 0)
 		folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
 
 	folder = (CamelFolder *) camel_local_folder_construct (
-		CAMEL_LOCAL_FOLDER (folder),
-		parent_store, full_name, flags, ex);
+		CAMEL_LOCAL_FOLDER (folder), flags, ex);
+
+	g_free (basename);
 
 	return folder;
 }
diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c
index faefcac..4bab05f 100644
--- a/camel/providers/local/camel-maildir-summary.c
+++ b/camel/providers/local/camel-maildir-summary.c
@@ -151,7 +151,10 @@ CamelMaildirSummary
 	o = g_object_new (CAMEL_TYPE_MAILDIR_SUMMARY, NULL);
 	((CamelFolderSummary *)o)->folder = folder;
 	if (folder) {
-		camel_db_set_collate (folder->parent_store->cdb_r, "dreceived", NULL, NULL);
+		CamelStore *parent_store;
+
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_set_collate (parent_store->cdb_r, "dreceived", NULL, NULL);
 		((CamelFolderSummary *)o)->sort_by = "dreceived";
 		((CamelFolderSummary *)o)->collate = NULL;
 	}
diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c
index 6c9096e..2cf2656 100644
--- a/camel/providers/local/camel-mbox-folder.c
+++ b/camel/providers/local/camel-mbox-folder.c
@@ -87,12 +87,18 @@ CamelFolder *
 camel_mbox_folder_new(CamelStore *parent_store, const gchar *full_name, guint32 flags, CamelException *ex)
 {
 	CamelFolder *folder;
+	gchar *basename;
 
-	d(printf("Creating mbox folder: %s in %s\n", full_name, camel_local_store_get_toplevel_dir((CamelLocalStore *)parent_store)));
+	basename = g_path_get_basename (full_name);
 
-	folder = g_object_new (CAMEL_TYPE_MBOX_FOLDER, NULL);
-	folder = (CamelFolder *)camel_local_folder_construct((CamelLocalFolder *)folder,
-							     parent_store, full_name, flags, ex);
+	folder = g_object_new (
+		CAMEL_TYPE_MBOX_FOLDER,
+		"name", basename, "full-name", full_name,
+		"parent-store", parent_store, NULL);
+	folder = (CamelFolder *)camel_local_folder_construct (
+		(CamelLocalFolder *)folder, flags, ex);
+
+	g_free (basename);
 
 	return folder;
 }
diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c
index fde5b5f..be2e915 100644
--- a/camel/providers/local/camel-mbox-store.c
+++ b/camel/providers/local/camel-mbox-store.c
@@ -302,8 +302,14 @@ delete_folder(CamelStore *store, const gchar *folder_name, CamelException *ex)
 	path = NULL;
 	camel_exception_init(&lex);
 	if ((lf = camel_store_get_folder(store, folder_name, 0, &lex))) {
-		camel_object_get(lf, NULL, CAMEL_OBJECT_STATE_FILE, &path, NULL);
-		camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL);
+		CamelObject *object = CAMEL_OBJECT (lf);
+		const gchar *state_filename;
+
+		state_filename = camel_object_get_state_filename (object);
+		path = g_strdup (state_filename);
+
+		camel_object_set_state_filename (object, NULL);
+
 		g_object_unref (lf);
 	} else {
 		camel_exception_clear(&lex);
diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c
index 72ebb32..eada970 100644
--- a/camel/providers/local/camel-mbox-summary.c
+++ b/camel/providers/local/camel-mbox-summary.c
@@ -187,9 +187,12 @@ camel_mbox_summary_new(struct _CamelFolder *folder, const gchar *filename, const
 	((CamelFolderSummary *)new)->folder = folder;
 	if (folder) {
 		CamelFolderSummary *summary = (CamelFolderSummary *)new;
+		CamelStore *parent_store;
+
+		parent_store = camel_folder_get_parent_store (folder);
 
 		/* Set the functions for db sorting */
-		camel_db_set_collate (folder->parent_store->cdb_r, "bdata", "mbox_frompos_sort", (CamelDBCollate)camel_local_frompos_sort);
+		camel_db_set_collate (parent_store->cdb_r, "bdata", "mbox_frompos_sort", (CamelDBCollate)camel_local_frompos_sort);
 		summary->sort_by = "bdata";
 		summary->collate = "mbox_frompos_sort";
 
@@ -476,6 +479,8 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan
 	CamelMboxSummary *mbs = (CamelMboxSummary *)cls;
 	CamelMimeParser *mp;
 	CamelMboxMessageInfo *mi;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint fd;
 	gint ok = 0;
 	struct stat st;
@@ -586,7 +591,9 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan
 	}
 
 	/* Delete all in one transaction */
-	camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex);
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex);
 	g_slist_foreach (del, (GFunc) camel_pstring_free, NULL);
 	g_slist_free (del);
 
@@ -965,6 +972,8 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf
 	struct stat st;
 	CamelMboxSummary *mbs = (CamelMboxSummary *)cls;
 	CamelFolderSummary *s = (CamelFolderSummary *)cls;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint i;
 	gint quick = TRUE, work=FALSE;
 	gint ret;
@@ -974,6 +983,9 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf
 	if (camel_local_summary_check(cls, changeinfo, ex) == -1)
 		return -1;
 
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+
 	/* Sync only the changes */
 
 	summary = camel_folder_summary_get_changed ((CamelFolderSummary *)mbs);
@@ -994,7 +1006,7 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf
 	if (quick && expunge) {
 		guint32 dcount =0;
 
-		if (camel_db_count_deleted_message_info (s->folder->parent_store->cdb_w, s->folder->full_name, &dcount, ex) == -1)
+		if (camel_db_count_deleted_message_info (parent_store->cdb_w, full_name, &dcount, ex) == -1)
 			return -1;
 		if (dcount)
 			quick = FALSE;
@@ -1041,6 +1053,8 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh
 	CamelMboxSummary *mbs = (CamelMboxSummary *)cls;
 	CamelFolderSummary *s = (CamelFolderSummary *)mbs;
 	CamelMimeParser *mp = NULL;
+	CamelStore *parent_store;
+	const gchar *full_name;
 	gint i, count;
 	CamelMboxMessageInfo *info = NULL;
 	gchar *buffer, *xevnew = NULL;
@@ -1210,7 +1224,10 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh
 			info = NULL;
 		}
 	}
-	camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex);
+
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+	camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex);
 	g_slist_foreach (del, (GFunc) camel_pstring_free, NULL);
 	g_slist_free (del);
 
diff --git a/camel/providers/local/camel-mh-folder.c b/camel/providers/local/camel-mh-folder.c
index d016d09..4fdafee 100644
--- a/camel/providers/local/camel-mh-folder.c
+++ b/camel/providers/local/camel-mh-folder.c
@@ -75,13 +75,20 @@ camel_mh_folder_new (CamelStore *parent_store,
                      CamelException *ex)
 {
 	CamelFolder *folder;
+	gchar *basename;
 
 	d(printf("Creating mh folder: %s\n", full_name));
 
-	folder = g_object_new (CAMEL_TYPE_MH_FOLDER, NULL);
+	basename = g_path_get_basename (full_name);
+
+	folder = g_object_new (
+		CAMEL_TYPE_MH_FOLDER,
+		"name", basename, "full-name", full_name,
+		"parent-store", parent_store, NULL);
 	folder = (CamelFolder *) camel_local_folder_construct (
-		CAMEL_LOCAL_FOLDER (folder),
-		parent_store, full_name, flags, ex);
+		CAMEL_LOCAL_FOLDER (folder), flags, ex);
+
+	g_free (basename);
 
 	return folder;
 }
diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c
index f118007..33f3ed7 100644
--- a/camel/providers/local/camel-mh-summary.c
+++ b/camel/providers/local/camel-mh-summary.c
@@ -104,7 +104,10 @@ camel_mh_summary_new (CamelFolder *folder,
 	o = g_object_new (CAMEL_TYPE_MH_SUMMARY, NULL);
 	((CamelFolderSummary *)o)->folder = folder;
 	if (folder) {
-		camel_db_set_collate (folder->parent_store->cdb_r, "uid", "mh_uid_sort", (CamelDBCollate)camel_local_frompos_sort);
+		CamelStore *parent_store;
+
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_set_collate (parent_store->cdb_r, "uid", "mh_uid_sort", (CamelDBCollate)camel_local_frompos_sort);
 		((CamelFolderSummary *)o)->sort_by = "uid";
 		((CamelFolderSummary *)o)->collate = "mh_uid_sort";
 	}
diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c
index 2cae7d0..98511b5 100644
--- a/camel/providers/local/camel-spool-folder.c
+++ b/camel/providers/local/camel-spool-folder.c
@@ -71,22 +71,29 @@ camel_spool_folder_new (CamelStore *parent_store,
                         CamelException *ex)
 {
 	CamelFolder *folder;
+	gchar *basename;
 
-	d(printf("Creating spool folder: %s in %s\n", full_name, camel_local_store_get_toplevel_dir((CamelLocalStore *)parent_store)));
+	basename = g_path_get_basename (full_name);
 
-	folder = g_object_new (CAMEL_TYPE_SPOOL_FOLDER, NULL);
+	folder = g_object_new (
+		CAMEL_TYPE_SPOOL_FOLDER,
+		"name", basename, "full-name", full_name,
+		"parent-store", parent_store, NULL);
 
 	if (parent_store->flags & CAMEL_STORE_FILTER_INBOX
 	    && strcmp(full_name, "INBOX") == 0)
 		folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
 	flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX;
 
-	folder = (CamelFolder *)camel_local_folder_construct((CamelLocalFolder *)folder, parent_store, full_name, flags, ex);
+	folder = (CamelFolder *)camel_local_folder_construct (
+		(CamelLocalFolder *)folder, flags, ex);
 	if (folder) {
 		if (camel_url_get_param(((CamelService *)parent_store)->url, "xstatus"))
 			camel_mbox_summary_xstatus((CamelMboxSummary *)folder->summary, TRUE);
 	}
 
+	g_free (basename);
+
 	return folder;
 }
 
diff --git a/camel/providers/local/camel-spool-summary.c b/camel/providers/local/camel-spool-summary.c
index 098f76c..aa75427 100644
--- a/camel/providers/local/camel-spool-summary.c
+++ b/camel/providers/local/camel-spool-summary.c
@@ -88,7 +88,10 @@ camel_spool_summary_new (CamelFolder *folder,
 	new = g_object_new (CAMEL_TYPE_SPOOL_SUMMARY, NULL);
 	((CamelFolderSummary *)new)->folder = folder;
 	if (folder) {
-		camel_db_set_collate (folder->parent_store->cdb_r, "bdata", "spool_frompos_sort", (CamelDBCollate)camel_local_frompos_sort);
+		CamelStore *parent_store;
+
+		parent_store = camel_folder_get_parent_store (folder);
+		camel_db_set_collate (parent_store->cdb_r, "bdata", "spool_frompos_sort", (CamelDBCollate)camel_local_frompos_sort);
 		((CamelFolderSummary *)new)->sort_by = "bdata";
 		((CamelFolderSummary *)new)->collate = "spool_frompos_sort";
 	}
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
index 8965048..d2c26c2 100644
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ b/camel/providers/nntp/camel-nntp-folder.c
@@ -70,28 +70,37 @@ nntp_folder_finalize (GObject *object)
 }
 
 gboolean
-camel_nntp_folder_selected (CamelNNTPFolder *folder,
+camel_nntp_folder_selected (CamelNNTPFolder *nntp_folder,
                             gchar *line,
                             CamelException *ex)
 {
+	CamelFolder *folder;
+	CamelStore *parent_store;
+
+	folder = CAMEL_FOLDER (nntp_folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
 	return camel_nntp_summary_check (
-		(CamelNNTPSummary *)((CamelFolder *)folder)->summary,
-		(CamelNNTPStore *)((CamelFolder *)folder)->parent_store,
-		line, folder->changes, ex);
+		CAMEL_NNTP_SUMMARY (folder->summary),
+		CAMEL_NNTP_STORE (parent_store),
+		line, nntp_folder->changes, ex);
 }
 
 static gboolean
 nntp_folder_refresh_info_online (CamelFolder *folder,
                                  CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelNNTPStore *nntp_store;
 	CamelFolderChangeInfo *changes = NULL;
 	CamelNNTPFolder *nntp_folder;
 	gchar *line;
 	gboolean success;
 
-	nntp_store = (CamelNNTPStore *) folder->parent_store;
-	nntp_folder = (CamelNNTPFolder *) folder;
+	parent_store = camel_folder_get_parent_store (folder);
+
+	nntp_folder = CAMEL_NNTP_FOLDER (folder);
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
 
 	camel_service_lock (CAMEL_SERVICE (nntp_store), CS_REC_CONNECT_LOCK);
 
@@ -134,10 +143,13 @@ unset_flagged_flag (const gchar *uid, CamelFolderSummary *summary)
 static gboolean
 nntp_folder_sync (CamelFolder *folder, CamelException *ex)
 {
+	CamelStore *parent_store;
 	GPtrArray *changed;
 	gboolean success;
 
-	camel_service_lock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 
 	changed = camel_folder_summary_get_changed (folder->summary);
 	if (changed) {
@@ -148,7 +160,7 @@ nntp_folder_sync (CamelFolder *folder, CamelException *ex)
 	}
 	success = camel_folder_summary_save_to_db (folder->summary, ex);
 
-	camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK);
+	camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK);
 
 	return success;
 }
@@ -168,9 +180,13 @@ nntp_folder_sync_offline (CamelFolder *folder, CamelException *ex)
 static gchar *
 nntp_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
-	CamelNNTPStore *nntp_store = (CamelNNTPStore *) folder->parent_store;
+	CamelStore *parent_store;
+	CamelNNTPStore *nntp_store;
 	gchar *article, *msgid;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
+
 	article = alloca(strlen(uid)+1);
 	strcpy(article, uid);
 	msgid = strchr (article, ',');
@@ -188,11 +204,17 @@ nntp_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex)
 static CamelStream *
 nntp_folder_download_message (CamelNNTPFolder *nntp_folder, const gchar *id, const gchar *msgid, CamelException *ex)
 {
-	CamelNNTPStore *nntp_store = (CamelNNTPStore *) ((CamelFolder *) nntp_folder)->parent_store;
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelNNTPStore *nntp_store;
 	CamelStream *stream = NULL;
 	gint ret;
 	gchar *line;
 
+	folder = CAMEL_FOLDER (nntp_folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
+
 	ret = camel_nntp_command (nntp_store, ex, nntp_folder, &line, "article %s", id);
 	if (ret == 220) {
 		stream = camel_data_cache_add (nntp_store->cache, "cache", msgid, NULL);
@@ -235,11 +257,17 @@ nntp_folder_cache_message (CamelDiscoFolder *disco_folder,
                            const gchar *uid,
                            CamelException *ex)
 {
-	CamelNNTPStore *nntp_store = (CamelNNTPStore *)((CamelFolder *) disco_folder)->parent_store;
+	CamelFolder *folder;
+	CamelStore *parent_store;
+	CamelNNTPStore *nntp_store;
 	CamelStream *stream;
 	gchar *article, *msgid;
 	gboolean success = TRUE;
 
+	folder = CAMEL_FOLDER (disco_folder);
+	parent_store = camel_folder_get_parent_store (folder);
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
+
 	article = alloca(strlen(uid)+1);
 	strcpy(article, uid);
 	msgid = strchr(article, ',');
@@ -268,6 +296,7 @@ nntp_folder_cache_message (CamelDiscoFolder *disco_folder,
 static CamelMimeMessage *
 nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelMimeMessage *message = NULL;
 	CamelNNTPStore *nntp_store;
 	CamelFolderChangeInfo *changes;
@@ -275,8 +304,10 @@ nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException *
 	CamelStream *stream = NULL;
 	gchar *article, *msgid;
 
-	nntp_store = (CamelNNTPStore *) folder->parent_store;
-	nntp_folder = (CamelNNTPFolder *) folder;
+	parent_store = camel_folder_get_parent_store (folder);
+
+	nntp_folder = CAMEL_NNTP_FOLDER (folder);
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
 
 	article = alloca(strlen(uid)+1);
 	strcpy(article, uid);
@@ -417,16 +448,24 @@ nntp_folder_append_message_online (CamelFolder *folder,
                                    gchar **appended_uid,
                                    CamelException *ex)
 {
-	CamelNNTPStore *nntp_store = (CamelNNTPStore *) folder->parent_store;
-	CamelStream *stream = (CamelStream*)nntp_store->stream;
+	CamelStore *parent_store;
+	CamelNNTPStore *nntp_store;
 	CamelStream *filtered_stream;
+	CamelStream *stream;
 	CamelMimeFilter *crlffilter;
 	gint ret;
 	guint u;
 	struct _camel_header_raw *header, *savedhdrs, *n, *tail;
+	const gchar *full_name;
 	gchar *group, *line;
 	gboolean success = TRUE;
 
+	full_name = camel_folder_get_full_name (folder);
+	parent_store = camel_folder_get_parent_store (folder);
+
+	nntp_store = CAMEL_NNTP_STORE (parent_store);
+	stream = CAMEL_STREAM (nntp_store->stream);
+
 	camel_service_lock (CAMEL_SERVICE (nntp_store), CS_REC_CONNECT_LOCK);
 
 	/* send 'POST' command */
@@ -448,7 +487,7 @@ nntp_folder_append_message_online (CamelFolder *folder,
 	}
 
 	/* the 'Newsgroups: ' header */
-	group = g_strdup_printf ("Newsgroups: %s\r\n", folder->full_name);
+	group = g_strdup_printf ("Newsgroups: %s\r\n", full_name);
 
 	/* setup stream filtering */
 	crlffilter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_ENCODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS);
@@ -604,18 +643,21 @@ camel_nntp_folder_new (CamelStore *parent,
 	/* If this doesn't work, stuff wont save, but let it continue anyway */
 	g_mkdir_with_parents (root, 0700);
 
-	folder = g_object_new (CAMEL_TYPE_NNTP_FOLDER, NULL);
+	folder = g_object_new (
+		CAMEL_TYPE_NNTP_FOLDER,
+		"name", folder_name,
+		"full-name", folder_name,
+		"parent-store", parent, NULL);
 	nntp_folder = (CamelNNTPFolder *)folder;
 
-	camel_folder_construct (folder, parent, folder_name, folder_name);
 	folder->folder_flags |= CAMEL_FOLDER_HAS_SUMMARY_CAPABILITY|CAMEL_FOLDER_HAS_SEARCH_CAPABILITY;
 
-	nntp_folder->storage_path = g_build_filename (root, folder->full_name, NULL);
+	nntp_folder->storage_path = g_build_filename (root, folder_name, NULL);
 	g_free (root);
 
 	root = g_strdup_printf ("%s.cmeta", nntp_folder->storage_path);
-	camel_object_set(nntp_folder, NULL, CAMEL_OBJECT_STATE_FILE, root, NULL);
-	camel_object_state_read(nntp_folder);
+	camel_object_set_state_filename (CAMEL_OBJECT (nntp_folder), root);
+	camel_object_state_read (CAMEL_OBJECT (nntp_folder));
 	g_free(root);
 
 	root = g_strdup_printf("%s.ev-summary", nntp_folder->storage_path);
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 0745af2..f572143 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -1382,6 +1382,7 @@ camel_nntp_raw_command_auth(CamelNNTPStore *store, CamelException *ex, gchar **l
 gint
 camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder *folder, gchar **line, const gchar *fmt, ...)
 {
+	const gchar *full_name = NULL;
 	const guchar *p;
 	va_list ap;
 	gint ret, retry;
@@ -1394,6 +1395,9 @@ camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder *
 		return -1;
 	}
 
+	if (folder != NULL)
+		full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder));
+
 	retry = 0;
 	do {
 		retry ++;
@@ -1411,11 +1415,11 @@ camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder *
 		camel_nntp_stream_set_mode(store->stream, CAMEL_NNTP_STREAM_LINE);
 
 		if (folder != NULL
-		    && (store->current_folder == NULL || strcmp(store->current_folder, ((CamelFolder *)folder)->full_name) != 0)) {
-			ret = camel_nntp_raw_command_auth(store, ex, line, "group %s", ((CamelFolder *)folder)->full_name);
+		    && (store->current_folder == NULL || strcmp(store->current_folder, full_name) != 0)) {
+			ret = camel_nntp_raw_command_auth(store, ex, line, "group %s", full_name);
 			if (ret == 211) {
 				g_free(store->current_folder);
-				store->current_folder = g_strdup(((CamelFolder *)folder)->full_name);
+				store->current_folder = g_strdup (full_name);
 				camel_nntp_folder_selected(folder, *line, ex);
 				if (camel_exception_is_set(ex)) {
 					ret = -1;
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index 03853fe..6012e48 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -424,10 +424,15 @@ camel_nntp_summary_check (CamelNNTPSummary *cns, CamelNNTPStore *store, gchar *l
 	gint count;
 	gchar *folder = NULL;
 	CamelNNTPStoreInfo *si;
+	CamelStore *parent_store;
 	GSList *del = NULL;
+	const gchar *full_name;
 
 	s = (CamelFolderSummary *)cns;
 
+	full_name = camel_folder_get_full_name (s->folder);
+	parent_store = camel_folder_get_parent_store (s->folder);
+
 	line +=3;
 	n = strtoul(line, &line, 10);
 	f = strtoul(line, &line, 10);
@@ -481,7 +486,7 @@ camel_nntp_summary_check (CamelNNTPSummary *cns, CamelNNTPStore *store, gchar *l
 		cns->low = f;
 	}
 
-	camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex);
+	camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex);
 	g_slist_foreach (del, (GFunc) g_free, NULL);
 	g_slist_free (del);
 
@@ -507,7 +512,7 @@ update:
 		guint32 unread = 0;
 
 		count = camel_folder_summary_count (s);
-		camel_db_count_unread_message_info (s->folder->parent_store->cdb_r, s->folder->full_name, &unread, ex);
+		camel_db_count_unread_message_info (parent_store->cdb_r, full_name, &unread, ex);
 
 		if (si->info.unread != unread
 		    || si->info.total != count
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
index 42c7e4b..a1d7d9c 100644
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ b/camel/providers/pop3/camel-pop3-folder.c
@@ -53,9 +53,13 @@ pop3_folder_finalize (GObject *object)
 {
 	CamelPOP3Folder *pop3_folder = CAMEL_POP3_FOLDER (object);
 	CamelPOP3FolderInfo **fi = (CamelPOP3FolderInfo **)pop3_folder->uids->pdata;
-	CamelPOP3Store *pop3_store = (CamelPOP3Store *)((CamelFolder *)pop3_folder)->parent_store;
+	CamelPOP3Store *pop3_store;
+	CamelStore *parent_store;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (object));
+	pop3_store = CAMEL_POP3_STORE (parent_store);
+
 	if (pop3_folder->uids) {
 		for (i=0;i<pop3_folder->uids->len;i++,fi++) {
 			if (fi[0]->cmd) {
@@ -108,8 +112,10 @@ camel_pop3_folder_new (CamelStore *parent, CamelException *ex)
 
 	d(printf("opening pop3 INBOX folder\n"));
 
-	folder = g_object_new (CAMEL_TYPE_POP3_FOLDER, NULL);
-	camel_folder_construct (folder, parent, "inbox", "inbox");
+	folder = g_object_new (
+		CAMEL_TYPE_POP3_FOLDER,
+		"full-name", "inbox", "name", "inbox",
+		"parent-store", parent, NULL);
 
 	/* mt-ok, since we dont have the folder-lock for new() */
 	if (!camel_folder_refresh_info (folder, ex)) { /* mt-ok */
@@ -173,9 +179,13 @@ cmd_list(CamelPOP3Engine *pe, CamelPOP3Stream *stream, gpointer data)
 	guint len, id, size;
 	guchar *line;
 	CamelFolder *folder = data;
-	CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelPOP3Store *pop3_store;
 	CamelPOP3FolderInfo *fi;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
+
 	do {
 		ret = camel_pop3_stream_line(stream, &line, &len);
 		if (ret>=0) {
@@ -226,12 +236,16 @@ cmd_uidl(CamelPOP3Engine *pe, CamelPOP3Stream *stream, gpointer data)
 static gboolean
 pop3_refresh_info (CamelFolder *folder, CamelException *ex)
 {
-	CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store);
+	CamelStore *parent_store;
+	CamelPOP3Store *pop3_store;
 	CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *) folder;
 	CamelPOP3Command *pcl, *pcu = NULL;
 	gboolean success = TRUE;
 	gint i;
 
+	parent_store = camel_folder_get_parent_store (folder);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
+
 	camel_operation_start (NULL, _("Retrieving POP summary"));
 
 	pop3_folder->uids = g_ptr_array_new ();
@@ -289,13 +303,16 @@ pop3_sync (CamelFolder *folder,
            gboolean expunge,
            CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelPOP3Folder *pop3_folder;
 	CamelPOP3Store *pop3_store;
 	gint i;
 	CamelPOP3FolderInfo *fi;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	pop3_folder = CAMEL_POP3_FOLDER (folder);
-	pop3_store = CAMEL_POP3_STORE (folder->parent_store);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
 
 	if (pop3_store->delete_after && !expunge) {
 		d(printf("%s(%d): pop3_store->delete_after = [%d], expunge=[%d]\n",
@@ -356,6 +373,7 @@ pop3_sync (CamelFolder *folder,
 static gboolean
 pop3_get_message_time_from_cache (CamelFolder *folder, const gchar *uid, time_t *message_time)
 {
+	CamelStore *parent_store;
 	CamelPOP3Store *pop3_store;
 	CamelStream *stream = NULL;
 	gchar buffer[1];
@@ -365,7 +383,8 @@ pop3_get_message_time_from_cache (CamelFolder *folder, const gchar *uid, time_t
 	g_return_val_if_fail (uid != NULL, FALSE);
 	g_return_val_if_fail (message_time != NULL, FALSE);
 
-	pop3_store = CAMEL_POP3_STORE (folder->parent_store);
+	parent_store = camel_folder_get_parent_store (folder);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
 
 	g_return_val_if_fail (pop3_store->cache != NULL, FALSE);
 
@@ -400,6 +419,7 @@ camel_pop3_delete_old (CamelFolder *folder,
                        gint days_to_delete,
                        CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelPOP3Folder *pop3_folder;
 	CamelPOP3FolderInfo *fi;
 	gint i;
@@ -407,8 +427,10 @@ camel_pop3_delete_old (CamelFolder *folder,
 	CamelMimeMessage *message;
 	time_t temp, message_time = 0;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
 	pop3_folder = CAMEL_POP3_FOLDER (folder);
-	pop3_store = CAMEL_POP3_STORE (CAMEL_FOLDER(pop3_folder)->parent_store);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
 	temp = time(&temp);
 
 	d(printf("%s(%d): pop3_folder->uids->len=[%d]\n", __FILE__, __LINE__, pop3_folder->uids->len));
@@ -522,10 +544,16 @@ done:
 static gchar *
 pop3_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
-	CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *)folder;
-	CamelPOP3Store *pop3_store = (CamelPOP3Store *)((CamelFolder *)pop3_folder)->parent_store;
+	CamelStore *parent_store;
+	CamelPOP3Folder *pop3_folder;
+	CamelPOP3Store *pop3_store;
 	CamelPOP3FolderInfo *fi;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
+	pop3_folder = CAMEL_POP3_FOLDER (folder);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
+
 	fi = g_hash_table_lookup(pop3_folder->uids_uid, uid);
 	if (fi == NULL) {
 		camel_exception_setv (
@@ -540,15 +568,21 @@ pop3_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex)
 static CamelMimeMessage *
 pop3_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
+	CamelStore *parent_store;
 	CamelMimeMessage *message = NULL;
-	CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store);
-	CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *)folder;
+	CamelPOP3Store *pop3_store;
+	CamelPOP3Folder *pop3_folder;
 	CamelPOP3Command *pcr;
 	CamelPOP3FolderInfo *fi;
 	gchar buffer[1];
 	gint i, last;
 	CamelStream *stream = NULL;
 
+	parent_store = camel_folder_get_parent_store (folder);
+
+	pop3_folder = CAMEL_POP3_FOLDER (folder);
+	pop3_store = CAMEL_POP3_STORE (parent_store);
+
 	fi = g_hash_table_lookup(pop3_folder->uids_uid, uid);
 	if (fi == NULL) {
 		camel_exception_setv (
diff --git a/docs/reference/camel/camel-docs.sgml b/docs/reference/camel/camel-docs.sgml
index 79a8366..706ef6c 100644
--- a/docs/reference/camel/camel-docs.sgml
+++ b/docs/reference/camel/camel-docs.sgml
@@ -41,7 +41,6 @@
     <chapter id="Fundamentals">
       <title>Fundamentals</title>
       <xi:include href="xml/camel.xml"/>
-      <xi:include href="xml/camel-arg.xml"/>
       <xi:include href="xml/camel-debug.xml"/>
       <xi:include href="xml/camel-exception.xml"/>
       <xi:include href="xml/camel-object.xml"/>
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index 8bfdeba..88b3d2f 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -111,6 +111,9 @@ camel_cert_set_hostname
 camel_cert_set_fingerprint
 camel_cert_get_trust
 camel_cert_set_trust
+CamelCertDBLock
+camel_certdb_lock
+camel_certdb_unlock
 <SUBSECTION Standard>
 CAMEL_CERTDB
 CAMEL_IS_CERTDB
@@ -175,6 +178,8 @@ camel_cipher_context_get_type
 <TITLE>CamelDataCache</TITLE>
 CamelDataCache
 camel_data_cache_new
+camel_data_cache_get_path
+camel_data_cache_set_path
 camel_data_cache_set_expire_age
 camel_data_cache_set_expire_access
 camel_data_cache_add
@@ -207,6 +212,9 @@ camel_data_wrapper_get_mime_type_field
 camel_data_wrapper_set_mime_type_field
 camel_data_wrapper_construct_from_stream
 camel_data_wrapper_is_offline
+CamelDataWrapperLock
+camel_data_wrapper_lock
+camel_data_wrapper_unlock
 <SUBSECTION Standard>
 CAMEL_DATA_WRAPPER
 CAMEL_IS_DATA_WRAPPER
@@ -299,7 +307,6 @@ CamelDBPrivate
 <TITLE>CamelDiscoDiary</TITLE>
 CamelDiscoDiary
 CamelDiscoDiaryAction
-CamelDiscoDiaryArgType
 camel_disco_diary_new
 camel_disco_diary_empty
 camel_disco_diary_log
@@ -322,6 +329,8 @@ camel_disco_diary_get_type
 <FILE>camel-disco-folder</FILE>
 <TITLE>CamelDiscoFolder</TITLE>
 CamelDiscoFolder
+camel_disco_folder_get_offline_sync
+camel_disco_folder_set_offline_sync
 camel_disco_folder_expunge_uids
 camel_disco_folder_cache_message
 camel_disco_folder_prepare_for_offline
@@ -334,6 +343,7 @@ CAMEL_IS_DISCO_FOLDER_CLASS
 CAMEL_DISCO_FOLDER_GET_CLASS
 CamelDiscoFolderClass
 <SUBSECTION Private>
+CamelDiscoFolderPrivate
 camel_disco_folder_get_type
 </SECTION>
 
@@ -404,14 +414,17 @@ CAMEL_FOLDER_HAS_BEEN_DELETED
 CAMEL_FOLDER_IS_TRASH
 CAMEL_FOLDER_IS_JUNK
 CAMEL_FOLDER_FILTER_JUNK
-camel_folder_construct
 camel_folder_refresh_info
 camel_folder_sync
 camel_folder_set_lock_async
 camel_folder_get_parent_store
 camel_folder_expunge
 camel_folder_get_name
+camel_folder_set_name
 camel_folder_get_full_name
+camel_folder_set_full_name
+camel_folder_get_description
+camel_folder_set_description
 camel_folder_get_permanent_flags
 camel_folder_get_message_flags
 camel_folder_set_message_flags
@@ -448,6 +461,7 @@ camel_folder_rename
 camel_folder_freeze
 camel_folder_thaw
 camel_folder_is_frozen
+camel_folder_get_frozen_count
 camel_folder_get_quota_info
 camel_folder_quota_info_new
 camel_folder_quota_info_clone
@@ -470,6 +484,9 @@ camel_folder_change_info_add_uid
 camel_folder_change_info_remove_uid
 camel_folder_change_info_change_uid
 camel_folder_change_info_recent_uid
+CamelFolderLock
+camel_folder_lock
+camel_folder_unlock
 <SUBSECTION Standard>
 CAMEL_FOLDER
 CAMEL_IS_FOLDER
@@ -480,6 +497,7 @@ CAMEL_FOLDER_GET_CLASS
 CamelFolderClass
 <SUBSECTION Private>
 CamelFolderPrivate
+CamelFolderChangeInfoPrivate
 camel_folder_get_type
 </SECTION>
 
@@ -542,9 +560,7 @@ camel_folder_summary_touch
 camel_folder_summary_add
 camel_folder_summary_peek_info
 camel_folder_summary_get_changed
-camel_folder_summary_cache_size
-camel_folder_summary_reload_from_db
-camel_folder_summary_ensure_infos_loaded
+camel_folder_summary_prepare_fetch_all
 camel_folder_summary_insert
 camel_folder_summary_remove_index_fast
 camel_folder_summary_remove_uid_fast
@@ -623,6 +639,9 @@ camel_folder_summary_guess_content_info
 camel_content_info_dump
 camel_message_info_dump
 camel_folder_summary_migrate_infos
+CamelFolderSummaryLock
+camel_folder_summary_lock
+camel_folder_summary_unlock
 <SUBSECTION Standard>
 CAMEL_FOLDER_SUMMARY
 CAMEL_IS_FOLDER_SUMMARY
@@ -641,6 +660,7 @@ camel_folder_summary_get_type
 <TITLE>CamelGpgContext</TITLE>
 CamelGpgContext
 camel_gpg_context_new
+camel_gpg_context_get_always_trust
 camel_gpg_context_set_always_trust
 <SUBSECTION Standard>
 CAMEL_GPG_CONTEXT
@@ -722,6 +742,7 @@ CAMEL_INDEX_DELETED
 camel_index_new
 camel_index_construct
 camel_index_rename
+camel_index_set_normalize
 camel_index_sync
 camel_index_compress
 camel_index_delete
@@ -1427,18 +1448,16 @@ CamelObject
 CamelObjectHookID
 CamelObjectEventPrepFunc
 CamelObjectEventHookFunc
+CamelParamFlags
 camel_object_class_add_event
 camel_object_hook_event
 camel_object_remove_event
 camel_object_unhook_event
 camel_object_trigger_event
-camel_object_set
-camel_object_setv
-camel_object_get
-camel_object_getv
 camel_object_state_read
 camel_object_state_write
-camel_object_free
+camel_object_get_state_filename
+camel_object_set_state_filename
 CamelObjectBag
 CamelCopyFunc
 camel_object_bag_new
@@ -1460,6 +1479,7 @@ CAMEL_IS_OBJECT_CLASS
 CAMEL_OBJECT_GET_CLASS
 CamelObjectClass
 <SUBSECTION Private>
+CamelObjectPrivate
 camel_object_get_type
 </SECTION>
 
@@ -1467,6 +1487,8 @@ camel_object_get_type
 <FILE>camel-offline-folder</FILE>
 <TITLE>CamelOfflineFolder</TITLE>
 CamelOfflineFolder
+camel_offline_folder_get_offline_sync
+camel_offline_folder_set_offline_sync
 camel_offline_folder_downsync
 <SUBSECTION Standard>
 CAMEL_OFFLINE_FOLDER
@@ -1477,6 +1499,7 @@ CAMEL_IS_OFFLINE_FOLDER_CLASS
 CAMEL_OFFLINE_FOLDER_GET_CLASS
 CamelOfflineFolderClass
 <SUBSECTION Private>
+CamelOfflineFolderPrivate
 camel_offline_folder_get_type
 </SECTION>
 
@@ -1786,6 +1809,11 @@ CamelSasl
 camel_sasl_challenge
 camel_sasl_challenge_base64
 camel_sasl_new
+camel_sasl_get_authenticated
+camel_sasl_set_authenticated
+camel_sasl_get_mechanism
+camel_sasl_get_service
+camel_sasl_get_service_name
 camel_sasl_authtype_list
 camel_sasl_authtype
 <SUBSECTION Standard>
@@ -1853,11 +1881,6 @@ camel_seekable_substream_get_type
 <FILE>camel-service</FILE>
 <TITLE>CamelService</TITLE>
 CamelService
-CAMEL_SERVICE_USERNAME
-CAMEL_SERVICE_AUTH
-CAMEL_SERVICE_HOSTNAME
-CAMEL_SERVICE_PORT
-CAMEL_SERVICE_PATH
 CamelServiceConnectionStatus
 CamelServiceAuthType
 camel_service_construct
@@ -1870,6 +1893,9 @@ camel_service_get_path
 camel_service_get_session
 camel_service_get_provider
 camel_service_query_auth_types
+CamelServiceLock
+camel_service_lock
+camel_service_unlock
 <SUBSECTION Standard>
 CAMEL_SERVICE
 CAMEL_IS_SERVICE
@@ -1916,6 +1942,9 @@ camel_session_get_junk_headers
 camel_session_set_junk_headers
 camel_session_lookup_addressbook
 camel_session_forward_to
+CamelSessionLock
+camel_session_lock
+camel_session_unlock
 <SUBSECTION Standard>
 CAMEL_SESSION
 CAMEL_IS_SESSION
@@ -1987,6 +2016,9 @@ camel_store_info_set_string
 camel_store_info_path
 camel_store_info_uri
 camel_store_info_name
+CamelStoreSummaryLock
+camel_store_summary_lock
+camel_store_summary_unlock
 <SUBSECTION Standard>
 CAMEL_STORE_SUMMARY
 CAMEL_IS_STORE_SUMMARY
@@ -2066,6 +2098,9 @@ camel_store_unsubscribe_folder
 camel_store_noop
 camel_store_folder_uri_equal
 camel_store_can_refresh_folder
+CamelStoreLock
+camel_store_lock
+camel_store_unlock
 <SUBSECTION Standard>
 CAMEL_STORE
 CAMEL_IS_STORE
@@ -2132,6 +2167,8 @@ camel_stream_buffer_get_type
 <FILE>camel-stream-filter</FILE>
 <TITLE>CamelStreamFilter</TITLE>
 CamelStreamFilter
+camel_stream_filter_new
+camel_stream_filter_get_source
 camel_stream_filter_add
 camel_stream_filter_remove
 <SUBSECTION Standard>
@@ -2155,6 +2192,7 @@ camel_stream_fs_new_with_name
 camel_stream_fs_new_with_name_and_bounds
 camel_stream_fs_new_with_fd
 camel_stream_fs_new_with_fd_and_bounds
+camel_stream_fs_get_fd
 <SUBSECTION Standard>
 CAMEL_STREAM_FS
 CAMEL_IS_STREAM_FS
@@ -2176,6 +2214,7 @@ camel_stream_mem_new
 camel_stream_mem_new_with_byte_array
 camel_stream_mem_new_with_buffer
 camel_stream_mem_set_secure
+camel_stream_mem_get_byte_array
 camel_stream_mem_set_byte_array
 camel_stream_mem_set_buffer
 <SUBSECTION Standard>
@@ -2260,6 +2299,9 @@ CAMEL_IS_TCP_STREAM_RAW_CLASS
 CAMEL_TCP_STREAM_RAW_GET_CLASS
 CamelTcpStreamRawClass
 <SUBSECTION Private>
+addrinfo
+sockaddr
+socklen_t
 camel_tcp_stream_raw_get_type
 </SECTION>
 
@@ -2374,6 +2416,9 @@ camel_text_index_name_get_type
 <TITLE>CamelTransport</TITLE>
 CamelTransport
 camel_transport_send_to
+CamelTransportLock
+camel_transport_lock
+camel_transport_unlock
 <SUBSECTION Standard>
 CAMEL_TRANSPORT
 CAMEL_IS_TRANSPORT
@@ -2413,6 +2458,11 @@ camel_vee_folder_mask_event_folder_changed
 camel_vee_folder_unmask_event_folder_changed
 camel_vee_folder_hash_folder
 camel_vee_folder_sync_headers
+camel_vee_folder_get_unread_vfolder
+camel_vee_folder_set_unread_vfolder
+CamelVeeFolderLock
+camel_vee_folder_lock
+camel_vee_folder_unlock
 <SUBSECTION Standard>
 CAMEL_VEE_FOLDER
 CAMEL_IS_VEE_FOLDER
@@ -2487,26 +2537,6 @@ camel_vtrash_folder_get_type
 </SECTION>
 
 <SECTION>
-<FILE>camel-arg</FILE>
-CamelArg
-CamelArgV
-CamelArgGet
-CamelArgGetV
-ca_object
-ca_int
-ca_double
-ca_str
-ca_ptr
-CAMEL_ARGV_MAX
-camel_argv_start
-camel_argv_end
-camel_argv_build
-camel_arggetv_build
-camel_argv_ignore
-CamelProperty
-</SECTION>
-
-<SECTION>
 <FILE>camel-charset-map</FILE>
 CamelCharset
 camel_charset_init
diff --git a/docs/reference/camel/tmpl/camel-arg.sgml b/docs/reference/camel/tmpl/camel-arg.sgml
index 9f413ef..d5184ae 100644
--- a/docs/reference/camel/tmpl/camel-arg.sgml
+++ b/docs/reference/camel/tmpl/camel-arg.sgml
@@ -20,130 +20,3 @@ camel-arg
 <!-- ##### SECTION Image ##### -->
 
 
-<!-- ##### STRUCT CamelArg ##### -->
-<para>
-
-</para>
-
- tag: 
-
-<!-- ##### STRUCT CamelArgV ##### -->
-<para>
-
-</para>
-
- ap: 
- argc: 
- argv: 
-
-<!-- ##### STRUCT CamelArgGet ##### -->
-<para>
-
-</para>
-
- tag: 
-
-<!-- ##### STRUCT CamelArgGetV ##### -->
-<para>
-
-</para>
-
- ap: 
- argc: 
- argv: 
-
-<!-- ##### MACRO ca_object ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ca_int ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ca_double ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ca_str ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ca_ptr ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO CAMEL_ARGV_MAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO camel_argv_start ##### -->
-<para>
-
-</para>
-
- tv: 
- last: 
-
-
-<!-- ##### MACRO camel_argv_end ##### -->
-<para>
-
-</para>
-
- tv: 
-
-
-<!-- ##### FUNCTION camel_argv_build ##### -->
-<para>
-
-</para>
-
- tv: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_arggetv_build ##### -->
-<para>
-
-</para>
-
- tv: 
- Returns: 
-
-
-<!-- ##### MACRO camel_argv_ignore ##### -->
-<para>
-
-</para>
-
- tv: 
- i: 
-
-
-<!-- ##### STRUCT CamelProperty ##### -->
-<para>
-
-</para>
-
- tag: 
- name: 
- description: 
-
diff --git a/docs/reference/camel/tmpl/camel-certdb.sgml b/docs/reference/camel/tmpl/camel-certdb.sgml
index fc345dc..6ff021b 100644
--- a/docs/reference/camel/tmpl/camel-certdb.sgml
+++ b/docs/reference/camel/tmpl/camel-certdb.sgml
@@ -292,3 +292,31 @@ CamelCertDB
 @trust: 
 
 
+<!-- ##### ENUM CamelCertDBLock ##### -->
+<para>
+
+</para>
+
+ CCD_DB_LOCK: 
+ CCD_IO_LOCK: 
+ CCD_ALLOC_LOCK: 
+ CCD_REF_LOCK: 
+
+<!-- ##### FUNCTION camel_certdb_lock ##### -->
+<para>
+
+</para>
+
+ certdb: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_certdb_unlock ##### -->
+<para>
+
+</para>
+
+ certdb: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-cipher-context.sgml b/docs/reference/camel/tmpl/camel-cipher-context.sgml
index 292f721..344d6d5 100644
--- a/docs/reference/camel/tmpl/camel-cipher-context.sgml
+++ b/docs/reference/camel/tmpl/camel-cipher-context.sgml
@@ -331,6 +331,20 @@ CamelCipherContext
 @gpointer cert_data: 
 @gpointer cert_data:
 @gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
+ gpointer cert_data:
+ gpointer cert_data: 
 @gpointer cert_data: 
 
 
diff --git a/docs/reference/camel/tmpl/camel-data-cache.sgml b/docs/reference/camel/tmpl/camel-data-cache.sgml
index ad3fef1..0c2c3de 100644
--- a/docs/reference/camel/tmpl/camel-data-cache.sgml
+++ b/docs/reference/camel/tmpl/camel-data-cache.sgml
@@ -41,6 +41,24 @@ CamelDataCache
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_data_cache_get_path ##### -->
+<para>
+
+</para>
+
+ cdc: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_data_cache_set_path ##### -->
+<para>
+
+</para>
+
+ cdc: 
+ path: 
+
+
 <!-- ##### FUNCTION camel_data_cache_set_expire_age ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-data-wrapper.sgml b/docs/reference/camel/tmpl/camel-data-wrapper.sgml
index f48475c..20426b8 100644
--- a/docs/reference/camel/tmpl/camel-data-wrapper.sgml
+++ b/docs/reference/camel/tmpl/camel-data-wrapper.sgml
@@ -110,3 +110,28 @@ CamelDataWrapper
 @Returns: 
 
 
+<!-- ##### ENUM CamelDataWrapperLock ##### -->
+<para>
+
+</para>
+
+ CDW_STREAM_LOCK: 
+
+<!-- ##### FUNCTION camel_data_wrapper_lock ##### -->
+<para>
+
+</para>
+
+ data_wrapper: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_data_wrapper_unlock ##### -->
+<para>
+
+</para>
+
+ data_wrapper: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-disco-diary.sgml b/docs/reference/camel/tmpl/camel-disco-diary.sgml
index 15cccd7..d098b55 100644
--- a/docs/reference/camel/tmpl/camel-disco-diary.sgml
+++ b/docs/reference/camel/tmpl/camel-disco-diary.sgml
@@ -36,16 +36,6 @@ CamelDiscoDiary
 @CAMEL_DISCO_DIARY_FOLDER_APPEND: 
 @CAMEL_DISCO_DIARY_FOLDER_TRANSFER: 
 
-<!-- ##### ENUM CamelDiscoDiaryArgType ##### -->
-<para>
-
-</para>
-
- CAMEL_DISCO_DIARY_ARG_NONE: 
- CAMEL_DISCO_DIARY_ARG_FOLDER: 
- CAMEL_DISCO_DIARY_ARG_UID: 
- CAMEL_DISCO_DIARY_ARG_UID_LIST: 
-
 <!-- ##### FUNCTION camel_disco_diary_new ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-disco-folder.sgml b/docs/reference/camel/tmpl/camel-disco-folder.sgml
index f3cad62..468a4b0 100644
--- a/docs/reference/camel/tmpl/camel-disco-folder.sgml
+++ b/docs/reference/camel/tmpl/camel-disco-folder.sgml
@@ -26,6 +26,29 @@ CamelDiscoFolder
 </para>
 
 
+<!-- ##### ARG CamelDiscoFolder:offline-sync ##### -->
+<para>
+
+</para>
+
+<!-- ##### FUNCTION camel_disco_folder_get_offline_sync ##### -->
+<para>
+
+</para>
+
+ disco_folder: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_disco_folder_set_offline_sync ##### -->
+<para>
+
+</para>
+
+ disco_folder: 
+ offline_sync: 
+
+
 <!-- ##### FUNCTION camel_disco_folder_expunge_uids ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-folder-summary.sgml b/docs/reference/camel/tmpl/camel-folder-summary.sgml
index 542349f..b5a4235 100644
--- a/docs/reference/camel/tmpl/camel-folder-summary.sgml
+++ b/docs/reference/camel/tmpl/camel-folder-summary.sgml
@@ -323,32 +323,12 @@ CamelFolderSummary
 @Returns: 
 
 
-<!-- ##### FUNCTION camel_folder_summary_cache_size ##### -->
+<!-- ##### FUNCTION camel_folder_summary_prepare_fetch_all ##### -->
 <para>
 
 </para>
 
 @s: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_folder_summary_reload_from_db ##### -->
-<para>
-
-</para>
-
- s: 
- ex: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_folder_summary_ensure_infos_loaded ##### -->
-<para>
-
-</para>
-
- s: 
- at_least: 
 @ex: 
 
 
@@ -1067,3 +1047,32 @@ CamelFolderSummary
 @Returns: 
 
 
+<!-- ##### ENUM CamelFolderSummaryLock ##### -->
+<para>
+
+</para>
+
+ CFS_SUMMARY_LOCK: 
+ CFS_IO_LOCK: 
+ CFS_FILTER_LOCK: 
+ CFS_ALLOC_LOCK: 
+ CFS_REF_LOCK: 
+
+<!-- ##### FUNCTION camel_folder_summary_lock ##### -->
+<para>
+
+</para>
+
+ summary: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_folder_summary_unlock ##### -->
+<para>
+
+</para>
+
+ summary: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-folder.sgml b/docs/reference/camel/tmpl/camel-folder.sgml
index 0090695..3cc749e 100644
--- a/docs/reference/camel/tmpl/camel-folder.sgml
+++ b/docs/reference/camel/tmpl/camel-folder.sgml
@@ -26,6 +26,26 @@ CamelFolder
 </para>
 
 
+<!-- ##### ARG CamelFolder:description ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG CamelFolder:full-name ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG CamelFolder:name ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG CamelFolder:parent-store ##### -->
+<para>
+
+</para>
+
 <!-- ##### STRUCT CamelFolderChangeInfo ##### -->
 <para>
 
@@ -96,17 +116,6 @@ CamelFolder
 
 
 
-<!-- ##### FUNCTION camel_folder_construct ##### -->
-<para>
-
-</para>
-
- folder: 
- parent_store: 
- full_name: 
- name: 
-
-
 <!-- ##### FUNCTION camel_folder_refresh_info ##### -->
 <para>
 
@@ -165,6 +174,15 @@ CamelFolder
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_folder_set_name ##### -->
+<para>
+
+</para>
+
+ folder: 
+ name: 
+
+
 <!-- ##### FUNCTION camel_folder_get_full_name ##### -->
 <para>
 
@@ -174,6 +192,33 @@ CamelFolder
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_folder_set_full_name ##### -->
+<para>
+
+</para>
+
+ folder: 
+ full_name: 
+
+
+<!-- ##### FUNCTION camel_folder_get_description ##### -->
+<para>
+
+</para>
+
+ folder: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_folder_set_description ##### -->
+<para>
+
+</para>
+
+ folder: 
+ description: 
+
+
 <!-- ##### FUNCTION camel_folder_get_permanent_flags ##### -->
 <para>
 
@@ -532,6 +577,15 @@ CamelFolder
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_folder_get_frozen_count ##### -->
+<para>
+
+</para>
+
+ folder: 
+ Returns: 
+
+
 <!-- ##### FUNCTION camel_folder_get_quota_info ##### -->
 <para>
 
@@ -730,3 +784,29 @@ CamelFolder
 @uid: 
 
 
+<!-- ##### ENUM CamelFolderLock ##### -->
+<para>
+
+</para>
+
+ CF_CHANGE_LOCK: 
+ CF_REC_LOCK: 
+
+<!-- ##### FUNCTION camel_folder_lock ##### -->
+<para>
+
+</para>
+
+ folder: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_folder_unlock ##### -->
+<para>
+
+</para>
+
+ folder: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-gpg-context.sgml b/docs/reference/camel/tmpl/camel-gpg-context.sgml
index 4593441..0f8b2c8 100644
--- a/docs/reference/camel/tmpl/camel-gpg-context.sgml
+++ b/docs/reference/camel/tmpl/camel-gpg-context.sgml
@@ -40,6 +40,15 @@ CamelGpgContext
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_gpg_context_get_always_trust ##### -->
+<para>
+
+</para>
+
+ context: 
+ Returns: 
+
+
 <!-- ##### FUNCTION camel_gpg_context_set_always_trust ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-index.sgml b/docs/reference/camel/tmpl/camel-index.sgml
index 1a81adc..445689f 100644
--- a/docs/reference/camel/tmpl/camel-index.sgml
+++ b/docs/reference/camel/tmpl/camel-index.sgml
@@ -143,6 +143,16 @@ CamelIndex
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_index_set_normalize ##### -->
+<para>
+
+</para>
+
+ index: 
+ func: 
+ data: 
+
+
 <!-- ##### FUNCTION camel_index_sync ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-object.sgml b/docs/reference/camel/tmpl/camel-object.sgml
index c5c14e1..bde393b 100644
--- a/docs/reference/camel/tmpl/camel-object.sgml
+++ b/docs/reference/camel/tmpl/camel-object.sgml
@@ -26,6 +26,11 @@ CamelObject
 </para>
 
 
+<!-- ##### ARG CamelObject:state-filename ##### -->
+<para>
+
+</para>
+
 <!-- ##### TYPEDEF CamelObjectHookID ##### -->
 <para>
 
@@ -52,6 +57,13 @@ CamelObject
 @Param3: 
 
 
+<!-- ##### ENUM CamelParamFlags ##### -->
+<para>
+
+</para>
+
+ CAMEL_PARAM_PERSISTENT: 
+
 <!-- ##### FUNCTION camel_object_class_add_event ##### -->
 <para>
 
@@ -104,76 +116,40 @@ CamelObject
 @event_data: 
 
 
-<!-- ##### FUNCTION camel_object_set ##### -->
-<para>
-
-</para>
-
- obj: 
- ex: 
- Varargs: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_object_setv ##### -->
-<para>
-
-</para>
-
- obj: 
- ex: 
- Param3: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_object_get ##### -->
-<para>
-
-</para>
-
- obj: 
- ex: 
- Varargs: 
- Returns: 
-
-
-<!-- ##### FUNCTION camel_object_getv ##### -->
+<!-- ##### FUNCTION camel_object_state_read ##### -->
 <para>
 
 </para>
 
- obj: 
- ex: 
- Param3: 
+ object: 
 @Returns: 
 
 
-<!-- ##### FUNCTION camel_object_state_read ##### -->
+<!-- ##### FUNCTION camel_object_state_write ##### -->
 <para>
 
 </para>
 
- vo: 
+ object: 
 @Returns: 
 
 
-<!-- ##### FUNCTION camel_object_state_write ##### -->
+<!-- ##### FUNCTION camel_object_get_state_filename ##### -->
 <para>
 
 </para>
 
- vo: 
+ object: 
 @Returns: 
 
 
-<!-- ##### FUNCTION camel_object_free ##### -->
+<!-- ##### FUNCTION camel_object_set_state_filename ##### -->
 <para>
 
 </para>
 
- vo: 
- tag: 
- value: 
+ object: 
+ state_filename: 
 
 
 <!-- ##### STRUCT CamelObjectBag ##### -->
diff --git a/docs/reference/camel/tmpl/camel-offline-folder.sgml b/docs/reference/camel/tmpl/camel-offline-folder.sgml
index d7ddf1b..15bd22d 100644
--- a/docs/reference/camel/tmpl/camel-offline-folder.sgml
+++ b/docs/reference/camel/tmpl/camel-offline-folder.sgml
@@ -26,6 +26,29 @@ CamelOfflineFolder
 </para>
 
 
+<!-- ##### ARG CamelOfflineFolder:offline-sync ##### -->
+<para>
+
+</para>
+
+<!-- ##### FUNCTION camel_offline_folder_get_offline_sync ##### -->
+<para>
+
+</para>
+
+ offline: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_offline_folder_set_offline_sync ##### -->
+<para>
+
+</para>
+
+ offline: 
+ offline_sync: 
+
+
 <!-- ##### FUNCTION camel_offline_folder_downsync ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-sasl.sgml b/docs/reference/camel/tmpl/camel-sasl.sgml
index e6050d8..f44bc6b 100644
--- a/docs/reference/camel/tmpl/camel-sasl.sgml
+++ b/docs/reference/camel/tmpl/camel-sasl.sgml
@@ -79,6 +79,51 @@ CamelSasl
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_sasl_get_authenticated ##### -->
+<para>
+
+</para>
+
+ sasl: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_sasl_set_authenticated ##### -->
+<para>
+
+</para>
+
+ sasl: 
+ authenticated: 
+
+
+<!-- ##### FUNCTION camel_sasl_get_mechanism ##### -->
+<para>
+
+</para>
+
+ sasl: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_sasl_get_service ##### -->
+<para>
+
+</para>
+
+ sasl: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_sasl_get_service_name ##### -->
+<para>
+
+</para>
+
+ sasl: 
+ Returns: 
+
+
 <!-- ##### FUNCTION camel_sasl_authtype_list ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-service.sgml b/docs/reference/camel/tmpl/camel-service.sgml
index 0720ac4..f625811 100644
--- a/docs/reference/camel/tmpl/camel-service.sgml
+++ b/docs/reference/camel/tmpl/camel-service.sgml
@@ -26,41 +26,6 @@ CamelService
 </para>
 
 
-<!-- ##### MACRO CAMEL_SERVICE_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO CAMEL_SERVICE_AUTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO CAMEL_SERVICE_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO CAMEL_SERVICE_PORT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO CAMEL_SERVICE_PATH ##### -->
-<para>
-
-</para>
-
-
-
 <!-- ##### ENUM CamelServiceConnectionStatus ##### -->
 <para>
 
@@ -179,3 +144,29 @@ CamelService
 @Returns: 
 
 
+<!-- ##### ENUM CamelServiceLock ##### -->
+<para>
+
+</para>
+
+ CS_REC_CONNECT_LOCK: 
+ CS_CONNECT_OP_LOCK: 
+
+<!-- ##### FUNCTION camel_service_lock ##### -->
+<para>
+
+</para>
+
+ service: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_service_unlock ##### -->
+<para>
+
+</para>
+
+ service: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-session.sgml b/docs/reference/camel/tmpl/camel-session.sgml
index 002c8a6..124429b 100644
--- a/docs/reference/camel/tmpl/camel-session.sgml
+++ b/docs/reference/camel/tmpl/camel-session.sgml
@@ -327,3 +327,29 @@ CamelSession
 @ex: 
 
 
+<!-- ##### ENUM CamelSessionLock ##### -->
+<para>
+
+</para>
+
+ CS_SESSION_LOCK: 
+ CS_THREAD_LOCK: 
+
+<!-- ##### FUNCTION camel_session_lock ##### -->
+<para>
+
+</para>
+
+ session: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_session_unlock ##### -->
+<para>
+
+</para>
+
+ session: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-store-summary.sgml b/docs/reference/camel/tmpl/camel-store-summary.sgml
index a59e8d8..f780a63 100644
--- a/docs/reference/camel/tmpl/camel-store-summary.sgml
+++ b/docs/reference/camel/tmpl/camel-store-summary.sgml
@@ -321,3 +321,30 @@ CamelStoreSummary
 @i: 
 
 
+<!-- ##### ENUM CamelStoreSummaryLock ##### -->
+<para>
+
+</para>
+
+ CSS_SUMMARY_LOCK: 
+ CSS_IO_LOCK: 
+ CSS_REF_LOCK: 
+
+<!-- ##### FUNCTION camel_store_summary_lock ##### -->
+<para>
+
+</para>
+
+ summary: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_store_summary_unlock ##### -->
+<para>
+
+</para>
+
+ summary: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-store.sgml b/docs/reference/camel/tmpl/camel-store.sgml
index 0ed8d91..1ad8b7a 100644
--- a/docs/reference/camel/tmpl/camel-store.sgml
+++ b/docs/reference/camel/tmpl/camel-store.sgml
@@ -546,3 +546,28 @@ CamelStore
 @Returns: 
 
 
+<!-- ##### ENUM CamelStoreLock ##### -->
+<para>
+
+</para>
+
+ CS_FOLDER_LOCK: 
+
+<!-- ##### FUNCTION camel_store_lock ##### -->
+<para>
+
+</para>
+
+ store: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_store_unlock ##### -->
+<para>
+
+</para>
+
+ store: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-stream-filter.sgml b/docs/reference/camel/tmpl/camel-stream-filter.sgml
index 4ca78d1..3eb7f93 100644
--- a/docs/reference/camel/tmpl/camel-stream-filter.sgml
+++ b/docs/reference/camel/tmpl/camel-stream-filter.sgml
@@ -26,6 +26,24 @@ CamelStreamFilter
 </para>
 
 
+<!-- ##### FUNCTION camel_stream_filter_new ##### -->
+<para>
+
+</para>
+
+ source: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_stream_filter_get_source ##### -->
+<para>
+
+</para>
+
+ stream: 
+ Returns: 
+
+
 <!-- ##### FUNCTION camel_stream_filter_add ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-stream-fs.sgml b/docs/reference/camel/tmpl/camel-stream-fs.sgml
index fc7c111..8d4a787 100644
--- a/docs/reference/camel/tmpl/camel-stream-fs.sgml
+++ b/docs/reference/camel/tmpl/camel-stream-fs.sgml
@@ -70,3 +70,12 @@ CamelStreamFs
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_stream_fs_get_fd ##### -->
+<para>
+
+</para>
+
+ stream: 
+ Returns: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-stream-mem.sgml b/docs/reference/camel/tmpl/camel-stream-mem.sgml
index cc9b375..293d25a 100644
--- a/docs/reference/camel/tmpl/camel-stream-mem.sgml
+++ b/docs/reference/camel/tmpl/camel-stream-mem.sgml
@@ -62,6 +62,15 @@ CamelStreamMem
 @mem: 
 
 
+<!-- ##### FUNCTION camel_stream_mem_get_byte_array ##### -->
+<para>
+
+</para>
+
+ mem: 
+ Returns: 
+
+
 <!-- ##### FUNCTION camel_stream_mem_set_byte_array ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-transport.sgml b/docs/reference/camel/tmpl/camel-transport.sgml
index 79b89e9..cb8a6c8 100644
--- a/docs/reference/camel/tmpl/camel-transport.sgml
+++ b/docs/reference/camel/tmpl/camel-transport.sgml
@@ -39,3 +39,28 @@ CamelTransport
 @Returns: 
 
 
+<!-- ##### ENUM CamelTransportLock ##### -->
+<para>
+
+</para>
+
+ CT_SEND_LOCK: 
+
+<!-- ##### FUNCTION camel_transport_lock ##### -->
+<para>
+
+</para>
+
+ transport: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_transport_unlock ##### -->
+<para>
+
+</para>
+
+ transport: 
+ lock: 
+
+
diff --git a/docs/reference/camel/tmpl/camel-unused.sgml b/docs/reference/camel/tmpl/camel-unused.sgml
index 0b60cb8..4f23646 100644
--- a/docs/reference/camel/tmpl/camel-unused.sgml
+++ b/docs/reference/camel/tmpl/camel-unused.sgml
@@ -54,6 +54,34 @@ address-data
 addresses
 
 
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:Image ##### -->
+
+
+
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:Long_Description ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:See_Also ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:Short_Description ##### -->
+
+
+
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:Stability_Level ##### -->
+
+
+
+<!-- ##### SECTION ./tmpl/camel-arg.sgml:Title ##### -->
+camel-arg
+
+
 <!-- ##### SECTION ./tmpl/camel-digest-folder.sgml:Long_Description ##### -->
 <para>
 
@@ -2226,6 +2254,12 @@ CamelTestSession
 streams
 
 
+<!-- ##### MACRO CAMEL_ARGV_MAX ##### -->
+<para>
+
+</para>
+
+
 <!-- ##### MACRO CAMEL_CHECK_CAST ##### -->
 <para>
 
@@ -2550,6 +2584,36 @@ streams
 </para>
 
 
+<!-- ##### MACRO CAMEL_SERVICE_AUTH ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO CAMEL_SERVICE_HOSTNAME ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO CAMEL_SERVICE_PATH ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO CAMEL_SERVICE_PORT ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO CAMEL_SERVICE_USERNAME ##### -->
+<para>
+
+</para>
+
+
 <!-- ##### MACRO CAMEL_SMTP_TRANSPORT_8BITMIME ##### -->
 <para>
 
@@ -2580,6 +2644,38 @@ streams
 </para>
 
 
+<!-- ##### STRUCT CamelArg ##### -->
+<para>
+
+</para>
+
+ tag: 
+
+<!-- ##### STRUCT CamelArgGet ##### -->
+<para>
+
+</para>
+
+ tag: 
+
+<!-- ##### STRUCT CamelArgGetV ##### -->
+<para>
+
+</para>
+
+ ap: 
+ argc: 
+ argv: 
+
+<!-- ##### STRUCT CamelArgV ##### -->
+<para>
+
+</para>
+
+ ap: 
+ argc: 
+ argv: 
+
 <!-- ##### STRUCT CamelDigestFolder ##### -->
 <para>
 
@@ -2602,6 +2698,16 @@ streams
 
 @parent_object: 
 
+<!-- ##### ENUM CamelDiscoDiaryArgType ##### -->
+<para>
+
+</para>
+
+ CAMEL_DISCO_DIARY_ARG_NONE: 
+ CAMEL_DISCO_DIARY_ARG_FOLDER: 
+ CAMEL_DISCO_DIARY_ARG_UID: 
+ CAMEL_DISCO_DIARY_ARG_UID_LIST: 
+
 <!-- ##### STRUCT CamelGroupwiseFolder ##### -->
 <para>
 
@@ -3651,6 +3757,15 @@ streams
 @lineptr: 
 @lineend: 
 
+<!-- ##### STRUCT CamelProperty ##### -->
+<para>
+
+</para>
+
+ tag: 
+ name: 
+ description: 
+
 <!-- ##### STRUCT CamelSendmailTransport ##### -->
 <para>
 
@@ -4167,6 +4282,75 @@ streams
 @ai_canonname: 
 @ai_next: 
 
+<!-- ##### MACRO ca_double ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO ca_int ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO ca_object ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO ca_ptr ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO ca_str ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### FUNCTION camel_arggetv_build ##### -->
+<para>
+
+</para>
+
+ tv: 
+ Returns: 
+
+<!-- ##### FUNCTION camel_argv_build ##### -->
+<para>
+
+</para>
+
+ tv: 
+ Returns: 
+
+<!-- ##### MACRO camel_argv_end ##### -->
+<para>
+
+</para>
+
+ tv: 
+
+<!-- ##### MACRO camel_argv_ignore ##### -->
+<para>
+
+</para>
+
+ tv: 
+ i: 
+
+<!-- ##### MACRO camel_argv_start ##### -->
+<para>
+
+</para>
+
+ tv: 
+ last: 
+
 <!-- ##### FUNCTION camel_base64_decode_simple ##### -->
 <para>
 
@@ -4328,6 +4512,16 @@ streams
 @n: 
 @Returns: 
 
+<!-- ##### FUNCTION camel_folder_construct ##### -->
+<para>
+
+</para>
+
+ folder: 
+ parent_store: 
+ full_name: 
+ name: 
+
 <!-- ##### FUNCTION camel_folder_summary_array_free ##### -->
 <para>
 
@@ -4336,6 +4530,32 @@ streams
 @summary: 
 @array: 
 
+<!-- ##### FUNCTION camel_folder_summary_cache_size ##### -->
+<para>
+
+</para>
+
+ s: 
+ Returns: 
+
+<!-- ##### FUNCTION camel_folder_summary_ensure_infos_loaded ##### -->
+<para>
+
+</para>
+
+ s: 
+ at_least: 
+ ex: 
+
+<!-- ##### FUNCTION camel_folder_summary_reload_from_db ##### -->
+<para>
+
+</para>
+
+ s: 
+ ex: 
+ Returns: 
+
 <!-- ##### FUNCTION camel_groupwise_journal_append ##### -->
 <para>
 
@@ -6689,6 +6909,25 @@ streams
 @ctype: 
 @Returns: 
 
+<!-- ##### FUNCTION camel_object_free ##### -->
+<para>
+
+</para>
+
+ vo: 
+ tag: 
+ value: 
+
+<!-- ##### FUNCTION camel_object_get ##### -->
+<para>
+
+</para>
+
+ obj: 
+ ex: 
+ Varargs: 
+ Returns: 
+
 <!-- ##### FUNCTION camel_object_get_int ##### -->
 <para>
 
@@ -6718,6 +6957,16 @@ streams
 @tag: 
 @Returns: 
 
+<!-- ##### FUNCTION camel_object_getv ##### -->
+<para>
+
+</para>
+
+ obj: 
+ ex: 
+ Param3: 
+ Returns: 
+
 <!-- ##### FUNCTION camel_object_is ##### -->
 <para>
 
@@ -6770,6 +7019,26 @@ streams
 @Param1: 
 @Returns: 
 
+<!-- ##### FUNCTION camel_object_set ##### -->
+<para>
+
+</para>
+
+ obj: 
+ ex: 
+ Varargs: 
+ Returns: 
+
+<!-- ##### FUNCTION camel_object_setv ##### -->
+<para>
+
+</para>
+
+ obj: 
+ ex: 
+ Param3: 
+ Returns: 
+
 <!-- ##### VARIABLE camel_object_type ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-vee-folder.sgml b/docs/reference/camel/tmpl/camel-vee-folder.sgml
index 78d43b0..b23a34b 100644
--- a/docs/reference/camel/tmpl/camel-vee-folder.sgml
+++ b/docs/reference/camel/tmpl/camel-vee-folder.sgml
@@ -50,9 +50,6 @@ CamelVeeFolder
 </para>
 
 @vf: 
- parent_store: 
- full: 
- name: 
 @flags: 
 
 
@@ -150,3 +147,48 @@ CamelVeeFolder
 @ex: 
 
 
+<!-- ##### FUNCTION camel_vee_folder_get_unread_vfolder ##### -->
+<para>
+
+</para>
+
+ folder: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_vee_folder_set_unread_vfolder ##### -->
+<para>
+
+</para>
+
+ folder: 
+ unread_vfolder: 
+
+
+<!-- ##### ENUM CamelVeeFolderLock ##### -->
+<para>
+
+</para>
+
+ CVF_SUMMARY_LOCK: 
+ CVF_SUBFOLDER_LOCK: 
+ CVF_CHANGED_LOCK: 
+
+<!-- ##### FUNCTION camel_vee_folder_lock ##### -->
+<para>
+
+</para>
+
+ folder: 
+ lock: 
+
+
+<!-- ##### FUNCTION camel_vee_folder_unlock ##### -->
+<para>
+
+</para>
+
+ folder: 
+ lock: 
+
+



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