diff --git a/libpurple/protocols/jabber/buddy.h b/libpurple/protocols/jabber/buddy.h
--- a/libpurple/protocols/jabber/buddy.h
+++ b/libpurple/protocols/jabber/buddy.h
@@ -96,11 +96,11 @@ void jabber_buddy_get_info(PurpleProtoco
 GList *jabber_blist_node_menu(PurpleProtocolClient *client, PurpleBlistNode *node);
 
 void jabber_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *info);
-void jabber_setup_set_info(PurpleProtocolAction *action);
+void jabber_setup_set_info(GSimpleAction *action, GVariant *parameter, gpointer data);
 void jabber_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleImage *img);
 
 void jabber_user_search(JabberStream *js, const char *directory);
-void jabber_user_search_begin(PurpleProtocolAction *);
+void jabber_user_search_begin(GSimpleAction *action, GVariant *parameter, gpointer data);
 
 void jabber_buddy_remove_all_pending_buddy_info_requests(JabberStream *js);
 
# HG changeset patch
# Node ID 5043fa2a94bc
# Parent  0d71a8bef4c3
diff --git a/libpurple/protocols/jabber/buddy.c b/libpurple/protocols/jabber/buddy.c
--- a/libpurple/protocols/jabber/buddy.c
+++ b/libpurple/protocols/jabber/buddy.c
@@ -600,15 +600,20 @@ jabber_format_info(PurpleConnection *gc,
 }
 
 /*
- * This gets executed by the proto action
+ * This gets executed as the protocol action.
  *
  * Creates a new PurpleRequestFields struct, gets the XML-formatted user_info
  * string (if any) into GSLists for the (multi-entry) edit dialog and
  * calls the set_vcard dialog.
  */
-void jabber_setup_set_info(PurpleProtocolAction *action)
+void
+jabber_setup_set_info(G_GNUC_UNUSED GSimpleAction *action, GVariant *parameter,
+                      G_GNUC_UNUSED gpointer data)
 {
-	PurpleConnection *gc = (PurpleConnection *) action->connection;
+	const char *account_id = NULL;
+	PurpleAccountManager *manager = NULL;
+	PurpleAccount *account = NULL;
+	PurpleConnection *connection = NULL;
 	PurpleRequestFields *fields;
 	PurpleRequestFieldGroup *group;
 	PurpleRequestField *field;
@@ -617,6 +622,16 @@ void jabber_setup_set_info(PurpleProtoco
 	char *cdata = NULL;
 	PurpleXmlNode *x_vc_data = NULL;
 
+	if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) {
+		g_critical("XMPP Set Info action parameter is of incorrect type %s",
+		           g_variant_get_type_string(parameter));
+	}
+
+	account_id = g_variant_get_string(parameter, NULL);
+	manager = purple_account_manager_get_default();
+	account = purple_account_manager_find_by_id(manager, account_id);
+	connection = purple_account_get_connection(account);
+
 	fields = purple_request_fields_new();
 	group = purple_request_field_group_new(NULL);
 	purple_request_fields_add_group(fields, group);
@@ -624,8 +639,9 @@ void jabber_setup_set_info(PurpleProtoco
 	/*
 	 * Get existing, XML-formatted, user info
 	 */
-	if((user_info = purple_account_get_user_info(purple_connection_get_account(gc))) != NULL)
+	if((user_info = purple_account_get_user_info(account)) != NULL) {
 		x_vc_data = purple_xmlnode_from_str(user_info, -1);
+	}
 
 	/*
 	 * Set up GSLists for edit with labels from "template," data from user info
@@ -666,15 +682,15 @@ void jabber_setup_set_info(PurpleProtoco
 	if(x_vc_data != NULL)
 		purple_xmlnode_free(x_vc_data);
 
-	purple_request_fields(gc, _("Edit XMPP vCard"),
-						_("Edit XMPP vCard"),
-						_("All items below are optional. Enter only the "
-						  "information with which you feel comfortable."),
-						fields,
-						_("Save"), G_CALLBACK(jabber_format_info),
-						_("Cancel"), NULL,
-						purple_request_cpar_from_connection(gc),
-						gc);
+	purple_request_fields(connection, _("Edit XMPP vCard"),
+	                      _("Edit XMPP vCard"),
+	                      _("All items below are optional. Enter only the "
+	                        "information with which you feel comfortable."),
+	                      fields,
+	                      _("Save"), G_CALLBACK(jabber_format_info),
+	                      _("Cancel"), NULL,
+	                      purple_request_cpar_from_connection(connection),
+	                      connection);
 }
 
 /*---------------------------------------*/
@@ -2197,21 +2213,40 @@ void jabber_user_search(JabberStream *js
 	jabber_iq_send(iq);
 }
 
-void jabber_user_search_begin(PurpleProtocolAction *action)
+void
+jabber_user_search_begin(G_GNUC_UNUSED GSimpleAction *action,
+                         GVariant *parameter, G_GNUC_UNUSED gpointer data)
 {
-	PurpleConnection *gc = (PurpleConnection *) action->connection;
-	JabberStream *js = purple_connection_get_protocol_data(gc);
-	const char *def_val = purple_account_get_string(purple_connection_get_account(js->gc), "user_directory", "");
-	if(!*def_val && js->user_directories)
-		def_val = js->user_directories->data;
+	const char *account_id = NULL;
+	PurpleAccountManager *manager = NULL;
+	PurpleAccount *account = NULL;
+	PurpleConnection *connection = NULL;
+	JabberStream *js = NULL;
+	const char *def_val = NULL;
+
+	if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) {
+		g_critical("XMPP User Search action parameter is of incorrect type %s",
+		           g_variant_get_type_string(parameter));
+	}
 
-	purple_request_input(gc, _("Enter a User Directory"), _("Enter a User Directory"),
-			_("Select a user directory to search"),
-			def_val,
-			FALSE, FALSE, NULL,
-			_("Search Directory"), G_CALLBACK(jabber_user_search),
-			_("Cancel"), NULL,
-			NULL, js);
+	account_id = g_variant_get_string(parameter, NULL);
+	manager = purple_account_manager_get_default();
+	account = purple_account_manager_find_by_id(manager, account_id);
+	connection = purple_account_get_connection(account);
+
+	js = purple_connection_get_protocol_data(connection);
+	def_val = purple_account_get_string(account, "user_directory", "");
+	if(*def_val == '\0' && js->user_directories) {
+		def_val = js->user_directories->data;
+	}
+
+	purple_request_input(connection, _("Enter a User Directory"),
+	                     _("Enter a User Directory"),
+	                     _("Select a user directory to search"),
+	                     def_val, FALSE, FALSE, NULL,
+	                     _("Search Directory"), G_CALLBACK(jabber_user_search),
+	                     _("Cancel"), NULL,
+	                     NULL, js);
 }
 
 gboolean
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -2409,15 +2409,30 @@ static void jabber_password_change_cb(Ja
 	jabber_iq_send(iq);
 }
 
-static void jabber_password_change(PurpleProtocolAction *action)
+static void
+jabber_password_change(G_GNUC_UNUSED GSimpleAction *action, GVariant *parameter,
+                       G_GNUC_UNUSED gpointer data)
 {
-
-	PurpleConnection *gc = (PurpleConnection *) action->connection;
-	JabberStream *js = purple_connection_get_protocol_data(gc);
+	const char *account_id = NULL;
+	PurpleAccountManager *manager = NULL;
+	PurpleAccount *account = NULL;
+	PurpleConnection *connection = NULL;
+	JabberStream *js = NULL;
 	PurpleRequestFields *fields;
 	PurpleRequestFieldGroup *group;
 	PurpleRequestField *field;
 
+	if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) {
+		g_critical("XMPP Change Password action parameter is of incorrect type %s",
+		           g_variant_get_type_string(parameter));
+	}
+
+	account_id = g_variant_get_string(parameter, NULL);
+	manager = purple_account_manager_get_default();
+	account = purple_account_manager_find_by_id(manager, account_id);
+	connection = purple_account_get_connection(account);
+	js = purple_connection_get_protocol_data(connection);
+
 	fields = purple_request_fields_new();
 	group = purple_request_field_group_new(NULL);
 	purple_request_fields_add_group(fields, group);
@@ -2434,42 +2449,97 @@ static void jabber_password_change(Purpl
 	purple_request_field_set_required(field, TRUE);
 	purple_request_field_group_add_field(group, field);
 
-	purple_request_fields(js->gc, _("Change XMPP Password"),
-			_("Change XMPP Password"), _("Please enter your new password"),
-			fields, _("OK"), G_CALLBACK(jabber_password_change_cb),
-			_("Cancel"), NULL,
-			purple_request_cpar_from_connection(gc), js);
+	purple_request_fields(connection, _("Change XMPP Password"),
+	                      _("Change XMPP Password"),
+	                      _("Please enter your new password"),
+	                      fields,
+	                      _("OK"), G_CALLBACK(jabber_password_change_cb),
+	                      _("Cancel"), NULL,
+	                      purple_request_cpar_from_connection(connection), js);
+}
+
+static const gchar *
+xmpp_protocol_actions_get_prefix(PurpleProtocolActions *actions) {
+	return "prpl-xmpp";
 }
 
-GList *
-jabber_get_actions(PurpleProtocolClient *client, PurpleConnection *gc) {
-	JabberStream *js = purple_connection_get_protocol_data(gc);
-	GList *m = NULL;
-	PurpleProtocolAction *act;
-
-	act = purple_protocol_action_new(_("Set User Info..."),
-	                             jabber_setup_set_info);
-	m = g_list_append(m, act);
-
-	/* if (js->account_options & CHANGE_PASSWORD) { */
-		act = purple_protocol_action_new(_("Change Password..."),
-		                             jabber_password_change);
-		m = g_list_append(m, act);
-	/* } */
-
-	act = purple_protocol_action_new(_("Search for Users..."),
-	                             jabber_user_search_begin);
-	m = g_list_append(m, act);
-
-	purple_debug_info("jabber", "jabber_get_actions: have pep: %s\n", js->pep ? "YES" : "NO");
-
-	if(js->pep)
-		jabber_pep_init_actions(&m);
-
-	if(js->commands)
-		jabber_adhoc_init_server_commands(js, &m);
-
-	return m;
+static GActionGroup *
+xmpp_protocol_actions_get_action_group(PurpleProtocolActions *actions,
+                                      PurpleConnection *connection)
+{
+	JabberStream *js = purple_connection_get_protocol_data(connection);
+	GSimpleActionGroup *group = NULL;
+	GActionEntry entries[] = {
+		{
+			.name = "set-user-info",
+			.activate = jabber_setup_set_info,
+			.parameter_type = "s",
+		},
+		{
+			.name = "change-password",
+			.activate = jabber_password_change,
+			.parameter_type = "s",
+		},
+		{
+			.name = "search-users",
+			.activate = jabber_user_search_begin,
+			.parameter_type = "s",
+		},
+	};
+	gsize nentries = G_N_ELEMENTS(entries);
+
+	group = g_simple_action_group_new();
+	g_action_map_add_action_entries(G_ACTION_MAP(group), entries, nentries,
+	                                NULL);
+
+	if(js->pep) {
+		jabber_pep_add_action_entries(group);
+	}
+
+#if 0
+	if(js->commands) {
+		jabber_adhoc_add_server_action_entries(js, group);
+	}
+#endif
+
+	return G_ACTION_GROUP(group);
+}
+
+static GMenu *
+xmpp_protocol_actions_get_menu(PurpleProtocolActions *actions) {
+	GMenu *menu = NULL;
+	GMenuItem *item = NULL;
+
+	menu = g_menu_new();
+
+	item = g_menu_item_new(_("Set User Info..."), "prpl-xmpp.set-user-info");
+	g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s",
+	                          "account");
+	g_menu_append_item(menu, item);
+	g_object_unref(item);
+
+	item = g_menu_item_new(_("Change Password..."),
+	                       "prpl-xmpp.change-password");
+	g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s",
+	                          "account");
+	g_menu_append_item(menu, item);
+	g_object_unref(item);
+
+	item = g_menu_item_new(_("Search for Users..."), "prpl-xmpp.search-users");
+	g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s",
+	                          "account");
+	g_menu_append_item(menu, item);
+	g_object_unref(item);
+
+	jabber_pep_append_menu(menu);
+
+#if 0
+	if(js->commands) {
+		jabber_adhoc_append_server_menu(js, menu);
+	}
+#endif
+
+	return menu;
 }
 
 PurpleChat *
@@ -3847,6 +3917,14 @@ jabber_protocol_class_finalize(G_GNUC_UN
 }
 
 static void
+xmpp_protocol_actions_iface_init(PurpleProtocolActionsInterface *iface)
+{
+	iface->get_prefix = xmpp_protocol_actions_get_prefix;
+	iface->get_action_group = xmpp_protocol_actions_get_action_group;
+	iface->get_menu = xmpp_protocol_actions_get_menu;
+}
+
+static void
 jabber_protocol_client_iface_init(PurpleProtocolClientInterface *client_iface)
 {
 	client_iface->list_emblem     = jabber_list_emblem;
@@ -3958,6 +4036,9 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED(
         JabberProtocol, jabber_protocol, PURPLE_TYPE_PROTOCOL,
         G_TYPE_FLAG_ABSTRACT,
 
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ACTIONS,
+                                      xmpp_protocol_actions_iface_init)
+
         G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
                                       jabber_protocol_client_iface_init)
 
diff --git a/libpurple/protocols/jabber/pep.h b/libpurple/protocols/jabber/pep.h
--- a/libpurple/protocols/jabber/pep.h
+++ b/libpurple/protocols/jabber/pep.h
@@ -31,7 +31,8 @@
 void jabber_pep_init(void);
 void jabber_pep_uninit(void);
 
-void jabber_pep_init_actions(GList **m);
+void jabber_pep_add_action_entries(GSimpleActionGroup *group);
+void jabber_pep_append_menu(GMenu *menu);
 
 /*
  * Callback for receiving PEP events.
diff --git a/libpurple/protocols/jabber/pep.c b/libpurple/protocols/jabber/pep.c
--- a/libpurple/protocols/jabber/pep.c
+++ b/libpurple/protocols/jabber/pep.c
@@ -54,9 +54,15 @@ void jabber_pep_uninit(void) {
 	pep_handlers = NULL;
 }
 
-void jabber_pep_init_actions(GList **m) {
+void
+jabber_pep_add_action_entries(GSimpleActionGroup *group) {
+	jabber_nick_add_action_entries(group);
+}
+
+void
+jabber_pep_append_menu(GMenu *menu) {
 	/* register the PEP-specific actions */
-	jabber_nick_init_action(m);
+	jabber_nick_append_menu(menu);
 }
 
 void jabber_pep_register_handler(const char *xmlns, JabberPEPHandler handlerfunc) {
diff --git a/libpurple/protocols/jabber/usernick.h b/libpurple/protocols/jabber/usernick.h
--- a/libpurple/protocols/jabber/usernick.h
+++ b/libpurple/protocols/jabber/usernick.h
@@ -29,6 +29,7 @@
 /* Implementation of XEP-0172 */
 
 void jabber_nick_init(void);
-void jabber_nick_init_action(GList **m);
+void jabber_nick_append_menu(GMenu *menu);
+void jabber_nick_add_action_entries(GSimpleActionGroup *group);
 
 #endif /* PURPLE_JABBER_USERNICK_H */
diff --git a/libpurple/protocols/jabber/usernick.c b/libpurple/protocols/jabber/usernick.c
--- a/libpurple/protocols/jabber/usernick.c
+++ b/libpurple/protocols/jabber/usernick.c
@@ -84,9 +84,26 @@ static void do_nick_got_own_nick_cb(Jabb
 	g_free(oldnickname);
 }
 
-static void do_nick_set_nick(PurpleProtocolAction *action) {
-	PurpleConnection *gc = action->connection;
-	JabberStream *js = purple_connection_get_protocol_data(gc);
+static void
+do_nick_set_nick(G_GNUC_UNUSED GSimpleAction *action, GVariant *parameter,
+                 G_GNUC_UNUSED gpointer data)
+{
+	const char *account_id = NULL;
+	PurpleAccountManager *manager = NULL;
+	PurpleAccount *account = NULL;
+	PurpleConnection *connection = NULL;
+	JabberStream *js = NULL;
+
+	if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) {
+		g_critical("XMPP Set Nickname action parameter is of incorrect type %s",
+		           g_variant_get_type_string(parameter));
+	}
+
+	account_id = g_variant_get_string(parameter, NULL);
+	manager = purple_account_manager_get_default();
+	account = purple_account_manager_find_by_id(manager, account_id);
+	connection = purple_account_get_connection(account);
+	js = purple_connection_get_protocol_data(connection);
 
 	/* since the nickname might have been changed by another resource of this account, we always have to request the old one
 		from the server to present as the default for the new one */
@@ -98,7 +115,28 @@ void jabber_nick_init(void) {
 	jabber_pep_register_handler("http://jabber.org/protocol/nick", jabber_nick_cb);
 }
 
-void jabber_nick_init_action(GList **m) {
-	PurpleProtocolAction *act = purple_protocol_action_new(_("Set Nickname..."), do_nick_set_nick);
-	*m = g_list_append(*m, act);
+void
+jabber_nick_add_action_entries(GSimpleActionGroup *group) {
+	GActionEntry entries[] = {
+		{
+			.name = "set-nickname",
+			.activate = do_nick_set_nick,
+			.parameter_type = "s",
+		},
+	};
+	gsize nentries = G_N_ELEMENTS(entries);
+
+	g_action_map_add_action_entries(G_ACTION_MAP(group), entries, nentries,
+	                                NULL);
 }
+
+void
+jabber_nick_append_menu(GMenu *menu) {
+	GMenuItem *item = NULL;
+
+	item = g_menu_item_new(_("Set Nickname..."), "prpl-xmpp.set-nickname");
+	g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s",
+	                          "account");
+	g_menu_append_item(menu, item);
+	g_object_unref(item);
+}
