diff --git a/finch/gntblist.c b/finch/gntblist.c
--- a/finch/gntblist.c
+++ b/finch/gntblist.c
@@ -2996,7 +2996,7 @@
 	purple_signal_connect(purple_blist_get_handle(), "buddy-idle-changed", finch_blist_get_handle(),
 				PURPLE_CALLBACK(buddy_idle_changed), ggblist);
 
-	plugin_manager = gplugin_manager_get_instance();
+	plugin_manager = gplugin_manager_get_default();
 	g_signal_connect_object(plugin_manager, "loaded-plugin",
 	                        G_CALLBACK(reconstruct_plugins_menu_cb), ggblist, 0);
 	g_signal_connect_object(plugin_manager, "unloaded-plugin",
diff --git a/finch/gntconv.c b/finch/gntconv.c
--- a/finch/gntconv.c
+++ b/finch/gntconv.c
@@ -902,7 +902,7 @@
 	purple_signal_connect(purple_cmds_get_handle(), "cmd-removed", ggc,
 			G_CALLBACK(cmd_removed_cb), ggc);
 
-	plugin_manager = gplugin_manager_get_instance();
+	plugin_manager = gplugin_manager_get_default();
 	g_signal_connect_object(plugin_manager, "loaded-plugin",
 	                        G_CALLBACK(plugin_changed_cb), ggc, 0);
 	g_signal_connect_object(plugin_manager, "unloaded-plugin",
diff --git a/libpurple/plugins.c b/libpurple/plugins.c
--- a/libpurple/plugins.c
+++ b/libpurple/plugins.c
@@ -139,6 +139,7 @@
 gboolean
 purple_plugin_load(PurplePlugin *plugin, GError **error)
 {
+	GPluginManager *manager = NULL;
 	GError *err = NULL;
 	gchar *filename;
 
@@ -147,15 +148,16 @@
 	if (purple_plugin_is_loaded(plugin))
 		return TRUE;
 
-	if (!gplugin_manager_load_plugin(plugin, &err)) {
-	        filename = gplugin_plugin_get_filename(plugin);
+	manager = gplugin_manager_get_default();
+
+	if (!gplugin_manager_load_plugin(manager, plugin, &err)) {
+		filename = gplugin_plugin_get_filename(plugin);
 		purple_debug_error("plugins", "Failed to load plugin %s: %s",
 		                   filename,
 		                   err ? err->message : "Unknown reason");
 
-		if (error)
-			*error = g_error_copy(err);
-		g_error_free(err);
+		g_propagate_error(error, err);
+
 		g_free(filename);
 		return FALSE;
 	}
@@ -168,21 +170,23 @@
 {
 	GError *err = NULL;
 	gchar *filename;
+	GPluginManager *manager = NULL;
 
 	g_return_val_if_fail(plugin != NULL, FALSE);
 
 	if (!purple_plugin_is_loaded(plugin))
 		return TRUE;
 
-	if (!gplugin_manager_unload_plugin(plugin, &err)) {
-	        filename = gplugin_plugin_get_filename(plugin);
+	manager = gplugin_manager_get_default();
+
+	if (!gplugin_manager_unload_plugin(manager, plugin, &err)) {
+		filename = gplugin_plugin_get_filename(plugin);
 		purple_debug_error("plugins", "Failed to unload plugin %s: %s",
 		                   filename,
 		                   err ? err->message : "Unknown reason");
 
-		if (error)
-			*error = g_error_copy(err);
-		g_error_free(err);
+		g_propagate_error(error, err);
+
 		g_free(filename);
 
 		return FALSE;
@@ -297,11 +301,12 @@
 {
 	GList *ret = NULL, *ids, *l;
 	GSList *plugins, *ll;
+	GPluginManager *manager = gplugin_manager_get_default();
 
-	ids = gplugin_manager_list_plugins();
+	ids = gplugin_manager_list_plugins(manager);
 
 	for (l = ids; l; l = l->next) {
-		plugins = gplugin_manager_find_plugins(l->data);
+		plugins = gplugin_manager_find_plugins(manager, l->data);
 
 		for (ll = plugins; ll; ll = ll->next) {
 			PurplePlugin *plugin = PURPLE_PLUGIN(ll->data);
@@ -325,15 +330,18 @@
 void
 purple_plugins_add_search_path(const gchar *path)
 {
-	gplugin_manager_append_path(path);
+	GPluginManager *manager = gplugin_manager_get_default();
+
+	gplugin_manager_append_path(manager, path);
 }
 
 void
 purple_plugins_refresh(void)
 {
 	GList *plugins, *l;
+	GPluginManager *manager = gplugin_manager_get_default();
 
-	gplugin_manager_refresh();
+	gplugin_manager_refresh(manager);
 
 	plugins = purple_plugins_find_all();
 	for (l = plugins; l != NULL; l = l->next) {
@@ -365,10 +373,13 @@
 purple_plugins_find_plugin(const gchar *id)
 {
 	PurplePlugin *plugin;
+	GPluginManager *manager = NULL;
 
 	g_return_val_if_fail(id != NULL && *id != '\0', NULL);
 
-	plugin = gplugin_manager_find_plugin(id);
+	manager = gplugin_manager_get_default();
+
+	plugin = gplugin_manager_find_plugin(manager, id);
 
 	if (!plugin)
 		return NULL;
@@ -479,32 +490,33 @@
 
 	gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
 
+	manager = gplugin_manager_get_default();
+
 	search_path = g_getenv("PURPLE_PLUGIN_PATH");
 	if (search_path) {
 		gchar **paths;
-		int i;
+		gint i;
 
 		paths = g_strsplit(search_path, G_SEARCHPATH_SEPARATOR_S, 0);
 		for (i = 0; paths[i]; ++i) {
-			purple_plugins_add_search_path(paths[i]);
+			gplugin_manager_append_path(manager, paths[i]);
 		}
 
 		g_strfreev(paths);
 	}
 
-	gplugin_manager_add_default_paths();
+	gplugin_manager_add_default_paths(manager);
 
 	if(!g_getenv("PURPLE_PLUGINS_SKIP")) {
-		purple_plugins_add_search_path(PURPLE_LIBDIR);
+		gplugin_manager_append_path(manager, PURPLE_LIBDIR);
 	} else {
 		purple_debug_info("plugins", "PURPLE_PLUGINS_SKIP environment variable set, skipping normal plugin paths");
 	}
 
-	manager = gplugin_manager_get_instance();
-	g_signal_connect(manager, "loading-plugin", G_CALLBACK(plugin_loading_cb),
-	                 NULL);
-	g_signal_connect(manager, "loaded-plugin", G_CALLBACK(plugin_loaded_cb),
-	                 NULL);
+	g_signal_connect(manager, "loading-plugin",
+	                 G_CALLBACK(plugin_loading_cb), NULL);
+	g_signal_connect(manager, "loaded-plugin",
+	                 G_CALLBACK(plugin_loaded_cb), NULL);
 	g_signal_connect(manager, "unloading-plugin",
 	                 G_CALLBACK(plugin_unloading_cb), NULL);
 	g_signal_connect(manager, "unloaded-plugin",
diff --git a/meson.build b/meson.build
--- a/meson.build
+++ b/meson.build
@@ -570,7 +570,7 @@
 #######################################################################
 # Check for GPlugin
 #######################################################################
-gplugin_dep = dependency('gplugin', version : '>=0.32.0,<0.33.0', required : false)
+gplugin_dep = dependency('gplugin', version : '>=0.33.0,<0.34.0', required : false)
 if gplugin_dep.found()
 	gplugin_docpath = gplugin_dep.get_pkgconfig_variable('prefix') / 'share/gtk-doc/html'
 
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -5752,9 +5752,9 @@
 	gtk_box_pack_start(GTK_BOX(testidea), win->notebook, TRUE, TRUE, 0);
 
 	/* Update the plugin actions when plugins are (un)loaded */
-	manager = gplugin_manager_get_instance();
-	g_signal_connect(manager, "loaded-plugin", G_CALLBACK(plugin_changed_cb),
-	                 win);
+	manager = gplugin_manager_get_default();
+	g_signal_connect(manager, "loaded-plugin",
+	                 G_CALLBACK(plugin_changed_cb), win);
 	g_signal_connect(manager, "unloaded-plugin",
 	                 G_CALLBACK(plugin_changed_cb), win);
 
diff --git a/pidgin/pidginabout.c b/pidgin/pidginabout.c
--- a/pidgin/pidginabout.c
+++ b/pidgin/pidginabout.c
@@ -425,8 +425,9 @@
 static void
 pidgin_about_dialog_load_plugin_search_paths(PidginAboutDialog *about) {
 	GtkTreeIter section;
-	GList *path = NULL;
+	GList *paths = NULL;
 	gchar *markup = NULL;
+	GPluginManager *manager = gplugin_manager_get_default();
 
 	/* create the section */
 	markup = g_strdup_printf("<b>%s</b>", _("Plugin Search Paths"));
@@ -437,13 +438,16 @@
 	g_free(markup);
 
 	/* add the search paths */
-	for(path = gplugin_manager_get_paths(); path != NULL; path = path->next) {
+	paths = gplugin_manager_get_paths(manager);
+	while(paths != NULL) {
 		GtkTreeIter iter;
 
 		gtk_tree_store_append(about->build_info_store, &iter, &section);
 		gtk_tree_store_set(about->build_info_store, &iter,
-		                   0, (gchar*)path->data,
+		                   0, (gchar*)(paths->data),
 		                   -1);
+
+		paths = paths->next;
 	}
 }
 
diff --git a/pidgin/pidginpluginsmenu.c b/pidgin/pidginpluginsmenu.c
--- a/pidgin/pidginpluginsmenu.c
+++ b/pidgin/pidginpluginsmenu.c
@@ -255,7 +255,7 @@
 	                                           (GDestroyNotify)gtk_widget_destroy);
 
 	/* Connect to the plugin manager's signals so we can stay up to date. */
-	manager = gplugin_manager_get_instance();
+	manager = gplugin_manager_get_default();
 
 	g_signal_connect_object(manager, "loaded-plugin",
 	                        G_CALLBACK(pidgin_plugins_menu_plugin_loaded_cb),
diff --git a/subprojects/gplugin.wrap b/subprojects/gplugin.wrap
--- a/subprojects/gplugin.wrap
+++ b/subprojects/gplugin.wrap
@@ -1,4 +1,4 @@
 [wrap-hg]
 directory = gplugin
 url = https://keep.imfreedom.org/gplugin/gplugin
-revision = v0.32.1
+revision = v0.33.0
