about summary refs log tree commit diff
path: root/clients/cli
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2015-07-14 19:38:58 +0200
committerMichael Biebl <biebl@debian.org>2015-07-14 19:38:58 +0200
commit50a58f0fabd8a34c1b6108a107e08abe3c1ccd24 (patch)
tree6790165f39daee79e2b6c6617483320613493367 /clients/cli
parentf408e27bccfacf347605a8d98649975a68f38a17 (diff)
Imported Upstream version 1.0.4 upstream/1.0.4
Diffstat (limited to 'clients/cli')
-rw-r--r--clients/cli/Makefile.in2
-rw-r--r--clients/cli/common.c6
-rw-r--r--clients/cli/connections.c466
-rw-r--r--clients/cli/devices.c352
-rw-r--r--clients/cli/nmcli-completion8
-rw-r--r--clients/cli/settings-docs.c7
-rw-r--r--clients/cli/settings.c857
-rw-r--r--clients/cli/settings.h8
-rw-r--r--clients/cli/utils.c37
-rw-r--r--clients/cli/utils.h5
10 files changed, 1017 insertions, 731 deletions
diff --git a/clients/cli/Makefile.in b/clients/cli/Makefile.in
index 657f00ff..34315101 100644
--- a/clients/cli/Makefile.in
+++ b/clients/cli/Makefile.in
@@ -206,6 +206,7 @@ ACLOCAL = @ACLOCAL@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -319,6 +320,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
diff --git a/clients/cli/common.c b/clients/cli/common.c
index a47c32e8..97d0bb94 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -708,6 +708,12 @@ nmc_device_reason_to_string (NMDeviceStateReason reason)
 	case NM_DEVICE_STATE_REASON_NEW_ACTIVATION:
 		return _("New connection activation was enqueued");
 
+	case NM_DEVICE_STATE_REASON_PARENT_CHANGED:
+		return _("The device's parent changed");
+
+	case NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED:
+		return _("The device parent's management changed");
+
 	default:
 		/* TRANSLATORS: Unknown reason for a device state change (NMDeviceStateReason) */
 		return _("Unknown");
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 9206d9da..8d138bdf 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -49,7 +49,8 @@
 #define PROMPT_BOND_MASTER _("Bond master: ")
 #define PROMPT_TEAM_MASTER _("Team master: ")
 #define PROMPT_BRIDGE_MASTER _("Bridge master: ")
-#define PROMPT_CONNECTION _("Connection (name, UUID, or path): ")
+#define PROMPT_CONNECTION  _("Connection (name, UUID, or path): ")
+#define PROMPT_CONNECTIONS _("Connection(s) (name, UUID, or path): ")
 
 static const char *nmc_known_vpns[] =
 	{ "openvpn", "vpnc", "pptp", "openconnect", "openswan", "libreswan",
@@ -237,6 +238,7 @@ typedef struct {
 	char *con_type;
 	NMConnection *connection;
 	NMSetting *setting;
+	const char *property;
 } TabCompletionInfo;
 static TabCompletionInfo nmc_tab_completion = {NULL, NULL, NULL, NULL};
 
@@ -1567,6 +1569,7 @@ find_device_for_connection (NmCli *nmc,
 	int i, j;
 
 	g_return_val_if_fail (nmc != NULL, FALSE);
+	g_return_val_if_fail (iface || ap || nsp, FALSE);
 	g_return_val_if_fail (device != NULL && *device == NULL, FALSE);
 	g_return_val_if_fail (spec_object != NULL && *spec_object == NULL, FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1726,7 +1729,7 @@ device_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
 		         nm_object_get_path (NM_OBJECT (active)));
 		quit ();
 	} else if (   ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING
-	           && state == NM_DEVICE_STATE_IP_CONFIG) {
+	           && state >= NM_DEVICE_STATE_IP_CONFIG) {
 		if (nmc->print_output == NMC_PRINT_PRETTY)
 			nmc_terminal_erase_line ();
 		g_print (_("Connection successfully activated (master waiting for slaves) (D-Bus active path: %s)\n"),
@@ -2052,7 +2055,7 @@ nmc_activate_connection (NmCli *nmc,
 	g_return_val_if_fail (nmc != NULL, FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	if (connection) {
+	if (connection && (ifname || ap || nsp)) {
 		device_found = find_device_for_connection (nmc, connection, ifname, ap, nsp, &device, &spec_object, &local);
 
 		/* Virtual connection may not have their interfaces created yet */
@@ -2070,7 +2073,7 @@ nmc_activate_connection (NmCli *nmc,
 			             _("unknown device '%s'."), ifname);
 			return FALSE;
 		}
-	} else {
+	} else if (!connection) {
 		g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_NOT_FOUND,
 		                     _("neither a valid connection nor device given"));
 		return FALSE;
@@ -2239,25 +2242,26 @@ typedef struct {
 	NmCli *nmc;
 	GSList *queue;
 	guint timeout_id;
-} DeactivateConnectionInfo;
+} ConnectionCbInfo;
 
-static void deactivate_connection_info_finish (DeactivateConnectionInfo *info,
-                                               NMActiveConnection *active);
+static void connection_cb_info_finish (ConnectionCbInfo *info,
+                                       gpointer connection);
 
-static gboolean
-down_timeout_cb (gpointer user_data)
+static void
+connection_removed_cb (NMClient *client, NMConnection *connection, ConnectionCbInfo *info)
 {
-	DeactivateConnectionInfo *info = user_data;
-
-	timeout_cb (info->nmc);
-	deactivate_connection_info_finish (info, NULL);
-	return G_SOURCE_REMOVE;
+	if (!g_slist_find (info->queue, connection))
+		return;
+	g_print (_("Connection '%s' (%s) successfully deleted.\n"),
+	         nm_connection_get_id (connection),
+	         nm_connection_get_uuid (connection));
+	connection_cb_info_finish (info, connection);
 }
 
 static void
 down_active_connection_state_cb (NMActiveConnection *active,
                                  GParamSpec *pspec,
-                                 DeactivateConnectionInfo *info)
+                                 ConnectionCbInfo *info)
 {
 	if (nm_active_connection_get_state (active) < NM_ACTIVE_CONNECTION_STATE_DEACTIVATED)
 		return;
@@ -2267,7 +2271,20 @@ down_active_connection_state_cb (NMActiveConnection *active,
 	g_print (_("Connection '%s' successfully deactivated (D-Bus active path: %s)\n"),
 	         nm_active_connection_get_id (active), nm_object_get_path (NM_OBJECT (active)));
 
-	deactivate_connection_info_finish (info, active);
+	g_signal_handlers_disconnect_by_func (G_OBJECT (active),
+	                                      down_active_connection_state_cb,
+	                                      info);
+	connection_cb_info_finish (info, active);
+}
+
+static gboolean
+connection_op_timeout_cb (gpointer user_data)
+{
+	ConnectionCbInfo *info = user_data;
+
+	timeout_cb (info->nmc);
+	connection_cb_info_finish (info, NULL);
+	return G_SOURCE_REMOVE;
 }
 
 static void
@@ -2279,15 +2296,11 @@ destroy_queue_element (gpointer data)
 }
 
 static void
-deactivate_connection_info_finish (DeactivateConnectionInfo *info,
-                                   NMActiveConnection *active)
-{
-	if (active) {
-		info->queue = g_slist_remove (info->queue, active);
-		g_signal_handlers_disconnect_by_func (active,
-		                                      down_active_connection_state_cb,
-		                                      info);
-		g_object_unref (active);
+connection_cb_info_finish (ConnectionCbInfo *info, gpointer connection)
+{
+	if (connection) {
+		info->queue = g_slist_remove (info->queue, connection);
+		g_object_unref (G_OBJECT (connection));
 	} else {
 		g_slist_free_full (info->queue, destroy_queue_element);
 		info->queue = NULL;
@@ -2298,7 +2311,8 @@ deactivate_connection_info_finish (DeactivateConnectionInfo *info,
 
 	if (info->timeout_id)
 		g_source_remove (info->timeout_id);
-	g_slice_free (DeactivateConnectionInfo, info);
+	g_signal_handlers_disconnect_by_func (info->nmc->client, connection_removed_cb, info);
+	g_slice_free (ConnectionCbInfo, info);
 	quit ();
 }
 
@@ -2306,7 +2320,7 @@ static NMCResultCode
 do_connection_down (NmCli *nmc, int argc, char **argv)
 {
 	NMActiveConnection *active;
-	DeactivateConnectionInfo *info = NULL;
+	ConnectionCbInfo *info = NULL;
 	const GPtrArray *active_cons;
 	GSList *queue = NULL, *iter;
 	char *line = NULL;
@@ -2315,10 +2329,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 	int arg_num = argc;
 	int idx = 0;
 
+	if (nmc->timeout == -1)
+		nmc->timeout = 10;
+
 	if (argc == 0) {
 		if (nmc->ask) {
-			line = nmc_readline (PROMPT_CONNECTION);
-			nmc_string_to_arg_array (line, "", &arg_arr, &arg_num);
+			line = nmc_readline (PROMPT_CONNECTIONS);
+			nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
 			g_free (line);
 			arg_ptr = arg_arr;
 		}
@@ -2329,9 +2346,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 		}
 	}
 
-	if (nmc->timeout == -1)
-		nmc->timeout = 10;
-
 	/* Get active connections */
 	active_cons = nm_client_get_active_connections (nmc->client);
 	while (arg_num > 0) {
@@ -2351,9 +2365,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 		}
 
 		active = find_active_connection (active_cons, nmc->connections, selector, *arg_ptr, &idx);
-		if (active)
-			queue = g_slist_prepend (queue, active);
-		else {
+		if (active) {
+			/* Check if the connection is unique. */
+			/* Calling down for the same connection repeatedly would result in
+			 * NM responding for the last D-Bus call only and we would stall. */
+			if (!g_slist_find (queue, active))
+				queue = g_slist_prepend (queue, g_object_ref (active));
+		} else {
 			g_printerr (_("Error: '%s' is not an active connection.\n"), *arg_ptr);
 			g_string_printf (nmc->return_text, _("Error: not all active connections found."));
 			nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
@@ -2368,27 +2386,25 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 		goto error;
 	}
-
 	queue = g_slist_reverse (queue);
 
 	if (nmc->timeout > 0) {
 		nmc->should_wait = TRUE;
 
-		info = g_slice_new0 (DeactivateConnectionInfo);
+		info = g_slice_new0 (ConnectionCbInfo);
 		info->nmc = nmc;
-		info->timeout_id = g_timeout_add_seconds (nmc->timeout, down_timeout_cb, info);
+		info->queue = queue;
+		info->timeout_id = g_timeout_add_seconds (nmc->timeout, connection_op_timeout_cb, info);
 	}
 
 	for (iter = queue; iter; iter = g_slist_next (iter)) {
 		active = iter->data;
 
-		if (info) {
-			info->queue = g_slist_prepend (info->queue, g_object_ref (active));
+		if (info)
 			g_signal_connect (active,
 			                  "notify::" NM_ACTIVE_CONNECTION_STATE,
 			                  G_CALLBACK (down_active_connection_state_cb),
 			                  info);
-		}
 
 		/* Now deactivate the connection */
 		nm_client_deactivate_connection (nmc->client, active, NULL, NULL);
@@ -2396,7 +2412,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 
 error:
 	g_strfreev (arg_arr);
-	g_slist_free (queue);
 	return nmc->return_value;
 }
 
@@ -2862,7 +2877,7 @@ check_valid_enumeration (char **str,
 	} else {
 		char *options;
 
-		options = nmc_util_strv_for_display (strings);
+		options = nmc_util_strv_for_display (strings, TRUE);
 		g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
 		             _("Error: '%s': '%s' is not a valid %s %s."),
 		             what, *str, what_desc, options);
@@ -5732,7 +5747,6 @@ uuid_display_hook (char **array, int len, int max_len)
 	int i, max = 0;
 	char *tmp;
 	const char *id;
-
 	for (i = 1; i <= len; i++) {
 		con = nmc_find_connection (nmc_tab_completion.nmc->connections, "uuid", array[i], NULL);
 		id = con ? nm_connection_get_id (con) : NULL;
@@ -6087,48 +6101,105 @@ should_complete_cmd (const char *line, int end, const char *cmd,
 	return ret;
 }
 
-static char *
-extract_property_name (const char *prompt, const char *line)
+/*
+ * extract_setting_and_property:
+ * prompt: (in) (allow-none): prompt string, or NULL
+ * line: (in) (allow-none): line, or NULL
+ * setting: (out) (transfer full) (array zero-terminated=1):
+ *   return location for setting name
+ * property: (out) (transfer full) (array zero-terminated=1):
+ *   return location for property name
+ *
+ * Extract setting and property names from prompt and/or line.
+ */
+static void
+extract_setting_and_property (const char *prompt, const char *line,
+                              char **setting, char **property)
 {
 	char *prop = NULL;
+	char *sett = NULL;
 
-	/* If prompt is set take the property name from it, else extract it from line */
-	if (!prompt) {
-		const char *p1;
-		size_t num;
-		p1 = strchr (line, '.');
-		if (p1) {
-			p1++;
-		} else {
-			size_t n1, n2, n3;
-			n1 = strspn  (line,    " \t");
-			n2 = strcspn (line+n1, " \t\0") + n1;
-			n3 = strspn  (line+n2, " \t")   + n2;
-			p1 = line + n3;
-		}
-		num = strcspn (p1, " \t\0");
-		prop = g_strndup (p1, num);
-	} else {
-		const char *p1, *dot;
-		size_t num;
+	if (prompt) {
+		/* prompt looks like this:
+		  "nmcli 802-1x>" or "nmcli 802-1x.pac-file>" */
+		const char *p1, *p2, *dot;
+		size_t num1, num2;
 		p1 = strchr (prompt, ' ');
-		/* prompt looks like this: "nmcli 802-1x>" or "nmcli 802-1x.pac-file>" */
 		if (p1) {
-			dot = strchr (p1 + 1, '.');
-			p1 = dot ? dot + 1 : p1;
-			num = strcspn  (p1, ">");
-			prop = g_strndup (p1, num);
+			dot = strchr (++p1, '.');
+			if (dot) {
+				p2 = dot + 1;
+				num1 = strcspn (p1, ".");
+				num2 = strcspn (p2, ">");
+				sett = num1 > 0 ? g_strndup (p1, num1) : NULL;
+				prop = num2 > 0 ? g_strndup (p2, num2) : NULL;
+			} else {
+				num1 = strcspn (p1, ">");
+				sett = num1 > 0 ? g_strndup (p1, num1) : NULL;
+			}
 		}
 	}
 
-	return prop;
+	if (line) {
+		/* line looks like this:
+		  " set 802-1x.pac-file ..." or " set pac-file ..." */
+		const char *p1, *p2, *dot;
+		size_t n1, n2, n3, n4;
+		size_t num1, num2, len;
+		n1 = strspn  (line,    " \t");         /* white-space */
+		n2 = strcspn (line+n1, " \t\0") + n1;  /* command */
+		n3 = strspn  (line+n2, " \t")   + n2;  /* white-space */
+		n4 = strcspn (line+n3, " \t\0") + n3;  /* setting/property */
+		p1 = line + n3;
+		len = n4 - n3;
+
+		dot = strchr (p1, '.');
+		if (dot && dot < p1 + len) {
+			p2 = dot + 1;
+			num1 = strcspn (p1, ".");
+			num2 = len > num1 + 1 ? len - num1 - 1 : 0;
+			sett = num1 > 0 ? g_strndup (p1, num1) : sett;
+			prop = num2 > 0 ? g_strndup (p2, num2) : prop;
+		} else {
+			if (!prop)
+				prop = len > 0 ? g_strndup (p1, len) : NULL;
+		}
+	}
+
+	if (setting)
+		*setting = sett;
+	else
+		g_free (sett);
+	if (property)
+		*property = prop;
+	else
+		g_free (prop);
 }
 
 static gboolean
-should_complete_files (const char *prompt, const char *line)
+_get_and_check_property (const char *prompt,
+                         const char *line,
+                         const char **array,
+                         const char **array_multi,
+                         gboolean *multi)
 {
 	char *prop;
 	gboolean found = FALSE;
+
+	extract_setting_and_property (prompt, line, NULL, &prop);
+	if (prop) {
+		if (array)
+			found = !!nmc_string_is_valid (prop, array, NULL);
+		if (array_multi && multi)
+			*multi = !!nmc_string_is_valid (prop, array_multi, NULL);
+		g_free (prop);
+	}
+	return found;
+}
+
+static gboolean
+should_complete_files (const char *prompt, const char *line)
+{
 	const char *file_properties[] = {
 		/* '802-1x' properties */
 		"ca-cert",
@@ -6144,32 +6215,86 @@ should_complete_files (const char *prompt, const char *line)
 		"config",
 		NULL
 	};
-
-	prop = extract_property_name (prompt, line);
-	if (prop) {
-		found = !!nmc_string_is_valid (prop, file_properties, NULL);
-		g_free (prop);
-	}
-	return found;
+	return _get_and_check_property (prompt, line, file_properties, NULL, NULL);
 }
 
 static gboolean
 should_complete_vpn_uuids (const char *prompt, const char *line)
 {
-	char *prop;
-	gboolean found = FALSE;
 	const char *uuid_properties[] = {
 		/* 'connection' properties */
 		"secondaries",
 		NULL
 	};
+	return _get_and_check_property (prompt, line, uuid_properties, NULL, NULL);
+}
 
-	prop = extract_property_name (prompt, line);
-	if (prop) {
-		found = !!nmc_string_is_valid (prop, uuid_properties, NULL);
-		g_free (prop);
-	}
-	return found;
+static char *is_property_valid (NMSetting *setting, const char *property, GError **error);
+static const char **
+get_allowed_property_values (void)
+{
+	const NameItem *valid_settings_arr;
+	const char *setting_name;
+	NMSetting *setting = NULL;
+	char *property = NULL;
+	char *sett = NULL, *prop = NULL;
+	const char **avals = NULL;
+
+	extract_setting_and_property (rl_prompt, rl_line_buffer, &sett, &prop);
+	if (sett) {
+		valid_settings_arr = get_valid_settings_array (nmc_tab_completion.con_type);
+		setting_name = check_valid_name (sett, valid_settings_arr, NULL);
+		setting = nmc_setting_new_for_name (setting_name);
+	} else
+		setting = nmc_tab_completion.setting ? g_object_ref (nmc_tab_completion.setting) : NULL;
+
+	if (setting && prop)
+		property = is_property_valid (setting, prop, NULL);
+	else
+		property = g_strdup (nmc_tab_completion.property);
+
+	if (setting && property)
+		avals = nmc_setting_get_property_allowed_values (setting, property);
+
+	g_free (sett);
+	g_free (prop);
+	if (setting)
+		g_object_unref (setting);
+	g_free (property);
+	return avals;
+}
+
+static gboolean
+should_complete_property_values (const char *prompt, const char *line, gboolean *multi)
+{
+	/* properties allowing multiple values */
+	const char *multi_props[] = {
+		/* '802-1x' properties */
+		NM_SETTING_802_1X_EAP,
+		/* '802-11-wireless-security' properties */
+		NM_SETTING_WIRELESS_SECURITY_PROTO,
+		NM_SETTING_WIRELESS_SECURITY_PAIRWISE,
+		NM_SETTING_WIRELESS_SECURITY_GROUP,
+		/* 'bond' properties */
+		NM_SETTING_BOND_OPTIONS,
+		/* 'ethernet' properties */
+		NM_SETTING_WIRED_S390_OPTIONS,
+		NULL
+	};
+	_get_and_check_property (prompt, line, NULL, multi_props, multi);
+	return get_allowed_property_values () != NULL;
+}
+
+static char *
+gen_property_values (const char *text, int state)
+{
+	char *ret = NULL;
+	const char **avals;
+
+	avals = get_allowed_property_values ();
+	if (avals)
+		ret = nmc_rl_gen_func_basic (text, state, avals);
+	return ret;
 }
 
 /* from readline */
@@ -6239,6 +6364,7 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 		if (!strchr (prompt_tmp, '.')) {
 			int level = g_str_has_prefix (prompt_tmp, "nmcli>") ? 0 : 1;
 			const char *dot = strchr (line, '.');
+			gboolean multi;
 
 			/* Main menu  - level 0,1 */
 			if (start == n1)
@@ -6259,9 +6385,12 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 					} else if (num >= 3) {
 						if (num == 3 && should_complete_files (NULL, line))
 							rl_attempted_completion_over = 0;
-						if (should_complete_vpn_uuids (NULL, line)) {
+						else if (should_complete_vpn_uuids (NULL, line)) {
 							rl_completion_display_matches_hook = uuid_display_hook;
 							generator_func = gen_vpn_uuids;
+						} else if (   should_complete_property_values (NULL, line, &multi)
+							   && (num == 3 || multi)) {
+							generator_func = gen_property_values;
 						}
 					}
 				} else if (  (   should_complete_cmd (line, end, "remove", &num, NULL)
@@ -6296,6 +6425,8 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 			if (start == n1)
 				generator_func = gen_nmcli_cmds_submenu;
 			else {
+				gboolean multi;
+
 				if (   should_complete_cmd (line, end, "add", &num, NULL)
 				    || should_complete_cmd (line, end, "set", &num, NULL)) {
 					if (num <= 2 && should_complete_files (prompt_tmp, line))
@@ -6303,6 +6434,9 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 					else if (should_complete_vpn_uuids (prompt_tmp, line)) {
 						rl_completion_display_matches_hook = uuid_display_hook;
 						generator_func = gen_vpn_uuids;
+					} else if (   should_complete_property_values (prompt_tmp, NULL, &multi)
+						   && (num <= 2 || multi)) {
+						generator_func = gen_property_values;
 					}
 				}
 				if (should_complete_cmd (line, end, "print", &num, NULL) && num <= 2)
@@ -7016,6 +7150,9 @@ property_edit_submenu (NmCli *nmc,
 	gboolean temp_changes;
 	gboolean removed;
 
+	/* Set global variable for use in TAB completion */
+	nmc_tab_completion.property = prop_name;
+
 	prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ",
 	                       nm_setting_get_name (curr_setting), prop_name);
 
@@ -7047,9 +7184,16 @@ property_edit_submenu (NmCli *nmc,
 			 *                   ADD adds the new value(s)
 			 * single values:  : both SET and ADD sets the new value
 			 */
-			if (!cmd_property_arg)
+			if (!cmd_property_arg) {
+				const char **avals = nmc_setting_get_property_allowed_values (curr_setting, prop_name);
+				if (avals) {
+					char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+					g_print (_("Allowed values for '%s' property: %s\n"),
+					         prop_name, avals_str);
+					g_free (avals_str);
+				}
 				prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name);
-			else
+			} else
 				prop_val_user = g_strdup (cmd_property_arg);
 
 			/* nmc_setting_set_property() only adds new value, thus we have to
@@ -7078,7 +7222,7 @@ property_edit_submenu (NmCli *nmc,
 
 		case NMC_EDITOR_SUB_CMD_CHANGE:
 			rl_startup_hook = nmc_rl_set_deftext;
-			nmc_rl_pre_input_deftext = nmc_setting_get_property_out2in (curr_setting, prop_name, NULL);
+			nmc_rl_pre_input_deftext = nmc_setting_get_property_parsable (curr_setting, prop_name, NULL);
 			prop_val_user = nmc_readline (_("Edit '%s' value: "), prop_name);
 
 			nmc_property_get_gvalue (curr_setting, prop_name, &prop_g_value);
@@ -7144,6 +7288,8 @@ property_edit_submenu (NmCli *nmc,
 			break;
 
 		case NMC_EDITOR_SUB_CMD_BACK:
+			/* Set global variable for use in TAB completion */
+			nmc_tab_completion.property = NULL;
 			cmd_property_loop = FALSE;
 			break;
 
@@ -7456,7 +7602,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 				if (menu_ctx.level == 1) {
 					const char *prop_name;
 					char *prop_val_user = NULL;
-					const char *avals;
+					const char **avals;
 					GError *tmp_err = NULL;
 
 					prop_name = ask_check_property (cmd_arg,
@@ -7466,9 +7612,12 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 						break;
 
 					avals = nmc_setting_get_property_allowed_values (menu_ctx.curr_setting, prop_name);
-					if (avals)
-						g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals);
-
+					if (avals) {
+						char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+						g_print (_("Allowed values for '%s' property: %s\n"),
+						         prop_name, avals_str);
+						g_free (avals_str);
+					}
 					prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name);
 
 					/* Set property value */
@@ -7520,10 +7669,13 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 
 				/* Ask for value */
 				if (!cmd_arg_v) {
-					const char *avals = nmc_setting_get_property_allowed_values (ss, prop_name);
-					if (avals)
-						g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals);
-
+					const char **avals = nmc_setting_get_property_allowed_values (ss, prop_name);
+					if (avals) {
+						char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+						g_print (_("Allowed values for '%s' property: %s\n"),
+						         prop_name, avals_str);
+						g_free (avals_str);
+					}
 					cmd_arg_v = nmc_readline (_("Enter '%s' value: "), prop_name);
 				}
 
@@ -8646,52 +8798,44 @@ finish:
 	return nmc->return_value;
 }
 
-
-typedef struct {
-	NmCli *nmc;
-	int counter;
-} DeleteStateInfo;
-
 static void
 delete_cb (GObject *con, GAsyncResult *result, gpointer user_data)
 {
-	DeleteStateInfo *info = (DeleteStateInfo *) user_data;
+	ConnectionCbInfo *info = (ConnectionCbInfo *) user_data;
 	GError *error = NULL;
 
 	if (!nm_remote_connection_delete_finish (NM_REMOTE_CONNECTION (con), result, &error)) {
-		g_string_printf (info->nmc->return_text, _("Error: Connection deletion failed: %s"),
-		                 error->message);
+		g_string_printf (info->nmc->return_text, _("Error: not all connections deleted."));
+		g_printerr (_("Error: Connection deletion failed: %s"),
+		            error->message);
 		g_error_free (error);
 		info->nmc->return_value = NMC_RESULT_ERROR_CON_DEL;
-	}
-
-	info->counter--;
-	if (info->counter == 0) {
-		g_free (info);
-		quit ();
+		connection_cb_info_finish (info, con);
+	} else {
+		if (info->nmc->nowait_flag)
+			connection_cb_info_finish (info, con);
 	}
 }
 
 static NMCResultCode
 do_connection_delete (NmCli *nmc, int argc, char **argv)
 {
-	NMConnection *connection = NULL;
-	DeleteStateInfo *del_info = NULL;
-	char *line = NULL;
+	NMConnection *connection;
+	ConnectionCbInfo *info = NULL;
+	GSList *queue = NULL, *iter;
 	char **arg_arr = NULL;
 	char **arg_ptr = argv;
 	int arg_num = argc;
 	GString *invalid_cons = NULL;
-	gboolean del_info_free = FALSE;
 	int pos = 0;
 
-	nmc->return_value = NMC_RESULT_SUCCESS;
-	nmc->should_wait = FALSE;
+	if (nmc->timeout == -1)
+		nmc->timeout = 10;
 
 	if (argc == 0) {
 		if (nmc->ask) {
-			line = nmc_readline (PROMPT_CONNECTION);
-			nmc_string_to_arg_array (line, "", &arg_arr, &arg_num);
+			char *line = nmc_readline (PROMPT_CONNECTIONS);
+			nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
 			g_free (line);
 			arg_ptr = arg_arr;
 		}
@@ -8702,11 +8846,6 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
 		}
 	}
 
-	del_info = g_malloc0 (sizeof (DeleteStateInfo));
-	del_info->nmc = nmc;
-	del_info->counter = 0;
-	del_info_free = TRUE;
-
 	while (arg_num > 0) {
 		const char *selector = NULL;
 
@@ -8722,43 +8861,50 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
 		}
 
 		connection = nmc_find_connection (nmc->connections, selector, *arg_ptr, &pos);
-		if (!connection) {
-			if (nmc->print_output != NMC_PRINT_TERSE)
-				g_print (_("Error: unknown connection: %s\n"), *arg_ptr);
-
+		if (connection) {
+			/* Check if the connection is unique. */
+			/* Calling delete for the same connection repeatedly would result in
+			 * NM responding for the last D-Bus call only and we would stall. */
+			if (!g_slist_find (queue, connection))
+				queue = g_slist_prepend (queue, g_object_ref (connection));
+		} else {
+			g_printerr (_("Error: unknown connection '%s'\n"), *arg_ptr);
+			g_string_printf (nmc->return_text, _("Error: not all active connections found."));
+			nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 			if (!invalid_cons)
 				invalid_cons = g_string_new (NULL);
 			g_string_append_printf (invalid_cons, "'%s', ", *arg_ptr);
+		}
 
-			/* take the next argument and continue */
+		/* Take next argument (if there's no other connection of the same name) */
+		if (!pos)
 			next_arg (&arg_num, &arg_ptr);
-			continue;
-		}
+	}
 
-		/* We need to wait a bit so that nmcli's permissions can be checked.
-		 * We will exit when D-Bus return (error) messages are received.
-		 */
-		nmc->should_wait = TRUE;
+	if (!queue) {
+		g_string_printf (nmc->return_text, _("Error: no connection provided."));
+		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		goto finish;
+	}
+	queue = g_slist_reverse (queue);
 
-		/* del_info deallocation is handled in delete_cb() */
-		del_info_free = FALSE;
+	info = g_slice_new0 (ConnectionCbInfo);
+	info->nmc = nmc;
+	info->queue = queue;
+	info->timeout_id = g_timeout_add_seconds (nmc->timeout, connection_op_timeout_cb, info);
 
-		del_info->counter++;
+	nmc->nowait_flag = (nmc->timeout == 0);
+	nmc->should_wait = TRUE;
 
-		/* Delete the connection */
-		nm_remote_connection_delete_async (NM_REMOTE_CONNECTION (connection),
-		                                   NULL, delete_cb, del_info);
+	g_signal_connect (nmc->client, NM_CLIENT_CONNECTION_REMOVED,
+	                  G_CALLBACK (connection_removed_cb), info);
 
-		/* Take next argument (if there's no other connection of the same name) */
-		if (!pos)
-			next_arg (&arg_num, &arg_ptr);
-	}
+	/* Now delete the connections */
+	for (iter = queue; iter; iter = g_slist_next (iter))
+		nm_remote_connection_delete_async (NM_REMOTE_CONNECTION (iter->data),
+		                                   NULL, delete_cb, info);
 
 finish:
-	if (del_info_free)
-		g_free (del_info);
-	g_strfreev (arg_arr);
-
 	if (invalid_cons) {
 		g_string_truncate (invalid_cons, invalid_cons->len-2);  /* truncate trailing ", " */
 		g_string_printf (nmc->return_text, _("Error: cannot delete unknown connection(s): %s."),
@@ -8766,6 +8912,7 @@ finish:
 		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 		g_string_free (invalid_cons, TRUE);
 	}
+	g_strfreev (arg_arr);
 	return nmc->return_value;
 }
 
@@ -8881,7 +9028,7 @@ gen_func_connection_names (const char *text, int state)
 	for (i = 0; i < nm_cli.connections->len; i++) {
 		NMConnection *con = NM_CONNECTION (nm_cli.connections->pdata[i]);
 		const char *id = nm_connection_get_id (con);
-		connections[i++] = id;
+		connections[i] = id;
 	}
 	connections[i] = NULL;
 
@@ -8900,14 +9047,17 @@ nmcli_con_tab_completion (const char *text, int start, int end)
 	/* Disable readline's default filename completion */
 	rl_attempted_completion_over = 1;
 
-	/* Disable appending space after completion */
-	rl_completion_append_character = '\0';
+	if (g_strcmp0 (rl_prompt, PROMPT_CONNECTION) == 0) {
+		/* Disable appending space after completion */
+		rl_completion_append_character = '\0';
 
-	if (!is_single_word (rl_line_buffer))
-		return NULL;
+		if (!is_single_word (rl_line_buffer))
+			return NULL;
 
-	if (g_strcmp0 (rl_prompt, PROMPT_CONNECTION) == 0)
 		generator_func = gen_func_connection_names;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_CONNECTIONS) == 0) {
+		generator_func = gen_func_connection_names;
+	}
 
 	if (generator_func)
 		match_array = rl_completion_matches (text, generator_func);
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 1633f0ce..979c5906 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -35,7 +35,8 @@
 #include "devices.h"
 
 /* define some prompts */
-#define PROMPT_INTERFACE _("Interface: ")
+#define PROMPT_INTERFACE  _("Interface: ")
+#define PROMPT_INTERFACES _("Interface(s): ")
 
 /* Available fields for 'device status' */
 static NmcOutputField nmc_fields_dev_status[] = {
@@ -270,8 +271,8 @@ usage (void)
 	              "  status\n\n"
 	              "  show [<ifname>]\n\n"
 	              "  connect <ifname>\n\n"
-	              "  disconnect <ifname>\n\n"
-	              "  delete <ifname>\n\n"
+	              "  disconnect <ifname> ...\n\n"
+	              "  delete <ifname> ...\n\n"
 	              "  wifi [list [ifname <ifname>] [bssid <BSSID>]]\n\n"
 	              "  wifi connect <(B)SSID> [password <password>] [wep-key-type key|phrase] [ifname <ifname>]\n"
 	              "                         [bssid <BSSID>] [name <name>] [private yes|no]\n\n"
@@ -325,9 +326,9 @@ usage_device_disconnect (void)
 {
 	g_printerr (_("Usage: nmcli device disconnect { ARGUMENTS | help }\n"
 	              "\n"
-	              "ARGUMENTS := <ifname>\n"
+	              "ARGUMENTS := <ifname> ...\n"
 	              "\n"
-	              "Disconnect the device.\n"
+	              "Disconnect devices.\n"
 	              "The command disconnects the device and prevents it from auto-activating\n"
 	              "further connections without user/manual intervention.\n\n"));
 }
@@ -337,10 +338,10 @@ usage_device_delete (void)
 {
 	g_printerr (_("Usage: nmcli device delete { ARGUMENTS | help }\n"
 	              "\n"
-	              "ARGUMENTS := <ifname>\n"
+	              "ARGUMENTS := <ifname> ...\n"
 	              "\n"
-	              "Deletes the software device.\n"
-	              "The command removes the interface. It only works for software devices\n"
+	              "Delete the software devices.\n"
+	              "The command removes the interfaces. It only works for software devices\n"
 	              "(like bonds, bridges, etc.). Hardware devices cannot be deleted by the\n"
 	              "command.\n\n"));
 }
@@ -1638,28 +1639,85 @@ error:
 	return nmc->return_value;
 }
 
+typedef struct {
+	NmCli *nmc;
+	GSList *queue;
+	guint timeout_id;
+	gboolean cmd_disconnect;
+} DeviceCbInfo;
+
+static void device_cb_info_finish (DeviceCbInfo *info, NMDevice *device);
+
+static gboolean
+device_op_timeout_cb (gpointer user_data)
+{
+	DeviceCbInfo *info = user_data;
+
+	timeout_cb (info->nmc);
+	device_cb_info_finish (info, NULL);
+	return G_SOURCE_REMOVE;
+}
+
 static void
-disconnect_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
+device_removed_cb (NMClient *client, NMDevice *device, DeviceCbInfo *info)
 {
-	NMDeviceState state;
+	/* Success: device has been removed.
+	 * It can also happen when disconnecting a software device.
+	 */
+	if (!g_slist_find (info->queue, device))
+		return;
 
-	state = nm_device_get_state (device);
+	if (info->cmd_disconnect)
+		g_print (_("Device '%s' successfully disconnected.\n"),
+		         nm_device_get_iface (device));
+	else
+		g_print (_("Device '%s' successfully removed.\n"),
+		         nm_device_get_iface (device));
+	device_cb_info_finish (info, device);
+}
 
-	if (state <= NM_DEVICE_STATE_DISCONNECTED) {
-		g_signal_handlers_disconnect_by_data (device, user_data);
+static void
+disconnect_state_cb (NMDevice *device, GParamSpec *pspec, DeviceCbInfo *info)
+{
+	if (!g_slist_find (info->queue, device))
+		return;
+
+	if (nm_device_get_state (device) <= NM_DEVICE_STATE_DISCONNECTED) {
 		g_print (_("Device '%s' successfully disconnected.\n"),
 		         nm_device_get_iface (device));
-		quit ();
+		device_cb_info_finish (info, device);
 	}
 }
 
 static void
-device_removed_cb (NMClient *client, NMDevice *device, gpointer user_data)
+destroy_queue_element (gpointer data)
 {
-	/* Success: device has been removed. It happens when disconnecting a software device. */
-	g_signal_handlers_disconnect_by_data (client, user_data);
-	g_print (_("Device '%s' successfully disconnected.\n"),
-	         nm_device_get_iface (device));
+	g_signal_handlers_disconnect_matched (data, G_SIGNAL_MATCH_FUNC, 0, 0, 0,
+	                                      disconnect_state_cb, NULL);
+	g_object_unref (data);
+}
+
+static void
+device_cb_info_finish (DeviceCbInfo *info, NMDevice *device)
+{
+	if (device) {
+		GSList *elem = g_slist_find (info->queue, device);
+		if (!elem)
+			return;
+		info->queue = g_slist_delete_link (info->queue, elem);
+		destroy_queue_element (device);
+	} else {
+		g_slist_free_full (info->queue, destroy_queue_element);
+		info->queue = NULL;
+	}
+
+	if (info->queue)
+		return;
+
+	if (info->timeout_id)
+		g_source_remove (info->timeout_id);
+	g_signal_handlers_disconnect_by_func (info->nmc->client, device_removed_cb, info);
+	g_slice_free (DeviceCbInfo, info);
 	quit ();
 }
 
@@ -1667,18 +1725,20 @@ static void
 disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 {
 	NMDevice *device = NM_DEVICE (object);
-	NmCli *nmc = (NmCli *) user_data;
+	DeviceCbInfo *info = (DeviceCbInfo *) user_data;
+	NmCli *nmc = info->nmc;
 	NMDeviceState state;
 	GError *error = NULL;
 
 	if (!nm_device_disconnect_finish (device, result, &error)) {
-		g_string_printf (nmc->return_text, _("Error: Device '%s' (%s) disconnecting failed: %s"),
-		                 nm_device_get_iface (device),
-		                 nm_object_get_path (NM_OBJECT (device)),
-		                 error->message);
+		g_string_printf (nmc->return_text, _("Error: not all devices disconnected."));
+		g_printerr (_("Error: Device '%s' (%s) disconnecting failed: %s\n"),
+		            nm_device_get_iface (device),
+		            nm_object_get_path (NM_OBJECT (device)),
+		            error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
-		quit ();
+		device_cb_info_finish (info, device);
 	} else {
 		state = nm_device_get_state (device);
 
@@ -1687,16 +1747,11 @@ disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 			if (state <= NM_DEVICE_STATE_DISCONNECTED) {
 				if (nmc->print_output == NMC_PRINT_PRETTY)
 					nmc_terminal_erase_line ();
-				g_print (_("Device '%s' has been disconnected.\n"), nm_device_get_iface (device));
+				g_print (_("Device '%s' successfully disconnected.\n"),
+				         nm_device_get_iface (device));
 			}
-			quit ();
-		} else {
-			g_signal_connect (device, "notify::state", G_CALLBACK (disconnect_state_cb), nmc);
-			g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED, G_CALLBACK (device_removed_cb), nmc);
-			/* Start timer not to loop forever if "notify::state" signal is not issued */
-			g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc);
+			device_cb_info_finish (info, device);
 		}
-
 	}
 }
 
@@ -1704,9 +1759,12 @@ static NMCResultCode
 do_device_disconnect (NmCli *nmc, int argc, char **argv)
 {
 	NMDevice **devices;
-	NMDevice *device = NULL;
-	const char *ifname = NULL;
-	char *ifname_ask = NULL;
+	NMDevice *device;
+	DeviceCbInfo *info = NULL;
+	GSList *queue = NULL, *iter;
+	char **arg_arr = NULL;
+	char **arg_ptr = argv;
+	int arg_num = argc;
 	int i;
 
 	/* Set default timeout for disconnect operation. */
@@ -1714,59 +1772,78 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 		nmc->timeout = 10;
 
 	if (argc == 0) {
-		if (nmc->ask)
-			ifname = ifname_ask = nmc_readline (PROMPT_INTERFACE);
-
-		if (!ifname_ask) {
+		if (nmc->ask) {
+			char *line = nmc_readline (PROMPT_INTERFACES);
+			nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num);
+			g_free (line);
+			arg_ptr = arg_arr;
+		}
+		if (arg_num == 0) {
 			g_string_printf (nmc->return_text, _("Error: No interface specified."));
 			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 			goto error;
 		}
-	} else {
-		ifname = *argv;
-	}
-
-	if (!ifname) {
-		g_string_printf (nmc->return_text, _("Error: No interface specified."));
-		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
-	}
-
-	if (next_arg (&argc, &argv) == 0) {
-		g_string_printf (nmc->return_text, _("Error: extra argument not allowed: '%s'."), *argv);
-		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
 	}
 
 	devices = get_devices_sorted (nmc->client);
-	for (i = 0; devices[i]; i++) {
-		NMDevice *candidate = devices[i];
-		const char *dev_iface = nm_device_get_iface (candidate);
+	while (arg_num > 0) {
+		device = NULL;
+		for (i = 0; devices[i]; i++) {
+			if (!g_strcmp0 (nm_device_get_iface (devices[i]), *arg_ptr)) {
+				device = devices[i];
+				break;
+			}
+		}
 
-		if (!g_strcmp0 (dev_iface, ifname))
-			device = candidate;
+		if (device) {
+			if (!g_slist_find (queue, device))
+				queue = g_slist_prepend (queue, device);
+			else
+				g_printerr (_("Warning: argument '%s' is duplicated.\n"), *arg_ptr);
+		} else {
+			g_printerr (_("Error: Device '%s' not found.\n"), *arg_ptr);
+			g_string_printf (nmc->return_text, _("Error: not all devices found."));
+			nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		}
+
+		/* Take next argument */
+		next_arg (&arg_num, &arg_ptr);
 	}
 	g_free (devices);
 
-	if (!device) {
-		g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
+	if (!queue) {
+		g_string_printf (nmc->return_text, _("Error: no valid device provided."));
 		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 		goto error;
 	}
+	queue = g_slist_reverse (queue);
+
+	info = g_slice_new0 (DeviceCbInfo);
+	info->nmc = nmc;
+	info->cmd_disconnect = TRUE;
+	if (nmc->timeout > 0)
+		info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
+
+	g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
+	                  G_CALLBACK (device_removed_cb), info);
 
-	/*
-	 * Use nowait_flag instead of should_wait, because exiting has to be postponed
-	 * till disconnect_device_cb() is called, giving NM time to check our permissions.
-	 */
 	nmc->nowait_flag = (nmc->timeout == 0);
 	nmc->should_wait = TRUE;
-	nm_device_disconnect_async (device, NULL, disconnect_device_cb, nmc);
 
-	/* Start progress indication */
-	if (nmc->print_output == NMC_PRINT_PRETTY)
-		progress_id = g_timeout_add (120, progress_cb, device);
+	for (iter = queue; iter; iter = g_slist_next (iter)) {
+		device = iter->data;
+
+		info->queue = g_slist_prepend (info->queue, g_object_ref (device));
+		g_signal_connect (device, "notify::" NM_DEVICE_STATE,
+		                  G_CALLBACK (disconnect_state_cb), info);
+
+		/* Now disconnect the device */
+		nm_device_disconnect_async (device, NULL, disconnect_device_cb, info);
+	}
 
 error:
+	g_strfreev (arg_arr);
+	g_slist_free (queue);
 	return nmc->return_value;
 }
 
@@ -1774,27 +1851,35 @@ static void
 delete_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 {
 	NMDevice *device = NM_DEVICE (object);
-	NmCli *nmc = (NmCli *) user_data;
+	DeviceCbInfo *info = (DeviceCbInfo *) user_data;
+	NmCli *nmc = info->nmc;
 	GError *error = NULL;
 
 	if (!nm_device_delete_finish (device, result, &error)) {
-		g_string_printf (nmc->return_text, _("Error: Device '%s' (%s) deletion failed: %s"),
-		                 nm_device_get_iface (device),
-		                 nm_object_get_path (NM_OBJECT (device)),
-		                 error->message);
+		g_string_printf (nmc->return_text, _("Error: not all devices deleted."));
+		g_printerr (_("Error: Device '%s' (%s) deletion failed: %s\n"),
+		            nm_device_get_iface (device),
+		            nm_object_get_path (NM_OBJECT (device)),
+		            error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		device_cb_info_finish (info, device);
+	} else {
+		if (nmc->nowait_flag)
+			device_cb_info_finish (info, device);
 	}
-	quit ();
 }
 
 static NMCResultCode
 do_device_delete (NmCli *nmc, int argc, char **argv)
 {
 	NMDevice **devices;
-	NMDevice *device = NULL;
-	const char *ifname = NULL;
-	char *ifname_ask = NULL;
+	NMDevice *device;
+	DeviceCbInfo *info = NULL;
+	GSList *queue = NULL, *iter;
+	char **arg_arr = NULL;
+	char **arg_ptr = argv;
+	int arg_num = argc;
 	int i;
 
 	/* Set default timeout for delete operation. */
@@ -1802,64 +1887,82 @@ do_device_delete (NmCli *nmc, int argc, char **argv)
 		nmc->timeout = 10;
 
 	if (argc == 0) {
-		if (nmc->ask)
-			ifname = ifname_ask = nmc_readline (PROMPT_INTERFACE);
-
-		if (!ifname_ask) {
+		if (nmc->ask) {
+			char *line = nmc_readline (PROMPT_INTERFACES);
+			nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num);
+			g_free (line);
+			arg_ptr = arg_arr;
+		}
+		if (arg_num == 0) {
 			g_string_printf (nmc->return_text, _("Error: No interface specified."));
 			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 			goto error;
 		}
-	} else
-		ifname = *argv;
-
-	if (!ifname) {
-		g_string_printf (nmc->return_text, _("Error: No interface specified."));
-		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
-	}
-
-	if (next_arg (&argc, &argv) == 0) {
-		g_string_printf (nmc->return_text, _("Error: extra argument not allowed: '%s'."), *argv);
-		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
 	}
 
 	devices = get_devices_sorted (nmc->client);
-	for (i = 0; devices[i]; i++) {
-		NMDevice *candidate = devices[i];
-		const char *dev_iface = nm_device_get_iface (candidate);
+	while (arg_num > 0) {
+		device = NULL;
+		for (i = 0; devices[i]; i++) {
+			if (!g_strcmp0 (nm_device_get_iface (devices[i]), *arg_ptr)) {
+				device = devices[i];
+				break;
+			}
+		}
 
-		if (!g_strcmp0 (dev_iface, ifname))
-			device = candidate;
+		if (device) {
+			if (!g_slist_find (queue, device)) {
+				if (nm_device_is_software (device))
+					queue = g_slist_prepend (queue, device);
+				else {
+					g_printerr (_("Error: Device '%s' is a hardware device. It can't be deleted.\n"),
+					            *arg_ptr);
+					g_string_printf (nmc->return_text, _("Error: not all devices valid."));
+					nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				}
+			} else
+				g_printerr (_("Warning: argument '%s' is duplicated.\n"), *arg_ptr);
+		} else {
+			g_printerr (_("Error: Device '%s' not found.\n"), *arg_ptr);
+			g_string_printf (nmc->return_text, _("Error: not all devices found."));
+			nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		}
+
+		/* Take next argument */
+		next_arg (&arg_num, &arg_ptr);
 	}
 	g_free (devices);
 
-	if (!device) {
-		g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
+	if (!queue) {
+		g_string_printf (nmc->return_text, _("Error: no valid device provided."));
 		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 		goto error;
 	}
+	queue = g_slist_reverse (queue);
 
-	if (!nm_device_is_software (device)) {
-		g_string_printf (nmc->return_text, _("Error: Device '%s' is a hardware device. It can't be deleted."), ifname);
-		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
-	}
+	info = g_slice_new0 (DeviceCbInfo);
+	info->nmc = nmc;
+	if (nmc->timeout > 0)
+		info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
+
+	g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
+	                  G_CALLBACK (device_removed_cb), info);
 
-	/*
-	 * Use nowait_flag instead of should_wait, because exiting has to be postponed
-	 * till delete_device_cb() is called, giving NM time to check our permissions.
-	 */
 	nmc->nowait_flag = (nmc->timeout == 0);
 	nmc->should_wait = TRUE;
-	nm_device_delete_async (device, NULL, delete_device_cb, nmc);
 
-	/* Start progress indication */
-	if (nmc->print_output == NMC_PRINT_PRETTY)
-		progress_id = g_timeout_add (120, progress_cb, device);
+	for (iter = queue; iter; iter = g_slist_next (iter)) {
+		device = iter->data;
+
+		info->queue = g_slist_prepend (info->queue, g_object_ref (device));
+
+		/* Now delete the device */
+		nm_device_delete_async (device, NULL, delete_device_cb, info);
+	}
 
 error:
+	g_strfreev (arg_arr);
+	g_slist_free (queue);
 	return nmc->return_value;
 }
 
@@ -2789,7 +2892,7 @@ extern NmCli nm_cli;
 static char *
 gen_func_ifnames (const char *text, int state)
 {
-	int i, j = 0;
+	int i;
 	const GPtrArray *devices;
 	const char **ifnames;
 	char *ret;
@@ -2803,9 +2906,9 @@ gen_func_ifnames (const char *text, int state)
 	for (i = 0; i < devices->len; i++) {
 		NMDevice *dev = g_ptr_array_index (devices, i);
 		const char *ifname = nm_device_get_iface (dev);
-		ifnames[j++] = ifname;
+		ifnames[i] = ifname;
 	}
-	ifnames[j] = NULL;
+	ifnames[i] = NULL;
 
 	ret = nmc_rl_gen_func_basic (text, state, ifnames);
 
@@ -2822,14 +2925,17 @@ nmcli_device_tab_completion (const char *text, int start, int end)
 	/* Disable readline's default filename completion */
 	rl_attempted_completion_over = 1;
 
-	/* Disable appending space after completion */
-	rl_completion_append_character = '\0';
+	if (g_strcmp0 (rl_prompt, PROMPT_INTERFACE) == 0) {
+		/* Disable appending space after completion */
+		rl_completion_append_character = '\0';
 
-	if (!is_single_word (rl_line_buffer))
-		return NULL;
+		if (!is_single_word (rl_line_buffer))
+			return NULL;
 
-	if (g_strcmp0 (rl_prompt, PROMPT_INTERFACE) == 0)
 		generator_func = gen_func_ifnames;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_INTERFACES) == 0) {
+		generator_func = gen_func_ifnames;
+	}
 
 	if (generator_func)
 		match_array = rl_completion_matches (text, generator_func);
diff --git a/clients/cli/nmcli-completion b/clients/cli/nmcli-completion
index dce20d13..38d7e585 100644
--- a/clients/cli/nmcli-completion
+++ b/clients/cli/nmcli-completion
@@ -1218,10 +1218,14 @@ _nmcli()
                         fi
                         ;;
                     sh|sho|show| \
-                    c|co|con|conn|conne|connec|connect| \
+                    c|co|con|conn|conne|connec|connect)
+                        if [[ ${#words[@]} -eq 3 ]]; then
+                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
+                        fi
+                        ;;
                     d|di|dis|disc|disco|discon|disconn|disconne|disconnec|disconnect| \
                     de|del|dele|delet|delete)
-                        if [[ ${#words[@]} -eq 3 ]]; then
+                        if [[ ${#words[@]} -ge 3 ]]; then
                             _nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
                         fi
                         ;;
diff --git a/clients/cli/settings-docs.c b/clients/cli/settings-docs.c
index 1edfddb5..2ed41cb8 100644
--- a/clients/cli/settings-docs.c
+++ b/clients/cli/settings-docs.c
@@ -83,7 +83,7 @@ NmcPropertyDesc setting_802_1x[] = {
 	{ "private-key-password", "The password used to decrypt the private key specified in the \"private-key\" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key." },
 	{ "private-key-password-flags", "Flags indicating how to handle the \"private-key-password\" property." },
 	{ "subject-match", "Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed." },
-	{ "system-ca-certs", "When TRUE, overrides the \"ca-path\" and \"phase2-ca-path\" properties using the system CA directory specified at configure time with the --system-ca-path switch.  The certificates in this directory are added to the verification chain in addition to any certificates specified by the \"ca-cert\" and \"phase2-ca-cert\" properties." },
+	{ "system-ca-certs", "When TRUE, overrides the \"ca-path\" and \"phase2-ca-path\" properties using the system CA directory specified at configure time with the --system-ca-path switch.  The certificates in this directory are added to the verification chain in addition to any certificates specified by the \"ca-cert\" and \"phase2-ca-cert\" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides \"ca-cert\" and \"phase2-ca-cert\" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant)." },
 };
   
 NmcPropertyDesc setting_802_3_ethernet[] = {
@@ -152,6 +152,7 @@ NmcPropertyDesc setting_cdma[] = {
 NmcPropertyDesc setting_connection[] = {
 	{ "autoconnect", "Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection." },
 	{ "autoconnect-priority", "The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority." },
+	{ "autoconnect-slaves", "Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0." },
 	{ "gateway-ping-timeout", "If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping." },
 	{ "id", "A human readable unique identifier for the connection, like \"Work Wi-Fi\" or \"T-Mobile 3G\"." },
 	{ "interface-name", "The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface." },
@@ -239,7 +240,7 @@ NmcPropertyDesc setting_ipv6[] = {
 	{ "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." },
 	{ "ignore-auto-routes", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used." },
-	{ "ip6-privacy", "Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941.  If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64.  This enhances privacy, but could cause problems in some applications, on the other hand.  The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)." },
+	{ "ip6-privacy", "Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941.  If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64.  This enhances privacy, but could cause problems in some applications, on the other hand.  The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to \"-1\" (unknown) means fallback to global configuration \"ipv6.ip6-privacy\". If also global configuration is unspecified or set to \"-1\", fallback to read \"/proc/sys/net/ipv6/conf/default/use_tempaddr\"." },
 	{ "may-fail", "If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out.  Note that at least one IP configuration must succeed or overall network configuration will still fail.  For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully." },
 	{ "method", "IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support \"auto\", \"manual\", and \"link-local\". See the subclass-specific documentation for other values. In general, for the \"auto\" method, properties such as \"dns\" and \"routes\" specify information that is added on to the information returned from automatic configuration.  The \"ignore-auto-routes\" and \"ignore-auto-dns\" properties modify this behavior. For methods that imply no upstream network, such as \"shared\" or \"link-local\", these properties must be empty." },
 	{ "name", "The setting's name, which uniquely identifies the setting within the connection.  Each setting type has a name unique to that type, for example \"ppp\" or \"wireless\" or \"wired\"." },
@@ -341,7 +342,7 @@ NmcSettingDesc all_settings[] = {
 	{ "bridge", setting_bridge, 8 },
 	{ "bridge-port", setting_bridge_port, 4 },
 	{ "cdma", setting_cdma, 5 },
-	{ "connection", setting_connection, 15 },
+	{ "connection", setting_connection, 16 },
 	{ "dcb", setting_dcb, 16 },
 	{ "generic", setting_generic, 1 },
 	{ "gsm", setting_gsm, 10 },
diff --git a/clients/cli/settings.c b/clients/cli/settings.c
index 09916954..66e6f622 100644
--- a/clients/cli/settings.c
+++ b/clients/cli/settings.c
@@ -29,10 +29,16 @@
 #include "common.h"
 #include "settings.h"
 #include "nm-glib-compat.h"
+#include "nm-macros-internal.h"
 
 /* Forward declarations */
 static char *wep_key_type_to_string (NMWepKeyType type);
 
+typedef enum {
+	NMC_PROPERTY_GET_PRETTY,
+	NMC_PROPERTY_GET_PARSABLE,
+} NmcPropertyGetType;
+
 /* Helper macro to define fields */
 #define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 }
 
@@ -51,8 +57,9 @@ NmcOutputField nmc_fields_setting_connection[] = {
 	SETTING_FIELD (NM_SETTING_CONNECTION_ZONE, 10),                  /* 10 */
 	SETTING_FIELD (NM_SETTING_CONNECTION_MASTER, 20),                /* 11 */
 	SETTING_FIELD (NM_SETTING_CONNECTION_SLAVE_TYPE, 20),            /* 12 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES, 40),           /* 13 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, 30),  /* 14 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES, 13),    /* 13 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES, 40),           /* 14 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, 30),  /* 15 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_CONNECTION_ALL     "name"","\
@@ -68,6 +75,7 @@ NmcOutputField nmc_fields_setting_connection[] = {
                                               NM_SETTING_CONNECTION_ZONE","\
                                               NM_SETTING_CONNECTION_MASTER","\
                                               NM_SETTING_CONNECTION_SLAVE_TYPE","\
+                                              NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES","\
                                               NM_SETTING_CONNECTION_SECONDARIES","\
                                               NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT
 #define NMC_FIELDS_SETTING_CONNECTION_COMMON  NMC_FIELDS_SETTING_CONNECTION_ALL
@@ -743,8 +751,11 @@ vlan_priorities_to_string (NMSettingVlan *s_vlan, NMVlanPriorityMap map)
 }
 
 static char *
-ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy)
+ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy, NmcPropertyGetType get_type)
 {
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		return g_strdup_printf ("%d", ip6_privacy);
+
 	switch (ip6_privacy) {
 	case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
 		return g_strdup_printf (_("%d (disabled)"), ip6_privacy);
@@ -758,15 +769,35 @@ ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy)
 }
 
 static char *
-secret_flags_to_string (guint32 flags)
+autoconnect_slaves_to_string (NMSettingConnectionAutoconnectSlaves autoconnect_slaves, NmcPropertyGetType get_type)
+{
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		return g_strdup_printf ("%d", (int) autoconnect_slaves);
+
+	switch (autoconnect_slaves) {
+	case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO:
+		return g_strdup_printf (_("%d (no)"), autoconnect_slaves);
+	case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES:
+		return g_strdup_printf (_("%d (yes)"), autoconnect_slaves);
+	case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT:
+	default:
+		return g_strdup_printf (_("%d (default)"), autoconnect_slaves);
+	}
+}
+
+static char *
+secret_flags_to_string (guint32 flags, NmcPropertyGetType get_type)
 {
 	GString *flag_str;
 
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		return g_strdup_printf ("%u", flags);
+
 	if (flags == 0)
 		return g_strdup (_("0 (none)"));
 
 	flag_str = g_string_new (NULL);
-	g_string_printf (flag_str, "%d (", flags);
+	g_string_printf (flag_str, "%u (", flags);
 
 	if (flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)
 		g_string_append (flag_str, _("agent-owned, "));
@@ -800,7 +831,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
 /* === property get functions === */
 #define DEFINE_GETTER(func_name, property_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		char *s; \
 		GValue val = G_VALUE_INIT; \
@@ -813,7 +844,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
 
 #define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		guint v; \
 		GValue val = G_VALUE_INIT; \
@@ -821,7 +852,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
 		g_object_get_property (G_OBJECT (setting), property_name, &val); \
 		v = g_value_get_uint (&val); \
 		g_value_unset (&val); \
-		return secret_flags_to_string (v); \
+		return secret_flags_to_string (v, get_type); \
 	}
 
 /* --- NM_SETTING_802_1X_SETTING_NAME property get functions --- */
@@ -852,7 +883,7 @@ DEFINE_SECRET_FLAGS_GETTER (nmc_property_802_1X_get_pin_flags, NM_SETTING_802_1X
 DEFINE_GETTER (nmc_property_802_1X_get_system_ca_certs, NM_SETTING_802_1X_SYSTEM_CA_CERTS)
 
 static char *
-nmc_property_802_1X_get_ca_cert (NMSetting *setting)
+nmc_property_802_1X_get_ca_cert (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -868,7 +899,7 @@ nmc_property_802_1X_get_ca_cert (NMSetting *setting)
 }
 
 static char *
-nmc_property_802_1X_get_client_cert (NMSetting *setting)
+nmc_property_802_1X_get_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -884,7 +915,7 @@ nmc_property_802_1X_get_client_cert (NMSetting *setting)
 }
 
 static char *
-nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting)
+nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -900,7 +931,7 @@ nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting)
 }
 
 static char *
-nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting)
+nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -916,14 +947,14 @@ nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting)
 }
 
 static char *
-nmc_property_802_1X_get_password_raw (NMSetting *setting)
+nmc_property_802_1X_get_password_raw (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	return bytes_to_string (nm_setting_802_1x_get_password_raw (s_8021X));
 }
 
 static char *
-nmc_property_802_1X_get_private_key (NMSetting *setting)
+nmc_property_802_1X_get_private_key (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -939,7 +970,7 @@ nmc_property_802_1X_get_private_key (NMSetting *setting)
 }
 
 static char *
-nmc_property_802_1X_get_phase2_private_key (NMSetting *setting)
+nmc_property_802_1X_get_phase2_private_key (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
 	NMSetting8021xCKScheme scheme;
@@ -968,7 +999,7 @@ DEFINE_GETTER (nmc_property_bluetooth_get_bdaddr, NM_SETTING_BLUETOOTH_BDADDR)
 DEFINE_GETTER (nmc_property_bluetooth_get_type, NM_SETTING_BLUETOOTH_TYPE)
 
 static char *
-nmc_property_bond_get_options (NMSetting *setting)
+nmc_property_bond_get_options (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingBond *s_bond = NM_SETTING_BOND (setting);
 	GString *bond_options_s;
@@ -1024,7 +1055,7 @@ DEFINE_GETTER (nmc_property_connection_get_timestamp, NM_SETTING_CONNECTION_TIME
 DEFINE_GETTER (nmc_property_connection_get_read_only, NM_SETTING_CONNECTION_READ_ONLY)
 
 static char *
-nmc_property_connection_get_permissions (NMSetting *setting)
+nmc_property_connection_get_permissions (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting);
 	GString *perm = NULL;
@@ -1046,6 +1077,14 @@ nmc_property_connection_get_permissions (NMSetting *setting)
 DEFINE_GETTER (nmc_property_connection_get_zone, NM_SETTING_CONNECTION_ZONE)
 DEFINE_GETTER (nmc_property_connection_get_master, NM_SETTING_CONNECTION_MASTER)
 DEFINE_GETTER (nmc_property_connection_get_slave_type, NM_SETTING_CONNECTION_SLAVE_TYPE)
+
+static char *
+nmc_property_connection_get_autoconnect_slaves (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting);
+	return autoconnect_slaves_to_string (nm_setting_connection_get_autoconnect_slaves (s_con), get_type);
+}
+
 DEFINE_GETTER (nmc_property_connection_get_secondaries, NM_SETTING_CONNECTION_SECONDARIES)
 DEFINE_GETTER (nmc_property_connection_get_gateway_ping_timeout, NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT)
 
@@ -1080,7 +1119,7 @@ dcb_flags_to_string (NMSettingDcbFlags flags)
 
 #define DEFINE_DCB_FLAGS_GETTER(func_name, property_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		guint v; \
 		GValue val = G_VALUE_INIT; \
@@ -1099,7 +1138,7 @@ dcb_app_priority_to_string (gint priority)
 
 #define DEFINE_DCB_APP_PRIORITY_GETTER(func_name, property_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		int v; \
 		GValue val = G_VALUE_INIT; \
@@ -1112,7 +1151,7 @@ dcb_app_priority_to_string (gint priority)
 
 #define DEFINE_DCB_BOOL_GETTER(func_name, getter_func_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
 		GString *str; \
@@ -1134,7 +1173,7 @@ dcb_app_priority_to_string (gint priority)
 
 #define DEFINE_DCB_UINT_GETTER(func_name, getter_func_name) \
 	static char * \
-	func_name (NMSetting *setting) \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
 	{ \
 		NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
 		GString *str; \
@@ -1184,7 +1223,7 @@ DEFINE_GETTER (nmc_property_ib_get_mac_address, NM_SETTING_INFINIBAND_MAC_ADDRES
 DEFINE_GETTER (nmc_property_ib_get_transport_mode, NM_SETTING_INFINIBAND_TRANSPORT_MODE)
 
 static char *
-nmc_property_ib_get_mtu (NMSetting *setting)
+nmc_property_ib_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting);
 	int mtu;
@@ -1197,7 +1236,7 @@ nmc_property_ib_get_mtu (NMSetting *setting)
 }
 
 static char *
-nmc_property_ib_get_p_key (NMSetting *setting)
+nmc_property_ib_get_p_key (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting);
 	int p_key;
@@ -1217,7 +1256,7 @@ 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)
 
 static char *
-nmc_property_ip_get_addresses (NMSetting *setting)
+nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting);
 	GString *printable;
@@ -1242,42 +1281,62 @@ nmc_property_ip_get_addresses (NMSetting *setting)
 }
 
 static char *
-nmc_property_ipv4_get_routes (NMSetting *setting)
+nmc_property_ipvx_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
 {
-	NMSettingIPConfig *s_ip4 = NM_SETTING_IP_CONFIG (setting);
+	NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting);
 	GString *printable;
 	guint32 num_routes, i;
 	NMIPRoute *route;
 
 	printable = g_string_new (NULL);
 
-	num_routes = nm_setting_ip_config_get_num_routes (s_ip4);
+	num_routes = nm_setting_ip_config_get_num_routes (s_ip);
 	for (i = 0; i < num_routes; i++) {
-		route = nm_setting_ip_config_get_route (s_ip4, i);
+		route = nm_setting_ip_config_get_route (s_ip, i);
 
-		if (printable->len > 0)
-			g_string_append (printable, "; ");
+		if (get_type == NMC_PROPERTY_GET_PARSABLE) {
+			if (printable->len > 0)
+				g_string_append (printable, ", ");
 
-		g_string_append (printable, "{ ");
+			g_string_append_printf (printable, "%s/%u",
+			                        nm_ip_route_get_dest (route),
+			                        nm_ip_route_get_prefix (route));
 
-		g_string_append_printf (printable, "ip = %s/%u",
-		                        nm_ip_route_get_dest (route),
-		                        nm_ip_route_get_prefix (route));
+			if (nm_ip_route_get_next_hop (route))
+				g_string_append_printf (printable, " %s", nm_ip_route_get_next_hop (route));
+			if (nm_ip_route_get_metric (route) != -1)
+				g_string_append_printf (printable, " %u", (guint32) nm_ip_route_get_metric (route));
+		} else {
+			if (printable->len > 0)
+				g_string_append (printable, "; ");
 
-		if (nm_ip_route_get_next_hop (route)) {
-			g_string_append_printf (printable, ", nh = %s",
-			                        nm_ip_route_get_next_hop (route));
-		}
+			g_string_append (printable, "{ ");
 
-		if (nm_ip_route_get_metric (route) != -1)
-			g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
+			g_string_append_printf (printable, "ip = %s/%u",
+			                        nm_ip_route_get_dest (route),
+			                        nm_ip_route_get_prefix (route));
 
-		g_string_append (printable, " }");
+			if (nm_ip_route_get_next_hop (route)) {
+				g_string_append_printf (printable, ", nh = %s",
+				                        nm_ip_route_get_next_hop (route));
+			}
+
+			if (nm_ip_route_get_metric (route) != -1)
+				g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
+
+			g_string_append (printable, " }");
+		}
 	}
 
 	return g_string_free (printable, FALSE);
 }
 
+static char *
+nmc_property_ipv4_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	return nmc_property_ipvx_get_routes (setting, get_type);
+}
+
 DEFINE_GETTER (nmc_property_ipv4_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY)
 DEFINE_GETTER (nmc_property_ipv4_get_route_metric, NM_SETTING_IP_CONFIG_ROUTE_METRIC)
 DEFINE_GETTER (nmc_property_ipv4_get_ignore_auto_routes, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES)
@@ -1294,40 +1353,9 @@ 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)
 
 static char *
-nmc_property_ipv6_get_routes (NMSetting *setting)
+nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
 {
-	NMSettingIPConfig *s_ip6 = NM_SETTING_IP_CONFIG (setting);
-	GString *printable;
-	guint32 num_routes, i;
-	NMIPRoute *route;
-
-	printable = g_string_new (NULL);
-
-	num_routes = nm_setting_ip_config_get_num_routes (s_ip6);
-	for (i = 0; i < num_routes; i++) {
-		route = nm_setting_ip_config_get_route (s_ip6, i);
-
-		if (printable->len > 0)
-			g_string_append (printable, "; ");
-
-		g_string_append (printable, "{ ");
-
-		g_string_append_printf (printable, "ip = %s/%u",
-		                        nm_ip_route_get_dest (route),
-		                        nm_ip_route_get_prefix (route));
-
-		if (nm_ip_route_get_next_hop (route)) {
-			g_string_append_printf (printable, ", nh = %s",
-			                        nm_ip_route_get_next_hop (route));
-		}
-
-		if (nm_ip_route_get_metric (route) != -1)
-			g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
-
-		g_string_append (printable, " }");
-	}
-
-	return g_string_free (printable, FALSE);
+	return nmc_property_ipvx_get_routes (setting, get_type);
 }
 
 DEFINE_GETTER (nmc_property_ipv6_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY)
@@ -1340,10 +1368,10 @@ DEFINE_GETTER (nmc_property_ipv6_get_dhcp_send_hostname, NM_SETTING_IP_CONFIG_DH
 DEFINE_GETTER (nmc_property_ipv6_get_dhcp_hostname, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME)
 
 static char *
-nmc_property_ipv6_get_ip6_privacy (NMSetting *setting)
+nmc_property_ipv6_get_ip6_privacy (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (setting);
-	return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6));
+	return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6), get_type);
 }
 
 /* --- NM_SETTING_OLPC_MESH_SETTING_NAME property get functions --- */
@@ -1351,7 +1379,7 @@ DEFINE_GETTER (nmc_property_olpc_get_channel, NM_SETTING_OLPC_MESH_CHANNEL)
 DEFINE_GETTER (nmc_property_olpc_get_anycast_address, NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS)
 
 static char *
-nmc_property_olpc_get_ssid (NMSetting *setting)
+nmc_property_olpc_get_ssid (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingOlpcMesh *s_olpc_mesh = NM_SETTING_OLPC_MESH (setting);
 	GBytes *ssid;
@@ -1404,21 +1432,21 @@ DEFINE_GETTER (nmc_property_vlan_get_id, NM_SETTING_VLAN_ID)
 
 
 static char *
-nmc_property_vlan_get_flags (NMSetting *setting)
+nmc_property_vlan_get_flags (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
 	return vlan_flags_to_string (nm_setting_vlan_get_flags (s_vlan));
 }
 
 static char *
-nmc_property_vlan_get_ingress_priority_map (NMSetting *setting)
+nmc_property_vlan_get_ingress_priority_map (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
 	return vlan_priorities_to_string (s_vlan, NM_VLAN_INGRESS_MAP);
 }
 
 static char *
-nmc_property_vlan_get_egress_priority_map (NMSetting *setting)
+nmc_property_vlan_get_egress_priority_map (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
 	return vlan_priorities_to_string (s_vlan, NM_VLAN_EGRESS_MAP);
@@ -1429,7 +1457,7 @@ DEFINE_GETTER (nmc_property_vpn_get_service_type, NM_SETTING_VPN_SERVICE_TYPE)
 DEFINE_GETTER (nmc_property_vpn_get_user_name, NM_SETTING_VPN_USER_NAME)
 
 static char *
-nmc_property_vpn_get_data (NMSetting *setting)
+nmc_property_vpn_get_data (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingVpn *s_vpn = NM_SETTING_VPN (setting);
 	GString *data_item_str;
@@ -1441,7 +1469,7 @@ nmc_property_vpn_get_data (NMSetting *setting)
 }
 
 static char *
-nmc_property_vpn_get_secrets (NMSetting *setting)
+nmc_property_vpn_get_secrets (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingVpn *s_vpn = NM_SETTING_VPN (setting);
 	GString *secret_str;
@@ -1471,7 +1499,7 @@ DEFINE_GETTER (nmc_property_wired_get_s390_nettype, NM_SETTING_WIRED_S390_NETTYP
 DEFINE_GETTER (nmc_property_wired_get_s390_options, NM_SETTING_WIRED_S390_OPTIONS)
 
 static char *
-nmc_property_wired_get_mtu (NMSetting *setting)
+nmc_property_wired_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWired *s_wired = NM_SETTING_WIRED (setting);
 	int mtu;
@@ -1497,7 +1525,7 @@ DEFINE_GETTER (nmc_property_wireless_get_seen_bssids, NM_SETTING_WIRELESS_SEEN_B
 DEFINE_GETTER (nmc_property_wireless_get_hidden, NM_SETTING_WIRELESS_HIDDEN)
 
 static char *
-nmc_property_wireless_get_ssid (NMSetting *setting)
+nmc_property_wireless_get_ssid (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
 	GBytes *ssid;
@@ -1513,7 +1541,7 @@ nmc_property_wireless_get_ssid (NMSetting *setting)
 }
 
 static char *
-nmc_property_wireless_get_mtu (NMSetting *setting)
+nmc_property_wireless_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
 	int mtu;
@@ -1540,35 +1568,35 @@ DEFINE_GETTER (nmc_property_wifi_sec_get_leap_password, NM_SETTING_WIRELESS_SECU
 DEFINE_SECRET_FLAGS_GETTER (nmc_property_wifi_sec_get_leap_password_flags, NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS)
 
 static char *
-nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 0));
 }
 
 static char *
-nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 1));
 }
 
 static char *
-nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 2));
 }
 
 static char *
-nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 3));
 }
 
 static char *
-nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	return wep_key_type_to_string (nm_setting_wireless_security_get_wep_key_type (s_wireless_sec));
@@ -1601,20 +1629,23 @@ register_nmcli_value_transforms (void)
 
 /* Main hash table storing function pointer for manipulating properties */
 static GHashTable *nmc_properties = NULL;
-typedef	char *       (*NmcPropertyGetFunc)      (NMSetting *);
-typedef	gboolean     (*NmcPropertySetFunc)      (NMSetting *, const char *, const char *, GError **);
-typedef	gboolean     (*NmcPropertyRemoveFunc)   (NMSetting *, const char *, const char *, guint32, GError **);
-typedef	const char * (*NmcPropertyDescribeFunc) (NMSetting *, const char *);
-typedef	const char * (*NmcPropertyValuesFunc)   (NMSetting *, const char *);
-typedef	      char * (*NmcPropertyOut2InFunc)   (const char *);
+typedef	char *        (*NmcPropertyGetFunc)      (NMSetting *, NmcPropertyGetType);
+typedef	gboolean      (*NmcPropertySetFunc)      (NMSetting *, const char *, const char *, GError **);
+typedef	gboolean      (*NmcPropertyRemoveFunc)   (NMSetting *, const char *, const char *, guint32, GError **);
+typedef	const char *  (*NmcPropertyDescribeFunc) (NMSetting *, const char *);
+typedef	const char ** (*NmcPropertyValuesFunc)   (NMSetting *, const char *);
 
 typedef struct {
-	NmcPropertyGetFunc get_func;           /* func getting property values */
-	NmcPropertySetFunc set_func;           /* func adding/setting property values */
-	NmcPropertyRemoveFunc remove_func;     /* func removing items from container options */
-	NmcPropertyDescribeFunc describe_func; /* func returning property description */
-	NmcPropertyValuesFunc values_func;     /* func returning allowed property values */
-	NmcPropertyOut2InFunc out2in_func;     /* func converting property values from output to input format */
+	/* The order of the fields is important as they correspond
+	 * to the order as _nmc_add_prop_funcs() passes the arguments. */
+#define NmcPropertyFuncsFields \
+	NmcPropertyGetFunc get_func;           /* func getting property values */ \
+	NmcPropertySetFunc set_func;           /* func adding/setting property values */ \
+	NmcPropertyRemoveFunc remove_func;     /* func removing items from container options */ \
+	NmcPropertyDescribeFunc describe_func; /* func returning property description */ \
+	NmcPropertyValuesFunc values_func;     /* func returning allowed property values */ \
+	;
+	NmcPropertyFuncsFields
 } NmcPropertyFuncs;
 
 /*
@@ -2151,13 +2182,10 @@ check_and_set_string (NMSetting *setting,
 	}
 
 #define DEFINE_ALLOWED_VAL_FUNC(def_func, valid_values) \
-	static const char * \
+	static const char ** \
 	def_func (NMSetting *setting, const char *prop) \
 	{ \
-		static char *values = NULL; \
-		if (G_UNLIKELY (values == NULL)) \
-			values = g_strjoinv (", ", (char **) valid_values); \
-		return values; \
+		return valid_values; \
 	}
 
 /* --- generic property setter functions --- */
@@ -2243,6 +2271,22 @@ nmc_property_set_bool (NMSetting *setting, const char *prop, const char *val, GE
 }
 
 static gboolean
+nmc_property_set_trilean (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+	long int val_int;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	if (!nmc_string_to_int (val, TRUE, -1, 1, &val_int)) {
+		g_set_error (error, 1, 0, _("'%s' is not a valid value; use -1, 0 or 1"), val);
+		return FALSE;
+	}
+
+	g_object_set (setting, prop, val_int, NULL);
+	return TRUE;
+}
+
+static gboolean
 nmc_property_set_ssid (NMSetting *setting, const char *prop, const char *val, GError **error)
 {
 	GBytes *ssid;
@@ -2412,17 +2456,6 @@ done:
 		return TRUE; \
 	}
 
-static char *
-nmc_property_out2in_cut_paren (const char *out_format)
-{
-	const char *p;
-	size_t n;
-
-	p = strstr (out_format, " (");
-	n = p ? p - out_format : strlen (out_format);
-	return g_strndup (out_format, n);
-}
-
 /* --- NM_SETTING_CONNECTION_SETTING_NAME property setter functions --- */
 #if 0
 /*
@@ -2672,13 +2705,12 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
 	static gboolean \
 	def_func (NMSetting *setting, const char *prop, const char *val, GError **error) \
 	{ \
-		const char *SCHEME_PATH = "file://"; \
 		char *val_strip = g_strstrip (g_strdup (val)); \
 		char *p = val_strip; \
 		gboolean success; \
 		\
-		if (strncmp (val_strip, SCHEME_PATH, strlen (SCHEME_PATH)) == 0) \
-			p += strlen (SCHEME_PATH); \
+		if (strncmp (val_strip, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0) \
+			p += STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH); \
 		\
 		success = set_func (NM_SETTING_802_1X (setting), \
 		                    p, \
@@ -2694,14 +2726,13 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
 	def_func (NMSetting *setting, const char *prop, const char *val, GError **error) \
 	{ \
 		char **strv = NULL; \
-		const char *SCHEME_PATH = "file://"; \
 		char *val_strip = g_strstrip (g_strdup (val)); \
 		char *p = val_strip; \
 		const char *path, *password; \
 		gboolean success; \
 		\
-		if (strncmp (val_strip, SCHEME_PATH, strlen (SCHEME_PATH)) == 0) \
-			p += strlen (SCHEME_PATH); \
+		if (strncmp (val_strip, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0) \
+			p += STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH); \
 		\
 		strv = nmc_strsplit_set (p, " \t,", 2); \
 		path = strv[0]; \
@@ -2728,13 +2759,14 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
 	}
 
 /* 'eap' */
+static const char *valid_eap[] = { "leap", "md5", "tls", "peap", "ttls", "sim", "fast", "pwd", NULL };
+
 DEFINE_SETTER_STR_LIST_MULTI (check_and_add_802_1X_eap,
                               NM_SETTING_802_1X,
                               nm_setting_802_1x_add_eap_method)
 static gboolean
 nmc_property_802_1X_set_eap (NMSetting *setting, const char *prop, const char *val, GError **error)
 {
-	const char *valid_eap[] = { "leap", "md5", "tls", "peap", "ttls", "sim", "fast", "pwd", NULL };
 	return check_and_add_802_1X_eap (setting, prop, val, valid_eap, error);
 }
 
@@ -2756,6 +2788,8 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_802_1X_remove_eap,
                                nm_setting_802_1x_remove_eap_method,
                                _validate_and_remove_eap_method)
 
+DEFINE_ALLOWED_VAL_FUNC (nmc_property_802_1X_allowed_eap, valid_eap)
+
 /* 'ca-cert' */
 DEFINE_SETTER_CERT (nmc_property_802_1X_set_ca_cert, nm_setting_802_1x_set_ca_cert)
 
@@ -3056,17 +3090,10 @@ nmc_property_bond_describe_options (NMSetting *setting, const char *prop)
 	return desc;
 }
 
-static const char *
+static const char **
 nmc_property_bond_allowed_options (NMSetting *setting, const char *prop)
 {
-	const char **valid_options;
-	static char *allowed_vals = NULL;
-
-	if (G_UNLIKELY (allowed_vals == NULL)) {
-		valid_options = nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
-		allowed_vals = g_strjoinv (", ", (char **) valid_options);
-	}
-	return allowed_vals;
+	return nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
 }
 
 /* --- NM_SETTING_INFINIBAND_SETTING_NAME property setter functions --- */
@@ -3426,37 +3453,6 @@ nmc_property_ipv4_describe_routes (NMSetting *setting, const char *prop)
 	         "          10.1.2.0/24\n");
 }
 
-static char *
-nmc_property_out2in_routes (const char *out_format)
-{
-        GRegex *regex;
-	GString *str;
-        char **strv;
-	int i;
-
-	str = g_string_sized_new (128);
-	regex = g_regex_new ("\\{ dst = ([^/]+)/([^,]+), nh = ([^,]+), mt = ([^ ]+) \\}", 0, 0, NULL);
-
-	strv = g_regex_split (regex, out_format, 0);
-	for (i = 1; strv && strv[i] && strv[i+1] && strv[i+2] && strv[i+3]; i=i+5) {
-		g_string_append (str, strv[i]); /* IP */
-		g_string_append_c (str, '/');
-		g_string_append (str, strv[i+1]); /* prefix */
-		g_string_append_c (str, ' ');
-		g_string_append (str, strv[i+2]); /* next hop */
-		g_string_append_c (str, ' ');
-		g_string_append (str, strv[i+3]); /* metric */
-		g_string_append (str, ", ");
-	}
-	if (str->len > 0)
-		g_string_truncate (str, str->len - 2);
-
-	g_strfreev (strv);
-	g_regex_unref (regex);
-
-	return g_string_free (str, FALSE);
-}
-
 /* --- NM_SETTING_IP6_CONFIG_SETTING_NAME property setter functions --- */
 /* 'method' */
 static const char *ipv6_valid_methods[] = {
@@ -3774,7 +3770,7 @@ nmc_property_olpc_set_channel (NMSetting *setting, const char *prop, const char
 
 /* --- NM_SETTING_SERIAL_SETTING_NAME property setter functions --- */
 static char *
-nmc_property_serial_get_parity (NMSetting *setting)
+nmc_property_serial_get_parity (NMSetting *setting, NmcPropertyGetType get_type)
 {
 	NMSettingSerial *s_serial = NM_SETTING_SERIAL (setting);
 
@@ -4093,17 +4089,10 @@ DEFINE_REMOVER_OPTION (nmc_property_wired_remove_option_s390_options,
                        NM_SETTING_WIRED,
                        nm_setting_wired_remove_s390_option)
 
-static const char *
+static const char **
 nmc_property_wired_allowed_s390_options (NMSetting *setting, const char *prop)
 {
-	const char **valid_options;
-	static char *allowed_vals = NULL;
-
-	if (G_UNLIKELY (allowed_vals == NULL)) {
-		valid_options = nm_setting_wired_get_valid_s390_options (NM_SETTING_WIRED (setting));
-		allowed_vals = g_strjoinv (", ", (char **) valid_options);
-	}
-	return allowed_vals;
+	return nm_setting_wired_get_valid_s390_options (NM_SETTING_WIRED (setting));
 }
 
 static const char *
@@ -4723,29 +4712,36 @@ DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fco
 
 /*----------------------------------------------------------------------------*/
 
-static void
-nmc_add_prop_funcs (char *key,
-                    NmcPropertyGetFunc get_func,
-                    NmcPropertySetFunc set_func,
-                    NmcPropertyRemoveFunc remove_func,
-                    NmcPropertyDescribeFunc describe_func,
-                    NmcPropertyValuesFunc values_func,
-                    NmcPropertyOut2InFunc out2in_func)
+static inline void
+_nmc_add_prop_funcs (const char *key,
+                     const NmcPropertyFuncs *item_init)
 {
-	NmcPropertyFuncs *item = g_malloc0 (sizeof (NmcPropertyFuncs));
-	item->get_func = get_func;
-	item->set_func = set_func;
-	item->remove_func = remove_func;
-	item->describe_func = describe_func;
-	item->values_func = values_func;
-	item->out2in_func = out2in_func;
+	NmcPropertyFuncs *item;
 
-	g_hash_table_insert (nmc_properties, key, item);
+	item = g_malloc (sizeof (NmcPropertyFuncs));
+	*item = *item_init;
+	g_hash_table_insert (nmc_properties, (gpointer) key, item);
 }
 
+#define nmc_add_prop_funcs(key, ...) \
+	G_STMT_START { \
+		struct { \
+			NmcPropertyFuncsFields; \
+			/* The _dummy field is here so that the last argument can be always
+			 * NULL. That means every call to nmc_add_prop_funcs() below ends
+			 * with a separate line "NULL);". */ \
+			gpointer _dummy; \
+		} _item_init = { \
+			__VA_ARGS__ \
+		};\
+		\
+		nm_assert (_item_init._dummy == NULL); \
+		_nmc_add_prop_funcs ("" key, (NmcPropertyFuncs *) &_item_init); \
+	} G_STMT_END
+
 /* concatenate setting name and property name */
-#define GLUE(A,B) (g_strconcat ((NM_SETTING_##A##_SETTING_NAME),(NM_SETTING_##A##_##B), NULL))
-#define GLUE_IP(A,B) (g_strconcat ((NM_SETTING_IP##A##_CONFIG_SETTING_NAME),(NM_SETTING_IP_CONFIG_##B), NULL))
+#define GLUE(A,B) "" NM_SETTING_##A##_SETTING_NAME "" NM_SETTING_##A##_##B ""
+#define GLUE_IP(A,B) "" NM_SETTING_IP##A##_CONFIG_SETTING_NAME "" NM_SETTING_IP_CONFIG_##B ""
 
 void
 nmc_properties_init (void)
@@ -4754,7 +4750,7 @@ nmc_properties_init (void)
 		return;
 
 	/* create properties hash table */
-	nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+	nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
 
 	/* Add editable properties for NM_SETTING_802_1X_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (802_1X, EAP),
@@ -4762,7 +4758,7 @@ nmc_properties_init (void)
 	                    nmc_property_802_1X_set_eap,
 	                    nmc_property_802_1X_remove_eap,
 	                    NULL,
-	                    NULL,
+	                    nmc_property_802_1X_allowed_eap,
 	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, IDENTITY),
 	                    nmc_property_802_1X_get_identity,
@@ -4903,7 +4899,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PASSWORD_RAW),
 	                    nmc_property_802_1X_get_password_raw,
 	                    nmc_property_802_1X_set_password_raw,
@@ -4917,7 +4913,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PRIVATE_KEY),
 	                    nmc_property_802_1X_get_private_key,
 	                    nmc_property_802_1X_set_private_key,
@@ -4938,7 +4934,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PHASE2_PRIVATE_KEY),
 	                    nmc_property_802_1X_get_phase2_private_key,
 	                    nmc_property_802_1X_set_phase2_private_key,
@@ -4959,7 +4955,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, PIN),
 	                    nmc_property_802_1X_get_pin,
 	                    nmc_property_set_string,
@@ -4973,7 +4969,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (802_1X, SYSTEM_CA_CERTS),
 	                    nmc_property_802_1X_get_system_ca_certs,
 	                    nmc_property_set_bool,
@@ -5003,7 +4999,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (ADSL, PROTOCOL),
 	                    nmc_property_adsl_get_protocol,
 	                    nmc_property_adsl_set_protocol,
@@ -5160,7 +5156,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 
 	/* Add editable properties for NM_SETTING_CONNECTION_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (CONNECTION, ID),
@@ -5247,6 +5243,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    nmc_property_con_allowed_slave_type,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (CONNECTION, AUTOCONNECT_SLAVES),
+	                    nmc_property_connection_get_autoconnect_slaves,
+	                    nmc_property_set_trilean,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (CONNECTION, SECONDARIES),
 	                    nmc_property_connection_get_secondaries,
 	                    nmc_property_connection_set_secondaries,
@@ -5397,7 +5400,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (GSM, APN),
 	                    nmc_property_gsm_get_apn,
 	                    nmc_property_set_string,
@@ -5425,7 +5428,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (GSM, HOME_ONLY),
 	                    nmc_property_gsm_get_home_only,
 	                    nmc_property_set_bool,
@@ -5513,7 +5516,7 @@ nmc_properties_init (void)
 	                    nmc_property_ipv4_remove_routes,
 	                    nmc_property_ipv4_describe_routes,
 	                    NULL,
-	                    nmc_property_out2in_routes);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (4, ROUTE_METRIC),
 	                    nmc_property_ipv4_get_route_metric,
 	                    nmc_property_set_int64,
@@ -5613,7 +5616,7 @@ nmc_properties_init (void)
 	                    nmc_property_ipv6_remove_routes,
 	                    nmc_property_ipv6_describe_routes,
 	                    NULL,
-	                    nmc_property_out2in_routes);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (6, ROUTE_METRIC),
 	                    nmc_property_ipv6_get_route_metric,
 	                    nmc_property_set_int64,
@@ -5655,7 +5658,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (6, DHCP_SEND_HOSTNAME),
 	                    nmc_property_ipv6_get_dhcp_send_hostname,
 	                    nmc_property_set_bool,
@@ -5850,7 +5853,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 
 	/* Add editable properties for NM_SETTING_SERIAL_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (SERIAL, BAUD),
@@ -6257,7 +6260,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, WEP_KEY_TYPE),
 	                    nmc_property_wifi_sec_get_wep_key_type,
 	                    nmc_property_wifi_set_wep_key_type,
@@ -6278,7 +6281,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 	nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, LEAP_PASSWORD),
 	                    nmc_property_wifi_sec_get_leap_password,
 	                    nmc_property_set_string,
@@ -6292,7 +6295,7 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL,
-	                    nmc_property_out2in_cut_paren);
+	                    NULL);
 }
 
 void
@@ -6305,21 +6308,21 @@ nmc_properties_cleanup ()
 static const NmcPropertyFuncs *
 nmc_properties_find (const char *s_name, const char *p_name)
 {
-	NmcPropertyFuncs *item = NULL;
 	char *key;
+	gsize p_l, s_l;
 
-	/* FIXME: maybe it's better to init it globally */
 	nmc_properties_init ();
 
-	key = g_strdup_printf ("%s%s", s_name, p_name);
-	item = (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key);
-	g_free (key);
-
-	return item;
+	s_l = strlen (s_name);
+	p_l = strlen (p_name);
+	key = g_alloca (s_l + p_l + 1);
+	memcpy (&key[  0], s_name, s_l);
+	memcpy (&key[s_l], p_name, p_l + 1);
+	return (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key);
 }
 
 static char *
-get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError **error)
+get_property_val (NMSetting *setting, const char *prop, NmcPropertyGetType get_type, GError **error)
 {
 	const NmcPropertyFuncs *item;
 
@@ -6327,15 +6330,8 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
 	item = nmc_properties_find (nm_setting_get_name (setting), prop);
-	if (item && item->get_func) {
-		char *prop_val = item->get_func (setting);
-		if (convert && item->out2in_func) {
-			char *converted = item->out2in_func (prop_val);
-			g_free (prop_val);
-			return converted;
-		} else
-			return prop_val;
-	}
+	if (item && item->get_func)
+		return item->get_func (setting, get_type);
 
 	g_set_error_literal (error, 1, 0, _("don't know how to get the property value"));
 	return NULL;
@@ -6351,17 +6347,17 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError
 char *
 nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error)
 {
-	return get_property_val (setting, prop, FALSE, error);
+	return get_property_val (setting, prop, NMC_PROPERTY_GET_PRETTY, error);
 }
 
 /*
- * The same as nmc_setting_get_property(), but in addition converts
- * usual output format into a simpler one, used as input in the editor.
+ * Similar to nmc_setting_get_property(), but returns the property in a string
+ * format that can be parsed via nmc_setting_set_property().
  */
 char *
-nmc_setting_get_property_out2in (NMSetting *setting, const char *prop, GError **error)
+nmc_setting_get_property_parsable (NMSetting *setting, const char *prop, GError **error)
 {
-	return get_property_val (setting, prop, TRUE, error);
+	return get_property_val (setting, prop, NMC_PROPERTY_GET_PARSABLE, error);
 }
 
 /*
@@ -6496,7 +6492,7 @@ nmc_setting_get_valid_properties (NMSetting *setting)
 /*
  * Return allowed values for 'prop' as a string.
  */
-const char *
+const char **
 nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop)
 {
 
@@ -6593,7 +6589,7 @@ nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value)
 /*----------------------------------------------------------------------------*/
 
 #define GET_SECRET(show, setting, func) \
-	(show ? func (setting) : g_strdup (_("<hidden>")))
+	(show ? func (setting, NMC_PROPERTY_GET_PRETTY) : g_strdup (_("<hidden>")))
 
 static gboolean
 setting_connection_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets)
@@ -6613,20 +6609,21 @@ setting_connection_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_connection_get_id (setting));
-	set_val_str (arr, 2, nmc_property_connection_get_uuid (setting));
-	set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting));
-	set_val_str (arr, 4, nmc_property_connection_get_type (setting));
-	set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting));
-	set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting));
-	set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting));
-	set_val_str (arr, 8, nmc_property_connection_get_read_only (setting));
-	set_val_str (arr, 9, nmc_property_connection_get_permissions (setting));
-	set_val_str (arr, 10, nmc_property_connection_get_zone (setting));
-	set_val_str (arr, 11, nmc_property_connection_get_master (setting));
-	set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting));
-	set_val_str (arr, 13, nmc_property_connection_get_secondaries (setting));
-	set_val_str (arr, 14, nmc_property_connection_get_gateway_ping_timeout (setting));
+	set_val_str (arr, 1, nmc_property_connection_get_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_connection_get_uuid (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_connection_get_type (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_connection_get_read_only (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_connection_get_permissions (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_connection_get_zone (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_connection_get_master (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_connection_get_autoconnect_slaves (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_connection_get_secondaries (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_connection_get_gateway_ping_timeout (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6652,17 +6649,17 @@ setting_wired_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gb
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_wired_get_port (setting));
-	set_val_str (arr, 2, nmc_property_wired_get_speed (setting));
-	set_val_str (arr, 3, nmc_property_wired_get_duplex (setting));
-	set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting));
-	set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting));
-	set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting));
-	set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting));
-	set_val_str (arr, 8, nmc_property_wired_get_mtu (setting));
-	set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting));
-	set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting));
-	set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting));
+	set_val_str (arr, 1, nmc_property_wired_get_port (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_wired_get_speed (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_wired_get_duplex (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_wired_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6688,38 +6685,38 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting));
-	set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting));
-	set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting));
-	set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting));
-	set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting));
-	set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting));
-	set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting));
-	set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting));
-	set_val_str (arr, 9, nmc_property_802_1X_get_client_cert (setting));
-	set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting));
-	set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting));
-	set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting));
-	set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting));
-	set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting));
-	set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting));
-	set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting));
-	set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting));
-	set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting));
-	set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting));
+	set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting, NMC_PROPERTY_GET_PRETTY));
+	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_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 20, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password));
-	set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting));
+	set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 22, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password_raw));
-	set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting));
-	set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting));
+	set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 25, GET_SECRET (secrets, setting, nmc_property_802_1X_get_private_key_password));
-	set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting));
-	set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting));
+	set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 28, GET_SECRET (secrets, setting, nmc_property_802_1X_get_phase2_private_key_password));
-	set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting));
+	set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 30, GET_SECRET (secrets, setting, nmc_property_802_1X_get_pin));
-	set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting));
-	set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting));
+	set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6745,19 +6742,19 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc,  const char *one_prop,
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting));
-	set_val_str (arr, 2, nmc_property_wireless_get_mode (setting));
-	set_val_str (arr, 3, nmc_property_wireless_get_band (setting));
-	set_val_str (arr, 4, nmc_property_wireless_get_channel (setting));
-	set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting));
-	set_val_str (arr, 6, nmc_property_wireless_get_rate (setting));
-	set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting));
-	set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting));
-	set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting));
-	set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting));
-	set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting));
-	set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting));
-	set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting));
+	set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_wireless_get_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_wireless_get_band (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_wireless_get_channel (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_wireless_get_rate (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6783,23 +6780,23 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc, const char *o
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting));
-	set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting));
-	set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting));
-	set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting));
-	set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting));
-	set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting));
-	set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting));
+	set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 8, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key0));
 	set_val_str (arr, 9, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key1));
 	set_val_str (arr, 10, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key2));
 	set_val_str (arr, 11, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key3));
-	set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting));
-	set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting));
+	set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 14, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_psk));
-	set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting));
+	set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 16, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_leap_password));
-	set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting));
+	set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6825,20 +6822,20 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_ipv4_get_method (setting));
-	set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting));
-	set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting));
-	set_val_str (arr, 4, nmc_property_ip_get_addresses (setting));
-	set_val_str (arr, 5, nmc_property_ipv4_get_gateway (setting));
-	set_val_str (arr, 6, nmc_property_ipv4_get_routes (setting));
-	set_val_str (arr, 7, nmc_property_ipv4_get_route_metric (setting));
-	set_val_str (arr, 8, nmc_property_ipv4_get_ignore_auto_routes (setting));
-	set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_dns (setting));
-	set_val_str (arr, 10, nmc_property_ipv4_get_dhcp_client_id (setting));
-	set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_send_hostname (setting));
-	set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_hostname (setting));
-	set_val_str (arr, 13, nmc_property_ipv4_get_never_default (setting));
-	set_val_str (arr, 14, nmc_property_ipv4_get_may_fail (setting));
+	set_val_str (arr, 1, nmc_property_ipv4_get_method (setting, NMC_PROPERTY_GET_PRETTY));
+	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_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6864,20 +6861,20 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_ipv6_get_method (setting));
-	set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting));
-	set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting));
-	set_val_str (arr, 4, nmc_property_ip_get_addresses (setting));
-	set_val_str (arr, 5, nmc_property_ipv6_get_gateway (setting));
-	set_val_str (arr, 6, nmc_property_ipv6_get_routes (setting));
-	set_val_str (arr, 7, nmc_property_ipv6_get_route_metric (setting));
-	set_val_str (arr, 8, nmc_property_ipv6_get_ignore_auto_routes (setting));
-	set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_dns (setting));
-	set_val_str (arr, 10, nmc_property_ipv6_get_never_default (setting));
-	set_val_str (arr, 11, nmc_property_ipv6_get_may_fail (setting));
-	set_val_str (arr, 12, nmc_property_ipv6_get_ip6_privacy (setting));
-	set_val_str (arr, 13, nmc_property_ipv6_get_dhcp_send_hostname (setting));
-	set_val_str (arr, 14, nmc_property_ipv6_get_dhcp_hostname (setting));
+	set_val_str (arr, 1, nmc_property_ipv6_get_method (setting, NMC_PROPERTY_GET_PRETTY));
+	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_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, 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 */
@@ -6903,11 +6900,11 @@ setting_serial_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_serial_get_baud (setting));
-	set_val_str (arr, 2, nmc_property_serial_get_bits (setting));
-	set_val_str (arr, 3, nmc_property_serial_get_parity (setting));
-	set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting));
-	set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting));
+	set_val_str (arr, 1, nmc_property_serial_get_baud (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_serial_get_bits (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_serial_get_parity (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6933,24 +6930,24 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting));
-	set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting));
-	set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting));
-	set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting));
-	set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting));
-	set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting));
-	set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting));
-	set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting));
-	set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting));
-	set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting));
-	set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting));
-	set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting));
-	set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting));
-	set_val_str (arr, 14, nmc_property_ppp_get_baud (setting));
-	set_val_str (arr, 15, nmc_property_ppp_get_mru (setting));
-	set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting));
-	set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting));
-	set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting));
+	set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ppp_get_baud (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_ppp_get_mru (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6976,10 +6973,10 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gb
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_pppoe_get_service (setting));
-	set_val_str (arr, 2, nmc_property_pppoe_get_username (setting));
+	set_val_str (arr, 1, nmc_property_pppoe_get_service (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_pppoe_get_username (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_pppoe_get_password));
-	set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting));
+	set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7005,15 +7002,15 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_gsm_get_number (setting));
-	set_val_str (arr, 2, nmc_property_gsm_get_username (setting));
+	set_val_str (arr, 1, nmc_property_gsm_get_number (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_gsm_get_username (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_gsm_get_password));
-	set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting));
-	set_val_str (arr, 5, nmc_property_gsm_get_apn (setting));
-	set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting));
+	set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_gsm_get_apn (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 7, GET_SECRET (secrets, setting, nmc_property_gsm_get_pin));
-	set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting));
-	set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting));
+	set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7039,10 +7036,10 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gbo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_cdma_get_number (setting));
-	set_val_str (arr, 2, nmc_property_cdma_get_username (setting));
+	set_val_str (arr, 1, nmc_property_cdma_get_number (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_cdma_get_username (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_cdma_get_password));
-	set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting));
+	set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7068,8 +7065,8 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc,  const char *one_prop
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting));
-	set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting));
+	set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7095,9 +7092,9 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc,  const char *one_prop
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting));
-	set_val_str (arr, 2, nmc_property_olpc_get_channel (setting));
-	set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting));
+	set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_olpc_get_channel (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7123,11 +7120,11 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting));
-	set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting));
-	set_val_str (arr, 3, nmc_property_vpn_get_data (setting));
+	set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_vpn_get_data (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 4, GET_SECRET (secrets, setting, nmc_property_vpn_get_secrets));
-	set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting));
+	set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7153,8 +7150,8 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gb
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting));
-	set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting));
+	set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7180,11 +7177,11 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting));
-	set_val_str (arr, 2, nmc_property_ib_get_mtu (setting));
-	set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting));
-	set_val_str (arr, 4, nmc_property_ib_get_p_key (setting));
-	set_val_str (arr, 5, nmc_property_ib_get_parent (setting));
+	set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_ib_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_ib_get_p_key (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ib_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7210,7 +7207,7 @@ setting_bond_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gbo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_bond_get_options (setting));
+	set_val_str (arr, 1, nmc_property_bond_get_options (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7236,11 +7233,11 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gbo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_vlan_get_parent (setting));
-	set_val_str (arr, 2, nmc_property_vlan_get_id (setting));
-	set_val_str (arr, 3, nmc_property_vlan_get_flags (setting));
-	set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting));
-	set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting));
+	set_val_str (arr, 1, nmc_property_vlan_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_vlan_get_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_vlan_get_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7266,13 +7263,13 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gbo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_adsl_get_username (setting));
+	set_val_str (arr, 1, nmc_property_adsl_get_username (setting, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 2, GET_SECRET (secrets, setting, nmc_property_adsl_get_password));
-	set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting));
-	set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting));
-	set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting));
-	set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting));
-	set_val_str (arr, 7, nmc_property_adsl_get_vci (setting));
+	set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_adsl_get_vci (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7298,13 +7295,13 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting));
-	set_val_str (arr, 2, nmc_property_bridge_get_stp (setting));
-	set_val_str (arr, 3, nmc_property_bridge_get_priority (setting));
-	set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting));
-	set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting));
-	set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting));
-	set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting));
+	set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_bridge_get_stp (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_bridge_get_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7330,9 +7327,9 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc,  const char *one_pr
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting));
-	set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting));
-	set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting));
+	set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7358,7 +7355,7 @@ setting_team_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gbo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_team_get_config (setting));
+	set_val_str (arr, 1, nmc_property_team_get_config (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7384,7 +7381,7 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc,  const char *one_prop
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_team_port_get_config (setting));
+	set_val_str (arr, 1, nmc_property_team_port_get_config (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7410,21 +7407,21 @@ setting_dcb_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
 	set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
-	set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting));
-	set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting));
-	set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting));
-	set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting));
-	set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting));
-	set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting));
-	set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting));
-	set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting));
-	set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting));
-	set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting));
-	set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting));
-	set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting));
-	set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting));
-	set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting));
-	set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting));
+	set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
diff --git a/clients/cli/settings.h b/clients/cli/settings.h
index 3c4c814f..bab00ee9 100644
--- a/clients/cli/settings.h
+++ b/clients/cli/settings.h
@@ -37,13 +37,13 @@ void nmc_setting_connection_connect_handlers (NMSettingConnection *setting, NMCo
 
 char      **nmc_setting_get_valid_properties (NMSetting *setting);
 char       *nmc_setting_get_property_desc (NMSetting *setting, const char *prop);
-const char *nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop);
+const char **nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop);
 char       *nmc_setting_get_property (NMSetting *setting,
                                       const char *prop,
                                       GError **error);
-char       *nmc_setting_get_property_out2in (NMSetting *setting,
-                                             const char *prop,
-                                             GError **error);
+char       *nmc_setting_get_property_parsable (NMSetting *setting,
+                                               const char *prop,
+                                               GError **error);
 gboolean    nmc_setting_set_property (NMSetting *setting,
                                       const char *prop,
                                       const char *val,
diff --git a/clients/cli/utils.c b/clients/cli/utils.c
index 60cf9f93..dfd002ed 100644
--- a/clients/cli/utils.c
+++ b/clients/cli/utils.c
@@ -454,17 +454,34 @@ nmc_get_user_input (const char *ask_str)
  * Split string in 'line' according to 'delim' to (argument) array.
  */
 int
-nmc_string_to_arg_array (const char *line, const char *delim, char ***argv, int *argc)
+nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
+                         char ***argv, int *argc)
 {
-	int i = 0;
 	char **arr;
 
-	arr = g_strsplit_set (line ? line : "", delim ? delim : " \t", 0);
-	while (arr && arr[i])
-		i++;
+	arr = nmc_strsplit_set (line ? line : "", delim ? delim : " \t", 0);
+
+	if (unquote) {
+		int i = 0;
+		char *s;
+		size_t l;
+		const char *quotes = "\"'";
+
+		while (arr && arr[i]) {
+			s = arr[i];
+			l = strlen (s);
+			if (l >= 2) {
+				if (strchr (quotes, s[0]) && s[l-1] == s[0]) {
+					memmove (s, s+1, l-2);
+					s[l-2] = '\0';
+				}
+			}
+			i++;
+		}
+	}
 
-	*argc = i;
 	*argv = arr;
+	*argc = g_strv_length (arr);
 
 	return 0;
 }
@@ -544,20 +561,22 @@ nmc_util_strv_to_slist (char **strv)
  * Returns: a newly allocated string. Caller must free it with g_free().
  */
 char *
-nmc_util_strv_for_display (const char **strv)
+nmc_util_strv_for_display (const char **strv, gboolean brackets)
 {
 	GString *result;
 	guint i = 0;
 
 	result = g_string_sized_new (150);
-	g_string_append_c (result, '[');
+	if (brackets)
+		g_string_append_c (result, '[');
 	while (strv && strv[i]) {
 		if (result->len > 1)
 			g_string_append (result, ", ");
 		g_string_append (result, strv[i]);
 		i++;
 	}
-	g_string_append_c (result, ']');
+	if (brackets)
+		g_string_append_c (result, ']');
 
 	return g_string_free (result, FALSE);
 }
diff --git a/clients/cli/utils.h b/clients/cli/utils.h
index fc43b0ed..77e697af 100644
--- a/clients/cli/utils.h
+++ b/clients/cli/utils.h
@@ -69,10 +69,11 @@ void nmc_terminal_show_progress (const char *str);
 const char *nmc_term_color_sequence (NmcTermColor color);
 char *nmc_colorize (NmcTermColor color, const char * fmt, ...);
 char *nmc_get_user_input (const char *ask_str);
-int nmc_string_to_arg_array (const char *line, const char *delim, char ***argv, int *argc);
+int nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
+                             char ***argv, int *argc);
 const char *nmc_string_is_valid (const char *input, const char **allowed, GError **error);
 GSList *nmc_util_strv_to_slist (char **strv);
-char * nmc_util_strv_for_display (const char **strv);
+char * nmc_util_strv_for_display (const char **strv, gboolean brackets);
 char **nmc_strsplit_set (const char *str, const char *delimiter, int max_tokens);
 int nmc_string_screen_width (const char *start, const char *end);
 void set_val_str  (NmcOutputField fields_array[], guint32 index, char *value);