diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c
--- a/libpurple/protocols/bonjour/bonjour.c
+++ b/libpurple/protocols/bonjour/bonjour.c
@@ -755,13 +755,18 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	bonjour_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	xep_xfer_register(G_TYPE_MODULE(plugin));
 
-	my_protocol = purple_protocols_add(BONJOUR_TYPE_PROTOCOL, error);
-	if (!my_protocol)
+	my_protocol = g_object_new(BONJOUR_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+		g_clear_object(&my_protocol);
+
 		return FALSE;
+	}
 
 	initialize_default_account_values();
 
@@ -771,8 +776,13 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
-	if (!purple_protocols_remove(my_protocol, error))
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
 		return FALSE;
+	}
+
+	g_clear_object(&my_protocol);
 
 	g_free(default_firstname);
 	g_free(default_lastname);
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -1689,10 +1689,14 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	facebook_protocol_register_type(G_TYPE_MODULE(plugin));
-	fb_protocol = purple_protocols_add(FACEBOOK_TYPE_PROTOCOL, error);
+	fb_protocol = g_object_new(FACEBOOK_TYPE_PROTOCOL, NULL);
 
-	if (fb_protocol == NULL) {
+	if(!purple_protocol_manager_register(manager, fb_protocol, error)) {
+		g_clear_object(&fb_protocol);
+
 		return FALSE;
 	}
 
@@ -1703,8 +1707,17 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, fb_protocol, error)) {
+		return FALSE;
+	}
+
 	fb_cmds_unregister();
-	return purple_protocols_remove(fb_protocol, error);
+
+	g_clear_object(&fb_protocol);
+
+	return TRUE;
 }
 
 PURPLE_PLUGIN_INIT(facebook, plugin_query, plugin_load, plugin_unload);
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -1218,13 +1218,18 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	ggp_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	ggp_xfer_register(G_TYPE_MODULE(plugin));
 
-	my_protocol = purple_protocols_add(GGP_TYPE_PROTOCOL, error);
-	if (!my_protocol)
+	my_protocol = g_object_new(GGP_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+		g_clear_object(&my_protocol);
+
 		return FALSE;
+	}
 
 	purple_prefs_add_none("/plugins/prpl/gg");
 
@@ -1246,6 +1251,12 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
+		return FALSE;
+	}
+
 	purple_signal_disconnect(purple_get_core(), "uri-handler", plugin,
 			PURPLE_CALLBACK(gg_uri_handler));
 
@@ -1254,8 +1265,7 @@
 	ggp_message_cleanup_global();
 	ggp_libgaduw_cleanup();
 
-	if (!purple_protocols_remove(my_protocol, error))
-		return FALSE;
+	g_clear_object(&my_protocol);
 
 	return TRUE;
 }
diff --git a/libpurple/protocols/irc/irc.c b/libpurple/protocols/irc/irc.c
--- a/libpurple/protocols/irc/irc.c
+++ b/libpurple/protocols/irc/irc.c
@@ -1128,13 +1128,18 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	irc_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	irc_xfer_register(G_TYPE_MODULE(plugin));
 
-	_irc_protocol = purple_protocols_add(IRC_TYPE_PROTOCOL, error);
-	if (!_irc_protocol)
+	_irc_protocol = g_object_new(IRC_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, _irc_protocol, error)) {
+		g_clear_object(&_irc_protocol);
+
 		return FALSE;
+	}
 
 	purple_prefs_remove("/plugins/prpl/irc/quitmsg");
 	purple_prefs_remove("/plugins/prpl/irc");
@@ -1159,13 +1164,18 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, _irc_protocol, error)) {
+		return FALSE;
+	}
+
 	irc_unregister_commands();
 
 	purple_signal_disconnect(purple_get_core(), "uri-handler", plugin,
 			PURPLE_CALLBACK(irc_uri_handler));
 
-	if (!purple_protocols_remove(_irc_protocol, error))
-		return FALSE;
+	g_clear_object(&_irc_protocol);
 
 	return TRUE;
 }
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
@@ -4288,6 +4288,8 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	jingle_session_register(plugin);
 
 	jingle_transport_register(plugin);
@@ -4305,9 +4307,12 @@
 
 	jabber_si_xfer_register(G_TYPE_MODULE(plugin));
 
-	xmpp_protocol = purple_protocols_add(XMPP_TYPE_PROTOCOL, error);
-	if (!xmpp_protocol)
+	xmpp_protocol = g_object_new(XMPP_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, xmpp_protocol, error)) {
+		g_clear_object(&xmpp_protocol);
+
 		return FALSE;
+	}
 
 	purple_signal_connect(purple_get_core(), "uri-handler", xmpp_protocol,
 		PURPLE_CALLBACK(xmpp_uri_handler), xmpp_protocol);
@@ -4320,13 +4325,18 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, xmpp_protocol, error)) {
+		return FALSE;
+	}
+
 	purple_signal_disconnect(purple_get_core(), "uri-handler",
 			xmpp_protocol, PURPLE_CALLBACK(xmpp_uri_handler));
 
 	jabber_uninit_protocol(xmpp_protocol);
 
-	if (!purple_protocols_remove(xmpp_protocol, error))
-		return FALSE;
+	g_clear_object(&xmpp_protocol);
 
 	return TRUE;
 }
diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c
--- a/libpurple/protocols/novell/novell.c
+++ b/libpurple/protocols/novell/novell.c
@@ -3628,11 +3628,16 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	novell_protocol_register_type(G_TYPE_MODULE(plugin));
 
-	my_protocol = purple_protocols_add(NOVELL_TYPE_PROTOCOL, error);
-	if (!my_protocol)
+	my_protocol = g_object_new(NOVELL_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+		g_clear_object(&my_protocol);
+
 		return FALSE;
+	}
 
 	return TRUE;
 }
@@ -3640,8 +3645,13 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
-	if (!purple_protocols_remove(my_protocol, error))
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
 		return FALSE;
+	}
+
+	g_clear_object(&my_protocol);
 
 	return TRUE;
 }
diff --git a/libpurple/protocols/null/nullprpl.c b/libpurple/protocols/null/nullprpl.c
--- a/libpurple/protocols/null/nullprpl.c
+++ b/libpurple/protocols/null/nullprpl.c
@@ -1223,14 +1223,19 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+  PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
   /* register the NULL_TYPE_PROTOCOL type in the type system. this function
    * is defined by G_DEFINE_DYNAMIC_TYPE_EXTENDED. */
   null_protocol_register_type(G_TYPE_MODULE(plugin));
 
   /* add the protocol to the core */
-  my_protocol = purple_protocols_add(NULL_TYPE_PROTOCOL, error);
-  if (!my_protocol)
+  my_protocol = g_object_new(NULL_TYPE_PROTOCOL, NULL);
+  if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+    g_clear_object(&my_protocol);
+
     return FALSE;
+  }
 
   purple_debug_info("nullprpl", "starting up\n");
 
@@ -1246,11 +1251,16 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+  PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
   purple_debug_info("nullprpl", "shutting down\n");
 
   /* remove the protocol from the core */
-  if (!purple_protocols_remove(my_protocol, error))
+  if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
     return FALSE;
+  }
+
+  g_clear_object(&my_protocol);
 
   return TRUE;
 }
diff --git a/libpurple/protocols/sametime/sametime.c b/libpurple/protocols/sametime/sametime.c
--- a/libpurple/protocols/sametime/sametime.c
+++ b/libpurple/protocols/sametime/sametime.c
@@ -5393,6 +5393,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+  PurpleProtocolManager *manager = purple_protocol_manager_get_default();
   GLogLevelFlags logflags =
     G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION;
 
@@ -5400,9 +5401,12 @@
 
   mw_xfer_register_type(G_TYPE_MODULE(plugin));
 
-  my_protocol = purple_protocols_add(MW_TYPE_PROTOCOL, error);
-  if (!my_protocol)
+  my_protocol = g_object_new(MW_TYPE_PROTOCOL, NULL);
+  if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+    g_clear_object(&my_protocol);
+
     return FALSE;
+  }
 
   /* forward all our g_log messages to purple. Generally all the logging
      calls are using purple_log directly, but the g_return macros will
@@ -5423,13 +5427,18 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+  PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+  if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
+    return FALSE;
+  }
+
   g_mime_shutdown();
 
   g_log_remove_handler(G_LOG_DOMAIN, log_handler[0]);
   g_log_remove_handler("meanwhile", log_handler[1]);
 
-  if (!purple_protocols_remove(my_protocol, error))
-    return FALSE;
+  g_clear_object(&my_protocol);
 
   return TRUE;
 }
diff --git a/libpurple/protocols/silc/silc.c b/libpurple/protocols/silc/silc.c
--- a/libpurple/protocols/silc/silc.c
+++ b/libpurple/protocols/silc/silc.c
@@ -2339,13 +2339,18 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	silcpurple_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	silcpurple_xfer_register(G_TYPE_MODULE(plugin));
 
-	my_protocol = purple_protocols_add(SILCPURPLE_TYPE_PROTOCOL, error);
-	if (!my_protocol)
+	my_protocol = g_object_new(SILCPURPLE_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+		g_clear_object(&my_protocol);
+
 		return FALSE;
+	}
 
 	purple_prefs_remove("/plugins/prpl/silc");
 
@@ -2358,10 +2363,15 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
+		return FALSE;
+	}
+
 	silcpurple_unregister_commands();
 
-	if (!purple_protocols_remove(my_protocol, error))
-		return FALSE;
+	g_clear_object(&my_protocol);
 
 	return TRUE;
 }
diff --git a/libpurple/protocols/zephyr/zephyr.c b/libpurple/protocols/zephyr/zephyr.c
--- a/libpurple/protocols/zephyr/zephyr.c
+++ b/libpurple/protocols/zephyr/zephyr.c
@@ -1709,11 +1709,16 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
 	zephyr_protocol_register_type(G_TYPE_MODULE(plugin));
 
-	my_protocol = purple_protocols_add(ZEPHYR_TYPE_PROTOCOL, error);
-	if (!my_protocol)
+	my_protocol = g_object_new(ZEPHYR_TYPE_PROTOCOL, NULL);
+	if(!purple_protocol_manager_register(manager, my_protocol, error)) {
+		g_clear_object(&my_protocol);
+
 		return FALSE;
+	}
 
 	zephyr_register_slash_commands();
 
@@ -1724,10 +1729,15 @@
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+	if(!purple_protocol_manager_unregister(manager, my_protocol, error)) {
+		return FALSE;
+	}
+
 	zephyr_unregister_slash_commands();
 
-	if (!purple_protocols_remove(my_protocol, error))
-		return FALSE;
+	g_clear_object(&my_protocol);
 
 	return TRUE;
 }
