diff --git a/gplugin/gplugin-native-loader.c b/gplugin/gplugin-native-loader.c
--- a/gplugin/gplugin-native-loader.c
+++ b/gplugin/gplugin-native-loader.c
@@ -24,6 +24,14 @@
 #include <gplugin/gplugin-native-private.h>
 #include <gplugin/gplugin-private.h>
 
+/**
+ * SECTION:gplugin-native-loader
+ * @title: Native Plugin Loader API
+ * @short_description: the native plugin loader API
+ *
+ * This section contains the native plugin loader API of GPlugin.
+ */
+
 #define GPLUGIN_QUERY_SYMBOL "gplugin_query"
 #define GPLUGIN_LOAD_SYMBOL "gplugin_load"
 #define GPLUGIN_UNLOAD_SYMBOL "gplugin_unload"
@@ -283,7 +291,7 @@
 
 	/* get and call the function */
 	g_object_get(G_OBJECT(plugin), "load-func", &func, NULL);
-	if(!func(GPLUGIN_NATIVE_PLUGIN(plugin), error)) {
+	if(!func(plugin, error)) {
 		if(error && *error == NULL)
 			g_set_error_literal(error, GPLUGIN_DOMAIN, 0, _("unknown failure"));
 
@@ -319,7 +327,7 @@
 	}
 
 	/* now call the function */
-	if(!func(GPLUGIN_NATIVE_PLUGIN(plugin), error)) {
+	if(!func(plugin, error)) {
 		if(error && *error == NULL)
 			g_set_error_literal(error, GPLUGIN_DOMAIN, 0, _("unknown failure"));
 
diff --git a/gplugin/gplugin-native-plugin.h b/gplugin/gplugin-native-plugin.h
--- a/gplugin/gplugin-native-plugin.h
+++ b/gplugin/gplugin-native-plugin.h
@@ -38,6 +38,18 @@
 
 GModule *gplugin_native_plugin_get_module(GPluginNativePlugin *plugin);
 
+#define GPLUGIN_QUERY(name) \
+	G_MODULE_EXPORT GPluginPluginInfo *gplugin_query(GError **error); \
+	G_MODULE_EXPORT GPluginPluginInfo *gplugin_query(GError **error)
+
+#define GPLUGIN_LOAD(name) \
+	G_MODULE_EXPORT gboolean gplugin_load(GPluginPlugin *plugin, GError **error); \
+	G_MODULE_EXPORT gboolean gplugin_load(GPluginPlugin *plugin, GError **error)
+
+#define GPLUGIN_UNLOAD(name) \
+	G_MODULE_EXPORT gboolean gplugin_unload(GPluginPlugin *plugin, GError **error); \
+	G_MODULE_EXPORT gboolean gplugin_unload(GPluginPlugin *plugin, GError **error)
+
 G_END_DECLS
 
 #endif /* GPLUGIN_NATIVE_PLUGIN_H */
diff --git a/gplugin/gplugin-native-plugin.c b/gplugin/gplugin-native-plugin.c
--- a/gplugin/gplugin-native-plugin.c
+++ b/gplugin/gplugin-native-plugin.c
@@ -24,6 +24,14 @@
 #include <gplugin/gplugin-native-private.h>
 
 /**
+ * SECTION:gplugin-native-plugin
+ * @title: Native Plugin API
+ * @short_description: the native plugin API
+ *
+ * This section contains the native plugin API of GPlugin.
+ */
+
+/**
  * GPLUGIN_TYPE_NATIVE_PLUGIN:
  *
  * The standard _get_type macro for #GPluginNativePlugin.
@@ -36,6 +44,44 @@
  * compiled to machine native code, typically these are written in C/C++.
  */
 
+/**
+ * GPLUGIN_QUERY:
+ * @name: A unique identifier that can be used as part of a function name.
+ *
+ * This macro expands to the proper function that #GPluginNativeLoader looks
+ * for to query a plugin. It should be used over manually specifying the
+ * function to help with updates as well as future features like static plugin
+ * loading.
+ *
+ * Since: 0.31.0
+ */
+
+/**
+ * GPLUGIN_LOAD:
+ * @name: A unique identifier that can be used as part of a function name.
+ *
+ * This macro expands to the proper function that #GPluginNativeLoader looks
+ * for to load a plugin.
+ *
+ * This function should be used over manually specifying the symbols to help
+ * with updates as well as future features like static plugin loading.
+ *
+ * Since: 0.31.0
+ */
+
+/**
+ * GPLUGIN_UNLOAD:
+ * @name: A unique identifier that can be used as part of a function name.
+ *
+ * This macro expands to the proper function that #GPluginNativeLoader looks
+ * for to unload a plugin.
+ *
+ * This function should be used over manually specifying the symbols to help
+ * with updates as well as future features like static plugin loading.
+ *
+ * Since: 0.31.0
+ */
+
 /******************************************************************************
  * Structs
  *****************************************************************************/
diff --git a/gplugin/gplugin-native-private.h b/gplugin/gplugin-native-private.h
--- a/gplugin/gplugin-native-private.h
+++ b/gplugin/gplugin-native-private.h
@@ -30,9 +30,9 @@
 
 typedef GPluginPluginInfo *(*GPluginNativePluginQueryFunc)(GError **error);
 typedef gboolean (
-	*GPluginNativePluginLoadFunc)(GPluginNativePlugin *plugin, GError **error);
+	*GPluginNativePluginLoadFunc)(GPluginPlugin *plugin, GError **error);
 typedef gboolean (*GPluginNativePluginUnloadFunc)(
-	GPluginNativePlugin *plugin,
+	GPluginPlugin *plugin,
 	GError **error);
 
 G_END_DECLS
diff --git a/gplugin/reference/gplugin-docs.xml b/gplugin/reference/gplugin-docs.xml
--- a/gplugin/reference/gplugin-docs.xml
+++ b/gplugin/reference/gplugin-docs.xml
@@ -41,7 +41,7 @@
   </part>
 
   <part id="API">
-	  <title>API Reference</title>
+    <title>API Reference</title>
 
     <xi:include href="xml/gplugin-core.xml"/>
     <xi:include href="xml/gplugin-loader.xml"/>
@@ -52,6 +52,13 @@
     <xi:include href="xml/gplugin-version.xml"/>
   </part>
 
+  <part id="Native API">
+    <title>Native API Reference</title>
+
+    <xi:include href="xml/gplugin-native-loader.xml"/>
+    <xi:include href="xml/gplugin-native-plugin.xml"/>
+  </part>
+
   <index id="api-index-full">
     <title>Index</title>
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
@@ -60,5 +67,9 @@
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-0.31.0">
+    <title>Index of new symbols in 0.31.0</title>
+    <xi:include href="xml/api-index-0.31.0.xml"><xi:fallback /></xi:include>
+  </index>
   <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
 </book>
diff --git a/gplugin/reference/meson.build b/gplugin/reference/meson.build
--- a/gplugin/reference/meson.build
+++ b/gplugin/reference/meson.build
@@ -7,8 +7,6 @@
     'gplugin-loader-tests.h',
     'gplugin-native-private.h',
     'gplugin-native.h',
-    'gplugin-native-loader.h',
-    'gplugin-native-plugin.h',
     'gplugin-private.h',
     'gplugin.h',
 ]
diff --git a/gplugin/reference/native-plugins.xml b/gplugin/reference/native-plugins.xml
--- a/gplugin/reference/native-plugins.xml
+++ b/gplugin/reference/native-plugins.xml
@@ -23,14 +23,13 @@
       #include &lt;gplugin.h&gt;
       #include &lt;gplugin-native.h&gt;
 
-      /* gplugin_plugin_query is called by the native loader to determine if
-       * the plugin is loadable.  It must have this signature and should
-       * return a valid GPluginPluginInfo instance if everything is fine.  If
-       * something went wrong, error should be set to a valid GError and NULL
-       * should be returned.
+      /* GPLUGIN_QUERY expands to the function that the native loader calls
+       * to query a plugin. The macro takes a parameter of an unique
+       * identifier that can be used in function names.
+       *
+       * See #GPLUGIN_QUERY for more information.
        */
-      G_MODULE_EXPORT GPluginPluginInfo *
-      gplugin_plugin_query(GError **error) {
+      GPLUGIN_QUERY(native_basic_plugin) {
           /* Authors is a list of authors who worked on the plugin.  Generally
            * these are in the "Name Surname &lt;user@domain.com&gt;" format.
            */
@@ -43,7 +42,7 @@
            * rest are here for demonstration purposes.
            */
           return gplugin_plugin_info_new(
-              "gplugin/basic-native-plugin",
+              "gplugin/native-basic-plugin",
               GPLUGIN_NATIVE_PLUGIN_ABI_VERSION,
               "name", "name",
               "version", "version",
@@ -54,23 +53,23 @@
               NULL);
       }
 
-      /* gplugin_plugin_load is called by the loader when the plugin should
-       * be loaded.  It must have this exact signature and return TRUE if
-       * loading was successful, otherwise it should return FALSE with error
-       * set to a valid GError.
+      /* GPLUGIN_LOAD expands to the function that the native loader calls
+       * to load a plugin. The macro takes a parameter of an unique identifier
+       * that can be used in function names.
+       *
+       * See #GPLUGIN_LOAD for more information.
        */
-      G_MODULE_EXPORT gboolean
-      gplugin_plugin_load(GPluginNativePlugin *plugin, GError **error) {
+      GPLUGIN_LOAD(native_basic_plugin) {
           return TRUE;
       }
 
-      /* gplugin_plugin_unload is called by the loader when the plugin should
-       * be unloaded.  It must have this exact signature and should return TRUE
-       * if unloading was successful, otherwise it should return FALSE with
-       * error set to a valid GError.
+      /* GPLUGIN_UNLOAD expands to the function that the native loader calls
+       * to unload a plugin. The macro takes a parameter of an unique
+       * identifier that can be used in function names.
+       *
+       * See #GPLUGIN_UNLOAD for more information.
        */
-      G_MODULE_EXPORT gboolean
-      gplugin_plugin_unload(GPluginNativePlugin *plugin, GError **error) {
+      GPLUGIN_UNLOAD(native_basic_plugin) {
           return TRUE;
       }
       </programlisting></informalexample>
diff --git a/lua/gplugin-lua-core.c b/lua/gplugin-lua-core.c
--- a/lua/gplugin-lua-core.c
+++ b/lua/gplugin-lua-core.c
@@ -23,8 +23,7 @@
 #include "gplugin-lua-loader.h"
 #include "gplugin-lua-plugin.h"
 
-G_MODULE_EXPORT GPluginPluginInfo *
-gplugin_query(G_GNUC_UNUSED GError **error)
+GPLUGIN_QUERY(lua_loader)
 {
 	/* clang-format-11 formats this correctly, so this can be removed then. */
 	/* clang-format off */
@@ -53,17 +52,15 @@
 	/* clang-format on */
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_load(GPluginNativePlugin *plugin, GError **error)
+GPLUGIN_LOAD(lua_loader)
 {
-	gplugin_lua_loader_register(plugin);
-	gplugin_lua_plugin_register(plugin);
+	gplugin_lua_loader_register(G_TYPE_MODULE(plugin));
+	gplugin_lua_plugin_register(G_TYPE_MODULE(plugin));
 
 	return gplugin_manager_register_loader(GPLUGIN_LUA_TYPE_LOADER, error);
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_unload(G_GNUC_UNUSED GPluginNativePlugin *plugin, GError **error)
+GPLUGIN_UNLOAD(lua_loader)
 {
 	g_set_error_literal(
 		error,
diff --git a/lua/gplugin-lua-loader.h b/lua/gplugin-lua-loader.h
--- a/lua/gplugin-lua-loader.h
+++ b/lua/gplugin-lua-loader.h
@@ -31,7 +31,7 @@
 	LOADER,
 	GPluginLoader)
 
-void gplugin_lua_loader_register(GPluginNativePlugin *plugin);
+void gplugin_lua_loader_register(GTypeModule *module);
 
 G_END_DECLS
 
diff --git a/lua/gplugin-lua-loader.c b/lua/gplugin-lua-loader.c
--- a/lua/gplugin-lua-loader.c
+++ b/lua/gplugin-lua-loader.c
@@ -211,7 +211,7 @@
  * API
  *****************************************************************************/
 void
-gplugin_lua_loader_register(GPluginNativePlugin *plugin)
+gplugin_lua_loader_register(GTypeModule *module)
 {
-	gplugin_lua_loader_register_type(G_TYPE_MODULE(plugin));
+	gplugin_lua_loader_register_type(module);
 }
diff --git a/lua/gplugin-lua-plugin.h b/lua/gplugin-lua-plugin.h
--- a/lua/gplugin-lua-plugin.h
+++ b/lua/gplugin-lua-plugin.h
@@ -33,7 +33,7 @@
 	PLUGIN,
 	GObject)
 
-void gplugin_lua_plugin_register(GPluginNativePlugin *native);
+void gplugin_lua_plugin_register(GTypeModule *module);
 
 lua_State *gplugin_lua_plugin_get_state(GPluginLuaPlugin *plugin);
 
diff --git a/lua/gplugin-lua-plugin.c b/lua/gplugin-lua-plugin.c
--- a/lua/gplugin-lua-plugin.c
+++ b/lua/gplugin-lua-plugin.c
@@ -200,9 +200,9 @@
  * API
  *****************************************************************************/
 void
-gplugin_lua_plugin_register(GPluginNativePlugin *native)
+gplugin_lua_plugin_register(GTypeModule *module)
 {
-	gplugin_lua_plugin_register_type(G_TYPE_MODULE(native));
+	gplugin_lua_plugin_register_type(module);
 }
 
 lua_State *
diff --git a/perl5/gplugin-perl5-core.c b/perl5/gplugin-perl5-core.c
--- a/perl5/gplugin-perl5-core.c
+++ b/perl5/gplugin-perl5-core.c
@@ -24,8 +24,7 @@
 #undef _
 #include <glib/gi18n-lib.h>
 
-G_MODULE_EXPORT GPluginPluginInfo *
-gplugin_query(GError **error)
+GPLUGIN_QUERY(perl5_loader)
 {
 	const gchar *const authors[] = {
 		"Gary Kramlich <grim@reaperworld.com>",
@@ -52,17 +51,15 @@
 	/* clang-format on */
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_load(GPluginNativePlugin *plugin, GError **error)
+GPLUGIN_LOAD(perl5_loader)
 {
-	gplugin_perl_plugin_register(plugin);
-	gplugin_perl_loader_register(plugin);
+	gplugin_perl_plugin_register(G_TYPE_MODULE(plugin));
+	gplugin_perl_loader_register(G_TYPE_MODULE(plugin));
 
 	return gplugin_manager_register_loader(GPLUGIN_PERL_TYPE_LOADER, error);
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_unload(GPluginNativePlugin *plugin, GError **error)
+GPLUGIN_UNLOAD(perl5_loader)
 {
 	g_set_error_literal(
 		error,
diff --git a/perl5/gplugin-perl5-loader.h b/perl5/gplugin-perl5-loader.h
--- a/perl5/gplugin-perl5-loader.h
+++ b/perl5/gplugin-perl5-loader.h
@@ -31,7 +31,7 @@
 	LOADER,
 	GPluginLoader)
 
-void gplugin_perl_loader_register(GPluginNativePlugin *plugin);
+void gplugin_perl_loader_register(GTypeModule *module);
 
 G_END_DECLS
 
diff --git a/perl5/gplugin-perl5-loader.c b/perl5/gplugin-perl5-loader.c
--- a/perl5/gplugin-perl5-loader.c
+++ b/perl5/gplugin-perl5-loader.c
@@ -326,7 +326,7 @@
  * API
  *****************************************************************************/
 void
-gplugin_perl_loader_register(GPluginNativePlugin *plugin)
+gplugin_perl_loader_register(GTypeModule *module)
 {
-	gplugin_perl_loader_register_type(G_TYPE_MODULE(plugin));
+	gplugin_perl_loader_register_type(module);
 }
diff --git a/perl5/gplugin-perl5-plugin.h b/perl5/gplugin-perl5-plugin.h
--- a/perl5/gplugin-perl5-plugin.h
+++ b/perl5/gplugin-perl5-plugin.h
@@ -48,7 +48,7 @@
 	PLUGIN,
 	GObject)
 
-void gplugin_perl_plugin_register(GPluginNativePlugin *native);
+void gplugin_perl_plugin_register(GTypeModule *module);
 
 PerlInterpreter *gplugin_perl_plugin_get_interpreter(GPluginPerlPlugin *plugin);
 
diff --git a/perl5/gplugin-perl5-plugin.c b/perl5/gplugin-perl5-plugin.c
--- a/perl5/gplugin-perl5-plugin.c
+++ b/perl5/gplugin-perl5-plugin.c
@@ -203,9 +203,9 @@
  * API
  *****************************************************************************/
 void
-gplugin_perl_plugin_register(GPluginNativePlugin *native)
+gplugin_perl_plugin_register(GTypeModule *module)
 {
-	gplugin_perl_plugin_register_type(G_TYPE_MODULE(native));
+	gplugin_perl_plugin_register_type(module);
 }
 
 PerlInterpreter *
diff --git a/python3/gplugin-python3-core.c b/python3/gplugin-python3-core.c
--- a/python3/gplugin-python3-core.c
+++ b/python3/gplugin-python3-core.c
@@ -23,8 +23,7 @@
 #include "gplugin-python3-loader.h"
 #include "gplugin-python3-plugin.h"
 
-G_MODULE_EXPORT GPluginPluginInfo *
-gplugin_query(G_GNUC_UNUSED GError **error)
+GPLUGIN_QUERY(python3_loader)
 {
 	/* clang-format-11 formats this correctly, so this can be removed then. */
 	/* clang-format off */
@@ -53,17 +52,15 @@
 	/* clang-format on */
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_load(GPluginNativePlugin *plugin, G_GNUC_UNUSED GError **error)
+GPLUGIN_LOAD(python3_loader)
 {
-	gplugin_python3_plugin_register(plugin);
-	gplugin_python3_loader_register(plugin);
+	gplugin_python3_plugin_register(G_TYPE_MODULE(plugin));
+	gplugin_python3_loader_register(G_TYPE_MODULE(plugin));
 
 	return gplugin_manager_register_loader(GPLUGIN_PYTHON3_TYPE_LOADER, error);
 }
 
-G_MODULE_EXPORT gboolean
-gplugin_unload(G_GNUC_UNUSED GPluginNativePlugin *plugin, GError **error)
+GPLUGIN_UNLOAD(python3_loader)
 {
 	g_set_error_literal(
 		error,
diff --git a/python3/gplugin-python3-loader.h b/python3/gplugin-python3-loader.h
--- a/python3/gplugin-python3-loader.h
+++ b/python3/gplugin-python3-loader.h
@@ -31,7 +31,7 @@
 	LOADER,
 	GPluginLoader)
 
-void gplugin_python3_loader_register(GPluginNativePlugin *native);
+void gplugin_python3_loader_register(GTypeModule *module);
 
 G_END_DECLS
 
diff --git a/python3/gplugin-python3-loader.c b/python3/gplugin-python3-loader.c
--- a/python3/gplugin-python3-loader.c
+++ b/python3/gplugin-python3-loader.c
@@ -393,9 +393,9 @@
  * API
  *****************************************************************************/
 void
-gplugin_python3_loader_register(GPluginNativePlugin *native)
+gplugin_python3_loader_register(GTypeModule *module)
 {
-	gplugin_python3_loader_register_type(G_TYPE_MODULE(native));
+	gplugin_python3_loader_register_type(module);
 
 	gplugin_python3_loader_init_python();
 }
diff --git a/python3/gplugin-python3-plugin.h b/python3/gplugin-python3-plugin.h
--- a/python3/gplugin-python3-plugin.h
+++ b/python3/gplugin-python3-plugin.h
@@ -31,7 +31,7 @@
 	PLUGIN,
 	GObject)
 
-void gplugin_python3_plugin_register(GPluginNativePlugin *native);
+void gplugin_python3_plugin_register(GTypeModule *module);
 
 G_END_DECLS
 
diff --git a/python3/gplugin-python3-plugin.c b/python3/gplugin-python3-plugin.c
--- a/python3/gplugin-python3-plugin.c
+++ b/python3/gplugin-python3-plugin.c
@@ -304,7 +304,7 @@
  * API
  *****************************************************************************/
 void
-gplugin_python3_plugin_register(GPluginNativePlugin *native)
+gplugin_python3_plugin_register(GTypeModule *module)
 {
-	gplugin_python3_plugin_register_type(G_TYPE_MODULE(native));
+	gplugin_python3_plugin_register_type(module);
 }
