diff --git a/libpurple/purpleprotocolmanager.c b/libpurple/purpleprotocolmanager.c
--- a/libpurple/purpleprotocolmanager.c
+++ b/libpurple/purpleprotocolmanager.c
@@ -206,6 +206,7 @@
 	gpointer value = NULL;
 
 	g_return_val_if_fail(PURPLE_PROTOCOL_MANAGER(manager), NULL);
+	g_return_val_if_fail(id != NULL, NULL);
 
 	priv = purple_protocol_manager_get_instance_private(manager);
 
diff --git a/pidgin/glade/pidgin3.xml.in b/pidgin/glade/pidgin3.xml.in
--- a/pidgin/glade/pidgin3.xml.in
+++ b/pidgin/glade/pidgin3.xml.in
@@ -15,6 +15,8 @@
     <glade-widget-class name="PidginMenuTray" generic-name="menu_tray" title="MenuTray"/>
     <glade-widget-class name="PidginPluginsMenu" generic-name="plugins_menu" title="PluginsMenu"/>
     <glade-widget-class name="PidginPresenceIcon" generic-name="presence_icon" title="PresenceIcon"/>
+    <glade-widget-class name="PidginProtocolChooser" generic-name="protocol_chooser" title="ProtocolChooser"/>
+    <glade-widget-class name="PidginProtocolStore" generic-name="protocol_store" title="ProtocolStore"/>
     <glade-widget-class name="PidginScrollBook" generic-name="scroll_book" title="ScrollBook"/>
     <glade-widget-class name="PidginStatusBox" generic-name="status_box" title="StatusBox"/>
     <glade-widget-class name="PidginWindow" generic-name="window" title="Window"/>
@@ -34,6 +36,8 @@
     <glade-widget-class-ref name="PidginMenuTray"/>
     <glade-widget-class-ref name="PidginPluginsMenu"/>
     <glade-widget-class-ref name="PidginPresenceIcon"/>
+    <glade-widget-class-ref name="PidginProtocolChooser"/>
+    <glade-widget-class-ref name="PidginProtocolStore"/>
     <glade-widget-class-ref name="PidginScrollBook"/>
     <glade-widget-class-ref name="PidginStatusBox"/>
     <glade-widget-class-ref name="PidginWindow"/>
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -1588,23 +1588,8 @@
 
 	dialog = g_new0(AccountPrefsDialog, 1);
 
-	if(account == NULL) {
-		/* Select the first protocol in the list*/
-		GList *protocol_list = purple_protocols_get_all();
-		if (protocol_list != NULL) {
-			dialog->protocol_id = g_strdup(purple_protocol_get_id(PURPLE_PROTOCOL(protocol_list->data)));
-			g_list_free(protocol_list);
-		}
-	} else {
-		dialog->protocol_id =
-			g_strdup(purple_account_get_protocol_id(account));
-	}
-
-	/* TODO if no protocols are loaded, this should inform the user that
-	        protocols need to be loaded instead of just doing nothing */
-	if (!dialog->protocol_id) {
-		g_free(dialog);
-		return;
+	if(PURPLE_IS_ACCOUNT(account)) {
+		dialog->protocol_id = g_strdup(purple_account_get_protocol_id(account));
 	}
 
 	if (accounts_window != NULL && account != NULL)
@@ -1616,7 +1601,13 @@
 	dialog->password = g_strdup(password);
 	dialog->type = type;
 	dialog->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-	dialog->protocol = purple_protocols_find(dialog->protocol_id);
+
+	if(dialog->protocol_id != NULL) {
+		PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+		dialog->protocol = purple_protocol_manager_find(manager,
+		                                                dialog->protocol_id);
+	}
 
 	dialog->window = win = pidgin_dialog_new((type == PIDGIN_ADD_ACCOUNT_DIALOG) ? _("Add Account") : _("Modify Account"),
 		6, "account", FALSE);
diff --git a/pidgin/pidginprotocolchooser.c b/pidgin/pidginprotocolchooser.c
--- a/pidgin/pidginprotocolchooser.c
+++ b/pidgin/pidginprotocolchooser.c
@@ -32,10 +32,27 @@
 struct _PidginProtocolChooser {
 	GtkComboBox parent;
 
-	GtkListStore *model;
+	GtkTreeModel *model;
 };
 
 /******************************************************************************
+ * Callbacks
+ *****************************************************************************/
+static void
+pidgin_protocol_chooser_model_changed_cb(GObject *obj, GParamSpec *pspec,
+                                         gpointer data)
+{
+	GtkComboBox *combo = GTK_COMBO_BOX(obj);
+	GtkTreeModel *model = gtk_combo_box_get_model(combo);
+	GtkTreeIter iter;
+
+	/* When the model for the combobox changes, select the first item. */
+	if(gtk_tree_model_get_iter_first(model, &iter)) {
+		gtk_combo_box_set_active_iter(combo, &iter);
+	}
+}
+
+/******************************************************************************
  * GObject Implementation
  *****************************************************************************/
 G_DEFINE_TYPE(PidginProtocolChooser, pidgin_protocol_chooser,
@@ -55,7 +72,15 @@
 
 static void
 pidgin_protocol_chooser_init(PidginProtocolChooser *chooser) {
+	g_signal_connect_object(G_OBJECT(chooser), "notify::model",
+	                        G_CALLBACK(pidgin_protocol_chooser_model_changed_cb),
+	                        chooser, G_CONNECT_AFTER);
+
 	gtk_widget_init_template(GTK_WIDGET(chooser));
+
+	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(chooser->model),
+	                                     PIDGIN_PROTOCOL_STORE_COLUMN_NAME,
+	                                     GTK_SORT_ASCENDING);
 }
 
 /******************************************************************************
diff --git a/pidgin/resources/Protocols/chooser.ui b/pidgin/resources/Protocols/chooser.ui
--- a/pidgin/resources/Protocols/chooser.ui
+++ b/pidgin/resources/Protocols/chooser.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.1 
+<!-- Generated with glade 3.38.2 
 
 Pidgin - Internet Messenger
 Copyright (C) Pidgin Developers <devel@pidgin.im>
@@ -21,13 +21,18 @@
 -->
 <interface domain="pidgin">
   <requires lib="gtk+" version="3.20"/>
+  <requires lib="pidgin" version="3.0"/>
   <!-- interface-license-type gplv2 -->
   <!-- interface-name Pidgin -->
   <!-- interface-description Internet Messenger -->
   <!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
+  <object class="PidginProtocolStore" id="raw_model"/>
+  <object class="GtkTreeModelSort" id="model">
+    <property name="model">raw_model</property>
+  </object>
   <template class="PidginProtocolChooser" parent="GtkComboBox">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <property name="model">model</property>
     <child>
       <object class="GtkCellRendererPixbuf" id="icon"/>
@@ -42,5 +47,4 @@
       </attributes>
     </child>
   </template>
-  <object class="PidginProtocolStore" id="model"/>
 </interface>
