[evolution/account-mgmt: 18/52] Adapt calendar/gui to the new ESource API.



commit 388abcb29a346b9d30d6522ee4e4de87349432a8
Author: Matthew Barnes <mbarnes redhat com>
Date:   Mon Dec 13 16:05:32 2010 -0500

    Adapt calendar/gui to the new ESource API.

 calendar/alarm-notify/config-data.h         |    1 -
 calendar/gui/dialogs/Makefile.am            |    3 -
 calendar/gui/dialogs/alarm-dialog.c         |    7 +-
 calendar/gui/dialogs/alarm-dialog.h         |    2 +
 calendar/gui/dialogs/alarm-list-dialog.c    |   13 +-
 calendar/gui/dialogs/alarm-list-dialog.h    |    5 +-
 calendar/gui/dialogs/calendar-setup.c       |  717 ---------------------------
 calendar/gui/dialogs/calendar-setup.h       |   44 --
 calendar/gui/dialogs/comp-editor.c          |   43 ++-
 calendar/gui/dialogs/copy-source-dialog.c   |   10 +-
 calendar/gui/dialogs/copy-source-dialog.h   |    3 +-
 calendar/gui/dialogs/e-delegate-dialog.c    |   11 +-
 calendar/gui/dialogs/e-delegate-dialog.h    |    5 +-
 calendar/gui/dialogs/e-send-options-utils.c |   60 ++-
 calendar/gui/dialogs/e-send-options-utils.h |    2 +-
 calendar/gui/dialogs/event-editor.c         |   19 +-
 calendar/gui/dialogs/event-page.c           |  133 +++---
 calendar/gui/dialogs/event-page.ui          |    1 +
 calendar/gui/dialogs/memo-page.c            |  134 +++---
 calendar/gui/dialogs/memo-page.ui           |    1 +
 calendar/gui/dialogs/select-source-dialog.c |   54 +--
 calendar/gui/dialogs/select-source-dialog.h |    3 +-
 calendar/gui/dialogs/task-editor.c          |   14 +-
 calendar/gui/dialogs/task-page.c            |  123 ++---
 calendar/gui/dialogs/task-page.ui           |    1 +
 calendar/gui/e-cal-component-preview.c      |    2 +-
 calendar/gui/e-cal-config.c                 |    2 +
 calendar/gui/e-cal-event.c                  |    4 -
 calendar/gui/e-cal-event.h                  |    4 -
 calendar/gui/e-cal-model-calendar.c         |   16 +-
 calendar/gui/e-cal-model-calendar.h         |    2 +-
 calendar/gui/e-cal-model-memos.c            |    9 +-
 calendar/gui/e-cal-model-memos.h            |    2 +-
 calendar/gui/e-cal-model-tasks.c            |    8 +-
 calendar/gui/e-cal-model-tasks.h            |    2 +-
 calendar/gui/e-cal-model.c                  |  138 ++++--
 calendar/gui/e-cal-model.h                  |    8 +-
 calendar/gui/e-calendar-selector.c          |  118 +++++-
 calendar/gui/e-calendar-selector.h          |    3 +-
 calendar/gui/e-calendar-view.c              |   65 ++-
 calendar/gui/e-day-view.c                   |   77 +++-
 calendar/gui/e-meeting-list-view.c          |   17 +-
 calendar/gui/e-meeting-store.c              |   37 +-
 calendar/gui/e-memo-list-selector.c         |  134 +++++-
 calendar/gui/e-memo-list-selector.h         |    3 +-
 calendar/gui/e-task-list-selector.c         |  134 +++++-
 calendar/gui/e-task-list-selector.h         |    3 +-
 calendar/gui/e-task-table.c                 |    4 +-
 calendar/gui/e-week-view.c                  |   16 +-
 calendar/gui/gnome-cal.c                    |   63 +++-
 calendar/gui/gnome-cal.h                    |    5 +-
 calendar/gui/itip-utils.c                   |  270 +++++++----
 calendar/gui/itip-utils.h                   |   27 +-
 53 files changed, 1262 insertions(+), 1320 deletions(-)
---
diff --git a/calendar/alarm-notify/config-data.h b/calendar/alarm-notify/config-data.h
index 421ced5..8eb0cf8 100644
--- a/calendar/alarm-notify/config-data.h
+++ b/calendar/alarm-notify/config-data.h
@@ -28,7 +28,6 @@
 
 #include <libical/ical.h>
 #include <libecal/e-cal-client.h>
-#include <libedataserver/e-source-list.h>
 
 icaltimezone *	config_data_get_timezone	(void);
 gboolean	config_data_get_24_hour_format	(void);
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am
index b7235ed..02af20b 100644
--- a/calendar/gui/dialogs/Makefile.am
+++ b/calendar/gui/dialogs/Makefile.am
@@ -24,7 +24,6 @@ ecalendarinclude_HEADERS =		\
 	comp-editor.h			\
 	alarm-dialog.h			\
 	alarm-list-dialog.h		\
-	calendar-setup.h		\
 	cancel-comp.h			\
 	changed-comp.h			\
 	comp-editor-util.h		\
@@ -59,8 +58,6 @@ libcal_dialogs_la_SOURCES =		\
 	alarm-dialog.h			\
 	alarm-list-dialog.c		\
 	alarm-list-dialog.h		\
-	calendar-setup.c		\
-	calendar-setup.h		\
 	cancel-comp.c			\
 	cancel-comp.h			\
 	changed-comp.c			\
diff --git a/calendar/gui/dialogs/alarm-dialog.c b/calendar/gui/dialogs/alarm-dialog.c
index 065d11b..c8670d2 100644
--- a/calendar/gui/dialogs/alarm-dialog.c
+++ b/calendar/gui/dialogs/alarm-dialog.c
@@ -53,6 +53,8 @@ typedef struct {
 	/* The client */
 	ECalClient *cal_client;
 
+	ESourceRegistry *registry;
+
 	/* Toplevel */
 	GtkWidget *toplevel;
 
@@ -911,7 +913,7 @@ setup_select_names (Dialog *dialog)
 	ENameSelectorModel *name_selector_model;
 	ENameSelectorDialog *name_selector_dialog;
 
-	dialog->name_selector = e_name_selector_new ();
+	dialog->name_selector = e_name_selector_new (dialog->registry);
 	e_name_selector_load_books (dialog->name_selector);
 	name_selector_model = e_name_selector_peek_model (dialog->name_selector);
 
@@ -1216,6 +1218,7 @@ init_widgets (Dialog *dialog)
 
 gboolean
 alarm_dialog_run (GtkWidget *parent,
+                  ESourceRegistry *registry,
                   ECalClient *cal_client,
                   ECalComponentAlarm *alarm)
 {
@@ -1223,10 +1226,12 @@ alarm_dialog_run (GtkWidget *parent,
 	GtkWidget *container;
 	gint response_id;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
 	g_return_val_if_fail (alarm != NULL, FALSE);
 
 	dialog.alarm = alarm;
 	dialog.cal_client = cal_client;
+	dialog.registry = registry;
 
 	dialog.builder = gtk_builder_new ();
 	e_load_ui_builder_definition (dialog.builder, "alarm-dialog.ui");
diff --git a/calendar/gui/dialogs/alarm-dialog.h b/calendar/gui/dialogs/alarm-dialog.h
index 42c72d6..6e6d658 100644
--- a/calendar/gui/dialogs/alarm-dialog.h
+++ b/calendar/gui/dialogs/alarm-dialog.h
@@ -32,10 +32,12 @@
 
 #include <libecal/e-cal-client.h>
 #include <libecal/e-cal-component.h>
+#include <libedataserver/e-source-registry.h>
 
 G_BEGIN_DECLS
 
 gboolean	alarm_dialog_run		(GtkWidget *parent,
+						 ESourceRegistry *registry,
 						 ECalClient *cal_client,
 						 ECalComponentAlarm *alarm);
 
diff --git a/calendar/gui/dialogs/alarm-list-dialog.c b/calendar/gui/dialogs/alarm-list-dialog.c
index 997f85a..5c318c0 100644
--- a/calendar/gui/dialogs/alarm-list-dialog.c
+++ b/calendar/gui/dialogs/alarm-list-dialog.c
@@ -43,6 +43,7 @@
 
 typedef struct {
 	GtkBuilder *builder;
+	ESourceRegistry *registry;
 
 	/* The client */
 	ECalClient *cal_client;
@@ -126,7 +127,7 @@ add_clicked_cb (GtkButton *button,
 	icalproperty_set_x_name (icalprop, "X-EVOLUTION-NEEDS-DESCRIPTION");
 	icalcomponent_add_property (icalcomp, icalprop);
 
-	if (alarm_dialog_run (dialog->toplevel, dialog->cal_client, alarm)) {
+	if (alarm_dialog_run (dialog->toplevel, dialog->registry, dialog->cal_client, alarm)) {
 		e_alarm_list_append (dialog->list_store, &iter, alarm);
 		gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter);
 	} else {
@@ -159,7 +160,7 @@ edit_clicked_cb (GtkButton *button,
 	alarm = (ECalComponentAlarm *) e_alarm_list_get_alarm (dialog->list_store, &iter);
 	path = gtk_tree_model_get_path (GTK_TREE_MODEL (dialog->list_store), &iter);
 
-	if (alarm_dialog_run (dialog->toplevel, dialog->cal_client, alarm)) {
+	if (alarm_dialog_run (dialog->toplevel, dialog->registry, dialog->cal_client, alarm)) {
 		gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter);
 		gtk_tree_model_row_changed (GTK_TREE_MODEL (dialog->list_store), path, &iter);
 	}
@@ -265,6 +266,7 @@ init_widgets (Dialog *dialog)
 
 gboolean
 alarm_list_dialog_run (GtkWidget *parent,
+                       ESourceRegistry *registry,
                        ECalClient *cal_client,
                        EAlarmList *list_store)
 {
@@ -272,6 +274,9 @@ alarm_list_dialog_run (GtkWidget *parent,
 	GtkWidget *container;
 	gint response_id;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+
+	dialog.registry = registry;
 	dialog.cal_client = cal_client;
 	dialog.list_store = list_store;
 
@@ -312,12 +317,14 @@ alarm_list_dialog_run (GtkWidget *parent,
 }
 
 GtkWidget *
-alarm_list_dialog_peek (ECalClient *cal_client,
+alarm_list_dialog_peek (ESourceRegistry *registry,
+                        ECalClient *cal_client,
                         EAlarmList *list_store)
 {
 	Dialog *dialog;
 
 	dialog = (Dialog *) g_new (Dialog, 1);
+	dialog->registry = registry;
 	dialog->cal_client = cal_client;
 	dialog->list_store = list_store;
 
diff --git a/calendar/gui/dialogs/alarm-list-dialog.h b/calendar/gui/dialogs/alarm-list-dialog.h
index 5746664..1717d12 100644
--- a/calendar/gui/dialogs/alarm-list-dialog.h
+++ b/calendar/gui/dialogs/alarm-list-dialog.h
@@ -32,14 +32,17 @@
 
 #include <libecal/e-cal-client.h>
 #include <libecal/e-cal-component.h>
+#include <libedataserver/e-source-registry.h>
 #include "../e-alarm-list.h"
 
 G_BEGIN_DECLS
 
 gboolean	alarm_list_dialog_run		(GtkWidget *parent,
+						 ESourceRegistry *registry,
 						 ECalClient *cal_client,
 						 EAlarmList *list_store);
-GtkWidget *	alarm_list_dialog_peek		(ECalClient *cal_client,
+GtkWidget *	alarm_list_dialog_peek		(ESourceRegistry *registry,
+						 ECalClient *cal_client,
 						 EAlarmList *list_store);
 void		alarm_list_dialog_set_client	(GtkWidget *dlg_box,
 						 ECalClient *cal_client);
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c
index 641666b..f60e627 100644
--- a/calendar/gui/dialogs/comp-editor.c
+++ b/calendar/gui/dialogs/comp-editor.c
@@ -479,6 +479,8 @@ save_comp (CompEditor *editor)
 	CompEditorPrivate *priv;
 	CompEditorFlags flags;
 	ECalComponent *clone;
+	ESourceRegistry *registry;
+	EShell *shell;
 	GList *l;
 	gboolean result;
 	GError *error = NULL;
@@ -493,6 +495,9 @@ save_comp (CompEditor *editor)
 		return TRUE;
 
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	/* Stop listening because we are about to change things */
 	if (priv->view) {
@@ -526,8 +531,8 @@ save_comp (CompEditor *editor)
 
 	/* If we are not the organizer, we don't update the sequence number */
 	if (!e_cal_component_has_organizer (clone) ||
-		itip_organizer_is_user (clone, priv->cal_client) ||
-		itip_sentby_is_user (clone, priv->cal_client))
+		itip_organizer_is_user (registry, clone, priv->cal_client) ||
+		itip_sentby_is_user (registry, clone, priv->cal_client))
 		e_cal_component_commit_sequence (clone);
 	else
 		e_cal_component_abort_sequence (clone);
@@ -581,8 +586,8 @@ save_comp (CompEditor *editor)
 		if (priv->mod == CALOBJ_MOD_THIS) {
 			if (result && ((flags & COMP_EDITOR_DELEGATE) ||
 				!e_cal_component_has_organizer (clone) ||
-				itip_organizer_is_user (clone, priv->cal_client) ||
-				itip_sentby_is_user (clone, priv->cal_client)))
+				itip_organizer_is_user (registry, clone, priv->cal_client) ||
+				itip_sentby_is_user (registry, clone, priv->cal_client)))
 				e_cal_component_commit_sequence (clone);
 			else
 				e_cal_component_abort_sequence (clone);
@@ -679,6 +684,8 @@ save_comp_with_send (CompEditor *editor)
 {
 	CompEditorPrivate *priv;
 	CompEditorFlags flags;
+	ESourceRegistry *registry;
+	EShell *shell;
 	gboolean send, delegated, only_new_attendees = FALSE;
 	gboolean delegate;
 	gboolean strip_alarms = TRUE;
@@ -686,6 +693,10 @@ save_comp_with_send (CompEditor *editor)
 	priv = editor->priv;
 
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
+
 	send = priv->changed && priv->needs_send;
 	delegate = flags & COMP_EDITOR_DELEGATE;
 
@@ -715,8 +726,8 @@ save_comp_with_send (CompEditor *editor)
 			(only_new_attendees ?
 			COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY : 0));
 
-		if ((itip_organizer_is_user (priv->comp, priv->cal_client) ||
-			itip_sentby_is_user (priv->comp, priv->cal_client))) {
+		if ((itip_organizer_is_user (registry, priv->comp, priv->cal_client) ||
+			itip_sentby_is_user (registry, priv->comp, priv->cal_client))) {
 			if (e_cal_component_get_vtype (priv->comp) == E_CAL_COMPONENT_JOURNAL)
 				return comp_editor_send_comp (
 					editor, E_CAL_COMPONENT_METHOD_PUBLISH,
@@ -957,7 +968,7 @@ action_save_cb (GtkAction *action,
 		e_alert_submit (
 			E_ALERT_SINK (editor),
 			"calendar:prompt-read-only-cal-editor",
-			e_source_peek_name (
+			e_source_get_display_name (
 				e_client_get_source (E_CLIENT (priv->cal_client))),
 			NULL);
 		return;
@@ -969,7 +980,7 @@ action_save_cb (GtkAction *action,
 		e_alert_submit (
 			E_ALERT_SINK (editor),
 			"calendar:prompt-no-task-assignment-editor",
-			e_source_peek_name (
+			e_source_get_display_name (
 				e_client_get_source (E_CLIENT (priv->cal_client))),
 			NULL);
 		return;
@@ -2184,7 +2195,7 @@ prompt_and_save_changes (CompEditor *editor,
 			e_alert_submit (
 				E_ALERT_SINK (editor),
 				"calendar:prompt-read-only-cal-editor",
-				e_source_peek_name (
+				e_source_get_display_name (
 					e_client_get_source (E_CLIENT (priv->cal_client))),
 				NULL);
 			/* don't discard changes when selected readonly calendar */
@@ -2197,7 +2208,7 @@ prompt_and_save_changes (CompEditor *editor,
 			e_alert_submit (
 				E_ALERT_SINK (editor),
 				"calendar:prompt-no-task-assignment-editor",
-				e_source_peek_name (
+				e_source_get_display_name (
 					e_client_get_source (E_CLIENT (priv->cal_client))),
 				NULL);
 			return FALSE;
@@ -3203,6 +3214,8 @@ real_send_comp (CompEditor *editor,
 {
 	CompEditorPrivate *priv;
 	CompEditorFlags flags;
+	EShell *shell;
+	ESourceRegistry *registry;
 	ECalComponent *send_comp = NULL;
 	gchar *address = NULL;
 	GSList *users = NULL;
@@ -3212,6 +3225,9 @@ real_send_comp (CompEditor *editor,
 	priv = editor->priv;
 
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	if (priv->mod == CALOBJ_MOD_ALL && e_cal_component_is_instance (priv->comp)) {
 		/* Ensure we send the master object, not the instance only */
@@ -3240,7 +3256,8 @@ real_send_comp (CompEditor *editor,
 	/* The user updates the delegated status to the Organizer,
 	 * so remove all other attendees. */
 	if (flags & COMP_EDITOR_DELEGATE) {
-		address = itip_get_comp_attendee (send_comp, priv->cal_client);
+		address = itip_get_comp_attendee (
+			registry, send_comp, priv->cal_client);
 
 		if (address)
 			set_attendees_for_delegation (send_comp, address, method);
@@ -3250,7 +3267,7 @@ real_send_comp (CompEditor *editor,
 		e_client_check_capability (E_CLIENT (priv->cal_client),
 		CAL_STATIC_CAPABILITY_CREATE_MESSAGES)) {
 		if (itip_send_comp (
-			method, send_comp, priv->cal_client,
+			registry, method, send_comp, priv->cal_client,
 			NULL, NULL, users, strip_alarms,
 			priv->flags & COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY)) {
 			g_object_unref (send_comp);
@@ -3280,7 +3297,7 @@ real_send_comp (CompEditor *editor,
 		}
 
 		if (itip_send_comp (
-			method, send_comp, priv->cal_client,
+			registry, method, send_comp, priv->cal_client,
 			NULL, mime_attach_list, users, strip_alarms,
 			priv->flags & COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY)) {
 			gboolean saved = save_comp (editor);
diff --git a/calendar/gui/dialogs/copy-source-dialog.c b/calendar/gui/dialogs/copy-source-dialog.c
index 4b483db..21b8608 100644
--- a/calendar/gui/dialogs/copy-source-dialog.c
+++ b/calendar/gui/dialogs/copy-source-dialog.c
@@ -198,7 +198,6 @@ orig_source_opened_cb (GObject *source_object,
 
 	e_client_utils_open_new (
 		csdd->selected_source, csdd->obj_type, FALSE, NULL,
-		e_client_utils_authenticate_handler, csdd->parent,
 		dest_source_opened_cb, csdd);
 }
 
@@ -218,8 +217,8 @@ copy_source (const CopySourceDialogData *const_csdd)
 	csdd->obj_type = const_csdd->obj_type;
 	csdd->selected_source = g_object_ref (const_csdd->selected_source);
 
-	e_client_utils_open_new (csdd->orig_source, csdd->obj_type, FALSE, NULL,
-		e_client_utils_authenticate_handler, csdd->parent,
+	e_client_utils_open_new (
+		csdd->orig_source, csdd->obj_type, FALSE, NULL,
 		orig_source_opened_cb, csdd);
 }
 
@@ -231,11 +230,13 @@ copy_source (const CopySourceDialogData *const_csdd)
  */
 void
 copy_source_dialog (GtkWindow *parent,
+                    ESourceRegistry *registry,
                     ESource *source,
                     ECalClientSourceType obj_type)
 {
 	CopySourceDialogData csdd;
 
+	g_return_if_fail (E_IS_SOURCE_REGISTRY (registry));
 	g_return_if_fail (E_IS_SOURCE (source));
 	g_return_if_fail (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS ||
 			  obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS ||
@@ -249,7 +250,8 @@ copy_source_dialog (GtkWindow *parent,
 			obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS ? E_CLIENT_SOURCE_TYPE_MEMOS :
 			E_CLIENT_SOURCE_TYPE_LAST;
 
-	csdd.selected_source = select_source_dialog (parent, obj_type, source);
+	csdd.selected_source = select_source_dialog (
+		parent, registry, obj_type, source);
 	if (csdd.selected_source) {
 		copy_source (&csdd);
 
diff --git a/calendar/gui/dialogs/copy-source-dialog.h b/calendar/gui/dialogs/copy-source-dialog.h
index 5ac5140..01124d4 100644
--- a/calendar/gui/dialogs/copy-source-dialog.h
+++ b/calendar/gui/dialogs/copy-source-dialog.h
@@ -29,9 +29,10 @@
 #include <gtk/gtk.h>
 #include <libecal/e-cal-util.h>
 #include <libecal/e-cal-client.h>
-#include <libedataserver/e-source.h>
+#include <libedataserver/e-source-registry.h>
 
 void		copy_source_dialog		(GtkWindow *parent,
+						 ESourceRegistry *registry,
 						 ESource *source,
 						 ECalClientSourceType type);
 
diff --git a/calendar/gui/dialogs/e-delegate-dialog.c b/calendar/gui/dialogs/e-delegate-dialog.c
index 9b9d7b4..ca253ca 100644
--- a/calendar/gui/dialogs/e-delegate-dialog.c
+++ b/calendar/gui/dialogs/e-delegate-dialog.c
@@ -101,6 +101,7 @@ e_delegate_dialog_init (EDelegateDialog *edd)
 
 EDelegateDialog *
 e_delegate_dialog_construct (EDelegateDialog *edd,
+                             ESourceRegistry *registry,
                              const gchar *name,
                              const gchar *address)
 {
@@ -111,6 +112,7 @@ e_delegate_dialog_construct (EDelegateDialog *edd,
 	ENameSelectorDialog *name_selector_dialog;
 
 	g_return_val_if_fail (E_IS_DELEGATE_DIALOG (edd), NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
 
 	priv = edd->priv;
 
@@ -124,7 +126,7 @@ e_delegate_dialog_construct (EDelegateDialog *edd,
 		goto error;
 	}
 
-	priv->name_selector = e_name_selector_new ();
+	priv->name_selector = e_name_selector_new (registry);
 	e_name_selector_load_books (priv->name_selector);
 	name_selector_model = e_name_selector_peek_model (priv->name_selector);
 	e_name_selector_model_add_section (name_selector_model, section_name, section_name, NULL);
@@ -211,15 +213,18 @@ addressbook_response_cb (GtkWidget *widget,
  * editor could not be created.
  **/
 EDelegateDialog *
-e_delegate_dialog_new (const gchar *name,
+e_delegate_dialog_new (ESourceRegistry *registry,
+                       const gchar *name,
                        const gchar *address)
 {
 	EDelegateDialog *edd;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
 	edd = g_object_new (E_TYPE_DELEGATE_DIALOG, NULL);
 
 	return e_delegate_dialog_construct (
-		E_DELEGATE_DIALOG (edd), name, address);
+		E_DELEGATE_DIALOG (edd), registry, name, address);
 }
 
 gchar *
diff --git a/calendar/gui/dialogs/e-delegate-dialog.h b/calendar/gui/dialogs/e-delegate-dialog.h
index 5fb672b..85a0613 100644
--- a/calendar/gui/dialogs/e-delegate-dialog.h
+++ b/calendar/gui/dialogs/e-delegate-dialog.h
@@ -25,6 +25,7 @@
 #define E_DELEGATE_DIALOG_H
 
 #include <gtk/gtk.h>
+#include <libedataserver/e-source-registry.h>
 
 /* Standard GObject macros */
 #define E_TYPE_DELEGATE_DIALOG \
@@ -63,10 +64,12 @@ struct _EDelegateDialogClass {
 GType		e_delegate_dialog_get_type	(void);
 EDelegateDialog *
 		e_delegate_dialog_construct	(EDelegateDialog *etd,
+						 ESourceRegistry *registry,
 						 const gchar *name,
 						 const gchar *address);
 EDelegateDialog *
-		e_delegate_dialog_new		(const gchar *name,
+		e_delegate_dialog_new		(ESourceRegistry *registry,
+						 const gchar *name,
 						 const gchar *address);
 gchar *		e_delegate_dialog_get_delegate	(EDelegateDialog *etd);
 gchar *		e_delegate_dialog_get_delegate_name
diff --git a/calendar/gui/dialogs/e-send-options-utils.c b/calendar/gui/dialogs/e-send-options-utils.c
index 7805548..d438f16 100644
--- a/calendar/gui/dialogs/e-send-options-utils.c
+++ b/calendar/gui/dialogs/e-send-options-utils.c
@@ -31,6 +31,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <libedataserver/e-source-extension.h>
+
 void
 e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
                                        ESource *source,
@@ -38,24 +40,25 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 {
 	ESendOptionsGeneral *gopts = NULL;
 	ESendOptionsStatusTracking *sopts;
-	GConfClient *gconf = gconf_client_get_default ();
-	ESourceList *source_list;
-	const gchar *uid;
-	const gchar *value;
+	ESourceExtension *extension;
+	const gchar *extension_name;
+	gchar *value;
 
-	gopts = sod->data->gopts;
-	sopts = sod->data->sopts;
+	/* FIXME These is all GroupWise-specific settings.
+	 *       They absolutely do not belong here. */
 
-	if (!strcmp (type, "calendar"))
-		source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/calendar/sources");
-	else
-		source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/tasks/sources");
+	extension_name = "GroupWise Backend";
 
-	uid = e_source_peek_uid (source);
-	source = e_source_list_peek_source_by_uid (source_list, uid);
+	if (!e_source_has_extension (source, extension_name))
+		return;
+
+	extension = e_source_get_extension (source, extension_name);
+
+	gopts = sod->data->gopts;
+	sopts = sod->data->sopts;
 
 		/* priority */
-	value = e_source_get_property (source, "priority");
+	g_object_get (extension, "priority", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "high"))
 			gopts->priority = E_PRIORITY_HIGH;
@@ -66,8 +69,10 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 		else
 			gopts->priority = E_PRIORITY_UNDEFINED;
 	}
+	g_free (value);
+
 		/* Reply requested */
-	value = e_source_get_property (source, "reply-requested");
+	g_object_get (extension, "reply-requested", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			gopts->reply_enabled = FALSE;
@@ -79,8 +84,10 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 			gopts->reply_within = i;
 		}
 	}
+	g_free (value);
+
 		/* Delay delivery */
-	value = e_source_get_property (source, "delay-delivery");
+	g_object_get (extension, "delivery-delay", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			gopts->delay_enabled = FALSE;
@@ -89,8 +96,10 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 			gopts->delay_until = icaltime_as_timet (icaltime_from_string (value));
 		}
 	}
+	g_free (value);
+
 		/* Expiration Date */
-	value = e_source_get_property (source, "expiration");
+	g_object_get (extension, "expiration", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			gopts->expiration_enabled = FALSE;
@@ -103,8 +112,10 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 			gopts->expire_after = i;
 		}
 	}
+	g_free (value);
+
 		/* status tracking */
-	value = e_source_get_property (source, "status-tracking");
+	g_object_get (extension, "status-tracking", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			sopts->tracking_enabled = FALSE;
@@ -118,42 +129,45 @@ e_send_options_utils_set_default_data (ESendOptionsDialog *sod,
 				sopts->track_when = E_ALL;
 		}
 	}
+	g_free (value);
 
 		/* Return Notifications */
 
-	value = e_source_get_property (source, "return-open");
+	g_object_get (extension, "return-open", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			sopts->opened = E_RETURN_NOTIFY_NONE;
 		else
 			sopts->opened = E_RETURN_NOTIFY_MAIL;
 	}
+	g_free (value);
 
-	value = e_source_get_property (source, "return-accept");
+	g_object_get (extension, "return-accept", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			sopts->accepted = E_RETURN_NOTIFY_NONE;
 		else
 			sopts->accepted = E_RETURN_NOTIFY_MAIL;
 	}
+	g_free (value);
 
-	value = e_source_get_property (source, "return-decline");
+	g_object_get (extension, "return-decline", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			sopts->declined = E_RETURN_NOTIFY_NONE;
 		else
 			sopts->declined = E_RETURN_NOTIFY_MAIL;
 	}
+	g_free (value);
 
-	value = e_source_get_property (source, "return-complete");
+	g_object_get (extension, "return-complete", &value, NULL);
 	if (value) {
 		if (!strcmp (value, "none"))
 			sopts->completed = E_RETURN_NOTIFY_NONE;
 		else
 			sopts->completed = E_RETURN_NOTIFY_MAIL;
 	}
-
-	g_object_unref (gconf);
+	g_free (value);
 }
 
 void
diff --git a/calendar/gui/dialogs/e-send-options-utils.h b/calendar/gui/dialogs/e-send-options-utils.h
index c1a63a2..3ec7542 100644
--- a/calendar/gui/dialogs/e-send-options-utils.h
+++ b/calendar/gui/dialogs/e-send-options-utils.h
@@ -27,7 +27,7 @@
 
 #include "misc/e-send-options.h"
 #include <libecal/e-cal-component.h>
-#include <libedataserver/e-source-list.h>
+#include <libedataserver/e-source.h>
 
 void		e_send_options_utils_set_default_data
 						(ESendOptionsDialog *sod,
diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c
index 7d679e6..1460ff4 100644
--- a/calendar/gui/dialogs/event-editor.c
+++ b/calendar/gui/dialogs/event-editor.c
@@ -609,6 +609,8 @@ event_editor_edit_comp (CompEditor *editor,
 	ECalComponentDateTime dtstart, dtend;
 	ECalClient *client;
 	GSList *attendees = NULL;
+	ESourceRegistry *registry;
+	EShell *shell;
 
 	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
@@ -628,8 +630,11 @@ event_editor_edit_comp (CompEditor *editor,
 	if (COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp)
 		COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp (editor, comp);
 
+	shell = comp_editor_get_shell (editor);
 	client = comp_editor_get_client (editor);
 
+	registry = e_shell_get_registry (shell);
+
 	/* Get meeting related stuff */
 	e_cal_component_get_organizer (comp, &organizer);
 	e_cal_component_get_attendee_list (comp, &attendees);
@@ -639,7 +644,9 @@ event_editor_edit_comp (CompEditor *editor,
 		GSList *l;
 		gint row;
 		gchar *user_email;
-		user_email = itip_get_comp_attendee (comp, client);
+
+		user_email = itip_get_comp_attendee (
+			registry, comp, client);
 
 		if (!priv->meeting_shown) {
 			GtkAction *action;
@@ -707,7 +714,8 @@ event_editor_edit_comp (CompEditor *editor,
 
 	comp_editor_set_needs_send (
 		editor, priv->meeting_shown && (itip_organizer_is_user (
-		comp, client) || itip_sentby_is_user (comp, client)));
+		registry, comp, client) || itip_sentby_is_user (registry,
+		comp, client)));
 
 	priv->updating = FALSE;
 }
@@ -718,6 +726,8 @@ event_editor_send_comp (CompEditor *editor,
                         gboolean strip_alarms)
 {
 	EventEditorPrivate *priv;
+	EShell *shell;
+	ESourceRegistry *registry;
 	ECalComponent *comp = NULL;
 
 	priv = EVENT_EDITOR_GET_PRIVATE (editor);
@@ -727,6 +737,9 @@ event_editor_send_comp (CompEditor *editor,
 	    method == E_CAL_COMPONENT_METHOD_CANCEL)
 		goto parent;
 
+	shell = comp_editor_get_shell (editor);
+	registry = e_shell_get_registry (shell);
+
 	comp = event_page_get_cancel_comp (priv->event_page);
 	if (comp != NULL) {
 		ECalClient *client;
@@ -734,7 +747,7 @@ event_editor_send_comp (CompEditor *editor,
 
 		client = e_meeting_store_get_client (priv->model);
 		result = itip_send_comp (
-			E_CAL_COMPONENT_METHOD_CANCEL, comp,
+			registry, E_CAL_COMPONENT_METHOD_CANCEL, comp,
 			client, NULL, NULL, NULL, strip_alarms, FALSE);
 		g_object_unref (comp);
 
diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c
index 2df1c3c..56a1ce5 100644
--- a/calendar/gui/dialogs/event-page.c
+++ b/calendar/gui/dialogs/event-page.c
@@ -36,6 +36,8 @@
 #include <gdk/gdkkeysyms.h>
 
 #include <libecal/e-cal-time-util.h>
+#include <libedataserver/e-source-mail-identity.h>
+#include <libedataserver/e-source-registry.h>
 #include <libedataserverui/e-category-completion.h>
 #include <libedataserverui/e-client-utils.h>
 #include <libedataserverui/e-source-combo-box.h>
@@ -46,8 +48,6 @@
 #include <e-util/e-dialog-widgets.h>
 #include <e-util/e-util-private.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include <misc/e-dateedit.h>
 #include <misc/e-send-options.h>
 #include <misc/e-buffer-tagger.h>
@@ -111,7 +111,6 @@ struct _EventPagePrivate {
 	GtkWidget *info_hbox;
 	GtkWidget *info_icon;
 	GtkWidget *info_string;
-	gchar *subscriber_info_text;
 
 	GtkWidget *summary;
 	GtkWidget *summary_label;
@@ -223,9 +222,12 @@ get_current_identity (EventPage *page,
                       gchar **name,
                       gchar **mailto)
 {
-	EAccountList *account_list;
-	EIterator *iterator;
+	EShell *shell;
+	CompEditor *editor;
+	ESourceRegistry *registry;
+	GList *list, *iter;
 	GtkWidget *entry;
+	const gchar *extension_name;
 	const gchar *text;
 	gboolean match = FALSE;
 
@@ -235,28 +237,29 @@ get_current_identity (EventPage *page,
 	if (text == NULL || *text == '\0')
 		return FALSE;
 
-	account_list = e_get_account_list ();
-	iterator = e_list_get_iterator (E_LIST (account_list));
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
 
-	while (!match && e_iterator_is_valid (iterator)) {
-		EAccount *account;
+	list = e_source_registry_list_sources (registry, extension_name);
+
+	for (iter = list; !match && iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
 		const gchar *id_name;
 		const gchar *id_address;
 		gchar *identity;
 
-		/* XXX EIterator misuses const. */
-		account = (EAccount *) e_iterator_get (iterator);
-<<<<<<< HEAD
-
-		id_name = account->id->name;
-		id_address = account->id->address;
+		extension = e_source_get_extension (source, extension_name);
 
-=======
+		id_name = e_source_mail_identity_get_name (extension);
+		id_address = e_source_mail_identity_get_address (extension);
 
-		id_name = account->id->name;
-		id_address = account->id->address;
+		if (id_name == NULL || id_address == NULL)
+			continue;
 
->>>>>>> Refactor CompEditor pages to isolate EAccount usage.
 		identity = g_strdup_printf ("%s <%s>", id_name, id_address);
 		match = (g_ascii_strcasecmp (text, identity) == 0);
 		g_free (identity);
@@ -266,11 +269,9 @@ get_current_identity (EventPage *page,
 
 		if (match && mailto != NULL)
 			*mailto = g_strdup_printf ("MAILTO:%s", id_address);
-
-		e_iterator_next (iterator);
 	}
 
-	g_object_unref (iterator);
+	g_list_free (list);
 
 	return match;
 }
@@ -655,7 +656,7 @@ sensitize_widgets (EventPage *epage)
 		event_page_set_info_string (epage, GTK_STOCK_DIALOG_INFO, tmp);
 		g_free (tmp);
 	} else if (!check_starts_in_the_past (epage)) {
-		event_page_set_info_string (epage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+		event_page_set_info_string (epage, NULL, NULL);
 	}
 
 	alarm = e_dialog_combo_box_get (priv->alarm_time_combo, priv->alarm_map) != ALARM_NONE;
@@ -1105,6 +1106,8 @@ event_page_fill_widgets (CompEditorPage *page,
 	ECalComponentClassification cl;
 	ECalComponentTransparency transparency;
 	ECalComponentDateTime start_date, end_date;
+	ESourceRegistry *registry;
+	EShell *shell;
 	const gchar *location, *uid = NULL;
 	const gchar *categories;
 	gchar *backend_addr = NULL;
@@ -1117,6 +1120,9 @@ event_page_fill_widgets (CompEditorPage *page,
 	editor = comp_editor_page_get_editor (page);
 	client = comp_editor_get_client (editor);
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	if (!e_cal_component_has_organizer (comp)) {
 		flags |= COMP_EDITOR_USER_ORG;
@@ -1177,7 +1183,8 @@ event_page_fill_widgets (CompEditorPage *page,
 		gchar *name = NULL;
 		gchar *mailto = NULL;
 
-		priv->user_add = itip_get_comp_attendee (comp, client);
+		priv->user_add = itip_get_comp_attendee (
+			registry, comp, client);
 
 		/* Organizer strings */
 		event_page_select_organizer (epage, backend_addr);
@@ -1189,7 +1196,8 @@ event_page_fill_widgets (CompEditorPage *page,
 				const gchar *strip = itip_strip_mailto (organizer.value);
 				gchar *string;
 
-				if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) {
+				if (itip_organizer_is_user (registry, comp, client) ||
+				    itip_sentby_is_user (registry, comp, client)) {
 					if (e_client_check_capability (
 								E_CLIENT (client),
 								CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
@@ -2594,8 +2602,6 @@ get_widgets (EventPage *epage)
 
 	priv->source_selector = GW ("source");
 
-	e_util_set_source_combo_box_list (priv->source_selector, "/apps/evolution/calendar/sources");
-
 	completion = e_category_completion_new ();
 	gtk_entry_set_completion (GTK_ENTRY (priv->categories), completion);
 	g_object_unref (completion);
@@ -2946,7 +2952,7 @@ epage_client_opened_cb (GObject *source_object,
 			NULL, GTK_DIALOG_MODAL,
 			GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
 			_("Unable to open the calendar '%s': %s"),
-			e_source_peek_name (source),
+			e_source_get_display_name (source),
 			error->message);
 		gtk_dialog_run (GTK_DIALOG (dialog));
 		gtk_widget_destroy (dialog);
@@ -3002,35 +3008,17 @@ source_changed_cb (ESourceComboBox *source_combo_box,
 	}
 	priv->open_cancellable = g_cancellable_new ();
 
-	e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, priv->open_cancellable,
-				 e_client_utils_authenticate_handler, NULL,
-				 epage_client_opened_cb, epage);
+	e_client_utils_open_new (
+		source, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, priv->open_cancellable,
+		epage_client_opened_cb, epage);
 }
 
 static void
 set_subscriber_info_string (EventPage *epage,
                             const gchar *backend_address)
 {
-	CompEditor *editor;
-	ECalClient *client;
-	ESource *source;
-
-	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
-	client = comp_editor_get_client (editor);
-	source = e_client_get_source (E_CLIENT (client));
-
-	if (e_source_get_property (source, "subscriber")) {
-		g_free (epage->priv->subscriber_info_text);
-		/* Translators: This string is used when we are creating an Event
-		 * (meeting or appointment)  on behalf of some other user */
-		epage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-	} else {
-		g_free (epage->priv->subscriber_info_text);
-		epage->priv->subscriber_info_text = NULL;
-	}
-
 	if (!check_starts_in_the_past (epage))
-		event_page_set_info_string (epage, epage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, epage->priv->subscriber_info_text);
+		event_page_set_info_string (epage, NULL, NULL);
 }
 
 static void
@@ -3175,7 +3163,9 @@ static gboolean
 init_widgets (EventPage *epage)
 {
 	EventPagePrivate *priv = epage->priv;
+	EShell *shell;
 	CompEditor *editor;
+	ESourceRegistry *registry;
 	GtkTextBuffer *text_buffer;
 	icaltimezone *zone;
 	gchar *combo_label = NULL;
@@ -3187,8 +3177,12 @@ init_widgets (EventPage *epage)
 	GtkListStore *store;
 
 	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+
+	shell = comp_editor_get_shell (editor);
 	client = comp_editor_get_client (editor);
 
+	registry = e_shell_get_registry (shell);
+
 	/* Make sure the EDateEdit widgets use our timezones to get the
 	 * current time. */
 	e_date_edit_set_get_time_callback (
@@ -3312,7 +3306,8 @@ init_widgets (EventPage *epage)
 	g_signal_connect (
 		priv->alarm_dialog, "delete-event",
 		G_CALLBACK (gtk_widget_hide), priv->alarm_dialog);
-	priv->alarm_list_dlg_widget = alarm_list_dialog_peek (client, priv->alarm_list_store);
+	priv->alarm_list_dlg_widget = alarm_list_dialog_peek (
+		registry, client, priv->alarm_list_store);
 	gtk_widget_reparent (priv->alarm_list_dlg_widget, priv->alarm_box);
 	gtk_widget_show_all (priv->alarm_list_dlg_widget);
 	gtk_widget_hide (priv->alarm_dialog);
@@ -3455,32 +3450,18 @@ event_page_select_organizer (EventPage *epage,
                              const gchar *backend_address)
 {
 	EventPagePrivate *priv = epage->priv;
-	CompEditor *editor;
-	ECalClient *client;
 	const gchar *default_address;
-	gboolean subscribed_cal = FALSE;
-	ESource *source = NULL;
-	const gchar *user_addr = NULL;
 	gint ii;
 
-	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
-	client = comp_editor_get_client (editor);
-
-	if (client)
-		source = e_client_get_source (E_CLIENT (client));
-	if (source)
-		user_addr = e_source_get_property (source, "subscriber");
-
-	if (user_addr)
-		subscribed_cal = TRUE;
-	else
-		user_addr = (backend_address && *backend_address) ? backend_address : NULL;
+	/* Treat an empty backend address as NULL. */
+	if (backend_address != NULL && *backend_address == '\0')
+		backend_address = NULL;
 
 	default_address = priv->fallback_address;
 
-	if (user_addr) {
+	if (backend_address != NULL) {
 		for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
-			if (g_strrstr (priv->address_strings[ii], user_addr) != NULL) {
+			if (g_strrstr (priv->address_strings[ii], backend_address) != NULL) {
 				default_address = priv->address_strings[ii];
 				break;
 			}
@@ -3493,7 +3474,6 @@ event_page_select_organizer (EventPage *epage,
 
 			g_signal_handlers_block_by_func (entry, organizer_changed_cb, epage);
 			gtk_entry_set_text (entry, default_address);
-			gtk_widget_set_sensitive (priv->organizer, !subscribed_cal);
 			g_signal_handlers_unblock_by_func (entry, organizer_changed_cb, epage);
 		}
 	} else
@@ -3514,12 +3494,18 @@ event_page_construct (EventPage *epage,
                       EMeetingStore *meeting_store)
 {
 	EventPagePrivate *priv;
+	EShell *shell;
+	CompEditor *editor;
+	ESourceRegistry *registry;
 	GtkComboBox *combo_box;
 	GtkListStore *list_store;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gint ii;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	shell = comp_editor_get_shell (editor);
+
 	priv = epage->priv;
 	priv->meeting_store = g_object_ref (meeting_store);
 
@@ -3552,8 +3538,9 @@ event_page_construct (EventPage *epage,
 	model = gtk_combo_box_get_model (combo_box);
 	list_store = GTK_LIST_STORE (model);
 
-	priv->address_strings = itip_get_user_identities ();
-	priv->fallback_address = itip_get_fallback_identity ();
+	registry = e_shell_get_registry (shell);
+	priv->address_strings = itip_get_user_identities (registry);
+	priv->fallback_address = itip_get_fallback_identity (registry);
 
 	/* FIXME Could we just use a GtkComboBoxText? */
 	for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
diff --git a/calendar/gui/dialogs/event-page.ui b/calendar/gui/dialogs/event-page.ui
index 9377c83..f738c09 100644
--- a/calendar/gui/dialogs/event-page.ui
+++ b/calendar/gui/dialogs/event-page.ui
@@ -779,6 +779,7 @@
                         </child>
                         <child>
                           <object class="ESourceComboBox" type-func="e_source_combo_box_get_type" id="source">
+                            <property name="extension-name">Calendar</property>
                             <property name="visible">True</property>
                           </object>
                           <packing>
diff --git a/calendar/gui/dialogs/memo-page.c b/calendar/gui/dialogs/memo-page.c
index 5348a19..5c12700 100644
--- a/calendar/gui/dialogs/memo-page.c
+++ b/calendar/gui/dialogs/memo-page.c
@@ -34,6 +34,8 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
+#include <libedataserver/e-source-mail-identity.h>
+#include <libedataserver/e-source-registry.h>
 #include <libedataserverui/e-category-completion.h>
 #include <libedataserverui/e-client-utils.h>
 #include <libedataserverui/e-source-combo-box.h>
@@ -49,8 +51,6 @@
 #include <misc/e-dateedit.h>
 #include <misc/e-buffer-tagger.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include "../calendar-config.h"
 #include "comp-editor.h"
 #include "comp-editor-util.h"
@@ -74,7 +74,6 @@ struct _MemoPagePrivate {
 	GtkWidget *info_hbox;
 	GtkWidget *info_icon;
 	GtkWidget *info_string;
-	gchar *subscriber_info_text;
 
 	/* Organizer */
 	GtkWidget *org_label;
@@ -119,32 +118,43 @@ get_current_identity (MemoPage *page,
                       gchar **name,
                       gchar **mailto)
 {
-	EAccountList *account_list;
-	EIterator *iterator;
+	EShell *shell;
+	CompEditor *editor;
+	ESourceRegistry *registry;
+	GList *list, *iter;
 	GtkWidget *entry;
+	const gchar *extension_name;
 	const gchar *text;
 	gboolean match = FALSE;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	shell = comp_editor_get_shell (editor);
+
 	entry = gtk_bin_get_child (GTK_BIN (page->priv->org_combo));
 	text = gtk_entry_get_text (GTK_ENTRY (entry));
 
 	if (text == NULL || *text == '\0')
 		return FALSE;
 
-	account_list = e_get_account_list ();
-	iterator = e_list_get_iterator (E_LIST (account_list));
+	registry = e_shell_get_registry (shell);
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+
+	list = e_source_registry_list_sources (registry, extension_name);
 
-	while (!match && e_iterator_is_valid (iterator)) {
-		EAccount *account;
+	for (iter = list; !match && iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
 		const gchar *id_name;
 		const gchar *id_address;
 		gchar *identity;
 
-		/* XXX EIterator misuses const. */
-		account = (EAccount *) e_iterator_get (iterator);
+		extension = e_source_get_extension (source, extension_name);
 
-		id_name = account->id->name;
-		id_address = account->id->address;
+		id_name = e_source_mail_identity_get_name (extension);
+		id_address = e_source_mail_identity_get_address (extension);
+
+		if (id_name == NULL || id_address == NULL)
+			continue;
 
 		identity = g_strdup_printf ("%s <%s>", id_name, id_address);
 		match = (g_ascii_strcasecmp (text, identity) == 0);
@@ -155,11 +165,9 @@ get_current_identity (MemoPage *page,
 
 		if (match && mailto != NULL)
 			*mailto = g_strdup_printf ("MAILTO:%s", id_address);
-
-		e_iterator_next (iterator);
 	}
 
-	g_object_unref (iterator);
+	g_list_free (list);
 
 	return match;
 }
@@ -235,8 +243,6 @@ memo_page_finalize (GObject *object)
 		priv->builder = NULL;
 	}
 
-	g_free (priv->subscriber_info_text);
-
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (memo_page_parent_class)->finalize (object);
 }
@@ -269,6 +275,8 @@ memo_page_fill_widgets (CompEditorPage *page,
 	ECalComponentClassification cl;
 	ECalComponentText text;
 	ECalComponentDateTime d;
+	ESourceRegistry *registry;
+	EShell *shell;
 	GSList *l;
 	const gchar *categories;
 	gchar *backend_addr = NULL;
@@ -279,6 +287,9 @@ memo_page_fill_widgets (CompEditorPage *page,
 	editor = comp_editor_page_get_editor (page);
 	client = comp_editor_get_client (editor);
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	/* Clean the screen */
 	clear_widgets (mpage);
@@ -342,7 +353,8 @@ memo_page_fill_widgets (CompEditorPage *page,
 			else
 				string = g_strdup (strip);
 
-			if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) {
+			if (itip_organizer_is_user (registry, comp, client) ||
+			    itip_sentby_is_user (registry, comp, client)) {
 				gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->org_combo))), string);
 			} else {
 				GtkComboBox *combo_box;
@@ -420,12 +432,11 @@ check_starts_in_the_past (MemoPage *mpage)
 	start_tt.is_date = TRUE;
 	if (e_date_edit_get_date (E_DATE_EDIT (priv->start_date), &start_tt.year, &start_tt.month, &start_tt.day) &&
 	    comp_editor_test_time_in_the_past (start_tt)) {
-		gchar *tmp = g_strconcat ("<b>", _("Memo's start date is in the past"), "</b>",
-			priv->subscriber_info_text ? "\n" : "", priv->subscriber_info_text, NULL);
+		gchar *tmp = g_strconcat ("<b>", _("Memo's start date is in the past"), "</b>", NULL);
 		memo_page_set_info_string (mpage, GTK_STOCK_DIALOG_WARNING, tmp);
 		g_free (tmp);
 	} else {
-		memo_page_set_info_string (mpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+		memo_page_set_info_string (mpage, NULL, NULL);
 	}
 
 	return TRUE;
@@ -465,7 +476,7 @@ sensitize_widgets (MemoPage *mpage)
 		memo_page_set_info_string (mpage, GTK_STOCK_DIALOG_INFO, tmp);
 		g_free (tmp);
 	} else if (!check_starts_in_the_past (mpage)) {
-		memo_page_set_info_string (mpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+		memo_page_set_info_string (mpage, NULL, NULL);
 	}
 
 	/* The list of organizers is set to be non-editable. Otherwise any
@@ -552,7 +563,7 @@ fill_comp_with_recipients (ENameSelector *name_selector,
 				ENameSelectorModel *model;
 				EContactStore *c_store;
 				GSList *clients, *l;
-				gchar *uri = e_contact_get (contact, E_CONTACT_BOOK_URI);
+				gchar *uid = e_contact_get (contact, E_CONTACT_BOOK_URI);
 
 				dialog = e_name_selector_peek_dialog (name_selector);
 				model = e_name_selector_dialog_peek_model (dialog);
@@ -561,7 +572,11 @@ fill_comp_with_recipients (ENameSelector *name_selector,
 
 				for (l = clients; l; l = l->next) {
 					EBookClient *b = l->data;
-					if (g_str_equal (uri, e_client_get_uri (E_CLIENT (b)))) {
+					ESource *source;
+
+					source = e_client_get_source (E_CLIENT (b));
+
+					if (g_strcmp0 (uid, e_source_get_uid (source)) == 0) {
 						book_client = b;
 						break;
 					}
@@ -887,8 +902,6 @@ get_widgets (MemoPage *mpage)
 	priv->source_selector = GW ("source");
 #undef GW
 
-	e_util_set_source_combo_box_list (priv->source_selector, "/apps/evolution/memos/sources");
-
 	completion = e_category_completion_new ();
 	gtk_entry_set_completion (GTK_ENTRY (priv->categories), completion);
 	g_object_unref (completion);
@@ -947,7 +960,7 @@ mpage_client_opened_cb (GObject *source_object,
 		dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
 						 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
 						 _("Unable to open memos in '%s': %s"),
-						 e_source_peek_name (source),
+						 e_source_get_display_name (source),
 						 error ? error->message : _("Unknown error"));
 		gtk_dialog_run (GTK_DIALOG (dialog));
 		gtk_widget_destroy (dialog);
@@ -1001,35 +1014,17 @@ source_changed_cb (ESourceComboBox *source_combo_box,
 	}
 	priv->open_cancellable = g_cancellable_new ();
 
-	e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, FALSE, priv->open_cancellable,
-				 e_client_utils_authenticate_handler, NULL,
-				 mpage_client_opened_cb, mpage);
+	e_client_utils_open_new (
+		source, E_CLIENT_SOURCE_TYPE_MEMOS, FALSE, priv->open_cancellable,
+		mpage_client_opened_cb, mpage);
 }
 
 static void
 set_subscriber_info_string (MemoPage *mpage,
                             const gchar *backend_address)
 {
-	CompEditor *editor;
-	ECalClient *client;
-	ESource *source;
-
-	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
-	client = comp_editor_get_client (editor);
-	source = e_client_get_source (E_CLIENT (client));
-
-	if (e_source_get_property (source, "subscriber")) {
-		g_free (mpage->priv->subscriber_info_text);
-		/* Translators: This string is used when we are creating a Memo
-		 * on behalf of some other user */
-		mpage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-	} else {
-		g_free (mpage->priv->subscriber_info_text);
-		mpage->priv->subscriber_info_text = NULL;
-	}
-
 	if (!check_starts_in_the_past (mpage))
-		memo_page_set_info_string (mpage, mpage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, mpage->priv->subscriber_info_text);
+		memo_page_set_info_string (mpage, NULL, NULL);
 }
 
 static void
@@ -1163,36 +1158,24 @@ static void
 memo_page_select_organizer (MemoPage *mpage,
                             const gchar *backend_address)
 {
-	MemoPagePrivate *priv;
+	MemoPagePrivate *priv = mpage->priv;
 	CompEditor *editor;
 	CompEditorFlags flags;
-	ECalClient *client;
 	const gchar *default_address;
-	gboolean subscribed_cal = FALSE;
-	ESource *source = NULL;
-	const gchar *user_addr = NULL;
 	gint ii;
 
-	priv = mpage->priv;
+	/* Treat an empty backend address as NULL. */
+	if (backend_address != NULL && *backend_address == '\0')
+		backend_address = NULL;
+
 	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
-	client = comp_editor_get_client (editor);
 	flags = comp_editor_get_flags (editor);
 
-	if (client)
-		source = e_client_get_source (E_CLIENT (client));
-	if (source)
-		user_addr = e_source_get_property (source, "subscriber");
-
-	if (user_addr)
-		subscribed_cal = TRUE;
-	else
-		user_addr = (backend_address && *backend_address) ? backend_address : NULL;
-
 	default_address = priv->fallback_address;
 
-	if (user_addr) {
+	if (backend_address != NULL) {
 		for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
-			if (g_strrstr (priv->address_strings[ii], user_addr) != NULL) {
+			if (g_strrstr (priv->address_strings[ii], backend_address) != NULL) {
 				default_address = priv->address_strings[ii];
 				break;
 			}
@@ -1202,7 +1185,6 @@ memo_page_select_organizer (MemoPage *mpage,
 	if (default_address != NULL) {
 		if (flags & COMP_EDITOR_NEW_ITEM) {
 			gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->org_combo))), default_address);
-			gtk_widget_set_sensitive (priv->org_combo, !subscribed_cal);
 		}
 	} else
 		g_warning ("No potential organizers!");
@@ -1221,13 +1203,19 @@ MemoPage *
 memo_page_construct (MemoPage *mpage)
 {
 	MemoPagePrivate *priv;
+	EShell *shell;
 	CompEditor *editor;
 	CompEditorFlags flags;
+	ESourceRegistry *registry;
 
 	priv = mpage->priv;
 
 	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	priv->builder = gtk_builder_new ();
 	e_load_ui_builder_definition (priv->builder, "memo-page.ui");
@@ -1249,8 +1237,8 @@ memo_page_construct (MemoPage *mpage)
 		model = gtk_combo_box_get_model (combo_box);
 		list_store = GTK_LIST_STORE (model);
 
-		priv->address_strings = itip_get_user_identities ();
-		priv->fallback_address = itip_get_fallback_identity ();
+		priv->address_strings = itip_get_user_identities (registry);
+		priv->fallback_address = itip_get_fallback_identity (registry);
 
 		/* FIXME Could we just use a GtkComboBoxText? */
 		for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
@@ -1265,7 +1253,7 @@ memo_page_construct (MemoPage *mpage)
 		gtk_widget_show (priv->org_label);
 		gtk_widget_show (priv->org_combo);
 
-		priv->name_selector = e_name_selector_new ();
+		priv->name_selector = e_name_selector_new (registry);
 		priv->to_entry = get_to_entry (priv->name_selector);
 		gtk_container_add ((GtkContainer *) priv->to_hbox, priv->to_entry);
 		gtk_widget_show (priv->to_hbox);
diff --git a/calendar/gui/dialogs/memo-page.ui b/calendar/gui/dialogs/memo-page.ui
index f10dec4..a33590b 100644
--- a/calendar/gui/dialogs/memo-page.ui
+++ b/calendar/gui/dialogs/memo-page.ui
@@ -184,6 +184,7 @@
                     <property name="spacing">0</property>
                     <child>
                       <object class="ESourceComboBox" type-func="e_source_combo_box_get_type" id="source">
+                        <property name="extension-name">Memo List</property>
                         <property name="visible">True</property>
                       </object>
                       <packing>
diff --git a/calendar/gui/dialogs/select-source-dialog.c b/calendar/gui/dialogs/select-source-dialog.c
index 12bceb2..8ea35e2 100644
--- a/calendar/gui/dialogs/select-source-dialog.c
+++ b/calendar/gui/dialogs/select-source-dialog.c
@@ -26,6 +26,7 @@
 #endif
 
 #include <glib/gi18n.h>
+#include <libedataserver/e-source-calendar.h>
 #include <libedataserverui/e-source-selector-dialog.h>
 #include "select-source-dialog.h"
 
@@ -36,37 +37,31 @@
  */
 ESource *
 select_source_dialog (GtkWindow *parent,
+                      ESourceRegistry *registry,
                       ECalClientSourceType obj_type,
                       ESource *except_source)
 {
 	GtkWidget *dialog;
-	ESourceList *source_list;
 	ESource *selected_source = NULL;
-	const gchar *gconf_key;
-	GConfClient *conf_client;
-	const gchar *icon_name = NULL;
+	const gchar *extension_name;
+	const gchar *icon_name;
 
-	if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS)
-		gconf_key = "/apps/evolution/calendar/sources";
-	else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS)
-		gconf_key = "/apps/evolution/tasks/sources";
-	else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS)
-                gconf_key = "/apps/evolution/memos/sources";
-	else
-		return NULL;
-
-	conf_client = gconf_client_get_default ();
-	source_list = e_source_list_new_for_gconf (conf_client, gconf_key);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
 
-	/* create the dialog */
-	dialog = e_source_selector_dialog_new (parent, source_list);
-
-	if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS)
+	if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) {
+		extension_name = E_SOURCE_EXTENSION_CALENDAR;
 		icon_name = "x-office-calendar";
-	else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS)
+	} else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS) {
+		extension_name = E_SOURCE_EXTENSION_TASK_LIST;
 		icon_name = "stock_todo";
-	else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS)
-                icon_name = "stock_journal";
+	} else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) {
+		extension_name = E_SOURCE_EXTENSION_MEMO_LIST;
+		icon_name = "stock_journal";
+	} else
+		return NULL;
+
+	/* create the dialog */
+	dialog = e_source_selector_dialog_new (parent, registry, extension_name);
 
 	if (icon_name)
 		gtk_window_set_icon_name (GTK_WINDOW (dialog), icon_name);
@@ -74,16 +69,15 @@ select_source_dialog (GtkWindow *parent,
 	if (except_source)
 		g_object_set_data (G_OBJECT (dialog), "except-source", except_source);
 
-	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
-		selected_source = e_source_selector_dialog_peek_primary_selection (E_SOURCE_SELECTOR_DIALOG (dialog));
+	if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
+		goto exit;
 
-		if (selected_source)
-			g_object_ref (selected_source);
-	} else
-		selected_source = NULL;
+	selected_source = e_source_selector_dialog_peek_primary_selection (
+		E_SOURCE_SELECTOR_DIALOG (dialog));
+	if (selected_source != NULL)
+		g_object_ref (selected_source);
 
-	g_object_unref (conf_client);
-	g_object_unref (source_list);
+exit:
 	gtk_widget_destroy (dialog);
 
 	return selected_source;
diff --git a/calendar/gui/dialogs/select-source-dialog.h b/calendar/gui/dialogs/select-source-dialog.h
index 2ef8e0e..77864e8 100644
--- a/calendar/gui/dialogs/select-source-dialog.h
+++ b/calendar/gui/dialogs/select-source-dialog.h
@@ -27,10 +27,11 @@
 #define SELECT_SOURCE_DIALOG_H
 
 #include <gtk/gtk.h>
-#include <libedataserver/e-source.h>
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-registry.h>
 
 ESource *	select_source_dialog		(GtkWindow *parent,
+						 ESourceRegistry *registry,
 						 ECalClientSourceType type,
 						 ESource *except_source);
 
diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c
index 927913c..724bb4b 100644
--- a/calendar/gui/dialogs/task-editor.c
+++ b/calendar/gui/dialogs/task-editor.c
@@ -386,6 +386,8 @@ task_editor_edit_comp (CompEditor *editor,
 	ECalComponentOrganizer organizer;
 	ECalClient *client;
 	GSList *attendees = NULL;
+	ESourceRegistry *registry;
+	EShell *shell;
 
 	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
@@ -394,8 +396,11 @@ task_editor_edit_comp (CompEditor *editor,
 	if (COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp)
 		COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp (editor, comp);
 
+	shell = comp_editor_get_shell (editor);
 	client = comp_editor_get_client (editor);
 
+	registry = e_shell_get_registry (shell);
+
 	/* Get meeting related stuff */
 	e_cal_component_get_organizer (comp, &organizer);
 	e_cal_component_get_attendee_list (comp, &attendees);
@@ -450,7 +455,7 @@ task_editor_edit_comp (CompEditor *editor,
 
 	comp_editor_set_needs_send (
 		editor, priv->assignment_shown &&
-		itip_organizer_is_user (comp, client));
+		itip_organizer_is_user (registry, comp, client));
 
 	priv->updating = FALSE;
 }
@@ -461,6 +466,8 @@ task_editor_send_comp (CompEditor *editor,
                        gboolean strip_alarms)
 {
 	TaskEditorPrivate *priv;
+	EShell *shell;
+	ESourceRegistry *registry;
 	ECalComponent *comp = NULL;
 
 	priv = TASK_EDITOR_GET_PRIVATE (editor);
@@ -470,6 +477,9 @@ task_editor_send_comp (CompEditor *editor,
 	    method == E_CAL_COMPONENT_METHOD_CANCEL)
 		goto parent;
 
+	shell = comp_editor_get_shell (editor);
+	registry = e_shell_get_registry (shell);
+
 	comp = task_page_get_cancel_comp (priv->task_page);
 	if (comp != NULL) {
 		ECalClient *client;
@@ -477,7 +487,7 @@ task_editor_send_comp (CompEditor *editor,
 
 		client = e_meeting_store_get_client (priv->model);
 		result = itip_send_comp (
-			E_CAL_COMPONENT_METHOD_CANCEL, comp,
+			registry, E_CAL_COMPONENT_METHOD_CANCEL, comp,
 			client, NULL, NULL, NULL, strip_alarms, FALSE);
 		g_object_unref (comp);
 
diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c
index 71a4945..3efd4ae 100644
--- a/calendar/gui/dialogs/task-page.c
+++ b/calendar/gui/dialogs/task-page.c
@@ -34,6 +34,8 @@
 #include <glib/gi18n.h>
 #include <gdk/gdkkeysyms.h>
 
+#include <libedataserver/e-source-mail-identity.h>
+#include <libedataserver/e-source-registry.h>
 #include <libedataserverui/e-category-completion.h>
 #include <libedataserverui/e-client-utils.h>
 #include <libedataserverui/e-source-combo-box.h>
@@ -46,8 +48,6 @@
 #include <e-util/e-util-private.h>
 #include <e-util/e-util.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include "../e-meeting-attendee.h"
 #include "../e-meeting-list-view.h"
 #include "../e-meeting-store.h"
@@ -86,7 +86,6 @@ struct _TaskPagePrivate {
 	GtkWidget *info_hbox;
 	GtkWidget *info_icon;
 	GtkWidget *info_string;
-	gchar *subscriber_info_text;
 
 	GtkWidget *summary;
 	GtkWidget *summary_label;
@@ -149,32 +148,43 @@ get_current_identity (TaskPage *page,
                       gchar **name,
                       gchar **mailto)
 {
-	EAccountList *account_list;
-	EIterator *iterator;
+	EShell *shell;
+	CompEditor *editor;
+	ESourceRegistry *registry;
+	GList *list, *iter;
 	GtkWidget *entry;
+	const gchar *extension_name;
 	const gchar *text;
 	gboolean match = FALSE;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	shell = comp_editor_get_shell (editor);
+
 	entry = gtk_bin_get_child (GTK_BIN (page->priv->organizer));
 	text = gtk_entry_get_text (GTK_ENTRY (entry));
 
 	if (text == NULL || *text == '\0')
 		return FALSE;
 
-	account_list = e_get_account_list ();
-	iterator = e_list_get_iterator (E_LIST (account_list));
+	registry = e_shell_get_registry (shell);
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
 
-	while (!match && e_iterator_is_valid (iterator)) {
-		EAccount *account;
+	list = e_source_registry_list_sources (registry, extension_name);
+
+	for (iter = list; !match && iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
 		const gchar *id_name;
 		const gchar *id_address;
 		gchar *identity;
 
-		/* XXX EIterator misuses const. */
-		account = (EAccount *) e_iterator_get (iterator);
+		extension = e_source_get_extension (source, extension_name);
+
+		id_name = e_source_mail_identity_get_name (extension);
+		id_address = e_source_mail_identity_get_address (extension);
 
-		id_name = account->id->name;
-		id_address = account->id->address;
+		if (id_name == NULL || id_address == NULL)
+			continue;
 
 		identity = g_strdup_printf ("%s <%s>", id_name, id_address);
 		match = (g_ascii_strcasecmp (text, identity) == 0);
@@ -185,11 +195,9 @@ get_current_identity (TaskPage *page,
 
 		if (match && mailto != NULL)
 			*mailto = g_strdup_printf ("MAILTO:%s", id_address);
-
-		e_iterator_next (iterator);
 	}
 
-	g_object_unref (iterator);
+	g_list_free (list);
 
 	return match;
 }
@@ -252,12 +260,11 @@ check_starts_in_the_past (TaskPage *tpage)
 
 	if (start_in_past || due_in_past) {
 		gchar *tmp = g_strconcat ("<b>", start_in_past ? _("Task's start date is in the past") : "",
-			start_in_past && due_in_past ? "\n" : "", due_in_past ? _("Task's due date is in the past") : "", "</b>",
-			priv->subscriber_info_text ? "\n" : "", priv->subscriber_info_text, NULL);
+			start_in_past && due_in_past ? "\n" : "", due_in_past ? _("Task's due date is in the past") : "", "</b>", NULL);
 		task_page_set_info_string (tpage, GTK_STOCK_DIALOG_WARNING, tmp);
 		g_free (tmp);
 	} else {
-		task_page_set_info_string (tpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+		task_page_set_info_string (tpage, NULL, NULL);
 	}
 
 	return TRUE;
@@ -300,7 +307,7 @@ sensitize_widgets (TaskPage *tpage)
 		sens = FALSE;
 		read_only = TRUE;
 	} else if (!check_starts_in_the_past (tpage)) {
-		task_page_set_info_string (tpage, priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, priv->subscriber_info_text);
+		task_page_set_info_string (tpage, NULL, NULL);
 	}
 
 	/* The list of organizers is set to be non-editable. Otherwise any
@@ -486,10 +493,12 @@ task_page_fill_widgets (CompEditorPage *page,
 	ECalComponentText text;
 	ECalComponentDateTime d;
 	ECalComponentClassification cl;
+	ESourceRegistry *registry;
 	CompEditor *editor;
 	CompEditorFlags flags;
 	GtkAction *action;
 	ECalClient *client;
+	EShell *shell;
 	GSList *l;
 	icalcomponent *icalcomp;
 	const gchar *categories, *uid;
@@ -503,6 +512,9 @@ task_page_fill_widgets (CompEditorPage *page,
 	editor = comp_editor_page_get_editor (page);
 	client = comp_editor_get_client (editor);
 	flags = comp_editor_get_flags (editor);
+	shell = comp_editor_get_shell (editor);
+
+	registry = e_shell_get_registry (shell);
 
 	/* Clean out old data */
 	if (priv->comp != NULL)
@@ -520,7 +532,8 @@ task_page_fill_widgets (CompEditorPage *page,
 	/* Clean the screen */
 	clear_widgets (tpage);
 
-	priv->user_add = itip_get_comp_attendee (comp, client);
+	priv->user_add = itip_get_comp_attendee (
+		registry, comp, client);
 
         /* Summary, description(s) */
 	e_cal_component_get_summary (comp, &text);
@@ -638,7 +651,8 @@ task_page_fill_widgets (CompEditorPage *page,
 		gchar *name = NULL;
 		gchar *mailto = NULL;
 
-		priv->user_add = itip_get_comp_attendee (comp, client);
+		priv->user_add = itip_get_comp_attendee (
+			registry, comp, client);
 
 		/* Organizer strings */
 		task_page_select_organizer (tpage, backend_addr);
@@ -650,7 +664,8 @@ task_page_fill_widgets (CompEditorPage *page,
 				const gchar *strip = itip_strip_mailto (organizer.value);
 				gchar *string;
 
-				if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) {
+				if (itip_organizer_is_user (registry, comp, client) ||
+				    itip_sentby_is_user (registry, comp, client)) {
 					if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
 						priv->user_org = TRUE;
 				} else {
@@ -1508,7 +1523,6 @@ get_widgets (TaskPage *tpage)
 	gtk_box_pack_start (GTK_BOX (priv->list_box), sw, TRUE, TRUE, 0);
 
 	priv->source_selector = e_builder_get_widget (priv->builder, "source");
-	e_util_set_source_combo_box_list (priv->source_selector, "/apps/evolution/tasks/sources");
 
 	gtk_label_set_mnemonic_widget (GTK_LABEL (priv->calendar_label), priv->source_selector);
 
@@ -1775,7 +1789,7 @@ tpage_client_opened_cb (GObject *source_object,
 			NULL, GTK_DIALOG_MODAL,
 			GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
 			_("Unable to open tasks in '%s': %s"),
-			e_source_peek_name (source),
+			e_source_get_display_name (source),
 			error->message);
 		gtk_dialog_run (GTK_DIALOG (dialog));
 		gtk_widget_destroy (dialog);
@@ -1835,7 +1849,6 @@ source_changed_cb (ESourceComboBox *source_combo_box,
 	e_client_utils_open_new (
 		source, E_CLIENT_SOURCE_TYPE_TASKS,
 		FALSE, priv->open_cancellable,
-		e_client_utils_authenticate_handler, NULL,
 		tpage_client_opened_cb, tpage);
 }
 
@@ -1843,26 +1856,8 @@ static void
 set_subscriber_info_string (TaskPage *tpage,
                             const gchar *backend_address)
 {
-	CompEditor *editor;
-	ECalClient *client;
-	ESource *source;
-
-	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
-	client = comp_editor_get_client (editor);
-	source = e_client_get_source (E_CLIENT (client));
-
-	if (e_source_get_property (source, "subscriber")) {
-		g_free (tpage->priv->subscriber_info_text);
-		/* Translators: This string is used when we are creating a Task
-		 * on behalf of some other user */
-		tpage->priv->subscriber_info_text = g_markup_printf_escaped (_("You are acting on behalf of %s"), backend_address);
-	} else {
-		g_free (tpage->priv->subscriber_info_text);
-		tpage->priv->subscriber_info_text = NULL;
-	}
-
 	if (!check_starts_in_the_past (tpage))
-		task_page_set_info_string (tpage, tpage->priv->subscriber_info_text ? GTK_STOCK_DIALOG_INFO : NULL, tpage->priv->subscriber_info_text);
+		task_page_set_info_string (tpage, NULL, NULL);
 }
 
 void
@@ -2063,45 +2058,30 @@ task_page_select_organizer (TaskPage *tpage,
                             const gchar *backend_address)
 {
 	TaskPagePrivate *priv = tpage->priv;
-	CompEditor *editor;
 	const gchar *default_address;
-	gboolean subscribed_cal = FALSE;
-	ESource *source = NULL;
-	ECalClient *client;
-	const gchar *user_addr = NULL;
 	gint ii;
 
-	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
-	client = comp_editor_get_client (editor);
-
-	if (client)
-		source = e_client_get_source (E_CLIENT (client));
-	if (source)
-		user_addr = e_source_get_property (source, "subscriber");
-
-	if (user_addr)
-		subscribed_cal = TRUE;
-	else
-		user_addr = (backend_address && *backend_address) ? backend_address : NULL;
+	/* Treat an empty backend address as NULL. */
+	if (backend_address == NULL && *backend_address == '\0')
+		backend_address = NULL;
 
 	default_address = priv->fallback_address;
 
-	if (user_addr) {
+	if (backend_address != NULL) {
 		for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
-			if (g_strrstr (priv->address_strings[ii], user_addr) != NULL) {
+			if (g_strrstr (priv->address_strings[ii], backend_address) != NULL) {
 				default_address = priv->address_strings[ii];
 				break;
 			}
 		}
 	}
 
-	if (default_address) {
+	if (default_address != NULL) {
 		if (!priv->comp || !e_cal_component_has_organizer (priv->comp)) {
 			GtkEntry *entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->organizer)));
 
 			g_signal_handlers_block_by_func (entry, organizer_changed_cb, tpage);
 			gtk_entry_set_text (entry, default_address);
-			gtk_widget_set_sensitive (priv->organizer, !subscribed_cal);
 			g_signal_handlers_unblock_by_func (entry, organizer_changed_cb, tpage);
 		}
 	} else
@@ -2122,6 +2102,9 @@ task_page_construct (TaskPage *tpage,
                      EMeetingStore *meeting_store,
                      ECalClient *client)
 {
+	EShell *shell;
+	CompEditor *editor;
+	ESourceRegistry *registry;
 	TaskPagePrivate *priv;
 	GtkComboBox *combo_box;
 	GtkListStore *list_store;
@@ -2129,6 +2112,9 @@ task_page_construct (TaskPage *tpage,
 	GtkTreeIter iter;
 	gint ii;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+	shell = comp_editor_get_shell (editor);
+
 	priv = tpage->priv;
 	priv->meeting_store = g_object_ref (meeting_store);
 	priv->client = client;
@@ -2152,8 +2138,9 @@ task_page_construct (TaskPage *tpage,
 	model = gtk_combo_box_get_model (combo_box);
 	list_store = GTK_LIST_STORE (model);
 
-	priv->address_strings = itip_get_user_identities ();
-	priv->fallback_address = itip_get_fallback_identity ();
+	registry = e_shell_get_registry (shell);
+	priv->address_strings = itip_get_user_identities (registry);
+	priv->fallback_address = itip_get_fallback_identity (registry);
 
 	/* FIXME Could we just use a GtkComboBoxText? */
 	for (ii = 0; priv->address_strings[ii] != NULL; ii++) {
diff --git a/calendar/gui/dialogs/task-page.ui b/calendar/gui/dialogs/task-page.ui
index 32faa1f..800006e 100644
--- a/calendar/gui/dialogs/task-page.ui
+++ b/calendar/gui/dialogs/task-page.ui
@@ -439,6 +439,7 @@
                         </child>
                         <child>
                           <object class="ESourceComboBox" id="source">
+                            <property name="extension-name">Task List</property>
                             <property name="visible">True</property>
                           </object>
                           <packing>
diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c
index ce8cdee..789e056 100644
--- a/calendar/gui/e-cal-component-preview.c
+++ b/calendar/gui/e-cal-component-preview.c
@@ -101,7 +101,7 @@ update_comp_info (ECalComponentPreview *preview,
 		gint comp_sequence;
 
 		source = e_client_get_source (E_CLIENT (client));
-		cal_uid = g_strdup (e_source_peek_uid (source));
+		cal_uid = g_strdup (e_source_get_uid (source));
 		e_cal_component_get_uid (comp, &uid);
 		comp_uid = g_strdup (uid);
 		e_cal_component_get_last_modified (comp, &itm);
diff --git a/calendar/gui/e-cal-config.c b/calendar/gui/e-cal-config.c
index 0e6f697..afef57d 100644
--- a/calendar/gui/e-cal-config.c
+++ b/calendar/gui/e-cal-config.c
@@ -25,6 +25,8 @@
 #endif
 
 #include <gtk/gtk.h>
+#include <gconf/gconf-client.h>
+
 #include "e-cal-config.h"
 
 #define E_CAL_CONFIG_GET_PRIVATE(obj) \
diff --git a/calendar/gui/e-cal-event.c b/calendar/gui/e-cal-event.c
index 9683dde..d94a071 100644
--- a/calendar/gui/e-cal-event.c
+++ b/calendar/gui/e-cal-event.c
@@ -37,8 +37,6 @@ ece_target_free (EEvent *ev,
 		ECalEventTargetBackend *s = (ECalEventTargetBackend *) t;
 		if (s->shell_backend)
 			g_object_unref (s->shell_backend);
-		if (s->source_list)
-			g_object_unref (s->source_list);
 		break; }
 	}
 
@@ -75,7 +73,6 @@ e_cal_event_peek (void)
 ECalEventTargetBackend *
 e_cal_event_target_new_module (ECalEvent *ece,
                                EShellBackend *shell_backend,
-                               ESourceList *source_list,
                                guint32 flags)
 {
 	ECalEventTargetBackend *t;
@@ -84,7 +81,6 @@ e_cal_event_target_new_module (ECalEvent *ece,
 		&ece->event, E_CAL_EVENT_TARGET_BACKEND, sizeof (*t));
 
 	t->shell_backend = g_object_ref (shell_backend);
-	t->source_list = g_object_ref (source_list);
 	t->target.mask = ~flags;
 
 	return t;
diff --git a/calendar/gui/e-cal-event.h b/calendar/gui/e-cal-event.h
index d67342e..447f1fd 100644
--- a/calendar/gui/e-cal-event.h
+++ b/calendar/gui/e-cal-event.h
@@ -24,8 +24,6 @@
 #ifndef __E_CAL_EVENT_H__
 #define __E_CAL_EVENT_H__
 
-#include <libedataserver/e-source-list.h>
-
 #include "e-util/e-event.h"
 #include "shell/e-shell-backend.h"
 
@@ -48,7 +46,6 @@ typedef struct _ECalEventTargetBackend ECalEventTargetBackend;
 struct _ECalEventTargetBackend {
 	EEventTarget target;
 	EShellBackend *shell_backend;
-	ESourceList *source_list;
 };
 
 struct _ECalEvent {
@@ -66,7 +63,6 @@ ECalEvent *	e_cal_event_peek		(void);
 ECalEventTargetBackend *
 		e_cal_event_target_new_module	(ECalEvent *ece,
 						 EShellBackend *shell_backend,
-						 ESourceList *source_list,
 						 guint32 flags);
 
 G_END_DECLS
diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c
index 0c59a12..dc72e1c 100644
--- a/calendar/gui/e-cal-model-calendar.c
+++ b/calendar/gui/e-cal-model-calendar.c
@@ -274,12 +274,15 @@ ecmc_set_value_at (ETableModel *etm,
 	CalObjModType mod = CALOBJ_MOD_ALL;
 	ECalComponent *comp;
 	ECalModelCalendar *model = (ECalModelCalendar *) etm;
+	ESourceRegistry *registry;
 	GError *error = NULL;
 
 	g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
 	g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST);
 	g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm));
 
+	registry = e_cal_model_get_registry (E_CAL_MODEL (model));
+
 	if (col < E_CAL_MODEL_FIELD_LAST) {
 		E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->set_value_at (etm, col, row, value);
 		return;
@@ -318,7 +321,7 @@ ecmc_set_value_at (ETableModel *etm,
 	if (e_cal_client_modify_object_sync (comp_data->client, comp_data->icalcomp, mod, NULL, &error)) {
 		gboolean strip_alarms = TRUE;
 
-		if (itip_organizer_is_user (comp, comp_data->client) &&
+		if (itip_organizer_is_user (registry, comp, comp_data->client) &&
 		    send_component_dialog (NULL, comp_data->client, comp, FALSE, &strip_alarms, NULL)) {
 			ECalComponent *send_comp = NULL;
 
@@ -339,7 +342,7 @@ ecmc_set_value_at (ETableModel *etm,
 			}
 
 			itip_send_comp (
-				E_CAL_COMPONENT_METHOD_REQUEST,
+				registry, E_CAL_COMPONENT_METHOD_REQUEST,
 				send_comp ? send_comp : comp, comp_data->client,
 				NULL, NULL, NULL, strip_alarms, FALSE);
 
@@ -522,7 +525,12 @@ ecmc_fill_component_from_model (ECalModel *model,
  * e_cal_model_calendar_new
  */
 ECalModel *
-e_cal_model_calendar_new (void)
+e_cal_model_calendar_new (ESourceRegistry *registry)
 {
-	return g_object_new (E_TYPE_CAL_MODEL_CALENDAR, NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	return g_object_new (
+		E_TYPE_CAL_MODEL_CALENDAR,
+		"registry", registry, NULL);
 }
+
diff --git a/calendar/gui/e-cal-model-calendar.h b/calendar/gui/e-cal-model-calendar.h
index f29d7d4..9dd9aee 100644
--- a/calendar/gui/e-cal-model-calendar.h
+++ b/calendar/gui/e-cal-model-calendar.h
@@ -72,7 +72,7 @@ struct _ECalModelCalendarClass {
 };
 
 GType		e_cal_model_calendar_get_type	(void);
-ECalModel *	e_cal_model_calendar_new	(void);
+ECalModel *	e_cal_model_calendar_new	(ESourceRegistry *registry);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-cal-model-memos.c b/calendar/gui/e-cal-model-memos.c
index e95cd15..7ce31d2 100644
--- a/calendar/gui/e-cal-model-memos.c
+++ b/calendar/gui/e-cal-model-memos.c
@@ -250,7 +250,12 @@ ecmm_fill_component_from_model (ECalModel *model,
  * e_cal_model_memos_new
  */
 ECalModel *
-e_cal_model_memos_new (void)
+e_cal_model_memos_new (ESourceRegistry *registry)
 {
-	return g_object_new (E_TYPE_CAL_MODEL_MEMOS, NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	return g_object_new (
+		E_TYPE_CAL_MODEL_MEMOS,
+		"registry", registry, NULL);
 }
+
diff --git a/calendar/gui/e-cal-model-memos.h b/calendar/gui/e-cal-model-memos.h
index 2be1e4d..4490d0b 100644
--- a/calendar/gui/e-cal-model-memos.h
+++ b/calendar/gui/e-cal-model-memos.h
@@ -71,7 +71,7 @@ struct _ECalModelMemosClass {
 };
 
 GType		e_cal_model_memos_get_type	(void);
-ECalModel *	e_cal_model_memos_new		(void);
+ECalModel *	e_cal_model_memos_new		(ESourceRegistry *registry);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c
index feacc6d..ca87150 100644
--- a/calendar/gui/e-cal-model-tasks.c
+++ b/calendar/gui/e-cal-model-tasks.c
@@ -1224,9 +1224,13 @@ ecmt_fill_component_from_model (ECalModel *model,
 }
 
 ECalModel *
-e_cal_model_tasks_new (void)
+e_cal_model_tasks_new (ESourceRegistry *registry)
 {
-	return g_object_new (E_TYPE_CAL_MODEL_TASKS, NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	return g_object_new (
+		E_TYPE_CAL_MODEL_TASKS,
+		"registry", registry, NULL);
 }
 
 gboolean
diff --git a/calendar/gui/e-cal-model-tasks.h b/calendar/gui/e-cal-model-tasks.h
index 54d31cb..04c3f68 100644
--- a/calendar/gui/e-cal-model-tasks.h
+++ b/calendar/gui/e-cal-model-tasks.h
@@ -79,7 +79,7 @@ struct _ECalModelTasksClass {
 };
 
 GType		e_cal_model_tasks_get_type	(void);
-ECalModel *	e_cal_model_tasks_new		(void);
+ECalModel *	e_cal_model_tasks_new		(ESourceRegistry *registry);
 gboolean	e_cal_model_tasks_get_highlight_due_today
 						(ECalModelTasks *model);
 void		e_cal_model_tasks_set_highlight_due_today
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
index 20dee7f..dc069b4 100644
--- a/calendar/gui/e-cal-model.c
+++ b/calendar/gui/e-cal-model.c
@@ -32,14 +32,13 @@
 #include <libebackend/e-extensible.h>
 #include <libedataserver/e-flag.h>
 #include <libedataserver/e-time-utils.h>
+#include <libedataserver/e-source-calendar.h>
 #include <libecal/e-cal-client-view.h>
 #include <libecal/e-cal-time-util.h>
 
 #include <e-util/e-util.h>
 #include <e-util/e-util-enumtypes.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include "comp-util.h"
 #include "e-cal-model.h"
 #include "itip-utils.h"
@@ -66,6 +65,8 @@ typedef struct {
 } ECalModelClient;
 
 struct _ECalModelPrivate {
+	ESourceRegistry *registry;
+
 	/* The list of clients we are managing. Each element is of type ECalModelClient */
 	GList *clients;
 
@@ -92,9 +93,6 @@ struct _ECalModelPrivate {
 	/* The default category */
 	gchar *default_category;
 
-	/* Addresses for determining icons */
-	EAccountList *accounts;
-
 	/* Whether we display dates in 24-hour format. */
         gboolean use_24_hour_format;
 
@@ -162,6 +160,7 @@ enum {
 	PROP_DEFAULT_CLIENT,
 	PROP_DEFAULT_REMINDER_INTERVAL,
 	PROP_DEFAULT_REMINDER_UNITS,
+	PROP_REGISTRY,
 	PROP_TIMEZONE,
 	PROP_USE_24_HOUR_FORMAT,
 	PROP_USE_DEFAULT_REMINDER,
@@ -196,6 +195,16 @@ G_DEFINE_TYPE (
 	G_TYPE_OBJECT)
 
 static void
+cal_model_set_registry (ECalModel *model,
+                        ESourceRegistry *registry)
+{
+	g_return_if_fail (E_IS_SOURCE_REGISTRY (registry));
+	g_return_if_fail (model->priv->registry == NULL);
+
+	model->priv->registry = g_object_ref (registry);
+}
+
+static void
 cal_model_set_property (GObject *object,
                         guint property_id,
                         const GValue *value,
@@ -232,6 +241,12 @@ cal_model_set_property (GObject *object,
 				g_value_get_enum (value));
 			return;
 
+		case PROP_REGISTRY:
+			cal_model_set_registry (
+				E_CAL_MODEL (object),
+				g_value_get_object (value));
+			return;
+
 		case PROP_TIMEZONE:
 			e_cal_model_set_timezone (
 				E_CAL_MODEL (object),
@@ -326,6 +341,13 @@ cal_model_get_property (GObject *object,
 				E_CAL_MODEL (object)));
 			return;
 
+		case PROP_REGISTRY:
+			g_value_set_object (
+				value,
+				e_cal_model_get_registry (
+				E_CAL_MODEL (object)));
+			return;
+
 		case PROP_TIMEZONE:
 			g_value_set_pointer (
 				value,
@@ -402,6 +424,11 @@ cal_model_dispose (GObject *object)
 
 	priv = E_CAL_MODEL_GET_PRIVATE (object);
 
+	if (priv->registry != NULL) {
+		g_object_unref (priv->registry);
+		priv->registry = NULL;
+	}
+
 	if (priv->loading_clients) {
 		g_cancellable_cancel (priv->loading_clients);
 		g_object_unref (priv->loading_clients);
@@ -560,6 +587,17 @@ e_cal_model_class_init (ECalModelClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_REGISTRY,
+		g_param_spec_object (
+			"registry",
+			"Registry",
+			"Data source registry",
+			E_TYPE_SOURCE_REGISTRY,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_TIMEZONE,
 		g_param_spec_pointer (
 			"timezone",
@@ -728,8 +766,6 @@ e_cal_model_init (ECalModel *model)
 	model->priv->kind = ICAL_NO_COMPONENT;
 	model->priv->flags = 0;
 
-	model->priv->accounts = e_get_account_list ();
-
 	model->priv->use_24_hour_format = TRUE;
 
 	model->priv->in_added = FALSE;
@@ -963,11 +999,14 @@ ecm_value_at (ETableModel *etm,
 	ECalModelPrivate *priv;
 	ECalModelComponent *comp_data;
 	ECalModel *model = (ECalModel *) etm;
+	ESourceRegistry *registry;
 
 	g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
 
 	priv = model->priv;
 
+	registry = e_cal_model_get_registry (model);
+
 	g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL);
 	g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL);
 
@@ -1011,7 +1050,7 @@ ecm_value_at (ETableModel *etm,
 
 			if (e_cal_component_has_recurrences (comp))
 				retval = 1;
-			else if (itip_organizer_is_user (comp, comp_data->client))
+			else if (itip_organizer_is_user (registry, comp, comp_data->client))
 				retval = 3;
 			else {
 				GSList *attendees = NULL, *sl;
@@ -1022,7 +1061,7 @@ ecm_value_at (ETableModel *etm,
 					const gchar *text;
 
 					text = itip_strip_mailto (ca->value);
-					if (itip_address_is_user (text)) {
+					if (itip_address_is_user (registry, text)) {
 						if (ca->delto != NULL)
 							retval = 3;
 						else
@@ -1639,7 +1678,7 @@ ecm_value_to_string (ETableModel *etm,
 
 typedef struct {
 	const gchar *color;
-	GList *uris;
+	GList *uids;
 } AssignedColorData;
 
 static const gchar *
@@ -1647,7 +1686,10 @@ ecm_get_color_for_component (ECalModel *model,
                              ECalModelComponent *comp_data)
 {
 	ESource *source;
+	ESourceSelectable *extension;
 	const gchar *color_spec;
+	const gchar *extension_name;
+	const gchar *uid;
 	gint i, first_empty = 0;
 
 	static AssignedColorData assigned_colors[] = {
@@ -1665,35 +1707,48 @@ ecm_get_color_for_component (ECalModel *model,
 
 	g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
 
+	switch (e_cal_client_get_source_type (comp_data->client)) {
+		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
+			extension_name = E_SOURCE_EXTENSION_CALENDAR;
+			break;
+		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
+			extension_name = E_SOURCE_EXTENSION_TASK_LIST;
+			break;
+		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
+			extension_name = E_SOURCE_EXTENSION_MEMO_LIST;
+			break;
+		default:
+			g_return_val_if_reached (NULL);
+	}
+
 	source = e_client_get_source (E_CLIENT (comp_data->client));
-	color_spec = e_source_peek_color_spec (source);
+	extension = e_source_get_extension (source, extension_name);
+	color_spec = e_source_selectable_get_color (extension);
+
 	if (color_spec != NULL) {
 		g_free (comp_data->color);
 		comp_data->color = g_strdup (color_spec);
 		return comp_data->color;
 	}
 
+	uid = e_source_get_uid (source);
+
 	for (i = 0; i < G_N_ELEMENTS (assigned_colors); i++) {
 		GList *l;
 
-		if (assigned_colors[i].uris == NULL) {
+		if (assigned_colors[i].uids == NULL) {
 			first_empty = i;
 			continue;
 		}
 
-		for (l = assigned_colors[i].uris; l != NULL; l = l->next) {
-			if (!strcmp ((const gchar *) l->data,
-				     e_client_get_uri (E_CLIENT (comp_data->client))))
-			{
+		for (l = assigned_colors[i].uids; l != NULL; l = l->next)
+			if (g_strcmp0 (l->data, uid) == 0)
 				return assigned_colors[i].color;
-			}
-		}
 	}
 
 	/* return the first unused color */
-	assigned_colors[first_empty].uris = g_list_append (
-		assigned_colors[first_empty].uris,
-		g_strdup (e_client_get_uri (E_CLIENT (comp_data->client))));
+	assigned_colors[first_empty].uids = g_list_append (
+		assigned_colors[first_empty].uids, g_strdup (uid));
 
 	return assigned_colors[first_empty].color;
 }
@@ -1751,6 +1806,14 @@ e_cal_model_set_flags (ECalModel *model,
 	model->priv->flags = flags;
 }
 
+ESourceRegistry *
+e_cal_model_get_registry (ECalModel *model)
+{
+	g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
+
+	return model->priv->registry;
+}
+
 icaltimezone *
 e_cal_model_get_timezone (ECalModel *model)
 {
@@ -2080,23 +2143,29 @@ e_cal_model_get_client_list (ECalModel *model)
 }
 
 /**
- * e_cal_model_get_client_for_uri:
+ * e_cal_model_get_client_for_source:
  * @model: an #ECalModel
- * @uri: Uri for the client to get.
+ * @source: an #ESource
  */
 ECalClient *
-e_cal_model_get_client_for_uri (ECalModel *model,
-                                const gchar *uri)
+e_cal_model_get_client_for_source (ECalModel *model,
+                                   ESource *source)
 {
-	GList *l;
+	GList *link;
 
 	g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
-	g_return_val_if_fail (uri != NULL, NULL);
+	g_return_val_if_fail (E_IS_SOURCE (source), NULL);
 
-	for (l = model->priv->clients; l != NULL; l = l->next) {
-		ECalModelClient *client_data = (ECalModelClient *) l->data;
+	for (link = model->priv->clients; link != NULL; link = link->next) {
+		ECalModelClient *client_data;
+		ESource *client_source;
+		EClient *client;
 
-		if (!strcmp (uri, e_client_get_uri (E_CLIENT (client_data->client))))
+		client_data = (ECalModelClient *) link->data;
+		client = E_CLIENT (client_data->client);
+		client_source = e_client_get_source (client);
+
+		if (e_source_equal (source, client_source))
 			return client_data->client;
 	}
 
@@ -2942,7 +3011,7 @@ client_opened_cb (GObject *source_object,
 		g_warning (
 			"%s: Failed to open '%s': %s",
 			G_STRFUNC,
-			e_source_peek_name (source),
+			e_source_get_display_name (source),
 			error->message);
 		g_error_free (error);
 		e_cal_model_update_status_message (model, NULL, -1.0);
@@ -3017,7 +3086,7 @@ add_new_client (ECalModel *model,
 		gchar *msg;
 
 		source = e_client_get_source (E_CLIENT (client));
-		display_name = e_source_peek_name (source);
+		display_name = e_source_get_display_name (source);
 		msg = g_strdup_printf (_("Opening %s"), display_name);
 		e_cal_model_update_status_message (model, msg, -1.0);
 		g_free (msg);
@@ -3472,6 +3541,7 @@ e_cal_model_get_attendees_status_info (ECalModel *model,
 		{ ICAL_PARTSTAT_X,           NULL,              -1 }
 	};
 
+	ESourceRegistry *registry;
 	GSList *attendees = NULL, *a;
 	gboolean have = FALSE;
 	gchar *res = NULL;
@@ -3479,8 +3549,10 @@ e_cal_model_get_attendees_status_info (ECalModel *model,
 
 	g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
 
+	registry = e_cal_model_get_registry (model);
+
 	if (!comp || !e_cal_component_has_attendees (comp) ||
-	    !itip_organizer_is_user_ex (comp, cal_client, TRUE))
+	    !itip_organizer_is_user_ex (registry, comp, cal_client, TRUE))
 		return NULL;
 
 	e_cal_component_get_attendee_list (comp, &attendees);
diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h
index 3b4089b..68a6235 100644
--- a/calendar/gui/e-cal-model.h
+++ b/calendar/gui/e-cal-model.h
@@ -29,6 +29,7 @@
 #include <e-util/e-util-enums.h>
 #include <table/e-table-model.h>
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-registry.h>
 #include "e-cell-date-edit-text.h"
 
 /* Standard GObject macros */
@@ -186,6 +187,8 @@ void		e_cal_model_set_confirm_delete	(ECalModel *model,
 ECalModelFlags	e_cal_model_get_flags		(ECalModel *model);
 void		e_cal_model_set_flags		(ECalModel *model,
 						 ECalModelFlags flags);
+ESourceRegistry *
+		e_cal_model_get_registry	(ECalModel *model);
 icaltimezone *	e_cal_model_get_timezone	(ECalModel *model);
 void		e_cal_model_set_timezone	(ECalModel *model,
 						 icaltimezone *zone);
@@ -244,8 +247,9 @@ ECalClient *	e_cal_model_get_default_client	(ECalModel *model);
 void		e_cal_model_set_default_client	(ECalModel *model,
 						 ECalClient *client);
 GList *		e_cal_model_get_client_list	(ECalModel *model);
-ECalClient *	e_cal_model_get_client_for_uri	(ECalModel *model,
-						 const gchar *uri);
+ECalClient *	e_cal_model_get_client_for_source
+						(ECalModel *model,
+						 ESource *source);
 void		e_cal_model_add_client		(ECalModel *model,
 						 ECalClient *cal_client);
 void		e_cal_model_remove_client	(ECalModel *model,
diff --git a/calendar/gui/e-calendar-selector.c b/calendar/gui/e-calendar-selector.c
index 4add4a3..21d3246 100644
--- a/calendar/gui/e-calendar-selector.c
+++ b/calendar/gui/e-calendar-selector.c
@@ -18,13 +18,12 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
 
 #include "e-calendar-selector.h"
 
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-calendar.h>
 #include <libedataserverui/e-client-utils.h>
 
 #include "e-util/e-selection.h"
@@ -152,6 +151,111 @@ client_opened_cb (GObject *source_object,
 }
 
 static gboolean
+calendar_selector_get_source_selected (ESourceSelector *selector,
+                                       ESource *source)
+{
+	GSettings *settings;
+	gboolean selected = FALSE;
+	const gchar *uid;
+	gchar **strv;
+	gint ii;
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-calendars");
+	g_object_unref (settings);
+
+	g_return_val_if_fail (strv != NULL, FALSE);
+
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		if (g_strcmp0 (uid, strv[ii]) == 0) {
+			selected = TRUE;
+			break;
+		}
+	}
+
+	g_strfreev (strv);
+
+	return selected;
+}
+
+static void
+calendar_selector_set_source_selected (ESourceSelector *selector,
+                                       ESource *source,
+                                       gboolean selected)
+{
+	GSettings *settings;
+	GHashTable *hash_table;
+	const gchar *uid;
+	gpointer value;
+	guint old_size;
+	guint new_size;
+	gchar **strv;
+	gint ii;
+
+	/* Chain up to parent's set_source_selected() method. */
+	E_SOURCE_SELECTOR_CLASS (e_calendar_selector_parent_class)->
+		set_source_selected (selector, source, selected);
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-calendars");
+	g_object_unref (settings);
+
+	g_return_if_fail (strv != NULL);
+
+	hash_table = g_hash_table_new_full (
+		(GHashFunc) g_str_hash,
+		(GEqualFunc) g_str_equal,
+		(GDestroyNotify) g_free,
+		(GDestroyNotify) NULL);
+
+	value = GINT_TO_POINTER (1);  /* just needs to be non-NULL */
+
+	/* Transfer the string array to a hash table. */
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		g_hash_table_insert (hash_table, strv[ii], value);
+		strv[ii] = NULL;
+	}
+
+	g_free (strv);
+	strv = NULL;
+
+	old_size = g_hash_table_size (hash_table);
+
+	if (selected)
+		g_hash_table_insert (hash_table, g_strdup (uid), value);
+	else
+		g_hash_table_remove (hash_table, uid);
+
+	new_size = g_hash_table_size (hash_table);
+
+	if (old_size != new_size) {
+		GHashTableIter iter;
+
+		ii = 0;
+		strv = g_new0 (gchar *, new_size + 1);
+		g_hash_table_iter_init (&iter, hash_table);
+
+		/* Hash table still owns the strings. */
+		while (g_hash_table_iter_next (&iter, &value, NULL))
+			strv[ii++] = value;
+
+		settings = g_settings_new ("org.gnome.evolution.calendar");
+		g_settings_set_strv (
+			settings, "selected-calendars",
+			(const gchar * const *) strv);
+		g_object_unref (settings);
+
+		g_free (strv);
+	}
+
+	g_hash_table_destroy (hash_table);
+}
+
+static gboolean
 calendar_selector_data_dropped (ESourceSelector *selector,
                                 GtkSelectionData *selection_data,
                                 ESource *destination,
@@ -180,7 +284,6 @@ calendar_selector_data_dropped (ESourceSelector *selector,
 
 	e_client_utils_open_new (
 		destination, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, NULL,
-		e_client_utils_authenticate_handler, NULL,
 		client_opened_cb, icalcomp);
 
 	success = TRUE;
@@ -203,6 +306,8 @@ e_calendar_selector_class_init (ECalendarSelectorClass *class)
 	g_type_class_add_private (class, sizeof (ECalendarSelectorPrivate));
 
 	source_selector_class = E_SOURCE_SELECTOR_CLASS (class);
+	source_selector_class->get_source_selected = calendar_selector_get_source_selected;
+	source_selector_class->set_source_selected = calendar_selector_set_source_selected;
 	source_selector_class->data_dropped = calendar_selector_data_dropped;
 }
 
@@ -219,11 +324,12 @@ e_calendar_selector_init (ECalendarSelector *selector)
 }
 
 GtkWidget *
-e_calendar_selector_new (ESourceList *source_list)
+e_calendar_selector_new (ESourceRegistry *registry)
 {
-	g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
 
 	return g_object_new (
 		E_TYPE_CALENDAR_SELECTOR,
-		"source-list", source_list, NULL);
+		"extension-name", E_SOURCE_EXTENSION_CALENDAR,
+		"registry", registry, NULL);
 }
diff --git a/calendar/gui/e-calendar-selector.h b/calendar/gui/e-calendar-selector.h
index 65d9a2f..d8aec73 100644
--- a/calendar/gui/e-calendar-selector.h
+++ b/calendar/gui/e-calendar-selector.h
@@ -21,7 +21,6 @@
 #ifndef E_CALENDAR_SELECTOR_H
 #define E_CALENDAR_SELECTOR_H
 
-#include <libedataserver/e-source-list.h>
 #include <libedataserverui/e-source-selector.h>
 
 /* Standard GObject macros */
@@ -59,7 +58,7 @@ struct _ECalendarSelectorClass {
 };
 
 GType		e_calendar_selector_get_type	(void);
-GtkWidget *	e_calendar_selector_new		(ESourceList *source_list);
+GtkWidget *	e_calendar_selector_new		(ESourceRegistry *registry);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 413e54a..86c52c0 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -169,6 +169,7 @@ calendar_view_delete_event (ECalendarView *cal_view,
 	ECalModel *model;
 	ECalComponent *comp;
 	ECalComponentVType vtype;
+	ESourceRegistry *registry;
 	gboolean delete = TRUE;
 	GError *error = NULL;
 
@@ -176,6 +177,7 @@ calendar_view_delete_event (ECalendarView *cal_view,
 		return;
 
 	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
@@ -223,13 +225,13 @@ calendar_view_delete_event (ECalendarView *cal_view,
 		const gchar *uid;
 		gchar *rid = NULL;
 
-		if ((itip_organizer_is_user (comp, event->comp_data->client) ||
-		     itip_sentby_is_user (comp, event->comp_data->client))
+		if ((itip_organizer_is_user (registry, comp, event->comp_data->client) ||
+		     itip_sentby_is_user (registry, comp, event->comp_data->client))
 		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
 						event->comp_data->client,
 						comp, TRUE))
 			itip_send_comp (
-				E_CAL_COMPONENT_METHOD_CANCEL,
+				registry, E_CAL_COMPONENT_METHOD_CANCEL,
 				comp, event->comp_data->client, NULL, NULL,
 				NULL, TRUE, FALSE);
 
@@ -701,13 +703,18 @@ clipboard_get_calendar_data (ECalendarView *cal_view,
 static void
 calendar_view_paste_clipboard (ESelectable *selectable)
 {
+	ECalModel *model;
 	ECalendarView *cal_view;
 	ECalendarViewPrivate *priv;
+	ESourceRegistry *registry;
 	GtkClipboard *clipboard;
 
 	cal_view = E_CALENDAR_VIEW (selectable);
 	priv = cal_view->priv;
 
+	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
+
 	clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
 
 	/* Paste text into an event being edited. */
@@ -750,14 +757,15 @@ calendar_view_paste_clipboard (ESelectable *selectable)
 				comp = e_cal_component_new ();
 				e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
 
-				if ((itip_organizer_is_user (comp, comp_data->client) ||
-							itip_sentby_is_user (comp, comp_data->client))
+				if ((itip_organizer_is_user (registry, comp, comp_data->client) ||
+							itip_sentby_is_user (registry, comp, comp_data->client))
 						&& cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
 							comp_data->client, comp, TRUE))
 					itip_send_comp (
-							E_CAL_COMPONENT_METHOD_CANCEL,
-							comp, comp_data->client, NULL, NULL,
-							NULL, TRUE, FALSE);
+						registry,
+						E_CAL_COMPONENT_METHOD_CANCEL,
+						comp, comp_data->client,
+						NULL, NULL, NULL, TRUE, FALSE);
 
 				e_cal_component_get_uid (comp, &uid);
 				if (e_cal_component_is_instance (comp)) {
@@ -1014,7 +1022,9 @@ e_calendar_view_add_event (ECalendarView *cal_view,
                            icalcomponent *icalcomp,
                            gboolean in_top_canvas)
 {
+	ECalModel *model;
 	ECalComponent *comp;
+	ESourceRegistry *registry;
 	struct icaltimetype itime, old_dtstart, old_dtend;
 	time_t tt_start, tt_end, new_dtstart = 0;
 	struct icaldurationtype ic_dur, ic_oneday;
@@ -1025,6 +1035,9 @@ e_calendar_view_add_event (ECalendarView *cal_view,
 	gboolean ret = TRUE;
 	GError *error = NULL;
 
+	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
+
 	start_offset = 0;
 	end_offset = 0;
 
@@ -1120,14 +1133,14 @@ e_calendar_view_add_event (ECalendarView *cal_view,
 			g_free (uid);
 		}
 
-		if ((itip_organizer_is_user (comp, client) ||
-		     itip_sentby_is_user (comp, client)) &&
+		if ((itip_organizer_is_user (registry, comp, client) ||
+		     itip_sentby_is_user (registry, comp, client)) &&
 			send_component_dialog (
 				(GtkWindow *) gtk_widget_get_toplevel (
 					GTK_WIDGET (cal_view)),
 				client, comp, TRUE, &strip_alarms, NULL)) {
 			itip_send_comp (
-				E_CAL_COMPONENT_METHOD_REQUEST,
+				registry, E_CAL_COMPONENT_METHOD_REQUEST,
 				comp, client, NULL, NULL, NULL, strip_alarms,
 				FALSE);
 		}
@@ -1333,10 +1346,12 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 	ECalComponent *comp;
 	ECalendarViewEvent *event;
 	ECalComponentVType vtype;
+	ESourceRegistry *registry;
 	gboolean delete = TRUE;
 	GError *error = NULL;
 
 	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
 
 	selected = e_calendar_view_get_selected_events (cal_view);
 	if (!selected)
@@ -1408,8 +1423,8 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 
 		e_cal_component_free_datetime (&dt);
 
-		if ((itip_organizer_is_user (comp, event->comp_data->client) ||
-		     itip_sentby_is_user (comp, event->comp_data->client))
+		if ((itip_organizer_is_user (registry, comp, event->comp_data->client) ||
+		     itip_sentby_is_user (registry, comp, event->comp_data->client))
 				&& cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
 					event->comp_data->client,
 					comp, TRUE) && !e_cal_client_check_save_schedules (event->comp_data->client)) {
@@ -1426,7 +1441,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 			}
 
 			itip_send_comp (
-				E_CAL_COMPONENT_METHOD_CANCEL,
+				registry, E_CAL_COMPONENT_METHOD_CANCEL,
 				comp, event->comp_data->client, NULL, NULL,
 				NULL, TRUE, FALSE);
 		}
@@ -1517,7 +1532,7 @@ e_calendar_view_new_appointment_for (ECalendarView *cal_view,
 
 		widget = e_alert_dialog_new_for_args (
 			parent, "calendar:prompt-read-only-cal",
-			e_source_peek_name (source),
+			e_source_get_display_name (source),
 			NULL);
 
 		g_signal_connect (
@@ -1725,19 +1740,24 @@ e_calendar_view_edit_appointment (ECalendarView *cal_view,
                                   icalcomponent *icalcomp,
                                   EEditEventMode mode)
 {
+	ECalModel *model;
+	ESourceRegistry *registry;
 	guint32 flags = 0;
 
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 	g_return_if_fail (E_IS_CAL_CLIENT (client));
 	g_return_if_fail (icalcomp != NULL);
 
+	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
+
 	if ((mode == EDIT_EVENT_AUTODETECT && icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY) != NULL)
 	    || mode == EDIT_EVENT_FORCE_MEETING) {
 		ECalComponent *comp = e_cal_component_new ();
 		e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
 		flags |= COMP_EDITOR_MEETING;
-		if (itip_organizer_is_user (comp, client) ||
-		    itip_sentby_is_user (comp, client) ||
+		if (itip_organizer_is_user (registry, comp, client) ||
+		    itip_sentby_is_user (registry, comp, client) ||
 		    !e_cal_component_has_attendees (comp))
 			flags |= COMP_EDITOR_USER_ORG;
 		g_object_unref (comp);
@@ -1754,18 +1774,23 @@ e_calendar_view_modify_and_send (ECalendarView *cal_view,
                                  GtkWindow *toplevel,
                                  gboolean new)
 {
+	ECalModel *model;
+	ESourceRegistry *registry;
 	gboolean only_new_attendees = FALSE;
 	GError *error = NULL;
 
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
+	model = e_calendar_view_get_model (cal_view);
+	registry = e_cal_model_get_registry (model);
+
 	e_cal_component_commit_sequence (comp);
 
 	if (e_cal_client_modify_object_sync (client, e_cal_component_get_icalcomponent (comp), mod, NULL, &error)) {
 		gboolean strip_alarms = TRUE;
 
-		if ((itip_organizer_is_user (comp, client) ||
-		     itip_sentby_is_user (comp, client)) &&
+		if ((itip_organizer_is_user (registry, comp, client) ||
+		     itip_sentby_is_user (registry, comp, client)) &&
 		    send_component_dialog (toplevel, client, comp, new, &strip_alarms, &only_new_attendees)) {
 			ECalComponent *send_comp = NULL;
 
@@ -1789,7 +1814,7 @@ e_calendar_view_modify_and_send (ECalendarView *cal_view,
 			}
 
 			itip_send_comp (
-				E_CAL_COMPONENT_METHOD_REQUEST,
+				registry, E_CAL_COMPONENT_METHOD_REQUEST,
 				send_comp ? send_comp : comp, client, NULL,
 				NULL, NULL, strip_alarms, only_new_attendees);
 
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 8969450..ff4b6dc 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -296,7 +296,8 @@ static void e_day_view_foreach_event_with_uid (EDayView *day_view,
 static void e_day_view_free_events (EDayView *day_view);
 static void e_day_view_free_event_array (EDayView *day_view,
 					 GArray *array);
-static gint e_day_view_add_event (ECalComponent *comp,
+static gint e_day_view_add_event (ESourceRegistry *registry,
+				 ECalComponent *comp,
 				 time_t	  start,
 				 time_t	  end,
 				 gpointer data);
@@ -715,9 +716,14 @@ process_component (EDayView *day_view,
 {
 	const gchar *uid;
 	gchar *rid = NULL;
+	ECalModel *model;
 	ECalComponent *comp;
+	ESourceRegistry *registry;
 	AddEventData add_event_data;
 
+	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
+	registry = e_cal_model_get_registry (model);
+
 	/* If our time hasn't been set yet, just return. */
 	if (day_view->lower == 0 && day_view->upper == 0)
 		return;
@@ -741,7 +747,7 @@ process_component (EDayView *day_view,
 	add_event_data.day_view = day_view;
 	add_event_data.comp_data = comp_data;
 	e_day_view_add_event (
-		comp, comp_data->instance_start,
+		registry, comp, comp_data->instance_start,
 		comp_data->instance_end, &add_event_data);
 
 	g_object_unref (comp);
@@ -2081,7 +2087,8 @@ e_day_view_remove_event_cb (EDayView *day_view,
 
 /* Checks if the users participation status is NEEDS-ACTION and shows the summary as bold text */
 static void
-set_text_as_bold (EDayViewEvent *event)
+set_text_as_bold (EDayViewEvent *event,
+                  ESourceRegistry *registry)
 {
 	ECalComponent *comp;
 	GSList *attendees = NULL, *l;
@@ -2093,7 +2100,8 @@ set_text_as_bold (EDayViewEvent *event)
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-	address = itip_get_comp_attendee (comp, event->comp_data->client);
+	address = itip_get_comp_attendee (
+		registry, comp, event->comp_data->client);
 	e_cal_component_get_attendee_list (comp, &attendees);
 	for (l = attendees; l; l = l->next) {
 		ECalComponentAttendee *attendee = l->data;
@@ -2125,6 +2133,8 @@ e_day_view_update_event_label (EDayView *day_view,
 {
 	EDayViewEvent *event;
 	ECalendarView *cal_view;
+	ESourceRegistry *registry;
+	ECalModel *model;
 	gboolean free_text = FALSE, editing_event = FALSE, short_event = FALSE;
 	const gchar *summary;
 	gchar *text;
@@ -2150,8 +2160,11 @@ e_day_view_update_event_label (EDayView *day_view,
 	interval = event->end_minute - event->start_minute;
 
 	cal_view = E_CALENDAR_VIEW (day_view);
+	model = e_calendar_view_get_model (cal_view);
 	time_divisions = e_calendar_view_get_time_divisions (cal_view);
 
+	registry = e_cal_model_get_registry (model);
+
 	if ((interval / time_divisions) >= 2)
 		short_event = FALSE;
 	else if ((interval % time_divisions) == 0) {
@@ -2181,7 +2194,7 @@ e_day_view_update_event_label (EDayView *day_view,
 
 	if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp))
-		set_text_as_bold (event);
+		set_text_as_bold (event, registry);
 
 	if (free_text)
 		g_free (text);
@@ -2192,9 +2205,17 @@ e_day_view_update_long_event_label (EDayView *day_view,
                                     gint event_num)
 {
 	EDayViewEvent *event;
+	ECalendarView *cal_view;
+	ECalModel *model;
+	ESourceRegistry *registry;
 	const gchar *summary;
 	gboolean free_text = FALSE;
 
+	cal_view = E_CALENDAR_VIEW (day_view);
+	model = e_calendar_view_get_model (cal_view);
+
+	registry = e_cal_model_get_registry (model);
+
 	if (!is_array_index_in_bounds (day_view->long_events, event_num))
 		return;
 
@@ -2216,7 +2237,7 @@ e_day_view_update_long_event_label (EDayView *day_view,
 
 	if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp))
-		set_text_as_bold (event);
+		set_text_as_bold (event, registry);
 }
 
 /* Finds the day and index of the event with the given canvas item.
@@ -4216,11 +4237,16 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
 	ECalComponentDateTime date;
 	struct icaltimetype itt;
 	time_t dt;
+	ECalModel *model;
 	ECalClient *client;
+	ESourceRegistry *registry;
 	CalObjModType mod = CALOBJ_MOD_ALL;
 	GtkWindow *toplevel;
 	gint is_date;
 
+	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
+	registry = e_cal_model_get_registry (model);
+
 	event_num = day_view->resize_event_num;
 
 	if (!is_array_index_in_bounds (day_view->long_events, event_num))
@@ -4241,7 +4267,7 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 
 	if (e_cal_component_has_attendees (comp) &&
-	    !itip_organizer_is_user (comp, client)) {
+	    !itip_organizer_is_user (registry, comp, client)) {
 		g_object_unref (comp);
 		e_day_view_abort_resize (day_view);
 		return;
@@ -4335,10 +4361,15 @@ e_day_view_finish_resize (EDayView *day_view)
 	ECalComponentDateTime date;
 	struct icaltimetype itt;
 	time_t dt;
+	ECalModel *model;
 	ECalClient *client;
+	ESourceRegistry *registry;
 	CalObjModType mod = CALOBJ_MOD_ALL;
 	GtkWindow *toplevel;
 
+	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
+	registry = e_cal_model_get_registry (model);
+
 	if (day_view->resize_event_num == -1)
 		return;
 
@@ -4363,7 +4394,7 @@ e_day_view_finish_resize (EDayView *day_view)
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 
 	if (e_cal_component_has_attendees (comp) &&
-	    !itip_organizer_is_user (comp, client)) {
+	    !itip_organizer_is_user (registry, comp, client)) {
 		g_object_unref (comp);
 		e_day_view_abort_resize (day_view);
 		return;
@@ -4516,7 +4547,8 @@ e_day_view_free_event_array (EDayView *day_view,
 
 /* This adds one event to the view, adding it to the appropriate array. */
 static gboolean
-e_day_view_add_event (ECalComponent *comp,
+e_day_view_add_event (ESourceRegistry *registry,
+                      ECalComponent *comp,
                       time_t start,
                       time_t end,
                       gpointer data)
@@ -4583,8 +4615,8 @@ e_day_view_add_event (ECalComponent *comp,
 		event.different_timezone = TRUE;
 
 	if (!e_cal_component_has_attendees (comp) ||
-	    itip_organizer_is_user (comp, event.comp_data->client) ||
-	    itip_sentby_is_user (comp, event.comp_data->client))
+	    itip_organizer_is_user (registry, comp, event.comp_data->client) ||
+	    itip_sentby_is_user (registry, comp, event.comp_data->client))
 		event.is_editable = TRUE;
 	else
 		event.is_editable = FALSE;
@@ -5126,9 +5158,11 @@ e_day_view_add_new_event_in_selected_range (EDayView *day_view,
 	struct icaltimetype start_tt, end_tt;
 	const gchar *uid;
 	AddEventData add_event_data;
+	ESourceRegistry *registry;
 
 	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
 
+	registry = e_cal_model_get_registry (model);
 	client = e_cal_model_get_default_client (model);
 
 	/* Check if the client is read only */
@@ -5179,7 +5213,7 @@ e_day_view_add_new_event_in_selected_range (EDayView *day_view,
 	 * to the server until the user finishes editing it. */
 	add_event_data.day_view = day_view;
 	add_event_data.comp_data = NULL;
-	e_day_view_add_event (comp, dtstart, dtend, &add_event_data);
+	e_day_view_add_event (registry, comp, dtstart, dtend, &add_event_data);
 	e_day_view_check_layout (day_view);
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->main_canvas);
@@ -6494,13 +6528,18 @@ e_day_view_change_event_time (EDayView *day_view,
 	ECalComponent *comp;
 	ECalComponentDateTime date;
 	struct icaltimetype itt;
+	ECalModel *model;
 	ECalClient *client;
+	ESourceRegistry *registry;
 	CalObjModType mod = CALOBJ_MOD_ALL;
 	GtkWindow *toplevel;
 
 	day = day_view->editing_event_day;
 	event_num = day_view->editing_event_num;
 
+	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
+	registry = e_cal_model_get_registry (model);
+
 	if (!is_array_index_in_bounds (day_view->events[day], event_num))
 		return;
 
@@ -6519,7 +6558,7 @@ e_day_view_change_event_time (EDayView *day_view,
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 
 	if (e_cal_component_has_attendees (comp) &&
-	    !itip_organizer_is_user (comp, client)) {
+	    !itip_organizer_is_user (registry, comp, client)) {
 		g_object_unref (comp);
 		return;
 	}
@@ -7906,7 +7945,7 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
 		gchar *tmp;
 
 		source = e_client_get_source (E_CLIENT (event->comp_data->client));
-		source_uid = e_source_peek_uid (source);
+		source_uid = e_source_get_uid (source);
 
 		tmp = g_strconcat (source_uid, "\n", comp_str, NULL);
 		target = gtk_selection_data_get_target (selection_data);
@@ -7937,6 +7976,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
 	gint start_offset, end_offset;
 	ECalComponent *comp;
 	ECalComponentDateTime date;
+	ESourceRegistry *registry;
 	struct icaltimetype itt;
 	time_t dt;
 	gboolean all_day_event;
@@ -7958,6 +7998,8 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
 
 	cal_view = E_CALENDAR_VIEW (day_view);
 	model = e_calendar_view_get_model (cal_view);
+
+	registry = e_cal_model_get_registry (model);
 	client = e_cal_model_get_default_client (model);
 
 	/* Note that we only support DnD within the EDayView at present. */
@@ -8022,7 +8064,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
 			e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 
 			if (e_cal_component_has_attendees (comp) &&
-			    !itip_organizer_is_user (comp, client)) {
+			    !itip_organizer_is_user (registry, comp, client)) {
 				g_object_unref (comp);
 				return;
 			}
@@ -8188,6 +8230,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
 	ECalModel *model;
 	ECalComponent *comp;
 	ECalComponentDateTime date;
+	ESourceRegistry *registry;
 	struct icaltimetype itt;
 	time_t dt;
 	ECalClient *client;
@@ -8199,6 +8242,8 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
 	model = e_calendar_view_get_model (cal_view);
 	time_divisions = e_calendar_view_get_time_divisions (cal_view);
 
+	registry = e_cal_model_get_registry (model);
+
 	data = gtk_selection_data_get_data (selection_data);
 	format = gtk_selection_data_get_format (selection_data);
 	length = gtk_selection_data_get_length (selection_data);
@@ -8276,7 +8321,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
 			e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 
 			if (e_cal_component_has_attendees (comp) &&
-			    !itip_organizer_is_user (comp, client)) {
+			    !itip_organizer_is_user (registry, comp, client)) {
 				g_object_unref (comp);
 				return;
 			}
diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c
index 08ff03f..a0e68c9 100644
--- a/calendar/gui/e-meeting-list-view.c
+++ b/calendar/gui/e-meeting-list-view.c
@@ -38,6 +38,7 @@
 #include "e-meeting-list-view.h"
 #include "itip-utils.h"
 #include <libebook/e-destination.h>
+#include <shell/e-shell.h>
 #include "e-select-names-renderer.h"
 
 #define E_MEETING_LIST_VIEW_GET_PRIVATE(obj) \
@@ -146,13 +147,19 @@ static void
 e_meeting_list_view_init (EMeetingListView *view)
 {
 	ENameSelectorDialog *name_selector_dialog;
+	ESourceRegistry *registry;
+	EShell *shell;
 	gint i;
 
 	view->priv = E_MEETING_LIST_VIEW_GET_PRIVATE (view);
 
 	view->priv->renderers = g_hash_table_new (g_direct_hash, g_int_equal);
 
-	view->priv->name_selector = e_name_selector_new ();
+	/* FIXME Refactor this so we don't need e_shell_get_default(). */
+	shell = e_shell_get_default ();
+	registry = e_shell_get_registry (shell);
+
+	view->priv->name_selector = e_name_selector_new (registry);
 
 	for (i = 0; sections[i]; i++)
 		add_section (view->priv->name_selector, sections[i]);
@@ -875,7 +882,7 @@ process_section (EMeetingListView *view,
 				ENameSelectorModel *model;
 				EContactStore *c_store;
 				GSList *clients, *l;
-				gchar *uri = e_contact_get (contact, E_CONTACT_BOOK_URI);
+				gchar *uid = e_contact_get (contact, E_CONTACT_BOOK_URI);
 
 				dialog = e_name_selector_peek_dialog (view->priv->name_selector);
 				model = e_name_selector_dialog_peek_model (dialog);
@@ -884,7 +891,11 @@ process_section (EMeetingListView *view,
 
 				for (l = clients; l; l = l->next) {
 					EBookClient *b = l->data;
-					if (g_str_equal (uri, e_client_get_uri (E_CLIENT (b)))) {
+					ESource *source;
+
+					source = e_client_get_source (E_CLIENT (b));
+
+					if (g_strcmp0 (uid, e_source_get_uid (source)) == 0) {
 						book_client = b;
 						break;
 					}
diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c
index 0fbf327..e1f419b 100644
--- a/calendar/gui/e-meeting-store.c
+++ b/calendar/gui/e-meeting-store.c
@@ -35,12 +35,13 @@
 #include <libebackend/e-extensible.h>
 #include <libedataserver/e-data-server-util.h>
 #include <libedataserver/e-proxy.h>
+#include <libedataserver/e-source-mail-identity.h>
+#include <libedataserver/e-source-registry.h>
 #include <libedataserverui/e-passwords.h>
 
+#include <shell/e-shell.h>
 #include <e-util/e-util-enumtypes.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include "itip-utils.h"
 #include "e-meeting-utils.h"
 #include "e-meeting-attendee.h"
@@ -1145,31 +1146,37 @@ e_meeting_store_find_self (EMeetingStore *store,
                            gint *row)
 {
 	EMeetingAttendee *attendee = NULL;
-	EAccountList *account_list;
-	EIterator *iterator;
+	ESourceRegistry *registry;
+	EShell *shell;
+	GList *list, *iter;
+	const gchar *extension_name;
 
 	g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
 
-	account_list = e_get_account_list ();
+	/* FIXME Refactor this so we don't need e_shell_get_default(). */
+	shell = e_shell_get_default ();
+	registry = e_shell_get_registry (shell);
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
 
-	iterator = e_list_get_iterator (E_LIST (account_list));
+	list = e_source_registry_list_sources (registry, extension_name);
 
-	while (e_iterator_is_valid (iterator)) {
-		EAccount *account;
+	for (iter = list; iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
+		const gchar *address;
 
-		/* XXX EIterator misuses const. */
-		account = (EAccount *) e_iterator_get (iterator);
+		extension = e_source_get_extension (source, extension_name);
+		address = e_source_mail_identity_get_address (extension);
 
-		attendee = e_meeting_store_find_attendee (
-			store, account->id->address, row);
+		if (address != NULL)
+			attendee = e_meeting_store_find_attendee (
+				store, address, row);
 
 		if (attendee != NULL)
 			break;
-
-		e_iterator_next (iterator);
 	}
 
-	g_object_unref (iterator);
+	g_list_free (list);
 
 	return attendee;
 }
diff --git a/calendar/gui/e-memo-list-selector.c b/calendar/gui/e-memo-list-selector.c
index 51466da..72d9aee 100644
--- a/calendar/gui/e-memo-list-selector.c
+++ b/calendar/gui/e-memo-list-selector.c
@@ -18,14 +18,14 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
+#include <gconf/gconf-client.h>
 
 #include "e-memo-list-selector.h"
 
 #include <string.h>
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-calendar.h>
 #include <libedataserverui/e-client-utils.h>
 #include "e-util/e-selection.h"
 #include "calendar/gui/comp-util.h"
@@ -163,8 +163,8 @@ memo_list_selector_process_data (ESourceSelector *selector,
                                  icalcomponent *icalcomp,
                                  GdkDragAction action)
 {
-	ESourceList *source_list;
 	ESource *source;
+	ESourceRegistry *registry;
 	icalcomponent *tmp_icalcomp = NULL;
 	const gchar *uid;
 	gchar *old_uid = NULL;
@@ -204,14 +204,14 @@ memo_list_selector_process_data (ESourceSelector *selector,
 	if (!success || action != GDK_ACTION_MOVE)
 		goto exit;
 
-	source_list = e_source_selector_get_source_list (selector);
-	source = e_source_list_peek_source_by_uid (source_list, source_uid);
+	registry = e_source_selector_get_registry (selector);
+	source = e_source_registry_lookup_by_uid (registry, source_uid);
 
-	if (!E_IS_SOURCE (source) || e_source_get_readonly (source))
+	if (!E_IS_SOURCE (source))
 		goto exit;
 
-	e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
-		e_client_utils_authenticate_handler, NULL,
+	e_client_utils_open_new (
+		source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
 		client_opened_cb, g_strdup (old_uid));
 
  exit:
@@ -288,6 +288,111 @@ exit:
 }
 
 static gboolean
+memo_list_selector_get_source_selected (ESourceSelector *selector,
+                                        ESource *source)
+{
+	GSettings *settings;
+	gboolean selected = FALSE;
+	const gchar *uid;
+	gchar **strv;
+	gint ii;
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-memos");
+	g_object_unref (settings);
+
+	g_return_val_if_fail (strv != NULL, FALSE);
+
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		if (g_strcmp0 (uid, strv[ii]) == 0) {
+			selected = TRUE;
+			break;
+		}
+	}
+
+	g_strfreev (strv);
+
+	return selected;
+}
+
+static void
+memo_list_selector_set_source_selected (ESourceSelector *selector,
+                                        ESource *source,
+                                        gboolean selected)
+{
+	GSettings *settings;
+	GHashTable *hash_table;
+	const gchar *uid;
+	gpointer value;
+	guint old_size;
+	guint new_size;
+	gchar **strv;
+	gint ii;
+
+	/* Chain up to parent's set_source_selected() method. */
+	E_SOURCE_SELECTOR_CLASS (e_memo_list_selector_parent_class)->
+		set_source_selected (selector, source, selected);
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-memos");
+	g_object_unref (settings);
+
+	g_return_if_fail (strv != NULL);
+
+	hash_table = g_hash_table_new_full (
+		(GHashFunc) g_str_hash,
+		(GEqualFunc) g_str_equal,
+		(GDestroyNotify) g_free,
+		(GDestroyNotify) NULL);
+
+	value = GINT_TO_POINTER (1);  /* just needs to be non-NULL */
+
+	/* Transfer the string array to a hash table. */
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		g_hash_table_insert (hash_table, strv[ii], value);
+		strv[ii] = NULL;
+	}
+
+	g_free (strv);
+	strv = NULL;
+
+	old_size = g_hash_table_size (hash_table);
+
+	if (selected)
+		g_hash_table_insert (hash_table, g_strdup (uid), value);
+	else
+		g_hash_table_remove (hash_table, uid);
+
+	new_size = g_hash_table_size (hash_table);
+
+	if (old_size != new_size) {
+		GHashTableIter iter;
+
+		ii = 0;
+		strv = g_new0 (gchar *, new_size + 1);
+		g_hash_table_iter_init (&iter, hash_table);
+
+		/* Hash table still owns the strings. */
+		while (g_hash_table_iter_next (&iter, &value, NULL))
+			strv[ii++] = value;
+
+		settings = g_settings_new ("org.gnome.evolution.calendar");
+		g_settings_set_strv (
+			settings, "selected-memos",
+			(const gchar * const *) strv);
+		g_object_unref (settings);
+
+		g_free (strv);
+	}
+
+	g_hash_table_destroy (hash_table);
+}
+
+static gboolean
 memo_list_selector_data_dropped (ESourceSelector *selector,
                                  GtkSelectionData *selection_data,
                                  ESource *destination,
@@ -301,8 +406,8 @@ memo_list_selector_data_dropped (ESourceSelector *selector,
 	dd->action = action;
 	dd->list = cal_comp_selection_get_string_list (selection_data);
 
-	e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
-		e_client_utils_authenticate_handler, NULL,
+	e_client_utils_open_new (
+		destination, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
 		client_opened_for_drop_cb, dd);
 
 	return TRUE;
@@ -316,6 +421,8 @@ e_memo_list_selector_class_init (EMemoListSelectorClass *class)
 	g_type_class_add_private (class, sizeof (EMemoListSelectorPrivate));
 
 	source_selector_class = E_SOURCE_SELECTOR_CLASS (class);
+	source_selector_class->get_source_selected = memo_list_selector_get_source_selected;
+	source_selector_class->set_source_selected = memo_list_selector_set_source_selected;
 	source_selector_class->data_dropped = memo_list_selector_data_dropped;
 }
 
@@ -332,11 +439,12 @@ e_memo_list_selector_init (EMemoListSelector *selector)
 }
 
 GtkWidget *
-e_memo_list_selector_new (ESourceList *source_list)
+e_memo_list_selector_new (ESourceRegistry *registry)
 {
-	g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
 
 	return g_object_new (
 		E_TYPE_MEMO_LIST_SELECTOR,
-		"source-list", source_list, NULL);
+		"extension-name", E_SOURCE_EXTENSION_MEMO_LIST,
+		"registry", registry, NULL);
 }
diff --git a/calendar/gui/e-memo-list-selector.h b/calendar/gui/e-memo-list-selector.h
index c10cff2..62dc0e1 100644
--- a/calendar/gui/e-memo-list-selector.h
+++ b/calendar/gui/e-memo-list-selector.h
@@ -26,7 +26,6 @@
 #ifndef E_MEMO_LIST_SELECTOR_H
 #define E_MEMO_LIST_SELECTOR_H
 
-#include <libedataserver/e-source-list.h>
 #include <libedataserverui/e-source-selector.h>
 
 /* Standard GObject macros */
@@ -64,7 +63,7 @@ struct _EMemoListSelectorClass {
 };
 
 GType		e_memo_list_selector_get_type	(void);
-GtkWidget *	e_memo_list_selector_new	(ESourceList *source_list);
+GtkWidget *	e_memo_list_selector_new	(ESourceRegistry *registry);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-task-list-selector.c b/calendar/gui/e-task-list-selector.c
index fd6a791..aa69719 100644
--- a/calendar/gui/e-task-list-selector.c
+++ b/calendar/gui/e-task-list-selector.c
@@ -18,14 +18,14 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
+#include <gconf/gconf-client.h>
 
 #include "e-task-list-selector.h"
 
 #include <string.h>
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-calendar.h>
 #include <libedataserverui/e-client-utils.h>
 #include "e-util/e-selection.h"
 #include "calendar/gui/comp-util.h"
@@ -164,8 +164,8 @@ task_list_selector_process_data (ESourceSelector *selector,
                                  icalcomponent *icalcomp,
                                  GdkDragAction action)
 {
-	ESourceList *source_list;
 	ESource *source;
+	ESourceRegistry *registry;
 	icalcomponent *tmp_icalcomp = NULL;
 	const gchar *uid;
 	gchar *old_uid = NULL;
@@ -206,14 +206,14 @@ task_list_selector_process_data (ESourceSelector *selector,
 	if (!success || action != GDK_ACTION_MOVE)
 		goto exit;
 
-	source_list = e_source_selector_get_source_list (selector);
-	source = e_source_list_peek_source_by_uid (source_list, source_uid);
+	registry = e_source_selector_get_registry (selector);
+	source = e_source_registry_lookup_by_uid (registry, source_uid);
 
-	if (!E_IS_SOURCE (source) || e_source_get_readonly (source))
+	if (!E_IS_SOURCE (source))
 		goto exit;
 
-	e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
-		e_client_utils_authenticate_handler, NULL,
+	e_client_utils_open_new (
+		source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL,
 		client_opened_cb, g_strdup (old_uid));
 
  exit:
@@ -290,6 +290,111 @@ exit:
 }
 
 static gboolean
+task_list_selector_get_source_selected (ESourceSelector *selector,
+                                        ESource *source)
+{
+	GSettings *settings;
+	gboolean selected = FALSE;
+	const gchar *uid;
+	gchar **strv;
+	gint ii;
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-tasks");
+	g_object_unref (settings);
+
+	g_return_val_if_fail (strv != NULL, FALSE);
+
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		if (g_strcmp0 (uid, strv[ii]) == 0) {
+			selected = TRUE;
+			break;
+		}
+	}
+
+	g_strfreev (strv);
+
+	return selected;
+}
+
+static void
+task_list_selector_set_source_selected (ESourceSelector *selector,
+                                        ESource *source,
+                                        gboolean selected)
+{
+	GSettings *settings;
+	GHashTable *hash_table;
+	const gchar *uid;
+	gpointer value;
+	guint old_size;
+	guint new_size;
+	gchar **strv;
+	gint ii;
+
+	/* Chain up to parent's set_source_selected() method. */
+	E_SOURCE_SELECTOR_CLASS (e_task_list_selector_parent_class)->
+		set_source_selected (selector, source, selected);
+
+	uid = e_source_get_uid (source);
+
+	settings = g_settings_new ("org.gnome.evolution.calendar");
+	strv = g_settings_get_strv (settings, "selected-tasks");
+	g_object_unref (settings);
+
+	g_return_if_fail (strv != NULL);
+
+	hash_table = g_hash_table_new_full (
+		(GHashFunc) g_str_hash,
+		(GEqualFunc) g_str_equal,
+		(GDestroyNotify) g_free,
+		(GDestroyNotify) NULL);
+
+	value = GINT_TO_POINTER (1);  /* just needs to be non-NULL */
+
+	/* Transfer the string array to a hash table. */
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		g_hash_table_insert (hash_table, strv[ii], value);
+		strv[ii] = NULL;
+	}
+
+	g_free (strv);
+	strv = NULL;
+
+	old_size = g_hash_table_size (hash_table);
+
+	if (selected)
+		g_hash_table_insert (hash_table, g_strdup (uid), value);
+	else
+		g_hash_table_remove (hash_table, uid);
+
+	new_size = g_hash_table_size (hash_table);
+
+	if (old_size != new_size) {
+		GHashTableIter iter;
+
+		ii = 0;
+		strv = g_new0 (gchar *, new_size + 1);
+		g_hash_table_iter_init (&iter, hash_table);
+
+		/* Hash table still owns the strings. */
+		while (g_hash_table_iter_next (&iter, &value, NULL))
+			strv[ii++] = value;
+
+		settings = g_settings_new ("org.gnome.evolution.calendar");
+		g_settings_set_strv (
+			settings, "selected-tasks",
+			(const gchar * const *) strv);
+		g_object_unref (settings);
+
+		g_free (strv);
+	}
+
+	g_hash_table_destroy (hash_table);
+}
+
+static gboolean
 task_list_selector_data_dropped (ESourceSelector *selector,
                                  GtkSelectionData *selection_data,
                                  ESource *destination,
@@ -303,8 +408,8 @@ task_list_selector_data_dropped (ESourceSelector *selector,
 	dd->action = action;
 	dd->list = cal_comp_selection_get_string_list (selection_data);
 
-	e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_TASKS, TRUE, NULL,
-		e_client_utils_authenticate_handler, NULL,
+	e_client_utils_open_new (
+		destination, E_CLIENT_SOURCE_TYPE_TASKS, TRUE, NULL,
 		client_opened_for_drop_cb, dd);
 
 	return TRUE;
@@ -318,6 +423,8 @@ e_task_list_selector_class_init (ETaskListSelectorClass *class)
 	g_type_class_add_private (class, sizeof (ETaskListSelectorPrivate));
 
 	source_selector_class = E_SOURCE_SELECTOR_CLASS (class);
+	source_selector_class->get_source_selected = task_list_selector_get_source_selected;
+	source_selector_class->set_source_selected = task_list_selector_set_source_selected;
 	source_selector_class->data_dropped = task_list_selector_data_dropped;
 }
 
@@ -334,11 +441,12 @@ e_task_list_selector_init (ETaskListSelector *selector)
 }
 
 GtkWidget *
-e_task_list_selector_new (ESourceList *source_list)
+e_task_list_selector_new (ESourceRegistry *registry)
 {
-	g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
 
 	return g_object_new (
 		E_TYPE_TASK_LIST_SELECTOR,
-		"source-list", source_list, NULL);
+		"extension-name", E_SOURCE_EXTENSION_TASK_LIST,
+		"registry", registry, NULL);
 }
diff --git a/calendar/gui/e-task-list-selector.h b/calendar/gui/e-task-list-selector.h
index 847a221..735611a 100644
--- a/calendar/gui/e-task-list-selector.h
+++ b/calendar/gui/e-task-list-selector.h
@@ -26,7 +26,6 @@
 #ifndef E_TASK_LIST_SELECTOR_H
 #define E_TASK_LIST_SELECTOR_H
 
-#include <libedataserver/e-source-list.h>
 #include <libedataserverui/e-source-selector.h>
 
 /* Standard GObject macros */
@@ -64,7 +63,7 @@ struct _ETaskListSelectorClass {
 };
 
 GType		e_task_list_selector_get_type	(void);
-GtkWidget *	e_task_list_selector_new	(ESourceList *source_list);
+GtkWidget *	e_task_list_selector_new	(ESourceRegistry *registry);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-task-table.c b/calendar/gui/e-task-table.c
index b314766..4073973 100644
--- a/calendar/gui/e-task-table.c
+++ b/calendar/gui/e-task-table.c
@@ -1692,7 +1692,7 @@ hide_completed_rows_ready (GObject *source_object,
 
 			g_debug ("%s: Could not get the objects from '%s': %s",
 				G_STRFUNC,
-				source ? e_source_peek_name (source) : "???",
+				e_source_get_display_name (source),
 				error ? error->message : "Uknown error");
 		}
 		g_clear_error (&error);
@@ -1754,7 +1754,7 @@ show_completed_rows_ready (GObject *source_object,
 
 			g_debug ("%s: Could not get the objects from '%s': %s",
 				G_STRFUNC,
-				source ? e_source_peek_name (source) : "???",
+				e_source_get_display_name (source),
 				error ? error->message : "Uknown error");
 		}
 		g_clear_error (&error);
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 3feaccc..56f57ea 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -2124,7 +2124,8 @@ e_week_view_recalc_display_start_day (EWeekView *week_view)
 /* Checks if the users participation status is NEEDS-ACTION and shows the summary as bold text */
 static void
 set_text_as_bold (EWeekViewEvent *event,
-                  EWeekViewEventSpan *span)
+                  EWeekViewEventSpan *span,
+                  ESourceRegistry *registry)
 {
 	ECalComponent *comp;
 	GSList *attendees = NULL, *l;
@@ -2136,7 +2137,8 @@ set_text_as_bold (EWeekViewEvent *event,
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-	address = itip_get_comp_attendee (comp, event->comp_data->client);
+	address = itip_get_comp_attendee (
+		registry, comp, event->comp_data->client);
 	e_cal_component_get_attendee_list (comp, &attendees);
 	for (l = attendees; l; l = l->next) {
 		ECalComponentAttendee *attendee = l->data;
@@ -3064,6 +3066,9 @@ e_week_view_reshape_event_span (EWeekView *week_view,
                                 gint event_num,
                                 gint span_num)
 {
+	ECalendarView *cal_view;
+	ECalModel *model;
+	ESourceRegistry *registry;
 	EWeekViewEvent *event;
 	EWeekViewEventSpan *span;
 	gint span_x, span_y, span_w, num_icons, icons_width, time_width;
@@ -3079,6 +3084,11 @@ e_week_view_reshape_event_span (EWeekView *week_view,
 	PangoFontMetrics *font_metrics;
 	PangoLayout *layout;
 
+	cal_view = E_CALENDAR_VIEW (week_view);
+	model = e_calendar_view_get_model (cal_view);
+
+	registry = e_cal_model_get_registry (model);
+
 	if (!is_array_index_in_bounds (week_view->events, event_num))
 		return;
 
@@ -3190,7 +3200,7 @@ e_week_view_reshape_event_span (EWeekView *week_view,
 
 		if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp)) {
-			set_text_as_bold (event, span);
+			set_text_as_bold (event, span, registry);
 		}
 		g_object_set_data (G_OBJECT (span->text_item), "event-num", GINT_TO_POINTER (event_num));
 		g_signal_connect (
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index fd807fd..f482e06 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -37,7 +37,6 @@
 #include <glib/gi18n.h>
 #include <libedataserver/e-categories.h>
 #include <libedataserver/e-url.h>
-#include <libedataserverui/e-passwords.h>
 #include <libedataserverui/e-client-utils.h>
 
 #include <libecal/e-cal-client-view.h>
@@ -76,6 +75,7 @@
 
 /* Private part of the GnomeCalendar structure */
 struct _GnomeCalendarPrivate {
+	ESourceRegistry *registry;
 	ECalModel *model;
 
 	/*
@@ -142,6 +142,7 @@ enum {
 	PROP_0,
 	PROP_DATE_NAVIGATOR,
 	PROP_MEMO_TABLE,
+	PROP_REGISTRY,
 	PROP_TASK_TABLE,
 	PROP_VIEW
 };
@@ -332,6 +333,16 @@ gnome_calendar_update_time_range (GnomeCalendar *gcal)
 }
 
 static void
+gnome_calendar_set_registry (GnomeCalendar *gcal,
+                             ESourceRegistry *registry)
+{
+	g_return_if_fail (E_IS_SOURCE_REGISTRY (registry));
+	g_return_if_fail (gcal->priv->registry == NULL);
+
+	gcal->priv->registry = g_object_ref (registry);
+}
+
+static void
 gnome_calendar_set_property (GObject *object,
                              guint property_id,
                              const GValue *value,
@@ -350,6 +361,12 @@ gnome_calendar_set_property (GObject *object,
 				g_value_get_object (value));
 			return;
 
+		case PROP_REGISTRY:
+			gnome_calendar_set_registry (
+				GNOME_CALENDAR (object),
+				g_value_get_object (value));
+			return;
+
 		case PROP_TASK_TABLE:
 			gnome_calendar_set_task_table (
 				GNOME_CALENDAR (object),
@@ -385,6 +402,12 @@ gnome_calendar_get_property (GObject *object,
 				GNOME_CALENDAR (object)));
 			return;
 
+		case PROP_REGISTRY:
+			g_value_set_object (
+				value, gnome_calendar_get_registry (
+				GNOME_CALENDAR (object)));
+			return;
+
 		case PROP_TASK_TABLE:
 			g_value_set_object (
 				value, gnome_calendar_get_task_table (
@@ -406,11 +429,14 @@ gnome_calendar_constructed (GObject *object)
 {
 	GnomeCalendar *gcal = GNOME_CALENDAR (object);
 	ECalendarView *calendar_view;
+	ESourceRegistry *registry;
 	ECalModel *model;
 	GtkAdjustment *adjustment;
 
+	registry = gnome_calendar_get_registry (gcal);
+
 	/* Create the model for the views. */
-	model = e_cal_model_calendar_new ();
+	model = e_cal_model_calendar_new (registry);
 	e_cal_model_set_flags (model, E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES);
 	gcal->priv->model = model;
 
@@ -543,6 +569,18 @@ gnome_calendar_class_init (GnomeCalendarClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_REGISTRY,
+		g_param_spec_object (
+			"registry",
+			"Registry",
+			"Data source registry",
+			E_TYPE_SOURCE_REGISTRY,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY |
+			G_PARAM_STATIC_STRINGS));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_TASK_TABLE,
 		g_param_spec_object (
 			"task-table",
@@ -1488,6 +1526,11 @@ gnome_calendar_do_dispose (GObject *object)
 
 	priv = GNOME_CALENDAR_GET_PRIVATE (object);
 
+	if (priv->registry != NULL) {
+		g_object_unref (priv->registry);
+		priv->registry = NULL;
+	}
+
 	if (priv->model != NULL) {
 		g_signal_handlers_disconnect_by_func (
 			priv->model, view_progress_cb, object);
@@ -1901,9 +1944,21 @@ gnome_calendar_display_view (GnomeCalendar *gcal,
 }
 
 GtkWidget *
-gnome_calendar_new (void)
+gnome_calendar_new (ESourceRegistry *registry)
 {
-	return g_object_new (GNOME_TYPE_CALENDAR, NULL);
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	return g_object_new (
+		GNOME_TYPE_CALENDAR,
+		"registry", registry, NULL);
+}
+
+ESourceRegistry *
+gnome_calendar_get_registry (GnomeCalendar *gcal)
+{
+	g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
+
+	return gcal->priv->registry;
 }
 
 ECalendar *
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
index bc65fe2..c8cb5e8 100644
--- a/calendar/gui/gnome-cal.h
+++ b/calendar/gui/gnome-cal.h
@@ -31,6 +31,7 @@
 #include <gtk/gtk.h>
 #include <misc/e-calendar.h>
 #include <libecal/e-cal-client.h>
+#include <libedataserver/e-source-registry.h>
 
 #include "e-cal-model.h"
 
@@ -112,7 +113,9 @@ struct _GnomeCalendarClass {
 };
 
 GType		gnome_calendar_get_type		(void);
-GtkWidget *	gnome_calendar_new		(void);
+GtkWidget *	gnome_calendar_new		(ESourceRegistry *registry);
+ESourceRegistry *
+		gnome_calendar_get_registry	(GnomeCalendar *gcal);
 ECalendar *	gnome_calendar_get_date_navigator
 						(GnomeCalendar *gcal);
 void		gnome_calendar_set_date_navigator
diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c
index e58f2f9..f4a2355 100644
--- a/calendar/gui/itip-utils.c
+++ b/calendar/gui/itip-utils.c
@@ -32,11 +32,12 @@
 #include <libecal/e-cal-time-util.h>
 #include <libecal/e-cal-util.h>
 #include <libedataserver/e-time-utils.h>
+#include <libedataserver/e-source-mail-account.h>
+#include <libedataserver/e-source-mail-identity.h>
+#include <libedataserver/e-source-registry.h>
 
 #include <e-util/e-dialog-utils.h>
 
-#include <libemail-utils/e-account-utils.h>
-
 #include <composer/e-msg-composer.h>
 
 #include "itip-utils.h"
@@ -68,6 +69,7 @@ static icalproperty_method itip_methods_enum[] = {
 
 /**
  * itip_get_user_identities:
+ * @registry: an #ESourceRegistry
  *
  * Returns a %NULL-terminated array of name + address strings based on
  * registered mail identities.  Free the returned array with g_strfreev().
@@ -75,41 +77,45 @@ static icalproperty_method itip_methods_enum[] = {
  * Returns: an %NULL-terminated array of mail identity strings
  **/
 gchar **
-itip_get_user_identities (void)
+itip_get_user_identities (ESourceRegistry *registry)
 {
-	EAccountList *account_list;
-	EIterator *iterator;
+	GList *list, *iter;
+	const gchar *extension_name;
 	gchar **identities;
-	gint length, ii = 0;
+	guint ii = 0;
+
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
 
-	account_list = e_get_account_list ();
-	length = e_list_length (E_LIST (account_list));
-	iterator = e_list_get_iterator (E_LIST (account_list));
+	list = e_source_registry_list_sources (registry, extension_name);
 
-	identities = g_new0 (gchar *, length + 1);
+	identities = g_new0 (gchar *, g_list_length (list) + 1);
 
-	while (e_iterator_is_valid (iterator)) {
-		EAccount *account;
+	for (iter = list; iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
+		const gchar *name, *address;
 
-		/* XXX EIterator misuses const. */
-		account = (EAccount *) e_iterator_get (iterator);
+		extension = e_source_get_extension (source, extension_name);
 
-		if (account->enabled)
-			identities[ii++] = g_strdup_printf (
-				"%s <%s>",
-				account->id->name,
-				account->id->address);
+		name = e_source_mail_identity_get_name (extension);
+		address = e_source_mail_identity_get_address (extension);
 
-		e_iterator_next (iterator);
+		if (name == NULL || address == NULL)
+			continue;
+
+		identities[ii++] = g_strdup_printf ("%s <%s>", name, address);
 	}
 
-	g_object_unref (iterator);
+	g_list_free (list);
 
 	return identities;
 }
 
 /**
  * itip_get_fallback_identity:
+ * @registry: an #ESourceRegistry
  *
  * Returns a name + address string taken from the default mail identity,
  * but only if the corresponding account is enabled.  If the account is
@@ -120,23 +126,45 @@ itip_get_user_identities (void)
  * Returns: a fallback mail identity, or %NULL
  **/
 gchar *
-itip_get_fallback_identity (void)
+itip_get_fallback_identity (ESourceRegistry *registry)
 {
-	EAccount *account;
-	gchar *identity = NULL;
+	ESource *source;
+	ESourceMailAccount *mail_account;
+	ESourceMailIdentity *mail_identity;
+	const gchar *extension_name;
+	const gchar *address;
+	const gchar *name;
+
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
+
+	source = e_source_registry_get_default_mail_account (registry);
+
+	if (!e_source_get_enabled (source))
+		return NULL;
+
+	extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
+	mail_account = e_source_get_extension (source, extension_name);
+
+	source = e_source_mail_account_get_identity (mail_account);
 
-	account = e_get_default_account ();
-	if (account != NULL && account->enabled)
-		identity = g_strdup_printf (
-			"%s <%s>",
-			account->id->name,
-			account->id->address);
+	if (source == NULL)
+		return NULL;
+
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+	mail_identity = e_source_get_extension (source, extension_name);
+
+	name = e_source_mail_identity_get_name (mail_identity);
+	address = e_source_mail_identity_get_address (mail_identity);
 
-	return identity;
+	if (name == NULL || address == NULL)
+		return NULL;
+
+	return g_strdup_printf ("%s <%s>", name, address);
 }
 
 /**
  * itip_address_is_user:
+ * @registry: an #ESourceRegistry
  * @address: an email address
  *
  * Looks for a registered mail identity with a matching email address.
@@ -144,31 +172,53 @@ itip_get_fallback_identity (void)
  * Returns: %TRUE if a match was found, %FALSE if not
  **/
 gboolean
-itip_address_is_user (const gchar *address)
+itip_address_is_user (ESourceRegistry *registry,
+                      const gchar *address)
 {
-	EAccountList *account_list;
-	EAccount *account;
+	GList *list, *iter;
+	const gchar *extension_name;
+	gboolean match = FALSE;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
 	g_return_val_if_fail (address != NULL, FALSE);
 
-	account_list = e_get_account_list ();
+	extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+
+	list = e_source_registry_list_sources (registry, extension_name);
+
+	for (iter = list; iter != NULL; iter = g_list_next (iter)) {
+		ESource *source = E_SOURCE (iter->data);
+		ESourceMailIdentity *extension;
+		const gchar *id_address;
+
+		extension = e_source_get_extension (source, extension_name);
+		id_address = e_source_mail_identity_get_address (extension);
+
+		if (id_address == NULL)
+			continue;
+
+		if (g_ascii_strcasecmp (address, id_address) == 0) {
+			match = TRUE;
+			break;
+		}
+	}
 
-	/* XXX EAccountList misuses const. */
-	account = (EAccount *) e_account_list_find (
-		account_list, E_ACCOUNT_FIND_ID_ADDRESS, address);
+	g_list_free (list);
 
-	return (account != NULL);
+	return match;
 }
 
 gboolean
-itip_organizer_is_user (ECalComponent *comp,
+itip_organizer_is_user (ESourceRegistry *registry,
+                        ECalComponent *comp,
                         ECalClient *cal_client)
 {
-	return itip_organizer_is_user_ex (comp, cal_client, FALSE);
+	return itip_organizer_is_user_ex (registry, comp, cal_client, FALSE);
 }
 
 gboolean
-itip_organizer_is_user_ex (ECalComponent *comp,
+itip_organizer_is_user_ex (ESourceRegistry *registry,
+                           ECalComponent *comp,
                            ECalClient *cal_client,
                            gboolean skip_cap_test)
 {
@@ -176,6 +226,8 @@ itip_organizer_is_user_ex (ECalComponent *comp,
 	const gchar *strip;
 	gboolean user_org = FALSE;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+
 	if (!e_cal_component_has_organizer (comp) ||
 		(!skip_cap_test && e_client_check_capability (
 		E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_NO_ORGANIZER)))
@@ -200,20 +252,23 @@ itip_organizer_is_user_ex (ECalComponent *comp,
 			return FALSE;
 		}
 
-		user_org = itip_address_is_user (strip);
+		user_org = itip_address_is_user (registry, strip);
 	}
 
 	return user_org;
 }
 
 gboolean
-itip_sentby_is_user (ECalComponent *comp,
+itip_sentby_is_user (ESourceRegistry *registry,
+                     ECalComponent *comp,
                      ECalClient *cal_client)
 {
 	ECalComponentOrganizer organizer;
 	const gchar *strip;
 	gboolean user_sentby = FALSE;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+
 	if (!e_cal_component_has_organizer (comp) ||
 		e_client_check_capability (
 		E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_NO_ORGANIZER))
@@ -222,7 +277,7 @@ itip_sentby_is_user (ECalComponent *comp,
 	e_cal_component_get_organizer (comp, &organizer);
 	if (organizer.sentby != NULL) {
 		strip = itip_strip_mailto (organizer.sentby);
-		user_sentby = itip_address_is_user (strip);
+		user_sentby = itip_address_is_user (registry, strip);
 	}
 
 	return user_sentby;
@@ -280,9 +335,11 @@ html_new_lines_for (const gchar *string)
 }
 
 gchar *
-itip_get_comp_attendee (ECalComponent *comp,
+itip_get_comp_attendee (ESourceRegistry *registry,
+                        ECalComponent *comp,
                         ECalClient *cal_client)
 {
+#if 0  /* ACCOUNT_MGMT */
 	GSList *attendees;
 	EAccountList *al;
 	EAccount *a;
@@ -299,28 +356,31 @@ itip_get_comp_attendee (ECalComponent *comp,
 			CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS,
 			&address, NULL, NULL);
 
-	if (address && *address) {
+	if (address != NULL && *address != '\0') {
 		attendee = get_attendee (attendees, address);
 
 		if (attendee) {
 			gchar *user_email;
 
-			user_email = g_strdup (itip_strip_mailto (attendee->value));
-
+			user_email = g_strdup (
+				itip_strip_mailto (attendee->value));
 			e_cal_component_free_attendee_list (attendees);
 			g_free (address);
+
 			return user_email;
 		}
 
-		attendee = get_attendee_if_attendee_sentby_is_user (attendees, address);
+		attendee = get_attendee_if_attendee_sentby_is_user (
+			attendees, address);
 
-		if (attendee) {
+		if (attendee != NULL) {
 			gchar *user_email;
 
-			user_email = g_strdup (itip_strip_mailto (attendee->sentby));
-
+			user_email = g_strdup (
+				itip_strip_mailto (attendee->sentby));
 			e_cal_component_free_attendee_list (attendees);
 			g_free (address);
+
 			return user_email;
 		}
 
@@ -337,21 +397,28 @@ itip_get_comp_attendee (ECalComponent *comp,
 			continue;
 
 		attendee = get_attendee (attendees, a->id->address);
-		if (attendee) {
-			gchar *user_email = g_strdup (itip_strip_mailto (attendee->value));
+		if (attendee != NULL) {
+			gchar *user_email;
 
+			user_email = g_strdup (
+				itip_strip_mailto (attendee->value));
 			e_cal_component_free_attendee_list (attendees);
+
 			return user_email;
 		}
 
 		/* If the account was not found in the attendees list, then
 		 * let's check the 'sentby' fields of the attendees if we can
 		 * find the account. */
-		attendee = get_attendee_if_attendee_sentby_is_user (attendees, a->id->address);
+		attendee = get_attendee_if_attendee_sentby_is_user (
+			attendees, a->id->address);
 		if (attendee) {
-			gchar *user_email = g_strdup (itip_strip_mailto (attendee->sentby));
+			gchar *user_email;
 
+			user_email = g_strdup (
+				itip_strip_mailto (attendee->sentby));
 			e_cal_component_free_attendee_list (attendees);
+
 			return user_email;
 		}
 	}
@@ -364,7 +431,11 @@ itip_get_comp_attendee (ECalComponent *comp,
 	address = g_strdup ((a != NULL) ? a->id->address : "");
 
 	e_cal_component_free_attendee_list (attendees);
+
 	return address;
+#endif /* ACCOUNT_MGMT */
+
+	return NULL;
 }
 
 const gchar *
@@ -484,7 +555,8 @@ users_has_attendee (const GSList *users,
 
 static gchar *
 comp_from (ECalComponentItipMethod method,
-           ECalComponent *comp)
+           ECalComponent *comp,
+           ESourceRegistry *registry)
 {
 	ECalComponentOrganizer organizer;
 	ECalComponentAttendee *attendee;
@@ -497,10 +569,10 @@ comp_from (ECalComponentItipMethod method,
 		return NULL;
 
 	case E_CAL_COMPONENT_METHOD_REQUEST:
-		return itip_get_comp_attendee (comp, NULL);
+		return itip_get_comp_attendee (registry, comp, NULL);
 
 	case E_CAL_COMPONENT_METHOD_REPLY:
-		sender = itip_get_comp_attendee (comp, NULL);
+		sender = itip_get_comp_attendee (registry, comp, NULL);
 		if (sender != NULL)
 			return sender;
 		if (!e_cal_component_has_attendees (comp))
@@ -535,7 +607,8 @@ comp_from (ECalComponentItipMethod method,
 }
 
 static EDestination **
-comp_to_list (ECalComponentItipMethod method,
+comp_to_list (ESourceRegistry *registry,
+              ECalComponentItipMethod method,
               ECalComponent *comp,
               const GSList *users,
               gboolean reply_all,
@@ -574,7 +647,7 @@ comp_to_list (ECalComponentItipMethod method,
 
 		array = g_ptr_array_new ();
 
-		sender = itip_get_comp_attendee (comp, NULL);
+		sender = itip_get_comp_attendee (registry, comp, NULL);
 
 		for (l = attendees; l != NULL; l = l->next) {
 			ECalComponentAttendee *att = l->data;
@@ -638,7 +711,7 @@ comp_to_list (ECalComponentItipMethod method,
 			array = g_ptr_array_new ();
 
 			e_cal_component_get_organizer (comp, &organizer);
-			sender = itip_get_comp_attendee (comp, NULL);
+			sender = itip_get_comp_attendee (registry, comp, NULL);
 
 			for (l = attendees; l != NULL; l = l->next) {
 				ECalComponentAttendee *att = l->data;
@@ -696,7 +769,7 @@ comp_to_list (ECalComponentItipMethod method,
 
 		/* send the status to delegatee to the delegate also*/
 		e_cal_component_get_attendee_list (comp, &attendees);
-		sender = itip_get_comp_attendee (comp, NULL);
+		sender = itip_get_comp_attendee (registry, comp, NULL);
 
 		for (l = attendees; l != NULL; l = l->next) {
 			ECalComponentAttendee *att = l->data;
@@ -751,7 +824,8 @@ comp_to_list (ECalComponentItipMethod method,
 }
 
 static gchar *
-comp_subject (ECalComponentItipMethod method,
+comp_subject (ESourceRegistry *registry,
+              ECalComponentItipMethod method,
               ECalComponent *comp)
 {
 	ECalComponentText caltext;
@@ -794,7 +868,7 @@ comp_subject (ECalComponentItipMethod method,
 
 	case E_CAL_COMPONENT_METHOD_REPLY:
 		e_cal_component_get_attendee_list (comp, &alist);
-		sender = itip_get_comp_attendee (comp, NULL);
+		sender = itip_get_comp_attendee (registry, comp, NULL);
 		if (sender) {
 
 			for (l = alist; l != NULL; l = l->next) {
@@ -1010,7 +1084,8 @@ comp_server_send (ECalComponentItipMethod method,
 }
 
 static gboolean
-comp_limit_attendees (ECalComponent *comp)
+comp_limit_attendees (ESourceRegistry *registry,
+                      ECalComponent *comp)
 {
 	icalcomponent *icomp;
 	icalproperty *prop;
@@ -1042,7 +1117,7 @@ comp_limit_attendees (ECalComponent *comp)
 		attendee_text = g_strdup (itip_strip_mailto (attendee));
 		g_free (attendee);
 		attendee_text = g_strstrip (attendee_text);
-		found = match = itip_address_is_user (attendee_text);
+		found = match = itip_address_is_user (registry, attendee_text);
 
 		if (!found) {
 			param = icalproperty_get_first_parameter (prop, ICAL_SENTBY_PARAMETER);
@@ -1054,7 +1129,7 @@ comp_limit_attendees (ECalComponent *comp)
 				attendee_sentby_text =
 					g_strstrip (g_strdup (attendee_sentby));
 				found = match = itip_address_is_user (
-					attendee_sentby_text);
+					registry, attendee_sentby_text);
 			}
 		}
 
@@ -1078,13 +1153,15 @@ comp_limit_attendees (ECalComponent *comp)
 
 static void
 comp_sentby (ECalComponent *comp,
-             ECalClient *cal_client)
+             ECalClient *cal_client,
+             ESourceRegistry *registry)
 {
 	ECalComponentOrganizer organizer;
 	GSList * attendees, *l;
 	gchar *user = NULL;
 
 	e_cal_component_get_organizer (comp, &organizer);
+#if 0  /* ACCOUNT_MGMT */
 	if (!organizer.value) {
 		EAccount *a = e_get_default_account ();
 
@@ -1098,9 +1175,10 @@ comp_sentby (ECalComponent *comp,
 
 		return;
 	}
+#endif /* ACCOUNT_MGMT */
 
 	e_cal_component_get_attendee_list (comp, &attendees);
-	user = itip_get_comp_attendee (comp, cal_client);
+	user = itip_get_comp_attendee (registry, comp, cal_client);
 	for (l = attendees; l; l = l->next) {
 		ECalComponentAttendee *a = l->data;
 
@@ -1113,6 +1191,7 @@ comp_sentby (ECalComponent *comp,
 		}
 	}
 
+#if 0  /* ACCOUNT_MGMT */
 	if (!itip_organizer_is_user (comp, cal_client) && !itip_sentby_is_user (comp, cal_client)) {
 		EAccount *a = e_get_default_account ();
 
@@ -1128,9 +1207,12 @@ comp_sentby (ECalComponent *comp,
 		g_free ((gchar *) organizer.cn);
 		g_free ((gchar *) organizer.language);
 	}
+#endif /* ACCOUNT_MGMT */
 }
+
 static ECalComponent *
-comp_minimal (ECalComponent *comp,
+comp_minimal (ESourceRegistry *registry,
+              ECalComponent *comp,
               gboolean attendee)
 {
 	ECalComponent *clone;
@@ -1151,7 +1233,7 @@ comp_minimal (ECalComponent *comp,
 		e_cal_component_get_attendee_list (comp, &attendees);
 		e_cal_component_set_attendee_list (clone, attendees);
 
-		if (!comp_limit_attendees (clone)) {
+		if (!comp_limit_attendees (registry, clone)) {
 			e_notice (NULL, GTK_MESSAGE_ERROR,
 				  _("You must be an attendee of the event."));
 			goto error;
@@ -1238,7 +1320,8 @@ strip_x_microsoft_props (ECalComponent *comp)
 }
 
 static ECalComponent *
-comp_compliant (ECalComponentItipMethod method,
+comp_compliant (ESourceRegistry *registry,
+                ECalComponentItipMethod method,
                 ECalComponent *comp,
                 ECalClient *client,
                 icalcomponent *zones,
@@ -1336,14 +1419,14 @@ comp_compliant (ECalComponentItipMethod method,
 	/* Comply with itip spec */
 	switch (method) {
 	case E_CAL_COMPONENT_METHOD_PUBLISH:
-		comp_sentby (clone, client);
+		comp_sentby (clone, client, registry);
 		e_cal_component_set_attendee_list (clone, NULL);
 		break;
 	case E_CAL_COMPONENT_METHOD_REQUEST:
-		comp_sentby (clone, client);
+		comp_sentby (clone, client, registry);
 		break;
 	case E_CAL_COMPONENT_METHOD_CANCEL:
-		comp_sentby (clone, client);
+		comp_sentby (clone, client, registry);
 		break;
 	case E_CAL_COMPONENT_METHOD_REPLY:
 		break;
@@ -1351,7 +1434,7 @@ comp_compliant (ECalComponentItipMethod method,
 		break;
 	case E_CAL_COMPONENT_METHOD_REFRESH:
 		/* Need to remove almost everything */
-		temp_clone = comp_minimal (clone, TRUE);
+		temp_clone = comp_minimal (registry, clone, TRUE);
 		g_object_unref (clone);
 		clone = temp_clone;
 		break;
@@ -1359,7 +1442,7 @@ comp_compliant (ECalComponentItipMethod method,
 		break;
 	case E_CAL_COMPONENT_METHOD_DECLINECOUNTER:
 		/* Need to remove almost everything */
-		temp_clone = comp_minimal (clone, FALSE);
+		temp_clone = comp_minimal (registry, clone, FALSE);
 		g_object_unref (clone);
 		clone = temp_clone;
 		break;
@@ -1416,6 +1499,7 @@ append_cal_attachments (EMsgComposer *composer,
 	g_slist_free (attach_list);
 }
 
+#if 0  /* ACCOUNT_MGMT */
 static EAccount *
 find_enabled_account (EAccountList *accounts,
                       const gchar *id_address)
@@ -1445,6 +1529,7 @@ find_enabled_account (EAccountList *accounts,
 
 	return account;
 }
+#endif /* ACCOUNT_MGMT */
 
 static void
 setup_from (ECalComponentItipMethod method,
@@ -1452,6 +1537,7 @@ setup_from (ECalComponentItipMethod method,
             ECalClient *cal_client,
             EComposerHeaderTable *table)
 {
+#if 0  /* ACCOUNT_MGMT */
 	EAccountList *accounts;
 
 	accounts = e_composer_header_table_get_account_list (table);
@@ -1482,10 +1568,12 @@ setup_from (ECalComponentItipMethod method,
 		if (account)
 			e_composer_header_table_set_account (table, account);
 	}
+#endif /* ACCOUNT_MGMT */
 }
 
 gboolean
-itip_send_comp (ECalComponentItipMethod method,
+itip_send_comp (ESourceRegistry *registry,
+                ECalComponentItipMethod method,
                 ECalComponent *send_comp,
                 ECalClient *cal_client,
                 icalcomponent *zones,
@@ -1508,6 +1596,8 @@ itip_send_comp (ECalComponentItipMethod method,
 	gboolean use_24_hour_format;
 	gboolean retval = FALSE;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+
 	/* FIXME Pass this in. */
 	shell = e_shell_get_default ();
 	shell_settings = e_shell_get_shell_settings (shell);
@@ -1542,14 +1632,15 @@ itip_send_comp (ECalComponentItipMethod method,
 
 	/* Tidy up the comp */
 	comp = comp_compliant (
-		method, send_comp, cal_client, zones, default_zone, strip_alarms);
+		registry, method, send_comp, cal_client,
+		zones, default_zone, strip_alarms);
 
 	if (comp == NULL)
 		goto cleanup;
 
 	/* Recipients */
 	destinations = comp_to_list (
-		method, comp, users, FALSE,
+		registry, method, comp, users, FALSE,
 		only_new_attendees ?  g_object_get_data (
 		G_OBJECT (send_comp), "new-attendees") : NULL);
 	if (method != E_CAL_COMPONENT_METHOD_PUBLISH) {
@@ -1561,7 +1652,7 @@ itip_send_comp (ECalComponentItipMethod method,
 	}
 
 	/* Subject information */
-	subject = comp_subject (method, comp);
+	subject = comp_subject (registry, method, comp);
 
 	composer = e_msg_composer_new (shell);
 	table = e_msg_composer_get_header_table (composer);
@@ -1637,7 +1728,8 @@ cleanup:
 }
 
 gboolean
-reply_to_calendar_comp (ECalComponentItipMethod method,
+reply_to_calendar_comp (ESourceRegistry *registry,
+                        ECalComponentItipMethod method,
                         ECalComponent *send_comp,
                         ECalClient *cal_client,
                         gboolean reply_all,
@@ -1657,6 +1749,8 @@ reply_to_calendar_comp (ECalComponentItipMethod method,
 	gchar *ical_string = NULL;
 	gboolean retval = FALSE;
 
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+
 	/* FIXME Pass this in. */
 	shell = e_shell_get_default ();
 	shell_settings = e_shell_get_shell_settings (shell);
@@ -1666,15 +1760,17 @@ reply_to_calendar_comp (ECalComponentItipMethod method,
 
 	/* Tidy up the comp */
 	comp = comp_compliant (
-		method, send_comp, cal_client, zones, default_zone, TRUE);
+		registry, method, send_comp, cal_client,
+		zones, default_zone, TRUE);
 	if (comp == NULL)
 		goto cleanup;
 
 	/* Recipients */
-	destinations = comp_to_list (method, comp, users, reply_all, NULL);
+	destinations = comp_to_list (
+		registry, method, comp, users, reply_all, NULL);
 
 	/* Subject information */
-	subject = comp_subject (method, comp);
+	subject = comp_subject (registry, method, comp);
 
 	composer = e_msg_composer_new (shell);
 	table = e_msg_composer_get_header_table (composer);
diff --git a/calendar/gui/itip-utils.h b/calendar/gui/itip-utils.h
index 6da2519..c24acb8 100644
--- a/calendar/gui/itip-utils.h
+++ b/calendar/gui/itip-utils.h
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <libecal/e-cal-client.h>
 #include <libecal/e-cal-component.h>
-#include <libedataserver/e-account-list.h>
+#include <libedataserver/e-source-registry.h>
 
 G_BEGIN_DECLS
 
@@ -49,20 +49,26 @@ struct CalMimeAttach {
 	guint length;
 };
 
-gchar **	itip_get_user_identities	(void);
-gchar *		itip_get_fallback_identity	(void);
-gboolean	itip_address_is_user		(const gchar *address);
-gboolean	itip_organizer_is_user		(ECalComponent *comp,
+gchar **	itip_get_user_identities	(ESourceRegistry *registry);
+gchar *		itip_get_fallback_identity	(ESourceRegistry *registry);
+gboolean	itip_address_is_user		(ESourceRegistry *registry,
+						 const gchar *address);
+gboolean	itip_organizer_is_user		(ESourceRegistry *registry,
+						 ECalComponent *comp,
 						 ECalClient *cal_client);
-gboolean	itip_organizer_is_user_ex	(ECalComponent *comp,
+gboolean	itip_organizer_is_user_ex	(ESourceRegistry *registry,
+						 ECalComponent *comp,
 						 ECalClient *cal_client,
 						 gboolean skip_cap_test);
-gboolean	itip_sentby_is_user		(ECalComponent *comp,
+gboolean	itip_sentby_is_user		(ESourceRegistry *registry,
+						 ECalComponent *comp,
 						 ECalClient *cal_client);
 const gchar *	itip_strip_mailto		(const gchar *address);
-gchar *		itip_get_comp_attendee		(ECalComponent *comp,
+gchar *		itip_get_comp_attendee		(ESourceRegistry *registry,
+						 ECalComponent *comp,
 						 ECalClient *cal_client);
-gboolean	itip_send_comp			(ECalComponentItipMethod method,
+gboolean	itip_send_comp			(ESourceRegistry *registry,
+						 ECalComponentItipMethod method,
 						 ECalComponent *comp,
 						 ECalClient *cal_client,
 						 icalcomponent *zones,
@@ -79,7 +85,8 @@ gboolean	itip_publish_begin		(ECalComponent *pub_comp,
 						 ECalClient *cal_client,
 						 gboolean cloned,
 						 ECalComponent **clone);
-gboolean	reply_to_calendar_comp		(ECalComponentItipMethod method,
+gboolean	reply_to_calendar_comp		(ESourceRegistry *registry,
+						 ECalComponentItipMethod method,
 						 ECalComponent *send_comp,
 						 ECalClient *cal_client,
 						 gboolean reply_all,



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