[evolution/kill-bonobo] More refactoring of settings management.



commit 3b0699fc304d0f4aecb261d19869de221f5d6abf
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri Aug 7 21:43:09 2009 -0400

    More refactoring of settings management.

 calendar/gui/calendar-config.c               |   64 +--
 calendar/gui/calendar-config.h               |    8 -
 calendar/gui/dialogs/cal-prefs-dialog.c      |   52 +--
 calendar/gui/dialogs/cal-prefs-dialog.h      |    1 -
 calendar/gui/dialogs/comp-editor-util.c      |    2 +-
 calendar/gui/dialogs/event-editor.c          |   41 +-
 calendar/gui/dialogs/recurrence-page.c       |    2 +-
 calendar/gui/dialogs/schedule-page.c         |   18 +-
 calendar/gui/dialogs/task-editor.c           |   41 +-
 calendar/gui/e-cal-model.c                   |   13 +-
 calendar/gui/e-calendar-table.c              |   11 +-
 calendar/gui/e-meeting-list-view.c           |    2 +-
 calendar/gui/e-meeting-store.c               |  254 ++++++---
 calendar/gui/e-meeting-store.h               |  134 +++--
 calendar/gui/e-meeting-time-sel.c            |  367 +++++++++---
 calendar/gui/e-meeting-time-sel.h            |   72 ++-
 calendar/gui/e-memo-table.c                  |    6 +-
 calendar/gui/e-memos.c                       |  381 ------------
 calendar/gui/e-memos.h                       |   81 ---
 calendar/gui/e-tasks.c                       |  724 -----------------------
 calendar/gui/e-tasks.h                       |   76 ---
 calendar/gui/e-timezone-entry.c              |  450 ++++++++-------
 calendar/gui/e-timezone-entry.h              |   63 ++-
 calendar/gui/gnome-cal.c                     |   12 +-
 calendar/gui/memos-component.c               |  418 --------------
 calendar/gui/memos-component.h               |   57 --
 calendar/gui/tasks-component.c               |  801 --------------------------
 calendar/gui/tasks-component.h               |   55 --
 calendar/gui/tasks-control.c                 |  333 -----------
 calendar/gui/tasks-control.h                 |   35 --
 modules/calendar/e-cal-shell-settings.c      |   18 +-
 modules/calendar/e-cal-shell-sidebar.c       |    3 +-
 modules/calendar/e-memo-shell-content.c      |   17 +-
 modules/calendar/e-memo-shell-sidebar.c      |   50 +--
 modules/calendar/e-memo-shell-sidebar.h      |    2 +
 modules/calendar/e-memo-shell-view-private.c |   37 ++
 modules/calendar/e-memo-shell-view-private.h |    2 +
 modules/calendar/e-task-shell-content.c      |    8 +-
 modules/calendar/e-task-shell-view-private.c |    5 +-
 plugins/startup-wizard/startup-wizard.c      |    3 +-
 40 files changed, 1061 insertions(+), 3658 deletions(-)
---
diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c
index 4099f5f..5ebd7e9 100644
--- a/calendar/gui/calendar-config.c
+++ b/calendar/gui/calendar-config.c
@@ -151,10 +151,15 @@ calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func,
 	return id;
 }
 
-/* The current timezone, e.g. "Europe/London". It may be NULL, in which case
-   you should assume UTC (though Evolution will show the timezone-setting
-   dialog the next time a calendar or task folder is selected). */
-gchar *
+static gchar *
+calendar_config_get_timezone_stored (void)
+{
+	calendar_config_init ();
+
+	return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL);
+}
+
+static gchar *
 calendar_config_get_timezone (void)
 {
 	EShell *shell;
@@ -173,14 +178,6 @@ calendar_config_get_timezone (void)
 	return calendar_config_get_timezone_stored ();
 }
 
-gchar *
-calendar_config_get_timezone_stored (void)
-{
-	calendar_config_init ();
-
-	return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL);
-}
-
 icaltimezone *
 calendar_config_get_icaltimezone (void)
 {
@@ -198,19 +195,6 @@ calendar_config_get_icaltimezone (void)
 	return zone;
 }
 
-/* Sets the timezone. If set to NULL it defaults to UTC.
-   FIXME: Should check it is being set to a valid timezone. */
-void
-calendar_config_set_timezone (const gchar *timezone)
-{
-	calendar_config_init ();
-
-	if (timezone && timezone[0])
-		gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, timezone, NULL);
-	else
-		gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, "UTC", NULL);
-}
-
 /* Whether we use 24-hour format or 12-hour format (AM/PM). */
 gboolean
 calendar_config_get_24_hour_format	(void)
@@ -862,36 +846,6 @@ calendar_config_get_hide_completed_tasks_sexp (gboolean get_completed)
 	return sexp;
 }
 
-gchar *
-calendar_config_get_free_busy_template (void)
-{
-	calendar_config_init ();
-
-	return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
-}
-
-void
-calendar_config_set_free_busy_template (const gchar *template)
-{
-	calendar_config_init ();
-
-	gconf_client_set_string (config, CALENDAR_CONFIG_TEMPLATE, template, NULL);
-}
-
-guint
-calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func,
-						     gpointer data)
-{
-	guint id;
-
-	calendar_config_init ();
-
-	id = gconf_client_notify_add (config, CALENDAR_CONFIG_TEMPLATE, func, data,
-				      NULL, NULL);
-
-	return id;
-}
-
 void
 calendar_config_set_dir_path (const gchar *path)
 {
diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h
index 9a8a1dc..d0b2598 100644
--- a/calendar/gui/calendar-config.h
+++ b/calendar/gui/calendar-config.h
@@ -67,10 +67,7 @@ void	  calendar_config_set_calendars_selected (GSList *selected);
 guint	  calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, gpointer data);
 
 /* The current timezone, e.g. "Europe/London". */
-gchar *	  calendar_config_get_timezone		(void);
-gchar *	  calendar_config_get_timezone_stored	(void);
 icaltimezone *calendar_config_get_icaltimezone (void);
-void	  calendar_config_set_timezone		(const gchar	     *timezone);
 
 /* The working days of the week, a bit-wise combination of flags. */
 CalWeekdays calendar_config_get_working_days	(void);
@@ -161,11 +158,6 @@ void     calendar_config_set_default_reminder_units (CalUnits units);
 GSList * calendar_config_get_free_busy (void);
 void calendar_config_set_free_busy (GSList * url_list);
 
-gchar *calendar_config_get_free_busy_template (void);
-void calendar_config_set_free_busy_template (const gchar *template);
-guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func,
-							   gpointer data);
-
 /* Returns TRUE if the locale has 'am' and 'pm' strings defined, i.e. it
    supports 12-hour time format. */
 gboolean  calendar_config_locale_supports_12_hour_format(void);
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c
index 5c56d69..8f22c98 100644
--- a/calendar/gui/dialogs/cal-prefs-dialog.c
+++ b/calendar/gui/dialogs/cal-prefs-dialog.c
@@ -95,16 +95,6 @@ eccp_widget_glade (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget
 }
 
 static void
-timezone_changed (GtkWidget *widget, CalendarPrefsDialog *prefs)
-{
-	icaltimezone *zone;
-
-	zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (prefs->timezone));
-
-	calendar_config_set_timezone (icaltimezone_get_location (zone));
-}
-
-static void
 update_day_second_zone_caption (CalendarPrefsDialog *prefs)
 {
 	gchar *location;
@@ -402,12 +392,6 @@ alarms_selection_changed (ESourceSelector *selector, CalendarPrefsDialog *prefs)
 }
 
 static void
-template_url_changed (GtkEntry *entry, CalendarPrefsDialog *prefs)
-{
-	calendar_config_set_free_busy_template (gtk_entry_get_text (entry));
-}
-
-static void
 update_system_tz_widgets (EShellSettings *shell_settings,
                           GParamSpec *pspec,
                           CalendarPrefsDialog *prefs)
@@ -427,7 +411,6 @@ update_system_tz_widgets (EShellSettings *shell_settings,
 static void
 setup_changes (CalendarPrefsDialog *prefs)
 {
-	g_signal_connect (G_OBJECT (prefs->timezone), "changed", G_CALLBACK (timezone_changed), prefs);
 	g_signal_connect (G_OBJECT (prefs->day_second_zone), "clicked", G_CALLBACK (day_second_zone_clicked), prefs);
 
 	g_signal_connect (G_OBJECT (prefs->start_of_day), "changed", G_CALLBACK (start_of_day_changed), prefs);
@@ -455,20 +438,6 @@ setup_changes (CalendarPrefsDialog *prefs)
 
 	g_signal_connect (G_OBJECT (prefs->notify_with_tray), "toggled", G_CALLBACK (notify_with_tray_toggled), prefs);
 	g_signal_connect (G_OBJECT (prefs->alarm_list_widget), "selection_changed", G_CALLBACK (alarms_selection_changed), prefs);
-
-	g_signal_connect (G_OBJECT (prefs->template_url), "changed", G_CALLBACK (template_url_changed), prefs);
-}
-
-/* Shows the current Free/Busy settings in the dialog */
-static void
-show_fb_config (CalendarPrefsDialog *prefs)
-{
-	gchar *template_url;
-
-	template_url = calendar_config_get_free_busy_template ();
-	gtk_entry_set_text (GTK_ENTRY (prefs->template_url), (template_url ? template_url : ""));
-
-	g_free (template_url);
 }
 
 /* Shows the current task list settings in the dialog */
@@ -538,16 +507,9 @@ show_config (CalendarPrefsDialog *prefs)
 	gint mask, day, time_divisions;
 	icaltimezone *zone;
 	gboolean sensitive, set = FALSE;
-	gchar *location;
 	CalUnits units;
 	gint interval;
 
-	/* Timezone. */
-	location = calendar_config_get_timezone_stored ();
-	zone = icaltimezone_get_builtin_timezone (location);
-	e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (prefs->timezone), zone);
-	g_free (location);
-
 	/* Day's second zone */
 	update_day_second_zone_caption (prefs);
 
@@ -573,9 +535,6 @@ show_config (CalendarPrefsDialog *prefs)
 	/* Alarms list*/
 	show_alarms_config (prefs);
 
-	/* Free/Busy */
-	show_fb_config (prefs);
-
 	/* Other page */
 	e_dialog_toggle_set (prefs->default_reminder, calendar_config_get_use_default_reminder ());
 	e_dialog_spin_set (prefs->default_reminder_interval, calendar_config_get_default_reminder_interval ());
@@ -662,13 +621,15 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs,
 		G_CALLBACK (update_system_tz_widgets), prefs);
 
 	widget = glade_xml_get_widget (gui, "timezone");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "cal-timezone",
+		G_OBJECT (widget), "timezone");
 	e_mutual_binding_new_with_negation (
 		G_OBJECT (shell_settings), "cal-use-system-timezone",
 		G_OBJECT (widget), "sensitive");
 
 	/* General tab */
 	prefs->system_tz_label = glade_xml_get_widget (gui, "system-tz-label");
-	prefs->timezone = glade_xml_get_widget (gui, "timezone");
 	prefs->day_second_zone = glade_xml_get_widget (gui, "day_second_zone");
 
 	widget = glade_xml_get_widget (gui, "sun_button");
@@ -764,7 +725,7 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs,
 
 	widget = glade_xml_get_widget (gui, "dnav_show_week_no");
 	e_mutual_binding_new (
-		G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers",
+		G_OBJECT (shell_settings), "cal-show-week-numbers",
 		G_OBJECT (widget), "active");
 
 	widget = glade_xml_get_widget (gui, "dview_show_week_no");
@@ -799,7 +760,10 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs,
 	prefs->scrolled_window = glade_xml_get_widget (gui, "calendar-source-scrolled-window");
 
 	/* Free/Busy tab */
-	prefs->template_url = glade_xml_get_widget (gui, "template_url");
+	widget = glade_xml_get_widget (gui, "template_url");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "cal-free-busy-template",
+		G_OBJECT (widget), "text");
 	target = e_cal_config_target_new_prefs (ec, prefs->gconf);
 	e_config_set_target ((EConfig *)ec, (EConfigTarget *) target);
 	toplevel = e_config_create_widget ((EConfig *)ec);
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.h b/calendar/gui/dialogs/cal-prefs-dialog.h
index 5d0a371..ceaa379 100644
--- a/calendar/gui/dialogs/cal-prefs-dialog.h
+++ b/calendar/gui/dialogs/cal-prefs-dialog.h
@@ -63,7 +63,6 @@ struct _CalendarPrefsDialog {
 
 	/* General tab */
 	GtkWidget *system_tz_label;
-	GtkWidget *timezone;
 	GtkWidget *day_second_zone;
 	GtkWidget *working_days[7];
 	GtkWidget *week_start_day;
diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c
index cfe4139..697e8bd 100644
--- a/calendar/gui/dialogs/comp-editor-util.c
+++ b/calendar/gui/dialogs/comp-editor-util.c
@@ -239,7 +239,7 @@ comp_editor_new_date_edit (EShellSettings *shell_settings,
 #endif
 
 	e_binding_new (
-		G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers",
+		G_OBJECT (shell_settings), "cal-show-week-numbers",
 		G_OBJECT (dedit), "show-week-numbers");
 
 	e_binding_new (
diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c
index e7d602c..94006a9 100644
--- a/calendar/gui/dialogs/event-editor.c
+++ b/calendar/gui/dialogs/event-editor.c
@@ -248,15 +248,6 @@ static GtkActionEntry meeting_entries[] = {
 };
 
 static void
-event_editor_client_changed_cb (EventEditor *ee)
-{
-	ECal *client;
-
-	client = comp_editor_get_client (COMP_EDITOR (ee));
-	e_meeting_store_set_e_cal (ee->priv->model, client);
-}
-
-static void
 event_editor_model_changed_cb (EventEditor *ee)
 {
 	if (!ee->priv->updating) {
@@ -369,6 +360,31 @@ event_editor_dispose (GObject *object)
 }
 
 static void
+event_editor_constructed (GObject *object)
+{
+	EventEditorPrivate *priv;
+	EShellSettings *shell_settings;
+	EShell *shell;
+
+	priv = EVENT_EDITOR_GET_PRIVATE (object);
+
+	shell = comp_editor_get_shell (COMP_EDITOR (object));
+	shell_settings = e_shell_get_shell_settings (shell);
+
+	e_binding_new (
+		G_OBJECT (object), "client",
+		G_OBJECT (priv->model), "client");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-free-busy-template",
+		G_OBJECT (priv->model), "free-busy-template");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-timezone",
+		G_OBJECT (priv->model), "timezone");
+}
+
+static void
 event_editor_show_categories (CompEditor *editor,
                               gboolean visible)
 {
@@ -445,6 +461,7 @@ event_editor_class_init (EventEditorClass *class)
 	object_class = G_OBJECT_CLASS (class);
 	object_class->constructor = event_editor_constructor;
 	object_class->dispose = event_editor_dispose;
+	object_class->constructed = event_editor_constructed;
 
 	editor_class = COMP_EDITOR_CLASS (class);
 	editor_class->help_section = "usage-calendar-apts";
@@ -502,10 +519,6 @@ event_editor_init (EventEditor *ee)
 	action = comp_editor_get_action (editor, "send-options");
 	gtk_action_set_visible (action, FALSE);
 
-	g_signal_connect (
-		ee, "notify::client",
-		G_CALLBACK (event_editor_client_changed_cb), NULL);
-
 	g_signal_connect_swapped (
 		ee->priv->model, "row_changed",
 		G_CALLBACK (event_editor_model_changed_cb), ee);
@@ -640,7 +653,7 @@ event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboo
 		ECal *client;
 		gboolean result;
 
-		client = e_meeting_store_get_e_cal (priv->model);
+		client = e_meeting_store_get_client (priv->model);
 		result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
 				client, NULL, NULL, NULL, strip_alarms);
 		g_object_unref (comp);
diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c
index 66f2152..bd9152a 100644
--- a/calendar/gui/dialogs/recurrence-page.c
+++ b/calendar/gui/dialogs/recurrence-page.c
@@ -2260,7 +2260,7 @@ init_widgets (RecurrencePage *rpage)
 	ecal = E_CALENDAR (priv->preview_calendar);
 
 	e_binding_new (
-		G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers",
+		G_OBJECT (shell_settings), "cal-show-week-numbers",
 		G_OBJECT (ecal->calitem), "show-week-numbers");
 
 	e_binding_new (
diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c
index 712d270..979e182 100644
--- a/calendar/gui/dialogs/schedule-page.c
+++ b/calendar/gui/dialogs/schedule-page.c
@@ -218,7 +218,7 @@ update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalCompone
 	if (start_zone != end_zone) {
 		icaltimezone_convert_time (&end_tt, end_zone, start_zone);
 	}
-	e_meeting_store_set_zone (priv->model, priv->zone);
+	e_meeting_store_set_timezone (priv->model, priv->zone);
 
 	all_day = (start_tt.is_date && end_tt.is_date) ? TRUE : FALSE;
 
@@ -385,10 +385,14 @@ SchedulePage *
 schedule_page_construct (SchedulePage *spage, EMeetingStore *ems)
 {
 	SchedulePagePrivate *priv = spage->priv;
+	EShellSettings *shell_settings;
+	EShell *shell;
 	CompEditor *editor;
 	gchar *gladefile;
 
 	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
+	shell = comp_editor_get_shell (editor);
+	shell_settings = e_shell_get_shell_settings (shell);
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "schedule-page.glade",
@@ -423,6 +427,18 @@ schedule_page_construct (SchedulePage *spage, EMeetingStore *ems)
 	gtk_widget_show (GTK_WIDGET (priv->sel));
 	gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->sel), TRUE, TRUE, 6);
 
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-show-week-numbers",
+		G_OBJECT (priv->sel), "show-week-numbers");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-use-24-hour-format",
+		G_OBJECT (priv->sel), "use-24-hour-format");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-week-start-day",
+		G_OBJECT (priv->sel), "week-start-day");
+
 	if (!init_widgets (spage)) {
 		g_message ("schedule_page_construct(): "
 			   "Could not initialize the widgets!");
diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c
index 2829def..a309a51 100644
--- a/calendar/gui/dialogs/task-editor.c
+++ b/calendar/gui/dialogs/task-editor.c
@@ -126,15 +126,6 @@ static GtkActionEntry assigned_task_entries[] = {
 };
 
 static void
-task_editor_client_changed_cb (TaskEditor *te)
-{
-	ECal *client;
-
-	client = comp_editor_get_client (COMP_EDITOR (te));
-	e_meeting_store_set_e_cal (te->priv->model, client);
-}
-
-static void
 task_editor_model_changed_cb (TaskEditor *te)
 {
 	if (!te->priv->updating) {
@@ -208,6 +199,31 @@ task_editor_dispose (GObject *object)
 }
 
 static void
+task_editor_constructed (GObject *object)
+{
+	TaskEditorPrivate *priv;
+	EShellSettings *shell_settings;
+	EShell *shell;
+
+	priv = TASK_EDITOR_GET_PRIVATE (object);
+
+	shell = comp_editor_get_shell (COMP_EDITOR (object));
+	shell_settings = e_shell_get_shell_settings (shell);
+
+	e_binding_new (
+		G_OBJECT (object), "client",
+		G_OBJECT (priv->model), "client");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-free-busy-template",
+		G_OBJECT (priv->model), "free-busy-template");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-timezone",
+		G_OBJECT (priv->model), "timezone");
+}
+
+static void
 task_editor_show_categories (CompEditor *editor,
                              gboolean visible)
 {
@@ -284,6 +300,7 @@ task_editor_class_init (TaskEditorClass *class)
 	object_class = G_OBJECT_CLASS (class);
 	object_class->constructor = task_editor_constructor;
 	object_class->dispose = task_editor_dispose;
+	object_class->constructed = task_editor_constructed;
 
 	editor_class = COMP_EDITOR_CLASS (class);
 	editor_class->help_section = "usage-calendar-todo";
@@ -356,10 +373,6 @@ task_editor_init (TaskEditor *te)
 		g_error_free (error);
 	}
 
-	g_signal_connect (
-		te, "notify::client",
-		G_CALLBACK (task_editor_client_changed_cb), NULL);
-
 	g_signal_connect_swapped (
 		te->priv->model, "row_changed",
 		G_CALLBACK (task_editor_model_changed_cb), te);
@@ -465,7 +478,7 @@ task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gbool
 		ECal *client;
 		gboolean result;
 
-		client = e_meeting_store_get_e_cal (priv->model);
+		client = e_meeting_store_get_client (priv->model);
 		result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
 				client, NULL, NULL, NULL, strip_alarms);
 		g_object_unref (comp);
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
index cbe3326..d5a9226 100644
--- a/calendar/gui/e-cal-model.c
+++ b/calendar/gui/e-cal-model.c
@@ -35,7 +35,6 @@
 #include "e-cal-model.h"
 #include "itip-utils.h"
 #include "misc.h"
-#include "calendar-config.h"
 #include "e-util/e-binding.h"
 #include "e-util/e-util.h"
 
@@ -1600,14 +1599,16 @@ add_instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end
 	return TRUE;
 }
 
-/* We do this check since the calendar items are downloaded from the server in the open_method,
-   since the default timezone might not be set there */
+/* We do this check since the calendar items are downloaded from the server
+ * in the open_method, since the default timezone might not be set there. */
 static void
-ensure_dates_are_in_default_zone (icalcomponent *icalcomp)
+ensure_dates_are_in_default_zone (ECalModel *model,
+                                  icalcomponent *icalcomp)
 {
 	icaltimetype dt;
-	icaltimezone *zone = calendar_config_get_icaltimezone ();
+	icaltimezone *zone;
 
+	zone = e_cal_model_get_timezone (model);
 	if (!zone)
 		return;
 
@@ -1670,7 +1671,7 @@ e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer user_data
 
 		e_cal_component_free_id (id);
 		g_object_unref (comp);
-		ensure_dates_are_in_default_zone (l->data);
+		ensure_dates_are_in_default_zone (model, l->data);
 
 		if (e_cal_util_component_has_recurrences (l->data) && (priv->flags & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES)) {
 			RecurrenceExpansionData rdata;
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
index 755dfeb..a61477d 100644
--- a/calendar/gui/e-calendar-table.c
+++ b/calendar/gui/e-calendar-table.c
@@ -287,6 +287,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table,
 	GString *tmp2;
 	gchar buff[1001];
 	gboolean free_text = FALSE;
+	gboolean use_24_hour_format;
 	ECalComponent *new_comp;
 	ECalComponentOrganizer organizer;
 	ECalComponentDateTime dtstart, dtdue;
@@ -385,6 +386,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table,
 	e_cal_component_get_due (new_comp, &dtdue);
 
 	default_zone = e_cal_model_get_timezone (model);
+	use_24_hour_format = e_cal_model_get_use_24_hour_format (model);
 
 	if (dtstart.tzid) {
 		zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (new_comp), dtstart.tzid);
@@ -405,7 +407,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table,
 		tmp_tm = icaltimetype_to_tm_with_zone (
 			dtstart.value, zone, default_zone);
 		e_time_format_date_and_time (
-			&tmp_tm, calendar_config_get_24_hour_format (),
+			&tmp_tm, use_24_hour_format,
 			FALSE, FALSE, buff, 1000);
 
 		if (buff [0]) {
@@ -420,7 +422,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table,
 		tmp_tm = icaltimetype_to_tm_with_zone (
 			dtdue.value, zone, default_zone);
 		e_time_format_date_and_time (
-			&tmp_tm, calendar_config_get_24_hour_format (),
+			&tmp_tm, use_24_hour_format,
 			FALSE, FALSE, buff, 1000);
 
 		if (buff [0]) {
@@ -1614,12 +1616,15 @@ e_calendar_table_save_state (ECalendarTable *cal_table,
 static struct tm
 e_calendar_table_get_current_time (ECellDateEdit *ecde, gpointer data)
 {
+	ECalendarTable *cal_table = data;
+	ECalModel *model;
 	icaltimezone *zone;
 	struct tm tmp_tm = { 0 };
 	struct icaltimetype tt;
 
 	/* Get the current timezone. */
-	zone = calendar_config_get_icaltimezone ();
+	model = e_calendar_table_get_model (cal_table);
+	zone = e_cal_model_get_timezone (model);
 
 	tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
 
diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c
index 276c31a..32aa1d3 100644
--- a/calendar/gui/e-meeting-list-view.c
+++ b/calendar/gui/e-meeting-list-view.c
@@ -827,7 +827,7 @@ process_section (EMeetingListView *view, GList *destinations, icalparameter_role
 			name = e_destination_get_name (dest);
 
 			/* Get the field as attendee from the backend */
-			if (e_cal_get_ldap_attribute (e_meeting_store_get_e_cal (priv->store),
+			if (e_cal_get_ldap_attribute (e_meeting_store_get_client (priv->store),
 						      &attr, NULL)) {
 				/* FIXME this should be more general */
 				if (!g_ascii_strcasecmp (attr, "icscalendar")) {
diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c
index 20bc638..8b9f02c 100644
--- a/calendar/gui/e-meeting-store.c
+++ b/calendar/gui/e-meeting-store.c
@@ -31,13 +31,17 @@
 #include <libecal/e-cal-util.h>
 #include <libecal/e-cal-time-util.h>
 #include <libedataserver/e-data-server-util.h>
-#include "calendar-config.h"
 #include "itip-utils.h"
 #include "e-meeting-utils.h"
 #include "e-meeting-attendee.h"
 #include "e-meeting-store.h"
 
-#define ROW_VALID(store, row) (row >= 0 && row < store->priv->attendees->len)
+#define ROW_VALID(store, row) \
+	(row >= 0 && row < store->priv->attendees->len)
+
+#define E_MEETING_STORE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_MEETING_STORE, EMeetingStorePrivate))
 
 struct _EMeetingStorePrivate {
 	GPtrArray *attendees;
@@ -76,7 +80,14 @@ struct _EMeetingStoreQueueData {
 	GPtrArray *data;
 };
 
-static GObjectClass *parent_class = NULL;
+enum {
+	PROP_0,
+	PROP_CLIENT,
+	PROP_FREE_BUSY_TEMPLATE,
+	PROP_TIMEZONE
+};
+
+static gpointer parent_class;
 
 static icalparameter_cutype
 text_to_type (const gchar *type)
@@ -523,13 +534,73 @@ refresh_queue_remove (EMeetingStore *store, EMeetingAttendee *attendee)
 }
 
 static void
-ems_finalize (GObject *obj)
+meeting_store_set_property (GObject *object,
+                            guint property_id,
+                            const GValue *value,
+                            GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CLIENT:
+			e_meeting_store_set_client (
+				E_MEETING_STORE (object),
+				g_value_get_object (value));
+			return;
+
+		case PROP_FREE_BUSY_TEMPLATE:
+			e_meeting_store_set_free_busy_template (
+				E_MEETING_STORE (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_TIMEZONE:
+			e_meeting_store_set_timezone (
+				E_MEETING_STORE (object),
+				g_value_get_pointer (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+meeting_store_get_property (GObject *object,
+                            guint property_id,
+                            GValue *value,
+                            GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CLIENT:
+			g_value_set_object (
+				value,
+				e_meeting_store_get_client (
+				E_MEETING_STORE (object)));
+			return;
+
+		case PROP_FREE_BUSY_TEMPLATE:
+			g_value_set_string (
+				value,
+				e_meeting_store_get_free_busy_template (
+				E_MEETING_STORE (object)));
+			return;
+
+		case PROP_TIMEZONE:
+			g_value_set_pointer (
+				value,
+				e_meeting_store_get_timezone (
+				E_MEETING_STORE (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+meeting_store_finalize (GObject *object)
 {
-	EMeetingStore *store = E_MEETING_STORE (obj);
 	EMeetingStorePrivate *priv;
 	gint i;
 
-	priv = store->priv;
+	priv = E_MEETING_STORE_GET_PRIVATE (object);
 
 	for (i = 0; i < priv->attendees->len; i++)
 		g_object_unref (g_ptr_array_index (priv->attendees, i));
@@ -539,7 +610,9 @@ ems_finalize (GObject *obj)
 		g_object_unref (priv->client);
 
 	while (priv->refresh_queue->len > 0)
-		refresh_queue_remove (store, g_ptr_array_index (priv->refresh_queue, 0));
+		refresh_queue_remove (
+			E_MEETING_STORE (object),
+			g_ptr_array_index (priv->refresh_queue, 0));
 	g_ptr_array_free (priv->refresh_queue, TRUE);
 	g_hash_table_destroy (priv->refresh_data);
 
@@ -550,75 +623,100 @@ ems_finalize (GObject *obj)
 
 	g_mutex_free (priv->mutex);
 
-	g_free (priv);
-
-	if (G_OBJECT_CLASS (parent_class)->finalize)
-		(* G_OBJECT_CLASS (parent_class)->finalize) (obj);
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 static void
-ems_class_init (GObjectClass *klass)
+meeting_store_class_init (GObjectClass *class)
 {
-	parent_class = g_type_class_peek_parent (klass);
-
-	klass->finalize = ems_finalize;
+	GObjectClass *object_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EMeetingStorePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = meeting_store_set_property;
+	object_class->get_property = meeting_store_get_property;
+	object_class->finalize = meeting_store_finalize;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_CLIENT,
+		g_param_spec_object (
+			"client",
+			"Client",
+			NULL,
+			E_TYPE_CAL,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_FREE_BUSY_TEMPLATE,
+		g_param_spec_string (
+			"free-busy-template",
+			"Free/Busy Template",
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_TIMEZONE,
+		g_param_spec_pointer (
+			"timezone",
+			"Timezone",
+			NULL,
+			G_PARAM_READWRITE));
 }
 
 static void
-ems_init (EMeetingStore *store)
+meeting_store_init (EMeetingStore *store)
 {
-	EMeetingStorePrivate *priv;
-
-	priv = g_new0 (EMeetingStorePrivate, 1);
-
-	store->priv = priv;
-
-	priv->attendees = g_ptr_array_new ();
-
-	priv->zone = calendar_config_get_icaltimezone ();
+	store->priv = E_MEETING_STORE_GET_PRIVATE (store);
 
-	priv->fb_uri = calendar_config_get_free_busy_template ();
+	store->priv->attendees = g_ptr_array_new ();
+	store->priv->refresh_queue = g_ptr_array_new ();
+	store->priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal);
 
-	priv->refresh_queue = g_ptr_array_new ();
-	priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal);
+	store->priv->mutex = g_mutex_new ();
 
-	priv->mutex = g_mutex_new ();
-
-	priv->num_queries = 0;
+	store->priv->num_queries = 0;
 }
 
 GType
 e_meeting_store_get_type (void)
 {
-	static GType ems_type = 0;
-
-	if (!ems_type) {
-		static const GTypeInfo ems_info = {
-				sizeof (EMeetingStoreClass),
-				NULL,           /* base_init */
-				NULL,           /* base_finalize */
-				(GClassInitFunc) ems_class_init,
-				NULL,           /* class_finalize */
-				NULL,           /* class_data */
-				sizeof (EMeetingStore),
-				0,
-				(GInstanceInitFunc) ems_init };
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+			sizeof (EMeetingStoreClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) meeting_store_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EMeetingStore),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) meeting_store_init,
+			NULL   /* value_table */
+		};
 
 		static const GInterfaceInfo tree_model_info = {
-				(GInterfaceInitFunc) ems_tree_model_init,
-				NULL,
-				NULL };
+			(GInterfaceInitFunc) ems_tree_model_init,
+			NULL,
+			NULL
+		};
 
-		ems_type = g_type_register_static (GTK_TYPE_LIST_STORE,
-						   "EMeetingStore",
-						   &ems_info, 0);
+		type = g_type_register_static (
+			GTK_TYPE_LIST_STORE, "EMeetingStore", &type_info, 0);
 
-		g_type_add_interface_static (ems_type,
-					     GTK_TYPE_TREE_MODEL,
-					     &tree_model_info);
+		g_type_add_interface_static (
+			type, GTK_TYPE_TREE_MODEL, &tree_model_info);
 	}
 
-	return ems_type;
+	return type;
 }
 
 GObject *
@@ -628,53 +726,69 @@ e_meeting_store_new (void)
 }
 
 ECal *
-e_meeting_store_get_e_cal (EMeetingStore *store)
+e_meeting_store_get_client (EMeetingStore *store)
 {
+	g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
+
 	return store->priv->client;
 }
 
 void
-e_meeting_store_set_e_cal (EMeetingStore *store, ECal *client)
+e_meeting_store_set_client (EMeetingStore *store,
+                            ECal *client)
 {
+	g_return_if_fail (E_IS_MEETING_STORE (store));
+
+	if (client != NULL) {
+		g_return_if_fail (E_IS_CAL (client));
+		g_object_ref (client);
+	}
+
 	if (store->priv->client != NULL)
 		g_object_unref (store->priv->client);
 
-	if (client != NULL)
-		g_object_ref (client);
 	store->priv->client = client;
+
+	g_object_notify (G_OBJECT (store), "client");
 }
 
-icaltimezone *
-e_meeting_store_get_zone (EMeetingStore *store)
+const gchar *
+e_meeting_store_get_free_busy_template (EMeetingStore *store)
 {
 	g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
 
-	return store->priv->zone;
+	return store->priv->fb_uri;
 }
 
 void
-e_meeting_store_set_zone (EMeetingStore *store, icaltimezone *zone)
+e_meeting_store_set_free_busy_template (EMeetingStore *store,
+                                        const gchar *free_busy_template)
 {
 	g_return_if_fail (E_IS_MEETING_STORE (store));
 
-	store->priv->zone = zone;
+	g_free (store->priv->fb_uri);
+	store->priv->fb_uri = g_strdup (free_busy_template);
+
+	g_object_notify (G_OBJECT (store), "free-busy-template");
 }
 
-gchar *
-e_meeting_store_get_fb_uri (EMeetingStore *store)
+icaltimezone *
+e_meeting_store_get_timezone (EMeetingStore *store)
 {
 	g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL);
 
-	return g_strdup (store->priv->fb_uri);
+	return store->priv->zone;
 }
 
 void
-e_meeting_store_set_fb_uri (EMeetingStore *store, const gchar *fb_uri)
+e_meeting_store_set_timezone (EMeetingStore *store,
+                              icaltimezone *timezone)
 {
 	g_return_if_fail (E_IS_MEETING_STORE (store));
 
-	g_free (store->priv->fb_uri);
-	store->priv->fb_uri = g_strdup (fb_uri);
+	store->priv->zone = timezone;
+
+	g_object_notify (G_OBJECT (store), "timezone");
 }
 
 static void
diff --git a/calendar/gui/e-meeting-store.h b/calendar/gui/e-meeting-store.h
index f67ad92..62287a7 100644
--- a/calendar/gui/e-meeting-store.h
+++ b/calendar/gui/e-meeting-store.h
@@ -20,24 +20,37 @@
  *
  */
 
-#ifndef _E_MEETING_STORE_H_
-#define _E_MEETING_STORE_H_
+#ifndef E_MEETING_STORE_H
+#define E_MEETING_STORE_H
 
 #include <gtk/gtk.h>
 #include <libecal/e-cal.h>
 #include "e-meeting-attendee.h"
 
-G_BEGIN_DECLS
+/* Standard GObject macros */
+#define E_TYPE_MEETING_STORE \
+	(e_meeting_store_get_type ())
+#define E_MEETING_STORE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MEETING_STORE, EMeetingStore))
+#define E_MEETING_STORE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MEETING_STORE, EMeetingStoreClass))
+#define E_IS_MEETING_STORE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MEETING_STORE))
+#define E_IS_MEETING_STORE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), E_TYPE_MEETING_STORE))
+#define E_MEETING_STORE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MEETING_STORE, EMeetingStoreClass))
 
-#define E_TYPE_MEETING_STORE		(e_meeting_store_get_type ())
-#define E_MEETING_STORE(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEETING_STORE, EMeetingStore))
-#define E_MEETING_STORE_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MEETING_STORE, EMeetingStoreClass))
-#define E_IS_MEETING_STORE(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEETING_STORE))
-#define E_IS_MEETING_STORE_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MEETING_STORE))
+G_BEGIN_DECLS
 
-typedef struct _EMeetingStore        EMeetingStore;
+typedef struct _EMeetingStore EMeetingStore;
+typedef struct _EMeetingStoreClass EMeetingStoreClass;
 typedef struct _EMeetingStorePrivate EMeetingStorePrivate;
-typedef struct _EMeetingStoreClass   EMeetingStoreClass;
 
 typedef enum {
 	E_MEETING_STORE_ADDRESS_COL,
@@ -57,7 +70,6 @@ typedef enum {
 
 struct _EMeetingStore {
 	GtkListStore parent;
-
 	EMeetingStorePrivate *priv;
 };
 
@@ -65,48 +77,64 @@ struct _EMeetingStoreClass {
 	GtkListStoreClass parent_class;
 };
 
-typedef gboolean (* EMeetingStoreRefreshCallback) (gpointer data);
-
-GType    e_meeting_store_get_type (void);
-GObject *e_meeting_store_new      (void);
-
-void e_meeting_store_set_value (EMeetingStore *im, gint row, gint col, const gchar *val);
-
-ECal *e_meeting_store_get_e_cal (EMeetingStore *im);
-void e_meeting_store_set_e_cal (EMeetingStore *im, ECal *client);
-
-icaltimezone *e_meeting_store_get_zone (EMeetingStore *im);
-void e_meeting_store_set_zone (EMeetingStore *im, icaltimezone *zone);
-
-gchar *e_meeting_store_get_fb_uri (EMeetingStore *im);
-void e_meeting_store_set_fb_uri (EMeetingStore *im, const gchar *fb_uri);
-
-void e_meeting_store_add_attendee (EMeetingStore *im, EMeetingAttendee *ia);
-EMeetingAttendee *e_meeting_store_add_attendee_with_defaults (EMeetingStore *im);
-
-void e_meeting_store_remove_attendee (EMeetingStore *im, EMeetingAttendee *ia);
-void e_meeting_store_remove_all_attendees (EMeetingStore *im);
-
-EMeetingAttendee *e_meeting_store_find_attendee (EMeetingStore *im, const gchar *address, gint *row);
-EMeetingAttendee *e_meeting_store_find_attendee_at_row (EMeetingStore *im, gint row);
-GtkTreePath *e_meeting_store_find_attendee_path (EMeetingStore *store, EMeetingAttendee *attendee);
-
-gint e_meeting_store_count_actual_attendees (EMeetingStore *im);
-const GPtrArray *e_meeting_store_get_attendees (EMeetingStore *im);
-
-void e_meeting_store_refresh_all_busy_periods (EMeetingStore *im,
-					       EMeetingTime *start,
-					       EMeetingTime *end,
-					       EMeetingStoreRefreshCallback call_back,
-					       gpointer data);
-void e_meeting_store_refresh_busy_periods (EMeetingStore *im,
-					   gint row,
-					   EMeetingTime *start,
-					   EMeetingTime *end,
-					   EMeetingStoreRefreshCallback call_back,
-					   gpointer data);
-
-guint e_meeting_store_get_num_queries (EMeetingStore *store);
+typedef gboolean (*EMeetingStoreRefreshCallback) (gpointer data);
+
+GType		e_meeting_store_get_type	(void);
+GObject *	e_meeting_store_new		(void);
+void		e_meeting_store_set_value	(EMeetingStore *meeting_store,
+						 gint row,
+						 gint col,
+						 const gchar *val);
+ECal *		e_meeting_store_get_client	(EMeetingStore *meeting_store);
+void		e_meeting_store_set_client	(EMeetingStore *meeting_store,
+						 ECal *client);
+const gchar *	e_meeting_store_get_free_busy_template
+						(EMeetingStore *meeting_store);
+void		e_meeting_store_set_free_busy_template
+						(EMeetingStore *meeting_store,
+						 const gchar *free_busy_template);
+icaltimezone *	e_meeting_store_get_timezone	(EMeetingStore *meeting_store);
+void		e_meeting_store_set_timezone	(EMeetingStore *meeting_store,
+						 icaltimezone *timezone);
+void		e_meeting_store_add_attendee	(EMeetingStore *meeting_store,
+						 EMeetingAttendee *attendee);
+EMeetingAttendee *
+		e_meeting_store_add_attendee_with_defaults
+						(EMeetingStore *meeting_store);
+void		e_meeting_store_remove_attendee	(EMeetingStore *meeting_store,
+						 EMeetingAttendee *attendee);
+void		e_meeting_store_remove_all_attendees
+						(EMeetingStore *meeting_store);
+EMeetingAttendee *
+		e_meeting_store_find_attendee	(EMeetingStore *meeting_store,
+						 const gchar *address,
+						 gint *row);
+EMeetingAttendee *
+		e_meeting_store_find_attendee_at_row
+						(EMeetingStore *meeting_store,
+						 gint row);
+GtkTreePath *	e_meeting_store_find_attendee_path
+						(EMeetingStore *meeting_store,
+						 EMeetingAttendee *attendee);
+gint		e_meeting_store_count_actual_attendees
+						(EMeetingStore *meeting_store);
+const GPtrArray *
+		e_meeting_store_get_attendees	(EMeetingStore *meeting_store);
+void		e_meeting_store_refresh_all_busy_periods
+						(EMeetingStore *meeting_store,
+						 EMeetingTime *start,
+						 EMeetingTime *end,
+						 EMeetingStoreRefreshCallback call_back,
+						 gpointer data);
+void		e_meeting_store_refresh_busy_periods
+						(EMeetingStore *meeting_store,
+						 gint row,
+						 EMeetingTime *start,
+						 EMeetingTime *end,
+						 EMeetingStoreRefreshCallback call_back,
+						 gpointer data);
+
+guint		e_meeting_store_get_num_queries	(EMeetingStore *meeting_store);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c
index 9ca9826..ea6fca8 100644
--- a/calendar/gui/e-meeting-time-sel.c
+++ b/calendar/gui/e-meeting-time-sel.c
@@ -39,14 +39,24 @@
 #include "misc/e-canvas-utils.h"
 
 #include "misc/e-dateedit.h"
+#include "e-util/e-binding.h"
 #include "e-util/e-cursor.h"
 #include "e-util/e-util.h"
 
-#include "calendar-config.h"
 #include "e-meeting-utils.h"
 #include "e-meeting-list-view.h"
 #include "e-meeting-time-sel-item.h"
 
+#define E_MEETING_TIME_SELECTOR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelectorPrivate))
+
+struct _EMeetingTimeSelectorPrivate {
+	gint week_start_day;
+	guint show_week_numbers  : 1;
+	guint use_24_hour_format : 1;
+};
+
 /* An array of hour strings for 24 hour time, "0:00" .. "23:00". */
 const gchar *EMeetingTimeSelectorHours[24] = {
 	"0:00", "1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00",
@@ -75,15 +85,20 @@ const gchar *EMeetingTimeSelectorHours12[24] = {
 /* This is the maximum scrolling speed. */
 #define E_MEETING_TIME_SELECTOR_MAX_SCROLL_SPEED	4
 
-/* Signals */
+enum {
+	PROP_0,
+	PROP_SHOW_WEEK_NUMBERS,
+	PROP_USE_24_HOUR_FORMAT,
+	PROP_WEEK_START_DAY
+};
+
 enum {
 	CHANGED,
 	LAST_SIGNAL
 };
 
-static gint mts_signals [LAST_SIGNAL] = { 0 };
+static gint signals [LAST_SIGNAL] = { 0 };
 
-static void e_meeting_time_selector_destroy (GtkObject *object);
 static void e_meeting_time_selector_alloc_named_color (EMeetingTimeSelector * mts,
 						       const gchar *name, GdkColor *c);
 static void e_meeting_time_selector_add_key_color (EMeetingTimeSelector * mts,
@@ -187,40 +202,179 @@ static void row_inserted_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter
 static void row_changed_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
 static void row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
 
-static void free_busy_template_changed_cb (GConfClient *client, guint cnxn_id,
-					   GConfEntry *entry, gpointer user_data);
+static void free_busy_template_changed_cb (EMeetingTimeSelector *mts);
 
 G_DEFINE_TYPE (EMeetingTimeSelector, e_meeting_time_selector, GTK_TYPE_TABLE)
 
 static void
-e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * klass)
+meeting_time_selector_set_property (GObject *object,
+                                    guint property_id,
+                                    const GValue *value,
+                                    GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_SHOW_WEEK_NUMBERS:
+			e_meeting_time_selector_set_show_week_numbers (
+				E_MEETING_TIME_SELECTOR (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_USE_24_HOUR_FORMAT:
+			e_meeting_time_selector_set_use_24_hour_format (
+				E_MEETING_TIME_SELECTOR (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			e_meeting_time_selector_set_week_start_day (
+				E_MEETING_TIME_SELECTOR (object),
+				g_value_get_int (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+meeting_time_selector_get_property (GObject *object,
+                                    guint property_id,
+                                    GValue *value,
+                                    GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_SHOW_WEEK_NUMBERS:
+			g_value_set_boolean (
+				value,
+				e_meeting_time_selector_get_show_week_numbers (
+				E_MEETING_TIME_SELECTOR (object)));
+			return;
+
+		case PROP_USE_24_HOUR_FORMAT:
+			g_value_set_boolean (
+				value,
+				e_meeting_time_selector_get_use_24_hour_format (
+				E_MEETING_TIME_SELECTOR (object)));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			g_value_set_int (
+				value,
+				e_meeting_time_selector_get_week_start_day (
+				E_MEETING_TIME_SELECTOR (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+meeting_time_selector_destroy (GtkObject *object)
+{
+	EMeetingTimeSelector *mts;
+
+	mts = E_MEETING_TIME_SELECTOR (object);
+
+	e_meeting_time_selector_remove_timeout (mts);
+
+	if (mts->stipple) {
+		g_object_unref (mts->stipple);
+		mts->stipple = NULL;
+	}
+
+	if (mts->model) {
+		g_signal_handlers_disconnect_matched (
+			mts->model, G_SIGNAL_MATCH_DATA,
+			0, 0, NULL, NULL, mts);
+		g_object_unref (mts->model);
+		mts->model = NULL;
+	}
+
+	mts->display_top = NULL;
+	mts->display_main = NULL;
+
+	if (mts->fb_refresh_not != 0) {
+		g_source_remove (mts->fb_refresh_not);
+		mts->fb_refresh_not = 0;
+	}
+
+	if (mts->style_change_idle_id != 0) {
+		g_source_remove (mts->style_change_idle_id);
+		mts->style_change_idle_id = 0;
+	}
+
+	if (GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)
+		(*GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)(object);
+}
+
+static void
+e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * class)
 {
-	GtkObjectClass *object_class;
+	GObjectClass *object_class;
+	GtkObjectClass *gtk_object_class;
 	GtkWidgetClass *widget_class;
 
-	object_class = (GtkObjectClass *) klass;
-	widget_class = (GtkWidgetClass *) klass;
+	g_type_class_add_private (class, sizeof (EMeetingTimeSelectorPrivate));
 
-	mts_signals [CHANGED] =
-		g_signal_new ("changed",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (EMeetingTimeSelectorClass, changed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = meeting_time_selector_set_property;
+	object_class->get_property = meeting_time_selector_get_property;
 
-	object_class->destroy = e_meeting_time_selector_destroy;
+	gtk_object_class = GTK_OBJECT_CLASS (class);
+	gtk_object_class->destroy = meeting_time_selector_destroy;
 
-	widget_class->realize      = e_meeting_time_selector_realize;
-	widget_class->unrealize    = e_meeting_time_selector_unrealize;
-	widget_class->style_set    = e_meeting_time_selector_style_set;
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->realize = e_meeting_time_selector_realize;
+	widget_class->unrealize = e_meeting_time_selector_unrealize;
+	widget_class->style_set = e_meeting_time_selector_style_set;
 	widget_class->expose_event = e_meeting_time_selector_expose_event;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_SHOW_WEEK_NUMBERS,
+		g_param_spec_boolean (
+			"show-week-numbers",
+			"Show Week Numbers",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_USE_24_HOUR_FORMAT,
+		g_param_spec_boolean (
+			"use-24-hour-format",
+			"Use 24-Hour Format",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WEEK_START_DAY,
+		g_param_spec_int (
+			"week-start-day",
+			"Week Start Day",
+			NULL,
+			0,  /* Monday */
+			6,  /* Sunday */
+			0,
+			G_PARAM_READWRITE));
+
+	signals[CHANGED] = g_signal_new (
+		"changed",
+		G_TYPE_FROM_CLASS (object_class),
+		G_SIGNAL_RUN_FIRST,
+		G_STRUCT_OFFSET (EMeetingTimeSelectorClass, changed),
+		NULL, NULL,
+		g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE, 0);
 }
 
 static void
 e_meeting_time_selector_init (EMeetingTimeSelector * mts)
 {
+	mts->priv = E_MEETING_TIME_SELECTOR_GET_PRIVATE (mts);
+
 	/* The shadow is drawn in the border so it must be >= 2 pixels. */
 	gtk_container_set_border_width (GTK_CONTAINER (mts), 2);
 
@@ -236,10 +390,6 @@ e_meeting_time_selector_init (EMeetingTimeSelector * mts)
 
 	mts->list_view = NULL;
 
-	mts->fb_uri_not =
-		calendar_config_add_notification_free_busy_template ((GConfClientNotifyFunc) free_busy_template_changed_cb,
-								     mts);
-
 	mts->fb_refresh_not = 0;
 	mts->style_change_idle_id = 0;
 }
@@ -300,6 +450,10 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em
 	if (mts->model)
 		g_object_ref (mts->model);
 
+	g_signal_connect_swapped (
+		mts->model, "notify::free-busy-template",
+		G_CALLBACK (free_busy_template_changed_cb), mts);
+
 	g_signal_connect (mts->model, "row_inserted", G_CALLBACK (row_inserted_cb), mts);
 	g_signal_connect (mts->model, "row_changed", G_CALLBACK (row_changed_cb), mts);
 	g_signal_connect (mts->model, "row_deleted", G_CALLBACK (row_deleted_cb), mts);
@@ -586,8 +740,18 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em
 					a11y_label);
 	}
 	e_date_edit_set_show_time (E_DATE_EDIT (mts->start_date_edit), TRUE);
-	e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->start_date_edit),
-					    calendar_config_get_24_hour_format ());
+
+	e_binding_new (
+		G_OBJECT (mts), "show-week-numbers",
+		G_OBJECT (mts->start_date_edit), "show-week-numbers");
+
+	e_binding_new (
+		G_OBJECT (mts), "use-24-hour-format",
+		G_OBJECT (mts->start_date_edit), "use-24-hour-format");
+
+	e_binding_new (
+		G_OBJECT (mts), "week-start-day",
+		G_OBJECT (mts->start_date_edit), "week-start-day");
 
 	gtk_table_attach (GTK_TABLE (table), mts->start_date_edit,
 			  1, 2, 0, 1, GTK_FILL, 0, 0, 0);
@@ -613,8 +777,18 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em
 					a11y_label);
 	}
 	e_date_edit_set_show_time (E_DATE_EDIT (mts->end_date_edit), TRUE);
-	e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->end_date_edit),
-					    calendar_config_get_24_hour_format ());
+
+	e_binding_new (
+		G_OBJECT (mts), "show-week-numbers",
+		G_OBJECT (mts->end_date_edit), "show-week-numbers");
+
+	e_binding_new (
+		G_OBJECT (mts), "use-24-hour-format",
+		G_OBJECT (mts->end_date_edit), "use-24-hour-format");
+
+	e_binding_new (
+		G_OBJECT (mts), "week-start-day",
+		G_OBJECT (mts->end_date_edit), "week-start-day");
 
 	gtk_table_attach (GTK_TABLE (table), mts->end_date_edit,
 			  1, 2, 1, 2, GTK_FILL, 0, 0, 0);
@@ -666,7 +840,7 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em
 	e_meeting_time_selector_update_end_date_edit (mts);
 	e_meeting_time_selector_update_date_popup_menus (mts);
 
-	g_signal_emit (mts, mts_signals [CHANGED], 0);
+	g_signal_emit (mts, signals [CHANGED], 0);
 }
 
 /* This adds a color to the color key beneath the main display. If color is
@@ -754,7 +928,7 @@ e_meeting_time_selector_options_menu_detacher (GtkWidget *widget,
 	EMeetingTimeSelector *mts;
 
 	g_return_if_fail (widget != NULL);
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (widget));
 
 	mts = E_MEETING_TIME_SELECTOR (widget);
 	g_return_if_fail (mts->options_menu == (GtkWidget*) menu);
@@ -769,7 +943,7 @@ e_meeting_time_selector_autopick_menu_detacher (GtkWidget *widget,
 	EMeetingTimeSelector *mts;
 
 	g_return_if_fail (widget != NULL);
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (widget));
 
 	mts = E_MEETING_TIME_SELECTOR (widget);
 	g_return_if_fail (mts->autopick_menu == (GtkWidget*) menu);
@@ -782,52 +956,68 @@ e_meeting_time_selector_new (EMeetingStore *ems)
 {
 	GtkWidget *mts;
 
-	mts = GTK_WIDGET (g_object_new (e_meeting_time_selector_get_type (), NULL));
+	mts = g_object_new (E_TYPE_MEETING_TIME_SELECTOR, NULL);
 
 	e_meeting_time_selector_construct (E_MEETING_TIME_SELECTOR (mts), ems);
 
 	return mts;
 }
 
-static void
-e_meeting_time_selector_destroy (GtkObject *object)
+gboolean
+e_meeting_time_selector_get_show_week_numbers (EMeetingTimeSelector *mts)
 {
-	EMeetingTimeSelector *mts;
+	g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE);
 
-	mts = E_MEETING_TIME_SELECTOR (object);
+	return mts->priv->show_week_numbers;
+}
 
-	e_meeting_time_selector_remove_timeout (mts);
+void
+e_meeting_time_selector_set_show_week_numbers (EMeetingTimeSelector *mts,
+                                               gboolean show_week_numbers)
+{
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
-	if (mts->stipple) {
-		g_object_unref (mts->stipple);
-		mts->stipple = NULL;
-	}
+	mts->priv->show_week_numbers = show_week_numbers;
 
-	if (mts->model) {
-		g_object_unref (mts->model);
-		mts->model = NULL;
-	}
+	g_object_notify (G_OBJECT (mts), "show-week-numbers");
+}
 
-	mts->display_top = NULL;
-	mts->display_main = NULL;
+gboolean
+e_meeting_time_selector_get_use_24_hour_format (EMeetingTimeSelector *mts)
+{
+	g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE);
 
-	if (mts->fb_uri_not) {
-		calendar_config_remove_notification (mts->fb_uri_not);
-		mts->fb_uri_not = 0;
-	}
+	return mts->priv->use_24_hour_format;
+}
 
-	if (mts->fb_refresh_not != 0) {
-		g_source_remove (mts->fb_refresh_not);
-		mts->fb_refresh_not = 0;
-	}
+void
+e_meeting_time_selector_set_use_24_hour_format (EMeetingTimeSelector *mts,
+                                                gboolean use_24_hour_format)
+{
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
-	if (mts->style_change_idle_id != 0) {
-		g_source_remove (mts->style_change_idle_id);
-		mts->style_change_idle_id = 0;
-	}
+	mts->priv->use_24_hour_format = use_24_hour_format;
 
-	if (GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)
-		(*GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)(object);
+	g_object_notify (G_OBJECT (mts), "use-24-hour-format");
+}
+
+gint
+e_meeting_time_selector_get_week_start_day (EMeetingTimeSelector *mts)
+{
+	g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), 0);
+
+	return mts->priv->week_start_day;
+}
+
+void
+e_meeting_time_selector_set_week_start_day (EMeetingTimeSelector *mts,
+                                            gint week_start_day)
+{
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
+
+	mts->priv->week_start_day = week_start_day;
+
+	g_object_notify (G_OBJECT (mts), "week-start-day");
 }
 
 static void
@@ -895,7 +1085,7 @@ style_change_idle_func (gpointer widget)
 	/* Calculate the widths of the hour strings in the style's font. */
 	max_hour_width = 0;
 	for (hour = 0; hour < 24; hour++) {
-		if (calendar_config_get_24_hour_format ())
+		if (e_meeting_time_selector_get_use_24_hour_format (mts))
 			pango_layout_set_text (layout, EMeetingTimeSelectorHours [hour], -1);
 		else
 			pango_layout_set_text (layout, EMeetingTimeSelectorHours12 [hour], -1);
@@ -1053,7 +1243,7 @@ e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts,
 					  gint end_hour,
 					  gint end_minute)
 {
-	g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), FALSE);
+	g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE);
 
 	/* Check the dates are valid. */
 	if (!g_date_valid_dmy (start_day, start_month, start_year)
@@ -1082,7 +1272,7 @@ e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts,
 	e_meeting_time_selector_update_start_date_edit (mts);
 	e_meeting_time_selector_update_end_date_edit (mts);
 
-	g_signal_emit (mts, mts_signals [CHANGED], 0);
+	g_signal_emit (mts, signals [CHANGED], 0);
 
 	return TRUE;
 }
@@ -1115,7 +1305,7 @@ e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts,
 {
 	EMeetingTime saved_time;
 
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	if (mts->working_hours_only == working_hours_only)
 		return;
@@ -1140,7 +1330,7 @@ e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts,
 {
 	EMeetingTime saved_time;
 
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	if (mts->day_start_hour == day_start_hour
 	    && mts->day_start_minute == day_start_minute
@@ -1175,7 +1365,7 @@ e_meeting_time_selector_set_zoomed_out (EMeetingTimeSelector *mts,
 {
 	EMeetingTime saved_time;
 
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	if (mts->zoomed_out == zoomed_out)
 		return;
@@ -1269,7 +1459,7 @@ void
 e_meeting_time_selector_set_autopick_option (EMeetingTimeSelector *mts,
 					     EMeetingTimeSelectorAutopickOption autopick_option)
 {
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	switch (autopick_option) {
 	case E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_RESOURCES:
@@ -1294,7 +1484,7 @@ e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts,
 {
 	EMeetingTimeSelectorAttendee *attendee;
 
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 	g_return_if_fail (row >= 0);
 	g_return_if_fail (row < mts->attendees->len);
 
@@ -1307,7 +1497,7 @@ e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts,
 void
 e_meeting_time_selector_set_read_only (EMeetingTimeSelector *mts, gboolean read_only)
 {
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	gtk_widget_set_sensitive (GTK_WIDGET (mts->list_view), !read_only);
 	gtk_widget_set_sensitive (mts->display_main, !read_only);
@@ -1334,7 +1524,7 @@ e_meeting_time_selector_dump (EMeetingTimeSelector *mts)
 	gint row, period_num;
 	gchar buffer[128];
 
-	g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts));
+	g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts));
 
 	g_print ("\n\nAttendee Information:\n");
 
@@ -1627,7 +1817,7 @@ e_meeting_time_selector_autopick (EMeetingTimeSelector *mts,
 			e_meeting_time_selector_update_start_date_edit (mts);
 			e_meeting_time_selector_update_end_date_edit (mts);
 
-			g_signal_emit (mts, mts_signals [CHANGED], 0);
+			g_signal_emit (mts, signals [CHANGED], 0);
 
 			return;
 		}
@@ -2180,7 +2370,7 @@ e_meeting_time_selector_on_start_time_changed (GtkWidget *widget,
 	gtk_widget_queue_draw (mts->display_top);
 	gtk_widget_queue_draw (mts->display_main);
 
-	g_signal_emit (mts, mts_signals [CHANGED], 0);
+	g_signal_emit (mts, signals [CHANGED], 0);
 }
 
 /* This is called when the meeting end time GnomeDateEdit is changed,
@@ -2229,7 +2419,7 @@ e_meeting_time_selector_on_end_time_changed (GtkWidget *widget,
 	gtk_widget_queue_draw (mts->display_top);
 	gtk_widget_queue_draw (mts->display_main);
 
-	g_signal_emit (mts, mts_signals [CHANGED], 0);
+	g_signal_emit (mts, signals [CHANGED], 0);
 }
 
 /* This updates the ranges shown in the GnomeDateEdit popup menus, according
@@ -2443,7 +2633,7 @@ e_meeting_time_selector_drag_meeting_time (EMeetingTimeSelector *mts,
 	if (set_both_times
 	    || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
 	    || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
-		g_signal_emit (mts, mts_signals [CHANGED], 0);
+		g_signal_emit (mts, signals [CHANGED], 0);
 }
 
 /* This is the timeout function which handles auto-scrolling when the user is
@@ -2582,7 +2772,7 @@ e_meeting_time_selector_timeout_handler (gpointer data)
 	if (set_both_times
 	    || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END
 	    || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START)
-		g_signal_emit (mts, mts_signals [CHANGED], 0);
+		g_signal_emit (mts, signals [CHANGED], 0);
 
  scroll:
 	/* Redraw the canvases. We freeze and thaw the layouts so that they
@@ -2861,14 +3051,8 @@ row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
 static gboolean
 free_busy_timeout_refresh (gpointer data)
 {
-	gchar *fb_uri;
-
 	EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
 
-	fb_uri = calendar_config_get_free_busy_template ();
-	e_meeting_store_set_fb_uri (mts->model, fb_uri);
-	g_free (fb_uri);
-
 	/* Update all free/busy info, so we use the new template uri */
 	e_meeting_time_selector_refresh_free_busy (mts, 0, TRUE);
 
@@ -2878,19 +3062,12 @@ free_busy_timeout_refresh (gpointer data)
 }
 
 static void
-free_busy_template_changed_cb (GConfClient *client,
-			       guint cnxn_id,
-			       GConfEntry *entry,
-			       gpointer data)
+free_busy_template_changed_cb (EMeetingTimeSelector *mts)
 {
-	EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data);
-
 	/* Wait REFRESH_PAUSE before refreshing, using the latest uri value */
-	if (mts->fb_refresh_not != 0) {
+	if (mts->fb_refresh_not != 0)
 		g_source_remove (mts->fb_refresh_not);
-	}
 
-	mts->fb_refresh_not = g_timeout_add_seconds (REFRESH_PAUSE,
-					     free_busy_timeout_refresh,
-					     data);
+	mts->fb_refresh_not = g_timeout_add_seconds (
+		REFRESH_PAUSE, free_busy_timeout_refresh, mts);
 }
diff --git a/calendar/gui/e-meeting-time-sel.h b/calendar/gui/e-meeting-time-sel.h
index b38dd98..540443a 100644
--- a/calendar/gui/e-meeting-time-sel.h
+++ b/calendar/gui/e-meeting-time-sel.h
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef _E_MEETING_TIME_SELECTOR_H_
-#define _E_MEETING_TIME_SELECTOR_H_
+#ifndef E_MEETING_TIME_SELECTOR_H
+#define E_MEETING_TIME_SELECTOR_H
 
 #include <gtk/gtk.h>
 #include <libgnomecanvas/gnome-canvas.h>
@@ -31,14 +31,31 @@
 #include "e-meeting-store.h"
 #include "e-meeting-list-view.h"
 
-G_BEGIN_DECLS
-
 /*
  * EMeetingTimeSelector displays a list of attendees for a meeting and a
  * graphical summary of the times which they are free and busy, allowing the
  * user to select an appropriate time for a meeting.
  */
 
+/* Standard GObject macros */
+#define E_TYPE_MEETING_TIME_SELECTOR \
+	(e_meeting_time_selector_get_type ())
+#define E_MEETING_TIME_SELECTOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelector))
+#define E_MEETING_TIME_SELECTOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelectorClass))
+#define E_IS_MEETING_TIME_SELECTOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MEETING_TIME_SELECTOR))
+#define E_IS_MEETING_TIME_SELECTOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_MEETING_TIME_SELECTOR))
+#define E_MEETING_TIME_SELECTOR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MEETING_TIME_SELECTOR))
+
 /* Define this to include the debugging functions. */
 #undef E_MEETING_TIME_SELECTOR_DEBUG
 
@@ -48,6 +65,8 @@ G_BEGIN_DECLS
 #define E_MEETING_TIME_SELECTOR_TEXT_Y_PAD		3
 #define E_MEETING_TIME_SELECTOR_TEXT_X_PAD		2
 
+G_BEGIN_DECLS
+
 /* This is used to specify the format used when displaying the dates.
    The full format is like 'Sunday, September 12, 1999'. The abbreviated format
    is like 'Sun 12/9/99'. The short format is like '12/9/99'. The actual
@@ -84,19 +103,17 @@ extern const gchar *EMeetingTimeSelectorHours[24];
 /* An array of hour strings for 12 hour time, "12:00am" .. "11:00pm". */
 extern const gchar *EMeetingTimeSelectorHours12[24];
 
-#define E_MEETING_TIME_SELECTOR(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, e_meeting_time_selector_get_type (), EMeetingTimeSelector)
-#define E_MEETING_TIME_SELECTOR_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, e_meeting_time_selector_get_type (), EMeetingTimeSelectorClass)
-#define IS_E_MEETING_TIME_SELECTOR(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, e_meeting_time_selector_get_type ())
+typedef struct _EMeetingTimeSelector EMeetingTimeSelector;
+typedef struct _EMeetingTimeSelectorClass EMeetingTimeSelectorClass;
+typedef struct _EMeetingTimeSelectorPrivate EMeetingTimeSelectorPrivate;
 
-typedef struct _EMeetingTimeSelector       EMeetingTimeSelector;
-typedef struct _EMeetingTimeSelectorClass  EMeetingTimeSelectorClass;
-
-struct _EMeetingTimeSelector
-{
+struct _EMeetingTimeSelector {
 	/* We subclass a GtkTable which makes it easy to add extra widgets
 	   if neccesary. */
 	GtkTable table;
 
+	EMeetingTimeSelectorPrivate *priv;
+
 	/*
 	 * User Interface stuff - widgets, colors etc.
 	 */
@@ -246,9 +263,6 @@ struct _EMeetingTimeSelector
 	/* This is used to determine the delay between scrolls. */
 	gint scroll_count;
 
-	/* The notification function id for Free/Busy template uri changes */
-	guint fb_uri_not;
-
 	/* The notification function id for Free/Busy refreshes */
 	gboolean fb_refresh_not;
 
@@ -257,8 +271,7 @@ struct _EMeetingTimeSelector
 	guint style_change_idle_id;
 };
 
-struct _EMeetingTimeSelectorClass
-{
+struct _EMeetingTimeSelectorClass {
 	GtkTableClass parent_class;
 
 	void (* changed) (EMeetingTimeSelector *mts);
@@ -269,9 +282,26 @@ struct _EMeetingTimeSelectorClass
  * know where the data is coming from. This is mainly just for testing for now.
  */
 
-GType e_meeting_time_selector_get_type (void);
-GtkWidget* e_meeting_time_selector_new (EMeetingStore *ems);
-void e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *ems);
+GType		e_meeting_time_selector_get_type (void);
+GtkWidget *	e_meeting_time_selector_new	(EMeetingStore *ems);
+void		e_meeting_time_selector_construct
+						(EMeetingTimeSelector *mts,
+						 EMeetingStore *ems);
+gboolean	e_meeting_time_selector_get_show_week_numbers
+						(EMeetingTimeSelector *mts);
+void		e_meeting_time_selector_set_show_week_numbers
+						(EMeetingTimeSelector *mts,
+						 gboolean show_week_numbers);
+gboolean	e_meeting_time_selector_get_use_24_hour_format
+						(EMeetingTimeSelector *mts);
+void		e_meeting_time_selector_set_use_24_hour_format
+						(EMeetingTimeSelector *mts,
+						 gboolean use_24_hour_format);
+gint		e_meeting_time_seletor_get_week_start_day
+						(EMeetingTimeSelector *mts);
+void		e_meeting_time_selector_set_week_start_day
+						(EMeetingTimeSelector *mts,
+						 gint week_start_day);
 
 /* This returns the currently selected meeting time.
    Note that months are 1-12 and days are 1-31. The start time is guaranteed to
@@ -383,4 +413,4 @@ gchar * e_meeting_time_selector_dump_date (GDate *date);
 
 G_END_DECLS
 
-#endif /* _E_MEETING_TIME_SELECTOR_H_ */
+#endif /* E_MEETING_TIME_SELECTOR_H */
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c
index a7f2508..e23f821 100644
--- a/calendar/gui/e-memo-table.c
+++ b/calendar/gui/e-memo-table.c
@@ -48,7 +48,6 @@
 #include <libecal/e-cal-time-util.h>
 #include <libedataserver/e-time-utils.h>
 
-#include "calendar-config.h"
 #include "dialogs/delete-comp.h"
 #include "dialogs/delete-error.h"
 #include "dialogs/memo-editor.h"
@@ -1243,12 +1242,15 @@ e_memo_table_save_state (EMemoTable *memo_table,
 static struct tm
 e_memo_table_get_current_time (ECellDateEdit *ecde, gpointer data)
 {
+	EMemoTable *memo_table = data;
+	ECalModel *model;
 	icaltimezone *zone;
 	struct tm tmp_tm = { 0 };
 	struct icaltimetype tt;
 
 	/* Get the current timezone. */
-	zone = calendar_config_get_icaltimezone ();
+	model = e_memo_table_get_model (memo_table);
+	zone = e_cal_model_get_timezone (model);
 
 	tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
 
diff --git a/calendar/gui/e-timezone-entry.c b/calendar/gui/e-timezone-entry.c
index f3e239a..53a8a44 100644
--- a/calendar/gui/e-timezone-entry.c
+++ b/calendar/gui/e-timezone-entry.c
@@ -33,12 +33,16 @@
 #include <glib/gi18n.h>
 #include "e-timezone-entry.h"
 
+#define E_TIMEZONE_ENTRY_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryPrivate))
+
 struct _ETimezoneEntryPrivate {
 	/* The current timezone, set in e_timezone_entry_set_timezone()
 	   or from the timezone dialog. Note that we don't copy it or
 	   use a ref count - we assume it is never destroyed for the
 	   lifetime of this widget. */
-	icaltimezone *zone;
+	icaltimezone *timezone;
 
 	/* This can be set to the default timezone. If the current timezone
 	   setting in the ETimezoneEntry matches this, then the entry field
@@ -50,314 +54,320 @@ struct _ETimezoneEntryPrivate {
 };
 
 enum {
-  CHANGED,
-  LAST_SIGNAL
+	PROP_0,
+	PROP_TIMEZONE
 };
 
-static void e_timezone_entry_destroy	(GtkObject	*object);
-
-static gboolean e_timezone_entry_mnemonic_activate (GtkWidget *widget,
-                                                    gboolean   group_cycling);
-static gboolean e_timezone_entry_focus (GtkWidget *widget,
-					GtkDirectionType direction);
-static void on_entry_changed		(GtkEntry	*entry,
-					 ETimezoneEntry *tentry);
-static void on_button_clicked		(GtkWidget	*widget,
-					 ETimezoneEntry	*tentry);
-static void add_relation		(ETimezoneEntry *tentry,
-					 GtkWidget *widget);
-
-static void e_timezone_entry_set_entry  (ETimezoneEntry *tentry);
+enum {
+	CHANGED,
+	LAST_SIGNAL
+};
 
-static guint timezone_entry_signals[LAST_SIGNAL] = { 0 };
+static guint signals[LAST_SIGNAL];
 
 G_DEFINE_TYPE (ETimezoneEntry, e_timezone_entry, GTK_TYPE_HBOX)
 
 static void
-e_timezone_entry_class_init		(ETimezoneEntryClass	*class)
+timezone_entry_emit_changed (ETimezoneEntry *timezone_entry)
 {
-	GtkObjectClass *object_class = (GtkObjectClass *) class;
-	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
-
-	object_class = (GtkObjectClass*) class;
-
-	widget_class->mnemonic_activate = e_timezone_entry_mnemonic_activate;
-	widget_class->focus = e_timezone_entry_focus;
-	timezone_entry_signals[CHANGED] =
-		g_signal_new ("changed",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETimezoneEntryClass, changed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	object_class->destroy		= e_timezone_entry_destroy;
-
-	class->changed = NULL;
+	g_signal_emit (timezone_entry, signals[CHANGED], 0);
 }
 
 static void
-e_timezone_entry_init		(ETimezoneEntry	*tentry)
+timezone_entry_update_entry (ETimezoneEntry *timezone_entry)
 {
-	ETimezoneEntryPrivate *priv;
-	AtkObject *a11y;
-
-	tentry->priv = priv = g_new0 (ETimezoneEntryPrivate, 1);
+	const gchar *display_name;
+	gchar *name_buffer;
+	icaltimezone *timezone;
 
-	priv->zone = NULL;
-	priv->default_zone = NULL;
+	timezone = e_timezone_entry_get_timezone (timezone_entry);
 
-	priv->entry  = gtk_entry_new ();
-	gtk_editable_set_editable (GTK_EDITABLE (priv->entry), FALSE);
-	/*gtk_widget_set_usize (priv->date_entry, 90, 0);*/
-	gtk_box_pack_start (GTK_BOX (tentry), priv->entry, TRUE, TRUE, 0);
-	gtk_widget_show (priv->entry);
-	g_signal_connect (priv->entry, "changed", G_CALLBACK (on_entry_changed), tentry);
+	if (timezone != NULL) {
+		display_name = icaltimezone_get_display_name (timezone);
 
-	priv->button = gtk_button_new_with_label (_("Select..."));
-	g_signal_connect (priv->button, "clicked", G_CALLBACK (on_button_clicked), tentry);
-	gtk_box_pack_start (GTK_BOX (tentry), priv->button, FALSE, FALSE, 6);
-	gtk_widget_show (priv->button);
-	a11y = gtk_widget_get_accessible (priv->button);
-	if (a11y != NULL) {
-		atk_object_set_name (a11y, _("Select Timezone"));
-	}
-}
+		/* We check if it is one of our builtin timezone
+		   names, in which case we call gettext to translate
+		   it. If it isn't a builtin timezone name, we don't. */
+		if (icaltimezone_get_builtin_timezone (display_name))
+			display_name = _(display_name);
+	} else
+		display_name = "";
 
-/**
- * e_timezone_entry_new:
- *
- * Description: Creates a new #ETimezoneEntry widget which can be used
- * to provide an easy to use way for entering dates and times.
- *
- * Returns: a new #ETimezoneEntry widget.
- */
-GtkWidget *
-e_timezone_entry_new			(void)
-{
-	ETimezoneEntry *tentry;
+	name_buffer = g_strdup (display_name);
 
-	tentry = g_object_new (e_timezone_entry_get_type (), NULL);
+	gtk_entry_set_text (GTK_ENTRY (timezone_entry->priv->entry), name_buffer);
 
-	GTK_WIDGET_SET_FLAGS (GTK_WIDGET(tentry), GTK_CAN_FOCUS);
+	/* XXX Do we need to hide the timezone entry at all?  I know
+	 *     this overrules the previous case of hiding the timezone
+	 *     entry field when we select the default timezone. */
+	gtk_widget_show (timezone_entry->priv->entry);
 
-	return GTK_WIDGET (tentry);
+	g_free (name_buffer);
 }
-
 static void
-e_timezone_entry_destroy		(GtkObject	*object)
+timezone_entry_add_relation (ETimezoneEntry *timezone_entry)
 {
-	ETimezoneEntry *tentry;
+	AtkObject *a11y_timezone_entry;
+	AtkObject *a11y_widget;
+	AtkRelationSet *set;
+	AtkRelation *relation;
+	GtkWidget *widget;
+	GPtrArray *target;
+	gpointer target_object;
 
-	g_return_if_fail (E_IS_TIMEZONE_ENTRY (object));
+	/* add a labelled_by relation for widget for accessibility */
 
-	tentry = E_TIMEZONE_ENTRY (object);
+	widget = GTK_WIDGET (timezone_entry);
+	a11y_timezone_entry = gtk_widget_get_accessible (widget);
 
-	g_free (tentry->priv);
-	tentry->priv = NULL;
+	widget = timezone_entry->priv->entry;
+	a11y_widget = gtk_widget_get_accessible (widget);
 
-	if (GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy)
-		(* GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy) (object);
+	set = atk_object_ref_relation_set (a11y_widget);
+	if (set != NULL) {
+		relation = atk_relation_set_get_relation_by_type (
+			set, ATK_RELATION_LABELLED_BY);
+		/* check whether has a labelled_by relation already */
+		if (relation != NULL)
+			return;
+	}
+
+	set = atk_object_ref_relation_set (a11y_timezone_entry);
+	if (!set)
+		return;
+
+	relation = atk_relation_set_get_relation_by_type (
+		set, ATK_RELATION_LABELLED_BY);
+	if (relation != NULL) {
+		target = atk_relation_get_target (relation);
+		target_object = g_ptr_array_index (target, 0);
+		if (ATK_IS_OBJECT (target_object)) {
+			atk_object_add_relationship (
+				a11y_widget,
+				ATK_RELATION_LABELLED_BY,
+				ATK_OBJECT (target_object));
+		}
+	}
 }
 
 /* The arrow button beside the date field has been clicked, so we show the
    popup with the ECalendar in. */
 static void
-on_button_clicked		(GtkWidget	*widget,
-				 ETimezoneEntry	*tentry)
+timezone_entry_button_clicked_cb (ETimezoneEntry *timezone_entry)
 {
-	ETimezoneEntryPrivate *priv;
 	ETimezoneDialog *timezone_dialog;
 	GtkWidget *dialog;
-
-	priv = tentry->priv;
+	icaltimezone *timezone;
 
 	timezone_dialog = e_timezone_dialog_new ();
 
-	e_timezone_dialog_set_timezone (timezone_dialog, priv->zone);
+	timezone = e_timezone_entry_get_timezone (timezone_entry);
+	e_timezone_dialog_set_timezone (timezone_dialog, timezone);
 
 	dialog = e_timezone_dialog_get_toplevel (timezone_dialog);
 
-	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
-		priv->zone = e_timezone_dialog_get_timezone (timezone_dialog);
-		e_timezone_entry_set_entry (tentry);
-	}
+	if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT)
+		goto exit;
 
+	timezone = e_timezone_dialog_get_timezone (timezone_dialog);
+	e_timezone_entry_set_timezone (timezone_entry, timezone);
+	timezone_entry_update_entry (timezone_entry);
+
+exit:
 	g_object_unref (timezone_dialog);
 }
 
 static void
-on_entry_changed			(GtkEntry	*entry,
-					 ETimezoneEntry *tentry)
+timezone_entry_set_property (GObject *object,
+                             guint property_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
 {
-	g_signal_emit (GTK_OBJECT (tentry), timezone_entry_signals[CHANGED], 0);
-}
-
-icaltimezone*
-e_timezone_entry_get_timezone		(ETimezoneEntry	*tentry)
-{
-	ETimezoneEntryPrivate *priv;
-
-	g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (tentry), NULL);
-
-	priv = tentry->priv;
+	switch (property_id) {
+		case PROP_TIMEZONE:
+			e_timezone_entry_set_timezone (
+				E_TIMEZONE_ENTRY (object),
+				g_value_get_pointer (value));
+			return;
+	}
 
-	return priv->zone;
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static void
-add_relation				(ETimezoneEntry *tentry,
-					 GtkWidget *widget)
+timezone_entry_get_property (GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
 {
-	AtkObject *a11ytentry, *a11yWidget;
-	AtkRelationSet *set;
-	AtkRelation *relation;
-	GPtrArray *target;
-	gpointer target_object;
-
-	/* add a labelled_by relation for widget for accessibility */
-
-	a11ytentry = gtk_widget_get_accessible (GTK_WIDGET (tentry));
-	a11yWidget = gtk_widget_get_accessible (widget);
-
-	set = atk_object_ref_relation_set (a11yWidget);
-	if (set != NULL) {
-		relation = atk_relation_set_get_relation_by_type (set,
-					ATK_RELATION_LABELLED_BY);
-		/* check whether has a labelled_by relation already */
-		if (relation != NULL)
+	switch (property_id) {
+		case PROP_TIMEZONE:
+			g_value_set_pointer (
+				value, e_timezone_entry_get_timezone (
+				E_TIMEZONE_ENTRY (object)));
 			return;
 	}
 
-	set = atk_object_ref_relation_set (a11ytentry);
-	if (!set)
-		return;
-
-	relation = atk_relation_set_get_relation_by_type (set,
-					ATK_RELATION_LABELLED_BY);
-	if (relation != NULL) {
-		target = atk_relation_get_target (relation);
-		target_object = g_ptr_array_index (target, 0);
-		if (ATK_IS_OBJECT (target_object)) {
-			atk_object_add_relationship (a11yWidget,
-					ATK_RELATION_LABELLED_BY,
-					ATK_OBJECT (target_object));
-		}
-	}
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
-void
-e_timezone_entry_set_timezone		(ETimezoneEntry	*tentry,
-					 icaltimezone	*zone)
+static gboolean
+timezone_entry_mnemonic_activate (GtkWidget *widget,
+                                  gboolean group_cycling)
 {
 	ETimezoneEntryPrivate *priv;
 
-	g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry));
+	priv = E_TIMEZONE_ENTRY_GET_PRIVATE (widget);
 
-	priv = tentry->priv;
-
-	priv->zone = zone;
-
-	e_timezone_entry_set_entry (tentry);
+	if (GTK_WIDGET_CAN_FOCUS (widget)) {
+		if (priv->button != NULL)
+			gtk_widget_grab_focus (priv->button);
+	}
 
-	add_relation (tentry, priv->entry);
+	return TRUE;
 }
 
-/* Sets the default timezone. If the current timezone matches this, then the
-   entry field is hidden. This is useful since most people do not use timezones
-   so it makes the user interface simpler. */
-void
-e_timezone_entry_set_default_timezone	(ETimezoneEntry	*tentry,
-					 icaltimezone	*zone)
+static gboolean
+timezone_entry_focus (GtkWidget *widget,
+                      GtkDirectionType direction)
 {
 	ETimezoneEntryPrivate *priv;
 
-	g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry));
+	priv = E_TIMEZONE_ENTRY_GET_PRIVATE (widget);
 
-	priv = tentry->priv;
+	if (direction == GTK_DIR_TAB_FORWARD) {
+		if (GTK_WIDGET_HAS_FOCUS (priv->entry))
+			gtk_widget_grab_focus (priv->button);
+		else if (GTK_WIDGET_HAS_FOCUS (priv->button))
+			return FALSE;
+		else if (GTK_WIDGET_VISIBLE (priv->entry))
+			gtk_widget_grab_focus (priv->entry);
+		else
+			gtk_widget_grab_focus (priv->button);
 
-	priv->default_zone = zone;
+	} else if (direction == GTK_DIR_TAB_BACKWARD) {
+		if (GTK_WIDGET_HAS_FOCUS (priv->entry))
+			return FALSE;
+		else if (GTK_WIDGET_HAS_FOCUS (priv->button)) {
+			if (GTK_WIDGET_VISIBLE (priv->entry))
+				gtk_widget_grab_focus (priv->entry);
+			else
+				return FALSE;
+		} else
+			gtk_widget_grab_focus (priv->button);
+	} else
+		return FALSE;
 
-	e_timezone_entry_set_entry (tentry);
+	return TRUE;
 }
 
 static void
-e_timezone_entry_set_entry (ETimezoneEntry *tentry)
+e_timezone_entry_class_init (ETimezoneEntryClass *class)
 {
-	ETimezoneEntryPrivate *priv;
-	const gchar *display_name;
-	gchar *name_buffer;
+	GObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+
+	g_type_class_add_private (class, sizeof (ETimezoneEntryPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = timezone_entry_set_property;
+	object_class->get_property = timezone_entry_get_property;
+
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->mnemonic_activate = timezone_entry_mnemonic_activate;
+	widget_class->focus = timezone_entry_focus;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_TIMEZONE,
+		g_param_spec_pointer (
+			"timezone",
+			"Timezone",
+			NULL,
+			G_PARAM_READWRITE));
+
+	signals[CHANGED] = g_signal_new (
+		"changed",
+		G_TYPE_FROM_CLASS (object_class),
+		G_SIGNAL_RUN_LAST,
+		G_STRUCT_OFFSET (ETimezoneEntryClass, changed),
+		NULL, NULL,
+		g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE, 0);
+}
 
-	priv = tentry->priv;
+static void
+e_timezone_entry_init (ETimezoneEntry *timezone_entry)
+{
+	AtkObject *a11y;
+	GtkWidget *widget;
 
-	if (priv->zone) {
-		display_name = icaltimezone_get_display_name (priv->zone);
+	timezone_entry->priv = E_TIMEZONE_ENTRY_GET_PRIVATE (timezone_entry);
 
-		/* We check if it is one of our builtin timezone
-		   names, in which case we call gettext to translate
-		   it. If it isn't a builtin timezone name, we
-		   don't. */
-		if (icaltimezone_get_builtin_timezone (display_name))
-			display_name = _(display_name);
-	} else
-		display_name = "";
+	GTK_WIDGET_SET_FLAGS (GTK_WIDGET (timezone_entry), GTK_CAN_FOCUS);
 
-	name_buffer = g_strdup (display_name);
+	widget  = gtk_entry_new ();
+	gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
+	gtk_box_pack_start (GTK_BOX (timezone_entry), widget, TRUE, TRUE, 0);
+	timezone_entry->priv->entry = widget;
+	gtk_widget_show (widget);
 
-	gtk_entry_set_text (GTK_ENTRY (priv->entry), name_buffer);
+	g_signal_connect_swapped (
+		widget, "changed",
+		G_CALLBACK (timezone_entry_emit_changed), timezone_entry);
 
-	/* do we need to hide the timezone entry at all? i know this overrules the previous case of hiding the timezone
-	 * entry field when we select the default timezone
-         */
-	gtk_widget_show (priv->entry);
+	widget = gtk_button_new_with_label (_("Select..."));
+	gtk_box_pack_start (GTK_BOX (timezone_entry), widget, FALSE, FALSE, 6);
+	timezone_entry->priv->button = widget;
+	gtk_widget_show (widget);
 
-	g_free (name_buffer);
+	g_signal_connect_swapped (
+		widget, "clicked",
+		G_CALLBACK (timezone_entry_button_clicked_cb), timezone_entry);
+
+	a11y = gtk_widget_get_accessible (timezone_entry->priv->button);
+	if (a11y != NULL)
+		atk_object_set_name (a11y, _("Select Timezone"));
 }
 
-static gboolean
-e_timezone_entry_mnemonic_activate (GtkWidget *widget,
-                                    gboolean   group_cycling)
+GtkWidget *
+e_timezone_entry_new (void)
 {
-        GtkButton *button = NULL;
+	return g_object_new (E_TYPE_TIMEZONE_ENTRY, NULL);
+}
 
-        if (GTK_WIDGET_CAN_FOCUS (widget)) {
-                button = GTK_BUTTON (((ETimezoneEntryPrivate *) ((ETimezoneEntry *) widget)->priv)->button);
-                if (button != NULL)
-                        gtk_widget_grab_focus (GTK_WIDGET (button));
-        }
+icaltimezone *
+e_timezone_entry_get_timezone (ETimezoneEntry *timezone_entry)
+{
+	g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry), NULL);
 
-        return TRUE;
+	return timezone_entry->priv->timezone;
 }
 
-static gboolean
-e_timezone_entry_focus (GtkWidget *widget, GtkDirectionType direction)
+void
+e_timezone_entry_set_timezone (ETimezoneEntry *timezone_entry,
+                               icaltimezone *timezone)
 {
-	ETimezoneEntry *tentry;
+	g_return_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry));
 
-	tentry = E_TIMEZONE_ENTRY (widget);
+	timezone_entry->priv->timezone = timezone;
 
-	if (direction == GTK_DIR_TAB_FORWARD) {
-		if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry))
-			gtk_widget_grab_focus (tentry->priv->button);
-		else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button))
-			return FALSE;
-		else if (GTK_WIDGET_VISIBLE (tentry->priv->entry))
-			gtk_widget_grab_focus (tentry->priv->entry);
-		else
-			gtk_widget_grab_focus (tentry->priv->button);
-	} else if (direction == GTK_DIR_TAB_BACKWARD) {
-		if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry))
-			return FALSE;
-		else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button)) {
-			if (GTK_WIDGET_VISIBLE (tentry->priv->entry))
-				gtk_widget_grab_focus (tentry->priv->entry);
-			else
-				return FALSE;
-		} else
-			gtk_widget_grab_focus (tentry->priv->button);
-	} else
-		return FALSE;
-	return TRUE;
+	timezone_entry_update_entry (timezone_entry);
+	timezone_entry_add_relation (timezone_entry);
+
+	g_object_notify (G_OBJECT (timezone_entry), "timezone");
 }
 
+/* Sets the default timezone. If the current timezone matches this,
+ * then the entry field is hidden. This is useful since most people
+ * do not use timezones so it makes the user interface simpler. */
+void
+e_timezone_entry_set_default_timezone (ETimezoneEntry *timezone_entry,
+                                       icaltimezone *timezone)
+{
+	g_return_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry));
+
+	timezone_entry->priv->default_zone = timezone;
+
+	timezone_entry_update_entry (timezone_entry);
+}
diff --git a/calendar/gui/e-timezone-entry.h b/calendar/gui/e-timezone-entry.h
index c1bf482..6c0cd1d 100644
--- a/calendar/gui/e-timezone-entry.h
+++ b/calendar/gui/e-timezone-entry.h
@@ -29,50 +29,61 @@
  * timezone.
  */
 
-#ifndef __E_TIMEZONE_ENTRY_H_
-#define __E_TIMEZONE_ENTRY_H_
+#ifndef E_TIMEZONE_ENTRY_H
+#define E_TIMEZONE_ENTRY_H
 
 #include <gtk/gtk.h>
 #include <libecal/e-cal.h>
 
-G_BEGIN_DECLS
+/* Standard GObject macros */
+#define E_TYPE_TIMEZONE_ENTRY \
+	(e_timezone_entry_get_type ())
+#define E_TIMEZONE_ENTRY(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry))
+#define E_TIMEZONE_ENTRY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass))
+#define E_IS_TIMEZONE_ENTRY(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_TIMEZONE_ENTRY))
+#define E_IS_TIMEZONE_ENTRY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_TIMEZONE_ENTRY))
+#define E_IS_TIMEZONE_ENTRY_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass))
 
-#define E_TYPE_TIMEZONE_ENTRY            (e_timezone_entry_get_type ())
-#define E_TIMEZONE_ENTRY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry))
-#define E_TIMEZONE_ENTRY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass))
-#define E_IS_TIMEZONE_ENTRY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_TIMEZONE_ENTRY))
-#define E_IS_TIMEZONE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_TIMEZONE_ENTRY))
+G_BEGIN_DECLS
 
-typedef struct _ETimezoneEntry        ETimezoneEntry;
+typedef struct _ETimezoneEntry ETimezoneEntry;
+typedef struct _ETimezoneEntryClass ETimezoneEntryClass;
 typedef struct _ETimezoneEntryPrivate ETimezoneEntryPrivate;
-typedef struct _ETimezoneEntryClass   ETimezoneEntryClass;
 
 struct _ETimezoneEntry {
-	GtkHBox hbox;
-
-	/*< private >*/
+	GtkHBox parent;
 	ETimezoneEntryPrivate *priv;
 };
 
 struct _ETimezoneEntryClass {
 	GtkHBoxClass parent_class;
 
-	void (* changed)      (ETimezoneEntry    *tentry);
+	void		(*changed)		(ETimezoneEntry *timezone_entry);
 };
 
-GType      e_timezone_entry_get_type		(void);
-GtkWidget* e_timezone_entry_new			(void);
-
-icaltimezone*   e_timezone_entry_get_timezone	(ETimezoneEntry	*tentry);
-void		e_timezone_entry_set_timezone	(ETimezoneEntry	*tentry,
-						 icaltimezone	*zone);
+GType		e_timezone_entry_get_type	(void);
+GtkWidget *	e_timezone_entry_new		(void);
+icaltimezone *	e_timezone_entry_get_timezone	(ETimezoneEntry *timezone_entry);
+void		e_timezone_entry_set_timezone	(ETimezoneEntry *timezone_entry,
+						 icaltimezone *timezone);
 
-/* Sets the default timezone. If the current timezone matches this, then the
-   entry field is hidden. This is useful since most people do not use timezones
-   so it makes the user interface simpler. */
-void	   e_timezone_entry_set_default_timezone(ETimezoneEntry	*tentry,
-						 icaltimezone	*zone);
+/* Sets the default timezone. If the current timezone matches this,
+ * then the entry field is hidden. This is useful since most people
+ * do not use timezones so it makes the user interface simpler. */
+void		e_timezone_entry_set_default_timezone
+						(ETimezoneEntry *timezone_entry,
+						 icaltimezone *timezone);
 
 G_END_DECLS
 
-#endif /* __E_TIMEZONE_ENTRY_H_ */
+#endif /* E_TIMEZONE_ENTRY_H */
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 6283e6b..4944630 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -723,14 +723,16 @@ gnome_calendar_class_init (GnomeCalendarClass *class)
 
 }
 
-/* We do this check since the calendar items are downloaded from the server in the open_method,
-   since the default timezone might not be set there */
+/* We do this check since the calendar items are downloaded from the server
+ * in the open_method, since the default timezone might not be set there. */
 static void
-ensure_dates_are_in_default_zone (icalcomponent *icalcomp)
+ensure_dates_are_in_default_zone (GnomeCalendar *gcal,
+                                  icalcomponent *icalcomp)
 {
 	icaltimetype dt;
-	icaltimezone *zone = calendar_config_get_icaltimezone ();
+	icaltimezone *zone;
 
+	zone = gnome_calendar_get_timezone (gcal);
 	if (!zone)
 		return;
 
@@ -761,7 +763,7 @@ dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data)
 	for (l = objects; l; l = l->next) {
 		ECalComponent *comp = NULL;
 
-		ensure_dates_are_in_default_zone (l->data);
+		ensure_dates_are_in_default_zone (gcal, l->data);
 		comp = e_cal_component_new ();
 		if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) {
 			g_object_unref (comp);
diff --git a/modules/calendar/e-cal-shell-settings.c b/modules/calendar/e-cal-shell-settings.c
index dbb11ff..4d75bae 100644
--- a/modules/calendar/e-cal-shell-settings.c
+++ b/modules/calendar/e-cal-shell-settings.c
@@ -489,14 +489,14 @@ e_cal_shell_backend_init_settings (EShell *shell)
 		"/apps/evolution/calendar/prompts/confirm_purge");
 
 	e_shell_settings_install_property_for_key (
-		"cal-date-navigator-show-week-numbers",
-		"/apps/evolution/calendar/date_navigator/show_week_numbers");
-
-	e_shell_settings_install_property_for_key (
 		"cal-day-view-show-week-numbers",
 		"/apps/evolution/calendar/display/day_view_show_week_number");
 
 	e_shell_settings_install_property_for_key (
+		"cal-free-busy-template",
+		"/apps/evolution/calendar/publish/template");
+
+	e_shell_settings_install_property_for_key (
 		"cal-hide-completed-tasks",
 		"/apps/evolution/calendar/tasks/hide_completed");
 
@@ -529,6 +529,10 @@ e_cal_shell_backend_init_settings (EShell *shell)
 		"/apps/evolution/calendar/display/show_event_end");
 
 	e_shell_settings_install_property_for_key (
+		"cal-show-week-numbers",
+		"/apps/evolution/calendar/date_navigator/show_week_numbers");
+
+	e_shell_settings_install_property_for_key (
 		"cal-tasks-color-due-today",
 		"/apps/evolution/calendar/tasks/colors/due_today");
 
@@ -597,7 +601,8 @@ e_cal_shell_backend_init_settings (EShell *shell)
 		G_OBJECT (shell_settings), "cal-timezone",
 		transform_string_to_icaltimezone,
 		transform_icaltimezone_to_string,
-		(GDestroyNotify) NULL, shell_settings);
+		(GDestroyNotify) g_object_unref,
+		g_object_ref (shell_settings));
 
 	e_shell_settings_install_property (
 		g_param_spec_int (
@@ -722,5 +727,6 @@ e_cal_shell_backend_init_settings (EShell *shell)
 		G_OBJECT (shell_settings), "cal-working-days-saturday",
 		transform_working_days_bitset_to_saturday,
 		transform_working_days_saturday_to_bitset,
-		(GDestroyNotify) NULL, shell_settings);
+		(GDestroyNotify) g_object_unref,
+		g_object_ref (shell_settings));
 }
diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c
index 6fb35e1..28f96e5 100644
--- a/modules/calendar/e-cal-shell-sidebar.c
+++ b/modules/calendar/e-cal-shell-sidebar.c
@@ -440,8 +440,7 @@ cal_shell_sidebar_constructed (GObject *object)
 	gtk_widget_show (widget);
 
 	e_binding_new (
-		G_OBJECT (shell_settings),
-		"cal-date-navigator-show-week-numbers",
+		G_OBJECT (shell_settings), "cal-show-week-numbers",
 		G_OBJECT (calitem), "show-week-numbers");
 
 	e_binding_new (
diff --git a/modules/calendar/e-memo-shell-content.c b/modules/calendar/e-memo-shell-content.c
index ece6eb6..3a7ee78 100644
--- a/modules/calendar/e-memo-shell-content.c
+++ b/modules/calendar/e-memo-shell-content.c
@@ -25,7 +25,6 @@
 
 #include "e-util/gconf-bridge.h"
 
-#include "calendar/gui/calendar-config.h"
 #include "calendar/gui/comp-util.h"
 #include "calendar/gui/e-cal-model-memos.h"
 #include "calendar/gui/e-memo-table.h"
@@ -353,11 +352,12 @@ memo_shell_content_constructed (GObject *object)
 {
 	EMemoShellContentPrivate *priv;
 	EShell *shell;
+	EShellView *shell_view;
 	EShellSettings *shell_settings;
+	EShellBackend *shell_backend;
 	EShellContent *shell_content;
-	EShellWindow *shell_window;
-	EShellView *shell_view;
 	GalViewInstance *view_instance;
+	icaltimezone *timezone;
 	ETable *table;
 	GConfBridge *bridge;
 	GtkWidget *container;
@@ -371,12 +371,16 @@ memo_shell_content_constructed (GObject *object)
 
 	shell_content = E_SHELL_CONTENT (object);
 	shell_view = e_shell_content_get_shell_view (shell_content);
-	shell_window = e_shell_view_get_shell_window (shell_view);
-	shell = e_shell_window_get_shell (shell_window);
+	shell_backend = e_shell_view_get_shell_backend (shell_view);
+
+	shell = e_shell_backend_get_shell (shell_backend);
 	shell_settings = e_shell_get_shell_settings (shell);
 
 	priv->memo_model = e_cal_model_memos_new (shell_settings);
 
+	timezone = e_shell_settings_get_pointer (
+		shell_settings, "cal-timezone");
+
 	/* Build content widgets. */
 
 	container = GTK_WIDGET (object);
@@ -406,8 +410,7 @@ memo_shell_content_constructed (GObject *object)
 
 	widget = e_cal_component_preview_new ();
 	e_cal_component_preview_set_default_timezone (
-		E_CAL_COMPONENT_PREVIEW (widget),
-		calendar_config_get_icaltimezone ());
+		E_CAL_COMPONENT_PREVIEW (widget), timezone);
 	gtk_container_add (GTK_CONTAINER (container), widget);
 	priv->memo_preview = g_object_ref (widget);
 	gtk_widget_show (widget);
diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c
index ca5d05c..0962a8a 100644
--- a/modules/calendar/e-memo-shell-sidebar.c
+++ b/modules/calendar/e-memo-shell-sidebar.c
@@ -25,6 +25,7 @@
 #include <glib/gi18n.h>
 #include <libecal/e-cal.h>
 
+#include "e-util/e-binding.h"
 #include "e-util/e-error.h"
 #include "e-util/e-util.h"
 #include "calendar/common/authentication.h"
@@ -41,6 +42,7 @@
 
 struct _EMemoShellSidebarPrivate {
 	GtkWidget *selector;
+	icaltimezone *timezone;
 
 	/* UID -> Client */
 	GHashTable *client_table;
@@ -90,33 +92,6 @@ memo_shell_sidebar_emit_status_message (EMemoShellSidebar *memo_shell_sidebar,
 }
 
 static void
-memo_shell_sidebar_update_timezone (EMemoShellSidebar *memo_shell_sidebar)
-{
-	GHashTable *client_table;
-	icaltimezone *zone;
-	GList *values;
-
-	zone = calendar_config_get_icaltimezone ();
-	client_table = memo_shell_sidebar->priv->client_table;
-	values = g_hash_table_get_values (client_table);
-
-	while (values != NULL) {
-		ECal *client = values->data;
-
-		if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
-			e_cal_set_default_timezone (client, zone, NULL);
-
-		values = g_list_delete_link (values, values);
-	}
-
-	/* XXX Need to call e_cal_component_preview_set_default_timezone()
-	 *     here but the sidebar is not really supposed to access content
-	 *     stuff.  I guess we could emit an "update-timezone" signal
-	 *     here, but that feels wrong.  Maybe this whole thing should
-	 *     be in EMemoShellView instead. */
-}
-
-static void
 memo_shell_sidebar_backend_died_cb (EMemoShellSidebar *memo_shell_sidebar,
                                     ECal *client)
 {
@@ -483,13 +458,6 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 }
 
 static void
-memo_shell_sidebar_client_added (EMemoShellSidebar *memo_shell_sidebar,
-                                 ECal *client)
-{
-	memo_shell_sidebar_update_timezone (memo_shell_sidebar);
-}
-
-static void
 memo_shell_sidebar_client_removed (EMemoShellSidebar *memo_shell_sidebar,
                                    ECal *client)
 {
@@ -532,7 +500,6 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class)
 	shell_sidebar_class = E_SHELL_SIDEBAR_CLASS (class);
 	shell_sidebar_class->check_state = memo_shell_sidebar_check_state;
 
-	class->client_added = memo_shell_sidebar_client_added;
 	class->client_removed = memo_shell_sidebar_client_removed;
 
 	g_object_class_install_property (
@@ -632,6 +599,19 @@ e_memo_shell_sidebar_new (EShellView *shell_view)
 		"shell-view", shell_view, NULL);
 }
 
+GList *
+e_memo_shell_sidebar_get_clients (EMemoShellSidebar *memo_shell_sidebar)
+{
+	GHashTable *client_table;
+
+	g_return_val_if_fail (
+		E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar), NULL);
+
+	client_table = memo_shell_sidebar->priv->client_table;
+
+	return g_hash_table_get_values (client_table);
+}
+
 ESourceSelector *
 e_memo_shell_sidebar_get_selector (EMemoShellSidebar *memo_shell_sidebar)
 {
diff --git a/modules/calendar/e-memo-shell-sidebar.h b/modules/calendar/e-memo-shell-sidebar.h
index 665c8f2..068d743 100644
--- a/modules/calendar/e-memo-shell-sidebar.h
+++ b/modules/calendar/e-memo-shell-sidebar.h
@@ -80,6 +80,8 @@ GType		e_memo_shell_sidebar_get_type	(void);
 void		e_memo_shell_sidebar_register_type
 					(GTypeModule *type_module);
 GtkWidget *	e_memo_shell_sidebar_new(EShellView *shell_view);
+GList *		e_memo_shell_sidebar_get_clients
+					(EMemoShellSidebar *memo_shell_sidebar);
 ESourceSelector *
 		e_memo_shell_sidebar_get_selector
 					(EMemoShellSidebar *memo_shell_sidebar);
diff --git a/modules/calendar/e-memo-shell-view-private.c b/modules/calendar/e-memo-shell-view-private.c
index 4953a38..da321d5 100644
--- a/modules/calendar/e-memo-shell-view-private.c
+++ b/modules/calendar/e-memo-shell-view-private.c
@@ -67,6 +67,7 @@ memo_shell_view_selector_client_added_cb (EMemoShellView *memo_shell_view,
 	model = e_memo_table_get_model (memo_table);
 
 	e_cal_model_add_client (model, client);
+	e_memo_shell_view_update_timezone (memo_shell_view);
 }
 
 static void
@@ -198,6 +199,11 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
 	selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar);
 
 	g_signal_connect_swapped (
+		model, "notify::timezone",
+		G_CALLBACK (e_memo_shell_view_update_timezone),
+		memo_shell_view);
+
+	g_signal_connect_swapped (
 		memo_table, "open-component",
 		G_CALLBACK (e_memo_shell_view_open_memo),
 		memo_shell_view);
@@ -269,6 +275,7 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
 	e_memo_shell_view_actions_init (memo_shell_view);
 	e_memo_shell_view_update_sidebar (memo_shell_view);
 	e_memo_shell_view_update_search_filter (memo_shell_view);
+	e_memo_shell_view_update_timezone (memo_shell_view);
 
 	e_memo_shell_view_execute_search (memo_shell_view);
 }
@@ -522,3 +529,33 @@ e_memo_shell_view_update_sidebar (EMemoShellView *memo_shell_view)
 
 	g_string_free (string, TRUE);
 }
+
+void
+e_memo_shell_view_update_timezone (EMemoShellView *memo_shell_view)
+{
+	EMemoShellContent *memo_shell_content;
+	EMemoShellSidebar *memo_shell_sidebar;
+	ECalComponentPreview *memo_preview;
+	icaltimezone *timezone;
+	ECalModel *model;
+	GList *clients, *iter;
+
+	memo_shell_content = memo_shell_view->priv->memo_shell_content;
+	memo_preview = e_memo_shell_content_get_memo_preview (memo_shell_content);
+	model = e_memo_shell_content_get_memo_model (memo_shell_content);
+	timezone = e_cal_model_get_timezone (model);
+
+	memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar;
+	clients = e_memo_shell_sidebar_get_clients (memo_shell_sidebar);
+
+	for (iter = clients; iter != NULL; iter = iter->next) {
+		ECal *client = iter->data;
+
+		if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
+			e_cal_set_default_timezone (client, timezone, NULL);
+	}
+
+	e_cal_component_preview_set_default_timezone (memo_preview, timezone);
+
+	g_list_free (clients);
+}
diff --git a/modules/calendar/e-memo-shell-view-private.h b/modules/calendar/e-memo-shell-view-private.h
index c41eaed..c7ece91 100644
--- a/modules/calendar/e-memo-shell-view-private.h
+++ b/modules/calendar/e-memo-shell-view-private.h
@@ -120,6 +120,8 @@ void		e_memo_shell_view_update_sidebar
 					(EMemoShellView *memo_shell_view);
 void		e_memo_shell_view_update_search_filter
 					(EMemoShellView *memo_shell_view);
+void		e_memo_shell_view_update_timezone
+					(EMemoShellView *memo_shell_view);
 
 G_END_DECLS
 
diff --git a/modules/calendar/e-task-shell-content.c b/modules/calendar/e-task-shell-content.c
index 8a4e0f1..88e5e4d 100644
--- a/modules/calendar/e-task-shell-content.c
+++ b/modules/calendar/e-task-shell-content.c
@@ -26,7 +26,6 @@
 #include "e-util/e-binding.h"
 #include "e-util/gconf-bridge.h"
 
-#include "calendar/gui/calendar-config.h"
 #include "calendar/gui/comp-util.h"
 #include "calendar/gui/e-cal-model-tasks.h"
 #include "calendar/gui/e-calendar-table.h"
@@ -358,6 +357,7 @@ task_shell_content_constructed (GObject *object)
 	EShellWindow *shell_window;
 	EShellView *shell_view;
 	GalViewInstance *view_instance;
+	icaltimezone *timezone;
 	ETable *table;
 	GConfBridge *bridge;
 	GtkWidget *container;
@@ -377,6 +377,9 @@ task_shell_content_constructed (GObject *object)
 
 	priv->task_model = e_cal_model_tasks_new (shell_settings);
 
+	timezone = e_shell_settings_get_pointer (
+		shell_settings, "cal-timezone");
+
 	/* Build content widgets. */
 
 	container = GTK_WIDGET (object);
@@ -406,8 +409,7 @@ task_shell_content_constructed (GObject *object)
 
 	widget = e_cal_component_preview_new ();
 	e_cal_component_preview_set_default_timezone (
-		E_CAL_COMPONENT_PREVIEW (widget),
-		calendar_config_get_icaltimezone ());
+		E_CAL_COMPONENT_PREVIEW (widget), timezone);
 	gtk_container_add (GTK_CONTAINER (container), widget);
 	priv->task_preview = g_object_ref (widget);
 	gtk_widget_show (widget);
diff --git a/modules/calendar/e-task-shell-view-private.c b/modules/calendar/e-task-shell-view-private.c
index 1cbadcb..38c5ab6 100644
--- a/modules/calendar/e-task-shell-view-private.c
+++ b/modules/calendar/e-task-shell-view-private.c
@@ -704,16 +704,17 @@ e_task_shell_view_update_timezone (ETaskShellView *task_shell_view)
 	ETaskShellSidebar *task_shell_sidebar;
 	ECalComponentPreview *task_preview;
 	icaltimezone *timezone;
+	ECalModel *model;
 	GList *clients, *iter;
 
 	task_shell_content = task_shell_view->priv->task_shell_content;
 	task_preview = e_task_shell_content_get_task_preview (task_shell_content);
+	model = e_task_shell_content_get_task_model (task_shell_content);
+	timezone = e_cal_model_get_timezone (model);
 
 	task_shell_sidebar = task_shell_view->priv->task_shell_sidebar;
 	clients = e_task_shell_sidebar_get_clients (task_shell_sidebar);
 
-	timezone = calendar_config_get_icaltimezone ();
-
 	for (iter = clients; iter != NULL; iter = iter->next) {
 		ECal *client = iter->data;
 
diff --git a/plugins/startup-wizard/startup-wizard.c b/plugins/startup-wizard/startup-wizard.c
index 41a647a..9c7ffe6 100644
--- a/plugins/startup-wizard/startup-wizard.c
+++ b/plugins/startup-wizard/startup-wizard.c
@@ -209,7 +209,8 @@ startup_wizard_commit (EPlugin *ep, EMConfigTargetAccount *target)
 	e_shell_settings_set_boolean (
 		shell_settings, "cal-use-system-timezone", TRUE);
 	location = e_cal_util_get_system_timezone_location ();
-	calendar_config_set_timezone (location);
+	e_shell_settings_set_string (
+		shell_settings, "cal-timezone-string", location);
 	g_free (location);
 
 	if (import_importers) {



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