diff --git a/libpurple/account.c b/libpurple/account.c
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -313,7 +313,7 @@
 	password = purple_credential_manager_read_password_finish(manager, res,
 	                                                          NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	if((password == NULL || *password == '\0') &&
 		!(purple_protocol_get_options(protocol) & OPT_PROTO_NO_PASSWORD) &&
@@ -993,6 +993,7 @@
 	PurpleAccountPrivate *priv = purple_account_get_instance_private(account);
 	gchar *username, *protocol_id;
 	PurpleProtocol *protocol = NULL;
+	PurpleProtocolManager *manager = NULL;
 	PurpleStatusType *status_type;
 
 	G_OBJECT_CLASS(purple_account_parent_class)->constructed(object);
@@ -1005,7 +1006,8 @@
 	purple_signal_emit(purple_accounts_get_handle(), "account-created",
 			account);
 
-	protocol = purple_protocols_find(protocol_id);
+	manager = purple_protocol_manager_get_default();
+	protocol = purple_protocol_manager_find(manager, protocol_id);
 	if (protocol == NULL) {
 		g_free(username);
 		g_free(protocol_id);
@@ -1193,7 +1195,7 @@
 		return;
 	}
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (protocol == NULL) {
 		gchar *message;
 
@@ -2078,7 +2080,7 @@
 
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 
-	p = purple_protocols_find(purple_account_get_protocol_id(account));
+	p = purple_account_get_protocol(account);
 
 	return (p && purple_protocol_get_name(p) ?
 	        _(purple_protocol_get_name(p)) : _("Unknown"));
diff --git a/libpurple/buddy.c b/libpurple/buddy.c
--- a/libpurple/buddy.c
+++ b/libpurple/buddy.c
@@ -174,7 +174,7 @@
 	 * Tell the owner protocol that we're about to free the buddy so it
 	 * can free proto_data
 	 */
-	protocol = purple_protocols_find(purple_account_get_protocol_id(priv->account));
+	protocol = purple_account_get_protocol(priv->account);
 	if(protocol) {
 		purple_protocol_client_buddy_free(PURPLE_PROTOCOL_CLIENT(protocol),
 		                                  buddy);
diff --git a/libpurple/buddylist.c b/libpurple/buddylist.c
--- a/libpurple/buddylist.c
+++ b/libpurple/buddylist.c
@@ -1758,7 +1758,7 @@
 	if (!purple_account_is_connected(account))
 		return NULL;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	if(PURPLE_IS_PROTOCOL_CLIENT(protocol)) {
 		chat = purple_protocol_client_find_blist_chat(PURPLE_PROTOCOL_CLIENT(protocol),
diff --git a/libpurple/chat.c b/libpurple/chat.c
--- a/libpurple/chat.c
+++ b/libpurple/chat.c
@@ -83,7 +83,7 @@
 
 	priv = purple_chat_get_instance_private(chat);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(priv->account));
+	protocol = purple_account_get_protocol(priv->account);
 
 	if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT, info)) {
 		PurpleProtocolChatEntry *pce;
diff --git a/libpurple/connection.c b/libpurple/connection.c
--- a/libpurple/connection.c
+++ b/libpurple/connection.c
@@ -987,7 +987,7 @@
 	if (!purple_account_is_disconnected(account))
 		return;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	if (protocol == NULL) {
 		gchar *message;
@@ -1062,7 +1062,7 @@
 
 	g_return_if_fail(PURPLE_IS_ACCOUNT(account));
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	if (protocol == NULL) {
 		gchar *message;
diff --git a/libpurple/conversation.c b/libpurple/conversation.c
--- a/libpurple/conversation.c
+++ b/libpurple/conversation.c
@@ -522,7 +522,7 @@
 		return;
 
 	if (account != NULL) {
-		protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+		protocol = purple_account_get_protocol(account);
 
 		if (PURPLE_IS_IM_CONVERSATION(conv) ||
 			!(purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME)) {
diff --git a/libpurple/example/nullclient.c b/libpurple/example/nullclient.c
--- a/libpurple/example/nullclient.c
+++ b/libpurple/example/nullclient.c
@@ -170,6 +170,7 @@
 	GMainLoop *loop = g_main_loop_new(NULL, FALSE);
 	PurpleAccount *account;
 	PurpleSavedStatus *status;
+	PurpleProtocolManager *protocol_manager = NULL;
 	char *res;
 
 #ifndef _WIN32
@@ -185,7 +186,8 @@
 
 	printf("libpurple initialized.\n");
 
-	list = purple_protocols_get_all();
+	protocol_manager = purple_protocol_manager_get_default();
+	list = purple_protocol_manager_get_all(protocol_manager);
 	for (i = 0, iter = list; iter; iter = iter->next) {
 		PurpleProtocol *protocol = iter->data;
 		if (protocol && purple_protocol_get_name(protocol)) {
diff --git a/libpurple/log.c b/libpurple/log.c
--- a/libpurple/log.c
+++ b/libpurple/log.c
@@ -283,7 +283,7 @@
 	const char *target;
 	char *dir;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (!protocol)
 		return NULL;
 
@@ -992,7 +992,7 @@
 		for (account_iter = purple_accounts_get_all() ; account_iter != NULL ; account_iter = account_iter->next) {
 			PurpleProtocol *protocol;
 
-			protocol = purple_protocols_find(purple_account_get_protocol_id((PurpleAccount *)account_iter->data));
+			protocol = purple_account_get_protocol((PurpleAccount *)account_iter->data);
 			if (!protocol)
 				continue;
 
@@ -1177,8 +1177,7 @@
 	char *date;
 	char *header;
 	char *escaped_from;
-	PurpleProtocol *protocol =
-			purple_protocols_find(purple_account_get_protocol_id(log->account));
+	PurpleProtocol *protocol = purple_account_get_protocol(log->account);
 	PurpleLogCommonLoggerData *data = log->logger_data;
 	gsize written = 0;
 
@@ -1334,8 +1333,7 @@
                               const char *from, GDateTime *time, const char *message)
 {
 	char *date;
-	PurpleProtocol *protocol =
-			purple_protocols_find(purple_account_get_protocol_id(log->account));
+	PurpleProtocol *protocol = purple_account_get_protocol(log->account);
 	PurpleLogCommonLoggerData *data = log->logger_data;
 	char *stripped = NULL;
 
diff --git a/libpurple/plugins/idle.c b/libpurple/plugins/idle.c
--- a/libpurple/plugins/idle.c
+++ b/libpurple/plugins/idle.c
@@ -45,7 +45,7 @@
 {
 	PurpleProtocol *protocol;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	g_return_val_if_fail(protocol != NULL, FALSE);
 
 	return PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, set_idle);
diff --git a/libpurple/plugins/log_reader.c b/libpurple/plugins/log_reader.c
--- a/libpurple/plugins/log_reader.c
+++ b/libpurple/plugins/log_reader.c
@@ -75,7 +75,7 @@
 	if (!logdir || !*logdir)
 		return NULL;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (!protocol)
 		return NULL;
 
@@ -1086,7 +1086,7 @@
 	if (!logdir || !*logdir)
 		return NULL;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (!protocol)
 		return NULL;
 
@@ -1649,7 +1649,7 @@
 	if (!logdir || !*logdir)
 		return NULL;
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (!protocol)
 		return NULL;
 
diff --git a/libpurple/purplewhiteboard.c b/libpurple/purplewhiteboard.c
--- a/libpurple/purplewhiteboard.c
+++ b/libpurple/purplewhiteboard.c
@@ -498,7 +498,7 @@
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 	g_return_val_if_fail(who != NULL, NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	g_return_val_if_fail(PURPLE_IS_PROTOCOL(protocol), NULL);
 
diff --git a/libpurple/roomlist.c b/libpurple/roomlist.c
--- a/libpurple/roomlist.c
+++ b/libpurple/roomlist.c
@@ -390,7 +390,7 @@
 
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	g_return_val_if_fail(PURPLE_IS_PROTOCOL(protocol), NULL);
 
diff --git a/libpurple/server.c b/libpurple/server.c
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -310,7 +310,7 @@
 
 	g_return_val_if_fail(account != NULL, NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 
 	/* Lookup the attention type in the protocol's attention_types list, if any. */
 	if (PURPLE_IS_PROTOCOL_ATTENTION(protocol)) {
diff --git a/libpurple/util.c b/libpurple/util.c
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -838,8 +838,7 @@
 
 	if (account != NULL)
 	{
-		PurpleProtocol *protocol =
-				purple_protocols_find(purple_account_get_protocol_id(account));
+		PurpleProtocol *protocol = purple_account_get_protocol(account);
 
 		if(PURPLE_IS_PROTOCOL_CLIENT(protocol)) {
 			ret = purple_protocol_client_normalize(PURPLE_PROTOCOL_CLIENT(protocol), account, str);
diff --git a/libpurple/xfer.c b/libpurple/xfer.c
--- a/libpurple/xfer.c
+++ b/libpurple/xfer.c
@@ -2416,7 +2416,7 @@
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 	g_return_val_if_fail(who != NULL, NULL);
 
-	protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+	protocol = purple_account_get_protocol(account);
 	if (PURPLE_IS_PROTOCOL_XFER(protocol)) {
 		PurpleConnection *connection = purple_account_get_connection(account);
 
