[network-manager-applet/danw/wip/libnm] wip



commit 204b7459992d315e53aff1e1a1e50c89d67d20fe
Author: Dan Winship <danw redhat com>
Date:   Sat Nov 22 10:47:11 2014 -0500

    wip

 configure.ac                                 |    1 -
 src/applet-agent.c                           |   63 +++---
 src/applet-agent.h                           |    5 +-
 src/applet-device-bond.c                     |   12 +-
 src/applet-device-bridge.c                   |   12 +-
 src/applet-device-broadband.c                |   43 ++--
 src/applet-device-bt.c                       |   16 +-
 src/applet-device-cdma.c                     |   12 +-
 src/applet-device-ethernet.c                 |   24 +-
 src/applet-device-gsm.c                      |   14 +-
 src/applet-device-infiniband.c               |   12 +-
 src/applet-device-team.c                     |   12 +-
 src/applet-device-vlan.c                     |   19 +-
 src/applet-device-wifi.c                     |   91 ++++----
 src/applet-device-wimax.c                    |   10 +-
 src/applet-dialogs.c                         |  169 ++++++----------
 src/applet-vpn-request.c                     |   10 +-
 src/applet.c                                 |  292 ++++++++++----------------
 src/applet.h                                 |    9 +-
 src/connection-editor/ce-page.c              |   17 +-
 src/connection-editor/ce-page.h              |    9 +-
 src/connection-editor/connection-helpers.c   |   38 ++--
 src/connection-editor/connection-helpers.h   |    6 +-
 src/connection-editor/ip4-routes-dialog.c    |   97 +++++-----
 src/connection-editor/ip4-routes-dialog.h    |    4 +-
 src/connection-editor/ip6-routes-dialog.c    |   90 ++++----
 src/connection-editor/ip6-routes-dialog.h    |    4 +-
 src/connection-editor/nm-connection-editor.c |   27 +--
 src/connection-editor/nm-connection-editor.h |    4 +-
 src/connection-editor/nm-connection-list.c   |  121 +++--------
 src/connection-editor/nm-connection-list.h   |    3 +-
 src/connection-editor/page-8021x-security.c  |    2 -
 src/connection-editor/page-8021x-security.h  |    1 -
 src/connection-editor/page-bond.c            |   21 +-
 src/connection-editor/page-bond.h            |    3 +-
 src/connection-editor/page-bridge-port.c     |    2 -
 src/connection-editor/page-bridge-port.h     |    1 -
 src/connection-editor/page-bridge.c          |   25 +--
 src/connection-editor/page-bridge.h          |    3 +-
 src/connection-editor/page-dcb.c             |    2 -
 src/connection-editor/page-dcb.h             |    1 -
 src/connection-editor/page-dsl.c             |   15 +-
 src/connection-editor/page-dsl.h             |    3 +-
 src/connection-editor/page-ethernet.c        |    6 +-
 src/connection-editor/page-ethernet.h        |    3 +-
 src/connection-editor/page-general.c         |   25 +--
 src/connection-editor/page-general.h         |    9 +-
 src/connection-editor/page-infiniband.c      |    6 +-
 src/connection-editor/page-infiniband.h      |    3 +-
 src/connection-editor/page-ip4.c             |  133 ++++++------
 src/connection-editor/page-ip4.h             |    1 -
 src/connection-editor/page-ip6.c             |  157 +++++++-------
 src/connection-editor/page-ip6.h             |    1 -
 src/connection-editor/page-master.c          |   25 +--
 src/connection-editor/page-mobile.c          |   12 +-
 src/connection-editor/page-mobile.h          |    3 +-
 src/connection-editor/page-ppp.c             |    2 -
 src/connection-editor/page-ppp.h             |    1 -
 src/connection-editor/page-team-port.c       |   10 +-
 src/connection-editor/page-team-port.h       |    1 -
 src/connection-editor/page-team.c            |   21 +-
 src/connection-editor/page-team.h            |    3 +-
 src/connection-editor/page-vlan.c            |   19 +-
 src/connection-editor/page-vlan.h            |    3 +-
 src/connection-editor/page-vpn.c             |   44 ++--
 src/connection-editor/page-vpn.h             |    5 +-
 src/connection-editor/page-wifi-security.c   |    2 -
 src/connection-editor/page-wifi-security.h   |    1 -
 src/connection-editor/page-wifi.c            |    6 +-
 src/connection-editor/page-wifi.h            |    3 +-
 src/connection-editor/page-wimax.c           |    6 +-
 src/connection-editor/page-wimax.h           |    3 +-
 src/connection-editor/vpn-helpers.c          |   32 ++--
 src/connection-editor/vpn-helpers.h          |    2 +-
 src/gnome-bluetooth/bt-widget.c              |    8 +-
 src/gnome-bluetooth/nma-bt-device.c          |   20 +-
 src/libnm-gtk/nm-wifi-dialog.c               |   47 ++---
 src/libnm-gtk/nm-wifi-dialog.h               |   10 +-
 src/libnm-gtk/nm-wireless-dialog.c           |   11 +-
 src/libnm-gtk/nm-wireless-dialog.h           |    7 +-
 src/migration-tool.c                         |   10 +-
 src/mobile-helpers.c                         |   12 +-
 82 files changed, 851 insertions(+), 1147 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 9bc05c6..a3f2c18 100644
--- a/configure.ac
+++ b/configure.ac
@@ -74,7 +74,6 @@ PKG_CHECK_MODULES(GOBJECT, gobject-2.0)
 PKG_CHECK_MODULES(NMA,
                [dbus-glib-1 >= 0.74
                 gio-2.0 >= 2.32
-                NetworkManager >= 0.9.9.95
                 libnm >= 0.9.9.95
                 gmodule-export-2.0])
 
diff --git a/src/applet-agent.c b/src/applet-agent.c
index 3fd6b62..94f98df 100644
--- a/src/applet-agent.c
+++ b/src/applet-agent.c
@@ -49,7 +49,7 @@ static const SecretSchema network_manager_secret_schema = {
        }
 };
 
-G_DEFINE_TYPE (AppletAgent, applet_agent, NM_TYPE_SECRET_AGENT);
+G_DEFINE_TYPE (AppletAgent, applet_agent, NM_TYPE_SECRET_AGENT_OLD);
 
 #define APPLET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLET_TYPE_AGENT, 
AppletAgentPrivate))
 
@@ -75,15 +75,15 @@ static guint signals[LAST_SIGNAL] = { 0 };
 typedef struct {
        guint id;
 
-       NMSecretAgent *agent;
+       NMSecretAgentOld *agent;
        NMConnection *connection;
        char *path;
        char *setting_name;
        char **hints;
        guint32 flags;
-       NMSecretAgentGetSecretsFunc get_callback;
-       NMSecretAgentSaveSecretsFunc save_callback;
-       NMSecretAgentDeleteSecretsFunc delete_callback;
+       NMSecretAgentOldGetSecretsFunc get_callback;
+       NMSecretAgentOldSaveSecretsFunc save_callback;
+       NMSecretAgentOldDeleteSecretsFunc delete_callback;
        gpointer callback_data;
 
        GCancellable *cancellable;
@@ -91,15 +91,15 @@ typedef struct {
 } Request;
 
 static Request *
-request_new (NMSecretAgent *agent,
+request_new (NMSecretAgentOld *agent,
              NMConnection *connection,
              const char *connection_path,
              const char *setting_name,
              const char **hints,
              guint32 flags,
-             NMSecretAgentGetSecretsFunc get_callback,
-             NMSecretAgentSaveSecretsFunc save_callback,
-             NMSecretAgentDeleteSecretsFunc delete_callback,
+             NMSecretAgentOldGetSecretsFunc get_callback,
+             NMSecretAgentOldSaveSecretsFunc save_callback,
+             NMSecretAgentOldDeleteSecretsFunc delete_callback,
              gpointer callback_data)
 {
        static guint32 counter = 1;
@@ -143,7 +143,7 @@ request_free (Request *r)
 /*******************************************************/
 
 static void
-get_save_cb (NMSecretAgent *agent,
+get_save_cb (NMSecretAgentOld *agent,
              NMConnection *connection,
              GError *error,
              gpointer user_data)
@@ -182,11 +182,11 @@ get_secrets_cb (AppletAgent *self,
                                nm_connection_update_secrets (dupl, setting_name, secrets, NULL);
 
                        /* And save updated secrets to the keyring */
-                       nm_secret_agent_save_secrets (NM_SECRET_AGENT (self), dupl, get_save_cb, NULL);
+                       nm_secret_agent_old_save_secrets (NM_SECRET_AGENT_OLD (self), dupl, get_save_cb, 
NULL);
                        g_object_unref (dupl);
                }
 
-               r->get_callback (NM_SECRET_AGENT (r->agent), r->connection, secrets, error, r->callback_data);
+               r->get_callback (NM_SECRET_AGENT_OLD (r->agent), r->connection, secrets, error, 
r->callback_data);
        }
        request_free (r);
 }
@@ -309,7 +309,7 @@ keyring_find_secrets_cb (GObject *source,
                goto done;
        } else if (search_error) {
                error = g_error_new (NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "%s.%d - failed to read secrets from keyring (%s)",
                                     __FILE__, __LINE__, search_error->message);
                g_error_free (search_error);
@@ -402,7 +402,7 @@ done:
                ask_for_secrets (r);
        } else {
                /* Otherwise send the secrets back to NetworkManager */
-               r->get_callback (NM_SECRET_AGENT (r->agent), r->connection, error ? NULL : settings, error, 
r->callback_data);
+               r->get_callback (NM_SECRET_AGENT_OLD (r->agent), r->connection, error ? NULL : settings, 
error, r->callback_data);
                request_free (r);
        }
 
@@ -412,13 +412,13 @@ done:
 }
 
 static void
-get_secrets (NMSecretAgent *agent,
+get_secrets (NMSecretAgentOld *agent,
              NMConnection *connection,
              const char *connection_path,
              const char *setting_name,
              const char **hints,
              guint32 flags,
-             NMSecretAgentGetSecretsFunc callback,
+             NMSecretAgentOldGetSecretsFunc callback,
              gpointer callback_data)
 {
        AppletAgentPrivate *priv = APPLET_AGENT_GET_PRIVATE (agent);
@@ -495,7 +495,7 @@ get_secrets (NMSecretAgent *agent,
 /*******************************************************/
 
 static void
-cancel_get_secrets (NMSecretAgent *agent,
+cancel_get_secrets (NMSecretAgentOld *agent,
                     const char *connection_path,
                     const char *setting_name)
 {
@@ -520,7 +520,7 @@ cancel_get_secrets (NMSecretAgent *agent,
                        /* cancel outstanding keyring operations */
                        g_cancellable_cancel (r->cancellable);
 
-                       r->get_callback (NM_SECRET_AGENT (r->agent), r->connection, NULL, error, 
r->callback_data);
+                       r->get_callback (NM_SECRET_AGENT_OLD (r->agent), r->connection, NULL, error, 
r->callback_data);
                        g_hash_table_remove (priv->requests, GUINT_TO_POINTER (r->id));
                        g_signal_emit (r->agent, signals[CANCEL_SECRETS], 0, GUINT_TO_POINTER (r->id));
                }
@@ -539,7 +539,7 @@ save_request_try_complete (Request *r)
         */
        if (r->keyring_calls == 0) {
                if (!g_cancellable_is_cancelled (r->cancellable))
-                       r->save_callback (NM_SECRET_AGENT (r->agent), r->connection, NULL, r->callback_data);
+                       r->save_callback (NM_SECRET_AGENT_OLD (r->agent), r->connection, NULL, 
r->callback_data);
                request_free (r);
        }
 }
@@ -678,7 +678,7 @@ write_one_secret_to_keyring (NMSetting *setting,
 }
 
 static void
-save_delete_cb (NMSecretAgent *agent,
+save_delete_cb (NMSecretAgentOld *agent,
                 NMConnection *connection,
                 GError *error,
                 gpointer user_data)
@@ -696,10 +696,10 @@ save_delete_cb (NMSecretAgent *agent,
 }
 
 static void
-save_secrets (NMSecretAgent *agent,
+save_secrets (NMSecretAgentOld *agent,
               NMConnection *connection,
               const char *connection_path,
-              NMSecretAgentSaveSecretsFunc callback,
+              NMSecretAgentOldSaveSecretsFunc callback,
               gpointer callback_data)
 {
        AppletAgentPrivate *priv = APPLET_AGENT_GET_PRIVATE (agent);
@@ -709,7 +709,7 @@ save_secrets (NMSecretAgent *agent,
        g_hash_table_insert (priv->requests, GUINT_TO_POINTER (r->id), r);
 
        /* First delete any existing items in the keyring */
-       nm_secret_agent_delete_secrets (agent, connection, save_delete_cb, r);
+       nm_secret_agent_old_delete_secrets (agent, connection, save_delete_cb, r);
 }
 
 /*******************************************************/
@@ -733,7 +733,7 @@ delete_find_items_cb (GObject *source,
        secret_password_clear_finish (result, &secret_error);
        if (secret_error != NULL) {
                error = g_error_new (NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The request could not be completed (%s)",
                                     secret_error->message);
                g_error_free (secret_error);
@@ -744,10 +744,10 @@ delete_find_items_cb (GObject *source,
 }
 
 static void
-delete_secrets (NMSecretAgent *agent,
+delete_secrets (NMSecretAgentOld *agent,
                 NMConnection *connection,
                 const char *connection_path,
-                NMSecretAgentDeleteSecretsFunc callback,
+                NMSecretAgentOldDeleteSecretsFunc callback,
                 gpointer callback_data)
 {
        AppletAgentPrivate *priv = APPLET_AGENT_GET_PRIVATE (agent);
@@ -786,15 +786,15 @@ applet_agent_new (void)
 {
        //return g_initable_new (APPLET_TYPE_AGENT, NULL, NULL,
        return g_object_new (APPLET_TYPE_AGENT,
-                              NM_SECRET_AGENT_IDENTIFIER, "org.freedesktop.nm-applet",
-                              NM_SECRET_AGENT_CAPABILITIES, NM_SECRET_AGENT_CAPABILITY_VPN_HINTS,
+                              NM_SECRET_AGENT_OLD_IDENTIFIER, "org.freedesktop.nm-applet",
+                              NM_SECRET_AGENT_OLD_CAPABILITIES, NM_SECRET_AGENT_CAPABILITY_VPN_HINTS,
                               NULL);
 }
 
 #if 0
 FIXME
 static void
-agent_registration_result_cb (NMSecretAgent *agent, GError *error, gpointer user_data)
+agent_registration_result_cb (NMSecretAgentOld *agent, GError *error, gpointer user_data)
 {
        if (error)
                g_warning ("Failed to register as an agent: (%d) %s", error->code, error->message);
@@ -807,9 +807,6 @@ applet_agent_init (AppletAgent *self)
        AppletAgentPrivate *priv = APPLET_AGENT_GET_PRIVATE (self);
 
        priv->requests = g_hash_table_new (g_direct_hash, g_direct_equal);
-
-////   g_signal_connect (self, NM_SECRET_AGENT_REGISTRATION_RESULT,
-////                     G_CALLBACK (agent_registration_result_cb), NULL);
 }
 
 static void
@@ -838,7 +835,7 @@ static void
 applet_agent_class_init (AppletAgentClass *agent_class)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (agent_class);
-       NMSecretAgentClass *parent_class = NM_SECRET_AGENT_CLASS (agent_class);
+       NMSecretAgentOldClass *parent_class = NM_SECRET_AGENT_OLD_CLASS (agent_class);
 
        g_type_class_add_private (agent_class, sizeof (AppletAgentPrivate));
 
diff --git a/src/applet-agent.h b/src/applet-agent.h
index f82de43..e9cc5f2 100644
--- a/src/applet-agent.h
+++ b/src/applet-agent.h
@@ -23,6 +23,7 @@
 #define _APPLET_AGENT_H_
 
 #include <NetworkManager.h>
+#include <nm-secret-agent-old.h>
 
 #define APPLET_TYPE_AGENT            (applet_agent_get_type ())
 #define APPLET_AGENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLET_TYPE_AGENT, AppletAgent))
@@ -35,7 +36,7 @@
 #define APPLET_AGENT_CANCEL_SECRETS "cancel-secrets"
 
 typedef struct {
-       NMSecretAgent parent;
+       NMSecretAgentOld parent;
 } AppletAgent;
 
 typedef void (*AppletAgentSecretsCallback) (AppletAgent *self,
@@ -44,7 +45,7 @@ typedef void (*AppletAgentSecretsCallback) (AppletAgent *self,
                                             gpointer user_data);
 
 typedef struct {
-       NMSecretAgentClass parent_class;
+       NMSecretAgentOldClass parent_class;
 
        void (*get_secrets)        (AppletAgent *self,
                                    void *request_id,
diff --git a/src/applet-device-bond.c b/src/applet-device-bond.c
index cbc40d5..6dc08cc 100644
--- a/src/applet-device-bond.c
+++ b/src/applet-device-bond.c
@@ -36,7 +36,7 @@
 static void
 bond_add_menu_item (NMDevice *device,
                     gboolean multiple_devices,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMConnection *active,
                     GtkWidget *menu,
                     NMApplet *applet)
@@ -44,7 +44,7 @@ bond_add_menu_item (NMDevice *device,
        char *text;
        GtkWidget *item;
 
-       text = nma_utils_get_connection_device_name (connections->data);
+       text = nma_utils_get_connection_device_name (connections->pdata[0]);
        item = applet_menu_item_create_device_item_helper (device, applet, text);
        g_free (text);
 
@@ -52,8 +52,7 @@ bond_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
-               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
+       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
 
        /* Notify user of unmanaged or unavailable device */
        if (device) {
@@ -65,11 +64,10 @@ bond_add_menu_item (NMDevice *device,
        }
 
        if (!device || !nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if (!active || connections->len > 1)
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
-                       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, 
menu, applet);
+               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, menu, 
applet);
        }
 }
 
diff --git a/src/applet-device-bridge.c b/src/applet-device-bridge.c
index c018a4d..54346b2 100644
--- a/src/applet-device-bridge.c
+++ b/src/applet-device-bridge.c
@@ -36,7 +36,7 @@
 static void
 bridge_add_menu_item (NMDevice *device,
                       gboolean multiple_devices,
-                      GSList *connections,
+                      const GPtrArray *connections,
                       NMConnection *active,
                       GtkWidget *menu,
                       NMApplet *applet)
@@ -44,7 +44,7 @@ bridge_add_menu_item (NMDevice *device,
        char *text;
        GtkWidget *item;
 
-       text = nma_utils_get_connection_device_name (connections->data);
+       text = nma_utils_get_connection_device_name (connections->pdata[0]);
        item = applet_menu_item_create_device_item_helper (device, applet, text);
        g_free (text);
 
@@ -52,8 +52,7 @@ bridge_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
-               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
+       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
 
        /* Notify user of unmanaged or unavailable device */
        if (device) {
@@ -65,11 +64,10 @@ bridge_add_menu_item (NMDevice *device,
        }
 
        if (!device || !nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if (!active || connections->len > 1)
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
-                       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, 
menu, applet);
+               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, menu, 
applet);
        }
 }
 
diff --git a/src/applet-device-broadband.c b/src/applet-device-broadband.c
index 2300c0d..466d4fb 100644
--- a/src/applet-device-broadband.c
+++ b/src/applet-device-broadband.c
@@ -27,9 +27,7 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
-#include <nm-device.h>
-#include <nm-device-modem.h>
-#include <nm-utils.h>
+#include <NetworkManager.h>
 
 #include "applet.h"
 #include "applet-device-broadband.h"
@@ -81,14 +79,16 @@ typedef struct {
 } ConnectNetworkInfo;
 
 static void
-add_and_activate_connection_done (NMClient *client,
-                                  NMActiveConnection *active,
-                                  const char *connection_path,
-                                  GError *error,
+add_and_activate_connection_done (GObject *client,
+                                  GAsyncResult *result,
                                   gpointer user_data)
 {
-       if (error)
+       GError *error = NULL;
+
+       if (!nm_client_add_and_activate_connection_finish (NM_CLIENT (client), result, &error)) {
                g_warning ("Failed to add/activate connection: (%d) %s", error->code, error->message);
+               g_error_free (error);
+       }
 }
 
 static void
@@ -105,12 +105,13 @@ wizard_done (NMConnection *connection,
                /* Ask NM to add the new connection and activate it; NM will fill in the
                 * missing details based on the specific object and the device.
                 */
-               nm_client_add_and_activate_connection (info->applet->nm_client,
-                                                      connection,
-                                                      info->device,
-                                                      "/",
-                                                      add_and_activate_connection_done,
-                                                      info->applet);
+               nm_client_add_and_activate_connection_async (info->applet->nm_client,
+                                                            connection,
+                                                            info->device,
+                                                            "/",
+                                                            NULL,
+                                                            add_and_activate_connection_done,
+                                                            info->applet);
        }
 
        g_object_unref (info->device);
@@ -464,7 +465,7 @@ get_secrets (SecretsRequest *req,
        if (!device) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): failed to find device for active connection.",
                             __FILE__, __LINE__, __func__);
                return FALSE;
@@ -697,7 +698,7 @@ add_connection_item (NMDevice *device,
 static void
 add_menu_item (NMDevice *device,
                gboolean multiple_devices,
-               GSList *connections,
+               const GPtrArray *connections,
                NMConnection *active,
                GtkWidget *menu,
                NMApplet *applet)
@@ -705,7 +706,7 @@ add_menu_item (NMDevice *device,
        BroadbandDeviceInfo *info;
        char *text;
        GtkWidget *item;
-       GSList *iter;
+       int i;
 
        info = g_object_get_data (G_OBJECT (device), "devinfo");
 
@@ -766,12 +767,12 @@ add_menu_item (NMDevice *device,
 
        /* Add the default / inactive connection items */
        if (!nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if ((!active && connections->len) || (active && connections->len > 1))
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections)) {
-                       for (iter = connections; iter; iter = g_slist_next (iter)) {
-                               NMConnection *connection = NM_CONNECTION (iter->data);
+               if (connections->len) {
+                       for (i = 0; i < connections->len; i++) {
+                               NMConnection *connection = NM_CONNECTION (connections->pdata[i]);
 
                                if (connection != active) {
                                        item = applet_new_menu_item_helper (connection, NULL, FALSE);
diff --git a/src/applet-device-bt.c b/src/applet-device-bt.c
index a641478..186413b 100644
--- a/src/applet-device-bt.c
+++ b/src/applet-device-bt.c
@@ -47,7 +47,7 @@ bt_new_auto_connection (NMDevice *device,
 static void
 bt_add_menu_item (NMDevice *device,
                   gboolean multiple__devices,
-                  GSList *connections,
+                  const GPtrArray *connections,
                   NMConnection *active,
                   GtkWidget *menu,
                   NMApplet *applet)
@@ -65,7 +65,7 @@ bt_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
+       if (connections->len)
                applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
 
        /* Notify user of unmanaged or unavailable device */
@@ -77,7 +77,7 @@ bt_add_menu_item (NMDevice *device,
 
        if (!nma_menu_device_check_unusable (device)) {
                /* Add menu items for existing bluetooth connections for this device */
-               if (g_slist_length (connections)) {
+               if (connections->len) {
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
                        applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, 
menu, applet);
                }
@@ -183,14 +183,14 @@ get_bt_secrets_cb (GtkDialog *dialog,
                } else {
                        g_set_error (&error,
                                         NM_SECRET_AGENT_ERROR,
-                                        NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                        NM_SECRET_AGENT_ERROR_FAILED,
                                         "%s.%d (%s): unhandled setting '%s'",
                                         __FILE__, __LINE__, __func__, req->setting_name);
                }
        } else {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): canceled",
                             __FILE__, __LINE__, __func__);
        }
@@ -212,7 +212,7 @@ bt_get_secrets (SecretsRequest *req, GError **error)
        if (!req->hints || !g_strv_length (req->hints)) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): missing secrets hints.",
                             __FILE__, __LINE__, __func__);
                return FALSE;
@@ -225,7 +225,7 @@ bt_get_secrets (SecretsRequest *req, GError **error)
        else {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): unknown secrets hint '%s'.",
                             __FILE__, __LINE__, __func__, info->secret_name);
                return FALSE;
@@ -236,7 +236,7 @@ bt_get_secrets (SecretsRequest *req, GError **error)
        if (!widget || !secret_entry) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): error asking for CDMA secrets.",
                             __FILE__, __LINE__, __func__);
                return FALSE;
diff --git a/src/applet-device-cdma.c b/src/applet-device-cdma.c
index 99094d3..eea44e5 100644
--- a/src/applet-device-cdma.c
+++ b/src/applet-device-cdma.c
@@ -225,7 +225,7 @@ cdma_act_to_mb_act (CdmaDeviceInfo *info)
 static void
 cdma_add_menu_item (NMDevice *device,
                     gboolean multiple_devices,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMConnection *active,
                     GtkWidget *menu,
                     NMApplet *applet)
@@ -233,7 +233,7 @@ cdma_add_menu_item (NMDevice *device,
        CdmaDeviceInfo *info;
        char *text;
        GtkWidget *item;
-       GSList *iter;
+       int i;
 
        info = g_object_get_data (G_OBJECT (device), "devinfo");
 
@@ -294,12 +294,12 @@ cdma_add_menu_item (NMDevice *device,
 
        /* Add the default / inactive connection items */
        if (!nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if ((!active && connections->len) || (active && connections->len > 1))
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections)) {
-                       for (iter = connections; iter; iter = g_slist_next (iter)) {
-                               NMConnection *connection = NM_CONNECTION (iter->data);
+               if (connections->len) {
+                       for (i = 0; i < connections->len; i++) {
+                               NMConnection *connection = NM_CONNECTION (connections->pdata[i]);
 
                                if (connection != active) {
                                        item = applet_new_menu_item_helper (connection, NULL, FALSE);
diff --git a/src/applet-device-ethernet.c b/src/applet-device-ethernet.c
index 570509a..badbbbb 100644
--- a/src/applet-device-ethernet.c
+++ b/src/applet-device-ethernet.c
@@ -70,7 +70,7 @@ ethernet_new_auto_connection (NMDevice *device,
 static void
 ethernet_add_menu_item (NMDevice *device,
                         gboolean multiple_devices,
-                        GSList *connections,
+                        const GPtrArray *connections,
                         NMConnection *active,
                         GtkWidget *menu,
                         NMApplet *applet)
@@ -84,12 +84,12 @@ ethernet_add_menu_item (NMDevice *device,
 
                desc = nma_utils_get_device_description (device);
 
-               if (g_slist_length (connections) > 1)
+               if (connections->len > 1)
                        text = g_strdup_printf (_("Ethernet Networks (%s)"), desc);
                else
                        text = g_strdup_printf (_("Ethernet Network (%s)"), desc);
        } else {
-               if (g_slist_length (connections) > 1)
+               if (connections->len > 1)
                        text = g_strdup (_("Ethernet Networks"));
                else
                        text = g_strdup (_("Ethernet Network"));
@@ -108,7 +108,7 @@ ethernet_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
+       if (connections->len)
                applet_add_connection_items (device, connections, carrier, active, NMA_ADD_ACTIVE, menu, 
applet);
 
        /* Notify user of unmanaged or unavailable device */
@@ -119,10 +119,10 @@ ethernet_add_menu_item (NMDevice *device,
        }
 
        if (!nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if ((!active && connections->len) || (active && connections->len > 1))
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
+               if (connections->len)
                        applet_add_connection_items (device, connections, carrier, active, NMA_ADD_INACTIVE, 
menu, applet);
                else
                        applet_add_default_connection_item (device, DEFAULT_ETHERNET_NAME, carrier, menu, 
applet);
@@ -291,7 +291,7 @@ get_pppoe_secrets_cb (GtkDialog *dialog, gint response, gpointer user_data)
        if (!secrets) {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                                         "%s.%d (%s): failed to hash setting " NM_SETTING_PPPOE_SETTING_NAME,
                                         __FILE__, __LINE__, __func__);
        }
@@ -328,7 +328,7 @@ pppoe_get_secrets (SecretsRequest *req, GError **error)
        if (!gtk_builder_add_from_file (builder, UIDIR "/ce-page-dsl.ui", &tmp_error)) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                                         "%s.%d (%s): couldn't display secrets UI: %s",
                             __FILE__, __LINE__, __func__, tmp_error->message);
                g_error_free (tmp_error);
@@ -412,7 +412,7 @@ get_8021x_secrets_cb (GtkDialog *dialog, gint response, gpointer user_data)
        if (!connection) {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): couldn't get connection from ethernet dialog.",
                             __FILE__, __LINE__, __func__);
                goto done;
@@ -424,7 +424,7 @@ get_8021x_secrets_cb (GtkDialog *dialog, gint response, gpointer user_data)
        } else {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                                         "%s.%d (%s): requested setting '802-1x' didn't"
                                         " exist in the connection.",
                                         __FILE__, __LINE__, __func__);
@@ -447,7 +447,7 @@ nm_8021x_get_secrets (SecretsRequest *req, GError **error)
        if (!info->dialog) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): couldn't display secrets UI",
                             __FILE__, __LINE__, __func__);
                return FALSE;
@@ -486,7 +486,7 @@ ethernet_get_secrets (SecretsRequest *req, GError **error)
        else {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): unhandled ethernet connection type '%s'",
                             __FILE__, __LINE__, __func__, ctype);
        }
diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c
index 8476563..a26f521 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -280,7 +280,7 @@ gsm_act_to_mb_act (GsmDeviceInfo *info)
 static void
 gsm_add_menu_item (NMDevice *device,
                    gboolean multiple_devices,
-                   GSList *connections,
+                   const GPtrArray *connections,
                    NMConnection *active,
                    GtkWidget *menu,
                    NMApplet *applet)
@@ -288,7 +288,7 @@ gsm_add_menu_item (NMDevice *device,
        GsmDeviceInfo *info;
        char *text;
        GtkWidget *item;
-       GSList *iter;
+       int i;
 
        info = g_object_get_data (G_OBJECT (device), "devinfo");
 
@@ -349,12 +349,12 @@ gsm_add_menu_item (NMDevice *device,
 
        /* Add the default / inactive connection items */
        if (!nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if ((!active && connections->len) || (active && connections->len > 1))
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections)) {
-                       for (iter = connections; iter; iter = g_slist_next (iter)) {
-                               NMConnection *connection = NM_CONNECTION (iter->data);
+               if (connections->len) {
+                       for (i = 0; i < connections->len; i++) {
+                               NMConnection *connection = NM_CONNECTION (connections->pdata[i]);
 
                                if (connection != active) {
                                        item = applet_new_menu_item_helper (connection, NULL, FALSE);
@@ -431,7 +431,7 @@ gsm_get_secrets (SecretsRequest *req, GError **error)
        if (!device) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): failed to find device for active connection.",
                             __FILE__, __LINE__, __func__);
                return FALSE;
diff --git a/src/applet-device-infiniband.c b/src/applet-device-infiniband.c
index 65bfafd..790a2f8 100644
--- a/src/applet-device-infiniband.c
+++ b/src/applet-device-infiniband.c
@@ -68,7 +68,7 @@ infiniband_new_auto_connection (NMDevice *device,
 static void
 infiniband_add_menu_item (NMDevice *device,
                           gboolean multiple_devices,
-                          GSList *connections,
+                          const GPtrArray *connections,
                           NMConnection *active,
                           GtkWidget *menu,
                           NMApplet *applet)
@@ -82,12 +82,12 @@ infiniband_add_menu_item (NMDevice *device,
 
                desc = nma_utils_get_device_description (device);
 
-               if (g_slist_length (connections) > 1)
+               if (connections->len > 1)
                        text = g_strdup_printf (_("InfiniBand Networks (%s)"), desc);
                else
                        text = g_strdup_printf (_("InfiniBand Network (%s)"), desc);
        } else {
-               if (g_slist_length (connections) > 1)
+               if (connections->len > 1)
                        text = g_strdup (_("InfiniBand Networks"));
                else
                        text = g_strdup (_("InfiniBand Network"));
@@ -106,7 +106,7 @@ infiniband_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
+       if (connections->len)
                applet_add_connection_items (device, connections, carrier, active, NMA_ADD_ACTIVE, menu, 
applet);
 
        /* Notify user of unmanaged or unavailable device */
@@ -117,10 +117,10 @@ infiniband_add_menu_item (NMDevice *device,
        }
 
        if (!nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if ((!active && connections->len) || (active && connections->len > 1))
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
+               if (connections->len)
                        applet_add_connection_items (device, connections, carrier, active, NMA_ADD_INACTIVE, 
menu, applet);
                else
                        applet_add_default_connection_item (device, DEFAULT_INFINIBAND_NAME, carrier, menu, 
applet);
diff --git a/src/applet-device-team.c b/src/applet-device-team.c
index 6110772..e61b040 100644
--- a/src/applet-device-team.c
+++ b/src/applet-device-team.c
@@ -33,7 +33,7 @@
 static void
 team_add_menu_item (NMDevice *device,
                     gboolean multiple_devices,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMConnection *active,
                     GtkWidget *menu,
                     NMApplet *applet)
@@ -41,7 +41,7 @@ team_add_menu_item (NMDevice *device,
        char *text;
        GtkWidget *item;
 
-       text = nma_utils_get_connection_device_name (connections->data);
+       text = nma_utils_get_connection_device_name (connections->pdata[0]);
        item = applet_menu_item_create_device_item_helper (device, applet, text);
        g_free (text);
 
@@ -49,8 +49,7 @@ team_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
-               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
+       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_ACTIVE, menu, applet);
 
        /* Notify user of unmanaged or unavailable device */
        if (device) {
@@ -62,11 +61,10 @@ team_add_menu_item (NMDevice *device,
        }
 
        if (!device || !nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if (!active || connections->len > 1)
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
-                       applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, 
menu, applet);
+               applet_add_connection_items (device, connections, TRUE, active, NMA_ADD_INACTIVE, menu, 
applet);
        }
 }
 
diff --git a/src/applet-device-vlan.c b/src/applet-device-vlan.c
index e4d0e2f..2b4b0fc 100644
--- a/src/applet-device-vlan.c
+++ b/src/applet-device-vlan.c
@@ -76,18 +76,18 @@ find_device_by_mac (const GByteArray *mac, const GPtrArray *devices)
 }
 
 static NMDevice *
-find_vlan_parent (GSList *connections, NMApplet *applet)
+find_vlan_parent (const GPtrArray *connections, NMApplet *applet)
 {
        const GPtrArray *devices;
        NMDevice *parent_device;
-       GSList *iter;
+       int i;
 
        devices = nm_client_get_devices (applet->nm_client);
        if (!devices)
                return NULL;
 
-       for (iter = connections; iter; iter = iter->next) {
-               NMConnection *connection = iter->data;
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *connection = connections->pdata[i];
                NMSettingVlan *s_vlan;
                const char *parent;
 
@@ -135,7 +135,7 @@ find_vlan_parent (GSList *connections, NMApplet *applet)
 static void
 vlan_add_menu_item (NMDevice *device,
                     gboolean multiple_devices,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMConnection *active,
                     GtkWidget *menu,
                     NMApplet *applet)
@@ -144,7 +144,7 @@ vlan_add_menu_item (NMDevice *device,
        GtkWidget *item;
        gboolean carrier = TRUE;
 
-       text = nma_utils_get_connection_device_name (connections->data);
+       text = nma_utils_get_connection_device_name (connections->pdata[0]);
        item = applet_menu_item_create_device_item_helper (device, applet, text);
        g_free (text);
 
@@ -165,8 +165,7 @@ vlan_add_menu_item (NMDevice *device,
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       if (g_slist_length (connections))
-               applet_add_connection_items (device, connections, carrier, active, NMA_ADD_ACTIVE, menu, 
applet);
+       applet_add_connection_items (device, connections, carrier, active, NMA_ADD_ACTIVE, menu, applet);
 
        /* Notify user of unmanaged or unavailable device */
        if (device) {
@@ -178,10 +177,10 @@ vlan_add_menu_item (NMDevice *device,
        }
 
        if (!device || !nma_menu_device_check_unusable (device)) {
-               if ((!active && g_slist_length (connections)) || (active && g_slist_length (connections) > 1))
+               if (!active || connections->len > 1)
                        applet_menu_item_add_complex_separator_helper (menu, applet, _("Available"), -1);
 
-               if (g_slist_length (connections))
+               if (connections->len)
                        applet_add_connection_items (device, connections, carrier, active, NMA_ADD_INACTIVE, 
menu, applet);
        }
 }
diff --git a/src/applet-device-wifi.c b/src/applet-device-wifi.c
index 88cba2a..f282913 100644
--- a/src/applet-device-wifi.c
+++ b/src/applet-device-wifi.c
@@ -67,7 +67,7 @@ applet_wifi_connect_to_hidden_network (NMApplet *applet)
 {
        GtkWidget *dialog;
 
-       dialog = nma_wifi_dialog_new_for_hidden (applet->nm_client, applet->settings);
+       dialog = nma_wifi_dialog_new_for_hidden (applet->nm_client);
        if (dialog) {
                g_signal_connect (dialog, "response",
                                  G_CALLBACK (wifi_dialog_response_cb),
@@ -118,7 +118,7 @@ applet_wifi_create_wifi_network (NMApplet *applet)
 {
        GtkWidget *dialog;
 
-       dialog = nma_wifi_dialog_new_for_create (applet->nm_client, applet->settings);
+       dialog = nma_wifi_dialog_new_for_create (applet->nm_client);
        if (dialog) {
                g_signal_connect (dialog, "response",
                                  G_CALLBACK (wifi_dialog_response_cb),
@@ -448,7 +448,7 @@ _do_new_auto_connection (NMApplet *applet,
                more_info->callback = callback;
                more_info->callback_data = callback_data;
 
-               dialog = nma_wifi_dialog_new (applet->nm_client, applet->settings, connection, device, ap, 
FALSE);
+               dialog = nma_wifi_dialog_new (applet->nm_client, connection, device, ap, FALSE);
                if (dialog) {
                        g_signal_connect (dialog, "response",
                                              G_CALLBACK (more_info_wifi_dialog_response_cb),
@@ -526,24 +526,23 @@ static NMNetworkMenuItem *
 create_new_ap_item (NMDeviceWifi *device,
                     NMAccessPoint *ap,
                     struct dup_data *dup_data,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMApplet *applet)
 {
        WifiMenuItemInfo *info;
-       GSList *iter;
+       int i;
        NMNetworkMenuItem *item = NULL;
-       GSList *dev_connections = NULL;
-       GSList *ap_connections = NULL;
+       GPtrArray *dev_connections;
+       GPtrArray *ap_connections;
        GBytes *ssid;
        guint32 dev_caps;
 
        dev_connections = nm_device_filter_connections (NM_DEVICE (device), connections);
        ap_connections = nm_access_point_filter_connections (ap, dev_connections);
-       g_slist_free (dev_connections);
-       dev_connections = NULL;
+       g_ptr_array_unref (dev_connections);
 
        item = NM_NETWORK_MENU_ITEM (nm_network_menu_item_new (dup_data->hash,
-                                                              !!g_slist_length (ap_connections)));
+                                                              ap_connections->len != 0));
        gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
 
        ssid = nm_access_point_get_ssid (ap);
@@ -558,13 +557,13 @@ create_new_ap_item (NMDeviceWifi *device,
        g_object_set_data (G_OBJECT (item), "device", NM_DEVICE (device));
 
        /* If there's only one connection, don't show the submenu */
-       if (g_slist_length (ap_connections) > 1) {
+       if (ap_connections->len > 1) {
                GtkWidget *submenu;
 
                submenu = gtk_menu_new ();
 
-               for (iter = ap_connections; iter; iter = g_slist_next (iter)) {
-                       NMConnection *connection = NM_CONNECTION (iter->data);
+               for (i = 0; i < ap_connections->len; i++) {
+                       NMConnection *connection = NM_CONNECTION (ap_connections->pdata[i]);
                        NMSettingConnection *s_con;
                        GtkWidget *subitem;
 
@@ -594,9 +593,9 @@ create_new_ap_item (NMDeviceWifi *device,
                info->device = g_object_ref (G_OBJECT (device));
                info->ap = g_object_ref (G_OBJECT (ap));
 
-               if (g_slist_length (ap_connections) == 1) {
-                       connection = NM_CONNECTION (g_slist_nth_data (ap_connections, 0));
-                       info->connection = g_object_ref (G_OBJECT (connection));
+               if (ap_connections->len == 1) {
+                       connection = NM_CONNECTION (ap_connections->pdata[0]);
+                       info->connection = g_object_ref (connection);
                }
 
                g_signal_connect_data (GTK_WIDGET (item),
@@ -607,14 +606,14 @@ create_new_ap_item (NMDeviceWifi *device,
                                       0);
        }
 
-       g_slist_free (ap_connections);
+       g_ptr_array_unref (ap_connections);
        return item;
 }
 
 static NMNetworkMenuItem *
 get_menu_item_for_ap (NMDeviceWifi *device,
                       NMAccessPoint *ap,
-                      GSList *connections,
+                      const GPtrArray *connections,
                       GSList *menu_list,
                       NMApplet *applet)
 {
@@ -738,7 +737,7 @@ sort_toplevel (gconstpointer tmpa, gconstpointer tmpb)
 static void
 wifi_add_menu_item (NMDevice *device,
                     gboolean multiple_devices,
-                    GSList *connections,
+                    const GPtrArray *connections,
                     NMConnection *active,
                     GtkWidget *menu,
                     NMApplet *applet)
@@ -985,8 +984,8 @@ idle_check_avail_access_point_notification (gpointer datap)
        NMDeviceWifi *device = data->device;
        int i;
        const GPtrArray *aps;
-       GSList *all_connections;
-       GSList *connections;
+       GPtrArray *all_connections;
+       GPtrArray *connections;
        GTimeVal timeval;
        gboolean have_unused_access_point = FALSE;
        gboolean have_no_autoconnect_points = TRUE;
@@ -1003,18 +1002,17 @@ idle_check_avail_access_point_notification (gpointer datap)
 
        all_connections = applet_get_all_connections (applet);
        connections = nm_device_filter_connections (NM_DEVICE (device), all_connections);
-       g_slist_free (all_connections); 
-       all_connections = NULL;
+       g_ptr_array_unref (all_connections);    
 
        aps = nm_device_wifi_get_access_points (device);
-       for (i = 0; aps && (i < aps->len); i++) {
+       for (i = 0; i < aps->len; i++) {
                NMAccessPoint *ap = aps->pdata[i];
-               GSList *ap_connections = nm_access_point_filter_connections (ap, connections);
-               GSList *iter;
+               GPtrArray *ap_connections = nm_access_point_filter_connections (ap, connections);
+               int a;
                gboolean is_autoconnect = FALSE;
 
-               for (iter = ap_connections; iter; iter = g_slist_next (iter)) {
-                       NMConnection *connection = NM_CONNECTION (iter->data);
+               for (a = 0; a < ap_connections->len; a++) {
+                       NMConnection *connection = NM_CONNECTION (ap_connections->pdata[a]);
                        NMSettingConnection *s_con;
 
                        s_con = nm_connection_get_setting_connection (connection);
@@ -1023,14 +1021,14 @@ idle_check_avail_access_point_notification (gpointer datap)
                                break;
                        }
                }
-               g_slist_free (ap_connections);
+               g_ptr_array_unref (ap_connections);
 
                if (!is_autoconnect)
                        have_unused_access_point = TRUE;
                else
                        have_no_autoconnect_points = FALSE;
        }
-       g_slist_free (connections);
+       g_ptr_array_unref (connections);
 
        if (!(have_unused_access_point && have_no_autoconnect_points))
                return FALSE;
@@ -1102,7 +1100,7 @@ access_point_removed_cb (NMDeviceWifi *device,
 }
 
 static void
-on_new_connection (NMRemoteSettings *settings,
+on_new_connection (NMClient *client,
                    NMRemoteConnection *connection,
                    gpointer datap)
 {
@@ -1114,13 +1112,13 @@ static void
 free_ap_notification_data (gpointer user_data)
 {
        struct ap_notification_data *data = user_data;
-       NMRemoteSettings *settings = applet_get_settings (data->applet);
+       NMClient *client = data->applet->nm_client;
 
        if (data->id)
                g_source_remove (data->id);
 
-       if (settings)
-               g_signal_handler_disconnect (settings, data->new_con_id);
+       if (client)
+               g_signal_handler_disconnect (client, data->new_con_id);
        memset (data, 0, sizeof (*data));
        g_free (data);
 }
@@ -1155,12 +1153,12 @@ wifi_device_added (NMDevice *device, NMApplet *applet)
        data = g_new0 (struct ap_notification_data, 1);
        data->applet = applet;
        data->device = wdev;
-       /* We also need to hook up to the settings to find out when we have new connections
+       /* We also need to hook up to the client to find out when we have new connections
         * that might be candididates.  Keep the ID around so we can disconnect
         * when the device is destroyed.
         */ 
-       id = g_signal_connect (applet_get_settings (applet),
-                              NM_REMOTE_SETTINGS_CONNECTION_ADDED,
+       id = g_signal_connect (applet->nm_client,
+                              NM_CLIENT_CONNECTION_ADDED,
                               G_CALLBACK (on_new_connection),
                               data);
        data->new_con_id = id;
@@ -1374,7 +1372,8 @@ wifi_dialog_response_cb (GtkDialog *foo,
        NMConnection *connection = NULL, *fuzzy_match = NULL;
        NMDevice *device = NULL;
        NMAccessPoint *ap = NULL;
-       GSList *all, *iter;
+       GPtrArray *all;
+       int i;
 
        if (response != GTK_RESPONSE_OK)
                goto done;
@@ -1388,15 +1387,15 @@ wifi_dialog_response_cb (GtkDialog *foo,
 
        /* Find a similar connection and use that instead */
        all = applet_get_all_connections (applet);
-       for (iter = all; iter; iter = g_slist_next (iter)) {
+       for (i = 0; i < all->len; i++) {
                if (nm_connection_compare (connection,
-                                          NM_CONNECTION (iter->data),
+                                          NM_CONNECTION (all->pdata[i]),
                                           (NM_SETTING_COMPARE_FLAG_FUZZY | 
NM_SETTING_COMPARE_FLAG_IGNORE_ID))) {
-                       fuzzy_match = NM_CONNECTION (iter->data);
+                       fuzzy_match = NM_CONNECTION (all->pdata[i]);
                        break;
                }
        }
-       g_slist_free (all);
+       g_ptr_array_unref (all);
 
        if (fuzzy_match) {
                nm_client_activate_connection_async (applet->nm_client,
@@ -1512,7 +1511,7 @@ get_secrets_dialog_response_cb (GtkDialog *foo,
        if (!connection) {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): couldn't get connection from Wi-Fi dialog.",
                             __FILE__, __LINE__, __func__);
                goto done;
@@ -1534,7 +1533,7 @@ get_secrets_dialog_response_cb (GtkDialog *foo,
        if (!secrets) {
                g_set_error (&error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): failed to hash connection '%s'.",
                             __FILE__, __LINE__, __func__, nm_connection_get_id (connection));
        }
@@ -1585,7 +1584,7 @@ wifi_get_secrets (SecretsRequest *req, GError **error)
 
        applet_secrets_request_set_free_func (req, free_wifi_info);
 
-       info->dialog = nma_wifi_dialog_new (req->applet->nm_client, req->applet->settings, req->connection, 
NULL, NULL, TRUE);
+       info->dialog = nma_wifi_dialog_new (req->applet->nm_client, req->connection, NULL, NULL, TRUE);
        if (info->dialog) {
                g_signal_connect (info->dialog, "response",
                                  G_CALLBACK (get_secrets_dialog_response_cb),
@@ -1594,7 +1593,7 @@ wifi_get_secrets (SecretsRequest *req, GError **error)
        } else {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): couldn't display secrets UI",
                             __FILE__, __LINE__, __func__);
        }
diff --git a/src/applet-device-wimax.c b/src/applet-device-wimax.c
index 195588a..1e98e5c 100644
--- a/src/applet-device-wimax.c
+++ b/src/applet-device-wimax.c
@@ -163,14 +163,14 @@ new_nsp_menu_item (NMDeviceWimax *device,
 }
 
 static NMConnection *
-get_connection_for_nsp (GSList *connections, NMWimaxNsp *nsp)
+get_connection_for_nsp (const GPtrArray *connections, NMWimaxNsp *nsp)
 {
-       GSList *iter;
+       int i;
        const char *nsp_name, *candidate_name;
 
        nsp_name = nm_wimax_nsp_get_name (nsp);
-       for (iter = connections; iter; iter = g_slist_next (iter)) {
-               NMConnection *candidate = NM_CONNECTION (iter->data);
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *candidate = NM_CONNECTION (connections->pdata[i]);
                NMSettingWimax *s_wimax;
 
                s_wimax = nm_connection_get_setting_wimax (candidate);
@@ -199,7 +199,7 @@ sort_nsps (gconstpointer a, gconstpointer b)
 static void
 wimax_add_menu_item (NMDevice *device,
                      gboolean multiple_devices,
-                     GSList *connections,
+                     const GPtrArray *connections,
                      NMConnection *active,
                      GtkWidget *menu,
                      NMApplet *applet)
diff --git a/src/applet-dialogs.c b/src/applet-dialogs.c
index 28ae13a..aa030b0 100644
--- a/src/applet-dialogs.c
+++ b/src/applet-dialogs.c
@@ -59,27 +59,6 @@ ip4_address_as_string (guint32 ip)
        return ip_string;
 }
 
-static gchar *
-ip6_address_as_string (const struct in6_addr *ip)
-{
-       char buf[INET6_ADDRSTRLEN];
-
-       memset (&buf, '\0', sizeof (buf));
-
-       if (inet_ntop (AF_INET6, ip, buf, INET6_ADDRSTRLEN)) {
-               return g_strdup (buf);
-       } else {
-               int j;
-               GString *ip6_str = g_string_new (NULL);
-               g_string_append_printf (ip6_str, "%02X", ip->s6_addr[0]);
-               for (j = 1; j < 16; j++)
-                       g_string_append_printf (ip6_str, " %02X", ip->s6_addr[j]);
-               g_warning ("%s: error converting IP6 address %s", __func__, ip6_str->str);
-               g_string_free (ip6_str, TRUE);
-               return NULL;
-       }
-}
-
 static char *
 get_eap_label (NMSettingWirelessSecurity *sec,
                           NMSetting8021x *s_8021x)
@@ -128,30 +107,6 @@ out:
 }
 
 static NMConnection *
-get_connection_for_active (NMApplet *applet, NMActiveConnection *active)
-{
-       GSList *list, *iter;
-       NMConnection *connection = NULL;
-       const char *path;
-
-       path = nm_active_connection_get_connection (active);
-       g_return_val_if_fail (path != NULL, NULL);
-
-       list = applet_get_all_connections (applet);
-       for (iter = list; iter; iter = g_slist_next (iter)) {
-               NMConnection *candidate = NM_CONNECTION (iter->data);
-
-               if (!strcmp (nm_connection_get_path (candidate), path)) {
-                       connection = candidate;
-                       break;
-               }
-       }
-       g_slist_free (list);
-
-       return connection;
-}
-
-static NMConnection *
 get_connection_for_active_path (NMApplet *applet, const char *active_path)
 {
        NMActiveConnection *active = NULL;
@@ -172,7 +127,7 @@ get_connection_for_active_path (NMApplet *applet, const char *active_path)
                }
        }
 
-       return active ? get_connection_for_active (applet, active) : NULL;
+       return active ? (NMConnection *) nm_active_connection_get_connection (active) : NULL;
 }
 
 static GtkWidget *
@@ -362,26 +317,29 @@ wimax_bsid_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
 
 
 static void
-display_ip4_info (NMIP4Address *def_addr, GtkGrid *grid, int *row)
+display_ip4_info (NMIPAddress *def_addr, GtkGrid *grid, int *row)
 {
        guint32 hostmask, network, bcast, netmask;
+       const char *addr;
        char *str;
 
        /* Address */
        gtk_grid_attach (grid, create_info_label (_("IP Address:"), FALSE),
                         0, *row, 1, 1);
-       str = def_addr ? ip4_address_as_string (nm_ip4_address_get_address (def_addr)) : g_strdup 
(C_("Address", "Unknown"));
-       gtk_grid_attach (grid, create_info_label (str, TRUE),
+       addr = def_addr ? nm_ip_address_get_address (def_addr) : C_("Address", "Unknown");
+       gtk_grid_attach (grid, create_info_label (addr, TRUE),
                         1, *row, 1, 1);
-       g_free (str);
        (*row)++;
 
        /* Broadcast */
        if (def_addr) {
-               netmask = nm_utils_ip4_prefix_to_netmask (nm_ip4_address_get_prefix (def_addr));
-               network = ntohl (nm_ip4_address_get_address (def_addr)) & ntohl (netmask);
-               hostmask = ~ntohl (netmask);
-               bcast = htonl (network | hostmask);
+               guint32 addr_bin;
+
+               nm_ip_address_get_address_binary (def_addr, &addr_bin);
+               netmask = nm_utils_ip4_prefix_to_netmask (nm_ip_address_get_prefix (def_addr));
+               network = addr_bin & netmask;
+               hostmask = ~netmask;
+               bcast = network | hostmask;
        }
 
        gtk_grid_attach (grid, create_info_label (_("Broadcast Address:"), FALSE),
@@ -400,24 +358,11 @@ display_ip4_info (NMIP4Address *def_addr, GtkGrid *grid, int *row)
                         1, *row, 1, 1);
        g_free (str);
        (*row)++;
-
-       /* Gateway */
-       if (def_addr && nm_ip4_address_get_gateway (def_addr)) {
-               gtk_grid_attach (grid, create_info_label (_("Default Route:"), FALSE),
-                                0, *row, 1, 1);
-               str = ip4_address_as_string (nm_ip4_address_get_gateway (def_addr));
-               gtk_grid_attach (grid, create_info_label (str, TRUE),
-                                1, *row, 1, 1);
-               g_free (str);
-               (*row)++;
-       }
 }
 
 static void
-display_ip6_info (NMIP6Address *def6_addr, const char *method, GtkGrid *grid, int *row)
+display_ip6_info (NMIPAddress *def6_addr, const char *method, GtkGrid *grid, int *row)
 {
-       char *tmp_addr;
-       guint32 prefix;
        char *str;
 
        if (!def6_addr)
@@ -426,26 +371,14 @@ display_ip6_info (NMIP6Address *def6_addr, const char *method, GtkGrid *grid, in
        /* Address */
        gtk_grid_attach (grid, create_info_label (_("IP Address:"), FALSE),
                         0, *row, 1, 1);
-       tmp_addr = ip6_address_as_string (nm_ip6_address_get_address (def6_addr));
-       prefix = nm_ip6_address_get_prefix (def6_addr);
-       str = g_strdup_printf ("%s/%d", tmp_addr, prefix);
-       g_free (tmp_addr);
+       str = g_strdup_printf ("%s/%d",
+                              nm_ip_address_get_address (def6_addr),
+                              nm_ip_address_get_prefix (def6_addr));
 
        gtk_grid_attach (grid, create_info_label (str, TRUE),
                         1, *row, 1, 1);
        g_free (str);
        (*row)++;
-
-       /* Gateway */
-       if (nm_ip6_address_get_gateway (def6_addr)) {
-               gtk_grid_attach (grid, create_info_label (_("Default Route:"), FALSE),
-                                0, *row, 1, 1);
-               str = ip6_address_as_string (nm_ip6_address_get_gateway (def6_addr));
-               gtk_grid_attach (grid, create_info_label (str, TRUE),
-                                1, *row, 1, 1);
-               g_free (str);
-               (*row)++;
-       }
 }
 
 static void
@@ -473,13 +406,13 @@ info_dialog_add_page (GtkNotebook *notebook,
        guint32 speed = 0;
        char *str;
        const char *iface, *method = NULL;
-       NMIP4Config *ip4_config;
-       NMIP6Config *ip6_config;
+       NMIPConfig *ip4_config;
+       NMIPConfig *ip6_config;
        const char * const *dns;
        const char * const *dns6;
-       NMIP4Address *def_addr = NULL;
-       NMIP6Address *def6_addr = NULL;
-       NMSettingIP6Config *s_ip6;
+       NMIPAddress *def_addr = NULL;
+       NMIPAddress *def6_addr = NULL;
+       NMSettingIPConfig *s_ip6;
        int row = 0;
        GtkWidget* speed_label, *sec_label = NULL;
        GPtrArray *addresses;
@@ -630,14 +563,23 @@ info_dialog_add_page (GtkNotebook *notebook,
        row++;
 
        ip4_config = nm_device_get_ip4_config (device);
-       addresses = nm_ip4_config_get_addresses (ip4_config);
+       addresses = nm_ip_config_get_addresses (ip4_config);
        if (addresses && addresses->len > 0)
-               def_addr = (NMIP4Address *) g_ptr_array_index (addresses, 0);
+               def_addr = (NMIPAddress *) g_ptr_array_index (addresses, 0);
 
        display_ip4_info (def_addr, grid, &row);
 
+       /* Gateway */
+       if (nm_ip_config_get_gateway (ip4_config)) {
+               gtk_grid_attach (grid, create_info_label (_("Default Route:"), FALSE),
+                                0, row, 1, 1);
+               gtk_grid_attach (grid, create_info_label (nm_ip_config_get_gateway (ip4_config), TRUE),
+                                1, row, 1, 1);
+               row++;
+       }
+
        /* DNS */
-       dns = def_addr ? nm_ip4_config_get_nameservers (ip4_config) : NULL;
+       dns = def_addr ? nm_ip_config_get_nameservers (ip4_config) : NULL;
        display_dns_info (dns, grid, &row);
 
        /* Empty line */
@@ -651,7 +593,7 @@ info_dialog_add_page (GtkNotebook *notebook,
 
        s_ip6 = nm_connection_get_setting_ip6_config (connection);
        if (s_ip6)
-                method = nm_setting_ip6_config_get_method (s_ip6);
+                method = nm_setting_ip_config_get_method (s_ip6);
 
        if (!method || !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) {
                gtk_grid_attach (grid, create_info_label (_("Ignored"), FALSE),
@@ -661,14 +603,23 @@ info_dialog_add_page (GtkNotebook *notebook,
 
        ip6_config = nm_device_get_ip6_config (device);
        if (ip6_config) {
-               addresses = nm_ip6_config_get_addresses (ip6_config);
+               addresses = nm_ip_config_get_addresses (ip6_config);
                if (addresses && addresses->len > 0)
-                       def6_addr = (NMIP6Address *) g_ptr_array_index (addresses, 0);
+                       def6_addr = (NMIPAddress *) g_ptr_array_index (addresses, 0);
        }
        display_ip6_info (def6_addr, method, grid, &row);
 
+       /* Gateway */
+       if (nm_ip_config_get_gateway (ip6_config)) {
+               gtk_grid_attach (grid, create_info_label (_("Default Route:"), FALSE),
+                                0, row, 1, 1);
+               gtk_grid_attach (grid, create_info_label (nm_ip_config_get_gateway (ip6_config), TRUE),
+                                1, row, 1, 1);
+               row++;
+       }
+
        /* DNS */
-       dns6 = def6_addr ? nm_ip6_config_get_nameservers (ip6_config) : NULL;
+       dns6 = def6_addr ? nm_ip_config_get_nameservers (ip6_config) : NULL;
        display_dns_info (dns6, grid, &row);
 
        gtk_notebook_append_page (notebook, GTK_WIDGET (grid),
@@ -755,14 +706,14 @@ info_dialog_add_page_for_vpn (GtkNotebook *notebook,
        GtkGrid *grid;
        char *str;
        int row = 0;
-       NMIP4Config *ip4_config;
-       NMIP6Config *ip6_config;
+       NMIPConfig *ip4_config;
+       NMIPConfig *ip6_config;
        const char * const *dns;
        const char * const *dns6;
-       NMIP4Address *def_addr = NULL;
-       NMIP6Address *def6_addr = NULL;
+       NMIPAddress *def_addr = NULL;
+       NMIPAddress *def6_addr = NULL;
        GPtrArray *addresses;
-       NMSettingIP6Config *s_ip6;
+       NMSettingIPConfig *s_ip6;
        const char *method = NULL;
        gboolean is_default = nm_active_connection_get_default (active);
 
@@ -818,14 +769,14 @@ info_dialog_add_page_for_vpn (GtkNotebook *notebook,
        row++;
 
        ip4_config = nm_active_connection_get_ip4_config (active);
-       addresses = nm_ip4_config_get_addresses (ip4_config);
+       addresses = nm_ip_config_get_addresses (ip4_config);
        if (addresses && addresses->len > 0)
-               def_addr = (NMIP4Address *) g_ptr_array_index (addresses, 0);
+               def_addr = (NMIPAddress *) g_ptr_array_index (addresses, 0);
 
        display_ip4_info (def_addr, grid, &row);
 
        /* DNS */
-       dns = def_addr ? nm_ip4_config_get_nameservers (ip4_config) : NULL;
+       dns = def_addr ? nm_ip_config_get_nameservers (ip4_config) : NULL;
        display_dns_info (dns, grid, &row);
 
        /* Empty line */
@@ -841,7 +792,7 @@ info_dialog_add_page_for_vpn (GtkNotebook *notebook,
 
                s_ip6 = nm_connection_get_setting_ip6_config (connection);
                if (s_ip6)
-                        method = nm_setting_ip6_config_get_method (s_ip6);
+                        method = nm_setting_ip_config_get_method (s_ip6);
 
                if (!method || !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) {
                        gtk_grid_attach (grid, create_info_label (_("Ignored"), FALSE),
@@ -849,15 +800,15 @@ info_dialog_add_page_for_vpn (GtkNotebook *notebook,
                        row++;
                }
 
-               addresses = nm_ip6_config_get_addresses (ip6_config);
+               addresses = nm_ip_config_get_addresses (ip6_config);
                if (addresses && addresses->len > 0)
-                       def6_addr = (NMIP6Address *) g_ptr_array_index (addresses, 0);
+                       def6_addr = (NMIPAddress *) g_ptr_array_index (addresses, 0);
 
                /* IPv6 Address */
                display_ip6_info (def6_addr, method, grid, &row);
 
                /* DNS */
-               dns6 = def6_addr ? nm_ip6_config_get_nameservers (ip6_config) : NULL;
+               dns6 = def6_addr ? nm_ip_config_get_nameservers (ip6_config) : NULL;
                display_dns_info (dns6, grid, &row);
        }
 
@@ -891,7 +842,7 @@ info_dialog_update (NMApplet *applet)
                if (nm_active_connection_get_state (active_connection) != 
NM_ACTIVE_CONNECTION_STATE_ACTIVATED)
                        continue;
 
-               connection = get_connection_for_active (applet, active_connection);
+               connection = (NMConnection *) nm_active_connection_get_connection (active_connection);
                if (!connection) {
                        g_warning ("%s: couldn't find the default active connection's NMConnection!", 
__func__);
                        continue;
@@ -899,7 +850,7 @@ info_dialog_update (NMApplet *applet)
 
                devices = nm_active_connection_get_devices (active_connection);
                if (NM_IS_VPN_CONNECTION (active_connection)) {
-                       const char *spec_object = nm_active_connection_get_specific_object 
(active_connection);
+                       const char *spec_object = nm_active_connection_get_specific_object_path 
(active_connection);
                        NMConnection *parent_con = get_connection_for_active_path (applet, spec_object);
 
                        info_dialog_add_page_for_vpn (notebook, connection, active_connection, parent_con);
diff --git a/src/applet-vpn-request.c b/src/applet-vpn-request.c
index 3d2c1d2..bb03109 100644
--- a/src/applet-vpn-request.c
+++ b/src/applet-vpn-request.c
@@ -183,7 +183,7 @@ find_auth_dialog_binary (const char *service,
        if (!dir) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "Failed to open VPN plugin file configuration directory " VPN_NAME_FILES_DIR);
                return NULL;
        }
@@ -216,7 +216,7 @@ find_auth_dialog_binary (const char *service,
        if (prog == NULL) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "Could not find the authentication dialog for VPN connection type '%s'",
                             service);
        } else if (!g_path_is_absolute (prog)) {
@@ -271,7 +271,7 @@ write_item (int fd, const char *item, GError **error)
        if (write (fd, item, item_len) != item_len) {
                g_set_error (error,
                                 NM_SECRET_AGENT_ERROR,
-                                NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                NM_SECRET_AGENT_ERROR_FAILED,
                                 "Failed to write connection to VPN UI: errno %d", errno);
                return FALSE;
        }
@@ -316,7 +316,7 @@ write_connection_to_child (int fd, NMConnection *connection, GError **error)
        if (!s_vpn) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "Connection had no VPN setting");
                return FALSE;
        }
@@ -383,7 +383,7 @@ applet_vpn_request_get_secrets (SecretsRequest *req, GError **error)
        if (!info->vpn) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "Could not create VPN secrets request object");
                goto out;
        }
diff --git a/src/applet.c b/src/applet.c
index 332a844..af13c3e 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -89,7 +89,7 @@ impl_dbus_connect_to_hidden_network (NMApplet *applet, GError **error)
        if (!applet_wifi_connect_to_hidden_network (applet)) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "Failed to create Wi-Fi dialog");
                return FALSE;
        }
@@ -103,7 +103,7 @@ impl_dbus_create_wifi_network (NMApplet *applet, GError **error)
        if (!applet_wifi_can_create_wifi_network (applet)) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED,
+                                    NM_SECRET_AGENT_ERROR_PERMISSION_DENIED,
                                     "Creation of Wi-Fi networks has been disabled by system policy.");
                return FALSE;
        }
@@ -111,7 +111,7 @@ impl_dbus_create_wifi_network (NMApplet *applet, GError **error)
        if (!applet_wifi_create_wifi_network (applet)) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "Failed to create Wi-Fi dialog");
                return FALSE;
        }
@@ -132,7 +132,7 @@ impl_dbus_connect_to_8021x_network (NMApplet *applet,
        if (!device || NM_IS_DEVICE_WIFI (device) == FALSE) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The device could not be found.");
                return FALSE;
        }
@@ -141,7 +141,7 @@ impl_dbus_connect_to_8021x_network (NMApplet *applet,
        if (!ap) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The access point could not be found.");
                return FALSE;
        }
@@ -151,7 +151,7 @@ impl_dbus_connect_to_8021x_network (NMApplet *applet,
            && !(nm_access_point_get_rsn_flags (ap) & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The access point had no 802.1x capabilities");
                return FALSE;
        }
@@ -159,7 +159,7 @@ impl_dbus_connect_to_8021x_network (NMApplet *applet,
        if (!applet_wifi_connect_to_8021x_network (applet, device, ap)) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "Failed to create Wi-Fi dialog");
                return FALSE;
        }
@@ -179,7 +179,7 @@ impl_dbus_connect_to_3g_network (NMApplet *applet,
        if (!device || NM_IS_DEVICE_MODEM (device) == FALSE) {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The device could not be found.");
                return FALSE;
        }
@@ -193,7 +193,7 @@ impl_dbus_connect_to_3g_network (NMApplet *applet,
 
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "ModemManager was not found");
                return FALSE;
        }
@@ -207,7 +207,7 @@ impl_dbus_connect_to_3g_network (NMApplet *applet,
        } else {
                g_set_error_literal (error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "The device had no GSM or CDMA capabilities.");
                return FALSE;
        }
@@ -424,58 +424,30 @@ applet_get_default_active_connection (NMApplet *applet, NMDevice **device)
        return default_ac;
 }
 
-NMRemoteSettings *
-applet_get_settings (NMApplet *applet)
-{
-       return applet->settings;
-}
-
-GSList *
+GPtrArray *
 applet_get_all_connections (NMApplet *applet)
 {
-       GSList *connections, *iter, *next;
+       const GPtrArray *all_connections;
+       GPtrArray *connections;
+       int i;
        NMConnection *connection;
        NMSettingConnection *s_con;
 
-       connections = nm_remote_settings_list_connections (applet->settings);
+       all_connections = nm_client_get_connections (applet->nm_client);
+       connections = g_ptr_array_new_full (all_connections->len, g_object_unref);
 
        /* Ignore slave connections */
-       for (iter = connections; iter; iter = next) {
-               connection = iter->data;
-               next = iter->next;
+       for (i = 0; i < all_connections->len; i++) {
+               connection = all_connections->pdata[i];
 
                s_con = nm_connection_get_setting_connection (connection);
-               if (s_con && nm_setting_connection_get_master (s_con))
-                       connections = g_slist_delete_link (connections, iter);
+               if (s_con && !nm_setting_connection_get_master (s_con))
+                       g_ptr_array_add (connections, g_object_ref (connection));
        }
 
        return connections;
 }
 
-static NMConnection *
-applet_get_connection_for_active (NMApplet *applet, NMActiveConnection *active)
-{
-       GSList *list, *iter;
-       NMConnection *connection = NULL;
-       const char *path;
-
-       path = nm_active_connection_get_connection (active);
-       g_return_val_if_fail (path != NULL, NULL);
-
-       list = applet_get_all_connections (applet);
-       for (iter = list; iter; iter = g_slist_next (iter)) {
-               NMConnection *candidate = NM_CONNECTION (iter->data);
-
-               if (!strcmp (nm_connection_get_path (candidate), path)) {
-                       connection = candidate;
-                       break;
-               }
-       }
-       g_slist_free (list);
-
-       return connection;
-}
-
 static NMActiveConnection *
 applet_get_active_for_connection (NMApplet *applet, NMConnection *connection)
 {
@@ -489,7 +461,8 @@ applet_get_active_for_connection (NMApplet *applet, NMConnection *connection)
        active_list = nm_client_get_active_connections (applet->nm_client);
        for (i = 0; active_list && (i < active_list->len); i++) {
                NMActiveConnection *active = NM_ACTIVE_CONNECTION (g_ptr_array_index (active_list, i));
-               const char *active_cpath = nm_active_connection_get_connection (active);
+               NMRemoteConnection *conn = nm_active_connection_get_connection (active);
+               const char *active_cpath = nm_connection_get_path (NM_CONNECTION (conn));
 
                if (active_cpath && !strcmp (active_cpath, cpath))
                        return active;
@@ -510,8 +483,9 @@ applet_get_device_for_connection (NMApplet *applet, NMConnection *connection)
        active_list = nm_client_get_active_connections (applet->nm_client);
        for (i = 0; active_list && (i < active_list->len); i++) {
                NMActiveConnection *active = NM_ACTIVE_CONNECTION (g_ptr_array_index (active_list, i));
+               NMRemoteConnection *ac_conn = nm_active_connection_get_connection (active);
 
-               if (!g_strcmp0 (nm_active_connection_get_connection (active), cpath))
+               if (!g_strcmp0 (nm_connection_get_path (NM_CONNECTION (ac_conn)), cpath))
                        return g_ptr_array_index (nm_active_connection_get_devices (active), 0);
        }
        return NULL;
@@ -1033,7 +1007,7 @@ make_vpn_failure_message (NMVpnConnection *vpn,
 
        g_return_val_if_fail (vpn != NULL, NULL);
 
-       connection = applet_get_connection_for_active (applet, NM_ACTIVE_CONNECTION (vpn));
+       connection = (NMConnection *) nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (vpn));
        s_con = nm_connection_get_setting_connection (connection);
 
        switch (reason) {
@@ -1079,7 +1053,7 @@ make_vpn_disconnection_message (NMVpnConnection *vpn,
 
        g_return_val_if_fail (vpn != NULL, NULL);
 
-       connection = applet_get_connection_for_active (applet, NM_ACTIVE_CONNECTION (vpn));
+       connection = (NMConnection *) nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (vpn));
        s_con = nm_connection_get_setting_connection (connection);
 
        switch (reason) {
@@ -1297,7 +1271,7 @@ applet_get_first_active_vpn_connection (NMApplet *applet,
 
                candidate = g_ptr_array_index (active_list, i);
 
-               connection = applet_get_connection_for_active (applet, candidate);
+               connection = (NMConnection *) nm_active_connection_get_connection (candidate);
                if (!connection)
                        continue;
 
@@ -1402,7 +1376,6 @@ applet_find_active_connection_for_device (NMDevice *device,
                                           NMActiveConnection **out_active)
 {
        const GPtrArray *active_connections;
-       NMConnection *connection = NULL;
        int i;
 
        g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
@@ -1411,32 +1384,27 @@ applet_find_active_connection_for_device (NMDevice *device,
                g_return_val_if_fail (*out_active == NULL, NULL);
 
        active_connections = nm_client_get_active_connections (applet->nm_client);
-       for (i = 0; active_connections && (i < active_connections->len); i++) {
-               NMRemoteConnection *tmp;
+       for (i = 0; i < active_connections->len; i++) {
+               NMRemoteConnection *conn;
                NMActiveConnection *active;
-               const char *connection_path;
                const GPtrArray *devices;
 
                active = NM_ACTIVE_CONNECTION (g_ptr_array_index (active_connections, i));
                devices = nm_active_connection_get_devices (active);
-               connection_path = nm_active_connection_get_connection (active);
+               conn = nm_active_connection_get_connection (active);
 
-               if (!devices || !connection_path)
+               if (!devices || !conn)
                        continue;
 
                if (!nm_g_ptr_array_contains (devices, device))
                        continue;
 
-               tmp = nm_remote_settings_get_connection_by_path (applet->settings, connection_path);
-               if (tmp) {
-                       connection = NM_CONNECTION (tmp);
-                       if (out_active)
-                               *out_active = active;
-                       break;
-               }
+               if (out_active)
+                       *out_active = active;
+               return NM_CONNECTION (conn);
        }
 
-       return connection;
+       return NULL;
 }
 
 static NMConnection *
@@ -1445,7 +1413,6 @@ applet_find_active_connection_for_virtual_device (const char *iface,
                                                   NMActiveConnection **out_active)
 {
        const GPtrArray *active_connections;
-       NMConnection *connection = NULL;
        int i;
 
        g_return_val_if_fail (iface != NULL, NULL);
@@ -1454,30 +1421,24 @@ applet_find_active_connection_for_virtual_device (const char *iface,
                g_return_val_if_fail (*out_active == NULL, NULL);
 
        active_connections = nm_client_get_active_connections (applet->nm_client);
-       for (i = 0; active_connections && (i < active_connections->len); i++) {
-               NMRemoteConnection *tmp;
+       for (i = 0; i < active_connections->len; i++) {
+               NMRemoteConnection *conn;
                NMActiveConnection *active;
-               const char *connection_path;
 
                active = NM_ACTIVE_CONNECTION (g_ptr_array_index (active_connections, i));
-               connection_path = nm_active_connection_get_connection (active);
+               conn = nm_active_connection_get_connection (active);
 
-               if (!connection_path)
+               if (!conn)
                        continue;
 
-               tmp = nm_remote_settings_get_connection_by_path (applet->settings, connection_path);
-               if (!tmp)
-                       continue;
-
-               if (!g_strcmp0 (nm_connection_get_interface_name (NM_CONNECTION (tmp)), iface)) {
-                       connection = NM_CONNECTION (tmp);
+               if (!g_strcmp0 (nm_connection_get_interface_name (NM_CONNECTION (conn)), iface)) {
                        if (out_active)
                                *out_active = active;
-                       break;
+                       return NM_CONNECTION (conn);
                }
        }
 
-       return connection;
+       return NULL;
 }
 
 gboolean
@@ -1580,7 +1541,8 @@ nma_menu_device_get_menu_item (NMDevice *device,
 }
 
 static int
-add_device_items (NMDeviceType type, const GPtrArray *all_devices, GSList *all_connections,
+add_device_items (NMDeviceType type, const GPtrArray *all_devices,
+                  const GPtrArray *all_connections,
                   GtkWidget *menu, NMApplet *applet)
 {
        GSList *devices = NULL, *iter;
@@ -1600,7 +1562,7 @@ add_device_items (NMDeviceType type, const GPtrArray *all_devices, GSList *all_c
                NMDevice *device = iter->data;
                NMADeviceClass *dclass;
                NMConnection *active;
-               GSList *connections;
+               GPtrArray *connections;
 
                dclass = get_device_class (device, applet);
                g_assert (dclass != NULL);
@@ -1610,7 +1572,7 @@ add_device_items (NMDeviceType type, const GPtrArray *all_devices, GSList *all_c
 
                dclass->add_menu_item (device, n_devices > 1, connections, active, menu, applet);
 
-               g_slist_free (connections);
+               g_ptr_array_unref (connections);
        }
 
        g_slist_free (devices);
@@ -1629,52 +1591,48 @@ sort_connections_by_ifname (gconstpointer a, gconstpointer b)
 
 static int
 add_virtual_items (const char *type, const GPtrArray *all_devices,
-                   GSList *all_connections, GtkWidget *menu, NMApplet *applet)
+                   const GPtrArray *all_connections, GtkWidget *menu, NMApplet *applet)
 {
-       GSList *iter, *connections = NULL;
-       int n_devices = 0;
+       GPtrArray *connections;
+       int i, n_devices = 0;
 
-       for (iter = all_connections; iter; iter = iter->next) {
-               NMConnection *connection = iter->data;
+       connections = g_ptr_array_sized_new (5);
+       for (i = 0; i < all_connections->len; i++) {
+               NMConnection *connection = all_connections->pdata[i];
 
                if (!nm_connection_get_interface_name (connection))
                        continue;
 
                if (nm_connection_is_type (connection, type))
-                       connections = g_slist_prepend (connections, connection);
+                       g_ptr_array_add (connections, connection);
        }
 
-       if (!connections)
-               return 0;
-
-       connections = g_slist_sort (connections, sort_connections_by_ifname);
+       g_ptr_array_sort (connections, sort_connections_by_ifname);
        /* Count the number of unique interface names */
-       iter = connections;
-       while (iter) {
-               NMConnection *connection = iter->data;
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *connection = connections->pdata[i];
 
                n_devices++;
 
                /* Skip ahead until we find a connection with a different ifname
                 * (or reach the end of the list).
                 */
-               while (iter && sort_connections_by_ifname (connection, iter->data) == 0)
-                       iter = iter->next;
+               while (   i < connections->len
+                      && sort_connections_by_ifname (connection, connections->pdata[i]) == 0)
+                       i++;
        }
 
-
-       iter = connections;
-       while (iter) {
-               NMConnection *connection = iter->data;
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *connection = connections->pdata[i];
                NMDevice *device = NULL;
                const char *iface = nm_connection_get_interface_name (connection);
-               GSList *iface_connections = NULL;
+               GPtrArray *iface_connections;
                NMADeviceClass *dclass;
                NMConnection *active;
-               int i;
+               int d;
 
-               for (i = 0; all_devices && (i < all_devices->len); i++) {
-                       NMDevice *candidate = all_devices->pdata[i];
+               for (d = 0; d < all_devices->len; d++) {
+                       NMDevice *candidate = all_devices->pdata[d];
 
                        if (!strcmp (nm_device_get_iface (candidate), iface)) {
                                device = candidate;
@@ -1682,9 +1640,11 @@ add_virtual_items (const char *type, const GPtrArray *all_devices,
                        }
                }
 
-               while (iter && sort_connections_by_ifname (connection, iter->data) == 0) {
-                       iface_connections = g_slist_prepend (iface_connections, connection);
-                       iter = iter->next;
+               iface_connections = g_ptr_array_sized_new (5);
+               while (   i < connections->len
+                      && sort_connections_by_ifname (connection, connections->pdata[i]) == 0) {
+                       g_ptr_array_add (iface_connections, connections->pdata[i]);
+                       i++;
                }
 
                active = applet_find_active_connection_for_virtual_device (iface, applet, NULL);
@@ -1692,10 +1652,10 @@ add_virtual_items (const char *type, const GPtrArray *all_devices,
                dclass = get_device_class_from_connection (connection, applet);
                dclass->add_menu_item (device, n_devices > 1, iface_connections, active, menu, applet);
 
-               g_slist_free (iface_connections);
+               g_ptr_array_unref (iface_connections);
        }
 
-       g_slist_free (connections);
+       g_ptr_array_unref (connections);
        return n_devices;
 }
 
@@ -1703,7 +1663,7 @@ static void
 nma_menu_add_devices (GtkWidget *menu, NMApplet *applet)
 {
        const GPtrArray *all_devices;
-       GSList *all_connections;
+       GPtrArray *all_connections;
        gint n_items;
 
        all_connections = applet_get_all_connections (applet);
@@ -1729,7 +1689,7 @@ nma_menu_add_devices (GtkWidget *menu, NMApplet *applet)
        n_items += add_device_items  (NM_DEVICE_TYPE_BT,
                                      all_devices, all_connections, menu, applet);
 
-       g_slist_free (all_connections);
+       g_ptr_array_unref (all_connections);
 
        if (!n_items)
                nma_menu_add_text_item (menu, _("No network devices available"));
@@ -1741,17 +1701,17 @@ sort_vpn_connections (gconstpointer a, gconstpointer b)
        return strcmp (get_connection_id (NM_CONNECTION (a)), get_connection_id (NM_CONNECTION (b)));
 }
 
-static GSList *
+static GPtrArray *
 get_vpn_connections (NMApplet *applet)
 {
-       GSList *all_connections;
-       GSList *iter;
-       GSList *list = NULL;
+       GPtrArray *all_connections, *vpn_connections;
+       int i;
 
        all_connections = applet_get_all_connections (applet);
+       vpn_connections = g_ptr_array_new_full (5, g_object_unref);
 
-       for (iter = all_connections; iter; iter = iter->next) {
-               NMConnection *connection = NM_CONNECTION (iter->data);
+       for (i = 0; i < all_connections->len; i++) {
+               NMConnection *connection = NM_CONNECTION (all_connections->pdata[i]);
                NMSettingConnection *s_con;
 
                s_con = nm_connection_get_setting_connection (connection);
@@ -1765,12 +1725,13 @@ get_vpn_connections (NMApplet *applet)
                        continue;
                }
 
-               list = g_slist_prepend (list, connection);
+               g_ptr_array_add (vpn_connections, g_object_ref (connection));
        }
 
-       g_slist_free (all_connections);
+       g_ptr_array_unref (all_connections);
 
-       return g_slist_sort (list, sort_vpn_connections);
+       g_ptr_array_sort (vpn_connections, sort_vpn_connections);
+       return vpn_connections;
 }
 
 static void
@@ -1778,8 +1739,8 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet)
 {
        GtkMenu *vpn_menu;
        GtkMenuItem *item;
-       GSList *list, *iter;
-       int num_vpn_active = 0;
+       GPtrArray *list;
+       int i, num_vpn_active = 0;
 
        nma_menu_add_separator_item (menu);
 
@@ -1790,15 +1751,15 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet)
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (item));
 
        list = get_vpn_connections (applet);
-       for (iter = list; iter; iter = g_slist_next (iter)) {
-               NMConnection *connection = NM_CONNECTION (iter->data);
+       for (i = 0; i < list->len; i++) {
+               NMConnection *connection = NM_CONNECTION (list->pdata[i]);
 
                if (applet_get_active_for_connection (applet, connection))
                        num_vpn_active++;
        }
 
-       for (iter = list; iter; iter = g_slist_next (iter)) {
-               NMConnection *connection = NM_CONNECTION (iter->data);
+       for (i = 0; i < list->len; i++) {
+               NMConnection *connection = NM_CONNECTION (list->pdata[i]);
                NMActiveConnection *active;
                const char *name;
                GtkWidget *image;
@@ -1838,8 +1799,8 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet)
                gtk_menu_shell_append (GTK_MENU_SHELL (vpn_menu), GTK_WIDGET (item));
        }
 
-       /* Draw a seperator, but only if we have VPN connections above it */
-       if (list)
+       /* Draw a separator, but only if we have VPN connections above it */
+       if (list->len)
                nma_menu_add_separator_item (GTK_WIDGET (vpn_menu));
 
        item = GTK_MENU_ITEM (gtk_menu_item_new_with_mnemonic (_("_Configure VPN...")));
@@ -1852,7 +1813,7 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet)
        if (num_vpn_active == 0)
                gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
 
-       g_slist_free (list);
+       g_ptr_array_unref (list);
 }
 
 
@@ -1897,7 +1858,7 @@ nma_set_networking_enabled_cb (GtkWidget *widget, NMApplet *applet)
        g_return_if_fail (applet != NULL);
 
        state = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget));
-       nm_client_networking_set_enabled (applet->nm_client, state);
+       nm_client_networking_set_enabled (applet->nm_client, state, NULL);
 }
 
 
@@ -2311,18 +2272,18 @@ applet_menu_item_activate (GtkMenuItem *item, gpointer user_data)
 
 void
 applet_add_connection_items (NMDevice *device,
-                             GSList *connections,
+                             const GPtrArray *connections,
                              gboolean sensitive,
                              NMConnection *active,
                              NMAAddActiveInactiveEnum flag,
                              GtkWidget *menu,
                              NMApplet *applet)
 {
-       GSList *iter;
+       int i;
        AppletMenuItemInfo *info;
 
-       for (iter = connections; iter; iter = iter->next) {
-               NMConnection *connection = NM_CONNECTION (iter->data);
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *connection = NM_CONNECTION (connections->pdata[i]);
                GtkWidget *item;
 
                if (active == connection) {
@@ -2435,7 +2396,6 @@ applet_get_exported_connection_for_device (NMDevice *device, NMApplet *applet)
        for (i = 0; active_connections && (i < active_connections->len); i++) {
                NMActiveConnection *active;
                NMRemoteConnection *connection;
-               const char *connection_path;
                const GPtrArray *devices;
 
                active = g_ptr_array_index (active_connections, i);
@@ -2443,16 +2403,14 @@ applet_get_exported_connection_for_device (NMDevice *device, NMApplet *applet)
                        continue;
 
                devices = nm_active_connection_get_devices (active);
-               connection_path = nm_active_connection_get_connection (active);
-               if (!devices || !connection_path)
+               connection = nm_active_connection_get_connection (active);
+               if (!devices || !connection)
                        continue;
 
                if (!nm_g_ptr_array_contains (devices, device))
                        continue;
 
-               connection = nm_remote_settings_get_connection_by_path (applet->settings, connection_path);
-               if (connection)
-                       return connection;
+               return connection;
        }
        return NULL;
 }
@@ -2874,25 +2832,9 @@ static char *
 get_tip_for_vpn (NMActiveConnection *active, NMVpnConnectionState state, NMApplet *applet)
 {
        char *tip = NULL;
-       const char *path, *id = NULL;
-       GSList *iter, *list;
-
-       path = nm_active_connection_get_connection (active);
-       g_return_val_if_fail (path != NULL, NULL);
-
-       list = applet_get_all_connections (applet);
-       for (iter = list; iter; iter = g_slist_next (iter)) {
-               NMConnection *candidate = NM_CONNECTION (iter->data);
-               NMSettingConnection *s_con;
-
-               if (!strcmp (nm_connection_get_path (candidate), path)) {
-                       s_con = nm_connection_get_setting_connection (candidate);
-                       id = nm_setting_connection_get_id (s_con);
-                       break;
-               }
-       }
-       g_slist_free (list);
+       const char *id = NULL;
 
+       id = nm_active_connection_get_id (active);
        if (!id)
                return NULL;
 
@@ -3088,14 +3030,14 @@ applet_secrets_request_complete_setting (SecretsRequest *req,
                        if (!secrets_dict) {
                                g_set_error (&error,
                                             NM_SECRET_AGENT_ERROR,
-                                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                            NM_SECRET_AGENT_ERROR_FAILED,
                                             "%s.%d (%s): failed to hash setting '%s'.",
                                             __FILE__, __LINE__, __func__, setting_name);
                        }
                } else {
                        g_set_error (&error,
                                     NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "%s.%d (%s): unhandled setting '%s'",
                                     __FILE__, __LINE__, __func__, setting_name);
                }
@@ -3122,7 +3064,7 @@ applet_secrets_request_free (SecretsRequest *req)
 }
 
 static void
-get_existing_secrets_cb (NMSecretAgent *agent,
+get_existing_secrets_cb (NMSecretAgentOld *agent,
                          NMConnection *connection,
                          GVariant *secrets,
                          GError *secrets_error,
@@ -3189,7 +3131,7 @@ applet_agent_get_secrets_cb (AppletAgent *agent,
        dclass = get_device_class_from_connection (connection, applet);
        if (!dclass) {
                error = g_error_new (NM_SECRET_AGENT_ERROR,
-                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                    NM_SECRET_AGENT_ERROR_FAILED,
                                     "%s.%d (%s): device type unknown",
                                     __FILE__, __LINE__, __func__);
                goto error;
@@ -3216,13 +3158,13 @@ applet_agent_get_secrets_cb (AppletAgent *agent,
        applet->secrets_reqs = g_slist_prepend (applet->secrets_reqs, req);
 
        /* Get existing secrets, if any */
-       nm_secret_agent_get_secrets (NM_SECRET_AGENT (applet->agent),
-                                            connection,
-                                            setting_name,
-                                            hints,
-                                            NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE,
-                                            get_existing_secrets_cb,
-                                            req);
+       nm_secret_agent_old_get_secrets (NM_SECRET_AGENT_OLD (applet->agent),
+                                        connection,
+                                        setting_name,
+                                        hints,
+                                        NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE,
+                                        get_existing_secrets_cb,
+                                        req);
        return;
 
 error:
@@ -3551,7 +3493,7 @@ shell_version_changed_cb (NMShellWatcher *watcher, GParamSpec *pspec, gpointer u
                        g_signal_handlers_disconnect_by_func (applet->agent,
                                                              G_CALLBACK (applet_agent_cancel_secrets_cb),
                                                              applet);
-                       nm_secret_agent_unregister (NM_SECRET_AGENT (applet->agent), NULL, NULL);
+                       nm_secret_agent_old_unregister (NM_SECRET_AGENT_OLD (applet->agent), NULL, NULL);
                        g_clear_object (&applet->agent);
                }
 
@@ -3647,7 +3589,6 @@ initable_init (GInitable *initable, GCancellable *cancellable, GError **error)
                g_prefix_error (error, "Failed to initialize D-Bus: ");
                return FALSE;
        }
-       applet->settings = nm_remote_settings_new (NULL, NULL);
 
 #ifdef BUILD_MIGRATION_TOOL
        {
@@ -3791,9 +3732,6 @@ static void finalize (GObject *object)
        if (applet->agent)
                g_object_unref (applet->agent);
 
-       if (applet->settings)
-               g_object_unref (applet->settings);
-
        if (applet->session_bus)
                dbus_g_connection_unref (applet->session_bus);
 
diff --git a/src/applet.h b/src/applet.h
index fbd96c7..98ec37c 100644
--- a/src/applet.h
+++ b/src/applet.h
@@ -86,7 +86,6 @@ typedef struct
        guint agent_start_id;
 
        NMClient *nm_client;
-       NMRemoteSettings *settings;
        AppletAgent *agent;
 
        GSettings *gsettings;
@@ -230,7 +229,7 @@ struct NMADeviceClass {
 
        void           (*add_menu_item)        (NMDevice *device,
                                                gboolean multiple_devices,
-                                               GSList *connections,
+                                               const GPtrArray *connections,
                                                NMConnection *active,
                                                GtkWidget *menu,
                                                NMApplet *applet);
@@ -267,9 +266,9 @@ NMApplet *nm_applet_new (void);
 
 void applet_schedule_update_icon (NMApplet *applet);
 
-NMRemoteSettings *applet_get_settings (NMApplet *applet);
+NMClient *applet_get_settings (NMApplet *applet);
 
-GSList *applet_get_all_connections (NMApplet *applet);
+GPtrArray *applet_get_all_connections (NMApplet *applet);
 
 gboolean nma_menu_device_check_unusable (NMDevice *device);
 
@@ -341,7 +340,7 @@ typedef enum {
 } NMAAddActiveInactiveEnum;
 
 void applet_add_connection_items (NMDevice *device,
-                                  GSList *connections,
+                                  const GPtrArray *connections,
                                   gboolean sensitive,
                                   NMConnection *active,
                                   NMAAddActiveInactiveEnum flag,
diff --git a/src/connection-editor/ce-page.c b/src/connection-editor/ce-page.c
index 20c25ad..a645246 100644
--- a/src/connection-editor/ce-page.c
+++ b/src/connection-editor/ce-page.c
@@ -237,22 +237,22 @@ ce_page_entry_to_mac (GtkEntry *entry, int type, gboolean *invalid)
 }
 
 char *
-ce_page_get_next_available_name (GSList *connections, const char *format)
+ce_page_get_next_available_name (const GPtrArray *connections, const char *format)
 {
        GSList *names = NULL, *iter;
        char *cname = NULL;
        int i = 0;
 
-       for (iter = connections; iter; iter = g_slist_next (iter)) {
+       for (i = 0; i < connections->len; i++) {
                const char *id;
 
-               id = nm_connection_get_id (NM_CONNECTION (iter->data));
+               id = nm_connection_get_id (connections->pdata[i]);
                g_assert (id);
                names = g_slist_append (names, (gpointer) id);
        }
 
        /* Find the next available unique connection name */
-       while (!cname && (i++ < 10000)) {
+       for (i = 1; !cname && i < 10000; i++) {
                char *temp;
                gboolean found = FALSE;
 
@@ -514,13 +514,13 @@ NMConnection *
 ce_page_new_connection (const char *format,
                         const char *ctype,
                         gboolean autoconnect,
-                        NMRemoteSettings *settings,
+                        NMClient *client,
                         gpointer user_data)
 {
        NMConnection *connection;
        NMSettingConnection *s_con;
        char *uuid, *id;
-       GSList *connections;
+       const GPtrArray *connections;
 
        connection = nm_simple_connection_new ();
 
@@ -529,9 +529,8 @@ ce_page_new_connection (const char *format,
 
        uuid = nm_utils_uuid_generate ();
 
-       connections = nm_remote_settings_list_connections (settings);
+       connections = nm_client_get_connections (client);
        id = ce_page_get_next_available_name (connections, format);
-       g_slist_free (connections);
 
        g_object_set (s_con,
                      NM_SETTING_CONNECTION_UUID, uuid,
@@ -551,7 +550,6 @@ ce_page_new (GType page_type,
              NMConnection *connection,
              GtkWindow *parent_window,
              NMClient *client,
-             NMRemoteSettings *settings,
              const char *ui_file,
              const char *widget_name,
              const char *title)
@@ -569,7 +567,6 @@ ce_page_new (GType page_type,
                                      NULL));
        self->title = g_strdup (title);
        self->client = client;
-       self->settings = settings;
 
        if (ui_file) {
                if (!gtk_builder_add_from_file (self->builder, ui_file, &error)) {
diff --git a/src/connection-editor/ce-page.h b/src/connection-editor/ce-page.h
index 6c1f537..deb5840 100644
--- a/src/connection-editor/ce-page.h
+++ b/src/connection-editor/ce-page.h
@@ -45,7 +45,7 @@ typedef GSList * (*PageGetConnectionsFunc) (gpointer user_data);
 
 typedef void (*PageNewConnectionFunc) (GtkWindow *parent,
                                        const char *detail,
-                                       NMRemoteSettings *settings,
+                                       NMClient *client,
                                        PageNewConnectionResultFunc result_func,
                                        gpointer user_data);
 
@@ -74,7 +74,6 @@ typedef struct {
        NMConnection *connection;
        GtkWindow *parent_window;
        NMClient *client;
-       NMRemoteSettings *settings;
 
        gboolean disposed;
 } CEPage;
@@ -94,7 +93,6 @@ typedef struct {
 typedef CEPage* (*CEPageNewFunc)(NMConnection *connection,
                                  GtkWindow *parent,
                                  NMClient *client,
-                                 NMRemoteSettings *settings,
                                  const char **out_secrets_setting_name,
                                  GError **error);
 
@@ -128,20 +126,19 @@ void ce_page_complete_init (CEPage *self,
 
 gboolean ce_page_get_initialized (CEPage *self);
 
-char *ce_page_get_next_available_name (GSList *connections, const char *format);
+char *ce_page_get_next_available_name (const GPtrArray *connections, const char *format);
 
 /* Only for subclasses */
 NMConnection *ce_page_new_connection (const char *format,
                                       const char *ctype,
                                       gboolean autoconnect,
-                                      NMRemoteSettings *settings,
+                                      NMClient *client,
                                       gpointer user_data);
 
 CEPage *ce_page_new (GType page_type,
                      NMConnection *connection,
                      GtkWindow *parent_window,
                      NMClient *client,
-                     NMRemoteSettings *settings,
                      const char *ui_file,
                      const char *widget_name,
                      const char *title);
diff --git a/src/connection-editor/connection-helpers.c b/src/connection-editor/connection-helpers.c
index 29446e2..bc87c61 100644
--- a/src/connection-editor/connection-helpers.c
+++ b/src/connection-editor/connection-helpers.c
@@ -48,13 +48,13 @@ static GSList *vpn_plugins;
 static gint
 sort_vpn_plugins (gconstpointer a, gconstpointer b)
 {
-       NMVpnPluginUiInterface *aa = NM_VPN_PLUGIN_UI_INTERFACE (a);
-       NMVpnPluginUiInterface *bb = NM_VPN_PLUGIN_UI_INTERFACE (b);
+       NMVpnEditorPlugin *aa = NM_VPN_EDITOR_PLUGIN (a);
+       NMVpnEditorPlugin *bb = NM_VPN_EDITOR_PLUGIN (b);
        char *aa_desc = NULL, *bb_desc = NULL;
        int ret;
 
-       g_object_get (aa, NM_VPN_PLUGIN_UI_INTERFACE_NAME, &aa_desc, NULL);
-       g_object_get (bb, NM_VPN_PLUGIN_UI_INTERFACE_NAME, &bb_desc, NULL);
+       g_object_get (aa, NM_VPN_EDITOR_PLUGIN_NAME, &aa_desc, NULL);
+       g_object_get (bb, NM_VPN_EDITOR_PLUGIN_NAME, &bb_desc, NULL);
 
        ret = g_strcmp0 (aa_desc, bb_desc);
 
@@ -207,7 +207,7 @@ combo_changed_cb (GtkComboBox *combo, gpointer user_data)
        GtkLabel *label = GTK_LABEL (user_data);
        GtkTreeModel *model;
        GtkTreeIter iter;
-       NMVpnPluginUiInterface *plugin = NULL;
+       NMVpnEditorPlugin *plugin = NULL;
        char *description, *markup;
 
        if (!gtk_combo_box_get_active_iter (combo, &iter))
@@ -221,7 +221,7 @@ combo_changed_cb (GtkComboBox *combo, gpointer user_data)
        if (!plugin)
                goto error;
 
-       g_object_get (G_OBJECT (plugin), NM_VPN_PLUGIN_UI_INTERFACE_DESC, &description, NULL);
+       g_object_get (G_OBJECT (plugin), NM_VPN_EDITOR_PLUGIN_DESCRIPTION, &description, NULL);
        g_object_unref (plugin);
        if (!description)
                goto error;
@@ -316,10 +316,10 @@ set_up_connection_type_combo (GtkComboBox *combo,
        }
 
        for (p = vpn_plugins; p; p = p->next) {
-               NMVpnPluginUiInterface *plugin = NM_VPN_PLUGIN_UI_INTERFACE (p->data);
+               NMVpnEditorPlugin *plugin = NM_VPN_EDITOR_PLUGIN (p->data);
                char *desc;
 
-               g_object_get (plugin, NM_VPN_PLUGIN_UI_INTERFACE_NAME, &desc, NULL);
+               g_object_get (plugin, NM_VPN_EDITOR_PLUGIN_NAME, &desc, NULL);
 
                if (show_headers)
                        markup = g_markup_printf_escaped ("    %s", desc);
@@ -335,7 +335,7 @@ set_up_connection_type_combo (GtkComboBox *combo,
                g_free (markup);
                g_free (desc);
 
-               if (nm_vpn_plugin_ui_interface_get_capabilities (plugin) & NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT)
+               if (nm_vpn_editor_plugin_get_capabilities (plugin) & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT)
                        import_supported = TRUE;
        }
 
@@ -361,7 +361,7 @@ set_up_connection_type_combo (GtkComboBox *combo,
 
 typedef struct {
        GtkWindow *parent_window;
-       NMRemoteSettings *settings;
+       NMClient *client;
        NewConnectionResultFunc result_func;
        gpointer user_data;
 } NewConnectionData;
@@ -395,7 +395,7 @@ new_connection_result (NMConnection *connection,
 void
 new_connection_of_type (GtkWindow *parent_window,
                         const char *detail,
-                        NMRemoteSettings *settings,
+                        NMClient *client,
                         PageNewConnectionFunc new_func,
                         NewConnectionResultFunc result_func,
                         gpointer user_data)
@@ -404,25 +404,25 @@ new_connection_of_type (GtkWindow *parent_window,
 
        ncd = g_slice_new (NewConnectionData);
        ncd->parent_window = parent_window;
-       ncd->settings = settings;
+       ncd->client = client;
        ncd->result_func = result_func;
        ncd->user_data = user_data;
 
        new_func (parent_window,
                  detail,
-                 settings,
+                 client,
                  new_connection_result,
                  ncd);
 }
 
 void
 new_connection_dialog (GtkWindow *parent_window,
-                       NMRemoteSettings *settings,
+                       NMClient *client,
                        NewConnectionTypeFilterFunc type_filter_func,
                        NewConnectionResultFunc result_func,
                        gpointer user_data)
 {
-       new_connection_dialog_full (parent_window, settings,
+       new_connection_dialog_full (parent_window, client,
                                    NULL, NULL,
                                    type_filter_func,
                                    result_func,
@@ -431,7 +431,7 @@ new_connection_dialog (GtkWindow *parent_window,
 
 void
 new_connection_dialog_full (GtkWindow *parent_window,
-                            NMRemoteSettings *settings,
+                            NMClient *client,
                             const char *primary_label,
                             const char *secondary_label,
                             NewConnectionTypeFilterFunc type_filter_func,
@@ -446,7 +446,7 @@ new_connection_dialog_full (GtkWindow *parent_window,
        GtkTreeIter iter;
        int response;
        PageNewConnectionFunc new_func = NULL;
-       NMVpnPluginUiInterface *plugin = NULL;
+       NMVpnEditorPlugin *plugin = NULL;
        char *vpn_type = NULL;
        GError *error = NULL;
 
@@ -486,7 +486,7 @@ new_connection_dialog_full (GtkWindow *parent_window,
                                    -1);
 
                if (plugin) {
-                       g_object_get (G_OBJECT (plugin), NM_VPN_PLUGIN_UI_INTERFACE_SERVICE, &vpn_type, NULL);
+                       g_object_get (G_OBJECT (plugin), NM_VPN_EDITOR_PLUGIN_SERVICE, &vpn_type, NULL);
                        g_object_unref (plugin);
                }
        }
@@ -495,7 +495,7 @@ new_connection_dialog_full (GtkWindow *parent_window,
        g_object_unref (gui);
 
        if (new_func)
-               new_connection_of_type (parent_window, vpn_type, settings, new_func, result_func, user_data);
+               new_connection_of_type (parent_window, vpn_type, client, new_func, result_func, user_data);
        else
                result_func (NULL, user_data);
 
diff --git a/src/connection-editor/connection-helpers.h b/src/connection-editor/connection-helpers.h
index f50f93f..f704c7d 100644
--- a/src/connection-editor/connection-helpers.h
+++ b/src/connection-editor/connection-helpers.h
@@ -40,12 +40,12 @@ typedef void (*NewConnectionResultFunc) (NMConnection *connection,
                                          gpointer user_data);
 
 void new_connection_dialog      (GtkWindow *parent_window,
-                                 NMRemoteSettings *settings,
+                                 NMClient *client,
                                  NewConnectionTypeFilterFunc type_filter_func,
                                  NewConnectionResultFunc result_func,
                                  gpointer user_data);
 void new_connection_dialog_full (GtkWindow *parent_window,
-                                 NMRemoteSettings *settings,
+                                 NMClient *client,
                                  const char *primary_label,
                                  const char *secondary_label,
                                  NewConnectionTypeFilterFunc type_filter_func,
@@ -54,7 +54,7 @@ void new_connection_dialog_full (GtkWindow *parent_window,
 
 void new_connection_of_type (GtkWindow *parent_window,
                              const char *detail,
-                             NMRemoteSettings *settings,
+                             NMClient *client,
                              PageNewConnectionFunc new_func,
                              NewConnectionResultFunc result_func,
                              gpointer user_data);
diff --git a/src/connection-editor/ip4-routes-dialog.c b/src/connection-editor/ip4-routes-dialog.c
index 36df32f..e798587 100644
--- a/src/connection-editor/ip4-routes-dialog.c
+++ b/src/connection-editor/ip4-routes-dialog.c
@@ -125,11 +125,10 @@ get_one_addr (GtkTreeModel *model,
               GtkTreeIter *iter,
               int column,
               gboolean fail_if_missing,
-              guint32 *out)
+              char **out)
 {
        char *item = NULL;
        struct in_addr tmp_addr = { 0 };
-       gboolean success = FALSE;
 
        gtk_tree_model_get (model, iter, column, &item, -1);
        if (!item || !strlen (item)) {
@@ -137,13 +136,16 @@ get_one_addr (GtkTreeModel *model,
                return fail_if_missing ? FALSE : TRUE;
        }
 
-       if (inet_pton (AF_INET, item, &tmp_addr) > 0) {
-               *out = tmp_addr.s_addr;
-               success = TRUE;
+       if (inet_pton (AF_INET, item, &tmp_addr) == 0)
+               return FALSE;
+
+       if (tmp_addr.s_addr == 0) {
+               g_free (item);
+               return fail_if_missing ? FALSE : TRUE;
        }
 
-       g_free (item);
-       return success;
+       *out = item;
+       return TRUE;
 }
 
 static void
@@ -166,14 +168,13 @@ validate (GtkWidget *dialog)
        iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter);
 
        while (iter_valid) {
-               guint32 addr = 0, prefix = 0, next_hop = 0, metric = 0;
+               char *addr = NULL, *next_hop = NULL;
+               guint32 prefix = 0, metric = 0;
 
                /* Address */
                if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &addr))
                        goto done;
-               /* Don't allow inserting 0.0.0.0 for now - that's not supported in libnm-util */
-               if (addr == 0)
-                       goto done;
+               g_free (addr);
 
                /* Prefix */
                if (!get_one_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix))
@@ -185,6 +186,7 @@ validate (GtkWidget *dialog)
                /* Next hop (optional) */
                if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop))
                        goto done;
+               g_free (next_hop);
 
                /* Metric (optional) */
                if (!get_one_int (model, &tree_iter, COL_METRIC, G_MAXUINT32, FALSE, &metric))
@@ -627,7 +629,7 @@ tree_view_button_pressed_cb (GtkWidget *widget,
 }
 
 GtkWidget *
-ip4_routes_dialog_new (NMSettingIP4Config *s_ip4, gboolean automatic)
+ip4_routes_dialog_new (NMSettingIPConfig *s_ip4, gboolean automatic)
 {
        GtkBuilder *builder;
        GtkWidget *dialog, *widget, *ok_button;
@@ -673,36 +675,31 @@ ip4_routes_dialog_new (NMSettingIP4Config *s_ip4, gboolean automatic)
        store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
 
        /* Add existing routes */
-       for (i = 0; i < nm_setting_ip4_config_get_num_routes (s_ip4); i++) {
-               NMIP4Route *route = nm_setting_ip4_config_get_route (s_ip4, i);
+       for (i = 0; i < nm_setting_ip_config_get_num_routes (s_ip4); i++) {
+               NMIPRoute *route = nm_setting_ip_config_get_route (s_ip4, i);
                struct in_addr tmp_addr;
-               char ip_string[INET_ADDRSTRLEN];
-               char *tmp;
+               char netmask[INET_ADDRSTRLEN], metric[32];
 
                if (!route) {
                        g_warning ("%s: empty IP4 route structure!", __func__);
                        continue;
                }
 
-               gtk_list_store_append (store, &model_iter);
-
-               tmp_addr.s_addr = nm_ip4_route_get_dest (route);;
-               if (inet_ntop (AF_INET, &tmp_addr, &ip_string[0], sizeof (ip_string)))
-                       gtk_list_store_set (store, &model_iter, COL_ADDRESS, ip_string, -1);
-
-               tmp_addr.s_addr = nm_utils_ip4_prefix_to_netmask (nm_ip4_route_get_prefix (route));
-               if (inet_ntop (AF_INET, &tmp_addr, &ip_string[0], sizeof (ip_string)))
-                       gtk_list_store_set (store, &model_iter, COL_PREFIX, ip_string, -1);
+               tmp_addr.s_addr = nm_utils_ip4_prefix_to_netmask (nm_ip_route_get_prefix (route));
+               if (!inet_ntop (AF_INET, &tmp_addr, netmask, sizeof (netmask)))
+                       *netmask = '\0';
 
-               tmp_addr.s_addr = nm_ip4_route_get_next_hop (route);
-               if (tmp_addr.s_addr && inet_ntop (AF_INET, &tmp_addr, &ip_string[0], sizeof (ip_string)))
-                       gtk_list_store_set (store, &model_iter, COL_NEXT_HOP, ip_string, -1);
+               /* FIXME */
+               g_snprintf (metric, sizeof (metric), "%u",
+                           (guint32) MIN (0, nm_ip_route_get_metric (route)));
 
-               if (nm_ip4_route_get_metric (route)) {
-                       tmp = g_strdup_printf ("%d", nm_ip4_route_get_metric (route));
-                       gtk_list_store_set (store, &model_iter, COL_METRIC, tmp, -1);
-                       g_free (tmp);
-               }
+               gtk_list_store_append (store, &model_iter);
+               gtk_list_store_set (store, &model_iter,
+                                   COL_ADDRESS, nm_ip_route_get_dest (route),
+                                   COL_PREFIX, netmask,
+                                   COL_NEXT_HOP, nm_ip_route_get_next_hop (route),
+                                   COL_METRIC, metric,
+                                   -1);
        }
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_routes"));
@@ -795,12 +792,12 @@ ip4_routes_dialog_new (NMSettingIP4Config *s_ip4, gboolean automatic)
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_ignore_auto_routes"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-                                     nm_setting_ip4_config_get_ignore_auto_routes (s_ip4));
+                                     nm_setting_ip_config_get_ignore_auto_routes (s_ip4));
        gtk_widget_set_sensitive (widget, automatic);
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_never_default"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-                                     nm_setting_ip4_config_get_never_default (s_ip4));
+                                     nm_setting_ip_config_get_never_default (s_ip4));
 
        /* Update initial validity */
        validate (dialog);
@@ -809,7 +806,7 @@ ip4_routes_dialog_new (NMSettingIP4Config *s_ip4, gboolean automatic)
 }
 
 void
-ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP4Config *s_ip4)
+ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip4)
 {
        GtkBuilder *builder;
        GtkWidget *widget;
@@ -828,11 +825,12 @@ ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP4Config *s_ip4)
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
        iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter);
 
-       nm_setting_ip4_config_clear_routes (s_ip4);
+       nm_setting_ip_config_clear_routes (s_ip4);
 
        while (iter_valid) {
-               guint32 addr = 0, prefix = 0, next_hop = 0, metric = 0;
-               NMIP4Route *route;
+               char *addr = NULL, *next_hop = NULL;
+               guint32 prefix = 0, metric = 0;
+               NMIPRoute *route;
 
                /* Address */
                if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &addr)) {
@@ -843,40 +841,43 @@ ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP4Config *s_ip4)
                /* Prefix */
                if (!get_one_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix)) {
                        g_warning ("%s: IPv4 prefix/netmask missing or invalid!", __func__);
+                       g_free (addr);
                        goto next;
                }
 
                /* Next hop (optional) */
                if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop)) {
                        g_warning ("%s: IPv4 next hop invalid!", __func__);
+                       g_free (addr);
                        goto next;
                }
 
                /* Metric (optional) */
                if (!get_one_int (model, &tree_iter, COL_METRIC, G_MAXUINT32, FALSE, &metric)) {
                        g_warning ("%s: IPv4 metric invalid!", __func__);
+                       g_free (addr);
+                       g_free (next_hop);
                        goto next;
                }
 
-               route = nm_ip4_route_new ();
-               nm_ip4_route_set_dest (route, addr);
-               nm_ip4_route_set_prefix (route, prefix);
-               nm_ip4_route_set_next_hop (route, next_hop);
-               nm_ip4_route_set_metric (route, metric);
-               nm_setting_ip4_config_add_route (s_ip4, route);
-               nm_ip4_route_unref (route);
+               route = nm_ip_route_new (AF_INET, addr, prefix, next_hop, metric, NULL);
+               nm_setting_ip_config_add_route (s_ip4, route);
+               nm_ip_route_unref (route);
+
+               g_free (addr);
+               g_free (next_hop);
 
        next:
                iter_valid = gtk_tree_model_iter_next (model, &tree_iter);
        }
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_ignore_auto_routes"));
-       g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES,
+       g_object_set (s_ip4, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES,
                      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
                      NULL);
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip4_never_default"));
-       g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_NEVER_DEFAULT,
+       g_object_set (s_ip4, NM_SETTING_IP_CONFIG_NEVER_DEFAULT,
                      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
                      NULL);
 }
diff --git a/src/connection-editor/ip4-routes-dialog.h b/src/connection-editor/ip4-routes-dialog.h
index 1f6c665..b7e38b2 100644
--- a/src/connection-editor/ip4-routes-dialog.h
+++ b/src/connection-editor/ip4-routes-dialog.h
@@ -30,8 +30,8 @@
 
 #include "nm-setting-ip4-config.h"
 
-GtkWidget *ip4_routes_dialog_new (NMSettingIP4Config *s_ip4, gboolean automatic);
+GtkWidget *ip4_routes_dialog_new (NMSettingIPConfig *s_ip4, gboolean automatic);
 
-void ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP4Config *s_ip4);
+void ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip4);
 
 #endif /* IP4_ROUTES_DIALOG_H */
diff --git a/src/connection-editor/ip6-routes-dialog.c b/src/connection-editor/ip6-routes-dialog.c
index d524318..c967b8a 100644
--- a/src/connection-editor/ip6-routes-dialog.c
+++ b/src/connection-editor/ip6-routes-dialog.c
@@ -86,10 +86,10 @@ get_one_addr (GtkTreeModel *model,
               GtkTreeIter *iter,
               int column,
               gboolean fail_if_missing,
-              struct in6_addr *out)
+              char **out)
 {
        char *item = NULL;
-       gboolean success = FALSE;
+       struct in6_addr tmp_addr;
 
        gtk_tree_model_get (model, iter, column, &item, -1);
        if (!item || !strlen (item)) {
@@ -97,11 +97,16 @@ get_one_addr (GtkTreeModel *model,
                return fail_if_missing ? FALSE : TRUE;
        }
 
-       if (inet_pton (AF_INET6, item, out) > 0)
-               success = TRUE;
+       if (inet_pton (AF_INET6, item, &tmp_addr) == 0)
+               return FALSE;
 
-       g_free (item);
-       return success;
+       if (IN6_IS_ADDR_UNSPECIFIED (&tmp_addr)) {
+               g_free (item);
+               return fail_if_missing ? FALSE : TRUE;
+       }
+
+       *out = item;
+       return TRUE;
 }
 
 static void
@@ -124,12 +129,13 @@ validate (GtkWidget *dialog)
        iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter);
 
        while (iter_valid) {
-               struct in6_addr dest, next_hop;
+               char *dest = NULL, *next_hop = NULL;
                guint prefix = 0, metric = 0;
 
                /* Address */
                if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &dest))
                        goto done;
+               g_free (dest);
 
                /* Prefix */
                if (!get_one_int (model, &tree_iter, COL_PREFIX, 128, TRUE, &prefix))
@@ -138,6 +144,7 @@ validate (GtkWidget *dialog)
                /* Next hop (optional) */
                if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop))
                        goto done;
+               g_free (next_hop);
 
                /* Metric (optional) */
                if (!get_one_int (model, &tree_iter, COL_METRIC, G_MAXUINT32, FALSE, &metric))
@@ -570,7 +577,7 @@ tree_view_button_pressed_cb (GtkWidget *widget,
 }
 
 GtkWidget *
-ip6_routes_dialog_new (NMSettingIP6Config *s_ip6, gboolean automatic)
+ip6_routes_dialog_new (NMSettingIPConfig *s_ip6, gboolean automatic)
 {
        GtkBuilder *builder;
        GtkWidget *dialog, *widget, *ok_button;
@@ -616,37 +623,28 @@ ip6_routes_dialog_new (NMSettingIP6Config *s_ip6, gboolean automatic)
        store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
 
        /* Add existing routes */
-       for (i = 0; i < nm_setting_ip6_config_get_num_routes (s_ip6); i++) {
-               NMIP6Route *route = nm_setting_ip6_config_get_route (s_ip6, i);
-               const struct in6_addr *tmp_addr;
-               char ip_string[INET6_ADDRSTRLEN];
-               char *tmp;
+       for (i = 0; i < nm_setting_ip_config_get_num_routes (s_ip6); i++) {
+               NMIPRoute *route = nm_setting_ip_config_get_route (s_ip6, i);
+               char prefix[32], metric[32];
 
                if (!route) {
                        g_warning ("%s: empty IP6 route structure!", __func__);
                        continue;
                }
 
-               gtk_list_store_append (store, &model_iter);
-
-               tmp_addr = nm_ip6_route_get_dest (route);
-               if (inet_ntop (AF_INET6, tmp_addr, ip_string, sizeof (ip_string)))
-                       gtk_list_store_set (store, &model_iter, COL_ADDRESS, ip_string, -1);
+               g_snprintf (prefix, sizeof (prefix), "%u", nm_ip_route_get_prefix (route));
 
-               tmp = g_strdup_printf ("%u", nm_ip6_route_get_prefix (route));
-               gtk_list_store_set (store, &model_iter, COL_PREFIX, tmp, -1);
-               g_free (tmp);
+               /* FIXME */
+               g_snprintf (metric, sizeof (metric), "%u",
+                           (guint32) MIN (0, nm_ip_route_get_metric (route)));
 
-               tmp_addr = nm_ip6_route_get_next_hop (route);
-               if (tmp_addr && !IN6_IS_ADDR_UNSPECIFIED (tmp_addr) &&
-                       inet_ntop (AF_INET6, tmp_addr, ip_string, sizeof (ip_string)))
-                       gtk_list_store_set (store, &model_iter, COL_NEXT_HOP, ip_string, -1);
-
-               if (nm_ip6_route_get_metric (route)) {
-                       tmp = g_strdup_printf ("%u", nm_ip6_route_get_metric (route));
-                       gtk_list_store_set (store, &model_iter, COL_METRIC, tmp, -1);
-                       g_free (tmp);
-               }
+               gtk_list_store_append (store, &model_iter);
+               gtk_list_store_set (store, &model_iter,
+                                   COL_ADDRESS, nm_ip_route_get_dest (route),
+                                   COL_PREFIX, prefix,
+                                   COL_NEXT_HOP, nm_ip_route_get_next_hop (route),
+                                   COL_METRIC, metric,
+                                   -1);
        }
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_routes"));
@@ -739,12 +737,12 @@ ip6_routes_dialog_new (NMSettingIP6Config *s_ip6, gboolean automatic)
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_ignore_auto_routes"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-                                     nm_setting_ip6_config_get_ignore_auto_routes (s_ip6));
+                                     nm_setting_ip_config_get_ignore_auto_routes (s_ip6));
        gtk_widget_set_sensitive (widget, automatic);
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_never_default"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-                                     nm_setting_ip6_config_get_never_default (s_ip6));
+                                     nm_setting_ip_config_get_never_default (s_ip6));
 
        /* Update initial validity */
        validate (dialog);
@@ -753,7 +751,7 @@ ip6_routes_dialog_new (NMSettingIP6Config *s_ip6, gboolean automatic)
 }
 
 void
-ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6)
+ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip6)
 {
        GtkBuilder *builder;
        GtkWidget *widget;
@@ -772,12 +770,12 @@ ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6)
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
        iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter);
 
-       nm_setting_ip6_config_clear_routes (s_ip6);
+       nm_setting_ip_config_clear_routes (s_ip6);
 
        while (iter_valid) {
-               struct in6_addr dest, next_hop;
+               char *dest = NULL, *next_hop = NULL;
                guint prefix = 0, metric = 0;
-               NMIP6Route *route;
+               NMIPRoute *route;
 
                /* Address */
                if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &dest)) {
@@ -788,6 +786,7 @@ ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6)
                /* Prefix */
                if (!get_one_int (model, &tree_iter, COL_PREFIX, 128, TRUE, &prefix)) {
                        g_warning ("%s: IPv6 prefix missing or invalid!", __func__);
+                       g_free (dest);
                        goto next;
                }
 
@@ -795,34 +794,33 @@ ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6)
                memset (&next_hop, 0, sizeof (struct in6_addr));
                if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop)) {
                        g_warning ("%s: IPv6 next hop invalid!", __func__);
+                       g_free (dest);
                        goto next;
                }
 
                /* Metric (optional) */
                if (!get_one_int (model, &tree_iter, COL_METRIC, G_MAXUINT32, FALSE, &metric)) {
                        g_warning ("%s: IPv6 metric invalid!", __func__);
+                       g_free (dest);
+                       g_free (next_hop);
                        goto next;
                }
 
-               route = nm_ip6_route_new ();
-               nm_ip6_route_set_dest (route, &dest);
-               nm_ip6_route_set_prefix (route, prefix);
-               nm_ip6_route_set_next_hop (route, &next_hop);
-               nm_ip6_route_set_metric (route, metric);
-               nm_setting_ip6_config_add_route (s_ip6, route);
-               nm_ip6_route_unref (route);
+               route = nm_ip_route_new (AF_INET6, dest, prefix, next_hop, metric, NULL);
+               nm_setting_ip_config_add_route (s_ip6, route);
+               nm_ip_route_unref (route);
 
        next:
                iter_valid = gtk_tree_model_iter_next (model, &tree_iter);
        }
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_ignore_auto_routes"));
-       g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES,
+       g_object_set (s_ip6, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES,
                      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
                      NULL);
 
        widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_never_default"));
-       g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_NEVER_DEFAULT,
+       g_object_set (s_ip6, NM_SETTING_IP_CONFIG_NEVER_DEFAULT,
                      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
                      NULL);
 }
diff --git a/src/connection-editor/ip6-routes-dialog.h b/src/connection-editor/ip6-routes-dialog.h
index 2312c49..746eab1 100644
--- a/src/connection-editor/ip6-routes-dialog.h
+++ b/src/connection-editor/ip6-routes-dialog.h
@@ -30,8 +30,8 @@
 
 #include "nm-setting-ip6-config.h"
 
-GtkWidget *ip6_routes_dialog_new (NMSettingIP6Config *s_ip6, gboolean automatic);
+GtkWidget *ip6_routes_dialog_new (NMSettingIPConfig *s_ip6, gboolean automatic);
 
-void ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6);
+void ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip6);
 
 #endif /* IP6_ROUTES_DIALOG_H */
diff --git a/src/connection-editor/nm-connection-editor.c b/src/connection-editor/nm-connection-editor.c
index 6359c6a..cad9b4d 100644
--- a/src/connection-editor/nm-connection-editor.c
+++ b/src/connection-editor/nm-connection-editor.c
@@ -342,8 +342,6 @@ dispose (GObject *object)
        g_signal_handler_disconnect (editor->client, editor->permission_id);
        g_object_unref (editor->client);
 
-       g_object_unref (editor->settings);
-
 out:
        G_OBJECT_CLASS (nm_connection_editor_parent_class)->dispose (object);
 }
@@ -370,8 +368,7 @@ nm_connection_editor_class_init (NMConnectionEditorClass *klass)
 NMConnectionEditor *
 nm_connection_editor_new (GtkWindow *parent_window,
                           NMConnection *connection,
-                          NMClient *client,
-                          NMRemoteSettings *settings)
+                          NMClient *client)
 {
        NMConnectionEditor *editor;
        GtkWidget *hbox;
@@ -380,12 +377,11 @@ nm_connection_editor_new (GtkWindow *parent_window,
 
        g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
 
-       is_new = !nm_remote_settings_get_connection_by_uuid (settings, nm_connection_get_uuid (connection));
+       is_new = !nm_client_get_connection_by_uuid (client, nm_connection_get_uuid (connection));
 
        editor = g_object_new (NM_TYPE_CONNECTION_EDITOR, NULL);
        editor->parent_window = parent_window ? g_object_ref (parent_window) : NULL;
        editor->client = g_object_ref (client);
-       editor->settings = g_object_ref (settings);
        editor->is_new_connection = is_new;
 
        editor->can_modify = nm_client_get_permission_result (client, 
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM);
@@ -681,7 +677,7 @@ add_page (NMConnectionEditor *editor,
        g_return_val_if_fail (func != NULL, FALSE);
        g_return_val_if_fail (connection != NULL, FALSE);
 
-       page = (*func) (connection, GTK_WINDOW (editor->window), editor->client, editor->settings,
+       page = (*func) (connection, GTK_WINDOW (editor->window), editor->client,
                        &secrets_setting_name, error);
        if (page) {
                g_object_set_data_full (G_OBJECT (page),
@@ -866,7 +862,7 @@ editor_closed_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
 }
 
 static void
-added_connection_cb (GObject *settings,
+added_connection_cb (GObject *client,
                      GAsyncResult *result,
                      gpointer user_data)
 {
@@ -876,8 +872,7 @@ added_connection_cb (GObject *settings,
 
        nm_connection_editor_set_busy (self, FALSE);
 
-       connection = nm_remote_settings_add_connection_finish (NM_REMOTE_SETTINGS (settings),
-                                                              result, &error);
+       connection = nm_client_add_connection_finish (NM_CLIENT (client), result, &error);
        if (error) {
                nm_connection_editor_error (self->parent_window, _("Connection add failed"),
                                            "%s", error->message);
@@ -929,12 +924,12 @@ ok_button_clicked_save_connection (NMConnectionEditor *self)
        eap_method_ca_cert_ignore_save (self->connection);
 
        if (self->is_new_connection) {
-               nm_remote_settings_add_connection_async (self->settings,
-                                                        self->orig_connection,
-                                                        TRUE,
-                                                        NULL,
-                                                        added_connection_cb,
-                                                        self);
+               nm_client_add_connection_async (self->client,
+                                               self->orig_connection,
+                                               TRUE,
+                                               NULL,
+                                               added_connection_cb,
+                                               self);
        } else {
                nm_remote_connection_commit_changes_async (NM_REMOTE_CONNECTION (self->orig_connection),
                                                           TRUE, NULL, updated_connection_cb, self);
diff --git a/src/connection-editor/nm-connection-editor.h b/src/connection-editor/nm-connection-editor.h
index b815a19..7c953b8 100644
--- a/src/connection-editor/nm-connection-editor.h
+++ b/src/connection-editor/nm-connection-editor.h
@@ -41,7 +41,6 @@ typedef struct {
        GtkWindow *parent_window;
        NMClient *client;
        guint permission_id;
-       NMRemoteSettings *settings;
 
        /* private data */
        NMConnection *connection;
@@ -77,8 +76,7 @@ typedef struct {
 GType               nm_connection_editor_get_type (void);
 NMConnectionEditor *nm_connection_editor_new (GtkWindow *parent_window,
                                               NMConnection *connection,
-                                              NMClient *client,
-                                              NMRemoteSettings *settings);
+                                              NMClient *client);
 NMConnectionEditor *nm_connection_editor_get (NMConnection *connection);
 NMConnectionEditor *nm_connection_editor_get_master (NMConnection *slave);
 
diff --git a/src/connection-editor/nm-connection-list.c b/src/connection-editor/nm-connection-list.c
index 850db4a..5640f3e 100644
--- a/src/connection-editor/nm-connection-list.c
+++ b/src/connection-editor/nm-connection-list.c
@@ -276,8 +276,7 @@ really_add_connection (NMConnection *connection,
                return;
        }
 
-       editor = nm_connection_editor_new (GTK_WINDOW (list->dialog), connection,
-                                          list->nm_client, list->settings);
+       editor = nm_connection_editor_new (GTK_WINDOW (list->dialog), connection, list->client);
        if (!editor) {
                g_object_unref (connection);
                g_signal_emit (list, list_signals[EDITING_DONE], 0, 0);
@@ -294,7 +293,7 @@ add_clicked (GtkButton *button, gpointer user_data)
        NMConnectionList *list = user_data;
 
        new_connection_dialog (GTK_WINDOW (list->dialog),
-                              list->settings,
+                              list->client,
                               NULL,
                               really_add_connection,
                               list);
@@ -333,8 +332,7 @@ edit_connection (NMConnectionList *list, NMConnection *connection)
 
        editor = nm_connection_editor_new (GTK_WINDOW (list->dialog),
                                           NM_CONNECTION (connection),
-                                          list->nm_client,
-                                          list->settings);
+                                          list->client);
        g_signal_connect (editor, "done", G_CALLBACK (edit_done_cb), list);
        nm_connection_editor_run (editor);
 }
@@ -424,11 +422,8 @@ dispose (GObject *object)
 
        if (list->gui)
                g_object_unref (list->gui);
-       if (list->nm_client)
-               g_object_unref (list->nm_client);
-
-       if (list->settings)
-               g_object_unref (list->settings);
+       if (list->client)
+               g_object_unref (list->client);
 
        G_OBJECT_CLASS (nm_connection_list_parent_class)->dispose (object);
 }
@@ -569,7 +564,7 @@ tree_model_visible_func (GtkTreeModel *model,
            && g_strcmp0 (slave_type, NM_SETTING_BRIDGE_SETTING_NAME) != 0)
                return TRUE;
 
-       if (nm_remote_settings_get_connection_by_uuid (self->settings, master))
+       if (nm_client_get_connection_by_uuid (self->client, master))
                return FALSE;
        if (nm_connection_editor_get_master (connection))
                return FALSE;
@@ -670,7 +665,7 @@ add_connection_buttons (NMConnectionList *self)
                                       _("Edit the selected connection"),
                                       _("Authenticate to edit the selected connection"),
                                       GTK_STOCK_EDIT,
-                                      self->nm_client,
+                                      self->client,
                                       NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM);
        g_object_set_data (G_OBJECT (button), "NMConnectionList", self);
        gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
@@ -686,7 +681,7 @@ add_connection_buttons (NMConnectionList *self)
                                       _("Delete the selected connection"),
                                       _("Authenticate to delete the selected connection"),
                                       GTK_STOCK_DELETE,
-                                      self->nm_client,
+                                      self->client,
                                       NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM);
        g_object_set_data (G_OBJECT (button), "NMConnectionList", self);
        gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
@@ -700,7 +695,7 @@ add_connection_buttons (NMConnectionList *self)
 }
 
 static void
-connection_removed (NMRemoteSettings *settings,
+connection_removed (NMClient *client,
                     NMRemoteConnection *connection,
                     gpointer user_data)
 {
@@ -760,7 +755,7 @@ get_parent_iter_for_connection (NMConnectionList *list,
 }
 
 static void
-connection_added (NMRemoteSettings *settings,
+connection_added (NMClient *client,
                   NMRemoteConnection *connection,
                   gpointer user_data)
 {
@@ -807,7 +802,7 @@ connection_added (NMRemoteSettings *settings,
                gtk_tree_path_free (path);
        }
 
-       g_signal_connect (settings, NM_REMOTE_SETTINGS_CONNECTION_REMOVED, G_CALLBACK (connection_removed), 
self);
+       g_signal_connect (client, NM_CLIENT_CONNECTION_REMOVED, G_CALLBACK (connection_removed), self);
        g_signal_connect (connection, NM_CONNECTION_CHANGED, G_CALLBACK (connection_changed), self);
        gtk_tree_model_filter_refilter (self->filter);
 }
@@ -818,7 +813,8 @@ nm_connection_list_new (void)
        NMConnectionList *list;
        GtkTreePath *path;
        GtkTreeIter iter;
-       GSList *all_cons, *it;
+       const GPtrArray *all_cons;
+       int i;
        GError *error = NULL;
        const char *objects[] = { "NMConnectionList", NULL };
 
@@ -840,15 +836,11 @@ nm_connection_list_new (void)
 
        gtk_window_set_default_icon_name ("preferences-system-network");
 
-       list->nm_client = nm_client_new (NULL, NULL);
-       if (!list->nm_client)
+       list->client = nm_client_new (NULL, NULL);
+       if (!list->client)
                goto error;
-
-       list->settings = nm_remote_settings_new (NULL, NULL);
-       if (!list->settings)
-               goto error;
-       g_signal_connect (list->settings,
-                         NM_REMOTE_SETTINGS_CONNECTION_ADDED,
+       g_signal_connect (list->client,
+                         NM_CLIENT_CONNECTION_ADDED,
                          G_CALLBACK (connection_added),
                          list);
 
@@ -858,9 +850,9 @@ nm_connection_list_new (void)
 
 
        /* Fill the treeview initially */
-       all_cons = nm_remote_settings_list_connections (list->settings);
-       for (it = all_cons; it; it = it->next)
-               connection_added (list->settings, it->data, list);
+       all_cons = nm_client_get_connections (list->client);
+       for (i = 0; i < all_cons->len; i++)
+               connection_added (list->client, all_cons->pdata[i], list);
 
        if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->sortable), &iter)) {
                path = gtk_tree_model_get_path (GTK_TREE_MODEL (list->sortable), &iter);
@@ -921,82 +913,29 @@ nm_connection_list_create (NMConnectionList *self, GType ctype, const char *deta
        } else {
                new_connection_of_type (GTK_WINDOW (self->dialog),
                                        detail,
-                                       self->settings,
+                                       self->client,
                                        types[i].new_connection_func,
                                        really_add_connection,
                                        self);
        }
 }
 
-static NMConnection *
-get_connection (NMRemoteSettings *settings, const gchar *id)
-{
-       const gchar *uuid;
-       NMConnection *connection = NULL;
-       GSList *list, *l;
-
-       list = nm_remote_settings_list_connections (settings);
-       for (l = list; l; l = l->next) {
-               connection = l->data;
-               uuid = nm_connection_get_uuid (connection);
-               if (g_strcmp0 (uuid, id) == 0) {
-                       g_slist_free (list);
-                       return connection;
-               }
-       }
-
-       g_slist_free (list);
-       return NULL;
-}
-
-typedef struct {
-       NMConnectionList *self;
-       const gchar *uuid;
-       gboolean wait;
-} EditData;
-
-static void
-connections_read (NMRemoteSettings *settings, EditData *data)
-{
-       NMConnection *connection;
-       static gulong signal_id = 0;
-
-       connection = get_connection (settings, data->uuid);
-       if (connection) {
-               edit_connection (data->self, connection);
-               g_object_unref (connection);
-       } else if (data->wait) {
-               data->wait = FALSE;
-               signal_id = g_signal_connect (settings, "connections-read",
-                                             G_CALLBACK (connections_read), data);
-               return;
-       } else {
-               nm_connection_editor_error (NULL,
-                                           _("Error editing connection"),
-                                           _("Did not find a connection with UUID '%s'"), data->uuid);
-       }
-
-       if (signal_id != 0) {
-               g_signal_handler_disconnect (settings, signal_id);
-               signal_id = 0;
-       }
-
-       g_free (data);
-}
-
 void
 nm_connection_list_edit (NMConnectionList *self, const gchar *uuid)
 {
-       EditData *data;
+       NMConnection *connection;
 
        g_return_if_fail (NM_IS_CONNECTION_LIST (self));
 
-       data =  g_new0 (EditData, 1);
-       data->self = self;
-       data->uuid = uuid;
-       data->wait = TRUE;
+       connection = (NMConnection *) nm_client_get_connection_by_uuid (self->client, uuid);
+       if (!connection) {
+               nm_connection_editor_error (NULL,
+                                           _("Error editing connection"),
+                                           _("Did not find a connection with UUID '%s'"), uuid);
+               return;
+       }
 
-       connections_read (self->settings, data);
+       edit_connection (self, connection);
 }
 
 static void
diff --git a/src/connection-editor/nm-connection-list.h b/src/connection-editor/nm-connection-list.h
index ee9cf1c..32cc648 100644
--- a/src/connection-editor/nm-connection-list.h
+++ b/src/connection-editor/nm-connection-list.h
@@ -43,8 +43,7 @@ typedef struct {
        GtkTreeSortable *sortable;
        GType displayed_type;
 
-       NMClient *nm_client;
-       NMRemoteSettings *settings;
+       NMClient *client;
 
        GtkBuilder *gui;
        GtkWidget *dialog;
diff --git a/src/connection-editor/page-8021x-security.c b/src/connection-editor/page-8021x-security.c
index ebbdb62..57ff1c5 100644
--- a/src/connection-editor/page-8021x-security.c
+++ b/src/connection-editor/page-8021x-security.c
@@ -96,7 +96,6 @@ CEPage *
 ce_page_8021x_security_new (NMConnection *connection,
                             GtkWindow *parent_window,
                             NMClient *client,
-                            NMRemoteSettings *settings,
                             const char **out_secrets_setting_name,
                             GError **error)
 {
@@ -108,7 +107,6 @@ ce_page_8021x_security_new (NMConnection *connection,
                                                    connection,
                                                    parent_window,
                                                    client,
-                                                   settings,
                                                    NULL,
                                                    NULL,
                                                    _("802.1x Security")));
diff --git a/src/connection-editor/page-8021x-security.h b/src/connection-editor/page-8021x-security.h
index 3e96977..b06e33f 100644
--- a/src/connection-editor/page-8021x-security.h
+++ b/src/connection-editor/page-8021x-security.h
@@ -48,7 +48,6 @@ GType ce_page_8021x_security_get_type (void);
 CEPage *ce_page_8021x_security_new (NMConnection *connection,
                                     GtkWindow *parent,
                                     NMClient *client,
-                                    NMRemoteSettings *settings,
                                     const char **out_secrets_setting_name,
                                     GError **error);
 
diff --git a/src/connection-editor/page-bond.c b/src/connection-editor/page-bond.c
index efb511a..dcd2873 100644
--- a/src/connection-editor/page-bond.c
+++ b/src/connection-editor/page-bond.c
@@ -376,13 +376,13 @@ add_slave (CEPageMaster *master, NewConnectionResultFunc result_func)
        if (priv->slave_arptype == ARPHRD_INFINIBAND) {
                new_connection_of_type (priv->toplevel,
                                        NULL,
-                                       CE_PAGE (self)->settings,
+                                       CE_PAGE (self)->client,
                                        infiniband_connection_new,
                                        result_func,
                                        master);
        } else {
                new_connection_dialog (priv->toplevel,
-                                      CE_PAGE (self)->settings,
+                                      CE_PAGE (self)->client,
                                       connection_type_filter,
                                       result_func,
                                       master);
@@ -412,7 +412,6 @@ CEPage *
 ce_page_bond_new (NMConnection *connection,
                                  GtkWindow *parent_window,
                                  NMClient *client,
-                  NMRemoteSettings *settings,
                                  const char **out_secrets_setting_name,
                                  GError **error)
 {
@@ -423,7 +422,6 @@ ce_page_bond_new (NMConnection *connection,
                                          connection,
                                          parent_window,
                                          client,
-                                         settings,
                                          UIDIR "/ce-page-bond.ui",
                                          "BondPage",
                                          _("Bond")));
@@ -571,13 +569,13 @@ ce_page_bond_class_init (CEPageBondClass *bond_class)
 void
 bond_connection_new (GtkWindow *parent,
                      const char *detail,
-                     NMRemoteSettings *settings,
+                     NMClient *client,
                      PageNewConnectionResultFunc result_func,
                      gpointer user_data)
 {
        NMConnection *connection;
-       int bond_num = 0, num;
-       GSList *connections, *iter;
+       int bond_num = 0, num, i;
+       const GPtrArray *connections;
        NMConnection *conn2;
        const char *iface;
        char *my_iface;
@@ -585,14 +583,14 @@ bond_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("Bond connection %d"),
                                             NM_SETTING_BOND_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_bond_new ());
 
        /* Find an available interface name */
-       connections = nm_remote_settings_list_connections (settings);
-       for (iter = connections; iter; iter = iter->next) {
-               conn2 = iter->data;
+       connections = nm_client_get_connections (client);
+       for (i = 0; i < connections->len; i++) {
+               conn2 = connections->pdata[i];
 
                if (!nm_connection_is_type (conn2, NM_SETTING_BOND_SETTING_NAME))
                        continue;
@@ -604,7 +602,6 @@ bond_connection_new (GtkWindow *parent,
                if (bond_num <= num)
                        bond_num = num + 1;
        }
-       g_slist_free (connections);
 
        my_iface = g_strdup_printf ("bond%d", bond_num);
        g_object_set (G_OBJECT (connection),
diff --git a/src/connection-editor/page-bond.h b/src/connection-editor/page-bond.h
index c987b15..646abe1 100644
--- a/src/connection-editor/page-bond.h
+++ b/src/connection-editor/page-bond.h
@@ -46,13 +46,12 @@ GType ce_page_bond_get_type (void);
 CEPage *ce_page_bond_new (NMConnection *connection,
                           GtkWindow *parent,
                           NMClient *client,
-                          NMRemoteSettings *settings,
                           const char **out_secrets_setting_name,
                           GError **error);
 
 void bond_connection_new (GtkWindow *parent,
                           const char *detail,
-                          NMRemoteSettings *settings,
+                          NMClient *client,
                           PageNewConnectionResultFunc result_func,
                           gpointer user_data);
 
diff --git a/src/connection-editor/page-bridge-port.c b/src/connection-editor/page-bridge-port.c
index 60eb9c4..8d654b1 100644
--- a/src/connection-editor/page-bridge-port.c
+++ b/src/connection-editor/page-bridge-port.c
@@ -91,7 +91,6 @@ CEPage *
 ce_page_bridge_port_new (NMConnection *connection,
                          GtkWindow *parent_window,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error)
 {
@@ -102,7 +101,6 @@ ce_page_bridge_port_new (NMConnection *connection,
                                                 connection,
                                                 parent_window,
                                                 client,
-                                                settings,
                                                 UIDIR "/ce-page-bridge-port.ui",
                                                 "BridgePortPage",
                                                 /* Translators: a "Bridge Port" is a network
diff --git a/src/connection-editor/page-bridge-port.h b/src/connection-editor/page-bridge-port.h
index de5307a..a74f7f8 100644
--- a/src/connection-editor/page-bridge-port.h
+++ b/src/connection-editor/page-bridge-port.h
@@ -48,7 +48,6 @@ GType ce_page_bridge_port_get_type (void);
 CEPage *ce_page_bridge_port_new (NMConnection *connection,
                                  GtkWindow *parent,
                                  NMClient *client,
-                                 NMRemoteSettings *settings,
                                  const char **out_secrets_setting_name,
                                  GError **error);
 
diff --git a/src/connection-editor/page-bridge.c b/src/connection-editor/page-bridge.c
index e84e387..2ec037c 100644
--- a/src/connection-editor/page-bridge.c
+++ b/src/connection-editor/page-bridge.c
@@ -168,7 +168,7 @@ add_slave (CEPageMaster *master, NewConnectionResultFunc result_func)
        CEPageBridgePrivate *priv = CE_PAGE_BRIDGE_GET_PRIVATE (self);
 
        new_connection_dialog (priv->toplevel,
-                              CE_PAGE (self)->settings,
+                              CE_PAGE (self)->client,
                               connection_type_filter,
                               result_func,
                               master);
@@ -187,7 +187,6 @@ CEPage *
 ce_page_bridge_new (NMConnection *connection,
                     GtkWindow *parent_window,
                     NMClient *client,
-                    NMRemoteSettings *settings,
                     const char **out_secrets_setting_name,
                     GError **error)
 {
@@ -198,7 +197,6 @@ ce_page_bridge_new (NMConnection *connection,
                                          connection,
                                          parent_window,
                                          client,
-                                         settings,
                                          UIDIR "/ce-page-bridge.ui",
                                          "BridgePage",
                                          _("Bridge")));
@@ -286,14 +284,14 @@ ce_page_bridge_class_init (CEPageBridgeClass *bridge_class)
 
 void
 bridge_connection_new (GtkWindow *parent,
-                     const char *detail,
-                     NMRemoteSettings *settings,
-                     PageNewConnectionResultFunc result_func,
-                     gpointer user_data)
+                       const char *detail,
+                       NMClient *client,
+                       PageNewConnectionResultFunc result_func,
+                       gpointer user_data)
 {
        NMConnection *connection;
-       int bridge_num = 0, num;
-       GSList *connections, *iter;
+       int bridge_num = 0, num, i;
+       const GPtrArray *connections;
        NMConnection *conn2;
        const char *iface;
        char *my_iface;
@@ -301,14 +299,14 @@ bridge_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("Bridge connection %d"),
                                             NM_SETTING_BRIDGE_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_bridge_new ());
 
        /* Find an available interface name */
-       connections = nm_remote_settings_list_connections (settings);
-       for (iter = connections; iter; iter = iter->next) {
-               conn2 = iter->data;
+       connections = nm_client_get_connections (client);
+       for (i = 0; i < connections->len; i++) {
+               conn2 = connections->pdata[i];
 
                if (!nm_connection_is_type (conn2, NM_SETTING_BRIDGE_SETTING_NAME))
                        continue;
@@ -320,7 +318,6 @@ bridge_connection_new (GtkWindow *parent,
                if (bridge_num <= num)
                        bridge_num = num + 1;
        }
-       g_slist_free (connections);
 
        my_iface = g_strdup_printf ("bridge%d", bridge_num);
        g_object_set (G_OBJECT (connection),
diff --git a/src/connection-editor/page-bridge.h b/src/connection-editor/page-bridge.h
index f149dd2..4b1873f 100644
--- a/src/connection-editor/page-bridge.h
+++ b/src/connection-editor/page-bridge.h
@@ -46,13 +46,12 @@ GType ce_page_bridge_get_type (void);
 CEPage *ce_page_bridge_new (NMConnection *connection,
                             GtkWindow *parent,
                             NMClient *client,
-                            NMRemoteSettings *settings,
                             const char **out_secrets_setting_name,
                             GError **error);
 
 void bridge_connection_new (GtkWindow *parent,
                             const char *detail,
-                            NMRemoteSettings *settings,
+                            NMClient *client,
                             PageNewConnectionResultFunc result_func,
                             gpointer user_data);
 
diff --git a/src/connection-editor/page-dcb.c b/src/connection-editor/page-dcb.c
index 6433f6c..d2e01e7 100644
--- a/src/connection-editor/page-dcb.c
+++ b/src/connection-editor/page-dcb.c
@@ -582,7 +582,6 @@ CEPage *
 ce_page_dcb_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -595,7 +594,6 @@ ce_page_dcb_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         UIDIR "/ce-page-dcb.ui",
                                         "DcbPage",
                                         _("DCB")));
diff --git a/src/connection-editor/page-dcb.h b/src/connection-editor/page-dcb.h
index 2b5f393..ad34520 100644
--- a/src/connection-editor/page-dcb.h
+++ b/src/connection-editor/page-dcb.h
@@ -48,7 +48,6 @@ GType ce_page_dcb_get_type (void);
 CEPage *ce_page_dcb_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
diff --git a/src/connection-editor/page-dsl.c b/src/connection-editor/page-dsl.c
index 3023097..1f46706 100644
--- a/src/connection-editor/page-dsl.c
+++ b/src/connection-editor/page-dsl.c
@@ -115,7 +115,6 @@ CEPage *
 ce_page_dsl_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -126,7 +125,6 @@ ce_page_dsl_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         UIDIR "/ce-page-dsl.ui",
                                         "DslPage",
                                         _("DSL")));
@@ -183,16 +181,9 @@ validate (CEPage *page, NMConnection *connection, GError **error)
 {
        CEPageDsl *self = CE_PAGE_DSL (page);
        CEPageDslPrivate *priv = CE_PAGE_DSL_GET_PRIVATE (self);
-       GSList *foo;
-       gboolean valid;
 
        ui_to_setting (self);
-
-       foo = g_slist_append (NULL, nm_connection_get_setting_ppp (connection));
-       valid = nm_setting_verify (NM_SETTING (priv->setting), foo, error);
-       g_slist_free (foo);
-
-       return valid;
+       return nm_setting_verify (NM_SETTING (priv->setting), connection, error);
 }
 
 static void
@@ -216,7 +207,7 @@ ce_page_dsl_class_init (CEPageDslClass *dsl_class)
 void
 dsl_connection_new (GtkWindow *parent,
                     const char *detail,
-                    NMRemoteSettings *settings,
+                    NMClient *client,
                     PageNewConnectionResultFunc result_func,
                     gpointer user_data)
 {
@@ -226,7 +217,7 @@ dsl_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("DSL connection %d"),
                                             NM_SETTING_PPPOE_SETTING_NAME,
                                             FALSE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_pppoe_new ());
        nm_connection_add_setting (connection, nm_setting_wired_new ());
diff --git a/src/connection-editor/page-dsl.h b/src/connection-editor/page-dsl.h
index 68c6f7d..e893c9a 100644
--- a/src/connection-editor/page-dsl.h
+++ b/src/connection-editor/page-dsl.h
@@ -48,13 +48,12 @@ GType ce_page_dsl_get_type (void);
 CEPage *ce_page_dsl_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
 void dsl_connection_new (GtkWindow *parent,
                          const char *detail,
-                         NMRemoteSettings *settings,
+                         NMClient *client,
                          PageNewConnectionResultFunc callback,
                          gpointer user_data);
 
diff --git a/src/connection-editor/page-ethernet.c b/src/connection-editor/page-ethernet.c
index c42e49a..d3096ad 100644
--- a/src/connection-editor/page-ethernet.c
+++ b/src/connection-editor/page-ethernet.c
@@ -218,7 +218,6 @@ CEPage *
 ce_page_ethernet_new (NMConnection *connection,
                       GtkWindow *parent_window,
                       NMClient *client,
-                      NMRemoteSettings *settings,
                       const char **out_secrets_setting_name,
                       GError **error)
 {
@@ -229,7 +228,6 @@ ce_page_ethernet_new (NMConnection *connection,
                                              connection,
                                              parent_window,
                                              client,
-                                             settings,
                                              UIDIR "/ce-page-ethernet.ui",
                                              "EthernetPage",
                                              _("Ethernet")));
@@ -366,7 +364,7 @@ ce_page_ethernet_class_init (CEPageEthernetClass *ethernet_class)
 void
 ethernet_connection_new (GtkWindow *parent,
                          const char *detail,
-                         NMRemoteSettings *settings,
+                         NMClient *client,
                          PageNewConnectionResultFunc result_func,
                          gpointer user_data)
 {
@@ -375,7 +373,7 @@ ethernet_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("Ethernet connection %d"),
                                             NM_SETTING_WIRED_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_wired_new ());
 
diff --git a/src/connection-editor/page-ethernet.h b/src/connection-editor/page-ethernet.h
index 623f5e6..0a06a57 100644
--- a/src/connection-editor/page-ethernet.h
+++ b/src/connection-editor/page-ethernet.h
@@ -48,13 +48,12 @@ GType ce_page_ethernet_get_type (void);
 CEPage *ce_page_ethernet_new (NMConnection *connection,
                               GtkWindow *parent,
                               NMClient *client,
-                              NMRemoteSettings *settings,
                               const char **out_secrets_setting_name,
                               GError **error);
 
 void ethernet_connection_new (GtkWindow *parent,
                               const char *detail,
-                              NMRemoteSettings *settings,
+                              NMClient *client,
                               PageNewConnectionResultFunc result_func,
                               gpointer user_data);
 
diff --git a/src/connection-editor/page-general.c b/src/connection-editor/page-general.c
index 99029cf..8576bdc 100644
--- a/src/connection-editor/page-general.c
+++ b/src/connection-editor/page-general.c
@@ -30,7 +30,6 @@ G_DEFINE_TYPE (CEPageGeneral, ce_page_general, CE_TYPE_PAGE)
 #define CE_PAGE_GENERAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_GENERAL, 
CEPageGeneralPrivate))
 
 typedef struct {
-       NMRemoteSettings *remote_settings;
        NMSettingConnection *setting;
 
        gboolean is_vpn;
@@ -152,11 +151,6 @@ dispose (GObject *object)
        CEPageGeneral *self = CE_PAGE_GENERAL (object);
        CEPageGeneralPrivate *priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
 
-       if (priv->remote_settings) {
-               g_object_unref (priv->remote_settings);
-               priv->remote_settings = NULL;
-       }
-
        g_strfreev (priv->zones);
        priv->zones = NULL;
 
@@ -224,7 +218,8 @@ populate_ui (CEPageGeneral *self)
        NMSettingConnection *setting = priv->setting;
        const char *vpn_uuid;
        guint32 combo_idx = 0, idx;
-       GSList *con_list, *l;
+       const GPtrArray *con_list;
+       int i;
        GtkTreeIter iter;
        gboolean global_connection = TRUE;
 
@@ -234,12 +229,13 @@ populate_ui (CEPageGeneral *self)
 
        /* Secondary UUID (VPN) */
        vpn_uuid = nm_setting_connection_get_secondary (setting, 0);
-       con_list = nm_remote_settings_list_connections (priv->remote_settings);
-       for (l = con_list, idx = 0, combo_idx = 0; l; l = l->next) {
-               const char *uuid = nm_connection_get_uuid (l->data);
-               const char *id = nm_connection_get_id (l->data);
+       con_list = nm_client_get_connections (CE_PAGE (self)->client);
+       for (i = 0, idx = 0, combo_idx = 0; i < con_list->len; i++) {
+               NMConnection *conn = con_list->pdata[i];
+               const char *uuid = nm_connection_get_uuid (conn);
+               const char *id = nm_connection_get_id (conn);
 
-               if (!nm_connection_is_type (l->data, NM_SETTING_VPN_SETTING_NAME))
+               if (!nm_connection_is_type (conn, NM_SETTING_VPN_SETTING_NAME))
                        continue;
 
                gtk_list_store_append (priv->dependent_vpn_store, &iter);
@@ -248,7 +244,6 @@ populate_ui (CEPageGeneral *self)
                        combo_idx = idx;
                idx++;
        }
-       g_slist_free (con_list);
        gtk_combo_box_set_active (GTK_COMBO_BOX (priv->dependent_vpn), combo_idx);
 
        /* We don't support multiple VPNs at the moment, so hide secondary
@@ -308,7 +303,6 @@ CEPage *
 ce_page_general_new (NMConnection *connection,
                      GtkWindow *parent_window,
                      NMClient *client,
-                     NMRemoteSettings *settings,
                      const char **out_secrets_setting_name,
                      GError **error)
 {
@@ -319,7 +313,6 @@ ce_page_general_new (NMConnection *connection,
                                             connection,
                                             parent_window,
                                             client,
-                                            settings,
                                             UIDIR "/ce-page-general.ui",
                                             "GeneralPage",
                                             _("General")));
@@ -332,8 +325,6 @@ ce_page_general_new (NMConnection *connection,
        general_private_init (self);
        priv = CE_PAGE_GENERAL_GET_PRIVATE (self);
 
-       priv->remote_settings = g_object_ref (settings);
-
        priv->setting = nm_connection_get_setting_connection (connection);
        if (!priv->setting) {
                priv->setting = NM_SETTING_CONNECTION (nm_setting_connection_new ());
diff --git a/src/connection-editor/page-general.h b/src/connection-editor/page-general.h
index 6e68e3b..23ee94d 100644
--- a/src/connection-editor/page-general.h
+++ b/src/connection-editor/page-general.h
@@ -44,11 +44,10 @@ typedef struct {
 GType ce_page_general_get_type (void);
 
 CEPage *ce_page_general_new (NMConnection *connection,
-                                     GtkWindow *parent,
-                                     NMClient *client,
-                                     NMRemoteSettings *settings,
-                                     const char **out_secrets_setting_name,
-                                     GError **error);
+                             GtkWindow *parent,
+                             NMClient *client,
+                             const char **out_secrets_setting_name,
+                             GError **error);
 
 #endif  /* __PAGE_GENERAL_H__ */
 
diff --git a/src/connection-editor/page-infiniband.c b/src/connection-editor/page-infiniband.c
index 8a8464f..3f8cb7c 100644
--- a/src/connection-editor/page-infiniband.c
+++ b/src/connection-editor/page-infiniband.c
@@ -134,7 +134,6 @@ CEPage *
 ce_page_infiniband_new (NMConnection *connection,
                         GtkWindow *parent_window,
                         NMClient *client,
-                        NMRemoteSettings *settings,
                         const char **out_secrets_setting_name,
                         GError **error)
 {
@@ -145,7 +144,6 @@ ce_page_infiniband_new (NMConnection *connection,
                                                connection,
                                                parent_window,
                                                client,
-                                               settings,
                                                UIDIR "/ce-page-infiniband.ui",
                                                "InfinibandPage",
                                                _("InfiniBand")));
@@ -236,7 +234,7 @@ ce_page_infiniband_class_init (CEPageInfinibandClass *infiniband_class)
 void
 infiniband_connection_new (GtkWindow *parent,
                            const char *detail,
-                           NMRemoteSettings *settings,
+                           NMClient *client,
                            PageNewConnectionResultFunc result_func,
                            gpointer user_data)
 {
@@ -245,7 +243,7 @@ infiniband_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("InfiniBand connection %d"),
                                             NM_SETTING_INFINIBAND_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_infiniband_new ());
 
diff --git a/src/connection-editor/page-infiniband.h b/src/connection-editor/page-infiniband.h
index 55c741e..ab45277 100644
--- a/src/connection-editor/page-infiniband.h
+++ b/src/connection-editor/page-infiniband.h
@@ -46,13 +46,12 @@ GType ce_page_infiniband_get_type (void);
 CEPage *ce_page_infiniband_new (NMConnection *connection,
                                 GtkWindow *parent,
                                 NMClient *client,
-                                NMRemoteSettings *settings,
                                 const char **out_secrets_setting_name,
                                 GError **error);
 
 void infiniband_connection_new (GtkWindow *parent,
                                 const char *detail,
-                                NMRemoteSettings *settings,
+                                NMClient *client,
                                 PageNewConnectionResultFunc result_func,
                                 gpointer user_data);
 
diff --git a/src/connection-editor/page-ip4.c b/src/connection-editor/page-ip4.c
index 0e0b76c..84b0f1f 100644
--- a/src/connection-editor/page-ip4.c
+++ b/src/connection-editor/page-ip4.c
@@ -47,7 +47,7 @@ G_DEFINE_TYPE (CEPageIP4, ce_page_ip4, CE_TYPE_PAGE)
 #define COL_LAST COL_GATEWAY
 
 typedef struct {
-       NMSettingIP4Config *setting;
+       NMSettingIPConfig *setting;
        char *connection_id;
        GType connection_type;
 
@@ -335,7 +335,7 @@ static void
 populate_ui (CEPageIP4 *self)
 {
        CEPageIP4Private *priv = CE_PAGE_IP4_GET_PRIVATE (self);
-       NMSettingIP4Config *setting = priv->setting;
+       NMSettingIPConfig *setting = priv->setting;
        GtkListStore *store;
        GtkTreeIter model_iter;
        int method = IP4_METHOD_AUTO;
@@ -346,7 +346,7 @@ populate_ui (CEPageIP4 *self)
 
        /* Method */
        gtk_combo_box_set_active (priv->method, 0);
-       str_method = nm_setting_ip4_config_get_method (setting);
+       str_method = nm_setting_ip_config_get_method (setting);
        if (str_method) {
                if (!strcmp (str_method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL))
                        method = IP4_METHOD_LINK_LOCAL;
@@ -358,7 +358,7 @@ populate_ui (CEPageIP4 *self)
                        method = IP4_METHOD_DISABLED;
        }
 
-       if (method == IP4_METHOD_AUTO && nm_setting_ip4_config_get_ignore_auto_dns (setting))
+       if (method == IP4_METHOD_AUTO && nm_setting_ip_config_get_ignore_auto_dns (setting))
                method = IP4_METHOD_AUTO_ADDRESSES;
 
        info.method = method;
@@ -367,10 +367,8 @@ populate_ui (CEPageIP4 *self)
 
        /* Addresses */
        store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-       for (i = 0; i < nm_setting_ip4_config_get_num_addresses (setting); i++) {
-               NMIP4Address *addr = nm_setting_ip4_config_get_address (setting, i);
-               struct in_addr tmp_addr;
-               char buf[INET_ADDRSTRLEN + 1];
+       for (i = 0; i < nm_setting_ip_config_get_num_addresses (setting); i++) {
+               NMIPAddress *addr = nm_setting_ip_config_get_address (setting, i);
 
                if (!addr) {
                        g_warning ("%s: empty IP4 Address structure!", __func__);
@@ -378,18 +376,12 @@ populate_ui (CEPageIP4 *self)
                }
 
                gtk_list_store_append (store, &model_iter);
-
-               tmp_addr.s_addr = nm_ip4_address_get_address (addr);
-               (void) inet_ntop (AF_INET, &tmp_addr, &buf[0], sizeof (buf));
-               gtk_list_store_set (store, &model_iter, COL_ADDRESS, buf, -1);
-
-               tmp_addr.s_addr = nm_utils_ip4_prefix_to_netmask (nm_ip4_address_get_prefix (addr));
-               (void) inet_ntop (AF_INET, &tmp_addr, &buf[0], sizeof (buf));
-               gtk_list_store_set (store, &model_iter, COL_PREFIX, buf, -1);
-
-               tmp_addr.s_addr = nm_ip4_address_get_gateway (addr);
-               (void) inet_ntop (AF_INET, &tmp_addr, &buf[0], sizeof (buf));
-               gtk_list_store_set (store, &model_iter, COL_GATEWAY, buf, -1);
+               gtk_list_store_set (store, &model_iter,
+                                   COL_ADDRESS, nm_ip_address_get_address (addr),
+                                   COL_PREFIX, nm_ip_address_get_prefix (addr),
+                                   /* FIXME */
+                                   COL_GATEWAY, i == 0 ? nm_setting_ip_config_get_gateway (setting) : NULL,
+                                   -1);
        }
 
        gtk_tree_view_set_model (priv->addr_list, GTK_TREE_MODEL (store));
@@ -399,10 +391,10 @@ populate_ui (CEPageIP4 *self)
 
        /* DNS servers */
        string = g_string_new ("");
-       for (i = 0; i < nm_setting_ip4_config_get_num_dns (setting); i++) {
+       for (i = 0; i < nm_setting_ip_config_get_num_dns (setting); i++) {
                const char *dns;
 
-               dns = nm_setting_ip4_config_get_dns (setting, i);
+               dns = nm_setting_ip_config_get_dns (setting, i);
                if (!dns)
                        continue;
 
@@ -415,24 +407,24 @@ populate_ui (CEPageIP4 *self)
 
        /* DNS searches */
        string = g_string_new ("");
-       for (i = 0; i < nm_setting_ip4_config_get_num_dns_searches (setting); i++) {
+       for (i = 0; i < nm_setting_ip_config_get_num_dns_searches (setting); i++) {
                if (string->len)
                        g_string_append (string, ", ");
-               g_string_append (string, nm_setting_ip4_config_get_dns_search (setting, i));
+               g_string_append (string, nm_setting_ip_config_get_dns_search (setting, i));
        }
        gtk_entry_set_text (priv->dns_searches, string->str);
        g_string_free (string, TRUE);
 
        if ((method == IP4_METHOD_AUTO) || (method == IP4_METHOD_AUTO_ADDRESSES)) {
-               if (nm_setting_ip4_config_get_dhcp_client_id (setting)) {
+               if (nm_setting_ip4_config_get_dhcp_client_id (NM_SETTING_IP4_CONFIG (setting))) {
                        gtk_entry_set_text (priv->dhcp_client_id,
-                                           nm_setting_ip4_config_get_dhcp_client_id (setting));
+                                           nm_setting_ip4_config_get_dhcp_client_id (NM_SETTING_IP4_CONFIG 
(setting)));
                }
        }
 
        /* IPv4 required */
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ip4_required),
-                                     !nm_setting_ip4_config_get_may_fail (setting));
+                                     !nm_setting_ip_config_get_may_fail (setting));
 }
 
 static void
@@ -824,7 +816,7 @@ routes_button_clicked_cb (GtkWidget *button, gpointer user_data)
        toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
        g_return_if_fail (gtk_widget_is_toplevel (toplevel));
 
-       method = nm_setting_ip4_config_get_method (priv->setting);
+       method = nm_setting_ip_config_get_method (priv->setting);
        if (!method || !strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO))
                automatic = TRUE;
 
@@ -978,7 +970,6 @@ CEPage *
 ce_page_ip4_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -990,7 +981,6 @@ ce_page_ip4_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         UIDIR "/ce-page-ip4.ui",
                                         "IP4Page",
                                         _("IPv4 Settings")));
@@ -1010,7 +1000,7 @@ ce_page_ip4_new (NMConnection *connection,
 
        priv->setting = nm_connection_get_setting_ip4_config (connection);
        if (!priv->setting) {
-               priv->setting = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ());
+               priv->setting = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
                nm_connection_add_setting (connection, NM_SETTING (priv->setting));
        }
 
@@ -1022,7 +1012,7 @@ ce_page_ip4_new (NMConnection *connection,
 static void
 free_one_addr (gpointer data)
 {
-       nm_ip4_address_unref ((NMIP4Address *) data);
+       nm_ip_address_unref ((NMIPAddress *) data);
 }
 
 static gboolean
@@ -1037,6 +1027,7 @@ ui_to_setting (CEPageIP4 *self)
        char **dns_servers = NULL;
        char **search_domains = NULL;
        GPtrArray *addresses = NULL;
+       char *gateway = NULL;
        gboolean valid = FALSE, iter_valid;
        const char *text;
        gboolean ignore_auto_dns = FALSE;
@@ -1077,52 +1068,56 @@ ui_to_setting (CEPageIP4 *self)
 
        addresses = g_ptr_array_sized_new (1);
        while (iter_valid) {
-               char *item = NULL;
-               struct in_addr tmp_addr, tmp_gateway = { 0 };
-               NMIP4Address *nm_addr;
+               char *addr = NULL, *netmask = NULL, *addr_gw = NULL;
+               NMIPAddress *nm_addr;
                guint32 prefix;
 
-               gtk_tree_model_get (model, &tree_iter, COL_ADDRESS, &item, -1);
-               if (!item || inet_pton (AF_INET, item, &tmp_addr) <= 0) {
-                       g_warning ("%s: IPv4 address '%s' missing or invalid!",
-                                  __func__, item ? item : "<none>");
-                       g_free (item);
-                       goto out;
-               }
-               g_free (item);
+               gtk_tree_model_get (model, &tree_iter,
+                                   COL_ADDRESS, &addr,
+                                   COL_PREFIX, &netmask,
+                                   COL_GATEWAY, &addr_gw,
+                                   -1);
 
-               gtk_tree_model_get (model, &tree_iter, COL_PREFIX, &item, -1);
-               if (!item) {
-                       g_warning ("%s: IPv4 prefix '%s' missing!",
-                                  __func__, item ? item : "<none>");
+               if (!addr || !nm_utils_ipaddr_valid (AF_INET, addr)) {
+                       g_warning ("%s: IPv4 address '%s' missing or invalid!",
+                                  __func__, addr ? addr : "<none>");
+                       g_free (addr);
+                       g_free (netmask);
+                       g_free (addr_gw);
                        goto out;
                }
 
-               if (!parse_netmask (item, &prefix)) {
-                       g_warning ("%s: IPv4 prefix '%s' invalid!",
-                                  __func__, item ? item : "<none>");
-                       g_free (item);
+               if (!netmask || !parse_netmask (netmask, &prefix)) {
+                       g_warning ("%s: IPv4 prefix '%s' missing or invalid!",
+                                  __func__, netmask ? netmask : "<none>");
+                       g_free (addr);
+                       g_free (netmask);
+                       g_free (addr_gw);
                        goto out;
                }
-               g_free (item);
 
                /* Gateway is optional... */
-               gtk_tree_model_get (model, &tree_iter, COL_GATEWAY, &item, -1);
-               if (item && strlen (item) && inet_pton (AF_INET, item, &tmp_gateway) <= 0) {
+               if (addr_gw && !nm_utils_ipaddr_valid (AF_INET, addr_gw)) {
                        g_warning ("%s: IPv4 gateway '%s' invalid!",
-                                  __func__, item ? item : "<none>");
-                       g_free (item);
+                                  __func__, addr_gw);
+                       g_free (addr);
+                       g_free (netmask);
+                       g_free (addr_gw);
                        goto out;
                }
-               g_free (item);
-
-               nm_addr = nm_ip4_address_new ();
-               nm_ip4_address_set_address (nm_addr, tmp_addr.s_addr);
-               nm_ip4_address_set_prefix (nm_addr, (guint32) prefix);
-               nm_ip4_address_set_gateway (nm_addr, tmp_gateway.s_addr);
 
+               nm_addr = nm_ip_address_new (AF_INET, addr, prefix, NULL);
                g_ptr_array_add (addresses, nm_addr);
 
+               if (addresses->len == 1 && addr_gw) {
+                       gateway = addr_gw;
+                       addr_gw = NULL;
+               }
+
+               g_free (addr);
+               g_free (netmask);
+               g_free (addr_gw);
+
                iter_valid = gtk_tree_model_iter_next (model, &tree_iter);
        }
 
@@ -1184,13 +1179,14 @@ ui_to_setting (CEPageIP4 *self)
 
        /* Update setting */
        g_object_set (priv->setting,
-                     NM_SETTING_IP4_CONFIG_METHOD, method,
-                     NM_SETTING_IP4_CONFIG_ADDRESSES, addresses,
-                     NM_SETTING_IP4_CONFIG_DNS, dns_servers,
-                     NM_SETTING_IP4_CONFIG_DNS_SEARCH, search_domains,
-                     NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
+                     NM_SETTING_IP_CONFIG_METHOD, method,
+                     NM_SETTING_IP_CONFIG_ADDRESSES, addresses,
+                     NM_SETTING_IP_CONFIG_GATEWAY, gateway,
+                     NM_SETTING_IP_CONFIG_DNS, dns_servers,
+                     NM_SETTING_IP_CONFIG_DNS_SEARCH, search_domains,
+                     NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
                      NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, dhcp_client_id,
-                     NM_SETTING_IP4_CONFIG_MAY_FAIL, may_fail,
+                     NM_SETTING_IP_CONFIG_MAY_FAIL, may_fail,
                      NULL);
        valid = TRUE;
 
@@ -1199,6 +1195,7 @@ out:
                g_ptr_array_foreach (addresses, (GFunc) free_one_addr, NULL);
                g_ptr_array_free (addresses, TRUE);
        }
+       g_free (gateway);
 
        g_strfreev (dns_servers);
        g_strfreev (search_domains);
diff --git a/src/connection-editor/page-ip4.h b/src/connection-editor/page-ip4.h
index 2b2bf1f..e9886cf 100644
--- a/src/connection-editor/page-ip4.h
+++ b/src/connection-editor/page-ip4.h
@@ -48,7 +48,6 @@ GType ce_page_ip4_get_type (void);
 CEPage *ce_page_ip4_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
diff --git a/src/connection-editor/page-ip6.c b/src/connection-editor/page-ip6.c
index 5bcba42..eb0bb7a 100644
--- a/src/connection-editor/page-ip6.c
+++ b/src/connection-editor/page-ip6.c
@@ -46,7 +46,7 @@ G_DEFINE_TYPE (CEPageIP6, ce_page_ip6, CE_TYPE_PAGE)
 #define COL_LAST COL_GATEWAY
 
 typedef struct {
-       NMSettingIP6Config *setting;
+       NMSettingIPConfig *setting;
        char *connection_id;
        GType connection_type;
 
@@ -342,7 +342,7 @@ static void
 populate_ui (CEPageIP6 *self)
 {
        CEPageIP6Private *priv = CE_PAGE_IP6_GET_PRIVATE (self);
-       NMSettingIP6Config *setting = priv->setting;
+       NMSettingIPConfig *setting = priv->setting;
        GtkListStore *store;
        GtkTreeIter model_iter;
        int method = IP6_METHOD_AUTO;
@@ -355,7 +355,7 @@ populate_ui (CEPageIP6 *self)
 
        /* Method */
        gtk_combo_box_set_active (priv->method, 0);
-       str_method = nm_setting_ip6_config_get_method (setting);
+       str_method = nm_setting_ip_config_get_method (setting);
        if (str_method) {
                if (!strcmp (str_method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE))
                        method = IP6_METHOD_IGNORE;
@@ -371,7 +371,7 @@ populate_ui (CEPageIP6 *self)
                        method = IP6_METHOD_SHARED;
        }
 
-       if (method == IP6_METHOD_AUTO && nm_setting_ip6_config_get_ignore_auto_dns (setting))
+       if (method == IP6_METHOD_AUTO && nm_setting_ip_config_get_ignore_auto_dns (setting))
                method = IP6_METHOD_AUTO_ADDRESSES;
 
        info.method = method;
@@ -380,33 +380,24 @@ populate_ui (CEPageIP6 *self)
 
        /* Addresses */
        store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-       for (i = 0; i < nm_setting_ip6_config_get_num_addresses (setting); i++) {
-               NMIP6Address *addr = nm_setting_ip6_config_get_address (setting, i);
-               const struct in6_addr *tmp_addr;
-               char buf[INET6_ADDRSTRLEN + 1];
+       for (i = 0; i < nm_setting_ip_config_get_num_addresses (setting); i++) {
+               NMIPAddress *addr = nm_setting_ip_config_get_address (setting, i);
+               char buf[32];
 
                if (!addr) {
                        g_warning ("%s: empty IP6 Address structure!", __func__);
                        continue;
                }
 
-               gtk_list_store_append (store, &model_iter);
-
-               /* Address */
-               tmp_addr = nm_ip6_address_get_address (addr);
-               (void) inet_ntop (AF_INET6, tmp_addr, &buf[0], sizeof (buf));
-               gtk_list_store_set (store, &model_iter, COL_ADDRESS, buf, -1);
+               snprintf (buf, sizeof (buf), "%u", nm_ip_address_get_prefix (addr));
 
-               /* Prefix */
-               snprintf (buf, sizeof (buf), "%u", nm_ip6_address_get_prefix (addr));
-               gtk_list_store_set (store, &model_iter, COL_PREFIX, buf, -1);
-
-               /* Gateway */
-               tmp_addr = nm_ip6_address_get_gateway (addr);
-               if (tmp_addr && !IN6_IS_ADDR_UNSPECIFIED (tmp_addr)) {
-                       (void) inet_ntop (AF_INET6, tmp_addr, &buf[0], sizeof (buf));
-                       gtk_list_store_set (store, &model_iter, COL_GATEWAY, buf, -1);
-               }
+               gtk_list_store_append (store, &model_iter);
+               gtk_list_store_set (store, &model_iter,
+                                   COL_ADDRESS, nm_ip_address_get_address (addr),
+                                   COL_PREFIX, buf,
+                                   /* FIXME */
+                                   COL_GATEWAY, i == 0 ? nm_setting_ip_config_get_gateway (setting) : NULL,
+                                   -1);
        }
 
        gtk_tree_view_set_model (priv->addr_list, GTK_TREE_MODEL (store));
@@ -416,10 +407,10 @@ populate_ui (CEPageIP6 *self)
 
        /* DNS servers */
        string = g_string_new ("");
-       for (i = 0; i < nm_setting_ip6_config_get_num_dns (setting); i++) {
+       for (i = 0; i < nm_setting_ip_config_get_num_dns (setting); i++) {
                const char *dns;
 
-               dns = nm_setting_ip6_config_get_dns (setting, i);
+               dns = nm_setting_ip_config_get_dns (setting, i);
                if (!dns)
                        continue;
 
@@ -432,16 +423,16 @@ populate_ui (CEPageIP6 *self)
 
        /* DNS searches */
        string = g_string_new ("");
-       for (i = 0; i < nm_setting_ip6_config_get_num_dns_searches (setting); i++) {
+       for (i = 0; i < nm_setting_ip_config_get_num_dns_searches (setting); i++) {
                if (string->len)
                        g_string_append (string, ", ");
-               g_string_append (string, nm_setting_ip6_config_get_dns_search (setting, i));
+               g_string_append (string, nm_setting_ip_config_get_dns_search (setting, i));
        }
        gtk_entry_set_text (priv->dns_searches, string->str);
        g_string_free (string, TRUE);
 
        /* IPv6 privacy extensions */
-       ip6_privacy = nm_setting_ip6_config_get_ip6_privacy (setting);
+       ip6_privacy = nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (setting));
        switch (ip6_privacy) {
        case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
                ip6_privacy_idx = IP6_PRIVACY_DISABLED;
@@ -460,7 +451,7 @@ populate_ui (CEPageIP6 *self)
 
        /* IPv6 required */
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ip6_required),
-                                     !nm_setting_ip6_config_get_may_fail (setting));
+                                     !nm_setting_ip_config_get_may_fail (setting));
 }
 
 static void
@@ -820,7 +811,7 @@ routes_button_clicked_cb (GtkWidget *button, gpointer user_data)
        toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
        g_return_if_fail (gtk_widget_is_toplevel (toplevel));
 
-       method = nm_setting_ip6_config_get_method (priv->setting);
+       method = nm_setting_ip_config_get_method (priv->setting);
        if (!method || !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO))
                automatic = TRUE;
 
@@ -973,7 +964,6 @@ CEPage *
 ce_page_ip6_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -985,7 +975,6 @@ ce_page_ip6_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         UIDIR "/ce-page-ip6.ui",
                                         "IP6Page",
                                         _("IPv6 Settings")));
@@ -1005,7 +994,7 @@ ce_page_ip6_new (NMConnection *connection,
 
        priv->setting = nm_connection_get_setting_ip6_config (connection);
        if (!priv->setting) {
-               priv->setting = NM_SETTING_IP6_CONFIG (nm_setting_ip6_config_new ());
+               priv->setting = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
                nm_connection_add_setting (connection, NM_SETTING (priv->setting));
        }
 
@@ -1061,75 +1050,81 @@ ui_to_setting (CEPageIP6 *self)
 
        g_object_freeze_notify (G_OBJECT (priv->setting));
        g_object_set (priv->setting,
-                     NM_SETTING_IP6_CONFIG_METHOD, method,
-                     NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
+                     NM_SETTING_IP_CONFIG_METHOD, method,
+                     NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
                      NULL);
 
        /* IP addresses */
-       nm_setting_ip6_config_clear_addresses (priv->setting);
+       nm_setting_ip_config_clear_addresses (priv->setting);
        model = gtk_tree_view_get_model (priv->addr_list);
        iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter);
        while (iter_valid) {
-               char *item = NULL, *end;
-               struct in6_addr tmp_addr, tmp_gw;
-               gboolean have_gw = FALSE;
-               NMIP6Address *addr;
+               char *addr_str = NULL, *prefix_str = NULL, *addr_gw_str = NULL, *end;
+               NMIPAddress *addr;
                guint32 prefix;
 
-               /* IP address */
-               gtk_tree_model_get (model, &tree_iter, COL_ADDRESS, &item, -1);
-               if (!item || !inet_pton (AF_INET6, item, &tmp_addr)) {
+               gtk_tree_model_get (model, &tree_iter,
+                                   COL_ADDRESS, &addr_str,
+                                   COL_PREFIX, &prefix_str,
+                                   COL_GATEWAY, &addr_gw_str,
+                                   -1);
+
+               if (!addr_str || !nm_utils_ipaddr_valid (AF_INET6, addr_str)) {
                        g_warning ("%s: IPv6 address '%s' missing or invalid!",
-                                  __func__, item ? item : "<none>");
-                       g_free (item);
+                                  __func__, addr_str ? addr_str : "<none>");
+                       g_free (addr_str);
+                       g_free (prefix_str);
+                       g_free (addr_gw_str);
                        goto out;
                }
-               g_free (item);
 
-               /* Prefix */
-               gtk_tree_model_get (model, &tree_iter, COL_PREFIX, &item, -1);
-               if (!item) {
-                       g_warning ("%s: IPv6 prefix '%s' missing!",
-                                  __func__, item ? item : "<none>");
+               if (!prefix_str) {
+                       g_warning ("%s: IPv6 prefix missing!", __func__);
+                       g_free (addr_str);
+                       g_free (prefix_str);
+                       g_free (addr_gw_str);
                        goto out;
                }
 
-               prefix = strtoul (item, &end, 10);
+               prefix = strtoul (prefix_str, &end, 10);
                if (!end || *end || prefix == 0 || prefix > 128) {
                        g_warning ("%s: IPv6 prefix '%s' invalid!",
-                                  __func__, item ? item : "<none>");
-                       g_free (item);
+                                  __func__, prefix_str);
+                       g_free (addr_str);
+                       g_free (prefix_str);
+                       g_free (addr_gw_str);
                        goto out;
                }
-               g_free (item);
-
-               /* Gateway */
-               gtk_tree_model_get (model, &tree_iter, COL_GATEWAY, &item, -1);
-               if (item && strlen (item)) {
-                       if (!inet_pton (AF_INET6, item, &tmp_gw)) {
-                               g_warning ("%s: IPv6 gateway '%s' missing or invalid!",
-                                          __func__, item ? item : "<none>");
-                               g_free (item);
-                               goto out;
-                       }
-                       if (!IN6_IS_ADDR_UNSPECIFIED (&tmp_gw))
-                               have_gw = TRUE;
+
+               /* Gateway is optional... */
+               if (addr_gw_str && !nm_utils_ipaddr_valid (AF_INET6, addr_gw_str)) {
+                       g_warning ("%s: IPv6 gateway '%s' invalid!",
+                                  __func__, addr_gw_str);
+                       g_free (addr_str);
+                       g_free (prefix_str);
+                       g_free (addr_gw_str);
+                       goto out;
+               }
+
+               addr = nm_ip_address_new (AF_INET6, addr_str, prefix, NULL);
+               nm_setting_ip_config_add_address (priv->setting, addr);
+               nm_ip_address_unref (addr);
+
+               if (nm_setting_ip_config_get_num_addresses (priv->setting) == 1 && addr_gw_str) {
+                       g_object_set (G_OBJECT (priv->setting),
+                                     NM_SETTING_IP_CONFIG_GATEWAY, addr_gw_str,
+                                     NULL);
                }
-               g_free (item);
 
-               addr = nm_ip6_address_new ();
-               nm_ip6_address_set_address (addr, &tmp_addr);
-               nm_ip6_address_set_prefix (addr, prefix);
-               if (have_gw)
-                       nm_ip6_address_set_gateway (addr, &tmp_gw);
-               nm_setting_ip6_config_add_address (priv->setting, addr);
-               nm_ip6_address_unref (addr);
+               g_free (addr_str);
+               g_free (prefix_str);
+               g_free (addr_gw_str);
 
                iter_valid = gtk_tree_model_iter_next (model, &tree_iter);
        }
 
        /* DNS servers */
-       nm_setting_ip6_config_clear_dns (priv->setting);
+       nm_setting_ip_config_clear_dns (priv->setting);
        text = gtk_entry_get_text (GTK_ENTRY (priv->dns_servers));
        if (text && strlen (text)) {
                items = g_strsplit_set (text, ", ;", 0);
@@ -1141,7 +1136,7 @@ ui_to_setting (CEPageIP6 *self)
                                continue;
 
                        if (inet_pton (AF_INET6, stripped, &tmp_addr)) {
-                               nm_setting_ip6_config_add_dns (priv->setting, stripped);
+                               nm_setting_ip_config_add_dns (priv->setting, stripped);
                        } else {
                                g_strfreev (items);
                                goto out;
@@ -1151,7 +1146,7 @@ ui_to_setting (CEPageIP6 *self)
        }
 
        /* Search domains */
-       nm_setting_ip6_config_clear_dns_searches (priv->setting);
+       nm_setting_ip_config_clear_dns_searches (priv->setting);
        text = gtk_entry_get_text (GTK_ENTRY (priv->dns_searches));
        if (text && strlen (text)) {
                items = g_strsplit_set (text, ", ;:", 0);
@@ -1159,7 +1154,7 @@ ui_to_setting (CEPageIP6 *self)
                        char *stripped = g_strstrip (*iter);
 
                        if (strlen (stripped))
-                               nm_setting_ip6_config_add_dns_search (priv->setting, stripped);
+                               nm_setting_ip_config_add_dns_search (priv->setting, stripped);
                }
                g_strfreev (items);
        }
@@ -1182,7 +1177,7 @@ ui_to_setting (CEPageIP6 *self)
 
        may_fail = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ip6_required));
        g_object_set (G_OBJECT (priv->setting),
-                     NM_SETTING_IP6_CONFIG_MAY_FAIL, may_fail,
+                     NM_SETTING_IP_CONFIG_MAY_FAIL, may_fail,
                      NM_SETTING_IP6_CONFIG_IP6_PRIVACY, ip6_privacy,
                      NULL);
 
diff --git a/src/connection-editor/page-ip6.h b/src/connection-editor/page-ip6.h
index 16d222e..defc23c 100644
--- a/src/connection-editor/page-ip6.h
+++ b/src/connection-editor/page-ip6.h
@@ -48,7 +48,6 @@ GType ce_page_ip6_get_type (void);
 CEPage *ce_page_ip6_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
diff --git a/src/connection-editor/page-master.c b/src/connection-editor/page-master.c
index 2299944..979adc5 100644
--- a/src/connection-editor/page-master.c
+++ b/src/connection-editor/page-master.c
@@ -96,7 +96,7 @@ dispose (GObject *object)
        CEPageMasterPrivate *priv = CE_PAGE_MASTER_GET_PRIVATE (self);
        GtkTreeIter iter;
 
-       g_signal_handlers_disconnect_matched (CE_PAGE (self)->settings, G_SIGNAL_MATCH_DATA,
+       g_signal_handlers_disconnect_matched (CE_PAGE (self)->client, G_SIGNAL_MATCH_DATA,
                                              0, 0, NULL, NULL, self);
 
        if (gtk_tree_model_get_iter_first (priv->connections_model, &iter)) {
@@ -143,7 +143,7 @@ find_connection (CEPageMaster *self, NMRemoteConnection *connection, GtkTreeIter
 }
 
 static void
-connection_removed (NMRemoteSettings *settings,
+connection_removed (NMClient *client,
                     NMRemoteConnection *connection,
                     gpointer user_data)
 {
@@ -267,7 +267,7 @@ check_new_slave_physical_port (CEPageMaster *self, NMConnection *conn)
 }
 
 static void
-connection_added (NMRemoteSettings *settings,
+connection_added (NMClient *client,
                   NMRemoteConnection *connection,
                   gpointer user_data)
 {
@@ -307,7 +307,7 @@ connection_added (NMRemoteSettings *settings,
                            -1);
        ce_page_changed (CE_PAGE (self));
 
-       g_signal_connect (settings, NM_REMOTE_SETTINGS_CONNECTION_REMOVED,
+       g_signal_connect (client, NM_CLIENT_CONNECTION_REMOVED,
                          G_CALLBACK (connection_removed), self);
        g_signal_connect (connection, NM_CONNECTION_CHANGED,
                          G_CALLBACK (connection_changed), self);
@@ -387,8 +387,7 @@ add_connection (NMConnection *connection,
 
        editor = nm_connection_editor_new (priv->toplevel,
                                           connection,
-                                          CE_PAGE (self)->client,
-                                          CE_PAGE (self)->settings);
+                                          CE_PAGE (self)->client);
        if (!editor) {
                g_object_unref (connection);
                return;
@@ -457,8 +456,7 @@ edit_clicked (GtkButton *button, gpointer user_data)
 
        editor = nm_connection_editor_new (priv->toplevel,
                                           NM_CONNECTION (connection),
-                                          CE_PAGE (self)->client,
-                                          CE_PAGE (self)->settings);
+                                          CE_PAGE (self)->client);
        if (!editor)
                return;
 
@@ -495,7 +493,8 @@ populate_ui (CEPageMaster *self)
        CEPageMasterPrivate *priv = CE_PAGE_MASTER_GET_PRIVATE (self);
        NMSettingConnection *s_con;
        const char *iface;
-       GSList *connections, *c;
+       const GPtrArray *connections;
+       int i;
 
        s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
        g_return_if_fail (s_con != NULL);
@@ -505,9 +504,9 @@ populate_ui (CEPageMaster *self)
        gtk_entry_set_text (priv->interface_name, iface ? iface : "");
 
        /* Slave connections */
-       connections = nm_remote_settings_list_connections (CE_PAGE (self)->settings);
-       for (c = connections; c; c = c->next)
-               connection_added (CE_PAGE (self)->settings, c->data, self);
+       connections = nm_client_get_connections (CE_PAGE (self)->client);
+       for (i = 0; i < connections->len; i++)
+               connection_added (CE_PAGE (self)->client, connections->pdata[i], self);
 }
 
 static void
@@ -545,7 +544,7 @@ finish_setup (CEPageMaster *self, gpointer unused, GError *error, gpointer user_
 
        populate_ui (self);
 
-       g_signal_connect (CE_PAGE (self)->settings, NM_REMOTE_SETTINGS_CONNECTION_ADDED,
+       g_signal_connect (CE_PAGE (self)->client, NM_CLIENT_CONNECTION_ADDED,
                          G_CALLBACK (connection_added), self);
 
        g_signal_connect (priv->interface_name, "changed", G_CALLBACK (stuff_changed), self);
diff --git a/src/connection-editor/page-mobile.c b/src/connection-editor/page-mobile.c
index 6da78eb..e34614a 100644
--- a/src/connection-editor/page-mobile.c
+++ b/src/connection-editor/page-mobile.c
@@ -296,7 +296,6 @@ CEPage *
 ce_page_mobile_new (NMConnection *connection,
                     GtkWindow *parent_window,
                     NMClient *client,
-                    NMRemoteSettings *settings,
                     const char **out_secrets_setting_name,
                     GError **error)
 {
@@ -307,7 +306,6 @@ ce_page_mobile_new (NMConnection *connection,
                                            connection,
                                            parent_window,
                                            client,
-                                           settings,
                                            UIDIR "/ce-page-mobile.ui",
                                            "MobilePage",
                                            _("Mobile Broadband")));
@@ -452,7 +450,7 @@ add_default_serial_setting (NMConnection *connection)
 }
 
 typedef struct {
-    NMRemoteSettings *settings;
+    NMClient *client;
     PageNewConnectionResultFunc result_func;
     gpointer user_data;
 } WizardInfo;
@@ -502,7 +500,7 @@ new_connection_mobile_wizard_done (NMAMobileWizard *wizard,
                        detail = g_strdup_printf ("%s %s %%d", method->provider_name, method->plan_name);
                else
                        detail = g_strdup_printf ("%s connection %%d", method->provider_name);
-               connection = ce_page_new_connection (detail, ctype, FALSE, info->settings, info->user_data);
+               connection = ce_page_new_connection (detail, ctype, FALSE, info->client, info->user_data);
                g_free (detail);
 
                nm_connection_add_setting (connection, type_setting);
@@ -515,7 +513,7 @@ new_connection_mobile_wizard_done (NMAMobileWizard *wizard,
        if (wizard)
                nma_mobile_wizard_destroy (wizard);
 
-       g_object_unref (info->settings);
+       g_object_unref (info->client);
        g_free (info);
 }
 
@@ -528,7 +526,7 @@ cancel_dialog (GtkDialog *dialog)
 void
 mobile_connection_new (GtkWindow *parent,
                        const char *detail,
-                       NMRemoteSettings *settings,
+                       NMClient *client,
                        PageNewConnectionResultFunc result_func,
                        gpointer user_data)
 {
@@ -541,7 +539,7 @@ mobile_connection_new (GtkWindow *parent,
 
        info = g_malloc0 (sizeof (WizardInfo));
        info->result_func = result_func;
-       info->settings = g_object_ref (settings);
+       info->client = g_object_ref (client);
        info->user_data = user_data;
 
        wizard = nma_mobile_wizard_new (parent, NULL, NM_DEVICE_MODEM_CAPABILITY_NONE, FALSE,
diff --git a/src/connection-editor/page-mobile.h b/src/connection-editor/page-mobile.h
index f2c0cdc..914e8cd 100644
--- a/src/connection-editor/page-mobile.h
+++ b/src/connection-editor/page-mobile.h
@@ -48,13 +48,12 @@ GType ce_page_mobile_get_type (void);
 CEPage *ce_page_mobile_new (NMConnection *connection,
                             GtkWindow *parent,
                             NMClient *client,
-                            NMRemoteSettings *settings,
                             const char **out_secrets_setting_name,
                             GError **error);
 
 void mobile_connection_new (GtkWindow *parent,
                             const char *detail,
-                            NMRemoteSettings *settings,
+                            NMClient *client,
                             PageNewConnectionResultFunc result_func,
                             gpointer user_data);
 
diff --git a/src/connection-editor/page-ppp.c b/src/connection-editor/page-ppp.c
index 2ff0dc0..d7d33a4 100644
--- a/src/connection-editor/page-ppp.c
+++ b/src/connection-editor/page-ppp.c
@@ -266,7 +266,6 @@ CEPage *
 ce_page_ppp_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -278,7 +277,6 @@ ce_page_ppp_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         UIDIR "/ce-page-ppp.ui",
                                         "PppPage",
                                         _("PPP Settings")));
diff --git a/src/connection-editor/page-ppp.h b/src/connection-editor/page-ppp.h
index fffc921..b731535 100644
--- a/src/connection-editor/page-ppp.h
+++ b/src/connection-editor/page-ppp.h
@@ -48,7 +48,6 @@ GType ce_page_ppp_get_type (void);
 CEPage *ce_page_ppp_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
diff --git a/src/connection-editor/page-team-port.c b/src/connection-editor/page-team-port.c
index 80c4d84..5b24bb5 100644
--- a/src/connection-editor/page-team-port.c
+++ b/src/connection-editor/page-team-port.c
@@ -132,11 +132,10 @@ finish_setup (CEPageTeamPort *self, gpointer unused, GError *error, gpointer use
 
 CEPage *
 ce_page_team_port_new (NMConnection *connection,
-                         GtkWindow *parent_window,
-                         NMClient *client,
-                         NMRemoteSettings *settings,
-                         const char **out_secrets_setting_name,
-                         GError **error)
+                       GtkWindow *parent_window,
+                       NMClient *client,
+                       const char **out_secrets_setting_name,
+                       GError **error)
 {
        CEPageTeamPort *self;
        CEPageTeamPortPrivate *priv;
@@ -145,7 +144,6 @@ ce_page_team_port_new (NMConnection *connection,
                                               connection,
                                               parent_window,
                                               client,
-                                              settings,
                                               UIDIR "/ce-page-team-port.ui",
                                               "TeamPortPage",
                                               /* Translators: a "Team Port" is a network
diff --git a/src/connection-editor/page-team-port.h b/src/connection-editor/page-team-port.h
index 8e079ef..e086de4 100644
--- a/src/connection-editor/page-team-port.h
+++ b/src/connection-editor/page-team-port.h
@@ -46,7 +46,6 @@ GType ce_page_team_port_get_type (void);
 CEPage *ce_page_team_port_new (NMConnection *connection,
                                GtkWindow *parent,
                                NMClient *client,
-                               NMRemoteSettings *settings,
                                const char **out_secrets_setting_name,
                                GError **error);
 
diff --git a/src/connection-editor/page-team.c b/src/connection-editor/page-team.c
index cb8145d..38be55d 100644
--- a/src/connection-editor/page-team.c
+++ b/src/connection-editor/page-team.c
@@ -200,13 +200,13 @@ add_slave (CEPageMaster *master, NewConnectionResultFunc result_func)
        if (priv->slave_arptype == ARPHRD_INFINIBAND) {
                new_connection_of_type (priv->toplevel,
                                        NULL,
-                                       CE_PAGE (self)->settings,
+                                       CE_PAGE (self)->client,
                                        infiniband_connection_new,
                                        result_func,
                                        master);
        } else {
                new_connection_dialog (priv->toplevel,
-                                      CE_PAGE (self)->settings,
+                                      CE_PAGE (self)->client,
                                       connection_type_filter,
                                       result_func,
                                       master);
@@ -226,7 +226,6 @@ CEPage *
 ce_page_team_new (NMConnection *connection,
                                  GtkWindow *parent_window,
                                  NMClient *client,
-                  NMRemoteSettings *settings,
                                  const char **out_secrets_setting_name,
                                  GError **error)
 {
@@ -237,7 +236,6 @@ ce_page_team_new (NMConnection *connection,
                                          connection,
                                          parent_window,
                                          client,
-                                         settings,
                                          UIDIR "/ce-page-team.ui",
                                          "TeamPage",
                                          _("Team")));
@@ -326,13 +324,13 @@ ce_page_team_class_init (CEPageTeamClass *team_class)
 void
 team_connection_new (GtkWindow *parent,
                      const char *detail,
-                     NMRemoteSettings *settings,
+                     NMClient *client,
                      PageNewConnectionResultFunc result_func,
                      gpointer user_data)
 {
        NMConnection *connection;
-       int team_num, num;
-       GSList *connections, *iter;
+       int team_num, num, i;
+       const GPtrArray *connections;
        NMConnection *conn2;
        const char *iface;
        char *my_iface;
@@ -340,15 +338,15 @@ team_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("Team connection %d"),
                                             NM_SETTING_TEAM_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_team_new ());
 
        /* Find an available interface name */
        team_num = 0;
-       connections = nm_remote_settings_list_connections (settings);
-       for (iter = connections; iter; iter = iter->next) {
-               conn2 = iter->data;
+       connections = nm_client_get_connections (client);
+       for (i = 0; i < connections->len; i++) {
+               conn2 = connections->pdata[i];
 
                if (!nm_connection_is_type (conn2, NM_SETTING_TEAM_SETTING_NAME))
                        continue;
@@ -360,7 +358,6 @@ team_connection_new (GtkWindow *parent,
                if (team_num <= num)
                        team_num = num + 1;
        }
-       g_slist_free (connections);
 
        my_iface = g_strdup_printf ("team%d", team_num);
        g_object_set (G_OBJECT (connection),
diff --git a/src/connection-editor/page-team.h b/src/connection-editor/page-team.h
index b94acb4..d3a5270 100644
--- a/src/connection-editor/page-team.h
+++ b/src/connection-editor/page-team.h
@@ -46,13 +46,12 @@ GType ce_page_team_get_type (void);
 CEPage *ce_page_team_new (NMConnection *connection,
                           GtkWindow *parent,
                           NMClient *client,
-                          NMRemoteSettings *settings,
                           const char **out_secrets_setting_name,
                           GError **error);
 
 void team_connection_new (GtkWindow *parent,
                           const char *detail,
-                          NMRemoteSettings *settings,
+                          NMClient *client,
                           PageNewConnectionResultFunc result_func,
                           gpointer user_data);
 
diff --git a/src/connection-editor/page-vlan.c b/src/connection-editor/page-vlan.c
index 061bfbb..358d714 100644
--- a/src/connection-editor/page-vlan.c
+++ b/src/connection-editor/page-vlan.c
@@ -258,7 +258,8 @@ static void
 build_vlan_parent_list (CEPageVlan *self, GSList *devices)
 {
        CEPageVlanPrivate *priv = CE_PAGE_VLAN_GET_PRIVATE (self);
-       GSList *connections, *c_iter, *d_iter;
+       const GPtrArray *connections;
+       GSList *d_iter;
        GPtrArray *parents;
        VlanParent *parent;
        NMDevice *device;
@@ -288,9 +289,9 @@ build_vlan_parent_list (CEPageVlan *self, GSList *devices)
        }
 
        /* Otherwise, VLANs have to be built on top of configured connections */
-       connections = nm_remote_settings_list_connections (CE_PAGE (self)->settings);
-       for (c_iter = connections; c_iter; c_iter = c_iter->next) {
-               NMConnection *candidate = c_iter->data;
+       connections = nm_client_get_connections (CE_PAGE (self)->client);
+       for (i = 0; i < connections->len; i++) {
+               NMConnection *candidate = connections->pdata[i];
                NMSettingConnection *s_con = nm_connection_get_setting_connection (candidate);
                GType connection_gtype;
 
@@ -322,8 +323,6 @@ build_vlan_parent_list (CEPageVlan *self, GSList *devices)
                }
        }
 
-       g_slist_free (connections);
-
        g_ptr_array_sort (parents, sort_parents);
        g_ptr_array_add (parents, NULL);
 
@@ -353,7 +352,7 @@ populate_ui (CEPageVlan *self)
        parent = nm_setting_vlan_get_parent (priv->setting);
        if (parent) {
                /* UUID? */
-               parent_connection = (NMConnection *)nm_remote_settings_get_connection_by_uuid (CE_PAGE 
(self)->settings, parent);
+               parent_connection = (NMConnection *)nm_client_get_connection_by_uuid (CE_PAGE (self)->client, 
parent);
                if (!parent_connection) {
                        /* Interface name? */
                        for (d_iter = devices; d_iter; d_iter = d_iter->next) {
@@ -460,7 +459,6 @@ CEPage *
 ce_page_vlan_new (NMConnection *connection,
                   GtkWindow *parent_window,
                   NMClient *client,
-                  NMRemoteSettings *settings,
                   const char **out_secrets_setting_name,
                   GError **error)
 {
@@ -471,7 +469,6 @@ ce_page_vlan_new (NMConnection *connection,
                                          connection,
                                          parent_window,
                                          client,
-                                         settings,
                                          UIDIR "/ce-page-vlan.ui",
                                          "VlanPage",
                                          _("VLAN")));
@@ -664,7 +661,7 @@ ce_page_vlan_class_init (CEPageVlanClass *vlan_class)
 void
 vlan_connection_new (GtkWindow *parent,
                      const char *detail,
-                     NMRemoteSettings *settings,
+                     NMClient *client,
                      PageNewConnectionResultFunc result_func,
                      gpointer user_data)
 {
@@ -673,7 +670,7 @@ vlan_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("VLAN connection %d"),
                                             NM_SETTING_VLAN_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        nm_connection_add_setting (connection, nm_setting_vlan_new ());
 
diff --git a/src/connection-editor/page-vlan.h b/src/connection-editor/page-vlan.h
index abacac7..5a96e02 100644
--- a/src/connection-editor/page-vlan.h
+++ b/src/connection-editor/page-vlan.h
@@ -46,13 +46,12 @@ GType ce_page_vlan_get_type (void);
 CEPage *ce_page_vlan_new (NMConnection *connection,
                           GtkWindow *parent,
                           NMClient *client,
-                          NMRemoteSettings *settings,
                           const char **out_secrets_setting_name,
                           GError **error);
 
 void vlan_connection_new (GtkWindow *parent,
                           const char *detail,
-                          NMRemoteSettings *settings,
+                          NMClient *client,
                           PageNewConnectionResultFunc result_func,
                           gpointer user_data);
 
diff --git a/src/connection-editor/page-vpn.c b/src/connection-editor/page-vpn.c
index a2893d6..1870cb1 100644
--- a/src/connection-editor/page-vpn.c
+++ b/src/connection-editor/page-vpn.c
@@ -41,14 +41,14 @@ typedef struct {
 
        char *service_type;
 
-       NMVpnPluginUiInterface *plugin;
-       NMVpnPluginUiWidgetInterface *ui;
+       NMVpnEditorPlugin *plugin;
+       NMVpnEditor *editor;
 
        gboolean disposed;
 } CEPageVpnPrivate;
 
 static void
-vpn_plugin_changed_cb (NMVpnPluginUiInterface *plugin, CEPageVpn *self)
+vpn_plugin_changed_cb (NMVpnEditorPlugin *plugin, CEPageVpn *self)
 {
        ce_page_changed (CE_PAGE (self));
 }
@@ -65,17 +65,17 @@ finish_setup (CEPageVpn *self, gpointer unused, GError *error, gpointer user_dat
 
        g_return_if_fail (priv->plugin != NULL);
 
-       priv->ui = nm_vpn_plugin_ui_interface_ui_factory (priv->plugin, parent->connection, &vpn_error);
-       if (!priv->ui) {
+       priv->editor = nm_vpn_editor_plugin_get_editor (priv->plugin, parent->connection, &vpn_error);
+       if (!priv->editor) {
                g_warning ("Could not load VPN user interface for service '%s': %s.",
                           priv->service_type,
                           (vpn_error && vpn_error->message) ? vpn_error->message : "(unknown)");
                g_error_free (vpn_error);
                return;
        }
-       g_signal_connect (priv->ui, "changed", G_CALLBACK (vpn_plugin_changed_cb), self);
+       g_signal_connect (priv->editor, "changed", G_CALLBACK (vpn_plugin_changed_cb), self);
 
-       parent->page = GTK_WIDGET (nm_vpn_plugin_ui_widget_interface_get_widget (priv->ui));
+       parent->page = GTK_WIDGET (nm_vpn_editor_get_widget (priv->editor));
        if (!parent->page) {
                g_warning ("Could not load VPN user interface for service '%s'.", priv->service_type);
                return;
@@ -88,7 +88,6 @@ CEPage *
 ce_page_vpn_new (NMConnection *connection,
                  GtkWindow *parent_window,
                  NMClient *client,
-                 NMRemoteSettings *settings,
                  const char **out_secrets_setting_name,
                  GError **error)
 {
@@ -100,7 +99,6 @@ ce_page_vpn_new (NMConnection *connection,
                                         connection,
                                         parent_window,
                                         client,
-                                        settings,
                                         NULL,
                                         NULL,
                                         _("VPN")));
@@ -137,7 +135,7 @@ ce_page_vpn_can_export (CEPageVpn *page)
 {
        CEPageVpnPrivate *priv = CE_PAGE_VPN_GET_PRIVATE (page);
 
-       return  (nm_vpn_plugin_ui_interface_get_capabilities (priv->plugin) & 
NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT) != 0;
+       return  (nm_vpn_editor_plugin_get_capabilities (priv->plugin) & 
NM_VPN_EDITOR_PLUGIN_CAPABILITY_EXPORT) != 0;
 }
 
 static gboolean
@@ -146,7 +144,7 @@ validate (CEPage *page, NMConnection *connection, GError **error)
        CEPageVpn *self = CE_PAGE_VPN (page);
        CEPageVpnPrivate *priv = CE_PAGE_VPN_GET_PRIVATE (self);
 
-       return nm_vpn_plugin_ui_widget_interface_update_connection (priv->ui, connection, error);
+       return nm_vpn_editor_update_connection (priv->editor, connection, error);
 }
 
 static void
@@ -164,8 +162,8 @@ dispose (GObject *object)
 
        priv->disposed = TRUE;
 
-       if (priv->ui)
-               g_object_unref (priv->ui);
+       if (priv->editor)
+               g_object_unref (priv->editor);
 
        g_free (priv->service_type);
 
@@ -187,7 +185,7 @@ ce_page_vpn_class_init (CEPageVpnClass *vpn_class)
 }
 
 typedef struct {
-       NMRemoteSettings *settings;
+       NMClient *client;
        PageNewConnectionResultFunc result_func;
        gpointer user_data;
 } NewVpnInfo;
@@ -211,14 +209,12 @@ import_cb (NMConnection *connection, gpointer user_data)
 
        s = (char *) nm_setting_connection_get_id (s_con);
        if (!s) {
-               GSList *connections;
+               const GPtrArray *connections;
 
-               connections = nm_remote_settings_list_connections (info->settings);
+               connections = nm_client_get_connections (info->client);
                s = ce_page_get_next_available_name (connections, _("VPN connection %d"));
                g_object_set (s_con, NM_SETTING_CONNECTION_ID, s, NULL);
                g_free (s);
-
-               g_slist_free (connections);
        }
 
        s = (char *) nm_setting_connection_get_connection_type (s_con);
@@ -245,14 +241,14 @@ import_cb (NMConnection *connection, gpointer user_data)
 
        info->result_func (connection, FALSE, error, info->user_data);
        g_clear_error (&error);
-       g_object_unref (info->settings);
+       g_object_unref (info->client);
        g_slice_free (NewVpnInfo, info);
 }
 
 void
 vpn_connection_import (GtkWindow *parent,
                        const char *detail,
-                       NMRemoteSettings *settings,
+                       NMClient *client,
                        PageNewConnectionResultFunc result_func,
                        gpointer user_data)
 {
@@ -260,7 +256,7 @@ vpn_connection_import (GtkWindow *parent,
 
        info = g_slice_new (NewVpnInfo);
        info->result_func = result_func;
-       info->settings = g_object_ref (settings);
+       info->client = g_object_ref (client);
        info->user_data = user_data;
        vpn_import (import_cb, info);
 }
@@ -286,7 +282,7 @@ vpn_type_result_func (NMConnection *connection, gpointer user_data)
 void
 vpn_connection_new (GtkWindow *parent,
                     const char *detail,
-                    NMRemoteSettings *settings,
+                    NMClient *client,
                     PageNewConnectionResultFunc result_func,
                     gpointer user_data)
 {
@@ -303,7 +299,7 @@ vpn_connection_new (GtkWindow *parent,
                info = g_slice_new (NewVpnInfo);
                info->result_func = result_func;
                info->user_data = user_data;
-               new_connection_dialog_full (parent, settings,
+               new_connection_dialog_full (parent, client,
                                            NEW_VPN_CONNECTION_PRIMARY_LABEL,
                                            NEW_VPN_CONNECTION_SECONDARY_LABEL,
                                            vpn_type_filter_func,
@@ -314,7 +310,7 @@ vpn_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("VPN connection %d"),
                                             NM_SETTING_VPN_SETTING_NAME,
                                             FALSE,
-                                            settings,
+                                            client,
                                             user_data);
        s_vpn = nm_setting_vpn_new ();
        g_object_set (s_vpn, NM_SETTING_VPN_SERVICE_TYPE, detail, NULL);
diff --git a/src/connection-editor/page-vpn.h b/src/connection-editor/page-vpn.h
index 4a618ce..d9df6a1 100644
--- a/src/connection-editor/page-vpn.h
+++ b/src/connection-editor/page-vpn.h
@@ -48,7 +48,6 @@ GType ce_page_vpn_get_type (void);
 CEPage *ce_page_vpn_new (NMConnection *connection,
                          GtkWindow *parent,
                          NMClient *client,
-                         NMRemoteSettings *settings,
                          const char **out_secrets_setting_name,
                          GError **error);
 
@@ -56,13 +55,13 @@ gboolean ce_page_vpn_can_export (CEPageVpn *page);
 
 void vpn_connection_new (GtkWindow *parent,
                          const char *detail,
-                         NMRemoteSettings *settings,
+                         NMClient *client,
                          PageNewConnectionResultFunc result_func,
                          gpointer user_data);
 
 void vpn_connection_import (GtkWindow *parent,
                             const char *detail,
-                            NMRemoteSettings *settings,
+                            NMClient *client,
                             PageNewConnectionResultFunc result_func,
                             gpointer user_data);
 
diff --git a/src/connection-editor/page-wifi-security.c b/src/connection-editor/page-wifi-security.c
index 73af50b..25be3f4 100644
--- a/src/connection-editor/page-wifi-security.c
+++ b/src/connection-editor/page-wifi-security.c
@@ -370,7 +370,6 @@ CEPage *
 ce_page_wifi_security_new (NMConnection *connection,
                            GtkWindow *parent_window,
                            NMClient *client,
-                           NMRemoteSettings *settings,
                            const char **out_secrets_setting_name,
                            GError **error)
 {
@@ -389,7 +388,6 @@ ce_page_wifi_security_new (NMConnection *connection,
                                                   connection,
                                                   parent_window,
                                                   client,
-                                                  settings,
                                                   UIDIR "/ce-page-wifi-security.ui",
                                                   "WifiSecurityPage",
                                                   _("Wi-Fi Security")));
diff --git a/src/connection-editor/page-wifi-security.h b/src/connection-editor/page-wifi-security.h
index b1c3a16..bf16e96 100644
--- a/src/connection-editor/page-wifi-security.h
+++ b/src/connection-editor/page-wifi-security.h
@@ -54,7 +54,6 @@ GType ce_page_wifi_security_get_type (void);
 CEPage *ce_page_wifi_security_new (NMConnection *connection,
                                    GtkWindow *parent,
                                    NMClient *client,
-                                   NMRemoteSettings *settings,
                                    const char **out_secrets_setting_name,
                                    GError **error);
 
diff --git a/src/connection-editor/page-wifi.c b/src/connection-editor/page-wifi.c
index eee33df..1f8ff64 100644
--- a/src/connection-editor/page-wifi.c
+++ b/src/connection-editor/page-wifi.c
@@ -432,7 +432,6 @@ CEPage *
 ce_page_wifi_new (NMConnection *connection,
                   GtkWindow *parent_window,
                   NMClient *client,
-                  NMRemoteSettings *settings,
                   const char **out_secrets_setting_name,
                   GError **error)
 {
@@ -445,7 +444,6 @@ ce_page_wifi_new (NMConnection *connection,
                                          connection,
                                          parent_window,
                                          client,
-                                         settings,
                                          UIDIR "/ce-page-wifi.ui",
                                          "WifiPage",
                                          _("Wi-Fi")));
@@ -606,7 +604,7 @@ ce_page_wifi_class_init (CEPageWifiClass *wifi_class)
 void
 wifi_connection_new (GtkWindow *parent,
                      const char *detail,
-                     NMRemoteSettings *settings,
+                     NMClient *client,
                      PageNewConnectionResultFunc result_func,
                      gpointer user_data)
 {
@@ -616,7 +614,7 @@ wifi_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("Wi-Fi connection %d"),
                                             NM_SETTING_WIRELESS_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        s_wifi = nm_setting_wireless_new ();
        g_object_set (s_wifi, NM_SETTING_WIRELESS_MODE, "infrastructure", NULL);
diff --git a/src/connection-editor/page-wifi.h b/src/connection-editor/page-wifi.h
index 9bb1dd2..c12c029 100644
--- a/src/connection-editor/page-wifi.h
+++ b/src/connection-editor/page-wifi.h
@@ -48,7 +48,6 @@ GType ce_page_wifi_get_type (void);
 CEPage *ce_page_wifi_new (NMConnection *connection,
                           GtkWindow *parent,
                           NMClient *client,
-                          NMRemoteSettings *settings,
                           const char **out_secrets_setting_name,
                           GError **error);
 
@@ -58,7 +57,7 @@ GBytes *ce_page_wifi_get_ssid (CEPageWifi *self);
 
 void wifi_connection_new (GtkWindow *parent,
                           const char *detail,
-                          NMRemoteSettings *settings,
+                          NMClient *client,
                           PageNewConnectionResultFunc result_func,
                           gpointer user_data);
 
diff --git a/src/connection-editor/page-wimax.c b/src/connection-editor/page-wimax.c
index b0f2eac..3d39341 100644
--- a/src/connection-editor/page-wimax.c
+++ b/src/connection-editor/page-wimax.c
@@ -98,7 +98,6 @@ CEPage *
 ce_page_wimax_new (NMConnection *connection,
                    GtkWindow *parent_window,
                    NMClient *client,
-                   NMRemoteSettings *settings,
                    const char **out_secrets_setting_name,
                    GError **error)
 {
@@ -111,7 +110,6 @@ ce_page_wimax_new (NMConnection *connection,
                                           connection,
                                           parent_window,
                                           client,
-                                          settings,
                                           UIDIR "/ce-page-wimax.ui",
                                           "WimaxPage",
                                           _("WiMAX")));
@@ -204,7 +202,7 @@ ce_page_wimax_class_init (CEPageWimaxClass *wimax_class)
 void
 wimax_connection_new (GtkWindow *parent,
                       const char *detail,
-                      NMRemoteSettings *settings,
+                      NMClient *client,
                       PageNewConnectionResultFunc result_func,
                       gpointer user_data)
 {
@@ -214,7 +212,7 @@ wimax_connection_new (GtkWindow *parent,
        connection = ce_page_new_connection (_("WiMAX connection %d"),
                                             NM_SETTING_WIMAX_SETTING_NAME,
                                             TRUE,
-                                            settings,
+                                            client,
                                             user_data);
        s_wimax = nm_setting_wimax_new ();
        nm_connection_add_setting (connection, s_wimax);
diff --git a/src/connection-editor/page-wimax.h b/src/connection-editor/page-wimax.h
index 47ea554..57a4401 100644
--- a/src/connection-editor/page-wimax.h
+++ b/src/connection-editor/page-wimax.h
@@ -46,13 +46,12 @@ GType ce_page_wimax_get_type (void);
 CEPage *ce_page_wimax_new (NMConnection *connection,
                            GtkWindow *parent,
                            NMClient *client,
-                           NMRemoteSettings *settings,
                            const char **out_secrets_setting_name,
                            GError **error);
 
 void wimax_connection_new (GtkWindow *parent,
                            const char *detail,
-                           NMRemoteSettings *settings,
+                           NMClient *client,
                            PageNewConnectionResultFunc result_func,
                            gpointer user_data);
 
diff --git a/src/connection-editor/vpn-helpers.c b/src/connection-editor/vpn-helpers.c
index bc3d065..43c252b 100644
--- a/src/connection-editor/vpn-helpers.c
+++ b/src/connection-editor/vpn-helpers.c
@@ -35,7 +35,7 @@
 
 static GHashTable *plugins = NULL;
 
-NMVpnPluginUiInterface *
+NMVpnEditorPlugin *
 vpn_get_plugin_by_service (const char *service)
 {
        g_return_val_if_fail (service != NULL, NULL);
@@ -69,7 +69,7 @@ vpn_get_plugins (GError **error)
                char *so_path = NULL, *so_name = NULL;
                GKeyFile *keyfile = NULL;
                GModule *module = NULL;
-               NMVpnPluginUiFactory factory = NULL;
+               NMVpnEditorPluginFactory factory = NULL;
 
                if (!g_str_has_suffix (f, ".name"))
                        continue;
@@ -108,8 +108,8 @@ vpn_get_plugins (GError **error)
                        }
                }
 
-               if (g_module_symbol (module, "nm_vpn_plugin_ui_factory", (gpointer) &factory)) {
-                       NMVpnPluginUiInterface *plugin;
+               if (g_module_symbol (module, "nm_vpn_editor_plugin_factory", (gpointer) &factory)) {
+                       NMVpnEditorPlugin *plugin;
                        GError *factory_error = NULL;
                        gboolean success = FALSE;
 
@@ -119,8 +119,8 @@ vpn_get_plugins (GError **error)
 
                                /* Validate plugin properties */
                                g_object_get (G_OBJECT (plugin),
-                                             NM_VPN_PLUGIN_UI_INTERFACE_NAME, &plug_name,
-                                             NM_VPN_PLUGIN_UI_INTERFACE_SERVICE, &plug_service,
+                                             NM_VPN_EDITOR_PLUGIN_NAME, &plug_name,
+                                             NM_VPN_EDITOR_PLUGIN_SERVICE, &plug_service,
                                              NULL);
                                if (!plug_name || !strlen (plug_name)) {
                                        g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, "cannot load VPN 
plugin in '%s': missing plugin name", 
@@ -145,7 +145,7 @@ vpn_get_plugins (GError **error)
                        if (!success)
                                g_module_close (module);
                } else {
-                       g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, "cannot locate 
nm_vpn_plugin_ui_factory() in '%s': %s", 
+                       g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, "cannot locate 
nm_vpn_editor_plugin_factory() in '%s': %s", 
                                     g_module_name (module), g_module_error ());
                        g_module_close (module);
                }
@@ -173,7 +173,7 @@ import_vpn_from_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
        ActionInfo *info = (ActionInfo *) user_data;
        GHashTableIter iter;
        gpointer key;
-       NMVpnPluginUiInterface *plugin;
+       NMVpnEditorPlugin *plugin;
        NMConnection *connection = NULL;
        GError *error = NULL;
 
@@ -189,7 +189,7 @@ import_vpn_from_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
        g_hash_table_iter_init (&iter, plugins);
        while (!connection && g_hash_table_iter_next (&iter, &key, (gpointer *)&plugin)) {
                g_clear_error (&error);
-               connection = nm_vpn_plugin_ui_interface_import (plugin, filename, &error);
+               connection = nm_vpn_editor_plugin_import (plugin, filename, &error);
        }
 
        if (connection)
@@ -253,7 +253,7 @@ export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
        NMConnection *connection = NM_CONNECTION (user_data);
        char *filename = NULL;
        GError *error = NULL;
-       NMVpnPluginUiInterface *plugin;
+       NMVpnEditorPlugin *plugin;
        NMSettingConnection *s_con = NULL;
        NMSettingVpn *s_vpn = NULL;
        const char *service_type;
@@ -308,7 +308,7 @@ export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
 
        plugin = vpn_get_plugin_by_service (service_type);
        if (plugin)
-               success = nm_vpn_plugin_ui_interface_export (plugin, filename, connection, &error);
+               success = nm_vpn_editor_plugin_export (plugin, filename, connection, &error);
 
 done:
        if (!success) {
@@ -343,7 +343,7 @@ void
 vpn_export (NMConnection *connection)
 {
        GtkWidget *dialog;
-       NMVpnPluginUiInterface *plugin;
+       NMVpnEditorPlugin *plugin;
        NMSettingVpn *s_vpn = NULL;
        const char *service_type;
        const char *home_folder;
@@ -369,7 +369,7 @@ vpn_export (NMConnection *connection)
        if (plugin) {
                char *suggested = NULL;
 
-               suggested = nm_vpn_plugin_ui_interface_get_suggested_name (plugin, connection);
+               suggested = nm_vpn_editor_plugin_get_suggested_filename (plugin, connection);
                if (suggested) {
                        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested);
                        g_free (suggested);
@@ -386,7 +386,7 @@ vpn_supports_ipv6 (NMConnection *connection)
 {
        NMSettingVpn *s_vpn;
        const char *service_type;
-       NMVpnPluginUiInterface *plugin;
+       NMVpnEditorPlugin *plugin;
        guint32 capabilities;
 
        s_vpn = nm_connection_get_setting_vpn (connection);
@@ -398,6 +398,6 @@ vpn_supports_ipv6 (NMConnection *connection)
        plugin = vpn_get_plugin_by_service (service_type);
        g_return_val_if_fail (plugin != NULL, FALSE);
 
-       capabilities = nm_vpn_plugin_ui_interface_get_capabilities (plugin);
-       return (capabilities & NM_VPN_PLUGIN_UI_CAPABILITY_IPV6) != 0;
+       capabilities = nm_vpn_editor_plugin_get_capabilities (plugin);
+       return (capabilities & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6) != 0;
 }
diff --git a/src/connection-editor/vpn-helpers.h b/src/connection-editor/vpn-helpers.h
index 8043308..10c9f55 100644
--- a/src/connection-editor/vpn-helpers.h
+++ b/src/connection-editor/vpn-helpers.h
@@ -30,7 +30,7 @@
 
 GHashTable *vpn_get_plugins (GError **error);
 
-NMVpnPluginUiInterface *vpn_get_plugin_by_service (const char *service);
+NMVpnEditorPlugin *vpn_get_plugin_by_service (const char *service);
 
 typedef void (*VpnImportSuccessCallback) (NMConnection *connection, gpointer user_data);
 void vpn_import (VpnImportSuccessCallback callback, gpointer user_data);
diff --git a/src/gnome-bluetooth/bt-widget.c b/src/gnome-bluetooth/bt-widget.c
index 3195d6f..bfee2bf 100644
--- a/src/gnome-bluetooth/bt-widget.c
+++ b/src/gnome-bluetooth/bt-widget.c
@@ -478,7 +478,7 @@ get_config_widgets (const char *bdaddr, const char **uuids)
 /**************************************************************/
 
 typedef struct {
-       NMRemoteSettings *settings;
+       NMClient *settings;
        GByteArray *bdaddr;
        char *str_bdaddr;
        guint timeout_id;
@@ -505,7 +505,7 @@ delete_cb (NMRemoteConnection *connection, GError *error, gpointer user_data)
 }
 
 static void
-remove_connections_read (NMRemoteSettings *settings, gpointer user_data)
+remove_connections_read (NMClient *settings, gpointer user_data)
 {
        RemoveInfo *info = user_data;
        GSList *list, *iter;
@@ -514,7 +514,7 @@ remove_connections_read (NMRemoteSettings *settings, gpointer user_data)
 
        g_message ("Removing Bluetooth connections for %s", info->str_bdaddr);
 
-       list = nm_remote_settings_list_connections (settings);
+       list = nm_client_list_connections (settings);
        for (iter = list; iter != NULL; iter = g_slist_next (iter)) {
                NMConnection *connection = iter->data;
                NMSettingBluetooth *s_bt;
@@ -570,7 +570,7 @@ device_removed (const char *bdaddr)
        }
 
        info = g_malloc0 (sizeof (RemoveInfo));
-       info->settings = nm_remote_settings_new (bus);
+       info->settings = nm_client_new (bus);
 
        info->bdaddr = g_byte_array_sized_new (ETH_ALEN);
        g_byte_array_append (info->bdaddr, (const guint8 *) addr->ether_addr_octet, ETH_ALEN);
diff --git a/src/gnome-bluetooth/nma-bt-device.c b/src/gnome-bluetooth/nma-bt-device.c
index a2f4cd6..7e360b7 100644
--- a/src/gnome-bluetooth/nma-bt-device.c
+++ b/src/gnome-bluetooth/nma-bt-device.c
@@ -52,7 +52,7 @@ G_DEFINE_TYPE (NmaBtDevice, nma_bt_device, G_TYPE_OBJECT)
 
 typedef struct {
        DBusGConnection *bus;
-       NMRemoteSettings *settings;
+       NMClient *settings;
 
        char *bdaddr;
        GByteArray *bdaddr_array;
@@ -175,13 +175,13 @@ delete_cb (NMRemoteConnection *connection, GError *error, gpointer user_data)
 }
 
 static void
-delete_connections_of_type (NMRemoteSettings *settings,
+delete_connections_of_type (NMClient *settings,
                             const GByteArray *bdaddr,
                             gboolean pan)
 {
        GSList *list, *iter;
 
-       list = nm_remote_settings_list_connections (settings);
+       list = nm_client_list_connections (settings);
        for (iter = list; iter != NULL; iter = g_slist_next (iter)) {
                NMRemoteConnection *remote = iter->data;
 
@@ -202,7 +202,7 @@ recheck_services_enabled (NmaBtDevice *self)
         * existing Bluetooth connections for the given device for either PAN
         * or DUN, then we consider that service enabled.
         */
-       list = nm_remote_settings_list_connections (priv->settings);
+       list = nm_client_list_connections (priv->settings);
        for (iter = list; iter != NULL; iter = g_slist_next (iter)) {
                NMConnection *connection = iter->data;
 
@@ -419,7 +419,7 @@ dun_new_gsm (NMAMobileWizardAccessMethod *method)
 }
 
 static void
-dun_add_cb (NMRemoteSettings *settings,
+dun_add_cb (NMClient *settings,
             NMRemoteConnection *connection,
             GError *error,
             gpointer user_data)
@@ -481,7 +481,7 @@ wizard_done_cb (NMAMobileWizard *wizard,
        g_message ("%s: adding new setting", __func__);
 
        /* Add the connection to the settings service */
-       nm_remote_settings_add_connection (priv->settings,
+       nm_client_add_connection (priv->settings,
                                           connection,
                                           dun_add_cb,
                                           self);
@@ -943,7 +943,7 @@ _set_pan_enabled (NmaBtDevice *device, gboolean enabled)
 }
 
 static void
-pan_add_cb (NMRemoteSettings *settings,
+pan_add_cb (NMClient *settings,
             NMRemoteConnection *connection,
             GError *error,
             gpointer user_data)
@@ -1009,7 +1009,7 @@ add_pan_connection (NmaBtDevice *self)
        nm_connection_add_setting (connection, ip_setting);
 
        /* Add the connection to the settings service */
-       nm_remote_settings_add_connection (priv->settings,
+       nm_client_add_connection (priv->settings,
                                           connection,
                                           pan_add_cb,
                                           self);
@@ -1050,7 +1050,7 @@ nma_bt_device_set_parent_window (NmaBtDevice *device, GtkWindow *window)
 /*********************************************************************/
 
 static void
-connections_read (NMRemoteSettings *settings, gpointer user_data)
+connections_read (NMClient *settings, gpointer user_data)
 {
        recheck_services_enabled (NMA_BT_DEVICE (user_data));
 }
@@ -1101,7 +1101,7 @@ nma_bt_device_new (const char *bdaddr,
 
                priv->window_group = gtk_window_group_new ();
 
-               priv->settings = nm_remote_settings_new (priv->bus);
+               priv->settings = nm_client_new (priv->bus);
                g_signal_connect (priv->settings,
                                          NM_REMOTE_SETTINGS_CONNECTIONS_READ,
                                          G_CALLBACK (connections_read),
diff --git a/src/libnm-gtk/nm-wifi-dialog.c b/src/libnm-gtk/nm-wifi-dialog.c
index 7a4164a..84202a3 100644
--- a/src/libnm-gtk/nm-wifi-dialog.c
+++ b/src/libnm-gtk/nm-wifi-dialog.c
@@ -49,7 +49,6 @@ typedef struct {
 
 typedef struct {
        NMClient *client;
-       NMRemoteSettings *settings;
 
        GtkBuilder *builder;
 
@@ -426,7 +425,9 @@ connection_combo_init (NMAWifiDialog *self, NMConnection *connection)
                                    C_NAME_COLUMN, id,
                                    C_CON_COLUMN, connection, -1);
        } else {
-               GSList *connections, *iter, *to_add = NULL;
+               GSList *to_add, *iter;
+               const GPtrArray *connections;
+               int i;
 
                gtk_list_store_append (store, &tree_iter);
                gtk_list_store_set (store, &tree_iter,
@@ -436,9 +437,9 @@ connection_combo_init (NMAWifiDialog *self, NMConnection *connection)
                gtk_list_store_append (store, &tree_iter);
                gtk_list_store_set (store, &tree_iter, C_SEP_COLUMN, TRUE, -1);
 
-               connections = nm_remote_settings_list_connections (priv->settings);
-               for (iter = connections; iter; iter = g_slist_next (iter)) {
-                       NMConnection *candidate = NM_CONNECTION (iter->data);
+               connections = nm_client_get_connections (priv->client);
+               for (i = 0; i < connections->len; i++) {
+                       NMConnection *candidate = NM_CONNECTION (connections->pdata[i]);
                        NMSettingWireless *s_wireless;
                        const char *connection_type;
                        const char *mode;
@@ -458,14 +459,14 @@ connection_combo_init (NMAWifiDialog *self, NMConnection *connection)
 
                        /* If creating a new Ad-Hoc network, only show shared network connections */
                        if (priv->operation == OP_CREATE_ADHOC) {
-                               NMSettingIP4Config *s_ip4;
+                               NMSettingIPConfig *s_ip4;
                                const char *method = NULL;
 
                                s_ip4 = nm_connection_get_setting_ip4_config (candidate);
                                if (s_ip4)
-                                       method = nm_setting_ip4_config_get_method (s_ip4);
+                                       method = nm_setting_ip_config_get_method (s_ip4);
 
-                               if (!s_ip4 || strcmp (method, "shared"))
+                               if (!s_ip4 || strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_SHARED))
                                        continue;
 
                                /* Ignore non-Ad-Hoc connections too */
@@ -484,7 +485,6 @@ connection_combo_init (NMAWifiDialog *self, NMConnection *connection)
 
                        to_add = g_slist_append (to_add, candidate);
                }
-               g_slist_free (connections);
 
                /* Alphabetize the list then add the connections */
                to_add = g_slist_sort (to_add, (GCompareFunc) alphabetize_connections);
@@ -1194,13 +1194,15 @@ nma_wifi_dialog_get_connection (NMAWifiDialog *self,
                g_object_set (s_wireless, NM_SETTING_WIRELESS_SSID, validate_dialog_ssid (self), NULL);
 
                if (priv->operation == OP_CREATE_ADHOC) {
-                       NMSettingIP4Config *s_ip4;
+                       NMSetting *s_ip4;
 
                        g_object_set (s_wireless, NM_SETTING_WIRELESS_MODE, "adhoc", NULL);
 
-                       s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new ();
-                       g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, 
NM_SETTING_IP4_CONFIG_METHOD_SHARED, NULL);
-                       nm_connection_add_setting (connection, (NMSetting *) s_ip4);
+                       s_ip4 = nm_setting_ip4_config_new ();
+                       g_object_set (s_ip4,
+                                     NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_SHARED,
+                                     NULL);
+                       nm_connection_add_setting (connection, s_ip4);
                } else if (priv->operation == OP_CONNECT_HIDDEN) {
                        /* Mark as a hidden SSID network */
                        g_object_set (s_wireless, NM_SETTING_WIRELESS_HIDDEN, TRUE, NULL);
@@ -1239,7 +1241,6 @@ nma_wifi_dialog_get_connection (NMAWifiDialog *self,
 
 GtkWidget *
 nma_wifi_dialog_new (NMClient *client,
-                     NMRemoteSettings *settings,
                      NMConnection *connection,
                      NMDevice *device,
                      NMAccessPoint *ap,
@@ -1250,7 +1251,6 @@ nma_wifi_dialog_new (NMClient *client,
        guint32 dev_caps;
 
        g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
-       g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL);
        g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
 
        /* Ensure device validity */
@@ -1265,7 +1265,6 @@ nma_wifi_dialog_new (NMClient *client,
                priv = NMA_WIFI_DIALOG_GET_PRIVATE (self);
 
                priv->client = g_object_ref (client);
-               priv->settings = g_object_ref (settings);
                if (ap)
                        priv->ap = g_object_ref (ap);
 
@@ -1287,14 +1286,12 @@ nma_wifi_dialog_new (NMClient *client,
 
 static GtkWidget *
 internal_new_operation (NMClient *client,
-                        NMRemoteSettings *settings,
                         guint operation)
 {
        NMAWifiDialog *self;
        NMAWifiDialogPrivate *priv;
 
        g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
-       g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL);
 
        self = NMA_WIFI_DIALOG (g_object_new (NMA_TYPE_WIFI_DIALOG, NULL));
        if (!self)
@@ -1303,7 +1300,6 @@ internal_new_operation (NMClient *client,
        priv = NMA_WIFI_DIALOG_GET_PRIVATE (self);
 
        priv->client = g_object_ref (client);
-       priv->settings = g_object_ref (settings);
        priv->sec_combo = GTK_WIDGET (gtk_builder_get_object (priv->builder, "security_combo"));
        priv->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
        priv->operation = operation;
@@ -1318,21 +1314,21 @@ internal_new_operation (NMClient *client,
 }
 
 GtkWidget *
-nma_wifi_dialog_new_for_hidden (NMClient *client, NMRemoteSettings *settings)
+nma_wifi_dialog_new_for_hidden (NMClient *client)
 {
-       return internal_new_operation (client, settings, OP_CONNECT_HIDDEN);
+       return internal_new_operation (client, OP_CONNECT_HIDDEN);
 }
 
 GtkWidget *
-nma_wifi_dialog_new_for_other (NMClient *client, NMRemoteSettings *settings)
+nma_wifi_dialog_new_for_other (NMClient *client)
 {
-       return internal_new_operation (client, settings, OP_CONNECT_HIDDEN);
+       return internal_new_operation (client, OP_CONNECT_HIDDEN);
 }
 
 GtkWidget *
-nma_wifi_dialog_new_for_create (NMClient *client, NMRemoteSettings *settings)
+nma_wifi_dialog_new_for_create (NMClient *client)
 {
-       return internal_new_operation (client, settings, OP_CREATE_ADHOC);
+       return internal_new_operation (client, OP_CREATE_ADHOC);
 }
 
 /**
@@ -1377,7 +1373,6 @@ dispose (GObject *object)
                priv->secrets_info->canceled = TRUE;
 
        g_object_unref (priv->client);
-       g_object_unref (priv->settings);
        g_object_unref (priv->builder);
 
        g_object_unref (priv->device_model);
diff --git a/src/libnm-gtk/nm-wifi-dialog.h b/src/libnm-gtk/nm-wifi-dialog.h
index 8a96ca2..6f02bfc 100644
--- a/src/libnm-gtk/nm-wifi-dialog.h
+++ b/src/libnm-gtk/nm-wifi-dialog.h
@@ -51,17 +51,14 @@ typedef struct {
 GType nma_wifi_dialog_get_type (void);
 
 GtkWidget *nma_wifi_dialog_new (NMClient *client,
-                                NMRemoteSettings *settings,
                                 NMConnection *connection,
                                 NMDevice *device,
                                 NMAccessPoint *ap,
                                 gboolean secrets_only);
 
-GtkWidget *nma_wifi_dialog_new_for_hidden (NMClient *client,
-                                           NMRemoteSettings *settings);
+GtkWidget *nma_wifi_dialog_new_for_hidden (NMClient *client);
 
-GtkWidget *nma_wifi_dialog_new_for_create (NMClient *client,
-                                           NMRemoteSettings *settings);
+GtkWidget *nma_wifi_dialog_new_for_create (NMClient *client);
 
 NMConnection * nma_wifi_dialog_get_connection (NMAWifiDialog *self,
                                                NMDevice **device,
@@ -77,8 +74,7 @@ GLIB_DEPRECATED
 gboolean nma_wifi_dialog_get_nag_ignored (NMAWifiDialog *self);
 
 GLIB_DEPRECATED_FOR(nma_wifi_dialog_new_for_hidden)
-GtkWidget *nma_wifi_dialog_new_for_other (NMClient *client,
-                                          NMRemoteSettings *settings);
+GtkWidget *nma_wifi_dialog_new_for_other (NMClient *client);
 
 #endif /* NMA_WIFI_DIALOG_H */
 
diff --git a/src/libnm-gtk/nm-wireless-dialog.c b/src/libnm-gtk/nm-wireless-dialog.c
index 05a5aaf..bf8ea36 100644
--- a/src/libnm-gtk/nm-wireless-dialog.c
+++ b/src/libnm-gtk/nm-wireless-dialog.c
@@ -41,24 +41,23 @@ nma_wireless_dialog_get_connection (NMAWirelessDialog *self,
 
 GtkWidget *
 nma_wireless_dialog_new (NMClient *client,
-                         NMRemoteSettings *settings,
                          NMConnection *connection,
                          NMDevice *device,
                          NMAccessPoint *ap,
                          gboolean secrets_only)
 {
-       return nma_wifi_dialog_new (client, settings, connection, device, ap, secrets_only);
+       return nma_wifi_dialog_new (client, connection, device, ap, secrets_only);
 }
 
 GtkWidget *
-nma_wireless_dialog_new_for_other (NMClient *client, NMRemoteSettings *settings)
+nma_wireless_dialog_new_for_other (NMClient *client)
 {
-       return nma_wifi_dialog_new_for_hidden (client, settings);
+       return nma_wifi_dialog_new_for_hidden (client);
 }
 
 GtkWidget *
-nma_wireless_dialog_new_for_create (NMClient *client, NMRemoteSettings *settings)
+nma_wireless_dialog_new_for_create (NMClient *client)
 {
-       return nma_wifi_dialog_new_for_create (client, settings);
+       return nma_wifi_dialog_new_for_create (client);
 }
 
diff --git a/src/libnm-gtk/nm-wireless-dialog.h b/src/libnm-gtk/nm-wireless-dialog.h
index 9c6c2d9..8c12b39 100644
--- a/src/libnm-gtk/nm-wireless-dialog.h
+++ b/src/libnm-gtk/nm-wireless-dialog.h
@@ -53,19 +53,16 @@ GType nma_wireless_dialog_get_type (void);
 
 GLIB_DEPRECATED_FOR(nma_wifi_dialog_new)
 GtkWidget *nma_wireless_dialog_new (NMClient *client,
-                                   NMRemoteSettings *settings,
                                     NMConnection *connection,
                                     NMDevice *device,
                                     NMAccessPoint *ap,
                                     gboolean secrets_only);
 
 GLIB_DEPRECATED_FOR(nma_wifi_dialog_new_for_other)
-GtkWidget *nma_wireless_dialog_new_for_other (NMClient *client,
-                                             NMRemoteSettings *settings);
+GtkWidget *nma_wireless_dialog_new_for_other (NMClient *client);
 
 GLIB_DEPRECATED_FOR(nma_wifi_dialog_new_for_create)
-GtkWidget *nma_wireless_dialog_new_for_create (NMClient *client,
-                                              NMRemoteSettings *settings);
+GtkWidget *nma_wireless_dialog_new_for_create (NMClient *client);
 
 GLIB_DEPRECATED_FOR(nma_wifi_dialog_get_connection)
 NMConnection * nma_wireless_dialog_get_connection (NMAWirelessDialog *dialog,
diff --git a/src/migration-tool.c b/src/migration-tool.c
index 7ef77b1..416613d 100644
--- a/src/migration-tool.c
+++ b/src/migration-tool.c
@@ -37,7 +37,7 @@ add_cb (GObject *settings,
        NMRemoteConnection *c;
        GError *error = NULL;
 
-       c = nm_remote_settings_add_connection_finish (NM_REMOTE_SETTINGS (settings),
+       c = nm_client_add_connection_finish (NM_REMOTE_SETTINGS (settings),
                                                      result, &error);
        if (error) {
                g_printerr ("Failed to move connection '%s' to NetworkManager system settings: %s",
@@ -51,15 +51,15 @@ add_cb (GObject *settings,
 static void
 import_cb (NMConnection *connection, gpointer user_data)
 {
-       NMRemoteSettings *settings = user_data;
+       NMClient *settings = user_data;
 
-       nm_remote_settings_add_connection_async (settings, connection, TRUE, NULL, add_cb, NULL);
+       nm_client_add_connection_async (settings, connection, TRUE, NULL, add_cb, NULL);
 }
 
 int
 main (int argc, char **argv)
 {
-       NMRemoteSettings *settings;
+       NMClient *settings;
        GError *error = NULL;
 
        bindtextdomain (GETTEXT_PACKAGE, NMALOCALEDIR);
@@ -73,7 +73,7 @@ main (int argc, char **argv)
                exit (1);
        }
 
-       settings = nm_remote_settings_new (NULL, &error);
+       settings = nm_client_new (NULL, &error);
        if (!settings) {
                g_printerr ("Failed to create remote settings: %s", error->message);
                g_error_free (error);
diff --git a/src/mobile-helpers.c b/src/mobile-helpers.c
index 4f003e3..7d806f9 100644
--- a/src/mobile-helpers.c
+++ b/src/mobile-helpers.c
@@ -374,7 +374,7 @@ get_secrets_cb (GtkDialog *dialog,
                                              NULL);
                        } else {
                                error = g_error_new (NM_SECRET_AGENT_ERROR,
-                                                    NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                                    NM_SECRET_AGENT_ERROR_FAILED,
                                                     "%s.%d (%s): no GSM setting",
                                                     __FILE__, __LINE__, __func__);
                        }
@@ -388,7 +388,7 @@ get_secrets_cb (GtkDialog *dialog,
                                                      NULL);
                                } else {
                                        error = g_error_new (NM_SECRET_AGENT_ERROR,
-                                                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                                                            NM_SECRET_AGENT_ERROR_FAILED,
                                                             "%s.%d (%s): no CDMA setting",
                                                             __FILE__, __LINE__, __func__);
                                }
@@ -495,7 +495,7 @@ mobile_helper_get_secrets (NMDeviceModemCapabilities capabilities,
        if (!req->hints || !g_strv_length (req->hints)) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): missing secrets hints.",
                             __FILE__, __LINE__, __func__);
                return FALSE;
@@ -513,7 +513,7 @@ mobile_helper_get_secrets (NMDeviceModemCapabilities capabilities,
        else {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): unknown modem capabilities (0x%X).",
                             __FILE__, __LINE__, __func__, capabilities);
                return FALSE;
@@ -527,7 +527,7 @@ mobile_helper_get_secrets (NMDeviceModemCapabilities capabilities,
        else {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): unknown secrets hint '%s'.",
                             __FILE__, __LINE__, __func__, info->secret_name);
                return FALSE;
@@ -538,7 +538,7 @@ mobile_helper_get_secrets (NMDeviceModemCapabilities capabilities,
        if (!widget || !secret_entry) {
                g_set_error (error,
                             NM_SECRET_AGENT_ERROR,
-                            NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
+                            NM_SECRET_AGENT_ERROR_FAILED,
                             "%s.%d (%s): error asking for mobile secrets.",
                             __FILE__, __LINE__, __func__);
                return FALSE;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]