diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -415,6 +415,7 @@
 		* purple_notify_searchresults_get_rows_count
 		* purple_notify_searchresults_row_get
 		* purple_ntlm_*
+		* PURPLE_PLUGIN_INIT, use GPLUGIN_NATIVE_PLUGIN_DECLARE
 		* PurplePluginType
 		* PurplePluginPriority
 		* PurplePluginLoaderInfo
diff --git a/libpurple/plugins.h b/libpurple/plugins.h
--- a/libpurple/plugins.h
+++ b/libpurple/plugins.h
@@ -198,25 +198,6 @@
  */
 #define PURPLE_ABI_VERSION PURPLE_PLUGIN_ABI_VERSION(PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION)
 
-/**
- * PURPLE_PLUGIN_INIT:
- *
- * Defines the plugin's entry points.
- */
-#define PURPLE_PLUGIN_INIT(pluginname,pluginquery,pluginload,pluginunload) \
-	G_MODULE_EXPORT GPluginPluginInfo *gplugin_query(GError **e); \
-	G_MODULE_EXPORT GPluginPluginInfo *gplugin_query(GError **e) { \
-		return GPLUGIN_PLUGIN_INFO(pluginquery(e)); \
-	} \
-	G_MODULE_EXPORT gboolean gplugin_load(GPluginNativePlugin *p, GError **e); \
-	G_MODULE_EXPORT gboolean gplugin_load(GPluginNativePlugin *p, GError **e) { \
-		return pluginload(PURPLE_PLUGIN(p), e); \
-	} \
-	G_MODULE_EXPORT gboolean gplugin_unload(GPluginNativePlugin *p, GError **e); \
-	G_MODULE_EXPORT gboolean gplugin_unload(GPluginNativePlugin *p, GError **e) { \
-		return pluginunload(PURPLE_PLUGIN(p), e); \
-	}
-
 G_BEGIN_DECLS
 
 /**************************************************************************/
@@ -414,8 +395,7 @@
  *
  * Returns: A new #PurplePluginInfo instance.
  */
-PurplePluginInfo *purple_plugin_info_new(const char *first_property, ...)
-                  G_GNUC_NULL_TERMINATED;
+GPluginPluginInfo *purple_plugin_info_new(const char *first_property, ...) G_GNUC_NULL_TERMINATED;
 
 /**
  * purple_plugin_info_get_actions_cb:
diff --git a/libpurple/plugins.c b/libpurple/plugins.c
--- a/libpurple/plugins.c
+++ b/libpurple/plugins.c
@@ -485,7 +485,7 @@
 /**************************************************************************
  * PluginInfo API
  **************************************************************************/
-PurplePluginInfo *
+GPluginPluginInfo *
 purple_plugin_info_new(const char *first_property, ...)
 {
 	GObject *info;
@@ -500,7 +500,7 @@
 	                           var_args);
 	va_end(var_args);
 
-	return PURPLE_PLUGIN_INFO(info);
+	return GPLUGIN_PLUGIN_INFO(info);
 }
 
 PurplePluginActionsCb
diff --git a/libpurple/plugins/autoaccept.c b/libpurple/plugins/autoaccept.c
--- a/libpurple/plugins/autoaccept.c
+++ b/libpurple/plugins/autoaccept.c
@@ -32,6 +32,9 @@
 #include <glib.h>
 #include <glib/gstdio.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #define PREF_PREFIX		"/plugins/core/" PLUGIN_ID
@@ -268,8 +271,8 @@
 	return frame;
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+auto_accept_query(GError **error)
 {
 	const gchar * const authors[] = PLUGIN_AUTHORS;
 
@@ -289,7 +292,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+auto_accept_load(GPluginPlugin *plugin, GError **error)
 {
 	char *dirname;
 
@@ -324,9 +327,9 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+auto_accept_unload(GPluginPlugin *plugin, GError **error)
 {
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(PLUGIN_STATIC_NAME, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(auto_accept)
diff --git a/libpurple/plugins/buddynote.c b/libpurple/plugins/buddynote.c
--- a/libpurple/plugins/buddynote.c
+++ b/libpurple/plugins/buddynote.c
@@ -18,6 +18,9 @@
  */
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 static void
@@ -60,8 +63,8 @@
 	*m = g_list_append(*m, bna);
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+buddy_note_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Stu Tomlinson <stu@nosnilmot.com>",
@@ -84,7 +87,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+buddy_note_load(GPluginPlugin *plugin, GError **error)
 {
 
 	purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu",
@@ -94,9 +97,9 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+buddy_note_unload(GPluginPlugin *plugin, GError **error)
 {
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(buddynote, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(buddy_note)
diff --git a/libpurple/plugins/idle.c b/libpurple/plugins/idle.c
--- a/libpurple/plugins/idle.c
+++ b/libpurple/plugins/idle.c
@@ -24,6 +24,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 /* This plugin no longer depends on gtk */
@@ -262,8 +265,8 @@
 	idled_accts = g_list_remove(idled_accts, account);
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+idle_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Eric Warmenhoven <eric@warmenhoven.org>",
@@ -288,7 +291,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+idle_load(GPluginPlugin *plugin, GError **error)
 {
 	purple_signal_connect(purple_connections_get_handle(), "signing-off",
 						plugin,
@@ -298,12 +301,11 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+idle_unload(GPluginPlugin *plugin, GError **error)
 {
 	unidle_all_action(NULL);
 
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(idle, plugin_query, plugin_load, plugin_unload);
-
+GPLUGIN_NATIVE_PLUGIN_DECLARE(idle);
diff --git a/libpurple/plugins/joinpart.c b/libpurple/plugins/joinpart.c
--- a/libpurple/plugins/joinpart.c
+++ b/libpurple/plugins/joinpart.c
@@ -22,6 +22,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #define JOINPART_PLUGIN_ID "core-rlaager-joinpart"
@@ -202,8 +205,8 @@
 	return frame;
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+join_part_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Richard Laager <rlaager@pidgin.im>",
@@ -227,7 +230,8 @@
 	);
 }
 
-static gboolean plugin_load(PurplePlugin *plugin, GError **error)
+static gboolean
+join_part_load(GPluginPlugin *plugin, GError **error)
 {
 	void *conv_handle;
 	GHashTable *users;
@@ -261,7 +265,8 @@
 	return TRUE;
 }
 
-static gboolean plugin_unload(PurplePlugin *plugin, GError **error)
+static gboolean
+join_part_unload(GPluginPlugin *plugin, GError **error)
 {
 	/* Destroy the hash table. The core plugin code will
 	 * disconnect the signals, and since Purple is single-threaded,
@@ -273,4 +278,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(joinpart, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(join_part)
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
@@ -22,6 +22,9 @@
 #include <ctype.h>
 #include <stdio.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 /* Where is the Windows partition mounted? */
@@ -2602,8 +2605,8 @@
 	return frame;
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+log_reader_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Richard Laager <rlaager@pidgin.im>",
@@ -2633,7 +2636,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+log_reader_load(GPluginPlugin *plugin, GError **error)
 {
 	g_return_val_if_fail(plugin != NULL, FALSE);
 
@@ -2703,7 +2706,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+log_reader_unload(GPluginPlugin *plugin, GError **error)
 {
 	g_return_val_if_fail(plugin != NULL, FALSE);
 
@@ -2730,4 +2733,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(log_reader, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(log_reader)
diff --git a/libpurple/plugins/notification-sound/notification-sound.c b/libpurple/plugins/notification-sound/notification-sound.c
--- a/libpurple/plugins/notification-sound/notification-sound.c
+++ b/libpurple/plugins/notification-sound/notification-sound.c
@@ -230,14 +230,12 @@
  *****************************************************************************/
 static GPluginPluginInfo *
 notification_sound_query(G_GNUC_UNUSED GError **error) {
-	PurplePluginInfo *info = NULL;
-
 	const gchar * const authors[] = {
 		"Pidgin Developers <devel@pidgin.im>",
 		NULL
 	};
 
-	info = purple_plugin_info_new(
+	return purple_plugin_info_new(
 		"id", "purple/notification-sound",
 		"abi-version", PURPLE_ABI_VERSION,
 		"name", N_("Notification Sounds"),
@@ -247,8 +245,6 @@
 		"actions-cb", purple_notification_sound_actions,
 		NULL
 	);
-
-	return GPLUGIN_PLUGIN_INFO(info);
 }
 
 static gboolean
diff --git a/libpurple/plugins/psychic.c b/libpurple/plugins/psychic.c
--- a/libpurple/plugins/psychic.c
+++ b/libpurple/plugins/psychic.c
@@ -17,6 +17,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #define PLUGIN_ID       "core-psychic"
@@ -114,9 +117,8 @@
 }
 
 
-static PurplePluginInfo *
-plugin_query(GError **error) {
-
+static GPluginPluginInfo *
+psychic_query(GError **error) {
   const gchar * const authors[] = PLUGIN_AUTHORS;
 
   return purple_plugin_info_new(
@@ -136,7 +138,7 @@
 
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error) {
+psychic_load(GPluginPlugin *plugin, GError **error) {
 
   void *convs_handle;
 
@@ -155,10 +157,9 @@
 
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error) {
+psychic_unload(GPluginPlugin *plugin, GError **error) {
 
   return TRUE;
 }
 
-
-PURPLE_PLUGIN_INIT(psychic, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(psychic)
diff --git a/libpurple/plugins/purple-toast.c b/libpurple/plugins/purple-toast.c
--- a/libpurple/plugins/purple-toast.c
+++ b/libpurple/plugins/purple-toast.c
@@ -191,14 +191,12 @@
  *****************************************************************************/
 static GPluginPluginInfo *
 purple_toast_query(G_GNUC_UNUSED GError **error) {
-	PurplePluginInfo *info = NULL;
-
 	const gchar * const authors[] = {
 		"Gary Kramlich <grim@reaperworld.com>",
 		NULL
 	};
 
-	info = purple_plugin_info_new(
+	return purple_plugin_info_new(
 		"id", "purple/toast",
 		"abi-version", PURPLE_ABI_VERSION,
 		"name", "Purple Toast",
@@ -207,8 +205,6 @@
 		"authors", authors,
 		NULL
 	);
-
-	return GPLUGIN_PLUGIN_INFO(info);
 }
 
 static gboolean
diff --git a/libpurple/plugins/statenotify.c b/libpurple/plugins/statenotify.c
--- a/libpurple/plugins/statenotify.c
+++ b/libpurple/plugins/statenotify.c
@@ -17,6 +17,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #define STATENOTIFY_PLUGIN_ID "core-statenotify"
@@ -124,8 +127,8 @@
 	return frame;
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+state_notify_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Christian Hammond <chipx86@gnupdate.org>",
@@ -150,7 +153,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+state_notify_load(GPluginPlugin *plugin, GError **error)
 {
 	void *blist_handle = purple_blist_get_handle();
 
@@ -172,9 +175,9 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+state_notify_unload(GPluginPlugin *plugin, GError **error)
 {
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(statenotify, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(state_notify)
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
@@ -32,6 +32,9 @@
 #include <lm.h>
 #endif
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "bonjour.h"
@@ -754,8 +757,8 @@
 		NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+bonjour_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",           "prpl-bonjour",
@@ -773,7 +776,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+bonjour_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -794,7 +797,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+bonjour_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -810,4 +813,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(bonjour, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(bonjour)
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
@@ -21,7 +21,11 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
+
 #include "libpurple/glibcompat.h"
 
 #include "api.h"
@@ -1675,8 +1679,8 @@
 	g_slist_free_full(fb_cmds, fb_cmds_unregister_free);
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+facebook_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",          FB_PROTOCOL_ID,
@@ -1694,7 +1698,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+facebook_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1716,7 +1720,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+facebook_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1731,4 +1735,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(facebook, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(facebook)
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
@@ -28,6 +28,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "gg.h"
@@ -1215,8 +1218,8 @@
 	return g_strdup_printf("Using libgadu version %s", gg_libgadu_version());
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+gg_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"boler@sourceforge.net",
@@ -1241,7 +1244,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+gg_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1274,7 +1277,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+gg_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1295,6 +1298,6 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(gg, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(gg)
 
 /* vim: set ts=8 sts=0 sw=8 noet: */
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
@@ -25,6 +25,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "irc.h"
@@ -1137,8 +1140,8 @@
 		NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+irc_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",           "prpl-irc",
@@ -1156,7 +1159,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+irc_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1192,7 +1195,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+irc_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1210,4 +1213,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(irc, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(irc)
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
@@ -27,6 +27,9 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "auth.h"
@@ -4250,8 +4253,8 @@
         G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
                                       jabber_protocol_xfer_iface_init));
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+jabber_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",           "prpl-xmpp",
@@ -4269,7 +4272,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+jabber_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -4306,7 +4309,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+jabber_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -4324,4 +4327,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(jabber, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(jabber)
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
@@ -24,6 +24,9 @@
 # include <sys/utsname.h>
 #endif
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "nmuser.h"
@@ -3625,8 +3628,8 @@
 		NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+novell_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",           "prpl-novell",
@@ -3644,7 +3647,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+novell_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -3661,7 +3664,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+novell_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -3674,4 +3677,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(novell, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(novell)
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
@@ -47,6 +47,9 @@
 #include <glib.h>
 #include <glib/gi18n-lib.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "nullprpl.h"
@@ -1223,8 +1226,8 @@
     NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+null_query(GError **error)
 {
   return purple_plugin_info_new(
     "id",           "prpl-null",
@@ -1245,7 +1248,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+null_load(GPluginPlugin *plugin, GError **error)
 {
   PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1273,7 +1276,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+null_unload(GPluginPlugin *plugin, GError **error)
 {
   PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1289,5 +1292,4 @@
   return TRUE;
 }
 
-/* initialize the plugin */
-PURPLE_PLUGIN_INIT(null, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(null);
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
@@ -35,6 +35,9 @@
 #include <glib/gstdio.h>
 #include <gmime/gmime.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 /* purple includes */
 #include <purple.h>
 
@@ -5385,8 +5388,8 @@
     NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+sametime_query(GError **error)
 {
   const gchar * const authors[] = PLUGIN_AUTHORS;
 
@@ -5408,7 +5411,7 @@
 
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+sametime_load(GPluginPlugin *plugin, GError **error)
 {
   PurpleProtocolManager *manager = purple_protocol_manager_get_default();
   GLogLevelFlags logflags =
@@ -5442,7 +5445,7 @@
 
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+sametime_unload(GPluginPlugin *plugin, GError **error)
 {
   PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -5461,6 +5464,6 @@
 }
 
 
-PURPLE_PLUGIN_INIT(sametime, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(sametime)
 /* The End. */
 
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
@@ -20,6 +20,9 @@
 #include <glib/gi18n-lib.h>
 #include <glib/gstdio.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include "silcpurple.h"
 #include "ft.h"
 #include "wb.h"
@@ -2344,8 +2347,8 @@
 	        NULL));
 }
 
-static PurplePluginInfo *
-plugin_query(GError **error)
+static GPluginPluginInfo *
+silc_query(GError **error)
 {
 	const gchar * const authors[] = {
 		"Pekka Riikonen",
@@ -2369,7 +2372,7 @@
 }
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+silc_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -2393,7 +2396,7 @@
 }
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+silc_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -2408,4 +2411,4 @@
 	return TRUE;
 }
 
-PURPLE_PLUGIN_INIT(silc, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(silc)
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
@@ -32,6 +32,9 @@
 #include <glib.h>
 #include <glib/gstdio.h>
 
+#include <gplugin.h>
+#include <gplugin-native.h>
+
 #include <purple.h>
 
 #include "internal.h"
@@ -1714,7 +1717,8 @@
 		NULL));
 }
 
-static PurplePluginInfo *plugin_query(GError **error)
+static GPluginPluginInfo *
+zephyr_query(GError **error)
 {
 	return purple_plugin_info_new(
 		"id",           "prpl-zephyr",
@@ -1733,7 +1737,7 @@
 
 
 static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
+zephyr_load(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1753,7 +1757,7 @@
 
 
 static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
+zephyr_unload(GPluginPlugin *plugin, GError **error)
 {
 	PurpleProtocolManager *manager = purple_protocol_manager_get_default();
 
@@ -1768,5 +1772,4 @@
 	return TRUE;
 }
 
-
-PURPLE_PLUGIN_INIT(zephyr, plugin_query, plugin_load, plugin_unload);
+GPLUGIN_NATIVE_PLUGIN_DECLARE(zephyr)
