diff --git a/finch/gntprefs.h b/finch/gntprefs.h
--- a/finch/gntprefs.h
+++ b/finch/gntprefs.h
@@ -53,13 +53,6 @@
 void finch_prefs_show_all(void);
 
 /**
- * finch_prefs_show_keyring:
- *
- * Show the preferences dialog for the selected keyring.
- */
-void finch_prefs_show_keyring(void);
-
-/**
  * finch_prefs_update_old:
  *
  * You don't need to know about this.
diff --git a/finch/gntprefs.c b/finch/gntprefs.c
--- a/finch/gntprefs.c
+++ b/finch/gntprefs.c
@@ -36,7 +36,6 @@
 	GList *freestrings;  /* strings to be freed when the pref-window is closed */
 	gboolean showing;
 	GntWidget *window;
-	GntWidget *keyring_window;
 } pref_request;
 
 void finch_prefs_init()
@@ -193,12 +192,6 @@
 	{PURPLE_PREF_NONE, NULL, NULL, NULL},
 };
 
-static Prefs keyring[] =
-{
-	{PURPLE_PREF_STRING, "/purple/keyring/active", N_("Active keyring"), purple_keyring_get_options},
-	{PURPLE_PREF_NONE, NULL, NULL, NULL}
-};
-
 static Prefs idle[] =
 {
 	{PURPLE_PREF_STRING, "/purple/away/idle_reporting", N_("Report Idle time"), get_idle_options},
@@ -249,15 +242,10 @@
 		return;
 	}
 
-	if (pref_request.keyring_window != NULL)
-		purple_request_close(PURPLE_REQUEST_FIELDS,
-			pref_request.keyring_window);
-
 	fields = purple_request_fields_new();
 
 	add_pref_group(fields, _("Buddy List"), blist);
 	add_pref_group(fields, _("Conversations"), convs);
-	add_pref_group(fields, _("Keyring"), keyring);
 	add_pref_group(fields, _("Logging"), logging);
 	add_pref_group(fields, _("Idle"), idle);
 
@@ -266,45 +254,3 @@
 			_("Save"), G_CALLBACK(save_cb), _("Cancel"), free_strings,
 			NULL, NULL);
 }
-
-static void
-finch_prefs_keyring_save(void *data, PurpleRequestFields *fields)
-{
-	PurpleCredentialManager *manager = purple_credential_manager_get_default();
-
-	pref_request.keyring_window = NULL;
-
-	purple_credential_manager_write_settings(manager, fields, NULL);
-}
-
-static void
-finch_prefs_keyring_cancel(void)
-{
-	pref_request.keyring_window = NULL;
-}
-
-void finch_prefs_show_keyring(void)
-{
-	PurpleRequestFields *fields;
-	PurpleCredentialManager *manager = NULL;
-
-	if (pref_request.keyring_window != NULL) {
-		gnt_window_present(pref_request.keyring_window);
-		return;
-	}
-
-	manager = purple_credential_manager_get_default();
-	fields = purple_credential_manager_read_settings(manager, NULL);
-	if (fields == NULL) {
-		purple_notify_info(NULL, _("Keyring settings"),
-			_("Selected keyring doesn't allow any configuration"),
-			NULL, NULL);
-		return;
-	}
-
-	pref_request.keyring_window = purple_request_fields(NULL,
-		_("Keyring settings"), NULL, NULL, fields,
-		_("Save"), G_CALLBACK(finch_prefs_keyring_save),
-		_("Cancel"), G_CALLBACK(finch_prefs_keyring_cancel),
-		NULL, NULL);
-}
diff --git a/finch/gntui.c b/finch/gntui.c
--- a/finch/gntui.c
+++ b/finch/gntui.c
@@ -100,7 +100,6 @@
 	gnt_register_action(_("Plugins"), finch_plugins_show_all);
 	gnt_register_action(_("Room List"), finch_roomlist_show_all);
 	gnt_register_action(_("Preferences"), finch_prefs_show_all);
-	gnt_register_action(_("Keyring settings"), finch_prefs_show_keyring);
 	gnt_register_action(_("Statuses"), finch_savedstatus_show_all);
 
 #ifdef STANDALONE
diff --git a/libpurple/account.h b/libpurple/account.h
--- a/libpurple/account.h
+++ b/libpurple/account.h
@@ -59,7 +59,6 @@
 #include "proxy.h"
 #include "protocol.h"
 #include "status.h"
-#include "keyring.h"
 #include "xmlnode.h"
 
 /**
diff --git a/libpurple/account.c b/libpurple/account.c
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -841,35 +841,6 @@
 	child = purple_xmlnode_new_child(node, "name");
 	purple_xmlnode_insert_data(child, purple_account_get_username(account), -1);
 
-	if (purple_account_get_remember_password(account))
-	{
-		const char *keyring_id = NULL;
-		const char *mode = NULL;
-		char *data = NULL;
-		GError *error = NULL;
-		GDestroyNotify destroy = NULL;
-		gboolean exported = purple_keyring_export_password(account,
-			&keyring_id, &mode, &data, &error, &destroy);
-
-		if (error != NULL) {
-			purple_debug_error("account",
-				"Failed to export password for account %s: %s.\n",
-				purple_account_get_username(account),
-				error->message);
-		} else if (exported) {
-			child = purple_xmlnode_new_child(node, "password");
-			if (keyring_id != NULL)
-				purple_xmlnode_set_attrib(child, "keyring_id", keyring_id);
-			if (mode != NULL)
-				purple_xmlnode_set_attrib(child, "mode", mode);
-			if (data != NULL)
-				purple_xmlnode_insert_data(child, data, -1);
-
-			if (destroy != NULL)
-				destroy(data);
-		}
-	}
-
 	if ((tmp = purple_account_get_private_alias(account)) != NULL)
 	{
 		child = purple_xmlnode_new_child(node, "alias");
diff --git a/libpurple/accounts.c b/libpurple/accounts.c
--- a/libpurple/accounts.c
+++ b/libpurple/accounts.c
@@ -500,25 +500,6 @@
 		parse_current_error(child, ret);
 	}
 
-	/* Read the password */
-	child = purple_xmlnode_get_child(node, "password");
-	if (child != NULL)
-	{
-		const char *keyring_id = purple_xmlnode_get_attrib(child, "keyring_id");
-		const char *mode = purple_xmlnode_get_attrib(child, "mode");
-		gboolean result;
-
-		data = purple_xmlnode_get_data(child);
-		result = purple_keyring_import_password(ret, keyring_id, mode, data, NULL);
-
-		if (result == TRUE || purple_keyring_get_inuse() == NULL) {
-			purple_account_set_remember_password(ret, TRUE);
-		} else {
-			purple_debug_error("accounts", "Failed to import password.\n");
-		} 
-		purple_str_wipe(data);
-	}
-
 	return ret;
 }
 
@@ -874,14 +855,6 @@
 	                   account, type, description);
 }
 
-static void
-password_migration_cb(PurpleAccount *account)
-{
-	/* account may be NULL (means: all) */
-
-	purple_accounts_schedule_save();
-}
-
 void
 purple_accounts_init(void)
 {
@@ -980,8 +953,6 @@
 	                      PURPLE_CALLBACK(signed_off_cb), NULL);
 	purple_signal_connect(conn_handle, "connection-error", handle,
 	                      PURPLE_CALLBACK(connection_error_cb), NULL);
-	purple_signal_connect(purple_keyring_get_handle(), "password-migration", handle,
-	                      PURPLE_CALLBACK(password_migration_cb), NULL);
 
 	load_accounts();
 
diff --git a/libpurple/core.c b/libpurple/core.c
--- a/libpurple/core.c
+++ b/libpurple/core.c
@@ -29,7 +29,6 @@
 #include "xfer.h"
 #include "idle.h"
 #include "image-store.h"
-#include "keyring.h"
 #include "network.h"
 #include "notify.h"
 #include "plugins.h"
@@ -157,7 +156,6 @@
 	 */
 	purple_plugins_init();
 
-	purple_keyring_init(); /* before accounts */
 	purple_theme_manager_init();
 
 	/* The buddy icon code uses the image store, so init it early. */
@@ -236,7 +234,6 @@
 	purple_savedstatuses_uninit();
 	purple_statuses_uninit();
 	purple_accounts_uninit();
-	purple_keyring_uninit(); /* after accounts */
 	purple_theme_manager_uninit();
 	purple_xfers_uninit();
 	purple_proxy_uninit();
diff --git a/libpurple/keyring.h b/libpurple/keyring.h
deleted file mode 100644
--- a/libpurple/keyring.h
+++ /dev/null
@@ -1,604 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- */
-
-#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
-# error "only <purple.h> may be included directly"
-#endif
-
-#ifndef PURPLE_KEYRING_H
-#define PURPLE_KEYRING_H
-/**
- * SECTION:keyring
- * @section_id: libpurple-keyring
- * @short_description: <filename>keyring.h</filename>
- * @title: Keyring API
- */
-
-#include "account.h"
-#include "request.h"
-
-#define PURPLE_TYPE_KEYRING  (purple_keyring_get_type())
-
-/**
- * PURPLE_DEFAULT_KEYRING:
- *
- * Default keyring ID.
- */
-#define PURPLE_DEFAULT_KEYRING "keyring-internal"
-
-/**
- * PURPLE_KEYRING_ERROR:
- *
- * Keyring subsystem error domain.
- */
-#define PURPLE_KEYRING_ERROR purple_keyring_error_domain()
-
-/**************************************************************************/
-/* Data structures and types                                              */
-/**************************************************************************/
-
-typedef struct _PurpleKeyring PurpleKeyring;
-
-/**************************************************************************/
-/* Callbacks for keyrings access functions                                */
-/**************************************************************************/
-
-/**
- * PurpleKeyringReadCallback:
- * @account:  The account.
- * @password: The password.
- * @error:    Error that may have occurred.
- * @data:     Data passed to the callback.
- *
- * Callback for once a password is read.
- *
- * If there was a problem, the password will be NULL, and the error set.
- */
-typedef void (*PurpleKeyringReadCallback)(PurpleAccount *account,
-	const gchar *password, GError *error, gpointer data);
-
-/**
- * PurpleKeyringSaveCallback:
- * @account: The account.
- * @error:   Error that may have occurred.
- * @data:    Data passed to the callback.
- *
- * Callback for once a password has been stored.
- *
- * If there was a problem, the error will be set.
- */
-typedef void (*PurpleKeyringSaveCallback)(PurpleAccount *account, GError *error,
-	gpointer data);
-
-/**
- * PurpleKeyringChangeMasterCallback:
- * @error:  Error that has occurred.
- * @data:   Data passed to the callback.
- *
- * Callback for once the master password for a keyring has been changed.
- */
-typedef void (*PurpleKeyringChangeMasterCallback)(GError *error, gpointer data);
-
-/**
- * PurpleKeyringSetInUseCallback:
- * @error:   An error that might have occurred.
- * @data:    A pointer to user supplied data.
- *
- * Callback for when we change the keyring.
- */
-typedef void (*PurpleKeyringSetInUseCallback)(GError *error, gpointer data);
-
-/**************************************************************************/
-/* Keyrings access functions                                              */
-/**************************************************************************/
-
-/**
- * PurpleKeyringRead:
- * @account: The account.
- * @cb:      A callback for once the password is found.
- * @data:    Data to be passed to the callback.
- *
- * Read the password for an account.
- */
-typedef void (*PurpleKeyringRead)(PurpleAccount *account,
-	PurpleKeyringReadCallback cb, gpointer data);
-
-/**
- * PurpleKeyringSave:
- * @account:  The account.
- * @password: The password to be stored. If the password is NULL, this
- *                 means that the keyring should forget about that password.
- * @cb:       A callback for once the password is saved.
- * @data:     Data to be passed to the callback.
- *
- * Store a password in the keyring.
- */
-typedef void (*PurpleKeyringSave)(PurpleAccount *account, const gchar *password,
-	PurpleKeyringSaveCallback cb, gpointer data);
-
-/**
- * PurpleKeyringCancelRequests:
- *
- * Cancel all running requests.
- *
- * After calling that, all queued requests should run their callbacks (most
- * probably, with failure result).
- */
-typedef void (*PurpleKeyringCancelRequests)(void);
-
-/**
- * PurpleKeyringClose:
- *
- * Close the keyring.
- *
- * This will be called so the keyring can do any cleanup it needs.
- */
-typedef void (*PurpleKeyringClose)(void);
-
-/**
- * PurpleKeyringImportPassword:
- * @account: The account.
- * @mode:    A keyring specific option that was stored. Can be NULL.
- * @data:    Data that was stored. Can be NULL.
- * @error:   Error that may have occurred.
- *
- * Import serialized (and maybe encrypted) password.
- *
- * This is not async because it is not meant to prompt for a master password and
- * decrypt passwords.
- *
- * Returns: TRUE on success, FALSE on failure.
- */
-typedef gboolean (*PurpleKeyringImportPassword)(PurpleAccount *account,
-	const gchar *mode, const gchar *data, GError **error);
-
-/**
- * PurpleKeyringExportPassword:
- * @account: The account.
- * @mode:    An option field that can be used by the plugin. This is
- *                expected to be a static string.
- * @data:    The data to be stored in the XML node. This string will be
- *                freed using destroy() once not needed anymore.
- * @error:   Will be set if a problem occured.
- * @destroy: A function to be called, if non NULL, to free data.
- *
- * Export serialized (and maybe encrypted) password.
- *
- * Returns: TRUE on success, FALSE on failure.
- */
-typedef gboolean (*PurpleKeyringExportPassword)(PurpleAccount *account,
-	const gchar **mode, gchar **data, GError **error,
-	GDestroyNotify *destroy);
-
-/**
- * PurpleKeyringReadSettings:
- *
- * Read keyring settings.
- *
- * Returns: New copy of current settings (must be free'd with
- *         purple_request_fields_destroy).
- */
-typedef PurpleRequestFields * (*PurpleKeyringReadSettings)(void);
-
-/**
- * PurpleKeyringApplySettings:
- * @notify_handle: A handle that can be passed to purple_notify_message.
- * @fields:        Modified settings (originally taken from
- *                      PurpleKeyringReadSettings).
- *
- * Applies modified keyring settings.
- *
- * Returns: TRUE, if succeeded, FALSE otherwise.
- */
-typedef gboolean (*PurpleKeyringApplySettings)(void *notify_handle,
-	PurpleRequestFields *fields);
-
-G_BEGIN_DECLS
-
-/**************************************************************************/
-/* Setting used keyrings                                                  */
-/**************************************************************************/
-
-/**
- * purple_keyring_find_keyring_by_id:
- * @id: The id for the keyring.
- *
- * Find a keyring by an id.
- *
- * Returns: The keyring, or NULL if not found.
- */
-PurpleKeyring *
-purple_keyring_find_keyring_by_id(const gchar *id);
-
-/**
- * purple_keyring_get_inuse:
- *
- * Get the keyring being used.
- */
-PurpleKeyring *
-purple_keyring_get_inuse(void);
-
-/**
- * purple_keyring_set_inuse:
- * @newkeyring:       The new keyring to use.
- * @force:            %FALSE if the change can be cancelled. If this is %TRUE
- *                    and an error occurs, data might be lost.
- * @cb: (scope call): A callback for once the change is complete.
- * @data:             Data to be passed to the callback.
- *
- * Set the keyring to use. This function will move all passwords from
- * the old keyring to the new one.
- *
- * If it fails, it will cancel all changes, close the new keyring, and notify
- * the callback. If it succeeds, it will remove all passwords from the old safe
- * and close that safe.
- */
-void
-purple_keyring_set_inuse(PurpleKeyring *newkeyring, gboolean force,
-	PurpleKeyringSetInUseCallback cb, gpointer data);
-
-/**
- * purple_keyring_register:
- * @keyring: The keyring to register.
- *
- * Register a keyring plugin.
- */
-void
-purple_keyring_register(PurpleKeyring *keyring);
-
-/**
- * purple_keyring_unregister:
- * @keyring: The keyring to unregister.
- *
- * Unregister a keyring plugin.
- *
- * In case the keyring is in use, passwords will be moved to a fallback safe,
- * and the keyring to unregister will be properly closed.
- */
-void
-purple_keyring_unregister(PurpleKeyring *keyring);
-
-/**
- * purple_keyring_get_options:
- *
- * Returns a GList containing the IDs and names of the registered
- * keyrings.
- *
- * Returns: (element-type utf8) (transfer container): The list of IDs and names.
- */
-GList *
-purple_keyring_get_options(void);
-
-/**************************************************************************/
-/* Keyring plugin wrappers                                                */
-/**************************************************************************/
-
-/**
- * purple_keyring_import_password:
- * @account:    The account.
- * @keyring_id: The plugin ID that was stored in the xml file. Can be NULL.
- * @mode:       A keyring specific option that was stored. Can be NULL.
- * @data:       Data that was stored, can be NULL.
- * @error:      Error that may have occurred.
- *
- * Import serialized (and maybe encrypted) password into current keyring.
- *
- * It's used by account.c while reading a password from xml.
- *
- * Returns: TRUE if the input was accepted, FALSE otherwise.
- */
-gboolean
-purple_keyring_import_password(PurpleAccount *account, const gchar *keyring_id,
-	const gchar *mode, const gchar *data, GError **error);
-
-/**
- * purple_keyring_export_password:
- * @account:    The account for which we want the info.
- * @keyring_id: The plugin id to be stored in the XML node. This will be
- *                   NULL or a string that can be considered static.
- * @mode:       An option field that can be used by the plugin. This will
- *                   be NULL or a string that can be considered static.
- * @data:       The data to be stored in the XML node. This string must be
- *                   freed using destroy() once not needed anymore if it is not
- *                   NULL.
- * @error:      Will be set if a problem occured.
- * @destroy:    A function to be called, if non NULL, to free data.
- *
- * Export serialized (and maybe encrypted) password out of current keyring.
- *
- * It's used by account.c while syncing accounts to xml.
- *
- * Returns: TRUE if the info was exported successfully, FALSE otherwise.
- */
-gboolean
-purple_keyring_export_password(PurpleAccount *account, const gchar **keyring_id,
-	const gchar **mode, gchar **data, GError **error,
-	GDestroyNotify *destroy);
-
-/**************************************************************************/
-/* PurpleKeyring accessors                                                */
-/**************************************************************************/
-
-/**
- * purple_keyring_get_type:
- *
- * Returns: The #GType for the #PurpleKeyring boxed structure.
- */
-GType purple_keyring_get_type(void);
-
-/**
- * purple_keyring_new:
- *
- * Creates a new keyring wrapper.
- */
-PurpleKeyring *
-purple_keyring_new(void);
-
-/**
- * purple_keyring_free:
- * @keyring: Keyring wrapper struct.
- *
- * Frees all data allocated with purple_keyring_new.
- */
-void
-purple_keyring_free(PurpleKeyring *keyring);
-
-/**
- * purple_keyring_get_name:
- * @keyring: The keyring.
- *
- * Gets friendly user name.
- *
- * Returns: Friendly user name.
- */
-const gchar *
-purple_keyring_get_name(const PurpleKeyring *keyring);
-
-/**
- * purple_keyring_get_id:
- * @keyring: The keyring.
- *
- * Gets keyring ID.
- *
- * Returns: Keyring ID.
- */
-const gchar *
-purple_keyring_get_id(const PurpleKeyring *keyring);
-
-PurpleKeyringRead
-purple_keyring_get_read_password(const PurpleKeyring *keyring);
-
-PurpleKeyringSave
-purple_keyring_get_save_password(const PurpleKeyring *keyring);
-
-PurpleKeyringCancelRequests
-purple_keyring_get_cancel_requests(const PurpleKeyring *keyring);
-
-PurpleKeyringClose
-purple_keyring_get_close_keyring(const PurpleKeyring *keyring);
-
-PurpleKeyringImportPassword
-purple_keyring_get_import_password(const PurpleKeyring *keyring);
-
-PurpleKeyringExportPassword
-purple_keyring_get_export_password(const PurpleKeyring *keyring);
-
-PurpleKeyringReadSettings
-purple_keyring_get_read_settings(const PurpleKeyring *keyring);
-
-PurpleKeyringApplySettings
-purple_keyring_get_apply_settings(const PurpleKeyring *keyring);
-
-/**
- * purple_keyring_set_name:
- * @keyring: The keyring.
- * @name:    Friendly user name.
- *
- * Sets friendly user name.
- *
- * This field is required.
- */
-void
-purple_keyring_set_name(PurpleKeyring *keyring, const gchar *name);
-
-/**
- * purple_keyring_set_id:
- * @keyring: The keyring.
- * @id:      Keyring ID.
- *
- * Sets keyring ID.
- *
- * This field is required.
- */
-void
-purple_keyring_set_id(PurpleKeyring *keyring, const gchar *id);
-
-/**
- * purple_keyring_set_read_password:
- * @keyring:               The keyring.
- * @read_cb: (scope call): Read password method.
- *
- * Sets read password method.
- *
- * This field is required.
- */
-void
-purple_keyring_set_read_password(PurpleKeyring *keyring,
-	PurpleKeyringRead read_cb);
-
-/**
- * purple_keyring_set_save_password:
- * @keyring:               The keyring.
- * @save_cb: (scope call): Save password method.
- *
- * Sets save password method.
- *
- * This field is required.
- */
-void
-purple_keyring_set_save_password(PurpleKeyring *keyring,
-	PurpleKeyringSave save_cb);
-
-/**
- * purple_keyring_set_cancel_requests:
- * @keyring:         The keyring.
- * @cancel_requests: (scope call): Cancel requests method.
- *
- * Sets cancel requests method.
- */
-void
-purple_keyring_set_cancel_requests(PurpleKeyring *keyring,
-	PurpleKeyringCancelRequests cancel_requests);
-
-/**
- * purple_keyring_set_close_keyring:
- * @keyring:                The keyring.
- * @close_cb: (scope call): Close keyring method.
- *
- * Sets close keyring method.
- */
-void
-purple_keyring_set_close_keyring(PurpleKeyring *keyring,
-	PurpleKeyringClose close_cb);
-
-/**
- * purple_keyring_set_import_password:
- * @keyring:         The keyring.
- * @import_password: (scope call): Import password method.
- *
- * Sets import password method.
- */
-void
-purple_keyring_set_import_password(PurpleKeyring *keyring,
-	PurpleKeyringImportPassword import_password);
-
-/**
- * purple_keyring_set_export_password:
- * @keyring:         The keyring.
- * @export_password: (scope call): Export password method.
- *
- * Sets export password method.
- */
-void
-purple_keyring_set_export_password(PurpleKeyring *keyring,
-	PurpleKeyringExportPassword export_password);
-
-/**
- * purple_keyring_set_read_settings:
- * @keyring:       The keyring.
- * @read_settings: (scope call): Read settings method.
- *
- * Sets read settings method.
- */
-void
-purple_keyring_set_read_settings(PurpleKeyring *keyring,
-	PurpleKeyringReadSettings read_settings);
-
-/**
- * purple_keyring_set_apply_settings:
- * @keyring:        The keyring.
- * @apply_settings: (scope call): Apply settings method.
- *
- * Sets apply settings method.
- */
-void
-purple_keyring_set_apply_settings(PurpleKeyring *keyring,
-	PurpleKeyringApplySettings apply_settings);
-
-/**************************************************************************/
-/* Error Codes                                                            */
-/**************************************************************************/
-
-/**
- * purple_keyring_error_domain:
- *
- * Gets keyring subsystem error domain.
- *
- * Returns: keyring subsystem error domain.
- */
-GQuark
-purple_keyring_error_domain(void);
-
-/**
- * PurpleKeyringError:
- * @PURPLE_KEYRING_ERROR_UNKNOWN:      Unknown error.
- * @PURPLE_KEYRING_ERROR_NOKEYRING:    No keyring configured.
- * @PURPLE_KEYRING_ERROR_INTERNAL:     Internal keyring system error.
- * @PURPLE_KEYRING_ERROR_BACKENDFAIL:  Failed to communicate with the backend
- *                                     or internal backend error.
- * @PURPLE_KEYRING_ERROR_NOPASSWORD:   No password stored for the specified
- *                                     account.
- * @PURPLE_KEYRING_ERROR_ACCESSDENIED: Access denied for the specified keyring
- *                                     or entry.
- * @PURPLE_KEYRING_ERROR_CANCELLED:    Operation was cancelled.
- *
- * Error codes for keyring subsystem.
- */
-enum PurpleKeyringError
-{
-	PURPLE_KEYRING_ERROR_UNKNOWN = 0,
-
-	PURPLE_KEYRING_ERROR_NOKEYRING = 10,
-	PURPLE_KEYRING_ERROR_INTERNAL,
-	PURPLE_KEYRING_ERROR_BACKENDFAIL,
-
-	PURPLE_KEYRING_ERROR_NOPASSWORD = 20,
-	PURPLE_KEYRING_ERROR_ACCESSDENIED,
-	PURPLE_KEYRING_ERROR_CANCELLED
-};
-
-/*}@*/
-
-/**************************************************************************/
-/* Keyring Subsystem                                                      */
-/**************************************************************************/
-
-/**
- * purple_keyring_init:
- *
- * Initializes the keyring subsystem.
- */
-void
-purple_keyring_init(void);
-
-/**
- * purple_keyring_uninit:
- *
- * Uninitializes the keyring subsystem.
- */
-void
-purple_keyring_uninit(void);
-
-/**
- * purple_keyring_get_handle:
- *
- * Returns the keyring subsystem handle.
- *
- * Returns: The keyring subsystem handle.
- */
-void *
-purple_keyring_get_handle(void);
-
-/*}@*/
-
-G_END_DECLS
-
-#endif /* PURPLE_KEYRING_H */
diff --git a/libpurple/keyring.c b/libpurple/keyring.c
deleted file mode 100644
--- a/libpurple/keyring.c
+++ /dev/null
@@ -1,1191 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- */
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-#include "account.h"
-#include "keyring.h"
-#include "signals.h"
-#include "core.h"
-#include "debug.h"
-#include "internal.h"
-#include "plugins.h"
-
-struct _PurpleKeyring
-{
-	gchar *name;
-	gchar *id;
-	PurpleKeyringRead read_password;
-	PurpleKeyringSave save_password;
-	PurpleKeyringCancelRequests cancel_requests;
-	PurpleKeyringClose close_keyring;
-	PurpleKeyringImportPassword import_password;
-	PurpleKeyringExportPassword export_password;
-	PurpleKeyringReadSettings read_settings;
-	PurpleKeyringApplySettings apply_settings;
-
-	gboolean is_closing;
-	gboolean is_cancelling;
-	gboolean close_after_cancel;
-};
-
-typedef struct
-{
-	GError *error;
-	PurpleKeyringSetInUseCallback cb;
-	gpointer cb_data;
-	PurpleKeyring *new_kr;
-	PurpleKeyring *old_kr;
-
-	/*
-	 * We are done when finished is positive and read_outstanding is zero.
-	 */
-	gboolean finished;
-	int read_outstanding;
-
-	gboolean abort;
-	gboolean force;
-	gboolean succeeded;
-} PurpleKeyringChangeTracker;
-
-typedef void (*PurpleKeyringDropCallback)(gpointer data);
-
-typedef struct
-{
-	PurpleKeyringDropCallback cb;
-	gpointer cb_data;
-
-	gboolean finished;
-	int drop_outstanding;
-} PurpleKeyringDropTracker;
-
-typedef struct
-{
-	PurpleKeyringSaveCallback cb;
-	gpointer cb_data;
-} PurpleKeyringSetPasswordData;
-
-typedef struct
-{
-	gchar *keyring_id;
-	gchar *mode;
-	gchar *data;
-} PurpleKeyringFailedImport;
-
-static void
-purple_keyring_change_tracker_free(PurpleKeyringChangeTracker *tracker)
-{
-	if (tracker->error)
-		g_error_free(tracker->error);
-	g_free(tracker);
-}
-
-static void
-purple_keyring_failed_import_free(PurpleKeyringFailedImport *import)
-{
-	g_return_if_fail(import != NULL);
-
-	g_free(import->keyring_id);
-	g_free(import->mode);
-	purple_str_wipe(import->data);
-	g_free(import);
-}
-
-static void
-purple_keyring_close(PurpleKeyring *keyring);
-
-static void
-purple_keyring_drop_passwords(PurpleKeyring *keyring,
-	PurpleKeyringDropCallback cb, gpointer data);
-
-/* A list of available keyrings */
-static GList *purple_keyring_keyrings = NULL;
-
-/* Keyring being used. */
-static PurpleKeyring *purple_keyring_inuse = NULL;
-
-/* Keyring id marked to use (may not be loadable). */
-static gchar *purple_keyring_to_use = NULL;
-
-static guint purple_keyring_pref_cbid = 0;
-static GList *purple_keyring_loaded_plugins = NULL;
-static PurpleKeyringChangeTracker *current_change_tracker = NULL;
-static gboolean purple_keyring_is_quitting = FALSE;
-static GHashTable *purple_keyring_failed_imports = NULL;
-
-static const gchar *
-purple_keyring_print_account(PurpleAccount *account)
-{
-	static gchar print_buff[100];
-
-	if (account == NULL) {
-		g_snprintf(print_buff, 100, "(null)");
-		return print_buff;
-	}
-
-	g_snprintf(print_buff, 100, "%s:%s",
-		purple_account_get_protocol_id(account),
-		purple_account_get_username(account));
-	return print_buff;
-}
-
-/**************************************************************************/
-/* Setting used keyrings                                                  */
-/**************************************************************************/
-
-PurpleKeyring *
-purple_keyring_find_keyring_by_id(const gchar *id)
-{
-	GList *it;
-
-	for (it = purple_keyring_keyrings; it != NULL; it = it->next) {
-		PurpleKeyring *keyring = it->data;
-		const gchar *curr_id = purple_keyring_get_id(keyring);
-
-		if (g_strcmp0(id, curr_id) == 0)
-			return keyring;
-	}
-
-	return NULL;
-}
-
-static void
-purple_keyring_pref_callback(const gchar *pref, PurplePrefType type,
-	gconstpointer id, gpointer data)
-{
-	PurpleKeyring *new_keyring;
-
-	g_return_if_fail(g_strcmp0(pref, "/purple/keyring/active") == 0);
-	g_return_if_fail(type == PURPLE_PREF_STRING);
-	g_return_if_fail(id != NULL);
-
-	new_keyring = purple_keyring_find_keyring_by_id(id);
-	g_return_if_fail(new_keyring != NULL);
-
-	purple_keyring_set_inuse(new_keyring, FALSE, NULL, NULL);
-}
-
-static void
-purple_keyring_pref_connect(void)
-{
-	g_return_if_fail(purple_keyring_pref_cbid == 0);
-
-	purple_keyring_pref_cbid = purple_prefs_connect_callback(NULL,
-		"/purple/keyring/active", purple_keyring_pref_callback, NULL);
-}
-
-static void
-purple_keyring_pref_disconnect(void)
-{
-	g_return_if_fail(purple_keyring_pref_cbid != 0);
-
-	purple_prefs_disconnect_callback(purple_keyring_pref_cbid);
-	purple_keyring_pref_cbid = 0;
-}
-
-PurpleKeyring *
-purple_keyring_get_inuse(void)
-{
-	return purple_keyring_inuse;
-}
-
-static void
-purple_keyring_set_inuse_drop_cb(gpointer _tracker)
-{
-	PurpleKeyringChangeTracker *tracker = _tracker;
-
-	g_return_if_fail(tracker != NULL);
-
-	if (tracker->succeeded) {
-		purple_keyring_close(tracker->old_kr);
-
-		purple_debug_info("keyring", "Successfully changed keyring.\n");
-
-		purple_keyring_inuse = tracker->new_kr;
-		current_change_tracker = NULL;
-
-		if (tracker->cb != NULL)
-			tracker->cb(NULL, tracker->cb_data);
-		purple_keyring_change_tracker_free(tracker);
-		return;
-	}
-
-	purple_debug_error("keyring", "Failed to change keyring, aborting.\n");
-
-	purple_keyring_close(tracker->new_kr);
-
-	purple_keyring_pref_disconnect();
-	purple_prefs_set_string("/purple/keyring/active",
-		purple_keyring_get_id(tracker->old_kr));
-	purple_keyring_pref_connect();
-
-	current_change_tracker = NULL;
-
-	if (tracker->error == NULL) {
-		tracker->error = g_error_new_literal(
-		        PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_UNKNOWN,
-		        _("An unknown error has occured."));
-	}
-
-	if (tracker->cb != NULL)
-		tracker->cb(tracker->error, tracker->cb_data);
-
-	purple_keyring_change_tracker_free(tracker);
-}
-
-static void
-purple_keyring_set_inuse_save_cb(PurpleAccount *account, GError *error,
-	gpointer _tracker)
-{
-	PurpleKeyringChangeTracker *tracker = _tracker;
-
-	g_return_if_fail(account != NULL);
-	g_return_if_fail(tracker != NULL);
-
-	tracker->read_outstanding--;
-
-	if (error == NULL) {
-		/* no error */
-	} else if (g_error_matches(error, PURPLE_KEYRING_ERROR,
-		PURPLE_KEYRING_ERROR_NOPASSWORD))
-	{
-		if (purple_debug_is_verbose()) {
-			purple_debug_misc("keyring", "No password found while "
-				"changing keyring for account %s: %s.\n",
-				purple_keyring_print_account(account),
-				error->message);
-		}
-	} else if (g_error_matches(error, PURPLE_KEYRING_ERROR,
-		PURPLE_KEYRING_ERROR_ACCESSDENIED))
-	{
-		purple_debug_info("keyring", "Access denied while changing "
-			"keyring for account %s: %s.\n",
-			purple_keyring_print_account(account), error->message);
-		tracker->abort = TRUE;
-		if (tracker->error != NULL)
-			g_error_free(tracker->error);
-		tracker->error = g_error_copy(error);
-	} else if (g_error_matches(error, PURPLE_KEYRING_ERROR,
-		PURPLE_KEYRING_ERROR_CANCELLED))
-	{
-		purple_debug_info("keyring", "Operation cancelled while "
-			"changing keyring for account %s: %s.\n",
-			purple_keyring_print_account(account), error->message);
-		tracker->abort = TRUE;
-		if (tracker->error == NULL)
-			tracker->error = g_error_copy(error);
-	} else if (g_error_matches(error, PURPLE_KEYRING_ERROR,
-		PURPLE_KEYRING_ERROR_BACKENDFAIL))
-	{
-		purple_debug_error("keyring", "Failed to communicate with "
-			"backend while changing keyring for account %s: %s. "
-			"Aborting changes.\n",
-			purple_keyring_print_account(account), error->message);
-		tracker->abort = TRUE;
-		if (tracker->error != NULL)
-			g_error_free(tracker->error);
-		tracker->error = g_error_copy(error);
-	} else {
-		purple_debug_error("keyring", "Unknown error while changing "
-			"keyring for account %s: %s. Aborting changes.\n",
-			purple_keyring_print_account(account), error->message);
-		tracker->abort = TRUE;
-		if (tracker->error == NULL)
-			tracker->error = g_error_copy(error);
-	}
-
-	purple_signal_emit(purple_keyring_get_handle(), "password-migration",
-		account);
-
-	if (!tracker->finished || tracker->read_outstanding > 0)
-		return;
-
-	/* This was the last one. */
-	if (tracker->abort && !tracker->force) {
-		tracker->succeeded = FALSE;
-		purple_keyring_drop_passwords(tracker->new_kr,
-			purple_keyring_set_inuse_drop_cb, tracker);
-	} else {
-		tracker->succeeded = TRUE;
-		purple_keyring_drop_passwords(tracker->old_kr,
-			purple_keyring_set_inuse_drop_cb, tracker);
-	}
-}
-
-static void
-purple_keyring_set_inuse_read_cb(PurpleAccount *account, const gchar *password,
-	GError *error, gpointer _tracker)
-{
-	PurpleKeyringChangeTracker *tracker = _tracker;
-	PurpleKeyringSave save_cb;
-
-	g_return_if_fail(account != NULL);
-	g_return_if_fail(tracker != NULL);
-
-	if (tracker->abort) {
-		purple_keyring_set_inuse_save_cb(account, NULL, tracker);
-		return;
-	}
-
-	if (error != NULL) {
-		if (tracker->force == TRUE || g_error_matches(error,
-			PURPLE_KEYRING_ERROR,
-			PURPLE_KEYRING_ERROR_NOPASSWORD))
-		{
-			/* Don't save password, and ignore it. */
-		} else {
-			tracker->abort = TRUE;
-		}
-		purple_keyring_set_inuse_save_cb(account, error, tracker);
-		return;
-	}
-
-	save_cb = purple_keyring_get_save_password(tracker->new_kr);
-	g_assert(save_cb != NULL);
-
-	save_cb(account, password, purple_keyring_set_inuse_save_cb, tracker);
-}
-
-void
-purple_keyring_set_inuse(PurpleKeyring *newkeyring, gboolean force,
-	PurpleKeyringSetInUseCallback cb, gpointer data)
-{
-	PurpleKeyring *oldkeyring;
-	PurpleKeyringChangeTracker *tracker;
-	GList *it;
-	PurpleKeyringRead read_cb;
-
-	if (current_change_tracker != NULL) {
-		GError *error;
-		purple_debug_error("keyring", "There is password migration "
-			"session already running.\n");
-		if (cb == NULL)
-			return;
-		error = g_error_new_literal(
-		        PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_INTERNAL,
-		        _("There is a password migration session already "
-		          "running."));
-		cb(error, data);
-		g_error_free(error);
-		return;
-	}
-
-	oldkeyring = purple_keyring_get_inuse();
-
-	if (oldkeyring == newkeyring) {
-		if (purple_debug_is_verbose()) {
-			purple_debug_misc("keyring",
-				"Old and new keyring are the same: %s.\n",
-				(newkeyring != NULL) ?
-					newkeyring->id : "(null)");
-		}
-		if (cb != NULL)
-			cb(NULL, data);
-		return;
-	}
-
-	purple_debug_info("keyring", "Attempting to set new keyring: %s.\n",
-		(newkeyring != NULL) ? newkeyring->id : "(null)");
-
-	if (oldkeyring == NULL) { /* No keyring was set before. */
-		if (purple_debug_is_verbose()) {
-			purple_debug_misc("keyring",
-			                  "Setting keyring for the first time: %s.\n",
-			                  (newkeyring != NULL) ? newkeyring->id : "(null)");
-		}
-
-		purple_keyring_inuse = newkeyring;
-		g_assert(current_change_tracker == NULL);
-		if (cb != NULL)
-			cb(NULL, data);
-		return;
-	}
-
-	/* Starting a migration. */
-
-	read_cb = purple_keyring_get_read_password(oldkeyring);
-	g_assert(read_cb != NULL);
-
-	purple_debug_misc("keyring", "Starting migration from: %s.\n",
-		oldkeyring->id);
-
-	tracker = g_new0(PurpleKeyringChangeTracker, 1);
-	current_change_tracker = tracker;
-
-	tracker->cb = cb;
-	tracker->cb_data = data;
-	tracker->new_kr = newkeyring;
-	tracker->old_kr = oldkeyring;
-	tracker->force = force;
-
-	for (it = purple_accounts_get_all(); it != NULL; it = it->next) {
-		if (tracker->abort) {
-			tracker->finished = TRUE;
-			break;
-		}
-		tracker->read_outstanding++;
-
-		if (it->next == NULL)
-			tracker->finished = TRUE;
-
-		read_cb(it->data, purple_keyring_set_inuse_read_cb, tracker);
-	}
-}
-
-void
-purple_keyring_register(PurpleKeyring *keyring)
-{
-	const gchar *keyring_id;
-
-	g_return_if_fail(keyring != NULL);
-
-	keyring_id = purple_keyring_get_id(keyring);
-
-	purple_debug_info("keyring", "Registering keyring: %s\n",
-		keyring_id ? keyring_id : "(null)");
-
-	if (purple_keyring_get_id(keyring) == NULL ||
-		purple_keyring_get_name(keyring) == NULL ||
-		purple_keyring_get_read_password(keyring) == NULL ||
-		purple_keyring_get_save_password(keyring) == NULL)
-	{
-		purple_debug_error("keyring", "Cannot register %s, some "
-			"required fields are missing.\n",
-			keyring_id ? keyring_id : "(null)");
-		return;
-	}
-
-	if (purple_keyring_find_keyring_by_id(keyring_id) != NULL) {
-		purple_debug_error("keyring",
-			"Keyring is already registered.\n");
-		return;
-	}
-
-	/* If this is the configured keyring, use it. */
-	if (purple_keyring_inuse == NULL &&
-		g_strcmp0(keyring_id, purple_keyring_to_use) == 0)
-	{
-		purple_debug_misc("keyring", "Keyring %s matches keyring to "
-			"use, using it.", keyring_id);
-		purple_keyring_set_inuse(keyring, TRUE, NULL, NULL);
-	}
-
-	purple_signal_emit(purple_keyring_get_handle(), "keyring-register",
-		keyring_id, keyring);
-	if (purple_debug_is_verbose()) {
-		purple_debug_info("keyring", "Registered keyring: %s.\n",
-			keyring_id);
-	}
-
-	purple_keyring_keyrings = g_list_prepend(purple_keyring_keyrings,
-		keyring);
-}
-
-void
-purple_keyring_unregister(PurpleKeyring *keyring)
-{
-	PurpleKeyring *inuse;
-	PurpleKeyring *fallback;
-	const gchar *keyring_id;
-
-	g_return_if_fail(keyring != NULL);
-
-	keyring_id = purple_keyring_get_id(keyring);
-
-	purple_debug_info("keyring", "Unregistering keyring: %s.\n",
-		keyring_id);
-
-	purple_signal_emit(purple_keyring_get_handle(), "keyring-unregister",
-		keyring_id, keyring);
-
-	inuse = purple_keyring_get_inuse();
-	fallback = purple_keyring_find_keyring_by_id(PURPLE_DEFAULT_KEYRING);
-
-	if (inuse == keyring) {
-		if (inuse != fallback) {
-			purple_keyring_set_inuse(fallback, TRUE, NULL, NULL);
-		} else {
-			fallback = NULL;
-			purple_keyring_set_inuse(NULL, TRUE, NULL, NULL);
-		}
-	}
-
-	purple_keyring_keyrings = g_list_remove(purple_keyring_keyrings,
-		keyring);
-}
-
-GList *
-purple_keyring_get_options(void)
-{
-	GList *options = NULL;
-	GList *it;
-	static gchar currentDisabledName[40];
-
-	if (purple_keyring_get_inuse() == NULL && purple_keyring_to_use != NULL
-		&& purple_keyring_to_use[0] != '\0')
-	{
-		g_snprintf(currentDisabledName, sizeof(currentDisabledName),
-			_("%s (disabled)"), purple_keyring_to_use);
-
-		options = g_list_append(options, currentDisabledName);
-		options = g_list_append(options, purple_keyring_to_use);
-	}
-
-	for (it = purple_keyring_keyrings; it != NULL; it = it->next) {
-		PurpleKeyring *keyring = it->data;
-
-		options = g_list_append(options,
-			(gpointer)purple_keyring_get_name(keyring));
-		options = g_list_append(options,
-			(gpointer)purple_keyring_get_id(keyring));
-	}
-
-	return options;
-}
-
-
-/**************************************************************************/
-/* Keyring plugin wrappers                                                */
-/**************************************************************************/
-
-static void
-purple_keyring_close(PurpleKeyring *keyring)
-{
-	PurpleKeyringClose close_cb;
-
-	g_return_if_fail(keyring != NULL);
-
-	if (keyring->is_cancelling) {
-		keyring->close_after_cancel = TRUE;
-		return;
-	}
-	if (keyring->is_closing)
-		return;
-	keyring->is_closing = TRUE;
-
-	close_cb = purple_keyring_get_close_keyring(keyring);
-
-	if (close_cb != NULL)
-		close_cb();
-
-	keyring->is_closing = FALSE;
-}
-
-static void
-purple_keyring_cancel_requests(PurpleKeyring *keyring)
-{
-	PurpleKeyringCancelRequests cancel_cb;
-
-	g_return_if_fail(keyring != NULL);
-
-	if (keyring->is_cancelling)
-		return;
-	keyring->is_cancelling = TRUE;
-
-	cancel_cb = purple_keyring_get_cancel_requests(keyring);
-
-	if (cancel_cb != NULL)
-		cancel_cb();
-
-	keyring->is_cancelling = FALSE;
-
-	if (keyring->close_after_cancel) {
-		keyring->close_after_cancel = FALSE;
-		purple_keyring_close(keyring);
-	}
-}
-
-static void
-purple_keyring_drop_passwords_save_cb(PurpleAccount *account, GError *error,
-	gpointer _tracker)
-{
-	PurpleKeyringDropTracker *tracker = _tracker;
-
-	tracker->drop_outstanding--;
-
-	if (!tracker->finished || tracker->drop_outstanding > 0)
-		return;
-
-	if (tracker->cb)
-		tracker->cb(tracker->cb_data);
-	g_free(tracker);
-}
-
-static void
-purple_keyring_drop_passwords(PurpleKeyring *keyring,
-	PurpleKeyringDropCallback cb, gpointer data)
-{
-	GList *it;
-	PurpleKeyringSave save_cb;
-	PurpleKeyringDropTracker *tracker;
-
-	g_return_if_fail(keyring != NULL);
-
-	save_cb = purple_keyring_get_save_password(keyring);
-	g_assert(save_cb != NULL);
-
-	it = purple_accounts_get_all();
-	if (it == NULL)
-		return;
-
-	tracker = g_new0(PurpleKeyringDropTracker, 1);
-	tracker->cb = cb;
-	tracker->cb_data = data;
-
-	for (; it != NULL; it = it->next) {
-		PurpleAccount *account = it->data;
-
-		tracker->drop_outstanding++;
-		if (it->next == NULL)
-			tracker->finished = TRUE;
-
-		save_cb(account, NULL, purple_keyring_drop_passwords_save_cb,
-			tracker);
-	}
-}
-
-gboolean
-purple_keyring_import_password(PurpleAccount *account, const gchar *keyring_id,
-	const gchar *mode, const gchar *data, GError **error)
-{
-	PurpleKeyring *keyring;
-	PurpleKeyring *inuse;
-	PurpleKeyringImportPassword import;
-
-	g_return_val_if_fail(account != NULL, FALSE);
-
-	if (keyring_id == NULL)
-		keyring_id = PURPLE_DEFAULT_KEYRING;
-
-	purple_debug_misc("keyring", "Importing password for account %s to "
-		"keyring %s.\n", purple_keyring_print_account(account),
-		keyring_id);
-
-	keyring = purple_keyring_find_keyring_by_id(keyring_id);
-	if (keyring == NULL) {
-		g_set_error_literal(error, PURPLE_KEYRING_ERROR,
-		                    PURPLE_KEYRING_ERROR_BACKENDFAIL,
-		                    _("Specified keyring is not registered."));
-		purple_debug_warning("Keyring", "Specified keyring is not "
-			"registered, cannot import password info for account "
-			"%s.\n", purple_keyring_print_account(account));
-		return FALSE;
-	}
-
-	inuse = purple_keyring_get_inuse();
-	if (inuse == NULL) {
-		PurpleKeyringFailedImport *import;
-		g_set_error_literal(
-		        error, PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_NOKEYRING,
-		        _("No keyring loaded, cannot import password info."));
-		purple_debug_warning("Keyring",
-			"No keyring loaded, cannot import password info for "
-			"account %s.\n", purple_keyring_print_account(account));
-
-		import = g_new0(PurpleKeyringFailedImport, 1);
-		import->keyring_id = g_strdup(keyring_id);
-		import->mode = g_strdup(mode);
-		import->data = g_strdup(data);
-		g_hash_table_insert(purple_keyring_failed_imports, account,
-			import);
-		return FALSE;
-	}
-
-	if (inuse != keyring) {
-		g_set_error_literal(
-		        error, PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_INTERNAL,
-		        _("Specified keyring ID does not match the loaded one."));
-		purple_debug_error("keyring",
-			"Specified keyring %s is not currently used (%s). "
-			"Data will be lost.\n", keyring_id,
-			purple_keyring_get_id(inuse));
-		return FALSE;
-	}
-
-	import = purple_keyring_get_import_password(inuse);
-	if (import == NULL) {
-		if (purple_debug_is_verbose()) {
-			purple_debug_misc("Keyring", "Configured keyring "
-				"cannot import password info. This might be "
-				"normal.\n");
-		}
-		return TRUE;
-	}
-
-	return import(account, mode, data, error);
-}
-
-gboolean
-purple_keyring_export_password(PurpleAccount *account, const gchar **keyring_id,
-	const gchar **mode, gchar **data, GError **error,
-	GDestroyNotify *destroy)
-{
-	PurpleKeyring *inuse;
-	PurpleKeyringExportPassword export;
-
-	g_return_val_if_fail(account != NULL, FALSE);
-	g_return_val_if_fail(keyring_id != NULL, FALSE);
-	g_return_val_if_fail(mode != NULL, FALSE);
-	g_return_val_if_fail(data != NULL, FALSE);
-	g_return_val_if_fail(error != NULL, FALSE);
-
-	inuse = purple_keyring_get_inuse();
-
-	if (inuse == NULL) {
-		PurpleKeyringFailedImport *import = g_hash_table_lookup(
-			purple_keyring_failed_imports, account);
-
-		if (import == NULL) {
-			g_set_error_literal(
-			        error, PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_NOKEYRING,
-			        _("No keyring configured, cannot export password info."));
-			purple_debug_warning("keyring",
-				"No keyring configured, cannot export password "
-				"info.\n");
-			return FALSE;
-		} else {
-			purple_debug_info("keyring", "No keyring configured, "
-				"getting fallback export data for %s.\n",
-				purple_keyring_print_account(account));
-
-			*keyring_id = import->keyring_id;
-			*mode = import->mode;
-			*data = g_strdup(import->data);
-			*destroy = (GDestroyNotify)purple_str_wipe;
-			return TRUE;
-		}
-	}
-
-	if (purple_debug_is_verbose()) {
-		purple_debug_misc("keyring",
-			"Exporting password for account %s from keyring %s\n",
-			purple_keyring_print_account(account),
-			purple_keyring_get_id(inuse));
-	}
-
-	*keyring_id = purple_keyring_get_id(inuse);
-
-	export = purple_keyring_get_export_password(inuse);
-	if (export == NULL) {
-		if (purple_debug_is_verbose()) {
-			purple_debug_misc("Keyring", "Configured keyring "
-				"cannot export password info. This might be "
-				"normal.\n");
-		}
-		*mode = NULL;
-		*data = NULL;
-		*destroy = NULL;
-		return TRUE;
-	}
-
-	return export(account, mode, data, error, destroy);
-}
-
-/**************************************************************************/
-/* PurpleKeyring accessors                                                */
-/**************************************************************************/
-
-PurpleKeyring *
-purple_keyring_new(void)
-{
-	return g_new0(PurpleKeyring, 1);
-}
-
-void
-purple_keyring_free(PurpleKeyring *keyring)
-{
-	g_return_if_fail(keyring != NULL);
-
-	g_free(keyring->name);
-	g_free(keyring->id);
-	g_free(keyring);
-}
-
-const gchar *
-purple_keyring_get_name(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->name;
-}
-
-const gchar *
-purple_keyring_get_id(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->id;
-}
-
-PurpleKeyringRead
-purple_keyring_get_read_password(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->read_password;
-}
-
-PurpleKeyringSave
-purple_keyring_get_save_password(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->save_password;
-}
-
-PurpleKeyringCancelRequests
-purple_keyring_get_cancel_requests(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->cancel_requests;
-}
-
-PurpleKeyringClose
-purple_keyring_get_close_keyring(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->close_keyring;
-}
-
-PurpleKeyringImportPassword
-purple_keyring_get_import_password(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->import_password;
-}
-
-PurpleKeyringExportPassword
-purple_keyring_get_export_password(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->export_password;
-}
-
-PurpleKeyringReadSettings
-purple_keyring_get_read_settings(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->read_settings;
-}
-
-PurpleKeyringApplySettings
-purple_keyring_get_apply_settings(const PurpleKeyring *keyring)
-{
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	return keyring->apply_settings;
-}
-
-void
-purple_keyring_set_name(PurpleKeyring *keyring, const gchar *name)
-{
-	g_return_if_fail(keyring != NULL);
-	g_return_if_fail(name != NULL);
-
-	g_free(keyring->name);
-	keyring->name = g_strdup(name);
-}
-
-void
-purple_keyring_set_id(PurpleKeyring *keyring, const gchar *id)
-{
-	g_return_if_fail(keyring != NULL);
-	g_return_if_fail(id != NULL);
-
-	g_free(keyring->id);
-	keyring->id = g_strdup(id);
-}
-
-void
-purple_keyring_set_read_password(PurpleKeyring *keyring,
-	PurpleKeyringRead read_cb)
-{
-	g_return_if_fail(keyring != NULL);
-	g_return_if_fail(read_cb != NULL);
-
-	keyring->read_password = read_cb;
-}
-
-void
-purple_keyring_set_save_password(PurpleKeyring *keyring,
-	PurpleKeyringSave save_cb)
-{
-	g_return_if_fail(keyring != NULL);
-	g_return_if_fail(save_cb != NULL);
-
-	keyring->save_password = save_cb;
-}
-
-void
-purple_keyring_set_cancel_requests(PurpleKeyring *keyring,
-	PurpleKeyringCancelRequests cancel_requests)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->cancel_requests = cancel_requests;
-}
-
-void
-purple_keyring_set_close_keyring(PurpleKeyring *keyring,
-	PurpleKeyringClose close_cb)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->close_keyring = close_cb;
-}
-
-void
-purple_keyring_set_import_password(PurpleKeyring *keyring,
-	PurpleKeyringImportPassword import_password)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->import_password = import_password;
-}
-
-void
-purple_keyring_set_export_password(PurpleKeyring *keyring,
-	PurpleKeyringExportPassword export_password)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->export_password = export_password;
-}
-
-void
-purple_keyring_set_read_settings(PurpleKeyring *keyring,
-PurpleKeyringReadSettings read_settings)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->read_settings = read_settings;
-}
-
-void
-purple_keyring_set_apply_settings(PurpleKeyring *keyring,
-PurpleKeyringApplySettings apply_settings)
-{
-	g_return_if_fail(keyring != NULL);
-
-	keyring->apply_settings = apply_settings;
-}
-
-
-/**************************************************************************/
-/* Error Codes                                                            */
-/**************************************************************************/
-
-GQuark purple_keyring_error_domain(void)
-{
-	return g_quark_from_static_string("libpurple keyring");
-}
-
-/**************************************************************************/
-/* Keyring Subsystem                                                      */
-/**************************************************************************/
-
-static void purple_keyring_core_initialized_cb(void)
-{
-	if (purple_keyring_inuse == NULL) {
-		purple_notify_error(NULL, _("Keyrings"),
-			_("Failed to load selected keyring."),
-			_("Check your system configuration or select another "
-			"one in Preferences dialog."), NULL);
-	}
-}
-
-static void purple_keyring_core_quitting_cb()
-{
-	if (current_change_tracker != NULL) {
-		PurpleKeyringChangeTracker *tracker = current_change_tracker;
-		tracker->abort = TRUE;
-		if (tracker->old_kr)
-			purple_keyring_cancel_requests(tracker->old_kr);
-		if (current_change_tracker == tracker && tracker->new_kr)
-			purple_keyring_cancel_requests(tracker->new_kr);
-	}
-
-	purple_keyring_is_quitting = TRUE;
-	if (purple_keyring_inuse != NULL)
-		purple_keyring_cancel_requests(purple_keyring_inuse);
-}
-
-void
-purple_keyring_init(void)
-{
-	const gchar *touse;
-	GList *plugins, *it;
-
-	purple_keyring_keyrings = NULL;
-	purple_keyring_inuse = NULL;
-
-	purple_keyring_failed_imports = g_hash_table_new_full(g_direct_hash,
-		g_direct_equal, NULL,
-		(GDestroyNotify)purple_keyring_failed_import_free);
-
-	/* void keyring_register(const char *keyring_id,
-	 *      PurpleKeyring * keyring);
-	 *
-	 * A signal called when keyring is registered.
-	 *
-	 * @param keyring_id The keyring ID.
-	 * @param keyring    The keyring.
-	 */
-	purple_signal_register(purple_keyring_get_handle(), "keyring-register",
-		purple_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_STRING,
-		PURPLE_TYPE_KEYRING);
-
-	/* void keyring_unregister(const char *keyring_id,
-	 *      PurpleKeyring * keyring);
-	 *
-	 * A signal called when keyring is unregistered.
-	 *
-	 * @param keyring_id The keyring ID.
-	 * @param keyring    The keyring.
-	 */
-	purple_signal_register(purple_keyring_get_handle(), "keyring-unregister",
-		purple_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_STRING,
-		PURPLE_TYPE_KEYRING);
-
-	/* void password_migration(PurpleAccount* account);
-	 *
-	 * A signal called, when a password for the account was moved to another
-	 * keyring.
-	 *
-	 * @param account The account.
-	 */
-	purple_signal_register(purple_keyring_get_handle(), "password-migration",
-		purple_marshal_VOID__POINTER, G_TYPE_NONE, 1, PURPLE_TYPE_ACCOUNT);
-
-	touse = purple_prefs_get_string("/purple/keyring/active");
-	if (touse == NULL) {
-		purple_prefs_add_none("/purple/keyring");
-		purple_prefs_add_string("/purple/keyring/active",
-			PURPLE_DEFAULT_KEYRING);
-		purple_keyring_to_use = g_strdup(PURPLE_DEFAULT_KEYRING);
-	} else
-		purple_keyring_to_use = g_strdup(touse);
-
-	purple_keyring_pref_connect();
-
-	plugins = purple_plugins_find_all();
-	for (it = plugins; it != NULL; it = it->next) {
-		PurplePlugin *plugin = PURPLE_PLUGIN(it->data);
-		GPluginPluginInfo *info =
-		        GPLUGIN_PLUGIN_INFO(purple_plugin_get_info(plugin));
-
-		if (!g_str_has_prefix(gplugin_plugin_info_get_id(info), "keyring-")) {
-			continue;
-		}
-
-		if (purple_plugin_is_loaded(plugin))
-			continue;
-
-		if (purple_plugin_load(plugin, NULL)) {
-			purple_keyring_loaded_plugins = g_list_append(
-				purple_keyring_loaded_plugins, plugin);
-		}
-	}
-	g_list_free(plugins);
-
-	if (purple_keyring_inuse == NULL)
-		purple_debug_error("keyring", "Selected keyring failed to load\n");
-
-	purple_signal_connect(purple_get_core(), "core-initialized",
-		purple_keyring_get_handle(),
-		PURPLE_CALLBACK(purple_keyring_core_initialized_cb), NULL);
-	purple_signal_connect(purple_get_core(), "quitting",
-		purple_keyring_get_handle(),
-		PURPLE_CALLBACK(purple_keyring_core_quitting_cb), NULL);
-}
-
-void
-purple_keyring_uninit(void)
-{
-	GList *it;
-
-	purple_keyring_pref_disconnect();
-
-	g_free(purple_keyring_to_use);
-	purple_keyring_inuse = NULL;
-
-	g_hash_table_destroy(purple_keyring_failed_imports);
-	purple_keyring_failed_imports = NULL;
-
-	for (it = g_list_first(purple_keyring_loaded_plugins); it != NULL;
-		it = g_list_next(it))
-	{
-		PurplePlugin *plugin = PURPLE_PLUGIN(it->data);
-		if (g_list_find(purple_plugins_get_loaded(), plugin) == NULL)
-			continue;
-		purple_plugin_unload(plugin, NULL);
-	}
-	g_list_free(purple_keyring_loaded_plugins);
-	purple_keyring_loaded_plugins = NULL;
-
-	purple_signals_unregister_by_instance(purple_keyring_get_handle());
-	purple_signals_disconnect_by_handle(purple_keyring_get_handle());
-}
-
-void *
-purple_keyring_get_handle(void)
-{
-	static int handle;
-
-	return &handle;
-}
-
-static PurpleKeyring *
-purple_keyring_copy(PurpleKeyring *keyring)
-{
-	PurpleKeyring *keyring_copy;
-
-	g_return_val_if_fail(keyring != NULL, NULL);
-
-	keyring_copy = purple_keyring_new();
-	*keyring_copy = *keyring;
-
-	keyring_copy->name = g_strdup(keyring->name);
-	keyring_copy->id   = g_strdup(keyring->id);
-
-	return keyring_copy;
-}
-
-GType
-purple_keyring_get_type(void)
-{
-	static GType type = 0;
-
-	if (type == 0) {
-		type = g_boxed_type_register_static("PurpleKeyring",
-				(GBoxedCopyFunc)purple_keyring_copy,
-				(GBoxedFreeFunc)purple_keyring_free);
-	}
-
-	return type;
-}
diff --git a/libpurple/meson.build b/libpurple/meson.build
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -21,7 +21,6 @@
 	'idle.c',
 	'image.c',
 	'image-store.c',
-	'keyring.c',
 	'log.c',
 	'media/backend-fs2.c',
 	'media/backend-iface.c',
@@ -119,7 +118,6 @@
 	'idle.h',
 	'image.h',
 	'image-store.h',
-	'keyring.h',
 	'log.h',
 	'media.h',
 	'mediamanager.h',
diff --git a/libpurple/plugins/keyrings/meson.build b/libpurple/plugins/keyrings/meson.build
--- a/libpurple/plugins/keyrings/meson.build
+++ b/libpurple/plugins/keyrings/meson.build
@@ -5,7 +5,8 @@
 		internalkeyring_plugin = library('internalkeyring', 'internalkeyring.c',
 		    dependencies : [nettle, libpurple_dep],
 		    name_prefix : '',
-		    install : true, install_dir : PURPLE_PLUGINDIR)
+		    build_by_default : false,
+		    install : false, install_dir : PURPLE_PLUGINDIR)
 	endif
 
 	if secretservice.found()
diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c
--- a/pidgin/gtkprefs.c
+++ b/pidgin/gtkprefs.c
@@ -178,15 +178,6 @@
 		GtkWidget *password;
 	} proxy;
 
-	/* Keyrings page */
-	struct {
-		PidginPrefCombo active;
-		GtkWidget *vbox;
-		PurpleRequestFields *settings;
-		GtkWidget *settings_box;
-		GtkWidget *apply;
-	} keyring;
-
 	/* Away page */
 	struct {
 		PidginPrefCombo idle_reporting;
@@ -410,17 +401,6 @@
 	cb(combo_box, active);
 }
 
-static void
-pidgin_prefs_bind_dropdown_revert_active(PidginPrefCombo *combo)
-{
-	g_return_if_fail(combo != NULL);
-
-	combo->current_active = combo->previously_active;
-
-	gtk_combo_box_set_active(GTK_COMBO_BOX(combo->combo),
-	                         combo->previously_active);
-}
-
 static GtkWidget *
 pidgin_prefs_dropdown_from_list_with_cb(GtkWidget *box, const gchar *title,
 	GtkComboBox **dropdown_out, GList *menuitems,
@@ -826,8 +806,6 @@
 			G_CALLBACK(set_bool_pref), (char *)key);
 }
 
-static void keyring_page_cleanup(PidginPrefsWindow *win);
-
 static void
 delete_prefs(GtkWidget *asdf, void *gdsa)
 {
@@ -845,8 +823,6 @@
 	prefs_status_themes_combo_box = NULL;
 	prefs_smiley_themes_combo_box = NULL;
 
-	keyring_page_cleanup(prefs);
-
 	g_free(prefs->proxy.gnome_program_path);
 	prefs = NULL;
 }
@@ -1888,232 +1864,6 @@
 			win->logging.log_system);
 }
 
-/*** keyring page *******************************************************/
-
-static void
-keyring_page_settings_changed(GtkWidget *widget, gpointer _setting)
-{
-	PurpleRequestField *setting = _setting;
-	PurpleRequestFieldType field_type;
-
-	gtk_widget_set_sensitive(prefs->keyring.apply, TRUE);
-
-	field_type = purple_request_field_get_field_type(setting);
-
-	if (field_type == PURPLE_REQUEST_FIELD_BOOLEAN) {
-		purple_request_field_bool_set_value(setting,
-			gtk_toggle_button_get_active(
-				GTK_TOGGLE_BUTTON(widget)));
-	} else if (field_type == PURPLE_REQUEST_FIELD_STRING) {
-		purple_request_field_string_set_value(setting,
-			gtk_entry_get_text(GTK_ENTRY(widget)));
-	} else if (field_type == PURPLE_REQUEST_FIELD_INTEGER) {
-		purple_request_field_int_set_value(setting,
-			gtk_spin_button_get_value_as_int(
-				GTK_SPIN_BUTTON(widget)));
-	} else
-		g_return_if_reached();
-}
-
-static void
-keyring_page_add_settings_field(GtkBox *vbox, PurpleRequestField *setting,
-	GtkSizeGroup *sg)
-{
-	GtkWidget *widget;
-	PurpleRequestFieldType field_type;
-	const gchar *label;
-
-	label = purple_request_field_get_label(setting);
-
-	field_type = purple_request_field_get_field_type(setting);
-	if (field_type == PURPLE_REQUEST_FIELD_BOOLEAN) {
-		widget = gtk_check_button_new_with_label(label);
-		label = NULL;
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
-			purple_request_field_bool_get_value(setting));
-		g_signal_connect(G_OBJECT(widget), "toggled",
-			G_CALLBACK(keyring_page_settings_changed), setting);
-	} else if (field_type == PURPLE_REQUEST_FIELD_STRING) {
-		widget = gtk_entry_new();
-		gtk_entry_set_text(GTK_ENTRY(widget),
-			purple_request_field_string_get_value(setting));
-		if (purple_request_field_string_is_masked(setting))
-			gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
-		g_signal_connect(G_OBJECT(widget), "changed",
-			G_CALLBACK(keyring_page_settings_changed), setting);
-	} else if (field_type == PURPLE_REQUEST_FIELD_INTEGER) {
-		widget = gtk_spin_button_new_with_range(
-			purple_request_field_int_get_lower_bound(setting),
-			purple_request_field_int_get_upper_bound(setting), 1);
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget),
-			purple_request_field_int_get_value(setting));
-		g_signal_connect(G_OBJECT(widget), "value-changed",
-			G_CALLBACK(keyring_page_settings_changed), setting);
-	} else {
-		purple_debug_error("gtkprefs", "Unsupported field type\n");
-		return;
-	}
-
-	pidgin_add_widget_to_vbox(vbox, label, sg, widget, FALSE, NULL);
-}
-
-/* XXX: it could be available for all plugins, not keyrings only */
-static void
-keyring_page_add_settings(PidginPrefsWindow *win)
-{
-	GtkWidget *box;
-	GList *it, *groups;
-	GtkSizeGroup *sg;
-
-	box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
-	gtk_box_pack_start(GTK_BOX(win->keyring.vbox), box, FALSE, FALSE, 0);
-
-	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-	groups = purple_request_fields_get_groups(win->keyring.settings);
-	for (it = g_list_first(groups); it != NULL; it = g_list_next(it)) {
-		GList *it2, *fields;
-		GtkBox *vbox;
-		PurpleRequestFieldGroup *group;
-		const gchar *group_title;
-
-		group = it->data;
-		group_title = purple_request_field_group_get_title(group);
-		if (group_title) {
-			vbox = GTK_BOX(pidgin_make_frame(box, group_title));
-		} else {
-			vbox = GTK_BOX(box);
-		}
-
-		fields = purple_request_field_group_get_fields(group);
-		for (it2 = g_list_first(fields); it2 != NULL;
-			it2 = g_list_next(it2)) {
-			keyring_page_add_settings_field(vbox, it2->data, sg);
-		}
-	}
-
-	g_object_unref(sg);
-
-	win->keyring.settings_box = box;
-}
-
-static void
-keyring_page_settings_apply(GtkButton *button, gpointer data)
-{
-	PidginPrefsWindow *win = PIDGIN_PREFS_WINDOW(data);
-	PurpleRequestFields *fields= win->keyring.settings;
-	PurpleCredentialManager *manager = purple_credential_manager_get_default();
-
-	if(!purple_credential_manager_write_settings(manager, fields, NULL)) {
-		return;
-	}
-
-	gtk_widget_set_sensitive(win->keyring.apply, FALSE);
-}
-
-static void
-keyring_page_update_settings(PidginPrefsWindow *win)
-{
-	PurpleCredentialManager *manager = purple_credential_manager_get_default();
-
-	g_clear_pointer(&win->keyring.settings, purple_request_fields_destroy);
-	win->keyring.settings = purple_credential_manager_read_settings(manager,
-	                                                                NULL);
-	if (!win->keyring.settings) {
-		return;
-	}
-
-	keyring_page_add_settings(win);
-
-	win->keyring.apply = gtk_button_new_with_mnemonic(_("_Apply"));
-	gtk_box_pack_start(GTK_BOX(win->keyring.settings_box),
-	                   win->keyring.apply, FALSE, FALSE, 1);
-	gtk_widget_set_sensitive(win->keyring.apply, FALSE);
-	g_signal_connect(G_OBJECT(win->keyring.apply), "clicked",
-	                 G_CALLBACK(keyring_page_settings_apply), win);
-
-	gtk_widget_show_all(win->keyring.settings_box);
-}
-
-static void
-keyring_page_pref_set_inuse(GError *error, G_GNUC_UNUSED gpointer unused)
-{
-	PurpleKeyring *in_use = purple_keyring_get_inuse();
-
-	if (prefs == NULL) {
-		purple_debug_info("gtkprefs", "pref window already closed\n");
-		return;
-	}
-
-	gtk_widget_set_sensitive(GTK_WIDGET(prefs->keyring.active.combo), TRUE);
-
-	if (error != NULL) {
-		pidgin_prefs_bind_dropdown_revert_active(
-		        &prefs->keyring.active);
-		purple_notify_error(NULL, _("Keyring"),
-			_("Failed to set new keyring"), error->message, NULL);
-		return;
-	}
-
-	g_return_if_fail(in_use != NULL);
-	purple_prefs_set_string("/purple/keyring/active",
-		purple_keyring_get_id(in_use));
-
-	keyring_page_update_settings(prefs);
-}
-
-static void
-keyring_page_pref_changed(GtkComboBox *combo_box, PidginPrefCombo *combo)
-{
-	const char *keyring_id;
-	PurpleKeyring *keyring;
-
-	g_return_if_fail(combo_box != NULL);
-
-	keyring_id = combo->value.string;
-	keyring = purple_keyring_find_keyring_by_id(keyring_id);
-	if (keyring == NULL) {
-		pidgin_prefs_bind_dropdown_revert_active(combo);
-		purple_notify_error(NULL, _("Keyring"),
-			_("Selected keyring is disabled"), NULL, NULL);
-		return;
-	}
-
-	gtk_widget_set_sensitive(GTK_WIDGET(combo_box), FALSE);
-
-	g_clear_pointer(&prefs->keyring.settings_box, gtk_widget_destroy);
-	g_clear_pointer(&prefs->keyring.settings,
-	                purple_request_fields_destroy);
-
-	purple_keyring_set_inuse(keyring, FALSE, keyring_page_pref_set_inuse,
-	                         NULL);
-}
-
-static void
-keyring_page_cleanup(PidginPrefsWindow *win)
-{
-	g_clear_pointer(&win->keyring.settings, purple_request_fields_destroy);
-}
-
-static void
-bind_keyring_page(PidginPrefsWindow *win)
-{
-	GList *names;
-
-	/* Keyring selection */
-	names = purple_keyring_get_options();
-	win->keyring.active.type = PURPLE_PREF_STRING;
-	win->keyring.active.key = "/purple/keyring/active";
-	pidgin_prefs_bind_dropdown_from_list(&win->keyring.active, names);
-	/* Override the usual callback to defer changing the pref. */
-	win->keyring.active.cb = keyring_page_pref_changed;
-	g_list_free(names);
-
-	keyring_page_update_settings(win);
-}
-
-/*** keyring page - end *************************************************/
-
 static void
 set_idle_away(PurpleSavedStatus *status)
 {
@@ -2691,7 +2441,6 @@
 	bind_logging_page(win);
 	bind_network_page(win);
 	bind_proxy_page(win);
-	bind_keyring_page(win);
 	bind_away_page(win);
 	bind_theme_page(win);
 #ifdef USE_VV
@@ -2876,12 +2625,6 @@
 	gtk_widget_class_bind_template_callback(widget_class,
 			proxy_print_option);
 
-	/* Keyrings page */
-	gtk_widget_class_bind_template_child(
-			widget_class, PidginPrefsWindow, keyring.active.combo);
-	gtk_widget_class_bind_template_child(
-			widget_class, PidginPrefsWindow, keyring.vbox);
-
 	/* Away page */
 	gtk_widget_class_bind_template_child(
 			widget_class, PidginPrefsWindow,
diff --git a/pidgin/resources/Prefs/prefs.ui b/pidgin/resources/Prefs/prefs.ui
--- a/pidgin/resources/Prefs/prefs.ui
+++ b/pidgin/resources/Prefs/prefs.ui
@@ -206,14 +206,6 @@
       </row>
     </data>
   </object>
-  <object class="GtkListStore" id="keyring.active.store">
-    <columns>
-      <!-- column-name text -->
-      <column type="gchararray"/>
-      <!-- column-name value -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
   <object class="GtkListStore" id="logging.format.store">
     <columns>
       <!-- column-name text -->
@@ -1966,101 +1958,6 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkBox" id="keyring.page">
-                    <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <property name="border-width">12</property>
-                    <property name="orientation">vertical</property>
-                    <property name="spacing">18</property>
-                    <child>
-                      <object class="GtkFrame">
-                        <property name="visible">True</property>
-                        <property name="can-focus">False</property>
-                        <property name="label-xalign">0</property>
-                        <property name="shadow-type">none</property>
-                        <child>
-                          <object class="GtkAlignment">
-                            <property name="visible">True</property>
-                            <property name="can-focus">False</property>
-                            <property name="left-padding">12</property>
-                            <child>
-                              <object class="GtkBox" id="keyring.vbox">
-                                <property name="visible">True</property>
-                                <property name="can-focus">False</property>
-                                <property name="orientation">vertical</property>
-                                <property name="spacing">6</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">True</property>
-                                    <property name="can-focus">False</property>
-                                    <property name="spacing">6</property>
-                                    <child>
-                                      <object class="GtkLabel">
-                                        <property name="visible">True</property>
-                                        <property name="can-focus">False</property>
-                                        <property name="label" translatable="yes">Keyring:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">0</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkComboBox" id="keyring.active.combo">
-                                        <property name="visible">True</property>
-                                        <property name="can-focus">False</property>
-                                        <property name="model">keyring.active.store</property>
-                                        <child>
-                                          <object class="GtkCellRendererText"/>
-                                          <attributes>
-                                            <attribute name="text">0</attribute>
-                                          </attributes>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                              </object>
-                            </child>
-                          </object>
-                        </child>
-                        <child type="label">
-                          <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can-focus">False</property>
-                            <property name="margin-bottom">6</property>
-                            <property name="label" translatable="yes">Keyring</property>
-                            <attributes>
-                              <attribute name="weight" value="bold"/>
-                            </attributes>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="name">keyring</property>
-                    <property name="title" translatable="yes">Password Storage</property>
-                    <property name="position">5</property>
-                  </packing>
-                </child>
-                <child>
                   <object class="GtkBox" id="away.page">
                     <property name="visible">True</property>
                     <property name="can-focus">False</property>
