diff --git a/clients/common/nm-vpn-helpers.c b/clients/common/nm-vpn-helpers.c
index 43ac4b2..26083ae 100644
--- a/clients/common/nm-vpn-helpers.c
+++ b/clients/common/nm-vpn-helpers.c
@@ -94,17 +94,11 @@ nm_vpn_get_plugins (void)
 	plugins = nm_vpn_plugin_info_list_load ();
 	return plugins;
 }
-
-static int
-_strcmp_data (gconstpointer a, gconstpointer b, gpointer unused)
-{
-	return strcmp (a, b);
-}
-
+#include <stdio.h>
 const char **
 nm_vpn_get_plugin_names (gboolean only_available_plugins)
 {
-	GSList *p;
+	GSList *p, *names = NULL;
 	const char **list;
 	const char *known_names[] = {
 		"openvpn",
@@ -122,23 +116,31 @@ nm_vpn_get_plugin_names (gboolean only_available_plugins)
 	guint i, j, k;
 
 	p = nm_vpn_get_plugins ();
-	list = g_new0 (const char *, g_slist_length (p) + G_N_ELEMENTS (known_names) + 1);
-
 	i = 0;
-	for (i = 0; p; p = p->next)
-		list[i++] = nm_vpn_plugin_info_get_name (p->data);
-	if (!only_available_plugins) {
+	for (i = 0; p; p = p->next) {
+		const char *name = nm_vpn_plugin_info_get_name (p->data);
+		const char *const*aliases = nm_vpn_plugin_info_get_aliases (p->data);
+
+		while (name) {
+			if (g_slist_find_custom (names, name, (GCompareFunc) g_strcmp0) == NULL)
+				names = g_slist_insert_sorted (names, (gpointer) name, (GCompareFunc) g_strcmp0);
+
+			name = *(aliases++);
+			if (name && g_str_has_prefix (name, "org.freedesktop.NetworkManager."))
+				name += strlen ("org.freedesktop.NetworkManager.");
+		}
+	}
+	if (0 && !only_available_plugins) {
 		for (j = 0; j < G_N_ELEMENTS (known_names); j++)
-			list[i++] = known_names[j];
+			if (g_slist_find_custom (names, known_names[j], (GCompareFunc) g_strcmp0) == NULL)
+				names = g_slist_insert_sorted (names, (gpointer) known_names[j], (GCompareFunc) g_strcmp0);
 	}
 
-	g_qsort_with_data (list, i, sizeof (gpointer), _strcmp_data, NULL);
-
-	/* remove duplicates */
-	for (k = 0, j = 1; j < i; j++) {
-		if (nm_streq (list[k], list[j]))
-			continue;
-		list[k++] = list[j];
+	list = g_new0 (const char *, g_slist_length (names) + 1);
+	k = 0;
+	while (names) {
+		list[k++] = names->data;
+		names = g_slist_remove (names, names->data);
 	}
 	list[k++] = NULL;
 
