diff --git a/libpurple/protocols/bonjour/resources/bonjour.gresource.xml b/protocols/bonjour/resources/bonjour.gresource.xml
copy from libpurple/protocols/bonjour/resources/bonjour.gresource.xml
copy to protocols/bonjour/resources/bonjour.gresource.xml
--- a/libpurple/protocols/bonjour/resources/bonjour.gresource.xml
+++ b/protocols/bonjour/resources/bonjour.gresource.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <gresources>
-  <gresource prefix="/im/pidgin/libpurple/bonjour">
+  <gresource prefix="/im/pidgin/libpurple/protocols/bonjour">
     <file>icons/16x16/apps/im-bonjour.png</file>
-    <file>icons/16x16/apps/scalable/im-bonjour.svg</file>
+    <file compressed="true" preprocess="xml-stripblanks">icons/16x16/apps/scalable/im-bonjour.svg</file>
     <file>icons/22x22/apps/im-bonjour.png</file>
-    <file>icons/22x22/apps/scalable/im-bonjour.svg</file>
+    <file compressed="true" preprocess="xml-stripblanks">icons/22x22/apps/scalable/im-bonjour.svg</file>
     <file>icons/48x48/apps/im-bonjour.png</file>
-    <file>icons/scalable/apps/im-bonjour.svg</file>
+    <file compressed="true" preprocess="xml-stripblanks">icons/scalable/apps/im-bonjour.svg</file>
   </gresource>
 </gresources>
diff --git a/libpurple/protocols/bonjour/resources/icons/16x16/apps/im-bonjour.png b/protocols/bonjour/resources/icons/16x16/apps/im-bonjour.png
copy from libpurple/protocols/bonjour/resources/icons/16x16/apps/im-bonjour.png
copy to protocols/bonjour/resources/icons/16x16/apps/im-bonjour.png
diff --git a/libpurple/protocols/bonjour/resources/icons/16x16/apps/scalable/im-bonjour.svg b/protocols/bonjour/resources/icons/16x16/apps/scalable/im-bonjour.svg
copy from libpurple/protocols/bonjour/resources/icons/16x16/apps/scalable/im-bonjour.svg
copy to protocols/bonjour/resources/icons/16x16/apps/scalable/im-bonjour.svg
diff --git a/libpurple/protocols/bonjour/resources/icons/22x22/apps/im-bonjour.png b/protocols/bonjour/resources/icons/22x22/apps/im-bonjour.png
copy from libpurple/protocols/bonjour/resources/icons/22x22/apps/im-bonjour.png
copy to protocols/bonjour/resources/icons/22x22/apps/im-bonjour.png
diff --git a/libpurple/protocols/bonjour/resources/icons/22x22/apps/scalable/im-bonjour.svg b/protocols/bonjour/resources/icons/22x22/apps/scalable/im-bonjour.svg
copy from libpurple/protocols/bonjour/resources/icons/22x22/apps/scalable/im-bonjour.svg
copy to protocols/bonjour/resources/icons/22x22/apps/scalable/im-bonjour.svg
diff --git a/libpurple/protocols/bonjour/resources/icons/48x48/apps/im-bonjour.png b/protocols/bonjour/resources/icons/48x48/apps/im-bonjour.png
copy from libpurple/protocols/bonjour/resources/icons/48x48/apps/im-bonjour.png
copy to protocols/bonjour/resources/icons/48x48/apps/im-bonjour.png
diff --git a/libpurple/protocols/bonjour/resources/icons/scalable/apps/im-bonjour.svg b/protocols/bonjour/resources/icons/scalable/apps/im-bonjour.svg
copy from libpurple/protocols/bonjour/resources/icons/scalable/apps/im-bonjour.svg
copy to protocols/bonjour/resources/icons/scalable/apps/im-bonjour.svg
# HG changeset patch
# Node ID 5602296d7dc1
# Parent  4f19be7835c2
diff --git a/po/POTFILES.in b/po/POTFILES.in
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -314,6 +314,8 @@ pidgin/resources/contactlistitem.ui
 pidgin/resources/infopane.ui
 pidgin/win32/gtkwin32dep.c
 pidgin/win32/winpidgin.c
+protocols/bonjour/purplebonjourcore.c
+protocols/bonjour/purplebonjourprotocol.c
 protocols/xmpp/purplexmppconnection.c
 protocols/xmpp/purplexmppcore.c
 protocols/xmpp/purplexmppprotocol.c
diff --git a/protocols/bonjour/meson.build b/protocols/bonjour/meson.build
new file mode 100644
--- /dev/null
+++ b/protocols/bonjour/meson.build
@@ -0,0 +1,33 @@
+BONJOUR_SOURCES = [
+	'purplebonjourconnection.c',
+	'purplebonjourcore.c',
+	'purplebonjourprotocol.c',
+]
+
+BONJOUR_HEADERS = [
+	'purplebonjourconnection.h',
+	'purplebonjourconstants.h',
+	'purplebonjourcore.h',
+	'purplebonjourprotocol.h',
+]
+
+if not DYNAMIC_BONJOUR
+	subdir_done()
+endif
+
+bonjour_resources = gnome.compile_resources('bonjourresource',
+	'resources/bonjour.gresource.xml',
+	source_dir : 'resources',
+	c_name : 'purple_bonjour')
+BONJOUR_SOURCES += bonjour_resources
+
+bonjour_prpl = library('bonjournouveau',
+	BONJOUR_SOURCES, BONJOUR_HEADERS,
+	c_args : ['-DPURPLE_BONJOUR_COMPILATION', '-DG_LOG_USE_STRUCTURED',
+	          '-DG_LOG_DOMAIN="Purple-Bonjour"'],
+	gnu_symbol_visibility : 'hidden',
+	dependencies : [libpurple_dep, glib, gio],
+	install : true,
+	install_dir : PURPLE_PLUGINDIR)
+
+devenv.append('PURPLE_PLUGIN_PATH', meson.current_build_dir())
diff --git a/protocols/bonjour/purplebonjourconstants.h b/protocols/bonjour/purplebonjourconstants.h
new file mode 100644
--- /dev/null
+++ b/protocols/bonjour/purplebonjourconstants.h
@@ -0,0 +1,25 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+#ifndef PURPLE_BONJOUR_CONSTANTS_H
+#define PURPLE_BONJOUR_CONSTANTS_H
+
+#define PURPLE_BONJOUR_DEFAULT_PORT (5298)
+
+#define PURPLE_BONJOUR_OPTION_PORT ("port")
+
+#endif /* PURPLE_BONJOUR_CONSTANTS_H */
diff --git a/protocols/meson.build b/protocols/meson.build
--- a/protocols/meson.build
+++ b/protocols/meson.build
@@ -1,1 +1,2 @@
+subdir('bonjour')
 subdir('xmpp')
diff --git a/protocols/xmpp/purplexmppconnection.h b/protocols/bonjour/purplebonjourconnection.h
copy from protocols/xmpp/purplexmppconnection.h
copy to protocols/bonjour/purplebonjourconnection.h
--- a/protocols/xmpp/purplexmppconnection.h
+++ b/protocols/bonjour/purplebonjourconnection.h
@@ -15,8 +15,8 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
-#ifndef PURPLE_XMPP_CONNECTION_H
-#define PURPLE_XMPP_CONNECTION_H
+#ifndef PURPLE_BONJOUR_CONNECTION_H
+#define PURPLE_BONJOUR_CONNECTION_H
 
 #include <glib.h>
 #include <glib-object.h>
@@ -28,21 +28,21 @@
 
 G_BEGIN_DECLS
 
-#define PURPLE_XMPP_TYPE_CONNECTION (purple_xmpp_connection_get_type())
+#define PURPLE_BONJOUR_TYPE_CONNECTION (purple_bonjour_connection_get_type())
 
-G_DECLARE_FINAL_TYPE(PurpleXmppConnection, purple_xmpp_connection, PURPLE_XMPP,
-                     CONNECTION, PurpleConnection)
+G_DECLARE_FINAL_TYPE(PurpleBonjourConnection, purple_bonjour_connection,
+                     PURPLE_BONJOUR, CONNECTION, PurpleConnection)
 
 /**
- * purple_xmpp_connection_register: (skip)
+ * purple_bonjour_connection_register: (skip)
  * @plugin: The GTypeModule
  *
  * Registers the dynamic type using @plugin.
  *
  * Since: 3.0.0
  */
-G_GNUC_INTERNAL void purple_xmpp_connection_register(GPluginNativePlugin *plugin);
+G_GNUC_INTERNAL void purple_bonjour_connection_register(GPluginNativePlugin *plugin);
 
 G_END_DECLS
 
-#endif /* PURPLE_XMPP_CONNECTION_H */
+#endif /* PURPLE_BONJOUR_CONNECTION_H */
diff --git a/protocols/xmpp/purplexmppconnection.c b/protocols/bonjour/purplebonjourconnection.c
copy from protocols/xmpp/purplexmppconnection.c
copy to protocols/bonjour/purplebonjourconnection.c
--- a/protocols/xmpp/purplexmppconnection.c
+++ b/protocols/bonjour/purplebonjourconnection.c
@@ -18,196 +18,91 @@
 
 #include <glib/gi18n-lib.h>
 
-#include <xeme.h>
-
-#include "purplexmppconnection.h"
+#include "purplebonjourconnection.h"
 
-#include "purplexmppconstants.h"
-#include "purplexmppcore.h"
+#include "purplebonjourconstants.h"
+#include "purplebonjourcore.h"
 
-struct _PurpleXmppConnection {
+struct _PurpleBonjourConnection {
 	PurpleConnection parent;
-
-	XemeConnection *xeme_connection;
-	XemeOutputStream *output;
 };
 
-G_DEFINE_DYNAMIC_TYPE_EXTENDED(PurpleXmppConnection, purple_xmpp_connection,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(PurpleBonjourConnection, purple_bonjour_connection,
                                PURPLE_TYPE_CONNECTION, G_TYPE_FLAG_FINAL, {})
 
 /******************************************************************************
- * Callbacks
- *****************************************************************************/
-static void
-purple_xmpp_connection_connect_cb(GObject *source, GAsyncResult *result,
-                                  gpointer data)
-{
-	PurpleXmppConnection *connection = data;
-	XemeOutputStream *output = NULL;
-	GError *error = NULL;
-
-	output = xeme_connection_connect_finish(XEME_CONNECTION(source), result,
-	                                        &error);
-	if(error != NULL) {
-		purple_connection_take_error(PURPLE_CONNECTION(connection), error);
-
-		return;
-	}
-
-	connection->output = output;
-
-	purple_connection_set_state(PURPLE_CONNECTION(connection),
-	                            PURPLE_CONNECTION_STATE_CONNECTED);
-}
-
-/******************************************************************************
  * PurpleConnection Implementation
  *****************************************************************************/
 static gboolean
-purple_xmpp_connection_connect(PurpleConnection *purple_connection,
-                               GError **error)
+purple_bonjour_connection_connect(PurpleConnection *purple_connection,
+                                  G_GNUC_UNUSED GError **error)
 {
-	PurpleXmppConnection *connection = NULL;
+	G_GNUC_UNUSED PurpleBonjourConnection *connection = NULL;
 	PurpleAccount *account = NULL;
-	XemeInputStream *input = NULL;
-	XemeTlsMode xeme_tls_mode = XEME_TLS_MODE_DIRECT_TLS;
-	GCancellable *cancellable = NULL;
-	GError *local_error = NULL;
-	GProxyResolver *resolver = NULL;
-	const char *resource = NULL;
-	const char *server = NULL;
-	const char *tls_mode = NULL;
-	const char *username = NULL;
-	guint16 port = PURPLE_XMPP_DEFAULT_PORT_TLS;
+	G_GNUC_UNUSED GCancellable *cancellable = NULL;
+	G_GNUC_UNUSED const char *username = NULL;
+	G_GNUC_UNUSED guint16 port = PURPLE_BONJOUR_DEFAULT_PORT;
 
-	g_return_val_if_fail(PURPLE_XMPP_IS_CONNECTION(purple_connection), FALSE);
+	g_return_val_if_fail(PURPLE_BONJOUR_IS_CONNECTION(purple_connection),
+	                     FALSE);
 
 	purple_connection_set_state(purple_connection,
 	                            PURPLE_CONNECTION_STATE_CONNECTING);
 
-	connection = PURPLE_XMPP_CONNECTION(purple_connection);
+	connection = PURPLE_BONJOUR_CONNECTION(purple_connection);
 	cancellable = purple_connection_get_cancellable(purple_connection);
 	account = purple_connection_get_account(purple_connection);
 
-	/* Figure out what proxy resolver to use. */
-	resolver = purple_proxy_get_proxy_resolver(account, &local_error);
-	if(!G_IS_PROXY_RESOLVER(resolver) || local_error != NULL) {
-		if(local_error == NULL) {
-			local_error = g_error_new(PURPLE_XMPP_DOMAIN, 0, "unknown error");
-		}
-
-		g_propagate_error(error, local_error);
-
-		g_clear_object(&resolver);
-
-		return FALSE;
-	}
-
 	/* Grab some more information that we need. */
 	username = purple_contact_info_get_username(PURPLE_CONTACT_INFO(account));
-	connection->xeme_connection = xeme_connection_new(username);
-
-	/* If we have a resource, tell the xeme connection about it. */
-	resource = purple_account_get_string(account, PURPLE_XMPP_OPTION_RESOURCE,
-	                                     NULL);
-	if(!purple_strempty(resource)) {
-		xeme_connection_set_resource(connection->xeme_connection, resource);
-	}
-
-	/* If we have a server, tell the xeme connection about it. */
-	server = purple_account_get_string(account, PURPLE_XMPP_OPTION_SERVER,
-	                                   NULL);
-	if(!purple_strempty(server)) {
-		xeme_connection_set_server(connection->xeme_connection, server);
-	}
-
-	/* Set whatever port we have on our xeme connection. */
-	port = purple_account_get_int(account, PURPLE_XMPP_OPTION_PORT,
-	                              PURPLE_XMPP_DEFAULT_PORT_TLS);
-	xeme_connection_set_port(connection->xeme_connection, port);
+	port = purple_account_get_int(account, PURPLE_BONJOUR_OPTION_PORT,
+	                              PURPLE_BONJOUR_DEFAULT_PORT);
 
-	/* Figure out what if any TLS we're doing. This is initialized to direct
-	 * tls above, so if we don't know which to use, that's what we'll end up
-	 * using. Doing so should avoid possible accidental leaks.
-	 */
-	tls_mode = purple_account_get_string(account, PURPLE_XMPP_OPTION_TLS_MODE,
-	                                     PURPLE_XMPP_TLS_DIRECT);
-	if(purple_strequal(tls_mode, PURPLE_XMPP_TLS_DIRECT)) {
-		xeme_tls_mode = XEME_TLS_MODE_DIRECT_TLS;
-	} else if(purple_strequal(tls_mode, PURPLE_XMPP_TLS_STARTTLS)) {
-		xeme_tls_mode = XEME_TLS_MODE_START_TLS;
-	} else if(purple_strequal(tls_mode, PURPLE_XMPP_TLS_NONE)) {
-		xeme_tls_mode = XEME_TLS_MODE_NONE;
-	}
-
-	xeme_connection_set_tls_mode(connection->xeme_connection, xeme_tls_mode);
-
-	input = xeme_input_stream_new();
-
-	/* Finally start connecting!! */
-	xeme_connection_connect_async(connection->xeme_connection, input, resolver,
-	                              cancellable, purple_xmpp_connection_connect_cb,
-	                              connection);
-
-	g_clear_object(&input);
+	/* Eventually, we will do something before this, but we can go straight to
+	 * connected for now. */
+	purple_connection_set_state(purple_connection,
+	                            PURPLE_CONNECTION_STATE_CONNECTED);
 
 	return TRUE;
 }
 
 static gboolean
-purple_xmpp_connection_disconnect(PurpleConnection *purple_connection,
-                                  GError **error)
+purple_bonjour_connection_disconnect(PurpleConnection *purple_connection,
+                                     GError **error)
 {
-	PurpleXmppConnection *connection = NULL;
 	PurpleConnectionClass *parent_class = NULL;
 
-	g_return_val_if_fail(PURPLE_XMPP_IS_CONNECTION(purple_connection), FALSE);
-
-	connection = PURPLE_XMPP_CONNECTION(purple_connection);
+	g_return_val_if_fail(PURPLE_BONJOUR_IS_CONNECTION(purple_connection),
+	                     FALSE);
 
 	/* Chain up to our parent's disconnect method. */
-	parent_class = PURPLE_CONNECTION_CLASS(purple_xmpp_connection_parent_class);
-	parent_class->disconnect(purple_connection, error);
-
-	return xeme_connection_close(connection->xeme_connection, error);
+	parent_class = PURPLE_CONNECTION_CLASS(purple_bonjour_connection_parent_class);
+	return parent_class->disconnect(purple_connection, error);
 }
 
 /******************************************************************************
  * GObject Implementation
  *****************************************************************************/
 static void
-purple_xmpp_connection_dispose(GObject *obj) {
-	PurpleXmppConnection *connection = PURPLE_XMPP_CONNECTION(obj);
-
-	g_clear_object(&connection->xeme_connection);
-	g_clear_object(&connection->output);
-
-	G_OBJECT_CLASS(purple_xmpp_connection_parent_class)->dispose(obj);
+purple_bonjour_connection_init(G_GNUC_UNUSED PurpleBonjourConnection *connection) {
 }
 
 static void
-purple_xmpp_connection_init(G_GNUC_UNUSED PurpleXmppConnection *connection) {
+purple_bonjour_connection_class_init(PurpleBonjourConnectionClass *klass) {
+	PurpleConnectionClass *connection_class = PURPLE_CONNECTION_CLASS(klass);
+
+	connection_class->connect = purple_bonjour_connection_connect;
+	connection_class->disconnect = purple_bonjour_connection_disconnect;
 }
 
 static void
-purple_xmpp_connection_class_init(PurpleXmppConnectionClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleConnectionClass *connection_class = PURPLE_CONNECTION_CLASS(klass);
-
-	obj_class->dispose = purple_xmpp_connection_dispose;
-
-	connection_class->connect = purple_xmpp_connection_connect;
-	connection_class->disconnect = purple_xmpp_connection_disconnect;
-}
-
-static void
-purple_xmpp_connection_class_finalize(G_GNUC_UNUSED PurpleXmppConnectionClass *klass) {
+purple_bonjour_connection_class_finalize(G_GNUC_UNUSED PurpleBonjourConnectionClass *klass) {
 }
 
 /******************************************************************************
  * Internal API
  *****************************************************************************/
 void
-purple_xmpp_connection_register(GPluginNativePlugin *plugin) {
-	purple_xmpp_connection_register_type(G_TYPE_MODULE(plugin));
+purple_bonjour_connection_register(GPluginNativePlugin *plugin) {
+	purple_bonjour_connection_register_type(G_TYPE_MODULE(plugin));
 }
diff --git a/protocols/xmpp/purplexmppcore.h b/protocols/bonjour/purplebonjourcore.h
copy from protocols/xmpp/purplexmppcore.h
copy to protocols/bonjour/purplebonjourcore.h
--- a/protocols/xmpp/purplexmppcore.h
+++ b/protocols/bonjour/purplebonjourcore.h
@@ -15,11 +15,11 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
-#ifndef PURPLE_XMPP_CORE_H
-#define PURPLE_XMPP_CORE_H
+#ifndef PURPLE_BONJOUR_CORE_H
+#define PURPLE_BONJOUR_CORE_H
 
 #include <glib.h>
 
-#define PURPLE_XMPP_DOMAIN (g_quark_from_static_string("xmpp-plugin"))
+#define PURPLE_BONJOUR_DOMAIN (g_quark_from_static_string("bonjour-plugin"))
 
-#endif /* PURPLE_XMPP_CORE_H */
+#endif /* PURPLE_BONJOUR_CORE_H */
diff --git a/protocols/xmpp/purplexmppcore.c b/protocols/bonjour/purplebonjourcore.c
copy from protocols/xmpp/purplexmppcore.c
copy to protocols/bonjour/purplebonjourcore.c
--- a/protocols/xmpp/purplexmppcore.c
+++ b/protocols/bonjour/purplebonjourcore.c
@@ -24,36 +24,36 @@
 
 #include <purple.h>
 
-#include "purplexmppcore.h"
+#include "purplebonjourcore.h"
 
-#include "purplexmppconnection.h"
-#include "purplexmppprotocol.h"
+#include "purplebonjourconnection.h"
+#include "purplebonjourprotocol.h"
 
 /******************************************************************************
  * Globals
  *****************************************************************************/
-static PurpleProtocol *xmpp_protocol = NULL;
+static PurpleProtocol *bonjour_protocol = NULL;
 
 /******************************************************************************
  * GPlugin Exports
  *****************************************************************************/
 static GPluginPluginInfo *
-purple_xmpp_query(G_GNUC_UNUSED GError **error) {
+purple_bonjour_query(G_GNUC_UNUSED GError **error) {
 	PurplePluginInfoFlags flags = PURPLE_PLUGIN_INFO_FLAGS_INTERNAL |
 	                              PURPLE_PLUGIN_INFO_FLAGS_AUTO_LOAD;
-	const gchar * const authors[] = {
+	const char * const authors[] = {
 		"Pidgin Developers <devel@pidgin.im>",
 		NULL
 	};
 
 	return purple_plugin_info_new(
-		"id", "prpl-xmpp",
-		"name", "XMPP Protocol",
+		"id", "prpl-bonjour-nouveau",
+		"name", "Bonjour Protocol",
 		"authors", authors,
 		"version", DISPLAY_VERSION,
 		"category", N_("Protocol"),
-		"summary", N_("XMPP Protocol Plugin"),
-		"description", N_("Modern XMPP Support"),
+		"summary", N_("Bonjour Protocol Plugin"),
+		"description", N_("Modern Bonjour Support"),
 		"website", PURPLE_WEBSITE,
 		"abi-version", PURPLE_ABI_VERSION,
 		"flags", flags,
@@ -61,25 +61,25 @@ purple_xmpp_query(G_GNUC_UNUSED GError *
 }
 
 static gboolean
-purple_xmpp_load(GPluginPlugin *plugin, GError **error) {
+purple_bonjour_load(GPluginPlugin *plugin, GError **error) {
 	PurpleProtocolManager *manager = NULL;
 
-	if(PURPLE_IS_PROTOCOL(xmpp_protocol)) {
-		g_set_error_literal(error, PURPLE_XMPP_DOMAIN, 0,
+	if(PURPLE_IS_PROTOCOL(bonjour_protocol)) {
+		g_set_error_literal(error, PURPLE_BONJOUR_DOMAIN, 0,
 		                    "plugin was not cleaned up properly");
 
 		return FALSE;
 	}
 
-	purple_xmpp_protocol_register(GPLUGIN_NATIVE_PLUGIN(plugin));
-	purple_xmpp_connection_register(GPLUGIN_NATIVE_PLUGIN(plugin));
+	purple_bonjour_protocol_register(GPLUGIN_NATIVE_PLUGIN(plugin));
+	purple_bonjour_connection_register(GPLUGIN_NATIVE_PLUGIN(plugin));
 
-	xmpp_protocol = purple_xmpp_protocol_new();
+	bonjour_protocol = purple_bonjour_protocol_new();
 
 	manager = purple_protocol_manager_get_default();
 	if(PURPLE_IS_PROTOCOL_MANAGER(manager)) {
-		if(!purple_protocol_manager_register(manager, xmpp_protocol, error)) {
-			g_clear_object(&xmpp_protocol);
+		if(!purple_protocol_manager_register(manager, bonjour_protocol, error)) {
+			g_clear_object(&bonjour_protocol);
 
 			return FALSE;
 		}
@@ -89,14 +89,14 @@ purple_xmpp_load(GPluginPlugin *plugin, 
 }
 
 static gboolean
-purple_xmpp_unload(G_GNUC_UNUSED GPluginPlugin *plugin,
-                   G_GNUC_UNUSED gboolean shutdown,
-                   GError **error)
+purple_bonjour_unload(G_GNUC_UNUSED GPluginPlugin *plugin,
+                      G_GNUC_UNUSED gboolean shutdown,
+                      GError **error)
 {
 	PurpleProtocolManager *manager = NULL;
 
-	if(!PURPLE_IS_PROTOCOL(xmpp_protocol)) {
-		g_set_error_literal(error, PURPLE_XMPP_DOMAIN, 0,
+	if(!PURPLE_IS_PROTOCOL(bonjour_protocol)) {
+		g_set_error_literal(error, PURPLE_BONJOUR_DOMAIN, 0,
 		                    "plugin was not setup properly");
 
 		return FALSE;
@@ -104,16 +104,16 @@ purple_xmpp_unload(G_GNUC_UNUSED GPlugin
 
 	manager = purple_protocol_manager_get_default();
 	if(PURPLE_IS_PROTOCOL_MANAGER(manager)) {
-		if(!purple_protocol_manager_unregister(manager, xmpp_protocol,
+		if(!purple_protocol_manager_unregister(manager, bonjour_protocol,
 		                                       error))
 		{
 			return FALSE;
 		}
 	}
 
-	g_clear_object(&xmpp_protocol);
+	g_clear_object(&bonjour_protocol);
 
 	return TRUE;
 }
 
-GPLUGIN_NATIVE_PLUGIN_DECLARE(purple_xmpp)
+GPLUGIN_NATIVE_PLUGIN_DECLARE(purple_bonjour)
diff --git a/protocols/xmpp/purplexmppprotocol.h b/protocols/bonjour/purplebonjourprotocol.h
copy from protocols/xmpp/purplexmppprotocol.h
copy to protocols/bonjour/purplebonjourprotocol.h
--- a/protocols/xmpp/purplexmppprotocol.h
+++ b/protocols/bonjour/purplebonjourprotocol.h
@@ -15,8 +15,8 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
-#ifndef PURPLE_XMPP_PROTOCOL_H
-#define PURPLE_XMPP_PROTOCOL_H
+#ifndef PURPLE_BONJOUR_PROTOCOL_H
+#define PURPLE_BONJOUR_PROTOCOL_H
 
 #include <glib.h>
 #include <glib-object.h>
@@ -28,23 +28,23 @@
 
 G_BEGIN_DECLS
 
-#define PURPLE_XMPP_TYPE_PROTOCOL (purple_xmpp_protocol_get_type())
+#define PURPLE_BONJOUR_TYPE_PROTOCOL (purple_bonjour_protocol_get_type())
 
-G_DECLARE_FINAL_TYPE(PurpleXmppProtocol, purple_xmpp_protocol, PURPLE_XMPP,
-                     PROTOCOL, PurpleProtocol)
+G_DECLARE_FINAL_TYPE(PurpleBonjourProtocol, purple_bonjour_protocol,
+                     PURPLE_BONJOUR, PROTOCOL, PurpleProtocol)
 
 /**
- * purple_xmpp_protocol_register: (skip)
+ * purple_bonjour_protocol_register: (skip)
  * @plugin: The GTypeModule
  *
  * Registers the dynamic type using @plugin.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
-G_GNUC_INTERNAL void purple_xmpp_protocol_register(GPluginNativePlugin *plugin);
+G_GNUC_INTERNAL void purple_bonjour_protocol_register(GPluginNativePlugin *plugin);
 
-G_GNUC_INTERNAL PurpleProtocol *purple_xmpp_protocol_new(void);
+G_GNUC_INTERNAL PurpleProtocol *purple_bonjour_protocol_new(void);
 
 G_END_DECLS
 
-#endif /* PURPLE_XMPP_PROTOCOL_H */
+#endif /* PURPLE_BONJOUR_PROTOCOL_H */
diff --git a/protocols/xmpp/purplexmppprotocol.c b/protocols/bonjour/purplebonjourprotocol.c
copy from protocols/xmpp/purplexmppprotocol.c
copy to protocols/bonjour/purplebonjourprotocol.c
--- a/protocols/xmpp/purplexmppprotocol.c
+++ b/protocols/bonjour/purplebonjourprotocol.c
@@ -18,12 +18,12 @@
 
 #include <glib/gi18n-lib.h>
 
-#include "purplexmppprotocol.h"
+#include "purplebonjourprotocol.h"
 
-#include "purplexmppconnection.h"
-#include "purplexmppconstants.h"
+#include "purplebonjourconnection.h"
+#include "purplebonjourconstants.h"
 
-struct _PurpleXmppProtocol {
+struct _PurpleBonjourProtocol {
 	PurpleProtocol parent;
 };
 
@@ -31,63 +31,13 @@ struct _PurpleXmppProtocol {
  * PurpleProtocol Implementation
  *****************************************************************************/
 static GList *
-purple_xmpp_protocol_get_user_splits(G_GNUC_UNUSED PurpleProtocol *protocol) {
-	PurpleAccountUserSplit *split = NULL;
-	GList *splits = NULL;
-
-	split = purple_account_user_split_new(_("Server"), NULL, '@');
-	splits = g_list_append(splits, split);
-
-	return splits;
-}
-
-static GList *
-purple_xmpp_protocol_get_account_options(G_GNUC_UNUSED PurpleProtocol *protocol)
+purple_bonjour_protocol_get_account_options(G_GNUC_UNUSED PurpleProtocol *protocol)
 {
 	PurpleAccountOption *option = NULL;
-	PurpleKeyValuePair *pair = NULL;
 	GList *options = NULL;
-	GList *items = NULL;
-
-	option = purple_account_option_string_new(_("Resource"),
-	                                          PURPLE_XMPP_OPTION_RESOURCE,
-	                                          NULL);
-	options = g_list_append(options, option);
-
-	option = purple_account_option_string_new(_("Server"),
-	                                          PURPLE_XMPP_OPTION_SERVER, NULL);
-	options = g_list_append(options, option);
-
-	option = purple_account_option_int_new(_("Port"), PURPLE_XMPP_OPTION_PORT,
-	                                       PURPLE_XMPP_DEFAULT_PORT_TLS);
-	options = g_list_append(options, option);
 
-	pair = purple_key_value_pair_new(_("Direct TLS"), PURPLE_XMPP_TLS_DIRECT);
-	items = g_list_append(items, pair);
-	pair = purple_key_value_pair_new(_("STARTTLS"), PURPLE_XMPP_TLS_STARTTLS);
-	items = g_list_append(items, pair);
-	pair = purple_key_value_pair_new(_("None"), PURPLE_XMPP_TLS_NONE);
-	items = g_list_append(items, pair);
-
-	option = purple_account_option_list_new(_("TLS Mode"),
-	                                        PURPLE_XMPP_OPTION_TLS_MODE,
-	                                        items);
-	options = g_list_append(options, option);
-
-	option = purple_account_option_string_new(_("SASL login name"),
-	                                          PURPLE_XMPP_OPTION_SASL_LOGIN_NAME,
-	                                          NULL);
-	options = g_list_append(options, option);
-
-	option = purple_account_option_string_new(_("SASL mechanisms"),
-	                                          PURPLE_XMPP_OPTION_SASL_MECHANISMS,
-	                                          NULL);
-	options = g_list_append(options, option);
-
-	option = purple_account_option_bool_new(_("Allow plaintext SASL auth over "
-	                                          "unencrypted connection"),
-	                                        PURPLE_XMPP_OPTION_PLAIN_SASL_IN_CLEAR,
-	                                        FALSE);
+	option = purple_account_option_int_new(_("Port"), PURPLE_BONJOUR_OPTION_PORT,
+	                                       PURPLE_BONJOUR_DEFAULT_PORT);
 	options = g_list_append(options, option);
 
 	return options;
@@ -95,8 +45,8 @@ purple_xmpp_protocol_get_account_options
 
 
 static GList *
-purple_xmpp_protocol_status_types(G_GNUC_UNUSED PurpleProtocol *protocol,
-                                  G_GNUC_UNUSED PurpleAccount *account)
+purple_bonjour_protocol_status_types(G_GNUC_UNUSED PurpleProtocol *protocol,
+                                     G_GNUC_UNUSED PurpleAccount *account)
 {
 	PurpleStatusType *type = NULL;
 	GList *types = NULL;
@@ -111,13 +61,13 @@ purple_xmpp_protocol_status_types(G_GNUC
 }
 
 static PurpleConnection *
-purple_xmpp_protocol_create_connection(PurpleProtocol *protocol,
-                                       PurpleAccount *account,
-                                       const char *password,
-                                       G_GNUC_UNUSED GError **error)
+purple_bonjour_protocol_create_connection(PurpleProtocol *protocol,
+                                          PurpleAccount *account,
+                                          const char *password,
+                                          G_GNUC_UNUSED GError **error)
 {
 	return g_object_new(
-		PURPLE_XMPP_TYPE_CONNECTION,
+		PURPLE_BONJOUR_TYPE_CONNECTION,
 		"protocol", protocol,
 		"account", account,
 		"password", password,
@@ -128,48 +78,48 @@ purple_xmpp_protocol_create_connection(P
  * GObject Implementation
  *****************************************************************************/
 G_DEFINE_DYNAMIC_TYPE_EXTENDED(
-	PurpleXmppProtocol,
-	purple_xmpp_protocol,
+	PurpleBonjourProtocol,
+	purple_bonjour_protocol,
 	PURPLE_TYPE_PROTOCOL,
 	G_TYPE_FLAG_FINAL,
 	{})
 
 static void
-purple_xmpp_protocol_init(G_GNUC_UNUSED PurpleXmppProtocol *protocol) {
-}
-
-static void
-purple_xmpp_protocol_class_finalize(G_GNUC_UNUSED PurpleXmppProtocolClass *klass) {
+purple_bonjour_protocol_init(G_GNUC_UNUSED PurpleBonjourProtocol *protocol) {
 }
 
 static void
-purple_xmpp_protocol_class_init(PurpleXmppProtocolClass *klass) {
+purple_bonjour_protocol_class_finalize(G_GNUC_UNUSED PurpleBonjourProtocolClass *klass)
+{
+}
+
+static void
+purple_bonjour_protocol_class_init(PurpleBonjourProtocolClass *klass) {
 	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
 
-	protocol_class->get_user_splits = purple_xmpp_protocol_get_user_splits;
-	protocol_class->get_account_options = purple_xmpp_protocol_get_account_options;
-	protocol_class->status_types = purple_xmpp_protocol_status_types;
+	protocol_class->get_account_options = purple_bonjour_protocol_get_account_options;
+	protocol_class->status_types = purple_bonjour_protocol_status_types;
 
-	protocol_class->create_connection = purple_xmpp_protocol_create_connection;
+	protocol_class->create_connection = purple_bonjour_protocol_create_connection;
 }
 
 /******************************************************************************
  * Internal API
  *****************************************************************************/
 void
-purple_xmpp_protocol_register(GPluginNativePlugin *plugin) {
-	purple_xmpp_protocol_register_type(G_TYPE_MODULE(plugin));
+purple_bonjour_protocol_register(GPluginNativePlugin *plugin) {
+	purple_bonjour_protocol_register_type(G_TYPE_MODULE(plugin));
 }
 
 PurpleProtocol *
-purple_xmpp_protocol_new(void) {
+purple_bonjour_protocol_new(void) {
 	return g_object_new(
-		PURPLE_XMPP_TYPE_PROTOCOL,
-		"id", "prpl-xmpp",
-		"name", "XMPP",
-		"description", _("Modern Extensible Messaging and Presence Protocol."),
-		"icon-name", "im-xmpp",
-		"icon-resource-path", "/im/pidgin/libpurple/protocols/xmpp/icons",
-		"options", OPT_PROTO_PASSWORD_OPTIONAL,
+		PURPLE_BONJOUR_TYPE_PROTOCOL,
+		"id", "prpl-bonjour-nouveau",
+		"name", "Bonjour",
+		"description", _("Bonjour is a serverless protocol for local networks."),
+		"icon-name", "im-bonjour",
+		"icon-resource-path", "/im/pidgin/libpurple/protocols/bonjour/icons",
+		"options", OPT_PROTO_NO_PASSWORD,
 		NULL);
 }
