diff --git a/gplugin/gplugin-manager.h b/gplugin/gplugin-manager.h
--- a/gplugin/gplugin-manager.h
+++ b/gplugin/gplugin-manager.h
@@ -118,6 +118,11 @@
 	GPluginManager *manager,
 	const gchar *id);
 
+GPLUGIN_AVAILABLE_IN_0_44
+GPluginPlugin *gplugin_manager_find_plugin_with_filename(
+	GPluginManager *manager,
+	const char *filename);
+
 GPLUGIN_AVAILABLE_IN_ALL
 GPluginPlugin *gplugin_manager_find_plugin_with_newest_version(
 	GPluginManager *manager,
# HG changeset patch
# Node ID e3093e72838acc01387918b265bd572dec60a1a0
# Parent  f92923c3ccbe7d469cfd0cce809a9998351ec737
diff --git a/gplugin/gplugin-manager.c b/gplugin/gplugin-manager.c
--- a/gplugin/gplugin-manager.c
+++ b/gplugin/gplugin-manager.c
@@ -1098,6 +1098,56 @@
 }
 
 /**
+ * gplugin_manager_find_plugin_with_filename:
+ * @manager: The instance.
+ * @filename: The filename of the plugin.
+ *
+ * Finds a plugin with the given filename.
+ *
+ * This method should be used sparingly as you should typically be using plugin
+ * id's to identify them, however, sometimes it's necessary to find them by
+ * filename.
+ *
+ * Returns: (transfer full) (nullable): The plugin if found, otherwise %NULL.
+ *
+ * Since: 0.44
+ */
+GPluginPlugin *
+gplugin_manager_find_plugin_with_filename(
+	GPluginManager *manager,
+	const char *filename)
+{
+	GHashTableIter iter;
+	gpointer value = NULL;
+
+	g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL);
+	g_return_val_if_fail(filename != NULL, NULL);
+
+	g_hash_table_iter_init(&iter, manager->plugins);
+	while(g_hash_table_iter_next(&iter, NULL, &value)) {
+		for(GSList *l = value; l != NULL; l = l->next) {
+			GPluginPlugin *plugin = l->data;
+			char *plugin_filename = NULL;
+
+			if(!GPLUGIN_IS_PLUGIN(plugin)) {
+				continue;
+			}
+
+			plugin_filename = gplugin_plugin_get_filename(plugin);
+			if(g_strcmp0(filename, plugin_filename) == 0) {
+				g_free(plugin_filename);
+
+				return g_object_ref(plugin);
+			}
+
+			g_free(plugin_filename);
+		}
+	}
+
+	return NULL;
+}
+
+/**
  * gplugin_manager_find_plugin_with_newest_version:
  * @manager: The manager instance.
  * @id: The ID of the plugin to find.
diff --git a/gplugin/gplugin-version.h b/gplugin/gplugin-version.h
--- a/gplugin/gplugin-version.h
+++ b/gplugin/gplugin-version.h
@@ -333,6 +333,22 @@
 #define GPLUGIN_AVAILABLE_IN_0_43 _GPLUGIN_EXTERN
 #endif
 
+/**
+ * GPLUGIN_VERSION_0_44:
+ *
+ * A macro that evaluates to the 0.44 version of GPlugin, in a format that can
+ * be used by the C pre-processor.
+ *
+ * Since: 0.44.0
+ */
+#define GPLUGIN_VERSION_0_44 (G_ENCODE_VERSION(0, 44))
+
+#if GPLUGIN_VERSION_MAX_ALLOWED < GPLUGIN_VERSION_0_44
+#define GPLUGIN_AVAILABLE_IN_0_44 GPLUGIN_UNAVAILABLE(0, 44)
+#else
+#define GPLUGIN_AVAILABLE_IN_0_44 _GPLUGIN_EXTERN
+#endif
+
 #define GPLUGIN_VERSION_CHECK(major, minor, micro) \
 	((major) == GPLUGIN_MAJOR_VERSION && \
 	 ((minor) < GPLUGIN_MINOR_VERSION || \
diff --git a/gplugin/tests/meson.build b/gplugin/tests/meson.build
--- a/gplugin/tests/meson.build
+++ b/gplugin/tests/meson.build
@@ -3,12 +3,12 @@
 ###############################################################################
 # Subdirectories
 ###############################################################################
+subdir('auto-load-fail')
+subdir('auto-load-pass')
 subdir('bad-plugins')
 subdir('bind-global')
 subdir('dynamic-type')
 subdir('id-collision')
-subdir('auto-load-fail')
-subdir('auto-load-pass')
 subdir('newest-version')
 subdir('plugins')
 subdir('unresolved-symbol')
@@ -31,6 +31,7 @@
   'id-normalize': [],
   'loader': [],
   'loader-registration': [],
+  'manager': [],
   'newest-version': ['newest-version'],
   'option-group': [],
   'plugin-manager-paths': [],
diff --git a/gplugin/tests/test-manager.c b/gplugin/tests/test-manager.c
new file mode 100644
--- /dev/null
+++ b/gplugin/tests/test-manager.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2011-2024 Gary Kramlich <grim@reaperworld.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+#include <gplugin.h>
+
+/******************************************************************************
+ * Tests
+ *****************************************************************************/
+static void
+test_gplugin_manager_new(void)
+{
+	GPluginManager *manager = NULL;
+
+	manager = g_object_new(GPLUGIN_TYPE_MANAGER, NULL);
+
+	g_assert_true(GPLUGIN_IS_MANAGER(manager));
+
+	g_assert_finalize_object(manager);
+}
+
+static void
+test_gplugin_manager_find_plugin_with_filename_not_found(void)
+{
+	GPluginManager *manager = NULL;
+	GPluginPlugin *plugin = NULL;
+
+	manager = g_object_new(GPLUGIN_TYPE_MANAGER, NULL);
+
+	plugin = gplugin_manager_find_plugin_with_filename(
+		manager,
+		"doest-not-exist.xyz");
+	g_assert_null(plugin);
+
+	g_assert_finalize_object(manager);
+}
+
+/******************************************************************************
+ * Main
+ *****************************************************************************/
+int
+main(int argc, char **argv)
+{
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_set_nonfatal_assertions();
+
+	g_test_add_func("/manager/new", test_gplugin_manager_new);
+
+	g_test_add_func(
+		"/manager/find-plugin/with-filename/not-found",
+		test_gplugin_manager_find_plugin_with_filename_not_found);
+
+	return g_test_run();
+}
diff --git a/meson.build b/meson.build
--- a/meson.build
+++ b/meson.build
@@ -3,7 +3,7 @@
 ###############################################################################
 project('gplugin', 'c',
 	license : 'LGPL-2.0-or-later',
-	version : '0.43.3-dev',
+	version : '0.44.0-dev',
 	meson_version : '>=1.0.0',
 	default_options : ['c_std=c17', 'warning_level=2'])
 
