[evolution] Bug #593609 - Have buildable exchange-operations plugin again



commit 17ccb42efb09717a26d7bfceee7a18ad67d71411
Author: Milan Crha <mcrha redhat com>
Date:   Fri Sep 25 10:25:40 2009 +0200

    Bug #593609 - Have buildable exchange-operations plugin again

 configure.ac                                       |   10 -
 plugins/exchange-operations/Makefile.am            |   31 +-
 .../e-foreign-folder-dialog.glade                  |  220 -------
 .../exchange-operations/exchange-account-setup.c   |    1 -
 .../exchange-operations/exchange-change-password.c |  142 ++++--
 .../exchange-change-password.glade                 |  243 --------
 .../exchange-operations/exchange-config-listener.c |  189 +++++--
 .../exchange-operations/exchange-delegates-user.c  |  195 +++++--
 plugins/exchange-operations/exchange-delegates.c   |   94 +++-
 .../exchange-operations/exchange-delegates.glade   |  542 -----------------
 .../exchange-folder-permission.c                   |  616 +++++++++++++-------
 .../exchange-folder-size-display.c                 |   52 ++-
 .../exchange-folder-subscription.c                 |  100 +++-
 .../exchange-folder-subscription.h                 |    7 +
 .../exchange-operations/exchange-folder-tree.glade |   92 ---
 plugins/exchange-operations/exchange-folder.c      |  371 +++---------
 plugins/exchange-operations/exchange-oof.glade     |  530 -----------------
 plugins/exchange-operations/exchange-operations.h  |    2 +-
 .../exchange-passwd-expiry.glade                   |   91 ---
 .../exchange-permissions-dialog.c                  |  292 ++++++++--
 .../exchange-permissions-dialog.glade              |  578 ------------------
 .../exchange-operations/exchange-send-options.c    |  210 +++++--
 .../exchange-send-options.glade                    |  405 -------------
 plugins/exchange-operations/exchange-user-dialog.c |    3 +-
 .../org-gnome-exchange-ab-subscription.xml         |   15 -
 .../org-gnome-exchange-cal-subscription.xml        |   15 -
 .../org-gnome-exchange-operations.eplug.xml        |  298 +++-------
 .../org-gnome-exchange-tasks-subscription.xml      |   15 -
 .../org-gnome-folder-permissions.xml               |   14 -
 .../org-gnome-folder-subscription.xml              |   16 -
 po/POTFILES.in                                     |   13 -
 ui/evolution-contacts.ui                           |    1 +
 widgets/misc/Makefile.am                           |    1 -
 33 files changed, 1575 insertions(+), 3829 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index b14eecf..35a6c15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1794,16 +1794,6 @@ xexperimental)
 	;;
 esac
 
-dnl Temporary KILL-BONOBO hack
-for broken_plugin in exchange-operations
-do
-	if echo ${plugins_enabled} | grep "$broken_plugin" > /dev/null
-	then
-		plugins_enabled=`echo $plugins_enabled | sed -e "s/$broken_plugin//g"`
-		echo "warning: plugin $broken_plugin is broken with kill-bonobo changes, disabling it."
-	fi
-done
-
 AC_SUBST(plugins_enabled)
 AC_SUBST(dist_plugins_base)
 AC_SUBST(dist_plugins_standard)
diff --git a/plugins/exchange-operations/Makefile.am b/plugins/exchange-operations/Makefile.am
index 933da52..1e7cdd1 100644
--- a/plugins/exchange-operations/Makefile.am
+++ b/plugins/exchange-operations/Makefile.am
@@ -5,19 +5,12 @@ AM_CPPFLAGS = -I .						\
 	-I$(top_builddir)/composer			\
 	-I$(top_builddir)/mail				\
 	$(CAMEL_EXCHANGE_CFLAGS)                        \
-	$(EVOLUTION_MAIL_CFLAGS)			\
-	-DEVOLUTION_GLADEDIR=\""$(gladedir)"\"          \
-	-DCONNECTOR_GLADEDIR=\""$(gladedir)"\"
+	$(EVOLUTION_MAIL_CFLAGS)
 
 
 @EVO_PLUGIN_RULE@
 
-plugin_DATA = org-gnome-exchange-operations.eplug 	\
-	org-gnome-folder-permissions.xml		\
-	org-gnome-folder-subscription.xml		\
-	org-gnome-exchange-tasks-subscription.xml	\
-	org-gnome-exchange-cal-subscription.xml		\
-	org-gnome-exchange-ab-subscription.xml
+plugin_DATA = org-gnome-exchange-operations.eplug
 
 plugin_LTLIBRARIES = liborg-gnome-exchange-operations.la
 
@@ -52,36 +45,20 @@ liborg_gnome_exchange_operations_la_SOURCES = 		\
 liborg_gnome_exchange_operations_la_LIBADD = 			\
 	$(top_builddir)/e-util/libeutil.la 			\
 	$(top_builddir)/widgets/misc/libemiscwidgets.la		\
+	$(top_builddir)/shell/libeshell.la			\
 	$(top_builddir)/calendar/gui/libevolution-calendar.la 	\
 	$(top_builddir)/mail/libevolution-mail.la 		\
-	$(top_builddir)/addressbook/gui/component/libevolution-addressbook.la \
 	$(CAMEL_EXCHANGE_LIBS)					\
 	$(EVOLUTION_MAIL_LIBS)
 
 liborg_gnome_exchange_operations_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED)
 
-glade_DATA =							\
-	exchange-change-password.glade				\
-	exchange-delegates.glade				\
-	exchange-folder-tree.glade				\
-	exchange-permissions-dialog.glade			\
-	e-foreign-folder-dialog.glade				\
-	exchange-passwd-expiry.glade				\
-	exchange-oof.glade					\
-	exchange-send-options.glade
-
 error_DATA = org-gnome-exchange-operations.error
 errordir = $(privdatadir)/errors
 
 EXTRA_DIST = 							\
 	org-gnome-exchange-operations.eplug.xml			\
-	org-gnome-exchange-operations.error.xml			\
-	org-gnome-folder-permissions.xml			\
-	org-gnome-folder-subscription.xml			\
-	org-gnome-exchange-tasks-subscription.xml		\
-	org-gnome-exchange-cal-subscription.xml			\
-	org-gnome-exchange-ab-subscription.xml			\
-	$(glade_DATA)						
+	org-gnome-exchange-operations.error.xml
 
 BUILT_SOURCES = $(error_DATA) org-gnome-exchange-operations.eplug 
 
diff --git a/plugins/exchange-operations/exchange-account-setup.c b/plugins/exchange-operations/exchange-account-setup.c
index 5943d5f..f1b64d3 100644
--- a/plugins/exchange-operations/exchange-account-setup.c
+++ b/plugins/exchange-operations/exchange-account-setup.c
@@ -32,7 +32,6 @@
 #include <sys/stat.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <glade/glade.h>
 #include <gconf/gconf-client.h>
 #include <camel/camel-provider.h>
 #include <camel/camel-url.h>
diff --git a/plugins/exchange-operations/exchange-change-password.c b/plugins/exchange-operations/exchange-change-password.c
index 82382f6..68e93ab 100644
--- a/plugins/exchange-operations/exchange-change-password.c
+++ b/plugins/exchange-operations/exchange-change-password.c
@@ -29,38 +29,32 @@
 #include <exchange-account.h>
 #include <e2k-utils.h>
 
-#include <glade/glade-xml.h>
 #include <gtk/gtk.h>
 
-#define FILENAME EVOLUTION_GLADEDIR "/exchange-change-password.glade"
-#define ROOTNODE "pass_dialog"
-#define STARTNODE "pass_vbox"
-
 static void
 entry_changed (GtkEntry *entry, gpointer user_data)
 {
-	GladeXML *xml = user_data;
 	GtkEntry *new_entry, *confirm_entry;
-	GtkWidget *ok_button;
+	GtkDialog *pass_dialog;
 	const gchar *text;
 
-        new_entry = GTK_ENTRY (glade_xml_get_widget (xml, "new_pass_entry"));
-        confirm_entry = GTK_ENTRY (glade_xml_get_widget (xml, "confirm_pass_entry"));
-	ok_button = glade_xml_get_widget (xml, "okbutton1");
+        new_entry = GTK_ENTRY (entry);
+        confirm_entry = GTK_ENTRY (user_data);
+	pass_dialog = GTK_DIALOG (g_object_get_data (G_OBJECT (new_entry), "pass_dialog"));
 
 	text = gtk_entry_get_text (new_entry);
 	if (!text || !*text) {
-		gtk_widget_set_sensitive (ok_button, FALSE);
+		gtk_dialog_set_response_sensitive (pass_dialog, GTK_RESPONSE_OK, FALSE);
 		return;
 	}
 
 	text = gtk_entry_get_text (confirm_entry);
 	if (!text || !*text) {
-		gtk_widget_set_sensitive (ok_button, FALSE);
+		gtk_dialog_set_response_sensitive (pass_dialog, GTK_RESPONSE_OK, FALSE);
 		return;
 	}
 
-	gtk_widget_set_sensitive (ok_button, TRUE);
+	gtk_dialog_set_response_sensitive (pass_dialog, GTK_RESPONSE_OK, TRUE);
 }
 
 /**
@@ -74,52 +68,119 @@ entry_changed (GtkEntry *entry, gpointer user_data)
 gchar *
 exchange_get_new_password (const gchar *existing_password, gboolean voluntary)
 {
-	GladeXML *xml;
-	GtkWidget *top_widget;
-	GtkEntry *cur_entry, *new_entry, *confirm_entry;
 	GtkResponseType response;
-	GtkLabel *top_label;
 	gchar *new_pass;
+	GtkWidget *pass_dialog;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *pass_label;
+	GtkWidget *table1;
+	GtkWidget *current_pass_label;
+	GtkWidget *new_pass_label;
+	GtkWidget *confirm_pass_label;
+	GtkWidget *current_pass_entry;
+	GtkWidget *new_pass_entry;
+	GtkWidget *confirm_pass_entry;
+
+	pass_dialog = gtk_dialog_new_with_buttons (
+		_("Change Password"),
+		NULL,
+		GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (pass_dialog));
+	gtk_widget_show (dialog_vbox1);
+
+	pass_label = gtk_label_new (_("Your current password has expired. Please change your password now."));
+	gtk_widget_show (pass_label);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), pass_label, FALSE, FALSE, 0);
+	gtk_label_set_justify (GTK_LABEL (pass_label), GTK_JUSTIFY_CENTER);
+	gtk_label_set_line_wrap (GTK_LABEL (pass_label), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (pass_label), 0.52, 0.5);
+	gtk_misc_set_padding (GTK_MISC (pass_label), 0, 6);
+
+	table1 = gtk_table_new (3, 2, FALSE);
+	gtk_widget_show (table1);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (table1), 6);
+	gtk_table_set_row_spacings (GTK_TABLE (table1), 6);
+	gtk_table_set_col_spacings (GTK_TABLE (table1), 6);
+
+	current_pass_label = gtk_label_new_with_mnemonic (_("Current _Password:"));
+	gtk_widget_show (current_pass_label);
+	gtk_table_attach (GTK_TABLE (table1), current_pass_label, 0, 1, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (current_pass_label), 0, 0.5);
+
+	new_pass_label = gtk_label_new_with_mnemonic (_("_New Password:"));
+	gtk_widget_show (new_pass_label);
+	gtk_table_attach (GTK_TABLE (table1), new_pass_label, 0, 1, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (new_pass_label), 0, 0.5);
+
+	confirm_pass_label = gtk_label_new_with_mnemonic (_("_Confirm Password:"));
+	gtk_widget_show (confirm_pass_label);
+	gtk_table_attach (GTK_TABLE (table1), confirm_pass_label, 0, 1, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (confirm_pass_label), 0, 0.5);
+
+	new_pass_entry = gtk_entry_new ();
+	gtk_widget_show (new_pass_entry);
+	gtk_table_attach (GTK_TABLE (table1), new_pass_entry, 1, 2, 1, 2,
+			  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_entry_set_visibility (GTK_ENTRY (new_pass_entry), FALSE);
+
+	confirm_pass_entry = gtk_entry_new ();
+	gtk_widget_show (confirm_pass_entry);
+	gtk_table_attach (GTK_TABLE (table1), confirm_pass_entry, 1, 2, 2, 3,
+			  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_entry_set_visibility (GTK_ENTRY (confirm_pass_entry), FALSE);
+
+	current_pass_entry = gtk_entry_new ();
+	gtk_widget_show (current_pass_entry);
+	gtk_table_attach (GTK_TABLE (table1), current_pass_entry, 1, 2, 0, 1,
+			  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 12);
+	gtk_entry_set_visibility (GTK_ENTRY (current_pass_entry), FALSE);
+
+	g_object_set_data (G_OBJECT (new_pass_entry), "pass_dialog", pass_dialog);
+	g_object_set_data (G_OBJECT (confirm_pass_entry), "pass_dialog", pass_dialog);
+	g_signal_connect (new_pass_entry, "changed", G_CALLBACK (entry_changed), confirm_pass_entry);
+	g_signal_connect (confirm_pass_entry, "changed", G_CALLBACK (entry_changed), new_pass_entry);
+	entry_changed (GTK_ENTRY (new_pass_entry), confirm_pass_entry);
 
-	xml = glade_xml_new (FILENAME, ROOTNODE, NULL);
-	top_widget = glade_xml_get_widget (xml, ROOTNODE);
-
-        cur_entry = GTK_ENTRY (glade_xml_get_widget (xml, "current_pass_entry"));
-        new_entry = GTK_ENTRY (glade_xml_get_widget (xml, "new_pass_entry"));
-	g_signal_connect (new_entry, "changed",
-			  G_CALLBACK (entry_changed), xml);
-        confirm_entry = GTK_ENTRY (glade_xml_get_widget (xml, "confirm_pass_entry"));
-	g_signal_connect (confirm_entry, "changed",
-			  G_CALLBACK (entry_changed), xml);
-	entry_changed (NULL, xml);
-
-	top_label = GTK_LABEL (glade_xml_get_widget (xml, "pass_label"));
 	if (voluntary)
-		gtk_widget_hide (GTK_WIDGET (top_label));
+		gtk_widget_hide (GTK_WIDGET (pass_label));
 
 run_dialog_again:
-	response = gtk_dialog_run (GTK_DIALOG (top_widget));
+	response = gtk_dialog_run (GTK_DIALOG (pass_dialog));
 	if (response == GTK_RESPONSE_OK) {
 		const gchar *cur_pass, *new_pass1, *new_pass2;
 
-		cur_pass = gtk_entry_get_text (cur_entry);
-		new_pass1 = gtk_entry_get_text (new_entry);
-		new_pass2 = gtk_entry_get_text (confirm_entry);
+		cur_pass = gtk_entry_get_text (GTK_ENTRY (current_pass_entry));
+		new_pass1 = gtk_entry_get_text (GTK_ENTRY (new_pass_entry));
+		new_pass2 = gtk_entry_get_text (GTK_ENTRY (confirm_pass_entry));
 
 		if (existing_password) {
 			if (strcmp (cur_pass, existing_password) != 0) {
 				/* User entered a wrong existing
 				 * password. Prompt him again.
 				 */
-				gtk_label_set_text (top_label, _("The current password does not match the existing password for your account. Please enter the correct password"));
-				gtk_widget_show (GTK_WIDGET (top_label));
+				gtk_label_set_text (GTK_LABEL (pass_label), _("The current password does not match the existing password for your account. Please enter the correct password"));
+				gtk_widget_show (pass_label);
 				goto run_dialog_again;
 			}
 		}
 
 		if (strcmp (new_pass1, new_pass2) != 0) {
-			gtk_label_set_text (top_label, _("The two passwords do not match. Please re-enter the passwords."));
-			gtk_widget_show (GTK_WIDGET (top_label));
+			gtk_label_set_text (GTK_LABEL (pass_label), _("The two passwords do not match. Please re-enter the passwords."));
+			gtk_widget_show (pass_label);
 			goto run_dialog_again;
 		}
 
@@ -127,8 +188,7 @@ run_dialog_again:
 	} else
 		new_pass = NULL;
 
-	gtk_widget_destroy (top_widget);
-	g_object_unref (xml);
+	gtk_widget_destroy (pass_dialog);
 
 	return new_pass;
 }
diff --git a/plugins/exchange-operations/exchange-config-listener.c b/plugins/exchange-operations/exchange-config-listener.c
index 2c16d2f..dc6582b 100644
--- a/plugins/exchange-operations/exchange-config-listener.c
+++ b/plugins/exchange-operations/exchange-config-listener.c
@@ -23,6 +23,9 @@
 #include <config.h>
 #endif
 
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
 #include "exchange-config-listener.h"
 #include "exchange-operations.h"
 #include "exchange-change-password.h"
@@ -41,14 +44,10 @@
 #include <libedataserver/e-source-list.h>
 #include <libedataserver/e-source-group.h>
 #include <libedataserverui/e-passwords.h>
-#include <glade/glade-xml.h>
 
 #include <stdlib.h>
 #include <string.h>
 
-#define FILENAME CONNECTOR_GLADEDIR "/exchange-passwd-expiry.glade"
-#define ROOTNODE "passwd_exp_dialog"
-
 struct _ExchangeConfigListenerPrivate {
 	GConfClient *gconf;
 	guint idle_id;
@@ -649,23 +648,52 @@ change_passwd_cb (GtkWidget *button, ExchangeAccount *account)
 static void
 display_passwd_expiry_message (gint max_passwd_age, ExchangeAccount *account)
 {
-	GladeXML *xml;
-	GtkWidget *top_widget, *change_passwd_button;
 	GtkResponseType response;
-	GtkLabel *warning_msg_label;
+	GtkWidget *passwd_exp_dialog;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *dialog_action_area1;
+	GtkWidget *change_passwd_button;
+	GtkWidget *warning_msg_label;
+	GtkWidget *ok_button;
+	AtkObject *atko;
 	gchar *passwd_expiry_msg =
 		g_strdup_printf (_("Your password will expire in the next %d days"), max_passwd_age);
 
-	xml = glade_xml_new (FILENAME, ROOTNODE, NULL);
-	g_return_if_fail (xml != NULL);
-	top_widget = glade_xml_get_widget (xml, ROOTNODE);
-	g_return_if_fail (top_widget != NULL);
 
-	warning_msg_label = GTK_LABEL (glade_xml_get_widget (xml,
-						"passwd_exp_label"));
-	gtk_label_set_text (warning_msg_label, passwd_expiry_msg);
-	change_passwd_button = glade_xml_get_widget (xml,
-						"change_passwd_button");
+	passwd_exp_dialog = gtk_dialog_new ();
+	gtk_window_set_title (GTK_WINDOW (passwd_exp_dialog), _("Password Expiry Warning..."));
+	gtk_window_set_position (GTK_WINDOW (passwd_exp_dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+	gtk_window_set_type_hint (GTK_WINDOW (passwd_exp_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (passwd_exp_dialog));
+	gtk_widget_show (dialog_vbox1);
+
+	warning_msg_label = gtk_label_new (passwd_expiry_msg);
+	gtk_widget_show (warning_msg_label);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), warning_msg_label, FALSE, FALSE, 0);
+	gtk_label_set_justify (GTK_LABEL (warning_msg_label), GTK_JUSTIFY_CENTER);
+	gtk_misc_set_padding (GTK_MISC (warning_msg_label), 0, 20);
+
+	dialog_action_area1 = gtk_dialog_get_action_area (GTK_DIALOG (passwd_exp_dialog));
+	gtk_widget_show (dialog_action_area1);
+	gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
+
+	change_passwd_button = gtk_button_new_with_mnemonic (_("_Change Password"));
+	gtk_widget_show (change_passwd_button);
+	gtk_dialog_add_action_widget (GTK_DIALOG (passwd_exp_dialog), change_passwd_button, 0);
+	GTK_WIDGET_SET_FLAGS (change_passwd_button, GTK_CAN_DEFAULT);
+
+	ok_button = gtk_button_new_from_stock ("gtk-ok");
+	gtk_widget_show (ok_button);
+	gtk_dialog_add_action_widget (GTK_DIALOG (passwd_exp_dialog), ok_button, GTK_RESPONSE_OK);
+	GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
+
+	atko = gtk_widget_get_accessible (ok_button);
+	atk_object_set_name (atko, "ok_button");
+
+	gtk_widget_grab_focus (change_passwd_button);
+	gtk_widget_grab_default (change_passwd_button);
+
 	gtk_widget_set_sensitive (change_passwd_button, TRUE);
 #ifdef HAVE_KRB5
 	g_signal_connect (change_passwd_button,
@@ -673,13 +701,113 @@ display_passwd_expiry_message (gint max_passwd_age, ExchangeAccount *account)
 			  G_CALLBACK (change_passwd_cb),
 			  account);
 #endif
-	response = gtk_dialog_run (GTK_DIALOG (top_widget));
+	response = gtk_dialog_run (GTK_DIALOG (passwd_exp_dialog));
 
-	gtk_widget_destroy (top_widget);
-	g_object_unref (xml);
+	gtk_widget_destroy (passwd_exp_dialog);
 	g_free (passwd_expiry_msg);
 }
 
+static gint
+run_oof_dialog (void)
+{
+	GtkWidget *oof_dialog;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *hbox9;
+	GtkWidget *image3;
+	GtkWidget *label7;
+	GtkWidget *dialog_action_area1;
+	GtkWidget *button3;
+	GtkWidget *alignment3;
+	GtkWidget *hbox6;
+	GtkWidget *image7;
+	GtkWidget *label10;
+	GtkWidget *button4;
+	GtkWidget *alignment4;
+	GtkWidget *hbox7;
+	GtkWidget *image8;
+	GtkWidget *label11;
+	gchar *tmp_str;
+	gint res;
+
+	oof_dialog = gtk_dialog_new ();
+	gtk_container_set_border_width (GTK_CONTAINER (oof_dialog), 6);
+	gtk_window_set_title (GTK_WINDOW (oof_dialog), _("Out of Office Assistant"));
+	gtk_window_set_position (GTK_WINDOW (oof_dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+	gtk_window_set_resizable (GTK_WINDOW (oof_dialog), FALSE);
+	gtk_window_set_type_hint (GTK_WINDOW (oof_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (oof_dialog));
+	gtk_widget_show (dialog_vbox1);
+
+	hbox9 = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox9);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox9, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (hbox9), 6);
+
+	image3 = gtk_image_new_from_stock ("gtk-dialog-question", GTK_ICON_SIZE_DIALOG);
+	gtk_widget_show (image3);
+	gtk_box_pack_start (GTK_BOX (hbox9), image3, FALSE, TRUE, 0);
+
+	tmp_str = g_strconcat ("<b>", _("Currently, your status is \"Out of the Office\"."), "</b>\n\n", _("Would you like to change your status to \"In the Office\"?"), NULL);
+	label7 = gtk_label_new (tmp_str);
+	g_free (tmp_str);
+	gtk_widget_show (label7);
+	gtk_box_pack_start (GTK_BOX (hbox9), label7, TRUE, TRUE, 0);
+	gtk_label_set_use_markup (GTK_LABEL (label7), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
+
+	dialog_action_area1 = gtk_dialog_get_action_area (GTK_DIALOG (oof_dialog));
+	gtk_widget_show (dialog_action_area1);
+	gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
+
+	button3 = gtk_button_new ();
+	gtk_widget_show (button3);
+	gtk_dialog_add_action_widget (GTK_DIALOG (oof_dialog), button3, GTK_RESPONSE_NO);
+	GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
+
+	alignment3 = gtk_alignment_new (0.5, 0.5, 0, 0);
+	gtk_widget_show (alignment3);
+	gtk_container_add (GTK_CONTAINER (button3), alignment3);
+
+	hbox6 = gtk_hbox_new (FALSE, 2);
+	gtk_widget_show (hbox6);
+	gtk_container_add (GTK_CONTAINER (alignment3), hbox6);
+
+	image7 = gtk_image_new_from_stock ("gtk-no", GTK_ICON_SIZE_BUTTON);
+	gtk_widget_show (image7);
+	gtk_box_pack_start (GTK_BOX (hbox6), image7, FALSE, FALSE, 0);
+
+	label10 = gtk_label_new_with_mnemonic (_("_No, Don't Change Status"));
+	gtk_widget_show (label10);
+	gtk_box_pack_start (GTK_BOX (hbox6), label10, FALSE, FALSE, 0);
+
+	button4 = gtk_button_new ();
+	gtk_widget_show (button4);
+	gtk_dialog_add_action_widget (GTK_DIALOG (oof_dialog), button4, GTK_RESPONSE_YES);
+	GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
+
+	alignment4 = gtk_alignment_new (0.5, 0.5, 0, 0);
+	gtk_widget_show (alignment4);
+	gtk_container_add (GTK_CONTAINER (button4), alignment4);
+
+	hbox7 = gtk_hbox_new (FALSE, 2);
+	gtk_widget_show (hbox7);
+	gtk_container_add (GTK_CONTAINER (alignment4), hbox7);
+
+	image8 = gtk_image_new_from_stock ("gtk-yes", GTK_ICON_SIZE_BUTTON);
+	gtk_widget_show (image8);
+	gtk_box_pack_start (GTK_BOX (hbox7), image8, FALSE, FALSE, 0);
+
+	label11 = gtk_label_new_with_mnemonic (_("_Yes, Change Status"));
+	gtk_widget_show (label11);
+	gtk_box_pack_start (GTK_BOX (hbox7), label11, FALSE, FALSE, 0);
+
+	res = gtk_dialog_run (GTK_DIALOG (oof_dialog));
+	gtk_widget_destroy (oof_dialog);
+
+	return res;
+}
+
 ExchangeAccountResult
 exchange_config_listener_authenticate (ExchangeConfigListener *ex_conf_listener, ExchangeAccount *account)
 {
@@ -787,9 +915,6 @@ exchange_config_listener_authenticate (ExchangeConfigListener *ex_conf_listener,
 	}
 	if (result == EXCHANGE_ACCOUNT_CONNECT_SUCCESS) {
 		gint max_pwd_age_days;
-		GladeXML *xml;
-		GtkWidget *dialog;
-		GtkResponseType response;
 		gboolean oof;
 
 		/* check for password expiry warning */
@@ -802,25 +927,7 @@ exchange_config_listener_authenticate (ExchangeConfigListener *ex_conf_listener,
 		if (exchange_oof_get (account, &oof, NULL)) {
 			if (oof) {
 				/* OOF state is set, check if user wants to set it back to in-office */
-				xml = glade_xml_new (CONNECTOR_GLADEDIR "/exchange-oof.glade",
-						     "oof_dialog", NULL);
-				if (!xml) {
-					e_error_run (NULL, "org-gnome-exchange-operations:state-update-error", NULL);
-					return result;
-				}
-
-				dialog = glade_xml_get_widget (xml, "oof_dialog");
-				if (!dialog) {
-					e_error_run (NULL, "org-gnome-exchange-operations:state-update-error", NULL);
-					g_object_unref (xml);
-					return result;
-				}
-
-				response = gtk_dialog_run (GTK_DIALOG (dialog));
-				gtk_widget_destroy (dialog);
-				g_object_unref (xml);
-
-				if (response == GTK_RESPONSE_YES)
+				if (run_oof_dialog () == GTK_RESPONSE_YES)
 					if (!exchange_oof_set (account, FALSE, NULL))
 						e_error_run (NULL, "org-gnome-exchange-operations:state-update-error", NULL);
 			}
diff --git a/plugins/exchange-operations/exchange-delegates-user.c b/plugins/exchange-operations/exchange-delegates-user.c
index 555b0ee..faf8061 100644
--- a/plugins/exchange-operations/exchange-delegates-user.c
+++ b/plugins/exchange-operations/exchange-delegates-user.c
@@ -29,8 +29,8 @@
 #include "exchange-delegates-user.h"
 
 #include <mail/mail-ops.h>
-#include <mail/mail-component.h>
 #include <mail/mail-send-recv.h>
+#include <mail/e-mail-local.h>
 #include <camel/camel-multipart.h>
 #include <camel/camel-mime-utils.h>
 #include <camel/camel-stream-mem.h>
@@ -44,7 +44,6 @@
 
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-dialog-widgets.h>
-#include <glade/glade.h>
 
 #include <string.h>
 
@@ -75,10 +74,6 @@ static const gchar *folder_names_for_display[] = {
 	N_("Calendar"), N_("Tasks"), N_("Inbox"), N_("Contacts")
 };
 
-static const gchar *widget_names[] = {
-	"calendar_perms_combobox", "task_perms_combobox", "inbox_perms_combobox", "contact_perms_combobox",
-};
-
 enum {
 	EDITED,
 	LAST_SIGNAL
@@ -206,69 +201,186 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 			     ExchangeDelegatesUser *user,
 			     GtkWidget *parent_window)
 {
-	GladeXML *xml;
-	GtkWidget *dialog, *table, *label, *combobox, *check, *check_delegate;
 	gchar *title;
 	gint button, i;
 	E2kPermissionsRole role;
 	gboolean modified;
+	GtkWidget *delegate_permissions;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *vbox3;
+	GtkWidget *delegate_label;
+	GtkWidget *folders_table;
+	GtkWidget *calendar_label;
+	GtkWidget *task_label;
+	GtkWidget *inbox_label;
+	GtkWidget *contact_label;
+	GtkWidget *calendar_perms_combobox;
+	GtkWidget *task_perms_combobox;
+	GtkWidget *inbox_perms_combobox;
+	GtkWidget *contact_perms_combobox;
+	GtkWidget *delegate_mail;
+	GtkWidget *see_private_checkbox;
+	GtkWidget *combobox, *comboboxes[EXCHANGE_DELEGATES_LAST];
 
 	g_return_val_if_fail (EXCHANGE_IS_DELEGATES_USER (user), FALSE);
 	g_return_val_if_fail (E2K_IS_SID (user->sid), FALSE);
 
-	/* Grab the Glade widgets */
-	xml = glade_xml_new (
-		CONNECTOR_GLADEDIR "/exchange-delegates.glade",
-		"delegate_permissions", PACKAGE);
-	g_return_val_if_fail (xml, FALSE);
-
-	title = g_strdup (_("Delegate Permissions"));
-
-	dialog = glade_xml_get_widget (xml, "delegate_permissions");
-	gtk_window_set_title (GTK_WINDOW (dialog), title);
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
-	g_free (title);
-
-	table = glade_xml_get_widget (xml, "toplevel_table");
-	gtk_widget_reparent (table, GTK_DIALOG (dialog)->vbox);
-	gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 6);
+	delegate_permissions = gtk_dialog_new_with_buttons (
+		_("Delegate Permissions"),
+		NULL,
+		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+
+	if (parent_window)
+		gtk_window_set_transient_for (GTK_WINDOW (delegate_permissions), parent_window);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (delegate_permissions));
+	gtk_widget_show (dialog_vbox1);
+
+	vbox3 = gtk_vbox_new (FALSE, 12);
+	gtk_widget_show (vbox3);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox3, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (vbox3), 12);
+
+	delegate_label = gtk_label_new (_("Permissions for"));
+	gtk_widget_show (delegate_label);
+	gtk_box_pack_start (GTK_BOX (vbox3), delegate_label, FALSE, FALSE, 0);
+	gtk_label_set_justify (GTK_LABEL (delegate_label), GTK_JUSTIFY_CENTER);
+
+	folders_table = gtk_table_new (4, 2, FALSE);
+	gtk_widget_show (folders_table);
+	gtk_box_pack_start (GTK_BOX (vbox3), folders_table, FALSE, FALSE, 0);
+	gtk_table_set_row_spacings (GTK_TABLE (folders_table), 6);
+	gtk_table_set_col_spacings (GTK_TABLE (folders_table), 6);
+
+	/* Translators: This is used for permissions for <user> for the folder Calendar. */
+	calendar_label = gtk_label_new_with_mnemonic (_("C_alendar:"));
+	gtk_widget_show (calendar_label);
+	gtk_table_attach (GTK_TABLE (folders_table), calendar_label, 0, 1, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (calendar_label), GTK_JUSTIFY_CENTER);
+	gtk_misc_set_alignment (GTK_MISC (calendar_label), 0, 0.5);
+
+	/* Translators: This is used for permissions for <user> for the folder Tasks. */
+	task_label = gtk_label_new_with_mnemonic (_("_Tasks:"));
+	gtk_widget_show (task_label);
+	gtk_table_attach (GTK_TABLE (folders_table), task_label, 0, 1, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (task_label), GTK_JUSTIFY_CENTER);
+	gtk_misc_set_alignment (GTK_MISC (task_label), 0, 0.5);
+
+	/* Translators: This is used for permissions for <user> for the folder Inbox. */
+	inbox_label = gtk_label_new_with_mnemonic (_("_Inbox:"));
+	gtk_widget_show (inbox_label);
+	gtk_table_attach (GTK_TABLE (folders_table), inbox_label, 0, 1, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (inbox_label), GTK_JUSTIFY_CENTER);
+	gtk_misc_set_alignment (GTK_MISC (inbox_label), 0, 0.5);
+
+	/* Translators: This is used for permissions for <user> for the folder Contacts. */
+	contact_label = gtk_label_new_with_mnemonic (_("Co_ntacts:"));
+	gtk_widget_show (contact_label);
+	gtk_table_attach (GTK_TABLE (folders_table), contact_label, 0, 1, 3, 4,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (contact_label), GTK_JUSTIFY_CENTER);
+	gtk_misc_set_alignment (GTK_MISC (contact_label), 0, 0.5);
+
+	calendar_perms_combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (calendar_perms_combobox);
+	gtk_table_attach (GTK_TABLE (folders_table), calendar_perms_combobox, 1, 2, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (calendar_perms_combobox), _("None"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (calendar_perms_combobox), _("Reviewer (read-only)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (calendar_perms_combobox), _("Author (read, create)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (calendar_perms_combobox), _("Editor (read, create, edit)"));
+
+	task_perms_combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (task_perms_combobox);
+	gtk_table_attach (GTK_TABLE (folders_table), task_perms_combobox, 1, 2, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (task_perms_combobox), _("None"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (task_perms_combobox), _("Reviewer (read-only)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (task_perms_combobox), _("Author (read, create)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (task_perms_combobox), _("Editor (read, create, edit)"));
+
+	inbox_perms_combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (inbox_perms_combobox);
+	gtk_table_attach (GTK_TABLE (folders_table), inbox_perms_combobox, 1, 2, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (inbox_perms_combobox), _("None"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (inbox_perms_combobox), _("Reviewer (read-only)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (inbox_perms_combobox), _("Author (read, create)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (inbox_perms_combobox), _("Editor (read, create, edit)"));
+
+	contact_perms_combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (contact_perms_combobox);
+	gtk_table_attach (GTK_TABLE (folders_table), contact_perms_combobox, 1, 2, 3, 4,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (contact_perms_combobox), _("None"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (contact_perms_combobox), _("Reviewer (read-only)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (contact_perms_combobox), _("Author (read, create)"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (contact_perms_combobox), _("Editor (read, create, edit)"));
+
+	delegate_mail = gtk_check_button_new_with_mnemonic (_("_Summarize permissions"));
+	gtk_widget_show (delegate_mail);
+	gtk_box_pack_start (GTK_BOX (vbox3), delegate_mail, FALSE, FALSE, 0);
+
+	see_private_checkbox = gtk_check_button_new_with_mnemonic (_("_Delegate can see private items"));
+	gtk_widget_show (see_private_checkbox);
+	gtk_box_pack_start (GTK_BOX (vbox3), see_private_checkbox, FALSE, FALSE, 0);
+
+	gtk_box_set_spacing (GTK_BOX (dialog_vbox1), 6);
 
 	title = g_strdup_printf (_("Permissions for %s"), user->display_name);
-	label = glade_xml_get_widget (xml, "delegate_label");
-	gtk_label_set_text (GTK_LABEL (label), title);
+	gtk_label_set_text (GTK_LABEL (delegate_label), title);
 	g_free (title);
 
+	comboboxes[0] = calendar_perms_combobox;
+	comboboxes[1] = task_perms_combobox;
+	comboboxes[2] = inbox_perms_combobox;
+	comboboxes[3] = contact_perms_combobox;
+
 	/* Set up the permissions */
 	for (i = 0; i < EXCHANGE_DELEGATES_LAST; i++) {
-		combobox = glade_xml_get_widget (xml, widget_names[i]);
+		combobox = comboboxes[i];
 		set_perms (combobox, user->role[i]);
 	}
-	check = glade_xml_get_widget (xml, "see_private_checkbox");
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (see_private_checkbox),
 				      user->see_private);
 
 	/* Run the dialog, while watching its parent. */
 	g_object_weak_ref (G_OBJECT (parent_window),
-			   parent_window_destroyed, dialog);
+			   parent_window_destroyed, delegate_permissions);
 	g_object_add_weak_pointer (G_OBJECT (parent_window),
 				   (gpointer*)&parent_window);
-	button = gtk_dialog_run (GTK_DIALOG (dialog));
+	button = gtk_dialog_run (GTK_DIALOG (delegate_permissions));
 	if (parent_window) {
 		g_object_remove_weak_pointer (G_OBJECT (parent_window),
 					      (gpointer *)&parent_window);
 		g_object_weak_unref (G_OBJECT (parent_window),
-				     parent_window_destroyed, dialog);
+				     parent_window_destroyed, delegate_permissions);
 	}
 
 	if (button != GTK_RESPONSE_OK) {
-		gtk_widget_destroy (dialog);
+		gtk_widget_destroy (delegate_permissions);
 		return FALSE;
 	}
 
 	/* And update */
 	modified = FALSE;
 	for (i = 0; i < EXCHANGE_DELEGATES_LAST; i++) {
-		combobox = glade_xml_get_widget (xml, widget_names[i]);
+		combobox = comboboxes[i];
 		role = e_dialog_combo_box_get (combobox, exchange_perm_map);
 
 		if (is_delegate_role (user->role[i]) &&
@@ -281,8 +393,7 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 	/* The following piece of code is used to construct a mail message to be sent to a Delegate
 	   summarizing all the permissions set for him on the user's various folders.
 	*/
-	check_delegate = glade_xml_get_widget (xml, "delegate_mail");
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_delegate)) == TRUE) {
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (delegate_mail)) == TRUE) {
 		if (button == GTK_RESPONSE_OK) {
 
 			EAccount *eaccount;
@@ -333,7 +444,7 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 			camel_stream_printf (stream,
 				"<html><body><p>%s<br><br>%s</p><table border = 0 width=\"40%%\">", msg_part1, msg_part2);
 			for (i = 0; i < EXCHANGE_DELEGATES_LAST; i++) {
-				combobox = glade_xml_get_widget (xml, widget_names[i]);
+				combobox = comboboxes[i];
 				role = e_dialog_combo_box_get (combobox, exchange_perm_map);
 				role_name = g_strdup (map_to_full_role_name(role));
 				g_string_append_printf (
@@ -344,7 +455,7 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 
 			camel_stream_printf (stream, "%s</table>", role_name_final->str);
 
-			if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)) == TRUE) {
+			if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (see_private_checkbox)) == TRUE) {
 				/* To translators: This message is included if the delegatee has been given access
 				   to the private items.
 				*/
@@ -419,7 +530,7 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 			}
 
 			/* Send the permissions summarizing mail */
-			out_folder = mail_component_get_folder (NULL, MAIL_COMPONENT_FOLDER_OUTBOX);
+			out_folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
 			info = camel_message_info_new (NULL);
 			camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
 			mail_append_mail (out_folder, delegate_mail, info, em_utils_delegates_done, NULL);
@@ -428,15 +539,13 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 
 	}
 
-	check = glade_xml_get_widget (xml, "see_private_checkbox");
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)) !=
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (see_private_checkbox)) !=
 	    user->see_private) {
 		user->see_private = !user->see_private;
 		modified = TRUE;
 	}
 
-	g_object_unref (xml);
-	gtk_widget_destroy (dialog);
+	gtk_widget_destroy (delegate_permissions);
 
 	if (modified)
 		g_signal_emit (user, signals[EDITED], 0);
diff --git a/plugins/exchange-operations/exchange-delegates.c b/plugins/exchange-operations/exchange-delegates.c
index dda48df..89da03e 100644
--- a/plugins/exchange-operations/exchange-delegates.c
+++ b/plugins/exchange-operations/exchange-delegates.c
@@ -44,7 +44,6 @@
 
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-error.h>
-#include <glade/glade-xml.h>
 
 typedef struct {
 	const gchar *uri;
@@ -56,7 +55,6 @@ typedef struct {
 	ExchangeAccount *account;
 	gchar *self_dn;
 
-	GladeXML *xml;
 	GtkWidget *dialog, *parent;
 
 	GtkListStore *model;
@@ -580,7 +578,7 @@ remove_button_clicked_cb (GtkWidget *widget, gpointer data)
 					 GTK_BUTTONS_YES_NO,
 					 _("Remove the delegate %s?"),
 					 user->display_name);
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), widget);
+	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gtk_widget_get_toplevel (widget)));
 
 	btn = gtk_dialog_run (GTK_DIALOG (dialog));
 	gtk_widget_destroy (dialog);
@@ -879,9 +877,6 @@ delegates_destroy (ExchangeDelegates *delegates)
 	if (delegates->freebusy_folder.uri)
 		g_free ((gchar *)delegates->freebusy_folder.uri);
 
-	if (delegates->xml)
-		g_object_unref (delegates->xml);
-
 	g_free (delegates);
 }
 
@@ -907,8 +902,16 @@ parent_destroyed (gpointer user_data, GObject *ex_parent)
 void
 exchange_delegates (ExchangeAccount *account, GtkWidget *parent)
 {
+	GtkWidget *dialog_vbox1;
+	GtkWidget *vbox2;
+	GtkWidget *label3;
+	GtkWidget *delegate_hbox;
+	GtkWidget *delegates_table;
+	GtkWidget *vbuttonbox1;
+	GtkWidget *add_button;
+	GtkWidget *edit_button;
+	GtkWidget *remove_button;
 	ExchangeDelegates *delegates;
-	GtkWidget *button;
 	ExchangeDelegatesUser *user;
 	GtkTreeViewColumn *column;
 	GtkTreeIter iter;
@@ -920,33 +923,75 @@ exchange_delegates (ExchangeAccount *account, GtkWidget *parent)
 	delegates = g_new0 (ExchangeDelegates, 1);
 	delegates->account = g_object_ref (account);
 
-	delegates->xml = glade_xml_new (CONNECTOR_GLADEDIR "/exchange-delegates.glade", NULL, NULL);
-	g_return_if_fail (delegates->xml != NULL);
-
-	delegates->dialog = glade_xml_get_widget (delegates->xml, "delegates");
-	g_return_if_fail (delegates->dialog != NULL);
+	delegates->dialog = gtk_dialog_new_with_buttons (
+		_("Delegates"),
+		NULL,
+		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (delegates->dialog));
+	gtk_widget_show (dialog_vbox1);
+
+	vbox2 = gtk_vbox_new (FALSE, 6);
+	gtk_widget_show (vbox2);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox2, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
+
+	label3 = gtk_label_new (_("These users will be able to send mail on your behalf\nand access your folders with the permissions you give them."));
+	gtk_widget_show (label3);
+	gtk_box_pack_start (GTK_BOX (vbox2), label3, FALSE, FALSE, 0);
+
+	delegate_hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (delegate_hbox);
+	gtk_box_pack_start (GTK_BOX (vbox2), delegate_hbox, TRUE, TRUE, 0);
+
+	delegates_table = gtk_tree_view_new ();
+	gtk_widget_show (delegates_table);
+	gtk_box_pack_start (GTK_BOX (delegate_hbox), delegates_table, TRUE, TRUE, 0);
+	gtk_tree_view_set_enable_search (GTK_TREE_VIEW (delegates_table), FALSE);
+
+	vbuttonbox1 = gtk_vbutton_box_new ();
+	gtk_widget_show (vbuttonbox1);
+	gtk_box_pack_end (GTK_BOX (delegate_hbox), vbuttonbox1, FALSE, TRUE, 0);
+	gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1), GTK_BUTTONBOX_START);
+	gtk_box_set_spacing (GTK_BOX (vbuttonbox1), 6);
+
+	add_button = gtk_button_new_from_stock ("gtk-add");
+	gtk_widget_show (add_button);
+	gtk_container_add (GTK_CONTAINER (vbuttonbox1), add_button);
+	GTK_WIDGET_SET_FLAGS (add_button, GTK_CAN_DEFAULT);
+
+	edit_button = gtk_button_new_with_mnemonic (_("_Edit"));
+	gtk_widget_show (edit_button);
+	gtk_container_add (GTK_CONTAINER (vbuttonbox1), edit_button);
+	GTK_WIDGET_SET_FLAGS (edit_button, GTK_CAN_DEFAULT);
+
+	remove_button = gtk_button_new_from_stock ("gtk-remove");
+	gtk_widget_show (remove_button);
+	gtk_container_add (GTK_CONTAINER (vbuttonbox1), remove_button);
+	GTK_WIDGET_SET_FLAGS (remove_button, GTK_CAN_DEFAULT);
 
 	g_signal_connect (delegates->dialog, "response",
 			  G_CALLBACK (dialog_response), delegates);
 
-	gtk_window_set_transient_for (GTK_WINDOW (delegates->dialog), parent);
+	if (parent)
+		gtk_window_set_transient_for (GTK_WINDOW (delegates->dialog), GTK_WINDOW (parent));
 	delegates->parent = parent;
 	g_object_weak_ref (G_OBJECT (parent), parent_destroyed, delegates);
 
 	/* Set up the buttons */
-	button = glade_xml_get_widget (delegates->xml, "add_button");
-	g_signal_connect (button, "clicked",
+	g_signal_connect (add_button, "clicked",
 			  G_CALLBACK (add_button_clicked_cb), delegates);
-	button = glade_xml_get_widget (delegates->xml, "edit_button");
-	g_signal_connect (button, "clicked",
+	g_signal_connect (edit_button, "clicked",
 			  G_CALLBACK (edit_button_clicked_cb), delegates);
-	button = glade_xml_get_widget (delegates->xml, "remove_button");
-	g_signal_connect (button, "clicked",
+	g_signal_connect (remove_button, "clicked",
 			  G_CALLBACK (remove_button_clicked_cb), delegates);
 
 	/* Set up the table */
 	delegates->model = gtk_list_store_new (1, G_TYPE_STRING);
-	delegates->table = glade_xml_get_widget (delegates->xml, "delegates_table");
+	delegates->table = delegates_table;
 	column = gtk_tree_view_column_new_with_attributes (
 		_("Name"), gtk_cell_renderer_text_new (), "text", 0, NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (delegates->table),
@@ -968,12 +1013,9 @@ exchange_delegates (ExchangeAccount *account, GtkWidget *parent)
 				  "button_press_event",
 				  G_CALLBACK (table_click_cb), delegates);
 	} else {
-		button = glade_xml_get_widget (delegates->xml, "add_button");
-		gtk_widget_set_sensitive (button, FALSE);
-		button = glade_xml_get_widget (delegates->xml, "edit_button");
-		gtk_widget_set_sensitive (button, FALSE);
-		button = glade_xml_get_widget (delegates->xml, "remove_button");
-		gtk_widget_set_sensitive (button, FALSE);
+		gtk_widget_set_sensitive (add_button, FALSE);
+		gtk_widget_set_sensitive (edit_button, FALSE);
+		gtk_widget_set_sensitive (remove_button, FALSE);
 
 		gtk_list_store_append (delegates->model, &iter);
 		gtk_list_store_set (delegates->model, &iter,
diff --git a/plugins/exchange-operations/exchange-folder-permission.c b/plugins/exchange-operations/exchange-folder-permission.c
index 7113ef8..200eea8 100644
--- a/plugins/exchange-operations/exchange-folder-permission.c
+++ b/plugins/exchange-operations/exchange-folder-permission.c
@@ -26,316 +26,502 @@
 #endif
 
 #include <glib/gi18n.h>
-#include <glade/glade.h>
 #include <gtk/gtk.h>
 #include <gconf/gconf-client.h>
-#include <exchange-account.h>
-#include <e-util/e-dialog-utils.h>
-#include <calendar/gui/e-cal-popup.h>
+
 #include <libedataserverui/e-source-selector.h>
-#include <camel/camel-url.h>
-#include <mail/em-popup.h>
-#include <mail/em-menu.h>
 #include <libebook/e-book.h>
+#include <camel/camel-url.h>
+
+#include <exchange-account.h>
+
+#include <e-util/e-dialog-utils.h>
+#include <calendar/gui/e-cal-model.h>
+
+#include <shell/e-shell-view.h>
+#include <shell/e-shell-window.h>
+
+#include <mail/em-folder-tree.h>
+#include <mail/em-folder-tree-model.h>
+
 #include "exchange-config-listener.h"
+#include "exchange-folder-subscription.h"
 #include "exchange-operations.h"
 #include "exchange-permissions-dialog.h"
-#include "addressbook/gui/widgets/eab-popup.h"
-#include "calendar/gui/e-cal-menu.h"
-#include "calendar/gui/e-cal-model.h"
-#include "addressbook/gui/widgets/eab-menu.h"
 
 #define d(x)
 
-static void org_folder_permissions_cb (EPopup *ep, EPopupItem *p, gpointer data);
-void org_gnome_exchange_folder_permissions (EPlugin *ep, EMPopupTargetFolder *t);
-void org_gnome_exchange_menu_folder_permissions (EPlugin *ep, EMMenuTargetSelect *target);
-void org_gnome_exchange_calendar_permissions (EPlugin *ep, ECalPopupTargetSource *target);
-void org_gnome_exchange_addressbook_permissions (EPlugin *ep, EABPopupTargetSource *target);
-void org_gnome_exchange_menu_ab_permissions (EPlugin *ep, EABMenuTargetSelect *target);
-void org_gnome_exchange_menu_tasks_permissions (EPlugin *ep, ECalMenuTargetSelect *target);
-void org_gnome_exchange_menu_cal_permissions (EPlugin *ep, ECalMenuTargetSelect *target);
+gboolean eex_ui_mail_init (GtkUIManager *ui_manager, EShellView *shell_view);
+gboolean eex_ui_calendar_permissions (GtkUIManager *ui_manager, EShellView *shell_view);
+gboolean eex_ui_tasks_permissions (GtkUIManager *ui_manager, EShellView *shell_view);
+gboolean eex_ui_addressbook_permissions (GtkUIManager *ui_manager, EShellView *shell_view);
 
-gchar *selected_exchange_folder_uri = NULL;
+static gboolean
+is_subscribed_folder (const gchar *uri)
+{
+	const gchar *path;
+	ExchangeAccount *account;
+	gint offset;
 
-static EPopupItem popup_items[] = {
-	{ E_POPUP_ITEM, (gchar *) "30.emc.10", (gchar *) N_("Permissions..."), org_folder_permissions_cb, NULL, (gchar *) "folder-new", 0, EM_POPUP_FOLDER_INFERIORS }
-};
+	g_return_val_if_fail (uri != NULL, FALSE);
+
+	account = exchange_operations_get_exchange_account ();
+	g_return_val_if_fail (account != NULL, FALSE);
+	g_return_val_if_fail (account->account_filename != NULL, FALSE);
+
+	offset = strlen ("exchange://") + strlen (account->account_filename) + strlen ("/;");
+	g_return_val_if_fail (strlen (uri) >= offset, FALSE);
+
+	path = uri + offset;
+
+	return strchr (path, '@') != NULL;
+}
 
 static void
-popup_free (EPopup *ep, GSList *items, gpointer data)
+call_folder_permissions (const gchar *uri)
 {
-       g_slist_free (items);
+	ExchangeAccount *account = NULL;
+	EFolder *folder = NULL;
+
+	g_return_if_fail (uri != NULL);
+
+	account = exchange_operations_get_exchange_account ();
+	if (!account)
+		return;
+
+	folder = exchange_account_get_folder (account, uri);
+	if (folder)
+		exchange_permissions_dialog_new (account, folder, NULL);
 }
 
-void
-org_gnome_exchange_calendar_permissions (EPlugin *ep, ECalPopupTargetSource *target)
+static gboolean
+is_eex_folder_selected (EShellView *shell_view, gchar **puri)
 {
-	GSList *menus = NULL;
-	gint i = 0, mode;
-	static gint first =0;
 	ExchangeAccount *account = NULL;
-	ESource *source = NULL;
+	gint mode;
+	EShellSidebar *shell_sidebar;
+	EMFolderTree *folder_tree = NULL;
+	GtkTreeSelection *selection;
+	GtkTreeModel *model = NULL;
+	GtkTreeIter iter;
+	gboolean is_store = FALSE, res;
 	gchar *uri = NULL;
 
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
-	uri = (gchar *) e_source_get_uri (source);
-	if (uri && ! g_strrstr (uri, "exchange://"))	{
-		return;
-	}
+	g_return_val_if_fail (shell_view != NULL, FALSE);
 
 	account = exchange_operations_get_exchange_account ();
 	if (!account)
-		return;
+		return FALSE;
+
 	exchange_account_is_offline (account, &mode);
 	if (mode == OFFLINE_MODE)
-		return;
-	if (!exchange_account_get_folder (account, uri))
-		return;
+		return FALSE;
+
+	shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+	g_object_get (shell_sidebar, "folder-tree", &folder_tree, NULL);
+	g_return_val_if_fail (folder_tree != NULL, FALSE);
+
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
+	g_return_val_if_fail (selection != NULL, FALSE);
+
+	if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+		return FALSE;
+
+	gtk_tree_model_get (model, &iter,
+		COL_STRING_URI, &uri,
+		COL_BOOL_IS_STORE, &is_store,
+		-1);
 
-	selected_exchange_folder_uri = uri;
+	res = !is_store && uri && g_ascii_strncasecmp (uri, "exchange://", 11) == 0;
 
-	/* for translation*/
-	if (!first) {
-		popup_items[0].label =  _(popup_items[0].label);
-		first++;
+	if (res) {
+		const gchar *path;
 
+		path = uri + strlen ("exchange://") + strlen (account->account_filename);
+		res = path && *path;
+
+		if (res) {
+			if (puri)
+				*puri = g_strdup (uri);
+		}
 	}
 
-	for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++)
-		menus = g_slist_prepend (menus, &popup_items[i]);
+	g_free (uri);
+
+	return res;
+}
+
+static void
+eex_mail_folder_permissions_cb (GtkAction *action, EShellView *shell_view)
+{
+	gchar *uri = NULL;
+
+	if (is_eex_folder_selected (shell_view, &uri))
+		call_folder_permissions (uri);
+
+	g_free (uri);
+}
+
+static void
+eex_folder_subscribe_cb (GtkAction *action, EShellView *shell_view)
+{
+	const gchar *name;
 
-	e_popup_add_items (target->target.popup, menus, NULL, popup_free, NULL);
+	name = gtk_action_get_name (action);
+	g_return_if_fail (name != NULL);
 
+	name = strrchr (name, '-');
+	g_return_if_fail (name != NULL && *name == '-');
+
+	call_folder_subscribe (name + 1);
 }
 
-void
-org_gnome_exchange_addressbook_permissions (EPlugin *ep, EABPopupTargetSource *target)
+static void
+eex_mail_folder_inbox_unsubscribe_cb (GtkAction *action, EShellView *shell_view)
 {
-	GSList *menus = NULL;
-	gint i = 0, mode;
-	static gint first =0;
-	ExchangeAccount *account = NULL;
-	ESource *source = NULL;
 	gchar *uri = NULL;
 
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
-	uri = (gchar *) e_source_get_uri (source);
-	if (!g_strrstr (uri, "exchange://"))
-		return;
+	if (is_eex_folder_selected (shell_view, &uri))
+		call_folder_unsubscribe ("Inbox", uri, NULL);
 
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+	g_free (uri);
+}
 
-	if (!exchange_account_get_folder (account, uri))
-		return;
+/* Beware, depends on the order */
+static GtkActionEntry mail_entries[] = {
+	{ "eex-mail-folder-permissions",
+	  "folder-new",
+	  N_("Permissions..."),
+	  NULL,
+	  N_("Check folder permissions"),
+	  G_CALLBACK (eex_mail_folder_permissions_cb) },
+
+	{ "eex-folder-subscribe-Inbox",
+	  NULL,
+	  N_("Subscribe to Other User's Folder..."),
+	  NULL,
+	  N_("Subscribe to Other User's Folder"),
+	  G_CALLBACK (eex_folder_subscribe_cb) },
+
+	{ "eex-mail-folder-inbox-unsubscribe",
+	  "folder-new",
+	  N_("Unsubscribe Folder..."),
+	  NULL,
+	  NULL,
+	  G_CALLBACK (eex_mail_folder_inbox_unsubscribe_cb) }
+};
+
+static void
+update_mail_entries_cb (EShellView *shell_view, gpointer user_data)
+{
+	GtkActionGroup *action_group;
+	EShellWindow *shell_window;
+	GtkAction *action;
+	gboolean is_eex;
+	gchar *uri = NULL;
+	gint i;
 
-	selected_exchange_folder_uri = uri;
+	g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
 
-	/* for translation*/
-	if (!first) {
-		popup_items[0].label =  _(popup_items[0].label);
-		first++;
+	is_eex = is_eex_folder_selected (shell_view, &uri);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+	action_group = e_shell_window_get_action_group (shell_window, "mail");
+
+	for (i = 0; i < G_N_ELEMENTS (mail_entries); i++) {
+		gboolean visible = is_eex;
+
+		action = gtk_action_group_get_action (action_group, mail_entries[i].name);
+		g_return_if_fail (action != NULL);
+
+		if (visible && i == 2) {
+			/* it's an unsubscribe, check if this is public and show/hide based on that */
+			visible = uri && is_subscribed_folder (uri);
+		}
+
+		gtk_action_set_visible (action, visible);
 	}
 
-	for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++)
-		menus = g_slist_prepend (menus, &popup_items[i]);
+	g_free (uri);
+}
+
+gboolean
+eex_ui_mail_init (GtkUIManager *ui_manager, EShellView *shell_view)
+{
+	EShellWindow *shell_window;
+
+	shell_window = e_shell_view_get_shell_window (shell_view);
+
+	gtk_action_group_add_actions (
+		e_shell_window_get_action_group (shell_window, "mail"),
+		mail_entries, G_N_ELEMENTS (mail_entries), shell_view);
 
-	e_popup_add_items (target->target.popup, menus, NULL, popup_free, NULL);
+	g_signal_connect (shell_view, "update-actions", G_CALLBACK (update_mail_entries_cb), NULL);
+
+	return TRUE;
 }
 
-void
-org_gnome_exchange_folder_permissions (EPlugin *ep, EMPopupTargetFolder *target)
+static gboolean
+is_eex_source_selected (EShellView *shell_view, gchar **puri)
 {
-	GSList *menus = NULL;
-	gint i = 0, mode;
-	static gint first =0;
-	gchar *path = NULL;
-	gchar *fixed_path = NULL;
+	gint mode;
 	ExchangeAccount *account = NULL;
+	ESource *source = NULL;
+	gchar *uri = NULL;
+	EShellSidebar *shell_sidebar;
+	ESourceSelector *selector = NULL;
 
-	d(g_print ("exchange-folder-permission.c: entry\n"));
+	shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+	g_return_val_if_fail (shell_sidebar != NULL, FALSE);
 
-	if (!g_strrstr (target->uri, "exchange://"))
-		return;
+	g_object_get (shell_sidebar, "selector", &selector, NULL);
+	g_return_val_if_fail (selector != NULL, FALSE);
+
+	source = e_source_selector_peek_primary_selection (selector);
+	uri = e_source_get_uri (source);
+
+	g_object_unref (selector);
+
+	if (uri && !g_strrstr (uri, "exchange://")) {
+		g_free (uri);
+		return FALSE;
+	}
 
 	account = exchange_operations_get_exchange_account ();
-	if (!account )
-		return;
+	if (!account) {
+		g_free (uri);
+		return FALSE;
+	}
+
 	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+	if (mode == OFFLINE_MODE) {
+		g_free (uri);
+		return FALSE;
+	}
 
-	path = target->uri + strlen ("exchange://") + strlen (account->account_filename);
+	if (!exchange_account_get_folder (account, uri)) {
+		g_free (uri);
+		return FALSE;
+	}
 
-	if (!path || !*path)
-		return;
+	if (puri)
+		*puri = uri;
+	else
+		g_free (uri);
 
-	fixed_path = camel_url_decode_path (path);
-	d(g_print ("exchange-folder-permission.c: path=[%s], fixed_path=[%s]\n", path, fixed_path));
+	return TRUE;
+}
 
-	if (! g_strrstr (target->uri, "exchange://") ||
-	    !exchange_account_get_folder (account, fixed_path)) {
-		g_free (fixed_path);
-		return;
-	}
+#define NUM_ENTRIES 3
 
-	g_free (fixed_path);
+static void
+update_source_entries_cb (EShellView *shell_view, GtkActionEntry *entries)
+{
+	GtkActionGroup *action_group;
+	EShellWindow *shell_window;
+	GtkAction *action;
+	const gchar *group;
+	gchar *uri = NULL;
+	gboolean is_eex;
+	gint i;
 
-	selected_exchange_folder_uri = path;
-	/* for translation*/
-	if (!first) {
-		popup_items[0].label =  _(popup_items[0].label);
-		first++;
-	}
+	g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+	g_return_if_fail (entries != NULL);
+
+	if (strstr (entries->name, "calendar"))
+		group = "calendar";
+	else if (strstr (entries->name, "tasks"))
+		group = "tasks";
+	else
+		group = "addressbook";
+
+	is_eex = is_eex_source_selected (shell_view, &uri);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+	action_group = e_shell_window_get_action_group (shell_window, group);
 
-	for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++)
-		menus = g_slist_prepend (menus, &popup_items[i]);
+	for (i = 0; i < NUM_ENTRIES; i++) {
+		gboolean visible = is_eex;
 
-	e_popup_add_items (target->target.popup, menus, NULL, popup_free, NULL);
+		action = gtk_action_group_get_action (action_group, entries->name);
+		g_return_if_fail (action != NULL);
 
+		if (visible && i == 2) {
+			/* it's an unsubscribe, check if this is public and show/hide based on that */
+			visible = uri && is_subscribed_folder (uri);
+		}
+
+		gtk_action_set_visible (action, visible);
+
+	}
+
+	g_free (uri);
 }
 
 static void
-org_folder_permissions_cb (EPopup *ep, EPopupItem *p, gpointer data)
+setup_source_actions (EShellView *shell_view, GtkActionEntry *entries)
 {
-	ExchangeAccount *account = NULL;
-	EFolder *folder = NULL;
+	EShellWindow *shell_window;
+	const gchar *group;
 
-	account = exchange_operations_get_exchange_account ();
+	g_return_if_fail (shell_view != NULL);
+	g_return_if_fail (entries != NULL);
 
-	if (!account)
-		return;
+	if (strstr (entries->name, "calendar"))
+		group = "calendar";
+	else if (strstr (entries->name, "tasks"))
+		group = "tasks";
+	else
+		group = "addressbook";
 
-	folder = exchange_account_get_folder (account, selected_exchange_folder_uri);
-	if (folder)
-		exchange_permissions_dialog_new (account, folder, NULL);
+	shell_window = e_shell_view_get_shell_window (shell_view);
 
+	gtk_action_group_add_actions (
+		e_shell_window_get_action_group (shell_window, group),
+		entries, NUM_ENTRIES, shell_view);
+
+	g_signal_connect (shell_view, "update-actions", G_CALLBACK (update_source_entries_cb), entries);
 }
 
-void
-org_gnome_exchange_menu_folder_permissions (EPlugin *ep, EMMenuTargetSelect *target)
+static void
+source_permissions_cb (GtkAction *action, EShellView *shell_view)
 {
-	ExchangeAccount *account = NULL;
-	EFolder *folder = NULL;
-	gchar *path = NULL;
-	gint mode;
+	gchar *uri = NULL;
 
-	if (!g_str_has_prefix (target->uri, "exchange://"))
-		return;
+	g_return_if_fail (shell_view != NULL);
 
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+	if (is_eex_source_selected (shell_view, &uri))
+		call_folder_permissions (uri);
 
-	path = target->uri + strlen ("exchange://") + strlen (account->account_filename);
-	folder = exchange_account_get_folder (account, path);
-	if (folder)
-		exchange_permissions_dialog_new (account, folder, NULL);
+	g_free (uri);
 }
 
-void
-org_gnome_exchange_menu_cal_permissions (EPlugin *ep, ECalMenuTargetSelect *target)
+static void
+eex_folder_unsubscribe_cb (GtkAction *action, EShellView *shell_view)
 {
-	ExchangeAccount *account = NULL;
-	EFolder *folder = NULL;
-	ECalModel *model = NULL;
-	ECal *ecal = NULL;
 	gchar *uri = NULL;
-	gint mode;
+	const gchar *name;
 
-	if (!target)
-		return;
-	if (target->model)
-		model = E_CAL_MODEL (target->model);
+	g_return_if_fail (shell_view != NULL);
 
-	ecal = e_cal_model_get_default_client (model);
-	uri = (gchar *) e_cal_get_uri (ecal);
-	if (!uri)
-		return;
-	else
-		if (!g_str_has_prefix (uri, "exchange://"))
-			return;
+	name = gtk_action_get_name (action);
+	g_return_if_fail (name != NULL);
 
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+	name = strrchr (name, '-');
+	g_return_if_fail (name != NULL && *name == '-');
 
-	folder = exchange_account_get_folder (account, uri);
-	exchange_permissions_dialog_new (account, folder, NULL);
+	if (is_eex_source_selected (shell_view, &uri)) {
+		EShellSidebar *shell_sidebar;
+		ESourceSelector *selector = NULL;
+
+		shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+		g_return_if_fail (shell_sidebar != NULL);
+
+		g_object_get (shell_sidebar, "selector", &selector, NULL);
+		g_return_if_fail (selector != NULL);
+
+		call_folder_unsubscribe (name + 1, uri, e_source_selector_peek_primary_selection (selector));
+	}
+
+	g_free (uri);
 }
 
-void
-org_gnome_exchange_menu_tasks_permissions (EPlugin *ep, ECalMenuTargetSelect *target)
-{
-	ExchangeAccount *account = NULL;
-	EFolder *folder = NULL;
-	ECalModel *model = NULL;
-	ECal *ecal = NULL;
-	gchar *uri = NULL;
-	gint mode;
+/* Beware, depends on count and order */
+static GtkActionEntry calendar_entries[] = {
+	{ "eex-calendar-permissions",
+	  "folder-new",
+	  N_("Permissions..."),
+	  NULL,
+	  N_("Check calendar permissions"),
+	  G_CALLBACK (source_permissions_cb) },
+
+	{ "eex-folder-subscribe-Calendar",
+	  NULL,
+	  N_("Subscribe to Other User's Folder..."),
+	  NULL,
+	  N_("Subscribe to Other User's Folder"),
+	  G_CALLBACK (eex_folder_subscribe_cb) },
+
+	{ "eex-folder-unsubscribe-Calendar",
+	  "folder-new",
+	  N_("Unsubscribe Folder..."),
+	  NULL,
+	  NULL,
+	  G_CALLBACK (eex_folder_unsubscribe_cb) }
+};
 
-	if (!target)
-		return;
-	if (target->model)
-		model = E_CAL_MODEL (target->model);
+gboolean
+eex_ui_calendar_permissions (GtkUIManager *ui_manager, EShellView *shell_view)
+{
+	g_return_val_if_fail (G_N_ELEMENTS (calendar_entries) != NUM_ENTRIES, FALSE);
 
-	ecal = e_cal_model_get_default_client (model);
-	uri = (gchar *) e_cal_get_uri (ecal);
-	if (!uri)
-		return;
-	else
-		if (!g_str_has_prefix (uri, "exchange://"))
-			return;
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+	setup_source_actions (shell_view, calendar_entries);
 
-	folder = exchange_account_get_folder (account, uri);
-	exchange_permissions_dialog_new (account, folder, NULL);
+	return TRUE;
 }
 
-void
-org_gnome_exchange_menu_ab_permissions (EPlugin *ep, EABMenuTargetSelect *target)
+/* Beware, depends on count and order */
+static GtkActionEntry tasks_entries[] = {
+	{ "eex-tasks-permissions",
+	  "folder-new",
+	  N_("Permissions..."),
+	  NULL,
+	  N_("Check tasks permissions"),
+	  G_CALLBACK (source_permissions_cb) },
+
+	{ "eex-folder-subscribe-Tasks",
+	  NULL,
+	  N_("Subscribe to Other User's Folder..."),
+	  NULL,
+	  N_("Subscribe to Other User's Folder"),
+	  G_CALLBACK (eex_folder_subscribe_cb) },
+
+	{ "eex-folder-unsubscribe-Tasks",
+	  "folder-new",
+	  N_("Unsubscribe Folder..."),
+	  NULL,
+	  NULL,
+	  G_CALLBACK (eex_folder_unsubscribe_cb) }
+};
+
+gboolean
+eex_ui_tasks_permissions (GtkUIManager *ui_manager, EShellView *shell_view)
 {
-	ExchangeAccount *account = NULL;
-	EFolder *folder = NULL;
-	EBook *ebook = NULL;
-	gchar *uri = NULL;
-	gint mode;
+	g_return_val_if_fail (G_N_ELEMENTS (tasks_entries) != NUM_ENTRIES, FALSE);
 
-	if (!target)
-		return;
-	if (target->book)
-		ebook = E_BOOK (target->book);
+	setup_source_actions (shell_view, tasks_entries);
 
-	uri = (gchar *) e_book_get_uri (ebook);
-	if (!uri)
-		return;
-	else
-		if (!g_str_has_prefix (uri, "exchange://"))
-			return;
+	return TRUE;
+}
 
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-	exchange_account_is_offline (account, &mode);
-	if (mode == OFFLINE_MODE)
-		return;
+/* Beware, depends on count and order */
+static GtkActionEntry addressbook_entries[] = {
+	{ "eex-addressbook-permissions",
+	  "folder-new",
+	  N_("Permissions..."),
+	  NULL,
+	  N_("Check addressbook permissions"),
+	  G_CALLBACK (source_permissions_cb) },
+
+	{ "eex-folder-subscribe-Contacts",
+	  NULL,
+	  N_("Subscribe to Other User's Folder..."),
+	  NULL,
+	  N_("Subscribe to Other User's Folder"),
+	  G_CALLBACK (eex_folder_subscribe_cb) },
+
+	{ "eex-folder-unsubscribe-Contacts",
+	  "folder-new",
+	  N_("Unsubscribe Folder..."),
+	  NULL,
+	  NULL,
+	  G_CALLBACK (eex_folder_unsubscribe_cb) }
+};
 
-	folder = exchange_account_get_folder (account, uri);
-	exchange_permissions_dialog_new (account, folder, NULL);
+gboolean
+eex_ui_addressbook_permissions (GtkUIManager *ui_manager, EShellView *shell_view)
+{
+	g_return_val_if_fail (G_N_ELEMENTS (addressbook_entries) != NUM_ENTRIES, FALSE);
+
+	setup_source_actions (shell_view, addressbook_entries);
+
+	return TRUE;
 }
diff --git a/plugins/exchange-operations/exchange-folder-size-display.c b/plugins/exchange-operations/exchange-folder-size-display.c
index 8db56b8..7e1fc7f 100644
--- a/plugins/exchange-operations/exchange-folder-size-display.c
+++ b/plugins/exchange-operations/exchange-folder-size-display.c
@@ -29,7 +29,6 @@
 
 #include <glib/gi18n.h>
 #include <e-util/e-dialog-utils.h>
-#include <glade/glade-xml.h>
 #include "exchange-folder-size-display.h"
 
 enum {
@@ -105,21 +104,42 @@ exchange_folder_size_display (GtkListStore *model, GtkWidget *parent)
         GtkTreeViewColumn *column;
 	GtkTreeSortable *sortable;
 	GtkCellRenderer *cell;
-        GladeXML *xml;
-        GtkWidget *dialog, *table;
+	GtkWidget *folder_tree;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *folder_tree_hbox;
+	GtkWidget *scrolledwindow1;
+	GtkWidget *folder_treeview;
 	GList *l;
 	gchar *col_name;
 
-	printf ("exchange_folder_size_display called\n");
         g_return_if_fail (GTK_IS_WIDGET (parent));
 
-        xml = glade_xml_new (CONNECTOR_GLADEDIR "/exchange-folder-tree.glade", NULL, NULL);
-        g_return_if_fail (xml != NULL);
-        dialog = glade_xml_get_widget (xml, "folder_tree");
-        table = glade_xml_get_widget (xml, "folder_treeview");
-	g_object_unref (xml);
+	folder_tree = gtk_dialog_new_with_buttons (
+		_("Exchange Folder Tree"),
+		NULL,
+		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+	gtk_window_set_position (GTK_WINDOW (folder_tree), GTK_WIN_POS_CENTER_ON_PARENT);
+	gtk_window_set_default_size (GTK_WINDOW (folder_tree), 250, 300);
+	if (parent)
+		gtk_window_set_transient_for (GTK_WINDOW (folder_tree), parent);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (folder_tree));
+	gtk_widget_show (dialog_vbox1);
+
+	folder_tree_hbox = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (folder_tree_hbox);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), folder_tree_hbox, TRUE, TRUE, 0);
+
+	scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+	gtk_widget_show (scrolledwindow1);
+	gtk_box_pack_start (GTK_BOX (folder_tree_hbox), scrolledwindow1, TRUE, TRUE, 0);
+
+	folder_treeview = gtk_tree_view_new ();
+	gtk_widget_show (folder_treeview);
+	gtk_container_add (GTK_CONTAINER (scrolledwindow1), folder_treeview);
 
-        gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
 	/* fsize->parent = parent; */
 
         /* Set up the table */
@@ -128,7 +148,7 @@ exchange_folder_size_display (GtkListStore *model, GtkWidget *parent)
 
         column = gtk_tree_view_column_new_with_attributes (
                 _("Folder Name"), gtk_cell_renderer_text_new (), "text", COLUMN_NAME, NULL);
-        gtk_tree_view_append_column (GTK_TREE_VIEW (table),
+        gtk_tree_view_append_column (GTK_TREE_VIEW (folder_treeview),
                                      column);
 
 	col_name = g_strdup_printf ("%s (KB)", _("Folder Size"));
@@ -136,15 +156,15 @@ exchange_folder_size_display (GtkListStore *model, GtkWidget *parent)
                 col_name, gtk_cell_renderer_text_new (), "text", COLUMN_SIZE, NULL);
 	g_free (col_name);
 
-	l = gtk_tree_view_column_get_cell_renderers (column);
+	l = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
 	cell = (GtkCellRenderer *)l->data;
 	gtk_tree_view_column_set_cell_data_func (column, cell, format_size_func, NULL, NULL );
 	g_list_free (l);
 
-        gtk_tree_view_append_column (GTK_TREE_VIEW (table),
+        gtk_tree_view_append_column (GTK_TREE_VIEW (folder_treeview),
                                      column);
-        gtk_tree_view_set_model (GTK_TREE_VIEW (table),
+        gtk_tree_view_set_model (GTK_TREE_VIEW (folder_treeview),
                                  GTK_TREE_MODEL (model));
-	gtk_dialog_run (GTK_DIALOG (dialog));
-        gtk_widget_destroy (dialog);
+	gtk_dialog_run (GTK_DIALOG (folder_tree));
+        gtk_widget_destroy (folder_tree);
 }
diff --git a/plugins/exchange-operations/exchange-folder-subscription.c b/plugins/exchange-operations/exchange-folder-subscription.c
index 043d579..63d2fb2 100644
--- a/plugins/exchange-operations/exchange-folder-subscription.c
+++ b/plugins/exchange-operations/exchange-folder-subscription.c
@@ -25,7 +25,6 @@
 #include "config.h"
 #endif
 
-#include <glade/glade-xml.h>
 #include <gtk/gtk.h>
 #include <e-util/e-error.h>
 #include <e-folder.h>
@@ -57,16 +56,13 @@ user_clicked (GtkWidget *button, ENameSelector *name_selector)
 }
 
 static GtkWidget *
-setup_name_selector (GladeXML *glade_xml, ENameSelector **name_selector_ret)
+setup_name_selector (GtkWidget *placeholder, GtkWidget *button_user, ENameSelector **name_selector_ret)
 {
 	ENameSelector *name_selector;
 	ENameSelectorModel *name_selector_model;
 	ENameSelectorDialog *name_selector_dialog;
-	GtkWidget *placeholder;
 	GtkWidget *widget;
-	GtkWidget *button;
 
-	placeholder = glade_xml_get_widget (glade_xml, "user-picker-placeholder");
 	g_assert (GTK_IS_CONTAINER (placeholder));
 
 	name_selector = e_name_selector_new ();
@@ -83,8 +79,7 @@ setup_name_selector (GladeXML *glade_xml, ENameSelector **name_selector_ret)
 	widget = GTK_WIDGET (e_name_selector_peek_section_entry (name_selector, "User"));
 	gtk_widget_show (widget);
 
-	button = glade_xml_get_widget (glade_xml, "button-user");
-	g_signal_connect (button, "clicked", G_CALLBACK (user_clicked), name_selector);
+	g_signal_connect (button_user, "clicked", G_CALLBACK (user_clicked), name_selector);
 	gtk_box_pack_start (GTK_BOX (placeholder), widget, TRUE, TRUE, 6);
 	*name_selector_ret = name_selector;
 
@@ -92,7 +87,7 @@ setup_name_selector (GladeXML *glade_xml, ENameSelector **name_selector_ret)
 }
 
 static void
-setup_folder_name_combo (GladeXML *glade_xml, const gchar *fname)
+setup_folder_name_combo (GtkWidget *widget, const gchar *fname)
 {
 	GtkComboBox *combo;
 	const gchar *strings[] = {
@@ -105,7 +100,7 @@ setup_folder_name_combo (GladeXML *glade_xml, const gchar *fname)
 	};
 	gint i;
 
-	combo = GTK_COMBO_BOX (glade_xml_get_widget (glade_xml, "folder-name-combo"));
+	combo = GTK_COMBO_BOX (widget);
 	g_assert (GTK_IS_COMBO_BOX_ENTRY (combo));
 
 	gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (combo)));
@@ -142,11 +137,8 @@ user_name_entry_changed_callback (GtkEditable *editable, gpointer data)
 }
 
 static void
-setup_server_combobox (GladeXML *glade_xml, gchar *mail_account)
+setup_server_combobox (GtkWidget *widget, gchar *mail_account)
 {
-	GtkWidget *widget;
-
-	widget = glade_xml_get_widget (glade_xml, "server-combobox");
 	g_return_if_fail (GTK_IS_COMBO_BOX (widget));
 
 	gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (widget))));
@@ -287,8 +279,15 @@ gboolean
 create_folder_subscription_dialog (ExchangeAccount *account, const gchar *fname)
 {
 	ENameSelector *name_selector;
-	GladeXML *glade_xml;
-	GtkWidget *dialog, *ok_button;
+	GtkWidget *dialog;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *table1;
+	GtkWidget *label1;
+	GtkWidget *label3;
+	GtkWidget *user_picker_placeholder;
+	GtkWidget *button_user;
+	GtkWidget *folder_name_combo;
+	GtkWidget *server_combobox;
 	SubscriptionInfo *subscription_info;
 	gint mode;
 
@@ -299,27 +298,74 @@ create_folder_subscription_dialog (ExchangeAccount *account, const gchar *fname)
 	subscription_info = g_new0 (SubscriptionInfo, 1);
 	subscription_info->account = account;
 
-	glade_xml = glade_xml_new (CONNECTOR_GLADEDIR "/e-foreign-folder-dialog.glade",
-				   NULL, NULL);
-	g_return_val_if_fail (glade_xml != NULL, FALSE);
+	dialog = gtk_dialog_new_with_buttons (
+		_("Subscribe to Other User's Folder"),
+		NULL,
+		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+
+	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+	gtk_widget_show (dialog_vbox1);
+
+	table1 = gtk_table_new (3, 2, FALSE);
+	gtk_widget_show (table1);
+	gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, TRUE, TRUE, 2);
+	gtk_table_set_row_spacings (GTK_TABLE (table1), 3);
+	gtk_table_set_col_spacings (GTK_TABLE (table1), 3);
+
+	label1 = gtk_label_new_with_mnemonic (_("_Account:"));
+	gtk_widget_show (label1);
+	gtk_table_attach (GTK_TABLE (table1), label1, 0, 1, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_CENTER);
+
+	label3 = gtk_label_new_with_mnemonic (_("_Folder Name:"));
+	gtk_widget_show (label3);
+	gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_justify (GTK_LABEL (label3), GTK_JUSTIFY_CENTER);
+
+	user_picker_placeholder = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (user_picker_placeholder);
+	gtk_table_attach (GTK_TABLE (table1), user_picker_placeholder, 1, 2, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+
+	button_user = gtk_button_new_with_mnemonic (_("_User:"));
+	gtk_widget_show (button_user);
+	gtk_table_attach (GTK_TABLE (table1), button_user, 0, 1, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+
+	folder_name_combo = gtk_combo_box_entry_new_text ();
+	gtk_widget_show (folder_name_combo);
+	gtk_table_attach (GTK_TABLE (table1), folder_name_combo, 1, 2, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+	server_combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (server_combobox);
+	gtk_table_attach (GTK_TABLE (table1), server_combobox, 1, 2, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
 
-	dialog = glade_xml_get_widget (glade_xml, "dialog");
-	g_return_val_if_fail (dialog != NULL, FALSE);
 	gtk_window_set_modal (GTK_WINDOW (dialog), FALSE);
-	gtk_window_set_title (GTK_WINDOW (dialog), _("Subscribe to Other User's Folder"));
 
-	subscription_info->name_selector_widget = setup_name_selector (glade_xml, &name_selector);
+	subscription_info->name_selector_widget = setup_name_selector (user_picker_placeholder, button_user, &name_selector);
 	subscription_info->name_selector = name_selector;
 	gtk_widget_grab_focus (subscription_info->name_selector_widget);
 
-	ok_button = glade_xml_get_widget (glade_xml, "button1");
-	gtk_widget_set_sensitive (ok_button, FALSE);
+	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
 	g_signal_connect (subscription_info->name_selector_widget, "changed",
 			  G_CALLBACK (user_name_entry_changed_callback), dialog);
 
-	setup_server_combobox (glade_xml, account->account_name);
-	setup_folder_name_combo (glade_xml, fname);
-	subscription_info->folder_name_entry = gtk_bin_get_child (GTK_BIN (glade_xml_get_widget (glade_xml, "folder-name-combo")));
+	setup_server_combobox (server_combobox, account->account_name);
+	setup_folder_name_combo (folder_name_combo, fname);
+	subscription_info->folder_name_entry = gtk_bin_get_child (GTK_BIN (folder_name_combo));
 	g_signal_connect (dialog, "response", G_CALLBACK (subscribe_to_folder), subscription_info);
 	gtk_widget_show (dialog);
 
diff --git a/plugins/exchange-operations/exchange-folder-subscription.h b/plugins/exchange-operations/exchange-folder-subscription.h
index 15323ca..942cc3a 100644
--- a/plugins/exchange-operations/exchange-folder-subscription.h
+++ b/plugins/exchange-operations/exchange-folder-subscription.h
@@ -21,7 +21,14 @@
 #ifndef __EXCHANGE_FOLDER_SUBSCRIPTION_H__
 #define __EXCHANGE_FOLDER_SUBSCRIPTION_H__
 
+#include <glib.h>
+#include <libedataserver/e-source.h>
+#include <exchange-account.h>
+
 gboolean
 create_folder_subscription_dialog (ExchangeAccount *account, const gchar *fname);
 
+void call_folder_subscribe (const gchar *folder_name);
+void call_folder_unsubscribe (const gchar *folder_type, const gchar *uri, ESource *source);
+
 #endif
diff --git a/plugins/exchange-operations/exchange-folder.c b/plugins/exchange-operations/exchange-folder.c
index 7c9f1bf..5fe4345 100644
--- a/plugins/exchange-operations/exchange-folder.c
+++ b/plugins/exchange-operations/exchange-folder.c
@@ -29,9 +29,6 @@
 #include <gconf/gconf-client.h>
 #include <e-folder-exchange.h>
 #include <exchange-hierarchy.h>
-#include <calendar/gui/e-cal-popup.h>
-#include <mail/em-popup.h>
-#include <mail/em-menu.h>
 #include <libedataserverui/e-source-selector.h>
 #include <e-util/e-error.h>
 #include <camel/camel-store.h>
@@ -40,42 +37,70 @@
 #include <mail/mail-ops.h>
 
 #include "exchange-operations.h"
-#include "addressbook/gui/widgets/eab-popup.h"
 #include "exchange-folder-subscription.h"
 
-void org_gnome_exchange_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target, const gchar *fname);
-void org_gnome_exchange_inbox_subscription (EPlugin *ep, EMMenuTargetSelect *target);
-void org_gnome_exchange_addressbook_subscription (EPlugin *ep, EMMenuTargetSelect *target);
-void org_gnome_exchange_calendar_subscription (EPlugin *ep, EMMenuTargetSelect *target);
-void org_gnome_exchange_tasks_subscription (EPlugin *ep, EMMenuTargetSelect *target);
-void org_gnome_exchange_check_subscribed (EPlugin *ep, ECalPopupTargetSource *target);
-void org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data);
-void org_gnome_exchange_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target);
-void org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data);
-void org_gnome_exchange_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target);
-void org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data);
-void popup_free (EPopup *ep, GSList *items, gpointer data);
-void popup_inbox_free (EPopup *ep, GSList *items, gpointer data);
-void popup_ab_free (EPopup *ep, GSList *items, gpointer data);
-static void exchange_get_folder (gchar *uri, CamelFolder *folder, gpointer data);
-
 #define CONF_KEY_SELECTED_CAL_SOURCES "/apps/evolution/calendar/display/selected_calendars"
 
-static EPopupItem popup_inbox_items[] = {
-	{ E_POPUP_ITEM, (gchar *) "29.inbox_unsubscribe", (gchar *) N_("Unsubscribe Folder..."), org_gnome_exchange_folder_inbox_unsubscribe, NULL, (gchar *) "folder-new", 0, EM_POPUP_FOLDER_INFERIORS }
-};
+static CamelFolderInfo *
+ex_create_folder_info (CamelStore *store, gchar *name, gchar *uri,
+                  gint unread_count, gint flags)
+{
+	CamelFolderInfo *info;
+	const gchar *path;
+
+	path = strstr (uri, "://");
+	if (!path)
+		return NULL;
+	path = strchr (path + 3, '/');
+	if (!path)
+		return NULL;
+
+	info = camel_folder_info_new ();
+	info->name = name;
+	info->uri = uri;
+	info->full_name = g_strdup (path + 1);
+	info->unread = unread_count;
+
+	return info;
+}
 
-void
-popup_inbox_free (EPopup *ep, GSList *items, gpointer data)
+static void
+exchange_get_folder (gchar *uri, CamelFolder *folder, gpointer data)
 {
-	g_slist_free (items);
+	CamelStore *store;
+	CamelException ex;
+	CamelFolderInfo *info;
+	gchar *name = NULL;
+	gchar *stored_name = NULL;
+	gchar *target_uri = (gchar *)data;
+	ExchangeAccount *account = NULL;
+
+	account = exchange_operations_get_exchange_account ();
+
+	if (!account)
+		return;
+
+	/* Get the subscribed folder name. */
+	name = target_uri + strlen ("exchange://") + strlen (account->account_filename);
+	stored_name = strrchr (name + 1, '/');
+
+	if (stored_name)
+		name[stored_name - name] = '\0';
+
+	camel_exception_init (&ex);
+	store = camel_folder_get_parent_store (folder);
+
+	/* Construct the CamelFolderInfo */
+	info = ex_create_folder_info (store, name, target_uri, -1, 0);
+	camel_object_trigger_event (CAMEL_OBJECT (store),
+				    "folder_unsubscribed", info);
+	g_free (target_uri);
 }
 
-void
-org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
+static void
+eex_folder_inbox_unsubscribe (const gchar *uri)
 {
 	ExchangeAccount *account = NULL;
-	EMPopupTargetFolder *target = data;
 	gchar *path = NULL;
 	gchar *stored_path = NULL;
 	const gchar *inbox_uri = NULL;
@@ -89,8 +114,8 @@ org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, gpointer
 	if (!account)
 		return;
 
-	target_uri = g_strdup (target->uri);
-	path = target->uri + strlen ("exchange://") + strlen (account->account_filename);
+	target_uri = g_strdup (uri);
+	path = g_strdup (uri + strlen ("exchange://") + strlen (account->account_filename));
 	/* User will be able to unsubscribe by doing a right click on
 	   any one of this two-<other user's>Inbox or the
 	   <other user's folder> tree.
@@ -101,6 +126,8 @@ org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, gpointer
 		path[stored_path - path] = '\0';
 
 	result = exchange_account_remove_shared_folder (account, path);
+	g_free (path);
+
 	switch (result) {
 		case EXCHANGE_ACCOUNT_FOLDER_OK:
 			break;
@@ -140,199 +167,10 @@ org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, gpointer
 
 	/* To get the CamelStore/Folder */
 	mail_get_folder (inbox_physical_uri, 0, exchange_get_folder, target_uri, mail_msg_unordered_push);
-
-}
-
-static CamelFolderInfo *
-ex_create_folder_info (CamelStore *store, gchar *name, gchar *uri,
-                  gint unread_count, gint flags)
-{
-        CamelFolderInfo *info;
-        const gchar *path;
-
-        path = strstr (uri, "://");
-        if (!path)
-                return NULL;
-        path = strchr (path + 3, '/');
-        if (!path)
-                return NULL;
-
-        info = camel_folder_info_new ();
-        info->name = name;
-        info->uri = uri;
-        info->full_name = g_strdup (path + 1);
-        info->unread = unread_count;
-
-        return info;
-}
-
-static void
-exchange_get_folder (gchar *uri, CamelFolder *folder, gpointer data)
-{
-	CamelStore *store;
-	CamelException ex;
-	CamelFolderInfo *info;
-	gchar *name = NULL;
-	gchar *stored_name = NULL;
-	gchar *target_uri = (gchar *)data;
-	ExchangeAccount *account = NULL;
-
-	account = exchange_operations_get_exchange_account ();
-
-	if (!account)
-		return;
-
-	/* Get the subscribed folder name. */
-	name = target_uri + strlen ("exchange://") + strlen (account->account_filename);
-	stored_name = strrchr (name + 1, '/');
-
-	if (stored_name)
-		name[stored_name - name] = '\0';
-
-	camel_exception_init (&ex);
-	store = camel_folder_get_parent_store (folder);
-
-	/* Construct the CamelFolderInfo */
-	info = ex_create_folder_info (store, name, target_uri, -1, 0);
-	camel_object_trigger_event (CAMEL_OBJECT (store),
-				    "folder_unsubscribed", info);
-	g_free (target_uri);
-}
-
-void
-org_gnome_exchange_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target)
-{
-	GSList *menus = NULL;
-	gint i = 0;
-	ExchangeAccount *account = NULL;
-	gchar *path = NULL;
-	gchar *sub_folder = NULL;
-
-	if (!g_strrstr (target->uri, "exchange://"))
-		return;
-
-	account = exchange_operations_get_exchange_account ();
-	if (!account)
-		return;
-
-	path = g_strdup (target->uri + strlen ("exchange://") + strlen (account->account_filename));
-	sub_folder = strchr (path, '@');
-
-	g_free (path);
-
-	if (!sub_folder || !g_strrstr(sub_folder, "/"))
-		return;
-
-        for (i = 0; i < sizeof (popup_inbox_items) / sizeof (popup_inbox_items[0]); i++)
-                menus = g_slist_prepend (menus, &popup_inbox_items[i]);
-
-        e_popup_add_items (target->target.popup, menus, NULL, popup_inbox_free, target);
-}
-
-static EPopupItem popup_items[] = {
-	{ E_POPUP_ITEM, (gchar *) "29.calendar_unsubscribe", (gchar *) N_("Unsubscribe Folder..."), org_gnome_exchange_folder_unsubscribe, NULL, (gchar *) "folder-new", 0, EM_POPUP_FOLDER_INFERIORS }
-};
-
-void
-popup_free (EPopup *ep, GSList *items, gpointer data)
-{
-	g_slist_free (items);
-}
-
-static EPopupItem popup_ab_items[] = {
-	{ E_POPUP_ITEM, (gchar *) "29.address_book_unsubscribe", (gchar *) N_("Unsubscribe Folder..."), org_gnome_exchange_folder_ab_unsubscribe, NULL, (gchar *) "folder-new", 0, EM_POPUP_FOLDER_INFERIORS }
-};
-
-void
-popup_ab_free (EPopup *ep, GSList *items, gpointer data)
-{
-	g_slist_free (items);
-}
-
-void
-org_gnome_exchange_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target)
-{
-	GSList *menus = NULL;
-	gint i = 0;
-	ESource *source = NULL;
-	gchar *uri = NULL;
-	gchar *path = NULL;
-	gchar *sub_folder = NULL;
-	const gchar *base_uri;
-	ExchangeAccount *account = NULL;
-	ESourceGroup *group;
-
-	account = exchange_operations_get_exchange_account ();
-
-	if (!account)
-		return;
-
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
-	group = e_source_peek_group (source);
-	base_uri = e_source_group_peek_base_uri (group);
-	if (!base_uri || strcmp (base_uri, "exchange://"))
-		return;
-
-	uri = e_source_get_uri (source);
-	path = g_strdup (uri + strlen ("exchange://") + strlen (account->account_filename) + strlen ("/;"));
-	g_free (uri);
-	sub_folder = strchr (path, '@');
-
-	if (!sub_folder) {
-		g_free (path);
-		return;
-	}
-
-	for (i = 0; i < sizeof (popup_ab_items) / sizeof (popup_ab_items[0]); i++)
-		menus = g_slist_prepend (menus, &popup_ab_items[i]);
-
-	e_popup_add_items (target->target.popup, menus, NULL, popup_ab_free, target);
-	g_free (path);
-
-}
-
-void
-org_gnome_exchange_check_subscribed (EPlugin *ep, ECalPopupTargetSource *target)
-{
-	GSList *menus = NULL;
-	gint i = 0;
-	ESource *source = NULL;
-	gchar *ruri = NULL;
-	gchar *path = NULL;
-	gchar *sub_folder = NULL;
-	const gchar *base_uri;
-	ExchangeAccount *account = NULL;
-	ESourceGroup *group;
-
-	account = exchange_operations_get_exchange_account ();
-
-	if (!account)
-		return;
-
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
-	group = e_source_peek_group (source);
-	base_uri = e_source_group_peek_base_uri (group);
-	if (!base_uri || strcmp (base_uri, "exchange://"))
-		return;
-
-	ruri = (gchar *) e_source_peek_relative_uri (source);
-	path = g_strdup (ruri + strlen (account->account_filename) + strlen ("/;"));
-	sub_folder = strchr (path, '@');
-
-	if (!sub_folder) {
-		g_free (path);
-		return;
-	}
-
-	for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++)
-		menus = g_slist_prepend (menus, &popup_items[i]);
-
-	e_popup_add_items (target->target.popup, menus, NULL, popup_free, target);
-	g_free (path);
 }
 
 static void
-unsubscribe_dialog_ab_response (GtkDialog *dialog, gint response, gpointer data)
+unsubscribe_dialog_ab_response (GtkDialog *dialog, gint response, ESource *source)
 {
 
 	if (response == GTK_RESPONSE_OK) {
@@ -341,15 +179,14 @@ unsubscribe_dialog_ab_response (GtkDialog *dialog, gint response, gpointer data)
 		gchar *uri = NULL;
 		const gchar *source_uid = NULL;
 		ESourceGroup *source_group = NULL;
-		ESource *source = NULL;
-		EABPopupTargetSource *target = data;
+
+		g_return_if_fail (source != NULL);
 
 		account = exchange_operations_get_exchange_account ();
 
 		if (!account)
 			return;
 
-		source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
 		uri = e_source_get_uri (source);
 		path = g_strdup (uri + strlen ("exchange://") + strlen (account->account_filename));
 		source_uid = e_source_peek_uid (source);
@@ -368,7 +205,7 @@ unsubscribe_dialog_ab_response (GtkDialog *dialog, gint response, gpointer data)
 }
 
 static void
-unsubscribe_dialog_response (GtkDialog *dialog, gint response, gpointer data)
+unsubscribe_dialog_response (GtkDialog *dialog, gint response, ESource *source)
 {
 
 	if (response == GTK_RESPONSE_OK) {
@@ -379,8 +216,8 @@ unsubscribe_dialog_response (GtkDialog *dialog, gint response, gpointer data)
 		const gchar *source_uid = NULL;
 		GConfClient *client;
 		ESourceGroup *source_group = NULL;
-		ESource *source = NULL;
-		ECalPopupTargetSource *target = data;
+
+		g_return_if_fail (source != NULL);
 
 		client = gconf_client_get_default ();
 
@@ -389,7 +226,6 @@ unsubscribe_dialog_response (GtkDialog *dialog, gint response, gpointer data)
 		if (!account)
 			return;
 
-		source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
 		ruri = (gchar *) e_source_peek_relative_uri (source);
 		source_uid = e_source_peek_uid (source);
 
@@ -426,12 +262,10 @@ unsubscribe_dialog_response (GtkDialog *dialog, gint response, gpointer data)
 		gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
-void
-org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
+static void
+eex_addresssbook_unsubscribe (ESource *source)
 {
 	GtkWidget *dialog = NULL;
-	EABPopupTargetSource *target = data;
-	ESource *source = NULL;
 	ExchangeAccount *account = NULL;
 	gchar *title = NULL;
 	gchar *displayed_folder_name = NULL;
@@ -439,13 +273,13 @@ org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, gpointer da
 	gint mode;
 	ExchangeConfigListenerStatus status;
 
-	account = exchange_operations_get_exchange_account ();
+	g_return_if_fail (source != NULL);
 
+	account = exchange_operations_get_exchange_account ();
 	if (!account)
 		return;
 
 	status = exchange_is_offline (&mode);
-
 	if (status != CONFIG_LISTENER_STATUS_OK) {
 		g_warning ("Config listener not found");
 		return;
@@ -454,7 +288,6 @@ org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, gpointer da
 		return;
 	}
 
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
 	displayed_folder_name = (gchar *) e_source_peek_name (source);
 	dialog = gtk_message_dialog_new (NULL,
 					 GTK_DIALOG_MODAL,
@@ -479,14 +312,13 @@ org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, gpointer da
 	g_free (displayed_folder_name);
 
 	gtk_widget_show (dialog);
-	unsubscribe_dialog_ab_response (GTK_DIALOG (dialog), response, data);
+	unsubscribe_dialog_ab_response (GTK_DIALOG (dialog), response, source);
 }
-void
-org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
+
+static void
+eex_calendar_unsubscribe (ESource *source)
 {
 	GtkWidget *dialog = NULL;
-	ECalPopupTargetSource *target = data;
-	ESource *source = NULL;
 	ExchangeAccount *account = NULL;
 	gchar *title = NULL;
 	const gchar *displayed_folder_name;
@@ -494,8 +326,9 @@ org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
 	gint mode;
 	ExchangeConfigListenerStatus status;
 
-	account = exchange_operations_get_exchange_account ();
+	g_return_if_fail (source != NULL);
 
+	account = exchange_operations_get_exchange_account ();
 	if (!account)
 		return;
 
@@ -509,7 +342,6 @@ org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
 		return;
 	}
 
-	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
 	displayed_folder_name =  e_source_peek_name (source);
 	dialog = gtk_message_dialog_new (NULL,
 					 GTK_DIALOG_MODAL,
@@ -533,28 +365,27 @@ org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, gpointer data)
 	g_free (title);
 
 	gtk_widget_show (dialog);
-	unsubscribe_dialog_response (GTK_DIALOG (dialog), response, data);
+	unsubscribe_dialog_response (GTK_DIALOG (dialog), response, source);
 }
 
 void
-org_gnome_exchange_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target, const gchar *fname)
+call_folder_subscribe (const gchar *folder_name)
 {
 	ExchangeAccount *account = NULL;
 	gint mode;
 	ExchangeConfigListenerStatus status;
 
-	account = exchange_operations_get_exchange_account ();
+	g_return_if_fail (folder_name != NULL);
 
+	account = exchange_operations_get_exchange_account ();
 	if (!account)
 		return;
 
 	status = exchange_is_offline (&mode);
-
 	if (status != CONFIG_LISTENER_STATUS_OK) {
 		g_warning ("Config listener not found");
 		return;
-	}
-	else if (mode == OFFLINE_MODE) {
+	} else if (mode == OFFLINE_MODE) {
 		/* Translators: this error code can be used for any operation
 		 * (like subscribing to other user's folders, unsubscribing
 		 * etc,) which can not be performed in offline mode
@@ -563,33 +394,27 @@ org_gnome_exchange_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target,
 		return;
 	}
 
-	create_folder_subscription_dialog (account, fname);
+	create_folder_subscription_dialog (account, folder_name);
 }
 
 void
-org_gnome_exchange_calendar_subscription (EPlugin *ep, EMMenuTargetSelect *target)
+call_folder_unsubscribe (const gchar *folder_type, const gchar *uri, ESource *source)
 {
-	const gchar *folder_name = N_("Calendar");
-	org_gnome_exchange_folder_subscription (ep, target, folder_name);
-}
-
-void
-org_gnome_exchange_addressbook_subscription (EPlugin *ep, EMMenuTargetSelect *target)
-{
-	const gchar *folder_name = N_("Contacts");
-	org_gnome_exchange_folder_subscription (ep, target, folder_name);
-}
-
-void
-org_gnome_exchange_tasks_subscription (EPlugin *ep, EMMenuTargetSelect *target)
-{
-	const gchar *folder_name = N_("Tasks");
-	org_gnome_exchange_folder_subscription (ep, target, folder_name);
-}
-
-void
-org_gnome_exchange_inbox_subscription (EPlugin *ep, EMMenuTargetSelect *target)
-{
-	const gchar *folder_name = N_("Inbox");
-	org_gnome_exchange_folder_subscription (ep, target, folder_name);
+	g_return_if_fail (folder_type != NULL);
+	g_return_if_fail (uri != NULL);
+
+	if (g_str_equal (folder_type, N_("Inbox"))) {
+		eex_folder_inbox_unsubscribe (uri);
+	} else if (g_str_equal (folder_type, N_("Calendar"))) {
+		g_return_if_fail (source != NULL);
+		eex_calendar_unsubscribe (source);
+	} else if (g_str_equal (folder_type, N_("Tasks"))) {
+		g_return_if_fail (source != NULL);
+		eex_calendar_unsubscribe (source);
+	} else if (g_str_equal (folder_type, N_("Contacts"))) {
+		g_return_if_fail (source != NULL);
+		eex_addresssbook_unsubscribe (source);
+	} else {
+		g_return_if_reached ();
+	}
 }
diff --git a/plugins/exchange-operations/exchange-operations.h b/plugins/exchange-operations/exchange-operations.h
index d735ff8..60c2f20 100644
--- a/plugins/exchange-operations/exchange-operations.h
+++ b/plugins/exchange-operations/exchange-operations.h
@@ -35,7 +35,7 @@ G_BEGIN_DECLS
 
 extern ExchangeConfigListener *exchange_global_config_listener;
 
-gint e_plugin_lib_enable (EPluginLib *eplib, gint enable);
+gint e_plugin_lib_enable (EPlugin *eplib, gint enable);
 
 ExchangeAccount *exchange_operations_get_exchange_account (void);
 ExchangeConfigListenerStatus exchange_is_offline (gint *mode);
diff --git a/plugins/exchange-operations/exchange-permissions-dialog.c b/plugins/exchange-operations/exchange-permissions-dialog.c
index d8182a6..20af66e 100644
--- a/plugins/exchange-operations/exchange-permissions-dialog.c
+++ b/plugins/exchange-operations/exchange-permissions-dialog.c
@@ -41,7 +41,6 @@
 
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-error.h>
-#include <glade/glade-xml.h>
 
 struct _ExchangePermissionsDialogPrivate {
 	ExchangeAccount *account;
@@ -122,8 +121,7 @@ init (GObject *object)
 
 E2K_MAKE_TYPE (exchange_permissions_dialog, ExchangePermissionsDialog, class_init, init, PARENT_TYPE)
 
-static void get_widgets         (ExchangePermissionsDialog *dialog,
-				 GladeXML *xml);
+static GtkWidget *create_permissions_vbox (ExchangePermissionsDialog *dialog);
 static void setup_user_list     (ExchangePermissionsDialog *dialog);
 static void display_permissions (ExchangePermissionsDialog *dialog);
 static void dialog_response     (ExchangePermissionsDialog *dialog,
@@ -152,7 +150,6 @@ exchange_permissions_dialog_new (ExchangeAccount *account,
 	const gchar *base_uri, *folder_uri, *folder_path;
 	E2kContext *ctx;
 	ExchangeHierarchy *hier;
-	GladeXML *xml;
 	GtkWidget *box;
 	gchar *title;
 	E2kHTTPStatus status;
@@ -165,10 +162,6 @@ exchange_permissions_dialog_new (ExchangeAccount *account,
 
 	ctx = exchange_account_get_context (account);
 	g_return_if_fail (ctx);
-	xml = glade_xml_new (
-		CONNECTOR_GLADEDIR "/exchange-permissions-dialog.glade",
-		"permissions_vbox", PACKAGE);
-	g_return_if_fail (xml != NULL);
 
 	/* Create the dialog */
 	dialog = g_object_new (EXCHANGE_TYPE_PERMISSIONS_DIALOG, NULL);
@@ -188,16 +181,9 @@ exchange_permissions_dialog_new (ExchangeAccount *account,
 
 	dialog->priv->changed = FALSE;
 
-	/* Put the widgets from the glade file into it */
-	box = glade_xml_get_widget (xml, "permissions_vbox");
-	g_object_ref (box);
-	gtk_widget_unparent (box);
-	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+	box = create_permissions_vbox (dialog);
+	gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
 			    box, TRUE, TRUE, 0);
-	g_object_unref (box);
-
-	get_widgets (dialog, xml);
-	g_object_unref (xml);
 
 	dialog->priv->account = account;
 	g_object_ref (account);
@@ -684,13 +670,247 @@ display_permissions (ExchangePermissionsDialog *dialog)
 	dialog->priv->frozen = FALSE;
 }
 
-static void
-get_widgets (ExchangePermissionsDialog *dialog, GladeXML *xml)
+static GtkWidget *
+exchange_permissions_role_optionmenu_new (void)
+{
+	GtkWidget *menu;
+	const gchar **roles;
+	gint role;
+
+	menu = gtk_combo_box_new_text ();
+	roles = g_new (const gchar *, E2K_PERMISSIONS_ROLE_NUM_ROLES + 1);
+	for (role = 0; role < E2K_PERMISSIONS_ROLE_NUM_ROLES; role++) {
+		roles[role] = e2k_permissions_role_get_name (role);
+		gtk_combo_box_append_text (GTK_COMBO_BOX (menu), roles[role]);
+	}
+
+	roles[role] = NULL;
+
+	g_free (roles);
+
+	gtk_widget_show (menu);
+	return menu;
+}
+
+static GtkWidget *
+create_permissions_vbox (ExchangePermissionsDialog *dialog)
 {
-	GtkWidget *button;
+	GtkWidget *permissions_vbox;
+	GtkWidget *hbox1;
+	GtkWidget *scrolledwindow1;
+	GtkWidget *list_view;
+	GtkWidget *vbuttonbox1;
+	GtkWidget *add_button;
+	GtkWidget *remove_button;
+	GtkWidget *table2;
+	GtkWidget *label6;
+	GtkWidget *label7;
+	GtkWidget *label3;
+	GtkWidget *hbox3;
+	GtkWidget *label4;
+	GtkWidget *role_optionmenu;
+	GtkWidget *hbox2;
+	GtkWidget *vbox6;
+	GtkWidget *vbox8;
+	GtkWidget *create_items_check;
+	GtkWidget *read_items_check;
+	GtkWidget *create_subfolders_check;
+	GtkWidget *vbox9;
+	GtkWidget *edit_none_radio;
+	GSList *edit_none_radio_group = NULL;
+	GtkWidget *edit_own_radio;
+	GtkWidget *edit_all_radio;
+	GtkWidget *vbox7;
+	GtkWidget *vbox10;
+	GtkWidget *folder_owner_check;
+	GtkWidget *folder_contact_check;
+	GtkWidget *folder_visible_check;
+	GtkWidget *vbox11;
+	GtkWidget *delete_none_radio;
+	GSList *delete_none_radio_group = NULL;
+	GtkWidget *delete_own_radio;
+	GtkWidget *delete_all_radio;
+	gchar *tmp_str;
 	GtkTreeViewColumn *column;
 
-#define GET_WIDGET(name, type) dialog->priv->name = type (glade_xml_get_widget (xml, #name))
+	permissions_vbox = gtk_vbox_new (FALSE, 0);
+	gtk_widget_show (permissions_vbox);
+	gtk_container_set_border_width (GTK_CONTAINER (permissions_vbox), 6);
+
+	hbox1 = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox1);
+	gtk_box_pack_start (GTK_BOX (permissions_vbox), hbox1, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (hbox1), 6);
+
+	scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+	gtk_widget_show (scrolledwindow1);
+	gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, TRUE, TRUE, 0);
+	GTK_WIDGET_UNSET_FLAGS (scrolledwindow1, GTK_CAN_FOCUS);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_SHADOW_IN);
+
+	list_view = gtk_tree_view_new ();
+	gtk_widget_show (list_view);
+	gtk_container_add (GTK_CONTAINER (scrolledwindow1), list_view);
+
+	vbuttonbox1 = gtk_vbutton_box_new ();
+	gtk_widget_show (vbuttonbox1);
+	gtk_box_pack_start (GTK_BOX (hbox1), vbuttonbox1, FALSE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (vbuttonbox1), 4);
+	gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1), GTK_BUTTONBOX_SPREAD);
+	gtk_box_set_spacing (GTK_BOX (vbuttonbox1), 10);
+
+	add_button = gtk_button_new_from_stock ("gtk-add");
+	gtk_widget_show (add_button);
+	gtk_container_add (GTK_CONTAINER (vbuttonbox1), add_button);
+	GTK_WIDGET_SET_FLAGS (add_button, GTK_CAN_DEFAULT);
+
+	remove_button = gtk_button_new_from_stock ("gtk-remove");
+	gtk_widget_show (remove_button);
+	gtk_container_add (GTK_CONTAINER (vbuttonbox1), remove_button);
+	GTK_WIDGET_SET_FLAGS (remove_button, GTK_CAN_DEFAULT);
+
+	table2 = gtk_table_new (3, 2, FALSE);
+	gtk_widget_show (table2);
+	gtk_box_pack_start (GTK_BOX (permissions_vbox), table2, FALSE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (table2), 6);
+	gtk_table_set_row_spacings (GTK_TABLE (table2), 6);
+
+	label6 = gtk_label_new ("    ");
+	gtk_widget_show (label6);
+	gtk_table_attach (GTK_TABLE (table2), label6, 0, 1, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
+
+	label7 = gtk_label_new ("    ");
+	gtk_widget_show (label7);
+	gtk_table_attach (GTK_TABLE (table2), label7, 0, 1, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
+
+	tmp_str = g_strconcat ("<b>", _("Permissions"), "</b>", NULL);
+	label3 = gtk_label_new (tmp_str);
+	g_free (tmp_str);
+	gtk_widget_show (label3);
+	gtk_table_attach (GTK_TABLE (table2), label3, 0, 2, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_label_set_use_markup (GTK_LABEL (label3), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
+
+	hbox3 = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox3);
+	gtk_table_attach (GTK_TABLE (table2), hbox3, 1, 2, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
+
+	label4 = gtk_label_new (_("Role: "));
+	gtk_widget_show (label4);
+	gtk_box_pack_start (GTK_BOX (hbox3), label4, FALSE, FALSE, 0);
+	gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_CENTER);
+
+	role_optionmenu = exchange_permissions_role_optionmenu_new ();
+	gtk_widget_show (role_optionmenu);
+	gtk_box_pack_start (GTK_BOX (hbox3), role_optionmenu, TRUE, TRUE, 0);
+	GTK_WIDGET_UNSET_FLAGS (role_optionmenu, GTK_CAN_FOCUS);
+	GTK_WIDGET_UNSET_FLAGS (role_optionmenu, GTK_CAN_DEFAULT);
+
+	hbox2 = gtk_hbox_new (TRUE, 6);
+	gtk_widget_show (hbox2);
+	gtk_table_attach (GTK_TABLE (table2), hbox2, 1, 2, 2, 3,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (hbox2), 6);
+
+	vbox6 = gtk_vbox_new (FALSE, 12);
+	gtk_widget_show (vbox6);
+	gtk_box_pack_start (GTK_BOX (hbox2), vbox6, TRUE, TRUE, 0);
+
+	vbox8 = gtk_vbox_new (FALSE, 6);
+	gtk_widget_show (vbox8);
+	gtk_box_pack_start (GTK_BOX (vbox6), vbox8, TRUE, TRUE, 0);
+
+	create_items_check = gtk_check_button_new_with_mnemonic (_("Create items"));
+	gtk_widget_show (create_items_check);
+	gtk_box_pack_start (GTK_BOX (vbox8), create_items_check, FALSE, FALSE, 0);
+
+	read_items_check = gtk_check_button_new_with_mnemonic (_("Read items"));
+	gtk_widget_show (read_items_check);
+	gtk_box_pack_start (GTK_BOX (vbox8), read_items_check, FALSE, FALSE, 0);
+
+	create_subfolders_check = gtk_check_button_new_with_mnemonic (_("Create subfolders"));
+	gtk_widget_show (create_subfolders_check);
+	gtk_box_pack_start (GTK_BOX (vbox8), create_subfolders_check, FALSE, FALSE, 0);
+
+	vbox9 = gtk_vbox_new (FALSE, 6);
+	gtk_widget_show (vbox9);
+	gtk_box_pack_start (GTK_BOX (vbox6), vbox9, TRUE, TRUE, 0);
+
+	edit_none_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Cannot Edit"));
+	gtk_widget_show (edit_none_radio);
+	gtk_box_pack_start (GTK_BOX (vbox9), edit_none_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (edit_none_radio), edit_none_radio_group);
+	edit_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (edit_none_radio));
+
+	edit_own_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Edit Own Items"));
+	gtk_widget_show (edit_own_radio);
+	gtk_box_pack_start (GTK_BOX (vbox9), edit_own_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (edit_own_radio), edit_none_radio_group);
+	edit_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (edit_own_radio));
+
+	edit_all_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Edit Any Items"));
+	gtk_widget_show (edit_all_radio);
+	gtk_box_pack_start (GTK_BOX (vbox9), edit_all_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (edit_all_radio), edit_none_radio_group);
+	edit_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (edit_all_radio));
+
+	vbox7 = gtk_vbox_new (FALSE, 12);
+	gtk_widget_show (vbox7);
+	gtk_box_pack_start (GTK_BOX (hbox2), vbox7, TRUE, TRUE, 0);
+
+	vbox10 = gtk_vbox_new (FALSE, 6);
+	gtk_widget_show (vbox10);
+	gtk_box_pack_start (GTK_BOX (vbox7), vbox10, TRUE, TRUE, 0);
+
+	folder_owner_check = gtk_check_button_new_with_mnemonic (_("Folder owner"));
+	gtk_widget_show (folder_owner_check);
+	gtk_box_pack_start (GTK_BOX (vbox10), folder_owner_check, FALSE, FALSE, 0);
+
+	folder_contact_check = gtk_check_button_new_with_mnemonic (_("Folder contact"));
+	gtk_widget_show (folder_contact_check);
+	gtk_box_pack_start (GTK_BOX (vbox10), folder_contact_check, FALSE, FALSE, 0);
+
+	folder_visible_check = gtk_check_button_new_with_mnemonic (_("Folder visible"));
+	gtk_widget_show (folder_visible_check);
+	gtk_box_pack_start (GTK_BOX (vbox10), folder_visible_check, FALSE, FALSE, 0);
+
+	vbox11 = gtk_vbox_new (FALSE, 6);
+	gtk_widget_show (vbox11);
+	gtk_box_pack_start (GTK_BOX (vbox7), vbox11, TRUE, TRUE, 0);
+
+	delete_none_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Cannot Delete"));
+	gtk_widget_show (delete_none_radio);
+	gtk_box_pack_start (GTK_BOX (vbox11), delete_none_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (delete_none_radio), delete_none_radio_group);
+	delete_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (delete_none_radio));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (delete_none_radio), TRUE);
+
+	delete_own_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Delete Own Items"));
+	gtk_widget_show (delete_own_radio);
+	gtk_box_pack_start (GTK_BOX (vbox11), delete_own_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (delete_own_radio), delete_none_radio_group);
+	delete_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (delete_own_radio));
+
+	delete_all_radio = gtk_radio_button_new_with_mnemonic (NULL, _("Delete Any Items"));
+	gtk_widget_show (delete_all_radio);
+	gtk_box_pack_start (GTK_BOX (vbox11), delete_all_radio, FALSE, FALSE, 0);
+	gtk_radio_button_set_group (GTK_RADIO_BUTTON (delete_all_radio), delete_none_radio_group);
+	delete_none_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (delete_all_radio));
+
+#define GET_WIDGET(name, type) dialog->priv->name = type (name)
 
 	GET_WIDGET (list_view, GTK_TREE_VIEW);
 	column = gtk_tree_view_column_new_with_attributes (
@@ -714,11 +934,9 @@ get_widgets (ExchangePermissionsDialog *dialog, GladeXML *xml)
 	gtk_tree_view_set_model (dialog->priv->list_view,
 				 GTK_TREE_MODEL (dialog->priv->list_store));
 
-	button = glade_xml_get_widget (xml, "add_button");
-	g_signal_connect (button, "clicked",
+	g_signal_connect (add_button, "clicked",
 			  G_CALLBACK (add_clicked), dialog);
-	button = glade_xml_get_widget (xml, "remove_button");
-	g_signal_connect (button, "clicked",
+	g_signal_connect (remove_button, "clicked",
 			  G_CALLBACK (remove_clicked), dialog);
 
 	GET_WIDGET (role_optionmenu, GTK_COMBO_BOX);
@@ -761,28 +979,6 @@ get_widgets (ExchangePermissionsDialog *dialog, GladeXML *xml)
 			  "toggled", G_CALLBACK (rv_toggle), dialog);
 	g_signal_connect (dialog->priv->read_items_check,
 			  "toggled", G_CALLBACK (rv_toggle), dialog);
-}
-
-GtkWidget *exchange_permissions_role_optionmenu_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
 
-GtkWidget *
-exchange_permissions_role_optionmenu_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
-{
-	GtkWidget *menu;
-	const gchar **roles;
-	gint role;
-
-	menu = gtk_combo_box_new_text ();
-	roles = g_new (const gchar *, E2K_PERMISSIONS_ROLE_NUM_ROLES + 1);
-	for (role = 0; role < E2K_PERMISSIONS_ROLE_NUM_ROLES; role++) {
-		roles[role] = e2k_permissions_role_get_name (role);
-		gtk_combo_box_append_text (GTK_COMBO_BOX (menu), roles[role]);
-	}
-
-	roles[role] = NULL;
-
-	g_free (roles);
-
-	gtk_widget_show (menu);
-	return menu;
+	return permissions_vbox;
 }
diff --git a/plugins/exchange-operations/exchange-send-options.c b/plugins/exchange-operations/exchange-send-options.c
index 4c6e705..ecc0f03 100644
--- a/plugins/exchange-operations/exchange-send-options.c
+++ b/plugins/exchange-operations/exchange-send-options.c
@@ -30,18 +30,13 @@
 #include "exchange-operations.h"
 #include <e-util/e-util.h>
 #include <e-util/e-error.h>
-#include <glade/glade.h>
 
 #include "e-util/e-util-private.h"
 
 #include "exchange-send-options.h"
 
 struct _ExchangeSendOptionsDialogPrivate {
-	/* Glade XML data */
-	GladeXML *xml;
-
 	/*Widgets*/
-
 	GtkWidget *main;
 
 	/*name selector dialog*/
@@ -168,40 +163,6 @@ exchange_send_options_get_widgets_data (ExchangeSendOptionsDialog *sod)
 	return 1;
 }
 
-static gboolean
-get_widgets (ExchangeSendOptionsDialog *sod)
-{
-	ExchangeSendOptionsDialogPrivate *priv;
-
-	priv = sod->priv;
-
-#define EXCHANGE(name) glade_xml_get_widget (priv->xml, name)
-
-	priv->main = EXCHANGE ("send_options");
-	if (!priv->main)
-		return FALSE;
-
-	priv->importance = EXCHANGE ("imp_combo_box");
-	priv->sensitivity = EXCHANGE ("sensitivity_combo_box");
-	priv->button_user = EXCHANGE ("button-user");
-	priv->delegate_enabled = EXCHANGE ("del_enabled_check");
-	priv->read_receipt = EXCHANGE ("read_check_button");
-	priv->delivery_receipt = EXCHANGE ("delivery_check_button");
-	priv->importance_label = EXCHANGE ("Importance_label");
-	priv->sensitivity_label = EXCHANGE ("Sensitivity_label");
-
-#undef EXCHANGE
-
-	return (priv->importance
-		&&priv->sensitivity
-		&&priv->button_user
-		&&priv->delegate_enabled
-		&&priv->read_receipt
-		&&priv->delivery_receipt
-		&&priv->importance_label
-		&&priv->sensitivity_label);
-}
-
 static void
 exchange_send_options_fill_widgets_with_data (ExchangeSendOptionsDialog *sod)
 {
@@ -292,7 +253,6 @@ static void exchange_send_options_cb (GtkDialog *dialog, gint state, gpointer fu
 		case GTK_RESPONSE_CANCEL:
 			gtk_widget_hide (priv->main);
 			gtk_widget_destroy (priv->main);
-			g_object_unref (priv->xml);
 			break;
 		case GTK_RESPONSE_HELP:
 			e_display_help (
@@ -367,40 +327,162 @@ exchange_sendoptions_dialog_run (ExchangeSendOptionsDialog *sod, GtkWidget *pare
 	ExchangeSendOptionsDialogPrivate *priv;
 	ExchangeSendOptions *options;
 
-	GtkWidget *toplevel;
-	gchar *filename;
 	EDestinationStore *destination_store;
 	ENameSelectorDialog *name_selector_dialog;
 	ENameSelectorModel *name_selector_model;
 	ENameSelectorEntry *name_selector_entry;
 	EDestination *des;
-	GtkWidget *name_box;
+	GtkWidget *send_options;
+	GtkWidget *send_options_vbox;
+	GtkWidget *options_vbox;
+	GtkWidget *message_settings_vbox;
+	GtkWidget *msg_settings_label;
+	GtkWidget *msg_settings_table;
+	GtkWidget *importance_label;
+	GtkWidget *sensitivity_label;
+	GtkWidget *sensitivity_combo_box;
+	GtkWidget *imp_combo_box;
+	GtkWidget *del_enabled_check;
+	GtkWidget *hbox1;
+	GtkWidget *hbox2;
+	GtkWidget *del_name_box;
+	GtkWidget *button_user;
+	GtkWidget *track_option_vbox;
+	GtkWidget *track_options_label;
+	GtkWidget *delivery_check_button;
+	GtkWidget *read_check_button;
+	gchar *tmp_str;
 
 	g_return_val_if_fail (sod != NULL || EXCHANGE_IS_SENDOPTIONS_DIALOG (sod), FALSE);
 
 	priv = sod->priv;
 	options = sod->options;
 
-	filename = g_build_filename (EVOLUTION_GLADEDIR,
-				     "exchange-send-options.glade",
-				     NULL);
-	priv->xml = glade_xml_new (filename, NULL, NULL);
-	g_free (filename);
-
-	if (!priv->xml) {
-		g_message ( G_STRLOC ": Could not load the Glade XML file ");
-		return FALSE;
-	}
-
-	if (!get_widgets(sod)) {
-		g_object_unref (priv->xml);
-		g_message (G_STRLOC ": Could not get the Widgets \n");
-		return FALSE;
-	}
-
-	toplevel =  gtk_widget_get_toplevel (priv->main);
+	send_options = gtk_dialog_new_with_buttons (
+		_("Exchange - Send Options"),
+		NULL,
+		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+		GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OK, GTK_RESPONSE_OK,
+		NULL);
+	gtk_window_set_type_hint (GTK_WINDOW (send_options), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+	send_options_vbox = gtk_dialog_get_content_area (GTK_DIALOG (send_options));
+	gtk_widget_show (send_options_vbox);
+
+	options_vbox = gtk_vbox_new (FALSE, 0);
+	gtk_widget_show (options_vbox);
+	gtk_box_pack_start (GTK_BOX (send_options_vbox), options_vbox, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (options_vbox), 6);
+
+	message_settings_vbox = gtk_vbox_new (FALSE, 0);
+	gtk_widget_show (message_settings_vbox);
+	gtk_box_pack_start (GTK_BOX (options_vbox), message_settings_vbox, FALSE, FALSE, 0);
+
+	tmp_str = g_strconcat ("<b>", _("Message Settings"), "</b>", NULL);
+	msg_settings_label = gtk_label_new (tmp_str);
+	g_free (tmp_str);
+	gtk_widget_show (msg_settings_label);
+	gtk_box_pack_start (GTK_BOX (message_settings_vbox), msg_settings_label, FALSE, FALSE, 0);
+	gtk_label_set_use_markup (GTK_LABEL (msg_settings_label), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (msg_settings_label), 0, 0.49);
+
+	msg_settings_table = gtk_table_new (2, 2, FALSE);
+	gtk_widget_show (msg_settings_table);
+	gtk_box_pack_start (GTK_BOX (message_settings_vbox), msg_settings_table, FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (msg_settings_table), 6);
+	gtk_table_set_row_spacings (GTK_TABLE (msg_settings_table), 6);
+
+	importance_label = gtk_label_new_with_mnemonic (_("I_mportance: "));
+	gtk_widget_show (importance_label);
+	gtk_table_attach (GTK_TABLE (msg_settings_table), importance_label, 0, 1, 0, 1,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (importance_label), 0, 0.49);
+
+	sensitivity_label = gtk_label_new_with_mnemonic (_("_Sensitivity: "));
+	gtk_widget_show (sensitivity_label);
+	gtk_table_attach (GTK_TABLE (msg_settings_table), sensitivity_label, 0, 1, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (sensitivity_label), 0, 0.5);
+
+	sensitivity_combo_box = gtk_combo_box_new_text ();
+	gtk_widget_show (sensitivity_combo_box);
+	gtk_table_attach (GTK_TABLE (msg_settings_table), sensitivity_combo_box, 1, 2, 1, 2,
+			  (GtkAttachOptions) (GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (sensitivity_combo_box), _("Normal"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (sensitivity_combo_box), _("Personal"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (sensitivity_combo_box), _("Private"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (sensitivity_combo_box), _("Confidential"));
+
+	imp_combo_box = gtk_combo_box_new_text ();
+	gtk_widget_show (imp_combo_box);
+	gtk_table_attach (GTK_TABLE (msg_settings_table), imp_combo_box, 1, 2, 0, 1,
+			  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+			  (GtkAttachOptions) (GTK_FILL), 0, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (imp_combo_box), _("Normal"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (imp_combo_box), _("High"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (imp_combo_box), _("Low"));
+
+	del_enabled_check = gtk_check_button_new_with_mnemonic (_("Send as Delegate"));
+	gtk_widget_show (del_enabled_check);
+	gtk_box_pack_start (GTK_BOX (options_vbox), del_enabled_check, FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (del_enabled_check), 6);
+
+	hbox1 = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (hbox1);
+	gtk_box_pack_start (GTK_BOX (options_vbox), hbox1, TRUE, TRUE, 0);
+
+	hbox2 = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (hbox2);
+	gtk_box_pack_start (GTK_BOX (hbox1), hbox2, TRUE, TRUE, 0);
+
+	del_name_box = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (del_name_box);
+	gtk_box_pack_start (GTK_BOX (hbox2), del_name_box, TRUE, TRUE, 0);
+
+	button_user = gtk_button_new_with_mnemonic (_("_User"));
+	gtk_widget_show (button_user);
+	gtk_box_pack_start (GTK_BOX (hbox1), button_user, FALSE, FALSE, 0);
+
+	track_option_vbox = gtk_vbox_new (FALSE, 0);
+	gtk_widget_show (track_option_vbox);
+	gtk_box_pack_start (GTK_BOX (options_vbox), track_option_vbox, TRUE, TRUE, 0);
+
+	tmp_str = g_strconcat ("<b>", _("Tracking Options"), "</b>", NULL);
+	track_options_label = gtk_label_new (tmp_str);
+	g_free (tmp_str);
+	gtk_widget_show (track_options_label);
+	gtk_box_pack_start (GTK_BOX (track_option_vbox), track_options_label, FALSE, FALSE, 6);
+	gtk_label_set_use_markup (GTK_LABEL (track_options_label), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (track_options_label), 0, 0.5);
+
+	delivery_check_button = gtk_check_button_new_with_mnemonic (_("Request a _delivery receipt for this message"));
+	gtk_widget_show (delivery_check_button);
+	gtk_box_pack_start (GTK_BOX (track_option_vbox), delivery_check_button, FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (delivery_check_button), 6);
+
+	read_check_button = gtk_check_button_new_with_mnemonic (_("Request a _read receipt for this message"));
+	gtk_widget_show (read_check_button);
+	gtk_box_pack_start (GTK_BOX (track_option_vbox), read_check_button, FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (read_check_button), 6);
+
+	priv->main = send_options;
+	priv->importance = imp_combo_box;
+	priv->sensitivity = sensitivity_combo_box;
+	priv->button_user = button_user;
+	priv->delegate_enabled = del_enabled_check;
+	priv->read_receipt = read_check_button;
+	priv->delivery_receipt = delivery_check_button;
+	priv->importance_label = importance_label;
+	priv->sensitivity_label = sensitivity_label;
+
+	send_options =  gtk_widget_get_toplevel (priv->main);
 	if (parent)
-		gtk_window_set_transient_for (GTK_WINDOW (toplevel),
+		gtk_window_set_transient_for (GTK_WINDOW (send_options),
 				      GTK_WINDOW (parent));
 
 	priv->proxy_name_selector = e_name_selector_new ();
@@ -435,8 +517,7 @@ exchange_sendoptions_dialog_run (ExchangeSendOptionsDialog *sod, GtkWidget *pare
 
 	/* The name box is just a container. The name_selector_entry is added to it. This Widget
 	   is created dynamically*/
-	name_box = glade_xml_get_widget (priv->xml, "del_name_box");
-	gtk_container_add ((GtkContainer *) name_box, (GtkWidget *) name_selector_entry);
+	gtk_container_add ((GtkContainer *) del_name_box, (GtkWidget *) name_selector_entry);
 	gtk_widget_show ((GtkWidget *) name_selector_entry);
 	gtk_widget_grab_focus ((GtkWidget *) name_selector_entry);
 
@@ -490,7 +571,6 @@ exchange_sendoptions_dialog_init (GObject *object)
 	sod->options->importance = E_IMP_NORMAL;
 	sod->options->sensitivity = E_SENSITIVITY_NORMAL;
 
-	priv->xml = NULL;
 	priv->main = NULL;
 	priv->importance = NULL;
 	priv->sensitivity = NULL;
diff --git a/plugins/exchange-operations/exchange-user-dialog.c b/plugins/exchange-operations/exchange-user-dialog.c
index 8232264..908ffd3 100644
--- a/plugins/exchange-operations/exchange-user-dialog.c
+++ b/plugins/exchange-operations/exchange-user-dialog.c
@@ -134,7 +134,8 @@ e2k_user_dialog_construct (E2kUserDialog *dialog,
 				GTK_STOCK_OK, GTK_RESPONSE_OK,
 				NULL);
 
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
+	if (parent_window)
+		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent_window));
 
 	priv = dialog->priv;
 	priv->section_name = g_strdup (section_name);
diff --git a/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml b/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml
index 063d5c9..fcd6ff0 100644
--- a/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml
+++ b/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml
@@ -13,218 +13,108 @@
     <author name="Raghavendran R" email="raghavguru7 gmail com"/>	
     <_description>Activates the Evolution-Exchange extension package.</_description>
 	
-    <hook class="org.gnome.evolution.mail.config:1.0">
-      	<group 
-		target="account" 
-		id="org.gnome.evolution.mail.config.accountEditor"
-		check="org_gnome_exchange_check_options"
-		commit="org_gnome_exchange_commit">
-		<item type="page" 
-	      		path="40.oof" 
-	      		_label="Exchange Settings"
-	      		factory="org_gnome_exchange_settings"/>
-                <item type="item_table"
-                        path="10.receive/10.config/20.owa"
-			factory="org_gnome_exchange_owa_url"/>
-		<item type="section"
-			path="10.receive/30.auth/00.exchange_auth"
-			factory="org_gnome_exchange_auth_section"/>
-      	</group>
-
-        <group
-                target="account"
-                id="org.gnome.evolution.mail.config.accountAssistant"
-		check="org_gnome_exchange_check_options">
-                <item type="item_table"
-                        path="10.receive/10.config/20.owa"
-			factory="org_gnome_exchange_owa_url"/>
-		<item type="section"
-			path="10.receive/30.auth/00.exchange_auth"
-			factory="org_gnome_exchange_auth_section"/>
-	</group>
-
-        <group
-                target="account"
-                id="org.gnome.evolution.mail.config.accountWizard"
-		check="org_gnome_exchange_check_options">
-                <item type="item_table"
-                        path="10.receive/10.config/20.owa"
-			factory="org_gnome_exchange_owa_url"/>
-	</group>
-    </hook>
+	<hook class="org.gnome.evolution.mail.config:1.0">
+		<group target="account" id="org.gnome.evolution.mail.config.accountEditor" check="org_gnome_exchange_check_options" commit="org_gnome_exchange_commit">
+			<item type="page" path="40.oof" _label="Exchange Settings" factory="org_gnome_exchange_settings"/>
+			<item type="item_table" path="10.receive/10.config/20.owa" factory="org_gnome_exchange_owa_url"/>
+			<item type="section" path="10.receive/30.auth/00.exchange_auth" factory="org_gnome_exchange_auth_section"/>
+		</group>
 
-    <hook class="org.gnome.evolution.calendar.config:1.0">
-	<group
-	     target="source"
-	     id="org.gnome.evolution.calendar.calendarProperties"
-	     check="e_exchange_calendar_check"
-	     commit="e_exchange_calendar_commit">
-                <item
-		 type="item_table"
-		 path="00.general/00.source/40.pcalendar"
-		 factory="e_exchange_calendar_pcalendar"/>
-        </group>
-    </hook>
+		<group target="account" id="org.gnome.evolution.mail.config.accountAssistant" check="org_gnome_exchange_check_options">
+			<item type="item_table" path="10.receive/10.config/20.owa" factory="org_gnome_exchange_owa_url"/>
+			<item type="section" path="10.receive/30.auth/00.exchange_auth" factory="org_gnome_exchange_auth_section"/>
+		</group>
 
-    <hook class="org.gnome.evolution.addressbook.config:1.0">
-        <group
-	     target="source"
-	     id="com.novell.evolution.addressbook.config.accountEditor"
-	     check="e_exchange_contacts_check"
-	     commit="e_exchange_contacts_commit">
-             <item
-		 type="item"
-		 path="00.general/10.display/40.pcontacts"
-		 factory="e_exchange_contacts_pcontacts"/>
-	</group>
-    </hook>
+		<group target="account" id="org.gnome.evolution.mail.config.accountWizard" check="org_gnome_exchange_check_options">
+			<item type="item_table" path="10.receive/10.config/20.owa" factory="org_gnome_exchange_owa_url"/>
+		</group>
 
-	<hook class="org.gnome.evolution.mail.popup:1.0">
-		<menu id="org.gnome.evolution.mail.foldertree.popup" target="folder" factory = "org_gnome_exchange_folder_permissions">
-		</menu>
-	</hook> 
-	<hook class="org.gnome.evolution.calendar.popup:1.0">
-		<menu id="org.gnome.evolution.calendar.source.popup" target="source" factory="org_gnome_exchange_calendar_permissions">
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.popup:1.0">
-		<menu id="org.gnome.evolution.tasks.source.popup" target="source" factory="org_gnome_exchange_calendar_permissions">
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.addressbook.popup:1.0">
-		<menu id="org.gnome.evolution.addressbook.source.popup" target="source" factory="org_gnome_exchange_addressbook_permissions">
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.mail.bonobomenu:1.0">
-	<menu id="org.gnome.evolution.mail.browser" target="select">
-	<ui file="@PLUGINDIR@/org-gnome-folder-permissions.xml"/>
-	<item
-		type="item"
-		verb="CheckFolderPermission"
-		path="/commands/CheckFolderPermission"
-		enable="all"
-		activate="org_gnome_exchange_menu_folder_permissions"/>
-	</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.bonobomenu:1.0">
-	<menu id="org.gnome.evolution.calendar.view" target="select">
-	<ui file="@PLUGINDIR@/org-gnome-folder-permissions.xml"/>
-	<item
-		type="item"
-		verb="CheckFolderPermission"
-		path="/commands/CheckFolderPermission"
-		enable="all"
-		activate="org_gnome_exchange_menu_cal_permissions"/>
-	</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.bonobomenu:1.0">
-	<menu id="org.gnome.evolution.tasks.view" target="select">
-	<ui file="@PLUGINDIR@/org-gnome-folder-permissions.xml"/>
-	<item
-		type="item"
-		verb="CheckFolderPermission"
-		path="/commands/CheckFolderPermission"
-		enable="all"
-		activate="org_gnome_exchange_menu_tasks_permissions"/>
-	</menu>
-	</hook>
-	<hook class="org.gnome.evolution.addressbook.bonobomenu:1.0">
-	<menu id="org.gnome.evolution.addressbook.view" target="select">
-	<ui file="@PLUGINDIR@/org-gnome-folder-permissions.xml"/>
-	<item
-		type="item"
-		verb="CheckFolderPermission"
-		path="/commands/CheckFolderPermission"
-		enable="all"
-		activate="org_gnome_exchange_menu_ab_permissions"/>
-	</menu>
-	</hook>
-	<hook class="org.gnome.evolution.mail.bonobomenu:1.0">
-		<menu id="org.gnome.evolution.mail.browser" target="select">
-		<ui file="@PLUGINDIR@/org-gnome-folder-subscription.xml"/>
-		<item
-			type="item"
-			verb="FolderSubscription"
-			path="/commands/FolderSubscription"
-			enable="all"
-			activate="org_gnome_exchange_inbox_subscription"/>
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.bonobomenu:1.0">
-		<menu id="org.gnome.evolution.calendar.view" target="select">
-		<ui file="@PLUGINDIR@/org-gnome-exchange-cal-subscription.xml"/>
-		<item
-			type="item"
-			verb="FolderSubscription"
-			path="/commands/FolderSubscription"
-			enable="all"
-			activate="org_gnome_exchange_calendar_subscription"/>
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.bonobomenu:1.0">
-		<menu id="org.gnome.evolution.tasks.view" target="select">
-		<ui file="@PLUGINDIR@/org-gnome-exchange-tasks-subscription.xml"/>
-		<item
-			type="item"
-			verb="FolderSubscription"
-			path="/commands/FolderSubscription"
-			enable="all"
-			activate="org_gnome_exchange_tasks_subscription"/>
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.addressbook.bonobomenu:1.0">
-		<menu id="org.gnome.evolution.addressbook.view" target="select">
-		<ui file="@PLUGINDIR@/org-gnome-exchange-ab-subscription.xml"/>
-		<item
-			type="item"
-			verb="FolderSubscription"
-			path="/commands/FolderSubscription"
-			enable="all"
-			activate="org_gnome_exchange_addressbook_subscription"/>
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.popup:1.0">
-		<menu id="org.gnome.evolution.calendar.source.popup" 
-			target="source" 
-			factory="org_gnome_exchange_check_subscribed">
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.calendar.popup:1.0">
-		<menu id="org.gnome.evolution.tasks.source.popup" 
-			target="source" 
-			factory="org_gnome_exchange_check_subscribed">
-		</menu>
-	</hook>
-	<hook class="org.gnome.evolution.addressbook.popup:1.0">
-		<menu id="org.gnome.evolution.addressbook.source.popup" 
-			target="source" 
-			factory="org_gnome_exchange_check_address_book_subscribed">
-		</menu>
+		<group id="org.gnome.evolution.mail.folderConfig" target="folder" check= "exchange_show_folder_size_check">
+			<item type="page" path="10.size" _label="Size" factory="org_gnome_exchange_show_folder_size_factory"/>
+		</group>
 	</hook>
-	<hook class="org.gnome.evolution.mail.popup:1.0">
-		<menu id="org.gnome.evolution.mail.foldertree.popup" 
-			target="folder" 
-			factory = "org_gnome_exchange_check_inbox_subscribed">
-		</menu>
+
+	<hook class="org.gnome.evolution.calendar.config:1.0">
+		<group target="source" id="org.gnome.evolution.calendar.calendarProperties" check="e_exchange_calendar_check" commit="e_exchange_calendar_commit">
+			<item type="item_table" path="00.general/00.source/40.pcalendar" factory="e_exchange_calendar_pcalendar"/>
+		</group>
 	</hook>
-	<hook class="org.gnome.evolution.mail.config:1.0">
-		<group id="org.gnome.evolution.mail.folderConfig" 
-			target="folder"
-			check= "exchange_show_folder_size_check">
-		<item 
-			type="page" 
-			path="10.size" 
-			_label="Size" 
-			factory="org_gnome_exchange_show_folder_size_factory"/>
+
+	<hook class="org.gnome.evolution.addressbook.config:1.0">
+		<group target="source" id="com.novell.evolution.addressbook.config.accountEditor" check="e_exchange_contacts_check" commit="e_exchange_contacts_commit">
+			<item type="item" path="00.general/10.display/40.pcontacts" factory="e_exchange_contacts_pcontacts"/>
 		</group>
 	</hook>
+
 	<hook class="org.gnome.evolution.mail.events:1.0">
-			<event
-			   id="composer.selectsendoption"
-			   handle="org_gnome_exchange_send_options"
-			   target="composer"
-			   enable="sendoption"
-			/>
+		<event id="composer.selectsendoption" handle="org_gnome_exchange_send_options" target="composer" enable="sendoption"/>
+	</hook>
+
+	<hook class="org.gnome.evolution.ui:1.0">
+		<ui-manager id="org.gnome.evolution.mail" callback="eex_ui_mail_init">
+			<popup name="mail-folder-popup">
+				<placeholder name="mail-folder-popup-actions">
+					<menuitem action="eex-mail-folder-permissions"/>
+					<menuitem action="eex-mail-folder-inbox-unsubscribe"/>
+				</placeholder>
+			</popup>
+			<menubar name="main-menu">
+				<menu action="file-menu">
+					<placeholder name="file-actions">
+						<menuitem action="eex-mail-folder-permissions"/>
+						<menuitem action="eex-folder-subscribe-Inbox"/>
+					</placeholder>
+				</menu>
+			</menubar>
+		</ui-manager>
+		<ui-manager id="org.gnome.evolution.calendar" callback="eex_ui_calendar_permissions">
+			<popup name="calendar-popup">
+				<placeholder name="calendar-popup-actions">
+					<menuitem action="eex-calendar-permissions"/>
+					<menuitem action="eex-folder-unsubscribe-Calendar"/>
+				</placeholder>
+			</popup>
+			<menubar name="main-menu">
+				<menu action="file-menu">
+					<placeholder name="file-actions">
+						<menuitem action="eex-calendar-permissions"/>
+						<menuitem action="eex-folder-subscribe-Calendar"/>
+					</placeholder>
+				</menu>
+			</menubar>
+		</ui-manager>
+		<ui-manager id="org.gnome.evolution.task" callback="eex_ui_tasks_permissions">
+			<popup name="task-list-popup">
+				<placeholder name="task-list-popup-actions">
+					<menuitem action="eex-tasks-permissions"/>
+					<menuitem action="eex-folder-unsubscribe-Tasks"/>
+				</placeholder>
+			</popup>
+			<menubar name="main-menu">
+				<menu action="file-menu">
+					<placeholder name="file-actions">
+						<menuitem action="eex-tasks-permissions"/>
+						<menuitem action="eex-folder-subscribe-Tasks"/>
+					</placeholder>
+				</menu>
+			</menubar>
+		</ui-manager>
+		<ui-manager id="org.gnome.evolution.addressbook" callback="eex_ui_addressbook_permissions">
+			<popup name="address-book-popup">
+				<placeholder name="address-book-popup-actions">
+					<menuitem action="eex-addressbook-permissions"/>
+					<menuitem action="eex-folder-unsubscribe-Contacts"/>
+				</placeholder>
+			</popup>
+			<menubar name="main-menu">
+				<menu action="file-menu">
+					<placeholder name="file-actions">
+						<menuitem action="eex-addressbook-permissions"/>
+						<menuitem action="eex-folder-subscribe-Contacts"/>
+					</placeholder>
+				</menu>
+			</menubar>
+		</ui-manager>
 	</hook>
   </e-plugin>
 </e-plugin-list>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 460bd97..5d8c1c9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -306,35 +306,22 @@ plugins/email-custom-header/email-custom-header.c
 plugins/email-custom-header/email-custom-header.glade
 plugins/email-custom-header/org-gnome-email-custom-header.eplug.xml
 plugins/email-custom-header/org-gnome-email-custom-header.glade
-plugins/exchange-operations/e-foreign-folder-dialog.glade
 plugins/exchange-operations/exchange-account-setup.c
 plugins/exchange-operations/exchange-calendar.c
 plugins/exchange-operations/exchange-change-password.c
-plugins/exchange-operations/exchange-change-password.glade
 plugins/exchange-operations/exchange-config-listener.c
 plugins/exchange-operations/exchange-contacts.c
 plugins/exchange-operations/exchange-delegates-user.c
 plugins/exchange-operations/exchange-delegates.c
-plugins/exchange-operations/exchange-delegates.glade
 plugins/exchange-operations/exchange-folder-permission.c
 plugins/exchange-operations/exchange-folder-size-display.c
 plugins/exchange-operations/exchange-folder-subscription.c
-plugins/exchange-operations/exchange-folder-tree.glade
 plugins/exchange-operations/exchange-folder.c
-plugins/exchange-operations/exchange-oof.glade
-plugins/exchange-operations/exchange-passwd-expiry.glade
 plugins/exchange-operations/exchange-permissions-dialog.c
-plugins/exchange-operations/exchange-permissions-dialog.glade
 plugins/exchange-operations/exchange-send-options.c
-plugins/exchange-operations/exchange-send-options.glade
 plugins/exchange-operations/exchange-user-dialog.c
-plugins/exchange-operations/org-gnome-exchange-ab-subscription.xml
-plugins/exchange-operations/org-gnome-exchange-cal-subscription.xml
 plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml
 plugins/exchange-operations/org-gnome-exchange-operations.error.xml
-plugins/exchange-operations/org-gnome-exchange-tasks-subscription.xml
-plugins/exchange-operations/org-gnome-folder-permissions.xml
-plugins/exchange-operations/org-gnome-folder-subscription.xml
 plugins/external-editor/apps-evolution-external-editor.schemas.in
 plugins/external-editor/external-editor.c
 plugins/external-editor/org-gnome-external-editor.eplug.xml
diff --git a/ui/evolution-contacts.ui b/ui/evolution-contacts.ui
index cf95acd..6fb31b4 100644
--- a/ui/evolution-contacts.ui
+++ b/ui/evolution-contacts.ui
@@ -60,6 +60,7 @@
     <menuitem action='address-book-popup-save-as'/>
     <separator/>
     <menuitem action='address-book-popup-delete'/>
+    <placeholder name='address-book-popup-actions'/>
     <separator/>
     <menuitem action='address-book-popup-properties'/>
   </popup>
diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
index 91906b0..dd94186 100644
--- a/widgets/misc/Makefile.am
+++ b/widgets/misc/Makefile.am
@@ -16,7 +16,6 @@ privsolib_LTLIBRARIES =		\
 	libemiscwidgets.la
 
 widgetsincludedir = $(privincludedir)/misc
-filterbarincludedir = $(privincludedir)/misc
 
 if ENABLE_PILOT_CONDUITS
 pilot_sources = e-pilot-settings.c



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