diff --git a/libpurple/purpleprotocolmanager.h b/libpurple/purpleprotocolmanager.h
--- a/libpurple/purpleprotocolmanager.h
+++ b/libpurple/purpleprotocolmanager.h
@@ -26,6 +26,7 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "account.h"
 #include "protocol.h"
 
 G_BEGIN_DECLS
@@ -142,6 +143,19 @@
 PurpleProtocol *purple_protocol_manager_find(PurpleProtocolManager *manager, const gchar *id);
 
 /**
+ * purple_protocol_manager_find_for_account:
+ * @manager: The #PurpleProtocolManager instance.
+ * @account: The #PurpleAccount whose protocol to find.
+ *
+ * Gets the #PurpleProtocol for @account if found, otherwise %NULL.
+ *
+ * Returns: (transfer none): The #PurpleProtocol for @account or %NULL.
+ *
+ * Since: 3.0.0
+ */
+PurpleProtocol *purple_protocol_manager_find_for_account(PurpleProtocolManager *manager, PurpleAccount *account);
+
+/**
  * purple_protocol_manager_get_all:
  * @manager: The #PurpleProtocolManager instance.
  *
diff --git a/libpurple/purpleprotocolmanager.c b/libpurple/purpleprotocolmanager.c
--- a/libpurple/purpleprotocolmanager.c
+++ b/libpurple/purpleprotocolmanager.c
@@ -205,7 +205,7 @@
 	PurpleProtocolManagerPrivate *priv = NULL;
 	gpointer value = NULL;
 
-	g_return_val_if_fail(PURPLE_PROTOCOL_MANAGER(manager), NULL);
+	g_return_val_if_fail(PURPLE_IS_PROTOCOL_MANAGER(manager), NULL);
 
 	priv = purple_protocol_manager_get_instance_private(manager);
 
@@ -217,6 +217,21 @@
 	return PURPLE_PROTOCOL(value);
 }
 
+PurpleProtocol *
+purple_protocol_manager_find_for_account(PurpleProtocolManager *manager,
+                                         PurpleAccount *account)
+{
+	const gchar *id = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_PROTOCOL_MANAGER(manager), NULL);
+	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
+
+	id = purple_account_get_protocol_id(account);
+
+	return purple_protocol_manager_find(manager, id);
+}
+
+
 GList *
 purple_protocol_manager_get_all(PurpleProtocolManager *manager) {
 	PurpleProtocolManagerPrivate *priv = NULL;
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -2149,15 +2149,18 @@
 	GdkPixbuf *pixbuf, *buddyicon = NULL;
 	PurpleImage *img = NULL;
 	PurpleProtocol *protocol = NULL;
+	PurpleProtocolManager *manager = NULL;
 	PurpleBuddyIconSpec *icon_spec = NULL;
 
 	pixbuf = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_MEDIUM);
 	if ((pixbuf != NULL) && purple_account_is_disconnected(account))
 		gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
-	if (protocol != NULL)
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, account);
+	if(protocol != NULL) {
 		icon_spec = purple_protocol_get_icon_spec(protocol);
+	}
 
 	if (icon_spec != NULL && icon_spec->format != NULL) {
 		if (purple_account_get_bool(account, "use-global-buddyicon", TRUE)) {
@@ -2608,11 +2611,11 @@
 static void
 authorize_reason_cb(struct auth_request *ar)
 {
-	const char *protocol_id;
 	PurpleProtocol *protocol = NULL;
-
-	protocol_id = purple_account_get_protocol_id(ar->account);
-	protocol = purple_protocols_find(protocol_id);
+	PurpleProtocolManager *manager = NULL;
+
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, ar->account);
 
 	if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_GRANTED_MESSAGE)) {
 		/* Duplicate information because ar is freed by closing minidialog */
@@ -2651,11 +2654,11 @@
 static void
 deny_reason_cb(struct auth_request *ar)
 {
-	const char *protocol_id;
 	PurpleProtocol *protocol = NULL;
-
-	protocol_id = purple_account_get_protocol_id(ar->account);
-	protocol = purple_protocols_find(protocol_id);
+	PurpleProtocolManager *manager = NULL;
+
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, ar->account);
 
 	if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE)) {
 		/* Duplicate information because ar is freed by closing minidialog */
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -370,12 +370,14 @@
 	PurpleAccount *account;
 	PurpleConversation *conv;
 	PurpleProtocol *protocol;
+	PurpleProtocolManager *manager = NULL;
 	GHashTable *components;
 	const char *name;
 	char *chat_name = NULL;
 
 	account = purple_chat_get_account(chat);
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, account);
 
 	components = purple_chat_get_components(chat);
 
@@ -730,9 +732,10 @@
 	} else if (PURPLE_IS_CHAT(node)) {
 		PurpleChat *c = PURPLE_CHAT(node);
 		PurpleProtocol *protocol = NULL;
+		PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 		type = PURPLE_LOG_CHAT;
 		account = purple_chat_get_account(c);
-		protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+		protocol = purple_protocol_manager_find_for_account(manager, account);
 		if (protocol) {
 			name = purple_protocol_chat_get_name(PURPLE_PROTOCOL_CHAT(protocol),
 			                                     purple_chat_get_components(c));
@@ -895,11 +898,13 @@
 set_sensitive_if_input_buddy_cb(GtkWidget *entry, gpointer user_data)
 {
 	PurpleProtocol *protocol;
+	PurpleProtocolManager *manager = NULL;
 	PidginAddBuddyData *data = user_data;
 	const char *text;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(
-		data->rq_data.account));
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager,
+	                                                    data->rq_data.account);
 	text = gtk_entry_get_text(GTK_ENTRY(entry));
 
 	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window),
@@ -1981,16 +1986,23 @@
 	/* Double middle click gets info */
 	} else if ((event->button == GDK_BUTTON_MIDDLE) && (event->type == GDK_2BUTTON_PRESS) &&
 			   ((PURPLE_IS_CONTACT(node)) || (PURPLE_IS_BUDDY(node)))) {
+		PurpleAccount *account = NULL;
 		PurpleBuddy *b;
-		if(PURPLE_IS_CONTACT(node))
+		PurpleProtocolManager *manager = NULL;
+
+		if(PURPLE_IS_CONTACT(node)) {
 			b = purple_contact_get_priority_buddy((PurpleContact*)node);
-		else
+		} else {
 			b = (PurpleBuddy *)node;
-
-		protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
-
-		if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, get_info))
-			pidgin_retrieve_user_info(purple_account_get_connection(purple_buddy_get_account(b)), purple_buddy_get_name(b));
+		}
+
+		account = purple_buddy_get_account(b);
+		manager = purple_protocol_manager_get_default();
+		protocol = purple_protocol_manager_find_for_account(manager, account);
+
+		if(protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, get_info)) {
+			pidgin_retrieve_user_info(purple_account_get_connection(account), purple_buddy_get_name(b));
+		}
 		handled = TRUE;
 	}
 
@@ -3257,11 +3269,14 @@
 static char *pidgin_get_tooltip_text(PurpleBlistNode *node, gboolean full)
 {
 	GString *str = g_string_new("");
+	PurpleAccount *account = NULL;
 	PurpleProtocol *protocol = NULL;
+	PurpleProtocolManager *manager = NULL;
 	char *tmp;
 
-	if (PURPLE_IS_CHAT(node))
-	{
+	manager = purple_protocol_manager_get_default();
+
+	if(PURPLE_IS_CHAT(node)) {
 		PurpleChat *chat;
 		GList *connections;
 		GList *cur = NULL;
@@ -3271,17 +3286,17 @@
 		PidginBlistNode *bnode = g_object_get_data(G_OBJECT(node), UI_DATA);
 
 		chat = (PurpleChat *)node;
-		protocol = purple_protocols_find(purple_account_get_protocol_id(purple_chat_get_account(chat)));
+		account = purple_chat_get_account(chat);
+		protocol = purple_protocol_manager_find_for_account(manager, account);
 
 		connections = purple_connections_get_all();
-		if (connections && connections->next)
-		{
-			tmp = g_markup_escape_text(purple_account_get_username(purple_chat_get_account(chat)), -1);
+		if(connections && connections->next) {
+			tmp = g_markup_escape_text(purple_account_get_username(account), -1);
 			g_string_append_printf(str, _("<b>Account:</b> %s"), tmp);
 			g_free(tmp);
 		}
 
-		if (bnode && bnode->conv.conv) {
+		if(bnode && bnode->conv.conv) {
 			conv = PURPLE_CHAT_CONVERSATION(bnode->conv.conv);
 		} else {
 			char *chat_name;
@@ -3293,15 +3308,15 @@
 			}
 
 			conv = purple_conversations_find_chat_with_account(chat_name,
-					purple_chat_get_account(chat));
+			                                                   account);
 			g_free(chat_name);
 		}
 
-		if (conv && !purple_chat_conversation_has_left(conv)) {
+		if(conv && !purple_chat_conversation_has_left(conv)) {
 			g_string_append_printf(str, _("\n<b>Occupants:</b> %d"),
 				purple_chat_conversation_get_users_count(conv));
 
-			if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_CHAT_TOPIC)) {
+			if(protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_CHAT_TOPIC)) {
 				const char *chattopic = purple_chat_conversation_get_topic(conv);
 				char *topic = chattopic ? g_markup_escape_text(chattopic, -1) : NULL;
 				g_string_append_printf(str, _("\n<b>Topic:</b> %s"), topic ? topic : _("(no topic set)"));
@@ -3311,15 +3326,13 @@
 
 		if(protocol) {
 			cur = purple_protocol_chat_info(PURPLE_PROTOCOL_CHAT(protocol),
-			                                purple_account_get_connection(purple_chat_get_account(chat)));
+			                                purple_account_get_connection(account));
 		}
 
-		while (cur != NULL)
-		{
+		while(cur != NULL) {
 			pce = cur->data;
 
-			if (!pce->secret)
-			{
+			if(!pce->secret) {
 				tmp = purple_text_strip_mnemonic(pce->label);
 				name = g_markup_escape_text(tmp, -1);
 				g_free(tmp);
@@ -3335,9 +3348,7 @@
 			g_free(pce);
 			cur = g_list_delete_link(cur, cur);
 		}
-	}
-	else if (PURPLE_IS_CONTACT(node) || PURPLE_IS_BUDDY(node))
-	{
+	} else if(PURPLE_IS_CONTACT(node) || PURPLE_IS_BUDDY(node)) {
 		/* NOTE: THIS FUNCTION IS NO LONGER CALLED FOR CONTACTS.
 		 * It is only called by create_tip_for_node(), and create_tip_for_node() is never called for a contact.
 		 */
@@ -3350,18 +3361,16 @@
 		gchar *alias;
 		time_t idle_secs, signon;
 
-		if (PURPLE_IS_CONTACT(node))
-		{
+		if(PURPLE_IS_CONTACT(node)) {
 			c = (PurpleContact *)node;
 			b = purple_contact_get_priority_buddy(c);
-		}
-		else
-		{
+		} else {
 			b = (PurpleBuddy *)node;
 			c = purple_buddy_get_contact(b);
 		}
 
-		protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
+		account = purple_buddy_get_account(b);
+		protocol = purple_protocol_manager_find_for_account(manager, account);
 
 		presence = purple_buddy_get_presence(b);
 		user_info = purple_notify_user_info_new();
@@ -3371,7 +3380,7 @@
 		if (full && connections && connections->next)
 		{
 			purple_notify_user_info_add_pair_plaintext(user_info, _("Account"),
-					purple_account_get_username(purple_buddy_get_account(b)));
+					purple_account_get_username(account));
 		}
 
 		/* Alias */
@@ -3569,6 +3578,7 @@
 	PurpleBuddy *buddy = NULL;
 	PidginBlistNode *gtknode = g_object_get_data(G_OBJECT(node), UI_DATA);
 	PurpleProtocol *protocol;
+	PurpleProtocolManager *manager;
 	const char *name = NULL;
 	char *filename, *path;
 	PurplePresence *p = NULL;
@@ -3645,7 +3655,9 @@
 		return _pidgin_blist_get_cached_emblem(path);
 	}
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(buddy)));
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager,
+	                                                    purple_buddy_get_account(buddy));
 	if (!protocol)
 		return NULL;
 
@@ -3707,15 +3719,19 @@
 	if(buddy || chat) {
 		PurpleAccount *account;
 		PurpleProtocol *protocol;
-
-		if(buddy)
+		PurpleProtocolManager *manager = NULL;
+
+		if(buddy) {
 			account = purple_buddy_get_account(buddy);
-		else
+		} else {
 			account = purple_chat_get_account(chat);
-
-		protocol = purple_protocols_find(purple_account_get_protocol_id(account));
-		if(!protocol)
+		}
+
+		manager = purple_protocol_manager_get_default();
+		protocol = purple_protocol_manager_find_for_account(manager, account);
+		if(!protocol) {
 			return NULL;
+		}
 	}
 
 	if(buddy) {
@@ -3779,7 +3795,6 @@
 {
 	const char *name, *name_color, *status_color, *dim_grey;
 	char *text = NULL;
-	PurpleProtocol *protocol = NULL;
 	PurpleContact *contact;
 	PurplePresence *presence;
 	PidginBlistNode *gtkcontactnode = NULL;
@@ -3825,10 +3840,13 @@
 
 	/* Name is all that is needed */
 	if (!aliased || biglist) {
+		PurpleProtocol *protocol = NULL;
+		PurpleProtocolManager *manager = NULL;
 
 		/* Status Info */
-		protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
-
+		manager = purple_protocol_manager_get_default();
+		protocol = purple_protocol_manager_find_for_account(manager,
+		                                                    purple_buddy_get_account(b));
 		if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, status_text) &&
 				purple_account_get_connection(purple_buddy_get_account(b))) {
 			char *tmp = purple_protocol_client_status_text(PURPLE_PROTOCOL_CLIENT(protocol), b);
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -2496,8 +2496,8 @@
 		if ((chat == NULL) && (gtkconv->history != NULL)) {
 			GHashTable *components;
 			PurpleAccount *account = purple_conversation_get_account(conv);
-			PurpleProtocol *protocol =
-					purple_protocols_find(purple_account_get_protocol_id(account));
+			PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+			PurpleProtocol *protocol = purple_protocol_manager_find_for_account(manager, account);
 			if (purple_account_get_connection(account) != NULL &&
 					PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT, info_defaults)) {
 				components = purple_protocol_chat_info_defaults(PURPLE_PROTOCOL_CHAT(protocol), purple_account_get_connection(account),
diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c
--- a/pidgin/gtkdialogs.c
+++ b/pidgin/gtkdialogs.c
@@ -267,11 +267,13 @@
 	PurpleRequestFields *fields = _fields;
 	PurpleAccount *account;
 	PurpleProtocol *protocol;
+	PurpleProtocolManager *manager;
 	const char *username;
 	gboolean valid = FALSE;
 
 	account = purple_request_fields_get_account(fields, "account");
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, account);
 	username = purple_request_fields_get_string(fields, "screenname");
 
 	if (username) {
diff --git a/pidgin/gtkutils.c b/pidgin/gtkutils.c
--- a/pidgin/gtkutils.c
+++ b/pidgin/gtkutils.c
@@ -470,15 +470,14 @@
 				PurpleConnection *gc;
 				PurpleProtocol *proto = NULL;
 
-				if (all_accounts)
-				{
+				if(all_accounts) {
+					PurpleProtocolManager *manager = NULL;
 					account = (PurpleAccount *)l->data;
 
-					proto = purple_protocols_find(
-						purple_account_get_protocol_id(account));
-
-					if (proto == NULL)
-					{
+					manager = purple_protocol_manager_get_default();
+					proto = purple_protocol_manager_find_for_account(manager,
+					                                                 account);
+					if(proto == NULL) {
 						account = NULL;
 
 						continue;
@@ -966,12 +965,15 @@
 pidgin_create_protocol_icon(PurpleAccount *account, PidginProtocolIconSize size)
 {
 	PurpleProtocol *protocol;
+	PurpleProtocolManager *manager;
 
 	g_return_val_if_fail(account != NULL, NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
-	if (protocol == NULL)
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, account);
+	if(protocol == NULL) {
 		return NULL;
+	}
 	return pidgin_create_icon_from_protocol(protocol, size, account);
 }
 
diff --git a/pidgin/pidginapplication.c b/pidgin/pidginapplication.c
--- a/pidgin/pidginapplication.c
+++ b/pidgin/pidginapplication.c
@@ -391,12 +391,12 @@
 pidgin_application_signed_on_cb(PurpleAccount *account, gpointer data) {
 	PidginApplication *application = PIDGIN_APPLICATION(data);
 	PurpleProtocol *protocol = NULL;
-	const gchar *protocol_id = NULL;
+	PurpleProtocolManager *manager = NULL;
 	gboolean should_enable_chat = FALSE, should_enable_room_list = FALSE;
 	gint n_actions = 0;
 
-	protocol_id = purple_account_get_protocol_id(account);
-	protocol = purple_protocols_find(protocol_id);
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find_for_account(manager, account);
 
 	/* We assume that the current state is correct, so we don't bother changing
 	 * state unless the newly connected account implements the chat interface,
diff --git a/pidgin/pidginlog.c b/pidgin/pidginlog.c
--- a/pidgin/pidginlog.c
+++ b/pidgin/pidginlog.c
@@ -852,10 +852,11 @@
 	}
 
 	for(accounts = purple_accounts_get_all(); accounts != NULL; accounts = accounts->next) {
-
 		PurpleAccount *account = (PurpleAccount *)accounts->data;
-		if(purple_protocols_find(purple_account_get_protocol_id(account)) == NULL)
+		PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+		if(purple_protocol_manager_find_for_account(manager, account) == NULL) {
 			continue;
+		}
 
 		logs = g_list_concat(purple_log_get_system_logs(account), logs);
 	}
