From d465e5fac63f36bcf4069e36827f4b62c494556d Mon Sep 17 00:00:00 2001 From: Michael Biebl Date: Fri, 27 May 2011 19:57:25 +0200 Subject: Imported Upstream version 0.8.9997 --- TODO | 158 ++- callouts/nm-dispatcher-utils.c | 8 + callouts/tests/dispatcher-old-down | 2 +- callouts/tests/dispatcher-old-up | 2 +- callouts/tests/dispatcher-old-vpn-down | 2 +- callouts/tests/dispatcher-old-vpn-up | 2 +- callouts/tests/test-dispatcher-envp.c | 77 +- config.h.in | 6 +- configure | 145 +- configure.ac | 28 +- data/NetworkManager-wait-online.service.in | 6 +- docs/api/html/NetworkManager.devhelp | 28 +- docs/api/html/NetworkManager.devhelp2 | 28 +- docs/api/html/index.html | 32 +- docs/api/html/ix01.html | 2 +- docs/api/html/ref-migrating.html | 58 +- docs/api/html/ref-settings.html | 36 +- docs/api/html/spec.html | 18 +- docs/api/spec.html | 18 +- docs/api/version.xml | 2 +- docs/libnm-glib/html/NMAccessPoint.html | 8 +- docs/libnm-glib/html/NMActiveConnection.html | 8 +- docs/libnm-glib/html/NMClient.html | 12 +- docs/libnm-glib/html/NMDevice.html | 52 +- docs/libnm-glib/html/NMRemoteConnection.html | 6 +- docs/libnm-glib/html/NMRemoteSettings.html | 4 +- docs/libnm-glib/html/NMSecretAgent.html | 30 +- docs/libnm-glib/html/NMWimaxNsp.html | 8 +- docs/libnm-glib/html/api-index-full.html | 12 + docs/libnm-glib/html/ch02.html | 2 +- docs/libnm-glib/html/index.html | 2 +- docs/libnm-glib/html/index.sgml | 3 + docs/libnm-glib/html/libnm-glib-NMVpnPluginUi.html | 28 +- docs/libnm-glib/html/libnm-glib.devhelp | 3 + docs/libnm-glib/html/libnm-glib.devhelp2 | 3 + docs/libnm-glib/html/object-tree.html | 2 +- docs/libnm-glib/libnm-glib-sections.txt | 2 + docs/libnm-util/html/NMConnection.html | 1371 +++++++++++++++++++ docs/libnm-util/html/NMSetting.html | 30 +- docs/libnm-util/html/NMSetting8021x.html | 60 +- docs/libnm-util/html/NMSettingConnection.html | 6 +- docs/libnm-util/html/NMSettingVPN.html | 8 +- docs/libnm-util/html/annotation-glossary.html | 6 + docs/libnm-util/html/api-index-full.html | 98 +- docs/libnm-util/html/ch01.html | 10 +- docs/libnm-util/html/index.html | 3 + docs/libnm-util/html/index.sgml | 63 + docs/libnm-util/html/libnm-util.devhelp | 50 + docs/libnm-util/html/libnm-util.devhelp2 | 53 + docs/libnm-util/html/object-tree.html | 4 +- include/nm-version.h | 2 +- introspection/nm-active-connection.xml | 8 + introspection/nm-device.xml | 8 + introspection/nm-manager.xml | 3 +- libnm-glib/libnm-glib.ver | 2 + libnm-glib/libnm_glib.c | 93 +- libnm-glib/nm-device-wifi.c | 30 +- libnm-glib/nm-device-wimax.c | 25 +- libnm-glib/nm-device.c | 202 ++- libnm-glib/nm-device.h | 3 + libnm-glib/nm-object.c | 31 +- libnm-glib/nm-types.c | 56 +- libnm-util/crypto.c | 94 +- libnm-util/crypto.h | 5 + libnm-util/crypto_gnutls.c | 51 + libnm-util/crypto_nss.c | 15 + libnm-util/libnm-util.ver | 1 + libnm-util/nm-connection.c | 9 +- libnm-util/nm-param-spec-specialized.c | 98 +- libnm-util/nm-setting-8021x.c | 108 +- libnm-util/nm-setting-8021x.h | 12 +- libnm-util/nm-setting-gsm.c | 22 +- libnm-util/nm-setting-vpn.c | 49 +- libnm-util/nm-setting.c | 25 +- libnm-util/nm-utils.c | 64 +- libnm-util/nm-utils.h | 1 - libnm-util/tests/Makefile.am | 8 + libnm-util/tests/Makefile.in | 8 + libnm-util/tests/certs/Makefile.am | 5 +- libnm-util/tests/certs/Makefile.in | 5 +- libnm-util/tests/certs/pkcs8-decrypted.der | Bin 0 -> 1194 bytes libnm-util/tests/certs/pkcs8-enc-key.pem | 29 + libnm-util/tests/certs/pkcs8-noenc-key.pem | 28 + libnm-util/tests/test-crypto.c | 34 + libnm-util/tests/test-general.c | 90 ++ po/eo.po | 1417 ++++++++++++-------- policy/org.freedesktop.NetworkManager.policy | 16 +- src/NetworkManagerUtils.c | 36 +- src/backends/Makefile.am | 2 + src/backends/Makefile.in | 8 +- src/dhcp-manager/nm-dhcp-dhclient-utils.c | 15 +- src/dns-manager/Makefile.am | 2 + src/dns-manager/Makefile.in | 5 +- src/ip6-manager/Makefile.am | 2 + src/ip6-manager/Makefile.in | 5 +- src/logging/nm-logging.c | 6 + src/logging/nm-logging.h | 1 + src/modem-manager/Makefile.am | 2 + src/modem-manager/Makefile.in | 4 +- src/nm-device-interface.c | 8 + src/nm-device-interface.h | 2 + src/nm-device-wifi.c | 53 +- src/nm-device.c | 12 +- src/nm-dhcp4-config.c | 17 + src/nm-dhcp4-config.h | 2 + src/nm-dhcp6-config.c | 17 + src/nm-dhcp6-config.h | 2 + src/nm-manager-auth.c | 222 ++- src/nm-manager-auth.h | 18 +- src/nm-manager.c | 152 +-- src/nm-policy.c | 35 +- src/nm-session-monitor.c | 16 +- src/nm-udev-manager.c | 8 +- src/nm-wifi-ap.c | 39 +- src/nm-wifi-ap.h | 3 - src/ppp-manager/nm-ppp-manager.c | 8 +- src/settings/Makefile.am | 1 - src/settings/Makefile.in | 1 - src/settings/nm-agent-manager.c | 29 +- src/settings/nm-polkit-helpers.h | 41 - src/settings/nm-settings-connection.c | 204 ++- src/settings/nm-settings.c | 64 +- src/settings/plugins/keyfile/writer.c | 33 +- src/vpn-manager/Makefile.am | 2 + src/vpn-manager/Makefile.in | 4 +- src/wimax/nm-device-wimax.c | 62 +- test/nm-tool.c | 47 +- tools/check-exports.sh | 2 +- 128 files changed, 4684 insertions(+), 1770 deletions(-) create mode 100644 docs/libnm-util/html/NMConnection.html create mode 100644 libnm-util/tests/certs/pkcs8-decrypted.der create mode 100644 libnm-util/tests/certs/pkcs8-enc-key.pem create mode 100644 libnm-util/tests/certs/pkcs8-noenc-key.pem delete mode 100644 src/settings/nm-polkit-helpers.h diff --git a/TODO b/TODO index 6afd7f98..1904f04d 100644 --- a/TODO +++ b/TODO @@ -88,6 +88,11 @@ are still missing. If the wifi driver supports AP mode, then in src/supplicant-manager/ NM should send an AP-mode config instead of sending the adhoc config. +Note that some devices (airo, ipw2100, ipw2200, iwl3945, iwl4965, atmel, zd1201) +will never support AP mode due to firmware limitations, so we clearly must still +provide Ad-Hoc connection sharing support for those devices and switch between +Ad-Hoc and AP mode depending on device capabilities. + * On-Demand WiFi Scan support @@ -189,15 +194,40 @@ signals. A patch here: http://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?h=vpn-ip-method -shows that, but internally NM needs to process this request, and instead of -applying given IPv4 or IPv6 configuration (since there isn't any yet) it should -kick off a DHCP request and wait for the request to finish. When it does -finish it should apply the configuration to the interface. Most of the DHCP -code is already written, but src/vpn-manager/nm-vpn-connection.c would need -updates to recognize the new "method" property of the IP4Config signal and -handle the DHCP lifetime after that. The base NMDevice class in nm-device.c -has code for handling the DHCP lifetime, connecting to NMDHCPManager signals -for renew and failure processing, etc, and could be used as an example. +shows that. In nm-vpn-connection.c, upon receipt of the D-Bus Ip4Config signal +from the VPN plugin, NetworkManager would inspect the "method" property of the +ip4 config dictionary. If that property was present and set to "auto" then +DHCP would be started using the network interface returned in the dict. The +nm_vpn_connection_ip4_config_get() function should be split up into two +functions, one containing the existing code for static configuration, and a +second for handling DHCP kickoff. Minimal parsing of the response should be +handled in the newly reduced nm_vpn_connection_ip4_config_get() function. + +To handle DHCP, the NMVPNConnectionPrivate structure should have two members +added: + + NMDHCPManager *dhcp_manager; + NMDHCPClient *dhcp4_client; + +which would be initialized in the new DHCP handler code split off from +nm_vpn_connection_ip4_config_get(). These new members would be disposed of in +both vpn_cleanup() and dispose(), though remember to stop any ongoing DHCP +transaction when doing so (see dhcp4_cleanup() in nm-device.c for example code). +For basic code to start the DHCP transaction, see dhcp4_start() in nm-device.c +as well. After calling nm_dhcp_manager_start_ip4() and connecting the signals +to monitor success and failure, the VPN IP4 config handler would simply return +without changing VPN state, unless a failure occurred. + +Then, when the DHCP transaction succeeds, which we'd know by checking the +DHCP client state changes in the "state-changed" signal handler we attached to +the DHCP client object returned from nm_dhcp_manager_start_ip4(), the code +would retrieve the completed NMIP4Config object from the DHCP client using the +nm_dhcp_client_get_ip4_config() function, and then proceed to execute +essentially the bottom-half of the existing nm_vpn_connection_ip4_config_get() +function to merge that config with user overrides and apply it to the VPN +tunnel interface. Other state changes from the DHCP client might trigger a +failure of the VPN connection, just like DHCP timeouts and lease-renewal +failures do for other devices (see dhcp_state_changed() in nm-device.c). * WPS @@ -243,3 +273,113 @@ association using WPS, since quite a few routers out there are broken, or because the user has no physical access to the router itself, but has been given as passphrase/PSK instead. + +* Proxies + +HTTP and other proxies are per-connection configuration. It's highly unlikely +that the same proxy you need to use at work is used at home or in a coffee shop. +Thus, it makes sense that which proxy settings to use should be updated when +network connections change. NetworkManager is a perfect place to do this since +it tracks which network connections are active, and it already queries the +network for automatic proxy configuration via DHCP and WPAD. + +We should add a new NMSetting subclass called NMSettingProxy that holds +necessary proxy configuration. The properties of this setting should be a +superset of what is provided in the Firefox proxy configuration screen and the +various desktop environment proxy configuration tools like the GNOME Network +Proxy control panel; this should include at a minimum: + + method: "auto", "manual", "none" + default-proxy: string + default-proxy-port: uint + default-always: boolean (use default proxy for all protocols) + ssl-proxy: string + ssl-proxy-port: uint + ftp-proxy: string + ftp-proxy-port: uint + socks-proxy: string + socks-proxy-port: uint + socks-version: uint, either 4 or 5 + no-proxy-for: array of strings (things not to use the proxy for, ie ".foobar.com", + "192.168.0.1/24", an IPv6 address, etc) + pac-url: string (URL of PAC file, overrides DHCP-provided WPAD value) + (FIXME: proxy authentication? do we need separate user/pass properties for + each protocol type? should NM handle proxy auth or should it be punted + to each application?) + +After completing IP configuration but still during the NM_DEVICE_STATE_IP_CONFIG +activation stage, NetworkManager would merge the automatically supplied proxy +configuration (from DHCP's WPAD option) with user-provided overrides from the +NMSettingProxy and send the results to the system. The 'default' connection's +proxy configuration would be preferred, so we'd have to update proxy +configuration from nm-policy.c the same time we update DNS information and the +default route. + +The merged proxy configuration would then be sent to the system. There is no +canonical proxy daemon in-use, so we should have plugins (if not separate +shared libraries, then certainly encapsulated source files that implement a +common glib GInterface or are subclasses of eg a parent NMProxyHandler class) +that handle different system proxy handlers. Some of the proxy handlers are: + + libproxy: need to figure out how it gets proxy info and have NM write merged + proxy config out to that location + pacrunner: a D-Bus enabled daemon, NM would call D-Bus methods of the + pacrunner service with the proxy information + GNOME/KDE: how do these desktop environments retrieve proxy configuration? + + +* Bridging and Bonding Support + +The largest complication here is that NetworkManager normally operates on +physical interfaces, while bridging and bonding involve tying multiple physical +interfaces together into a logical interface. This has interesting implications +for the D-Bus API and the NM device model. The first complication is that +we may need to do 802.1x port authentication on an interface before it can +communicate with the other side of the link, and those credentials may be +different for each interface; thus we may need to do separate 802.1x +operations on each interface that is part of a bridge/bond before adding each +one to the master bridge/bond interface. + +In this way bridge/bond interfaces may be treated the same way as NetworkManager +treats VPN interfaces already; one or more physical interface NMConnections must +be activated before the master bridge/bond interface's NMConnection can be +activated, though this all happens internally. + +To enable bridging and bonding in the NMConnection itself, we should create +new NMSettingBridge and NMSettingBond classes that contain information specific +to each. Both settings would contain a 'components' property with an +'array of string' type which would contain the UUIDs of the Connections of +physical interfaces that compose the bridge or bond. Thus NetworkManager would +have the necessary information to tie lower-level interface configuration +(802.1x, MTU, MAC address locking, duplex mode, speed, etc) to each physical +interface that will be part of the bridge/bond, configure the interface with +it, and then configure the master bridge/bond interface at upper layers using +configuration specific for the bridge/bond interface (like IP details). Thus +for a single active bridge, two or more NMConnections would be activated; one +for each physical interface component of the bridge/bond, and one for the master +bridge/bond interface itself. + +NMSettingBridge would contain at least the following keys: + + components: (array of string) UUIDs of component connections + stp: (boolean) on to enable STP, off to disable + +NMSettingBond would contain at least the following keys: + + components: (array of string) UUIDs of component connections + mode: (string) one of "balance-rr", "active-backup", "balance-xor", + "broadcast", "802.3ad", "balance-tlb", or "balance-alb" + monitor-interval: (uint) Specifies link monitoring interval (in milliseconds); + NM will always enable netlink carrier monitoring if this + value is non-zero so this property only affects speed and + duplex checking + +In the future we may consider adding other bonding parameters like "up-delay" +and "down-delay". + +Then we'd add a 'component' (boolean) property to NMSettingConnection to +indicate that the component interface connections were in fact components of +a bridge or bond and shouldn't be automatically started by NetworkManager or +displayed as separate connections in the user interface. + +TO BE CONTINUED diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c index 97ee1a4b..887e80dd 100644 --- a/callouts/nm-dispatcher-utils.c +++ b/callouts/nm-dispatcher-utils.c @@ -410,6 +410,12 @@ nm_dispatcher_utils_construct_envp (const char *action, if (!strcmp (action, "hostname")) return g_new0 (char *, 1); + /* Canonicalize the VPN interface name; "" is used when passing it through + * D-Bus so make sure that's fixed up here. + */ + if (vpn_ip_iface && !strlen (vpn_ip_iface)) + vpn_ip_iface = NULL; + con_setting_hash = g_hash_table_lookup (connection_hash, NM_SETTING_CONNECTION_SETTING_NAME); if (!con_setting_hash) { g_warning ("Failed to read connection setting"); @@ -437,6 +443,8 @@ nm_dispatcher_utils_construct_envp (const char *action, return NULL; } iface = g_value_get_string (value); + if (iface && !strlen (iface)) + iface = NULL; /* IP interface name */ value = g_hash_table_lookup (device_props, NMD_DEVICE_PROPS_IP_INTERFACE); diff --git a/callouts/tests/dispatcher-old-down b/callouts/tests/dispatcher-old-down index 4210921d..6396287f 100644 --- a/callouts/tests/dispatcher-old-down +++ b/callouts/tests/dispatcher-old-down @@ -1,6 +1,6 @@ [main] action=down -iface=wlan0 +expected-iface=wlan0 uuid=3fd2a33a-d81b-423f-ae99-e6baba742311 id=Random Connection diff --git a/callouts/tests/dispatcher-old-up b/callouts/tests/dispatcher-old-up index ed15fef5..76e3be8d 100644 --- a/callouts/tests/dispatcher-old-up +++ b/callouts/tests/dispatcher-old-up @@ -1,6 +1,6 @@ [main] action=up -iface=wlan0 +expected-iface=wlan0 uuid=3fd2a33a-d81b-423f-ae99-e6baba742311 id=Random Connection diff --git a/callouts/tests/dispatcher-old-vpn-down b/callouts/tests/dispatcher-old-vpn-down index b45d8ea8..c11cbfd1 100644 --- a/callouts/tests/dispatcher-old-vpn-down +++ b/callouts/tests/dispatcher-old-vpn-down @@ -1,6 +1,6 @@ [main] action=vpn-down -iface=tun0 +expected-iface=tun0 uuid=355653c0-34d3-4777-ad25-f9a498b7ef8e id=Random Connection diff --git a/callouts/tests/dispatcher-old-vpn-up b/callouts/tests/dispatcher-old-vpn-up index f3b502de..ad47c91d 100644 --- a/callouts/tests/dispatcher-old-vpn-up +++ b/callouts/tests/dispatcher-old-vpn-up @@ -1,6 +1,6 @@ [main] action=vpn-up -iface=tun0 +expected-iface=tun0 uuid=355653c0-34d3-4777-ad25-f9a498b7ef8e id=Random Connection diff --git a/callouts/tests/test-dispatcher-envp.c b/callouts/tests/test-dispatcher-envp.c index b4dbd784..34b9dbf5 100644 --- a/callouts/tests/test-dispatcher-envp.c +++ b/callouts/tests/test-dispatcher-envp.c @@ -130,18 +130,21 @@ static gboolean parse_main (GKeyFile *kf, GHashTable **out_con_hash, GHashTable **out_con_props, - char **out_iface, + char **out_expected_iface, char **out_action, + char **out_vpn_ip_iface, GError **error) { char *uuid, *id; NMConnection *connection; NMSettingConnection *s_con; - *out_iface = g_key_file_get_string (kf, "main", "iface", error); - if (*out_iface == NULL) + *out_expected_iface = g_key_file_get_string (kf, "main", "expected-iface", error); + if (*out_expected_iface == NULL) return FALSE; + *out_vpn_ip_iface = g_key_file_get_string (kf, "main", "vpn-ip-iface", NULL); + *out_action = g_key_file_get_string (kf, "main", "action", error); if (*out_action == NULL) return FALSE; @@ -413,7 +416,7 @@ get_dispatcher_file (const char *file, GHashTable **out_device_ip6_props, GHashTable **out_device_dhcp4_props, GHashTable **out_device_dhcp6_props, - const char **out_vpn_ip_iface, + char **out_vpn_ip_iface, GHashTable **out_vpn_ip4_props, GHashTable **out_vpn_ip6_props, char **out_expected_iface, @@ -429,7 +432,13 @@ get_dispatcher_file (const char *file, if (!g_key_file_load_from_file (kf, file, G_KEY_FILE_NONE, error)) return FALSE; - if (!parse_main (kf, out_con_hash, out_con_props, out_expected_iface, out_action, error)) + if (!parse_main (kf, + out_con_hash, + out_con_props, + out_expected_iface, + out_action, + out_vpn_ip_iface, + error)) goto out; if (!parse_device (kf, out_device_props, error)) @@ -474,7 +483,7 @@ out: /*******************************************/ static void -test_generic (const char *path, const char *file) +test_generic (const char *path, const char *file, const char *override_vpn_ip_iface) { GHashTable *con_hash = NULL; GHashTable *con_props = NULL; @@ -483,7 +492,7 @@ test_generic (const char *path, const char *file) GHashTable *device_ip6_props = NULL; GHashTable *device_dhcp4_props = NULL; GHashTable *device_dhcp6_props = NULL; - const char *vpn_ip_iface = NULL; + char *vpn_ip_iface = NULL; GHashTable *vpn_ip4_props = NULL; GHashTable *vpn_ip6_props = NULL; char *expected_iface = NULL; @@ -525,25 +534,31 @@ test_generic (const char *path, const char *file) device_ip6_props, device_dhcp4_props, device_dhcp6_props, - vpn_ip_iface, + override_vpn_ip_iface ? override_vpn_ip_iface : vpn_ip_iface, vpn_ip4_props, vpn_ip6_props, &out_iface); /* Print out environment for now */ - g_message ("\n"); +#ifdef DEBUG + g_message ("\n******* Generated environment:"); for (iter = denv; iter && *iter; iter++) g_message (" %s", *iter); +#endif - g_assert_cmpint (g_strv_length (denv), ==, g_hash_table_size (expected_env)); - +#ifdef DEBUG { GHashTableIter k; const char *key; + + g_message ("\n******* Expected environment:"); g_hash_table_iter_init (&k, expected_env); while (g_hash_table_iter_next (&k, (gpointer) &key, NULL)) g_message (" %s", key); } +#endif + + g_assert_cmpint (g_strv_length (denv), ==, g_hash_table_size (expected_env)); /* Compare dispatcher generated env and expected env */ for (iter = denv; iter && *iter; iter++) { @@ -556,6 +571,27 @@ test_generic (const char *path, const char *file) } g_assert_cmpstr (expected_iface, ==, out_iface); + + g_free (out_iface); + g_free (vpn_ip_iface); + g_free (expected_iface); + g_free (action); + g_hash_table_destroy (con_hash); + g_hash_table_destroy (con_props); + g_hash_table_destroy (device_props); + if (device_ip4_props) + g_hash_table_destroy (device_ip4_props); + if (device_ip6_props) + g_hash_table_destroy (device_ip6_props); + if (device_dhcp4_props) + g_hash_table_destroy (device_dhcp4_props); + if (device_dhcp6_props) + g_hash_table_destroy (device_dhcp6_props); + if (vpn_ip4_props) + g_hash_table_destroy (vpn_ip4_props); + if (vpn_ip6_props) + g_hash_table_destroy (vpn_ip6_props); + g_hash_table_destroy (expected_env); } /*******************************************/ @@ -563,25 +599,34 @@ test_generic (const char *path, const char *file) static void test_old_up (const char *path) { - test_generic (path, "dispatcher-old-up"); + test_generic (path, "dispatcher-old-up", NULL); } static void test_old_down (const char *path) { - test_generic (path, "dispatcher-old-down"); + test_generic (path, "dispatcher-old-down", NULL); } static void test_old_vpn_up (const char *path) { - test_generic (path, "dispatcher-old-vpn-up"); + test_generic (path, "dispatcher-old-vpn-up", NULL); } static void test_old_vpn_down (const char *path) { - test_generic (path, "dispatcher-old-vpn-down"); + test_generic (path, "dispatcher-old-vpn-down", NULL); +} + +static void +test_up_empty_vpn_iface (const char *path) +{ + /* Test that an empty VPN iface variable, like is passed through D-Bus + * from NM, is ignored by the dispatcher environment construction code. + */ + test_generic (path, "dispatcher-old-up", ""); } /*******************************************/ @@ -610,6 +655,8 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test_old_vpn_up, argv[1])); g_test_suite_add (suite, TESTCASE (test_old_vpn_down, argv[1])); + g_test_suite_add (suite, TESTCASE (test_up_empty_vpn_iface, argv[1])); + return g_test_run (); } diff --git a/config.h.in b/config.h.in index d9cdcb45..bdbd783e 100644 --- a/config.h.in +++ b/config.h.in @@ -53,9 +53,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PATHS_H -/* Define if you have a polkit with polkit_authority_get_sync() */ -#undef HAVE_POLKIT_AUTHORITY_GET_SYNC - /* Define to 1 if you have the header file. */ #undef HAVE_PPPD_PPPD_H @@ -214,6 +211,9 @@ /* Version number of package */ #undef VERSION +/* Define if you have PolicyKit support */ +#undef WITH_POLKIT + /* Define if you have PPP support */ #undef WITH_PPP diff --git a/configure b/configure index 7405069d..2f3e2441 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for NetworkManager 0.8.999. +# Generated by GNU Autoconf 2.68 for NetworkManager 0.8.9997. # # Report bugs to . # @@ -571,8 +571,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='NetworkManager' PACKAGE_TARNAME='NetworkManager' -PACKAGE_VERSION='0.8.999' -PACKAGE_STRING='NetworkManager 0.8.999' +PACKAGE_VERSION='0.8.9997' +PACKAGE_STRING='NetworkManager 0.8.9997' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=NetworkManager' PACKAGE_URL='' @@ -656,6 +656,8 @@ GNUTLS_CFLAGS PKGCONFIG_PATH NSS_LIBS NSS_CFLAGS +WITH_POLKIT_FALSE +WITH_POLKIT_TRUE POLKIT_LIBS POLKIT_CFLAGS WITH_WIMAX_FALSE @@ -921,6 +923,7 @@ with_udev_dir with_systemdsystemunitdir with_ck enable_wimax +enable_polkit with_crypto with_dbus_sys_dir enable_ppp @@ -1520,7 +1523,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures NetworkManager 0.8.999 to adapt to many kinds of systems. +\`configure' configures NetworkManager 0.8.9997 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1590,7 +1593,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of NetworkManager 0.8.999:";; + short | recursive ) echo "Configuration of NetworkManager 0.8.9997:";; esac cat <<\_ACEOF @@ -1615,6 +1618,7 @@ Optional Features: Enable introspection for this build --enable-qt enable Qt examples --enable-wimax enable WiMAX support + --enable-polkit enable PolicyKit support --enable-ppp enable PPP/PPPoE support --enable-more-warnings Maximum compiler warnings --enable-gtk-doc use gtk-doc to build documentation [[default=no]] @@ -1783,7 +1787,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -NetworkManager configure 0.8.999 +NetworkManager configure 0.8.9997 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2327,7 +2331,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by NetworkManager $as_me 0.8.999, which was +It was created by NetworkManager $as_me 0.8.9997, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -3148,7 +3152,7 @@ fi # Define the identity of the package. PACKAGE='NetworkManager' - VERSION='0.8.999' + VERSION='0.8.9997' cat >>confdefs.h <<_ACEOF @@ -16275,8 +16279,8 @@ fi NM_MAJOR_VERSION=0 NM_MINOR_VERSION=8 -NM_MICRO_VERSION=999 -NM_VERSION=0.8.999 +NM_MICRO_VERSION=9997 +NM_VERSION=0.8.9997 @@ -21209,12 +21213,12 @@ if test -n "$POLKIT_CFLAGS"; then pkg_cv_POLKIT_CFLAGS="$POLKIT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"polkit-gobject-1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "polkit-gobject-1") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"polkit-gobject-1 >= 0.97\""; } >&5 + ($PKG_CONFIG --exists --print-errors "polkit-gobject-1 >= 0.97") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_POLKIT_CFLAGS=`$PKG_CONFIG --cflags "polkit-gobject-1" 2>/dev/null` + pkg_cv_POLKIT_CFLAGS=`$PKG_CONFIG --cflags "polkit-gobject-1 >= 0.97" 2>/dev/null` else pkg_failed=yes fi @@ -21225,12 +21229,12 @@ if test -n "$POLKIT_LIBS"; then pkg_cv_POLKIT_LIBS="$POLKIT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"polkit-gobject-1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "polkit-gobject-1") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"polkit-gobject-1 >= 0.97\""; } >&5 + ($PKG_CONFIG --exists --print-errors "polkit-gobject-1 >= 0.97") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_POLKIT_LIBS=`$PKG_CONFIG --libs "polkit-gobject-1" 2>/dev/null` + pkg_cv_POLKIT_LIBS=`$PKG_CONFIG --libs "polkit-gobject-1 >= 0.97" 2>/dev/null` else pkg_failed=yes fi @@ -21250,98 +21254,55 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - POLKIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "polkit-gobject-1" 2>&1` + POLKIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "polkit-gobject-1 >= 0.97" 2>&1` else - POLKIT_PKG_ERRORS=`$PKG_CONFIG --print-errors "polkit-gobject-1" 2>&1` + POLKIT_PKG_ERRORS=`$PKG_CONFIG --print-errors "polkit-gobject-1 >= 0.97" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$POLKIT_PKG_ERRORS" >&5 - as_fn_error $? "Package requirements (polkit-gobject-1) were not met: - -$POLKIT_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -Alternatively, you may set the environment variables POLKIT_CFLAGS -and POLKIT_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details." "$LINENO" 5 - + have_polkit=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -Alternatively, you may set the environment variables POLKIT_CFLAGS -and POLKIT_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details. - -To get pkg-config, see . -See \`config.log' for more details" "$LINENO" 5; } - + have_polkit=no else POLKIT_CFLAGS=$pkg_cv_POLKIT_CFLAGS POLKIT_LIBS=$pkg_cv_POLKIT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - + have_polkit=yes +fi +# Check whether --enable-polkit was given. +if test "${enable_polkit+set}" = set; then : + enableval=$enable_polkit; enable_polkit=${enableval} +else + enable_polkit=${have_polkit} fi +if (test "${enable_polkit}" = "yes"); then + if test x"$have_polkit" = x"no"; then + as_fn_error $? "PolicyKit development headers are required" "$LINENO" 5 + fi -# Check for polkit_authority_get_sync() -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for polkit_authority_get_sync in -lpolkit-gobject-1" >&5 -$as_echo_n "checking for polkit_authority_get_sync in -lpolkit-gobject-1... " >&6; } -if ${ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpolkit-gobject-1 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char polkit_authority_get_sync (); -int -main () -{ -return polkit_authority_get_sync (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync=yes + +$as_echo "#define WITH_POLKIT 1" >>confdefs.h + else - ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + +$as_echo "#define WITH_POLKIT 0" >>confdefs.h + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync" >&5 -$as_echo "$ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync" >&6; } -if test "x$ac_cv_lib_polkit_gobject_1_polkit_authority_get_sync" = xyes; then : - ac_have_pk_auth_get_sync="1" + if test "${enable_polkit}" = "yes"; then + WITH_POLKIT_TRUE= + WITH_POLKIT_FALSE='#' else - ac_have_pk_auth_get_sync="0" + WITH_POLKIT_TRUE='#' + WITH_POLKIT_FALSE= fi -cat >>confdefs.h <<_ACEOF -#define HAVE_POLKIT_AUTHORITY_GET_SYNC $ac_have_pk_auth_get_sync -_ACEOF - - # Check whether --with-crypto was given. if test "${with_crypto+set}" = set; then : @@ -22516,6 +22477,10 @@ if test -z "${WITH_WIMAX_TRUE}" && test -z "${WITH_WIMAX_FALSE}"; then as_fn_error $? "conditional \"WITH_WIMAX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${WITH_POLKIT_TRUE}" && test -z "${WITH_POLKIT_FALSE}"; then + as_fn_error $? "conditional \"WITH_POLKIT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${WITH_NSS_TRUE}" && test -z "${WITH_NSS_FALSE}"; then as_fn_error $? "conditional \"WITH_NSS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -22961,7 +22926,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by NetworkManager $as_me 0.8.999, which was +This file was extended by NetworkManager $as_me 0.8.9997, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23027,7 +22992,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -NetworkManager config.status 0.8.999 +NetworkManager config.status 0.8.9997 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" @@ -25323,6 +25288,12 @@ else echo systemd support: no fi +if test "${enable_polkit}" = "yes"; then + echo PolicyKit support: yes +else + echo PolicyKit support: no +fi + if test -n "${with_ck}"; then echo ConsoleKit support: ${with_ck} else diff --git a/configure.ac b/configure.ac index b18ccc06..74765de3 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.63]) dnl The NM version number m4_define([nm_major_version], [0]) m4_define([nm_minor_version], [8]) -m4_define([nm_micro_version], [999]) +m4_define([nm_micro_version], [9997]) m4_define([nm_version], [nm_major_version.nm_minor_version.nm_micro_version]) @@ -337,12 +337,20 @@ else fi AM_CONDITIONAL(WITH_WIMAX, test "${enable_wimax}" = "yes") -PKG_CHECK_MODULES(POLKIT, polkit-gobject-1) -AC_SUBST(POLKIT_CFLAGS) - -# Check for polkit_authority_get_sync() -AC_CHECK_LIB([polkit-gobject-1], [polkit_authority_get_sync], ac_have_pk_auth_get_sync="1", ac_have_pk_auth_get_sync="0") -AC_DEFINE_UNQUOTED(HAVE_POLKIT_AUTHORITY_GET_SYNC, $ac_have_pk_auth_get_sync, [Define if you have a polkit with polkit_authority_get_sync()]) +PKG_CHECK_MODULES(POLKIT, [polkit-gobject-1 >= 0.97], [have_polkit=yes],[have_polkit=no]) +AC_ARG_ENABLE(polkit, AS_HELP_STRING([--enable-polkit], [enable PolicyKit support]), + [enable_polkit=${enableval}], [enable_polkit=${have_polkit}]) +if (test "${enable_polkit}" = "yes"); then + if test x"$have_polkit" = x"no"; then + AC_MSG_ERROR(PolicyKit development headers are required) + fi + AC_SUBST(POLKIT_CFLAGS) + AC_SUBST(POLKIT_LIBS) + AC_DEFINE(WITH_POLKIT, 1, [Define if you have PolicyKit support]) +else + AC_DEFINE(WITH_POLKIT, 0, [Define if you have PolicyKit support]) +fi +AM_CONDITIONAL(WITH_POLKIT, test "${enable_polkit}" = "yes") AC_ARG_WITH(crypto, AS_HELP_STRING([--with-crypto=nss | gnutls], [Cryptography library to use for certificate and key operations]),ac_crypto=$withval, ac_crypto=nss) @@ -705,6 +713,12 @@ else echo systemd support: no fi +if test "${enable_polkit}" = "yes"; then + echo PolicyKit support: yes +else + echo PolicyKit support: no +fi + if test -n "${with_ck}"; then echo ConsoleKit support: ${with_ck} else diff --git a/data/NetworkManager-wait-online.service.in b/data/NetworkManager-wait-online.service.in index 1a43d174..0772568f 100644 --- a/data/NetworkManager-wait-online.service.in +++ b/data/NetworkManager-wait-online.service.in @@ -1,12 +1,12 @@ [Unit] Description=Network Manager Wait Online -Requires=NetworkManager.service +After=NetworkManager.service Wants=network.target Before=network.target [Service] Type=oneshot -ExecStart=@bindir@/nm-online -q --timeout=30 +ExecStart=@bindir@/nm-online -q -x --timeout=30 [Install] -WantedBy=multi-user.target +WantedBy=network.target diff --git a/docs/api/html/NetworkManager.devhelp b/docs/api/html/NetworkManager.devhelp index 3954eb81..bf173496 100644 --- a/docs/api/html/NetworkManager.devhelp +++ b/docs/api/html/NetworkManager.devhelp @@ -4,23 +4,23 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/api/html/NetworkManager.devhelp2 b/docs/api/html/NetworkManager.devhelp2 index 5ca2e583..20f2b147 100644 --- a/docs/api/html/NetworkManager.devhelp2 +++ b/docs/api/html/NetworkManager.devhelp2 @@ -4,23 +4,23 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/api/html/index.html b/docs/api/html/index.html index 392f24f2..091a4290 100644 --- a/docs/api/html/index.html +++ b/docs/api/html/index.html @@ -22,11 +22,11 @@     
  

-

Version 0.8.999 +

Version 0.8.9997

This section details the architectural and D-Bus API changes in NetworkManager 0.9.

-Elimination of the User Settings Service

+Elimination of the User Settings Service

Previously there were two "settings services", or D-Bus services that provided and saved network configuration information. NetworkManager @@ -103,7 +103,7 @@

-User Secret Agents

+User Secret Agents

Even with the elimination of the user settings service, in some cases it is still desirable to store secrets in the user's session and not in @@ -152,7 +152,7 @@

-Settings Service Interface Changes

+Settings Service Interface Changes

With the elimination of the user settings service, the old org.freedesktop.NetworkManagerUserSettings and @@ -188,7 +188,7 @@

-Connection Object Interface Changes

+Connection Object Interface Changes

Consistent with the interface changes to the Settings object, the Connection object's D-Bus interface has changed to @@ -222,7 +222,7 @@

-Permissions Methods Consolidation

+Permissions Methods Consolidation

Previously there were two D-Bus method calls to retrieve the list of operations that a user client could perform, and two signals notifying @@ -254,7 +254,7 @@ are now string-based permissions. The mapping is as follows:

-

Table 17. 

+

Table 17. 

@@ -305,7 +305,7 @@

-AddConnection Returns Object Path of New Connection

+AddConnection Returns Object Path of New Connection

The org.freedesktop.NetworkManager.Settings.AddConnection @@ -323,7 +323,7 @@

-Support for WiMAX Devices

+Support for WiMAX Devices

NetworkManager now supports Intel WiMAX mobile broadband devices. A corresponding device type (NM_DEVICE_TYPE_WIMAX) and @@ -346,7 +346,7 @@

-New Device States

+New Device States

A few new device states have been added, and all device states have been renumbered for flexibility. @@ -361,7 +361,7 @@

-New Active Connection State

+New Active Connection State

Along with the new device states, an additional @@ -377,7 +377,7 @@

-Consolidated Modem Devices

+Consolidated Modem Devices

Many new mobile broadband devices support multiple access families, like Qualcomm Gobi cards (CDMA/EVDO and GSM/UMTS), or multi-mode EVDO/LTE @@ -413,7 +413,7 @@

-Secret Property Flags

+Secret Property Flags

In the Connection object's configuration properties, each setting's secret properties (like WiFi passphrases, or public key passwords, etc) now has @@ -422,7 +422,7 @@ following values:

-

Table 18. 

+

Table 18. 

@@ -484,7 +484,7 @@

-Deprecated Methods Removed

+Deprecated Methods Removed

A few methods and signals of the org.freedesktop.NetworkManager interface deprecated in version 0.7 have been removed. All the @@ -494,7 +494,7 @@ their replacements:

-

Table 19. 

+

Table 19. 

diff --git a/docs/api/html/ref-settings.html b/docs/api/html/ref-settings.html index 7924bbce..6f947c7d 100644 --- a/docs/api/html/ref-settings.html +++ b/docs/api/html/ref-settings.html @@ -23,7 +23,7 @@

Network Configuration Setting Specification

@@ -35,11 +35,11 @@

-Configuration Settings

+Configuration Settings

-

Table 1. 802-1x setting

+

Table 1. 802-1x setting

@@ -204,7 +204,7 @@


-

Table 2. bluetooth setting

+

Table 2. bluetooth setting

@@ -243,7 +243,7 @@


-

Table 3. cdma setting

+

Table 3. cdma setting

@@ -294,7 +294,7 @@


-

Table 4. connection setting

+

Table 4. connection setting

@@ -363,7 +363,7 @@


-

Table 5. gsm setting

+

Table 5. gsm setting

@@ -456,7 +456,7 @@


-

Table 6. ipv4 setting

+

Table 6. ipv4 setting

@@ -555,7 +555,7 @@


-

Table 7. ipv6 setting

+

Table 7. ipv6 setting

@@ -636,7 +636,7 @@


-

Table 8. 802-11-olpc-mesh setting

+

Table 8. 802-11-olpc-mesh setting

@@ -681,7 +681,7 @@


-

Table 9. ppp setting

+

Table 9. ppp setting

@@ -816,7 +816,7 @@


-

Table 10. pppoe setting

+

Table 10. pppoe setting

@@ -867,7 +867,7 @@


-

Table 11. serial setting

+

Table 11. serial setting

@@ -924,7 +924,7 @@


-

Table 12. vpn setting

+

Table 12. vpn setting

@@ -975,7 +975,7 @@


-

Table 13. wimax setting

+

Table 13. wimax setting

@@ -1014,7 +1014,7 @@


-

Table 14. 802-3-ethernet setting

+

Table 14. 802-3-ethernet setting

@@ -1101,7 +1101,7 @@


-

Table 15. 802-11-wireless setting

+

Table 15. 802-11-wireless setting

@@ -1200,7 +1200,7 @@


-

Table 16. 802-11-wireless-security setting

+

Table 16. 802-11-wireless-security setting

diff --git a/docs/api/html/spec.html b/docs/api/html/spec.html index 5bb127d4..4533e786 100644 --- a/docs/api/html/spec.html +++ b/docs/api/html/spec.html @@ -258,7 +258,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

state ( ) → @@ -476,6 +477,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.NM_DEVICE_STATE)
The current state of the device. +
ActiveConnection - + o - + (read)
+ Object path of an ActiveConnection object that "owns" this device during + activation. The ActiveConnection object tracks the life-cycle of a + connection to a specific network and implements the + org.freedesktop.NetworkManager.Connection.Active D-Bus interface.
Ip4Config - o - (read)
@@ -1093,7 +1101,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Interface has no properties.

-

org.freedesktop.NetworkManager.Connection.Active

Interface has no methods.

Signals:

PropertiesChanged ( +

org.freedesktop.NetworkManager.Connection.Active

+ Objects that implement the Connection.Active interface represent an attempt + to connect to a network using the details provided by a Connection object. + The Connection.Active object tracks the life-cycle of the connection + attempt and if successful indicates whether the connected network is the + "default" or preferred network for access. +

Interface has no methods.

Signals:

PropertiesChanged ( a{sv}: properties )

Parameters

properties - a{sv} diff --git a/docs/api/spec.html b/docs/api/spec.html index 5bb127d4..4533e786 100644 --- a/docs/api/spec.html +++ b/docs/api/spec.html @@ -258,7 +258,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

state ( ) → @@ -476,6 +477,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.NM_DEVICE_STATE)
The current state of the device. +
ActiveConnection - + o - + (read)
+ Object path of an ActiveConnection object that "owns" this device during + activation. The ActiveConnection object tracks the life-cycle of a + connection to a specific network and implements the + org.freedesktop.NetworkManager.Connection.Active D-Bus interface.
Ip4Config - o - (read)
@@ -1093,7 +1101,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Interface has no properties.

-

org.freedesktop.NetworkManager.Connection.Active

Interface has no methods.

Signals:

PropertiesChanged ( +

org.freedesktop.NetworkManager.Connection.Active

+ Objects that implement the Connection.Active interface represent an attempt + to connect to a network using the details provided by a Connection object. + The Connection.Active object tracks the life-cycle of the connection + attempt and if successful indicates whether the connected network is the + "default" or preferred network for access. +

Interface has no methods.

Signals:

PropertiesChanged ( a{sv}: properties )

Parameters

properties - a{sv} diff --git a/docs/api/version.xml b/docs/api/version.xml index b81eb02c..02098219 100644 --- a/docs/api/version.xml +++ b/docs/api/version.xml @@ -1 +1 @@ -0.8.999 +0.8.9997 diff --git a/docs/libnm-glib/html/NMAccessPoint.html b/docs/libnm-glib/html/NMAccessPoint.html index 08cf78e8..6124f9bb 100644 --- a/docs/libnm-glib/html/NMAccessPoint.html +++ b/docs/libnm-glib/html/NMAccessPoint.html @@ -68,7 +68,7 @@ const char * NMAccessPoint *ap, const GSList *connections); gboolean nm_access_point_connection_valid (NMAccessPoint *ap, - NMConnection *connection); + NMConnection *connection); const char * nm_access_point_get_hw_address (NMAccessPoint *ap);
@@ -457,13 +457,13 @@ other attributes like security settings, channel, etc.
- - @@ -782,6 +816,14 @@ if is incompatible with the device's capabilities and characteristics.

Property Details

+

The "active-connection" property

+
  "active-connection"        NMActiveConnection*   : Read
+

+The NMActiveConnection object that "owns" this device during activation. +

+
+
+

The "capabilities" property

  "capabilities"             guint                 : Read

diff --git a/docs/libnm-glib/html/NMRemoteConnection.html b/docs/libnm-glib/html/NMRemoteConnection.html index 07e3564b..8be508be 100644 --- a/docs/libnm-glib/html/NMRemoteConnection.html +++ b/docs/libnm-glib/html/NMRemoteConnection.html @@ -75,7 +75,7 @@

Object Hierarchy

   GObject
-   +----NMConnection
+   +----NMConnection
          +----NMRemoteConnection
 
@@ -329,7 +329,7 @@ invisible to the current user.
- @@ -353,7 +353,7 @@ still visible to the user. - diff --git a/docs/libnm-glib/html/NMRemoteSettings.html b/docs/libnm-glib/html/NMRemoteSettings.html index b3741ef3..4274c72a 100644 --- a/docs/libnm-glib/html/NMRemoteSettings.html +++ b/docs/libnm-glib/html/NMRemoteSettings.html @@ -73,7 +73,7 @@ struct NMRemoteSettings *settings, const char *uuid); gbooleannm_remote_settings_add_connection (NMRemoteSettings *settings, - NMConnection *connection, + NMConnection *connection, NMRemoteSettingsAddConnectionFunc callback, gpointer user_data); gbooleannm_remote_settings_save_hostname (NMRemoteSettings *settings, @@ -394,7 +394,7 @@ not known. [

nm_remote_settings_add_connection ()

gboolean            nm_remote_settings_add_connection   (NMRemoteSettings *settings,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          NMRemoteSettingsAddConnectionFunc callback,
                                                          gpointer user_data);

diff --git a/docs/libnm-glib/html/NMSecretAgent.html b/docs/libnm-glib/html/NMSecretAgent.html index 8da09f9c..4b08499c 100644 --- a/docs/libnm-glib/html/NMSecretAgent.html +++ b/docs/libnm-glib/html/NMSecretAgent.html @@ -53,16 +53,16 @@ enum NM_SECRET_AGENT_REGISTRATION_RESULT NMSecretAgent; void (*NMSecretAgentGetSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, + NMConnection *connection, GHashTable *secrets, GError *error, gpointer user_data); void (*NMSecretAgentSaveSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, + NMConnection *connection, GError *error, gpointer user_data); void (*NMSecretAgentDeleteSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, + NMConnection *connection, GError *error, gpointer user_data); NMSecretAgentClass; @@ -70,18 +70,18 @@ enum gboolean nm_secret_agent_register (NMSecretAgent *self); gboolean nm_secret_agent_unregister (NMSecretAgent *self); void nm_secret_agent_get_secrets (NMSecretAgent *self, - NMConnection *connection, + NMConnection *connection, const char *setting_name, const char **hints, NMSecretAgentGetSecretsFlags flags, NMSecretAgentGetSecretsFunc callback, gpointer callback_data); void nm_secret_agent_save_secrets (NMSecretAgent *self, - NMConnection *connection, + NMConnection *connection, NMSecretAgentSaveSecretsFunc callback, gpointer callback_data); void nm_secret_agent_delete_secrets (NMSecretAgent *self, - NMConnection *connection, + NMConnection *connection, NMSecretAgentDeleteSecretsFunc callback, gpointer callback_data); @@ -225,7 +225,7 @@ is allowed.

NMSecretAgentGetSecretsFunc ()

void                (*NMSecretAgentGetSecretsFunc)      (NMSecretAgent *agent,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GHashTable *secrets,
                                                          GError *error,
                                                          gpointer user_data);
@@ -236,7 +236,7 @@ is allowed.

NMSecretAgentSaveSecretsFunc ()

void                (*NMSecretAgentSaveSecretsFunc)     (NMSecretAgent *agent,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError *error,
                                                          gpointer user_data);

@@ -246,7 +246,7 @@ is allowed.

NMSecretAgentDeleteSecretsFunc ()

void                (*NMSecretAgentDeleteSecretsFunc)   (NMSecretAgent *agent,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError *error,
                                                          gpointer user_data);

@@ -388,7 +388,7 @@ store secrets on behalf of this user.

nm_secret_agent_get_secrets ()

void                nm_secret_agent_get_secrets         (NMSecretAgent *self,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          const char *setting_name,
                                                          const char **hints,
                                                          NMSecretAgentGetSecretsFlags flags,
@@ -414,7 +414,7 @@ VFunc: get_secrets
 
- + @@ -446,7 +446,7 @@ VFunc: get_secrets

nm_secret_agent_save_secrets ()

void                nm_secret_agent_save_secrets        (NMSecretAgent *self,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          NMSecretAgentSaveSecretsFunc callback,
                                                          gpointer callback_data);

@@ -466,7 +466,7 @@ VFunc: save_secrets

- @@ -486,7 +486,7 @@ VFunc: save_secrets

nm_secret_agent_delete_secrets ()

void                nm_secret_agent_delete_secrets      (NMSecretAgent *self,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          NMSecretAgentDeleteSecretsFunc callback,
                                                          gpointer callback_data);

@@ -506,7 +506,7 @@ VFunc: delete_secrets

- diff --git a/docs/libnm-glib/html/NMWimaxNsp.html b/docs/libnm-glib/html/NMWimaxNsp.html index 10f11410..dfff7ffd 100644 --- a/docs/libnm-glib/html/NMWimaxNsp.html +++ b/docs/libnm-glib/html/NMWimaxNsp.html @@ -55,7 +55,7 @@ const char * GSList * nm_wimax_nsp_filter_connections (NMWimaxNsp *nsp, const GSList *connections); gbooleannm_wimax_nsp_connection_valid (NMWimaxNsp *nsp, - NMConnection *connection); + NMConnection *connection);
@@ -256,13 +256,13 @@ returned connections will match the nsp'

connections :

a list of -NMConnection objects to filter. [element-type NetworkManager.Connection] +NMConnection objects to filter. [element-type NetworkManager.Connection]

Returns :

a -list of NMConnection objects that could be activated with the given ap. +list of NMConnection objects that could be activated with the given ap. The elements of the list are owned by their creator and should not be freed by the caller, but the returned list itself is owned by the caller and should be freed with g_slist_free() when it is no longer required. [transfer container][element-type NetworkManager.Connection] @@ -476,7 +476,7 @@ be freed with

nm_access_point_connection_valid ()

gboolean            nm_access_point_connection_valid    (NMAccessPoint *ap,
-                                                         NMConnection *connection);
+ NMConnection *connection);

diff --git a/docs/libnm-glib/html/NMActiveConnection.html b/docs/libnm-glib/html/NMActiveConnection.html index 7f597bfe..f8548683 100644 --- a/docs/libnm-glib/html/NMActiveConnection.html +++ b/docs/libnm-glib/html/NMActiveConnection.html @@ -202,7 +202,7 @@ Creates a new

nm_active_connection_get_connection ()

const char *        nm_active_connection_get_connection (NMActiveConnection *connection);

-Gets the NMConnection's DBus object path. +Gets the NMConnection's DBus object path.

@@ -214,7 +214,7 @@ Gets the NMConnection's DBus object path. - @@ -225,7 +225,7 @@ This is the internal string used by the connection, and must not be modified.

nm_active_connection_get_uuid ()

const char *        nm_active_connection_get_uuid       (NMActiveConnection *connection);

-Gets the NMConnection's UUID. +Gets the NMConnection's UUID.

Returns :

the object path of the NMConnection inside of NMActiveConnection. +the object path of the NMConnection inside of NMActiveConnection. This is the internal string used by the connection, and must not be modified.
@@ -237,7 +237,7 @@ Gets the NMConnection's UUID. - diff --git a/docs/libnm-glib/html/NMClient.html b/docs/libnm-glib/html/NMClient.html index b8834f84..26d99de0 100644 --- a/docs/libnm-glib/html/NMClient.html +++ b/docs/libnm-glib/html/NMClient.html @@ -67,7 +67,7 @@ const GError *error, gpointer user_data); voidnm_client_activate_connection (NMClient *client, - NMConnection *connection, + NMConnection *connection, NMDevice *device, const char *specific_object, NMClientActivateFn callback, @@ -79,7 +79,7 @@ const gpointer user_data); voidnm_client_add_and_activate_connection (NMClient *client, - NMConnection *partial, + NMConnection *partial, NMDevice *device, const char *specific_object, NMClientAddActivateFn callback, @@ -390,7 +390,7 @@ Gets a

nm_client_activate_connection ()

void                nm_client_activate_connection       (NMClient *client,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          NMDevice *device,
                                                          const char *specific_object,
                                                          NMClientActivateFn callback,
@@ -414,7 +414,7 @@ determine which network to connect to given the settings in connection :

-
@@ -462,7 +462,7 @@ details of the newly added connection. [

nm_client_add_and_activate_connection ()

void                nm_client_add_and_activate_connection
                                                         (NMClient *client,
-                                                         NMConnection *partial,
+                                                         NMConnection *partial,
                                                          NMDevice *device,
                                                          const char *specific_object,
                                                          NMClientAddActivateFn callback,
@@ -483,7 +483,7 @@ Cannot be used for VPN connections at this time.
 
- diff --git a/docs/libnm-glib/html/NMDevice.html b/docs/libnm-glib/html/NMDevice.html index 3af508c4..f7f01aa2 100644 --- a/docs/libnm-glib/html/NMDevice.html +++ b/docs/libnm-glib/html/NMDevice.html @@ -56,6 +56,7 @@ #define NM_DEVICE_IP6_CONFIG #define NM_DEVICE_DHCP6_CONFIG #define NM_DEVICE_STATE +#define NM_DEVICE_ACTIVE_CONNECTION #define NM_DEVICE_VENDOR #define NM_DEVICE_PRODUCT NMDevice; @@ -75,6 +76,7 @@ const char * NMIP6Config * nm_device_get_ip6_config (NMDevice *device); NMDHCP6Config * nm_device_get_dhcp6_config (NMDevice *device); NMDeviceState nm_device_get_state (NMDevice *device); +NMActiveConnection * nm_device_get_active_connection (NMDevice *device); const char * nm_device_get_product (NMDevice *device); const char * nm_device_get_vendor (NMDevice *device); void (*NMDeviceDeactivateFn) (NMDevice *device, @@ -86,7 +88,7 @@ const char * GSList * nm_device_filter_connections (NMDevice *device, const GSList *connections); gboolean nm_device_connection_valid (NMDevice *device, - NMConnection *connection); + NMConnection *connection);
@@ -105,6 +107,7 @@ const char *

Properties

+  "active-connection"        NMActiveConnection*   : Read
   "capabilities"             guint                 : Read
   "device-type"              guint                 : Read / Write / Construct Only
   "dhcp4-config"             NMDHCP4Config*        : Read
@@ -240,6 +243,14 @@ const char *          
+

NM_DEVICE_ACTIVE_CONNECTION

+
#define NM_DEVICE_ACTIVE_CONNECTION "active-connection"
+
+

+

+
+
+

NM_DEVICE_VENDOR

#define NM_DEVICE_VENDOR "vendor"
 
@@ -620,6 +631,29 @@ Gets the current
+

nm_device_get_active_connection ()

+
NMActiveConnection *  nm_device_get_active_connection   (NMDevice *device);
+

+Gets the NMActiveConnection object which owns this device during activation. +

+

Returns :

the UUID of the NMConnection that backs the NMActiveConnection. +the UUID of the NMConnection that backs the NMActiveConnection. This is the internal string used by the connection, and must not be modified.
an NMConnection +an NMConnection

partial :

an NMConnection to add; the connection may be +an NMConnection to add; the connection may be partially filled (or even NULL) and will be completed by NetworkManager using the given device and specific_object before being added. [allow-none]
++ + + + + + + + + + +

device :

a NMDevice +

Returns :

the NMActiveConnection +
+ +
+

nm_device_get_product ()

const char *          nm_device_get_product             (NMDevice *device);

@@ -728,13 +762,13 @@ incompatible with the device.

connections :

a list of NMConnection objects to filter. [element-type NetworkManager.Connection] +a list of NMConnection objects to filter. [element-type NetworkManager.Connection]

Returns :

a -list of NMConnection objects that could be activated with the given device. +list of NMConnection objects that could be activated with the given device. The elements of the list are owned by their creator and should not be freed by the caller, but the returned list itself is owned by the caller and should be freed with g_slist_free() when it is no longer required. [transfer container][element-type NetworkManager.Connection] @@ -747,7 +781,7 @@ be freed with

nm_device_connection_valid ()

gboolean            nm_device_connection_valid          (NMDevice *device,
-                                                         NMConnection *connection);
+ NMConnection *connection);

Validates a given connection for a given NMDevice object and returns whether the connection may be activated with the device. For example if @@ -766,7 +800,7 @@ device.

connection :

an NMConnection to validate against device +an NMConnection to validate against device

connection :

a NMConnection +a NMConnection

connection :

a NMConnection +a NMConnection

connection :

the NMConnection for which we're asked secretsthe NMConnection for which we're asked secrets

setting_name :

connection :

a NMConnection +a NMConnection

connection :

a NMConnection +a NMConnection

connections :

a list of -NMConnection objects to filter. [element-type NetworkManager.Connection] +NMConnection objects to filter. [element-type NetworkManager.Connection]

Returns :

a -list of NMConnection objects that could be activated with the given nsp. +list of NMConnection objects that could be activated with the given nsp. The elements of the list are owned by their creator and should not be freed by the caller, but the returned list itself is owned by the caller and should be freed with g_slist_free() when it is no longer required. [transfer container][element-type NetworkManager.Connection] @@ -275,7 +275,7 @@ be freed with

nm_wimax_nsp_connection_valid ()

gboolean            nm_wimax_nsp_connection_valid       (NMWimaxNsp *nsp,
-                                                         NMConnection *connection);
+ NMConnection *connection);

diff --git a/docs/libnm-glib/html/api-index-full.html b/docs/libnm-glib/html/api-index-full.html index f2b1352a..311e8996 100644 --- a/docs/libnm-glib/html/api-index-full.html +++ b/docs/libnm-glib/html/api-index-full.html @@ -533,6 +533,10 @@ dbus_glib_marshal_nm_secret_agent_VOID__BOXED_STRING_POINTER, function in nm-sec
+NMDevice:active-connection, object property in NMDevice +
+
+
NMDevice:capabilities, object property in NMDevice
@@ -745,6 +749,10 @@ dbus_glib_marshal_nm_secret_agent_VOID__BOXED_STRING_POINTER, function in nm-sec
+NM_DEVICE_ACTIVE_CONNECTION, macro in NMDevice +
+
+
NM_DEVICE_BT_CAPABILITIES, macro in NMDeviceBt
@@ -845,6 +853,10 @@ dbus_glib_marshal_nm_secret_agent_VOID__BOXED_STRING_POINTER, function in nm-sec
+nm_device_get_active_connection, function in NMDevice +
+
+
nm_device_get_capabilities, function in NMDevice
diff --git a/docs/libnm-glib/html/ch02.html b/docs/libnm-glib/html/ch02.html index 6d814661..bfc17007 100644 --- a/docs/libnm-glib/html/ch02.html +++ b/docs/libnm-glib/html/ch02.html @@ -21,7 +21,7 @@

-libnm-glib API Reference

+libnm-glib API Reference
NMClient diff --git a/docs/libnm-glib/html/index.html b/docs/libnm-glib/html/index.html index 0eb745a3..665edd03 100644 --- a/docs/libnm-glib/html/index.html +++ b/docs/libnm-glib/html/index.html @@ -29,7 +29,7 @@

-

+

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later diff --git a/docs/libnm-glib/html/index.sgml b/docs/libnm-glib/html/index.sgml index de8edceb..db6d2d8a 100644 --- a/docs/libnm-glib/html/index.sgml +++ b/docs/libnm-glib/html/index.sgml @@ -112,6 +112,7 @@ + @@ -130,6 +131,7 @@ + @@ -137,6 +139,7 @@ + diff --git a/docs/libnm-glib/html/libnm-glib-NMVpnPluginUi.html b/docs/libnm-glib/html/libnm-glib-NMVpnPluginUi.html index d517644e..834996c2 100644 --- a/docs/libnm-glib/html/libnm-glib-NMVpnPluginUi.html +++ b/docs/libnm-glib/html/libnm-glib-NMVpnPluginUi.html @@ -49,23 +49,23 @@ enum NMVpnPluginUiInterface; NMVpnPluginUiWidgetInterface * nm_vpn_plugin_ui_interface_ui_factory (NMVpnPluginUiInterface *iface, - NMConnection *connection, + NMConnection *connection, GError **error); guint32 nm_vpn_plugin_ui_interface_get_capabilities (NMVpnPluginUiInterface *iface); -NMConnection * nm_vpn_plugin_ui_interface_import (NMVpnPluginUiInterface *iface, +NMConnection * nm_vpn_plugin_ui_interface_import (NMVpnPluginUiInterface *iface, const char *path, GError **error); gboolean nm_vpn_plugin_ui_interface_export (NMVpnPluginUiInterface *iface, const char *path, - NMConnection *connection, + NMConnection *connection, GError **error); char * nm_vpn_plugin_ui_interface_get_suggested_name (NMVpnPluginUiInterface *iface, - NMConnection *connection); + NMConnection *connection); gboolean nm_vpn_plugin_ui_interface_delete_connection (NMVpnPluginUiInterface *iface, - NMConnection *connection, + NMConnection *connection, GError **error); #define NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE #define NM_VPN_PLUGIN_UI_WIDGET_INTERFACE (obj) @@ -78,11 +78,11 @@ struct NMVpnPluginUiWidgetInterface *iface); gboolean nm_vpn_plugin_ui_widget_interface_update_connection (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, + NMConnection *connection, GError **error); gboolean nm_vpn_plugin_ui_widget_interface_save_secrets (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, + NMConnection *connection, GError **error);

@@ -236,7 +236,7 @@ struct

nm_vpn_plugin_ui_interface_ui_factory ()

NMVpnPluginUiWidgetInterface * nm_vpn_plugin_ui_interface_ui_factory
                                                         (NMVpnPluginUiInterface *iface,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError **error);

@@ -252,7 +252,7 @@ struct

nm_vpn_plugin_ui_interface_import ()

-
NMConnection *      nm_vpn_plugin_ui_interface_import   (NMVpnPluginUiInterface *iface,
+
NMConnection *      nm_vpn_plugin_ui_interface_import   (NMVpnPluginUiInterface *iface,
                                                          const char *path,
                                                          GError **error);

@@ -263,7 +263,7 @@ struct

nm_vpn_plugin_ui_interface_export ()

gboolean            nm_vpn_plugin_ui_interface_export   (NMVpnPluginUiInterface *iface,
                                                          const char *path,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError **error);

@@ -273,7 +273,7 @@ struct

nm_vpn_plugin_ui_interface_get_suggested_name ()

char *              nm_vpn_plugin_ui_interface_get_suggested_name
                                                         (NMVpnPluginUiInterface *iface,
-                                                         NMConnection *connection);
+ NMConnection *connection);

@@ -282,7 +282,7 @@ struct

nm_vpn_plugin_ui_interface_delete_connection ()

gboolean            nm_vpn_plugin_ui_interface_delete_connection
                                                         (NMVpnPluginUiInterface *iface,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError **error);

@@ -377,7 +377,7 @@ struct

nm_vpn_plugin_ui_widget_interface_update_connection ()

gboolean            nm_vpn_plugin_ui_widget_interface_update_connection
                                                         (NMVpnPluginUiWidgetInterface *iface,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError **error);

@@ -387,7 +387,7 @@ struct

nm_vpn_plugin_ui_widget_interface_save_secrets ()

gboolean            nm_vpn_plugin_ui_widget_interface_save_secrets
                                                         (NMVpnPluginUiWidgetInterface *iface,
-                                                         NMConnection *connection,
+                                                         NMConnection *connection,
                                                          GError **error);

diff --git a/docs/libnm-glib/html/libnm-glib.devhelp b/docs/libnm-glib/html/libnm-glib.devhelp index 784eca14..cd1d0857 100644 --- a/docs/libnm-glib/html/libnm-glib.devhelp +++ b/docs/libnm-glib/html/libnm-glib.devhelp @@ -122,6 +122,7 @@ + @@ -140,12 +141,14 @@ + + diff --git a/docs/libnm-glib/html/libnm-glib.devhelp2 b/docs/libnm-glib/html/libnm-glib.devhelp2 index 4cc1d64b..a74fd687 100644 --- a/docs/libnm-glib/html/libnm-glib.devhelp2 +++ b/docs/libnm-glib/html/libnm-glib.devhelp2 @@ -122,6 +122,7 @@ + @@ -140,12 +141,14 @@ + + diff --git a/docs/libnm-glib/html/object-tree.html b/docs/libnm-glib/html/object-tree.html index 1ebe1369..6bcd8f42 100644 --- a/docs/libnm-glib/html/object-tree.html +++ b/docs/libnm-glib/html/object-tree.html @@ -41,7 +41,7 @@ NMDHCP4Config NMDHCP6Config NMRemoteSettings - NMConnection + NMConnection NMRemoteConnection NMSecretAgent diff --git a/docs/libnm-glib/libnm-glib-sections.txt b/docs/libnm-glib/libnm-glib-sections.txt index 71910fd5..90733f9b 100644 --- a/docs/libnm-glib/libnm-glib-sections.txt +++ b/docs/libnm-glib/libnm-glib-sections.txt @@ -302,6 +302,7 @@ NM_DEVICE_DHCP4_CONFIG NM_DEVICE_IP6_CONFIG NM_DEVICE_DHCP6_CONFIG NM_DEVICE_STATE +NM_DEVICE_ACTIVE_CONNECTION NM_DEVICE_VENDOR NM_DEVICE_PRODUCT NMDevice @@ -320,6 +321,7 @@ nm_device_get_dhcp4_config nm_device_get_ip6_config nm_device_get_dhcp6_config nm_device_get_state +nm_device_get_active_connection nm_device_get_product nm_device_get_vendor NMDeviceDeactivateFn diff --git a/docs/libnm-util/html/NMConnection.html b/docs/libnm-util/html/NMConnection.html new file mode 100644 index 00000000..489a2fd6 --- /dev/null +++ b/docs/libnm-util/html/NMConnection.html @@ -0,0 +1,1371 @@ + + + + +NMConnection + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

NMConnection

+

NMConnection — Describes a connection to specific network or provider

+
+
+

Synopsis

+
+#include <nm-connection.h>
+
+enum                NMConnectionError;
+#define             NM_TYPE_CONNECTION_ERROR
+#define             NM_CONNECTION_ERROR
+GQuark              nm_connection_error_quark           (void);
+#define             NM_CONNECTION_PATH
+                    NMConnection;
+                    NMConnectionClass;
+GType               nm_connection_get_type              (void);
+NMConnection *      nm_connection_new                   (void);
+NMConnection *      nm_connection_new_from_hash         (GHashTable *hash,
+                                                         GError **error);
+NMConnection *      nm_connection_duplicate             (NMConnection *connection);
+NMSetting *         nm_connection_create_setting        (const char *name);
+void                nm_connection_add_setting           (NMConnection *connection,
+                                                         NMSetting *setting);
+void                nm_connection_remove_setting        (NMConnection *connection,
+                                                         GType setting_type);
+NMSetting *         nm_connection_get_setting           (NMConnection *connection,
+                                                         GType setting_type);
+NMSetting *         nm_connection_get_setting_by_name   (NMConnection *connection,
+                                                         const char *name);
+gboolean            nm_connection_replace_settings      (NMConnection *connection,
+                                                         GHashTable *new_settings,
+                                                         GError **error);
+gboolean            nm_connection_compare               (NMConnection *a,
+                                                         NMConnection *b,
+                                                         NMSettingCompareFlags flags);
+gboolean            nm_connection_diff                  (NMConnection *a,
+                                                         NMConnection *b,
+                                                         NMSettingCompareFlags flags,
+                                                         GHashTable **out_settings);
+gboolean            nm_connection_verify                (NMConnection *connection,
+                                                         GError **error);
+const char *        nm_connection_need_secrets          (NMConnection *connection,
+                                                         GPtrArray **hints);
+void                nm_connection_clear_secrets         (NMConnection *connection);
+gboolean            nm_connection_update_secrets        (NMConnection *connection,
+                                                         const char *setting_name,
+                                                         GHashTable *setting_secrets,
+                                                         GError **error);
+void                nm_connection_set_path              (NMConnection *connection,
+                                                         const char *path);
+const char *        nm_connection_get_path              (NMConnection *connection);
+void                nm_connection_for_each_setting_value
+                                                        (NMConnection *connection,
+                                                         NMSettingValueIterFn func,
+                                                         gpointer user_data);
+GHashTable *        nm_connection_to_hash               (NMConnection *connection,
+                                                         NMSettingHashFlags flags);
+void                nm_connection_dump                  (NMConnection *connection);
+GType               nm_connection_lookup_setting_type   (const char *name);
+GType               nm_connection_lookup_setting_type_by_quark
+                                                        (GQuark error_quark);
+const char *        nm_connection_get_uuid              (NMConnection *connection);
+const char *        nm_connection_get_id                (NMConnection *connection);
+NMSetting8021x *            nm_connection_get_setting_802_1x
+                                                        (NMConnection *connection);
+NMSettingBluetooth *        nm_connection_get_setting_bluetooth
+                                                        (NMConnection *connection);
+NMSettingCdma *             nm_connection_get_setting_cdma
+                                                        (NMConnection *connection);
+NMSettingConnection *       nm_connection_get_setting_connection
+                                                        (NMConnection *connection);
+NMSettingGsm *              nm_connection_get_setting_gsm
+                                                        (NMConnection *connection);
+NMSettingIP4Config *        nm_connection_get_setting_ip4_config
+                                                        (NMConnection *connection);
+NMSettingIP6Config *        nm_connection_get_setting_ip6_config
+                                                        (NMConnection *connection);
+NMSettingOlpcMesh *         nm_connection_get_setting_olpc_mesh
+                                                        (NMConnection *connection);
+NMSettingPPP *              nm_connection_get_setting_ppp
+                                                        (NMConnection *connection);
+NMSettingPPPOE *            nm_connection_get_setting_pppoe
+                                                        (NMConnection *connection);
+NMSettingVPN *              nm_connection_get_setting_vpn
+                                                        (NMConnection *connection);
+NMSettingWimax *            nm_connection_get_setting_wimax
+                                                        (NMConnection *connection);
+NMSettingWired *            nm_connection_get_setting_wired
+                                                        (NMConnection *connection);
+NMSettingWireless *         nm_connection_get_setting_wireless
+                                                        (NMConnection *connection);
+NMSettingWirelessSecurity * nm_connection_get_setting_wireless_security
+                                                        (NMConnection *connection);
+
+
+
+

Object Hierarchy

+
+  GEnum
+   +----NMConnectionError
+
+
+  GObject
+   +----NMConnection
+
+
+
+

Properties

+
+  "path"                     gchar*                : Read / Write / Construct
+
+
+
+

Signals

+
+  "secrets-updated"                                : Run First
+
+
+
+

Description

+

+An NMConnection describes all the settings and configuration values that +are necessary to configure network devices for operation on a specific +network. Connections are the fundamental operating object for +NetworkManager; no device is connected without a NMConnection, or +disconnected without having been connected with a NMConnection. +

+

+Each NMConnection contains a list of NMSetting objects usually referenced +by name (using nm_connection_get_setting_by_name()) or by type (with +nm_connection_get_setting()). The settings describe the actual parameters +with which the network devices are configured, including device-specific +parameters (MTU, SSID, APN, channel, rate, etc) and IP-level parameters +(addresses, routes, addressing methods, etc). +

+
+
+

Details

+
+

enum NMConnectionError

+
typedef enum
+{
+	NM_CONNECTION_ERROR_UNKNOWN = 0,
+	NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND,
+	NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID
+} NMConnectionError;
+
+

+Describes errors that may result from operations involving a NMConnection. +

+
++ + + + + + + + + + + + + + +

NM_CONNECTION_ERROR_UNKNOWN

unknown or unclassified error +

NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND

the NMConnection object + did not contain the required NMSettingConnection object, which must be + present for all connections +

NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID

the 'type' property of the + 'connection' setting did not point to a valid connection base type; ie + it was not a hardware-related setting like NMSettingWired or + NMSettingWireless. +
+
+
+
+

NM_TYPE_CONNECTION_ERROR

+
#define NM_TYPE_CONNECTION_ERROR (nm_connection_error_get_type ()) 
+
+

+

+
+
+
+

NM_CONNECTION_ERROR

+
#define NM_CONNECTION_ERROR nm_connection_error_quark ()
+
+

+

+
+
+
+

nm_connection_error_quark ()

+
GQuark              nm_connection_error_quark           (void);
+

+Registers an error quark for NMConnection if necessary. +

+
++ + + + +

Returns :

the error quark used for NMConnection errors.
+
+
+
+

NM_CONNECTION_PATH

+
#define NM_CONNECTION_PATH "path"
+
+

+

+
+
+
+

NMConnection

+
typedef struct _NMConnection NMConnection;
+

+The NMConnection struct contains only private data. +It should only be accessed through the functions described below. +

+
+
+
+

NMConnectionClass

+
typedef struct {
+	GObjectClass parent;
+
+	/* Signals */
+	void (*secrets_updated) (NMConnection *connection, const char * setting);
+} NMConnectionClass;
+
+

+

+
+
+
+

nm_connection_get_type ()

+
GType               nm_connection_get_type              (void);
+

+

+
+
+
+

nm_connection_new ()

+
NMConnection *      nm_connection_new                   (void);
+

+Creates a new NMConnection object with no NMSetting objects. +

+
++ + + + +

Returns :

the new empty NMConnection object
+
+
+
+

nm_connection_new_from_hash ()

+
NMConnection *      nm_connection_new_from_hash         (GHashTable *hash,
+                                                         GError **error);
+

+Creates a new NMConnection from a hash table describing the connection. See +nm_connection_to_hash() for a description of the expected hash table. +

+
++ + + + + + + + + + + + + + +

hash :

the GHashTable describing +the connection. [element-type utf8 GLib.HashTable] +

error :

on unsuccessful return, an error

Returns :

the new NMConnection object, populated with settings created +from the values in the hash table, or NULL if the connection failed to +validate
+
+
+
+

nm_connection_duplicate ()

+
NMConnection *      nm_connection_duplicate             (NMConnection *connection);
+

+Duplicates a NMConnection. +

+
++ + + + + + + + + + +

connection :

the NMConnection to duplicate

Returns :

a new NMConnection containing the same settings and properties +as the source NMConnection. [transfer full] +
+
+
+
+

nm_connection_create_setting ()

+
NMSetting *         nm_connection_create_setting        (const char *name);
+

+Create a new NMSetting object of the desired type, given a setting name. +

+
++ + + + + + + + + + +

name :

a setting name

Returns :

the new setting object, or NULL if the setting name was unknown. [transfer full] +
+
+
+
+

nm_connection_add_setting ()

+
void                nm_connection_add_setting           (NMConnection *connection,
+                                                         NMSetting *setting);
+

+Adds a NMSetting to the connection, replacing any previous NMSetting of the +same name which has previously been added to the NMConnection. The +connection takes ownership of the NMSetting object and does not increase +the setting object's reference count. +

+
++ + + + + + + + + + +

connection :

a NMConnection +

setting :

the NMSetting to add to the connection object. [transfer full] +
+
+
+
+

nm_connection_remove_setting ()

+
void                nm_connection_remove_setting        (NMConnection *connection,
+                                                         GType setting_type);
+

+Removes the NMSetting with the given GType from the NMConnection. This +operation dereferences the NMSetting object. +

+
++ + + + + + + + + + +

connection :

a NMConnection +

setting_type :

the GType of the setting object to remove
+
+
+
+

nm_connection_get_setting ()

+
NMSetting *         nm_connection_get_setting           (NMConnection *connection,
+                                                         GType setting_type);
+

+Gets the NMSetting with the given GType, if one has been previously added +to the NMConnection. +

+
++ + + + + + + + + + + + + + +

connection :

a NMConnection +

setting_type :

the GType of the setting object to return

Returns :

the NMSetting, or NULL if no setting of that type was previously +added to the NMConnection. [transfer none] +
+
+
+
+

nm_connection_get_setting_by_name ()

+
NMSetting *         nm_connection_get_setting_by_name   (NMConnection *connection,
+                                                         const char *name);
+

+Gets the NMSetting with the given name, if one has been previously added +the the NMConnection. +

+
++ + + + + + + + + + + + + + +

connection :

a NMConnection +

name :

a setting name

Returns :

the NMSetting, or NULL if no setting with that name was previously +added to the NMConnection. [transfer none] +
+
+
+
+

nm_connection_replace_settings ()

+
gboolean            nm_connection_replace_settings      (NMConnection *connection,
+                                                         GHashTable *new_settings,
+                                                         GError **error);
+
++ + + + + + + + + + + + + + + + + + +

connection :

a NMConnection +

new_settings :

a GHashTable of settings. [element-type utf8 GLib.HashTable] +

error :

location to store error, or NULL +

Returns :

+TRUE if the settings were valid and added to the connection, FALSE +if they were not
+
+
+
+

nm_connection_compare ()

+
gboolean            nm_connection_compare               (NMConnection *a,
+                                                         NMConnection *b,
+                                                         NMSettingCompareFlags flags);
+

+Compares two NMConnection objects for similarity, with comparison behavior +modified by a set of flags. See nm_setting_compare() for a description of +each flag's behavior. +

+
++ + + + + + + + + + + + + + + + + + +

a :

a NMConnection +

b :

a second NMConnection to compare with the first

flags :

compare flags, e.g. NM_SETTING_COMPARE_FLAG_EXACT +

Returns :

+TRUE if the comparison succeeds, FALSE if it does not
+
+
+
+

nm_connection_diff ()

+
gboolean            nm_connection_diff                  (NMConnection *a,
+                                                         NMConnection *b,
+                                                         NMSettingCompareFlags flags,
+                                                         GHashTable **out_settings);
+

+Compares two NMConnection objects for similarity, with comparison behavior +modified by a set of flags. See nm_setting_compare() for a description of +each flag's behavior. If the connections differ, settings and keys within +each setting that differ are added to the returned out_settings hash table. +No values are returned, only key names. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

a :

a NMConnection +

b :

a second NMConnection to compare with the first

flags :

compare flags, e.g. NM_SETTING_COMPARE_FLAG_EXACT +

out_settings :

if the +connections differ, on return a hash table mapping setting names to +second-level GHashTable (utf8 to guint32), which contains the key names that +differ mapped to one or more of NMSettingDiffResult as a bitfield. [element-type utf8 GLib.HashTable] +

Returns :

+TRUE if the connections contain the same values, FALSE if they do +not
+
+
+
+

nm_connection_verify ()

+
gboolean            nm_connection_verify                (NMConnection *connection,
+                                                         GError **error);
+

+Validates the connection and all its settings. Each setting's properties +have allowed values, and some values are dependent on other values. For +example, if a WiFi connection is security enabled, the NMSettingWireless +setting object's 'security' property must contain the setting name of the +NMSettingWirelessSecurity object, which must also be present in the +connection for the connection to be valid. As another example, the +NMSettingWired object's 'mac-address' property must be a validly formatted +MAC address. The returned GError contains information about which +setting and which property failed validation, and how it failed validation. +

+
++ + + + + + + + + + + + + + +

connection :

the NMConnection to verify

error :

location to store error, or NULL +

Returns :

+TRUE if the connection is valid, FALSE if it is not
+
+
+
+

nm_connection_need_secrets ()

+
const char *        nm_connection_need_secrets          (NMConnection *connection,
+                                                         GPtrArray **hints);
+

+Returns the name of the first setting object in the connection which would +need secrets to make a successful connection. The returned hints are only +intended as a guide to what secrets may be required, because in some +circumstances, there is no way to conclusively determine exactly which +secrets are needed. +

+
++ + + + + + + + + + + + + + +

connection :

the NMConnection +

hints :

the address of a pointer to a GPtrArray, initialized to NULL, which on +return points to an allocated GPtrArray containing the property names of +secrets of the NMSetting which may be required; the caller owns the array +and must free the each array element with g_free(), as well as the array +itself with g_ptr_array_free(). [out callee-allocates][element-type utf8][allow-none][transfer full] +

Returns :

the setting name of the NMSetting object which has invalid or +missing secrets
+
+
+
+

nm_connection_clear_secrets ()

+
void                nm_connection_clear_secrets         (NMConnection *connection);
+

+Clears and frees any secrets that may be stored in the connection, to avoid +keeping secret data in memory when not needed. +

+
++ + + + +

connection :

the NMConnection +
+
+
+
+

nm_connection_update_secrets ()

+
gboolean            nm_connection_update_secrets        (NMConnection *connection,
+                                                         const char *setting_name,
+                                                         GHashTable *setting_secrets,
+                                                         GError **error);
+

+Update the specified setting's secrets, given a hash table of secrets +intended for that setting (deserialized from D-Bus for example). Will also +extract the given setting's secrets hash if given a hash of hashes, as would +be returned from nm_connection_to_hash(). +

+
++ + + + + + + + + + + + + + + + + + + + + + +

connection :

the NMConnection +

setting_name :

the setting object name to which the secrets apply

setting_secrets :

a GHashTable mapping +string:GValue of setting property names and secrets of the given setting_name. [element-type utf8 GObject.Value] +

error :

location to store error, or NULL +

Returns :

+TRUE if the secrets were successfully updated and the connection +is valid, FALSE on failure or if the setting was never added to the connection
+
+
+
+

nm_connection_set_path ()

+
void                nm_connection_set_path              (NMConnection *connection,
+                                                         const char *path);
+

+Sets the D-Bus path of the connection. This property is not serialized, and +is only for the reference of the caller. Sets the "path" +property. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

path :

the D-Bus path of the connection as given by the settings service +which provides the connection
+
+
+
+

nm_connection_get_path ()

+
const char *        nm_connection_get_path              (NMConnection *connection);
+

+Returns the connection's D-Bus path. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

the D-Bus path of the connection, previously set by a call to +nm_connection_set_path().
+
+
+
+

nm_connection_for_each_setting_value ()

+
void                nm_connection_for_each_setting_value
+                                                        (NMConnection *connection,
+                                                         NMSettingValueIterFn func,
+                                                         gpointer user_data);
+

+Iterates over the properties of each NMSetting object in the NMConnection, +calling the supplied user function for each property. +

+
++ + + + + + + + + + + + + + +

connection :

the NMConnection +

func :

user-supplied function called for each setting's property. [scope call] +

user_data :

user data passed to func at each invocation
+
+
+
+

nm_connection_to_hash ()

+
GHashTable *        nm_connection_to_hash               (NMConnection *connection,
+                                                         NMSettingHashFlags flags);
+

+Converts the NMConnection into a GHashTable describing the connection, +suitable for marshalling over D-Bus or serializing. The hash table mapping +is string:GHashTable with each element in the returned hash representing +a NMSetting object. The keys are setting object names, and the values +are GHashTables mapping string:GValue, each of which represents the +properties of the NMSetting object. +

+
++ + + + + + + + + + + + + + +

connection :

the NMConnection +

flags :

hash flags, e.g. NM_SETTING_HASH_FLAG_ALL +

Returns :

a new +GHashTable describing the connection, its settings, and each setting's +properties. The caller owns the hash table and must unref the hash table +with g_hash_table_unref() when it is no longer needed. [transfer full][element-type utf8 GLib.HashTable] +
+
+
+
+

nm_connection_dump ()

+
void                nm_connection_dump                  (NMConnection *connection);
+

+Print the connection to stdout. For debugging purposes ONLY, should NOT +be used for serialization of the connection or machine-parsed in any way. The +output format is not guaranteed to be stable and may change at any time. +

+
++ + + + +

connection :

the NMConnection +
+
+
+
+

nm_connection_lookup_setting_type ()

+
GType               nm_connection_lookup_setting_type   (const char *name);
+

+Returns the GType of the setting's class for a given setting name. +

+
++ + + + + + + + + + +

name :

a setting name

Returns :

the GType of the setting's class
+
+
+
+

nm_connection_lookup_setting_type_by_quark ()

+
GType               nm_connection_lookup_setting_type_by_quark
+                                                        (GQuark error_quark);
+

+Returns the GType of the setting's class for a given setting error quark. +Useful for figuring out which setting a returned error is for. +

+
++ + + + + + + + + + +

error_quark :

a setting error quark

Returns :

the GType of the setting's class
+
+
+
+

nm_connection_get_uuid ()

+
const char *        nm_connection_get_uuid              (NMConnection *connection);
+

+A shortcut to return the UUID from the connection's NMSettingConnection. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

the UUID from the connection's 'connection' setting
+
+
+
+

nm_connection_get_id ()

+
const char *        nm_connection_get_id                (NMConnection *connection);
+

+A shortcut to return the ID from the connection's NMSettingConnection. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

the ID from the connection's 'connection' setting
+
+
+
+

nm_connection_get_setting_802_1x ()

+
NMSetting8021x *            nm_connection_get_setting_802_1x
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSetting8021x the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSetting8021x if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_bluetooth ()

+
NMSettingBluetooth *        nm_connection_get_setting_bluetooth
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingBluetooth the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingBluetooth if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_cdma ()

+
NMSettingCdma *             nm_connection_get_setting_cdma
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingCdma the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingCdma if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_connection ()

+
NMSettingConnection *       nm_connection_get_setting_connection
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingConnection the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingConnection if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_gsm ()

+
NMSettingGsm *              nm_connection_get_setting_gsm
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingGsm the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingGsm if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_ip4_config ()

+
NMSettingIP4Config *        nm_connection_get_setting_ip4_config
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingIP4Config the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingIP4Config if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_ip6_config ()

+
NMSettingIP6Config *        nm_connection_get_setting_ip6_config
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingIP6Config the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingIP6Config if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_olpc_mesh ()

+
NMSettingOlpcMesh *         nm_connection_get_setting_olpc_mesh
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingOlpcMesh the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingOlpcMesh if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_ppp ()

+
NMSettingPPP *              nm_connection_get_setting_ppp
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingPPP the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingPPP if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_pppoe ()

+
NMSettingPPPOE *            nm_connection_get_setting_pppoe
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingPPOE the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingPPPOE if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_vpn ()

+
NMSettingVPN *              nm_connection_get_setting_vpn
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingVPN the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingVPN if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_wimax ()

+
NMSettingWimax *            nm_connection_get_setting_wimax
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingWimax the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingWimax if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_wired ()

+
NMSettingWired *            nm_connection_get_setting_wired
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingWired the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingWired if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_wireless ()

+
NMSettingWireless *         nm_connection_get_setting_wireless
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingWireless the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingWireless if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

nm_connection_get_setting_wireless_security ()

+
NMSettingWirelessSecurity * nm_connection_get_setting_wireless_security
+                                                        (NMConnection *connection);
+

+A shortcut to return any NMSettingWirelessSecurity the connection might contain. +

+
++ + + + + + + + + + +

connection :

the NMConnection +

Returns :

an NMSettingWirelessSecurity if the connection contains one, otherwise NULL. [transfer none] +
+
+
+
+

Property Details

+
+

The "path" property

+
  "path"                     gchar*                : Read / Write / Construct
+

+The connection's D-Bus path, used only by the calling process as a record +of the D-Bus path of the connection as provided by a settings service. +

+

Default value: NULL

+
+
+
+

Signal Details

+
+

The "secrets-updated" signal

+
void                user_function                      (NMConnection *connection,
+                                                        gchar        *setting_name,
+                                                        gpointer      user_data)         : Run First
+

+The ::secrets-updated signal is emitted when the secrets of a setting +have been changed. +

+
++ + + + + + + + + + + + + + +

connection :

the object on which the signal is emitted

setting_name :

the setting name of the NMSetting for which secrets were +updated

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/libnm-util/html/NMSetting.html b/docs/libnm-util/html/NMSetting.html index c77c5985..b9c258d2 100644 --- a/docs/libnm-util/html/NMSetting.html +++ b/docs/libnm-util/html/NMSetting.html @@ -6,7 +6,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -140,7 +140,7 @@ enum NMSetting contains properties that describe configuration that applies to a specific network layer (like IPv4 or IPv6 configuration) or device type (like Ethernet, or WiFi). A collection of individual settings together -make up an NMConnection. Each property is strongly typed and usually has +make up an NMConnection. Each property is strongly typed and usually has a number of allowed values. See each NMSetting subclass for a description of properties and allowed values.

@@ -420,7 +420,7 @@ when calling NMSetting into a GHashTable mapping each setting property name to a GValue describing that property, suitable for marshalling over -D-Bus or serializing. The mapping is string:GValue. +D-Bus or serializing. The mapping is string to GValue.

@@ -437,7 +437,8 @@ D-Bus or serializing. The mapping is string:GValue. - @@ -465,8 +466,9 @@ property names and value types. - + @@ -709,10 +711,11 @@ be set to results :

-
@@ -847,8 +850,9 @@ setting (deserialized from D-Bus for example). - + diff --git a/docs/libnm-util/html/NMSetting8021x.html b/docs/libnm-util/html/NMSetting8021x.html index 8ef172c1..c9e533b5 100644 --- a/docs/libnm-util/html/NMSetting8021x.html +++ b/docs/libnm-util/html/NMSetting8021x.html @@ -104,7 +104,7 @@ const char * nm_setting_802_1x_get_ca_cert_path (NMSetting8021x *setting); gbooleannm_setting_802_1x_set_ca_cert (NMSetting8021x *setting, - const char *value, + const char *cert_path, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, GError **error); @@ -115,7 +115,7 @@ const char * nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting); gbooleannm_setting_802_1x_set_client_cert (NMSetting8021x *setting, - const char *value, + const char *cert_path, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, GError **error); @@ -136,7 +136,7 @@ const char * NMSetting8021x *setting); gbooleannm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *setting, - const char *value, + const char *cert_path, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, GError **error); @@ -148,7 +148,7 @@ const char * NMSetting8021x *setting); gbooleannm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *setting, - const char *value, + const char *cert_path, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, GError **error); @@ -164,7 +164,7 @@ const char * nm_setting_802_1x_get_private_key_path (NMSetting8021x *setting); gbooleannm_setting_802_1x_set_private_key (NMSetting8021x *setting, - const char *value, + const char *key_path, const char *password, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, @@ -183,7 +183,7 @@ const char * NMSetting8021x *setting); gbooleannm_setting_802_1x_set_phase2_private_key (NMSetting8021x *setting, - const char *value, + const char *key_path, const char *password, NMSetting8021xCKScheme scheme, NMSetting8021xCKFormat *out_format, @@ -984,7 +984,7 @@ of the network cannot be confirmed by the client.

nm_setting_802_1x_set_ca_cert ()

gboolean            nm_setting_802_1x_set_ca_cert       (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *cert_path,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
                                                          GError **error);
@@ -1003,10 +1003,10 @@ scheme, or with the path to the certificate file if using the
- - + @@ -1108,7 +1108,7 @@ authentication method.

nm_setting_802_1x_set_client_cert ()

gboolean            nm_setting_802_1x_set_client_cert   (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *cert_path,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
                                                          GError **error);
@@ -1132,12 +1132,12 @@ authentication method.
- - + + @@ -1354,7 +1354,7 @@ of the network cannot be confirmed by the client.

nm_setting_802_1x_set_phase2_ca_cert ()

gboolean            nm_setting_802_1x_set_phase2_ca_cert
                                                         (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *cert_path,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
                                                          GError **error);
@@ -1373,9 +1373,9 @@ file if using the value :

-
+ @@ -1481,7 +1481,7 @@ authentication method.

nm_setting_802_1x_set_phase2_client_cert ()

gboolean            nm_setting_802_1x_set_phase2_client_cert
                                                         (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *cert_path,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
                                                          GError **error);
@@ -1505,9 +1505,9 @@ authentication method. - - + @@ -1699,7 +1699,7 @@ authentication method.

nm_setting_802_1x_set_private_key ()

gboolean            nm_setting_802_1x_set_private_key   (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *key_path,
                                                          const char *password,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
@@ -1739,7 +1739,7 @@ key password to prevent unauthorized access to unencrypted private key data.
 
 
- + - + diff --git a/docs/libnm-util/html/NMSettingVPN.html b/docs/libnm-util/html/NMSettingVPN.html index e8cd2fb9..c2e4ce52 100644 --- a/docs/libnm-util/html/NMSettingVPN.html +++ b/docs/libnm-util/html/NMSettingVPN.html @@ -276,7 +276,9 @@ const char * NMVPNIterFunc func, gpointer user_data);

-Iterates all data items stored in this setting +Iterates all data items stored in this setting. It is safe to add, remove, +and modify data items inside func, though any additions or removals made +during iteration will not be part of the iteration.

Returns :

a new GHashTable describing the setting's properties. [transfer full][element-type utf8 GObject.Value] +a new GHashTable +describing the setting's properties. [transfer full][element-type utf8 GObject.Value]

hash :

the GHashTable containing a string:GValue mapping of properties -that apply to the settingthe GHashTable containing a +string to GValue mapping of properties that apply to the setting. [element-type utf8 GObject.Value] +

Returns :

if the settings differ, on return a -hash table mapping the differing keys to one or more NMSettingDiffResult -values OR-ed together. If the settings do not differ, any hash table passed -in is unmodified. If no hash table is passed in, a new one is created. [element-type utf8 guint32] +if the +settings differ, on return a hash table mapping the differing keys to one or +more NMSettingDiffResult values OR-ed together. If the settings do not +differ, any hash table passed in is unmodified. If no hash table is passed +in and the settings differ, a new one is created and returned. [inout][transfer full][element-type utf8 guint32]

secrets :

a GHashTable mapping string:GValue of setting property names and -secretsa GHashTable mapping +string to GValue of setting property names and secrets. [element-type utf8 GObject.Value] +

error :

value :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or -NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the CA certificate file -(PEM or DER format). The path must be UTF-8 encoded; use +

cert_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH +or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the CA certificate +file (PEM or DER format). The path must be UTF-8 encoded; use g_filename_to_utf8() to convert if needed. Passing NULL with any scheme clears the CA certificate.

value :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or -NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the client certificate -file (PEM, DER, or PKCS12 format). The path must be UTF-8 encoded; use -g_filename_to_utf8() to convert if needed. Passing NULL with any scheme -clears the client certificate.

cert_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH +or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the client +certificate file (PEM, DER, or PKCS12 format). The path must be UTF-8 +encoded; use g_filename_to_utf8() to convert if needed. Passing NULL with +any scheme clears the client certificate.

scheme :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or -NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" CA +

cert_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH +or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" CA certificate file (PEM or DER format). The path must be UTF-8 encoded; use g_filename_to_utf8() to convert if needed. Passing NULL with any scheme clears the "phase2" CA certificate.

value :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or -NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" client +

cert_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH +or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" client certificate file (PEM, DER, or PKCS12 format). The path must be UTF-8 encoded; use g_filename_to_utf8() to convert if needed. Passing NULL with any scheme clears the "phase2" client certificate.

value :

key_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the private key file (PEM, DER, or PKCS12 format). The path must be UTF-8 encoded; use @@ -1924,7 +1924,7 @@ authentication method.

nm_setting_802_1x_set_phase2_private_key ()

gboolean            nm_setting_802_1x_set_phase2_private_key
                                                         (NMSetting8021x *setting,
-                                                         const char *value,
+                                                         const char *key_path,
                                                          const char *password,
                                                          NMSetting8021xCKScheme scheme,
                                                          NMSetting8021xCKFormat *out_format,
@@ -1964,7 +1964,7 @@ key password to prevent unauthorized access to unencrypted private key data.
 

value :

key_path :

when scheme is set to either NM_SETTING_802_1X_CK_SCHEME_PATH or NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" private key file (PEM, DER, or PKCS12 format). The path must be UTF-8 encoded; diff --git a/docs/libnm-util/html/NMSettingConnection.html b/docs/libnm-util/html/NMSettingConnection.html index 27c30ebd..2b113d2d 100644 --- a/docs/libnm-util/html/NMSettingConnection.html +++ b/docs/libnm-util/html/NMSettingConnection.html @@ -117,8 +117,8 @@ const char *

Description

The NMSettingConnection object is a NMSetting subclass that describes -properties that apply to all NMConnection objects, regardless of what type -of network connection they describe. Each NMConnection object must contain +properties that apply to all NMConnection objects, regardless of what type +of network connection they describe. Each NMConnection object must contain a NMSettingConnection setting.

@@ -170,7 +170,7 @@ Describes errors that may result from operations involving a

NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND

the NMSetting object referenced by the setting name contained in the - "type" property was not present in the NMConnection + "type" property was not present in the NMConnection
@@ -331,7 +333,9 @@ Iterates all data items stored in this setting NMVPNIterFunc func, gpointer user_data);

-Iterates all secrets stored in this setting. +Iterates all secrets stored in this setting. It is safe to add, remove, +and modify secrets inside func, though any additions or removals made during +iteration will not be part of the iteration.

diff --git a/docs/libnm-util/html/annotation-glossary.html b/docs/libnm-util/html/annotation-glossary.html index e0a1c869..5c359816 100644 --- a/docs/libnm-util/html/annotation-glossary.html +++ b/docs/libnm-util/html/annotation-glossary.html @@ -24,6 +24,8 @@  |  A  |  + I +  |  E  |  T @@ -44,6 +46,10 @@
allow-none

NULL is ok, both for passing and for returning.

+

I

+
+inout
+

Parameter for input and for returning results. Default is transfer full.

E

element-type
diff --git a/docs/libnm-util/html/api-index-full.html b/docs/libnm-util/html/api-index-full.html index b6776b7d..0ea92385 100644 --- a/docs/libnm-util/html/api-index-full.html +++ b/docs/libnm-util/html/api-index-full.html @@ -41,195 +41,195 @@ API Index

C

-NMConnection, struct in NMConnection +NMConnection, struct in NMConnection
-NMConnection::secrets-updated, object signal in NMConnection +NMConnection::secrets-updated, object signal in NMConnection
-NMConnection:path, object property in NMConnection +NMConnection:path, object property in NMConnection
-NMConnectionClass, struct in NMConnection +NMConnectionClass, struct in NMConnection
-NMConnectionError, enum in NMConnection +NMConnectionError, enum in NMConnection
-nm_connection_add_setting, function in NMConnection +nm_connection_add_setting, function in NMConnection
-nm_connection_clear_secrets, function in NMConnection +nm_connection_clear_secrets, function in NMConnection
-nm_connection_compare, function in NMConnection +nm_connection_compare, function in NMConnection
-nm_connection_create_setting, function in NMConnection +nm_connection_create_setting, function in NMConnection
-nm_connection_diff, function in NMConnection +nm_connection_diff, function in NMConnection
-nm_connection_dump, function in NMConnection +nm_connection_dump, function in NMConnection
-nm_connection_duplicate, function in NMConnection +nm_connection_duplicate, function in NMConnection
-NM_CONNECTION_ERROR, macro in NMConnection +NM_CONNECTION_ERROR, macro in NMConnection
-nm_connection_error_quark, function in NMConnection +nm_connection_error_quark, function in NMConnection
-nm_connection_for_each_setting_value, function in NMConnection +nm_connection_for_each_setting_value, function in NMConnection
-nm_connection_get_id, function in NMConnection +nm_connection_get_id, function in NMConnection
-nm_connection_get_path, function in NMConnection +nm_connection_get_path, function in NMConnection
-nm_connection_get_setting, function in NMConnection +nm_connection_get_setting, function in NMConnection
-nm_connection_get_setting_802_1x, function in NMConnection +nm_connection_get_setting_802_1x, function in NMConnection
-nm_connection_get_setting_bluetooth, function in NMConnection +nm_connection_get_setting_bluetooth, function in NMConnection
-nm_connection_get_setting_by_name, function in NMConnection +nm_connection_get_setting_by_name, function in NMConnection
-nm_connection_get_setting_cdma, function in NMConnection +nm_connection_get_setting_cdma, function in NMConnection
-nm_connection_get_setting_connection, function in NMConnection +nm_connection_get_setting_connection, function in NMConnection
-nm_connection_get_setting_gsm, function in NMConnection +nm_connection_get_setting_gsm, function in NMConnection
-nm_connection_get_setting_ip4_config, function in NMConnection +nm_connection_get_setting_ip4_config, function in NMConnection
-nm_connection_get_setting_ip6_config, function in NMConnection +nm_connection_get_setting_ip6_config, function in NMConnection
-nm_connection_get_setting_olpc_mesh, function in NMConnection +nm_connection_get_setting_olpc_mesh, function in NMConnection
-nm_connection_get_setting_ppp, function in NMConnection +nm_connection_get_setting_ppp, function in NMConnection
-nm_connection_get_setting_pppoe, function in NMConnection +nm_connection_get_setting_pppoe, function in NMConnection
-nm_connection_get_setting_vpn, function in NMConnection +nm_connection_get_setting_vpn, function in NMConnection
-nm_connection_get_setting_wimax, function in NMConnection +nm_connection_get_setting_wimax, function in NMConnection
-nm_connection_get_setting_wired, function in NMConnection +nm_connection_get_setting_wired, function in NMConnection
-nm_connection_get_setting_wireless, function in NMConnection +nm_connection_get_setting_wireless, function in NMConnection
-nm_connection_get_setting_wireless_security, function in NMConnection +nm_connection_get_setting_wireless_security, function in NMConnection
-nm_connection_get_type, function in NMConnection +nm_connection_get_type, function in NMConnection
-nm_connection_get_uuid, function in NMConnection +nm_connection_get_uuid, function in NMConnection
-nm_connection_lookup_setting_type, function in NMConnection +nm_connection_lookup_setting_type, function in NMConnection
-nm_connection_lookup_setting_type_by_quark, function in NMConnection +nm_connection_lookup_setting_type_by_quark, function in NMConnection
-nm_connection_need_secrets, function in NMConnection +nm_connection_need_secrets, function in NMConnection
-nm_connection_new, function in NMConnection +nm_connection_new, function in NMConnection
-nm_connection_new_from_hash, function in NMConnection +nm_connection_new_from_hash, function in NMConnection
-NM_CONNECTION_PATH, macro in NMConnection +NM_CONNECTION_PATH, macro in NMConnection
-nm_connection_remove_setting, function in NMConnection +nm_connection_remove_setting, function in NMConnection
-nm_connection_replace_settings, function in NMConnection +nm_connection_replace_settings, function in NMConnection
-nm_connection_set_path, function in NMConnection +nm_connection_set_path, function in NMConnection
-nm_connection_to_hash, function in NMConnection +nm_connection_to_hash, function in NMConnection
-nm_connection_update_secrets, function in NMConnection +nm_connection_update_secrets, function in NMConnection
-nm_connection_verify, function in NMConnection +nm_connection_verify, function in NMConnection

I

@@ -3240,7 +3240,7 @@ NM_SETTING_WIMAX_SETTING_NAME, macro in NMSettingWimax

T

-NM_TYPE_CONNECTION_ERROR, macro in NMConnection +NM_TYPE_CONNECTION_ERROR, macro in NMConnection
diff --git a/docs/libnm-util/html/ch01.html b/docs/libnm-util/html/ch01.html index 2800abf2..52f73af9 100644 --- a/docs/libnm-util/html/ch01.html +++ b/docs/libnm-util/html/ch01.html @@ -7,7 +7,7 @@ - + @@ -17,13 +17,16 @@
- +
  Home libnm-util Reference ManualNextNext

-libnm-util API Reference

+libnm-util API Reference
+NMConnection — Describes a connection to specific network or provider +
+
NMSetting — Describes related configuration information
@@ -75,7 +78,6 @@ nm-utils — Utility functions
-<xi:include></xi:include>
     GObject
-        NMConnection
+        NMConnection
         NMSetting
             NMSetting8021x
             NMSettingBluetooth
@@ -43,7 +43,7 @@
             NMSettingWireless
             NMSettingWirelessSecurity
     GEnum
-        NMConnectionError
+        NMConnectionError
         NMSetting8021xError
         NMSettingBluetoothError
         NMSettingCdmaError
diff --git a/include/nm-version.h b/include/nm-version.h
index b404108f..972aee27 100644
--- a/include/nm-version.h
+++ b/include/nm-version.h
@@ -43,7 +43,7 @@
  * Evaluates to the micro version number of NetworkManager which this source
  * compiled against.
  */
-#define NM_MICRO_VERSION (999)
+#define NM_MICRO_VERSION (9997)
 
 /**
  * NM_CHECK_VERSION:
diff --git a/introspection/nm-active-connection.xml b/introspection/nm-active-connection.xml
index 1594764e..a150b2c8 100644
--- a/introspection/nm-active-connection.xml
+++ b/introspection/nm-active-connection.xml
@@ -2,6 +2,14 @@
 
 
   
+    
+      Objects that implement the Connection.Active interface represent an attempt
+      to connect to a network using the details provided by a Connection object.
+      The Connection.Active object tracks the life-cycle of the connection
+      attempt and if successful indicates whether the connected network is the
+      "default" or preferred network for access.
+    
+
     
       The path of the connection.
     
diff --git a/introspection/nm-device.xml b/introspection/nm-device.xml
index 13c542a6..5fdda96d 100644
--- a/introspection/nm-device.xml
+++ b/introspection/nm-device.xml
@@ -51,6 +51,14 @@
         The current state of the device.
       
     
+    
+      
+        Object path of an ActiveConnection object that "owns" this device during
+        activation.  The ActiveConnection object tracks the life-cycle of a
+        connection to a specific network and implements the
+        org.freedesktop.NetworkManager.Connection.Active D-Bus interface.
+      
+    
     
       
         Object path of the Ip4Config object describing the configuration of the device.  Only valid when the device is in the NM_DEVICE_STATE_ACTIVATED state.
diff --git a/introspection/nm-manager.xml b/introspection/nm-manager.xml
index ee84a47b..1bb76d09 100644
--- a/introspection/nm-manager.xml
+++ b/introspection/nm-manager.xml
@@ -226,7 +226,8 @@
           related to that domain.  Available domains are: [NONE, HW, RFKILL,
           ETHER, WIFI, BT, MB, DHCP4, DHCP6, PPP, WIFI_SCAN, IP4, IP6, AUTOIP4,
           DNS, VPN, SHARING, SUPPLICANT, USER_SET, SYS_SET, SUSPEND, CORE,
-          DEVICE, OLPC]
+          DEVICE, OLPC].  If an empty string is given, the log level is changed
+          but the current set of log domains remains unchanged.
         
       
     
diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver
index 64ff70ad..f42368b8 100644
--- a/libnm-glib/libnm-glib.ver
+++ b/libnm-glib/libnm-glib.ver
@@ -66,6 +66,7 @@ global:
 	nm_device_ethernet_get_type;
 	nm_device_ethernet_new;
 	nm_device_filter_connections;
+	nm_device_get_active_connection;
 	nm_device_get_capabilities;
 	nm_device_get_device_type;
 	nm_device_get_dhcp4_config;
@@ -75,6 +76,7 @@ global:
 	nm_device_get_iface;
 	nm_device_get_ip4_config;
 	nm_device_get_ip6_config;
+	nm_device_get_ip_iface;
 	nm_device_get_managed;
 	nm_device_get_product;
 	nm_device_get_state;
diff --git a/libnm-glib/libnm_glib.c b/libnm-glib/libnm_glib.c
index 911d0cec..1d755786 100644
--- a/libnm-glib/libnm_glib.c
+++ b/libnm-glib/libnm_glib.c
@@ -64,14 +64,13 @@ typedef struct libnm_glib_callback
 } libnm_glib_callback;
 
 
-static void libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx);
-static DBusConnection * libnm_glib_dbus_init (gpointer *user_data, GMainContext *context);
-static void libnm_glib_update_state (libnm_glib_ctx *ctx, NMState state);
+static void _libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx);
+static DBusConnection * _libnm_glib_dbus_init (gpointer *user_data, GMainContext *context);
+static void _libnm_glib_update_state (libnm_glib_ctx *ctx, NMState state);
 
 
 static void
-libnm_glib_nm_state_cb (DBusPendingCall *pcall,
-                        void *user_data)
+_libnm_glib_nm_state_cb (DBusPendingCall *pcall, void *user_data)
 {
 	DBusMessage *		reply;
 	libnm_glib_ctx *	ctx = (libnm_glib_ctx *) user_data;
@@ -96,7 +95,7 @@ libnm_glib_nm_state_cb (DBusPendingCall *pcall,
 	}
 
 	if (dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &nm_state, DBUS_TYPE_INVALID))
-		libnm_glib_update_state (ctx, nm_state);
+		_libnm_glib_update_state (ctx, nm_state);
 
 	dbus_message_unref (reply);
 
@@ -105,7 +104,7 @@ out:
 }
 
 static void
-libnm_glib_get_nm_state (libnm_glib_ctx *ctx)
+_libnm_glib_get_nm_state (libnm_glib_ctx *ctx)
 {
 	DBusMessage *		message;
 	DBusPendingCall *	pcall = NULL;
@@ -116,13 +115,13 @@ libnm_glib_get_nm_state (libnm_glib_ctx *ctx)
 	{
 		dbus_connection_send_with_reply (ctx->dbus_con, message, &pcall, -1);
 		if (pcall)
-			dbus_pending_call_set_notify (pcall, libnm_glib_nm_state_cb, ctx, NULL);
+			dbus_pending_call_set_notify (pcall, _libnm_glib_nm_state_cb, ctx, NULL);
 		dbus_message_unref (message);
 	}
 }
 
 static gboolean
-libnm_glib_callback_helper (gpointer user_data)
+_libnm_glib_callback_helper (gpointer user_data)
 {
 	libnm_glib_callback	*cb_data = (libnm_glib_callback *)user_data;
 
@@ -136,8 +135,8 @@ libnm_glib_callback_helper (gpointer user_data)
 }
 
 static void
-libnm_glib_schedule_single_callback (libnm_glib_ctx *ctx,
-                                     libnm_glib_callback *callback)
+_libnm_glib_schedule_single_callback (libnm_glib_ctx *ctx,
+                                      libnm_glib_callback *callback)
 {
 	GSource				*source;
 
@@ -147,14 +146,14 @@ libnm_glib_schedule_single_callback (libnm_glib_ctx *ctx,
 	callback->libnm_glib_ctx = ctx;
 
 	source = g_idle_source_new ();
-	g_source_set_callback (source, libnm_glib_callback_helper, callback, NULL);
+	g_source_set_callback (source, _libnm_glib_callback_helper, callback, NULL);
 	g_source_attach (source, callback->gmain_ctx);
 	g_source_unref (source);
 }
 
 static void
-libnm_glib_unschedule_single_callback (libnm_glib_ctx *ctx,
-                                       libnm_glib_callback *callback)
+_libnm_glib_unschedule_single_callback (libnm_glib_ctx *ctx,
+                                        libnm_glib_callback *callback)
 {
 	GSource *source;
 
@@ -167,7 +166,7 @@ libnm_glib_unschedule_single_callback (libnm_glib_ctx *ctx,
 }
 
 static void
-libnm_glib_call_callbacks (libnm_glib_ctx *ctx)
+_libnm_glib_call_callbacks (libnm_glib_ctx *ctx)
 {
 	GSList	*elem;
 
@@ -178,15 +177,14 @@ libnm_glib_call_callbacks (libnm_glib_ctx *ctx)
 	{
 		libnm_glib_callback *callback = (libnm_glib_callback *)(elem->data);
 		if (callback)
-			libnm_glib_schedule_single_callback (ctx, callback);
+			_libnm_glib_schedule_single_callback (ctx, callback);
 	}
 	g_mutex_unlock (ctx->callbacks_lock);
 }
 
 
 static void
-libnm_glib_update_state (libnm_glib_ctx *ctx,
-                         NMState state)
+_libnm_glib_update_state (libnm_glib_ctx *ctx, NMState state)
 {
 	libnm_glib_state	old_state;
 
@@ -212,14 +210,14 @@ libnm_glib_update_state (libnm_glib_ctx *ctx,
 	}
 
 	if (old_state != ctx->nm_state)
-		libnm_glib_call_callbacks (ctx);
+		_libnm_glib_call_callbacks (ctx);
 }
 
 
 static DBusHandlerResult
-libnm_glib_dbus_filter (DBusConnection *connection,
-                        DBusMessage *message,
-                        void *user_data)
+_libnm_glib_dbus_filter (DBusConnection *connection,
+                         DBusMessage *message,
+                         void *user_data)
 {
 	libnm_glib_ctx		*ctx = (libnm_glib_ctx *)user_data;
 	gboolean		 handled = TRUE;
@@ -237,7 +235,7 @@ libnm_glib_dbus_filter (DBusConnection *connection,
 		dbus_connection_close (ctx->dbus_con);
 		dbus_connection_unref (ctx->dbus_con);
 		ctx->dbus_con = NULL;
-		libnm_glib_schedule_dbus_watcher (ctx);
+		_libnm_glib_schedule_dbus_watcher (ctx);
 	}
 	else if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged"))
 	{
@@ -258,7 +256,7 @@ libnm_glib_dbus_filter (DBusConnection *connection,
 				gboolean new_owner_good = (new_owner && (strlen (new_owner) > 0));
 
 				if (!old_owner_good && new_owner_good)	/* Equivalent to old ServiceCreated signal */
-					libnm_glib_get_nm_state (ctx);
+					_libnm_glib_get_nm_state (ctx);
 				else if (old_owner_good && !new_owner_good)	/* Equivalent to old ServiceDeleted signal */
 					ctx->nm_state = LIBNM_NO_NETWORKMANAGER;
 			}
@@ -269,14 +267,14 @@ libnm_glib_dbus_filter (DBusConnection *connection,
 			|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating")
 			|| dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DevicesChanged"))
 	{
-		libnm_glib_get_nm_state (ctx);
+		_libnm_glib_get_nm_state (ctx);
 	}
 	else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "StateChanged"))
 	{
 		NMState	state = NM_STATE_UNKNOWN;
 
 		dbus_message_get_args (message, &error, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID);
-		libnm_glib_update_state (ctx, state);
+		_libnm_glib_update_state (ctx, state);
 	}
 	else
 		handled = FALSE;
@@ -295,8 +293,7 @@ libnm_glib_dbus_filter (DBusConnection *connection,
  *
  */
 static DBusConnection *
-libnm_glib_dbus_init (gpointer *user_data,
-                      GMainContext *context)
+_libnm_glib_dbus_init (gpointer *user_data, GMainContext *context)
 {
 	DBusConnection	*connection = NULL;
 	DBusError		 error;
@@ -312,7 +309,7 @@ libnm_glib_dbus_init (gpointer *user_data,
 	if (!connection)
 		return NULL;
 
-	if (!dbus_connection_add_filter (connection, libnm_glib_dbus_filter, user_data, NULL))
+	if (!dbus_connection_add_filter (connection, _libnm_glib_dbus_filter, user_data, NULL))
 		return (NULL);
 
 	dbus_connection_set_exit_on_disconnect (connection, FALSE);
@@ -348,7 +345,7 @@ libnm_glib_dbus_init (gpointer *user_data,
  *
  */
 static gboolean
-libnm_glib_dbus_watcher (gpointer user_data)
+_libnm_glib_dbus_watcher (gpointer user_data)
 {
 	libnm_glib_ctx	*ctx = (libnm_glib_ctx *)user_data;
 
@@ -357,12 +354,12 @@ libnm_glib_dbus_watcher (gpointer user_data)
 	ctx->dbus_watcher = 0;
 
 	if (!ctx->dbus_con)
-		ctx->dbus_con = libnm_glib_dbus_init ((gpointer)ctx, ctx->g_main_ctx);
+		ctx->dbus_con = _libnm_glib_dbus_init ((gpointer)ctx, ctx->g_main_ctx);
 
 	if (ctx->dbus_con)
 	{
 		/* Get NM's state right away after we reconnect */
-		libnm_glib_get_nm_state (ctx);
+		_libnm_glib_get_nm_state (ctx);
 		ctx->dbus_watch_interval = 1000;
 	}
 	else
@@ -373,7 +370,7 @@ libnm_glib_dbus_watcher (gpointer user_data)
 		ctx->dbus_watch_interval = MIN(ctx->dbus_watch_interval + 3000, 60000); 
 
 		/* Reschule ourselves if we _still_ don't have a connection to dbus */
-		libnm_glib_schedule_dbus_watcher (ctx);
+		_libnm_glib_schedule_dbus_watcher (ctx);
 	}
 
 	return FALSE;
@@ -388,14 +385,14 @@ libnm_glib_dbus_watcher (gpointer user_data)
  *
  */
 static void
-libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx)
+_libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx)
 {
 	g_return_if_fail (ctx != NULL);
 
 	if (ctx->dbus_watcher == 0)
 	{
 		GSource *	source = g_timeout_source_new (ctx->dbus_watch_interval);
-		g_source_set_callback (source, libnm_glib_dbus_watcher, (gpointer) ctx, NULL);
+		g_source_set_callback (source, _libnm_glib_dbus_watcher, (gpointer) ctx, NULL);
 		ctx->dbus_watcher = g_source_attach (source, ctx->g_main_ctx);
 		g_source_unref (source);
 	}
@@ -409,7 +406,7 @@ libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx)
  *
  */
 static gpointer
-libnm_glib_dbus_worker (gpointer user_data)
+_libnm_glib_dbus_worker (gpointer user_data)
 {
 	libnm_glib_ctx	*ctx = (libnm_glib_ctx *)user_data;
 
@@ -420,10 +417,10 @@ libnm_glib_dbus_worker (gpointer user_data)
 	 * down.  Should probably be done by a timeout polling dbus_connection_is_connected()
 	 * or by getting connection status out of libdbus or something.
 	 */
-	if (!(ctx->dbus_con = libnm_glib_dbus_init ((gpointer) ctx, ctx->g_main_ctx)))
-		libnm_glib_schedule_dbus_watcher (ctx);
+	if (!(ctx->dbus_con = _libnm_glib_dbus_init ((gpointer) ctx, ctx->g_main_ctx)))
+		_libnm_glib_schedule_dbus_watcher (ctx);
 	else
-		libnm_glib_get_nm_state (ctx);
+		_libnm_glib_get_nm_state (ctx);
 
 	ctx->thread_inited = TRUE;
 	g_main_loop_run (ctx->g_main_loop);
@@ -434,7 +431,7 @@ libnm_glib_dbus_worker (gpointer user_data)
 
 
 static void
-libnm_glib_ctx_free (libnm_glib_ctx *ctx)
+_libnm_glib_ctx_free (libnm_glib_ctx *ctx)
 {
 	g_return_if_fail (ctx != NULL);
 
@@ -472,7 +469,7 @@ libnm_glib_ctx_free (libnm_glib_ctx *ctx)
 
 
 static libnm_glib_ctx *
-libnm_glib_ctx_new (void)
+_libnm_glib_ctx_new (void)
 {
 	libnm_glib_ctx *ctx = g_malloc0 (sizeof (libnm_glib_ctx));
 
@@ -487,7 +484,7 @@ libnm_glib_ctx_new (void)
 	return ctx;
 
 error:
-	libnm_glib_ctx_free (ctx);
+	_libnm_glib_ctx_free (ctx);
 	return NULL;
 }
 
@@ -502,10 +499,10 @@ libnm_glib_init (void)
 		g_thread_init (NULL);
 	dbus_g_thread_init ();
 
-	if (!(ctx = libnm_glib_ctx_new ()))
+	if (!(ctx = _libnm_glib_ctx_new ()))
 		return NULL;
 
-	ctx->thread = g_thread_create (libnm_glib_dbus_worker, ctx, TRUE, NULL);
+	ctx->thread = g_thread_create (_libnm_glib_dbus_worker, ctx, TRUE, NULL);
 	if (!ctx->thread)
 		goto error;	
 
@@ -516,7 +513,7 @@ libnm_glib_init (void)
 	return ctx;
 
 error:
-	libnm_glib_ctx_free (ctx);
+	_libnm_glib_ctx_free (ctx);
 	return NULL;
 }
 
@@ -530,7 +527,7 @@ libnm_glib_shutdown (libnm_glib_ctx *ctx)
 	while (!ctx->thread_done)
 		g_usleep (G_USEC_PER_SEC / 20);
 
-	libnm_glib_ctx_free (ctx);
+	_libnm_glib_ctx_free (ctx);
 }
 
 
@@ -565,7 +562,7 @@ libnm_glib_register_callback	(libnm_glib_ctx *ctx,
 
 	g_mutex_lock (ctx->callbacks_lock);
 	ctx->callbacks = g_slist_append (ctx->callbacks, callback);
-	libnm_glib_schedule_single_callback (ctx, callback);
+	_libnm_glib_schedule_single_callback (ctx, callback);
 	g_mutex_unlock (ctx->callbacks_lock);
 
 	return (callback->id);
@@ -588,7 +585,7 @@ libnm_glib_unregister_callback (libnm_glib_ctx *ctx,
 		libnm_glib_callback *callback = (libnm_glib_callback *)(elem->data);
 		if (callback && (callback->id == id))
 		{
-			libnm_glib_unschedule_single_callback (ctx, callback);
+			_libnm_glib_unschedule_single_callback (ctx, callback);
 			ctx->callbacks = g_slist_remove_link (ctx->callbacks, elem);
 			break;
 		}
diff --git a/libnm-glib/nm-device-wifi.c b/libnm-glib/nm-device-wifi.c
index d1d9e0b7..9877f94f 100644
--- a/libnm-glib/nm-device-wifi.c
+++ b/libnm-glib/nm-device-wifi.c
@@ -55,7 +55,7 @@ typedef struct {
 	NM80211Mode mode;
 	guint32 rate;
 	NMAccessPoint *active_ap;
-	gboolean null_active_ap;
+	gboolean got_active_ap;
 	NMDeviceWifiCapabilities wireless_caps;
 	GPtrArray *aps;
 
@@ -271,6 +271,7 @@ nm_device_wifi_get_active_access_point (NMDeviceWifi *device)
 	NMDeviceState state;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
 
@@ -291,21 +292,20 @@ nm_device_wifi_get_active_access_point (NMDeviceWifi *device)
 	}
 
 	priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
-	if (priv->active_ap)
+	if (priv->got_active_ap == TRUE)
 		return priv->active_ap;
-	if (priv->null_active_ap)
-		return NULL;
 
 	path = _nm_object_get_object_path_property (NM_OBJECT (device),
-	                                           NM_DBUS_INTERFACE_DEVICE_WIRELESS,
-	                                           DBUS_PROP_ACTIVE_ACCESS_POINT,
-	                                           NULL);
-	if (path) {
+	                                            NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+	                                            DBUS_PROP_ACTIVE_ACCESS_POINT,
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_active_ap (NM_OBJECT (device), NULL, &value, &priv->active_ap);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->active_ap;
 }
@@ -427,9 +427,8 @@ access_point_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
 		if (ap == priv->active_ap) {
 			g_object_unref (priv->active_ap);
 			priv->active_ap = NULL;
-			priv->null_active_ap = FALSE;
-
 			_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
+
 			priv->rate = 0;
 			_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
 		}
@@ -620,7 +619,6 @@ state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
 		if (priv->active_ap) {
 			g_object_unref (priv->active_ap);
 			priv->active_ap = NULL;
-			priv->null_active_ap = FALSE;
 		}
 		_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
 		priv->rate = 0;
@@ -642,13 +640,11 @@ demarshal_active_ap (NMObject *object, GParamSpec *pspec, GValue *value, gpointe
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_active_ap = FALSE;
+	priv->got_active_ap = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_active_ap = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			ap = NM_ACCESS_POINT (_nm_object_cache_get (path));
 			if (!ap) {
 				connection = nm_object_get_connection (object);
diff --git a/libnm-glib/nm-device-wimax.c b/libnm-glib/nm-device-wimax.c
index 194a36d1..a889583d 100644
--- a/libnm-glib/nm-device-wimax.c
+++ b/libnm-glib/nm-device-wimax.c
@@ -50,7 +50,7 @@ typedef struct {
 
 	char *hw_address;
 	NMWimaxNsp *active_nsp;
-	gboolean null_active_nsp;
+	gboolean got_active_nsp;
 	GPtrArray *nsps;
 
 	guint center_freq;
@@ -153,6 +153,7 @@ nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax)
 	NMDeviceState state;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL);
 
@@ -173,21 +174,20 @@ nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax)
 	}
 
 	priv = NM_DEVICE_WIMAX_GET_PRIVATE (wimax);
-	if (priv->active_nsp)
+	if (priv->got_active_nsp == TRUE)
 		return priv->active_nsp;
-	if (priv->null_active_nsp)
-		return NULL;
 
 	path = _nm_object_get_object_path_property (NM_OBJECT (wimax),
 	                                            NM_DBUS_INTERFACE_DEVICE_WIMAX,
 	                                            DBUS_PROP_ACTIVE_NSP,
-	                                            NULL);
-	if (path) {
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_active_nsp (NM_OBJECT (wimax), NULL, &value, &priv->active_nsp);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->active_nsp;
 }
@@ -309,8 +309,6 @@ nsp_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
 		if (nsp == priv->active_nsp) {
 			g_object_unref (priv->active_nsp);
 			priv->active_nsp = NULL;
-			priv->null_active_nsp = FALSE;
-
 			_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_ACTIVE_NSP);
 		}
 
@@ -607,7 +605,6 @@ state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
 		if (priv->active_nsp) {
 			g_object_unref (priv->active_nsp);
 			priv->active_nsp = NULL;
-			priv->null_active_nsp = FALSE;
 		}
 		_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIMAX_ACTIVE_NSP);
 		clear_link_status (self);
@@ -634,13 +631,11 @@ demarshal_active_nsp (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_active_nsp = FALSE;
+	priv->got_active_nsp = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_active_nsp = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			nsp = NM_WIMAX_NSP (_nm_object_cache_get (path));
 			if (!nsp) {
 				connection = nm_object_get_connection (object);
diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c
index 4167c9a7..3b39c9ec 100644
--- a/libnm-glib/nm-device.c
+++ b/libnm-glib/nm-device.c
@@ -56,15 +56,18 @@ typedef struct {
 	gboolean managed;
 	gboolean firmware_missing;
 	NMIP4Config *ip4_config;
-	gboolean null_ip4_config;
+	gboolean got_ip4_config;
 	NMDHCP4Config *dhcp4_config;
-	gboolean null_dhcp4_config;
+	gboolean got_dhcp4_config;
 	NMIP6Config *ip6_config;
-	gboolean null_ip6_config;
+	gboolean got_ip6_config;
 	NMDHCP6Config *dhcp6_config;
-	gboolean null_dhcp6_config;
+	gboolean got_dhcp6_config;
 	NMDeviceState state;
 
+	NMActiveConnection *active_connection;
+	gboolean got_active_connection;
+
 	GUdevClient *client;
 	char *product;
 	char *vendor;
@@ -87,6 +90,7 @@ enum {
 	PROP_DHCP6_CONFIG,
 	PROP_IP_INTERFACE,
 	PROP_DEVICE_TYPE,
+	PROP_ACTIVE_CONNECTION,
 
 	LAST_PROP
 };
@@ -119,13 +123,11 @@ demarshal_ip4_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_ip4_config = FALSE;
+	priv->got_ip4_config = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_ip4_config = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			config = NM_IP4_CONFIG (_nm_object_cache_get (path));
 			if (!config) {
 				connection = nm_object_get_connection (object);
@@ -157,13 +159,11 @@ demarshal_dhcp4_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoi
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_dhcp4_config = FALSE;
+	priv->got_dhcp4_config = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_dhcp4_config = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			config = NM_DHCP4_CONFIG (_nm_object_cache_get (path));
 			if (!config) {
 				connection = nm_object_get_connection (object);
@@ -195,13 +195,11 @@ demarshal_ip6_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_ip6_config = FALSE;
+	priv->got_ip6_config = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_ip6_config = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			config = NM_IP6_CONFIG (_nm_object_cache_get (path));
 			if (!config) {
 				connection = nm_object_get_connection (object);
@@ -233,13 +231,11 @@ demarshal_dhcp6_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoi
 	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
 		return FALSE;
 
-	priv->null_dhcp6_config = FALSE;
+	priv->got_dhcp6_config = TRUE;
 
-	path = g_value_get_boxed (value);
-	if (path) {
-		if (!strcmp (path, "/"))
-			priv->null_dhcp6_config = TRUE;
-		else {
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
 			config = NM_DHCP6_CONFIG (_nm_object_cache_get (path));
 			if (!config) {
 				connection = nm_object_get_connection (object);
@@ -260,6 +256,42 @@ demarshal_dhcp6_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoi
 	return TRUE;
 }
 
+static gboolean
+demarshal_active_connection (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
+{
+	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object);
+	const char *path;
+	NMActiveConnection *active = NULL;
+	DBusGConnection *connection;
+
+	if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
+		return FALSE;
+
+	priv->got_active_connection = TRUE;
+
+	if (value) {
+		path = g_value_get_boxed (value);
+		if (path) {
+			active = NM_ACTIVE_CONNECTION (_nm_object_cache_get (path));
+			if (!active) {
+				connection = nm_object_get_connection (object);
+				active = NM_ACTIVE_CONNECTION (nm_active_connection_new (connection, path));
+			}
+		}
+	}
+
+	if (priv->active_connection) {
+		g_object_unref (priv->active_connection);
+		priv->active_connection = NULL;
+	}
+
+	if (active)
+		priv->active_connection = active;
+
+	_nm_object_queue_notify (object, NM_DEVICE_ACTIVE_CONNECTION);
+	return TRUE;
+}
+
 static void
 register_for_property_changed (NMDevice *device)
 {
@@ -276,6 +308,7 @@ register_for_property_changed (NMDevice *device)
 		{ NM_DEVICE_DHCP4_CONFIG,     demarshal_dhcp4_config,       &priv->dhcp4_config },
 		{ NM_DEVICE_IP6_CONFIG,       demarshal_ip6_config,         &priv->ip6_config },
 		{ NM_DEVICE_DHCP6_CONFIG,     demarshal_dhcp6_config,       &priv->dhcp6_config },
+		{ NM_DEVICE_ACTIVE_CONNECTION,demarshal_active_connection,  &priv->active_connection },
 		{ NULL },
 	};
 
@@ -365,6 +398,8 @@ dispose (GObject *object)
 		g_object_unref (priv->dhcp6_config);
 	if (priv->client)
 		g_object_unref (priv->client);
+	if (priv->active_connection)
+		g_object_unref (priv->active_connection);
 
 	G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);
 }
@@ -432,6 +467,9 @@ get_property (GObject *object,
 	case PROP_STATE:
 		g_value_set_uint (value, nm_device_get_state (device));
 		break;
+	case PROP_ACTIVE_CONNECTION:
+		g_value_set_object (value, nm_device_get_active_connection (device));
+		break;
 	case PROP_PRODUCT:
 		g_value_set_string (value, nm_device_get_product (device));
 		break;
@@ -655,6 +693,19 @@ nm_device_class_init (NMDeviceClass *device_class)
 						  0, G_MAXUINT32, 0,
 						  G_PARAM_READABLE));
 
+	/**
+	 * NMDevice:active-connection:
+	 *
+	 * The #NMActiveConnection object that "owns" this device during activation.
+	 **/
+	g_object_class_install_property
+		(object_class, PROP_ACTIVE_CONNECTION,
+		 g_param_spec_object (NM_DEVICE_ACTIVE_CONNECTION,
+		                      "ActiveConnection",
+		                      "Active Connection",
+		                      NM_TYPE_ACTIVE_CONNECTION,
+		                      G_PARAM_READABLE));
+
 	/**
 	 * NMDevice:vendor:
 	 *
@@ -998,22 +1049,25 @@ nm_device_get_ip4_config (NMDevice *device)
 	NMDevicePrivate *priv;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
-	if (priv->ip4_config)
+	if (priv->got_ip4_config == TRUE)
 		return priv->ip4_config;
-	if (priv->null_ip4_config)
-		return NULL;
 
-	path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Ip4Config", NULL);
-	if (path) {
+	path = _nm_object_get_object_path_property (NM_OBJECT (device),
+	                                            NM_DBUS_INTERFACE_DEVICE,
+	                                            "Ip4Config",
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_ip4_config (NM_OBJECT (device), NULL, &value, &priv->ip4_config);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->ip4_config;
 }
@@ -1033,22 +1087,25 @@ nm_device_get_dhcp4_config (NMDevice *device)
 	NMDevicePrivate *priv;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
-	if (priv->dhcp4_config)
+	if (priv->got_dhcp4_config == TRUE)
 		return priv->dhcp4_config;
-	if (priv->null_dhcp4_config)
-		return NULL;
 
-	path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Dhcp4Config", NULL);
-	if (path) {
+	path = _nm_object_get_object_path_property (NM_OBJECT (device),
+	                                            NM_DBUS_INTERFACE_DEVICE,
+	                                            "Dhcp4Config",
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_dhcp4_config (NM_OBJECT (device), NULL, &value, &priv->dhcp4_config);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->dhcp4_config;
 }
@@ -1067,22 +1124,25 @@ nm_device_get_ip6_config (NMDevice *device)
 	NMDevicePrivate *priv;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
-	if (priv->ip6_config)
+	if (priv->got_ip6_config == TRUE)
 		return priv->ip6_config;
-	if (priv->null_ip6_config)
-		return NULL;
 
-	path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Ip6Config", NULL);
-	if (path) {
+	path = _nm_object_get_object_path_property (NM_OBJECT (device),
+	                                            NM_DBUS_INTERFACE_DEVICE,
+	                                            "Ip6Config",
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_ip6_config (NM_OBJECT (device), NULL, &value, &priv->ip6_config);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->ip6_config;
 }
@@ -1102,22 +1162,25 @@ nm_device_get_dhcp6_config (NMDevice *device)
 	NMDevicePrivate *priv;
 	char *path;
 	GValue value = { 0, };
+	GError *error = NULL;
 
 	g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
-	if (priv->dhcp6_config)
+	if (priv->got_dhcp6_config == TRUE)
 		return priv->dhcp6_config;
-	if (priv->null_dhcp6_config)
-		return NULL;
 
-	path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Dhcp6Config", NULL);
-	if (path) {
+	path = _nm_object_get_object_path_property (NM_OBJECT (device),
+	                                            NM_DBUS_INTERFACE_DEVICE,
+	                                            "Dhcp6Config",
+	                                            &error);
+	if (error == NULL) {
 		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
 		g_value_take_boxed (&value, path);
 		demarshal_dhcp6_config (NM_OBJECT (device), NULL, &value, &priv->dhcp6_config);
 		g_value_unset (&value);
 	}
+	g_clear_error (&error);
 
 	return priv->dhcp6_config;
 }
@@ -1148,6 +1211,43 @@ nm_device_get_state (NMDevice *device)
 	return priv->state;
 }
 
+/**
+ * nm_device_get_active_connection:
+ * @device: a #NMDevice
+ *
+ * Gets the #NMActiveConnection object which owns this device during activation.
+ *
+ * Returns: the #NMActiveConnection
+ **/
+NMActiveConnection *
+nm_device_get_active_connection (NMDevice *device)
+{
+	NMDevicePrivate *priv;
+	char *path;
+	GValue value = { 0, };
+	GError *error = NULL;
+
+	g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
+
+	priv = NM_DEVICE_GET_PRIVATE (device);
+	if (priv->got_active_connection == TRUE)
+		return priv->active_connection;
+
+	path = _nm_object_get_object_path_property (NM_OBJECT (device),
+	                                            NM_DBUS_INTERFACE_DEVICE,
+	                                            "ActiveConnection",
+	                                            &error);
+	if (error == NULL) {
+		g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
+		g_value_take_boxed (&value, path);
+		demarshal_active_connection (NM_OBJECT (device), NULL, &value, &priv->active_connection);
+		g_value_unset (&value);
+	}
+	g_clear_error (&error);
+
+	return priv->active_connection;
+}
+
 /* From hostap, Copyright (c) 2002-2005, Jouni Malinen  */
 
 static int hex2num (char c)
@@ -1203,7 +1303,7 @@ get_decoded_property (GUdevDevice *device, const char *property)
 }
 
 static void
-nm_device_update_description (NMDevice *device)
+_device_update_description (NMDevice *device)
 {
 	NMDevicePrivate *priv;
 	const char *subsys[3] = { "net", "tty", NULL };
@@ -1318,7 +1418,7 @@ nm_device_get_product (NMDevice *device)
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
 	if (!priv->product)
-		nm_device_update_description (device);
+		_device_update_description (device);
 	return priv->product;
 }
 
@@ -1340,7 +1440,7 @@ nm_device_get_vendor (NMDevice *device)
 
 	priv = NM_DEVICE_GET_PRIVATE (device);
 	if (!priv->vendor)
-		nm_device_update_description (device);
+		_device_update_description (device);
 	return priv->vendor;
 }
 
diff --git a/libnm-glib/nm-device.h b/libnm-glib/nm-device.h
index 9d1c6bdb..e21e71b1 100644
--- a/libnm-glib/nm-device.h
+++ b/libnm-glib/nm-device.h
@@ -34,6 +34,7 @@
 #include "nm-ip6-config.h"
 #include "nm-dhcp6-config.h"
 #include "nm-connection.h"
+#include "nm-active-connection.h"
 
 G_BEGIN_DECLS
 
@@ -57,6 +58,7 @@ G_BEGIN_DECLS
 #define NM_DEVICE_IP6_CONFIG "ip6-config"
 #define NM_DEVICE_DHCP6_CONFIG "dhcp6-config"
 #define NM_DEVICE_STATE "state"
+#define NM_DEVICE_ACTIVE_CONNECTION "active-connection"
 #define NM_DEVICE_VENDOR "vendor"
 #define NM_DEVICE_PRODUCT "product"
 
@@ -102,6 +104,7 @@ NMDHCP4Config *      nm_device_get_dhcp4_config     (NMDevice *device);
 NMIP6Config *        nm_device_get_ip6_config       (NMDevice *device);
 NMDHCP6Config *      nm_device_get_dhcp6_config     (NMDevice *device);
 NMDeviceState        nm_device_get_state            (NMDevice *device);
+NMActiveConnection * nm_device_get_active_connection(NMDevice *device);
 const char *         nm_device_get_product          (NMDevice *device);
 const char *         nm_device_get_vendor           (NMDevice *device);
 
diff --git a/libnm-glib/nm-object.c b/libnm-glib/nm-object.c
index 0b88be2c..614f6afc 100644
--- a/libnm-glib/nm-object.c
+++ b/libnm-glib/nm-object.c
@@ -333,6 +333,7 @@ handle_property_changed (gpointer key, gpointer data, gpointer user_data)
 	GParamSpec *pspec;
 	gboolean success = FALSE, found = FALSE;
 	GSList *iter;
+	GValue *value = data;
 
 	prop_name = wincaps_to_dash ((char *) key);
 	pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (self)), prop_name);
@@ -344,12 +345,19 @@ handle_property_changed (gpointer key, gpointer data, gpointer user_data)
 		goto out;
 	}
 
-	/* Iterate through the object and it's parents to find the property */
+	/* Iterate through the object and its parents to find the property */
 	for (iter = priv->pcs; iter; iter = g_slist_next (iter)) {
 		pci = g_hash_table_lookup ((GHashTable *) iter->data, prop_name);
 		if (pci) {
 			found = TRUE;
-			success = (*(pci->func)) (self, pspec, (GValue *) data, pci->field);
+
+			/* Handle NULL object paths */
+			if (G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH)) {
+				if (g_strcmp0 (g_value_get_boxed (value), "/") == 0)
+					value = NULL;
+			}
+
+			success = (*(pci->func)) (self, pspec, value, pci->field);
 			if (success)
 				break;
 		}
@@ -453,6 +461,11 @@ _nm_object_demarshal_generic (NMObject *object,
 			char **param = (char **) field;
 			g_free (*param);
 			*param = g_strdup (g_value_get_boxed (value));
+			/* Handle "NULL" object paths */
+			if (g_strcmp0 (*param, "/") == 0) {
+				g_free (*param);
+				*param = NULL;
+			}
 		} else {
 			success = FALSE;
 			goto done;
@@ -558,13 +571,18 @@ _nm_object_get_string_property (NMObject *object,
                                 GError **error)
 {
 	char *str = NULL;
+	const char *tmp;
 	GValue value = {0,};
 
 	if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
 		if (G_VALUE_HOLDS_STRING (&value))
 			str = g_strdup (g_value_get_string (&value));
-		else if (G_VALUE_HOLDS (&value, DBUS_TYPE_G_OBJECT_PATH))
-			str = g_strdup (g_value_get_boxed (&value));
+		else if (G_VALUE_HOLDS (&value, DBUS_TYPE_G_OBJECT_PATH)) {
+			tmp = g_value_get_boxed (&value);
+			/* Handle "NULL" object paths */
+			if (g_strcmp0 (tmp, "/") != 0)
+				str = g_strdup (tmp);
+		}
 		g_value_unset (&value);
 	}
 
@@ -578,10 +596,13 @@ _nm_object_get_object_path_property (NMObject *object,
                                      GError **error)
 {
 	char *path = NULL;
+	const char *tmp;
 	GValue value = {0,};
 
 	if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
-		path = g_strdup (g_value_get_boxed (&value));
+		tmp = g_value_get_boxed (&value);
+		if (g_strcmp0 (tmp, "/") != 0)
+			path = g_strdup (tmp);
 		g_value_unset (&value);
 	}
 
diff --git a/libnm-glib/nm-types.c b/libnm-glib/nm-types.c
index a2d6d2b4..6d76787d 100644
--- a/libnm-glib/nm-types.c
+++ b/libnm-glib/nm-types.c
@@ -31,7 +31,7 @@
 #include "nm-setting-ip6-config.h"
 
 static gpointer
-nm_ssid_copy (GByteArray *src)
+_nm_ssid_copy (GByteArray *src)
 {
 	GByteArray *dest;
 
@@ -41,7 +41,7 @@ nm_ssid_copy (GByteArray *src)
 }
 
 static void
-nm_ssid_free (GByteArray *ssid)
+_nm_ssid_free (GByteArray *ssid)
 {
 	g_byte_array_free (ssid, TRUE);
 }
@@ -53,8 +53,8 @@ nm_ssid_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMSsid"),
-		                                         (GBoxedCopyFunc) nm_ssid_copy,
-		                                         (GBoxedFreeFunc) nm_ssid_free);
+		                                         (GBoxedCopyFunc) _nm_ssid_copy,
+		                                         (GBoxedFreeFunc) _nm_ssid_free);
 	return our_type;
 }
 
@@ -84,7 +84,7 @@ _nm_ssid_demarshal (GValue *value, GByteArray **dest)
 /*****************************/
 
 static gpointer
-nm_uint_array_copy (GArray *src)
+_nm_uint_array_copy (GArray *src)
 {
 	GArray *dest;
 
@@ -94,7 +94,7 @@ nm_uint_array_copy (GArray *src)
 }
 
 static void
-nm_uint_array_free (GArray *array)
+_nm_uint_array_free (GArray *array)
 {
 	g_array_free (array, TRUE);
 }
@@ -106,8 +106,8 @@ nm_uint_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMUintArray"),
-		                                         (GBoxedCopyFunc) nm_uint_array_copy,
-		                                         (GBoxedFreeFunc) nm_uint_array_free);
+		                                         (GBoxedCopyFunc) _nm_uint_array_copy,
+		                                         (GBoxedFreeFunc) _nm_uint_array_free);
 	return our_type;
 }
 
@@ -136,7 +136,7 @@ _nm_uint_array_demarshal (GValue *value, GArray **dest)
 /*****************************/
 
 static gpointer
-nm_string_array_copy (GPtrArray *src)
+_nm_string_array_copy (GPtrArray *src)
 {
 	GPtrArray *dest;
 	int i;
@@ -148,7 +148,7 @@ nm_string_array_copy (GPtrArray *src)
 }
 
 static void
-nm_string_array_free (GPtrArray *array)
+_nm_string_array_free (GPtrArray *array)
 {
 	int i;
 
@@ -164,8 +164,8 @@ nm_string_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMStringArray"),
-		                                         (GBoxedCopyFunc) nm_string_array_copy,
-		                                         (GBoxedFreeFunc) nm_string_array_free);
+		                                         (GBoxedCopyFunc) _nm_string_array_copy,
+		                                         (GBoxedFreeFunc) _nm_string_array_free);
 	return our_type;
 }
 
@@ -197,7 +197,7 @@ _nm_string_array_demarshal (GValue *value, GPtrArray **dest)
 /*****************************/
 
 static gpointer
-nm_object_array_copy (GPtrArray *src)
+_nm_object_array_copy (GPtrArray *src)
 {
 	GPtrArray *dest;
 	int i;
@@ -209,7 +209,7 @@ nm_object_array_copy (GPtrArray *src)
 }
 
 static void
-nm_object_array_free (GPtrArray *array)
+_nm_object_array_free (GPtrArray *array)
 {
 	int i;
 
@@ -225,8 +225,8 @@ nm_object_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMObjectArray"),
-		                                         (GBoxedCopyFunc) nm_object_array_copy,
-		                                         (GBoxedFreeFunc) nm_object_array_free);
+		                                         (GBoxedCopyFunc) _nm_object_array_copy,
+		                                         (GBoxedFreeFunc) _nm_object_array_free);
 	return our_type;
 }
 
@@ -279,7 +279,7 @@ _nm_object_array_demarshal (GValue *value,
 /*****************************/
 
 static gpointer
-nm_ip6_address_object_array_copy (GPtrArray *src)
+_nm_ip6_address_object_array_copy (GPtrArray *src)
 {
 	GPtrArray *dest;
 	int i;
@@ -291,7 +291,7 @@ nm_ip6_address_object_array_copy (GPtrArray *src)
 }
 
 static void
-nm_ip6_address_object_array_free (GPtrArray *array)
+_nm_ip6_address_object_array_free (GPtrArray *array)
 {
 	int i;
 
@@ -307,15 +307,15 @@ nm_ip6_address_object_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6AddressObjectArray"),
-		                                         (GBoxedCopyFunc) nm_ip6_address_object_array_copy,
-		                                         (GBoxedFreeFunc) nm_ip6_address_object_array_free);
+		                                         (GBoxedCopyFunc) _nm_ip6_address_object_array_copy,
+		                                         (GBoxedFreeFunc) _nm_ip6_address_object_array_free);
 	return our_type;
 }
 
 /*****************************/
 
 static gpointer
-nm_ip6_address_array_copy (GPtrArray *src)
+_nm_ip6_address_array_copy (GPtrArray *src)
 {
 	GPtrArray *dest;
 	int i;
@@ -333,7 +333,7 @@ nm_ip6_address_array_copy (GPtrArray *src)
 }
 
 static void
-nm_ip6_address_array_free (GPtrArray *array)
+_nm_ip6_address_array_free (GPtrArray *array)
 {
 	int i;
 
@@ -349,8 +349,8 @@ nm_ip6_address_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6AddressArray"),
-		                                         (GBoxedCopyFunc) nm_ip6_address_array_copy,
-		                                         (GBoxedFreeFunc) nm_ip6_address_array_free);
+		                                         (GBoxedCopyFunc) _nm_ip6_address_array_copy,
+		                                         (GBoxedFreeFunc) _nm_ip6_address_array_free);
 	return our_type;
 }
 
@@ -388,7 +388,7 @@ _nm_ip6_address_array_demarshal (GValue *value, GSList **dest)
 /*****************************/
 
 static gpointer
-nm_ip6_route_object_array_copy (GPtrArray *src)
+_nm_ip6_route_object_array_copy (GPtrArray *src)
 {
 	GPtrArray *dest;
 	int i;
@@ -400,7 +400,7 @@ nm_ip6_route_object_array_copy (GPtrArray *src)
 }
 
 static void
-nm_ip6_route_object_array_free (GPtrArray *array)
+_nm_ip6_route_object_array_free (GPtrArray *array)
 {
 	int i;
 
@@ -416,8 +416,8 @@ nm_ip6_route_object_array_get_type (void)
 
 	if (our_type == 0)
 		our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6RouteObjectArray"),
-		                                         (GBoxedCopyFunc) nm_ip6_route_object_array_copy,
-		                                         (GBoxedFreeFunc) nm_ip6_route_object_array_free);
+		                                         (GBoxedCopyFunc) _nm_ip6_route_object_array_copy,
+		                                         (GBoxedFreeFunc) _nm_ip6_route_object_array_free);
 	return our_type;
 }
 
diff --git a/libnm-util/crypto.c b/libnm-util/crypto.c
index 991b3c3e..949ee812 100644
--- a/libnm-util/crypto.c
+++ b/libnm-util/crypto.c
@@ -52,6 +52,12 @@ _nm_crypto_error_quark (void)
 #define PEM_CERT_BEGIN    "-----BEGIN CERTIFICATE-----"
 #define PEM_CERT_END      "-----END CERTIFICATE-----"
 
+#define PEM_PKCS8_ENC_KEY_BEGIN "-----BEGIN ENCRYPTED PRIVATE KEY-----"
+#define PEM_PKCS8_ENC_KEY_END   "-----END ENCRYPTED PRIVATE KEY-----"
+
+#define PEM_PKCS8_DEC_KEY_BEGIN "-----BEGIN PRIVATE KEY-----"
+#define PEM_PKCS8_DEC_KEY_END   "-----END PRIVATE KEY-----"
+
 static gboolean
 find_tag (const char *tag,
           const GByteArray *array,
@@ -250,6 +256,71 @@ parse_error:
 	return NULL;
 }
 
+static GByteArray *
+parse_pkcs8_key_file (const GByteArray *contents,
+                      gboolean *out_encrypted,
+                      GError **error)
+{
+	GByteArray *key = NULL;
+	gsize start = 0, end = 0;
+	unsigned char *der = NULL;
+	guint8 save_end;
+	gsize length = 0;
+	const char *start_tag = NULL, *end_tag = NULL;
+	gboolean encrypted = FALSE;
+
+	/* Try encrypted first, decrypted next */
+	if (find_tag (PEM_PKCS8_ENC_KEY_BEGIN, contents, 0, &start)) {
+		start_tag = PEM_PKCS8_ENC_KEY_BEGIN;
+		end_tag = PEM_PKCS8_ENC_KEY_END;
+		encrypted = TRUE;
+	} else if (find_tag (PEM_PKCS8_DEC_KEY_BEGIN, contents, 0, &start)) {
+		start_tag = PEM_PKCS8_DEC_KEY_BEGIN;
+		end_tag = PEM_PKCS8_DEC_KEY_END;
+		encrypted = FALSE;
+	} else {
+		g_set_error_literal (error, NM_CRYPTO_ERROR,
+		                     NM_CRYPTO_ERR_FILE_FORMAT_INVALID,
+		                     _("Failed to find expected PKCS#8 start tag."));
+		return NULL;
+	}
+
+	start += strlen (start_tag);
+	if (!find_tag (end_tag, contents, start, &end)) {
+		g_set_error (error, NM_CRYPTO_ERROR,
+		             NM_CRYPTO_ERR_FILE_FORMAT_INVALID,
+		             _("Failed to find expected PKCS#8 end tag '%s'."),
+		             end_tag);
+		return NULL;
+	}
+
+	/* g_base64_decode() wants a NULL-terminated string */
+	save_end = contents->data[end];
+	contents->data[end] = '\0';
+	der = g_base64_decode ((const char *) (contents->data + start), &length);
+	contents->data[end] = save_end;
+
+	if (der && length) {
+		key = g_byte_array_sized_new (length);
+		if (key) {
+			g_byte_array_append (key, der, length);
+			g_assert (key->len == length);
+			*out_encrypted = encrypted;
+		} else {
+			g_set_error_literal (error, NM_CRYPTO_ERROR,
+			                     NM_CRYPTO_ERR_OUT_OF_MEMORY,
+			                     _("Not enough memory to store private key data."));
+		}
+	} else {
+		g_set_error_literal (error, NM_CRYPTO_ERROR,
+		                     NM_CRYPTO_ERR_DECODE_FAILED,
+		                     _("Failed to decode PKCS#8 private key."));
+	}
+
+	g_free (der);
+	return key;
+}
+
 static GByteArray *
 file_to_g_byte_array (const char *filename, GError **error)
 {
@@ -654,6 +725,7 @@ crypto_verify_private_key_data (const GByteArray *contents,
 	GByteArray *tmp;
 	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
 	NMCryptoKeyType ktype = NM_CRYPTO_KEY_TYPE_UNKNOWN;
+	gboolean is_encrypted = FALSE;
 
 	g_return_val_if_fail (contents != NULL, FALSE);
 
@@ -662,15 +734,29 @@ crypto_verify_private_key_data (const GByteArray *contents,
 		if (!password || crypto_verify_pkcs12 (contents, password, error))
 			format = NM_CRYPTO_FILE_FORMAT_PKCS12;
 	} else {
-		tmp = crypto_decrypt_private_key_data (contents, password, &ktype, error);
+		/* Maybe it's PKCS#8 */
+		tmp = parse_pkcs8_key_file (contents, &is_encrypted, error);
+		if (tmp) {
+			if (crypto_verify_pkcs8 (tmp, is_encrypted, password, error))
+				format = NM_CRYPTO_FILE_FORMAT_RAW_KEY;
+		} else {
+			g_clear_error (error);
+
+			/* Or it's old-style OpenSSL */
+			tmp = crypto_decrypt_private_key_data (contents, password, &ktype, error);
+			if (tmp)
+				format = NM_CRYPTO_FILE_FORMAT_RAW_KEY;
+			else if (!password && (ktype != NM_CRYPTO_KEY_TYPE_UNKNOWN))
+				format = NM_CRYPTO_FILE_FORMAT_RAW_KEY;
+		}
+
 		if (tmp) {
 			/* Don't leave decrypted key data around */
 			memset (tmp->data, 0, tmp->len);
 			g_byte_array_free (tmp, TRUE);
-			format = NM_CRYPTO_FILE_FORMAT_RAW_KEY;
-		} else if (!password && (ktype != NM_CRYPTO_KEY_TYPE_UNKNOWN))
-			format = NM_CRYPTO_FILE_FORMAT_RAW_KEY;
+		}
 	}
+
 	return format;
 }
 
diff --git a/libnm-util/crypto.h b/libnm-util/crypto.h
index cdf053e7..482ed087 100644
--- a/libnm-util/crypto.h
+++ b/libnm-util/crypto.h
@@ -136,4 +136,9 @@ gboolean crypto_verify_pkcs12 (const GByteArray *data,
                                const char *password,
                                GError **error);
 
+gboolean crypto_verify_pkcs8 (const GByteArray *data,
+                              gboolean is_encrypted,
+                              const char *password,
+                              GError **error);
+
 #endif  /* __CRYPTO_H__ */
diff --git a/libnm-util/crypto_gnutls.c b/libnm-util/crypto_gnutls.c
index 583eb8be..d82230b0 100644
--- a/libnm-util/crypto_gnutls.c
+++ b/libnm-util/crypto_gnutls.c
@@ -438,6 +438,57 @@ out:
 	return success;
 }
 
+gboolean
+crypto_verify_pkcs8 (const GByteArray *data,
+                     gboolean is_encrypted,
+                     const char *password,
+                     GError **error)
+{
+	gnutls_x509_privkey_t p8;
+	gnutls_datum dt;
+	int err;
+
+	g_return_val_if_fail (data != NULL, FALSE);
+
+	dt.data = (unsigned char *) data->data;
+	dt.size = data->len;
+
+	err = gnutls_x509_privkey_init (&p8);
+	if (err < 0) {
+		g_set_error (error, NM_CRYPTO_ERROR,
+		             NM_CRYPTO_ERR_DECODE_FAILED,
+		             _("Couldn't initialize PKCS#8 decoder: %s"),
+		             gnutls_strerror (err));
+		return FALSE;
+	}
+
+	err = gnutls_x509_privkey_import_pkcs8 (p8,
+	                                        &dt,
+	                                        GNUTLS_X509_FMT_DER,
+	                                        is_encrypted ? password : NULL,
+	                                        is_encrypted ? 0 : GNUTLS_PKCS_PLAIN);
+	gnutls_x509_privkey_deinit (p8);
+
+	if (err < 0) {
+		if (err == GNUTLS_E_UNKNOWN_CIPHER_TYPE) {
+			/* HACK: gnutls doesn't support all the cipher types that openssl
+			 * can use with PKCS#8, so if we encounter one, we have to assume
+			 * the given password works.  gnutls needs to unsuckify, apparently.
+			 * Specifically, by default openssl uses pbeWithMD5AndDES-CBC
+			 * which gnutls does not support.
+			 */
+		} else {
+			g_set_error (error, NM_CRYPTO_ERROR,
+				         NM_CRYPTO_ERR_FILE_FORMAT_INVALID,
+				         _("Couldn't decode PKCS#8 file: %s"),
+				         gnutls_strerror (err));
+			return FALSE;
+		}
+	}
+
+	return TRUE;
+}
+
 gboolean
 crypto_randomize (void *buffer, gsize buffer_len, GError **error)
 {
diff --git a/libnm-util/crypto_nss.c b/libnm-util/crypto_nss.c
index ff12f9c5..5a7aa30b 100644
--- a/libnm-util/crypto_nss.c
+++ b/libnm-util/crypto_nss.c
@@ -541,6 +541,21 @@ error:
 	return FALSE;
 }
 
+gboolean
+crypto_verify_pkcs8 (const GByteArray *data,
+                     gboolean is_encrypted,
+                     const char *password,
+                     GError **error)
+{
+	g_return_val_if_fail (data != NULL, FALSE);
+
+	/* NSS apparently doesn't do PKCS#8 natively, but you have to put the
+	 * PKCS#8 key into a PKCS#12 file and import that??  So until we figure
+	 * all that out, we can only assume the password is valid.
+	 */
+	return TRUE;
+}
+
 gboolean
 crypto_randomize (void *buffer, gsize buffer_len, GError **error)
 {
diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver
index bb988bc4..4ff0838e 100644
--- a/libnm-util/libnm-util.ver
+++ b/libnm-util/libnm-util.ver
@@ -130,6 +130,7 @@ global:
 	nm_setting_802_1x_get_phase2_private_key_path;
 	nm_setting_802_1x_get_phase2_private_key_scheme;
 	nm_setting_802_1x_get_pin;
+	nm_setting_802_1x_get_pin_flags;
 	nm_setting_802_1x_get_private_key_blob;
 	nm_setting_802_1x_get_private_key_format;
 	nm_setting_802_1x_get_private_key_password;
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c
index cd9d53ff..6e9f92b5 100644
--- a/libnm-util/nm-connection.c
+++ b/libnm-util/nm-connection.c
@@ -512,7 +512,7 @@ validate_permissions_type (GHashTable *hash, GError **error)
 /**
  * nm_connection_replace_settings:
  * @connection: a #NMConnection
- * @new_settings: (element-type utf8 GHashTable): a #GHashTable of settings
+ * @new_settings: (element-type utf8 GLib.HashTable): a #GHashTable of settings
  * @error: location to store error, or %NULL
  *
  * Returns: %TRUE if the settings were valid and added to the connection, %FALSE
@@ -640,9 +640,10 @@ diff_one_connection (NMConnection *a,
  * @a: a #NMConnection
  * @b: a second #NMConnection to compare with the first
  * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT
- * @out_settings: (element-type utf8 GHashTable): if the
+ * @out_settings: (element-type utf8 GLib.HashTable): if the
  * connections differ, on return a hash table mapping setting names to
- * second-level GHashTable, which contains key names that differ
+ * second-level GHashTable (utf8 to guint32), which contains the key names that
+ * differ mapped to one or more of %NMSettingDiffResult as a bitfield
  *
  * Compares two #NMConnection objects for similarity, with comparison behavior
  * modified by a set of flags.  See nm_setting_compare() for a description of
@@ -968,7 +969,7 @@ nm_connection_clear_secrets (NMConnection *connection)
  * are #GHashTables mapping string:GValue, each of which represents the
  * properties of the #NMSetting object.
  *
- * Returns: (transfer full) (element-type utf8 GHashTable): a new
+ * Returns: (transfer full) (element-type utf8 GLib.HashTable): a new
  * #GHashTable describing the connection, its settings, and each setting's
  * properties.  The caller owns the hash table and must unref the hash table
  * with g_hash_table_unref() when it is no longer needed.
diff --git a/libnm-util/nm-param-spec-specialized.c b/libnm-util/nm-param-spec-specialized.c
index f5a362ce..93623a11 100644
--- a/libnm-util/nm-param-spec-specialized.c
+++ b/libnm-util/nm-param-spec-specialized.c
@@ -37,9 +37,9 @@ struct _NMParamSpecSpecialized {
 #include "nm-dbus-glib-types.h"
 
 /***********************************************************/
-/* nm_gvalues_compare */
+/* _gvalues_compare */
 
-static gint nm_gvalues_compare (const GValue *value1, const GValue *value2);
+static gint _gvalues_compare (const GValue *value1, const GValue *value2);
 
 static gboolean
 type_is_fixed_size (GType type, gsize *tsize)
@@ -86,7 +86,7 @@ type_is_fixed_size (GType type, gsize *tsize)
 #define FLOAT_FACTOR 0.00000001
 
 static gint
-nm_gvalues_compare_fixed (const GValue *value1, const GValue *value2)
+_gvalues_compare_fixed (const GValue *value1, const GValue *value2)
 {
 	int ret = 0;
 
@@ -177,7 +177,7 @@ nm_gvalues_compare_fixed (const GValue *value1, const GValue *value2)
 }
 
 static gint
-nm_gvalues_compare_string (const GValue *value1, const GValue *value2)
+_gvalues_compare_string (const GValue *value1, const GValue *value2)
 {
 	const char *str1 = g_value_get_string (value1);
 	const char *str2 = g_value_get_string (value2);
@@ -194,7 +194,7 @@ nm_gvalues_compare_string (const GValue *value1, const GValue *value2)
 }
 
 static gint
-nm_gvalues_compare_strv (const GValue *value1, const GValue *value2)
+_gvalues_compare_strv (const GValue *value1, const GValue *value2)
 {
 	char **strv1;
 	char **strv2;
@@ -221,7 +221,7 @@ nm_gvalues_compare_strv (const GValue *value1, const GValue *value2)
 }
 
 static void
-nm_gvalue_destroy (gpointer data)
+_gvalue_destroy (gpointer data)
 {
 	GValue *value = (GValue *) data;
 
@@ -250,7 +250,7 @@ iterate_collection (const GValue *value, gpointer user_data)
 }
 
 static gint
-nm_gvalues_compare_collection (const GValue *value1, const GValue *value2)
+_gvalues_compare_collection (const GValue *value1, const GValue *value2)
 {
 	gint ret;
 	guint len1;
@@ -287,12 +287,12 @@ nm_gvalues_compare_collection (const GValue *value1, const GValue *value2)
 			for (iter1 = list1, iter2 = list2, ret = 0;
 				ret == 0 && iter1 && iter2; 
 				iter1 = iter1->next, iter2 = iter2->next)
-				ret = nm_gvalues_compare ((GValue *) iter1->data, (GValue *) iter2->data);
+				ret = _gvalues_compare ((GValue *) iter1->data, (GValue *) iter2->data);
 		}
 
-		g_slist_foreach (list1, (GFunc) nm_gvalue_destroy, NULL);
+		g_slist_foreach (list1, (GFunc) _gvalue_destroy, NULL);
 		g_slist_free (list1);
-		g_slist_foreach (list2, (GFunc) nm_gvalue_destroy, NULL);
+		g_slist_foreach (list2, (GFunc) _gvalue_destroy, NULL);
 		g_slist_free (list2);
 	}
 
@@ -325,13 +325,13 @@ compare_one_map_item (gpointer key, gpointer val, gpointer user_data)
 
 	value2 = (GValue *) g_hash_table_lookup (info->hash2, key);
 	if (value2)
-		info->ret = nm_gvalues_compare ((GValue *) val, value2);
+		info->ret = _gvalues_compare ((GValue *) val, value2);
 	else
 		info->ret = 1;
 }
 
 static gint
-nm_gvalues_compare_map (const GValue *value1, const GValue *value2)
+_gvalues_compare_map (const GValue *value1, const GValue *value2)
 {
 	GHashTable *hash1 = NULL;
 	GHashTable *hash2 = NULL;
@@ -345,11 +345,11 @@ nm_gvalues_compare_map (const GValue *value1, const GValue *value2)
 		return 0;
 	}
 
-	hash1 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
+	hash1 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _gvalue_destroy);
 	dbus_g_type_map_value_iterate (value1, iterate_map, &hash1); 
 	len1 = g_hash_table_size (hash1);
 
-	hash2 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
+	hash2 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _gvalue_destroy);
 	dbus_g_type_map_value_iterate (value2, iterate_map, &hash2);
 	len2 = g_hash_table_size (hash2);
 
@@ -491,10 +491,10 @@ nm_gvalue_ip6_route_compare (const GValue *value1, const GValue *value2)
 }
 
 static gint
-nm_gvalues_compare_struct (const GValue *value1, const GValue *value2)
+_gvalues_compare_struct (const GValue *value1, const GValue *value2)
 {
 	/* value1 and value2 must contain the same type since
-	 * nm_gvalues_compare() enforced that already.
+	 * _gvalues_compare() enforced that already.
 	 */
 
 	if (G_VALUE_HOLDS (value1, DBUS_TYPE_G_IP6_ADDRESS)) {
@@ -508,7 +508,7 @@ nm_gvalues_compare_struct (const GValue *value1, const GValue *value2)
 }
 
 gint
-nm_gvalues_compare (const GValue *value1, const GValue *value2)
+_gvalues_compare (const GValue *value1, const GValue *value2)
 {
 	GType type1;
 	GType type2;
@@ -528,9 +528,9 @@ nm_gvalues_compare (const GValue *value1, const GValue *value2)
 		return type1 < type2 ? -1 : type1 > type2;
 
 	if (type_is_fixed_size (type1, NULL))
-		ret = nm_gvalues_compare_fixed (value1, value2);
+		ret = _gvalues_compare_fixed (value1, value2);
 	else if (type1 == G_TYPE_STRING) 
-		ret = nm_gvalues_compare_string (value1, value2);
+		ret = _gvalues_compare_string (value1, value2);
 	else if (G_VALUE_HOLDS_BOXED (value1)) {
 		gpointer p1 = g_value_get_boxed (value1);
 		gpointer p2 = g_value_get_boxed (value2);
@@ -542,15 +542,15 @@ nm_gvalues_compare (const GValue *value1, const GValue *value2)
 		else if (!p2)
 			ret = -1; /* The comparision functions below don't handle NULLs */
 		else if (type1 == G_TYPE_STRV)
-			ret = nm_gvalues_compare_strv (value1, value2);
+			ret = _gvalues_compare_strv (value1, value2);
 		else if (dbus_g_type_is_collection (type1))
-			ret = nm_gvalues_compare_collection (value1, value2);
+			ret = _gvalues_compare_collection (value1, value2);
 		else if (dbus_g_type_is_map (type1))
-			ret = nm_gvalues_compare_map (value1, value2);
+			ret = _gvalues_compare_map (value1, value2);
 		else if (dbus_g_type_is_struct (type1))
-			ret = nm_gvalues_compare_struct (value1, value2);
+			ret = _gvalues_compare_struct (value1, value2);
 		else if (type1 == G_TYPE_VALUE)
-			ret = nm_gvalues_compare ((GValue *) g_value_get_boxed (value1), (GValue *) g_value_get_boxed (value2));
+			ret = _gvalues_compare ((GValue *) g_value_get_boxed (value1), (GValue *) g_value_get_boxed (value2));
 		else {
 			g_warning ("Don't know how to compare boxed types '%s'", g_type_name (type1));
 			ret = value1 == value2;
@@ -596,7 +596,7 @@ param_specialized_values_cmp (GParamSpec *pspec,
 						const GValue *value1,
 						const GValue *value2)
 {
-	return nm_gvalues_compare (value1, value2);
+	return _gvalues_compare (value1, value2);
 }
 
 GType
@@ -656,13 +656,13 @@ compare_ints (void)
 
 	g_value_set_int (&value1, 5);
 	g_value_set_int (&value2, 5);
-	g_print ("Comparing ints 5 and 5: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing ints 5 and 5: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_int (&value2, 10);
-	g_print ("Comparing ints 5 and 10: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing ints 5 and 10: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_int (&value2, 1);
-	g_print ("Comparing ints 5 and 1: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing ints 5 and 1: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -678,10 +678,10 @@ compare_strings (void)
 
 	g_value_set_string (&value1, str1);
 	g_value_set_string (&value2, str1);
-	g_print ("Comparing identical strings: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical strings: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_string (&value2, str2);
-	g_print ("Comparing different strings: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different strings: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -699,16 +699,16 @@ compare_strv (void)
 
 	g_value_set_boxed (&value1, strv1);
 	g_value_set_boxed (&value2, strv1);
-	g_print ("Comparing identical strv's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical strv's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_boxed (&value2, strv2);
-	g_print ("Comparing different strv's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different strv's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_boxed (&value2, strv3);
-	g_print ("Comparing different len (smaller) strv's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different len (smaller) strv's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_boxed (&value2, strv4);
-	g_print ("Comparing different len (longer) strv's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different len (longer) strv's: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -734,16 +734,16 @@ compare_garrays (void)
 	g_value_set_boxed (&value1, array1);
 	g_value_set_boxed (&value2, array2);
 
-	g_print ("Comparing identical arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical arrays's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_array_remove_index (array2, 0);
 	g_value_set_boxed (&value2, array2);
-	g_print ("Comparing different length arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different length arrays's: %d\n", _gvalues_compare (&value1, &value2));
 
 	i = 7;
 	g_array_prepend_val (array2, i);
 	g_value_set_boxed (&value2, array2);
-	g_print ("Comparing different arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different arrays's: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -768,15 +768,15 @@ compare_ptrarrays (void)
 	g_ptr_array_add (array2, "world");
 	g_value_set_boxed (&value2, array2);
 
-	g_print ("Comparing identical ptr arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical ptr arrays's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_ptr_array_add (array2, "boo");
 	g_value_set_boxed (&value2, array2);
-	g_print ("Comparing different len ptr arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different len ptr arrays's: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_ptr_array_add (array1, "booz");
 	g_value_set_boxed (&value1, array1);
-	g_print ("Comparing different ptr arrays's: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different ptr arrays's: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -801,15 +801,15 @@ compare_str_hash (void)
 
 	g_value_set_boxed (&value1, hash1);
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing identical str hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical str hashes: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_hash_table_remove (hash2, "key2");
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing different length str hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different length str hashes: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_hash_table_insert (hash2, "key2", "moon");
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing different str hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different str hashes: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static GValue *
@@ -858,15 +858,15 @@ compare_gvalue_hash (void)
 
 	g_value_set_boxed (&value1, hash1);
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing identical gvalue hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical gvalue hashes: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_hash_table_remove (hash2, "key2");
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing different length str hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different length str hashes: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_hash_table_insert (hash2, "key2", str_to_gvalue ("moon"));
 	g_value_set_boxed (&value2, hash2);
-	g_print ("Comparing different str hashes: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different str hashes: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 static void
@@ -939,15 +939,15 @@ compare_ip6_addresses (void)
 
 	g_value_set_boxed (&value1, array1);
 	g_value_set_boxed (&value2, array1);
-	g_print ("Comparing identical IPv6 address structures: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing identical IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_boxed (&value1, array1);
 	g_value_set_boxed (&value2, array2);
-	g_print ("Comparing different IPv6 address structures: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2));
 
 	g_value_set_boxed (&value1, array1);
 	g_value_set_boxed (&value2, array3);
-	g_print ("Comparing different IPv6 address structures: %d\n", nm_gvalues_compare (&value1, &value2));
+	g_print ("Comparing different IPv6 address structures: %d\n", _gvalues_compare (&value1, &value2));
 }
 
 int
diff --git a/libnm-util/nm-setting-8021x.c b/libnm-util/nm-setting-8021x.c
index 4cd22016..24750422 100644
--- a/libnm-util/nm-setting-8021x.c
+++ b/libnm-util/nm-setting-8021x.c
@@ -475,9 +475,9 @@ path_to_scheme_value (const char *path)
 /**
  * nm_setting_802_1x_set_ca_cert:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
- *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the CA certificate file
- *   (PEM or DER format).  The path must be UTF-8 encoded; use
+ * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH
+ *   or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the CA certificate
+ *   file (PEM or DER format).  The path must be UTF-8 encoded; use
  *   g_filename_to_utf8() to convert if needed.  Passing NULL with any @scheme
  *   clears the CA certificate.
  * @scheme: desired storage scheme for the certificate
@@ -493,7 +493,7 @@ path_to_scheme_value (const char *path)
  **/
 gboolean
 nm_setting_802_1x_set_ca_cert (NMSetting8021x *self,
-                               const char *value,
+                               const char *cert_path,
                                NMSetting8021xCKScheme scheme,
                                NMSetting8021xCKFormat *out_format,
                                GError **error)
@@ -504,8 +504,8 @@ nm_setting_802_1x_set_ca_cert (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (cert_path) {
+		g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -522,10 +522,10 @@ nm_setting_802_1x_set_ca_cert (NMSetting8021x *self,
 		priv->ca_cert = NULL;
 	}
 
-	if (!value)
+	if (!cert_path)
 		return TRUE;
 
-	data = crypto_load_and_verify_certificate (value, &format, error);
+	data = crypto_load_and_verify_certificate (cert_path, &format, error);
 	if (data) {
 		/* wpa_supplicant can only use raw x509 CA certs */
 		switch (format) {
@@ -547,7 +547,7 @@ nm_setting_802_1x_set_ca_cert (NMSetting8021x *self,
 			if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
 				priv->ca_cert = data;
 			else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-				priv->ca_cert = path_to_scheme_value (value);
+				priv->ca_cert = path_to_scheme_value (cert_path);
 			else
 				g_assert_not_reached ();
 		}
@@ -623,11 +623,11 @@ nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting)
 /**
  * nm_setting_802_1x_set_client_cert:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
- *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the client certificate
- *   file (PEM, DER, or PKCS#12 format).  The path must be UTF-8 encoded; use
- *   g_filename_to_utf8() to convert if needed.  Passing NULL with any @scheme
- *   clears the client certificate.
+ * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH
+ *   or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the client
+ *   certificate file (PEM, DER, or PKCS#12 format).  The path must be UTF-8
+ *   encoded; use g_filename_to_utf8() to convert if needed.  Passing NULL with
+ *   any @scheme clears the client certificate.
  * @scheme: desired storage scheme for the certificate
  * @out_format: on successful return, the type of the certificate added
  * @error: on unsuccessful return, an error
@@ -645,7 +645,7 @@ nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting)
  **/
 gboolean
 nm_setting_802_1x_set_client_cert (NMSetting8021x *self,
-                                   const char *value,
+                                   const char *cert_path,
                                    NMSetting8021xCKScheme scheme,
                                    NMSetting8021xCKFormat *out_format,
                                    GError **error)
@@ -656,8 +656,8 @@ nm_setting_802_1x_set_client_cert (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (cert_path) {
+		g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -674,10 +674,10 @@ nm_setting_802_1x_set_client_cert (NMSetting8021x *self,
 		priv->client_cert = NULL;
 	}
 
-	if (!value)
+	if (!cert_path)
 		return TRUE;
 
-	data = crypto_load_and_verify_certificate (value, &format, error);
+	data = crypto_load_and_verify_certificate (cert_path, &format, error);
 	if (data) {
 		/* wpa_supplicant can only use raw x509 CA certs */
 		switch (format) {
@@ -703,7 +703,7 @@ nm_setting_802_1x_set_client_cert (NMSetting8021x *self,
 			if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
 				priv->client_cert = data;
 			else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-				priv->client_cert = path_to_scheme_value (value);
+				priv->client_cert = path_to_scheme_value (cert_path);
 			else
 				g_assert_not_reached ();
 		}
@@ -886,8 +886,8 @@ nm_setting_802_1x_get_phase2_ca_cert_path (NMSetting8021x *setting)
 /**
  * nm_setting_802_1x_set_phase2_ca_cert:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
- *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" CA
+ * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH
+ *   or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" CA
  *   certificate file (PEM or DER format).  The path must be UTF-8 encoded; use
  *   g_filename_to_utf8() to convert if needed.  Passing NULL with any @scheme
  *   clears the "phase2" CA certificate.
@@ -904,7 +904,7 @@ nm_setting_802_1x_get_phase2_ca_cert_path (NMSetting8021x *setting)
  **/
 gboolean
 nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *self,
-                                      const char *value,
+                                      const char *cert_path,
                                       NMSetting8021xCKScheme scheme,
                                       NMSetting8021xCKFormat *out_format,
                                       GError **error)
@@ -915,8 +915,8 @@ nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (cert_path) {
+		g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -933,10 +933,10 @@ nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *self,
 		priv->phase2_ca_cert = NULL;
 	}
 
-	if (!value)
+	if (!cert_path)
 		return TRUE;
 
-	data = crypto_load_and_verify_certificate (value, &format, error);
+	data = crypto_load_and_verify_certificate (cert_path, &format, error);
 	if (data) {
 		/* wpa_supplicant can only use raw x509 CA certs */
 		switch (format) {
@@ -958,7 +958,7 @@ nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *self,
 			if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
 				priv->phase2_ca_cert = data;
 			else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-				priv->phase2_ca_cert = path_to_scheme_value (value);
+				priv->phase2_ca_cert = path_to_scheme_value (cert_path);
 			else
 				g_assert_not_reached ();
 		}
@@ -1036,8 +1036,8 @@ nm_setting_802_1x_get_phase2_client_cert_path (NMSetting8021x *setting)
 /**
  * nm_setting_802_1x_set_phase2_client_cert:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
- *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" client
+ * @cert_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH
+ *   or %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" client
  *   certificate file (PEM, DER, or PKCS#12 format).  The path must be UTF-8
  *   encoded; use g_filename_to_utf8() to convert if needed.  Passing NULL with
  *   any @scheme clears the "phase2" client certificate.
@@ -1058,7 +1058,7 @@ nm_setting_802_1x_get_phase2_client_cert_path (NMSetting8021x *setting)
  **/
 gboolean
 nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *self,
-                                          const char *value,
+                                          const char *cert_path,
                                           NMSetting8021xCKScheme scheme,
                                           NMSetting8021xCKFormat *out_format,
                                           GError **error)
@@ -1069,8 +1069,8 @@ nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (cert_path) {
+		g_return_val_if_fail (g_utf8_validate (cert_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -1087,10 +1087,10 @@ nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *self,
 		priv->phase2_client_cert = NULL;
 	}
 
-	if (!value)
+	if (!cert_path)
 		return TRUE;
 
-	data = crypto_load_and_verify_certificate (value, &format, error);
+	data = crypto_load_and_verify_certificate (cert_path, &format, error);
 	if (data) {
 		/* wpa_supplicant can only use raw x509 CA certs */
 		switch (format) {
@@ -1116,7 +1116,7 @@ nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *self,
 			if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
 				priv->phase2_client_cert = data;
 			else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-				priv->phase2_client_cert = path_to_scheme_value (value);
+				priv->phase2_client_cert = path_to_scheme_value (cert_path);
 			else
 				g_assert_not_reached ();
 		}
@@ -1275,7 +1275,7 @@ file_to_byte_array (const char *filename)
 /**
  * nm_setting_802_1x_set_private_key:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
+ * @key_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
  *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the private key file
  *   (PEM, DER, or PKCS#12 format).  The path must be UTF-8 encoded; use
  *   g_filename_to_utf8() to convert if needed.  Passing NULL with any @scheme
@@ -1313,7 +1313,7 @@ file_to_byte_array (const char *filename)
  **/
 gboolean
 nm_setting_802_1x_set_private_key (NMSetting8021x *self,
-                                   const char *value,
+                                   const char *key_path,
                                    const char *password,
                                    NMSetting8021xCKScheme scheme,
                                    NMSetting8021xCKFormat *out_format,
@@ -1324,8 +1324,8 @@ nm_setting_802_1x_set_private_key (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (key_path) {
+		g_return_val_if_fail (g_utf8_validate (key_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -1337,8 +1337,8 @@ nm_setting_802_1x_set_private_key (NMSetting8021x *self,
 	/* Ensure the private key is a recognized format and if the password was
 	 * given, that it decrypts the private key.
 	 */
-	if (value) {
-		format = crypto_verify_private_key (value, password, NULL);
+	if (key_path) {
+		format = crypto_verify_private_key (key_path, password, NULL);
 		if (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) {
 			g_set_error (error,
 				         NM_SETTING_802_1X_ERROR,
@@ -1361,16 +1361,16 @@ nm_setting_802_1x_set_private_key (NMSetting8021x *self,
 	g_free (priv->private_key_password);
 	priv->private_key_password = NULL;
 
-	if (value == NULL)
+	if (key_path == NULL)
 		return TRUE;
 
 	priv->private_key_password = g_strdup (password);
 	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
 		/* Shouldn't fail this since we just verified the private key above */
-		priv->private_key = file_to_byte_array (value);
+		priv->private_key = file_to_byte_array (key_path);
 		g_assert (priv->private_key);
 	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		priv->private_key = path_to_scheme_value (value);
+		priv->private_key = path_to_scheme_value (key_path);
 	else
 		g_assert_not_reached ();
 
@@ -1570,7 +1570,7 @@ nm_setting_802_1x_get_phase2_private_key_path (NMSetting8021x *setting)
 /**
  * nm_setting_802_1x_set_phase2_private_key:
  * @setting: the #NMSetting8021x
- * @value: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
+ * @key_path: when @scheme is set to either %NM_SETTING_802_1X_CK_SCHEME_PATH or
  *   %NM_SETTING_802_1X_CK_SCHEME_BLOB, pass the path of the "phase2" private
  *   key file (PEM, DER, or PKCS#12 format).  The path must be UTF-8 encoded;
  *   use g_filename_to_utf8() to convert if needed.  Passing NULL with any
@@ -1608,7 +1608,7 @@ nm_setting_802_1x_get_phase2_private_key_path (NMSetting8021x *setting)
  **/
 gboolean
 nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *self,
-                                          const char *value,
+                                          const char *key_path,
                                           const char *password,
                                           NMSetting8021xCKScheme scheme,
                                           NMSetting8021xCKFormat *out_format,
@@ -1619,8 +1619,8 @@ nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *self,
 
 	g_return_val_if_fail (NM_IS_SETTING_802_1X (self), FALSE);
 
-	if (value) {
-		g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+	if (key_path) {
+		g_return_val_if_fail (g_utf8_validate (key_path, -1, NULL), FALSE);
 		g_return_val_if_fail (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
 		                      || scheme == NM_SETTING_802_1X_CK_SCHEME_PATH,
 		                      FALSE);
@@ -1632,8 +1632,8 @@ nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *self,
 	/* Ensure the private key is a recognized format and if the password was
 	 * given, that it decrypts the private key.
 	 */
-	if (value) {
-		format = crypto_verify_private_key (value, password, NULL);
+	if (key_path) {
+		format = crypto_verify_private_key (key_path, password, NULL);
 		if (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) {
 			g_set_error (error,
 				         NM_SETTING_802_1X_ERROR,
@@ -1656,16 +1656,16 @@ nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *self,
 	g_free (priv->phase2_private_key_password);
 	priv->phase2_private_key_password = NULL;
 
-	if (value == NULL)
+	if (key_path == NULL)
 		return TRUE;
 
 	priv->phase2_private_key_password = g_strdup (password);
 	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
 		/* Shouldn't fail this since we just verified the private key above */
-		priv->phase2_private_key = file_to_byte_array (value);
+		priv->phase2_private_key = file_to_byte_array (key_path);
 		g_assert (priv->phase2_private_key);
 	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		priv->phase2_private_key = path_to_scheme_value (value);
+		priv->phase2_private_key = path_to_scheme_value (key_path);
 	else
 		g_assert_not_reached ();
 
diff --git a/libnm-util/nm-setting-8021x.h b/libnm-util/nm-setting-8021x.h
index bf587a90..f3e61e55 100644
--- a/libnm-util/nm-setting-8021x.h
+++ b/libnm-util/nm-setting-8021x.h
@@ -174,7 +174,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_ca_cert_scheme          (NMSetting8
 const GByteArray *     nm_setting_802_1x_get_ca_cert_blob            (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_ca_cert_path            (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_ca_cert                 (NMSetting8021x *setting,
-                                                                      const char *value,
+                                                                      const char *cert_path,
                                                                       NMSetting8021xCKScheme scheme,
                                                                       NMSetting8021xCKFormat *out_format,
                                                                       GError **error);
@@ -183,7 +183,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_client_cert_scheme      (NMSetting8
 const GByteArray *     nm_setting_802_1x_get_client_cert_blob        (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_client_cert_path        (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_client_cert             (NMSetting8021x *setting,
-                                                                      const char *value,
+                                                                      const char *cert_path,
                                                                       NMSetting8021xCKScheme scheme,
                                                                       NMSetting8021xCKFormat *out_format,
                                                                       GError **error);
@@ -202,7 +202,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_ca_cert_scheme   (NMSetting8
 const GByteArray *     nm_setting_802_1x_get_phase2_ca_cert_blob     (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_phase2_ca_cert_path     (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_phase2_ca_cert          (NMSetting8021x *setting,
-                                                                      const char *value,
+                                                                      const char *cert_path,
                                                                       NMSetting8021xCKScheme scheme,
                                                                       NMSetting8021xCKFormat *out_format,
                                                                       GError **error);
@@ -211,7 +211,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_client_cert_scheme   (NMSett
 const GByteArray *     nm_setting_802_1x_get_phase2_client_cert_blob     (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_phase2_client_cert_path     (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_phase2_client_cert          (NMSetting8021x *setting,
-                                                                          const char *value,
+                                                                          const char *cert_path,
                                                                           NMSetting8021xCKScheme scheme,
                                                                           NMSetting8021xCKFormat *out_format,
                                                                           GError **error);
@@ -226,7 +226,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_private_key_scheme          (NMSett
 const GByteArray *     nm_setting_802_1x_get_private_key_blob            (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_private_key_path            (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_private_key                 (NMSetting8021x *setting,
-                                                                          const char *value,
+                                                                          const char *key_path,
                                                                           const char *password,
                                                                           NMSetting8021xCKScheme scheme,
                                                                           NMSetting8021xCKFormat *out_format,
@@ -240,7 +240,7 @@ NMSetting8021xCKScheme nm_setting_802_1x_get_phase2_private_key_scheme   (NMSett
 const GByteArray *     nm_setting_802_1x_get_phase2_private_key_blob     (NMSetting8021x *setting);
 const char *           nm_setting_802_1x_get_phase2_private_key_path     (NMSetting8021x *setting);
 gboolean               nm_setting_802_1x_set_phase2_private_key          (NMSetting8021x *setting,
-                                                                          const char *value,
+                                                                          const char *key_path,
                                                                           const char *password,
                                                                           NMSetting8021xCKScheme scheme,
                                                                           NMSetting8021xCKFormat *out_format,
diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c
index a1b7a6d3..0ece448b 100644
--- a/libnm-util/nm-setting-gsm.c
+++ b/libnm-util/nm-setting-gsm.c
@@ -241,10 +241,28 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		}
 
 		/* APNs roughly follow the same rules as DNS domain names.  Allowed
-		 * characters are a-z, 0-9, . and -.  GSM 03.60 Section 14.9.
+		 * characters are a-z, 0-9, . and -.  GSM 03.03 Section 9.1 states:
+		 *
+		 *   The syntax of the APN shall follow the Name Syntax defined in
+		 *   RFC 2181 [14] and RFC 1035 [15]. The APN consists of one or
+		 *   more labels. Each label is coded as one octet length field
+		 *   followed by that number of octets coded as 8 bit ASCII characters.
+		 *   Following RFC 1035 [15] the labels should consist only of the
+		 *   alphabetic characters (A-Z and a-z), digits (0-9) and the
+		 *   dash (-). The case of alphabetic characters is not significant.
+		 *
+		 * A dot (.) is commonly used to separate parts of the APN, and
+		 * apparently the underscore (_) is used as well.  RFC 2181 indicates
+		 * that no restrictions of any kind are placed on DNS labels, and thus
+		 * it would appear that none are placed on APNs either, but many modems
+		 * and networks will fail to accept APNs that include odd characters
+		 * like space ( ) and such.
 		 */
 		for (i = 0; i < apn_len; i++) {
-			if (!isalnum (priv->apn[i]) && (priv->apn[i] != '.') && (priv->apn[i] != '-')) {
+			if (   !isalnum (priv->apn[i])
+			    && (priv->apn[i] != '.')
+			    && (priv->apn[i] != '_')
+			    && (priv->apn[i] != '-')) {
 				g_set_error (error,
 				             NM_SETTING_GSM_ERROR,
 				             NM_SETTING_GSM_ERROR_INVALID_PROPERTY,
diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c
index d3aac030..23f07383 100644
--- a/libnm-util/nm-setting-vpn.c
+++ b/libnm-util/nm-setting-vpn.c
@@ -161,23 +161,55 @@ nm_setting_vpn_remove_data_item (NMSettingVPN *setting, const char *key)
 	g_hash_table_remove (NM_SETTING_VPN_GET_PRIVATE (setting)->data, key);
 }
 
+static void
+foreach_item_helper (GHashTable *hash,
+                     NMVPNIterFunc func,
+                     gpointer user_data)
+{
+	GList *keys, *liter;
+	GSList *copied = NULL, *siter;
+
+	g_return_if_fail (hash != NULL);
+
+	/* Grab keys and copy them so that the callback func can modify
+	 * the hash table items if it wants to.
+	 */
+	keys = g_hash_table_get_keys (hash);
+	for (liter = keys; liter; liter = g_list_next (liter))
+		copied = g_slist_prepend (copied, g_strdup (liter->data));
+	copied = g_slist_reverse (copied);
+	g_list_free (keys);
+
+	for (siter = copied; siter; siter = g_slist_next (siter)) {
+		gpointer value;
+
+		value = g_hash_table_lookup (hash, siter->data);
+		func (siter->data, value, user_data);
+	}
+
+	g_slist_foreach (copied, (GFunc) g_free, NULL);
+	g_slist_free (copied);
+}
+
 /**
  * nm_setting_vpn_foreach_data_item:
  * @setting: a #NMSettingVPN
  * @func: (scope call): an user provided function
  * @user_data: data to be passed to @func
  *
- * Iterates all data items stored in this setting
+ * Iterates all data items stored in this setting.  It is safe to add, remove,
+ * and modify data items inside @func, though any additions or removals made
+ * during iteration will not be part of the iteration.
  */
 void
 nm_setting_vpn_foreach_data_item (NMSettingVPN *setting,
                                   NMVPNIterFunc func,
                                   gpointer user_data)
 {
+	g_return_if_fail (setting != NULL);
 	g_return_if_fail (NM_IS_SETTING_VPN (setting));
 
-	g_hash_table_foreach (NM_SETTING_VPN_GET_PRIVATE (setting)->data,
-	                      (GHFunc) func, user_data);
+	foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->data, func, user_data);
 }
 
 void
@@ -217,17 +249,19 @@ nm_setting_vpn_remove_secret (NMSettingVPN *setting, const char *key)
  * @func: (scope call): an user provided function
  * @user_data: data to be passed to @func
  *
- * Iterates all secrets stored in this setting.
+ * Iterates all secrets stored in this setting.  It is safe to add, remove,
+ * and modify secrets inside @func, though any additions or removals made during
+ * iteration will not be part of the iteration.
  */
 void
 nm_setting_vpn_foreach_secret (NMSettingVPN *setting,
                                NMVPNIterFunc func,
                                gpointer user_data)
 {
+	g_return_if_fail (setting != NULL);
 	g_return_if_fail (NM_IS_SETTING_VPN (setting));
 
-	g_hash_table_foreach (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets,
-	                      (GHFunc) func, user_data);
+	foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, func, user_data);
 }
 
 static gboolean
@@ -377,7 +411,8 @@ get_secret_flags (NMSetting *setting,
 		errno = 0;
 		tmp = strtoul ((const char *) val, NULL, 10);
 		if ((errno == 0) && (tmp <= NM_SETTING_SECRET_FLAGS_ALL)) {
-			*out_flags = (guint32) tmp;
+			if (out_flags)
+				*out_flags = (guint32) tmp;
 			success = TRUE;
 		} else {
 			g_set_error (error,
diff --git a/libnm-util/nm-setting.c b/libnm-util/nm-setting.c
index 0f8b7d4f..3fe90db2 100644
--- a/libnm-util/nm-setting.c
+++ b/libnm-util/nm-setting.c
@@ -112,9 +112,10 @@ destroy_gvalue (gpointer data)
  *
  * Converts the #NMSetting into a #GHashTable mapping each setting property
  * name to a GValue describing that property, suitable for marshalling over
- * D-Bus or serializing.  The mapping is string:GValue.
+ * D-Bus or serializing.  The mapping is string to GValue.
  * 
- * Returns: (transfer full) (element-type utf8 GObject.Value): a new #GHashTable describing the setting's properties
+ * Returns: (transfer full) (element-type utf8 GObject.Value): a new #GHashTable
+ * describing the setting's properties
  **/
 GHashTable *
 nm_setting_to_hash (NMSetting *setting, NMSettingHashFlags flags)
@@ -209,8 +210,8 @@ one_property_cb (gpointer key, gpointer val, gpointer user_data)
 /**
  * nm_setting_new_from_hash:
  * @setting_type: the #NMSetting type which the hash contains properties for
- * @hash: the #GHashTable containing a string:GValue mapping of properties
- * that apply to the setting
+ * @hash: (element-type utf8 GObject.Value): the #GHashTable containing a
+ * string to GValue mapping of properties that apply to the setting
  *
  * Creates a new #NMSetting object and populates that object with the properties
  * contained in the hash table, using each hash key as the property to set,
@@ -223,8 +224,7 @@ one_property_cb (gpointer key, gpointer val, gpointer user_data)
  * hash table, or NULL on failure
  **/
 NMSetting *
-nm_setting_new_from_hash (GType setting_type,
-                          GHashTable *hash)
+nm_setting_new_from_hash (GType setting_type, GHashTable *hash)
 {
 	NMSetting *setting;
 	NMSettingFromHashInfo info;
@@ -421,10 +421,11 @@ nm_setting_compare (NMSetting *a,
  * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT
  * @invert_results: this parameter is used internally by libnm-util and should
  * be set to %FALSE.  If %TRUE inverts the meaning of the #NMSettingDiffResult.
- * @results: (element-type utf8 guint32): if the settings differ, on return a
- * hash table mapping the differing keys to one or more #NMSettingDiffResult
- * values OR-ed together.  If the settings do not differ, any hash table passed
- * in is unmodified.  If no hash table is passed in, a new one is created.
+ * @results: (inout) (transfer full) (element-type utf8 guint32): if the
+ * settings differ, on return a hash table mapping the differing keys to one or
+ * more %NMSettingDiffResult values OR-ed together.  If the settings do not
+ * differ, any hash table passed in is unmodified.  If no hash table is passed
+ * in and the settings differ, a new one is created and returned.
  *
  * Compares two #NMSetting objects for similarity, with comparison behavior
  * modified by a set of flags.  See the documentation for #NMSettingCompareFlags
@@ -661,8 +662,8 @@ update_one_secret (NMSetting *setting, const char *key, GValue *value, GError **
 /**
  * nm_setting_update_secrets:
  * @setting: the #NMSetting
- * @secrets: a #GHashTable mapping string:#GValue of setting property names and
- * secrets
+ * @secrets: (element-type utf8 GObject.Value): a #GHashTable mapping
+ * string to #GValue of setting property names and secrets
  * @error: location to store error, or %NULL
  *
  * Update the setting's secrets, given a hash table of secrets intended for that
diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c
index bac7fda3..449deb1c 100644
--- a/libnm-util/nm-utils.c
+++ b/libnm-util/nm-utils.c
@@ -534,7 +534,7 @@ _nm_utils_string_slist_validate (GSList *list, const char **valid_values)
 }
 
 static void
-nm_utils_convert_strv_to_slist (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_strv_to_slist (const GValue *src_value, GValue *dest_value)
 {
 	char **str;
 	GSList *list = NULL;
@@ -551,7 +551,7 @@ nm_utils_convert_strv_to_slist (const GValue *src_value, GValue *dest_value)
 }
 
 static void
-nm_utils_convert_strv_to_ptrarray (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_strv_to_ptrarray (const GValue *src_value, GValue *dest_value)
 {
 	char **str;
 	GPtrArray *array = NULL;
@@ -569,7 +569,7 @@ nm_utils_convert_strv_to_ptrarray (const GValue *src_value, GValue *dest_value)
 }
 
 static void
-nm_utils_convert_strv_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_strv_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GSList *strings;
 	GString *printable;
@@ -595,7 +595,7 @@ nm_utils_convert_strv_to_string (const GValue *src_value, GValue *dest_value)
 }
 
 static void
-nm_utils_convert_string_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_string_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GPtrArray *strings;
 	GString *printable;
@@ -621,7 +621,7 @@ nm_utils_convert_string_array_to_string (const GValue *src_value, GValue *dest_v
 }
 
 static void
-nm_utils_convert_uint_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_uint_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GArray *array;
 	GString *printable;
@@ -653,7 +653,7 @@ nm_utils_convert_uint_array_to_string (const GValue *src_value, GValue *dest_val
 }
 
 static void
-nm_utils_convert_ip4_addr_route_struct_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_ip4_addr_route_struct_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GPtrArray *ptr_array;
 	GString *printable;
@@ -738,7 +738,7 @@ convert_one_gvalue_hash_entry (gpointer key, gpointer value, gpointer user_data)
 }
 
 static void
-nm_utils_convert_gvalue_hash_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_gvalue_hash_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GHashTable *hash;
 	GString *printable;
@@ -764,7 +764,7 @@ convert_one_string_hash_entry (gpointer key, gpointer value, gpointer user_data)
 }
 
 static void
-nm_utils_convert_string_hash_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_string_hash_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GHashTable *hash;
 	GString *printable;
@@ -783,7 +783,7 @@ nm_utils_convert_string_hash_to_string (const GValue *src_value, GValue *dest_va
 }
 
 static void
-nm_utils_convert_byte_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_byte_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GArray *array;
 	GString *printable;
@@ -811,7 +811,7 @@ nm_utils_convert_byte_array_to_string (const GValue *src_value, GValue *dest_val
 }
 
 static gboolean
-nm_utils_inet6_ntop (struct in6_addr *addr, char *buf)
+_nm_utils_inet6_ntop (struct in6_addr *addr, char *buf)
 {
 	if (!inet_ntop (AF_INET6, addr, buf, INET6_ADDRSTRLEN)) {
 		int i;
@@ -828,7 +828,7 @@ nm_utils_inet6_ntop (struct in6_addr *addr, char *buf)
 }
 
 static void
-nm_utils_convert_ip6_dns_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_ip6_dns_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GPtrArray *ptr_array;
 	GString *printable;
@@ -854,7 +854,7 @@ nm_utils_convert_ip6_dns_array_to_string (const GValue *src_value, GValue *dest_
 		}
 		addr = (struct in6_addr *) bytearray->data;
 		memset (buf, 0, sizeof (buf));
-		nm_utils_inet6_ntop (addr, buf);
+		_nm_utils_inet6_ntop (addr, buf);
 		g_string_append_printf (printable, "%s", buf);
 	}
 	g_string_append_c (printable, ']');
@@ -864,7 +864,7 @@ nm_utils_convert_ip6_dns_array_to_string (const GValue *src_value, GValue *dest_
 }
 
 static void
-nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GPtrArray *ptr_array;
 	GString *printable;
@@ -905,7 +905,7 @@ nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValu
 		}
 		addr = (struct in6_addr *) ba_addr->data;
 		memset (buf, 0, sizeof (buf));
-		nm_utils_inet6_ntop (addr, buf);
+		_nm_utils_inet6_ntop (addr, buf);
 		g_string_append_printf (printable, "ip = %s", buf);
 		g_string_append (printable, ", ");
 
@@ -928,7 +928,7 @@ nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValu
 		}
 		addr = (struct in6_addr *) ba_addr->data;
 		memset (buf, 0, sizeof (buf));
-		nm_utils_inet6_ntop (addr, buf);
+		_nm_utils_inet6_ntop (addr, buf);
 		g_string_append_printf (printable, "gw = %s", buf);
 		g_string_append (printable, " }");
 	}
@@ -939,7 +939,7 @@ nm_utils_convert_ip6_addr_struct_array_to_string (const GValue *src_value, GValu
 }
 
 static void
-nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GValue *dest_value)
+_nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GValue *dest_value)
 {
 	GPtrArray *ptr_array;
 	GString *printable;
@@ -981,7 +981,7 @@ nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GVal
 		}
 		addr = (struct in6_addr *) ba_addr->data;
 		memset (buf, 0, sizeof (buf));
-		nm_utils_inet6_ntop (addr, buf);
+		_nm_utils_inet6_ntop (addr, buf);
 		g_string_append_printf (printable, "dst = %s", buf);
 		g_string_append (printable, ", ");
 
@@ -1004,7 +1004,7 @@ nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GVal
 		}
 		addr = (struct in6_addr *) ba_addr->data;
 		memset (buf, 0, sizeof (buf));
-		nm_utils_inet6_ntop (addr, buf);
+		_nm_utils_inet6_ntop (addr, buf);
 		g_string_append_printf (printable, "nh = %s", buf);
 		g_string_append (printable, ", ");
 
@@ -1025,7 +1025,7 @@ nm_utils_convert_ip6_route_struct_array_to_string (const GValue *src_value, GVal
 #define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS))
 
 static void
-nm_utils_convert_old_ip6_addr_array (const GValue *src_value, GValue *dst_value)
+_nm_utils_convert_old_ip6_addr_array (const GValue *src_value, GValue *dst_value)
 {
 	GPtrArray *src_outer_array;
 	GPtrArray *dst_outer_array;
@@ -1081,43 +1081,43 @@ _nm_utils_register_value_transformations (void)
 	if (G_UNLIKELY (!registered)) {
 		g_value_register_transform_func (G_TYPE_STRV, 
 		                                 DBUS_TYPE_G_LIST_OF_STRING,
-		                                 nm_utils_convert_strv_to_slist);
+		                                 _nm_utils_convert_strv_to_slist);
 		g_value_register_transform_func (G_TYPE_STRV,
 		                                 DBUS_TYPE_G_ARRAY_OF_STRING,
-		                                 nm_utils_convert_strv_to_ptrarray);
+		                                 _nm_utils_convert_strv_to_ptrarray);
 		g_value_register_transform_func (DBUS_TYPE_G_LIST_OF_STRING,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_strv_to_string);
+		                                 _nm_utils_convert_strv_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_STRING,
 		                                 G_TYPE_STRING,
-		                                 nm_utils_convert_string_array_to_string);
+		                                 _nm_utils_convert_string_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_UINT_ARRAY,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_uint_array_to_string);
+		                                 _nm_utils_convert_uint_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_ip4_addr_route_struct_array_to_string);
+		                                 _nm_utils_convert_ip4_addr_route_struct_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_MAP_OF_VARIANT,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_gvalue_hash_to_string);
+		                                 _nm_utils_convert_gvalue_hash_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_MAP_OF_STRING,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_string_hash_to_string);
+		                                 _nm_utils_convert_string_hash_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_UCHAR_ARRAY,
 		                                 G_TYPE_STRING,
-		                                 nm_utils_convert_byte_array_to_string);
+		                                 _nm_utils_convert_byte_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_ip6_dns_array_to_string);
+		                                 _nm_utils_convert_ip6_dns_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_ip6_addr_struct_array_to_string);
+		                                 _nm_utils_convert_ip6_addr_struct_array_to_string);
 		g_value_register_transform_func (DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE,
 		                                 G_TYPE_STRING, 
-		                                 nm_utils_convert_ip6_route_struct_array_to_string);
+		                                 _nm_utils_convert_ip6_route_struct_array_to_string);
 		g_value_register_transform_func (OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
 		                                 DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
-		                                 nm_utils_convert_old_ip6_addr_array);
+		                                 _nm_utils_convert_old_ip6_addr_array);
 		registered = TRUE;
 	}
 }
diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h
index c3eb29bc..e4714a96 100644
--- a/libnm-util/nm-utils.h
+++ b/libnm-util/nm-utils.h
@@ -27,7 +27,6 @@
 #define NM_UTILS_H
 
 #include 
-#include 
 
 #include "nm-connection.h"
 
diff --git a/libnm-util/tests/Makefile.am b/libnm-util/tests/Makefile.am
index daf4d688..1d737d1a 100644
--- a/libnm-util/tests/Makefile.am
+++ b/libnm-util/tests/Makefile.am
@@ -84,6 +84,9 @@ check-local: test-settings-defaults test-crypto test-secrets
 # Private key by itself (PEM)
 	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
 
+# PKCS#8 private key by itself (PEM)
+	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/pkcs8-enc-key.pem "1234567890"
+
 # Private key and CA certificate in the same file (pkcs12)
 	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
 
@@ -126,5 +129,10 @@ check-local: test-settings-defaults test-crypto test-secrets
 # Another PKCS#12 file
 	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
 
+# PKCS#8 encrypted private key
+	$(abs_builddir)/test-crypto --pkcs8 \
+		$(srcdir)/certs/pkcs8-enc-key.pem \
+		"1234567890"
+
 endif
 
diff --git a/libnm-util/tests/Makefile.in b/libnm-util/tests/Makefile.in
index 9e65094c..c4919ffc 100644
--- a/libnm-util/tests/Makefile.in
+++ b/libnm-util/tests/Makefile.in
@@ -941,6 +941,9 @@ uninstall-am:
 # Private key by itself (PEM)
 @WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
 
+# PKCS#8 private key by itself (PEM)
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/pkcs8-enc-key.pem "1234567890"
+
 # Private key and CA certificate in the same file (pkcs12)
 @WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
 
@@ -983,6 +986,11 @@ uninstall-am:
 # Another PKCS#12 file
 @WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
 
+# PKCS#8 encrypted private key
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --pkcs8 \
+@WITH_TESTS_TRUE@		$(srcdir)/certs/pkcs8-enc-key.pem \
+@WITH_TESTS_TRUE@		"1234567890"
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/libnm-util/tests/certs/Makefile.am b/libnm-util/tests/certs/Makefile.am
index 02d5a5f5..e0f00a47 100644
--- a/libnm-util/tests/certs/Makefile.am
+++ b/libnm-util/tests/certs/Makefile.am
@@ -17,5 +17,8 @@ EXTRA_DIST = \
 	test2-cert.p12 \
 	ca-no-ending-newline.pem \
 	test-key-only.pem \
-	test-key-only-decrypted.der
+	test-key-only-decrypted.der \
+	pkcs8-enc-key.pem \
+	pkcs8-noenc-key.pem \
+	pkcs8-decrypted.der
 
diff --git a/libnm-util/tests/certs/Makefile.in b/libnm-util/tests/certs/Makefile.in
index 873218e8..5149078b 100644
--- a/libnm-util/tests/certs/Makefile.in
+++ b/libnm-util/tests/certs/Makefile.in
@@ -287,7 +287,10 @@ EXTRA_DIST = \
 	test2-cert.p12 \
 	ca-no-ending-newline.pem \
 	test-key-only.pem \
-	test-key-only-decrypted.der
+	test-key-only-decrypted.der \
+	pkcs8-enc-key.pem \
+	pkcs8-noenc-key.pem \
+	pkcs8-decrypted.der
 
 all: all-am
 
diff --git a/libnm-util/tests/certs/pkcs8-decrypted.der b/libnm-util/tests/certs/pkcs8-decrypted.der
new file mode 100644
index 00000000..2cbdeb5e
Binary files /dev/null and b/libnm-util/tests/certs/pkcs8-decrypted.der differ
diff --git a/libnm-util/tests/certs/pkcs8-enc-key.pem b/libnm-util/tests/certs/pkcs8-enc-key.pem
new file mode 100644
index 00000000..0d08f2d2
--- /dev/null
+++ b/libnm-util/tests/certs/pkcs8-enc-key.pem
@@ -0,0 +1,29 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE6TAbBgkqhkiG9w0BBQMwDgQIwiGFT4Jz6RsCAggABIIEyJNMddDYofbhydUp
+J3VyrYIjv3LziJ7dkTXE3+mEYRCQrGLgljWBbib2JOLVCFt8melL6Yv1RcoVR7X7
+vrRqyycu0DumI4f5+Bf4wc234JNVhSaLYsw244fFtcnK2Gyn4IaVmWmrNvrwfX/w
+SKcVmO30D5C5PCKzv2bou5FmnJLKdDQV1t816cr9T8pTx7MHvBzSZXbh86334BhF
+T3zNwo8j2/+Gq2NBWUn+2GTTV8/r26aIwPcFi4QH6I2ghBwFmFHqU3/PoRm6nkmg
+CqJj2Dggy+8zE5qg0iId7lrio0OjCH+Qed6NGwIa2lgv/bhuJVP3FOk4gqamJWHi
+WMaq9McmS+03q2iokYeSQGbx85x+I90RTFZKhFx4dkerf6oTC/YoL4F++ff0e91v
+sOrQsBkgRhrRtFwa9OFCzbsknlixONdd+ITkyX490xz1wcZTDkKtMDRLIPWa2O0b
+MEq75jPYThZ5pF1vc5r+rqPafN7SfI+DDmhzJYEQNRoCWA4pH9Gwv0ayKnOgoj4K
+TuFhXvcyWzTnVXmcqEFyf3CRrB0Ti+Z61enupC+FCuYV5lGsx9kJaTumTk2UPD02
+9Ap3asDLozdEPSXBG3+oCM2s01/IJlxtR84C97r9rpmWTc9K6DCBScETe9KnIghW
+PU7XFogueG5Gwpe+x+IlTDq+qiyUNVX1uMGDcIaCC3VsoWqZrpnGGBhsovwBaXKt
+T9fT2nE27Fd6DRWso4fgos6PPx7RVveu17BTMVQeUq9L8GrV4JNrE3a9aoXdbUhc
+6gMiyAqxh/HEyciYoXsR9oVNi+VM0y8q3hL5nIcgDrCZr/c9aQ8+fuQBDXRrmrQd
+bR2iwNLCBnbmQmM/vM333VhJ4MSOKd3SGw/j41K+Nr3uP5KRZUwV+5yy3ef/hGxU
+i9JjCmSUt2bfWRUFlNaf1hCTYaKD0xnVr1SLFU4snIgh2qKawyqVc9EE2f+FcOM5
+0RtwQ3ku6FOk3cy6/xeKpResCHbWDS6nQaIKYyLukV+gm5MJIhOMkj2z4T1eXGUr
+Nu/L7Gz+ps7ct0lM8W82n5lzSEa5/l1eNGM0wtQoAwutFEZp7Nx/IBKK87jVttr6
+82UVJeRk7rO2Mpobfw2LbKwga4rsuLrx3UwVDBWdLx7dNIc1rGoAxhsc72+skFgF
+Uztwy4Yv1Uiji4T6v+mObPZD/HiIDL0vF02Pz08rNlgB0DgaTKrpql2FutIuQAdf
+AciffQIoh9VGERlJoWuunG/UTxg2XRl2m1vCDrgBMInax+PXCv7/5Vh21AQc3fWP
+uf4k6JSy46hYni7VTVKn6C/Di9z7oIrGl/jDkDsaenAbToyX9VWr3s7EBwnhTQ/I
+OQ9bkWCagHIQlwJbu4M4/VAbiR26NrcR0C3JXBlPlT0qvFFB8gKbJAQEXtwIFS2h
+m2fe0k6mQASMwdbJYXZ/wfsg5PPAWsKtny1aMvi0mTPSD5uRhIfEGEuR+AT4UbEW
+BkEIE0lgGly4P1SpunKDQQE6m/e7h8Nl4pi8SMSme3YoX5MJwCP/CNkLBDVenAZI
+oBrdoVox86SjwnUozVG192lcEAULlk+3ZGt6T9JXLBQl9hpNtyTC6SFh84R+5RoN
+AevNl1bDfO+Vci0uJw==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/libnm-util/tests/certs/pkcs8-noenc-key.pem b/libnm-util/tests/certs/pkcs8-noenc-key.pem
new file mode 100644
index 00000000..f73fb55a
--- /dev/null
+++ b/libnm-util/tests/certs/pkcs8-noenc-key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC80HGgFdlFIL2F
+W5rHQ99xOkMrWcZ7an9YurDebAE3M0UwqxM24+5mWbxc8FJ8yYugdMzuI5Nq77IA
+DwJpv9ZjMfnKC1VDMj3bmmMdPurfx8pLdLw/jhk3wBaYk6vMvh4z66Yvmb7valGq
+Pxh6CRTnekNGI9XA7me4JNBlisl0Qasn9g4pl9PiGJAruEamS4Pk6dSWbfw58bs7
+/Yo5ejyt/Mn1n0Q/r3Gv/lAS0qRvmrW6GE1rMtANMfuGRNlAln21TzNcJzykm+sp
+RWptxXEI0NY7u9+RP4M3C1mJxWir7AZDbtinpOZH6vF+92yMzgEYOLK/WZVdSPdW
+tROv9xtPAgMBAAECggEBAJAfp+vjYZJjuGaYEuAxjdhW+biYcWn5U7V9484TsSXa
+i+DnZOZMO8iCjMaAZuZ7zYmwPlE0dK12w29KBbSEy3eySRIRboa5TgBXq3pCcXRZ
+g6/vLlZw+AzXIiha6BODt3g4UwUYnWcQx79lJCDa18sNR1a9ucbn8+Har/wiYT3M
+JjTbUT6wR6rKEXchB58ZugYGhOTfugSDQg4U/dwEHPIaJ/wme++JUV5B/tjeGCG3
+F43o2Oos5vjfrDSpUKIYZn+2BdhP434jkwj22wQ2sy0ruU/kQx8nogMTRfP1v4GU
+9QmNXj/DB24K388ZxcDmcxBJxrGAJ0MohYFo28DqRBECgYEA6hyKEqe2UbJx/+B6
+8mYgHb+pS2j0M4jPl11q9MMLVxLnDY9xZ85IEyWHQEC0GavPSAois0oiDeGAm32c
+j6TFyV3/oPTmZSyV93/agWgnH9Xtc481pbNAb0GMfyotvRRE/+6ti9+Cl7oH9Qmm
+ldMk7Hn6sK9t2mUOW8idPjKqlqcCgYEAzne25BryLJoIinbRMZg9KTfxfgUE6EKc
+Tk5+9CFQn0/AItQJuKbIUyggYH4psWW5hWq6hFlmMYMR48FKv9ry7pZTB0djaoYD
+lN+wSuhzUYWXedkAjvPmekITmf6rbnPfwOZvsr8CGMEUekqJPnPLzsQy+Ea2y/fb
+QY4SHe7gExkCgYEAr+1scOJpZvFjK7ckjT3jipd6ADpJsORxo7zG4FImFnQU/6K4
+xRpGHWVJQyaccOIkrW04cGUYPDgmrjJx0ZwwKceijvEaphMgS1JgAHklVY4sl3ea
+CAAxPqoSi4lFv94Yj/9rmT4IZD6fNivfbJ20FKUBl37tXX4tkRmr2I64lOcCgYEA
+x3eqzrclrmdlxvfBZOuScwbkHP6WXhk0TwbQ6eRhsnfmxP8bITSoJoaGuRJKD2Oa
+l0WkSobgDwd0uhecsrvBpTS/pDGY32n3fdWZyNTHzEOHMyWtv23tBcJek5ERaBU0
+X3WBBiw4x1eKBBeMfjR6+xhbsbcHlQiw36V05UxJWMkCgYEAhtcYvrfU4K48IJTU
+qp03nvd+dMY3IUTdZNOCh8bswLKyn3aq3MfWF9Vp7kDAI3cfyMpSrAQnmg4nVcn6
+Gf3wakG8bpiSRbJnGN+iLm8JsD+3Vw9KzvKOOQVmpT7xt5Kupx1hWvLHQWvfYgOG
+qEtTM8/+LD7W3I7midJNt50CD8A=
+-----END PRIVATE KEY-----
diff --git a/libnm-util/tests/test-crypto.c b/libnm-util/tests/test-crypto.c
index 6cfb6ac2..57e39fca 100644
--- a/libnm-util/tests/test-crypto.c
+++ b/libnm-util/tests/test-crypto.c
@@ -238,6 +238,29 @@ test_is_pkcs12 (const char *path, gboolean expect_fail, const char *desc)
 	}
 }
 
+static void
+test_load_pkcs8 (const char *path,
+                 const char *password,
+                 gboolean expect_fail,
+                 const char *desc)
+{
+	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+	GError *error = NULL;
+
+	format = crypto_verify_private_key (path, password, &error);
+	if (expect_fail) {
+		ASSERT (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN, desc,
+		        "unexpected success reading PKCS#8 private key file "
+		        "'%s' with invalid password",
+		        path);
+	} else {
+		ASSERT (format == NM_CRYPTO_FILE_FORMAT_RAW_KEY, desc,
+			    "%s: unexpected PKCS#8 private key file format (expected %d, got "
+			    "%d): %d %s",
+			    path, NM_CRYPTO_FILE_FORMAT_RAW_KEY, format, error->code, error->message);
+	}
+}
+
 static void
 test_encrypt_private_key (const char *path,
                           const char *password,
@@ -316,6 +339,17 @@ int main (int argc, char **argv)
 		test_load_pkcs12 (argv[2], argv[3], FALSE, "pkcs12-private-key");
 		test_load_pkcs12 (argv[2], "blahblahblah", TRUE, "pkcs12-private-key-bad-password");
 		test_load_pkcs12_no_password (argv[2], "pkcs12-private-key-no-password");
+	} else if (!strcmp (argv[1], "--pkcs8")) {
+		ASSERT (argc == 4, "test-crypto",
+		        "wrong number of arguments (--pkcs8  )");
+
+		test_is_pkcs12 (argv[2], TRUE, "not-pkcs12");
+		test_load_pkcs8 (argv[2], argv[3], FALSE, "pkcs8-private-key");
+		/* Until gnutls and NSS grow support for all the ciphers that openssl
+		 * can use with PKCS#8, we can't actually verify the password.  So we
+		 * expect a bad password to work for the time being.
+		 */
+		test_load_pkcs8 (argv[2], "blahblahblah", FALSE, "pkcs8-private-key-bad-password");
 	} else {
 		ASSERT (argc > 2, "test-crypto", "unknown test type (not --cert, --key, or --p12)");
 	}
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index 1ce80622..87a50d67 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -195,6 +195,75 @@ test_setting_vpn_update_secrets (void)
 	g_object_unref (connection);
 }
 
+#define TO_DEL_NUM 50
+typedef struct {
+	NMSettingVPN *s_vpn;
+	char *to_del[TO_DEL_NUM];
+	guint called;
+} IterInfo;
+
+static void
+del_iter_func (const char *key, const char *value, gpointer user_data)
+{
+	IterInfo *info = user_data;
+	int i;
+
+	/* Record how many times this function gets called; it should get called
+	 * exactly as many times as there are keys in the hash table, regardless
+	 * of what keys we delete from the table.
+	 */
+	info->called++;
+
+	/* During the iteration, remove a bunch of stuff from the table */
+	if (info->called == 1) {
+		for (i = 0; i < TO_DEL_NUM; i++)
+			nm_setting_vpn_remove_data_item (info->s_vpn, info->to_del[i]);
+	}
+}
+
+static void
+test_setting_vpn_modify_during_foreach (void)
+{
+	NMSettingVPN *s_vpn;
+	IterInfo info;
+	char *key, *val;
+	int i, u = 0;
+
+	s_vpn = (NMSettingVPN *) nm_setting_vpn_new ();
+	g_assert (s_vpn);
+
+	for (i = 0; i < TO_DEL_NUM * 2; i++) {
+		key = g_strdup_printf ("adsfasdfadf%d", i);
+		val = g_strdup_printf ("42263236236awt%d", i);
+		nm_setting_vpn_add_data_item (s_vpn, key, val);
+
+		/* Cache some keys to delete */
+		if (i % 2)
+			info.to_del[u++] = g_strdup (key);
+
+		g_free (key);
+		g_free (val);
+	}
+
+	/* Iterate over current table keys */
+	info.s_vpn = s_vpn;
+	info.called = 0;
+	nm_setting_vpn_foreach_data_item (s_vpn, del_iter_func, &info);
+
+	/* Make sure all the things we removed during iteration are really gone */
+	for (i = 0; i < TO_DEL_NUM; i++) {
+		g_assert_cmpstr (nm_setting_vpn_get_data_item (s_vpn, info.to_del[i]), ==, NULL);
+		g_free (info.to_del[i]);
+	}
+
+	/* And make sure the foreach callback was called the same number of times
+	 * as there were keys in the table at the beginning of the foreach.
+	 */
+	g_assert_cmpint (info.called, ==, TO_DEL_NUM * 2);
+
+	g_object_unref (s_vpn);
+}
+
 #define OLD_DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID))
 #define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS))
 
@@ -354,6 +423,25 @@ test_setting_gsm_apn_bad_chars (void)
 	        "gsm-apn-bad-chars", "unexpectedly valid GSM setting");
 }
 
+static void
+test_setting_gsm_apn_underscore (void)
+{
+	NMSettingGsm *s_gsm;
+	GError *error = NULL;
+	gboolean success;
+
+	s_gsm = (NMSettingGsm *) nm_setting_gsm_new ();
+	g_assert (s_gsm);
+
+	g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#", NULL);
+
+	/* 65-character long */
+	g_object_set (s_gsm, NM_SETTING_GSM_APN, "foobar_baz", NULL);
+	success = nm_setting_verify (NM_SETTING (s_gsm), NULL, &error);
+	g_assert_no_error (error);
+	g_assert (success == TRUE);
+}
+
 static NMSettingWirelessSecurity *
 make_test_wsec_setting (const char *detail)
 {
@@ -1132,9 +1220,11 @@ int main (int argc, char **argv)
 	/* The tests */
 	test_setting_vpn_items ();
 	test_setting_vpn_update_secrets ();
+	test_setting_vpn_modify_during_foreach ();
 	test_setting_ip6_config_old_address_array ();
 	test_setting_gsm_apn_spaces ();
 	test_setting_gsm_apn_bad_chars ();
+	test_setting_gsm_apn_underscore ();
 	test_setting_to_hash_all ();
 	test_setting_to_hash_no_secrets ();
 	test_setting_to_hash_only_secrets ();
diff --git a/po/eo.po b/po/eo.po
index c099b86c..5ff1b9c1 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -6,109 +6,108 @@
 # Aisano < >, 2010.
 # Kim RIBEIRO < >, 2010.
 # Serge LEBLANC < >, 2010.
-# Kristjan SCHMIDT , 2010.
+# Michel MORONI < >, 2011.
+# Kristjan SCHMIDT , 2010, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: network-manager\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
-"product=NetworkManager&component=general\n"
-"POT-Creation-Date: 2010-12-10 15:25+0000\n"
-"PO-Revision-Date: 2010-12-11 10:32+0100\n"
+"product=NetworkManager&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-05-06 03:25+0000\n"
+"PO-Revision-Date: 2011-05-06 17:17+0200\n"
 "Last-Translator: Kristjan SCHMIDT \n"
 "Language-Team: Esperanto \n"
 "Language: eo\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-05-06 14:56+0000\n"
+"X-Generator: Launchpad (build 12981)\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"X-Launchpad-Export-Date: 2010-12-10 16:56+0000\n"
-"X-Generator: Launchpad (build Unknown)\n"
 
-#: ../cli/src/connections.c:60 ../cli/src/connections.c:76
-#: ../cli/src/devices.c:89 ../cli/src/devices.c:102 ../cli/src/devices.c:112
-#: ../cli/src/devices.c:122 ../cli/src/devices.c:135 ../cli/src/devices.c:146
-#: ../cli/src/devices.c:157 ../cli/src/devices.c:166 ../cli/src/devices.c:175
+#: ../cli/src/connections.c:64 ../cli/src/connections.c:78
+#: ../cli/src/devices.c:101 ../cli/src/devices.c:114 ../cli/src/devices.c:124
+#: ../cli/src/devices.c:134 ../cli/src/devices.c:148 ../cli/src/devices.c:162
+#: ../cli/src/devices.c:173 ../cli/src/devices.c:184 ../cli/src/devices.c:193
+#: ../cli/src/devices.c:202 ../cli/src/devices.c:224
 msgid "NAME"
 msgstr "NOMO"
 
 #. 0
-#: ../cli/src/connections.c:61 ../cli/src/connections.c:77
+#: ../cli/src/connections.c:65 ../cli/src/connections.c:79
 msgid "UUID"
 msgstr "UUID"
 
 #. 1
-#: ../cli/src/connections.c:62
+#: ../cli/src/connections.c:66
 msgid "DEVICES"
 msgstr "APARATOJ"
 
 #. 2
-#: ../cli/src/connections.c:63 ../cli/src/connections.c:79
-msgid "SCOPE"
-msgstr "AMPLEKSO"
-
-#. 3
-#: ../cli/src/connections.c:64
+#: ../cli/src/connections.c:67
 msgid "DEFAULT"
 msgstr "DEFAŬLTA"
 
-#. 4
-#: ../cli/src/connections.c:65
-msgid "DBUS-SERVICE"
-msgstr "DBUS-SERVO"
-
-#. 5
-#: ../cli/src/connections.c:66
+#. 3
+#: ../cli/src/connections.c:68
 msgid "SPEC-OBJECT"
 msgstr "SPEC-OBJEKTO"
 
-#. 6
-#: ../cli/src/connections.c:67
+#. 4
+#: ../cli/src/connections.c:69
 msgid "VPN"
 msgstr "VPN"
 
-#. 7
+#. 5
+#. 6
 #. 2
-#: ../cli/src/connections.c:68 ../cli/src/connections.c:84
-#: ../cli/src/devices.c:64
+#. 11
+#. 5
+#: ../cli/src/connections.c:70 ../cli/src/connections.c:85
+#: ../cli/src/devices.c:69 ../cli/src/devices.c:214 ../cli/src/devices.c:230
 msgid "DBUS-PATH"
 msgstr "DBUS-VOJO"
 
 #. 1
 #. 0
 #. 1
-#: ../cli/src/connections.c:78 ../cli/src/devices.c:62 ../cli/src/devices.c:91
+#. 2
+#: ../cli/src/connections.c:80 ../cli/src/devices.c:67
+#: ../cli/src/devices.c:103 ../cli/src/devices.c:227
 msgid "TYPE"
-msgstr "SPECO"
+msgstr "TIPO"
 
-#. 3
-#: ../cli/src/connections.c:80
+#. 2
+#: ../cli/src/connections.c:81
 msgid "TIMESTAMP"
 msgstr "TEMPINDIKO"
 
-#. 4
-#: ../cli/src/connections.c:81
+#. 3
+#: ../cli/src/connections.c:82
 msgid "TIMESTAMP-REAL"
 msgstr "REALA-TEMPINDIKO"
 
-#. 5
-#: ../cli/src/connections.c:82
+#. 4
+#: ../cli/src/connections.c:83
 msgid "AUTOCONNECT"
 msgstr "AŬTOMATA-KONEKTO"
 
-#. 6
-#: ../cli/src/connections.c:83
+#. 5
+#: ../cli/src/connections.c:84
 msgid "READONLY"
 msgstr "NUR-LEGI"
 
-#: ../cli/src/connections.c:160
+#: ../cli/src/connections.c:167
 #, c-format
 msgid ""
 "Usage: nmcli con { COMMAND | help }\n"
 "  COMMAND := { list | status | up | down }\n"
 "\n"
-"  list [id  | uuid  | system | user]\n"
+"  list [id  | uuid ]\n"
 "  status\n"
+"  up id  | uuid  [iface ] [ap ] [nsp ] [--"
+"nowait] [--timeout ]\n"
 "  up id  | uuid  [iface ] [ap ] [--nowait] [--timeout "
 "]\n"
 "  down id  | uuid \n"
@@ -116,543 +115,595 @@ msgstr ""
 "Uzo: nmcli con { KOMANDO | help }\n"
 "  KOMANDO := { list | status | up | down }\n"
 "\n"
-"  list [id  | uuid  | system | user]\n"
+"  list [id  | uuid ]\n"
 "  status\n"
+"  up id  | uuid  [iface ] [ap ] [nsp ] [--"
+"nowait] [--timeout ]\n"
 "  up id  | uuid  [iface ] [ap ] [--nowait] [--timeout "
 "]\n"
 "  down id  | uuid \n"
 
-#: ../cli/src/connections.c:200 ../cli/src/connections.c:541
+#: ../cli/src/connections.c:220 ../cli/src/connections.c:542
 #, c-format
 msgid "Error: 'con list': %s"
 msgstr "Eraro: 'con list': %s"
 
-#: ../cli/src/connections.c:202 ../cli/src/connections.c:543
+#: ../cli/src/connections.c:222 ../cli/src/connections.c:544
 #, c-format
 msgid "Error: 'con list': %s; allowed fields: %s"
 msgstr "Eraro: 'con list': %s; permesataj kampoj: %s"
 
-#: ../cli/src/connections.c:210
+#: ../cli/src/connections.c:230
 msgid "Connection details"
 msgstr "Konektodetaloj"
 
-#: ../cli/src/connections.c:385 ../cli/src/connections.c:606
-msgid "system"
-msgstr "sistemo"
-
-#: ../cli/src/connections.c:385 ../cli/src/connections.c:606
-msgid "user"
-msgstr "uzanto"
-
-#: ../cli/src/connections.c:387
+#: ../cli/src/connections.c:417
 msgid "never"
 msgstr "neniam"
 
 #. "CAPABILITIES"
 #. Print header
 #. "WIFI-PROPERTIES"
-#: ../cli/src/connections.c:388 ../cli/src/connections.c:389
-#: ../cli/src/connections.c:607 ../cli/src/connections.c:610
-#: ../cli/src/devices.c:433 ../cli/src/devices.c:558 ../cli/src/devices.c:584
-#: ../cli/src/devices.c:585 ../cli/src/devices.c:586 ../cli/src/devices.c:587
-#: ../cli/src/devices.c:588 ../cli/src/settings.c:508
-#: ../cli/src/settings.c:551 ../cli/src/settings.c:652
-#: ../cli/src/settings.c:926 ../cli/src/settings.c:927
-#: ../cli/src/settings.c:929 ../cli/src/settings.c:931
-#: ../cli/src/settings.c:1056 ../cli/src/settings.c:1057
-#: ../cli/src/settings.c:1058 ../cli/src/settings.c:1137
-#: ../cli/src/settings.c:1138 ../cli/src/settings.c:1139
-#: ../cli/src/settings.c:1140 ../cli/src/settings.c:1141
-#: ../cli/src/settings.c:1142 ../cli/src/settings.c:1143
-#: ../cli/src/settings.c:1144 ../cli/src/settings.c:1145
-#: ../cli/src/settings.c:1146 ../cli/src/settings.c:1147
-#: ../cli/src/settings.c:1148 ../cli/src/settings.c:1149
-#: ../cli/src/settings.c:1224
+#: ../cli/src/connections.c:418 ../cli/src/connections.c:419
+#: ../cli/src/connections.c:597 ../cli/src/connections.c:599
+#: ../cli/src/devices.c:509 ../cli/src/devices.c:562 ../cli/src/devices.c:687
+#: ../cli/src/devices.c:713 ../cli/src/devices.c:714 ../cli/src/devices.c:715
+#: ../cli/src/devices.c:716 ../cli/src/devices.c:717 ../cli/src/settings.c:520
+#: ../cli/src/settings.c:563 ../cli/src/settings.c:663
+#: ../cli/src/settings.c:937 ../cli/src/settings.c:938
+#: ../cli/src/settings.c:940 ../cli/src/settings.c:942
+#: ../cli/src/settings.c:1067 ../cli/src/settings.c:1068
+#: ../cli/src/settings.c:1069 ../cli/src/settings.c:1148
+#: ../cli/src/settings.c:1149 ../cli/src/settings.c:1150
+#: ../cli/src/settings.c:1151 ../cli/src/settings.c:1152
+#: ../cli/src/settings.c:1153 ../cli/src/settings.c:1154
+#: ../cli/src/settings.c:1155 ../cli/src/settings.c:1156
+#: ../cli/src/settings.c:1157 ../cli/src/settings.c:1158
+#: ../cli/src/settings.c:1159 ../cli/src/settings.c:1160
+#: ../cli/src/settings.c:1235
 msgid "yes"
 msgstr "jes"
 
-#: ../cli/src/connections.c:388 ../cli/src/connections.c:389
-#: ../cli/src/connections.c:607 ../cli/src/connections.c:610
-#: ../cli/src/devices.c:433 ../cli/src/devices.c:558 ../cli/src/devices.c:584
-#: ../cli/src/devices.c:585 ../cli/src/devices.c:586 ../cli/src/devices.c:587
-#: ../cli/src/devices.c:588 ../cli/src/settings.c:508
-#: ../cli/src/settings.c:510 ../cli/src/settings.c:551
-#: ../cli/src/settings.c:652 ../cli/src/settings.c:926
-#: ../cli/src/settings.c:927 ../cli/src/settings.c:929
-#: ../cli/src/settings.c:931 ../cli/src/settings.c:1056
-#: ../cli/src/settings.c:1057 ../cli/src/settings.c:1058
-#: ../cli/src/settings.c:1137 ../cli/src/settings.c:1138
-#: ../cli/src/settings.c:1139 ../cli/src/settings.c:1140
-#: ../cli/src/settings.c:1141 ../cli/src/settings.c:1142
-#: ../cli/src/settings.c:1143 ../cli/src/settings.c:1144
-#: ../cli/src/settings.c:1145 ../cli/src/settings.c:1146
-#: ../cli/src/settings.c:1147 ../cli/src/settings.c:1148
-#: ../cli/src/settings.c:1149 ../cli/src/settings.c:1224
+#: ../cli/src/connections.c:418 ../cli/src/connections.c:419
+#: ../cli/src/connections.c:597 ../cli/src/connections.c:599
+#: ../cli/src/devices.c:509 ../cli/src/devices.c:562 ../cli/src/devices.c:687
+#: ../cli/src/devices.c:713 ../cli/src/devices.c:714 ../cli/src/devices.c:715
+#: ../cli/src/devices.c:716 ../cli/src/devices.c:717 ../cli/src/settings.c:520
+#: ../cli/src/settings.c:522 ../cli/src/settings.c:563
+#: ../cli/src/settings.c:663 ../cli/src/settings.c:937
+#: ../cli/src/settings.c:938 ../cli/src/settings.c:940
+#: ../cli/src/settings.c:942 ../cli/src/settings.c:1067
+#: ../cli/src/settings.c:1068 ../cli/src/settings.c:1069
+#: ../cli/src/settings.c:1148 ../cli/src/settings.c:1149
+#: ../cli/src/settings.c:1150 ../cli/src/settings.c:1151
+#: ../cli/src/settings.c:1152 ../cli/src/settings.c:1153
+#: ../cli/src/settings.c:1154 ../cli/src/settings.c:1155
+#: ../cli/src/settings.c:1156 ../cli/src/settings.c:1157
+#: ../cli/src/settings.c:1158 ../cli/src/settings.c:1159
+#: ../cli/src/settings.c:1160 ../cli/src/settings.c:1235
 msgid "no"
 msgstr "ne"
 
-#: ../cli/src/connections.c:462 ../cli/src/connections.c:505
-msgid "System connections"
-msgstr "Sistemkonektoj"
-
-#: ../cli/src/connections.c:467 ../cli/src/connections.c:518
-msgid "User connections"
-msgstr "Uzanto-konektoj"
+#: ../cli/src/connections.c:493
+msgid "Connection list"
+msgstr "Konektolisto"
 
-#: ../cli/src/connections.c:479 ../cli/src/connections.c:1342
-#: ../cli/src/connections.c:1358 ../cli/src/connections.c:1367
-#: ../cli/src/connections.c:1378 ../cli/src/connections.c:1463
-#: ../cli/src/devices.c:964 ../cli/src/devices.c:974 ../cli/src/devices.c:1076
-#: ../cli/src/devices.c:1083
+#: ../cli/src/connections.c:506 ../cli/src/connections.c:1378
+#: ../cli/src/connections.c:1393 ../cli/src/connections.c:1402
+#: ../cli/src/connections.c:1412 ../cli/src/connections.c:1424
+#: ../cli/src/connections.c:1519 ../cli/src/devices.c:1190
+#: ../cli/src/devices.c:1200 ../cli/src/devices.c:1314
+#: ../cli/src/devices.c:1321 ../cli/src/devices.c:1534
+#: ../cli/src/devices.c:1541
 #, c-format
 msgid "Error: %s argument is missing."
 msgstr "Eraro: argumento %s mankas."
 
-#: ../cli/src/connections.c:492
+#: ../cli/src/connections.c:519
 #, c-format
 msgid "Error: %s - no such connection."
-msgstr "Eraro: %s - neniu tia konekto"
+msgstr "Eraro: %s - neniu tia konekto."
 
-#: ../cli/src/connections.c:524 ../cli/src/connections.c:1391
-#: ../cli/src/connections.c:1481 ../cli/src/devices.c:787
-#: ../cli/src/devices.c:854 ../cli/src/devices.c:988 ../cli/src/devices.c:1089
+#: ../cli/src/connections.c:525 ../cli/src/connections.c:1437
+#: ../cli/src/connections.c:1536 ../cli/src/devices.c:987
+#: ../cli/src/devices.c:1067 ../cli/src/devices.c:1214
+#: ../cli/src/devices.c:1327 ../cli/src/devices.c:1547
 #, c-format
 msgid "Unknown parameter: %s\n"
 msgstr "Nekonata parametro: %s\n"
 
-#: ../cli/src/connections.c:533
+#: ../cli/src/connections.c:534
 #, c-format
 msgid "Error: no valid parameter specified."
 msgstr "Eraro: neniu valida parametro difinita."
 
-#: ../cli/src/connections.c:548 ../cli/src/connections.c:1584
-#: ../cli/src/devices.c:1295 ../cli/src/network-manager.c:359
+#: ../cli/src/connections.c:549 ../cli/src/connections.c:1627
+#: ../cli/src/devices.c:1755 ../cli/src/network-manager.c:463
 #, c-format
 msgid "Error: %s."
 msgstr "Eraro: %s."
 
-#: ../cli/src/connections.c:655
+#: ../cli/src/connections.c:637
 #, c-format
 msgid "Error: 'con status': %s"
 msgstr "Eraro: 'con status': %s"
 
-#: ../cli/src/connections.c:657
+#: ../cli/src/connections.c:639
 #, c-format
 msgid "Error: 'con status': %s; allowed fields: %s"
 msgstr "Eraro: 'con status': %s; permesataj kampoj: %s"
 
-#: ../cli/src/connections.c:664
+#: ../cli/src/connections.c:647 ../cli/src/connections.c:1452
+#: ../cli/src/connections.c:1551 ../cli/src/devices.c:1014
+#: ../cli/src/devices.c:1076 ../cli/src/devices.c:1229
+#: ../cli/src/devices.c:1357 ../cli/src/devices.c:1576
+#, c-format
+msgid "Error: Can't find out if NetworkManager is running: %s."
+msgstr "Eraro: Ne povas scii ĉu NetworkManager rulas: %s."
+
+#: ../cli/src/connections.c:651 ../cli/src/connections.c:1456
+#: ../cli/src/connections.c:1555 ../cli/src/devices.c:1018
+#: ../cli/src/devices.c:1080 ../cli/src/devices.c:1233
+#: ../cli/src/devices.c:1361 ../cli/src/devices.c:1580
+#, c-format
+msgid "Error: NetworkManager is not running."
+msgstr "Eraro: NetworkManager ne rulas."
+
+#: ../cli/src/connections.c:659
 msgid "Active connections"
 msgstr "Aktivaj konektoj"
 
-#: ../cli/src/connections.c:1034
+#: ../cli/src/connections.c:1095
 #, c-format
 msgid "no active connection on device '%s'"
 msgstr "neniu aktiva konekto sur aparato '%s'"
 
-#: ../cli/src/connections.c:1042
+#: ../cli/src/connections.c:1103
 #, c-format
 msgid "no active connection or device"
 msgstr "neniu aktiva konekto aŭ aparato"
 
-#: ../cli/src/connections.c:1092
+#: ../cli/src/connections.c:1174
 #, c-format
 msgid "device '%s' not compatible with connection '%s'"
 msgstr "aparato '%s' ne kongruas kun konekto '%s'"
 
-#: ../cli/src/connections.c:1094
+#: ../cli/src/connections.c:1176
 #, c-format
 msgid "no device found for connection '%s'"
 msgstr "neniu aparato trovita por konekto '%s'"
 
-#: ../cli/src/connections.c:1105
+#: ../cli/src/connections.c:1187
 msgid "activating"
 msgstr "enŝaltas"
 
-#: ../cli/src/connections.c:1107
+#: ../cli/src/connections.c:1189
 msgid "activated"
 msgstr "enŝaltite"
 
-#: ../cli/src/connections.c:1110 ../cli/src/connections.c:1133
-#: ../cli/src/connections.c:1166 ../cli/src/devices.c:247
-#: ../cli/src/devices.c:559 ../cli/src/network-manager.c:94
-#: ../cli/src/network-manager.c:149 ../cli/src/settings.c:473
+#: ../cli/src/connections.c:1191 ../cli/src/devices.c:304
+msgid "deactivating"
+msgstr "malaktivigante"
+
+#: ../cli/src/connections.c:1194 ../cli/src/connections.c:1217
+#: ../cli/src/connections.c:1250 ../cli/src/devices.c:308
+#: ../cli/src/devices.c:688 ../cli/src/network-manager.c:118
+#: ../cli/src/network-manager.c:180 ../cli/src/network-manager.c:183
+#: ../cli/src/network-manager.c:192 ../cli/src/network-manager.c:298
+#: ../cli/src/network-manager.c:353 ../cli/src/network-manager.c:391
+#: ../cli/src/network-manager.c:430 ../cli/src/settings.c:485
+#: ../cli/src/utils.c:396
 msgid "unknown"
 msgstr "nekonate"
 
-#: ../cli/src/connections.c:1119
+#: ../cli/src/connections.c:1203
 msgid "VPN connecting (prepare)"
 msgstr "VPN konektas (preparo)"
 
-#: ../cli/src/connections.c:1121
+#: ../cli/src/connections.c:1205
 msgid "VPN connecting (need authentication)"
 msgstr "VPN konektas (bezonas aŭtentigon)"
 
-#: ../cli/src/connections.c:1123
+#: ../cli/src/connections.c:1207
 msgid "VPN connecting"
 msgstr "VPN konektas"
 
-#: ../cli/src/connections.c:1125
+#: ../cli/src/connections.c:1209
 msgid "VPN connecting (getting IP configuration)"
 msgstr "VPN konektas (akiras IP-agordaron)"
 
-#: ../cli/src/connections.c:1127
+#: ../cli/src/connections.c:1211
 msgid "VPN connected"
 msgstr "VPN konektita"
 
-#: ../cli/src/connections.c:1129
+#: ../cli/src/connections.c:1213
 msgid "VPN connection failed"
 msgstr "VPN-konekto fiaskis"
 
-#: ../cli/src/connections.c:1131
+#: ../cli/src/connections.c:1215
 msgid "VPN disconnected"
 msgstr "VPN malkonektis"
 
-#: ../cli/src/connections.c:1142
+#: ../cli/src/connections.c:1226
 msgid "unknown reason"
 msgstr "nekonata kialo"
 
-#: ../cli/src/connections.c:1144
+#: ../cli/src/connections.c:1228
 msgid "none"
-msgstr "nenio"
+msgstr "neniu"
 
-#: ../cli/src/connections.c:1146
+#: ../cli/src/connections.c:1230
 msgid "the user was disconnected"
-msgstr "la uzanto estis malkonektita"
+msgstr "la uzanto estis malkonektite"
 
-#: ../cli/src/connections.c:1148
+#: ../cli/src/connections.c:1232
 msgid "the base network connection was interrupted"
-msgstr "la baza retkonekto estis interrompita"
+msgstr "la baza retkonekto estis interrompite"
 
-#: ../cli/src/connections.c:1150
+#: ../cli/src/connections.c:1234
 msgid "the VPN service stopped unexpectedly"
 msgstr "la VPN-servo neatendite ĉesis"
 
-#: ../cli/src/connections.c:1152
+#: ../cli/src/connections.c:1236
 msgid "the VPN service returned invalid configuration"
 msgstr "la VPN-servo revenigis nevalidan agordaron"
 
-#: ../cli/src/connections.c:1154
+#: ../cli/src/connections.c:1238
 msgid "the connection attempt timed out"
 msgstr "la konektoprovo eltempiĝis"
 
-#: ../cli/src/connections.c:1156
+#: ../cli/src/connections.c:1240
 msgid "the VPN service did not start in time"
 msgstr "la VPN-servo ne startis ĝustatempe"
 
-#: ../cli/src/connections.c:1158
+#: ../cli/src/connections.c:1242
 msgid "the VPN service failed to start"
 msgstr "la VPN-servo fiaskis starti"
 
-#: ../cli/src/connections.c:1160
+#: ../cli/src/connections.c:1244
 msgid "no valid VPN secrets"
-msgstr "neniu valida VPN-sekreto"
+msgstr "neniu valida VPN-sekretoj"
 
-#: ../cli/src/connections.c:1162
+#: ../cli/src/connections.c:1246
 msgid "invalid VPN secrets"
 msgstr "nevalidaj VPN-sekretoj"
 
-#: ../cli/src/connections.c:1164
+#: ../cli/src/connections.c:1248
 msgid "the connection was removed"
 msgstr "la konekto estis forigita"
 
-#: ../cli/src/connections.c:1178
+#: ../cli/src/connections.c:1262
 #, c-format
 msgid "state: %s\n"
 msgstr "stato: %s\n"
 
-#: ../cli/src/connections.c:1181 ../cli/src/connections.c:1207
+#: ../cli/src/connections.c:1265 ../cli/src/connections.c:1291
 #, c-format
 msgid "Connection activated\n"
 msgstr "Konekto enŝaltita\n"
 
-#: ../cli/src/connections.c:1184
+#: ../cli/src/connections.c:1268
 #, c-format
 msgid "Error: Connection activation failed."
 msgstr "Eraro: Enŝalto de konekto fiaskis."
 
-#: ../cli/src/connections.c:1203
+#: ../cli/src/connections.c:1287
 #, c-format
 msgid "state: %s (%d)\n"
 msgstr "stato: %s (%d)\n"
 
-#: ../cli/src/connections.c:1213
+#: ../cli/src/connections.c:1297
 #, c-format
 msgid "Error: Connection activation failed: %s."
 msgstr "Eraro: Enŝalto de konekto fiaskis: %s."
 
-#: ../cli/src/connections.c:1230 ../cli/src/devices.c:911
+#: ../cli/src/connections.c:1314 ../cli/src/devices.c:1136
 #, c-format
 msgid "Error: Timeout %d sec expired."
 msgstr "Eraro: Eltempiĝo finiĝis %d sek."
 
-#: ../cli/src/connections.c:1273
+#: ../cli/src/connections.c:1327
 #, c-format
 msgid "Error: Connection activation failed: %s"
 msgstr "Eraro: Enŝalto de konekto fiaskis: %s"
 
-#: ../cli/src/connections.c:1287
-#, c-format
-msgid "Error: Obtaining active connection for '%s' failed."
-msgstr "Eraro: Akiro de aktiva konekto por '%s' fiaskis."
-
-#: ../cli/src/connections.c:1296
+#: ../cli/src/connections.c:1333
 #, c-format
 msgid "Active connection state: %s\n"
 msgstr "Stato de aktiva konekto: %s\n"
 
-#: ../cli/src/connections.c:1297
+#: ../cli/src/connections.c:1334
 #, c-format
 msgid "Active connection path: %s\n"
 msgstr "Vojo de aktiva konekto: %s\n"
 
-#: ../cli/src/connections.c:1351 ../cli/src/connections.c:1472
+#: ../cli/src/connections.c:1386 ../cli/src/connections.c:1527
 #, c-format
 msgid "Error: Unknown connection: %s."
 msgstr "Eraro: Nekonata konekto: %s."
 
-#: ../cli/src/connections.c:1386 ../cli/src/devices.c:982
+#: ../cli/src/connections.c:1432 ../cli/src/devices.c:1208
 #, c-format
 msgid "Error: timeout value '%s' is not valid."
 msgstr "Eraro: eltempiĝa valoro '%s' ne validas."
 
-#: ../cli/src/connections.c:1399 ../cli/src/connections.c:1489
+#: ../cli/src/connections.c:1445 ../cli/src/connections.c:1544
 #, c-format
 msgid "Error: id or uuid has to be specified."
-msgstr "Eraro: id aŭ uuid devas esti specifata."
+msgstr "Eraro: 'id' aŭ 'uuid' devas esti specifata."
 
-#: ../cli/src/connections.c:1419
+#: ../cli/src/connections.c:1473
 #, c-format
 msgid "Error: No suitable device found: %s."
 msgstr "Eraro: Trovis neniun taŭgan aparaton: %s."
 
-#: ../cli/src/connections.c:1421
+#: ../cli/src/connections.c:1475
 #, c-format
 msgid "Error: No suitable device found."
 msgstr "Eraro: Trovis neniun taŭgan aparaton."
 
-#: ../cli/src/connections.c:1516
+#: ../cli/src/connections.c:1580
 #, c-format
 msgid "Warning: Connection not active\n"
 msgstr "Atenton: Konekto ne aktivas\n"
 
-#: ../cli/src/connections.c:1573
+#: ../cli/src/connections.c:1618
 #, c-format
 msgid "Error: 'con' command '%s' is not valid."
 msgstr "Eraro: 'con'-komando '%s' ne validas."
 
-#: ../cli/src/connections.c:1609
+#: ../cli/src/connections.c:1683
 #, c-format
 msgid "Error: could not connect to D-Bus."
 msgstr "Eraro: ne povis konekti al D-Bus."
 
-#: ../cli/src/connections.c:1616
+#: ../cli/src/connections.c:1690
 #, c-format
 msgid "Error: Could not get system settings."
 msgstr "Eraro: Ne povis akiri sistemajn agordojn."
 
-#: ../cli/src/connections.c:1624
-#, c-format
-msgid "Error: Could not get user settings."
-msgstr "Eraro: Ne povis akiri uzanto-agordojn."
-
-#: ../cli/src/connections.c:1634
+#: ../cli/src/connections.c:1700
 #, c-format
-msgid "Error: Can't obtain connections: settings services are not running."
-msgstr "Eraro: Ne povas obteni konektojn: agordo-servoj ne aktivas."
+msgid "Error: Can't obtain connections: settings service is not running."
+msgstr "Eraro: Ne povas obteni konektojn: agordo-servo ne aktivas."
 
 #. 0
 #. 9
-#: ../cli/src/devices.c:61 ../cli/src/devices.c:90 ../cli/src/devices.c:185
+#. 3
+#: ../cli/src/devices.c:66 ../cli/src/devices.c:102 ../cli/src/devices.c:212
+#: ../cli/src/devices.c:228
 msgid "DEVICE"
 msgstr "APARATO"
 
 #. 1
 #. 4
-#. 0
-#: ../cli/src/devices.c:63 ../cli/src/devices.c:94
-#: ../cli/src/network-manager.c:36
+#. 1
+#: ../cli/src/devices.c:68 ../cli/src/devices.c:106
+#: ../cli/src/network-manager.c:39
 msgid "STATE"
 msgstr "STATO"
 
-#: ../cli/src/devices.c:73
+#: ../cli/src/devices.c:78
 msgid "GENERAL"
-msgstr "ĜENERALA"
+msgstr "ĜENERALE"
 
 #. 0
-#: ../cli/src/devices.c:74
+#: ../cli/src/devices.c:79
 msgid "CAPABILITIES"
 msgstr "KAPABLOJ"
 
 #. 1
-#: ../cli/src/devices.c:75
+#: ../cli/src/devices.c:80
 msgid "WIFI-PROPERTIES"
 msgstr "WIFI-ECOJ"
 
 #. 2
-#: ../cli/src/devices.c:76
+#: ../cli/src/devices.c:81
 msgid "AP"
 msgstr "AP"
 
 #. 3
-#: ../cli/src/devices.c:77
+#: ../cli/src/devices.c:82
 msgid "WIRED-PROPERTIES"
 msgstr "DRATA-ECOJ"
 
 #. 4
-#: ../cli/src/devices.c:78
+#: ../cli/src/devices.c:83
+msgid "WIMAX-PROPERTIES"
+msgstr "WIMAX-ECOJ"
+
+#. 5
+#. 0
+#: ../cli/src/devices.c:84 ../cli/src/devices.c:225
+msgid "NSP"
+msgstr ""
+
+#. 6
+#: ../cli/src/devices.c:85
 msgid "IP4-SETTINGS"
 msgstr "IP4-AGORDOJ"
 
-#. 5
-#: ../cli/src/devices.c:79
+#. 7
+#: ../cli/src/devices.c:86
 msgid "IP4-DNS"
 msgstr "IP4-DNS"
 
-#. 6
-#: ../cli/src/devices.c:80
+#. 8
+#: ../cli/src/devices.c:87
 msgid "IP6-SETTINGS"
 msgstr "IP6-AGORDOJ"
 
-#. 7
-#: ../cli/src/devices.c:81
+#. 9
+#: ../cli/src/devices.c:88
 msgid "IP6-DNS"
 msgstr "IP6-DNS"
 
 #. 2
-#: ../cli/src/devices.c:92
+#: ../cli/src/devices.c:104
 msgid "DRIVER"
 msgstr "PELILO"
 
 #. 3
-#: ../cli/src/devices.c:93
+#: ../cli/src/devices.c:105
 msgid "HWADDR"
 msgstr "APARATADRESO"
 
 #. 0
-#: ../cli/src/devices.c:103
+#: ../cli/src/devices.c:115
 msgid "CARRIER-DETECT"
 msgstr "PORTANTO-REKONO"
 
 #. 1
-#: ../cli/src/devices.c:104
+#: ../cli/src/devices.c:116
 msgid "SPEED"
 msgstr "RAPIDO"
 
 #. 0
-#: ../cli/src/devices.c:113
+#: ../cli/src/devices.c:125
 msgid "CARRIER"
 msgstr "PORTANTO"
 
 #. 0
-#: ../cli/src/devices.c:123
+#: ../cli/src/devices.c:135
 msgid "WEP"
 msgstr "WEP"
 
 #. 1
-#: ../cli/src/devices.c:124
+#: ../cli/src/devices.c:136
 msgid "WPA"
 msgstr "WPA"
 
 #. 2
-#: ../cli/src/devices.c:125
+#: ../cli/src/devices.c:137
 msgid "WPA2"
 msgstr "WPA2"
 
 #. 3
-#: ../cli/src/devices.c:126
+#: ../cli/src/devices.c:138
 msgid "TKIP"
 msgstr "TKIP"
 
 #. 4
-#: ../cli/src/devices.c:127
+#: ../cli/src/devices.c:139
 msgid "CCMP"
 msgstr "CCMP"
 
 #. 0
-#: ../cli/src/devices.c:136 ../cli/src/devices.c:147
+#: ../cli/src/devices.c:149
+msgid "CTR-FREQ"
+msgstr ""
+
+#. 1
+#: ../cli/src/devices.c:150
+msgid "RSSI"
+msgstr "RSSI"
+
+#. 2
+#: ../cli/src/devices.c:151
+msgid "CINR"
+msgstr "CINR"
+
+#. 3
+#: ../cli/src/devices.c:152
+msgid "TX-POW"
+msgstr ""
+
+#. 4
+#: ../cli/src/devices.c:153
+msgid "BSID"
+msgstr ""
+
+#. 0
+#: ../cli/src/devices.c:163 ../cli/src/devices.c:174
 msgid "ADDRESS"
 msgstr "ADRESO"
 
 #. 1
-#: ../cli/src/devices.c:137 ../cli/src/devices.c:148
+#: ../cli/src/devices.c:164 ../cli/src/devices.c:175
 msgid "PREFIX"
 msgstr "PREFIKSO"
 
 #. 2
-#: ../cli/src/devices.c:138 ../cli/src/devices.c:149
+#: ../cli/src/devices.c:165 ../cli/src/devices.c:176
 msgid "GATEWAY"
 msgstr "KLUZO"
 
 #. 0
-#: ../cli/src/devices.c:158 ../cli/src/devices.c:167
+#: ../cli/src/devices.c:185 ../cli/src/devices.c:194
 msgid "DNS"
 msgstr "DNS"
 
 #. 0
-#: ../cli/src/devices.c:176
+#: ../cli/src/devices.c:203
 msgid "SSID"
 msgstr "SSID"
 
 #. 1
-#: ../cli/src/devices.c:177
+#: ../cli/src/devices.c:204
 msgid "BSSID"
 msgstr "BSSID"
 
 #. 2
-#: ../cli/src/devices.c:178
+#: ../cli/src/devices.c:205
 msgid "MODE"
 msgstr "REĜIMO"
 
 #. 3
-#: ../cli/src/devices.c:179
+#: ../cli/src/devices.c:206
 msgid "FREQ"
 msgstr "FREKV"
 
 #. 4
-#: ../cli/src/devices.c:180
+#: ../cli/src/devices.c:207
 msgid "RATE"
 msgstr "TRANSMETRAPIDO"
 
 #. 5
-#: ../cli/src/devices.c:181
+#. 1
+#: ../cli/src/devices.c:208 ../cli/src/devices.c:226
 msgid "SIGNAL"
 msgstr "SIGNALO"
 
 #. 6
-#: ../cli/src/devices.c:182
+#: ../cli/src/devices.c:209
 msgid "SECURITY"
 msgstr "SEKURECO"
 
 #. 7
-#: ../cli/src/devices.c:183
+#: ../cli/src/devices.c:210
 msgid "WPA-FLAGS"
 msgstr "WPA-FLAGOJ"
 
 #. 8
-#: ../cli/src/devices.c:184
+#: ../cli/src/devices.c:211
 msgid "RSN-FLAGS"
 msgstr "RSN-FLAGOJ"
 
 #. 10
-#: ../cli/src/devices.c:186
+#. 4
+#: ../cli/src/devices.c:213 ../cli/src/devices.c:229
 msgid "ACTIVE"
-msgstr "AKTIVA"
+msgstr "AKTIVE"
 
-#: ../cli/src/devices.c:209
+#: ../cli/src/devices.c:256
 #, c-format
 msgid ""
 "Usage: nmcli dev { COMMAND | help }\n"
 "\n"
+"  COMMAND := { status | list | disconnect | wifi | wimax }\n"
+"\n"
 "  COMMAND := { status | list | disconnect | wifi }\n"
 "\n"
 "  status\n"
 "  list [iface ]\n"
 "  disconnect iface  [--nowait] [--timeout ]\n"
 "  wifi [list [iface ] [hwaddr ]]\n"
+"  wimax [list [iface ] [nsp ]]\n"
 "\n"
 msgstr ""
-"Usage: nmcli dev { KOMANDO | help }\n"
+"Uzo: nmcli dev { KOMANDO | help }\n"
+"\n"
+"  KOMANDO := { status | list | disconnect | wifi | wimax }\n"
 "\n"
 "  KOMANDO := { status | list | disconnect | wifi }\n"
 "\n"
@@ -660,245 +711,314 @@ msgstr ""
 "  list [iface ]\n"
 "  disconnect iface  [--nowait] [--timeout ]\n"
 "  wifi [list [iface ] [hwaddr ]]\n"
+"  wimax [list [iface ] [nsp ]]\n"
 "\n"
 
-#: ../cli/src/devices.c:229
+#: ../cli/src/devices.c:284
 msgid "unmanaged"
-msgstr "nemastrumata"
+msgstr "nemastrumate"
 
-#: ../cli/src/devices.c:231
+#: ../cli/src/devices.c:286
 msgid "unavailable"
-msgstr "neatingebla"
+msgstr "neatingeble"
 
-#: ../cli/src/devices.c:233 ../cli/src/network-manager.c:91
+#: ../cli/src/devices.c:288 ../cli/src/network-manager.c:115
 msgid "disconnected"
 msgstr "nekonektite"
 
-#: ../cli/src/devices.c:235
+#: ../cli/src/devices.c:290
 msgid "connecting (prepare)"
 msgstr "konektas (preparo)"
 
-#: ../cli/src/devices.c:237
+#: ../cli/src/devices.c:292
 msgid "connecting (configuring)"
 msgstr "konektas (agordado)"
 
-#: ../cli/src/devices.c:239
+#: ../cli/src/devices.c:294
 msgid "connecting (need authentication)"
 msgstr "konektas (bezonas aŭtentigon)"
 
-#: ../cli/src/devices.c:241
+#: ../cli/src/devices.c:296
 msgid "connecting (getting IP configuration)"
 msgstr "konektas (akiras IP-agordaron)"
 
-#: ../cli/src/devices.c:243 ../cli/src/network-manager.c:89
+#: ../cli/src/devices.c:298
+msgid "connecting (checking IP connectivity)"
+msgstr ""
+
+#: ../cli/src/devices.c:300
+msgid "connecting (starting secondary connections)"
+msgstr ""
+
+#: ../cli/src/devices.c:302 ../cli/src/network-manager.c:111
 msgid "connected"
-msgstr "konektita"
+msgstr "konektite"
 
-#: ../cli/src/devices.c:245
+#: ../cli/src/devices.c:306
 msgid "connection failed"
 msgstr "konekto fiaskis"
 
-#: ../cli/src/devices.c:268 ../cli/src/devices.c:425
+#: ../cli/src/devices.c:331 ../cli/src/devices.c:341 ../cli/src/devices.c:501
+#: ../cli/src/devices.c:545
 msgid "Unknown"
-msgstr "Nekonata"
+msgstr "Nekonate"
 
-#: ../cli/src/devices.c:300
+#: ../cli/src/devices.c:374
 msgid "(none)"
-msgstr "(nenio)"
+msgstr "(neniu)"
 
-#: ../cli/src/devices.c:325
+#: ../cli/src/devices.c:399
 #, c-format
 msgid "%s: error converting IP4 address 0x%X"
 msgstr "%s: eraro dum konverto de IP4-adreso 0x%X"
 
-#: ../cli/src/devices.c:394
+#: ../cli/src/devices.c:470
 #, c-format
 msgid "%u MHz"
 msgstr "%u MHz"
 
-#: ../cli/src/devices.c:395
+#: ../cli/src/devices.c:471
 #, c-format
 msgid "%u MB/s"
 msgstr "%u MB/s"
 
-#: ../cli/src/devices.c:404
+#: ../cli/src/devices.c:480
 msgid "Encrypted: "
-msgstr "Ĉifrita: "
+msgstr "Ĉifrite: "
 
-#: ../cli/src/devices.c:409
+#: ../cli/src/devices.c:485
 msgid "WEP "
 msgstr "WEP "
 
-#: ../cli/src/devices.c:411
+#: ../cli/src/devices.c:487
 msgid "WPA "
 msgstr "WPA "
 
-#: ../cli/src/devices.c:413
+#: ../cli/src/devices.c:489
 msgid "WPA2 "
 msgstr "WPA2 "
 
-#: ../cli/src/devices.c:416
+#: ../cli/src/devices.c:492
 msgid "Enterprise "
 msgstr "Entrepreno "
 
-#: ../cli/src/devices.c:425
+#: ../cli/src/devices.c:501
 msgid "Ad-Hoc"
 msgstr "Laŭcela"
 
-#: ../cli/src/devices.c:425
+#: ../cli/src/devices.c:501
 msgid "Infrastructure"
 msgstr "Infrastrukturo"
 
-#: ../cli/src/devices.c:487
+#: ../cli/src/devices.c:536
+msgid "Home"
+msgstr "Hejmo"
+
+#: ../cli/src/devices.c:539
+msgid "Partner"
+msgstr "Partnero"
+
+#: ../cli/src/devices.c:542
+msgid "Roaming"
+msgstr ""
+
+#: ../cli/src/devices.c:612
 #, c-format
 msgid "Error: 'dev list': %s"
 msgstr "Eraro: 'dev list': %s"
 
-#: ../cli/src/devices.c:489
+#: ../cli/src/devices.c:614
 #, c-format
 msgid "Error: 'dev list': %s; allowed fields: %s"
 msgstr "Eraro: 'dev list': %s; permesataj kampoj: %s"
 
-#: ../cli/src/devices.c:498
+#: ../cli/src/devices.c:623
 msgid "Device details"
 msgstr "Detaloj de aparato"
 
-#: ../cli/src/devices.c:528 ../cli/src/devices.c:927
+#: ../cli/src/devices.c:657 ../cli/src/devices.c:1152 ../cli/src/utils.c:342
 msgid "(unknown)"
-msgstr "(nekonata)"
+msgstr "(nekonate)"
 
-#: ../cli/src/devices.c:529
+#: ../cli/src/devices.c:658
 msgid "unknown)"
-msgstr "nekonata)"
+msgstr "nekonate)"
 
-#: ../cli/src/devices.c:555
+#: ../cli/src/devices.c:684
 #, c-format
 msgid "%u Mb/s"
 msgstr "%u Mb/s"
 
 #. Print header
 #. "WIRED-PROPERTIES"
-#: ../cli/src/devices.c:628
+#: ../cli/src/devices.c:757
 msgid "on"
 msgstr "enŝaltite"
 
-#: ../cli/src/devices.c:628
+#: ../cli/src/devices.c:757
 msgid "off"
 msgstr "elŝaltite"
 
-#: ../cli/src/devices.c:810
+#: ../cli/src/devices.c:1004
 #, c-format
 msgid "Error: 'dev status': %s"
 msgstr "Eraro: 'dev status': %s"
 
-#: ../cli/src/devices.c:812
+#: ../cli/src/devices.c:1006
 #, c-format
 msgid "Error: 'dev status': %s; allowed fields: %s"
 msgstr "Eraro: 'dev status': %s; permesataj kampoj: %s"
 
-#: ../cli/src/devices.c:819
+#: ../cli/src/devices.c:1029
 msgid "Status of devices"
 msgstr "Stato de aparatoj"
 
-#: ../cli/src/devices.c:847
+#: ../cli/src/devices.c:1060
 #, c-format
 msgid "Error: '%s' argument is missing."
 msgstr "Eraro: argumento '%s' mankas."
 
-#: ../cli/src/devices.c:876 ../cli/src/devices.c:1015
-#: ../cli/src/devices.c:1138
+#: ../cli/src/devices.c:1101 ../cli/src/devices.c:1253
+#: ../cli/src/devices.c:1389 ../cli/src/devices.c:1608
 #, c-format
 msgid "Error: Device '%s' not found."
 msgstr "Eraro: Aparato '%s' ne trovita."
 
-#: ../cli/src/devices.c:899
+#: ../cli/src/devices.c:1124
 #, c-format
 msgid "Success: Device '%s' successfully disconnected."
 msgstr "Sukceso: Aparato '%s' sukcese malkonektiĝis."
 
-#: ../cli/src/devices.c:924
+#: ../cli/src/devices.c:1149
 #, c-format
 msgid "Error: Device '%s' (%s) disconnecting failed: %s"
 msgstr "Eraro: Aparato '%s' (%s) eraro dum malkonektiĝo: %s"
 
-#: ../cli/src/devices.c:932
+#: ../cli/src/devices.c:1157
 #, c-format
 msgid "Device state: %d (%s)\n"
 msgstr "Stato de aparato: %d (%s)\n"
 
-#: ../cli/src/devices.c:996
+#: ../cli/src/devices.c:1222
 #, c-format
 msgid "Error: iface has to be specified."
 msgstr "Eraro: 'iface' devas esti specifata."
 
-#: ../cli/src/devices.c:1114
+#: ../cli/src/devices.c:1347
 #, c-format
 msgid "Error: 'dev wifi': %s"
 msgstr "Eraro: 'dev wifi': %s"
 
-#: ../cli/src/devices.c:1116
+#: ../cli/src/devices.c:1349
 #, c-format
 msgid "Error: 'dev wifi': %s; allowed fields: %s"
 msgstr "Eraro: 'dev wifi': %s; permesataj kampoj: %s"
 
-#: ../cli/src/devices.c:1123
+#: ../cli/src/devices.c:1372
 msgid "WiFi scan list"
 msgstr "WiFi-skanlisto"
 
-#: ../cli/src/devices.c:1158 ../cli/src/devices.c:1212
+#: ../cli/src/devices.c:1409 ../cli/src/devices.c:1463
+#: ../cli/src/devices.c:1670
 #, c-format
 msgid "Error: Access point with hwaddr '%s' not found."
 msgstr "Eraro: Retkaptejo kun 'hwaddr' '%s' ne trovita"
 
-#: ../cli/src/devices.c:1175
+#: ../cli/src/devices.c:1426
 #, c-format
 msgid "Error: Device '%s' is not a WiFi device."
 msgstr "Eraro: Aparato '%s' ne estas WiFi-aparato."
 
-#: ../cli/src/devices.c:1239
+#: ../cli/src/devices.c:1490
 #, c-format
 msgid "Error: 'dev wifi' command '%s' is not valid."
 msgstr "Eraro: 'dev wifi'-komando '%s' ne validas."
 
-#: ../cli/src/devices.c:1286
+#: ../cli/src/devices.c:1566
+#, c-format
+msgid "Error: 'dev wimax': %s"
+msgstr "Eraro: 'dev wimax': %s"
+
+#: ../cli/src/devices.c:1568
+#, c-format
+msgid "Error: 'dev wimax': %s; allowed fields: %s"
+msgstr "Eraro: 'dev wimax': %s; permesataj kampoj: %s"
+
+#: ../cli/src/devices.c:1591
+msgid "WiMAX NSP list"
+msgstr ""
+
+#: ../cli/src/devices.c:1628
+#, c-format
+msgid "Error: NSP with name '%s' not found."
+msgstr ""
+
+#: ../cli/src/devices.c:1639
+#, c-format
+msgid "Error: Device '%s' is not a WiMAX device."
+msgstr "Eraro: Aparato '%s' ne estas WiMAX-aparato."
+
+#: ../cli/src/devices.c:1697
+#, c-format
+msgid "Error: 'dev wimax' command '%s' is not valid."
+msgstr "Eraro: 'dev wimax'-komando '%s' ne validas."
+
+#: ../cli/src/devices.c:1747
 #, c-format
 msgid "Error: 'dev' command '%s' is not valid."
 msgstr "Eraro: 'dev'-komando '%s' ne validas."
 
-#: ../cli/src/network-manager.c:35
+#: ../cli/src/network-manager.c:37
 msgid "RUNNING"
-msgstr "AKTIVA"
+msgstr "AKTIVE"
 
-#. 1
-#: ../cli/src/network-manager.c:37
+#. 0
+#: ../cli/src/network-manager.c:38
+msgid "VERSION"
+msgstr "VERSIO"
+
+#. 2
+#: ../cli/src/network-manager.c:40
 msgid "NET-ENABLED"
 msgstr "RET-ENŜALTITE"
 
-#. 2
-#: ../cli/src/network-manager.c:38
+#. 3
+#: ../cli/src/network-manager.c:41
 msgid "WIFI-HARDWARE"
 msgstr "WIFI-APARATARO"
 
-#. 3
-#: ../cli/src/network-manager.c:39
+#. 4
+#: ../cli/src/network-manager.c:42
 msgid "WIFI"
 msgstr "WIFI"
 
-#. 4
-#: ../cli/src/network-manager.c:40
+#. 5
+#: ../cli/src/network-manager.c:43
 msgid "WWAN-HARDWARE"
 msgstr "WWAN-APARATARO"
 
-#. 5
-#: ../cli/src/network-manager.c:41
+#. 6
+#: ../cli/src/network-manager.c:44
 msgid "WWAN"
 msgstr "WWAN"
 
-#: ../cli/src/network-manager.c:64
+#. 7
+#: ../cli/src/network-manager.c:45
+msgid "WIMAX-HARDWARE"
+msgstr "WIMAX-APARATARO"
+
+#. 8
+#: ../cli/src/network-manager.c:46
+msgid "WIMAX"
+msgstr "WIMAX"
+
+#: ../cli/src/network-manager.c:74
 #, c-format
 msgid ""
 "Usage: nmcli nm { COMMAND | help }\n"
 "\n"
+"  COMMAND := { status | enable | sleep | wifi | wwan | wimax }\n"
+"\n"
 "  COMMAND := { status | enable | sleep | wifi | wwan }\n"
 "\n"
 "  status\n"
@@ -906,10 +1026,13 @@ msgid ""
 "  sleep [true|false]\n"
 "  wifi [on|off]\n"
 "  wwan [on|off]\n"
+"  wimax [on|off]\n"
 "\n"
 msgstr ""
 "Uzo: nmcli nm { KOMANDO | help }\n"
 "\n"
+"  KOMANDO := { status | enable | sleep | wifi | wwan | wimax }\n"
+"\n"
 "  KOMANDO := { status | enable | sleep | wifi | wwan }\n"
 "\n"
 "  status\n"
@@ -917,118 +1040,145 @@ msgstr ""
 "  sleep [true|false]\n"
 "  wifi [on|off]\n"
 "  wwan [on|off]\n"
+"  wimax [on|off]\n"
 "\n"
 
-#: ../cli/src/network-manager.c:85
+#: ../cli/src/network-manager.c:103
 msgid "asleep"
 msgstr "dormas"
 
-#: ../cli/src/network-manager.c:87
+#: ../cli/src/network-manager.c:105
 msgid "connecting"
 msgstr "konektas"
 
-#: ../cli/src/network-manager.c:128
+#: ../cli/src/network-manager.c:107
+msgid "connected (local only)"
+msgstr ""
+
+#: ../cli/src/network-manager.c:109
+msgid "connected (site only)"
+msgstr ""
+
+#: ../cli/src/network-manager.c:113
+msgid "disconnecting"
+msgstr "malkonektante"
+
+#: ../cli/src/network-manager.c:153
 #, c-format
 msgid "Error: 'nm status': %s"
 msgstr "Eraro: 'nm status': %s"
 
-#: ../cli/src/network-manager.c:130
+#: ../cli/src/network-manager.c:155
 #, c-format
 msgid "Error: 'nm status': %s; allowed fields: %s"
 msgstr "Eraro: 'nm status': %s; permesataj kampoj: %s"
 
-#: ../cli/src/network-manager.c:137
-msgid "NetworkManager status"
-msgstr "Stato de NetworkManager"
-
-#. Print header
-#: ../cli/src/network-manager.c:144 ../cli/src/network-manager.c:145
-#: ../cli/src/network-manager.c:146 ../cli/src/network-manager.c:147
-#: ../cli/src/network-manager.c:154 ../cli/src/network-manager.c:247
-#: ../cli/src/network-manager.c:296 ../cli/src/network-manager.c:328
+#. create NMClient
+#: ../cli/src/network-manager.c:168 ../cli/src/network-manager.c:169
+#: ../cli/src/network-manager.c:170 ../cli/src/network-manager.c:171
+#: ../cli/src/network-manager.c:172 ../cli/src/network-manager.c:174
+#: ../cli/src/network-manager.c:175 ../cli/src/network-manager.c:296
+#: ../cli/src/network-manager.c:351 ../cli/src/network-manager.c:389
+#: ../cli/src/network-manager.c:428
 msgid "enabled"
-msgstr "enŝaltita"
+msgstr "enŝaltite"
 
-#: ../cli/src/network-manager.c:144 ../cli/src/network-manager.c:145
-#: ../cli/src/network-manager.c:146 ../cli/src/network-manager.c:147
-#: ../cli/src/network-manager.c:154 ../cli/src/network-manager.c:247
-#: ../cli/src/network-manager.c:296 ../cli/src/network-manager.c:328
+#: ../cli/src/network-manager.c:168 ../cli/src/network-manager.c:169
+#: ../cli/src/network-manager.c:170 ../cli/src/network-manager.c:171
+#: ../cli/src/network-manager.c:172 ../cli/src/network-manager.c:174
+#: ../cli/src/network-manager.c:175 ../cli/src/network-manager.c:296
+#: ../cli/src/network-manager.c:351 ../cli/src/network-manager.c:389
+#: ../cli/src/network-manager.c:428
 msgid "disabled"
 msgstr "elŝaltite"
 
-#: ../cli/src/network-manager.c:152
+#: ../cli/src/network-manager.c:188
+msgid "NetworkManager status"
+msgstr "Stato de NetworkManager"
+
+#. Print header
+#: ../cli/src/network-manager.c:191
 msgid "running"
-msgstr "aktiva"
+msgstr "aktive"
 
-#: ../cli/src/network-manager.c:152
+#: ../cli/src/network-manager.c:191
 msgid "not running"
-msgstr "neaktiva"
+msgstr "neaktive"
 
-#: ../cli/src/network-manager.c:175
+#: ../cli/src/network-manager.c:222 ../cli/src/utils.c:322
 #, c-format
 msgid "Error: Couldn't connect to system bus: %s"
 msgstr "Eraro: Ne povis konekti al sistem-buso: %s."
 
-#: ../cli/src/network-manager.c:186
+#: ../cli/src/network-manager.c:233
 #, c-format
 msgid "Error: Couldn't create D-Bus object proxy."
 msgstr "Eraro: Ne povis krei D-busan objekt-prokurservilon."
 
-#: ../cli/src/network-manager.c:192
+#: ../cli/src/network-manager.c:239
 #, c-format
 msgid "Error in sleep: %s"
 msgstr "Eraro dum dormo: %s"
 
-#: ../cli/src/network-manager.c:237 ../cli/src/network-manager.c:286
-#: ../cli/src/network-manager.c:318
+#: ../cli/src/network-manager.c:283 ../cli/src/network-manager.c:338
+#: ../cli/src/network-manager.c:376 ../cli/src/network-manager.c:415
 #, c-format
 msgid "Error: '--fields' value '%s' is not valid here; allowed fields: %s"
 msgstr "Eraro: valoro '--fields' '%s' ne validas tie ĉi; permesataj kampoj: %s"
 
-#: ../cli/src/network-manager.c:245
+#: ../cli/src/network-manager.c:291
 msgid "Networking enabled"
 msgstr "Retkonektado enŝaltita"
 
-#: ../cli/src/network-manager.c:256
+#: ../cli/src/network-manager.c:307
 #, c-format
 msgid "Error: invalid 'enable' parameter: '%s'; use 'true' or 'false'."
 msgstr "Eraro: nevalida 'enŝalt'-parametro: '%s'; uzu 'true' aŭ 'false'."
 
-#: ../cli/src/network-manager.c:265
+#: ../cli/src/network-manager.c:317
 #, c-format
 msgid "Error: Sleeping status is not exported by NetworkManager."
 msgstr "Eraro: Dorm-stato ne estas elportite de NetworkManager."
 
-#: ../cli/src/network-manager.c:273
+#: ../cli/src/network-manager.c:325
 #, c-format
 msgid "Error: invalid 'sleep' parameter: '%s'; use 'true' or 'false'."
 msgstr "Eraro: nevalida 'dorm'-parametro: '%s'; uzu 'true' aŭ 'false'."
 
-#: ../cli/src/network-manager.c:294
+#: ../cli/src/network-manager.c:346
 msgid "WiFi enabled"
 msgstr "WiFi enŝaltita"
 
-#: ../cli/src/network-manager.c:305
+#: ../cli/src/network-manager.c:362
 #, c-format
 msgid "Error: invalid 'wifi' parameter: '%s'."
 msgstr "Eraro: nevalida 'wifi'-parametro: '%s'."
 
-#: ../cli/src/network-manager.c:326
+#: ../cli/src/network-manager.c:384
 msgid "WWAN enabled"
 msgstr "WWAN enŝaltita"
 
-#: ../cli/src/network-manager.c:337
+#: ../cli/src/network-manager.c:400
 #, c-format
 msgid "Error: invalid 'wwan' parameter: '%s'."
 msgstr "Eraro: nevalida 'wwan'-parametro: '%s'."
 
-#: ../cli/src/network-manager.c:348
+#: ../cli/src/network-manager.c:423
+msgid "WiMAX enabled"
+msgstr "WiMAX enŝaltita"
+
+#: ../cli/src/network-manager.c:439
+#, c-format
+msgid "Error: invalid 'wimax' parameter: '%s'."
+msgstr "Eraro: nevalida 'wimax'-parametro: '%s'."
+
+#: ../cli/src/network-manager.c:452
 #, c-format
 msgid "Error: 'nm' command '%s' is not valid."
 msgstr "Eraro: 'nm'-komando '%s' ne validas."
 
-#: ../cli/src/nmcli.c:69
-#, c-format
+#: ../cli/src/nmcli.c:64
+#, fuzzy, c-format
 msgid ""
 "Usage: %s [OPTIONS] OBJECT { COMMAND | help }\n"
 "\n"
@@ -1039,6 +1189,8 @@ msgid ""
 "  -f[ields] |all|common   specify fields to output\n"
 "  -e[scape] yes|no                           escape columns separators in "
 "values\n"
+"  -n[ocheck]                                 don't check nmcli and "
+"NetworkManager versions\n"
 "  -v[ersion]                                 show program version\n"
 "  -h[elp]                                    print this help\n"
 "\n"
@@ -1053,12 +1205,12 @@ msgstr ""
 "OPCIOJ\n"
 "  -t[erse]                                  konciza eligo\n"
 "  -p[retty]                                 bela eligo\n"
-"  -m[ode]                                   tabular|multiline eliga reĝimo\n"
+"|multiline eliga reĝimo\n"
 "  -f[ields] |all|common  specifigi eligo-kampojn\n"
 "  -e[scape] yes|no                          eskapaj kolumno-separoj en "
 "valoroj\n"
 "  -v[ersion]                                montri programversion\n"
-"  -h[elp]                                   printi tiun ĉi help-paĝon\n"
+"  -h[elp]                                   montri tiun ĉi help-paĝon\n"
 "\n"
 "OBJEKTO\n"
 "  nm   stato de NetworkManager\n"
@@ -1066,371 +1218,394 @@ msgstr ""
 "  dev  aparatoj mastrumataj de NetworkManager\n"
 "\n"
 
-#: ../cli/src/nmcli.c:113
+#: ../cli/src/nmcli.c:109
 #, c-format
 msgid "Error: Object '%s' is unknown, try 'nmcli help'."
 msgstr "Eraro: Objekto '%s' estas nekonata, provu: 'nmcli help'."
 
-#: ../cli/src/nmcli.c:143
+#: ../cli/src/nmcli.c:139
 #, c-format
 msgid "Error: Option '--terse' is specified the second time."
 msgstr "Eraro: Opcio '--terse' specifiĝis duan fojon."
 
-#: ../cli/src/nmcli.c:148
+#: ../cli/src/nmcli.c:144
 #, c-format
 msgid "Error: Option '--terse' is mutually exclusive with '--pretty'."
 msgstr "Eraro: Opcioj '--terse' kaj '--pretty' ekskludas unu la alian."
 
-#: ../cli/src/nmcli.c:156
+#: ../cli/src/nmcli.c:152
 #, c-format
 msgid "Error: Option '--pretty' is specified the second time."
 msgstr "Eraro: Opcio '--pretty' specifiĝis duan fojon."
 
-#: ../cli/src/nmcli.c:161
+#: ../cli/src/nmcli.c:157
 #, c-format
 msgid "Error: Option '--pretty' is mutually exclusive with '--terse'."
 msgstr "Eraro: Opcioj '--pretty' kaj '--terse' ekskludas unu la alian."
 
-#: ../cli/src/nmcli.c:171 ../cli/src/nmcli.c:187
+#: ../cli/src/nmcli.c:167 ../cli/src/nmcli.c:183
 #, c-format
 msgid "Error: missing argument for '%s' option."
-msgstr "Eraro: mankas argumento por elektindaĵo '%s'."
+msgstr "Eraro: mankas argumento por la opcio '%s'."
 
-#: ../cli/src/nmcli.c:180 ../cli/src/nmcli.c:196
+#: ../cli/src/nmcli.c:176 ../cli/src/nmcli.c:192
 #, c-format
 msgid "Error: '%s' is not valid argument for '%s' option."
-msgstr "Eraro: '%s' ne estas valida argumento por elektindaĵo '%s'."
+msgstr "Eraro: '%s' ne estas valida argumento por la opcio '%s'."
 
-#: ../cli/src/nmcli.c:203
+#: ../cli/src/nmcli.c:199
 #, c-format
 msgid "Error: fields for '%s' options are missing."
-msgstr "Eraro: kampoj por elektindaĵoj '%s' mankas."
+msgstr "Eraro: kampoj por la opcio '%s' mankas."
 
-#: ../cli/src/nmcli.c:209
+#: ../cli/src/nmcli.c:207
 #, c-format
 msgid "nmcli tool, version %s\n"
 msgstr "ilo 'nmcli', versio %s\n"
 
-#: ../cli/src/nmcli.c:215
+#: ../cli/src/nmcli.c:213
 #, c-format
 msgid "Error: Option '%s' is unknown, try 'nmcli -help'."
 msgstr "Eraro: Opcio '%s' estas nekonata, provu: 'nmcli -help'."
 
-#: ../cli/src/nmcli.c:234
+#: ../cli/src/nmcli.c:232
 #, c-format
 msgid "Caught signal %d, shutting down..."
 msgstr "Ricevis signalon '%d', elŝaltas..."
 
-#: ../cli/src/nmcli.c:259
-#, c-format
-msgid "Error: Could not connect to NetworkManager."
-msgstr "Eraro: Ne eblis konekti al NetworkManager"
+#: ../cli/src/nmcli.c:257
+msgid "Error: Could not create NMClient object."
+msgstr "Eraro: Ne povas krei NMClient-objekton."
 
-#: ../cli/src/nmcli.c:275
+#: ../cli/src/nmcli.c:273
 msgid "Success"
 msgstr "Sukceso"
 
-#: ../cli/src/settings.c:411
+#: ../cli/src/settings.c:423
 #, c-format
 msgid "%d (hex-ascii-key)"
 msgstr "%d (heks-ascii-ŝlosilo)"
 
-#: ../cli/src/settings.c:413
+#: ../cli/src/settings.c:425
 #, c-format
 msgid "%d (104/128-bit passphrase)"
-msgstr "%d (104/128-bita pasvorto)"
+msgstr "%d (104/128-bita pasfrazo)"
 
-#: ../cli/src/settings.c:416
+#: ../cli/src/settings.c:428
 #, c-format
 msgid "%d (unknown)"
-msgstr "%d (nekonata)"
+msgstr "%d (nekonate)"
 
-#: ../cli/src/settings.c:442
+#: ../cli/src/settings.c:454
 msgid "0 (unknown)"
-msgstr "0 (nekonata)"
+msgstr "0 (nekonate)"
 
-#: ../cli/src/settings.c:448
+#: ../cli/src/settings.c:460
 msgid "any, "
 msgstr "ajna, "
 
-#: ../cli/src/settings.c:450
+#: ../cli/src/settings.c:462
 msgid "900 MHz, "
 msgstr "900 MHz, "
 
-#: ../cli/src/settings.c:452
+#: ../cli/src/settings.c:464
 msgid "1800 MHz, "
 msgstr "1800 MHz, "
 
-#: ../cli/src/settings.c:454
+#: ../cli/src/settings.c:466
 msgid "1900 MHz, "
 msgstr "1900 MHz, "
 
-#: ../cli/src/settings.c:456
+#: ../cli/src/settings.c:468
 msgid "850 MHz, "
 msgstr "850 MHz, "
 
-#: ../cli/src/settings.c:458
+#: ../cli/src/settings.c:470
 msgid "WCDMA 3GPP UMTS 2100 MHz, "
 msgstr "WCDMA 3GPP UMTS 2100 MHz, "
 
-#: ../cli/src/settings.c:460
+#: ../cli/src/settings.c:472
 msgid "WCDMA 3GPP UMTS 1800 MHz, "
 msgstr "WCDMA 3GPP UMTS 1800 MHz, "
 
-#: ../cli/src/settings.c:462
+#: ../cli/src/settings.c:474
 msgid "WCDMA 3GPP UMTS 1700/2100 MHz, "
 msgstr "WCDMA 3GPP UMTS 1700/2100 MHz, "
 
-#: ../cli/src/settings.c:464
+#: ../cli/src/settings.c:476
 msgid "WCDMA 3GPP UMTS 800 MHz, "
 msgstr "WCDMA 3GPP UMTS 800 MHz, "
 
-#: ../cli/src/settings.c:466
+#: ../cli/src/settings.c:478
 msgid "WCDMA 3GPP UMTS 850 MHz, "
 msgstr "WCDMA 3GPP UMTS 850 MHz, "
 
-#: ../cli/src/settings.c:468
+#: ../cli/src/settings.c:480
 msgid "WCDMA 3GPP UMTS 900 MHz, "
 msgstr "WCDMA 3GPP UMTS 900 MHz, "
 
-#: ../cli/src/settings.c:470
+#: ../cli/src/settings.c:482
 msgid "WCDMA 3GPP UMTS 1700 MHz, "
 msgstr "WCDMA 3GPP UMTS 1700 MHz, "
 
-#: ../cli/src/settings.c:554 ../cli/src/settings.c:721
+#: ../cli/src/settings.c:566 ../cli/src/settings.c:732
 msgid "auto"
 msgstr "aŭto"
 
-#: ../cli/src/settings.c:716 ../cli/src/settings.c:719
-#: ../cli/src/settings.c:720 ../cli/src/utils.c:172
+#: ../cli/src/settings.c:727 ../cli/src/settings.c:730
+#: ../cli/src/settings.c:731 ../cli/src/utils.c:176
 msgid "not set"
-msgstr "neagordita"
+msgstr "neagordite"
 
-#: ../cli/src/utils.c:124
+#: ../cli/src/utils.c:128
 #, c-format
 msgid "field '%s' has to be alone"
 msgstr "kampo '%s' devas esti sola"
 
-#: ../cli/src/utils.c:127
+#: ../cli/src/utils.c:131
 #, c-format
 msgid "invalid field '%s'"
 msgstr "nevalida kampo '%s'"
 
-#: ../cli/src/utils.c:146
+#: ../cli/src/utils.c:150
 #, c-format
 msgid "Option '--terse' requires specifying '--fields'"
-msgstr "Elektindaĵo '--terse' postulas specifigon de '--fields'"
+msgstr "Opcio '--terse' postulas specifigon de '--fields'"
 
-#: ../cli/src/utils.c:150
+#: ../cli/src/utils.c:154
 #, c-format
 msgid "Option '--terse' requires specific '--fields' option values , not '%s'"
 msgstr ""
-"Elektindaĵo '--terse' postulas specifajn elektindajn valorojn de '--fields', "
-"ne '%s'"
+"Opcio '--terse' postulas specifajn elektindajn valorojn de '--fields', ne "
+"'%s'"
+
+#: ../cli/src/utils.c:333
+#, c-format
+msgid "Error: Couldn't create D-Bus object proxy for org.freedesktop.DBus"
+msgstr "Eraro: Ne povas krei D-Bus-prokurilobjekto por org.freedesktop.DBus"
+
+#: ../cli/src/utils.c:341
+#, c-format
+msgid "Error: NameHasOwner request failed: %s"
+msgstr "Eraro: NameHasOwner-peto fiaskis: %s"
+
+#: ../cli/src/utils.c:386
+#, c-format
+msgid ""
+"Warning: nmcli (%s) and NetworkManager (%s) versions don't match. Use --"
+"nocheck to suppress the warning.\n"
+msgstr ""
+
+#: ../cli/src/utils.c:395
+#, c-format
+msgid ""
+"Error: nmcli (%s) and NetworkManager (%s) versions don't match. Force "
+"execution using --nocheck, but the results are unpredictable."
+msgstr ""
 
-#: ../libnm-util/crypto.c:121
+#: ../libnm-util/crypto.c:127
 #, c-format
 msgid "PEM key file had no end tag '%s'."
 msgstr "PEM-ŝlosil-dosiero ne havis finan etikedon '%s'."
 
-#: ../libnm-util/crypto.c:131
+#: ../libnm-util/crypto.c:140
 #, c-format
 msgid "Doesn't look like a PEM private key file."
 msgstr "Tio ĉi ne aspektas kiel privat-ŝlosila PEM-dosiero."
 
-#: ../libnm-util/crypto.c:139
+#: ../libnm-util/crypto.c:148
 #, c-format
 msgid "Not enough memory to store PEM file data."
 msgstr "Malsufiĉas memoro por stori datenojn de PEM-dosiero."
 
-#: ../libnm-util/crypto.c:155
+#: ../libnm-util/crypto.c:164
 #, c-format
 msgid "Malformed PEM file: Proc-Type was not first tag."
 msgstr "Misforma PEM-dosiero: 'Proc-Type' ne estas la unua etikedo."
 
-#: ../libnm-util/crypto.c:163
+#: ../libnm-util/crypto.c:172
 #, c-format
 msgid "Malformed PEM file: unknown Proc-Type tag '%s'."
 msgstr "Misforma PEM-dosiero: nekonata Proc-Type-etikedo \"%s\"."
 
-#: ../libnm-util/crypto.c:173
+#: ../libnm-util/crypto.c:182
 #, c-format
 msgid "Malformed PEM file: DEK-Info was not the second tag."
 msgstr "Misforma PEM-dosiero: 'DEK-Info' ne estas la dua etikedo."
 
-#: ../libnm-util/crypto.c:184
+#: ../libnm-util/crypto.c:193
 #, c-format
 msgid "Malformed PEM file: no IV found in DEK-Info tag."
 msgstr "Misforma PEM-dosiero: mi ne trovis IV en la etikedo \"DEK-Info\"."
 
-#: ../libnm-util/crypto.c:191
+#: ../libnm-util/crypto.c:200
 #, c-format
 msgid "Malformed PEM file: invalid format of IV in DEK-Info tag."
 msgstr ""
 "Misforma PEM-dosiero: nevalida struktturo de IV en la etikedo \"DEK-Info\"."
 
-#: ../libnm-util/crypto.c:204
+#: ../libnm-util/crypto.c:213
 #, c-format
 msgid "Malformed PEM file: unknown private key cipher '%s'."
 msgstr "Misforma PEM-dosiero: nekonata privat-ŝlosila ĉifro \"%s\"."
 
-#: ../libnm-util/crypto.c:223
+#: ../libnm-util/crypto.c:232
 #, c-format
 msgid "Could not decode private key."
 msgstr "Ne eblis malĉifri la privatan ŝlosilon."
 
-#: ../libnm-util/crypto.c:268
-#, c-format
-msgid "PEM certificate '%s' had no end tag '%s'."
-msgstr "La PEM-certigilo \"%s\" ne havas finan etikedon \"%s\"."
-
-#: ../libnm-util/crypto.c:278
-#, c-format
-msgid "Failed to decode certificate."
-msgstr "Malsuksesis malĉifri la certigilon."
-
-#: ../libnm-util/crypto.c:287
+#: ../libnm-util/crypto.c:268 ../libnm-util/crypto.c:554
 #, c-format
 msgid "Not enough memory to store certificate data."
 msgstr "Malsufiĉas memoro por stori la datenojn de la certigilo."
 
-#: ../libnm-util/crypto.c:295
-#, c-format
-msgid "Not enough memory to store file data."
-msgstr "Malsufiĉas memoro por stori la datenojn de la dosiero."
-
-#: ../libnm-util/crypto.c:325
+#: ../libnm-util/crypto.c:294
 #, c-format
 msgid "IV must be an even number of bytes in length."
 msgstr "IV nepre amkplesu paran nombron da bajtoj."
 
-#: ../libnm-util/crypto.c:334
+#: ../libnm-util/crypto.c:303
 #, c-format
 msgid "Not enough memory to store the IV."
 msgstr "Malsufiĉas memoro por stori la IV-on."
 
-#: ../libnm-util/crypto.c:345
+#: ../libnm-util/crypto.c:314
 #, c-format
 msgid "IV contains non-hexadecimal digits."
 msgstr "IV enhavas nedeksesumajn ciferojn"
 
-#: ../libnm-util/crypto.c:383 ../libnm-util/crypto_gnutls.c:148
-#: ../libnm-util/crypto_gnutls.c:266 ../libnm-util/crypto_nss.c:171
-#: ../libnm-util/crypto_nss.c:336
+#: ../libnm-util/crypto.c:352 ../libnm-util/crypto_gnutls.c:147
+#: ../libnm-util/crypto_gnutls.c:265 ../libnm-util/crypto_nss.c:167
+#: ../libnm-util/crypto_nss.c:332
 #, c-format
 msgid "Private key cipher '%s' was unknown."
 msgstr "Privata Cipher-ŝlosilo '%s' estas nekonata."
 
-#: ../libnm-util/crypto.c:392
+#: ../libnm-util/crypto.c:361
 #, c-format
 msgid "Not enough memory to decrypt private key."
 msgstr "Nesufiĉa memoro por malĉifri privatan ŝlosilon."
 
-#: ../libnm-util/crypto.c:512
+#: ../libnm-util/crypto.c:426
+#, c-format
+msgid "Not enough memory to store decrypted private key."
+msgstr "Nesufiĉa memoro por gardi privatan ŝlosilon malĉifritan."
+
+#: ../libnm-util/crypto.c:471
 #, c-format
 msgid "Unable to determine private key type."
 msgstr "Ne eblas determini la tipon de la privata ŝlosilo."
 
-#: ../libnm-util/crypto.c:531
+#: ../libnm-util/crypto.c:526
 #, c-format
-msgid "Not enough memory to store decrypted private key."
-msgstr "Nesufiĉa memoro por gardi privatan ŝlosilon malĉifritan."
+msgid "PEM certificate had no start tag '%s'."
+msgstr "La PEM-certigilo ne havas start-etikedon \"%s\"."
+
+#: ../libnm-util/crypto.c:535
+#, c-format
+msgid "PEM certificate had no end tag '%s'."
+msgstr "La PEM-certigilo ne havas finan etikedon \"%s\"."
+
+#: ../libnm-util/crypto.c:559
+#, c-format
+msgid "Failed to decode certificate."
+msgstr "Malsuksesis malĉifri la certigilon."
 
-#: ../libnm-util/crypto_gnutls.c:49
+#: ../libnm-util/crypto_gnutls.c:50
 msgid "Failed to initialize the crypto engine."
 msgstr "Pretigo de la kriptografia maŝino fiaskis."
 
-#: ../libnm-util/crypto_gnutls.c:93
+#: ../libnm-util/crypto_gnutls.c:92
 #, c-format
 msgid "Failed to initialize the MD5 engine: %s / %s."
 msgstr "Pretigo de la MD5-maŝino fiaskis: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:156
+#: ../libnm-util/crypto_gnutls.c:155
 #, c-format
 msgid "Invalid IV length (must be at least %zd)."
 msgstr "Nevalida amplekso por IV (devas esti almenaŭ %zd)."
 
-#: ../libnm-util/crypto_gnutls.c:165 ../libnm-util/crypto_nss.c:188
+#: ../libnm-util/crypto_gnutls.c:164 ../libnm-util/crypto_nss.c:184
 #, c-format
 msgid "Not enough memory for decrypted key buffer."
 msgstr "Nesufiĉa memoro por bufro de la malĉifrita ŝlosilo."
 
-#: ../libnm-util/crypto_gnutls.c:173
+#: ../libnm-util/crypto_gnutls.c:172
 #, c-format
 msgid "Failed to initialize the decryption cipher context: %s / %s."
 msgstr "Fiaskis pravalorizi la malĉifran Cipher-kuntekston: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:182
+#: ../libnm-util/crypto_gnutls.c:181
 #, c-format
 msgid "Failed to set symmetric key for decryption: %s / %s."
 msgstr "Fiaskis agordi simetrian ŝlosilon por malĉifro: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:191
+#: ../libnm-util/crypto_gnutls.c:190
 #, c-format
 msgid "Failed to set IV for decryption: %s / %s."
 msgstr "Fiaskis agordi IV por malĉifro: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:200
+#: ../libnm-util/crypto_gnutls.c:199
 #, c-format
 msgid "Failed to decrypt the private key: %s / %s."
 msgstr "Fiaskis malĉifri la privatan ŝlosilon: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:210 ../libnm-util/crypto_nss.c:267
+#: ../libnm-util/crypto_gnutls.c:209 ../libnm-util/crypto_nss.c:263
 #, c-format
 msgid "Failed to decrypt the private key: unexpected padding length."
 msgstr "Fiaskis malĉifri la privatan ŝlosilon: neatendita ŝtopada longo."
 
-#: ../libnm-util/crypto_gnutls.c:221 ../libnm-util/crypto_nss.c:278
+#: ../libnm-util/crypto_gnutls.c:220 ../libnm-util/crypto_nss.c:274
 #, c-format
 msgid "Failed to decrypt the private key."
 msgstr "Fiaskis malĉifri la privatan ŝlosilon."
 
-#: ../libnm-util/crypto_gnutls.c:286 ../libnm-util/crypto_nss.c:356
+#: ../libnm-util/crypto_gnutls.c:285 ../libnm-util/crypto_nss.c:352
 #, c-format
 msgid "Could not allocate memory for encrypting."
 msgstr "Ne eblis rezervi memoron por ĉifrado."
 
-#: ../libnm-util/crypto_gnutls.c:294
+#: ../libnm-util/crypto_gnutls.c:293
 #, c-format
 msgid "Failed to initialize the encryption cipher context: %s / %s."
 msgstr "Fiaskis valorizi la ĉifradan kuntekston: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:303
+#: ../libnm-util/crypto_gnutls.c:302
 #, c-format
 msgid "Failed to set symmetric key for encryption: %s / %s."
 msgstr "Fiaskis agordi simetrian ŝlosilon por ĉifrado: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:313
+#: ../libnm-util/crypto_gnutls.c:312
 #, c-format
 msgid "Failed to set IV for encryption: %s / %s."
 msgstr "Fiaskis agordi IV por ĉifrado: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:322
+#: ../libnm-util/crypto_gnutls.c:321
 #, c-format
 msgid "Failed to encrypt the data: %s / %s."
 msgstr "Ĉifrado de datumoj malsukcesis: %s / %s."
 
-#: ../libnm-util/crypto_gnutls.c:362
+#: ../libnm-util/crypto_gnutls.c:361
 #, c-format
 msgid "Error initializing certificate data: %s"
 msgstr "Eraro dum pravalorizo de atestilaj datumoj: %s"
 
-#: ../libnm-util/crypto_gnutls.c:384
+#: ../libnm-util/crypto_gnutls.c:383
 #, c-format
 msgid "Couldn't decode certificate: %s"
 msgstr "Ne povis malkodi certigilon: %s"
 
-#: ../libnm-util/crypto_gnutls.c:408
+#: ../libnm-util/crypto_gnutls.c:407
 #, c-format
 msgid "Couldn't initialize PKCS#12 decoder: %s"
 msgstr "Ne povis pravalorizi PKCS#12-malkodilon: %s"
 
-#: ../libnm-util/crypto_gnutls.c:421
+#: ../libnm-util/crypto_gnutls.c:420
 #, c-format
 msgid "Couldn't decode PKCS#12 file: %s"
 msgstr "Ne eblis dekodi PKCS#12-dosieron: %s"
 
-#: ../libnm-util/crypto_gnutls.c:433
+#: ../libnm-util/crypto_gnutls.c:432
 #, c-format
 msgid "Couldn't verify PKCS#12 file: %s"
 msgstr "No povis kontroli PKCS#12-dosieron: %s"
@@ -1440,278 +1615,248 @@ msgstr "No povis kontroli PKCS#12-dosieron: %s"
 msgid "Failed to initialize the crypto engine: %d."
 msgstr "Pravalorigo de la kriptografia maŝino fiaskis: %d."
 
-#: ../libnm-util/crypto_nss.c:111
+#: ../libnm-util/crypto_nss.c:107
 #, c-format
 msgid "Failed to initialize the MD5 context: %d."
 msgstr "Fiaskis pravalorizi la MD5-kuntekston: %d."
 
-#: ../libnm-util/crypto_nss.c:179
+#: ../libnm-util/crypto_nss.c:175
 #, c-format
 msgid "Invalid IV length (must be at least %d)."
 msgstr "Nevalida IV-longo (devas esti almenaŭ %d)."
 
-#: ../libnm-util/crypto_nss.c:196
+#: ../libnm-util/crypto_nss.c:192
 #, c-format
 msgid "Failed to initialize the decryption cipher slot."
 msgstr "Fiaskis pravalorizi la malĉifran Cipher-foldon."
 
-#: ../libnm-util/crypto_nss.c:206
+#: ../libnm-util/crypto_nss.c:202
 #, c-format
 msgid "Failed to set symmetric key for decryption."
 msgstr "Fiaskis agordi simetrian ŝlosilon por malĉifrado."
 
-#: ../libnm-util/crypto_nss.c:216
+#: ../libnm-util/crypto_nss.c:212
 #, c-format
 msgid "Failed to set IV for decryption."
 msgstr "Fiaskis agordi IV por malĉifrado."
 
-#: ../libnm-util/crypto_nss.c:224
+#: ../libnm-util/crypto_nss.c:220
 #, c-format
 msgid "Failed to initialize the decryption context."
 msgstr "Fiaskis pravalorizi la malĉifran kuntekston."
 
-#: ../libnm-util/crypto_nss.c:237
+#: ../libnm-util/crypto_nss.c:233
 #, c-format
 msgid "Failed to decrypt the private key: %d."
 msgstr "Fiaskis malĉifri la privatan ŝlosilon: %d."
 
-#: ../libnm-util/crypto_nss.c:245
+#: ../libnm-util/crypto_nss.c:241
 #, c-format
 msgid "Failed to decrypt the private key: decrypted data too large."
 msgstr "Fiaskis malĉifri la privatan ŝlosilon: malĉifritaj datumoj tro longas."
 
-#: ../libnm-util/crypto_nss.c:256
+#: ../libnm-util/crypto_nss.c:252
 #, c-format
 msgid "Failed to finalize decryption of the private key: %d."
 msgstr "Fiaskis fini malĉifradon de la privata ŝlosilo: %d."
 
-#: ../libnm-util/crypto_nss.c:364
+#: ../libnm-util/crypto_nss.c:360
 #, c-format
 msgid "Failed to initialize the encryption cipher slot."
 msgstr "Fiaskis pravalorizi la ĉifran Cipher-foldon."
 
-#: ../libnm-util/crypto_nss.c:372
+#: ../libnm-util/crypto_nss.c:368
 #, c-format
 msgid "Failed to set symmetric key for encryption."
 msgstr "Fiaskis agordi simetrian ŝlosilon por ĉifrado."
 
-#: ../libnm-util/crypto_nss.c:380
+#: ../libnm-util/crypto_nss.c:376
 #, c-format
 msgid "Failed to set IV for encryption."
 msgstr "Fiaskis agordi IV por ĉifrado."
 
-#: ../libnm-util/crypto_nss.c:388
+#: ../libnm-util/crypto_nss.c:384
 #, c-format
 msgid "Failed to initialize the encryption context."
 msgstr "Fiaskis pravalorizi la ĉifradan kuntekston."
 
-#: ../libnm-util/crypto_nss.c:396
+#: ../libnm-util/crypto_nss.c:392
 #, c-format
 msgid "Failed to encrypt: %d."
 msgstr "Fiaskis ĉifri: %d."
 
-#: ../libnm-util/crypto_nss.c:404
+#: ../libnm-util/crypto_nss.c:400
 #, c-format
 msgid "Unexpected amount of data after encrypting."
 msgstr "Neatendita nombro da datumoj post ĉifrado."
 
-#: ../libnm-util/crypto_nss.c:447
+#: ../libnm-util/crypto_nss.c:443
 #, c-format
 msgid "Couldn't decode certificate: %d"
 msgstr "Ne povis malkodigi atestilon: %d"
 
-#: ../libnm-util/crypto_nss.c:482
+#: ../libnm-util/crypto_nss.c:478
 #, c-format
 msgid "Couldn't convert password to UCS2: %d"
 msgstr "Ne povis konverti pasvorton al UCS2: %d"
 
-#: ../libnm-util/crypto_nss.c:510
+#: ../libnm-util/crypto_nss.c:506
 #, c-format
 msgid "Couldn't initialize PKCS#12 decoder: %d"
 msgstr "Ne povis pravalorizi PKCS#12-malkodilon: %d"
 
-#: ../libnm-util/crypto_nss.c:519
+#: ../libnm-util/crypto_nss.c:515
 #, c-format
 msgid "Couldn't decode PKCS#12 file: %d"
 msgstr "Ne povis malkodigi PKCS#12-dosieron: %d"
 
-#: ../libnm-util/crypto_nss.c:528
+#: ../libnm-util/crypto_nss.c:524
 #, c-format
 msgid "Couldn't verify PKCS#12 file: %d"
 msgstr "Ne povis kontroli PKCS#12-dosieron: %d"
 
-#: ../libnm-util/crypto_nss.c:557
+#: ../libnm-util/crypto_nss.c:553
 msgid "Could not generate random data."
 msgstr "Ne povis generi hazardajn datumojn."
 
-#: ../libnm-util/nm-utils.c:1975
+#: ../libnm-util/nm-utils.c:2000
 #, c-format
 msgid "Not enough memory to make encryption key."
 msgstr "Nesufiĉa memoro por fari ĉifran ŝlosilon."
 
-#: ../libnm-util/nm-utils.c:2085
+#: ../libnm-util/nm-utils.c:2110
 msgid "Could not allocate memory for PEM file creation."
 msgstr "Ne povis atribui memoron por kreo de PEM-dosiero."
 
-#: ../libnm-util/nm-utils.c:2097
+#: ../libnm-util/nm-utils.c:2122
 #, c-format
 msgid "Could not allocate memory for writing IV to PEM file."
 msgstr "Ne povis atribui memoron por konservi IV en PEM-dosieron."
 
-#: ../libnm-util/nm-utils.c:2109
+#: ../libnm-util/nm-utils.c:2134
 #, c-format
 msgid "Could not allocate memory for writing encrypted key to PEM file."
 msgstr ""
 "Ne povis atribui memoron por konservi ĉifritan ŝlosilon en PEM-dosieron."
 
-#: ../libnm-util/nm-utils.c:2128
+#: ../libnm-util/nm-utils.c:2153
 #, c-format
 msgid "Could not allocate memory for PEM file data."
 msgstr "Ne povis atribui memoron por datumoj de PEM-dosiero."
 
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:1
-msgid "Connection sharing via a protected WiFi network"
-msgstr "Kundivido de konektoj per protektita WiFi-reto"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:2
-msgid "Connection sharing via an open WiFi network"
-msgstr "Kundivido de konektoj per malferma WiFi-reto"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:3
-msgid "Modify persistent system hostname"
-msgstr "Modifi permanentan sisteman gastigan nomon"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:4
-msgid "Modify system connections"
-msgstr "Modifi sistemajn konektojn"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:5
-msgid "System policy prevents modification of system settings"
-msgstr "Sistempolico preventas modifadon de sistemagordoj"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:6
-msgid "System policy prevents modification of the persistent system hostname"
-msgstr "Sistempolico preventas modifadon de la konstanta sistem-gastnomo"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:7
-msgid "System policy prevents sharing connections via a protected WiFi network"
-msgstr "Sistempolico preventas kundividon de konektoj per protektita WiFi-reto"
-
-#: ../policy/org.freedesktop.network-manager-settings.system.policy.in.h:8
-msgid "System policy prevents sharing connections via an open WiFi network"
-msgstr "Sistempolitiko preventas kundividon de konektoj per malferma WiFi-reto"
-
 #: ../policy/org.freedesktop.NetworkManager.policy.in.h:1
 msgid "Allow control of network connections"
 msgstr "Permesi kontrolon de retkonektoj"
 
 #: ../policy/org.freedesktop.NetworkManager.policy.in.h:2
-msgid "Allow use of user-specific connections"
-msgstr "Permesi uzon de specifaj konektoj por uzantoj"
+msgid "Connection sharing via a protected WiFi network"
+msgstr "Kundivido de konektoj per protektita WiFi-reto"
 
 #: ../policy/org.freedesktop.NetworkManager.policy.in.h:3
+msgid "Connection sharing via an open WiFi network"
+msgstr "Kundivido de konektoj per malferma WiFi-reto"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:4
 msgid "Enable or disable WiFi devices"
 msgstr "Enŝalti aŭ elŝalti WiFi-aparatojn"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:4
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:5
+msgid "Enable or disable WiMAX mobile broadband devices"
+msgstr "Enŝalti aŭ elŝalti WiMAX-larĝkapacitajn aparatojn"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:6
 msgid "Enable or disable mobile broadband devices"
 msgstr "Enŝalti aŭ elŝalti poŝtelefonajn larĝkapacitajn aparatojn"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:5
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:7
 msgid "Enable or disable system networking"
 msgstr "Enŝalti aŭ elŝalti sistemretkonektadon"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:6
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:8
+msgid "Modify network connections for all users"
+msgstr "Modifi retkonektojn por ĉiuj uzantoj"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:9
+msgid "Modify persistent system hostname"
+msgstr "Modifi permanentan sisteman gastigan nomon"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:10
+msgid "Modify personal network connections"
+msgstr "Modifi proprajn retkonektojn"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:11
 msgid ""
 "Put NetworkManager to sleep or wake it up (should only be used by system "
 "power management)"
 msgstr ""
 "Dormigi aŭ veki NetworkManager (estu uzata nur de sistema energimastumado)"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:7
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:12
 msgid "System policy prevents control of network connections"
 msgstr "Sistempolitiko preventas kontrolon de retkonektoj"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:8
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:13
 msgid "System policy prevents enabling or disabling WiFi devices"
-msgstr "Sistempolitiko preventas enŝalton aŭ malŝalton de WiFi-aparatoj"
+msgstr "Sistempolitiko preventas enŝalton aŭ elŝalton de WiFi-aparatoj"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:9
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:14
+msgid ""
+"System policy prevents enabling or disabling WiMAX mobile broadband devices"
+msgstr ""
+"Sistempolitiko preventas enŝalton aŭ elŝalton de larĝkapacitaj WiMAX-"
+"aparatoj"
+
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:15
 msgid "System policy prevents enabling or disabling mobile broadband devices"
 msgstr ""
-"Sistempolitiko preventas enŝalton aŭ malŝalton de poŝtelefonaj larĝkapacitaj "
+"Sistempolitiko preventas enŝalton aŭ elŝalton de poŝtelefonaj larĝkapacitaj "
 "aparatoj"
 
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:10
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:16
 msgid "System policy prevents enabling or disabling system networking"
-msgstr "Sistempolitiko preventas enŝalton aŭ malŝalton de sistema retkonektado"
-
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:11
-msgid "System policy prevents putting NetworkManager to sleep or waking it up"
-msgstr "Sistempolitiko preventas dormigi aŭ veki NetworkManager"
-
-#: ../policy/org.freedesktop.NetworkManager.policy.in.h:12
-msgid "System policy prevents use of user-specific connections"
-msgstr "Sistempolitiko preventas uzon de uzant-specifaj konektoj"
+msgstr "Sistempolitiko preventas enŝalton aŭ elŝalton de sistema retkonektado"
 
-#: ../src/nm-netlink-monitor.c:100 ../src/nm-netlink-monitor.c:231
-#: ../src/nm-netlink-monitor.c:653
-#, c-format
-msgid "error processing netlink message: %s"
-msgstr "eraro dum traktado de netlink-mesaĝo: %s"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:17
+msgid "System policy prevents modification of network settings for all users"
+msgstr "Sistempolitiko preventas modifadon de retagordoj por ĉiuj uzantoj"
 
-#: ../src/nm-netlink-monitor.c:214
-msgid "error occurred while waiting for data on socket"
-msgstr "okazis eraro dum atendado je datumoj sur kontaktoskatolo"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:18
+msgid "System policy prevents modification of personal network settings"
+msgstr "Sistempolitiko preventas modifadon de propraj retagordoj"
 
-#: ../src/nm-netlink-monitor.c:254
-#, c-format
-msgid "unable to connect to netlink for monitoring link status: %s"
-msgstr "ne eblas konekti al netlink por kontroli ligilan staton: %s"
-
-#: ../src/nm-netlink-monitor.c:265
-#, c-format
-msgid "unable to enable netlink handle credential passing: %s"
-msgstr "ne povis aktivigi la netlink-tenilan legitimaĵo-pasadon: %s"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:19
+msgid "System policy prevents modification of the persistent system hostname"
+msgstr "Sistempolitiko preventas modifadon de la konstanta sistem-gastnomo"
 
-#: ../src/nm-netlink-monitor.c:291 ../src/nm-netlink-monitor.c:353
-#, c-format
-msgid "unable to allocate netlink handle for monitoring link status: %s"
-msgstr "ne povis atribui retligiltenilon por kontroli ligilstaton: %s"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:20
+msgid "System policy prevents putting NetworkManager to sleep or waking it up"
+msgstr "Sistempolitiko preventas dormigi aŭ veki NetworkManager"
 
-#: ../src/nm-netlink-monitor.c:376
-#, c-format
-msgid "unable to allocate netlink link cache for monitoring link status: %s"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:21
+msgid "System policy prevents sharing connections via a protected WiFi network"
 msgstr ""
-"ne povis atribui ligilan kaŝmemoron de netlink por kontroli ligilstaton: %s"
-
-#: ../src/nm-netlink-monitor.c:502
-#, c-format
-msgid "unable to join netlink group: %s"
-msgstr "ne eblas membriĝi al retligila grupo: %s"
+"Sistempolitiko preventas kundividon de konektoj per protektita WiFi-reto"
 
-#: ../src/nm-netlink-monitor.c:629 ../src/nm-netlink-monitor.c:642
-#, c-format
-msgid "error updating link cache: %s"
-msgstr "eraro dum ĝisdatigo de ligila kaŝmemoro: %s"
+#: ../policy/org.freedesktop.NetworkManager.policy.in.h:22
+msgid "System policy prevents sharing connections via an open WiFi network"
+msgstr "Sistempolitiko preventas kundividon de konektoj per malferma WiFi-reto"
 
-#: ../src/main.c:502
+#: ../src/main.c:530
 #, c-format
 msgid "Invalid option.  Please use --help to see a list of valid options.\n"
 msgstr ""
-"Nevalida elektindaĵo. Bonvolu uzi --help por vidi liston da validaj "
-"elektindaĵoj.\n"
+"Nevalida opcio. Bonvolu uzi --help por vidi liston da validaj opcioj.\n"
 
-#: ../src/main.c:573
+#: ../src/main.c:611
 #, c-format
 msgid "%s.  Please use --help to see a list of valid options.\n"
-msgstr "%s. Bovolu uzi --help por vidi liston da validaj elektindaĵoj.\n"
+msgstr "%s. Bovolu uzi --help por vidi liston da validaj opcioj.\n"
 
-#: ../src/dhcp-manager/nm-dhcp-dhclient.c:328
+#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:62
 msgid "# Created by NetworkManager\n"
 msgstr "# Kreita de NetworkManager\n"
 
-#: ../src/dhcp-manager/nm-dhcp-dhclient.c:344
+#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:69
 #, c-format
 msgid ""
 "# Merged from %s\n"
@@ -1722,7 +1867,7 @@ msgstr ""
 
 #: ../src/dhcp-manager/nm-dhcp-manager.c:284
 msgid "no usable DHCP client could be found."
-msgstr "neniu uzebla DHCP-kliento estis trovebla"
+msgstr "neniu uzebla DHCP-kliento estis trovebla."
 
 #: ../src/dhcp-manager/nm-dhcp-manager.c:293
 msgid "'dhclient' could be found."
@@ -1737,30 +1882,168 @@ msgstr "'dhcpcd' povis esti trovita."
 msgid "unsupported DHCP client '%s'"
 msgstr "nesubtenata DHCP-kliento '%s'"
 
-#: ../src/logging/nm-logging.c:146
+#: ../src/dns-manager/nm-dns-manager.c:369
+msgid "NOTE: the libc resolver may not support more than 3 nameservers."
+msgstr "NOTO: la libc-solvilo eble ne povus subteni pli ol 3 nomservilojn."
+
+#: ../src/dns-manager/nm-dns-manager.c:371
+msgid "The nameservers listed below may not be recognized."
+msgstr "La sube ligstigitaj nomserviloj eble ne estos rekonataj."
+
+#: ../src/logging/nm-logging.c:149
 #, c-format
 msgid "Unknown log level '%s'"
 msgstr "Nekonata protokolnivelo '%s'"
 
-#: ../src/logging/nm-logging.c:171
+#: ../src/logging/nm-logging.c:174
 #, c-format
 msgid "Unknown log domain '%s'"
 msgstr "Nekonata protokola regiono '%s'"
 
-#: ../src/dns-manager/nm-dns-manager.c:367
-msgid "NOTE: the libc resolver may not support more than 3 nameservers."
-msgstr "NOTO: la libc-solvilo eble ne povus subteni pli ol 3 nomservilojn."
+#: ../src/modem-manager/nm-modem-cdma.c:296 ../src/nm-device-bt.c:355
+#, c-format
+msgid "CDMA connection %d"
+msgstr "CDMA-konekto %d"
 
-#: ../src/dns-manager/nm-dns-manager.c:369
-msgid "The nameservers listed below may not be recognized."
-msgstr "La sube ligstigitaj nomserviloj eble ne estos rekonataj."
+#: ../src/modem-manager/nm-modem-gsm.c:499 ../src/nm-device-bt.c:351
+#, c-format
+msgid "GSM connection %d"
+msgstr "GSM-konekto %d"
+
+#: ../src/nm-device-bt.c:326
+#, c-format
+msgid "PAN connection %d"
+msgstr "PAN-konekto %d"
+
+#: ../src/nm-device-bt.c:359
+#, c-format
+msgid "DUN connection %d"
+msgstr "DUN-konekto %d"
+
+#: ../src/nm-device-ethernet.c:1681
+#, c-format
+msgid "PPPoE connection %d"
+msgstr "PPPoE-konekto %d"
 
-#: ../src/system-settings/nm-default-wired-connection.c:157
+#: ../src/nm-device-ethernet.c:1681 ../src/settings/nm-settings-utils.c:50
 #, c-format
-msgid "Auto %s"
-msgstr "Aŭto %s"
+msgid "Wired connection %d"
+msgstr "Drata konekto %d"
 
-#: ../system-settings/plugins/ifcfg-rh/reader.c:3408
-#: ../system-settings/plugins/ifnet/connection_parser.c:49
+#: ../src/nm-device-olpc-mesh.c:423
+#, c-format
+msgid "Mesh %d"
+msgstr ""
+
+#: ../src/nm-manager.c:673
+#, c-format
+msgid "VPN connection %d"
+msgstr "VPN-konekto %d"
+
+#: ../src/nm-netlink-monitor.c:100 ../src/nm-netlink-monitor.c:231
+#: ../src/nm-netlink-monitor.c:653
+#, c-format
+msgid "error processing netlink message: %s"
+msgstr "eraro dum traktado de netlink-mesaĝo: %s"
+
+#: ../src/nm-netlink-monitor.c:214
+msgid "error occurred while waiting for data on socket"
+msgstr "okazis eraro dum atendado je datumoj sur kontaktoskatolo"
+
+#: ../src/nm-netlink-monitor.c:254
+#, c-format
+msgid "unable to connect to netlink for monitoring link status: %s"
+msgstr "ne eblas konekti al netlink por kontroli ligilan staton: %s"
+
+#: ../src/nm-netlink-monitor.c:265
+#, c-format
+msgid "unable to enable netlink handle credential passing: %s"
+msgstr "ne povis aktivigi la netlink-tenilan legitimaĵo-pasadon: %s"
+
+#: ../src/nm-netlink-monitor.c:291 ../src/nm-netlink-monitor.c:353
+#, c-format
+msgid "unable to allocate netlink handle for monitoring link status: %s"
+msgstr "ne povis atribui retligiltenilon por kontroli ligilstaton: %s"
+
+#: ../src/nm-netlink-monitor.c:376
+#, c-format
+msgid "unable to allocate netlink link cache for monitoring link status: %s"
+msgstr ""
+"ne povis atribui ligilan kaŝmemoron de netlink por kontroli ligilstaton: %s"
+
+#: ../src/nm-netlink-monitor.c:502
+#, c-format
+msgid "unable to join netlink group: %s"
+msgstr "ne eblas membriĝi al retligila grupo: %s"
+
+#: ../src/nm-netlink-monitor.c:629 ../src/nm-netlink-monitor.c:642
+#, c-format
+msgid "error updating link cache: %s"
+msgstr "eraro dum ĝisdatigo de ligila kaŝmemoro: %s"
+
+#: ../src/settings/plugins/ifcfg-rh/reader.c:3512
+#: ../src/settings/plugins/ifnet/connection_parser.c:51
 msgid "System"
 msgstr "Sistemo"
+
+#~ msgid "SCOPE"
+#~ msgstr "AMPLEKSO"
+
+#~ msgid "DBUS-SERVICE"
+#~ msgstr "DBUS-SERVO"
+
+#~ msgid "system"
+#~ msgstr "sistemo"
+
+#~ msgid "user"
+#~ msgstr "uzanto"
+
+#~ msgid "System connections"
+#~ msgstr "Sistemkonektoj"
+
+#~ msgid "User connections"
+#~ msgstr "Uzanto-konektoj"
+
+#~ msgid "Error: Obtaining active connection for '%s' failed."
+#~ msgstr "Eraro: Akiro de aktiva konekto por '%s' fiaskis."
+
+#~ msgid "Error: Could not get user settings."
+#~ msgstr "Eraro: Ne povis akiri uzanto-agordojn."
+
+#~ msgid "Not enough memory to store file data."
+#~ msgstr "Malsufiĉas memoro por stori la datenojn de la dosiero."
+
+#~ msgid "Allow use of user-specific connections"
+#~ msgstr "Permesi uzon de specifaj konektoj por uzantoj"
+
+#~ msgid "System policy prevents use of user-specific connections"
+#~ msgstr "Sistempolitiko preventas uzon de uzant-specifaj konektoj"
+
+#~ msgid "Auto %s"
+#~ msgstr "Aŭto %s"
+
+#~ msgid ""
+#~ "Usage: nmcli nm { COMMAND | help }\n"
+#~ "\n"
+#~ "  COMMAND := { status | sleep | wakeup | wifi | wwan }\n"
+#~ "\n"
+#~ "  status\n"
+#~ "  sleep\n"
+#~ "  wakeup\n"
+#~ "  wifi [on|off]\n"
+#~ "  wwan [on|off]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Uzo: nmcli nm { KOMANDO | help }\n"
+#~ "\n"
+#~ "  KOMANDO := { status | sleep | wakeup | wifi | wwan }\n"
+#~ "\n"
+#~ "  status\n"
+#~ "  sleep\n"
+#~ "  wakeup\n"
+#~ "  wifi [on|off]\n"
+#~ "  wwan [on|off]\n"
+#~ "\n"
+
+#~ msgid "Error: Could not connect to NetworkManager."
+#~ msgstr "Eraro: Ne eblis konekti al NetworkManager"
diff --git a/policy/org.freedesktop.NetworkManager.policy b/policy/org.freedesktop.NetworkManager.policy
index 26412ad9..3aea453a 100644
--- a/policy/org.freedesktop.NetworkManager.policy
+++ b/policy/org.freedesktop.NetworkManager.policy
@@ -42,7 +42,7 @@
     Systempolitik forhindrer aktivering eller deaktivering af systemnetværk
     Die Systemrichtlinien verhindern die Aktivierung oder Deaktivierung von System-Netzwerken
     Η πολιτική συστήματος δεν επιτρέπει ενεργοποίηση ή απενεργοποίηση της δικτύωσης του συστήματος
-    Sistempolitiko preventas enŝalton aŭ malŝalton de sistema retkonektado
+    Sistempolitiko preventas enŝalton aŭ elŝalton de sistema retkonektado
     La política del sistema evita activar o desactivar la red del sistema
     A normativa do sistema evita a activación ou desactivación da rede do sistema
     तंत्र संजालन के युक्ति के सक्रियण या निष्क्रियण को तंत्र नीति रोकता है
@@ -160,7 +160,7 @@
     Systempolitik forhindrer aktivering eller deaktivering af WiFi-enheder
     Die Systemrichtlinien verhindern die Aktivierung oder Deaktivierung von WLAN-Geräten
     Η πολιτική συστήματος δεν επιτρέπει ενεργοποίηση ή απενεργοποίηση συσκευών ανοιχτού ασύρματου δικτύου (WiFi)
-    Sistempolitiko preventas enŝalton aŭ malŝalton de WiFi-aparatoj
+    Sistempolitiko preventas enŝalton aŭ elŝalton de WiFi-aparatoj
     La política de sistema evita activar o desactivar los dispositivos inalámbricos
     A normativa do sistema evita a activación e desactivación dos dispositivos WiFi
     WiFi युक्ति के सक्रियण या निष्क्रियण को तंत्र नीति रोकता है
@@ -219,7 +219,7 @@
     Systempolitik forhindrer aktivering eller deaktivering af mobile bredbåndsenheder
     Die Systemrichtlinien verhindern die Aktivierung oder Deaktivierung mobiler Breitbandgeräte
     Η πολιτική του συστήματος δεν επιτρέπει την ενεργοποίηση ή απενεργοποίηση συσκευών ευρυζωνικότητας κινητής τηλεφωνίας
-    Sistempolitiko preventas enŝalton aŭ malŝalton de poŝtelefonaj larĝkapacitaj aparatoj
+    Sistempolitiko preventas enŝalton aŭ elŝalton de poŝtelefonaj larĝkapacitaj aparatoj
     La política del sistema evita activar o desactivar los dispositivos de banda ancha móvil
     A normativa do sistema evita a activación ou desactivación dos dispositivos de banda ancha.
     मोबाइल ब्रॉडबैंड युक्ति के सक्रियण या निष्क्रियण को तंत्र नीति रोकता है
@@ -249,6 +249,7 @@
     Включване и изключване на устройства за достъп до мобилни мрежи по WiMAX
     Habilita o inhabilita els dispositius de banda ampla mòbil WiMAX
     Mobile WiMAX-Breitbandgeräte aktivieren oder deaktivieren
+    Enŝalti aŭ elŝalti WiMAX-larĝkapacitajn aparatojn
     Activar o desactivar los dispositivos de banda ancha móvil WiMAX
     WiMAX mobil széles sávú eszközök be- és kikapcsolása
     와이맥스 모바일 광대역 장치 사용 여부
@@ -258,6 +259,7 @@
     Политиката на системата не позволява включване и изключване на устройства за мобилни мрежи по WiMAX
     La política del sistema impedeix habilitar o inhabilitar els dispositius de banda ampla mòbil WiMAX
     Die Systemrichtlinien verhindern die Aktivierung oder Deaktivierung mobiler WiMAX-Breitbandgeräte
+    Sistempolitiko preventas enŝalton aŭ elŝalton de larĝkapacitaj WiMAX-aparatoj
     La política del sistema evita activar o desactivar los dispositivos de banda ancha móvil WiMAX
     A rendszer házirendje megakadályozza a WiMAX mobil széles sávú eszközök be- vagy kikapcsolását
     시스템 정책이 와이맥스 모바일 광대역 장치의 사용 여부 설정을 금지합니다
@@ -378,7 +380,7 @@
     Die Systemrichtlinien verhindern Verbindungsfreigaben über ein geschütztes WLAN-Netzwerk
     Η πολιτική συστήματος δεν επιτρέπει κοινή χρήση συνδέσεων μέσω προστατευμένου ασύρματου δικτύου
     System policy prevents sharing connections via a protected Wi-Fi network
-    Sistempolico preventas kundividon de konektoj per protektita WiFi-reto
+    Sistempolitiko preventas kundividon de konektoj per protektita WiFi-reto
     La política del sistema evita compartir conexiones a través de una red WiFi protegida
     Sistemako arauek babestutako haririk gabeko sareen bidez konexioak partekatzea saihesten dute
     La stratégie du système empêche tout partage des connexions via un réseau WiFi protégé
@@ -501,6 +503,7 @@
   
     Modify personal network connections
     Eigene Netzwerkverbindungen bearbeiten
+    Modifi proprajn retkonektojn
     Modificar las conexiones de red personales
     Személyes hálózati kapcsolatok módosítása
     개인 네트워크 연결을 수정합니다
@@ -508,6 +511,7 @@
     Modyfikacja osobistych połączeń sieciowych
     System policy prevents modification of personal network settings
     Die Systemrichtlinien verhindern das Bearbeiten von eigenen Netzwerkeinstellungen
+    Sistempolitiko preventas modifadon de propraj retagordoj
     La política del sistema evita la modificación de la configuración personal de la red
     A rendszer házirendje megakadályozza a személyes hálózati beállítások módosítását
     시스템 정책이 개인 네트워크 설정의 수정을 금지합니다
@@ -522,6 +526,7 @@
   
     Modify network connections for all users
     Netzwerkverbindungen für alle Benutzer bearbeiten
+    Modifi retkonektojn por ĉiuj uzantoj
     Modificar las conexiones de red para todos los usuarios
     Hálózati kapcsolatok módosítása minden felhasználó számára
     모든 사용자의 네트워크 연결을 수정합니다
@@ -529,6 +534,7 @@
     Modyfikacja połączeń sieciowych dla wszystkich użytkowników
     System policy prevents modification of network settings for all users
     Die Systemrichtlinien verhindern das Bearbeiten von Netzwerkeinstellungen für alle Benutzer
+    Sistempolitiko preventas modifadon de retagordoj por ĉiuj uzantoj
     La política del sistema evita la modificación de la configuración de la red para todos los usuarios
     A rendszer házirendje megakadályozza a hálózati beállítások módosítását minden felhasználó számára
     시스템 정책이 모든 사용자의 네트워크 설정의 수정을 금지합니다
@@ -590,7 +596,7 @@
     Die Systemrichtlinien verhindern das Bearbeiten des ständigen Rechnernamens des Systems
     Η πολιτική συστήματος δεν επιτρέπει τροποποίηση του πάγιου ονόματος συστήματος
     System policy prevents modification of the persistent system hostname
-    Sistempolico preventas modifadon de la konstanta sistem-gastnomo
+    Sistempolitiko preventas modifadon de la konstanta sistem-gastnomo
     La política del sistema evita la modificación del nombre persistente del sistema
     Sistemako arauek sistemako ostalari-izen iraunkorra aldatzea saihesten dute
     La stratégie du système empêche toute modification du nom d'hôte du système persistant
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index d069eca7..5a6a61b6 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -390,6 +390,38 @@ dump_object_to_props (GObject *object, GHashTable *hash)
 	g_free (pspecs);
 }
 
+static void
+dump_dhcp4_to_props (NMDHCP4Config *config, GHashTable *hash)
+{
+	GSList *options, *iter;
+
+	options = nm_dhcp4_config_list_options (config);
+	for (iter = options; iter; iter = g_slist_next (iter)) {
+		const char *option = (const char *) iter->data;
+		const char *val;
+
+		val = nm_dhcp4_config_get_option (config, option);
+		value_hash_add_str (hash, option, val);
+	}
+	g_slist_free (options);
+}
+
+static void
+dump_dhcp6_to_props (NMDHCP6Config *config, GHashTable *hash)
+{
+	GSList *options, *iter;
+
+	options = nm_dhcp6_config_list_options (config);
+	for (iter = options; iter; iter = g_slist_next (iter)) {
+		const char *option = (const char *) iter->data;
+		const char *val;
+
+		val = nm_dhcp6_config_get_option (config, option);
+		value_hash_add_str (hash, option, val);
+	}
+	g_slist_free (options);
+}
+
 static void
 fill_device_props (NMDevice *device,
                    GHashTable *dev_hash,
@@ -420,11 +452,11 @@ fill_device_props (NMDevice *device,
 
 	dhcp4_config = nm_device_get_dhcp4_config (device);
 	if (dhcp4_config)
-		dump_object_to_props (G_OBJECT (dhcp4_config), dhcp4_hash);
+		dump_dhcp4_to_props (dhcp4_config, dhcp4_hash);
 
 	dhcp6_config = nm_device_get_dhcp6_config (device);
 	if (dhcp6_config)
-		dump_object_to_props (G_OBJECT (dhcp6_config), dhcp6_hash);
+		dump_dhcp6_to_props (dhcp6_config, dhcp6_hash);
 }
 
 static void
diff --git a/src/backends/Makefile.am b/src/backends/Makefile.am
index fbec9aaf..c0780d0b 100644
--- a/src/backends/Makefile.am
+++ b/src/backends/Makefile.am
@@ -63,10 +63,12 @@ endif
 
 libnmbackend_la_LIBADD += \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
 libnmbackend_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DG_DISABLE_DEPRECATED \
diff --git a/src/backends/Makefile.in b/src/backends/Makefile.in
index a9ea3e80..2f489e75 100644
--- a/src/backends/Makefile.in
+++ b/src/backends/Makefile.in
@@ -71,7 +71,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libnmbackend_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(top_builddir)/src/logging/libnm-logging.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 am__libnmbackend_la_SOURCES_DIST = NetworkManagerGeneric.c \
 	NetworkManagerGeneric.h NetworkManagerRedHat.c \
 	NetworkManagerSuSE.c NetworkManagerGentoo.c \
@@ -362,9 +363,10 @@ libnmbackend_la_SOURCES = NetworkManagerGeneric.c \
 	$(am__append_10) $(am__append_11) $(am__append_12) \
 	$(am__append_13)
 libnmbackend_la_LIBADD = $(am__append_9) \
-	$(top_builddir)/src/logging/libnm-logging.la $(DBUS_LIBS) \
-	$(GLIB_LIBS)
+	$(top_builddir)/src/logging/libnm-logging.la $(LIBNL_LIBS) \
+	$(DBUS_LIBS) $(GLIB_LIBS)
 libnmbackend_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DG_DISABLE_DEPRECATED \
diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.c b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
index cc5255ab..caf90f11 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient-utils.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2010 Red Hat, Inc.
+ * Copyright (C) 2011 Red Hat, Inc.
  */
 
 #include 
@@ -166,8 +166,19 @@ nm_dhcp_dhclient_create_config (const char *interface,
 		}
 
 		if (hostname) {
-			g_string_append_printf (new_contents, HOSTNAME_FORMAT "\n", hostname);
+			char *plain_hostname, *dot;
+
+			plain_hostname = g_strdup (hostname);
+			dot = strchr (plain_hostname, '.');
+
+			/* get rid of the domain */
+			if (dot)
+				*dot = '\0';
+
+			g_string_append_printf (new_contents, HOSTNAME_FORMAT "\n", plain_hostname);
 			added = TRUE;
+
+			g_free (plain_hostname);
 		}
 
 		if (added)
diff --git a/src/dns-manager/Makefile.am b/src/dns-manager/Makefile.am
index 7b5fc4f8..b51f667b 100644
--- a/src/dns-manager/Makefile.am
+++ b/src/dns-manager/Makefile.am
@@ -19,12 +19,14 @@ libdns_manager_la_SOURCES = \
 	nm-dns-utils.c
 
 libdns_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DLOCALSTATEDIR=\"$(localstatedir)\"
 
 libdns_manager_la_LIBADD = \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/dns-manager/Makefile.in b/src/dns-manager/Makefile.in
index 4937a601..aad1c562 100644
--- a/src/dns-manager/Makefile.in
+++ b/src/dns-manager/Makefile.in
@@ -58,7 +58,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libdns_manager_la_DEPENDENCIES =  \
 	$(top_builddir)/src/logging/libnm-logging.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 am_libdns_manager_la_OBJECTS = libdns_manager_la-nm-dns-manager.lo \
 	libdns_manager_la-nm-dns-plugin.lo \
 	libdns_manager_la-nm-dns-dnsmasq.lo \
@@ -325,12 +326,14 @@ libdns_manager_la_SOURCES = \
 	nm-dns-utils.c
 
 libdns_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DLOCALSTATEDIR=\"$(localstatedir)\"
 
 libdns_manager_la_LIBADD = \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/ip6-manager/Makefile.am b/src/ip6-manager/Makefile.am
index b56b197e..b98d6def 100644
--- a/src/ip6-manager/Makefile.am
+++ b/src/ip6-manager/Makefile.am
@@ -13,6 +13,7 @@ libip6_manager_la_SOURCES = \
 	nm-ip6-manager.h
 
 libip6_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DG_DISABLE_DEPRECATED
@@ -20,6 +21,7 @@ libip6_manager_la_CPPFLAGS = \
 libip6_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/ip6-manager/Makefile.in b/src/ip6-manager/Makefile.in
index 344ca0ea..33539f51 100644
--- a/src/ip6-manager/Makefile.in
+++ b/src/ip6-manager/Makefile.in
@@ -59,7 +59,8 @@ am__DEPENDENCIES_1 =
 libip6_manager_la_DEPENDENCIES =  \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 am_libip6_manager_la_OBJECTS = libip6_manager_la-nm-ip6-manager.lo
 libip6_manager_la_OBJECTS = $(am_libip6_manager_la_OBJECTS)
 AM_V_lt = $(am__v_lt_$(V))
@@ -316,6 +317,7 @@ libip6_manager_la_SOURCES = \
 	nm-ip6-manager.h
 
 libip6_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	-DG_DISABLE_DEPRECATED
@@ -323,6 +325,7 @@ libip6_manager_la_CPPFLAGS = \
 libip6_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/logging/nm-logging.c b/src/logging/nm-logging.c
index 1e289d37..d8353f27 100644
--- a/src/logging/nm-logging.c
+++ b/src/logging/nm-logging.c
@@ -218,6 +218,12 @@ nm_logging_level_enabled (guint32 level)
 	return !!(log_level & level);
 }
 
+gboolean
+nm_logging_domain_enabled (guint32 domain)
+{
+	return !!(log_domains & domain);
+}
+
 void
 _nm_log (const char *loc,
          const char *func,
diff --git a/src/logging/nm-logging.h b/src/logging/nm-logging.h
index 44e49a71..e3e05f59 100644
--- a/src/logging/nm-logging.h
+++ b/src/logging/nm-logging.h
@@ -95,6 +95,7 @@ void _nm_log (const char *loc,
 const char *nm_logging_level_to_string (void);
 char *nm_logging_domains_to_string (void);
 gboolean nm_logging_level_enabled (guint32 level);
+gboolean nm_logging_domain_enabled (guint32 domain);
 
 /* Undefine the nm-utils.h logging stuff to ensure errors */
 #undef nm_print_backtrace
diff --git a/src/modem-manager/Makefile.am b/src/modem-manager/Makefile.am
index db680aea..3c3af16c 100644
--- a/src/modem-manager/Makefile.am
+++ b/src/modem-manager/Makefile.am
@@ -19,10 +19,12 @@ libmodem_manager_la_SOURCES = \
 	nm-modem-types.h
 
 libmodem_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS)
 
 libmodem_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS)
 
diff --git a/src/modem-manager/Makefile.in b/src/modem-manager/Makefile.in
index 66f7c1bc..2a054f70 100644
--- a/src/modem-manager/Makefile.in
+++ b/src/modem-manager/Makefile.in
@@ -59,7 +59,7 @@ am__DEPENDENCIES_1 =
 libmodem_manager_la_DEPENDENCIES =  \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
-	$(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am_libmodem_manager_la_OBJECTS = libmodem_manager_la-nm-modem.lo \
 	libmodem_manager_la-nm-modem-cdma.lo \
 	libmodem_manager_la-nm-modem-gsm.lo \
@@ -325,11 +325,13 @@ libmodem_manager_la_SOURCES = \
 	nm-modem-types.h
 
 libmodem_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS) \
 	$(DBUS_CFLAGS)
 
 libmodem_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS)
 
 all: all-am
diff --git a/src/nm-device-interface.c b/src/nm-device-interface.c
index 6d2b8762..fb471f57 100644
--- a/src/nm-device-interface.c
+++ b/src/nm-device-interface.c
@@ -164,6 +164,14 @@ nm_device_interface_init (gpointer g_iface)
 							0, G_MAXUINT32, NM_DEVICE_STATE_UNKNOWN,
 							G_PARAM_READABLE));
 
+	g_object_interface_install_property
+		(g_iface,
+		 g_param_spec_boxed (NM_DEVICE_INTERFACE_ACTIVE_CONNECTION,
+		                     "ActiveConnection",
+		                     "ActiveConnection",
+		                     DBUS_TYPE_G_OBJECT_PATH,
+		                     G_PARAM_READABLE));
+
 	g_object_interface_install_property
 		(g_iface,
 		 g_param_spec_uint (NM_DEVICE_INTERFACE_DEVICE_TYPE,
diff --git a/src/nm-device-interface.h b/src/nm-device-interface.h
index f39e8459..560cdfe5 100644
--- a/src/nm-device-interface.h
+++ b/src/nm-device-interface.h
@@ -58,6 +58,7 @@ typedef enum
 #define NM_DEVICE_INTERFACE_IP6_CONFIG       "ip6-config"
 #define NM_DEVICE_INTERFACE_DHCP6_CONFIG     "dhcp6-config"
 #define NM_DEVICE_INTERFACE_STATE            "state"
+#define NM_DEVICE_INTERFACE_ACTIVE_CONNECTION "active-connection"
 #define NM_DEVICE_INTERFACE_DEVICE_TYPE      "device-type" /* ugh */
 #define NM_DEVICE_INTERFACE_MANAGED          "managed"
 #define NM_DEVICE_INTERFACE_FIRMWARE_MISSING "firmware-missing"
@@ -79,6 +80,7 @@ typedef enum {
 	NM_DEVICE_INTERFACE_PROP_IP6_CONFIG,
 	NM_DEVICE_INTERFACE_PROP_DHCP6_CONFIG,
 	NM_DEVICE_INTERFACE_PROP_STATE,
+	NM_DEVICE_INTERFACE_PROP_ACTIVE_CONNECTION,
 	NM_DEVICE_INTERFACE_PROP_DEVICE_TYPE,
 	NM_DEVICE_INTERFACE_PROP_MANAGED,
 	NM_DEVICE_INTERFACE_PROP_FIRMWARE_MISSING,
diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c
index 9258f77c..7a6e7528 100644
--- a/src/nm-device-wifi.c
+++ b/src/nm-device-wifi.c
@@ -1460,6 +1460,26 @@ real_complete_connection (NMDevice *device,
 	if (ap) {
 		ssid = nm_ap_get_ssid (ap);
 
+		if (ssid == NULL) {
+			/* The AP must be hidden.  Connecting to a WiFi AP requires the SSID
+			 * as part of the initial handshake, so check the connection details
+			 * for the SSID.  The AP object will still be used for encryption
+			 * settings and such.
+			 */
+			ssid = nm_setting_wireless_get_ssid (s_wifi);
+		}
+
+		if (ssid == NULL) {
+			/* If there's no SSID on the AP itself, and no SSID in the
+			 * connection data, then we cannot connect at all.  Return an error.
+			 */
+			g_set_error_literal (error,
+			                     NM_WIFI_ERROR,
+			                     NM_WIFI_ERROR_CONNECTION_INVALID,
+			                     "A 'wireless' setting with a valid SSID is required for hidden access points.");
+			return FALSE;
+		}
+
 		/* If the SSID is a well-known SSID, lock the connection to the AP's
 		 * specific BSSID so NM doesn't autoconnect to some random wifi net.
 		 */
@@ -2851,7 +2871,7 @@ remove_supplicant_timeouts (NMDeviceWifi *self)
 }
 
 static guint32
-find_supported_frequency (NMDeviceWifi *self, guint32 *freqs)
+find_supported_frequency (NMDeviceWifi *self, const guint32 *freqs)
 {
 	NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
 	int i;
@@ -2887,25 +2907,25 @@ build_supplicant_config (NMDeviceWifi *self,
 	if (!config)
 		return NULL;
 
-	/* Figure out the Ad-Hoc frequency to use if creating an adhoc network; if
-	 * nothing was specified then pick something usable.
+	/* Supplicant requires an initial frequency for Ad-Hoc networks; if the user
+	 * didn't specify one and we didn't find an AP that matched the connection,
+	 * just pick a frequency the device supports.
 	 */
-	if ((nm_ap_get_mode (ap) == NM_802_11_MODE_ADHOC) && nm_ap_get_user_created (ap)) {
+	if (nm_ap_get_mode (ap) == NM_802_11_MODE_ADHOC) {
 		const char *band = nm_setting_wireless_get_band (s_wireless);
+		const guint32 a_freqs[] = { 5180, 5200, 5220, 5745, 5765, 5785, 5805, 0 };
+		const guint32 bg_freqs[] = { 2412, 2437, 2462, 2472, 0 };
 
 		adhoc_freq = nm_ap_get_freq (ap);
 		if (!adhoc_freq) {
-			if (band && !strcmp (band, "a")) {
-				guint32 a_freqs[] = {5180, 5200, 5220, 5745, 5765, 5785, 5805, 0};
+			if (g_strcmp0 (band, "a") == 0)
 				adhoc_freq = find_supported_frequency (self, a_freqs);
-			} else {
-				guint32 bg_freqs[] = {2412, 2437, 2462, 2472, 0};
+			else
 				adhoc_freq = find_supported_frequency (self, bg_freqs);
-			}
 		}
 
 		if (!adhoc_freq) {
-			if (band && !strcmp (band, "a"))
+			if (g_strcmp0 (band, "a") == 0)
 				adhoc_freq = 5180;
 			else
 				adhoc_freq = 2462;
@@ -3098,15 +3118,8 @@ real_act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
 		ap = nm_ap_new_fake_from_connection (connection);
 		g_return_val_if_fail (ap != NULL, NM_ACT_STAGE_RETURN_FAILURE);
 
-		switch (nm_ap_get_mode (ap)) {
-			case NM_802_11_MODE_ADHOC:
-				nm_ap_set_user_created (ap, TRUE);
-				break;
-			case NM_802_11_MODE_INFRA:
-			default:
-				nm_ap_set_broadcast (ap, FALSE);
-				break;
-		}
+		if (nm_ap_get_mode (ap) == NM_802_11_MODE_INFRA)
+			nm_ap_set_broadcast (ap, FALSE);
 
 		priv->ap_list = g_slist_prepend (priv->ap_list, ap);
 		nm_ap_export_to_dbus (ap);
@@ -3399,7 +3412,7 @@ activation_success_handler (NMDevice *dev)
 		nm_ap_set_address (ap, &bssid);
 	if (!nm_ap_get_freq (ap))
 		nm_ap_set_freq (ap, nm_device_wifi_get_frequency (self));
-	if (!nm_ap_get_max_bitrate (ap) && nm_ap_get_user_created (ap))
+	if (!nm_ap_get_max_bitrate (ap))
 		nm_ap_set_max_bitrate (ap, nm_device_wifi_get_bitrate (self));
 
 	tmp_ap = get_active_ap (self, ap, TRUE);
diff --git a/src/nm-device.c b/src/nm-device.c
index ebd8cdb9..4b7ec5df 100644
--- a/src/nm-device.c
+++ b/src/nm-device.c
@@ -3463,6 +3463,7 @@ get_property (GObject *object, guint prop_id,
 	NMDevice *self = NM_DEVICE (object);
 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
 	NMDeviceState state;
+	const char *ac_path = NULL;
 
 	state = nm_device_get_state (self);
 
@@ -3518,6 +3519,11 @@ get_property (GObject *object, guint prop_id,
 	case NM_DEVICE_INTERFACE_PROP_STATE:
 		g_value_set_uint (value, priv->state);
 		break;
+	case NM_DEVICE_INTERFACE_PROP_ACTIVE_CONNECTION:
+		if (priv->act_request)
+			ac_path = nm_act_request_get_active_connection_path (priv->act_request);
+		g_value_set_boxed (value, ac_path ? ac_path : "/");
+		break;
 	case NM_DEVICE_INTERFACE_PROP_DEVICE_TYPE:
 		g_value_set_uint (value, priv->type);
 		break;
@@ -3615,6 +3621,10 @@ nm_device_class_init (NMDeviceClass *klass)
 									  NM_DEVICE_INTERFACE_PROP_STATE,
 									  NM_DEVICE_INTERFACE_STATE);
 
+	g_object_class_override_property (object_class,
+	                                  NM_DEVICE_INTERFACE_PROP_ACTIVE_CONNECTION,
+	                                  NM_DEVICE_INTERFACE_ACTIVE_CONNECTION);
+
 	g_object_class_override_property (object_class,
 									  NM_DEVICE_INTERFACE_PROP_DEVICE_TYPE,
 									  NM_DEVICE_INTERFACE_DEVICE_TYPE);
@@ -3809,7 +3819,7 @@ reason_to_string (NMDeviceStateReason reason)
 	case NM_DEVICE_STATE_REASON_USER_REQUESTED:
 		return "user-requested";
 	case NM_DEVICE_STATE_REASON_CARRIER:
-		return "carrier-chagned";
+		return "carrier-changed";
 	case NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED:
 		return "connection-assumed";
 	case NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE:
diff --git a/src/nm-dhcp4-config.c b/src/nm-dhcp4-config.c
index 5acf053f..567ba687 100644
--- a/src/nm-dhcp4-config.c
+++ b/src/nm-dhcp4-config.c
@@ -101,6 +101,23 @@ nm_dhcp4_config_get_option (NMDHCP4Config *self, const char *key)
 	return value ? g_value_get_string (value) : NULL;
 }
 
+/* Caller owns the list, but not the values in the list */
+GSList *
+nm_dhcp4_config_list_options (NMDHCP4Config *self)
+{
+	GHashTableIter iter;
+	const char *option = NULL;
+	GSList *list = NULL;
+
+	g_return_val_if_fail (NM_IS_DHCP4_CONFIG (self), NULL);
+
+	g_hash_table_iter_init (&iter, NM_DHCP4_CONFIG_GET_PRIVATE (self)->options);
+	while (g_hash_table_iter_next (&iter, (gpointer) &option, NULL))
+		list = g_slist_prepend (list, (gpointer) option);
+
+	return list;
+}
+
 const char *
 nm_dhcp4_config_get_dbus_path (NMDHCP4Config *self)
 {
diff --git a/src/nm-dhcp4-config.h b/src/nm-dhcp4-config.h
index ffaa8430..4729da4c 100644
--- a/src/nm-dhcp4-config.h
+++ b/src/nm-dhcp4-config.h
@@ -58,4 +58,6 @@ void nm_dhcp4_config_reset (NMDHCP4Config *config);
 
 const char *nm_dhcp4_config_get_option (NMDHCP4Config *config, const char *option);
 
+GSList *nm_dhcp4_config_list_options (NMDHCP4Config *config);
+
 #endif /* NM_DHCP4_CONFIG_H */
diff --git a/src/nm-dhcp6-config.c b/src/nm-dhcp6-config.c
index fb6ccce5..885e5f84 100644
--- a/src/nm-dhcp6-config.c
+++ b/src/nm-dhcp6-config.c
@@ -101,6 +101,23 @@ nm_dhcp6_config_get_option (NMDHCP6Config *self, const char *key)
 	return value ? g_value_get_string (value) : NULL;
 }
 
+/* Caller owns the list, but not the values in the list */
+GSList *
+nm_dhcp6_config_list_options (NMDHCP6Config *self)
+{
+	GHashTableIter iter;
+	const char *option = NULL;
+	GSList *list = NULL;
+
+	g_return_val_if_fail (NM_IS_DHCP6_CONFIG (self), NULL);
+
+	g_hash_table_iter_init (&iter, NM_DHCP6_CONFIG_GET_PRIVATE (self)->options);
+	while (g_hash_table_iter_next (&iter, (gpointer) &option, NULL))
+		list = g_slist_prepend (list, (gpointer) option);
+
+	return list;
+}
+
 const char *
 nm_dhcp6_config_get_dbus_path (NMDHCP6Config *self)
 {
diff --git a/src/nm-dhcp6-config.h b/src/nm-dhcp6-config.h
index 90eb10ff..5e83b904 100644
--- a/src/nm-dhcp6-config.h
+++ b/src/nm-dhcp6-config.h
@@ -58,4 +58,6 @@ void nm_dhcp6_config_reset (NMDHCP6Config *config);
 
 const char *nm_dhcp6_config_get_option (NMDHCP6Config *config, const char *option);
 
+GSList *nm_dhcp6_config_list_options (NMDHCP6Config *self);
+
 #endif /* NM_DHCP6_CONFIG_H */
diff --git a/src/nm-manager-auth.c b/src/nm-manager-auth.c
index 8515959e..9171663b 100644
--- a/src/nm-manager-auth.c
+++ b/src/nm-manager-auth.c
@@ -18,17 +18,25 @@
  * Copyright (C) 2010 Red Hat, Inc.
  */
 
+#include 
 #include 
 #include 
+#include 
 
-#include 
+#if WITH_POLKIT
+#include 
+#endif
+
+#include "nm-setting-connection.h"
 #include "nm-manager-auth.h"
 #include "nm-logging.h"
 #include "nm-dbus-manager.h"
 
 struct NMAuthChain {
 	guint32 refcount;
+#if WITH_POLKIT
 	PolkitAuthority *authority;
+#endif
 	GSList *calls;
 	GHashTable *data;
 
@@ -37,7 +45,6 @@ struct NMAuthChain {
 	GError *error;
 
 	NMAuthChainResultFunc done_func;
-	NMAuthChainCallFunc call_func;
 	gpointer user_data;
 };
 
@@ -45,8 +52,9 @@ typedef struct {
 	NMAuthChain *chain;
 	GCancellable *cancellable;
 	char *permission;
+	guint idle_id;
 	gboolean disposed;
-} PolkitCall;
+} AuthCall;
 
 typedef struct {
 	gpointer data;
@@ -64,20 +72,31 @@ free_data (gpointer data)
 	g_free (tmp);
 }
 
-static void
-default_call_func (NMAuthChain *chain,
-                   const char *permission,
-                   GError *error,
-                   NMAuthCallResult result,
-                   gpointer user_data)
+#if WITH_POLKIT
+static PolkitAuthority *
+pk_authority_get (void)
 {
-	if (!error)
-		nm_auth_chain_set_data (chain, permission, GUINT_TO_POINTER (result), NULL);
+	static PolkitAuthority *authority = NULL;
+	GError *error = NULL;
+
+	if (authority == NULL) {
+		authority = polkit_authority_get_sync (NULL, &error);
+		if (authority == NULL) {
+			nm_log_err (LOGD_CORE, "Failed to initialize PolicyKit: (%d) %s",
+			            error ? error->code : -1,
+			            (error && error->message) ? error->message : "(unknown)");
+			g_clear_error (&error);
+			return NULL;
+		}
+	}
+
+	/* Yes, ref every time; we want to keep the object alive */
+	return g_object_ref (authority);
 }
+#endif
 
 static NMAuthChain *
-_auth_chain_new (PolkitAuthority *authority,
-                 DBusGMethodInvocation *context,
+_auth_chain_new (DBusGMethodInvocation *context,
                  DBusGProxy *proxy,
                  DBusMessage *message,
                  const char *dbus_sender,
@@ -90,10 +109,11 @@ _auth_chain_new (PolkitAuthority *authority,
 
 	self = g_malloc0 (sizeof (NMAuthChain));
 	self->refcount = 1;
-	self->authority = g_object_ref (authority);
+#if WITH_POLKIT
+	self->authority = pk_authority_get ();
+#endif
 	self->data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_data);
 	self->done_func = done_func;
-	self->call_func = /* call_func ? call_func : */ default_call_func;
 	self->user_data = user_data;
 	self->context = context;
 
@@ -117,31 +137,28 @@ _auth_chain_new (PolkitAuthority *authority,
 }
 
 NMAuthChain *
-nm_auth_chain_new (PolkitAuthority *authority,
-                   DBusGMethodInvocation *context,
+nm_auth_chain_new (DBusGMethodInvocation *context,
                    DBusGProxy *proxy,
                    NMAuthChainResultFunc done_func,
                    gpointer user_data)
 {
-	return _auth_chain_new (authority, context, proxy, NULL, NULL, done_func, user_data);
+	return _auth_chain_new (context, proxy, NULL, NULL, done_func, user_data);
 }
 
 NMAuthChain *
-nm_auth_chain_new_raw_message (PolkitAuthority *authority,
-                               DBusMessage *message,
+nm_auth_chain_new_raw_message (DBusMessage *message,
                                NMAuthChainResultFunc done_func,
                                gpointer user_data)
 {
-	return _auth_chain_new (authority, NULL, NULL, message, NULL, done_func, user_data);
+	return _auth_chain_new (NULL, NULL, message, NULL, done_func, user_data);
 }
 
 NMAuthChain *
-nm_auth_chain_new_dbus_sender (PolkitAuthority *authority,
-                               const char *dbus_sender,
+nm_auth_chain_new_dbus_sender (const char *dbus_sender,
                                NMAuthChainResultFunc done_func,
                                gpointer user_data)
 {
-	return _auth_chain_new (authority, NULL, NULL, NULL, dbus_sender, done_func, user_data);
+	return _auth_chain_new (NULL, NULL, NULL, dbus_sender, done_func, user_data);
 }
 
 gpointer
@@ -229,14 +246,36 @@ nm_auth_chain_check_done (NMAuthChain *self)
 }
 
 static void
-polkit_call_cancel (PolkitCall *call)
+nm_auth_chain_remove_call (NMAuthChain *self, AuthCall *call)
+{
+	g_return_if_fail (self != NULL);
+	g_return_if_fail (call != NULL);
+
+	self->calls = g_slist_remove (self->calls, call);
+}
+
+static AuthCall *
+auth_call_new (NMAuthChain *chain, const char *permission)
+{
+	AuthCall *call;
+
+	call = g_malloc0 (sizeof (AuthCall));
+	call->chain = chain;
+	call->permission = g_strdup (permission);
+	call->cancellable = g_cancellable_new ();
+	chain->calls = g_slist_append (chain->calls, call);
+	return call;
+}
+
+static void
+auth_call_cancel (AuthCall *call)
 {
 	call->disposed = TRUE;
 	g_cancellable_cancel (call->cancellable);
 }
 
 static void
-polkit_call_free (PolkitCall *call)
+auth_call_free (AuthCall *call)
 {
 	g_return_if_fail (call != NULL);
 
@@ -246,30 +285,49 @@ polkit_call_free (PolkitCall *call)
 	call->chain = NULL;
 	g_object_unref (call->cancellable);
 	call->cancellable = NULL;
+	if (call->idle_id)
+		g_source_remove (call->idle_id);
+	memset (call, 0, sizeof (*call));
 	g_free (call);
 }
 
+/* This can get used from scheduled idles, hence the boolean return */
+static gboolean
+auth_call_complete (AuthCall *call)
+{
+	g_return_val_if_fail (call != NULL, FALSE);
+
+	call->idle_id = 0;
+	nm_auth_chain_remove_call (call->chain, call);
+	nm_auth_chain_check_done (call->chain);
+	auth_call_free (call);
+	return FALSE;
+}
+
+static void
+auth_call_schedule_early_finish (AuthCall *call, GError *error)
+{
+	if (!call->chain->error)
+		call->chain->error = error;
+	call->idle_id = g_idle_add ((GSourceFunc) auth_call_complete, call);
+}
+
+#if WITH_POLKIT
 static void
 pk_call_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 {
-	PolkitCall *call = user_data;
-	NMAuthChain *chain;
+	AuthCall *call = user_data;
+	NMAuthChain *chain = call->chain;
 	PolkitAuthorizationResult *pk_result;
 	GError *error = NULL;
-	guint call_result = NM_AUTH_CALL_RESULT_UNKNOWN;
 
 	/* If the call is already disposed do nothing */
 	if (call->disposed) {
-		polkit_call_free (call);
+		auth_call_free (call);
 		return;
 	}
 
-	chain = call->chain;
-	chain->calls = g_slist_remove (chain->calls, call);
-
-	pk_result = polkit_authority_check_authorization_finish (chain->authority,
-	                                                         result,
-	                                                         &error);
+	pk_result = polkit_authority_check_authorization_finish (chain->authority, result, &error);
 	if (error) {
 		if (!chain->error)
 			chain->error = g_error_copy (error);
@@ -279,6 +337,8 @@ pk_call_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 		             error ? error->code : -1,
 		             error && error->message ? error->message : "(unknown)");
 	} else {
+		guint call_result = NM_AUTH_CALL_RESULT_UNKNOWN;
+
 		if (polkit_authorization_result_get_is_authorized (pk_result)) {
 			/* Caller has the permission */
 			call_result = NM_AUTH_CALL_RESULT_YES;
@@ -287,23 +347,26 @@ pk_call_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 			call_result = NM_AUTH_CALL_RESULT_AUTH;
 		} else
 			call_result = NM_AUTH_CALL_RESULT_NO;
-	}
 
-	chain->call_func (chain, call->permission, error, call_result, chain->user_data);
-	nm_auth_chain_check_done (chain);
+		nm_auth_chain_set_data (chain, call->permission, GUINT_TO_POINTER (call_result), NULL);
+	}
 
 	g_clear_error (&error);
-	polkit_call_free (call);
 	if (pk_result)
 		g_object_unref (pk_result);
+
+	auth_call_complete (call);
 }
+#endif
 
 gboolean
 nm_auth_chain_add_call (NMAuthChain *self,
                         const char *permission,
                         gboolean allow_interaction)
 {
-	PolkitCall *call;
+	AuthCall *call;
+
+#if WITH_POLKIT
 	PolkitSubject *subject;
 	PolkitCheckAuthorizationFlags flags = POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE;
 
@@ -315,12 +378,14 @@ nm_auth_chain_add_call (NMAuthChain *self,
 	if (!subject)
 		return FALSE;
 
-	call = g_malloc0 (sizeof (PolkitCall));
-	call->chain = self;
-	call->permission = g_strdup (permission);
-	call->cancellable = g_cancellable_new ();
+	call = auth_call_new (self, permission);
 
-	self->calls = g_slist_append (self->calls, call);
+	if (self->authority == NULL) {
+		/* No polkit, no authorization */
+		auth_call_schedule_early_finish (call, g_error_new_literal (0, 0, "PolicyKit unavailable"));
+		g_object_unref (subject);
+		return FALSE;
+	}
 
 	if (allow_interaction)
 		flags = POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION;
@@ -334,6 +399,17 @@ nm_auth_chain_add_call (NMAuthChain *self,
 	                                      pk_call_cb,
 	                                      call);
 	g_object_unref (subject);
+#else
+	/* -- NO POLKIT -- */
+
+	g_return_val_if_fail (self != NULL, FALSE);
+
+	/* When PolicyKit is disabled, everything is authorized */
+	call = auth_call_new (self, permission);
+	nm_auth_chain_set_data (self, permission, GUINT_TO_POINTER (NM_AUTH_CALL_RESULT_YES), NULL);
+	auth_call_schedule_early_finish (call, NULL);
+#endif
+
 	return TRUE;
 }
 
@@ -348,11 +424,14 @@ nm_auth_chain_unref (NMAuthChain *self)
 	if (self->refcount > 0)
 		return;
 
-	g_object_unref (self->authority);
+#if WITH_POLKIT
+	if (self->authority)
+		g_object_unref (self->authority);
+#endif
 	g_free (self->owner);
 
 	for (iter = self->calls; iter; iter = g_slist_next (iter))
-		polkit_call_cancel ((PolkitCall *) iter->data);
+		auth_call_cancel ((AuthCall *) iter->data);
 	g_slist_free (self->calls);
 
 	g_clear_error (&self->error);
@@ -460,3 +539,50 @@ nm_auth_uid_in_acl (NMConnection *connection,
 	return TRUE;
 }
 
+typedef struct {
+	GDestroyNotify changed_callback;
+	gpointer changed_data;
+} PkChangedInfo;
+
+#if WITH_POLKIT
+static void
+pk_authority_changed_cb (GObject *object, PkChangedInfo *info)
+{
+	info->changed_callback (info->changed_data);
+}
+#endif
+
+void
+nm_auth_set_changed_func (GDestroyNotify callback, gpointer callback_data)
+{
+#if WITH_POLKIT
+	static PkChangedInfo info = { NULL, NULL };
+	static guint32 changed_id = 0;
+	PolkitAuthority *authority;
+
+	authority = pk_authority_get ();
+	if (!authority)
+		return;
+
+	if (callback == NULL) {
+		/* Clearing the callback */
+		info.changed_callback = NULL;
+		info.changed_data = NULL;
+		g_signal_handler_disconnect (authority, changed_id);
+		changed_id = 0;
+	} else {
+		info.changed_callback = callback;
+		info.changed_data= callback_data;
+
+		if (changed_id == 0) {
+			changed_id = g_signal_connect (authority,
+			                               "changed",
+			                               G_CALLBACK (pk_authority_changed_cb),
+			                               &info);
+		}
+	}
+
+	g_object_unref (authority);
+#endif
+}
+
diff --git a/src/nm-manager-auth.h b/src/nm-manager-auth.h
index 7e7ff7a1..ad14d306 100644
--- a/src/nm-manager-auth.h
+++ b/src/nm-manager-auth.h
@@ -21,7 +21,6 @@
 #ifndef NM_MANAGER_AUTH_H
 #define NM_MANAGER_AUTH_H
 
-#include 
 #include 
 #include 
 
@@ -56,25 +55,16 @@ typedef void (*NMAuthChainResultFunc) (NMAuthChain *chain,
                                        DBusGMethodInvocation *context,
                                        gpointer user_data);
 
-typedef void (*NMAuthChainCallFunc) (NMAuthChain *chain,
-                                     const char *permission,
-                                     GError *error,
-                                     NMAuthCallResult result,
-                                     gpointer user_data);
-
-NMAuthChain *nm_auth_chain_new (PolkitAuthority *authority,
-                                DBusGMethodInvocation *context,
+NMAuthChain *nm_auth_chain_new (DBusGMethodInvocation *context,
                                 DBusGProxy *proxy,
                                 NMAuthChainResultFunc done_func,
                                 gpointer user_data);
 
-NMAuthChain *nm_auth_chain_new_raw_message (PolkitAuthority *authority,
-                                            DBusMessage *message,
+NMAuthChain *nm_auth_chain_new_raw_message (DBusMessage *message,
                                             NMAuthChainResultFunc done_func,
                                             gpointer user_data);
 
-NMAuthChain *nm_auth_chain_new_dbus_sender (PolkitAuthority *authority,
-                                            const char *dbus_sender,
+NMAuthChain *nm_auth_chain_new_dbus_sender (const char *dbus_sender,
                                             NMAuthChainResultFunc done_func,
                                             gpointer user_data);
 
@@ -112,5 +102,7 @@ gboolean nm_auth_uid_in_acl (NMConnection *connection,
                              gulong uid,
                              char **out_error_desc);
 
+void nm_auth_set_changed_func (GDestroyNotify callback, gpointer callback_data);
+
 #endif /* NM_MANAGER_AUTH_H */
 
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 568ff2ae..961c9d8c 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "nm-glib-compat.h"
@@ -158,22 +159,6 @@ static GSList * remove_one_device (NMManager *manager,
                                    NMDevice *device,
                                    gboolean quitting);
 
-static NMDevice *nm_manager_get_device_by_udi (NMManager *manager, const char *udi);
-
-/* Fix for polkit 0.97 and later */
-#if !HAVE_POLKIT_AUTHORITY_GET_SYNC
-static inline PolkitAuthority *
-polkit_authority_get_sync (GCancellable *cancellable, GError **error)
-{
-	PolkitAuthority *authority;
-
-	authority = polkit_authority_get ();
-	if (!authority)
-		g_set_error (error, 0, 0, "failed to get the PolicyKit authority");
-	return authority;
-}
-#endif
-
 #define SSD_POKE_INTERVAL 120
 #define ORIGDEV_TAG "originating-device"
 
@@ -185,7 +170,6 @@ struct PendingActivation {
 	NMManager *manager;
 
 	DBusGMethodInvocation *context;
-	PolkitAuthority *authority;
 	PendingActivationFunc callback;
 	NMAuthChain *chain;
 
@@ -237,8 +221,6 @@ typedef struct {
 	DBusGProxy *aipd_proxy;
 	DBusGProxy *upower_proxy;
 
-	PolkitAuthority *authority;
-	guint auth_changed_id;
 	GSList *auth_chains;
 
 	/* Firmware dir monitor */
@@ -679,7 +661,6 @@ try_complete_vpn (NMConnection *connection, GSList *existing, GError **error)
 
 static PendingActivation *
 pending_activation_new (NMManager *manager,
-                        PolkitAuthority *authority,
                         DBusGMethodInvocation *context,
                         const char *device_path,
                         const char *connection_path,
@@ -696,7 +677,6 @@ pending_activation_new (NMManager *manager,
 	gboolean success;
 
 	g_return_val_if_fail (manager != NULL, NULL);
-	g_return_val_if_fail (authority != NULL, NULL);
 	g_return_val_if_fail (context != NULL, NULL);
 	g_return_val_if_fail (device_path != NULL, NULL);
 
@@ -744,7 +724,6 @@ pending_activation_new (NMManager *manager,
 
 	pending = g_slice_new0 (PendingActivation);
 	pending->manager = manager;
-	pending->authority = authority;
 	pending->context = context;
 	pending->callback = callback;
 
@@ -767,31 +746,23 @@ pending_auth_net_done (NMAuthChain *chain,
 {
 	PendingActivation *pending = user_data;
 	NMAuthCallResult result;
+	GError *tmp_error = NULL;
 
 	pending->chain = NULL;
 
-	if (error) {
-		pending->callback (pending, error);
-		goto out;
-	}
-
 	/* Caller has had a chance to obtain authorization, so we only need to
 	 * check for 'yes' here.
 	 */
 	result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL));
 	if (result != NM_AUTH_CALL_RESULT_YES) {
-		error = g_error_new_literal (NM_MANAGER_ERROR,
-		                             NM_MANAGER_ERROR_PERMISSION_DENIED,
-		                             "Not authorized to control networking.");
-		pending->callback (pending, error);
-		g_error_free (error);
-		goto out;
+		tmp_error = g_error_new_literal (NM_MANAGER_ERROR,
+		                                 NM_MANAGER_ERROR_PERMISSION_DENIED,
+		                                 "Not authorized to control networking.");
 	}
 
-	pending->callback (pending, NULL);
-
-out:
+	pending->callback (pending, tmp_error);
 	nm_auth_chain_unref (chain);
+	g_clear_error (&tmp_error);
 }
 
 static void
@@ -827,8 +798,7 @@ pending_activation_check_authorized (PendingActivation *pending,
 	/* First check if the user is allowed to use networking at all, giving
 	 * the user a chance to authenticate to gain the permission.
 	 */
-	pending->chain = nm_auth_chain_new (pending->authority,
-	                                    pending->context,
+	pending->chain = nm_auth_chain_new (pending->context,
 	                                    NULL,
 	                                    pending_auth_net_done,
 	                                    pending);
@@ -1110,7 +1080,7 @@ manager_hidden_ap_found (NMDeviceInterface *device,
 			struct ether_addr seen_addr;
 
 			if (ether_aton_r (seen_bssid, &seen_addr)) {
-				if (memcmp (ap_addr, &seen_addr, sizeof (struct ether_addr))) {
+				if (memcmp (ap_addr, &seen_addr, sizeof (struct ether_addr)) == 0) {
 					/* Copy the SSID from the connection to the AP */
 					nm_ap_set_ssid (ap, ssid);
 					done = TRUE;
@@ -1388,7 +1358,7 @@ manager_device_disconnect_request (NMDevice *device,
 		NMAuthChain *chain;
 
 		/* Otherwise validate the user request */
-		chain = nm_auth_chain_new (priv->authority, context, NULL, disconnect_net_auth_done_cb, self);
+		chain = nm_auth_chain_new (context, NULL, disconnect_net_auth_done_cb, self);
 		g_assert (chain);
 		priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 
@@ -2103,7 +2073,6 @@ impl_manager_activate_connection (NMManager *self,
 	 * activate the connection.
 	 */
 	pending = pending_activation_new (self,
-	                                  priv->authority,
 	                                  context,
 	                                  device_path,
 	                                  connection_path,
@@ -2172,7 +2141,6 @@ impl_manager_add_and_activate_connection (NMManager *self,
 	 * activate the connection.
 	 */
 	pending = pending_activation_new (self,
-	                                  priv->authority,
 	                                  context,
 	                                  device_path,
 	                                  NULL,
@@ -2236,37 +2204,35 @@ done:
 
 static void
 deactivate_net_auth_done_cb (NMAuthChain *chain,
-                             GError *error,
+                             GError *auth_error,
                              DBusGMethodInvocation *context,
                              gpointer user_data)
 {
 	NMManager *self = NM_MANAGER (user_data);
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
-	GError *ret_error = NULL;
+	GError *error = NULL;
 	NMAuthCallResult result;
 	const char *active_path;
 
 	priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
 
 	result = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL));
-	ret_error = deactivate_disconnect_check_error (error, result, "Deactivate");
-	if (ret_error) {
-		dbus_g_method_return_error (context, ret_error);
-		g_error_free (ret_error);
-		goto done;
+	error = deactivate_disconnect_check_error (auth_error, result, "Deactivate");
+	if (!error) {
+		active_path = nm_auth_chain_get_data (chain, "path");
+		if (!nm_manager_deactivate_connection (self,
+		                                       active_path,
+		                                       NM_DEVICE_STATE_REASON_USER_REQUESTED,
+		                                       &error))
+			g_assert (error);
 	}
 
-	active_path = nm_auth_chain_get_data (chain, "path");
-	if (!nm_manager_deactivate_connection (self,
-	                                       active_path,
-	                                       NM_DEVICE_STATE_REASON_USER_REQUESTED,
-	                                       &ret_error)) {
-		dbus_g_method_return_error (context, ret_error);
-		g_clear_error (&ret_error);
-	} else
+	if (error)
+		dbus_g_method_return_error (context, error);
+	else
 		dbus_g_method_return (context);
 
-done:
+	g_clear_error (&error);
 	nm_auth_chain_unref (chain);
 }
 
@@ -2342,7 +2308,7 @@ impl_manager_deactivate_connection (NMManager *self,
 	}
 
 	/* Otherwise validate the user request */
-	chain = nm_auth_chain_new (priv->authority, context, NULL, deactivate_net_auth_done_cb, self);
+	chain = nm_auth_chain_new (context, NULL, deactivate_net_auth_done_cb, self);
 	g_assert (chain);
 	priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 
@@ -2415,25 +2381,6 @@ do_sleep_wake (NMManager *self)
 	nm_manager_update_state (self);
 }
 
-static gboolean
-return_no_pk_error (PolkitAuthority *authority,
-                    const char *detail,
-                    DBusGMethodInvocation *context)
-{
-	GError *error;
-
-	if (!authority) {
-		error = g_error_new (NM_MANAGER_ERROR,
-		                     NM_MANAGER_ERROR_PERMISSION_DENIED,
-		                     "%s request failed: PolicyKit not initialized",
-		                     detail);
-		dbus_g_method_return_error (context, error);
-		g_error_free (error);
-		return FALSE;
-	}
-	return TRUE;
-}
-
 static void
 _internal_sleep (NMManager *self, gboolean do_sleep)
 {
@@ -2550,10 +2497,7 @@ impl_manager_sleep (NMManager *self,
 		return;
 	}
 
-	if (!return_no_pk_error (priv->authority, "Sleep/wake", context))
-		return;
-
-	chain = nm_auth_chain_new (priv->authority, context, NULL, sleep_auth_done_cb, self);
+	chain = nm_auth_chain_new (context, NULL, sleep_auth_done_cb, self);
 	g_assert (chain);
 	priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 
@@ -2688,10 +2632,7 @@ impl_manager_enable (NMManager *self,
 		return;
 	}
 
-	if (!return_no_pk_error (priv->authority, "Enable/disable", context))
-		return;
-
-	chain = nm_auth_chain_new (priv->authority, context, NULL, enable_net_done_cb, self);
+	chain = nm_auth_chain_new (context, NULL, enable_net_done_cb, self);
 	g_assert (chain);
 	priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 
@@ -2701,13 +2642,6 @@ impl_manager_enable (NMManager *self,
 
 /* Permissions */
 
-static void
-pk_authority_changed_cb (GObject *object, gpointer user_data)
-{
-	/* Let clients know they should re-check their authorization */
-	g_signal_emit (NM_MANAGER (user_data), signals[CHECK_PERMISSIONS], 0);
-}
-
 static void
 get_perm_add_result (NMAuthChain *chain, GHashTable *results, const char *permission)
 {
@@ -2772,10 +2706,7 @@ impl_manager_get_permissions (NMManager *self,
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
 	NMAuthChain *chain;
 
-	if (!return_no_pk_error (priv->authority, "Permissions", context))
-		return;
-
-	chain = nm_auth_chain_new (priv->authority, context, NULL, get_permissions_done_cb, self);
+	chain = nm_auth_chain_new (context, NULL, get_permissions_done_cb, self);
 	g_assert (chain);
 	priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 
@@ -3059,7 +2990,7 @@ prop_filter (DBusConnection *connection,
 
 	if (uid > 0) {
 		/* Otherwise validate the user request */
-		chain = nm_auth_chain_new_raw_message (priv->authority, message, prop_set_auth_done_cb, self);
+		chain = nm_auth_chain_new_raw_message (message, prop_set_auth_done_cb, self);
 		g_assert (chain);
 		priv->auth_chains = g_slist_append (priv->auth_chains, chain);
 		nm_auth_chain_set_data (chain, "prop", g_strdup (glib_propname), g_free);
@@ -3189,7 +3120,8 @@ dispose (GObject *object)
 
 	g_slist_foreach (priv->auth_chains, (GFunc) nm_auth_chain_unref, NULL);
 	g_slist_free (priv->auth_chains);
-	g_object_unref (priv->authority);
+
+	nm_auth_set_changed_func (NULL, NULL);
 
 	while (g_slist_length (priv->devices)) {
 		priv->devices = remove_one_device (manager,
@@ -3465,6 +3397,13 @@ periodic_update_active_connection_timestamps (gpointer user_data)
 	return TRUE;
 }
 
+static void
+authority_changed_cb (gpointer user_data)
+{
+	/* Let clients know they should re-check their authorization */
+	g_signal_emit (NM_MANAGER (user_data), signals[CHECK_PERMISSIONS], 0);
+}
+
 static void
 nm_manager_init (NMManager *manager)
 {
@@ -3472,7 +3411,6 @@ nm_manager_init (NMManager *manager)
 	DBusGConnection *g_connection;
 	guint id, i;
 	GFile *file;
-	GError *error = NULL;
 
 	/* Initialize rfkill structures and states */
 	memset (priv->radio_states, 0, sizeof (priv->radio_states));
@@ -3563,18 +3501,8 @@ nm_manager_init (NMManager *manager)
 	} else
 		nm_log_warn (LOGD_SUSPEND, "could not initialize UPower D-Bus proxy");
 
-	priv->authority = polkit_authority_get_sync (NULL, &error);
-	if (priv->authority) {
-		priv->auth_changed_id = g_signal_connect (priv->authority,
-		                                          "changed",
-		                                          G_CALLBACK (pk_authority_changed_cb),
-		                                          manager);
-	} else {
-		nm_log_warn (LOGD_CORE, "failed to create PolicyKit authority: (%d) %s",
-		             error ? error->code : -1,
-		             error && error->message ? error->message : "(unknown)");
-		g_clear_error (&error);
-	}
+	/* Listen for authorization changes */
+	nm_auth_set_changed_func (authority_changed_cb, manager);
 
 	/* Monitor the firmware directory */
 	if (strlen (KERNEL_FIRMWARE_DIR)) {
diff --git a/src/nm-policy.c b/src/nm-policy.c
index 5c30828b..194d1111 100644
--- a/src/nm-policy.c
+++ b/src/nm-policy.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2004 - 2010 Red Hat, Inc.
+ * Copyright (C) 2004 - 2011 Red Hat, Inc.
  * Copyright (C) 2007 - 2008 Novell, Inc.
  */
 
@@ -816,23 +816,29 @@ hostname_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data)
 	update_system_hostname ((NMPolicy *) user_data, NULL, NULL);
 }
 
+static void
+reset_retries_all (NMSettings *settings)
+{
+	GSList *connections, *iter;
+
+	connections = nm_settings_get_connections (settings);
+	for (iter = connections; iter; iter = g_slist_next (iter))
+		set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
+	g_slist_free (connections);
+}
+
 static void
 sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data)
 {
 	NMPolicy *policy = user_data;
 	gboolean sleeping = FALSE, enabled = FALSE;
-	GSList *connections, *iter;
 
 	g_object_get (G_OBJECT (manager), NM_MANAGER_SLEEPING, &sleeping, NULL);
 	g_object_get (G_OBJECT (manager), NM_MANAGER_NETWORKING_ENABLED, &enabled, NULL);
 
 	/* Reset retries on all connections so they'll checked on wakeup */
-	if (sleeping || !enabled) {
-		connections = nm_settings_get_connections (policy->settings);
-		for (iter = connections; iter; iter = g_slist_next (iter))
-			set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
-		g_slist_free (connections);
-	}
+	if (sleeping || !enabled)
+		reset_retries_all (policy->settings);
 }
 
 static void
@@ -1045,9 +1051,15 @@ connection_added (NMSettings *settings,
 }
 
 static void
-connections_loaded (NMSettings *settings,
-					gpointer user_data)
+connections_loaded (NMSettings *settings, gpointer user_data)
 {
+	// FIXME: "connections-loaded" signal is emmitted *before* we connect to it
+	// in nm_policy_new(). So this function is never called. Currently we work around
+	// that by calling reset_retries_all() in nm_policy_new()
+	
+	/* Initialize connections' auto-retries */
+	reset_retries_all (settings);
+
 	schedule_activate_all ((NMPolicy *) user_data);
 }
 
@@ -1175,6 +1187,9 @@ nm_policy_new (NMManager *manager,
 	_connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED,
 	                          connection_visibility_changed);
 
+	/* Initialize connections' auto-retries */
+	reset_retries_all (policy->settings);
+
 	initialized = TRUE;
 	return policy;
 }
diff --git a/src/nm-session-monitor.c b/src/nm-session-monitor.c
index c163ee6a..7ee9013a 100644
--- a/src/nm-session-monitor.c
+++ b/src/nm-session-monitor.c
@@ -74,6 +74,7 @@ typedef enum {
 	NM_SESSION_MONITOR_ERROR_IO_ERROR = 0,
 	NM_SESSION_MONITOR_ERROR_MALFORMED_DATABASE,
 	NM_SESSION_MONITOR_ERROR_UNKNOWN_USER,
+	NM_SESSION_MONITOR_ERROR_NO_DATABASE,
 } NMSessionMonitorError;
 
 GQuark
@@ -101,6 +102,8 @@ nm_session_monitor_error_get_type (void)
 			ENUM_ENTRY (NM_SESSION_MONITOR_ERROR_MALFORMED_DATABASE, "MalformedDatabase"),
 			/* Username or UID could could not be found */
 			ENUM_ENTRY (NM_SESSION_MONITOR_ERROR_UNKNOWN_USER, "UnknownUser"),
+			/* No ConsoleKit database */
+			ENUM_ENTRY (NM_SESSION_MONITOR_ERROR_NO_DATABASE, "NoDatabase"),
 			{ 0, 0, 0 }
 		};
 
@@ -226,10 +229,11 @@ reload_database (NMSessionMonitor *self, GError **error)
 
 	free_database (self);
 
+	errno = 0;
 	if (stat (CKDB_PATH, &statbuf) != 0) {
 		g_set_error (error,
 		             NM_SESSION_MONITOR_ERROR,
-		             NM_SESSION_MONITOR_ERROR_IO_ERROR,
+		             errno == ENOENT ? NM_SESSION_MONITOR_ERROR_NO_DATABASE : NM_SESSION_MONITOR_ERROR_IO_ERROR,
 		             "Error statting file " CKDB_PATH ": %s",
 		             strerror (errno));
 		goto error;
@@ -292,10 +296,11 @@ ensure_database (NMSessionMonitor *self, GError **error)
 	if (self->database != NULL) {
 		struct stat statbuf;
 
+		errno = 0;
 		if (stat (CKDB_PATH, &statbuf) != 0) {
 			g_set_error (error,
 			             NM_SESSION_MONITOR_ERROR,
-			             NM_SESSION_MONITOR_ERROR_IO_ERROR,
+			             errno == ENOENT ? NM_SESSION_MONITOR_ERROR_NO_DATABASE : NM_SESSION_MONITOR_ERROR_IO_ERROR,
 			             "Error statting file " CKDB_PATH " to check timestamp: %s",
 			             strerror (errno));
 			goto out;
@@ -346,7 +351,12 @@ nm_session_monitor_init (NMSessionMonitor *self)
 
 	error = NULL;
 	if (!ensure_database (self, &error)) {
-		nm_log_err (LOGD_CORE, "Error loading " CKDB_PATH ": %s", error->message);
+		/* Ignore the first error if the CK database isn't found yet */
+		if (g_error_matches (error,
+		                     NM_SESSION_MONITOR_ERROR,
+		                     NM_SESSION_MONITOR_ERROR_NO_DATABASE) == FALSE) {
+			nm_log_err (LOGD_CORE, "Error loading " CKDB_PATH ": %s", error->message);
+		}
 		g_error_free (error);
 	}
 
diff --git a/src/nm-udev-manager.c b/src/nm-udev-manager.c
index 41a4e15b..e0795e81 100644
--- a/src/nm-udev-manager.c
+++ b/src/nm-udev-manager.c
@@ -439,9 +439,13 @@ device_creator (NMUdevManager *manager,
 		if (parent) {
 			driver = g_udev_device_get_driver (parent);
 			if (!driver) {
-				/* try the grandparent only if it's an ibmebus device */
+				/* try the grandparent if it's an ibmebus device or if the
+				 * subsys is NULL which usually indicates some sort of
+				 * platform device like a 'gadget' net interface.
+				 */
 				subsys = g_udev_device_get_subsystem (parent);
-				if (subsys && !strcmp (subsys, "ibmebus")) {
+				if (   (g_strcmp0 (subsys, "ibmebus") == 0)
+				    || (subsys == NULL)) {
 					grandparent = g_udev_device_get_parent (parent);
 					if (grandparent)
 						driver = g_udev_device_get_driver (grandparent);
diff --git a/src/nm-wifi-ap.c b/src/nm-wifi-ap.c
index 6eab9581..f9c66473 100644
--- a/src/nm-wifi-ap.c
+++ b/src/nm-wifi-ap.c
@@ -58,12 +58,6 @@ typedef struct
 	/* Non-scanned attributes */
 	gboolean			fake;	/* Whether or not the AP is from a scan */
 	gboolean			broadcast;	/* Whether or not the AP is broadcasting (hidden) */
-	gboolean			user_created;	/* Whether or not the AP was created
-										 * by the user with "Create network..."
-										 * A subset of Ad-Hoc mode.  user_created
-										 * implies Ad-Hoc, but not necessarily
-										 * the other way around.
-										 */
 	glong				last_seen;	/* Last time the AP was seen in a scan in seconds */
 
 	/* Things from user prefs/NetworkManagerInfo */
@@ -863,9 +857,14 @@ nm_ap_set_ssid (NMAccessPoint *ap, const GByteArray * ssid)
 	}
 
 	if (ssid) {
-		priv->ssid = g_byte_array_sized_new (ssid->len);
-		priv->ssid->len = ssid->len;
-		memcpy (priv->ssid->data, ssid->data, ssid->len);
+		/* Should never get zero-length SSIDs */
+		g_warn_if_fail (ssid->len > 0);
+
+		if (ssid->len) {
+			priv->ssid = g_byte_array_sized_new (ssid->len);
+			priv->ssid->len = ssid->len;
+			memcpy (priv->ssid->data, ssid->data, ssid->len);
+		}
 	}
 
 	g_object_notify (G_OBJECT (ap), NM_AP_SSID);
@@ -1153,28 +1152,6 @@ void nm_ap_set_last_seen (NMAccessPoint *ap, const glong last_seen)
 }
 
 
-/*
- * Get/Set functions to indicate that an access point is
- * user-created, ie whether or not its a network filled with
- * information from the user and intended to create a new Ad-Hoc
- * wireless network.
- *
- */
-gboolean nm_ap_get_user_created (const NMAccessPoint *ap)
-{
-	g_return_val_if_fail (NM_IS_AP (ap), FALSE);
-
-	return NM_AP_GET_PRIVATE (ap)->user_created;
-}
-
-void nm_ap_set_user_created (NMAccessPoint *ap, gboolean user_created)
-{
-	g_return_if_fail (NM_IS_AP (ap));
-
-	NM_AP_GET_PRIVATE (ap)->user_created = user_created;
-}
-
-
 /*
  * Get/Set functions for user address list
  *
diff --git a/src/nm-wifi-ap.h b/src/nm-wifi-ap.h
index 4c98f248..95514ba6 100644
--- a/src/nm-wifi-ap.h
+++ b/src/nm-wifi-ap.h
@@ -104,9 +104,6 @@ void				nm_ap_set_broadcast		(NMAccessPoint *ap, gboolean broadcast);
 glong			nm_ap_get_last_seen		(const NMAccessPoint *ap);
 void				nm_ap_set_last_seen		(NMAccessPoint *ap, const glong last_seen);
 
-gboolean			nm_ap_get_user_created	(const NMAccessPoint *ap);
-void				nm_ap_set_user_created	(NMAccessPoint *ap, gboolean user_created);
-
 GSList *			nm_ap_get_user_addresses	(const NMAccessPoint *ap);
 void				nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list);
 
diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c
index 767b9315..e863aaba 100644
--- a/src/ppp-manager/nm-ppp-manager.c
+++ b/src/ppp-manager/nm-ppp-manager.c
@@ -798,7 +798,7 @@ create_pppd_cmd_line (NMPPPManager *self,
 	NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self);
 	const char *ppp_binary;
 	NMCmdLine *cmd;
-	const char *ppp_debug;
+	gboolean ppp_debug;
 
 	g_return_val_if_fail (setting != NULL, NULL);
 
@@ -819,7 +819,11 @@ create_pppd_cmd_line (NMPPPManager *self,
 	/* NM handles setting the default route */
 	nm_cmd_line_add_string (cmd, "nodefaultroute");
 
-	ppp_debug = getenv ("NM_PPP_DEBUG");
+	ppp_debug = !!getenv ("NM_PPP_DEBUG");
+	if (   nm_logging_level_enabled (LOGL_DEBUG)
+	    && nm_logging_domain_enabled (LOGD_PPP))
+		ppp_debug = TRUE;
+
 	if (ppp_debug)
 		nm_cmd_line_add_string (cmd, "debug");
 
diff --git a/src/settings/Makefile.am b/src/settings/Makefile.am
index 55b5b7ef..21dc5bb0 100644
--- a/src/settings/Makefile.am
+++ b/src/settings/Makefile.am
@@ -32,7 +32,6 @@ libsettings_la_SOURCES = \
 	nm-settings.h \
 	nm-inotify-helper.c \
 	nm-inotify-helper.h \
-	nm-polkit-helpers.h \
 	nm-settings-error.c \
 	nm-settings-error.h \
 	nm-system-config-interface.c \
diff --git a/src/settings/Makefile.in b/src/settings/Makefile.in
index 123132b7..980f35cb 100644
--- a/src/settings/Makefile.in
+++ b/src/settings/Makefile.in
@@ -396,7 +396,6 @@ libsettings_la_SOURCES = \
 	nm-settings.h \
 	nm-inotify-helper.c \
 	nm-inotify-helper.h \
-	nm-polkit-helpers.h \
 	nm-settings-error.c \
 	nm-settings-error.h \
 	nm-system-config-interface.c \
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index dbc29cae..8a5ea106 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -33,7 +33,6 @@
 #include "nm-secret-agent.h"
 #include "nm-manager-auth.h"
 #include "nm-dbus-glib-types.h"
-#include "nm-polkit-helpers.h"
 #include "nm-manager-auth.h"
 #include "nm-setting-vpn.h"
 #include "nm-setting-connection.h"
@@ -49,7 +48,6 @@ typedef struct {
 
 	NMDBusManager *dbus_mgr;
 	NMSessionMonitor *session_monitor;
-	PolkitAuthority *authority;
 
 	/* Hashed by owner name, not identifier, since two agents in different
 	 * sessions can use the same identifier.
@@ -338,7 +336,6 @@ typedef void (*RequestCancelFunc) (Request *req);
 
 struct _Request {
 	guint32 reqid;
-	PolkitAuthority *authority;
 	NMAuthChain *chain;
 
 	NMConnection *connection;
@@ -381,7 +378,6 @@ static guint32 next_req_id = 1;
 
 static Request *
 request_new_get (NMConnection *connection,
-                 PolkitAuthority *authority,
                  gboolean filter_by_uid,
                  gulong uid_filter,
                  GHashTable *existing_secrets,
@@ -402,7 +398,6 @@ request_new_get (NMConnection *connection,
 	req = g_malloc0 (sizeof (Request));
 	req->reqid = next_req_id++;
 	req->connection = g_object_ref (connection);
-	req->authority = g_object_ref (authority);
 	req->filter_by_uid = filter_by_uid;
 	req->uid_filter = uid_filter;
 	if (existing_secrets)
@@ -462,8 +457,6 @@ request_free (Request *req)
 		g_hash_table_unref (req->existing_secrets);
 	if (req->chain)
 		nm_auth_chain_unref (req->chain);
-	if (req->authority)
-		g_object_unref (req->authority);
 	memset (req, 0, sizeof (Request));
 	g_free (req);
 }
@@ -853,10 +846,10 @@ check_system_secrets_cb (NMSetting *setting,
 		/* VPNs are special; need to handle each secret separately */
 		g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
 		while (g_hash_table_iter_next (&iter, (gpointer *) &secret_name, NULL)) {
-			if (nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) {
-				if (secret_flags == NM_SETTING_SECRET_FLAG_NONE)
-					*has_system = TRUE;
-			}
+			secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+			nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL);
+			if (secret_flags == NM_SETTING_SECRET_FLAG_NONE)
+				*has_system = TRUE;
 		}
 	} else {
 		nm_setting_get_secret_flags (setting, key, &secret_flags, NULL);
@@ -896,8 +889,7 @@ get_next_cb (Request *req)
 		nm_log_dbg (LOGD_AGENTS, "(%p/%s) request has system secrets; checking agent %s for MODIFY",
 		            req, req->setting_name, agent_dbus_owner);
 
-		req->chain = nm_auth_chain_new_dbus_sender (req->authority,
-		                                            agent_dbus_owner,
+		req->chain = nm_auth_chain_new_dbus_sender (agent_dbus_owner,
 		                                            get_agent_modify_auth_cb,
 		                                            req);
 		g_assert (req->chain);
@@ -1050,7 +1042,6 @@ nm_agent_manager_get_secrets (NMAgentManager *self,
 	 */
 
 	req = request_new_get (connection,
-	                       priv->authority,
 	                       filter_by_uid,
 	                       uid_filter,
 	                       existing_secrets,
@@ -1335,15 +1326,6 @@ static void
 nm_agent_manager_init (NMAgentManager *self)
 {
 	NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (self);
-	GError *error = NULL;
-
-	priv->authority = polkit_authority_get_sync (NULL, &error);
-	if (!priv->authority) {
-		nm_log_warn (LOGD_SETTINGS, "failed to create PolicyKit authority: (%d) %s",
-		             error ? error->code : -1,
-		             error && error->message ? error->message : "(unknown)");
-		g_clear_error (&error);
-	}
 
 	priv->agents = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 	priv->requests = g_hash_table_new_full (g_direct_hash,
@@ -1365,7 +1347,6 @@ dispose (GObject *object)
 
 		g_object_unref (priv->session_monitor);
 		g_object_unref (priv->dbus_mgr);
-		g_object_unref (priv->authority);
 	}
 
 	G_OBJECT_CLASS (nm_agent_manager_parent_class)->dispose (object);
diff --git a/src/settings/nm-polkit-helpers.h b/src/settings/nm-polkit-helpers.h
deleted file mode 100644
index d812e944..00000000
--- a/src/settings/nm-polkit-helpers.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager system settings service
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * (C) Copyright 2008 Novell, Inc.
- * (C) Copyright 2008 - 2010 Red Hat, Inc.
- */
-
-#ifndef NM_POLKIT_HELPERS_H
-#define NM_POLKIT_HELPERS_H
-
-#include 
-
-/* Fix for polkit 0.97 and later */
-#if !HAVE_POLKIT_AUTHORITY_GET_SYNC
-static inline PolkitAuthority *
-polkit_authority_get_sync (GCancellable *cancellable, GError **error)
-{
-	PolkitAuthority *authority;
-
-	authority = polkit_authority_get ();
-	if (!authority)
-		g_set_error (error, 0, 0, "failed to get the PolicyKit authority");
-	return authority;
-}
-#endif
-
-#endif /* NM_POLKIT_HELPERS_H */
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 22aef716..60de6b06 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -34,7 +34,6 @@
 #include "nm-dbus-manager.h"
 #include "nm-settings-error.h"
 #include "nm-dbus-glib-types.h"
-#include "nm-polkit-helpers.h"
 #include "nm-logging.h"
 #include "nm-manager-auth.h"
 #include "nm-marshal.h"
@@ -83,7 +82,6 @@ typedef struct {
 	NMDBusManager *dbus_mgr;
 	NMAgentManager *agent_mgr;
 
-	PolkitAuthority *authority;
 	GSList *pending_auths; /* List of pending authentication requests */
 	NMConnection *secrets;
 	gboolean visible; /* Is this connection is visible by some session? */
@@ -98,6 +96,83 @@ typedef struct {
 
 /**************************************************************/
 
+/* Return TRUE to continue, FALSE to stop */
+typedef gboolean (*ForEachSecretFunc) (GHashTableIter *iter,
+                                       NMSettingSecretFlags flags,
+                                       gpointer user_data);
+
+static void
+for_each_secret (NMConnection *connection,
+                 GHashTable *secrets,
+                 ForEachSecretFunc callback,
+                 gpointer callback_data)
+{
+	GHashTableIter iter;
+	const char *setting_name;
+	GHashTable *setting_hash;
+
+	/* This function, given a hash of hashes representing new secrets of
+	 * an NMConnection, walks through each toplevel hash (which represents a
+	 * NMSetting), and for each setting, walks through that setting hash's
+	 * properties.  For each property that's a secret, it will check that
+	 * secret's flags in the backing NMConnection object, and call a supplied
+	 * callback.
+	 *
+	 * The one complexity is that the VPN setting's 'secrets' property is
+	 * *also* a hash table (since the key/value pairs are arbitrary and known
+	 * only to the VPN plugin itself).  That means we have three levels of
+	 * GHashTables that we potentially have to traverse here.  When we hit the
+	 * VPN setting's 'secrets' property, we special-case that and iterate over
+	 * each item in that 'secrets' hash table, calling the supplied callback
+	 * each time.
+	 */
+
+	/* Walk through the list of setting hashes */
+	g_hash_table_iter_init (&iter, secrets);
+	while (g_hash_table_iter_next (&iter, (gpointer) &setting_name, (gpointer) &setting_hash)) {
+		NMSetting *setting;
+		GHashTableIter secret_iter;
+		const char *secret_name;
+		GValue *val;
+
+		/* Get the actual NMSetting from the connection so we can get secret flags
+		 * from the connection data, since flags aren't secrets.  What we're
+		 * iterating here is just the secrets, not a whole connection.
+		 */
+		setting = nm_connection_get_setting_by_name (connection, setting_name);
+		if (setting == NULL)
+			continue;
+
+		/* Walk through the list of keys in each setting hash */
+		g_hash_table_iter_init (&secret_iter, setting_hash);
+		while (g_hash_table_iter_next (&secret_iter, (gpointer) &secret_name, (gpointer) &val)) {
+			NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+			/* VPN secrets need slightly different treatment here since the
+			 * "secrets" property is actually a hash table of secrets.
+			 */
+			if (NM_IS_SETTING_VPN (setting) && (g_strcmp0 (secret_name, NM_SETTING_VPN_SECRETS) == 0)) {
+				GHashTableIter vpn_secrets_iter;
+
+				/* Iterate through each secret from the VPN hash in the overall secrets hash */
+				g_hash_table_iter_init (&vpn_secrets_iter, g_value_get_boxed (val));
+				while (g_hash_table_iter_next (&vpn_secrets_iter, (gpointer) &secret_name, NULL)) {
+					secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+					nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL);
+					if (callback (&vpn_secrets_iter, secret_flags, callback_data) == FALSE)
+						return;
+				}
+			} else {
+				nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL);
+				if (callback (&secret_iter, secret_flags, callback_data) == FALSE)
+					return;
+			}
+		}
+	}
+}
+
+/**************************************************************/
+
 static void
 set_visible (NMSettingsConnection *self, gboolean new_visible)
 {
@@ -112,7 +187,8 @@ set_visible (NMSettingsConnection *self, gboolean new_visible)
 gboolean
 nm_settings_connection_is_visible (NMSettingsConnection *self)
 {
-	g_return_val_if_fail (NM_SETTINGS_CONNECTION (self), FALSE);
+	g_return_val_if_fail (self != NULL, FALSE);
+	g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (self), FALSE);
 
 	return NM_SETTINGS_CONNECTION_GET_PRIVATE (self)->visible;
 }
@@ -124,7 +200,8 @@ nm_settings_connection_recheck_visibility (NMSettingsConnection *self)
 	NMSettingConnection *s_con;
 	guint32 num, i;
 
-	g_return_if_fail (NM_SETTINGS_CONNECTION (self));
+	g_return_if_fail (self != NULL);
+	g_return_if_fail (NM_IS_SETTINGS_CONNECTION (self));
 
 	priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
 
@@ -178,10 +255,10 @@ only_system_secrets_cb (NMSetting *setting,
 
 			g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
 			while (g_hash_table_iter_next (&iter, (gpointer *) &secret_name, NULL)) {
-				if (nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) {
-					if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
-						nm_setting_vpn_remove_secret (NM_SETTING_VPN (setting), secret_name);
-				}
+				secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+				nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL);
+				if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
+					nm_setting_vpn_remove_secret (NM_SETTING_VPN (setting), secret_name);
 			}
 		} else {
 			nm_setting_get_secret_flags (setting, key, &secret_flags, NULL);
@@ -204,15 +281,26 @@ update_secrets_cache (NMSettingsConnection *self)
 	nm_connection_for_each_setting_value (priv->secrets, only_system_secrets_cb, NULL);
 }
 
+static gboolean
+clear_system_secrets (GHashTableIter *iter,
+                      NMSettingSecretFlags flags,
+                      gpointer user_data)
+{
+	if (flags == NM_SETTING_SECRET_FLAG_NONE)
+		g_hash_table_iter_remove (iter);
+	return TRUE;
+}
+
 /* Update the settings of this connection to match that of 'new', taking care to
- * make a private copy of secrets. */
+ * make a private copy of secrets.
+ */
 gboolean
 nm_settings_connection_replace_settings (NMSettingsConnection *self,
                                          NMConnection *new,
                                          GError **error)
 {
 	NMSettingsConnectionPrivate *priv;
-	GHashTable *new_settings;
+	GHashTable *new_settings, *transient_secrets;
 	gboolean success = FALSE;
 
 	g_return_val_if_fail (self != NULL, FALSE);
@@ -222,18 +310,48 @@ nm_settings_connection_replace_settings (NMSettingsConnection *self,
 
 	priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
 
+	/* Replacing the settings might replace transient secrets, such as when
+	 * a user agent returns secrets, which might trigger the connection to be
+	 * written out, which triggers an inotify event to re-read and update the
+	 * connection, which, if we're not careful, could wipe out the transient
+	 * secrets the user agent just sent us.  Basically, only
+	 * nm_connection_clear_secrets() should wipe out transient secrets but
+	 * re-reading a connection from on-disk and updating our in-memory copy
+	 * should not.  Thus we preserve non-system-owned secrets here.
+	 */
+	transient_secrets = nm_connection_to_hash (NM_CONNECTION (self), NM_SETTING_HASH_FLAG_ONLY_SECRETS);
+	if (transient_secrets)
+		for_each_secret (NM_CONNECTION (self), transient_secrets, clear_system_secrets, NULL);
+
 	new_settings = nm_connection_to_hash (new, NM_SETTING_HASH_FLAG_ALL);
 	g_assert (new_settings);
 	if (nm_connection_replace_settings (NM_CONNECTION (self), new_settings, error)) {
+		GHashTableIter iter;
+		NMSetting *setting;
+		const char *setting_name;
+		GHashTable *setting_hash;
+
 		/* Copy the connection to keep its secrets around even if NM
 		 * calls nm_connection_clear_secrets().
 		 */
 		update_secrets_cache (self);
 
+		/* And add the transient secrets back */
+		if (transient_secrets) {
+			g_hash_table_iter_init (&iter, transient_secrets);
+			while (g_hash_table_iter_next (&iter, (gpointer) &setting_name, (gpointer) &setting_hash)) {
+				setting = nm_connection_get_setting_by_name (NM_CONNECTION (self), setting_name);
+				if (setting)
+					nm_setting_update_secrets (setting, setting_hash, NULL);
+			}
+		}
+
 		nm_settings_connection_recheck_visibility (self);
 		success = TRUE;
 	}
 	g_hash_table_destroy (new_settings);
+	if (transient_secrets)
+		g_hash_table_destroy (transient_secrets);
 	return success;
 }
 
@@ -398,11 +516,6 @@ supports_secrets (NMSettingsConnection *connection, const char *setting_name)
 	return TRUE;
 }
 
-/* Return TRUE to continue, FALSE to stop */
-typedef gboolean (*ForEachSecretFunc) (GHashTableIter *iter,
-                                       NMSettingSecretFlags flags,
-                                       gpointer user_data);
-
 static gboolean
 clear_nonagent_secrets (GHashTableIter *iter,
                         NMSettingSecretFlags flags,
@@ -430,47 +543,13 @@ has_system_owned_secrets (GHashTableIter *iter,
 {
 	gboolean *has_system_owned = user_data;
 
-	if (!(flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)) {
+	if (flags == NM_SETTING_SECRET_FLAG_NONE) {
 		*has_system_owned = TRUE;
 		return FALSE;
 	}
 	return TRUE;
 }
 
-static void
-for_each_secret (NMConnection *connection,
-                 GHashTable *secrets,
-                 ForEachSecretFunc callback,
-                 gpointer callback_data)
-{
-	GHashTableIter iter;
-	const char *setting_name;
-	GHashTable *setting_hash;
-
-	/* Walk through the list of setting hashes */
-	g_hash_table_iter_init (&iter, secrets);
-	while (g_hash_table_iter_next (&iter,
-	                               (gpointer *) &setting_name,
-	                               (gpointer *) &setting_hash)) {
-		GHashTableIter setting_iter;
-		const char *secret_name;
-
-		/* Walk through the list of keys in each setting hash */
-		g_hash_table_iter_init (&setting_iter, setting_hash);
-		while (g_hash_table_iter_next (&setting_iter, (gpointer *) &secret_name, NULL)) {
-			NMSetting *setting;
-			NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
-
-			/* Get the actual NMSetting from the connection so we can get secret flags */
-			setting = nm_connection_get_setting_by_name (connection, setting_name);
-			if (setting && nm_setting_get_secret_flags (setting, secret_name, &flags, NULL)) {
-				if (callback (&setting_iter, flags, callback_data) == FALSE)
-					return;
-			}
-		}
-	}
-}
-
 static void
 new_secrets_commit_cb (NMSettingsConnection *connection,
                        GError *error,
@@ -850,7 +929,7 @@ auth_start (NMSettingsConnection *self,
 	}
 
 	if (check_permission) {
-		chain = nm_auth_chain_new (priv->authority, context, NULL, pk_auth_cb, self);
+		chain = nm_auth_chain_new (context, NULL, pk_auth_cb, self);
 		g_assert (chain);
 		nm_auth_chain_set_data (chain, "perm", (gpointer) check_permission, NULL);
 		nm_auth_chain_set_data (chain, "callback", callback, NULL);
@@ -980,10 +1059,10 @@ only_agent_secrets_cb (NMSetting *setting,
 			/* VPNs are special; need to handle each secret separately */
 			g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
 			while (g_hash_table_iter_next (&iter, (gpointer *) &secret_name, NULL)) {
-				if (nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) {
-					if (secret_flags != NM_SETTING_SECRET_FLAG_AGENT_OWNED)
-						nm_setting_vpn_remove_secret (NM_SETTING_VPN (setting), secret_name);
-				}
+				secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+				nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL);
+				if (secret_flags != NM_SETTING_SECRET_FLAG_AGENT_OWNED)
+					nm_setting_vpn_remove_secret (NM_SETTING_VPN (setting), secret_name);
 			}
 		} else {
 			nm_setting_get_secret_flags (setting, key, &secret_flags, NULL);
@@ -1271,7 +1350,8 @@ nm_settings_connection_signal_remove (NMSettingsConnection *self)
 guint64
 nm_settings_connection_get_timestamp (NMSettingsConnection *connection)
 {
-	g_return_val_if_fail (NM_SETTINGS_CONNECTION (connection), 0);
+	g_return_val_if_fail (connection != NULL, 0);
+	g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (connection), 0);
 
 	return NM_SETTINGS_CONNECTION_GET_PRIVATE (connection)->timestamp;
 }
@@ -1368,18 +1448,9 @@ nm_settings_connection_init (NMSettingsConnection *self)
 	NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
 	static guint32 dbus_counter = 0;
 	char *dbus_path;
-	GError *error = NULL;
 
 	priv->dbus_mgr = nm_dbus_manager_get ();
 
-	priv->authority = polkit_authority_get_sync (NULL, &error);
-	if (!priv->authority) {
-		nm_log_warn (LOGD_SETTINGS, "failed to create PolicyKit authority: (%d) %s",
-		             error ? error->code : -1,
-		             error && error->message ? error->message : "(unknown)");
-		g_clear_error (&error);
-	}
-
 	dbus_path = g_strdup_printf ("%s/%u", NM_DBUS_PATH_SETTINGS, dbus_counter++);
 	nm_connection_set_path (NM_CONNECTION (self), dbus_path);
 	g_free (dbus_path);
@@ -1421,10 +1492,11 @@ dispose (GObject *object)
 
 	set_visible (self, FALSE);
 
+	if (priv->session_changed_id)
+		g_signal_handler_disconnect (priv->session_monitor, priv->session_changed_id);
 	g_object_unref (priv->session_monitor);
 	g_object_unref (priv->agent_mgr);
 	g_object_unref (priv->dbus_mgr);
-	g_object_unref (priv->authority);
 
 out:
 	G_OBJECT_CLASS (nm_settings_connection_parent_class)->dispose (object);
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 87fa4b6c..e23e8d13 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -56,7 +56,6 @@
 #include "nm-dbus-glib-types.h"
 #include "nm-settings.h"
 #include "nm-settings-connection.h"
-#include "nm-polkit-helpers.h"
 #include "nm-settings-error.h"
 #include "nm-default-wired-connection.h"
 #include "nm-logging.h"
@@ -114,8 +113,6 @@ typedef struct {
 
 	NMAgentManager *agent_mgr;
 
-	PolkitAuthority *authority;
-	guint auth_changed_id;
 	char *config_file;
 
 	NMSessionMonitor *session_monitor;
@@ -702,6 +699,46 @@ connection_visibility_changed (NMSettingsConnection *connection,
 	               connection);
 }
 
+#define NM_DBUS_SERVICE_OPENCONNECT    "org.freedesktop.NetworkManager.openconnect"
+#define NM_OPENCONNECT_KEY_GATEWAY "gateway"
+#define NM_OPENCONNECT_KEY_COOKIE "cookie"
+#define NM_OPENCONNECT_KEY_GWCERT "gwcert"
+#define NM_OPENCONNECT_KEY_XMLCONFIG "xmlconfig"
+#define NM_OPENCONNECT_KEY_LASTHOST "lasthost"
+#define NM_OPENCONNECT_KEY_AUTOCONNECT "autoconnect"
+#define NM_OPENCONNECT_KEY_CERTSIGS "certsigs"
+
+static void
+openconnect_migrate_hack (NMConnection *connection)
+{
+	NMSettingVPN *s_vpn;
+	NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NOT_SAVED;
+
+	/* Huge hack.  There were some openconnect changes that needed to happen
+	 * pretty late, too late to get into distros.  Migration has already
+	 * happened for many people, and their secret flags are wrong.  But we
+	 * don't want to requrie re-migration, so we have to fix it up here. Ugh.
+	 */
+
+	s_vpn = nm_connection_get_setting_vpn (connection);
+	if (s_vpn == NULL)
+		return;
+
+	if (g_strcmp0 (nm_setting_vpn_get_service_type (s_vpn), NM_DBUS_SERVICE_OPENCONNECT) == 0) {
+		/* These are different for every login session, and should not be stored */
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_GATEWAY, flags, NULL);
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_COOKIE, flags, NULL);
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_GWCERT, flags, NULL);
+
+		/* These are purely internal data for the auth-dialog, and should be stored */
+		flags = 0;
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_XMLCONFIG, flags, NULL);
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_LASTHOST, flags, NULL);
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_AUTOCONNECT, flags, NULL);
+		nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENCONNECT_KEY_CERTSIGS, flags, NULL);
+	}
+}
+
 static void
 claim_connection (NMSettings *self,
                   NMSettingsConnection *connection,
@@ -739,6 +776,9 @@ claim_connection (NMSettings *self,
 	/* Ensure it's initial visibility is up-to-date */
 	nm_settings_connection_recheck_visibility (connection);
 
+	/* Evil openconnect migration hack */
+	openconnect_migrate_hack (NM_CONNECTION (connection));
+
 	id = g_signal_connect (connection, NM_SETTINGS_CONNECTION_REMOVED,
 	                       G_CALLBACK (connection_removed),
 	                       self);
@@ -999,7 +1039,7 @@ nm_settings_add_connection (NMSettings *self,
 		perm = NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM;
 
 	/* Otherwise validate the user request */
-	chain = nm_auth_chain_new (priv->authority, context, NULL, pk_add_cb, self);
+	chain = nm_auth_chain_new (context, NULL, pk_add_cb, self);
 	g_assert (chain);
 	priv->auths = g_slist_append (priv->auths, chain);
 	nm_auth_chain_add_call (chain, perm, TRUE);
@@ -1111,7 +1151,7 @@ impl_settings_save_hostname (NMSettings *self,
 	}
 
 	/* Otherwise validate the user request */
-	chain = nm_auth_chain_new (priv->authority, context, NULL, pk_hostname_cb, self);
+	chain = nm_auth_chain_new (context, NULL, pk_hostname_cb, self);
 	g_assert (chain);
 	priv->auths = g_slist_append (priv->auths, chain);
 	nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME, TRUE);
@@ -1476,18 +1516,9 @@ static void
 nm_settings_init (NMSettings *self)
 {
 	NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
-	GError *error = NULL;
 
 	priv->connections = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
 
-	priv->authority = polkit_authority_get_sync (NULL, &error);
-	if (!priv->authority) {
-		nm_log_warn (LOGD_SETTINGS, "failed to create PolicyKit authority: (%d) %s",
-		             error ? error->code : -1,
-		             error && error->message ? error->message : "(unknown)");
-		g_clear_error (&error);
-	}
-
 	priv->session_monitor = nm_session_monitor_get ();
 
 	/* Hold a reference to the agent manager so it stays alive; the only
@@ -1505,11 +1536,6 @@ dispose (GObject *object)
 	NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
 	GSList *iter;
 
-	if (priv->auth_changed_id) {
-		g_signal_handler_disconnect (priv->authority, priv->auth_changed_id);
-		priv->auth_changed_id = 0;
-	}
-
 	for (iter = priv->auths; iter; iter = g_slist_next (iter))
 		nm_auth_chain_unref ((NMAuthChain *) iter->data);
 	g_slist_free (priv->auths);
diff --git a/src/settings/plugins/keyfile/writer.c b/src/settings/plugins/keyfile/writer.c
index 5ecf5891..eeb14556 100644
--- a/src/settings/plugins/keyfile/writer.c
+++ b/src/settings/plugins/keyfile/writer.c
@@ -453,17 +453,22 @@ write_hash_of_string (GKeyFile *file,
 
 	g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
 	while (g_hash_table_iter_next (&iter, (gpointer *) &property, (gpointer *) &data)) {
-		NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
+		gboolean write_item = TRUE;
 
 		/* Handle VPN secrets specially; they are nested in the property's hash;
-		 * we don't want to write them if the secret is not saved or not required.
+		 * we don't want to write them if the secret is not saved, not required,
+		 * or owned by a user's secret agent.
 		 */
-		if (vpn_secrets && nm_setting_get_secret_flags (setting, property, &flags, NULL)) {
-			if (flags & (NM_SETTING_SECRET_FLAG_NOT_SAVED | NM_SETTING_SECRET_FLAG_NOT_REQUIRED))
-				continue;
+		if (vpn_secrets) {
+			NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+			nm_setting_get_secret_flags (setting, property, &secret_flags, NULL);
+			if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
+				write_item = FALSE;
 		}
 
-		g_key_file_set_string (file, group_name, property, data);
+		if (write_item)
+			g_key_file_set_string (file, group_name, property, data);
 	}
 }
 
@@ -799,7 +804,6 @@ write_setting_value (NMSetting *setting,
 	GType type = G_VALUE_TYPE (value);
 	KeyWriter *writer = &key_writers[0];
 	GParamSpec *pspec;
-	NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
 
 	/* Setting name gets picked up from the keyfile's section name instead */
 	if (!strcmp (key, NM_SETTING_NAME))
@@ -822,12 +826,17 @@ write_setting_value (NMSetting *setting,
 	}
 
 	/* Don't write secrets that are owned by user secret agents or aren't
-	 * supposed to be saved.
+	 * supposed to be saved.  VPN secrets are handled specially though since
+	 * the secret flags there are in a third-level hash in the 'secrets'
+	 * property.
 	 */
-	if (   (pspec->flags & NM_SETTING_PARAM_SECRET)
-	    && nm_setting_get_secret_flags (setting, key, &flags, NULL)
-	    && (flags != NM_SETTING_SECRET_FLAG_NONE))
-		return;
+	if (pspec->flags & NM_SETTING_PARAM_SECRET && !NM_IS_SETTING_VPN (setting)) {
+		NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+		nm_setting_get_secret_flags (setting, key, &secret_flags, NULL);
+		if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
+			return;
+	}
 
 	/* Look through the list of handlers for non-standard format key values */
 	while (writer->setting_name) {
diff --git a/src/vpn-manager/Makefile.am b/src/vpn-manager/Makefile.am
index 3b206617..ce99728e 100644
--- a/src/vpn-manager/Makefile.am
+++ b/src/vpn-manager/Makefile.am
@@ -22,6 +22,7 @@ libvpn_manager_la_SOURCES = \
 	nm-vpn-connection.h
 
 libvpn_manager_la_CPPFLAGS =	\
+	$(LIBNL_CFLAGS)		\
 	$(DBUS_CFLAGS)		\
 	$(GLIB_CFLAGS)		\
 	-DG_DISABLE_DEPRECATED
@@ -30,6 +31,7 @@ libvpn_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
 	$(top_builddir)/libnm-util/libnm-util.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/vpn-manager/Makefile.in b/src/vpn-manager/Makefile.in
index a8fea32d..3785667e 100644
--- a/src/vpn-manager/Makefile.in
+++ b/src/vpn-manager/Makefile.in
@@ -60,7 +60,7 @@ libvpn_manager_la_DEPENDENCIES =  \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
 	$(top_builddir)/libnm-util/libnm-util.la $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am_libvpn_manager_la_OBJECTS = libvpn_manager_la-nm-vpn-manager.lo \
 	libvpn_manager_la-nm-vpn-service.lo \
 	libvpn_manager_la-nm-vpn-connection-base.lo \
@@ -328,6 +328,7 @@ libvpn_manager_la_SOURCES = \
 	nm-vpn-connection.h
 
 libvpn_manager_la_CPPFLAGS = \
+	$(LIBNL_CFLAGS)		\
 	$(DBUS_CFLAGS)		\
 	$(GLIB_CFLAGS)		\
 	-DG_DISABLE_DEPRECATED
@@ -336,6 +337,7 @@ libvpn_manager_la_LIBADD = \
 	$(top_builddir)/marshallers/libmarshallers.la \
 	$(top_builddir)/src/logging/libnm-logging.la \
 	$(top_builddir)/libnm-util/libnm-util.la \
+	$(LIBNL_LIBS) \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS)
 
diff --git a/src/wimax/nm-device-wimax.c b/src/wimax/nm-device-wimax.c
index 12db7e27..9dff503d 100644
--- a/src/wimax/nm-device-wimax.c
+++ b/src/wimax/nm-device-wimax.c
@@ -278,6 +278,8 @@ remove_all_nsps (NMDeviceWimax *self)
 {
 	NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self);
 
+	set_current_nsp (self, NULL);
+
 	while (g_slist_length (priv->nsp_list)) {
 		NMWimaxNsp *nsp = NM_WIMAX_NSP (priv->nsp_list->data);
 
@@ -717,29 +719,43 @@ real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
 	NMActRequest *req;
 	GSList *iter;
 	const char *path;
+	NMWimaxNsp *nsp = NULL;
 
 	clear_link_timeout (NM_DEVICE_WIMAX (device));
 
+	*reason = NM_DEVICE_STATE_REASON_NONE;
+
 	req = nm_device_get_act_request (device);
 	if (!req)
-		goto err;
+		return NM_ACT_STAGE_RETURN_FAILURE;
 
 	path = nm_act_request_get_specific_object (req);
 	if (!path)
-		goto err;
+		return NM_ACT_STAGE_RETURN_FAILURE;
 
+	/* Find the NSP in the scan list */
 	for (iter = priv->nsp_list; iter; iter = iter->next) {
-		NMWimaxNsp *nsp = NM_WIMAX_NSP (iter->data);
+		NMWimaxNsp *candidate = NM_WIMAX_NSP (iter->data);
 
-		if (!strcmp (path, nm_wimax_nsp_get_dbus_path (nsp))) {
-			set_current_nsp (NM_DEVICE_WIMAX (device), nsp);
-			return NM_ACT_STAGE_RETURN_SUCCESS;
+		if (!strcmp (path, nm_wimax_nsp_get_dbus_path (candidate))) {
+			nsp = candidate;
+			break;
 		}
 	}
 
- err:
-	*reason = NM_DEVICE_STATE_REASON_NONE;
-	return NM_ACT_STAGE_RETURN_FAILURE;
+	/* Couldn't find the NSP for some reason */
+	if (nsp == NULL)
+		return NM_ACT_STAGE_RETURN_FAILURE;
+
+	set_current_nsp (NM_DEVICE_WIMAX (device), nsp);
+
+	/* If the device is scanning, it won't connect, so we have to wait until
+	 * it's not scanning to proceed to stage 2.
+	 */
+	if (priv->status == WIMAX_API_DEVICE_STATUS_Scanning)
+		return NM_ACT_STAGE_RETURN_POSTPONE;
+
+	return NM_ACT_STAGE_RETURN_SUCCESS;
 }
 
 static NMActStageReturn
@@ -857,11 +873,11 @@ wmx_state_change_cb (struct wmxsdk *wmxsdk,
 	if (priv->current_nsp)
 		nsp_name = nm_wimax_nsp_get_name (priv->current_nsp);
 
-	nm_log_dbg (LOGD_WIMAX, "(%s): wimax state change %s -> %s (reason %d)",
-	            iface,
-	            iwmx_sdk_dev_status_to_str (old_status),
-	            iwmx_sdk_dev_status_to_str (new_status),
-	            reason);
+	nm_log_info (LOGD_WIMAX, "(%s): wimax state change %s -> %s (reason %d)",
+	             iface,
+	             iwmx_sdk_dev_status_to_str (old_status),
+	             iwmx_sdk_dev_status_to_str (new_status),
+	             reason);
 
 	switch (new_status) {
 	case WIMAX_API_DEVICE_STATUS_UnInitialized:
@@ -915,6 +931,18 @@ wmx_state_change_cb (struct wmxsdk *wmxsdk,
 			                         NM_DEVICE_STATE_REASON_CONFIG_FAILED);
 			return;
 		}
+
+		/* If stage2 was postponed because the device was scanning or something,
+		 * then check if we need to move to stage2 now that the device might be
+		 * ready.
+		 */
+		if (state == NM_DEVICE_STATE_PREPARE) {
+			if (   new_status == WIMAX_API_DEVICE_STATUS_Ready
+			    || new_status == WIMAX_API_DEVICE_STATUS_Connecting) {
+				nm_device_activate_schedule_stage2_device_config (NM_DEVICE (self));
+				return;
+			}
+		}
 	}
 
 	/* Handle disconnection */
@@ -1252,15 +1280,17 @@ device_state_changed (NMDevice *device,
 	if (new_state < NM_DEVICE_STATE_DISCONNECTED)
 		remove_all_nsps (self);
 
-	/* Request initial NSP list */
+	/* Request initial NSP list when device is first started */
 	if (   new_state == NM_DEVICE_STATE_DISCONNECTED
 	    && old_state < NM_DEVICE_STATE_DISCONNECTED) {
 		if (priv->sdk)
 			iwmx_sdk_get_networks (priv->sdk);
 	}
 
-	if (new_state == NM_DEVICE_STATE_FAILED || new_state <= NM_DEVICE_STATE_DISCONNECTED)
+	if (new_state == NM_DEVICE_STATE_FAILED || new_state <= NM_DEVICE_STATE_DISCONNECTED) {
+		set_current_nsp (self, NULL);
 		clear_activation_timeout (self);
+	}
 
 	if (new_state == NM_DEVICE_STATE_ACTIVATED) {
 		/* poll link quality and BSID */
diff --git a/test/nm-tool.c b/test/nm-tool.c
index a4b80df0..ffe70af9 100644
--- a/test/nm-tool.c
+++ b/test/nm-tool.c
@@ -323,50 +323,31 @@ get_connection_for_active (NMActiveConnection *active)
 	return (NMConnection *) g_hash_table_lookup (connections, path);
 }
 
-struct cb_info {
-	NMClient *client;
-	const GPtrArray *active;
-};
-
 static void
 detail_device (gpointer data, gpointer user_data)
 {
 	NMDevice *device = NM_DEVICE (data);
-	struct cb_info *info = user_data;
 	char *tmp;
 	NMDeviceState state;
 	guint32 caps;
 	guint32 speed;
 	const GArray *array;
-	int j;
 	gboolean is_default = FALSE;
 	const char *id = NULL;
+	NMActiveConnection *active;
 
-	state = nm_device_get_state (device);
-
-	for (j = 0; info->active && (j < info->active->len); j++) {
-		NMActiveConnection *candidate = g_ptr_array_index (info->active, j);
-		const GPtrArray *devices = nm_active_connection_get_devices (candidate);
-		NMDevice *candidate_dev;
+	active = nm_device_get_active_connection (device);
+	if (active) {
 		NMConnection *connection;
 		NMSettingConnection *s_con;
 
-		if (!devices || !devices->len)
-			continue;
-		candidate_dev = g_ptr_array_index (devices, 0);
-
-		if (candidate_dev == device) {
-			if (nm_active_connection_get_default (candidate))
-				is_default = TRUE;
+		is_default = nm_active_connection_get_default (active);
 
-			connection = get_connection_for_active (candidate);
-			if (!connection)
-				break;
-
-			s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+		connection = get_connection_for_active (active);
+		if (connection) {
+			s_con = nm_connection_get_setting_connection (connection);
 			if (s_con)
 				id = nm_setting_connection_get_id (s_con);
-			break;
 		}
 	}
 
@@ -396,6 +377,7 @@ detail_device (gpointer data, gpointer user_data)
 
 	print_string ("Driver", nm_device_get_driver (device) ? nm_device_get_driver (device) : "(unknown)");
 
+	state = nm_device_get_state (device);
 	print_string ("State", get_dev_state_string (state));
 
 	if (is_default)
@@ -787,7 +769,7 @@ main (int argc, char *argv[])
 {
 	NMClient *client;
 	const GPtrArray *devices;
-	struct cb_info info;
+	const GPtrArray *active;
 
 	g_type_init ();
 
@@ -806,16 +788,13 @@ main (int argc, char *argv[])
 	if (!get_all_connections ())
 		exit (1);
 
-	info.client = client;
-	info.active = nm_client_get_active_connections (client);
-
-
 	devices = nm_client_get_devices (client);
 	if (devices)
-		g_ptr_array_foreach ((GPtrArray *) devices, detail_device, &info);
+		g_ptr_array_foreach ((GPtrArray *) devices, detail_device, NULL);
 
-	if (info.active)
-		g_ptr_array_foreach ((GPtrArray *) info.active, detail_vpn, &info);
+	active = nm_client_get_active_connections (client);
+	if (active)
+		g_ptr_array_foreach ((GPtrArray *) active, detail_vpn, NULL);
 
 	g_object_unref (client);
 	g_hash_table_unref (connections);
diff --git a/tools/check-exports.sh b/tools/check-exports.sh
index 1415e144..3c75ef02 100755
--- a/tools/check-exports.sh
+++ b/tools/check-exports.sh
@@ -8,7 +8,7 @@ so=$1
 def=$2
 
 # Have to prefix with a tab and suffix with a ';' to match .ver file format
-get_syms='( objdump -t "$so" | grep "^[^ ]* [^l.*]*[.]"; objdump -t "$so" | grep "[.]hidden.*"; ) | sed "s/.* //" | sed "s/^/\t/" | sed "s/$/;/"'
+get_syms='( objdump -t "$so" | grep "^[^ ]* [^l.*]*[.]"; objdump -t "$so" | grep "^[^ ]* l[^.*]*\.text[^_]*nm_" | grep -v "_init"; ) | sed "s/.* //" | sed "s/^/\t/" | sed "s/$/;/"'
 
 echo $so: checking exported symbols against $def
 
-- 
cgit 1.3.0-6-gf8a5