diff --git a/configure.ac b/configure.ac
index 1382b63..b4842b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1773,11 +1773,10 @@ plugins_experimental="$plugins_experimental_always $IPOD_SYNC $TNEF_ATTACHMENTS"
 all_plugins_experimental="$plugins_experimental_always ipod-sync tnef-attachments"
 
 dnl Temporary KILL-BONOBO hack
-enable_plugins="attachment-reminder addressbook-file audio-inline backup-restore bbdb bogo-junk-plugin caldav calendar-file calendar-http calendar-weather default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features itip-formatter mailing-list-actions mail-notification mail-to-task mark-all-read plugin-manager prefer-plain profiler pst-import publish-calendar sa-junk-plugin save-calendar startup-wizard subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup"
+enable_plugins="attachment-reminder addressbook-file audio-inline backup-restore bbdb bogo-junk-plugin caldav calendar-file calendar-http calendar-weather default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features itip-formatter mailing-list-actions mail-notification mail-to-task mark-all-read plugin-manager prefer-plain profiler pst-import publish-calendar sa-junk-plugin save-calendar startup-wizard subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup exchange-operations"
 
 dnl PLUGINS NOT BUILDING YET
 dnl ------------------------
-dnl exchange-operations
 dnl groupwise-features
 dnl ipod-sync
 
diff --git a/plugins/exchange-operations/Makefile.am b/plugins/exchange-operations/Makefile.am
index 933da52..aa641de 100644
--- a/plugins/exchange-operations/Makefile.am
+++ b/plugins/exchange-operations/Makefile.am
@@ -12,12 +12,7 @@ AM_CPPFLAGS = -I .						\
 
 @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,9 +47,9 @@ 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)
 
@@ -76,11 +71,6 @@ 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)						
 
 BUILT_SOURCES = $(error_DATA) org-gnome-exchange-operations.eplug 
diff --git a/plugins/exchange-operations/exchange-delegates-user.c b/plugins/exchange-operations/exchange-delegates-user.c
index 555b0ee..983ac77 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>
@@ -226,7 +226,8 @@ exchange_delegates_user_edit (ExchangeAccount *account,
 
 	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);
+	if (parent_window)
+		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent_window));
 	g_free (title);
 
 	table = glade_xml_get_widget (xml, "toplevel_table");
@@ -419,7 +420,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);
diff --git a/plugins/exchange-operations/exchange-delegates.c b/plugins/exchange-operations/exchange-delegates.c
index dda48df..51a4129 100644
--- a/plugins/exchange-operations/exchange-delegates.c
+++ b/plugins/exchange-operations/exchange-delegates.c
@@ -580,7 +580,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);
@@ -929,7 +929,8 @@ exchange_delegates (ExchangeAccount *account, GtkWidget *parent)
 	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);
 
diff --git a/plugins/exchange-operations/exchange-folder-permission.c b/plugins/exchange-operations/exchange-folder-permission.c
index 7113ef8..4beb96a 100644
--- a/plugins/exchange-operations/exchange-folder-permission.c
+++ b/plugins/exchange-operations/exchange-folder-permission.c
@@ -29,313 +29,500 @@
 #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..dbd6bf3 100644
--- a/plugins/exchange-operations/exchange-folder-size-display.c
+++ b/plugins/exchange-operations/exchange-folder-size-display.c
@@ -119,7 +119,8 @@ exchange_folder_size_display (GtkListStore *model, GtkWidget *parent)
         table = glade_xml_get_widget (xml, "folder_treeview");
 	g_object_unref (xml);
 
-        gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
+	if (parent)
+		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
 	/* fsize->parent = parent; */
 
         /* Set up the table */
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-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 976ba7b..4257d53 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -323,13 +323,8 @@ 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
