summary refs log tree commit diff
path: root/clients
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2016-08-03 22:59:23 +0200
committerMichael Biebl <biebl@debian.org>2016-08-03 22:59:23 +0200
commitd6201f5d8daada3d64a0a3e0038e14eebec683ce (patch)
tree035500728cc23e7ee5368c3fd605270265a077f7 /clients
parent73e152af6e3fb4f5848bfb8394484026ff119003 (diff)
Imported Upstream version 1.2.4 upstream/1.2.4
Diffstat (limited to 'clients')
-rw-r--r--clients/Makefile.in1
-rw-r--r--clients/cli/Makefile.in1
-rw-r--r--clients/cli/common.c10
-rw-r--r--clients/cli/connections.c40
-rw-r--r--clients/cli/devices.c2
-rw-r--r--clients/cli/general.c18
-rw-r--r--clients/cli/nmcli-completion13
-rw-r--r--clients/cli/settings-docs.c6
-rw-r--r--clients/cli/settings.c242
-rw-r--r--clients/common/nm-vpn-helpers.c133
-rw-r--r--clients/common/nm-vpn-helpers.h7
-rw-r--r--clients/tui/Makefile.in1
-rw-r--r--clients/tui/newt/Makefile.in1
-rw-r--r--clients/tui/nmtui-edit.c9
14 files changed, 330 insertions, 154 deletions
diff --git a/clients/Makefile.in b/clients/Makefile.in
index a34052e7..b9439b75 100644
--- a/clients/Makefile.in
+++ b/clients/Makefile.in
@@ -360,6 +360,7 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_DNS_RC_MANAGER = @NM_CONFIG_DEFAULT_DNS_RC_MANAGER@
 NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
 NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
diff --git a/clients/cli/Makefile.in b/clients/cli/Makefile.in
index d26384e1..01b2433a 100644
--- a/clients/cli/Makefile.in
+++ b/clients/cli/Makefile.in
@@ -341,6 +341,7 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_DNS_RC_MANAGER = @NM_CONFIG_DEFAULT_DNS_RC_MANAGER@
 NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
 NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
diff --git a/clients/cli/common.c b/clients/cli/common.c
index 0888f063..05b76564 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -415,10 +415,12 @@ nmc_parse_and_build_route (int family,
 	char *dest = NULL, *plen = NULL;
 	const char *next_hop = NULL;
 	const char *canon_dest;
-	long int prefix = max_prefix, metric = -1;
+	long int prefix = max_prefix;
+	unsigned long int tmp_ulong;
 	NMIPRoute *route = NULL;
 	gboolean success = FALSE;
 	GError *local = NULL;
+	gint64 metric = -1;
 
 	g_return_val_if_fail (family == AF_INET || family == AF_INET6, FALSE);
 	g_return_val_if_fail (first != NULL, FALSE);
@@ -444,19 +446,21 @@ nmc_parse_and_build_route (int family,
 			next_hop = second;
 		else {
 			/* 'second' can be a metric */
-			if (!nmc_string_to_int (second, TRUE, 0, G_MAXUINT32, &metric)) {
+			if (!nmc_string_to_uint (second, TRUE, 0, G_MAXUINT32, &tmp_ulong)) {
 				g_set_error (error, 1, 0, _("the second component of route ('%s') is neither "
 				                            "a next hop address nor a metric"), second);
 				goto finish;
 			}
+			metric = tmp_ulong;
 		}
 	}
 
 	if (third) {
-		if (!nmc_string_to_int (third, TRUE, 0, G_MAXUINT32, &metric)) {
+		if (!nmc_string_to_uint (third, TRUE, 0, G_MAXUINT32, &tmp_ulong)) {
 			g_set_error (error, 1, 0, _("invalid metric '%s'"), third);
 			goto finish;
 		}
+		metric = tmp_ulong;
 	}
 
 	route = nm_ip_route_new (family, dest, prefix, next_hop, metric, &local);
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 1f1dae59..0e9a18ed 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -53,21 +53,6 @@
 #define PROMPT_IP_TUNNEL_MODE _("Tunnel mode: ")
 #define PROMPT_MACVLAN_MODE _("MACVLAN mode: ")
 
-static const char *nmc_known_vpns[] = {
-	"openvpn",
-	"vpnc",
-	"pptp",
-	"openconnect",
-	"openswan",
-	"libreswan",
-	"strongswan",
-	"ssh",
-	"l2tp",
-	"iodine",
-	"fortisslvpn",
-	NULL
-};
-
 /* Available fields for 'connection show' */
 static NmcOutputField nmc_fields_con_show[] = {
 	{"NAME",                 N_("NAME")},                  /* 0 */
@@ -1978,7 +1963,7 @@ device_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
 	           && state == NM_DEVICE_STATE_FAILED) {
 		if (nmc->print_output == NMC_PRINT_PRETTY)
 			nmc_terminal_erase_line ();
-		g_print (_("Error: Connection activation failed."));
+		g_print (_("Error: Connection activation failed.\n"));
 		quit ();
 	} else if (active && ac_state != NM_ACTIVE_CONNECTION_STATE_ACTIVATING) {
 		g_string_printf (nmc->return_text, _("Error: Connection activation failed."));
@@ -2931,7 +2916,6 @@ check_valid_name (const char *val, const NameItem *array, const NameItem *array_
 	GError *tmp_err = NULL;
 	int i;
 
-	g_return_val_if_fail (val, NULL);
 	g_return_val_if_fail (array, NULL);
 
 	/* Create a temporary array that can be used in nmc_string_is_valid() */
@@ -5904,10 +5888,12 @@ cleanup_bridge_slave:
 		const char *user_c = NULL;
 		char *user = NULL;
 		const char *st;
-		char *service_type = NULL;
+		gs_free char *service_type_free = NULL;
+		const char *service_type = NULL;
 		nmc_arg_t exp_args[] = { {"vpn-type", TRUE, &vpn_type, !ask},
 		                         {"user",     TRUE, &user_c,   FALSE},
 		                         {NULL} };
+		gs_free const char **plugin_names = NULL;
 
 		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
 			return FALSE;
@@ -5922,11 +5908,15 @@ cleanup_bridge_slave:
 		if (vpn_type_ask)
 			vpn_type = g_strstrip (vpn_type_ask);
 
-		if (!(st = nmc_string_is_valid (vpn_type, nmc_known_vpns, NULL))) {
+		plugin_names = nm_vpn_get_plugin_names (FALSE);
+		if (!(st = nmc_string_is_valid (vpn_type, plugin_names, NULL))) {
 			g_print (_("Warning: 'vpn-type': %s not known.\n"), vpn_type);
 			st = vpn_type;
 		}
-		service_type = g_strdup_printf ("%s.%s", NM_DBUS_INTERFACE, st);
+
+		service_type = nm_vpn_get_service_for_name (st);
+		if (!service_type)
+			service_type = service_type_free = nm_vpn_get_service_for_name_default (st);
 
 		/* Also ask for all optional arguments if '--ask' is specified. */
 		user = g_strdup (user_c);
@@ -5943,7 +5933,6 @@ cleanup_bridge_slave:
 		success = TRUE;
 cleanup_vpn:
 		g_free (vpn_type_ask);
-		g_free (service_type);
 		g_free (user);
 		if (!success)
 			return FALSE;
@@ -6711,7 +6700,10 @@ update_connection (gboolean persistent,
 static char *
 gen_func_vpn_types (const char *text, int state)
 {
-	return nmc_rl_gen_func_basic (text, state, nmc_known_vpns);
+	gs_free const char **plugin_names = NULL;
+
+	plugin_names = nm_vpn_get_plugin_names (FALSE);
+	return nmc_rl_gen_func_basic (text, state, plugin_names);
 }
 
 static char *
@@ -10690,7 +10682,7 @@ do_connection_import (NmCli *nmc, gboolean temporary, int argc, char **argv)
 	}
 
 	/* Import VPN configuration */
-	plugin = nm_vpn_get_plugin_by_service (type, &error);
+	plugin = nm_vpn_lookup_plugin (type, NULL, &error);
 	if (!plugin) {
 		g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."),
 		                 error->message);
@@ -10797,7 +10789,7 @@ do_connection_export (NmCli *nmc, int argc, char **argv)
 	type = nm_setting_vpn_get_service_type (nm_connection_get_setting_vpn (connection));
 
 	/* Export VPN configuration */
-	plugin = nm_vpn_get_plugin_by_service (type, &error);
+	plugin = nm_vpn_lookup_plugin (type, NULL, &error);
 	if (!plugin) {
 		g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."),
 		                 error->message);
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 65c4be72..1e3d9e42 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -1716,6 +1716,8 @@ do_device_connect (NmCli *nmc, int argc, char **argv)
 	nmc->nowait_flag = (nmc->timeout == 0);
 	nmc->should_wait++;
 
+	nmc->connections = nm_client_get_connections (nmc->client);
+
 	/* Create secret agent */
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect");
 	if (nmc->secret_agent)
diff --git a/clients/cli/general.c b/clients/cli/general.c
index 0704688f..280630c1 100644
--- a/clients/cli/general.c
+++ b/clients/cli/general.c
@@ -25,6 +25,7 @@
 #include "polkit-agent.h"
 #include "utils.h"
 #include "general.h"
+#include "nm-common-macros.h"
 
 #include "devices.h"
 #include "connections.h"
@@ -387,18 +388,6 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl
 	return TRUE;
 }
 
-#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK     "org.freedesktop.NetworkManager.enable-disable-network"
-#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI        "org.freedesktop.NetworkManager.enable-disable-wifi"
-#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN        "org.freedesktop.NetworkManager.enable-disable-wwan"
-#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX       "org.freedesktop.NetworkManager.enable-disable-wimax"
-#define NM_AUTH_PERMISSION_SLEEP_WAKE                 "org.freedesktop.NetworkManager.sleep-wake"
-#define NM_AUTH_PERMISSION_NETWORK_CONTROL            "org.freedesktop.NetworkManager.network-control"
-#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED       "org.freedesktop.NetworkManager.wifi.share.protected"
-#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN            "org.freedesktop.NetworkManager.wifi.share.open"
-#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM     "org.freedesktop.NetworkManager.settings.modify.system"
-#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN        "org.freedesktop.NetworkManager.settings.modify.own"
-#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME   "org.freedesktop.NetworkManager.settings.modify.hostname"
-
 static const char *
 permission_to_string (NMClientPermission perm)
 {
@@ -425,6 +414,10 @@ permission_to_string (NMClientPermission perm)
 		return NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN;
 	case NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME:
 		return NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME;
+	case NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS:
+		return NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS;
+	case NM_CLIENT_PERMISSION_RELOAD:
+		return NM_AUTH_PERMISSION_RELOAD;
 	default:
 		return _("unknown");
 	}
@@ -433,7 +426,6 @@ permission_to_string (NMClientPermission perm)
 static const char *
 permission_result_to_string (NMClientPermissionResult perm_result)
 {
-	
 	switch (perm_result) {
 	case NM_CLIENT_PERMISSION_RESULT_YES:
 		return _("yes");
diff --git a/clients/cli/nmcli-completion b/clients/cli/nmcli-completion
index 3c87f6f9..ffab7d8b 100644
--- a/clients/cli/nmcli-completion
+++ b/clients/cli/nmcli-completion
@@ -494,7 +494,7 @@ _nmcli_compl_ARGS()
                 ;;
             vpn-type)
                 if [[ "${#words[@]}" -eq 2 ]]; then
-                    _nmcli_list "vpnc openvpn pptp openconnect openswan libreswan ssh l2tp iodine"
+                    _nmcli_list "vpnc openvpn pptp openconnect openswan libreswan strongswan ssh l2tp iodine fortisslvpn"
                     return 0
                 fi
                 ;;
@@ -579,10 +579,16 @@ _nmcli_compl_ARGS()
             user| \
             username| \
             service| \
-            password| \
+            password)
+                if [[ "${#words[@]}" -eq 2 ]]; then
+                    return 0
+                fi
+                ;;
             passwd-file| \
             file)
                 if [[ "${#words[@]}" -eq 2 ]]; then
+                    compopt -o default
+                    COMPREPLY=()
                     return 0
                 fi
                 ;;
@@ -1379,8 +1385,7 @@ _nmcli()
 
                             OPTIONS=(type file)
                             OPTIONS_MANDATORY=(type file)
-                            ALIASES=("type:vpn-type")
-                            _nmcli_compl_ARGS ${ALIASES[@]}
+                            _nmcli_compl_ARGS type:vpn-type
                             return 0
                         fi
                         ;;
diff --git a/clients/cli/settings-docs.c b/clients/cli/settings-docs.c
index f4fb6a15..3616ff87 100644
--- a/clients/cli/settings-docs.c
+++ b/clients/cli/settings-docs.c
@@ -251,6 +251,7 @@ NmcPropertyDesc setting_ipv4[] = {
 	{ "dhcp-timeout", "A timeout for a DHCP transaction in seconds." },
 	{ "dns", "Array of IP addresses of DNS servers." },
 	{ "dns-options", "Array of DNS options. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties." },
+	{ "dns-priority", "DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf.  A lower value means that servers will be on top of the file.  Zero selects the default value, which is 50 for VPNs and 100 for other connections.  When multiple devices have configurations with the same priority, the one with an active default route will be preferred.  Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from configurations with the lowest priority value will be used." },
 	{ "dns-search", "Array of DNS search domains." },
 	{ "gateway", "The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set." },
 	{ "ignore-auto-dns", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used." },
@@ -272,6 +273,7 @@ NmcPropertyDesc setting_ipv6[] = {
 	{ "dhcp-timeout", "A timeout for a DHCP transaction in seconds." },
 	{ "dns", "Array of IP addresses of DNS servers." },
 	{ "dns-options", "Array of DNS options. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties." },
+	{ "dns-priority", "DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf.  A lower value means that servers will be on top of the file.  Zero selects the default value, which is 50 for VPNs and 100 for other connections.  When multiple devices have configurations with the same priority, the one with an active default route will be preferred.  Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from configurations with the lowest priority value will be used." },
 	{ "dns-search", "Array of DNS search domains." },
 	{ "gateway", "The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set." },
 	{ "ignore-auto-dns", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used." },
@@ -423,8 +425,8 @@ NmcSettingDesc all_settings[] = {
 	{ "gsm", setting_gsm, 13 },
 	{ "infiniband", setting_infiniband, 6 },
 	{ "ip-tunnel", setting_ip_tunnel, 13 },
-	{ "ipv4", setting_ipv4, 19 },
-	{ "ipv6", setting_ipv6, 19 },
+	{ "ipv4", setting_ipv4, 20 },
+	{ "ipv6", setting_ipv6, 20 },
 	{ "macvlan", setting_macvlan, 5 },
 	{ "ppp", setting_ppp, 19 },
 	{ "pppoe", setting_pppoe, 5 },
diff --git a/clients/cli/settings.c b/clients/cli/settings.c
index 1651aab2..f2a504cc 100644
--- a/clients/cli/settings.c
+++ b/clients/cli/settings.c
@@ -272,20 +272,21 @@ NmcOutputField nmc_fields_setting_ip4_config[] = {
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS),                 /* 2 */
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH),          /* 3 */
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS),         /* 4 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 5 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 6 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 7 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 8 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 9 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 10 */
-	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID),     /* 11 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_TIMEOUT),        /* 12 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 13 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 14 */
-	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_FQDN),          /* 15 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 16 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 17 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DAD_TIMEOUT),         /* 18 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_PRIORITY),        /* 5 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 6 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 7 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 8 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 9 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 10 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 11 */
+	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID),     /* 12 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_TIMEOUT),        /* 13 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 14 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 15 */
+	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_FQDN),          /* 16 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 17 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 18 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DAD_TIMEOUT),         /* 19 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_IP4_CONFIG_ALL     "name"","\
@@ -293,6 +294,7 @@ NmcOutputField nmc_fields_setting_ip4_config[] = {
                                               NM_SETTING_IP_CONFIG_DNS","\
                                               NM_SETTING_IP_CONFIG_DNS_SEARCH","\
                                               NM_SETTING_IP_CONFIG_DNS_OPTIONS","\
+                                              NM_SETTING_IP_CONFIG_DNS_PRIORITY","\
                                               NM_SETTING_IP_CONFIG_ADDRESSES","\
                                               NM_SETTING_IP_CONFIG_GATEWAY","\
                                               NM_SETTING_IP_CONFIG_ROUTES","\
@@ -315,18 +317,19 @@ NmcOutputField nmc_fields_setting_ip6_config[] = {
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS),                 /* 2 */
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH),          /* 3 */
 	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS),         /* 4 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 5 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 6 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 7 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 8 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 9 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 10 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 11 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 12 */
-	SETTING_FIELD (NM_SETTING_IP6_CONFIG_IP6_PRIVACY),        /* 13 */
-	SETTING_FIELD (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE),      /* 14 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 15 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 16 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_PRIORITY),        /* 5 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 6 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 7 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 8 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 9 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 10 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 11 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 12 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 13 */
+	SETTING_FIELD (NM_SETTING_IP6_CONFIG_IP6_PRIVACY),        /* 14 */
+	SETTING_FIELD (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE),      /* 15 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 16 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 17 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_IP6_CONFIG_ALL     "name"","\
@@ -334,6 +337,7 @@ NmcOutputField nmc_fields_setting_ip6_config[] = {
                                               NM_SETTING_IP_CONFIG_DNS","\
                                               NM_SETTING_IP_CONFIG_DNS_SEARCH","\
                                               NM_SETTING_IP_CONFIG_DNS_OPTIONS","\
+                                              NM_SETTING_IP_CONFIG_DNS_PRIORITY","\
                                               NM_SETTING_IP_CONFIG_ADDRESSES","\
                                               NM_SETTING_IP_CONFIG_GATEWAY","\
                                               NM_SETTING_IP_CONFIG_ROUTES","\
@@ -1041,19 +1045,30 @@ nmc_property_802_1X_get_ca_cert (NMSetting *setting, NmcPropertyGetType get_type
 }
 
 static char *
-nmc_property_802_1X_get_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
+nmc_property_802_1X_get_client_cert (NMSetting *setting,
+                                     NmcPropertyGetType get_type,
+                                     gboolean show_secrets)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
-	char *client_cert_str = NULL;
+	char *cert_str = NULL;
 
 	scheme = nm_setting_802_1x_get_client_cert_scheme (s_8021X);
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
-		client_cert_str = bytes_to_string (nm_setting_802_1x_get_client_cert_blob (s_8021X));
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		client_cert_str = g_strdup (nm_setting_802_1x_get_client_cert_path (s_8021X));
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		if (show_secrets)
+			cert_str = bytes_to_string (nm_setting_802_1x_get_client_cert_blob (s_8021X));
+		else
+			cert_str = g_strdup (_("<hidden>"));
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
+		cert_str = g_strdup (nm_setting_802_1x_get_client_cert_path (s_8021X));
+
+	return cert_str;
+}
 
-	return client_cert_str;
+static char *
+nmc_property_802_1X_get_client_cert_full (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	return nmc_property_802_1X_get_client_cert (setting, get_type, TRUE);
 }
 
 static char *
@@ -1073,19 +1088,30 @@ nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting, NmcPropertyGetType g
 }
 
 static char *
-nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
+nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting,
+                                            NmcPropertyGetType get_type,
+                                            gboolean show_secrets)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
-	char *phase2_client_cert_str = NULL;
+	char *cert_str = NULL;
 
 	scheme = nm_setting_802_1x_get_phase2_client_cert_scheme (s_8021X);
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
-		phase2_client_cert_str = bytes_to_string (nm_setting_802_1x_get_phase2_client_cert_blob (s_8021X));
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		phase2_client_cert_str = g_strdup (nm_setting_802_1x_get_phase2_client_cert_path (s_8021X));
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		if (show_secrets)
+			cert_str = bytes_to_string (nm_setting_802_1x_get_phase2_client_cert_blob (s_8021X));
+		else
+			cert_str = g_strdup (_("<hidden>"));
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
+		cert_str = g_strdup (nm_setting_802_1x_get_phase2_client_cert_path (s_8021X));
 
-	return phase2_client_cert_str;
+	return cert_str;
+}
+
+static char *
+nmc_property_802_1X_get_phase2_client_cert_full (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	return nmc_property_802_1X_get_phase2_client_cert (setting, get_type, TRUE);
 }
 
 static char *
@@ -1096,35 +1122,57 @@ nmc_property_802_1X_get_password_raw (NMSetting *setting, NmcPropertyGetType get
 }
 
 static char *
-nmc_property_802_1X_get_private_key (NMSetting *setting, NmcPropertyGetType get_type)
+nmc_property_802_1X_get_private_key (NMSetting *setting,
+                                     NmcPropertyGetType get_type,
+                                     gboolean show_secrets)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
-	char *private_key_str = NULL;
+	char *key_str = NULL;
 
 	scheme = nm_setting_802_1x_get_private_key_scheme (s_8021X);
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
-		private_key_str = bytes_to_string (nm_setting_802_1x_get_private_key_blob (s_8021X));
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		private_key_str = g_strdup (nm_setting_802_1x_get_private_key_path (s_8021X));
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		if (show_secrets)
+			key_str = bytes_to_string (nm_setting_802_1x_get_private_key_blob (s_8021X));
+		else
+			key_str = g_strdup (_("<hidden>"));
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
+		key_str = g_strdup (nm_setting_802_1x_get_private_key_path (s_8021X));
+
+	return key_str;
+}
 
-	return private_key_str;
+static char *
+nmc_property_802_1X_get_private_key_full (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	return nmc_property_802_1X_get_private_key (setting, get_type, TRUE);
 }
 
 static char *
-nmc_property_802_1X_get_phase2_private_key (NMSetting *setting, NmcPropertyGetType get_type)
+nmc_property_802_1X_get_phase2_private_key (NMSetting *setting,
+                                            NmcPropertyGetType get_type,
+                                            gboolean show_secrets)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
-	char *phase2_private_key_str = NULL;
+	char *key_str = NULL;
 
 	scheme = nm_setting_802_1x_get_phase2_private_key_scheme (s_8021X);
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB)
-		phase2_private_key_str = bytes_to_string (nm_setting_802_1x_get_phase2_private_key_blob (s_8021X));
-	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
-		phase2_private_key_str = g_strdup (nm_setting_802_1x_get_phase2_private_key_path (s_8021X));
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		if (show_secrets)
+			key_str = bytes_to_string (nm_setting_802_1x_get_phase2_private_key_blob (s_8021X));
+		else
+			key_str = g_strdup (_("<hidden>"));
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
+		key_str = g_strdup (nm_setting_802_1x_get_phase2_private_key_path (s_8021X));
 
-	return phase2_private_key_str;
+	return key_str;
+}
+
+static char *
+nmc_property_802_1X_get_phase2_private_key_full (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	return nmc_property_802_1X_get_phase2_private_key (setting, get_type, TRUE);
 }
 
 /* --- NM_SETTING_ADSL_SETTING_NAME property get functions --- */
@@ -1444,6 +1492,7 @@ DEFINE_GETTER (nmc_property_ipv4_get_method, NM_SETTING_IP_CONFIG_METHOD)
 DEFINE_GETTER (nmc_property_ipv4_get_dns, NM_SETTING_IP_CONFIG_DNS)
 DEFINE_GETTER (nmc_property_ipv4_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
 DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv4_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting))
+DEFINE_GETTER (nmc_property_ipv4_get_dns_priority, NM_SETTING_IP_CONFIG_DNS_PRIORITY)
 
 static char *
 nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type)
@@ -1564,6 +1613,7 @@ DEFINE_GETTER (nmc_property_ipv6_get_method, NM_SETTING_IP_CONFIG_METHOD)
 DEFINE_GETTER (nmc_property_ipv6_get_dns, NM_SETTING_IP_CONFIG_DNS)
 DEFINE_GETTER (nmc_property_ipv6_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
 DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv6_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting))
+DEFINE_GETTER (nmc_property_ipv6_get_dns_priority, NM_SETTING_IP_CONFIG_DNS_PRIORITY)
 
 static char *
 nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
@@ -5709,7 +5759,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, CLIENT_CERT),
-	                    nmc_property_802_1X_get_client_cert,
+	                    nmc_property_802_1X_get_client_cert_full,
 	                    nmc_property_802_1X_set_client_cert,
 	                    NULL,
 	                    nmc_property_802_1X_describe_client_cert,
@@ -5786,7 +5836,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PHASE2_CLIENT_CERT),
-	                    nmc_property_802_1X_get_phase2_client_cert,
+	                    nmc_property_802_1X_get_phase2_client_cert_full,
 	                    nmc_property_802_1X_set_phase2_client_cert,
 	                    NULL,
 	                    nmc_property_802_1X_describe_phase2_client_cert,
@@ -5821,7 +5871,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PRIVATE_KEY),
-	                    nmc_property_802_1X_get_private_key,
+	                    nmc_property_802_1X_get_private_key_full,
 	                    nmc_property_802_1X_set_private_key,
 	                    NULL,
 	                    nmc_property_802_1X_describe_private_key,
@@ -5842,7 +5892,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PHASE2_PRIVATE_KEY),
-	                    nmc_property_802_1X_get_phase2_private_key,
+	                    nmc_property_802_1X_get_phase2_private_key_full,
 	                    nmc_property_802_1X_set_phase2_private_key,
 	                    NULL,
 	                    nmc_property_802_1X_describe_private_key,
@@ -6452,6 +6502,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE_IP (4, DNS_PRIORITY),
+	                    nmc_property_ipv4_get_dns_priority,
+	                    nmc_property_set_int,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (4, ADDRESSES),
 	                    nmc_property_ip_get_addresses,
 	                    nmc_property_ipv4_set_addresses,
@@ -6580,6 +6637,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE_IP (6, DNS_PRIORITY),
+	                    nmc_property_ipv6_get_dns_priority,
+	                    nmc_property_set_int,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (6, ADDRESSES),
 	                    nmc_property_ip_get_addresses,
 	                    nmc_property_ipv6_set_addresses,
@@ -7999,7 +8063,7 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 	set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 9, nmc_property_802_1X_get_domain_suffix_match (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 10, nmc_property_802_1X_get_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_802_1X_get_client_cert (setting, NMC_PROPERTY_GET_PRETTY, secrets));
 	set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peapver (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 12, nmc_property_802_1X_get_phase1_peaplabel (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 13, nmc_property_802_1X_get_phase1_fast_provisioning (setting, NMC_PROPERTY_GET_PRETTY));
@@ -8010,15 +8074,15 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 	set_val_str (arr, 18, nmc_property_802_1X_get_phase2_subject_match (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 19, nmc_property_802_1X_get_phase2_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 20, nmc_property_802_1X_get_phase2_domain_suffix_match (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 21, nmc_property_802_1X_get_phase2_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 21, nmc_property_802_1X_get_phase2_client_cert (setting, NMC_PROPERTY_GET_PRETTY, secrets));
 	set_val_str (arr, 22, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password));
 	set_val_str (arr, 23, nmc_property_802_1X_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 24, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password_raw));
 	set_val_str (arr, 25, nmc_property_802_1X_get_password_raw_flags (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 26, nmc_property_802_1X_get_private_key (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 26, nmc_property_802_1X_get_private_key (setting, NMC_PROPERTY_GET_PRETTY, secrets));
 	set_val_str (arr, 27, GET_SECRET (secrets, setting, nmc_property_802_1X_get_private_key_password));
 	set_val_str (arr, 28, nmc_property_802_1X_get_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key (setting, NMC_PROPERTY_GET_PRETTY, secrets));
 	set_val_str (arr, 30, GET_SECRET (secrets, setting, nmc_property_802_1X_get_phase2_private_key_password));
 	set_val_str (arr, 31, nmc_property_802_1X_get_phase2_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 32, GET_SECRET (secrets, setting, nmc_property_802_1X_get_pin));
@@ -8135,20 +8199,21 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 	set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 4, nmc_property_ipv4_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 6, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 7, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 8, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 10, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_timeout (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 13, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 14, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 15, nmc_property_ipv4_get_dhcp_fqdn (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 16, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 17, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 18, nmc_property_ipv4_get_dad_timeout (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ipv4_get_dns_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv4_get_dhcp_timeout (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_ipv4_get_dhcp_fqdn (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 18, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 19, nmc_property_ipv4_get_dad_timeout (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -8178,18 +8243,19 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 	set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 4, nmc_property_ipv6_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 6, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 7, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 8, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 10, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 11, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 12, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 13, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 14, nmc_property_ipv6_get_addr_gen_mode (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 15, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
-	set_val_str (arr, 16, nmc_property_ipv6_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ipv6_get_dns_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_ipv6_get_addr_gen_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_ipv6_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
diff --git a/clients/common/nm-vpn-helpers.c b/clients/common/nm-vpn-helpers.c
index 880b6ecd..fe777ef5 100644
--- a/clients/common/nm-vpn-helpers.c
+++ b/clients/common/nm-vpn-helpers.c
@@ -36,30 +36,53 @@ static gboolean plugins_loaded;
 static GSList *plugins = NULL;
 
 NMVpnEditorPlugin *
-nm_vpn_get_plugin_by_service (const char *service, GError **error)
+nm_vpn_lookup_plugin (const char *name, const char *service, GError **error)
 {
 	NMVpnEditorPlugin *plugin = NULL;
 	NMVpnPluginInfo *plugin_info;
-	char *type = NULL;
+	gs_free_error GError *local = NULL;
 
-	g_return_val_if_fail (service != NULL, NULL);
+	g_return_val_if_fail (!service ^ !name, NULL);
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
 	if (G_UNLIKELY (!plugins_loaded))
 		nm_vpn_get_plugins ();
 
-	if (!g_str_has_prefix (service, NM_DBUS_INTERFACE))
-		service = type = g_strdup_printf ("%s.%s", NM_DBUS_INTERFACE, service);
+	if (service)
+		plugin_info = nm_vpn_plugin_info_list_find_by_service (plugins, service);
+	else
+		plugin_info = nm_vpn_plugin_info_list_find_by_name (plugins, name);
+
+	if (!plugin_info) {
+		g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+		             _("unknown VPN plugin \"%s\""), service ?: name);
+		return NULL;
+	}
+	plugin = nm_vpn_plugin_info_get_editor_plugin (plugin_info);
+	if (!plugin)
+		plugin = nm_vpn_plugin_info_load_editor_plugin (plugin_info, &local);
+
+	if (!plugin) {
+		if (   !nm_vpn_plugin_info_get_plugin (plugin_info)
+		    && nm_vpn_plugin_info_lookup_property (plugin_info, NM_VPN_PLUGIN_INFO_KF_GROUP_GNOME, "properties")) {
+			g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+			             _("cannot cannot load legacy-only VPN plugin \"%s\" for \"%s\""),
+			             nm_vpn_plugin_info_get_name (plugin_info),
+			             nm_vpn_plugin_info_get_filename (plugin_info));
+		} else if (g_error_matches (local, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
+			g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+			             _("cannot load VPN plugin \"%s\" due to missing \"%s\". Missing client plugin?"),
+			             nm_vpn_plugin_info_get_name (plugin_info),
+			             nm_vpn_plugin_info_get_plugin (plugin_info));
+		} else {
+			g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+			             _("failed to load VPN plugin \"%s\": %s"),
+			             nm_vpn_plugin_info_get_name (plugin_info),
+			             local->message);
+		}
+		return NULL;
+	}
 
-	plugin_info = nm_vpn_plugin_info_list_find_by_service (plugins, service);
-	if (plugin_info) {
-		plugin = nm_vpn_plugin_info_get_editor_plugin (plugin_info);
-		if (!plugin)
-			plugin = nm_vpn_plugin_info_load_editor_plugin (plugin_info, error);
-	} else
-		g_set_error_literal (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
-		                     _("could not get VPN plugin info"));
-	g_free (type);
 	return plugin;
 }
 
@@ -73,6 +96,80 @@ nm_vpn_get_plugins (void)
 	return plugins;
 }
 
+static int
+_strcmp_data (gconstpointer a, gconstpointer b, gpointer unused)
+{
+	return strcmp (a, b);
+}
+
+const char **
+nm_vpn_get_plugin_names (gboolean only_available_plugins)
+{
+	GSList *p;
+	const char **list;
+	const char *known_names[] = {
+		"openvpn",
+		"vpnc",
+		"pptp",
+		"openconnect",
+		"openswan",
+		"libreswan",
+		"strongswan",
+		"ssh",
+		"l2tp",
+		"iodine",
+		"fortisslvpn",
+	};
+	guint i, j, k;
+
+	p = nm_vpn_get_plugins ();
+	list = g_new0 (const char *, g_slist_length (p) + G_N_ELEMENTS (known_names) + 1);
+
+	i = 0;
+	for (i = 0; p; p = p->next)
+		list[i++] = nm_vpn_plugin_info_get_name (p->data);
+	if (!only_available_plugins) {
+		for (j = 0; j < G_N_ELEMENTS (known_names); j++)
+			list[i++] = known_names[j];
+	}
+
+	g_qsort_with_data (list, i, sizeof (gpointer), _strcmp_data, NULL);
+
+	/* remove duplicates */
+	for (k = 0, j = 1; j < i; j++) {
+		if (nm_streq (list[k], list[j]))
+			continue;
+		list[k++] = list[j];
+	}
+	list[k++] = NULL;
+
+	return list;
+}
+
+const char *
+nm_vpn_get_service_for_name (const char *name)
+{
+	NMVpnPluginInfo *plugin_info;
+
+	g_return_val_if_fail (name, NULL);
+
+	plugin_info = nm_vpn_plugin_info_list_find_by_name (nm_vpn_get_plugins (), name);
+	if (plugin_info) {
+		/* this only means we have a .name file (NMVpnPluginInfo). Possibly the
+		 * NMVpnEditorPlugin is not loadable. */
+		return nm_vpn_plugin_info_lookup_property (plugin_info,
+		                                           NM_VPN_PLUGIN_INFO_KF_GROUP_CONNECTION,
+		                                           "service");
+	}
+	return NULL;
+}
+
+char *
+nm_vpn_get_service_for_name_default (const char *name)
+{
+	return g_strdup_printf ("%s.%s", NM_DBUS_INTERFACE, name);
+}
+
 gboolean
 nm_vpn_supports_ipv6 (NMConnection *connection)
 {
@@ -85,10 +182,12 @@ nm_vpn_supports_ipv6 (NMConnection *connection)
 	g_return_val_if_fail (s_vpn != NULL, FALSE);
 
 	service_type = nm_setting_vpn_get_service_type (s_vpn);
-	g_return_val_if_fail (service_type != NULL, FALSE);
+	if (!service_type)
+		return FALSE;
 
-	plugin = nm_vpn_get_plugin_by_service (service_type, NULL);
-	g_return_val_if_fail (plugin != NULL, FALSE);
+	plugin = nm_vpn_lookup_plugin (NULL, service_type, NULL);
+	if (!plugin)
+		return FALSE;
 
 	capabilities = nm_vpn_editor_plugin_get_capabilities (plugin);
 	return NM_FLAGS_HAS (capabilities, NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
diff --git a/clients/common/nm-vpn-helpers.h b/clients/common/nm-vpn-helpers.h
index 4f8d2194..79fc94e9 100644
--- a/clients/common/nm-vpn-helpers.h
+++ b/clients/common/nm-vpn-helpers.h
@@ -30,7 +30,12 @@ struct {
 
 GSList *nm_vpn_get_plugins (void);
 
-NMVpnEditorPlugin *nm_vpn_get_plugin_by_service (const char *service, GError **error);
+const char **nm_vpn_get_plugin_names (gboolean only_available_plugins);
+
+const char *nm_vpn_get_service_for_name (const char *name);
+char *      nm_vpn_get_service_for_name_default (const char *name);
+
+NMVpnEditorPlugin *nm_vpn_lookup_plugin (const char *name, const char *service, GError **error);
 
 gboolean nm_vpn_supports_ipv6 (NMConnection *connection);
 
diff --git a/clients/tui/Makefile.in b/clients/tui/Makefile.in
index 82b89bdd..d7773283 100644
--- a/clients/tui/Makefile.in
+++ b/clients/tui/Makefile.in
@@ -429,6 +429,7 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_DNS_RC_MANAGER = @NM_CONFIG_DEFAULT_DNS_RC_MANAGER@
 NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
 NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
diff --git a/clients/tui/newt/Makefile.in b/clients/tui/newt/Makefile.in
index f1c579cb..3042089f 100644
--- a/clients/tui/newt/Makefile.in
+++ b/clients/tui/newt/Makefile.in
@@ -330,6 +330,7 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_DNS_RC_MANAGER = @NM_CONFIG_DEFAULT_DNS_RC_MANAGER@
 NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
 NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
diff --git a/clients/tui/nmtui-edit.c b/clients/tui/nmtui-edit.c
index c7efd856..96c17245 100644
--- a/clients/tui/nmtui-edit.c
+++ b/clients/tui/nmtui-edit.c
@@ -184,7 +184,12 @@ create_connection (NmtNewtWidget *widget, gpointer list)
 	connection = nm_editor_utils_create_connection (type, priv->master, nm_client);
 	nmt_edit_connection (connection);
 	g_object_unref (connection);
+}
 
+static void
+create_connection_and_quit (NmtNewtWidget *widget, gpointer list)
+{
+	create_connection (widget, list);
 	nmt_newt_form_quit (list);
 }
 
@@ -203,7 +208,7 @@ nmt_add_connection_init (NmtAddConnection *form)
 
 	listbox = nmt_newt_listbox_new (5, NMT_NEWT_LISTBOX_SCROLL);
 	priv->listbox = NMT_NEWT_LISTBOX (listbox);
-	g_signal_connect (priv->listbox, "activated", G_CALLBACK (create_connection), form);
+	g_signal_connect (priv->listbox, "activated", G_CALLBACK (create_connection_and_quit), form);
 	nmt_newt_grid_add (grid, listbox, 0, 1);
 	nmt_newt_widget_set_padding (listbox, 0, 1, 0, 0);
 	nmt_newt_grid_set_flags (grid, listbox, NMT_NEWT_GRID_EXPAND_X);
@@ -223,7 +228,7 @@ nmt_add_connection_init (NmtAddConnection *form)
 	                         NMT_NEWT_GRID_FILL_Y);
 
 	button = g_object_ref_sink (nmt_newt_button_new (_("Create")));
-	g_signal_connect (button, "clicked", G_CALLBACK (create_connection), form);
+	g_signal_connect (button, "clicked", G_CALLBACK (create_connection_and_quit), form);
 	nmt_newt_grid_add (NMT_NEWT_GRID (buttons), button, 1, 0);
 
 	nmt_newt_form_set_content (NMT_NEWT_FORM (form), NMT_NEWT_WIDGET (grid));