summary refs log tree commit diff
path: root/clients
diff options
context:
space:
mode:
Diffstat (limited to 'clients')
-rw-r--r--clients/Makefile.am4
-rw-r--r--clients/Makefile.in22
-rw-r--r--clients/cli/Makefile.am12
-rw-r--r--clients/cli/Makefile.in118
-rw-r--r--clients/cli/agent.c7
-rw-r--r--clients/cli/common.c227
-rw-r--r--clients/cli/common.h6
-rw-r--r--clients/cli/connections.c2992
-rw-r--r--clients/cli/connections.h2
-rw-r--r--clients/cli/devices.c1657
-rw-r--r--clients/cli/devices.h2
-rw-r--r--clients/cli/general.c290
-rw-r--r--clients/cli/general.h1
-rw-r--r--clients/cli/nmcli-completion325
-rw-r--r--clients/cli/nmcli.c40
-rw-r--r--clients/cli/nmcli.h44
-rw-r--r--clients/cli/polkit-agent.c23
-rw-r--r--clients/cli/settings-docs.c101
-rw-r--r--clients/cli/settings.c1737
-rw-r--r--clients/cli/utils.c260
-rw-r--r--clients/cli/utils.h10
-rw-r--r--clients/common/nm-polkit-listener.c4
-rw-r--r--clients/common/nm-polkit-listener.h4
-rw-r--r--clients/common/nm-secret-agent-simple.c22
-rw-r--r--clients/common/nm-vpn-helpers.c189
-rw-r--r--clients/common/nm-vpn-helpers.h7
-rw-r--r--clients/nm-online.c8
-rw-r--r--clients/tui/Makefile.am10
-rw-r--r--clients/tui/Makefile.in28
-rw-r--r--clients/tui/newt/Makefile.am5
-rw-r--r--clients/tui/newt/Makefile.in23
-rw-r--r--clients/tui/newt/nmt-newt-form.c2
-rw-r--r--clients/tui/newt/nmt-newt-popup.c2
-rw-r--r--clients/tui/newt/nmt-newt-types.h4
-rw-r--r--clients/tui/newt/nmt-newt-utils.c4
-rw-r--r--clients/tui/newt/nmt-newt-utils.h3
-rw-r--r--clients/tui/nm-editor-bindings.c1
-rw-r--r--clients/tui/nm-editor-utils.c4
-rw-r--r--clients/tui/nmt-address-list.c2
-rw-r--r--clients/tui/nmt-connect-connection-list.c1
-rw-r--r--clients/tui/nmt-device-entry.c1
-rw-r--r--clients/tui/nmt-edit-connection-list.c2
-rw-r--r--clients/tui/nmt-editor-page.c2
-rw-r--r--clients/tui/nmt-editor-section.c2
-rw-r--r--clients/tui/nmt-editor.c3
-rw-r--r--clients/tui/nmt-ip-entry.c2
-rw-r--r--clients/tui/nmt-mac-entry.h1
-rw-r--r--clients/tui/nmt-mtu-entry.c2
-rw-r--r--clients/tui/nmt-page-bond.c4
-rw-r--r--clients/tui/nmt-page-bridge-port.c4
-rw-r--r--clients/tui/nmt-page-bridge.c10
-rw-r--r--clients/tui/nmt-page-dsl.c4
-rw-r--r--clients/tui/nmt-page-dsl.h1
-rw-r--r--clients/tui/nmt-page-ethernet.c4
-rw-r--r--clients/tui/nmt-page-infiniband.c4
-rw-r--r--clients/tui/nmt-page-ip4.c4
-rw-r--r--clients/tui/nmt-page-ip6.c4
-rw-r--r--clients/tui/nmt-page-ppp.c4
-rw-r--r--clients/tui/nmt-page-team-port.c4
-rw-r--r--clients/tui/nmt-page-team.c4
-rw-r--r--clients/tui/nmt-page-team.h1
-rw-r--r--clients/tui/nmt-page-vlan.c4
-rw-r--r--clients/tui/nmt-page-wifi.c4
-rw-r--r--clients/tui/nmt-password-dialog.c2
-rw-r--r--clients/tui/nmt-password-fields.c2
-rw-r--r--clients/tui/nmt-route-editor.c4
-rw-r--r--clients/tui/nmt-route-entry.c1
-rw-r--r--clients/tui/nmt-route-table.c1
-rw-r--r--clients/tui/nmt-slave-list.c1
-rw-r--r--clients/tui/nmt-utils.h2
-rw-r--r--clients/tui/nmt-widget-list.c2
-rw-r--r--clients/tui/nmtui-connect.c4
-rw-r--r--clients/tui/nmtui-edit.c1
-rw-r--r--clients/tui/nmtui-hostname.c2
-rw-r--r--clients/tui/nmtui.c4
75 files changed, 6207 insertions, 2097 deletions
diff --git a/clients/Makefile.am b/clients/Makefile.am
index 8316dcc0..9c30eea1 100644
--- a/clients/Makefile.am
+++ b/clients/Makefile.am
@@ -1,8 +1,8 @@
 SUBDIRS = cli tui
 
 AM_CPPFLAGS = \
-	-I${top_srcdir}/include \
-	-I$(top_builddir)/include \
+	-I${top_srcdir}/shared \
+	-I$(top_builddir)/shared \
 	-I${top_srcdir}/libnm-core \
 	-I${top_builddir}/libnm-core \
 	-I${top_srcdir}/libnm \
diff --git a/clients/Makefile.in b/clients/Makefile.in
index a281fd13..243cd149 100644
--- a/clients/Makefile.in
+++ b/clients/Makefile.in
@@ -242,7 +242,6 @@ BLUEZ5_LIBS = @BLUEZ5_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CKDB_PATH = @CKDB_PATH@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
 CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
@@ -254,8 +253,6 @@ CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DBUS_CFLAGS = @DBUS_CFLAGS@
-DBUS_GLIB_100_CFLAGS = @DBUS_GLIB_100_CFLAGS@
-DBUS_GLIB_100_LIBS = @DBUS_GLIB_100_LIBS@
 DBUS_LIBS = @DBUS_LIBS@
 DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
@@ -265,6 +262,7 @@ DHCPCD_PATH = @DHCPCD_PATH@
 DISTRO_NETWORK_SERVICE = @DISTRO_NETWORK_SERVICE@
 DLLTOOL = @DLLTOOL@
 DNSMASQ_PATH = @DNSMASQ_PATH@
+DNSSEC_TRIGGER_SCRIPT = @DNSSEC_TRIGGER_SCRIPT@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -319,16 +317,13 @@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
-IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
-IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAUDIT_CFLAGS = @LIBAUDIT_CFLAGS@
+LIBAUDIT_LIBS = @LIBAUDIT_LIBS@
 LIBDL = @LIBDL@
-LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
-LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
-LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBM = @LIBM@
@@ -365,6 +360,8 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
+NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
@@ -393,7 +390,6 @@ POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
 PPPD_PATH = @PPPD_PATH@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
-PPPOE_PATH = @PPPOE_PATH@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
@@ -408,6 +404,8 @@ SYSTEMD_200_CFLAGS = @SYSTEMD_200_CFLAGS@
 SYSTEMD_200_LIBS = @SYSTEMD_200_LIBS@
 SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
 SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_JOURNAL_CFLAGS = @SYSTEMD_JOURNAL_CFLAGS@
+SYSTEMD_JOURNAL_LIBS = @SYSTEMD_JOURNAL_LIBS@
 SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
 SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
@@ -468,6 +466,7 @@ mkdir_p = @mkdir_p@
 nmbinary = @nmbinary@
 nmconfdir = @nmconfdir@
 nmdatadir = @nmdatadir@
+nmlibdir = @nmlibdir@
 nmrundir = @nmrundir@
 nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
@@ -475,6 +474,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -492,8 +492,8 @@ with_resolvconf = @with_resolvconf@
 with_valgrind = @with_valgrind@
 SUBDIRS = cli tui
 AM_CPPFLAGS = \
-	-I${top_srcdir}/include \
-	-I$(top_builddir)/include \
+	-I${top_srcdir}/shared \
+	-I$(top_builddir)/shared \
 	-I${top_srcdir}/libnm-core \
 	-I${top_builddir}/libnm-core \
 	-I${top_srcdir}/libnm \
diff --git a/clients/cli/Makefile.am b/clients/cli/Makefile.am
index 2f394098..dfcb1e96 100644
--- a/clients/cli/Makefile.am
+++ b/clients/cli/Makefile.am
@@ -1,11 +1,13 @@
+if BUILD_NMCLI
+
 bin_PROGRAMS = \
 	nmcli
 
 AM_CPPFLAGS = \
 	-I${top_srcdir} \
 	-I${top_builddir} \
-	-I${top_srcdir}/include \
-	-I$(top_builddir)/include \
+	-I${top_srcdir}/shared \
+	-I$(top_builddir)/shared \
 	-I${top_srcdir}/libnm-core \
 	-I${top_builddir}/libnm-core \
 	-I${top_srcdir}/libnm \
@@ -14,9 +16,7 @@ AM_CPPFLAGS = \
 	$(GLIB_CFLAGS) \
 	-DG_LOG_DOMAIN=\""nmcli"\" \
 	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
-	-DNMCLI_LOCALEDIR=\"$(datadir)/locale\" \
-	-DNMCONFDIR=\"$(nmconfdir)\" \
-	-DNMLIBDIR=\"$(libdir)\"
+	-DNMCLI_LOCALEDIR=\"$(datadir)/locale\"
 
 nmcli_SOURCES = \
 	agent.c \
@@ -75,3 +75,5 @@ uninstall-hook:
 	rm -f $(DESTDIR)$(completiondir)/nmcli
 
 EXTRA_DIST += nmcli-completion
+
+endif
diff --git a/clients/cli/Makefile.in b/clients/cli/Makefile.in
index 2abbf580..9aa4aa49 100644
--- a/clients/cli/Makefile.in
+++ b/clients/cli/Makefile.in
@@ -88,10 +88,10 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-bin_PROGRAMS = nmcli$(EXEEXT)
-@WITH_POLKIT_AGENT_TRUE@am__append_1 = $(POLKIT_CFLAGS)
-@WITH_POLKIT_AGENT_TRUE@am__append_2 = $(srcdir)/../common/nm-polkit-listener.c $(srcdir)/../common/nm-polkit-listener.h
-@WITH_POLKIT_AGENT_TRUE@am__append_3 = $(POLKIT_LIBS)
+@BUILD_NMCLI_TRUE@bin_PROGRAMS = nmcli$(EXEEXT)
+@BUILD_NMCLI_TRUE@@WITH_POLKIT_AGENT_TRUE@am__append_1 = $(POLKIT_CFLAGS)
+@BUILD_NMCLI_TRUE@@WITH_POLKIT_AGENT_TRUE@am__append_2 = $(srcdir)/../common/nm-polkit-listener.c $(srcdir)/../common/nm-polkit-listener.h
+@BUILD_NMCLI_TRUE@@WITH_POLKIT_AGENT_TRUE@am__append_3 = $(POLKIT_LIBS)
 subdir = clients/cli
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib_readline.m4 \
@@ -126,17 +126,21 @@ am__nmcli_SOURCES_DIST = agent.c agent.h common.c common.h \
 	$(srcdir)/../common/nm-vpn-helpers.h \
 	$(srcdir)/../common/nm-polkit-listener.c \
 	$(srcdir)/../common/nm-polkit-listener.h
-@WITH_POLKIT_AGENT_TRUE@am__objects_1 = nm-polkit-listener.$(OBJEXT)
-am_nmcli_OBJECTS = agent.$(OBJEXT) common.$(OBJEXT) \
-	connections.$(OBJEXT) devices.$(OBJEXT) general.$(OBJEXT) \
-	settings.$(OBJEXT) nmcli.$(OBJEXT) utils.$(OBJEXT) \
-	polkit-agent.$(OBJEXT) nm-secret-agent-simple.$(OBJEXT) \
-	nm-vpn-helpers.$(OBJEXT) $(am__objects_1)
+@BUILD_NMCLI_TRUE@@WITH_POLKIT_AGENT_TRUE@am__objects_1 = nm-polkit-listener.$(OBJEXT)
+@BUILD_NMCLI_TRUE@am_nmcli_OBJECTS = agent.$(OBJEXT) common.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	connections.$(OBJEXT) devices.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	general.$(OBJEXT) settings.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	nmcli.$(OBJEXT) utils.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	polkit-agent.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	nm-secret-agent-simple.$(OBJEXT) \
+@BUILD_NMCLI_TRUE@	nm-vpn-helpers.$(OBJEXT) $(am__objects_1)
 nmcli_OBJECTS = $(am_nmcli_OBJECTS)
 am__DEPENDENCIES_1 =
-@WITH_POLKIT_AGENT_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
-nmcli_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(top_builddir)/libnm/libnm.la $(am__DEPENDENCIES_2)
+@BUILD_NMCLI_TRUE@@WITH_POLKIT_AGENT_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@BUILD_NMCLI_TRUE@nmcli_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+@BUILD_NMCLI_TRUE@	$(am__DEPENDENCIES_1) \
+@BUILD_NMCLI_TRUE@	$(top_builddir)/libnm/libnm.la \
+@BUILD_NMCLI_TRUE@	$(am__DEPENDENCIES_2)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
@@ -219,7 +223,6 @@ BLUEZ5_LIBS = @BLUEZ5_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CKDB_PATH = @CKDB_PATH@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
 CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
@@ -231,8 +234,6 @@ CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DBUS_CFLAGS = @DBUS_CFLAGS@
-DBUS_GLIB_100_CFLAGS = @DBUS_GLIB_100_CFLAGS@
-DBUS_GLIB_100_LIBS = @DBUS_GLIB_100_LIBS@
 DBUS_LIBS = @DBUS_LIBS@
 DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
@@ -242,6 +243,7 @@ DHCPCD_PATH = @DHCPCD_PATH@
 DISTRO_NETWORK_SERVICE = @DISTRO_NETWORK_SERVICE@
 DLLTOOL = @DLLTOOL@
 DNSMASQ_PATH = @DNSMASQ_PATH@
+DNSSEC_TRIGGER_SCRIPT = @DNSSEC_TRIGGER_SCRIPT@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -296,16 +298,13 @@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
-IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
-IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAUDIT_CFLAGS = @LIBAUDIT_CFLAGS@
+LIBAUDIT_LIBS = @LIBAUDIT_LIBS@
 LIBDL = @LIBDL@
-LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
-LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
-LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBM = @LIBM@
@@ -342,6 +341,8 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
+NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
@@ -370,7 +371,6 @@ POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
 PPPD_PATH = @PPPD_PATH@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
-PPPOE_PATH = @PPPOE_PATH@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
@@ -385,6 +385,8 @@ SYSTEMD_200_CFLAGS = @SYSTEMD_200_CFLAGS@
 SYSTEMD_200_LIBS = @SYSTEMD_200_LIBS@
 SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
 SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_JOURNAL_CFLAGS = @SYSTEMD_JOURNAL_CFLAGS@
+SYSTEMD_JOURNAL_LIBS = @SYSTEMD_JOURNAL_LIBS@
 SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
 SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
@@ -445,6 +447,7 @@ mkdir_p = @mkdir_p@
 nmbinary = @nmbinary@
 nmconfdir = @nmconfdir@
 nmdatadir = @nmdatadir@
+nmlibdir = @nmlibdir@
 nmrundir = @nmrundir@
 nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
@@ -452,6 +455,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -467,30 +471,36 @@ with_dhcpcd = @with_dhcpcd@
 with_netconfig = @with_netconfig@
 with_resolvconf = @with_resolvconf@
 with_valgrind = @with_valgrind@
-AM_CPPFLAGS = -I${top_srcdir} -I${top_builddir} \
-	-I${top_srcdir}/include -I$(top_builddir)/include \
-	-I${top_srcdir}/libnm-core -I${top_builddir}/libnm-core \
-	-I${top_srcdir}/libnm -I${top_builddir}/libnm \
-	-I${top_srcdir}/clients/common $(GLIB_CFLAGS) \
-	-DG_LOG_DOMAIN=\""nmcli"\" \
-	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
-	-DNMCLI_LOCALEDIR=\"$(datadir)/locale\" \
-	-DNMCONFDIR=\"$(nmconfdir)\" -DNMLIBDIR=\"$(libdir)\" \
-	$(am__append_1)
-nmcli_SOURCES = agent.c agent.h common.c common.h connections.c \
-	connections.h devices.c devices.h general.c general.h \
-	settings.c settings.h nmcli.c nmcli.h utils.c utils.h \
-	polkit-agent.c polkit-agent.h \
-	$(srcdir)/../common/nm-secret-agent-simple.c \
-	$(srcdir)/../common/nm-secret-agent-simple.h \
-	$(srcdir)/../common/nm-vpn-helpers.c \
-	$(srcdir)/../common/nm-vpn-helpers.h $(NULL) $(am__append_2)
-nmcli_LDADD = $(GLIB_LIBS) $(READLINE_LIBS) \
-	$(top_builddir)/libnm/libnm.la $(am__append_3)
-@BUILD_SETTING_DOCS_TRUE@BUILT_SOURCES = settings-docs.c
-@BUILD_SETTING_DOCS_TRUE@CLEANFILES = settings-docs.c
-EXTRA_DIST = settings-docs.c settings-docs.xsl nmcli-completion
-completiondir = $(datadir)/bash-completion/completions
+@BUILD_NMCLI_TRUE@AM_CPPFLAGS = -I${top_srcdir} -I${top_builddir} \
+@BUILD_NMCLI_TRUE@	-I${top_srcdir}/shared \
+@BUILD_NMCLI_TRUE@	-I$(top_builddir)/shared \
+@BUILD_NMCLI_TRUE@	-I${top_srcdir}/libnm-core \
+@BUILD_NMCLI_TRUE@	-I${top_builddir}/libnm-core \
+@BUILD_NMCLI_TRUE@	-I${top_srcdir}/libnm \
+@BUILD_NMCLI_TRUE@	-I${top_builddir}/libnm \
+@BUILD_NMCLI_TRUE@	-I${top_srcdir}/clients/common \
+@BUILD_NMCLI_TRUE@	$(GLIB_CFLAGS) -DG_LOG_DOMAIN=\""nmcli"\" \
+@BUILD_NMCLI_TRUE@	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
+@BUILD_NMCLI_TRUE@	-DNMCLI_LOCALEDIR=\"$(datadir)/locale\" \
+@BUILD_NMCLI_TRUE@	$(am__append_1)
+@BUILD_NMCLI_TRUE@nmcli_SOURCES = agent.c agent.h common.c common.h \
+@BUILD_NMCLI_TRUE@	connections.c connections.h devices.c \
+@BUILD_NMCLI_TRUE@	devices.h general.c general.h settings.c \
+@BUILD_NMCLI_TRUE@	settings.h nmcli.c nmcli.h utils.c utils.h \
+@BUILD_NMCLI_TRUE@	polkit-agent.c polkit-agent.h \
+@BUILD_NMCLI_TRUE@	$(srcdir)/../common/nm-secret-agent-simple.c \
+@BUILD_NMCLI_TRUE@	$(srcdir)/../common/nm-secret-agent-simple.h \
+@BUILD_NMCLI_TRUE@	$(srcdir)/../common/nm-vpn-helpers.c \
+@BUILD_NMCLI_TRUE@	$(srcdir)/../common/nm-vpn-helpers.h $(NULL) \
+@BUILD_NMCLI_TRUE@	$(am__append_2)
+@BUILD_NMCLI_TRUE@nmcli_LDADD = $(GLIB_LIBS) $(READLINE_LIBS) \
+@BUILD_NMCLI_TRUE@	$(top_builddir)/libnm/libnm.la \
+@BUILD_NMCLI_TRUE@	$(am__append_3)
+@BUILD_NMCLI_TRUE@@BUILD_SETTING_DOCS_TRUE@BUILT_SOURCES = settings-docs.c
+@BUILD_NMCLI_TRUE@@BUILD_SETTING_DOCS_TRUE@CLEANFILES = settings-docs.c
+@BUILD_NMCLI_TRUE@EXTRA_DIST = settings-docs.c settings-docs.xsl \
+@BUILD_NMCLI_TRUE@	nmcli-completion
+@BUILD_NMCLI_TRUE@completiondir = $(datadir)/bash-completion/completions
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
 
@@ -790,6 +800,8 @@ maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
 	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+@BUILD_NMCLI_FALSE@install-data-hook:
+@BUILD_NMCLI_FALSE@uninstall-hook:
 clean: clean-am
 
 clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
@@ -883,15 +895,15 @@ uninstall-am: uninstall-binPROGRAMS
 .PRECIOUS: Makefile
 
 
-@BUILD_SETTING_DOCS_TRUE@settings-docs.c: settings-docs.xsl $(top_builddir)/libnm/nm-property-docs.xml
-@BUILD_SETTING_DOCS_TRUE@	$(AM_V_GEN) xsltproc --output $@ $^
+@BUILD_NMCLI_TRUE@@BUILD_SETTING_DOCS_TRUE@settings-docs.c: settings-docs.xsl $(top_builddir)/libnm/nm-property-docs.xml
+@BUILD_NMCLI_TRUE@@BUILD_SETTING_DOCS_TRUE@	$(AM_V_GEN) xsltproc --output $@ $^
 
-install-data-hook:
-	$(mkinstalldirs) $(DESTDIR)$(completiondir)
-	$(INSTALL_DATA) $(srcdir)/nmcli-completion $(DESTDIR)$(completiondir)/nmcli
+@BUILD_NMCLI_TRUE@install-data-hook:
+@BUILD_NMCLI_TRUE@	$(mkinstalldirs) $(DESTDIR)$(completiondir)
+@BUILD_NMCLI_TRUE@	$(INSTALL_DATA) $(srcdir)/nmcli-completion $(DESTDIR)$(completiondir)/nmcli
 
-uninstall-hook:
-	rm -f $(DESTDIR)$(completiondir)/nmcli
+@BUILD_NMCLI_TRUE@uninstall-hook:
+@BUILD_NMCLI_TRUE@	rm -f $(DESTDIR)$(completiondir)/nmcli
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/clients/cli/agent.c b/clients/cli/agent.c
index 1695ed59..c4ff3f9e 100644
--- a/clients/cli/agent.c
+++ b/clients/cli/agent.c
@@ -21,8 +21,6 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -30,6 +28,7 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#include "nm-default.h"
 #include "common.h"
 #include "utils.h"
 #include "nm-secret-agent-simple.h"
@@ -145,7 +144,7 @@ do_agent_secret (NmCli *nmc, int argc, char **argv)
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-agent");
 	if (nmc->secret_agent) {
 		/* We keep running */
-		nmc->should_wait = TRUE;
+		nmc->should_wait++;
 
 		nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent), NULL);
 		g_signal_connect (nmc->secret_agent, "request-secrets", G_CALLBACK (secrets_requested), nmc);
@@ -172,7 +171,7 @@ do_agent_polkit (NmCli *nmc, int argc, char **argv)
 		g_error_free (error);
 	} else {
 		/* We keep running */
-		nmc->should_wait = TRUE;
+		nmc->should_wait++;
 
 		g_print (_("nmcli successfully registered as a polkit agent.\n"));
 	}
diff --git a/clients/cli/common.c b/clients/cli/common.c
index 86f91d58..daacce7c 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -21,59 +21,58 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
+#include <termios.h>
+#include <sys/ioctl.h>
 
 #include <readline/readline.h>
 #include <readline/history.h>
 
-#include "nm-glib-compat.h"
-
+#include "nm-default.h"
 #include "nm-vpn-helpers.h"
 #include "common.h"
 #include "utils.h"
 
 /* Available fields for IPv4 group */
 NmcOutputField nmc_fields_ip4_config[] = {
-	{"GROUP",      N_("GROUP"),       15},  /* 0 */
-	{"ADDRESS",    N_("ADDRESS"),     68},  /* 1 */
-	{"GATEWAY",    N_("GATEWAY"),      0},  /* 2 */
-	{"ROUTE",      N_("ROUTE"),       68},  /* 3 */
-	{"DNS",        N_("DNS"),         35},  /* 4 */
-	{"DOMAIN",     N_("DOMAIN"),      35},  /* 5 */
-	{"WINS",       N_("WINS"),        20},  /* 6 */
-	{NULL,         NULL,               0}
+	{"GROUP",      N_("GROUP")},    /* 0 */
+	{"ADDRESS",    N_("ADDRESS")},  /* 1 */
+	{"GATEWAY",    N_("GATEWAY")},  /* 2 */
+	{"ROUTE",      N_("ROUTE")},    /* 3 */
+	{"DNS",        N_("DNS")},      /* 4 */
+	{"DOMAIN",     N_("DOMAIN")},   /* 5 */
+	{"WINS",       N_("WINS")},     /* 6 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_IP4_CONFIG_ALL     "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN,WINS"
 
 /* Available fields for DHCPv4 group */
 NmcOutputField nmc_fields_dhcp4_config[] = {
-	{"GROUP",      N_("GROUP"),       15},  /* 0 */
-	{"OPTION",     N_("OPTION"),      80},  /* 1 */
-	{NULL,         NULL,               0}
+	{"GROUP",      N_("GROUP")},   /* 0 */
+	{"OPTION",     N_("OPTION")},  /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DHCP4_CONFIG_ALL     "GROUP,OPTION"
 
 /* Available fields for IPv6 group */
 NmcOutputField nmc_fields_ip6_config[] = {
-	{"GROUP",      N_("GROUP"),       15},  /* 0 */
-	{"ADDRESS",    N_("ADDRESS"),     95},  /* 1 */
-	{"GATEWAY",    N_("GATEWAY"),      0},  /* 2 */
-	{"ROUTE",      N_("ROUTE"),       95},  /* 3 */
-	{"DNS",        N_("DNS"),         60},  /* 4 */
-	{"DOMAIN",     N_("DOMAIN"),      35},  /* 5 */
-	{NULL,         NULL,               0}
+	{"GROUP",      N_("GROUP")},    /* 0 */
+	{"ADDRESS",    N_("ADDRESS")},  /* 1 */
+	{"GATEWAY",    N_("GATEWAY")},  /* 2 */
+	{"ROUTE",      N_("ROUTE")},    /* 3 */
+	{"DNS",        N_("DNS")},      /* 4 */
+	{"DOMAIN",     N_("DOMAIN")},   /* 5 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_IP6_CONFIG_ALL     "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN"
 
 /* Available fields for DHCPv6 group */
 NmcOutputField nmc_fields_dhcp6_config[] = {
-	{"GROUP",      N_("GROUP"),       15},  /* 0 */
-	{"OPTION",     N_("OPTION"),      80},  /* 1 */
-	{NULL,         NULL,               0}
+	{"GROUP",      N_("GROUP")},   /* 0 */
+	{"OPTION",     N_("OPTION")},  /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DHCP6_CONFIG_ALL     "GROUP,OPTION"
 
@@ -1009,6 +1008,7 @@ get_secrets_from_user (const char *request_id,
                        const char *msg,
                        NMConnection *connection,
                        gboolean ask,
+                       gboolean echo_on,
                        GHashTable *pwds_hash,
                        GPtrArray *secrets)
 {
@@ -1039,7 +1039,7 @@ get_secrets_from_user (const char *request_id,
 					}
 				}
 				g_print ("%s\n", msg);
-				pwd = nmc_readline ("%s (%s): ", secret->name, secret->prop_name);
+				pwd = nmc_readline_echo (echo_on, "%s (%s): ", secret->name, secret->prop_name);
 				if (!pwd)
 					pwd = g_strdup ("");
 			} else {
@@ -1099,7 +1099,7 @@ nmc_secrets_requested (NMSecretAgentSimple *agent,
 	}
 
 	success = get_secrets_from_user (request_id, title, msg, connection, nmc->in_editor || nmc->ask,
-	                                 nmc->pwds_hash, secrets);
+	                                 nmc->show_secrets, nmc->pwds_hash, secrets);
 	if (success)
 		nm_secret_agent_simple_response (agent, request_id, secrets);
 	else {
@@ -1109,9 +1109,32 @@ nmc_secrets_requested (NMSecretAgentSimple *agent,
 			nm_secret_agent_old_unregister (nmc->secret_agent, NULL, NULL);
 			g_clear_object (&nmc->secret_agent);
 		}
-        }
+	}
 }
 
+char *
+nmc_unique_connection_name (const GPtrArray *connections, const char *try_name)
+{
+	NMConnection *connection;
+	const char *name;
+	char *new_name;
+	unsigned int num = 1;
+	int i = 0;
+
+	new_name = g_strdup (try_name);
+	while (i < connections->len) {
+		connection = NM_CONNECTION (connections->pdata[i]);
+
+		name = nm_connection_get_id (connection);
+		if (g_strcmp0 (new_name, name) == 0) {
+			g_free (new_name);
+			new_name = g_strdup_printf ("%s-%d", try_name, num++);
+			i = 0;
+		} else
+			i++;
+	}
+	return new_name;
+}
 
 /**
  * nmc_cleanup_readline:
@@ -1152,29 +1175,12 @@ nmc_set_in_readline (gboolean in_readline)
 /* Global variable defined in nmcli.c */
 extern NmCli nm_cli;
 
-/**
- * nmc_readline:
- * @prompt_fmt: prompt to print (telling user what to enter). It is standard
- *   printf() format string
- * @...: a list of arguments according to the @prompt_fmt format string
- *
- * Wrapper around libreadline's readline() function.
- * If user pressed Ctrl-C, readline() is called again (if not in editor and
- * line is empty, nmcli will quit).
- * If user pressed Ctrl-D on empty line, nmcli will quit.
- *
- * Returns: the user provided string. In case the user entered empty string,
- * this function returns NULL.
- */
-char *
-nmc_readline (const char *prompt_fmt, ...)
-{
-	va_list args;
-	char *prompt, *str;
 
-	va_start (args, prompt_fmt);
-	prompt = g_strdup_vprintf (prompt_fmt, args);
-	va_end (args);
+static char *
+nmc_readline_helper (const char *prompt)
+{
+	char *str;
+	int b;
 
 readline_mark:
 	/* We are in readline -> Ctrl-C should not quit nmcli */
@@ -1183,6 +1189,13 @@ readline_mark:
 	/* We are outside readline -> Ctrl-C should quit nmcli */
 	nmc_set_in_readline (FALSE);
 
+	/* Check for an I/O error by attempting to peek into the input buffer.
+	 * Readline just inserts newlines when errors occur so we need to check ourselves. */
+	if (ioctl (0, FIONREAD, &b) == -1) {
+		g_free (str);
+		str = NULL;
+	}
+
 	/* Add string to the history */
 	if (str && *str)
 		add_history (str);
@@ -1215,7 +1228,6 @@ readline_mark:
 				sleep (3);
 		}
 	}
-	g_free (prompt);
 
 	/* Return NULL, not empty string */
 	if (str && *str == '\0') {
@@ -1226,6 +1238,76 @@ readline_mark:
 }
 
 /**
+ * nmc_readline:
+ * @prompt_fmt: prompt to print (telling user what to enter). It is standard
+ *   printf() format string
+ * @...: a list of arguments according to the @prompt_fmt format string
+ *
+ * Wrapper around libreadline's readline() function.
+ * If user pressed Ctrl-C, readline() is called again (if not in editor and
+ * line is empty, nmcli will quit).
+ * If user pressed Ctrl-D on empty line, nmcli will quit.
+ *
+ * Returns: the user provided string. In case the user entered empty string,
+ * this function returns NULL.
+ */
+char *
+nmc_readline (const char *prompt_fmt, ...)
+{
+	va_list args;
+	char *prompt, *str;
+
+	va_start (args, prompt_fmt);
+	prompt = g_strdup_vprintf (prompt_fmt, args);
+	va_end (args);
+
+	str = nmc_readline_helper (prompt);
+
+	g_free (prompt);
+
+	return str;
+}
+
+/**
+ * nmc_readline_echo:
+ *
+ * The same as nmc_readline() except it can disable echoing of input characters if @echo_on is %FALSE.
+ * nmc_readline(TRUE, ...) == nmc_readline(...)
+ */
+char *
+nmc_readline_echo (gboolean echo_on, const char *prompt_fmt, ...)
+{
+	va_list args;
+	char *prompt, *str;
+	struct termios termios_orig, termios_new;
+
+	va_start (args, prompt_fmt);
+	prompt = g_strdup_vprintf (prompt_fmt, args);
+	va_end (args);
+
+	/* Disable echoing characters */
+	if (!echo_on) {
+		tcgetattr (STDIN_FILENO, &termios_orig);
+		termios_new = termios_orig;
+		termios_new.c_lflag &= ~(ECHO);
+		tcsetattr (STDIN_FILENO, TCSADRAIN, &termios_new);
+	}
+
+	str = nmc_readline_helper (prompt);
+
+	g_free (prompt);
+
+	/* Restore original terminal settings */
+	if (!echo_on) {
+		tcsetattr (STDIN_FILENO, TCSADRAIN, &termios_orig);
+		/* New line - setting ECHONL | ICANON did not help */
+		fprintf (stdout, "\n");
+	}
+
+	return str;
+}
+
+/**
  * nmc_rl_gen_func_basic:
  * @text: text to complete
  * @state: readline state; says whether start from scratch (state == 0)
@@ -1270,3 +1352,46 @@ nmc_rl_set_deftext (void)
 	return 0;
 }
 
+/**
+ * nmc_parse_lldp_capabilities:
+ * @value: the capabilities value
+ *
+ * Parses LLDP capabilities flags
+ *
+ * Returns: a newly allocated string containing capabilities names separated by commas.
+ */
+char *
+nmc_parse_lldp_capabilities (guint value)
+{
+	/* IEEE Std 802.1AB-2009 - Table 8.4 */
+	const char *names[] = { "other", "repeater", "mac-bridge", "wlan-access-point",
+	                        "router", "telephone", "docsis-cable-device", "station-only",
+	                        "c-vlan-component", "s-vlan-component", "tpmr" };
+	gboolean first = TRUE;
+	GString *str;
+	int i;
+
+	if (!value)
+		return g_strdup ("none");
+
+	str = g_string_new ("");
+
+	for (i = 0; i < G_N_ELEMENTS (names); i++) {
+		if (value & (1 << i)) {
+			if (!first)
+				g_string_append_c (str, ',');
+
+			first = FALSE;
+			value &= ~(1 << i);
+			g_string_append (str, names[i]);
+		}
+	}
+
+	if (value) {
+		if (!first)
+			g_string_append_c (str, ',');
+		g_string_append (str, "reserved");
+	}
+
+	return g_string_free (str, FALSE);
+}
diff --git a/clients/cli/common.h b/clients/cli/common.h
index bb3f44e8..26459e4b 100644
--- a/clients/cli/common.h
+++ b/clients/cli/common.h
@@ -57,8 +57,12 @@ void nmc_secrets_requested (NMSecretAgentSimple *agent,
                             GPtrArray           *secrets,
                             gpointer             user_data);
 
+char *nmc_unique_connection_name (const GPtrArray *connections,
+                                  const char *try_name);
+
 void nmc_cleanup_readline (void);
 char *nmc_readline (const char *prompt_fmt, ...) G_GNUC_PRINTF (1, 2);
+char *nmc_readline_echo (gboolean echo_on, const char *prompt_fmt, ...) G_GNUC_PRINTF (2, 3);
 char *nmc_rl_gen_func_basic (const char *text, int state, const char **words);
 gboolean nmc_get_in_readline (void);
 void nmc_set_in_readline (gboolean in_readline);
@@ -67,4 +71,6 @@ void nmc_set_in_readline (gboolean in_readline);
 extern char *nmc_rl_pre_input_deftext;
 int nmc_rl_set_deftext (void);
 
+char *nmc_parse_lldp_capabilities (guint value);
+
 #endif /* NMC_COMMON_H */
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index e5aaa658..9ab926a0 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -14,13 +14,11 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -31,12 +29,14 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#include "nm-default.h"
 #include "utils.h"
 #include "common.h"
 #include "settings.h"
 #include "connections.h"
 #include "nm-secret-agent-simple.h"
 #include "polkit-agent.h"
+#include "nm-vpn-helpers.h"
 
 /* define some prompts for connection editor */
 #define EDITOR_PROMPT_SETTING  _("Setting name? ")
@@ -46,32 +46,45 @@
 /* define some other prompts */
 #define PROMPT_CON_TYPE    _("Connection type: ")
 #define PROMPT_VPN_TYPE    _("VPN type: ")
-#define PROMPT_BOND_MASTER _("Bond master: ")
-#define PROMPT_TEAM_MASTER _("Team master: ")
-#define PROMPT_BRIDGE_MASTER _("Bridge master: ")
+#define PROMPT_MASTER      _("Master: ")
 #define PROMPT_CONNECTION  _("Connection (name, UUID, or path): ")
+#define PROMPT_VPN_CONNECTION  _("VPN 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",
-	  "ssh", "l2tp", "iodine", NULL };
+#define PROMPT_ACTIVE_CONNECTIONS _("Connection(s) (name, UUID, path or apath): ")
+#define PROMPT_IP_TUNNEL_MODE _("Tunnel mode: ")
+#define PROMPT_MACVLAN_MODE _("MACVLAN mode: ")
+
+static const char *nmc_known_vpns[] = {
+	"openvpn",
+	"vpnc",
+	"pptp",
+	"openconnect",
+	"openswan",
+	"libreswan",
+	"strongswan",
+	"ssh",
+	"l2tp",
+	"iodine",
+	"fortisslvpn",
+	NULL
+};
 
 /* Available fields for 'connection show' */
 static NmcOutputField nmc_fields_con_show[] = {
-	{"NAME",            N_("NAME"),           25},  /* 0 */
-	{"UUID",            N_("UUID"),           38},  /* 1 */
-	{"TYPE",            N_("TYPE"),           17},  /* 2 */
-	{"TIMESTAMP",       N_("TIMESTAMP"),      12},  /* 3 */
-	{"TIMESTAMP-REAL",  N_("TIMESTAMP-REAL"), 34},  /* 4 */
-	{"AUTOCONNECT",     N_("AUTOCONNECT"),    13},  /* 5 */
-	{"AUTOCONNECT-PRIORITY", N_("AUTOCONNECT-PRIORITY"), 10},  /* 6 */
-	{"READONLY",        N_("READONLY"),       10},  /* 7 */
-	{"DBUS-PATH",       N_("DBUS-PATH"),      42},  /* 8 */
-	{"ACTIVE",          N_("ACTIVE"),         10},  /* 9 */
-	{"DEVICE",          N_("DEVICE"),         10},  /* 10 */
-	{"STATE",           N_("STATE"),          12},  /* 11 */
-	{"ACTIVE-PATH",     N_("ACTIVE-PATH"),    51},  /* 12 */
-	{NULL,              NULL,                  0}
+	{"NAME",                 N_("NAME")},                  /* 0 */
+	{"UUID",                 N_("UUID")},                  /* 1 */
+	{"TYPE",                 N_("TYPE")},                  /* 2 */
+	{"TIMESTAMP",            N_("TIMESTAMP")},             /* 3 */
+	{"TIMESTAMP-REAL",       N_("TIMESTAMP-REAL")},        /* 4 */
+	{"AUTOCONNECT",          N_("AUTOCONNECT")},           /* 5 */
+	{"AUTOCONNECT-PRIORITY", N_("AUTOCONNECT-PRIORITY")},  /* 6 */
+	{"READONLY",             N_("READONLY")},              /* 7 */
+	{"DBUS-PATH",            N_("DBUS-PATH")},             /* 8 */
+	{"ACTIVE",               N_("ACTIVE")},                /* 9 */
+	{"DEVICE",               N_("DEVICE")},                /* 10 */
+	{"STATE",                N_("STATE")},                 /* 11 */
+	{"ACTIVE-PATH",          N_("ACTIVE-PATH")},           /* 12 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_CON_SHOW_ALL     "NAME,UUID,TYPE,TIMESTAMP,TIMESTAMP-REAL,AUTOCONNECT,AUTOCONNECT-PRIORITY,READONLY,DBUS-PATH,"\
                                     "ACTIVE,DEVICE,STATE,ACTIVE-PATH"
@@ -106,6 +119,10 @@ extern NmcOutputField nmc_fields_setting_bridge_port[];
 extern NmcOutputField nmc_fields_setting_team[];
 extern NmcOutputField nmc_fields_setting_team_port[];
 extern NmcOutputField nmc_fields_setting_dcb[];
+extern NmcOutputField nmc_fields_setting_tun[];
+extern NmcOutputField nmc_fields_setting_ip_tunnel[];
+extern NmcOutputField nmc_fields_setting_macvlan[];
+extern NmcOutputField nmc_fields_setting_vxlan[];
 
 /* Available settings for 'connection show <con>' - profile part */
 static NmcOutputField nmc_fields_settings_names[] = {
@@ -134,6 +151,10 @@ static NmcOutputField nmc_fields_settings_names[] = {
 	SETTING_FIELD (NM_SETTING_TEAM_SETTING_NAME,              nmc_fields_setting_team + 1),              /* 22 */
 	SETTING_FIELD (NM_SETTING_TEAM_PORT_SETTING_NAME,         nmc_fields_setting_team_port + 1),         /* 23 */
 	SETTING_FIELD (NM_SETTING_DCB_SETTING_NAME,               nmc_fields_setting_dcb + 1),               /* 24 */
+	SETTING_FIELD (NM_SETTING_TUN_SETTING_NAME,               nmc_fields_setting_tun + 1),               /* 25 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_SETTING_NAME,         nmc_fields_setting_ip_tunnel + 1),         /* 26 */
+	SETTING_FIELD (NM_SETTING_MACVLAN_SETTING_NAME,           nmc_fields_setting_macvlan + 1),           /* 27 */
+	SETTING_FIELD (NM_SETTING_VXLAN_SETTING_NAME,             nmc_fields_setting_vxlan + 1),             /* 28 */
 	{NULL, NULL, 0, NULL, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTINGS_NAMES_ALL_X  NM_SETTING_CONNECTION_SETTING_NAME","\
@@ -159,31 +180,30 @@ static NmcOutputField nmc_fields_settings_names[] = {
                                          NM_SETTING_BRIDGE_PORT_SETTING_NAME","\
                                          NM_SETTING_TEAM_SETTING_NAME","\
                                          NM_SETTING_TEAM_PORT_SETTING_NAME"," \
-                                         NM_SETTING_DCB_SETTING_NAME
-#if WITH_WIMAX
-#define NMC_FIELDS_SETTINGS_NAMES_ALL    NMC_FIELDS_SETTINGS_NAMES_ALL_X","\
-                                         NM_SETTING_WIMAX_SETTING_NAME
-#else
+                                         NM_SETTING_DCB_SETTING_NAME"," \
+                                         NM_SETTING_TUN_SETTING_NAME"," \
+                                         NM_SETTING_IP_TUNNEL_SETTING_NAME"," \
+                                         NM_SETTING_MACVLAN_SETTING_NAME"," \
+                                         NM_SETTING_VXLAN_SETTING_NAME
 #define NMC_FIELDS_SETTINGS_NAMES_ALL    NMC_FIELDS_SETTINGS_NAMES_ALL_X
-#endif
 
 /* Active connection data */
 /* Available fields for GENERAL group */
 static NmcOutputField nmc_fields_con_active_details_general[] = {
-	{"GROUP",         N_("GROUP"),         9},  /* 0 */
-	{"NAME",          N_("NAME"),         25},  /* 1 */
-	{"UUID",          N_("UUID"),         38},  /* 2 */
-	{"DEVICES",       N_("DEVICES"),      10},  /* 3 */
-	{"STATE",         N_("STATE"),        12},  /* 4 */
-	{"DEFAULT",       N_("DEFAULT"),       8},  /* 5 */
-	{"DEFAULT6",      N_("DEFAULT6"),      9},  /* 6 */
-	{"SPEC-OBJECT",   N_("SPEC-OBJECT"),  10},  /* 7 */
-	{"VPN",           N_("VPN"),           5},  /* 8 */
-	{"DBUS-PATH",     N_("DBUS-PATH"),    51},  /* 9 */
-	{"CON-PATH",      N_("CON-PATH"),     44},  /* 10 */
-	{"ZONE",          N_("ZONE"),         15},  /* 11 */
-	{"MASTER-PATH",   N_("MASTER-PATH"),  44},  /* 12 */
-	{NULL,            NULL,                0}
+	{"GROUP",         N_("GROUP")},        /* 0 */
+	{"NAME",          N_("NAME")},         /* 1 */
+	{"UUID",          N_("UUID")},         /* 2 */
+	{"DEVICES",       N_("DEVICES")},      /* 3 */
+	{"STATE",         N_("STATE")},        /* 4 */
+	{"DEFAULT",       N_("DEFAULT")},      /* 5 */
+	{"DEFAULT6",      N_("DEFAULT6")},     /* 6 */
+	{"SPEC-OBJECT",   N_("SPEC-OBJECT")},  /* 7 */
+	{"VPN",           N_("VPN")},          /* 8 */
+	{"DBUS-PATH",     N_("DBUS-PATH")},    /* 9 */
+	{"CON-PATH",      N_("CON-PATH")},     /* 10 */
+	{"ZONE",          N_("ZONE")},         /* 11 */
+	{"MASTER-PATH",   N_("MASTER-PATH")},  /* 12 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL  "GROUP,NAME,UUID,DEVICES,STATE,DEFAULT,DEFAULT6,"\
                                                    "VPN,ZONE,DBUS-PATH,CON-PATH,SPEC-OBJECT,MASTER-PATH"
@@ -192,14 +212,14 @@ static NmcOutputField nmc_fields_con_active_details_general[] = {
 
 /* Available fields for VPN group */
 static NmcOutputField nmc_fields_con_active_details_vpn[] = {
-	{"GROUP",     N_("GROUP"),       9},  /* 0 */
-	{"TYPE",      N_("TYPE"),       15},  /* 1 */
-	{"USERNAME",  N_("USERNAME"),   15},  /* 2 */
-	{"GATEWAY",   N_("GATEWAY"),    25},  /* 3 */
-	{"BANNER",    N_("BANNER"),    120},  /* 4 */
-	{"VPN-STATE", N_("VPN-STATE"),  40},  /* 5 */
-	{"CFG",       N_("CFG"),       120},  /* 6 */
-	{NULL, NULL, 0}
+	{"GROUP",     N_("GROUP")},      /* 0 */
+	{"TYPE",      N_("TYPE")},       /* 1 */
+	{"USERNAME",  N_("USERNAME")},   /* 2 */
+	{"GATEWAY",   N_("GATEWAY")},    /* 3 */
+	{"BANNER",    N_("BANNER")},     /* 4 */
+	{"VPN-STATE", N_("VPN-STATE")},  /* 5 */
+	{"CFG",       N_("CFG")},        /* 6 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL  "GROUP,TYPE,USERNAME,GATEWAY,BANNER,VPN-STATE,CFG"
 
@@ -251,21 +271,22 @@ static void
 usage (void)
 {
 	g_printerr (_("Usage: nmcli connection { COMMAND | help }\n\n"
-	              "COMMAND := { show | up | down | add | modify | edit | delete | reload | load }\n\n"
-	              "  show [--active] [[--show-secrets] [id | uuid | path | apath] <ID>] ...\n\n"
-#if WITH_WIMAX
-	              "  up [[id | uuid | path] <ID>] [ifname <ifname>] [ap <BSSID>] [nsp <name>] [passwd-file <file with passwords>]\n\n"
-#else
+	              "COMMAND := { show | up | down | add | modify | edit | delete | monitor | reload | load }\n\n"
+	              "  show [--active] [--order <order spec>]\n"
+	              "  show [--active] [id | uuid | path | apath] <ID> ...\n\n"
 	              "  up [[id | uuid | path] <ID>] [ifname <ifname>] [ap <BSSID>] [passwd-file <file with passwords>]\n\n"
-#endif
 	              "  down [id | uuid | path | apath] <ID> ...\n\n"
-	              "  add COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS IP_OPTIONS\n\n"
+	              "  add COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS SLAVE_OPTIONS IP_OPTIONS [-- ([+|-]<setting>.<property> <value>)+]\n\n"
 	              "  modify [--temporary] [id | uuid | path] <ID> ([+|-]<setting>.<property> <value>)+\n\n"
+	              "  clone [--temporary] [id | uuid | path ] <ID> <new name>\n\n"
 	              "  edit [id | uuid | path] <ID>\n"
 	              "  edit [type <new_con_type>] [con-name <new_con_name>]\n\n"
 	              "  delete [id | uuid | path] <ID>\n\n"
+	              "  monitor [id | uuid | path] <ID> ...\n\n"
 	              "  reload\n\n"
-	              "  load <filename> [ <filename>... ]\n\n"));
+	              "  load <filename> [ <filename>... ]\n\n"
+	              "  import [--temporary] type <type> file <file to import>\n\n"
+	              "  export [id | uuid | path] <ID> [<output file>]\n\n"));
 }
 
 static void
@@ -273,20 +294,20 @@ usage_connection_show (void)
 {
 	g_printerr (_("Usage: nmcli connection show { ARGUMENTS | help }\n"
 	              "\n"
-	              "ARGUMENTS := [--active]\n"
+	              "ARGUMENTS := [--active] [--order <order spec>]\n"
 	              "\n"
 	              "List in-memory and on-disk connection profiles, some of which may also be\n"
 	              "active if a device is using that connection profile. Without a parameter, all\n"
 	              "profiles are listed. When --active option is specified, only the active\n"
-	              "profiles are shown.\n"
+	              "profiles are shown. --order allows custom connection ordering (see manual page).\n"
 	              "\n"
-	              "ARGUMENTS := [--active] [--show-secrets] [id | uuid | path | apath] <ID> ...\n"
+	              "ARGUMENTS := [--active] [id | uuid | path | apath] <ID> ...\n"
 	              "\n"
 	              "Show details for specified connections. By default, both static configuration\n"
 	              "and active connection data are displayed. It is possible to filter the output\n"
 	              "using global '--fields' option. Refer to the manual page for more information.\n"
 	              "When --active option is specified, only the active profiles are taken into\n"
-	              "account. --show-secrets option will reveal associated secrets as well.\n"));
+	              "account. Use global --show-secrets option to reveal associated secrets as well.\n"));
 }
 
 static void
@@ -327,13 +348,15 @@ usage_connection_add (void)
 {
 	g_printerr (_("Usage: nmcli connection add { ARGUMENTS | help }\n"
 	              "\n"
-	              "ARGUMENTS := COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS IP_OPTIONS\n\n"
+	              "ARGUMENTS := COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS SLAVE_OPTIONS IP_OPTIONS [-- ([+|-]<setting>.<property> <value>)+]\n\n"
 	              "  COMMON_OPTIONS:\n"
 	              "                  type <type>\n"
 	              "                  ifname <interface name> | \"*\"\n"
 	              "                  [con-name <connection name>]\n"
-	              "                  [autoconnect yes|no]\n\n"
-	              "                  [save yes|no]\n\n"
+	              "                  [autoconnect yes|no]\n"
+	              "                  [save yes|no]\n"
+	              "                  [master <master (ifname, or connection UUID or name)>]\n"
+	              "                  [slave-type <master connection type>]\n\n"
 	              "  TYPE_SPECIFIC_OPTIONS:\n"
 	              "    ethernet:     [mac <MAC address>]\n"
 	              "                  [cloned-mac <cloned MAC address>]\n"
@@ -362,7 +385,7 @@ usage_connection_add (void)
 	              "                  [p-key <IPoIB P_Key>]\n\n"
 	              "    bluetooth:    [addr <bluetooth address>]\n"
 	              "                  [bt-type panu|dun-gsm|dun-cdma]\n\n"
-	              "    vlan:         dev <parent device (connection  UUID, ifname, or MAC)>\n"
+	              "    vlan:         dev <parent device (connection UUID, ifname, or MAC)>\n"
 	              "                  id <VLAN ID>\n"
 	              "                  [flags <VLAN flags>]\n"
 	              "                  [ingress <ingress priority mapping>]\n"
@@ -387,6 +410,7 @@ usage_connection_add (void)
 	              "                  [hello-time <1-10>]\n"
 	              "                  [max-age <6-40>]\n"
 	              "                  [ageing-time <0-1000000>]\n"
+	              "                  [multicast-snooping yes|no]\n"
 	              "                  [mac <MAC address>]\n\n"
 	              "    bridge-slave: master <master (ifname, or connection UUID or name)>\n"
 	              "                  [priority <0-63>]\n"
@@ -401,6 +425,31 @@ usage_connection_add (void)
 	              "                  protocol pppoa|pppoe|ipoatm\n"
 	              "                  [password <password>]\n"
 	              "                  [encapsulation vcmux|llc]\n\n"
+	              "    tun:          mode tun|tap\n"
+	              "                  [owner <UID>]\n"
+	              "                  [group <GID>]\n"
+	              "                  [pi yes|no]\n"
+	              "                  [vnet-hdr yes|no]\n"
+	              "                  [multi-queue yes|no]\n\n"
+	              "    ip-tunnel:    mode ipip|gre|sit|isatap|vti|ip6ip6|ipip6|ip6gre|vti6\n"
+	              "                  remote <remote endpoint IP>\n"
+	              "                  [local <local endpoint IP>]\n"
+	              "                  [dev <parent device (ifname or connection UUID)>]\n\n"
+	              "    macvlan:      dev <parent device (connection UUID, ifname, or MAC)>\n"
+	              "                  mode vepa|bridge|private|passthru|source\n"
+	              "                  [tap yes|no]\n\n"
+	              "    vxlan:        id <VXLAN ID>\n"
+	              "                  remote <IP of multicast group or remote address>\n"
+	              "                  [local <source IP>]\n"
+	              "                  [dev <parent device (ifname or connection UUID)>]\n"
+	              "                  [source-port-min <0-65535>]\n"
+	              "                  [source-port-max <0-65535>]\n"
+	              "                  [destination-port <0-65535>]\n\n"
+	              "  SLAVE_OPTIONS:\n"
+	              "    bridge:       [priority <0-63>]\n"
+	              "                  [path-cost <1-65535>]\n"
+	              "                  [hairpin yes|no]\n\n"
+	              "    team:         [config <file>|<raw JSON data>]\n\n"
 	              "  IP_OPTIONS:\n"
 	              "                  [ip4 <IPv4 address>] [gw4 <IPv4 gateway>]\n"
 	              "                  [ip6 <IPv6 address>] [gw6 <IPv6 gateway>]\n\n"));
@@ -430,6 +479,18 @@ usage_connection_modify (void)
 }
 
 static void
+usage_connection_clone (void)
+{
+	g_printerr (_("Usage: nmcli connection clone { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := [--temporary] [id | uuid | path] <ID> <new name>\n"
+	              "\n"
+	              "Clone an existing connection profile. The newly created connection will be\n"
+	              "the exact copy of the <ID>, except the uuid property (will be generated) and\n"
+	              "id (provided as <new name> argument).\n\n"));
+}
+
+static void
 usage_connection_edit (void)
 {
 	g_printerr (_("Usage: nmcli connection edit { ARGUMENTS | help }\n"
@@ -456,6 +517,18 @@ usage_connection_delete (void)
 }
 
 static void
+usage_connection_monitor (void)
+{
+	g_printerr (_("Usage: nmcli connection monitor { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := [id | uuid | path] <ID> ...\n"
+	              "\n"
+	              "Monitor connection profile activity.\n"
+	              "This command prints a line whenever the specified connection changes.\n"
+	              "Monitors all connection profiles in case none is specified.\n\n"));
+}
+
+static void
 usage_connection_reload (void)
 {
 	g_printerr (_("Usage: nmcli connection reload { help }\n"
@@ -475,6 +548,30 @@ usage_connection_load (void)
 	              "state.\n\n"));
 }
 
+static void
+usage_connection_import (void)
+{
+	g_printerr (_("Usage: nmcli connection import { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := [--temporary] type <type> file <file to import>\n"
+	              "\n"
+	              "Import an external/foreign configuration as a NetworkManager connection profile.\n"
+	              "The type of the input file is specified by type option.\n"
+	              "Only VPN configurations are supported at the moment. The configuration\n"
+	              "is imported by NetworkManager VPN plugins.\n\n"));
+}
+
+static void
+usage_connection_export (void)
+{
+	g_printerr (_("Usage: nmcli connection export { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := [id | uuid | path] <ID> [<output file>]\n"
+	              "\n"
+	              "Export a connection. Only VPN connections are supported at the moment.\n"
+	              "The data are directed to standard output or to a file if a name is given.\n\n"));
+}
+
 static gboolean
 usage_connection_second_level (const char *cmd)
 {
@@ -490,14 +587,22 @@ usage_connection_second_level (const char *cmd)
 		usage_connection_add ();
 	else if (matches (cmd, "modify") == 0)
 		usage_connection_modify ();
+	else if (matches (cmd, "clone") == 0)
+		usage_connection_clone ();
 	else if (matches (cmd, "edit") == 0)
 		usage_connection_edit ();
 	else if (matches (cmd, "delete") == 0)
 		usage_connection_delete ();
+	else if (matches (cmd, "monitor") == 0)
+		usage_connection_monitor ();
 	else if (matches (cmd, "reload") == 0)
 		usage_connection_reload ();
 	else if (matches (cmd, "load") == 0)
 		usage_connection_load ();
+	else if (matches (cmd, "import") == 0)
+		usage_connection_import ();
+	else if (matches (cmd, "export") == 0)
+		usage_connection_export ();
 	else
 		ret = FALSE;
 	return ret;
@@ -769,10 +874,8 @@ find_active_connection (const GPtrArray *active_cons,
 }
 
 static void
-fill_output_connection (gpointer data, gpointer user_data, gboolean active_only)
+fill_output_connection (NMConnection *connection, NmCli *nmc, gboolean active_only)
 {
-	NMConnection *connection = (NMConnection *) data;
-	NmCli *nmc = (NmCli *) user_data;
 	NMSettingConnection *s_con;
 	guint64 timestamp;
 	time_t timestamp_real;
@@ -783,6 +886,7 @@ fill_output_connection (gpointer data, gpointer user_data, gboolean active_only)
 	NMActiveConnection *ac = NULL;
 	const char *ac_path = NULL;
 	const char *ac_state = NULL;
+	NMActiveConnectionState ac_state_int = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
 	char *ac_dev = NULL;
 
 	s_con = nm_connection_get_setting_connection (connection);
@@ -794,7 +898,8 @@ fill_output_connection (gpointer data, gpointer user_data, gboolean active_only)
 
 	if (ac) {
 		ac_path = nm_object_get_path (NM_OBJECT (ac));
-		ac_state = active_connection_state_to_string (nm_active_connection_get_state (ac));
+		ac_state_int = nm_active_connection_get_state (ac);
+		ac_state = active_connection_state_to_string (ac_state_int);
 		ac_dev = get_ac_device_string (ac);
 	}
 
@@ -811,6 +916,16 @@ fill_output_connection (gpointer data, gpointer user_data, gboolean active_only)
 	arr = nmc_dup_fields_array (nmc_fields_con_show,
 	                            sizeof (nmc_fields_con_show),
 	                            0);
+	/* Show active connections in color */
+	if (ac) {
+		if (ac_state_int == NM_ACTIVE_CONNECTION_STATE_ACTIVATING)
+			set_val_color_all (arr, NMC_TERM_COLOR_YELLOW);
+		else if (ac_state_int == NM_ACTIVE_CONNECTION_STATE_ACTIVATED)
+			set_val_color_all (arr, NMC_TERM_COLOR_GREEN);
+		else if (ac_state_int > NM_ACTIVE_CONNECTION_STATE_ACTIVATED)
+			set_val_color_all (arr, NMC_TERM_COLOR_RED);
+	}
+
 	set_val_strc (arr, 0, nm_setting_connection_get_id (s_con));
 	set_val_strc (arr, 1, nm_setting_connection_get_uuid (s_con));
 	set_val_strc (arr, 2, nm_setting_connection_get_connection_type (s_con));
@@ -834,8 +949,9 @@ fill_output_connection_for_invisible (NMActiveConnection *ac, NmCli *nmc)
 	NmcOutputField *arr;
 	const char *ac_path = NULL;
 	const char *ac_state = NULL;
-	char *ac_dev = NULL;
+	char *name, *ac_dev = NULL;
 
+	name = g_strdup_printf ("<invisible> %s", nm_active_connection_get_id (ac));
 	ac_path = nm_object_get_path (NM_OBJECT (ac));
 	ac_state = active_connection_state_to_string (nm_active_connection_get_state (ac));
 	ac_dev = get_ac_device_string (ac);
@@ -843,7 +959,8 @@ fill_output_connection_for_invisible (NMActiveConnection *ac, NmCli *nmc)
 	arr = nmc_dup_fields_array (nmc_fields_con_show,
 	                            sizeof (nmc_fields_con_show),
 	                            0);
-	set_val_strc (arr, 0, nm_active_connection_get_id (ac));
+
+	set_val_str  (arr, 0, name);
 	set_val_strc (arr, 1, nm_active_connection_get_uuid (ac));
 	set_val_strc (arr, 2, nm_active_connection_get_connection_type (ac));
 	set_val_strc (arr, 3, NULL);
@@ -857,6 +974,8 @@ fill_output_connection_for_invisible (NMActiveConnection *ac, NmCli *nmc)
 	set_val_strc (arr, 11, ac_state);
 	set_val_strc (arr, 12, ac_path);
 
+	set_val_color_fmt_all (arr, NMC_TERM_FORMAT_DIM);
+
 	g_ptr_array_add (nmc->output_data, arr);
 }
 
@@ -933,36 +1052,6 @@ fill_output_active_connection (NMActiveConnection *active,
 	g_string_free (dev_str, FALSE);
 }
 
-static void
-fill_output_for_all_invisible (NmCli *nmc)
-{
-	const GPtrArray *acons;
-	int a, c;
-
-	g_return_if_fail (nmc != NULL);
-
-	acons = nm_client_get_active_connections (nmc->client);
-	for (a = 0; a < acons->len; a++) {
-		gboolean found = FALSE;
-		NMActiveConnection *acon = g_ptr_array_index (acons, a);
-		const char *a_uuid = nm_active_connection_get_uuid (acon);
-
-		for (c = 0; c < nmc->connections->len; c++) {
-			NMConnection *con = g_ptr_array_index (nmc->connections, c);
-			const char *c_uuid = nm_connection_get_uuid (con);
-
-			if (strcmp (a_uuid, c_uuid) == 0) {
-				found = TRUE;
-				break;
-			}
-		}
-
-		/* Active connection is not in connections list */
-		if (!found)
-			fill_output_connection_for_invisible (acon, nmc);
-	}
-}
-
 typedef struct {
 	char **array;
 	guint32 idx;
@@ -1346,14 +1435,174 @@ split_required_fields_for_con_show (const char *input,
 	return success;
 }
 
+typedef enum {
+	NMC_SORT_ACTIVE     =  1,
+	NMC_SORT_ACTIVE_INV = -1,
+	NMC_SORT_NAME       =  2,
+	NMC_SORT_NAME_INV   = -2,
+	NMC_SORT_TYPE       =  3,
+	NMC_SORT_TYPE_INV   = -3,
+	NMC_SORT_PATH       =  4,
+	NMC_SORT_PATH_INV   = -4,
+} NmcSortOrder;
+
+typedef struct {
+	NmCli *nmc;
+	const GArray *order;
+} NmcSortInfo;
+
+static int
+compare_connections (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+	NMConnection *ca = *(NMConnection **)a;
+	NMConnection *cb = *(NMConnection **)b;
+	NMActiveConnection *aca, *acb;
+	NmcSortInfo *info = (NmcSortInfo *) user_data;
+	GArray *default_order = NULL;
+	const GArray *order;
+	NmcSortOrder item;
+	int cmp = 0, i;
+	const char *tmp1, *tmp2;
+	unsigned long tmp1_int, tmp2_int;
+
+	if (info->order )
+		order = info->order;
+	else {
+		NmcSortOrder def[] = { NMC_SORT_ACTIVE, NMC_SORT_NAME, NMC_SORT_PATH };
+		int num = G_N_ELEMENTS (def);
+		default_order = g_array_sized_new (FALSE, FALSE, sizeof (NmcSortOrder), num);
+		g_array_append_vals (default_order, def, num);
+		order = default_order;
+	}
+
+	for (i = 0; i < order->len; i++) {
+		item = g_array_index (order, NmcSortOrder, i); 
+		switch (item) {
+		case NMC_SORT_ACTIVE:
+		case NMC_SORT_ACTIVE_INV:
+			aca = get_ac_for_connection (nm_client_get_active_connections (info->nmc->client), ca);
+			acb = get_ac_for_connection (nm_client_get_active_connections (info->nmc->client), cb);
+			cmp = (aca && !acb) ? -1 : (!aca && acb) ? 1 : 0;
+			if (item == NMC_SORT_ACTIVE_INV)
+				cmp = -(cmp);
+			break;
+		case NMC_SORT_TYPE:
+		case NMC_SORT_TYPE_INV:
+			cmp = g_strcmp0 (nm_connection_get_connection_type (ca),
+			                 nm_connection_get_connection_type (cb));
+			if (item == NMC_SORT_TYPE_INV)
+				cmp = -(cmp);
+			break;
+		case NMC_SORT_NAME:
+		case NMC_SORT_NAME_INV:
+			cmp = g_strcmp0 (nm_connection_get_id (ca),
+			                 nm_connection_get_id (cb));
+			if (item == NMC_SORT_NAME_INV)
+				cmp = -(cmp);
+			break;
+		case NMC_SORT_PATH:
+		case NMC_SORT_PATH_INV:
+			tmp1 = nm_connection_get_path (ca);
+			tmp2 = nm_connection_get_path (cb);
+			tmp1 = tmp1 ? strrchr (tmp1, '/') : "0";
+			tmp2 = tmp2 ? strrchr (tmp2, '/') : "0";
+			nmc_string_to_uint (tmp1 ? tmp1+1 : "0", FALSE, 0, 0, &tmp1_int);
+			nmc_string_to_uint (tmp2 ? tmp2+1 : "0", FALSE, 0, 0, &tmp2_int);
+			cmp = (int) tmp1_int - tmp2_int;
+			if (item == NMC_SORT_PATH_INV)
+				cmp = -(cmp);
+			break;
+		default:
+			cmp = 0;
+			break;
+		}
+		if (cmp != 0)
+			goto end;
+	}
+end:
+	if (default_order)
+		g_array_unref (default_order);
+	return cmp;
+}
+
+static GPtrArray *
+sort_connections (const GPtrArray *cons, NmCli *nmc, const GArray *order)
+{
+	GPtrArray *sorted;
+	int i;
+	NmcSortInfo compare_info;
+
+	compare_info.nmc = nmc;
+	compare_info.order = order;
+
+	sorted = g_ptr_array_sized_new (cons->len);
+	for (i = 0; cons && i < cons->len; i++)
+		g_ptr_array_add (sorted, cons->pdata[i]);
+	g_ptr_array_sort_with_data (sorted, compare_connections, &compare_info);
+	return sorted;
+}
+
+static int
+compare_ac_connections (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+	NMActiveConnection *ca = *(NMActiveConnection **)a;
+	NMActiveConnection *cb = *(NMActiveConnection **)b;
+	int cmp;
+
+	/* Sort states first */
+	cmp = nm_active_connection_get_state (cb) - nm_active_connection_get_state (ca);
+	if (cmp != 0)
+		return cmp;
+
+	cmp = g_strcmp0 (nm_active_connection_get_id (ca),
+	                 nm_active_connection_get_id (cb));
+	if (cmp != 0)
+		return cmp;
+
+	return g_strcmp0 (nm_active_connection_get_connection_type (ca),
+	                  nm_active_connection_get_connection_type (cb));
+}
+
+static GPtrArray *
+get_invisible_active_connections (NmCli *nmc)
+{
+	const GPtrArray *acons;
+	GPtrArray *invisibles;
+	int a, c;
+
+	g_return_val_if_fail (nmc != NULL, NULL);
+
+	invisibles = g_ptr_array_new ();
+	acons = nm_client_get_active_connections (nmc->client);
+	for (a = 0; a < acons->len; a++) {
+		gboolean found = FALSE;
+		NMActiveConnection *acon = g_ptr_array_index (acons, a);
+		const char *a_uuid = nm_active_connection_get_uuid (acon);
+
+		for (c = 0; c < nmc->connections->len; c++) {
+			NMConnection *con = g_ptr_array_index (nmc->connections, c);
+			const char *c_uuid = nm_connection_get_uuid (con);
+
+			if (strcmp (a_uuid, c_uuid) == 0) {
+				found = TRUE;
+				break;
+			}
+		}
+		/* Active connection is not in connections array, add it to  */
+		if (!found)
+			g_ptr_array_add (invisibles, acon);
+	}
+	g_ptr_array_sort_with_data (invisibles, compare_ac_connections, NULL);
+	return invisibles;
+}
+
 static NMCResultCode
 do_connections_show (NmCli *nmc, gboolean active_only, gboolean show_secrets,
-                     int argc, char **argv)
+                     const GArray *order, int argc, char **argv)
 {
 	GError *err = NULL;
 	char *profile_flds = NULL, *active_flds = NULL;
-
-	nmc->should_wait = FALSE;
+	GPtrArray *invisibles, *sorted_cons;
 
 	if (argc == 0) {
 		char *fields_str;
@@ -1385,13 +1634,19 @@ do_connections_show (NmCli *nmc, gboolean active_only, gboolean show_secrets,
 		arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
 		g_ptr_array_add (nmc->output_data, arr);
 
-		/* Add values */
-		for (i = 0; i < nmc->connections->len; i++) {
-			NMConnection *con = NM_CONNECTION (nmc->connections->pdata[i]);
-			fill_output_connection (con, nmc, active_only);
-		}
-		/* Some active connections may not be in connection list, show them here. */
-		fill_output_for_all_invisible (nmc);
+		/* There might be active connections not present in connection list
+		 * (e.g. private connections of a different user). Show them as well. */
+		invisibles = get_invisible_active_connections (nmc);
+		for (i = 0; i < invisibles->len; i++)
+			fill_output_connection_for_invisible (invisibles->pdata[i], nmc);
+		g_ptr_array_free (invisibles, FALSE);
+
+		/* Sort the connections and fill the output data */
+		sorted_cons = sort_connections (nmc->connections, nmc, order);
+		for (i = 0; i < sorted_cons->len; i++)
+			fill_output_connection (sorted_cons->pdata[i], nmc, active_only);
+		g_ptr_array_free (sorted_cons, FALSE);
+
 		print_data (nmc);  /* Print all data */
 	} else {
 		gboolean new_line = FALSE;
@@ -1643,26 +1898,6 @@ find_device_for_connection (NmCli *nmc,
 				g_free (bssid_up);
 			}
 
-#if WITH_WIMAX
-			if (   found_device
-			    && nsp
-			    && !strcmp (con_type, NM_SETTING_WIMAX_SETTING_NAME)
-			    && NM_IS_DEVICE_WIMAX (dev)) {
-				const GPtrArray *nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (dev));
-				found_device = NULL;  /* Mark as not found; set to the device again later, only if NSP matches */
-
-				for (j = 0; j < nsps->len; j++) {
-					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
-					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
-
-					if (!strcmp (nsp, candidate_name)) {
-						found_device = dev;
-						*spec_object = nm_object_get_path (NM_OBJECT (candidate_nsp));
-						break;
-					}
-				}
-			}
-#endif
 		}
 
 		if (found_device) {
@@ -2187,17 +2422,6 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 
 			ap = *argv;
 		}
-#if WITH_WIMAX
-		else if (strcmp (*argv, "nsp") == 0) {
-			if (next_arg (&argc, &argv) != 0) {
-				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
-				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-				goto error;
-			}
-
-			nsp = *argv;
-		}
-#endif
 		else if (strcmp (*argv, "passwd-file") == 0) {
 			if (next_arg (&argc, &argv) != 0) {
 				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
@@ -2220,13 +2444,14 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 	 * and we can follow activation progress.
 	 */
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	if (!nmc_activate_connection (nmc, connection, ifname, ap, nsp, pwds, activate_connection_cb, &error)) {
 		g_string_printf (nmc->return_text, _("Error: %s."),
 		                 error ? error->message : _("unknown error"));
 		nmc->return_value = error ? error->code : NMC_RESULT_ERROR_CON_ACTIVATION;
 		g_clear_error (&error);
+		nmc->should_wait--;
 		goto error;
 	}
 
@@ -2234,10 +2459,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 	if (nmc->print_output == NMC_PRINT_PRETTY)
 		progress_id = g_timeout_add (120, progress_cb, _("preparing"));
 
-	g_free (line);
-	return nmc->return_value;
 error:
-	nmc->should_wait = FALSE;
 	g_free (line);
 	return nmc->return_value;
 }
@@ -2327,7 +2549,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 	ConnectionCbInfo *info = NULL;
 	const GPtrArray *active_cons;
 	GSList *queue = NULL, *iter;
-	char *line = NULL;
 	char **arg_arr = NULL;
 	char **arg_ptr = argv;
 	int arg_num = argc;
@@ -2338,7 +2559,7 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 
 	if (argc == 0) {
 		if (nmc->ask) {
-			line = nmc_readline (PROMPT_CONNECTIONS);
+			char *line = nmc_readline (PROMPT_ACTIVE_CONNECTIONS);
 			nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
 			g_free (line);
 			arg_ptr = arg_arr;
@@ -2393,7 +2614,7 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 	queue = g_slist_reverse (queue);
 
 	if (nmc->timeout > 0) {
-		nmc->should_wait = TRUE;
+		nmc->should_wait++;
 
 		info = g_slice_new0 (ConnectionCbInfo);
 		info->nmc = nmc;
@@ -2596,6 +2817,40 @@ static const NameItem nmc_bridge_slave_settings [] = {
 	{ NULL, NULL, NULL, FALSE }
 };
 
+static const NameItem nmc_tun_settings [] = {
+	{ NM_SETTING_CONNECTION_SETTING_NAME, NULL,       NULL, TRUE  },
+	{ NM_SETTING_TUN_SETTING_NAME,        NULL,       NULL, TRUE  },
+	{ NM_SETTING_WIRED_SETTING_NAME,      "ethernet", NULL, FALSE },
+	{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NULL, NULL, NULL, FALSE }
+};
+
+static const NameItem nmc_ip_tunnel_settings [] = {
+	{ NM_SETTING_CONNECTION_SETTING_NAME, NULL,       NULL, TRUE  },
+	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,  NULL,       NULL, TRUE  },
+	{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NULL, NULL, NULL, FALSE }
+};
+
+static const NameItem nmc_macvlan_settings [] = {
+	{ NM_SETTING_CONNECTION_SETTING_NAME, NULL,       NULL, TRUE  },
+	{ NM_SETTING_WIRED_SETTING_NAME,      "ethernet", NULL, FALSE },
+	{ NM_SETTING_MACVLAN_SETTING_NAME,    NULL,       NULL, TRUE  },
+	{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL,       NULL, FALSE },
+	{ NULL, NULL, NULL, FALSE }
+};
+
+static const NameItem nmc_vxlan_settings [] = {
+	{ NM_SETTING_CONNECTION_SETTING_NAME,  NULL,       NULL, TRUE  },
+	{ NM_SETTING_VXLAN_SETTING_NAME,       NULL,       NULL, TRUE  },
+	{ NM_SETTING_WIRED_SETTING_NAME,       "ethernet", NULL, FALSE },
+	{ NM_SETTING_IP4_CONFIG_SETTING_NAME,  NULL,       NULL, FALSE },
+	{ NM_SETTING_IP6_CONFIG_SETTING_NAME,  NULL,       NULL, FALSE },
+	{ NULL, NULL, NULL, FALSE }
+};
 
 /* Available connection types */
 static const NameItem nmc_valid_connection_types[] = {
@@ -2618,6 +2873,10 @@ static const NameItem nmc_valid_connection_types[] = {
 	{ "bond-slave",                       NULL,        nmc_bond_slave_settings   },
 	{ "team-slave",                       NULL,        nmc_team_slave_settings   },
 	{ "bridge-slave",                     NULL,        nmc_bridge_slave_settings },
+	{ NM_SETTING_TUN_SETTING_NAME,        NULL,        nmc_tun_settings          },
+	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,  NULL,        nmc_ip_tunnel_settings    },
+	{ NM_SETTING_MACVLAN_SETTING_NAME,    NULL,        nmc_macvlan_settings      },
+	{ NM_SETTING_VXLAN_SETTING_NAME,      NULL,        nmc_vxlan_settings        },
 	{ NULL, NULL, NULL }
 };
 
@@ -2850,6 +3109,20 @@ check_infiniband_p_key (const char *p_key, guint32 *p_key_int, GError **error)
 	return TRUE;
 }
 
+static gboolean
+check_user_group_id (const char *id, GError **error)
+{
+	unsigned long int value;
+
+	if (!nmc_string_to_uint (id, FALSE, 0, 0, &value)) {
+		g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+		             _("Error: '%s' is not a valid UID/GID."), id);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
 /**
  * check_valid_enumeration:
  * @str: string to check against string array @strings
@@ -2935,6 +3208,15 @@ check_adsl_encapsulation (char **encapsulation, GError **error)
 	return check_valid_enumeration (encapsulation, modes, "encapsulation", _("ADSL encapsulation"), error);
 }
 
+/* Checks TUN mode. */
+static gboolean
+check_tun_mode (char **mode, GError **error)
+{
+	const char *modes[] = { "tun", "tap", NULL };
+
+	return check_valid_enumeration (mode, modes, "mode", _("TUN device mode"), error);
+}
+
 static gboolean
 check_and_convert_vlan_flags (const char *flags, guint32 *flags_int, GError **error)
 {
@@ -3070,27 +3352,31 @@ _strip_master_prefix (const char *master, const char *(**func)(NMConnection *))
 	return master;
 }
 
-/* verify_master_for_slave:
+/* normalized_master_for_slave:
  * @connections: list af all connections
  * @master: UUID, ifname or ID of the master connection
- * @type: virtual connection type (bond, team, bridge, ...)
+ * @type: virtual connection type (bond, team, bridge, ...) or %NULL
+ * @out_type: type of the connection that matched
  *
- * Check whether master is a valid interface name, UUID or ID of some @type connection.
+ * Check whether master is a valid interface name, UUID or ID of some connection,
+ * possibly of a specified @type.
  * First UUID and ifname are checked. If they don't match, ID is checked
  * and replaced by UUID on a match.
  *
  * Returns: identifier of master connection if found, %NULL otherwise
  */
 static const char *
-verify_master_for_slave (const GPtrArray *connections,
-                         const char *master,
-                         const char *type)
+normalized_master_for_slave (const GPtrArray *connections,
+                             const char *master,
+                             const char *type,
+                             const char **out_type)
 {
 	NMConnection *connection;
 	NMSettingConnection *s_con;
-	const char *con_type, *id, *uuid, *ifname;
+	const char *con_type = NULL, *id, *uuid, *ifname;
 	int i;
 	const char *found_by_id = NULL;
+	const char *out_type_by_id = NULL;
 	const char *out_master = NULL;
 	const char *(*func) (NMConnection *) = NULL;
 
@@ -3103,11 +3389,13 @@ verify_master_for_slave (const GPtrArray *connections,
 		s_con = nm_connection_get_setting_connection (connection);
 		g_assert (s_con);
 		con_type = nm_setting_connection_get_connection_type (s_con);
-		if (g_strcmp0 (con_type, type) != 0)
+		if (type && g_strcmp0 (con_type, type) != 0)
 			continue;
 		if (func) {
 			/* There was a prefix; only compare to that type. */
 			if (g_strcmp0 (master, func (connection)) == 0) {
+				if (out_type)
+					*out_type = con_type;
 				if (func == nm_connection_get_id)
 					out_master = nm_connection_get_uuid (connection);
 				else
@@ -3121,13 +3409,31 @@ verify_master_for_slave (const GPtrArray *connections,
 			if (   g_strcmp0 (master, uuid) == 0
 			    || g_strcmp0 (master, ifname) == 0) {
 				out_master = master;
+				if (out_type)
+					*out_type = con_type;
 				break;
 			}
-			if (!found_by_id && g_strcmp0 (master, id) == 0)
+			if (!found_by_id && g_strcmp0 (master, id) == 0) {
+				out_type_by_id = con_type;
 				found_by_id = uuid;
+			}
 		}
 	}
-	return out_master ? out_master : found_by_id;
+
+	if (!out_master) {
+		out_master = found_by_id;
+		if (out_type)
+			*out_type = out_type_by_id;
+	}
+
+	if (!out_master) {
+		g_print (_("Warning: master='%s' doesn't refer to any existing profile.\n"), master);
+		out_master = master;
+		if (out_type)
+			*out_type = type;
+	}
+
+	return out_master;
 }
 
 static gboolean
@@ -3393,7 +3699,7 @@ do_questionnaire_wimax (char **mac)
 }
 
 static void
-do_questionnaire_pppoe (char **password, char **service, char **mtu, char **mac)
+do_questionnaire_pppoe (gboolean echo, char **password, char **service, char **mtu, char **mac)
 {
 	gboolean once_more;
 	GError *error = NULL;
@@ -3403,7 +3709,7 @@ do_questionnaire_pppoe (char **password, char **service, char **mtu, char **mac)
 		return;
 
 	if (!*password)
-		*password = nmc_readline (_("Password [none]: "));
+		*password = nmc_readline_echo (echo, _("Password [none]: "));
 	if (!*service)
 		*service = nmc_readline (_("Service [none]: "));
 
@@ -3432,7 +3738,7 @@ do_questionnaire_pppoe (char **password, char **service, char **mtu, char **mac)
 }
 
 static void
-do_questionnaire_mobile (char **user, char **password)
+do_questionnaire_mobile (gboolean echo, char **user, char **password)
 {
 	/* Ask for optional 'gsm' or 'cdma' arguments. */
 	if (!want_provide_opt_args (_("mobile broadband"), 2))
@@ -3441,7 +3747,7 @@ do_questionnaire_mobile (char **user, char **password)
 	if (!*user)
 		*user = nmc_readline (_("Username [none]: "));
 	if (!*password)
-		*password = nmc_readline (_("Password [none]: "));
+		*password = nmc_readline_echo (echo, _("Password [none]: "));
 }
 
 #define WORD_PANU      "panu"
@@ -3548,7 +3854,7 @@ do_questionnaire_bond (char **mode, char **primary, char **miimon,
 	GError *error = NULL;
 
 	/* Ask for optional 'bond' arguments. */
-	if (!want_provide_opt_args (_("bond"), 7))
+	if (!want_provide_opt_args (_("bond"), 5))
 		return;
 
 	if (!*mode) {
@@ -3705,14 +4011,14 @@ do_questionnaire_team_slave (char **config)
 
 static void
 do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay, char **hello_time,
-                         char **max_age, char **ageing_time, char **mac)
+                         char **max_age, char **ageing_time, char **mcast_snoop, char **mac)
 {
 	unsigned long tmp;
 	gboolean once_more;
 	GError *error = NULL;
 
 	/* Ask for optional 'bridge' arguments. */
-	if (!want_provide_opt_args (_("bridge"), 7))
+	if (!want_provide_opt_args (_("bridge"), 8))
 		return;
 
 	if (!*stp) {
@@ -3790,6 +4096,20 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay, char **h
 			}
 		} while (once_more);
 	}
+	if (!*mcast_snoop) {
+		gboolean mcast_snoop_bool;
+		do {
+			*mcast_snoop = nmc_readline (_("Enable IGMP snooping %s"), prompt_yes_no (TRUE, ":"));
+			*mcast_snoop = *mcast_snoop ? *mcast_snoop : g_strdup ("yes");
+			normalize_yes_no (mcast_snoop);
+			once_more = !nmc_string_to_bool (*mcast_snoop, &mcast_snoop_bool, &error);
+			if (once_more) {
+				g_print (_("Error: 'multicast-snooping': %s.\n"), error->message);
+				g_clear_error (&error);
+				g_free (*mcast_snoop);
+			}
+		} while (once_more);
+	}
 	if (!*mac) {
 		do {
 			*mac = nmc_get_user_input (_("MAC [none]: "));
@@ -3904,7 +4224,7 @@ do_questionnaire_olpc (char **channel, char **dhcp_anycast)
 
 #define PROMPT_ADSL_ENCAP "(" NM_SETTING_ADSL_ENCAPSULATION_VCMUX "/" NM_SETTING_ADSL_ENCAPSULATION_LLC ") [none]: "
 static void
-do_questionnaire_adsl (char **password, char **encapsulation)
+do_questionnaire_adsl (gboolean echo, char **password, char **encapsulation)
 {
 	gboolean once_more;
 	GError *error = NULL;
@@ -3914,7 +4234,7 @@ do_questionnaire_adsl (char **password, char **encapsulation)
 		return;
 
 	if (!*password)
-		*password = nmc_readline (_("Password [none]: "));
+		*password = nmc_readline_echo (echo, _("Password [none]: "));
 
 	if (!*encapsulation) {
 		do {
@@ -3929,6 +4249,111 @@ do_questionnaire_adsl (char **password, char **encapsulation)
 	}
 }
 
+static void
+do_questionnaire_macvlan (char **tap)
+{
+	gboolean once_more;
+	GError *error = NULL;
+
+	/* Ask for optional 'macvlan' arguments. */
+	if (!want_provide_opt_args (_("macvlan"), 1))
+		return;
+
+	if (!*tap) {
+		gboolean tap_bool;
+		do {
+			*tap = nmc_readline (_("Tap %s"), prompt_yes_no (FALSE, ":"));
+			*tap = *tap ? *tap : g_strdup ("yes");
+			normalize_yes_no (tap);
+			once_more = !nmc_string_to_bool (*tap, &tap_bool, &error);
+			if (once_more) {
+				g_print (_("Error: 'tap': %s.\n"), error->message);
+				g_clear_error (&error);
+				g_free (*tap);
+			}
+		} while (once_more);
+	}
+}
+
+static void
+do_questionnaire_vxlan (char **parent, char **local, char **src_port_min,
+                        char **src_port_max, char **dst_port)
+{
+	unsigned long tmp;
+	gboolean once_more;
+
+	/* Ask for optional 'vxlan' arguments. */
+	if (!want_provide_opt_args (_("VXLAN"), 5))
+		return;
+
+	if (!*parent) {
+		do {
+			*parent = nmc_readline (_("Parent device [none]: "));
+			once_more =    *parent
+			            && !nm_utils_is_uuid (*parent)
+			            && !nm_utils_iface_valid_name (*parent);
+			if (once_more) {
+				g_print (_("Error: 'dev': '%s' is neither UUID nor interface name.\n"),
+				         *parent);
+				g_free (*parent);
+			}
+		} while (once_more);
+	}
+
+	if (!*local) {
+		do {
+			*local = nmc_readline (_("Local address [none]: "));
+			once_more =    *local
+			            && !nm_utils_ipaddr_valid (AF_INET, *local)
+			            && !nm_utils_ipaddr_valid (AF_INET6, *local);
+			if (once_more) {
+				g_print (_("Error: 'local': '%s' is not a valid IP address.\n"),
+				         *local);
+				g_free (*local);
+			}
+		} while (once_more);
+	}
+
+	if (!*src_port_min) {
+		do {
+			*src_port_min = nmc_readline (_("Minimum source port [0]: "));
+			*src_port_min = *src_port_min ? *src_port_min : g_strdup ("0");
+			once_more = !nmc_string_to_uint (*src_port_min, TRUE, 0, 65535, &tmp);
+			if (once_more) {
+				g_print (_("Error: 'source-port-min': '%s' is not a valid number <0-65535>.\n"),
+				         *src_port_min);
+				g_free (*src_port_min);
+			}
+		} while (once_more);
+	}
+
+	if (!*src_port_max) {
+		do {
+			*src_port_max = nmc_readline (_("Maximum source port [0]: "));
+			*src_port_max = *src_port_max ? *src_port_max : g_strdup ("0");
+			once_more = !nmc_string_to_uint (*src_port_max, TRUE, 0, 65535, &tmp);
+			if (once_more) {
+				g_print (_("Error: 'source-port-max': '%s' is not a valid number <0-65535>.\n"),
+				         *src_port_max);
+				g_free (*src_port_max);
+			}
+		} while (once_more);
+	}
+
+	if (!*dst_port) {
+		do {
+			*dst_port = nmc_readline (_("Destination port [8472]: "));
+			*dst_port = *dst_port ? *dst_port : g_strdup ("8472");
+			once_more = !nmc_string_to_uint (*dst_port, TRUE, 0, 65535, &tmp);
+			if (once_more) {
+				g_print (_("Error: 'destination-port': '%s' is not a valid number <0-65535>.\n"),
+				         *dst_port);
+				g_free (*dst_port);
+			}
+		} while (once_more);
+	}
+}
+
 static gboolean
 split_address (char* str, char **ip, char **rest)
 {
@@ -4054,11 +4479,340 @@ do_questionnaire_ip (NMConnection *connection)
 	maybe_ask_for_gateway (connection, AF_INET6);
 }
 
+static NMSetting *
+is_setting_valid (NMConnection *connection, const NameItem *valid_settings, char *setting)
+{
+	const char *setting_name;
+
+	if (!(setting_name = check_valid_name (setting, valid_settings, NULL)))
+		return NULL;
+	return nm_connection_get_setting_by_name (connection, setting_name);
+}
+
+static char *
+is_property_valid (NMSetting *setting, const char *property, GError **error)
+{
+	char **valid_props = NULL;
+	const char *prop_name;
+	char *ret;
+
+	valid_props = nmc_setting_get_valid_properties (setting);
+	prop_name = nmc_string_is_valid (property, (const char **) valid_props, error);
+	ret = g_strdup (prop_name);
+	g_strfreev (valid_props);
+	return ret;
+}
+
+#define WORD_TUN  "tun"
+#define WORD_TAP  "tap"
+#define PROMPT_TUN_MODE "(" WORD_TUN "/" WORD_TAP ") [" WORD_TUN "]: "
+static void
+do_questionnaire_tun (char **user, char **group,
+                      char **pi, char **vnet_hdr, char **multi_queue)
+{
+	gboolean once_more;
+	GError *error = NULL;
+	gboolean b;
+
+	/* Ask for optional 'tun' arguments. */
+	if (!want_provide_opt_args (_("Tun"), 5))
+		return;
+
+	if (!*user) {
+		do {
+			*user = nmc_readline (_("User ID [none]: "));
+			if (!*user)
+				break;
+			once_more = !check_user_group_id (*user, &error);
+			if (once_more) {
+				g_print ("%s\n", error->message);
+				g_clear_error (&error);
+				g_free (*user);
+			}
+		} while (once_more);
+	}
+	if (!*group) {
+		do {
+			*group = nmc_readline (_("Group ID [none]: "));
+			if (!*group)
+				break;
+			once_more = !check_user_group_id (*group, &error);
+			if (once_more) {
+				g_print ("%s\n", error->message);
+				g_clear_error (&error);
+				g_free (*group);
+			}
+		} while (once_more);
+	}
+
+	if (!*pi) {
+		do {
+			*pi = nmc_readline (_("Enable PI %s"), prompt_yes_no (FALSE, ":"));
+			*pi = *pi ? *pi : g_strdup ("no");
+			normalize_yes_no (pi);
+			once_more = !nmc_string_to_bool (*pi, &b, &error);
+			if (once_more) {
+				g_print (_("Error: 'pi': %s.\n"), error->message);
+				g_clear_error (&error);
+				g_free (*pi);
+			}
+		} while (once_more);
+	}
+	if (!*vnet_hdr) {
+		do {
+			*vnet_hdr = nmc_readline (_("Enable VNET header %s"), prompt_yes_no (FALSE, ":"));
+			*vnet_hdr = *vnet_hdr ? *vnet_hdr : g_strdup ("no");
+			normalize_yes_no (vnet_hdr);
+			once_more = !nmc_string_to_bool (*vnet_hdr, &b, &error);
+			if (once_more) {
+				g_print (_("Error: 'vnet-hdr': %s.\n"), error->message);
+				g_clear_error (&error);
+				g_free (*vnet_hdr);
+			}
+		} while (once_more);
+	}
+	if (!*multi_queue) {
+		do {
+			*multi_queue = nmc_readline (_("Enable multi queue %s"), prompt_yes_no (FALSE, ":"));
+			*multi_queue = *multi_queue ? *multi_queue : g_strdup ("no");
+			normalize_yes_no (multi_queue);
+			once_more = !nmc_string_to_bool (*multi_queue, &b, &error);
+			if (once_more) {
+				g_print (_("Error: 'multi-queue': %s.\n"), error->message);
+				g_clear_error (&error);
+				g_free (*multi_queue);
+			}
+		} while (once_more);
+	}
+}
+
+static void
+do_questionnaire_ip_tunnel (char **local, char **parent)
+{
+	gboolean once_more;
+
+	/* Ask for optional 'ip-tunnel' arguments. */
+	if (!want_provide_opt_args (_("IP Tunnel"), 2))
+		return;
+
+	if (!*local) {
+		do {
+			*local = nmc_readline (_("Local endpoint [none]: "));
+			if (!*local)
+				break;
+			once_more =    !nm_utils_ipaddr_valid (AF_INET, *local)
+			            && !nm_utils_ipaddr_valid (AF_INET6, *local);
+			if (once_more) {
+				g_print (_("Error: 'local': '%s' is not valid; must be an IP address\n"),
+				         *local);
+				g_free (*local);
+			}
+		} while (once_more);
+	}
+
+	if (!*parent) {
+		do {
+			*parent = nmc_readline (_("Parent device [none]: "));
+			once_more =    *parent
+			            && !nm_utils_is_uuid (*parent)
+			            && !nm_utils_iface_valid_name (*parent);
+			if (once_more) {
+				g_print (_("Error: 'dev': '%s' is neither UUID nor interface name.\n"),
+				         *parent);
+				g_free (*parent);
+			}
+		} while (once_more);
+	}
+}
+
+static gboolean
+read_connection_properties (NMConnection *connection,
+                            int argc,
+                            char **argv,
+                            GError **error)
+{
+	NMSetting *setting;
+	NMSettingConnection *s_con;
+	const char *con_type;
+	const char *s_dot_p;
+	const char *value;
+	char **strv = NULL;
+	const char *setting_name;
+	gboolean append = FALSE;
+	gboolean remove = FALSE;
+	gboolean success = FALSE;
+	GError *local = NULL;
+
+	s_con = nm_connection_get_setting_connection (connection);
+	g_assert (s_con);
+	con_type = nm_setting_connection_get_connection_type (s_con);
+
+	/* Go through arguments and set properties */
+	while (argc) {
+		gs_free char *property_name = NULL;
+
+		s_dot_p = *argv;
+		next_arg (&argc, &argv);
+		value = *argv;
+		next_arg (&argc, &argv);
+
+		if (!s_dot_p) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: <setting>.<property> argument is missing."));
+			goto finish;
+		}
+		if (!value) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: value for '%s' is missing."), s_dot_p);
+			goto finish;
+		}
+		/* Empty string will reset the value to default */
+		if (value[0] == '\0')
+			value = NULL;
+
+		if (s_dot_p[0] == '+') {
+			s_dot_p++;
+			append = TRUE;
+		} else if (s_dot_p[0] == '-') {
+			s_dot_p++;
+			remove = TRUE;
+		}
+
+		strv = g_strsplit (s_dot_p, ".", 2);
+		if (g_strv_length (strv) != 2) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: invalid <setting>.<property> '%s'."), s_dot_p);
+			goto finish;
+		}
+
+		setting_name = check_valid_name (strv[0], get_valid_settings_array (con_type), &local);
+		if (!setting_name) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: invalid or not allowed setting '%s': %s."),
+			             strv[0], local->message);
+			g_clear_error (&local);
+			goto finish;
+		}
+		setting = nm_connection_get_setting_by_name (connection, setting_name);
+		if (!setting) {
+			setting = nmc_setting_new_for_name (setting_name);
+			if (!setting) {
+				/* This should really not happen */
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_UNKNOWN,
+				             _("Error: don't know how to create '%s' setting."),
+				             setting_name);
+				goto finish;
+			}
+			nm_connection_add_setting (connection, setting);
+		}
+
+		property_name = is_property_valid (setting, strv[1], &local);
+		if (!property_name) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: invalid property '%s': %s."),
+			             strv[1], local->message);
+			g_clear_error (&local);
+			goto finish;
+		}
+
+		if (!remove) {
+			/* Set/add value */
+			if (!append)
+				nmc_setting_reset_property (setting, property_name, NULL);
+			if (!nmc_setting_set_property (setting, property_name, value, &local)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: failed to modify %s.%s: %s."),
+                                             strv[0], strv[1], local->message);
+				g_clear_error (&local);
+				goto finish;
+			}
+		} else {
+			/* Remove value
+			 * - either empty: remove whole value
+			 * - or specified by index <0-n>: remove item at the index
+			 * - or option name: remove item with the option name
+			 */
+			if (value) {
+				unsigned long idx;
+				if (nmc_string_to_uint (value, TRUE, 0, G_MAXUINT32, &idx))
+					nmc_setting_remove_property_option (setting, property_name, NULL, idx, &local);
+				else
+					nmc_setting_remove_property_option (setting, property_name, value, 0, &local);
+				if (local) {
+					g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+					             _("Error: failed to remove a value from %s.%s: %s."),
+					             strv[0], strv[1],  local->message);
+					g_clear_error (&local);
+					goto finish;
+				}
+			} else
+				nmc_setting_reset_property (setting, property_name, NULL);
+		}
+
+		g_strfreev (strv);
+		strv = NULL;
+	}
+
+	success = TRUE;
+finish:
+	if (strv)
+		g_strfreev (strv);
+	return success;
+}
+
+static gboolean
+complete_slave (NMSettingConnection *s_con,
+                const GPtrArray *all_connections,
+                const char *slave_type,
+                const char *master,
+                const char *type,
+                gboolean ask,
+                GError **error)
+{
+		char *master_ask = NULL;
+		const char *checked_master = NULL;
+
+		if (type)
+			g_print (_("Warning: 'type' is ignored. "
+			           "Use 'nmcli connection add \"%s\" ...' instead."),
+			           type);
+
+		if (nm_setting_connection_get_master (s_con)) {
+			/* Master already set. */
+			if (master) {
+				g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				                     _("Error: redundant 'master' option."));
+				return FALSE;
+			}
+			return TRUE;
+		}
+
+		if (!master && ask)
+			master = master_ask = nmc_readline (PROMPT_MASTER);
+		if (!master) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'master' is required."));
+			return FALSE;
+		}
+		/* Verify master argument */
+		checked_master = normalized_master_for_slave (all_connections, master, slave_type, NULL);
+
+		/* Change properties in 'connection' setting */
+		g_object_set (s_con,
+		              NM_SETTING_CONNECTION_MASTER, checked_master,
+		              NULL);
+
+		g_free (master_ask);
+
+		return TRUE;
+}
+
 static gboolean
 complete_connection_by_type (NMConnection *connection,
                              const char *con_type,
                              const GPtrArray *all_connections,
                              gboolean ask,
+                             gboolean show_secrets,
                              int argc,
                              char **argv,
                              GError **error)
@@ -4082,6 +4836,11 @@ complete_connection_by_type (NMConnection *connection,
 	NMSettingVpn *s_vpn;
 	NMSettingOlpcMesh *s_olpc_mesh;
 	NMSettingAdsl *s_adsl;
+	NMSettingTun *s_tun;
+	NMSettingIPTunnel *s_ip_tunnel;
+	NMSettingMacvlan *s_macvlan;
+	NMSettingVxlan *s_vxlan;
+	const char *slave_type;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
@@ -4376,7 +5135,7 @@ cleanup_wimax:
 		mtu = g_strdup (mtu_c);
 		mac = g_strdup (mac_c);
 		if (ask)
-			do_questionnaire_pppoe (&password, &service, &mtu, &mac);
+			do_questionnaire_pppoe (show_secrets, &password, &service, &mtu, &mac);
 
 		if (!check_and_convert_mtu (mtu, &mtu_int, error))
 			goto cleanup_pppoe;
@@ -4446,7 +5205,7 @@ cleanup_pppoe:
 		user = g_strdup (user_c);
 		password = g_strdup (password_c);
 		if (ask)
-			do_questionnaire_mobile (&user, &password);
+			do_questionnaire_mobile (show_secrets, &user, &password);
 
 		if (is_gsm) {
 			g_object_set (s_con, NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME, NULL);
@@ -4571,7 +5330,7 @@ cleanup_bt:
 		const char *mtu_c = NULL;
 		char *mtu = NULL;
 		guint32 mtu_int;
-		GByteArray *addr_array = NULL;
+		gboolean valid_mac = FALSE;
 		nmc_arg_t exp_args[] = { {"dev",     TRUE, &parent,    !ask},
 		                         {"id",      TRUE, &vlan_id,   !ask},
 		                         {"flags",   TRUE, &flags_c,   FALSE},
@@ -4606,7 +5365,7 @@ cleanup_bt:
 			}
 		}
 
-		if (   !(addr_array = nm_utils_hwaddr_atoba (parent, ETH_ALEN))
+		if (   !(valid_mac = nm_utils_hwaddr_valid (parent, ETH_ALEN))
 		    && !nm_utils_is_uuid (parent)
 		    && !nm_utils_iface_valid_name (parent)) {
 			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
@@ -4637,18 +5396,18 @@ cleanup_bt:
 		nm_connection_add_setting (connection, NM_SETTING (s_vlan));
 
 		/* Add 'wired' setting if necessary */
-		if (mtu || addr_array) {
+		if (mtu || valid_mac) {
 			s_wired = (NMSettingWired *) nm_setting_wired_new ();
 			nm_connection_add_setting (connection, NM_SETTING (s_wired));
 
 			if (mtu)
 				g_object_set (s_wired, NM_SETTING_WIRED_MTU, mtu_int, NULL);
-			if (addr_array)
-				g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, addr_array, NULL);
+			if (valid_mac)
+				g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, parent, NULL);
 		}
 
 		/* Set 'vlan' properties */
-		if (!addr_array)
+		if (!valid_mac)
 			g_object_set (s_vlan, NM_SETTING_VLAN_PARENT, parent, NULL);
 
 		g_object_set (s_vlan, NM_SETTING_VLAN_ID, id, NULL);
@@ -4666,8 +5425,6 @@ cleanup_vlan:
 		g_free (flags);
 		g_free (ingress);
 		g_free (egress);
-		if (addr_array)
-			g_byte_array_free (addr_array, TRUE);
 		g_free (parent_ask);
 		g_free (vlan_id_ask);
 		g_strfreev (ingress_arr);
@@ -4786,41 +5543,10 @@ cleanup_bond:
 			return FALSE;
 
 	} else if (!strcmp (con_type, "bond-slave")) {
-		/* Build up the settings required for 'bond-slave' */
-		const char *master = NULL;
-		char *master_ask = NULL;
-		const char *checked_master = NULL;
-		const char *type = NULL;
-		nmc_arg_t exp_args[] = { {"master", TRUE, &master, !ask},
-		                         {"type",   TRUE, &type,   FALSE},
-		                         {NULL} };
-
-		/* Set global variables for use in TAB completion */
-		nmc_tab_completion.con_type = NM_SETTING_BOND_SETTING_NAME;
-
-		if (!nmc_parse_args (exp_args, TRUE, &argc, &argv, error))
-			return FALSE;
-
-		if (!master && ask)
-			master = master_ask = nmc_readline (PROMPT_BOND_MASTER);
-		if (!master) {
-			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
-			                     _("Error: 'master' is required."));
-			return FALSE;
-		}
-		/* Verify master argument */
-		checked_master = verify_master_for_slave (all_connections, master, NM_SETTING_BOND_SETTING_NAME);
-		if (!checked_master)
-			g_print (_("Warning: master='%s' doesn't refer to any existing profile.\n"), master);
-
-		if (type)
-			g_print (_("Warning: 'type' is currently ignored. "
-			           "We only support ethernet slaves for now.\n"));
 
 		/* Change properties in 'connection' setting */
 		g_object_set (s_con,
 		              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
-		              NM_SETTING_CONNECTION_MASTER, checked_master ? checked_master : _strip_master_prefix (master, NULL),
 		              NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_BOND_SETTING_NAME,
 		              NULL);
 
@@ -4828,8 +5554,6 @@ cleanup_bond:
 		s_wired = (NMSettingWired *) nm_setting_wired_new ();
 		nm_connection_add_setting (connection, NM_SETTING (s_wired));
 
-		g_free (master_ask);
-
 	} else if (!strcmp (con_type, NM_SETTING_TEAM_SETTING_NAME)) {
 		/* Build up the settings required for 'team' */
 		gboolean success = FALSE;
@@ -4879,63 +5603,10 @@ cleanup_team:
 			return FALSE;
 
 	} else if (!strcmp (con_type, "team-slave")) {
-		/* Build up the settings required for 'team-slave' */
-		gboolean success = FALSE;
-		const char *master = NULL;
-		char *master_ask = NULL;
-		const char *checked_master = NULL;
-		const char *type = NULL;
-		const char *config_c = NULL;
-		char *config = NULL;
-		char *json = NULL;
-		nmc_arg_t exp_args[] = { {"master", TRUE, &master,   !ask},
-		                         {"type",   TRUE, &type,     FALSE},
-		                         {"config", TRUE, &config_c, FALSE},
-		                         {NULL} };
-
-		/* Set global variables for use in TAB completion */
-		nmc_tab_completion.con_type = NM_SETTING_TEAM_SETTING_NAME;
-
-		if (!nmc_parse_args (exp_args, TRUE, &argc, &argv, error))
-			return FALSE;
-
-		if (!master && ask)
-			master = master_ask = nmc_readline (PROMPT_TEAM_MASTER);
-		if (!master) {
-			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
-			                     _("Error: 'master' is required."));
-			return FALSE;
-		}
-		/* Verify master argument */
-		checked_master = verify_master_for_slave (all_connections, master, NM_SETTING_TEAM_SETTING_NAME);
-		if (!checked_master)
-			g_print (_("Warning: master='%s' doesn't refer to any existing profile.\n"), master);
-
-		/* Also ask for all optional arguments if '--ask' is specified. */
-		config = g_strdup (config_c);
-		if (ask)
-			do_questionnaire_team_slave (&config);
-
-		if (type)
-			g_print (_("Warning: 'type' is currently ignored. "
-			           "We only support ethernet slaves for now.\n"));
-
-		/* Add 'team-port' setting */
-		s_team_port = (NMSettingTeamPort *) nm_setting_team_port_new ();
-		nm_connection_add_setting (connection, NM_SETTING (s_team_port));
-
-		if (!nmc_team_check_config (config, &json, error)) {
-			g_prefix_error (error, _("Error: "));
-			goto cleanup_team_slave;
-		}
-
-		/* Set team-port options */
-		g_object_set (s_team_port, NM_SETTING_TEAM_PORT_CONFIG, json, NULL);
 
 		/* Change properties in 'connection' setting */
 		g_object_set (s_con,
 		              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
-		              NM_SETTING_CONNECTION_MASTER, checked_master ? checked_master : _strip_master_prefix (master, NULL),
 		              NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME,
 		              NULL);
 
@@ -4943,14 +5614,6 @@ cleanup_team:
 		s_wired = (NMSettingWired *) nm_setting_wired_new ();
 		nm_connection_add_setting (connection, NM_SETTING (s_wired));
 
-		success = TRUE;
-cleanup_team_slave:
-		g_free (master_ask);
-		g_free (config);
-		g_free (json);
-		if (!success)
-			return FALSE;
-
 	} else if (!strcmp (con_type, NM_SETTING_BRIDGE_SETTING_NAME)) {
 		/* Build up the settings required for 'bridge' */
 		gboolean success = FALSE;
@@ -4967,7 +5630,9 @@ cleanup_team_slave:
 		char *max_age = NULL;
 		const char *ageing_time_c = NULL;
 		char *ageing_time = NULL;
-		gboolean stp_bool;
+		const char *mcast_snoop_c = NULL;
+		char *mcast_snoop = NULL;
+		gboolean stp_bool, mcast_snoop_bool;
 		unsigned long stp_prio_int, fwd_delay_int, hello_time_int,
 		              max_age_int, ageing_time_int;
 		const char *mac_c = NULL;
@@ -4978,6 +5643,7 @@ cleanup_team_slave:
 		                         {"hello-time",    TRUE, &hello_time_c,  FALSE},
 		                         {"max-age",       TRUE, &max_age_c,     FALSE},
 		                         {"ageing-time",   TRUE, &ageing_time_c, FALSE},
+		                         {"multicast-snooping", TRUE, &mcast_snoop_c, FALSE},
 		                         {"mac",           TRUE, &mac_c,         FALSE},
 		                         {NULL} };
 
@@ -4991,10 +5657,11 @@ cleanup_team_slave:
 		hello_time = g_strdup (hello_time_c);
 		max_age = g_strdup (max_age_c);
 		ageing_time = g_strdup (ageing_time_c);
+		mcast_snoop = g_strdup (mcast_snoop_c);
 		mac = g_strdup (mac_c);
 		if (ask)
 			do_questionnaire_bridge (&stp, &priority, &fwd_delay, &hello_time,
-			                         &max_age, &ageing_time, &mac);
+			                         &max_age, &ageing_time, &mcast_snoop, &mac);
 
 		/* Generate ifname if conneciton doesn't have one */
 		ifname = nm_setting_connection_get_interface_name (s_con);
@@ -5016,6 +5683,15 @@ cleanup_team_slave:
 				goto cleanup_bridge;
 			}
 		}
+		if (mcast_snoop) {
+			GError *tmp_err = NULL;
+			if (!nmc_string_to_bool (mcast_snoop, &mcast_snoop_bool, &tmp_err)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'multicast-snooping': %s."), tmp_err->message);
+				g_clear_error (&tmp_err);
+				goto cleanup_bridge;
+			}
+		}
 
 		/* Add 'bond' setting */
 		/* Must be done *before* bridge_prop_string_to_uint() so that the type is known */
@@ -5058,6 +5734,8 @@ cleanup_team_slave:
 			g_object_set (s_bridge, NM_SETTING_BRIDGE_MAX_AGE, max_age_int, NULL);
 		if (ageing_time)
 			g_object_set (s_bridge, NM_SETTING_BRIDGE_AGEING_TIME, ageing_time_int, NULL);
+		if (mcast_snoop)
+			g_object_set (s_bridge, NM_SETTING_BRIDGE_MULTICAST_SNOOPING, mcast_snoop_bool, NULL);
 		if (mac)
 			g_object_set (s_bridge, NM_SETTING_BRIDGE_MAC_ADDRESS, mac, NULL);
 
@@ -5069,88 +5747,16 @@ cleanup_bridge:
 		g_free (hello_time);
 		g_free (max_age);
 		g_free (ageing_time);
+		g_free (mcast_snoop);
 		g_free (mac);
 		if (!success)
 			return FALSE;
 
 	} else if (!strcmp (con_type, "bridge-slave")) {
-		/* Build up the settings required for 'bridge-slave' */
-		gboolean success = FALSE;
-		const char *master = NULL;
-		char *master_ask = NULL;
-		const char *checked_master = NULL;
-		const char *type = NULL;
-		const char *priority_c = NULL;
-		char *priority = NULL;
-		const char *path_cost_c = NULL;
-		char *path_cost = NULL;
-		const char *hairpin_c = NULL;
-		char *hairpin = NULL;
-		unsigned long prio_int, path_cost_int;
-		gboolean hairpin_bool;
-		nmc_arg_t exp_args[] = { {"master",    TRUE, &master,      !ask},
-		                         {"type",      TRUE, &type,        FALSE},
-		                         {"priority",  TRUE, &priority_c,  FALSE},
-		                         {"path-cost", TRUE, &path_cost_c, FALSE},
-		                         {"hairpin",   TRUE, &hairpin_c,   FALSE},
-		                         {NULL} };
-
-		/* Set global variables for use in TAB completion */
-		nmc_tab_completion.con_type = NM_SETTING_BRIDGE_SETTING_NAME;
-
-		if (!nmc_parse_args (exp_args, TRUE, &argc, &argv, error))
-			return FALSE;
-
-		if (!master && ask)
-			master = master_ask = nmc_readline (PROMPT_BRIDGE_MASTER);
-		if (!master) {
-			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
-			                     _("Error: 'master' is required."));
-			return FALSE;
-		}
-		/* Verify master argument */
-		checked_master = verify_master_for_slave (all_connections, master, NM_SETTING_BRIDGE_SETTING_NAME);
-		if (!checked_master)
-			g_print (_("Warning: master='%s' doesn't refer to any existing profile.\n"), master);
-
-		if (type)
-			g_print (_("Warning: 'type' is currently ignored. "
-			           "We only support ethernet slaves for now.\n"));
-
-		/* Add 'bridge-port' setting */
-		/* Must be done *before* bridge_prop_string_to_uint() so that the type is known */
-		s_bridge_port = (NMSettingBridgePort *) nm_setting_bridge_port_new ();
-		nm_connection_add_setting (connection, NM_SETTING (s_bridge_port));
-
-		/* Also ask for all optional arguments if '--ask' is specified. */
-		priority = g_strdup (priority_c);
-		path_cost = g_strdup (path_cost_c);
-		hairpin = g_strdup (hairpin_c);
-		if (ask)
-			do_questionnaire_bridge_slave (&priority, &path_cost, &hairpin);
-
-		if (priority)
-			if (!bridge_prop_string_to_uint (priority, "priority", NM_TYPE_SETTING_BRIDGE_PORT,
-			                                 NM_SETTING_BRIDGE_PORT_PRIORITY, &prio_int, error))
-				goto cleanup_bridge_slave;
-		if (path_cost)
-			if (!bridge_prop_string_to_uint (path_cost, "path-cost", NM_TYPE_SETTING_BRIDGE_PORT,
-			                                 NM_SETTING_BRIDGE_PORT_PATH_COST, &path_cost_int, error))
-				goto cleanup_bridge_slave;
-		if (hairpin) {
-			GError *tmp_err = NULL;
-			if (!nmc_string_to_bool (hairpin, &hairpin_bool, &tmp_err)) {
-				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
-				             _("Error: 'hairpin': %s."), tmp_err->message);
-				g_clear_error (&tmp_err);
-				goto cleanup_bridge_slave;
-			}
-		}
 
 		/* Change properties in 'connection' setting */
 		g_object_set (s_con,
 		              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
-		              NM_SETTING_CONNECTION_MASTER, checked_master ? checked_master : _strip_master_prefix (master, NULL),
 		              NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_BRIDGE_SETTING_NAME,
 		              NULL);
 
@@ -5158,22 +5764,6 @@ cleanup_bridge:
 		s_wired = (NMSettingWired *) nm_setting_wired_new ();
 		nm_connection_add_setting (connection, NM_SETTING (s_wired));
 
-		if (priority)
-			g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_PRIORITY, prio_int, NULL);
-		if (path_cost)
-			g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_PATH_COST, path_cost_int, NULL);
-		if (hairpin)
-			g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, hairpin_bool, NULL);
-
-		success = TRUE;
-cleanup_bridge_slave:
-		g_free (master_ask);
-		g_free (priority);
-		g_free (path_cost);
-		g_free (hairpin);
-		if (!success)
-			return FALSE;
-
 	} else if (!strcmp (con_type, NM_SETTING_VPN_SETTING_NAME)) {
 		/* Build up the settings required for 'vpn' */
 		gboolean success = FALSE;
@@ -5335,7 +5925,7 @@ cleanup_olpc:
 		password = g_strdup (password_c);
 		encapsulation = g_strdup (encapsulation_c);
 		if (ask)
-			do_questionnaire_adsl (&password, &encapsulation);
+			do_questionnaire_adsl (show_secrets, &password, &encapsulation);
 
 		if (!check_adsl_encapsulation (&encapsulation, error))
 			goto cleanup_adsl;
@@ -5357,6 +5947,457 @@ cleanup_adsl:
 		g_free (password);
 		g_free (protocol_ask);
 		g_free (encapsulation);
+
+		if (!success)
+			return FALSE;
+
+	} else if (!strcmp (con_type, NM_SETTING_MACVLAN_SETTING_NAME)) {
+		/* Build up the settings required for 'macvlan' */
+		gboolean success = FALSE;
+		const char *parent = NULL;
+		char *parent_ask = NULL;
+		const char *mode = NULL;
+		char *mode_ask = NULL;
+		const char *tap_c = NULL;
+		char *tap = NULL;
+		NMSettingMacvlanMode mode_enum;
+		gboolean valid_mac = FALSE;
+		gboolean tap_bool = FALSE;
+		nmc_arg_t exp_args[] = { {"dev",     TRUE, &parent,    !ask},
+		                         {"mode",    TRUE, &mode,      !ask},
+		                         {"tap",     TRUE, &tap_c,     FALSE},
+		                         {NULL} };
+
+		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+			return FALSE;
+
+		if (!parent && ask)
+			parent = parent_ask = nmc_readline (_("MACVLAN parent device or connection UUID: "));
+		if (!parent) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'dev' is required."));
+			return FALSE;
+		}
+
+		if (   !(valid_mac = nm_utils_hwaddr_valid (parent, ETH_ALEN))
+		    && !nm_utils_is_uuid (parent)
+		    && !nm_utils_iface_valid_name (parent)) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'dev': '%s' is neither UUID, interface name, nor MAC."),
+			             parent);
+			goto cleanup_macvlan;
+		}
+
+		if (!mode && ask)
+			mode = mode_ask = nmc_readline (PROMPT_MACVLAN_MODE);
+		if (!mode) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'mode' is required."));
+			return FALSE;
+		}
+
+		if (!nm_utils_enum_from_str (nm_setting_macvlan_mode_get_type(), mode, (int *) &mode_enum, NULL)) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'mode' is not valid."));
+			return FALSE;
+		}
+
+		/* Also ask for all optional arguments if '--ask' is specified. */
+		tap = g_strdup (tap_c);
+		if (ask)
+			do_questionnaire_macvlan (&tap);
+
+		if (tap) {
+			GError *tmp_err = NULL;
+			if (!nmc_string_to_bool (tap, &tap_bool, &tmp_err)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+					     _("Error: 'tap': %s."), tmp_err->message);
+				g_clear_error (&tmp_err);
+				goto cleanup_macvlan;
+			}
+		}
+
+		/* Add 'macvlan' setting */
+		s_macvlan = (NMSettingMacvlan *) nm_setting_macvlan_new ();
+		nm_connection_add_setting (connection, NM_SETTING (s_macvlan));
+
+		/* Add 'wired' setting if necessary */
+		if (valid_mac) {
+			s_wired = (NMSettingWired *) nm_setting_wired_new ();
+			nm_connection_add_setting (connection, NM_SETTING (s_wired));
+			g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, parent, NULL);
+		}
+
+		/* Set 'macvlan' properties */
+		if (!valid_mac)
+			g_object_set (s_macvlan, NM_SETTING_MACVLAN_PARENT, parent, NULL);
+		g_object_set (s_macvlan, NM_SETTING_MACVLAN_MODE, mode_enum, NULL);
+		g_object_set (s_macvlan, NM_SETTING_MACVLAN_TAP, tap_bool, NULL);
+
+		success = TRUE;
+cleanup_macvlan:
+		g_free (parent_ask);
+		g_free (mode_ask);
+		g_free (tap);
+
+		if (!success)
+			return FALSE;
+
+	} else if (!strcmp (con_type, NM_SETTING_TUN_SETTING_NAME)) {
+		/* Build up the settings required for 'tun' */
+		gboolean success = FALSE;
+		const char *mode_c = NULL;
+		char *mode_ask = NULL, *mode = NULL;
+		NMSettingTunMode mode_enum;
+		const char *owner_c = NULL, *group_c = NULL;
+		char *owner = NULL, *group = NULL;
+		const char *pi_c = NULL, *vnet_hdr_c = NULL, *multi_queue_c = NULL;
+		char *pi = NULL, *vnet_hdr = NULL, *multi_queue = NULL;
+		gboolean pi_bool, vnet_hdr_bool, multi_queue_bool;
+		nmc_arg_t exp_args[] = { {"mode",        TRUE,  &mode_c,        !ask},
+		                         {"owner",       TRUE,  &owner_c,       FALSE},
+		                         {"group",       TRUE,  &group_c,       FALSE},
+		                         {"pi",          TRUE,  &pi_c,          FALSE},
+		                         {"vnet-hdr",    TRUE,  &vnet_hdr_c,    FALSE},
+		                         {"multi-queue", TRUE,  &multi_queue_c, FALSE},
+                                         {NULL} };
+
+		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+			return FALSE;
+
+		if (!mode_c && ask) {
+			mode_ask = nmc_readline (_("Mode %s"), PROMPT_TUN_MODE);
+			mode_ask = mode_ask ? mode_ask : g_strdup ("tun");
+			mode_c = mode_ask;
+		}
+		if (!mode_c) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'mode' is required."));
+			goto cleanup_tun;
+		}
+		mode = g_strdup (mode_c);
+		if (!check_tun_mode (&mode, error))
+			goto cleanup_tun;
+
+		if (owner && !check_user_group_id (owner, error))
+			goto cleanup_tun;
+		if (group && !check_user_group_id (group, error))
+			goto cleanup_tun;
+
+		owner = g_strdup (owner_c);
+		group = g_strdup (group_c);
+		pi = g_strdup (pi_c);
+		vnet_hdr = g_strdup (vnet_hdr_c);
+		multi_queue = g_strdup (multi_queue_c);
+		if (ask)
+			do_questionnaire_tun (&owner, &group, &pi, &vnet_hdr, &multi_queue);
+
+		if (pi) {
+			GError *tmp_err = NULL;
+
+			if (!nmc_string_to_bool (pi, &pi_bool, &tmp_err)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'pi': %s."), tmp_err->message);
+				g_clear_error (&tmp_err);
+				goto cleanup_tun;
+			}
+		}
+
+		if (vnet_hdr) {
+			GError *tmp_err = NULL;
+
+			if (!nmc_string_to_bool (vnet_hdr, &vnet_hdr_bool, &tmp_err)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'vnet-hdr': %s."), tmp_err->message);
+				g_clear_error (&tmp_err);
+				goto cleanup_tun;
+			}
+		}
+
+		if (multi_queue) {
+			GError *tmp_err = NULL;
+
+			if (!nmc_string_to_bool (multi_queue, &multi_queue_bool, &tmp_err)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'multi-queue': %s."), tmp_err->message);
+				g_clear_error (&tmp_err);
+				goto cleanup_tun;
+			}
+		}
+		/* Add 'tun' setting */
+		s_tun = (NMSettingTun *) nm_setting_tun_new ();
+		nm_connection_add_setting (connection, NM_SETTING (s_tun));
+		mode_enum = !strcmp (mode, "tun") ? NM_SETTING_TUN_MODE_TUN : NM_SETTING_TUN_MODE_TAP;
+
+		g_object_set (s_tun,
+		              NM_SETTING_TUN_MODE,   mode_enum,
+		              NM_SETTING_TUN_OWNER,  owner,
+		              NM_SETTING_TUN_GROUP,  group,
+		              NULL);
+		if (pi)
+			g_object_set (s_tun, NM_SETTING_TUN_PI, pi_bool, NULL);
+		if (vnet_hdr)
+			g_object_set (s_tun, NM_SETTING_TUN_VNET_HDR, vnet_hdr_bool, NULL);
+		if (multi_queue)
+			g_object_set (s_tun, NM_SETTING_TUN_MULTI_QUEUE, multi_queue_bool, NULL);
+
+		success = TRUE;
+cleanup_tun:
+		g_free (mode_ask);
+		g_free (mode);
+		g_free (owner);
+		g_free (group);
+		g_free (pi);
+		g_free (vnet_hdr);
+		g_free (multi_queue);
+		if (!success)
+			return FALSE;
+
+	} else if (!strcmp (con_type, NM_SETTING_IP_TUNNEL_SETTING_NAME)) {
+		/* Build up the settings required for 'ip-tunnel' */
+		const char *mode_c = NULL, *local_c = NULL, *remote_c = NULL;
+		char *mode_ask = NULL, *remote_ask = NULL, *local = NULL;
+		const char *parent_c = NULL;
+		char *parent = NULL;
+		gboolean success = FALSE;
+		NMIPTunnelMode mode_enum;
+		nmc_arg_t exp_args[] = { {"mode",    TRUE, &mode_c,     !ask},
+		                         {"local",   TRUE, &local_c,    FALSE},
+		                         {"remote",  TRUE, &remote_c,   !ask},
+		                         {"dev",     TRUE, &parent_c,   FALSE},
+		                         {NULL} };
+
+		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+			return FALSE;
+
+		if (!mode_c && ask)
+			mode_c = mode_ask = nmc_readline (PROMPT_IP_TUNNEL_MODE);
+		if (!mode_c) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'mode' is required."));
+			goto cleanup_tunnel;
+		}
+
+		if (!nm_utils_enum_from_str (nm_ip_tunnel_mode_get_type (),
+		                             mode_c, (int *) &mode_enum, NULL)) {
+			gs_free const char **values = NULL;
+			gs_free char *values_str = NULL;
+
+			values = nm_utils_enum_get_values (nm_ip_tunnel_mode_get_type (),
+			                                   NM_IP_TUNNEL_MODE_UKNOWN + 1,
+			                                   G_MAXINT);
+			values_str = g_strjoinv (",", (char **) values);
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'mode': '%s' is not valid, use one of %s"),
+			             mode_c, values_str);
+			goto cleanup_tunnel;
+		}
+
+		if (!remote_c && ask)
+			remote_c = remote_ask = nmc_readline (_("Remote endpoint: "));
+		if (!remote_c) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'remote' is required."));
+			goto cleanup_tunnel;
+		}
+
+		if (   !nm_utils_ipaddr_valid (AF_INET, remote_c)
+		    && !nm_utils_ipaddr_valid (AF_INET6, remote_c)) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'remote': '%s' is not valid; must be an IP address"),
+			             remote_c);
+			goto cleanup_tunnel;
+		}
+
+		local = g_strdup (local_c);
+		parent = g_strdup (parent_c);
+		if (ask)
+			do_questionnaire_ip_tunnel (&local, &parent);
+
+		if (   local
+		    && !nm_utils_ipaddr_valid (AF_INET, local)
+		    && !nm_utils_ipaddr_valid (AF_INET6, local)) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'local': '%s' is not valid; must be an IP address"),
+			             local);
+			goto cleanup_tunnel;
+		}
+
+		if (parent) {
+			if (   !nm_utils_is_uuid (parent)
+			    && !nm_utils_iface_valid_name (parent)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'dev': '%s' is neither UUID nor interface name."),
+				             parent);
+				goto cleanup_tunnel;
+			}
+		}
+
+		/* Add 'tunnel' setting */
+		s_ip_tunnel = (NMSettingIPTunnel *) nm_setting_ip_tunnel_new ();
+		nm_connection_add_setting (connection, NM_SETTING (s_ip_tunnel));
+
+		/* Set 'tunnel' properties */
+		g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_MODE, mode_enum, NULL);
+		g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_REMOTE, remote_c, NULL);
+		if (local)
+			g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_LOCAL, local, NULL);
+		if (parent)
+			g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_PARENT, parent, NULL);
+
+		/* Set default values for IPv6 tunnels */
+		if (nm_utils_ipaddr_valid (AF_INET6, remote_c)) {
+			g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_TOS, 64, NULL);
+			g_object_set (s_ip_tunnel, NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT, 4, NULL);
+		}
+
+		success = TRUE;
+cleanup_tunnel:
+		g_free (remote_ask);
+		g_free (mode_ask);
+		g_free (parent);
+		g_free (local);
+		if (!success)
+			return FALSE;
+
+	} else if (!strcmp (con_type, NM_SETTING_VXLAN_SETTING_NAME)) {
+		/* Build up the settings required for 'vxlan' */
+		gboolean success = FALSE;
+		char *id_ask = NULL;
+		const char *id = NULL;
+		char *remote_ask = NULL;
+		const char *remote = NULL;
+		const char *parent_c = NULL, *local_c = NULL;
+		const char *src_port_min_c = NULL, *src_port_max_c = NULL;
+		const char *dst_port_c = NULL;
+		char *parent = NULL, *local = NULL;
+		char *src_port_min = NULL, *src_port_max = NULL, *dst_port = NULL;
+		unsigned long int vni;
+		unsigned long sport_min = G_MAXULONG, sport_max = G_MAXULONG;
+		unsigned long dport = G_MAXULONG;
+		nmc_arg_t exp_args[] = { {"id",               TRUE, &id,             !ask},
+		                         {"remote",           TRUE, &remote,         !ask},
+		                         {"dev",              TRUE, &parent_c,        FALSE},
+		                         {"local",            TRUE, &local_c,         FALSE},
+		                         {"source-port-min",  TRUE, &src_port_min_c,  FALSE},
+		                         {"source-port-max",  TRUE, &src_port_max_c,  FALSE},
+		                         {"destination-port", TRUE, &dst_port_c,      FALSE},
+		                         {NULL} };
+
+		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+			return FALSE;
+
+		if (!id && ask)
+			id = id_ask = nmc_readline (_("VXLAN ID: "));
+		if (!id) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'id' is required."));
+			goto cleanup_vxlan;
+		}
+
+		if (!remote && ask)
+			remote = remote_ask = nmc_readline (_("Remote: "));
+		if (!remote) {
+			g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			                     _("Error: 'remote' is required."));
+			goto cleanup_vxlan;
+		}
+
+		if (!nmc_string_to_uint (id, TRUE, 0, (1UL << 24) - 1, &vni)) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'id': '%s' is not valid; use <0-16777215>."), id);
+			goto cleanup_vxlan;
+		}
+
+		parent = g_strdup (parent_c);
+		local = g_strdup (local_c);
+		src_port_min = g_strdup (src_port_min_c);
+		src_port_max = g_strdup (src_port_max_c);
+		dst_port = g_strdup (dst_port_c);
+
+		if (ask)
+			do_questionnaire_vxlan (&parent, &local, &src_port_min, &src_port_max, &dst_port);
+
+		if (parent) {
+			if (   !nm_utils_is_uuid (parent)
+			    && !nm_utils_iface_valid_name (parent)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'dev': '%s' is neither UUID nor interface name."),
+				             parent);
+				goto cleanup_vxlan;
+			}
+		}
+
+		if (   !nm_utils_ipaddr_valid (AF_INET, remote)
+		    && !nm_utils_ipaddr_valid (AF_INET6, remote)) {
+			g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+			             _("Error: 'remote': '%s' is not a valid IP address"),
+			             remote);
+			goto cleanup_vxlan;
+		}
+
+		if (local) {
+			if (   !nm_utils_ipaddr_valid (AF_INET, local)
+			    && !nm_utils_ipaddr_valid (AF_INET6, local)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'local': '%s' is not a valid IP address"),
+				             local);
+				goto cleanup_vxlan;
+			}
+		}
+
+		if (src_port_min) {
+			if (!nmc_string_to_uint (src_port_min, TRUE, 0, 65535, &sport_min)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'source-port-min': %s is not valid; use <0-65535>."),
+				             src_port_min);
+				goto cleanup_vxlan;
+			}
+		}
+
+		if (src_port_max) {
+			if (!nmc_string_to_uint (src_port_max, TRUE, 0, 65535, &sport_max)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'source-port-max': %s is not valid; use <0-65535>."),
+				             src_port_max);
+				goto cleanup_vxlan;
+			}
+		}
+
+		if (dst_port) {
+			if (!nmc_string_to_uint (dst_port, TRUE, 0, 65535, &dport)) {
+				g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+				             _("Error: 'destination-port': %s is not valid; use <0-65535>."),
+				             dst_port);
+				goto cleanup_vxlan;
+			}
+		}
+
+		/* Add 'vxlan' setting */
+		s_vxlan = (NMSettingVxlan *) nm_setting_vxlan_new ();
+		nm_connection_add_setting (connection, NM_SETTING (s_vxlan));
+
+		g_object_set (s_vxlan, NM_SETTING_VXLAN_ID, (guint) vni, NULL);
+		g_object_set (s_vxlan, NM_SETTING_VXLAN_REMOTE, remote, NULL);
+		g_object_set (s_vxlan, NM_SETTING_VXLAN_LOCAL, local, NULL);
+		g_object_set (s_vxlan, NM_SETTING_VXLAN_PARENT, parent, NULL);
+
+		if (sport_min != G_MAXULONG)
+			g_object_set (s_vxlan, NM_SETTING_VXLAN_SOURCE_PORT_MIN, sport_min, NULL);
+		if (sport_max != G_MAXULONG)
+			g_object_set (s_vxlan, NM_SETTING_VXLAN_SOURCE_PORT_MAX, sport_max, NULL);
+		if (dport != G_MAXULONG)
+			g_object_set (s_vxlan, NM_SETTING_VXLAN_DESTINATION_PORT, dport, NULL);
+
+		success = TRUE;
+
+cleanup_vxlan:
+		g_free (id_ask);
+		g_free (remote_ask);
+		g_free (parent);
+		g_free (local);
+		g_free (src_port_min);
+		g_free (src_port_max);
 		if (!success)
 			return FALSE;
 
@@ -5371,11 +6412,146 @@ cleanup_adsl:
 		return FALSE;
 	}
 
-	/* Read and add IP configuration */
-	if (   strcmp (con_type, "bond-slave") != 0
-	    && strcmp (con_type, "team-slave") != 0
-	    && strcmp (con_type, "bridge-slave") != 0) {
+	slave_type = nm_setting_connection_get_slave_type (s_con);
+	if (slave_type) {
+
+		/* Set global variables for use in TAB completion */
+		nmc_tab_completion.con_type = (char *)slave_type;
+
+		if (!strcmp (slave_type, NM_SETTING_TEAM_SETTING_NAME)) {
+			/* Build up the settings required for 'team-slave' */
+			gboolean success = FALSE;
+			const char *master = NULL;
+			char *master_ask = NULL;
+			const char *type = NULL;
+			const char *config_c = NULL;
+			char *config = NULL;
+			char *json = NULL;
+			nmc_arg_t exp_args[] = { {"master", TRUE, &master,   FALSE},
+						 {"type",   TRUE, &type,     FALSE},
+						 {"config", TRUE, &config_c, FALSE},
+						 {NULL} };
+
+			if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+				return FALSE;
+
+			if (!complete_slave (s_con, all_connections, slave_type, master, type, ask, error))
+				return FALSE;
+
+			/* Also ask for all optional arguments if '--ask' is specified. */
+			config = g_strdup (config_c);
+			if (ask)
+				do_questionnaire_team_slave (&config);
+
+			/* Add 'team-port' setting */
+			s_team_port = (NMSettingTeamPort *) nm_setting_team_port_new ();
+			nm_connection_add_setting (connection, NM_SETTING (s_team_port));
+
+			if (!nmc_team_check_config (config, &json, error)) {
+				g_prefix_error (error, _("Error: "));
+				goto cleanup_team_slave;
+			}
+
+			/* Set team-port options */
+			g_object_set (s_team_port, NM_SETTING_TEAM_PORT_CONFIG, json, NULL);
+
+			success = TRUE;
+cleanup_team_slave:
+			g_free (master_ask);
+			g_free (config);
+			g_free (json);
+			if (!success)
+				return FALSE;
+
+		} else if (!strcmp (slave_type, NM_SETTING_BRIDGE_SETTING_NAME)) {
+			/* Build up the settings required for 'bridge-slave' */
+			gboolean success = FALSE;
+			const char *master = NULL;
+			char *master_ask = NULL;
+			const char *type = NULL;
+			const char *priority_c = NULL;
+			char *priority = NULL;
+			const char *path_cost_c = NULL;
+			char *path_cost = NULL;
+			const char *hairpin_c = NULL;
+			char *hairpin = NULL;
+			unsigned long prio_int, path_cost_int;
+			gboolean hairpin_bool;
+			nmc_arg_t exp_args[] = { {"master",    TRUE, &master,      FALSE},
+						 {"type",      TRUE, &type,        FALSE},
+						 {"priority",  TRUE, &priority_c,  FALSE},
+						 {"path-cost", TRUE, &path_cost_c, FALSE},
+						 {"hairpin",   TRUE, &hairpin_c,   FALSE},
+						 {NULL} };
+
+			if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+				return FALSE;
+
+			if (!complete_slave (s_con, all_connections, slave_type, master, type, ask, error))
+				return FALSE;
+
+			/* Add 'bridge-port' setting */
+			/* Must be done *before* bridge_prop_string_to_uint() so that the type is known */
+			s_bridge_port = (NMSettingBridgePort *) nm_setting_bridge_port_new ();
+			nm_connection_add_setting (connection, NM_SETTING (s_bridge_port));
+
+			/* Also ask for all optional arguments if '--ask' is specified. */
+			priority = g_strdup (priority_c);
+			path_cost = g_strdup (path_cost_c);
+			hairpin = g_strdup (hairpin_c);
+			if (ask)
+				do_questionnaire_bridge_slave (&priority, &path_cost, &hairpin);
+
+			if (priority)
+				if (!bridge_prop_string_to_uint (priority, "priority", NM_TYPE_SETTING_BRIDGE_PORT,
+								 NM_SETTING_BRIDGE_PORT_PRIORITY, &prio_int, error))
+					goto cleanup_bridge_slave;
+			if (path_cost)
+				if (!bridge_prop_string_to_uint (path_cost, "path-cost", NM_TYPE_SETTING_BRIDGE_PORT,
+								 NM_SETTING_BRIDGE_PORT_PATH_COST, &path_cost_int, error))
+					goto cleanup_bridge_slave;
+			if (hairpin) {
+				GError *tmp_err = NULL;
+				if (!nmc_string_to_bool (hairpin, &hairpin_bool, &tmp_err)) {
+					g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+						     _("Error: 'hairpin': %s."), tmp_err->message);
+					g_clear_error (&tmp_err);
+					goto cleanup_bridge_slave;
+				}
+			}
+
+			if (priority)
+				g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_PRIORITY, prio_int, NULL);
+			if (path_cost)
+				g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_PATH_COST, path_cost_int, NULL);
+			if (hairpin)
+				g_object_set (s_bridge_port, NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, hairpin_bool, NULL);
 
+			success = TRUE;
+cleanup_bridge_slave:
+			g_free (master_ask);
+			g_free (priority);
+			g_free (path_cost);
+			g_free (hairpin);
+			if (!success)
+				return FALSE;
+		} else {
+			/* Slave types without any specific settings ('bond-slave') */
+			const char *master = NULL;
+			const char *type = NULL;
+			nmc_arg_t exp_args[] = { {"master", TRUE, &master, FALSE},
+						 {"type",   TRUE, &type,   FALSE},
+						 {NULL} };
+
+			if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+				return FALSE;
+
+			if (!complete_slave (s_con, all_connections, slave_type, master, type, ask, error))
+				return FALSE;
+		}
+
+	} else {
+		/* Read and add IP configuration */
 		NMIPAddress *ip4addr = NULL, *ip6addr = NULL;
 		const char *ip4 = NULL, *gw4 = NULL, *ip6 = NULL, *gw6 = NULL;
 		nmc_arg_t exp_args[] = { {"ip4", TRUE, &ip4, FALSE}, {"gw4", TRUE, &gw4, FALSE},
@@ -5391,8 +6567,8 @@ cleanup_adsl:
 
 			ip4 = gw4 = ip6 = gw6 = NULL;
 
-			if (!nmc_parse_args (exp_args, TRUE, &argc, &argv, error))
-				return FALSE;
+			if (!nmc_parse_args (exp_args, TRUE, &argc, &argv, NULL))
+				break;
 
 			/* coverity[dead_error_begin] */
 			if (ip4) {
@@ -5466,31 +6642,19 @@ cleanup_adsl:
 			do_questionnaire_ip (connection);
 	}
 
-	return TRUE;
-}
-
-static char *
-unique_connection_name (const GPtrArray *connections, const char *try_name)
-{
-	NMConnection *connection;
-	const char *name;
-	char *new_name;
-	unsigned int num = 1;
-	int i = 0;
+	if (argc) {
+		/* Set extra connection properties. */
+		nmc_arg_t exp_args[] = { {"--", FALSE, NULL, TRUE},
+					 {NULL} };
 
-	new_name = g_strdup (try_name);
-	while (i < connections->len) {
-		connection = NM_CONNECTION (connections->pdata[i]);
+		if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+			return FALSE;
 
-		name = nm_connection_get_id (connection);
-		if (g_strcmp0 (new_name, name) == 0) {
-			g_free (new_name);
-			new_name = g_strdup_printf ("%s-%d", try_name, num++);
-			i = 0;
-		} else
-			i++;
+		if (!read_connection_properties (connection, argc, argv, error))
+			return FALSE;
 	}
-	return new_name;
+
+	return TRUE;
 }
 
 typedef struct {
@@ -5611,6 +6775,35 @@ gen_func_adsl_encap (const char *text, int state)
 }
 
 static char *
+gen_func_tun_mode (const char *text, int state)
+{
+	const char *words[] = { "tun", "tap", NULL };
+	return nmc_rl_gen_func_basic (text, state, words);
+}
+
+static char *
+gen_func_ip_tunnel_mode (const char *text, int state)
+{
+	gs_free const char **words = NULL;
+
+	words = nm_utils_enum_get_values (nm_ip_tunnel_mode_get_type (),
+	                                  NM_IP_TUNNEL_MODE_UKNOWN + 1,
+	                                  G_MAXINT);
+	return nmc_rl_gen_func_basic (text, state, words);
+}
+
+static char *
+gen_func_macvlan_mode (const char *text, int state)
+{
+	gs_free const char **words = NULL;
+
+	words = nm_utils_enum_get_values (nm_setting_macvlan_mode_get_type(),
+	                                  NM_SETTING_MACVLAN_MODE_UNKNOWN + 1,
+	                                  G_MAXINT);
+	return nmc_rl_gen_func_basic (text, state, words);
+}
+
+static char *
 gen_func_master_ifnames (const char *text, int state)
 {
 	int i;
@@ -5679,9 +6872,7 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
 		generator_func = gen_connection_types;
 	else if (g_strcmp0 (rl_prompt, PROMPT_VPN_TYPE) == 0)
 		generator_func = gen_func_vpn_types;
-	else if (   g_strcmp0 (rl_prompt, PROMPT_BOND_MASTER) == 0
-	         || g_strcmp0 (rl_prompt, PROMPT_TEAM_MASTER) == 0
-	         || g_strcmp0 (rl_prompt, PROMPT_BRIDGE_MASTER) == 0)
+	else if (g_strcmp0 (rl_prompt, PROMPT_MASTER) == 0)
 		generator_func = gen_func_master_ifnames;
 	else if (   g_str_has_suffix (rl_prompt, prompt_yes_no (TRUE, NULL))
 	         || g_str_has_suffix (rl_prompt, prompt_yes_no (TRUE, ":"))
@@ -5702,6 +6893,12 @@ nmcli_con_add_tab_completion (const char *text, int start, int end)
 		generator_func = gen_func_adsl_proto;
 	else if (g_str_has_suffix (rl_prompt, PROMPT_ADSL_ENCAP))
 		generator_func = gen_func_adsl_encap;
+	else if (g_str_has_suffix (rl_prompt, PROMPT_TUN_MODE))
+		generator_func = gen_func_tun_mode;
+	else if (g_str_has_suffix (rl_prompt, PROMPT_IP_TUNNEL_MODE))
+		generator_func = gen_func_ip_tunnel_mode;
+	else if (g_str_has_suffix (rl_prompt, PROMPT_MACVLAN_MODE))
+		generator_func = gen_func_macvlan_mode;
 
 	if (generator_func)
 		match_array = rl_completion_matches (text, generator_func);
@@ -5726,6 +6923,9 @@ do_connection_add (NmCli *nmc, int argc, char **argv)
 	gboolean ifname_mandatory = TRUE;
 	const char *save = NULL;
 	gboolean save_bool = TRUE;
+	const char *master = NULL;
+	const char *checked_master = NULL;
+	const char *slave_type = NULL;
 	AddConnectionInfo *info = NULL;
 	const char *setting_name;
 	GError *error = NULL;
@@ -5734,6 +6934,8 @@ do_connection_add (NmCli *nmc, int argc, char **argv)
 	                         {"autoconnect", TRUE, &autoconnect, FALSE},
 	                         {"ifname",      TRUE, &ifname,      FALSE},
 	                         {"save",        TRUE, &save,        FALSE},
+	                         {"master",      TRUE, &master,      FALSE},
+	                         {"slave-type",  TRUE, &slave_type,  FALSE},
 	                         {NULL} };
 
 	rl_attempted_completion_function = (rl_completion_func_t *) nmcli_con_add_tab_completion;
@@ -5836,15 +7038,22 @@ do_connection_add (NmCli *nmc, int argc, char **argv)
 		char *try_name = ifname ?
 		                     g_strdup_printf ("%s-%s", get_name_alias (setting_name, nmc_valid_connection_types), ifname)
 		                   : g_strdup (get_name_alias (setting_name, nmc_valid_connection_types));
-		default_name = unique_connection_name (nmc->connections, try_name);
+		default_name = nmc_unique_connection_name (nmc->connections, try_name);
 		g_free (try_name);
 	}
+
+	if (master)
+		/* Verify master argument */
+		checked_master = normalized_master_for_slave (nmc->connections, master, slave_type, &slave_type);
+
 	g_object_set (s_con,
 	              NM_SETTING_CONNECTION_ID, default_name,
 	              NM_SETTING_CONNECTION_UUID, uuid,
 	              NM_SETTING_CONNECTION_TYPE, setting_name,
 	              NM_SETTING_CONNECTION_AUTOCONNECT, auto_bool,
 	              NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
+		      NM_SETTING_CONNECTION_MASTER, checked_master,
+	              NM_SETTING_CONNECTION_SLAVE_TYPE, slave_type,
 	              NULL);
 	g_free (uuid);
 	g_free (default_name);
@@ -5854,6 +7063,7 @@ do_connection_add (NmCli *nmc, int argc, char **argv)
 	                                  setting_name,
 	                                  nmc->connections,
 	                                  nmc->ask,
+	                                  nmc->show_secrets,
 	                                  argc,
 	                                  argv,
 	                                  &error)) {
@@ -5863,7 +7073,7 @@ do_connection_add (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	info = g_malloc0 (sizeof (AddConnectionInfo));
 	info->nmc = nmc;
@@ -5887,7 +7097,6 @@ error:
 	g_free (type_ask);
 	g_free (ifname_ask);
 
-	nmc->should_wait = FALSE;
 	return nmc->return_value;
 }
 
@@ -5945,7 +7154,8 @@ gen_cmd_nmcli (const char *text, int state)
 static char *
 gen_cmd_nmcli_prompt_color (const char *text, int state)
 {
-	const char *words[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", NULL };
+	const char *words[] = { "normal", "black", "red", "green", "yellow",
+	                        "blue", "magenta", "cyan", "white", NULL };
 	return nmc_rl_gen_func_basic (text, state, words);
 }
 
@@ -6134,33 +7344,59 @@ gen_compat_devices (const char *text, int state)
 	return ret;
 }
 
-static char *
-gen_vpn_uuids (const char *text, int state)
+static const char **
+_create_vpn_array (const GPtrArray *connections, gboolean uuid)
 {
-	const GPtrArray *connections = nmc_tab_completion.nmc->connections;
-	int c, u = 0;
-	const char **uuids;
-	char *ret;
+	int c, idx = 0;
+	const char **array;
 
 	if (connections->len < 1)
 		return NULL;
 
-	uuids = g_new (const char *, connections->len + 1);
+	array = g_new (const char *, connections->len + 1);
 	for (c = 0; c < connections->len; c++) {
 		NMConnection *connection = NM_CONNECTION (connections->pdata[c]);
 		const char *type = nm_connection_get_connection_type (connection);
 
 		if (g_strcmp0 (type, NM_SETTING_VPN_SETTING_NAME) == 0)
-			uuids[u++] = nm_connection_get_uuid (connection);
+			array[idx++] = uuid ? nm_connection_get_uuid (connection) : nm_connection_get_id (connection);
 	}
-	uuids[u] = NULL;
+	array[idx] = NULL;
+	return array;
+}
 
-	ret = nmc_rl_gen_func_basic (text, state, uuids);
+static char *
+gen_vpn_uuids (const char *text, int state)
+{
+	const GPtrArray *connections = nm_cli.connections;
+	const char **uuids;
+	char *ret;
 
+	if (connections->len < 1)
+		return NULL;
+
+	uuids = _create_vpn_array (connections, TRUE);
+	ret = nmc_rl_gen_func_basic (text, state, uuids);
 	g_free (uuids);
 	return ret;
 }
 
+static char *
+gen_vpn_ids (const char *text, int state)
+{
+	const GPtrArray *connections = nm_cli.connections;
+	const char **ids;
+	char *ret;
+
+	if (connections->len < 1)
+		return NULL;
+
+	ids = _create_vpn_array (connections, FALSE);
+	ret = nmc_rl_gen_func_basic (text, state, ids);
+	g_free (ids);
+	return ret;
+}
+
 static rl_compentry_func_t *
 get_gen_func_cmd_nmcli (const char *str)
 {
@@ -6331,6 +7567,36 @@ extract_setting_and_property (const char *prompt, const char *line,
 		g_free (prop);
 }
 
+static void
+get_setting_and_property (const char *prompt, const char *line,
+                          NMSetting **setting_out, char**property_out)
+{
+	const NameItem *valid_settings_arr;
+	const char *setting_name;
+	NMSetting *setting = NULL;
+	char *property = NULL;
+	char *sett = NULL, *prop = NULL;
+
+	extract_setting_and_property (prompt, line, &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);
+
+	*setting_out = setting;
+	*property_out = property;
+
+	g_free (sett);
+	g_free (prop);
+}
+
 static gboolean
 _get_and_check_property (const char *prompt,
                          const char *line,
@@ -6384,38 +7650,21 @@ should_complete_vpn_uuids (const char *prompt, const char *line)
 	return _get_and_check_property (prompt, line, uuid_properties, NULL, NULL);
 }
 
-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;
+	NMSetting *setting;
+	char *property;
 	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);
-
+	get_setting_and_property (rl_prompt, rl_line_buffer, &setting, &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;
 }
 
@@ -6440,6 +7689,39 @@ should_complete_property_values (const char *prompt, const char *line, gboolean
 	return get_allowed_property_values () != NULL;
 }
 
+//FIXME: this helper should go to libnm later
+static gboolean
+_setting_property_is_boolean (NMSetting *setting, const char *property_name)
+{
+	GParamSpec *pspec;
+
+	g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
+	g_return_val_if_fail (property_name, FALSE);
+
+	pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), property_name);
+	if (pspec && pspec->value_type == G_TYPE_BOOLEAN)
+		return TRUE;
+	return FALSE;
+}
+
+static gboolean
+should_complete_boolean (const char *prompt, const char *line)
+{
+	NMSetting *setting;
+	char *property;
+	gboolean is_boolean = FALSE;
+
+	get_setting_and_property (prompt, line, &setting, &property);
+	if (setting && property)
+		is_boolean = _setting_property_is_boolean (setting, property);
+
+	if (setting)
+		g_object_unref (setting);
+	g_free (property);
+
+	return is_boolean;
+}
+
 static char *
 gen_property_values (const char *text, int state)
 {
@@ -6466,11 +7748,8 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 {
 	char **match_array = NULL;
 	const char *line = rl_line_buffer;
-	const char *prompt = rl_prompt;
 	rl_compentry_func_t *generator_func = NULL;
-	gboolean copy_char;
-	const char *p1;
-	char *p2, *prompt_tmp;
+	char *prompt_tmp;
 	char *word = NULL;
 	size_t n1;
 	int num;
@@ -6488,19 +7767,7 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 	rl_complete_with_tilde_expansion = 1;
 
 	/* Filter out possible ANSI color escape sequences */
-	p1 = prompt;
-	p2 = prompt_tmp = g_strdup (prompt);
-	copy_char = TRUE;
-	while (*p1) {
-		if (*p1 == '\33')
-			copy_char = FALSE;
-		if (copy_char)
-			*p2++ = *p1;
-		if (!copy_char && *p1 == 'm')
-			copy_char = TRUE;
-		p1++;
-	}
-	*p2 = '\0';
+	prompt_tmp = nmc_filter_out_colors ((const char *) rl_prompt);
 
 	/* Find the first non-space character */
 	n1 = strspn (line, " \t");
@@ -6546,7 +7813,8 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 						} else if (   should_complete_property_values (NULL, line, &multi)
 							   && (num == 3 || multi)) {
 							generator_func = gen_property_values;
-						}
+						} else if (should_complete_boolean (NULL, line) && num == 3)
+							generator_func = gen_func_bool_values;
 					}
 				} else if (  (   should_complete_cmd (line, end, "remove", &num, NULL)
 				              || should_complete_cmd (line, end, "describe", &num, NULL))
@@ -6592,7 +7860,8 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
 					} else if (   should_complete_property_values (prompt_tmp, NULL, &multi)
 						   && (num <= 2 || multi)) {
 						generator_func = gen_property_values;
-					}
+					} else if (should_complete_boolean (prompt_tmp, NULL) && num <= 2)
+						generator_func = gen_func_bool_values;
 				}
 				if (should_complete_cmd (line, end, "print", &num, NULL) && num <= 2)
 					generator_func = gen_cmd_print2;
@@ -6882,10 +8151,15 @@ editor_main_help (const char *command)
 		case NMC_EDITOR_MAIN_CMD_NMCLI:
 			g_print (_("nmcli [<conf-option> <value>]  :: nmcli configuration\n\n"
 			           "Configures nmcli. The following options are available:\n"
-			           "status-line yes | no        [default: no]\n"
-			           "save-confirmation yes | no  [default: yes]\n"
-			           "show-secrets yes | no       [default: no]\n"
-			           "prompt-color <0-8>          [default: 0]\n"
+			           "status-line yes | no          [default: no]\n"
+			           "save-confirmation yes | no    [default: yes]\n"
+			           "show-secrets yes | no         [default: no]\n"
+			           "prompt-color <color> | <0-8>  [default: 0]\n"
+			           "%s"  /* color table description */
+			           "\n"
+			           "Examples: nmcli> nmcli status-line yes\n"
+			           "          nmcli> nmcli save-confirmation no\n"
+			           "          nmcli> nmcli prompt-color 3\n"),
 			           "  0 = normal\n"
 			           "  1 = \33[30mblack\33[0m\n"
 			           "  2 = \33[31mred\33[0m\n"
@@ -6894,11 +8168,7 @@ editor_main_help (const char *command)
 			           "  5 = \33[34mblue\33[0m\n"
 			           "  6 = \33[35mmagenta\33[0m\n"
 			           "  7 = \33[36mcyan\33[0m\n"
-			           "  8 = \33[37mwhite\33[0m\n"
-			           "\n"
-			           "Examples: nmcli> nmcli status-line yes\n"
-			           "          nmcli> nmcli save-confirmation no\n"
-			           "          nmcli> nmcli prompt-color 3\n"));
+			           "  8 = \33[37mwhite\33[0m\n");
 			break;
 		case NMC_EDITOR_MAIN_CMD_QUIT:
 			g_print (_("quit  :: exit nmcli\n\n"
@@ -7308,7 +8578,8 @@ property_edit_submenu (NmCli *nmc,
 	/* Set global variable for use in TAB completion */
 	nmc_tab_completion.property = prop_name;
 
-	prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ",
+	prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
+	                       "nmcli %s.%s> ",
 	                       nm_setting_get_name (curr_setting), prop_name);
 
 	while (cmd_property_loop) {
@@ -7511,30 +8782,6 @@ split_editor_main_cmd_args (const char *str, char **setting, char **property, ch
 }
 
 static NMSetting *
-is_setting_valid (NMConnection *connection, const NameItem *valid_settings, char *setting)
-{
-	const char *setting_name;
-
-	if (!(setting_name = check_valid_name (setting, valid_settings, NULL)))
-		return NULL;
-	return nm_connection_get_setting_by_name (connection, setting_name);
-}
-
-static char *
-is_property_valid (NMSetting *setting, const char *property, GError **error)
-{
-	char **valid_props = NULL;
-	const char *prop_name;
-	char *ret;
-
-	valid_props = nmc_setting_get_valid_properties (setting);
-	prop_name = nmc_string_is_valid (property, (const char **) valid_props, error);
-	ret = g_strdup (prop_name);
-	g_strfreev (valid_props);
-	return ret;
-}
-
-static NMSetting *
 create_setting_by_name (const char *name, const NameItem *valid_settings)
 {
 	const char *setting_name;
@@ -7659,13 +8906,14 @@ typedef	struct {
 } NmcEditorMenuContext;
 
 static void
-menu_switch_to_level0 (NmcEditorMenuContext *menu_ctx,
+menu_switch_to_level0 (NmCli *nmc,
+                       NmcEditorMenuContext *menu_ctx,
                        const char *prompt,
                        NmcTermColor prompt_color)
 {
 	menu_ctx->level = 0;
 	g_free (menu_ctx->main_prompt);
-	menu_ctx->main_prompt = nmc_colorize (prompt_color, "%s", prompt);
+	menu_ctx->main_prompt = nmc_colorize (nmc, prompt_color, NMC_TERM_FORMAT_NORMAL, "%s", prompt);
 	menu_ctx->curr_setting = NULL;
 	g_strfreev (menu_ctx->valid_props);
 	menu_ctx->valid_props = NULL;
@@ -7674,14 +8922,16 @@ menu_switch_to_level0 (NmcEditorMenuContext *menu_ctx,
 }
 
 static void
-menu_switch_to_level1 (NmcEditorMenuContext *menu_ctx,
+menu_switch_to_level1 (NmCli *nmc,
+                       NmcEditorMenuContext *menu_ctx,
                        NMSetting *setting,
                        const char *setting_name,
                        NmcTermColor prompt_color)
 {
 	menu_ctx->level = 1;
 	g_free (menu_ctx->main_prompt);
-	menu_ctx->main_prompt = nmc_colorize (prompt_color, "nmcli %s> ", setting_name);
+	menu_ctx->main_prompt = nmc_colorize (nmc, prompt_color, NMC_TERM_FORMAT_NORMAL,
+	                                      "nmcli %s> ", setting_name);
 	menu_ctx->curr_setting = setting;
 	g_strfreev (menu_ctx->valid_props);
 	menu_ctx->valid_props = nmc_setting_get_valid_properties (menu_ctx->curr_setting);
@@ -7715,7 +8965,8 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 	g_print (_("You may edit the following settings: %s\n"), valid_settings_str);
 
 	menu_ctx.level = 0;
-	menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, BASE_PROMPT);
+	menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
+	                                     BASE_PROMPT);
 	menu_ctx.curr_setting = NULL;
 	menu_ctx.valid_props = NULL;
 	menu_ctx.valid_props_str = NULL;
@@ -7873,7 +9124,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 				nmc_tab_completion.setting = setting;
 
 				/* Switch to level 1 */
-				menu_switch_to_level1 (&menu_ctx, setting, setting_name, nmc->editor_prompt_color);
+				menu_switch_to_level1 (nmc, &menu_ctx, setting, setting_name, nmc->editor_prompt_color);
 
 				if (!cmd_arg_s) {
 					g_print (_("You may edit the following properties: %s\n"), menu_ctx.valid_props_str);
@@ -7947,7 +9198,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 					connection_remove_setting (connection, ss);
 					if (ss == menu_ctx.curr_setting) {
 						/* If we removed the setting we are in, go up */
-						menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
+						menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
 						nmc_tab_completion.setting = NULL;  /* for TAB completion */
 					}
 				} else {
@@ -7970,7 +9221,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 							/* coverity[copy_paste_error] - suppress Coverity COPY_PASTE_ERROR defect */
 							if (ss == menu_ctx.curr_setting) {
 								/* If we removed the setting we are in, go up */
-								menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
+								menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
 								nmc_tab_completion.setting = NULL;  /* for TAB completion */
 							}
 						} else
@@ -8269,7 +9520,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 			}
 
 			nmc->nowait_flag = FALSE;
-			nmc->should_wait = TRUE;
+			nmc->should_wait++;
 			nmc->print_output = NMC_PRINT_PRETTY;
 			if (!nmc_activate_connection (nmc, NM_CONNECTION (rem_con), ifname, ap_nsp, ap_nsp, NULL,
 			                              activate_connection_editor_cb, &tmp_err)) {
@@ -8312,7 +9563,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 		case NMC_EDITOR_MAIN_CMD_BACK:
 			/* Go back (up) an the menu */
 			if (menu_ctx.level == 1) {
-				menu_switch_to_level0 (&menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
+				menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color);
 				nmc_tab_completion.setting = NULL;  /* for TAB completion */
 			}
 			break;
@@ -8348,18 +9599,21 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
 				} else
 					nmc->editor_show_secrets = bb;
 			} else if (cmd_arg_p && matches (cmd_arg_p, "prompt-color") == 0) {
-				unsigned long color;
-				if (!nmc_string_to_uint (cmd_arg_v ? g_strstrip (cmd_arg_v) : "X",
-				                         TRUE, 0, 8, &color))
-					g_print (_("Error: bad color number: '%s'; use <0-8>\n"),
-					         cmd_arg_v ? cmd_arg_v : "");
-				else {
+				GError *tmp_err = NULL;
+				NmcTermColor color;
+				color = nmc_term_color_parse_string (cmd_arg_v ? g_strstrip (cmd_arg_v) : " ", &tmp_err);
+				if (tmp_err) {
+					g_print (_("Error: bad color: %s\n"), tmp_err->message);
+					g_clear_error (&tmp_err);
+				} else {
 					nmc->editor_prompt_color = color;
 					g_free (menu_ctx.main_prompt);
 					if (menu_ctx.level == 0)
-						menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, BASE_PROMPT);
+						menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
+						                                     BASE_PROMPT);
 					else
-						menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s> ",
+						menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
+						                                     "nmcli %s> ",
 						                                     nm_setting_get_name (menu_ctx.curr_setting));
 				}
 			} else if (!cmd_arg_p) {
@@ -8696,8 +9950,8 @@ do_connection_edit (NmCli *nmc, int argc, char **argv)
 		if (con_name)
 			default_name = g_strdup (con_name);
 		else
-			default_name = unique_connection_name (nmc->connections,
-			                                       get_name_alias (connection_type, nmc_valid_connection_types));
+			default_name = nmc_unique_connection_name (nmc->connections,
+			                                           get_name_alias (connection_type, nmc_valid_connection_types));
 
 		g_object_set (s_con,
 		              NM_SETTING_CONNECTION_ID, default_name,
@@ -8740,14 +9994,14 @@ do_connection_edit (NmCli *nmc, int argc, char **argv)
 		g_object_unref (connection);
 	g_free (nmc_tab_completion.con_type);
 
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 	return nmc->return_value;
 
 error:
 	g_assert (!connection);
 	g_free (type_ask);
 
-	nmc->should_wait = FALSE;
+	nmc->should_wait++;
 	return nmc->return_value;
 }
 
@@ -8785,21 +10039,11 @@ do_connection_modify (NmCli *nmc,
 {
 	NMConnection *connection = NULL;
 	NMRemoteConnection *rc = NULL;
-	NMSetting *setting;
-	NMSettingConnection *s_con;
-	const char *con_type;
 	const char *name;
 	const char *selector = NULL;
-	const char *s_dot_p;
-	const char *value;
-	char **strv = NULL;
-	const char *setting_name;
-	char *property_name = NULL;
-	gboolean append = FALSE;
-	gboolean remove = FALSE;
 	GError *error = NULL;
 
-	nmc->should_wait = FALSE;
+	nmc->return_value = NMC_RESULT_SUCCESS;
 
 	if (argc == 0) {
 		g_string_printf (nmc->return_text, _("Error: No arguments provided."));
@@ -8838,9 +10082,6 @@ do_connection_modify (NmCli *nmc,
 		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
 		goto finish;
 	}
-	s_con = nm_connection_get_setting_connection (NM_CONNECTION (rc));
-	g_assert (s_con);
-	con_type = nm_setting_connection_get_connection_type (s_con);
 
 	if (next_arg (&argc, &argv) != 0) {
 		g_string_printf (nmc->return_text, _("Error: <setting>.<property> argument is missing."));
@@ -8848,116 +10089,163 @@ do_connection_modify (NmCli *nmc,
 		goto finish;
 	}
 
-	/* Go through arguments and set properties */
-	while (argc) {
-		s_dot_p = *argv;
-		next_arg (&argc, &argv);
-		value = *argv;
-		next_arg (&argc, &argv);
+	if (!read_connection_properties (NM_CONNECTION (rc), argc, argv, &error)) {
+		g_string_assign (nmc->return_text, error->message);
+		nmc->return_value = error->code;
+		g_clear_error (&error);
+		goto finish;
+	}
 
-		if (!s_dot_p) {
-			g_string_printf (nmc->return_text, _("Error: <setting>.<property> argument is missing."));
-			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-			goto finish;
-		}
-		if (!value) {
-			g_string_printf (nmc->return_text, _("Error: value for '%s' is missing."), s_dot_p);
-			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-			goto finish;
-		}
-		/* Empty string will reset the value to default */
-		if (value[0] == '\0')
-			value = NULL;
+	update_connection (!temporary, rc, modify_connection_cb, nmc);
 
-		if (s_dot_p[0] == '+') {
-			s_dot_p++;
-			append = TRUE;
-		} else if (s_dot_p[0] == '-') {
-			s_dot_p++;
-			remove = TRUE;
-		}
+	nmc->should_wait++;
+finish:
+	return nmc->return_value;
+}
 
-		strv = g_strsplit (s_dot_p, ".", 2);
-		if (g_strv_length (strv) != 2) {
-			g_string_printf (nmc->return_text, _("Error: invalid <setting>.<property> '%s'."),
-			                 s_dot_p);
-			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-			goto finish;
-		}
+typedef struct {
+	NmCli *nmc;
+	char *orig_id;
+	char *orig_uuid;
+	char *con_id;
+} CloneConnectionInfo;
 
-		setting_name = check_valid_name (strv[0], get_valid_settings_array (con_type), &error);
-		if (!setting_name) {
-			g_string_printf (nmc->return_text, _("Error: invalid or not allowed setting '%s': %s."),
-			                 strv[0], error->message);
+static void
+clone_connection_cb (GObject *client,
+                     GAsyncResult *result,
+                     gpointer user_data)
+{
+	CloneConnectionInfo *info = (CloneConnectionInfo *) user_data;
+	NmCli *nmc = info->nmc;
+	NMRemoteConnection *connection;
+	GError *error = NULL;
+
+	connection = nm_client_add_connection_finish (NM_CLIENT (client), result, &error);
+	if (error) {
+		g_string_printf (nmc->return_text,
+		                 _("Error: Failed to add '%s' connection: %s"),
+		                 info->con_id, error->message);
+		g_error_free (error);
+		nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
+	} else {
+		g_print (_("%s (%s) cloned as %s (%s).\n"),
+		         info->orig_id,
+		         info->orig_uuid,
+		         nm_connection_get_id (NM_CONNECTION (connection)),
+		         nm_connection_get_uuid (NM_CONNECTION (connection)));
+		g_object_unref (connection);
+	}
+
+	g_free (info->con_id);
+	g_free (info->orig_id);
+	g_free (info->orig_uuid);
+	g_slice_free (CloneConnectionInfo, info);
+	quit ();
+}
+
+static NMCResultCode
+do_connection_clone (NmCli *nmc, gboolean temporary, int argc, char **argv)
+{
+	NMConnection *connection = NULL;
+	NMConnection *new_connection = NULL;
+	NMSettingConnection *s_con;
+	CloneConnectionInfo *info;
+	const char *name;
+	const char *new_name;
+	char *name_ask = NULL;
+	char *new_name_ask = NULL;
+	const char *selector = NULL;
+	char *uuid;
+
+	if (argc == 0) {
+		if (nmc->ask) {
+			name = name_ask = nmc_readline (PROMPT_CONNECTION);
+			new_name = new_name_ask = nmc_readline (_("New connection name: "));
+		} else {
+			g_string_printf (nmc->return_text, _("Error: No arguments provided."));
 			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 			goto finish;
 		}
-		setting = nm_connection_get_setting_by_name (NM_CONNECTION (rc), setting_name);
-		if (!setting) {
-			setting = nmc_setting_new_for_name (setting_name);
-			if (!setting) {
-				/* This should really not happen */
-				g_string_printf (nmc->return_text,
-				                 "Error: don't know how to create '%s' setting.",
-				                  setting_name);
-				nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+	} else {
+		if (   strcmp (*argv, "id") == 0
+		    || strcmp (*argv, "uuid") == 0
+		    || strcmp (*argv, "path") == 0) {
+
+			selector = *argv;
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."),
+				                 selector);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 				goto finish;
 			}
-			nm_connection_add_setting (NM_CONNECTION (rc), setting);
 		}
-
-		property_name = is_property_valid (setting, strv[1], &error);
-		if (!property_name) {
-			g_string_printf (nmc->return_text, _("Error: invalid property '%s': %s."),
-			                 strv[1], error->message);
+		name = *argv;
+		if (next_arg (&argc, &argv) != 0) {
+			g_string_printf (nmc->return_text, _("Error: <new name> argument is missing."));
 			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 			goto finish;
 		}
-
-		if (!remove) {
-			/* Set/add value */
-			if (!append)
-				nmc_setting_reset_property (setting, property_name, NULL);
-			if (!nmc_setting_set_property (setting, property_name, value, &error)) {
-				g_string_printf (nmc->return_text, _("Error: failed to modify %s.%s: %s."),
-				                 strv[0], strv[1], error->message);
-				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-				goto finish;
-			}
-		} else {
-			/* Remove value
-			 * - either empty: remove whole value
-			 * - or specified by index <0-n>: remove item at the index
-			 * - or option name: remove item with the option name
-			 */
-			if (value) {
-				unsigned long idx;
-				if (nmc_string_to_uint (value, TRUE, 0, G_MAXUINT32, &idx))
-					nmc_setting_remove_property_option (setting, property_name, NULL, idx, &error);
-				else
-					nmc_setting_remove_property_option (setting, property_name, value, 0, &error);
-				if (error) {
-					g_string_printf (nmc->return_text, _("Error: failed to remove a value from %s.%s: %s."),
-					                 strv[0], strv[1], error->message);
-					nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-					goto finish;
-				}
-			} else
-				nmc_setting_reset_property (setting, property_name, NULL);
+		new_name = *argv;
+		if (next_arg (&argc, &argv) == 0) {
+			g_string_printf (nmc->return_text, _("Error: unexpected extra argument '%s'."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto finish;
 		}
+	}
 
-		g_strfreev (strv);
-		strv = NULL;
+	if (!name) {
+		g_string_printf (nmc->return_text, _("Error: connection ID is missing."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
+	}
+	if (!new_name) {
+		g_string_printf (nmc->return_text, _("Error: <new name> argument is missing."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
 	}
 
-	update_connection (!temporary, rc, modify_connection_cb, nmc);
+	connection = nmc_find_connection (nmc->connections, selector, name, NULL);
+	if (!connection) {
+		g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
+		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		goto finish;
+	}
+
+	/* Copy the connection */
+	new_connection = nm_simple_connection_new_clone (connection);
 
+	s_con = nm_connection_get_setting_connection (new_connection);
+	g_assert (s_con);
+	uuid = nm_utils_uuid_generate ();
+	g_object_set (s_con,
+	              NM_SETTING_CONNECTION_ID, new_name,
+	              NM_SETTING_CONNECTION_UUID, uuid,
+	              NULL);
+	g_free (uuid);
+
+	/* Merge secrets into the new connection */
+	update_secrets_in_connection (NM_REMOTE_CONNECTION (connection), new_connection);
+
+	info = g_slice_new0 (CloneConnectionInfo);
+	info->nmc = nmc;
+	info->orig_id = g_strdup (nm_connection_get_id (connection));
+	info->orig_uuid = g_strdup (nm_connection_get_uuid (connection));
+	info->con_id = g_strdup (nm_connection_get_id (new_connection));
+
+	/* Add the new cloned connection to NetworkManager */
+	add_new_connection (!temporary,
+	                    nmc->client,
+	                    new_connection,
+	                    clone_connection_cb,
+	                    info);
+
+	nmc->should_wait = TRUE;
 finish:
-	nmc->should_wait = (nmc->return_value == NMC_RESULT_SUCCESS);
-	g_free (property_name);
-	if (strv)
-		g_strfreev (strv);
-	g_clear_error (&error);
+	if (new_connection)
+		g_object_unref (new_connection);
+	g_free (name_ask);
+	g_free (new_name_ask);
+
 	return nmc->return_value;
 }
 
@@ -9057,7 +10345,7 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
 	info->timeout_id = g_timeout_add_seconds (nmc->timeout, connection_op_timeout_cb, info);
 
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	g_signal_connect (nmc->client, NM_CLIENT_CONNECTION_REMOVED,
 	                  G_CALLBACK (connection_removed_cb), info);
@@ -9079,13 +10367,108 @@ finish:
 	return nmc->return_value;
 }
 
+static void
+connection_changed (NMConnection *connection, NmCli *nmc)
+{
+	g_print (_("%s: connection profile changed\n"), nm_connection_get_id (connection));
+}
+
+static void
+connection_watch (NmCli *nmc, NMConnection *connection)
+{
+	nmc->should_wait++;
+	g_signal_connect (connection, NM_CONNECTION_CHANGED, G_CALLBACK (connection_changed), nmc);
+}
+
+static void
+connection_unwatch (NmCli *nmc, NMConnection *connection)
+{
+	if (g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_changed), nmc))
+		nmc->should_wait--;
+
+	/* Terminate if all the watched connections disappeared. */
+	if (!nmc->should_wait)
+		quit ();
+}
+
+static void
+connection_added (NMClient *client, NMRemoteConnection *con, NmCli *nmc)
+{
+	NMConnection *connection = NM_CONNECTION (con);
+
+	g_print (_("%s: connection profile created\n"), nm_connection_get_id (connection));
+	connection_watch (nmc, connection);
+}
+
+static void
+connection_removed (NMClient *client, NMRemoteConnection *con, NmCli *nmc)
+{
+	NMConnection *connection = NM_CONNECTION (con);
+
+	g_print (_("%s: connection profile removed\n"), nm_connection_get_id (connection));
+	connection_unwatch (nmc, connection);
+}
+
+static NMCResultCode
+do_connection_monitor (NmCli *nmc, int argc, char **argv)
+{
+	if (argc == 0) {
+		/* No connections specified. Monitor all. */
+		int i;
+
+		nmc->connections = nm_client_get_connections (nmc->client);
+		for (i = 0; i < nmc->connections->len; i++)
+			connection_watch (nmc, g_ptr_array_index (nmc->connections, i));
+
+		/* We'll watch the connection additions too, never exit. */
+		nmc->should_wait++;
+		g_signal_connect (nmc->client, NM_CLIENT_CONNECTION_ADDED, G_CALLBACK (connection_added), nmc);
+	} else {
+		/* Look up the specified connections and watch them. */
+		NMConnection *connection;
+		char **arg_ptr = argv;
+		int arg_num = argc;
+		int pos = 0;
+
+		do {
+			const char *selector = NULL;
+
+			if (   strcmp (*arg_ptr, "id") == 0
+			    || strcmp (*arg_ptr, "uuid") == 0
+			    || strcmp (*arg_ptr, "path") == 0) {
+				selector = *arg_ptr;
+				if (next_arg (&arg_num, &arg_ptr) != 0) {
+					g_string_printf (nmc->return_text, _("Error: %s argument is missing."), selector);
+					return NMC_RESULT_ERROR_USER_INPUT;
+				}
+			}
+
+			connection = nmc_find_connection (nmc->connections, selector, *arg_ptr, &pos);
+			if (connection) {
+				connection_watch (nmc, connection);
+			} else {
+				g_printerr (_("Error: unknown connection '%s'\n"), *arg_ptr);
+				g_string_printf (nmc->return_text, _("Error: not all connections found."));
+				return NMC_RESULT_ERROR_NOT_FOUND;
+			}
+
+			/* Take next argument (if there's no other connection of the same name) */
+			if (!pos)
+				next_arg (&arg_num, &arg_ptr);
+		} while (arg_num > 0);
+	}
+
+	g_signal_connect (nmc->client, NM_CLIENT_CONNECTION_REMOVED, G_CALLBACK (connection_removed), nmc);
+
+	return NMC_RESULT_SUCCESS;
+}
+
 static NMCResultCode
 do_connection_reload (NmCli *nmc, int argc, char **argv)
 {
 	GError *error = NULL;
 
 	nmc->return_value = NMC_RESULT_SUCCESS;
-	nmc->should_wait = FALSE;
 
 	if (!nm_client_reload_connections (nmc->client, NULL, &error)) {
 		g_string_printf (nmc->return_text, _("Error: failed to reload connections: %s."),
@@ -9105,7 +10488,6 @@ do_connection_load (NmCli *nmc, int argc, char **argv)
 	int i;
 
 	nmc->return_value = NMC_RESULT_SUCCESS;
-	nmc->should_wait = FALSE;
 
 	if (argc == 0) {
 		g_string_printf (nmc->return_text, _("Error: No connection specified."));
@@ -9136,6 +10518,236 @@ do_connection_load (NmCli *nmc, int argc, char **argv)
 	return nmc->return_value;
 }
 
+// FIXME: change the text when non-VPN connection types are supported
+#define PROMPT_IMPORT_TYPE  PROMPT_VPN_TYPE
+#define PROMPT_IMPORT_FILE _("File to import: ")
+
+static NMCResultCode
+do_connection_import (NmCli *nmc, gboolean temporary, int argc, char **argv)
+{
+	GError *error = NULL;
+	const char *type = NULL, *filename = NULL;
+	char *type_ask = NULL, *filename_ask = NULL;
+	AddConnectionInfo *info;
+	NMConnection *connection = NULL;
+	NMVpnEditorPlugin *plugin;
+
+	if (argc == 0) {
+		if (nmc->ask) {
+			type_ask = nmc_readline (PROMPT_IMPORT_TYPE);
+			filename_ask = nmc_readline (PROMPT_IMPORT_FILE);
+			type = type_ask = type_ask ? g_strstrip (type_ask) : NULL;
+			filename = filename_ask = filename_ask ? g_strstrip (filename_ask) : NULL;
+		} else {
+			g_string_printf (nmc->return_text, _("Error: No arguments provided."));
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto finish;
+		}
+	}
+
+	while (argc > 0) {
+		if (strcmp (*argv, "type") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto finish;
+			}
+			if (!type)
+				type = *argv;
+			else
+				g_printerr (_("Warning: 'type' already specified, ignoring extra one.\n"));
+
+		} else if (strcmp (*argv, "file") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto finish;
+			}
+			if (!filename)
+				filename = *argv;
+			else
+				g_printerr (_("Warning: 'file' already specified, ignoring extra one.\n"));
+		} else {
+			g_string_printf (nmc->return_text, _("Unknown parameter: %s"), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto finish;
+		}
+
+		argc--;
+		argv++;
+	}
+
+	if (!type) {
+		g_string_printf (nmc->return_text, _("Error: 'type' argument is required."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
+	}
+	if (!filename) {
+		g_string_printf (nmc->return_text, _("Error: 'file' argument is required."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
+	}
+
+	/* Import VPN configuration */
+	plugin = nm_vpn_get_plugin_by_service (type, &error);
+	if (!plugin) {
+		g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."),
+		                 error->message);
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto finish;
+	}
+
+	connection = nm_vpn_editor_plugin_import (plugin, filename, &error);
+	if (!connection) {
+		g_string_printf (nmc->return_text, _("Error: failed to import '%s': %s."),
+		                 filename, error->message);
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto finish;
+	}
+
+	info = g_malloc0 (sizeof (AddConnectionInfo));
+	info->nmc = nmc;
+	info->con_name = g_strdup (nm_connection_get_id (connection));
+
+	/* Add the new imported connection to NetworkManager */
+	add_new_connection (!temporary,
+	                    nmc->client,
+	                    connection,
+	                    add_connection_cb,
+	                    info);
+
+	nmc->should_wait = TRUE;
+finish:
+	if (connection)
+		g_object_unref (connection);
+	g_clear_error (&error);
+	g_free (type_ask);
+	g_free (filename_ask);
+	return nmc->return_value;
+}
+
+static NMCResultCode
+do_connection_export (NmCli *nmc, int argc, char **argv)
+{
+	NMConnection *connection = NULL;
+	const char *name;
+	const char *out_name = NULL;
+	char *name_ask = NULL;
+	char *out_name_ask = NULL;
+	const char *path = NULL;
+	const char *selector = NULL;
+	const char *type = NULL;
+	NMVpnEditorPlugin *plugin;
+	GError *error = NULL;
+	char tmpfile[] = "/tmp/nmcli-export-temp-XXXXXX";
+
+	if (argc == 0) {
+		if (nmc->ask) {
+			name_ask = nmc_readline (PROMPT_VPN_CONNECTION);
+			name = name_ask = name_ask ? g_strstrip (name_ask) : NULL;
+			out_name = out_name_ask = nmc_readline (_("Output file name: "));
+		} else {
+			g_string_printf (nmc->return_text, _("Error: No arguments provided."));
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto finish;
+		}
+	} else {
+		if (   strcmp (*argv, "id") == 0
+		    || strcmp (*argv, "uuid") == 0
+		    || strcmp (*argv, "path") == 0) {
+
+			selector = *argv;
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."),
+				                 selector);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto finish;
+			}
+		}
+		name = *argv;
+		if (next_arg (&argc, &argv) == 0)
+			out_name = *argv;
+
+		if (next_arg (&argc, &argv) == 0) {
+			g_string_printf (nmc->return_text, _("Error: unknown extra argument: '%s'."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto finish;
+		}
+	}
+
+	if (!name) {
+		g_string_printf (nmc->return_text, _("Error: connection ID is missing."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
+	}
+	connection = nmc_find_connection (nmc->connections, selector, name, NULL);
+	if (!connection) {
+		g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
+		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		goto finish;
+	}
+
+	type = nm_connection_get_connection_type (connection);
+	if (g_strcmp0 (type, NM_SETTING_VPN_SETTING_NAME) != 0) {
+		g_string_printf (nmc->return_text, _("Error: the connection is not VPN."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto finish;
+	}
+	type = nm_setting_vpn_get_service_type (nm_connection_get_setting_vpn (connection));
+
+	/* Export VPN configuration */
+	plugin = nm_vpn_get_plugin_by_service (type, &error);
+	if (!plugin) {
+		g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."),
+		                 error->message);
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto finish;
+	}
+
+	if (out_name)
+		path = out_name;
+	else {
+		int fd;
+		fd = g_mkstemp (tmpfile);
+		if (fd == -1) {
+			g_string_printf (nmc->return_text, _("Error: failed to create temporary file %s."), tmpfile);
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			goto finish;
+		}
+		close (fd);
+		path = tmpfile;
+	}
+
+	if (!nm_vpn_editor_plugin_export (plugin, path, connection, &error)) {
+		g_string_printf (nmc->return_text, _("Error: failed to export '%s': %s."),
+		                 nm_connection_get_id (connection), error ? error->message : "(unknown)");
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto finish;
+	}
+
+	/* No output file -> copy data to stdout */
+	if (!out_name) {
+		char *contents = NULL;
+		gsize len = 0;
+		if (!g_file_get_contents (path, &contents, &len, &error)) {
+			g_string_printf (nmc->return_text, _("Error: failed to read temporary file '%s': %s."),
+			                 path, error->message);
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			goto finish;
+		}
+		g_print ("%s", contents);
+		g_free (contents);
+	}
+
+finish:
+	if (!out_name && path)
+		unlink (path);
+	g_clear_error (&error);
+	g_free (name_ask);
+	g_free (out_name_ask);
+	return nmc->return_value;
+}
+
 
 typedef struct {
 	NmCli *nmc;
@@ -9189,6 +10801,32 @@ gen_func_connection_names (const char *text, int state)
 	return ret;
 }
 
+static char *
+gen_func_active_connection_names (const char *text, int state)
+{
+	int i;
+	const GPtrArray *acs;
+	const char **connections;
+	char *ret;
+
+	if (!nm_cli.client)
+		return NULL;
+
+	acs = nm_client_get_active_connections (nm_cli.client);
+	if (!acs || acs->len == 0)
+		return NULL;
+
+	connections = g_new (const char *, acs->len + 1);
+	for (i = 0; i < acs->len; i++)
+		connections[i] = nm_active_connection_get_id (acs->pdata[i]);
+	connections[i] = NULL;
+
+	ret = nmc_rl_gen_func_basic (text, state, connections);
+
+	g_free (connections);
+	return ret;
+}
+
 static char **
 nmcli_con_tab_completion (const char *text, int start, int end)
 {
@@ -9208,6 +10846,15 @@ nmcli_con_tab_completion (const char *text, int start, int end)
 		generator_func = gen_func_connection_names;
 	} else if (g_strcmp0 (rl_prompt, PROMPT_CONNECTIONS) == 0) {
 		generator_func = gen_func_connection_names;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_ACTIVE_CONNECTIONS) == 0) {
+		generator_func = gen_func_active_connection_names;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_IMPORT_TYPE) == 0) {
+		generator_func = gen_func_vpn_types;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_IMPORT_FILE) == 0) {
+		rl_attempted_completion_over = 0;
+		rl_complete_with_tilde_expansion = 1;
+	} else if (g_strcmp0 (rl_prompt, PROMPT_VPN_CONNECTION) == 0) {
+		generator_func = gen_vpn_ids;
 	}
 
 	if (generator_func)
@@ -9216,6 +10863,66 @@ nmcli_con_tab_completion (const char *text, int start, int end)
 	return match_array;
 }
 
+static GArray *
+parse_preferred_connection_order (const char *order, GError **error)
+{
+	char **strv, **iter;
+	const char *str;
+	GArray *order_arr;
+	NmcSortOrder val;
+	gboolean inverse, unique;
+	int i;
+
+	strv = nmc_strsplit_set (order, ":", -1);
+	if (!strv || !*strv) {
+		g_set_error (error, NMCLI_ERROR, 0,
+		             _("incorrect string '%s' of '--order' option"), order);
+		g_strfreev (strv);
+		return NULL;
+	}
+
+	order_arr = g_array_sized_new (FALSE, FALSE, sizeof (NmcSortOrder), 4);
+	for (iter = strv; iter && *iter; iter++) {
+		str = *iter;
+		inverse = FALSE;
+		if (str[0] == '-')
+			inverse = TRUE;
+		if (str[0] == '+' || str[0] == '-')
+			str++;
+
+		if (matches (str, "active") == 0)
+			val = inverse ? NMC_SORT_ACTIVE_INV : NMC_SORT_ACTIVE;
+		else if (matches (str, "name") == 0)
+			val = inverse ? NMC_SORT_NAME_INV : NMC_SORT_NAME;
+		else if (matches (str, "type") == 0)
+			val = inverse ? NMC_SORT_TYPE_INV : NMC_SORT_TYPE;
+		else if (matches (str, "path") == 0)
+			val = inverse ? NMC_SORT_PATH_INV : NMC_SORT_PATH;
+		else {
+			g_array_unref (order_arr);
+			order_arr = NULL;
+			g_set_error (error, NMCLI_ERROR, 0,
+			             _("incorrect item '%s' in '--order' option"), *iter);
+			break;
+		}
+		/* Check for duplicates and ignore them. */
+		unique = TRUE;
+		for (i = 0; i < order_arr->len; i++) {
+			if (abs (g_array_index (order_arr, NmcSortOrder, i)) - abs (val) == 0) {
+				unique = FALSE;
+				break;
+			}
+		}
+
+		/* Value is ok and unique, add it to the array */
+		if (unique)
+			g_array_append_val (order_arr, val);
+	}
+
+	g_strfreev (strv);
+	return order_arr;
+}
+
 /* Entry point function for connections-related commands: 'nmcli connection' */
 NMCResultCode
 do_connections (NmCli *nmc, int argc, char **argv)
@@ -9258,26 +10965,43 @@ do_connections (NmCli *nmc, int argc, char **argv)
 	if (argc == 0) {
 		if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
 			goto opt_error;
-		nmc->return_value = do_connections_show (nmc, FALSE, FALSE, argc, argv);
+		nmc->return_value = do_connections_show (nmc, FALSE, FALSE, NULL, argc, argv);
 	} else {
 		if (matches (*argv, "show") == 0) {
 			gboolean active = FALSE;
 			gboolean show_secrets = FALSE;
+			GArray *order = NULL;
 			int i;
 
 			next_arg (&argc, &argv);
 			/* check connection show options [--active] [--show-secrets] */
-			for (i = 0; i < 2; i++) {
+			for (i = 0; i < 3; i++) {
 				if (!active && nmc_arg_is_option (*argv, "active")) {
 					active = TRUE;
 					next_arg (&argc, &argv);
 				}
+				/* --show-secrets is deprecated in favour of global --show-secrets */
+				/* Keep it here for backwards compatibility */
 				if (!show_secrets && nmc_arg_is_option (*argv, "show-secrets")) {
 					show_secrets = TRUE;
 					next_arg (&argc, &argv);
 				}
+				if (!order && nmc_arg_is_option (*argv, "order")) {
+					if (next_arg (&argc, &argv) != 0) {
+						g_set_error_literal (&error, NMCLI_ERROR, 0,
+						                     _("'--order' argument is missing"));
+						goto opt_error;
+					}
+					order = parse_preferred_connection_order (*argv, &error);
+					if (error)
+						goto opt_error;
+					next_arg (&argc, &argv);
+				}
 			}
-			nmc->return_value = do_connections_show (nmc, active, show_secrets, argc, argv);
+			show_secrets = nmc->show_secrets || show_secrets;
+			nmc->return_value = do_connections_show (nmc, active, show_secrets, order, argc, argv);
+			if (order)
+				g_array_unref (order);
 		} else if (matches(*argv, "up") == 0) {
 			nmc->return_value = do_connection_up (nmc, argc-1, argv+1);
 		} else if (matches(*argv, "down") == 0) {
@@ -9285,7 +11009,7 @@ do_connections (NmCli *nmc, int argc, char **argv)
 		} else if (matches(*argv, "add") == 0) {
 			nmc->return_value = do_connection_add (nmc, argc-1, argv+1);
 		} else if (matches(*argv, "edit") == 0) {
-			nmc->should_wait = TRUE;
+			nmc->should_wait++;
 			editor_thread_data.nmc = nmc;
 			editor_thread_data.argc = argc - 1;
 			editor_thread_data.argv = argv + 1;
@@ -9293,6 +11017,8 @@ do_connections (NmCli *nmc, int argc, char **argv)
 			g_thread_unref (editor_thread);
 		} else if (matches(*argv, "delete") == 0) {
 			nmc->return_value = do_connection_delete (nmc, argc-1, argv+1);
+		} else if (matches(*argv, "monitor") == 0) {
+			nmc->return_value = do_connection_monitor (nmc, argc-1, argv+1);
 		} else if (matches(*argv, "reload") == 0) {
 			nmc->return_value = do_connection_reload (nmc, argc-1, argv+1);
 		} else if (matches(*argv, "load") == 0) {
@@ -9306,6 +11032,26 @@ do_connections (NmCli *nmc, int argc, char **argv)
 				next_arg (&argc, &argv);
 			}
 			nmc->return_value = do_connection_modify (nmc, temporary, argc, argv);
+		} else if (matches (*argv, "clone") == 0) {
+			gboolean temporary = FALSE;
+
+			next_arg (&argc, &argv);
+			if (nmc_arg_is_option (*argv, "temporary")) {
+				temporary = TRUE;
+				next_arg (&argc, &argv);
+			}
+			nmc->return_value = do_connection_clone (nmc, temporary, argc, argv);
+		} else if (matches(*argv, "import") == 0) {
+			gboolean temporary = FALSE;
+
+			next_arg (&argc, &argv);
+			if (nmc_arg_is_option (*argv, "temporary")) {
+				temporary = TRUE;
+				next_arg (&argc, &argv);
+			}
+			nmc->return_value = do_connection_import (nmc, temporary, argc, argv);
+		} else if (matches(*argv, "export") == 0) {
+			nmc->return_value = do_connection_export (nmc, argc-1, argv+1);
 		} else {
 			usage ();
 			g_string_printf (nmc->return_text, _("Error: '%s' is not valid 'connection' command."), *argv);
@@ -9321,3 +11067,9 @@ opt_error:
 	g_error_free (error);
 	return nmc->return_value;
 }
+
+void
+monitor_connections (NmCli *nmc)
+{
+	do_connection_monitor (nmc, 0, NULL);
+}
diff --git a/clients/cli/connections.h b/clients/cli/connections.h
index c7368597..c158b634 100644
--- a/clients/cli/connections.h
+++ b/clients/cli/connections.h
@@ -24,4 +24,6 @@
 
 NMCResultCode do_connections (NmCli *nmc, int argc, char **argv);
 
+void monitor_connections (NmCli *nmc);
+
 #endif /* NMC_CONNECTIONS_H */
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 70c8d5d5..c1df7fee 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -25,9 +25,7 @@
 #include <errno.h>
 #include <readline/readline.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
+#include "nm-default.h"
 #include "nm-secret-agent-simple.h"
 #include "polkit-agent.h"
 #include "utils.h"
@@ -40,14 +38,14 @@
 
 /* Available fields for 'device status' */
 static NmcOutputField nmc_fields_dev_status[] = {
-	{"DEVICE",     N_("DEVICE"),     10},  /* 0 */
-	{"TYPE",       N_("TYPE"),       17},  /* 1 */
-	{"STATE",      N_("STATE"),      13},  /* 2 */
-	{"DBUS-PATH",  N_("DBUS-PATH"),  43},  /* 3 */
-	{"CONNECTION", N_("CONNECTION"), 20},  /* 4 */
-	{"CON-UUID",   N_("CON-UUID"),   38},  /* 5 */
-	{"CON-PATH",   N_("CON-PATH"),   51},  /* 6 */
-	{NULL,         NULL,              0}
+	{"DEVICE",     N_("DEVICE")},      /* 0 */
+	{"TYPE",       N_("TYPE")},        /* 1 */
+	{"STATE",      N_("STATE")},       /* 2 */
+	{"DBUS-PATH",  N_("DBUS-PATH")},   /* 3 */
+	{"CONNECTION", N_("CONNECTION")},  /* 4 */
+	{"CON-UUID",   N_("CON-UUID")},    /* 5 */
+	{"CON-PATH",   N_("CON-PATH")},    /* 6 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_STATUS_ALL     "DEVICE,TYPE,STATE,DBUS-PATH,CONNECTION,CON-UUID,CON-PATH"
 #define NMC_FIELDS_DEV_STATUS_COMMON  "DEVICE,TYPE,STATE,CONNECTION"
@@ -55,117 +53,119 @@ static NmcOutputField nmc_fields_dev_status[] = {
 
 /* Available fields for 'device show' - GENERAL part */
 static NmcOutputField nmc_fields_dev_show_general[] = {
-	{"NAME",              N_("NAME"),              10},  /* 0 */
-	{"DEVICE",            N_("DEVICE"),            10},  /* 1 */
-	{"TYPE",              N_("TYPE"),              17},  /* 2 */
-	{"NM-TYPE",           N_("NM-TYPE"),           17},  /* 3 */
-	{"VENDOR",            N_("VENDOR"),            20},  /* 4 */
-	{"PRODUCT",           N_("PRODUCT"),           50},  /* 5 */
-	{"DRIVER",            N_("DRIVER"),             9},  /* 6 */
-	{"DRIVER-VERSION",    N_("DRIVER-VERSION"),    18},  /* 7 */
-	{"FIRMWARE-VERSION",  N_("FIRMWARE-VERSION"),  18},  /* 8 */
-	{"HWADDR",            N_("HWADDR"),            19},  /* 9 */
-	{"MTU",               N_("MTU"),               10},  /* 10 */
-	{"STATE",             N_("STATE"),             14},  /* 11 */
-	{"REASON",            N_("REASON"),            25},  /* 12 */
-	{"UDI",               N_("UDI"),               64},  /* 13 */
-	{"IP-IFACE",          N_("IP-IFACE"),          10},  /* 14 */
-	{"IS-SOFTWARE",       N_("IS-SOFTWARE"),       15},  /* 15 */
-	{"NM-MANAGED",        N_("NM-MANAGED"),        15},  /* 16 */
-	{"AUTOCONNECT",       N_("AUTOCONNECT"),       15},  /* 17 */
-	{"FIRMWARE-MISSING",  N_("FIRMWARE-MISSING"),  18},  /* 18 */
-	{"PHYS-PORT-ID",      N_("PHYS-PORT-ID"),      18},  /* 19 */
-	{"CONNECTION",        N_("CONNECTION"),        20},  /* 20 */
-	{"CON-UUID",          N_("CON-UUID"),          38},  /* 21 */
-	{"CON-PATH",          N_("CON-PATH"),          51},  /* 22 */
-	{"METERED",           N_("METERED"),           10},  /* 23 */
-	{NULL, NULL, 0}
+	{"NAME",              N_("NAME")},               /* 0 */
+	{"DEVICE",            N_("DEVICE")},             /* 1 */
+	{"TYPE",              N_("TYPE")},               /* 2 */
+	{"NM-TYPE",           N_("NM-TYPE")},            /* 3 */
+	{"VENDOR",            N_("VENDOR")},             /* 4 */
+	{"PRODUCT",           N_("PRODUCT")},            /* 5 */
+	{"DRIVER",            N_("DRIVER")},             /* 6 */
+	{"DRIVER-VERSION",    N_("DRIVER-VERSION")},     /* 7 */
+	{"FIRMWARE-VERSION",  N_("FIRMWARE-VERSION")},   /* 8 */
+	{"HWADDR",            N_("HWADDR")},             /* 9 */
+	{"MTU",               N_("MTU")},                /* 10 */
+	{"STATE",             N_("STATE")},              /* 11 */
+	{"REASON",            N_("REASON")},             /* 12 */
+	{"UDI",               N_("UDI")},                /* 13 */
+	{"IP-IFACE",          N_("IP-IFACE")},           /* 14 */
+	{"IS-SOFTWARE",       N_("IS-SOFTWARE")},        /* 15 */
+	{"NM-MANAGED",        N_("NM-MANAGED")},         /* 16 */
+	{"AUTOCONNECT",       N_("AUTOCONNECT")},        /* 17 */
+	{"FIRMWARE-MISSING",  N_("FIRMWARE-MISSING")},   /* 18 */
+	{"NM-PLUGIN-MISSING", N_("NM-PLUGIN-MISSING")},  /* 19 */
+	{"PHYS-PORT-ID",      N_("PHYS-PORT-ID")},       /* 20 */
+	{"CONNECTION",        N_("CONNECTION")},         /* 21 */
+	{"CON-UUID",          N_("CON-UUID")},           /* 22 */
+	{"CON-PATH",          N_("CON-PATH")},           /* 23 */
+	{"METERED",           N_("METERED")},            /* 24 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_GENERAL_ALL     "NAME,DEVICE,TYPE,NM-TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,MTU,"\
-                                            "STATE,REASON,UDI,IP-IFACE,IS-SOFTWARE,NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,PHYS-PORT-ID,"\
-                                            "CONNECTION,CON-UUID,CON-PATH,METERED"
+                                            "STATE,REASON,UDI,IP-IFACE,IS-SOFTWARE,NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,NM-PLUGIN-MISSING,"\
+                                            "PHYS-PORT-ID,CONNECTION,CON-UUID,CON-PATH,METERED"
 #define NMC_FIELDS_DEV_SHOW_GENERAL_COMMON  "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,HWADDR,STATE"
 
 /* Available fields for 'device show' - CONNECTIONS part */
 static NmcOutputField nmc_fields_dev_show_connections[] = {
-	{"NAME",                       N_("NAME"),                       10},  /* 0 */
-	{"AVAILABLE-CONNECTION-PATHS", N_("AVAILABLE-CONNECTION-PATHS"), 80},  /* 1 */
-	{"AVAILABLE-CONNECTIONS",      N_("AVAILABLE-CONNECTIONS"),      80},  /* 2 */
-	{NULL, NULL, 0}
+	{"NAME",                       N_("NAME")},                        /* 0 */
+	{"AVAILABLE-CONNECTION-PATHS", N_("AVAILABLE-CONNECTION-PATHS")},  /* 1 */
+	{"AVAILABLE-CONNECTIONS",      N_("AVAILABLE-CONNECTIONS")},       /* 2 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL     "AVAILABLE-CONNECTION-PATHS,AVAILABLE-CONNECTIONS"
 #define NMC_FIELDS_DEV_SHOW_CONNECTIONS_COMMON  "AVAILABLE-CONNECTION-PATHS,AVAILABLE-CONNECTIONS"
 
 /* Available fields for 'device show' - CAPABILITIES part */
 static NmcOutputField nmc_fields_dev_show_cap[] = {
-	{"NAME",            N_("NAME"),            13},  /* 0 */
-	{"CARRIER-DETECT",  N_("CARRIER-DETECT"),  16},  /* 1 */
-	{"SPEED",           N_("SPEED"),           10},  /* 2 */
-	{"IS-SOFTWARE",     N_("IS-SOFTWARE"),     12},  /* 3 */
-	{NULL,              NULL,                   0}
+	{"NAME",            N_("NAME")},            /* 0 */
+	{"CARRIER-DETECT",  N_("CARRIER-DETECT")},  /* 1 */
+	{"SPEED",           N_("SPEED")},           /* 2 */
+	{"IS-SOFTWARE",     N_("IS-SOFTWARE")},     /* 3 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_CAP_ALL     "NAME,CARRIER-DETECT,SPEED,IS-SOFTWARE"
 #define NMC_FIELDS_DEV_SHOW_CAP_COMMON  "NAME,CARRIER-DETECT,SPEED,IS-SOFTWARE"
 
 /* Available fields for 'device show' - wired properties part */
 static NmcOutputField nmc_fields_dev_show_wired_prop[] = {
-	{"NAME",            N_("NAME"),     18},  /* 0 */
-	{"CARRIER",         N_("CARRIER"),  10},  /* 1 */
-	{NULL,              NULL,            0}
+	{"NAME",             N_("NAME")},              /* 0 */
+	{"CARRIER",          N_("CARRIER")},           /* 1 */
+	{"S390-SUBCHANNELS", N_("S390-SUBCHANNELS")},  /* 2 */
+	{NULL, NULL}
 };
-#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL     "NAME,CARRIER"
-#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_COMMON  "NAME,CARRIER"
+#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL     "NAME,CARRIER,S390-SUBCHANNELS"
+#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_COMMON  "NAME,CARRIER,S390-SUBCHANNELS"
 
 /* Available fields for 'device show' - wireless properties part */
 static NmcOutputField nmc_fields_dev_show_wifi_prop[] = {
-	{"NAME",       N_("NAME"),   18},  /* 0 */
-	{"WEP",        N_("WEP"),     5},  /* 1 */
-	{"WPA",        N_("WPA"),     5},  /* 2 */
-	{"WPA2",       N_("WPA2"),    6},  /* 3 */
-	{"TKIP",       N_("TKIP"),    6},  /* 4 */
-	{"CCMP",       N_("CCMP"),    6},  /* 5 */
-	{"AP",         N_("AP"),      6},  /* 6 */
-	{"ADHOC",      N_("ADHOC"),   6},  /* 7 */
-	{"2GHZ",       N_("2GHZ"),   10},  /* 8 */
-	{"5GHZ",       N_("5GHZ"),   10},  /* 9 */
-	{NULL,         NULL,          0}
+	{"NAME",       N_("NAME")},   /* 0 */
+	{"WEP",        N_("WEP")},    /* 1 */
+	{"WPA",        N_("WPA")},    /* 2 */
+	{"WPA2",       N_("WPA2")},   /* 3 */
+	{"TKIP",       N_("TKIP")},   /* 4 */
+	{"CCMP",       N_("CCMP")},   /* 5 */
+	{"AP",         N_("AP")},     /* 6 */
+	{"ADHOC",      N_("ADHOC")},  /* 7 */
+	{"2GHZ",       N_("2GHZ")},   /* 8 */
+	{"5GHZ",       N_("5GHZ")},   /* 9 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL     "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC,2GHZ,5GHZ"
 #define NMC_FIELDS_DEV_SHOW_WIFI_PROP_COMMON  "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC"
 
 /* Available fields for 'device show' - wimax properties part */
 static NmcOutputField nmc_fields_dev_show_wimax_prop[] = {
-	{"NAME",       N_("NAME"),     18},  /* 0 */
-	{"CTR-FREQ",   N_("CTR-FREQ"),  7},  /* 1 */
-	{"RSSI",       N_("RSSI"),      5},  /* 2 */
-	{"CINR",       N_("CINR"),      5},  /* 3 */
-	{"TX-POW",     N_("TX-POW"),    5},  /* 4 */
-	{"BSID",       N_("BSID"),     18},  /* 5 */
-	{NULL,         NULL,            0}
+	{"NAME",       N_("NAME")},      /* 0 */
+	{"CTR-FREQ",   N_("CTR-FREQ")},  /* 1 */
+	{"RSSI",       N_("RSSI")},      /* 2 */
+	{"CINR",       N_("CINR")},      /* 3 */
+	{"TX-POW",     N_("TX-POW")},    /* 4 */
+	{"BSID",       N_("BSID")},      /* 5 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_ALL     "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
 #define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_COMMON  "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
 
 /* Available fields for 'device wifi list' */
 static NmcOutputField nmc_fields_dev_wifi_list[] = {
-	{"NAME",       N_("NAME"),       15},  /* 0 */
-	{"SSID",       N_("SSID"),       33},  /* 1 */
-	{"SSID-HEX",   N_("SSID-HEX"),   66},  /* 2 */
-	{"BSSID",      N_("BSSID"),      19},  /* 3 */
-	{"MODE",       N_("MODE"),       16},  /* 4 */
-	{"CHAN",       N_("CHAN"),        6},  /* 5 */
-	{"FREQ",       N_("FREQ"),       10},  /* 6 */
-	{"RATE",       N_("RATE"),       10},  /* 7 */
-	{"SIGNAL",     N_("SIGNAL"),      8},  /* 8 */
-	{"BARS",       N_("BARS"),        6},  /* 9 */
-	{"SECURITY",   N_("SECURITY"),   10},  /* 10 */
-	{"WPA-FLAGS",  N_("WPA-FLAGS"),  25},  /* 11 */
-	{"RSN-FLAGS",  N_("RSN-FLAGS"),  25},  /* 12 */
-	{"DEVICE",     N_("DEVICE"),     10},  /* 13 */
-	{"ACTIVE",     N_("ACTIVE"),      8},  /* 14 */
-	{"IN-USE",     N_("*"),           1},  /* 15 */
-	{"DBUS-PATH",  N_("DBUS-PATH"),  46},  /* 16 */
-	{NULL,         NULL,              0}
+	{"NAME",       N_("NAME")},       /* 0 */
+	{"SSID",       N_("SSID")},       /* 1 */
+	{"SSID-HEX",   N_("SSID-HEX")},   /* 2 */
+	{"BSSID",      N_("BSSID")},      /* 3 */
+	{"MODE",       N_("MODE")},       /* 4 */
+	{"CHAN",       N_("CHAN")},       /* 5 */
+	{"FREQ",       N_("FREQ")},       /* 6 */
+	{"RATE",       N_("RATE")},       /* 7 */
+	{"SIGNAL",     N_("SIGNAL")},     /* 8 */
+	{"BARS",       N_("BARS")},       /* 9 */
+	{"SECURITY",   N_("SECURITY")},   /* 10 */
+	{"WPA-FLAGS",  N_("WPA-FLAGS")},  /* 11 */
+	{"RSN-FLAGS",  N_("RSN-FLAGS")},  /* 12 */
+	{"DEVICE",     N_("DEVICE")},     /* 13 */
+	{"ACTIVE",     N_("ACTIVE")},     /* 14 */
+	{"IN-USE",     N_("*")},          /* 15 */
+	{"DBUS-PATH",  N_("DBUS-PATH")},  /* 16 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_WIFI_LIST_ALL           "SSID,SSID-HEX,BSSID,MODE,CHAN,FREQ,RATE,SIGNAL,BARS,SECURITY,"\
                                                "WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE,IN-USE,DBUS-PATH"
@@ -174,14 +174,14 @@ static NmcOutputField nmc_fields_dev_wifi_list[] = {
 
 /* Available fields for 'device wimax list' */
 static NmcOutputField nmc_fields_dev_wimax_list[] = {
-	{"NAME",       N_("NAME"),        15},  /* 0 */
-	{"NSP",        N_("NSP"),         33},  /* 1 */
-	{"SIGNAL",     N_("SIGNAL"),       8},  /* 2 */
-	{"TYPE",       N_("TYPE"),        16},  /* 3 */
-	{"DEVICE",     N_("DEVICE"),      10},  /* 4 */
-	{"ACTIVE",     N_("ACTIVE"),       8},  /* 5 */
-	{"DBUS-PATH",  N_("DBUS-PATH"),   46},  /* 6 */
-	{NULL,         NULL,               0}
+	{"NAME",       N_("NAME")},       /* 0 */
+	{"NSP",        N_("NSP")},        /* 1 */
+	{"SIGNAL",     N_("SIGNAL")},     /* 2 */
+	{"TYPE",       N_("TYPE")},       /* 3 */
+	{"DEVICE",     N_("DEVICE")},     /* 4 */
+	{"ACTIVE",     N_("ACTIVE")},     /* 5 */
+	{"DBUS-PATH",  N_("DBUS-PATH")},  /* 6 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_WIMAX_LIST_ALL           "NSP,SIGNAL,TYPE,DEVICE,ACTIVE,DBUS-PATH"
 #define NMC_FIELDS_DEV_WIMAX_LIST_COMMON        "NSP,SIGNAL,TYPE,DEVICE,ACTIVE"
@@ -189,28 +189,28 @@ static NmcOutputField nmc_fields_dev_wimax_list[] = {
 
 /* Available fields for 'device show' - BOND, TEAM, BRIDGE part */
 static NmcOutputField nmc_fields_dev_show_master_prop[] = {
-	{"NAME",           N_("NAME"),     18},  /* 0 */
-	{"SLAVES",         N_("SLAVES"),   20},  /* 1 */
-	{NULL,             NULL,            0}
+	{"NAME",       N_("NAME")},    /* 0 */
+	{"SLAVES",     N_("SLAVES")},  /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_MASTER_PROP_ALL     "NAME,SLAVES"
 #define NMC_FIELDS_DEV_SHOW_MASTER_PROP_COMMON  "NAME,SLAVES"
 
 /* Available fields for 'device show' - VLAN part */
 static NmcOutputField nmc_fields_dev_show_vlan_prop[] = {
-	{"NAME",           N_("NAME"),     18},  /* 0 */
-	{"PARENT",         N_("PARENT"),   10},  /* 1 */
-	{"ID",             N_("ID"),        5},  /* 2 */
-	{NULL,             NULL,            0}
+	{"NAME",           N_("NAME")},    /* 0 */
+	{"PARENT",         N_("PARENT")},  /* 1 */
+	{"ID",             N_("ID")},      /* 2 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL     "NAME,PARENT,ID"
 #define NMC_FIELDS_DEV_SHOW_VLAN_PROP_COMMON  "NAME,PARENT,ID"
 
 /* Available fields for 'device show' - BLUETOOTH part */
 static NmcOutputField nmc_fields_dev_show_bluetooth[] = {
-	{"NAME",           N_("NAME"),         0},  /* 0 */
-	{"CAPABILITIES",   N_("CAPABILITIES"), 0},  /* 1 */
-	{NULL,             NULL,               0}
+	{"NAME",           N_("NAME")},          /* 0 */
+	{"CAPABILITIES",   N_("CAPABILITIES")},  /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL     "NAME,CAPABILITIES"
 #define NMC_FIELDS_DEV_SHOW_BLUETOOTH_COMMON  "NAME,CAPABILITIES"
@@ -242,18 +242,36 @@ static NmcOutputField nmc_fields_dev_show_sections[] = {
 	{"CONNECTIONS",       N_("CONNECTIONS"),       0, nmc_fields_dev_show_connections + 1 },  /* 16 */
 	{NULL,                NULL,                    0, NULL                                }
 };
-#if WITH_WIMAX
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,TEAM,BRIDGE,VLAN,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\
-                                             "WIMAX-PROPERTIES,NSP,BLUETOOTH,CONNECTIONS,IP4,DHCP4,IP6,DHCP6"
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\
-                                             "GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6"
-#else
 #define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,TEAM,BRIDGE,VLAN,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\
                                              "BLUETOOTH,CONNECTIONS,IP4,DHCP4,IP6,DHCP6"
 #define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\
                                              "GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6"
-#endif
 
+/* Available fields for 'device lldp' */
+static NmcOutputField nmc_fields_dev_lldp_list[] = {
+	{"NAME",                    N_("NAME")},                     /* 0 */
+	{"DEVICE",                  N_("DEVICE")},                   /* 1 */
+	{"CHASSIS-ID",              N_("CHASSIS-ID")},               /* 2 */
+	{"PORT-ID",                 N_("PORT-ID")},                  /* 3 */
+	{"PORT-DESCRIPTION",        N_("PORT-DESCRIPTION")},         /* 4 */
+	{"SYSTEM-NAME",             N_("SYSTEM-NAME")},              /* 5 */
+	{"SYSTEM-DESCRIPTION",      N_("SYSTEM-DESCRIPTION")},       /* 6 */
+	{"SYSTEM-CAPABILITIES",     N_("SYSTEM-CAPABILITIES")},      /* 7 */
+	{"IEEE-802-1-PVID",         N_("IEEE-802-1-PVID")},          /* 8 */
+	{"IEEE-802-1-PPVID",        N_("IEEE-802-1-PPVID")},         /* 9 */
+	{"IEEE-802-1-PPVID-FLAGS",  N_("IEEE-802-1-PPVID-FLAGS")},   /* 10 */
+	{"IEEE-802-1-VID",          N_("IEEE-802-1-VID")},           /* 11 */
+	{"IEEE-802-1-VLAN-NAME",    N_("IEEE-802-1-VLAN-NAME")},     /* 12 */
+	{"DESTINATION",             N_("DESTINATION")},              /* 13 */
+	{"CHASSIS-ID-TYPE",         N_("CHASSIS-ID-TYPE")},          /* 14 */
+	{"PORT-ID-TYPE",            N_("PORT-ID-TYPE")},             /* 15 */
+	{NULL, NULL}
+};
+#define NMC_FIELDS_DEV_LLDP_LIST_ALL     "DEVICE,CHASSIS-ID,PORT-ID,PORT-DESCRIPTION,SYSTEM-NAME,SYSTEM-DESCRIPTION," \
+                                         "SYSTEM-CAPABILITIES,IEEE-802-1-PVID,IEEE-802-1-PPVID,IEEE-802-1-PPVID-FLAGS," \
+                                         "IEEE-802-1-VID,IEEE-802-1-VLAN-NAME,DESTINATION,CHASSIS-ID-TYPE,PORT-ID-TYPE"
+#define NMC_FIELDS_DEV_LLDP_LIST_COMMON  "DEVICE,CHASSIS-ID,PORT-ID,PORT-DESCRIPTION,SYSTEM-NAME,SYSTEM-DESCRIPTION," \
+                                         "SYSTEM-CAPABILITIES"
 
 /* glib main loop variable - defined in nmcli.c */
 extern GMainLoop *loop;
@@ -264,23 +282,21 @@ static void
 usage (void)
 {
 	g_printerr (_("Usage: nmcli device { COMMAND | help }\n\n"
-#if WITH_WIMAX
-	              "COMMAND := { status | show | connect | disconnect | delete | wifi | wimax }\n\n"
-#else
-	              "COMMAND := { status | show | connect | disconnect | delete | wifi }\n\n"
-#endif
+	              "COMMAND := { status | show | connect | reapply | disconnect | delete | monitor | wifi | lldp }\n\n"
 	              "  status\n\n"
 	              "  show [<ifname>]\n\n"
+	              "  set [ifname] <ifname> [autoconnect yes|no] [managed yes|no]\n\n"
 	              "  connect <ifname>\n\n"
+	              "  reapply <ifname> ...\n\n"
 	              "  disconnect <ifname> ...\n\n"
 	              "  delete <ifname> ...\n\n"
+	              "  monitor <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] [hidden yes|no]\n\n"
+	              "  wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg] [channel <channel>] [password <password>]\n\n"
 	              "  wifi rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n\n"
-#if WITH_WIMAX
-	              "  wimax [list [ifname <ifname>] [nsp <name>]]\n\n"
-#endif
+	              "  lldp [list [ifname <ifname>]]\n\n"
 	              ));
 }
 
@@ -323,6 +339,17 @@ usage_device_connect (void)
 }
 
 static void
+usage_device_reapply (void)
+{
+	g_printerr (_("Usage: nmcli device reapply { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := <ifname> ...\n"
+	              "\n"
+	              "Attempts to update device with changes to the currently active connection\n"
+                      "made since it was last applied.\n\n"));
+}
+
+static void
 usage_device_disconnect (void)
 {
 	g_printerr (_("Usage: nmcli device disconnect { ARGUMENTS | help }\n"
@@ -348,6 +375,31 @@ usage_device_delete (void)
 }
 
 static void
+usage_device_set (void)
+{
+	g_printerr (_("Usage: nmcli device set { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := DEVICE { PROPERTY [ PROPERTY ... ] }\n"
+	              "DEVICE    := [ifname] <ifname> \n"
+	              "PROPERTY  := { autoconnect { yes | no } |\n"
+	              "             { managed { yes | no }\n"
+	              "\n"
+	              "Modify device properties.\n\n"));
+}
+
+static void
+usage_device_monitor (void)
+{
+	g_printerr (_("Usage: nmcli device monitor { ARGUMENTS | help }\n"
+	              "\n"
+	              "ARGUMENTS := [<ifname>] ...\n"
+	              "\n"
+	              "Monitor device activity.\n"
+	              "This command prints a line whenever the specified devices change state.\n"
+	              "Monitors all devices in case no interface is specified.\n\n"));
+}
+
+static void
 usage_device_wifi (void)
 {
 	g_printerr (_("Usage: nmcli device wifi { ARGUMENTS | help }\n"
@@ -371,6 +423,19 @@ usage_device_wifi (void)
 	              "only open, WEP and WPA-PSK networks are supported at the moment. It is also\n"
 	              "assumed that IP configuration is obtained via DHCP.\n"
 	              "\n"
+	              "ARGUMENTS := wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>]\n"
+	              "                          [band a|bg] [channel <channel>] [password <password>]\n"
+	              "\n"
+	              "Create a Wi-Fi hotspot. Use 'connection down' or 'device disconnect'\n"
+	              "to stop the hotspot.\n"
+	              "Parameters of the hotspot can be influenced by the optional parameters:\n"
+	              "ifname - Wi-Fi device to use\n"
+	              "con-name - name of the created hotspot connection profile\n"
+	              "ssid - SSID of the hotspot\n"
+	              "band - Wi-Fi band to use\n"
+	              "channel - Wi-Fi channel to use\n"
+	              "password - password to use for the hotspot\n"
+	              "\n"
 	              "ARGUMENTS := rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n"
 	              "\n"
 	              "Request that NetworkManager immediately re-scan for available access points.\n"
@@ -381,20 +446,16 @@ usage_device_wifi (void)
 	              "use 'nmcli device wifi list' for that.\n\n"));
 }
 
-#if WITH_WIMAX
 static void
-usage_device_wimax (void)
+usage_device_lldp (void)
 {
-	g_printerr (_("Usage: nmcli device wimax { ARGUMENTS | help }\n"
+	g_printerr (_("Usage: nmcli device lldp { ARGUMENTS | help }\n"
 	              "\n"
-	              "Perform operation on WiMAX devices.\n"
+	              "ARGUMENTS := [list [ifname <ifname>]]\n"
 	              "\n"
-	              "ARGUMENTS := [list [ifname <ifname>] [nsp <name>]]\n"
-	              "\n"
-	              "List available WiMAX NSPs. The 'ifname' and 'nsp' options can be used to\n"
-	              "list networks for a particular interface, or with a specific NSP.\n\n"));
+	              "List neighboring devices discovered through LLDP. The 'ifname' option can be\n"
+	              "used to list neighbors for a particular interface.\n\n"));
 }
-#endif
 
 /* quit main loop */
 static void
@@ -445,6 +506,117 @@ get_devices_sorted (NMClient *client)
 	return sorted;
 }
 
+static GSList *
+device_list (NmCli *nmc, int argc, char **argv)
+{
+	int arg_num = argc;
+	char **arg_arr = NULL;
+	char **arg_ptr = argv;
+	NMDevice **devices;
+	GSList *queue = NULL;
+	NMDevice *device;
+	int i;
+
+	if (argc == 0) {
+		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;
+		}
+	}
+
+	devices = get_devices_sorted (nmc->client);
+	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 (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);
+
+error:
+	g_strfreev (arg_arr);
+
+	return queue;
+}
+
+static int
+compare_aps (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+	NMAccessPoint *apa = *(NMAccessPoint **)a;
+	NMAccessPoint *apb = *(NMAccessPoint **)b;
+	int cmp;
+
+	cmp = nm_access_point_get_strength (apb) - nm_access_point_get_strength (apa);
+	if (cmp != 0)
+		return cmp;
+
+	cmp = nm_access_point_get_frequency (apa) - nm_access_point_get_frequency (apb);
+	if (cmp != 0)
+		return cmp;
+
+	return nm_access_point_get_max_bitrate (apb) - nm_access_point_get_max_bitrate (apa);
+}
+
+static GPtrArray *
+sort_access_points (const GPtrArray *aps)
+{
+	GPtrArray *sorted;
+	int i;
+
+	sorted = g_ptr_array_sized_new (aps->len);
+	for (i = 0; aps && i < aps->len; i++)
+		g_ptr_array_add (sorted, aps->pdata[i]);
+	g_ptr_array_sort_with_data (sorted, compare_aps, NULL);
+	return sorted;
+}
+
+typedef struct {
+	NmcTermColor color;
+	NmcTermFormat color_fmt;
+} ColorInfo;
+
+static ColorInfo
+wifi_signal_to_color (guint8 strength)
+{
+	ColorInfo color_info = { NMC_TERM_COLOR_NORMAL, NMC_TERM_FORMAT_NORMAL };
+
+	if (strength > 80)
+		color_info.color = NMC_TERM_COLOR_GREEN;
+	else if (strength > 55)
+		color_info.color = NMC_TERM_COLOR_YELLOW;
+	else if (strength > 30)
+		color_info.color = NMC_TERM_COLOR_MAGENTA;
+	else if (strength > 5)
+		color_info.color = NMC_TERM_COLOR_CYAN;
+	else
+		color_info.color_fmt = NMC_TERM_FORMAT_DIM;
+	return color_info;
+}
+
 static char *
 ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags)
 {
@@ -514,6 +686,7 @@ fill_output_access_point (gpointer data, gpointer user_data)
 	GString *security_str;
 	char *ap_name;
 	const char *sig_bars;
+	ColorInfo color_info;
 
 	if (info->active_bssid) {
 		const char *current_bssid = nm_access_point_get_bssid (ap);
@@ -599,59 +772,18 @@ fill_output_access_point (gpointer data, gpointer user_data)
 	set_val_strc (arr, 15, active ? "*" : " ");
 	set_val_strc (arr, 16, nm_object_get_path (NM_OBJECT (ap)));
 
+	/* Set colors */
+	color_info = wifi_signal_to_color (strength);
+	set_val_color_all (arr, color_info.color);
+	set_val_color_fmt_all (arr, color_info.color_fmt);
+	if (active)
+		arr[15].color = NMC_TERM_COLOR_GREEN;
+
 	g_ptr_array_add (info->nmc->output_data, arr);
 
 	g_string_free (security_str, FALSE);
 }
 
-#if WITH_WIMAX
-static void
-fill_output_wimax_nsp (NMWimaxNsp *nsp, NmCli *nmc, NMDevice *dev, int idx, guint32 o_flags)
-{
-	NMDeviceWimax *wimax = NM_DEVICE_WIMAX (dev);
-	char *nsp_name, *quality_str;
-	const char *ntype;
-	gboolean active = FALSE;
-	NmcOutputField *arr;
-
-	switch (nm_wimax_nsp_get_network_type (nsp)) {
-	case NM_WIMAX_NSP_NETWORK_TYPE_HOME:
-		ntype = _("Home");
-		break;
-	case NM_WIMAX_NSP_NETWORK_TYPE_PARTNER:
-		ntype = _("Partner");
-		break;
-	case NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER:
-		ntype = _("Roaming");
-		break;
-	default:
-		ntype = _("Unknown");
-		break;
-	}
-
-	if (nm_device_get_state (dev) == NM_DEVICE_STATE_ACTIVATED) {
-		if (nsp == nm_device_wimax_get_active_nsp (wimax))
-			active = TRUE;
-	}
-
-	quality_str = g_strdup_printf ("%u", nm_wimax_nsp_get_signal_quality (nsp));
-	nsp_name = g_strdup_printf ("NSP[%d]", idx); /* NSP */
-
-	arr = nmc_dup_fields_array (nmc_fields_dev_wimax_list,
-	                            sizeof (nmc_fields_dev_wimax_list),
-	                            o_flags);
-	set_val_str  (arr, 0, nsp_name);
-	set_val_strc (arr, 1, nm_wimax_nsp_get_name (nsp));
-	set_val_str  (arr, 2, quality_str);
-	set_val_strc (arr, 3, ntype);
-	set_val_strc (arr, 4, nm_device_get_iface (dev));
-	set_val_strc (arr, 5, active ? _("yes") : _("no"));
-	set_val_strc (arr, 6, nm_object_get_path (NM_OBJECT (nsp)));
-
-	g_ptr_array_add (nmc->output_data, arr);
-}
-#endif
-
 static char *
 bluetooth_caps_to_string (NMBluetoothCapabilities caps)
 {
@@ -857,12 +989,12 @@ show_device_info (NMDevice *device, NmCli *nmc)
 			set_val_strc (arr, 16, nm_device_get_managed (device) ? _("yes") : _("no"));
 			set_val_strc (arr, 17, nm_device_get_autoconnect (device) ? _("yes") : _("no"));
 			set_val_strc (arr, 18, nm_device_get_firmware_missing (device) ? _("yes") : _("no"));
-			set_val_strc (arr, 19, nm_device_get_physical_port_id (device));
-			set_val_strc (arr, 20, get_active_connection_id (device));
-			set_val_strc (arr, 21, acon ? nm_active_connection_get_uuid (acon) : NULL);
-			set_val_strc (arr, 22, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL);
-			set_val_strc (arr, 23, nmc_device_metered_to_string (nm_device_get_metered (device)));
-
+			set_val_strc (arr, 19, nm_device_get_nm_plugin_missing (device) ? _("yes") : _("no"));
+			set_val_strc (arr, 20, nm_device_get_physical_port_id (device));
+			set_val_strc (arr, 21, get_active_connection_id (device));
+			set_val_strc (arr, 22, acon ? nm_active_connection_get_uuid (acon) : NULL);
+			set_val_strc (arr, 23, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL);
+			set_val_strc (arr, 24, nmc_device_metered_to_string (nm_device_get_metered (device)));
 			g_ptr_array_add (nmc->output_data, arr);
 
 			print_data (nmc);  /* Print all data */
@@ -906,7 +1038,7 @@ show_device_info (NMDevice *device, NmCli *nmc)
 			NMDeviceWifiCapabilities wcaps;
 			NMAccessPoint *active_ap = NULL;
 			const char *active_bssid = NULL;
-			const GPtrArray *aps;
+			GPtrArray *aps;
 
 			/* section WIFI-PROPERTIES */
 			if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[2].name)) {
@@ -959,8 +1091,9 @@ show_device_info (NMDevice *device, NmCli *nmc)
 				info->output_flags = NMC_OF_FLAG_SECTION_PREFIX;
 				info->active_bssid = active_bssid;
 				info->device = nm_device_get_iface (device);
-				aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device));
+				aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)));
 				g_ptr_array_foreach ((GPtrArray *) aps, fill_output_access_point, (gpointer) info);
+				g_ptr_array_free (aps, FALSE);
 				g_free (info);
 				print_data (nmc);  /* Print all data */
 				was_output = TRUE;
@@ -979,84 +1112,13 @@ show_device_info (NMDevice *device, NmCli *nmc)
 				set_val_strc (arr, 0, nmc_fields_dev_show_sections[4].name);  /* "WIRED-PROPERTIES" */
 				set_val_strc (arr, 1, (nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (device))) ?
 				                        _("on") : _("off"));
+				set_val_arrc (arr, 2, ((const char **) nm_device_ethernet_get_s390_subchannels (NM_DEVICE_ETHERNET (device))));
 				g_ptr_array_add (nmc->output_data, arr);
 
 				print_data (nmc);  /* Print all data */
 				was_output = TRUE;
 			}
 		}
-#if WITH_WIMAX
-		else if (NM_IS_DEVICE_WIMAX (device)) {
-			/* WIMAX-PROPERTIES */
-			if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[5].name)) {
-				char *cfreq = NULL, *rssi = NULL, *cinr = NULL, *txpow = NULL;
-				guint tmp_uint;
-				gint tmp_int;
-
-				/* Field names */
-				tmpl = nmc_fields_dev_show_wimax_prop;
-				tmpl_len = sizeof (nmc_fields_dev_show_wimax_prop);
-				nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIMAX_PROP_ALL,
-				                                                 tmpl, FALSE, NULL, NULL);
-				arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
-				g_ptr_array_add (nmc->output_data, arr);
-
-				/* Center frequency */
-				tmp_uint = nm_device_wimax_get_center_frequency (NM_DEVICE_WIMAX (device));
-				if (tmp_uint)
-					cfreq = g_strdup_printf ("%'.1f MHz", (double) tmp_uint / 1000.0);
-
-				/* RSSI */
-				tmp_int = nm_device_wimax_get_rssi (NM_DEVICE_WIMAX (device));
-				if (tmp_int)
-					rssi = g_strdup_printf ("%d dBm", tmp_int);
-
-				/* CINR */
-				tmp_int = nm_device_wimax_get_cinr (NM_DEVICE_WIMAX (device));
-				if (tmp_int)
-					cinr = g_strdup_printf ("%d dB", tmp_int);
-
-				/* TX Power */
-				tmp_int = nm_device_wimax_get_tx_power (NM_DEVICE_WIMAX (device));
-				if (tmp_int)
-					txpow = g_strdup_printf ("%'.2f dBm", (float) tmp_int / 2.0);
-
-				arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
-				set_val_strc (arr, 0, nmc_fields_dev_show_sections[5].name);  /* "WIMAX-PROPERTIES" */
-				set_val_str  (arr, 1, cfreq);
-				set_val_str  (arr, 2, rssi);
-				set_val_str  (arr, 3, cinr);
-				set_val_str  (arr, 4, txpow);
-				set_val_strc (arr, 5, nm_device_wimax_get_bsid (NM_DEVICE_WIMAX (device)));
-				g_ptr_array_add (nmc->output_data, arr);
-
-				print_data (nmc);  /* Print all data */
-				was_output = TRUE;
-			}
-
-			/* section NSP */
-			if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[6].name)) {
-				const GPtrArray *nsps;
-				int g, idx = 1;
-
-				tmpl = nmc_fields_dev_wimax_list;
-				tmpl_len = sizeof (nmc_fields_dev_wimax_list);
-				nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST,
-				                                                 tmpl, FALSE, NULL, NULL);
-				arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
-				g_ptr_array_add (nmc->output_data, arr);
-
-				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
-				for (g = 0; g < nsps->len; g++) {
-					NMWimaxNsp *nsp = g_ptr_array_index (nsps, g);
-
-					fill_output_wimax_nsp (nsp, nmc, device, idx++, NMC_OF_FLAG_SECTION_PREFIX);
-				}
-				print_data (nmc);  /* Print all data */
-				was_output = TRUE;
-			}
-		}
-#endif
 
 		/* IP configuration info */
 		cfg4 = nm_device_get_ip4_config (device);
@@ -1201,19 +1263,43 @@ show_device_info (NMDevice *device, NmCli *nmc)
 	return TRUE;
 }
 
+static ColorInfo
+device_state_to_color (NMDeviceState state)
+{
+	ColorInfo color_info = { NMC_TERM_COLOR_NORMAL, NMC_TERM_FORMAT_NORMAL };
+
+	if (state <= NM_DEVICE_STATE_UNAVAILABLE)
+		color_info.color_fmt= NMC_TERM_FORMAT_DIM;
+	else if (state == NM_DEVICE_STATE_DISCONNECTED)
+		color_info.color = NMC_TERM_COLOR_RED;
+	else if (state >= NM_DEVICE_STATE_PREPARE && state <= NM_DEVICE_STATE_SECONDARIES)
+		color_info.color = NMC_TERM_COLOR_YELLOW;
+	else if (state == NM_DEVICE_STATE_ACTIVATED)
+		color_info.color = NMC_TERM_COLOR_GREEN;
+	return color_info;
+}
+
 static void
 fill_output_device_status (NMDevice *device, NmCli *nmc)
 {
 	NMActiveConnection *ac;
+	NMDeviceState state;
+	ColorInfo color_info;
 	NmcOutputField *arr = nmc_dup_fields_array (nmc_fields_dev_status,
 	                                            sizeof (nmc_fields_dev_status),
 	                                            0);
 
+	state = nm_device_get_state (device);
 	ac = nm_device_get_active_connection (device);
 
+	/* Show devices in color */
+	color_info = device_state_to_color (state);
+	set_val_color_all (arr, color_info.color);
+	set_val_color_fmt_all (arr, color_info.color_fmt);
+
 	set_val_strc (arr, 0, nm_device_get_iface (device));
 	set_val_strc (arr, 1, nm_device_get_type_description (device));
-	set_val_strc (arr, 2, nmc_device_state_to_string (nm_device_get_state (device)));
+	set_val_strc (arr, 2, nmc_device_state_to_string (state));
 	set_val_strc (arr, 3, nm_object_get_path (NM_OBJECT (device)));
 	set_val_strc (arr, 4, get_active_connection_id (device));
 	set_val_strc (arr, 5, ac ? nm_active_connection_get_uuid (ac) : NULL);
@@ -1408,6 +1494,7 @@ connected_state_cb (NMDevice *device, NMActiveConnection *active)
 typedef struct {
 	NmCli *nmc;
 	NMDevice *device;
+	gboolean hotspot;
 } AddAndActivateInfo;
 
 static void
@@ -1425,8 +1512,12 @@ add_and_activate_cb (GObject *client,
 	active = nm_client_add_and_activate_connection_finish (NM_CLIENT (client), result, &error);
 
 	if (error) {
-		g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: %s"),
-		                 error->message);
+		if (info->hotspot)
+			g_string_printf (nmc->return_text, _("Error: Failed to setup a Wi-Fi hotspot: %s"),
+			                 error->message);
+		else
+			g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: %s"),
+			                 error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
 		quit ();
@@ -1434,7 +1525,10 @@ add_and_activate_cb (GObject *client,
 		state = nm_active_connection_get_state (active);
 
 		if (state == NM_ACTIVE_CONNECTION_STATE_UNKNOWN) {
-			g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: Unknown error"));
+			if (info->hotspot)
+				g_string_printf (nmc->return_text, _("Error: Failed to setup a Wi-Fi hotspot"));
+			else
+				g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: Unknown error"));
 			nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
 			g_object_unref (active);
 			quit ();
@@ -1445,8 +1539,12 @@ add_and_activate_cb (GObject *client,
 			if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
 				if (nmc->print_output == NMC_PRINT_PRETTY)
 					nmc_terminal_erase_line ();
-				g_print (_("Connection with UUID '%s' created and activated on device '%s'\n"),
-				         nm_active_connection_get_uuid (active), nm_device_get_iface (device));
+				if (info->hotspot)
+					g_print (_("Connection with UUID '%s' created and activated on device '%s'\n"),
+					         nm_active_connection_get_uuid (active), nm_device_get_iface (device));
+				else
+					g_print (_("Hotspot '%s' activated on device '%s'\n"),
+					         nm_active_connection_get_id (active), nm_device_get_iface (device));
 			}
 			g_object_unref (active);
 			quit ();
@@ -1615,7 +1713,7 @@ do_device_connect (NmCli *nmc, int argc, char **argv)
 	 * till connect_device_cb() is called, giving NM time to check our permissions.
 	 */
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	/* Create secret agent */
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect");
@@ -1625,6 +1723,7 @@ do_device_connect (NmCli *nmc, int argc, char **argv)
 	info = g_malloc0 (sizeof (AddAndActivateInfo));
 	info->nmc = nmc;
 	info->device = device;
+	info->hotspot = FALSE;
 
 	nm_client_activate_connection_async (nmc->client,
 	                                     NULL,  /* let NM find a connection automatically */
@@ -1727,17 +1826,16 @@ device_cb_info_finish (DeviceCbInfo *info, NMDevice *device)
 }
 
 static void
-disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
+reapply_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 {
 	NMDevice *device = NM_DEVICE (object);
 	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: not all devices disconnected."));
-		g_printerr (_("Error: Device '%s' (%s) disconnecting failed: %s\n"),
+	if (!nm_device_reapply_finish (device, result, &error)) {
+		g_string_printf (nmc->return_text, _("Error: not all connections reapplied."));
+		g_printerr (_("Error: Reapplying connection to device '%s' (%s) failed: %s\n"),
 		            nm_device_get_iface (device),
 		            nm_object_get_path (NM_OBJECT (device)),
 		            error->message);
@@ -1745,23 +1843,16 @@ disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 		nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
 		device_cb_info_finish (info, device);
 	} else {
-		state = nm_device_get_state (device);
-
-		if (nmc->nowait_flag || state <= NM_DEVICE_STATE_DISCONNECTED) {
-			/* Don't want to wait or device already disconnected */
-			if (state <= NM_DEVICE_STATE_DISCONNECTED) {
-				if (nmc->print_output == NMC_PRINT_PRETTY)
-					nmc_terminal_erase_line ();
-				g_print (_("Device '%s' successfully disconnected.\n"),
-				         nm_device_get_iface (device));
-			}
-			device_cb_info_finish (info, device);
-		}
+		if (nmc->print_output == NMC_PRINT_PRETTY)
+			nmc_terminal_erase_line ();
+		g_print (_("Connection successfully reapplied to device '%s'.\n"),
+			 nm_device_get_iface (device));
+		device_cb_info_finish (info, device);
 	}
 }
 
 static NMCResultCode
-do_device_disconnect (NmCli *nmc, int argc, char **argv)
+do_device_reapply (NmCli *nmc, int argc, char **argv)
 {
 	NMDevice **devices;
 	NMDevice *device;
@@ -1772,7 +1863,7 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 	int arg_num = argc;
 	int i;
 
-	/* Set default timeout for disconnect operation. */
+	/* Set default timeout for reapply operation. */
 	if (nmc->timeout == -1)
 		nmc->timeout = 10;
 
@@ -1825,6 +1916,76 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 
 	info = g_slice_new0 (DeviceCbInfo);
 	info->nmc = nmc;
+
+	nmc->nowait_flag = (nmc->timeout == 0);
+	nmc->should_wait = TRUE;
+
+	for (iter = queue; iter; iter = g_slist_next (iter)) {
+		device = iter->data;
+
+		info->queue = g_slist_prepend (info->queue, g_object_ref (device));
+
+		/* Now reapply the connection to the device */
+		nm_device_reapply_async (device, NULL, 0, NULL, reapply_device_cb, info);
+	}
+
+error:
+	g_strfreev (arg_arr);
+	g_slist_free (queue);
+	return nmc->return_value;
+}
+
+static void
+disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
+{
+	NMDevice *device = NM_DEVICE (object);
+	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: 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;
+		device_cb_info_finish (info, device);
+	} else {
+		state = nm_device_get_state (device);
+		if (nmc->nowait_flag || state <= NM_DEVICE_STATE_DISCONNECTED) {
+			/* Don't want to wait or device already disconnected */
+			if (state <= NM_DEVICE_STATE_DISCONNECTED) {
+				if (nmc->print_output == NMC_PRINT_PRETTY)
+					nmc_terminal_erase_line ();
+				g_print (_("Device '%s' successfully disconnected.\n"),
+				         nm_device_get_iface (device));
+			}
+			device_cb_info_finish (info, device);
+		}
+	}
+}
+
+static NMCResultCode
+do_device_disconnect (NmCli *nmc, int argc, char **argv)
+{
+	NMDevice *device;
+	DeviceCbInfo *info = NULL;
+	GSList *queue, *iter;
+
+	/* Set default timeout for disconnect operation. */
+	if (nmc->timeout == -1)
+		nmc->timeout = 10;
+
+	queue = device_list (nmc, argc, argv);
+	if (!queue)
+		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);
@@ -1833,7 +1994,7 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 	                  G_CALLBACK (device_removed_cb), info);
 
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	for (iter = queue; iter; iter = g_slist_next (iter)) {
 		device = iter->data;
@@ -1847,7 +2008,6 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 	}
 
 error:
-	g_strfreev (arg_arr);
 	g_slist_free (queue);
 	return nmc->return_value;
 }
@@ -1878,71 +2038,17 @@ delete_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 static NMCResultCode
 do_device_delete (NmCli *nmc, int argc, char **argv)
 {
-	NMDevice **devices;
 	NMDevice *device;
 	DeviceCbInfo *info = NULL;
-	GSList *queue = NULL, *iter;
-	char **arg_arr = NULL;
-	char **arg_ptr = argv;
-	int arg_num = argc;
-	int i;
+	GSList *queue, *iter;
 
 	/* Set default timeout for delete operation. */
 	if (nmc->timeout == -1)
 		nmc->timeout = 10;
 
-	if (argc == 0) {
-		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;
-		}
-	}
-
-	devices = get_devices_sorted (nmc->client);
-	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 (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 (!queue) {
-		g_string_printf (nmc->return_text, _("Error: no valid device provided."));
-		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+	queue = device_list (nmc, argc, argv);
+	if (!queue)
 		goto error;
-	}
 	queue = g_slist_reverse (queue);
 
 	info = g_slice_new0 (DeviceCbInfo);
@@ -1954,7 +2060,7 @@ do_device_delete (NmCli *nmc, int argc, char **argv)
 	                  G_CALLBACK (device_removed_cb), info);
 
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	for (iter = queue; iter; iter = g_slist_next (iter)) {
 		device = iter->data;
@@ -1966,17 +2072,225 @@ do_device_delete (NmCli *nmc, int argc, char **argv)
 	}
 
 error:
-	g_strfreev (arg_arr);
 	g_slist_free (queue);
 	return nmc->return_value;
 }
 
+static NMCResultCode
+do_device_set (NmCli *nmc, int argc, char **argv)
+{
+#define DEV_SET_AUTOCONNECT 0
+#define DEV_SET_MANAGED     1
+	NMDevice **devices;
+	NMDevice *device = NULL;
+	const char *ifname = NULL;
+	int i;
+	struct {
+		int idx;
+		gboolean value;
+	} values[2] = {
+		[DEV_SET_AUTOCONNECT] = { -1 },
+		[DEV_SET_MANAGED]     = { -1 },
+	};
+
+	if (argc >= 1 && g_strcmp0 (*argv, "ifname") == 0) {
+		argc--;
+		argv++;
+	}
+
+	if (argc == 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;
+	}
+
+	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);
+
+		if (!g_strcmp0 (dev_iface, ifname))
+			device = candidate;
+	}
+	g_free (devices);
+
+	if (!device) {
+		g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
+		nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+		goto error;
+	}
+
+        if (argc == 1) {
+		g_string_printf (nmc->return_text, _("Error: No property specified."));
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto error;
+	}
+
+	i = 0;
+	while (next_arg (&argc, &argv) == 0) {
+		gboolean flag;
+		gs_free_error GError *tmp_err = NULL;
+
+		if (matches (*argv, "managed") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			if (!nmc_string_to_bool (*argv, &flag, &tmp_err)) {
+				g_string_printf (nmc->return_text, _("Error: 'managed': %s."),
+				                 tmp_err->message);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			values[DEV_SET_MANAGED].idx = ++i;
+			values[DEV_SET_MANAGED].value = flag;
+		}
+		else if (matches (*argv, "autoconnect") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			if (!nmc_string_to_bool (*argv, &flag, &tmp_err)) {
+				g_string_printf (nmc->return_text, _("Error: 'autoconnect': %s."),
+				                 tmp_err->message);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			values[DEV_SET_AUTOCONNECT].idx = ++i;
+			values[DEV_SET_AUTOCONNECT].value = flag;
+		}
+		else {
+			usage_device_set ();
+			g_string_printf (nmc->return_text, _("Error: property '%s' is not known."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto error;
+		}
+	}
+
+	/* when multiple properties are specified, set them in the order as they
+	 * are specified on the command line. */
+	if (   values[DEV_SET_AUTOCONNECT].idx >= 0
+	    && values[DEV_SET_MANAGED].idx >= 0
+	    && values[DEV_SET_MANAGED].idx < values[DEV_SET_AUTOCONNECT].idx) {
+		nm_device_set_managed (device, values[DEV_SET_MANAGED].value);
+		values[DEV_SET_MANAGED].idx = -1;
+	}
+	if (values[DEV_SET_AUTOCONNECT].idx >= 0)
+		nm_device_set_autoconnect (device, values[DEV_SET_AUTOCONNECT].value);
+	if (values[DEV_SET_MANAGED].idx >= 0)
+		nm_device_set_managed (device, values[DEV_SET_MANAGED].value);
+
+error:
+	quit ();
+	return nmc->return_value;
+}
+
+static void
+device_state (NMDevice *device, GParamSpec *pspec, NmCli *nmc)
+{
+	NMDeviceState state = nm_device_get_state (device);
+	ColorInfo color = device_state_to_color (state);
+	char *str = nmc_colorize (nmc, color.color, color.color_fmt, "%s: %s\n",
+	                          nm_device_get_iface (device),
+	                          nmc_device_state_to_string (state));
+
+	g_print ("%s", str);
+	g_free (str);
+}
+
+static void
+device_ac (NMDevice *device, GParamSpec *pspec, NmCli *nmc)
+{
+	NMActiveConnection *ac = nm_device_get_active_connection (device);
+	const char *id = ac ? nm_active_connection_get_id (ac) : NULL;
+
+	if (!id)
+		return;
+
+	g_print (_("%s: using connection '%s'\n"), nm_device_get_iface (device), id);
+}
+
+static void
+device_watch (NmCli *nmc, NMDevice *device)
+{
+	nmc->should_wait++;
+	g_signal_connect (device, "notify::" NM_DEVICE_STATE, G_CALLBACK (device_state), nmc);
+	g_signal_connect (device, "notify::" NM_DEVICE_ACTIVE_CONNECTION, G_CALLBACK (device_ac), nmc);
+}
+
+static void
+device_unwatch (NmCli *nmc, NMDevice *device)
+{
+	g_signal_handlers_disconnect_by_func (device, device_state, nmc);
+	if (g_signal_handlers_disconnect_by_func (device, device_ac, nmc))
+		nmc->should_wait--;
+
+	/* Terminate if all the watched devices disappeared. */
+	if (!nmc->should_wait)
+		quit ();
+}
+
+static void
+device_added (NMClient *client, NMDevice *device, NmCli *nmc)
+{
+	g_print (_("%s: device created\n"), nm_device_get_iface (device));
+	device_watch (nmc, NM_DEVICE (device));
+}
+
+static void
+device_removed (NMClient *client, NMDevice *device, NmCli *nmc)
+{
+	g_print (_("%s: device removed\n"), nm_device_get_iface (device));
+	device_unwatch (nmc, device);
+}
+
+static NMCResultCode
+do_device_monitor (NmCli *nmc, int argc, char **argv)
+{
+	if (argc == 0) {
+		/* No devices specified. Monitor all. */
+		const GPtrArray *devices = nm_client_get_devices (nmc->client);
+		int i;
+
+		for (i = 0; i < devices->len; i++)
+			device_watch (nmc, g_ptr_array_index (devices, i));
+
+		/* We'll watch the device additions too, never exit. */
+		nmc->should_wait++;
+		g_signal_connect (nmc->client, NM_CLIENT_DEVICE_ADDED, G_CALLBACK (device_added), nmc);
+	} else {
+		/* Monitor just the specified devices. */
+		GSList *queue = device_list (nmc, argc, argv);
+		GSList *iter;
+
+		if (!queue)
+			return nmc->return_value;
+
+		for (iter = queue; iter; iter = g_slist_next (iter))
+			device_watch (nmc, NM_DEVICE (iter->data));
+		g_slist_free (queue);
+	}
+
+	g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED, G_CALLBACK (device_removed), nmc);
+
+	return NMC_RESULT_SUCCESS;
+}
+
 static void
 show_access_point_info (NMDevice *device, NmCli *nmc)
 {
 	NMAccessPoint *active_ap = NULL;
 	const char *active_bssid = NULL;
-	const GPtrArray *aps;
+	GPtrArray *aps;
 	APInfo *info;
 	NmcOutputField *arr;
 
@@ -1995,8 +2309,9 @@ show_access_point_info (NMDevice *device, NmCli *nmc)
 	info->output_flags = 0;
 	info->active_bssid = active_bssid;
 	info->device = nm_device_get_iface (device);
-	aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device));
+	aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)));
 	g_ptr_array_foreach ((GPtrArray *) aps, fill_output_access_point, (gpointer) info);
+	g_ptr_array_free (aps, FALSE);
 
 	print_data (nmc);  /* Print all data */
 	nmc_empty_output_fields (nmc);
@@ -2566,7 +2881,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
 	if (ap_flags & NM_802_11_AP_FLAGS_PRIVACY) {
 		/* Ask for missing password when one is expected and '--ask' is used */
 		if (!password && nmc->ask)
-			password = passwd_ask = nmc_readline (_("Password: "));
+			password = passwd_ask = nmc_readline_echo (nmc->show_secrets, _("Password: "));
 
 		if (password) {
 			if (!connection)
@@ -2600,11 +2915,12 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
 	 * the user doesn't want to wait, in order to give NM time to check our
 	 * permissions. */
 	nmc->nowait_flag = (nmc->timeout == 0);
-	nmc->should_wait = TRUE;
+	nmc->should_wait++;
 
 	info = g_malloc0 (sizeof (AddAndActivateInfo));
 	info->nmc = nmc;
 	info->device = device;
+	info->hotspot = FALSE;
 
 	nm_client_add_and_activate_connection_async (nmc->client,
 	                                             connection,
@@ -2625,6 +2941,345 @@ error:
 	return nmc->return_value;
 }
 
+static GBytes *
+generate_ssid_for_hotspot (const char *ssid)
+{
+	GBytes *ssid_bytes;
+	char *hotspot_ssid = NULL;
+
+	if (!ssid) {
+		hotspot_ssid = g_strdup_printf ("Hotspot-%s", g_get_host_name ());
+		if (strlen (hotspot_ssid) > 32)
+			hotspot_ssid[32] = '\0';
+		ssid = hotspot_ssid;
+	}
+	ssid_bytes = g_bytes_new (ssid, strlen (ssid));
+	g_free (hotspot_ssid);
+	return ssid_bytes;
+}
+
+#define WPA_PASSKEY_SIZE 8
+static void
+generate_wpa_key (char *key, size_t len)
+{
+	guint i;
+
+	g_return_if_fail (key);
+	g_return_if_fail (len > WPA_PASSKEY_SIZE);
+
+	/* generate a 8-chars ASCII WPA key */
+	for (i = 0; i < WPA_PASSKEY_SIZE; i++) {
+		int c;
+		c = g_random_int_range (33, 126);
+		/* too many non alphanumeric characters are hard to remember for humans */
+		while (!g_ascii_isalnum (c))
+			c = g_random_int_range (33, 126);
+
+		key[i] = (gchar) c;
+	}
+	key[WPA_PASSKEY_SIZE] = '\0';
+}
+
+static void
+generate_wep_key (char *key, size_t len)
+{
+	int i;
+	const char *hexdigits = "0123456789abcdef";
+
+	g_return_if_fail (key);
+	g_return_if_fail (len > 10);
+
+	/* generate a 10-digit hex WEP key */
+	for (i = 0; i < 10; i++) {
+		int digit;
+		digit = g_random_int_range (0, 16);
+		key[i] = hexdigits[digit];
+	}
+	key[10] = '\0';
+}
+
+static gboolean
+set_wireless_security_for_hotspot (NMSettingWirelessSecurity *s_wsec,
+                                   const char *wifi_mode,
+                                   NMDeviceWifiCapabilities caps,
+                                   const char *password,
+                                   gboolean show_password,
+                                   GError **error)
+{
+        char generated_key[11];
+	const char *key;
+	const char *key_mgmt;
+
+	if (g_strcmp0 (wifi_mode, NM_SETTING_WIRELESS_MODE_AP) == 0) {
+		if (caps & NM_WIFI_DEVICE_CAP_RSN) {
+			nm_setting_wireless_security_add_proto (s_wsec, "rsn");
+			nm_setting_wireless_security_add_pairwise (s_wsec, "ccmp");
+			nm_setting_wireless_security_add_group (s_wsec, "ccmp");
+			key_mgmt = "wpa-psk";
+		} else if (caps & NM_WIFI_DEVICE_CAP_WPA) {
+			nm_setting_wireless_security_add_proto (s_wsec, "wpa");
+			nm_setting_wireless_security_add_pairwise (s_wsec, "tkip");
+			nm_setting_wireless_security_add_group (s_wsec, "tkip");
+			key_mgmt = "wpa-psk";
+		} else
+			key_mgmt = "none";
+	} else
+		key_mgmt = "none";
+
+	if (g_strcmp0 (key_mgmt, "wpa-psk") == 0) {
+		/* use WPA */
+		if (password) {
+			if (!nm_utils_wpa_psk_valid (password)) {
+				g_set_error (error, NMCLI_ERROR, 0, _("'%s' is not valid WPA PSK"), password);
+				return FALSE;
+			}
+			key = password;
+		} else {
+			generate_wpa_key (generated_key, sizeof (generated_key));
+			key = generated_key;
+		}
+		g_object_set (s_wsec,
+		              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, key_mgmt,
+		              NM_SETTING_WIRELESS_SECURITY_PSK, key,
+		              NULL);
+	} else {
+		/* use WEP */
+		if (password) {
+			if (!nm_utils_wep_key_valid (password, NM_WEP_KEY_TYPE_KEY)) {
+				g_set_error (error, NMCLI_ERROR, 0,
+				             _("'%s' is not valid WEP key (it should be 5 or 13 ASCII chars)"),
+				             password);
+				return FALSE;
+			}
+			key = password;
+		} else {
+			generate_wep_key (generated_key, sizeof (generated_key));
+			key = generated_key;
+		}
+		g_object_set (s_wsec,
+		              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, key_mgmt,
+		              NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, key,
+		              NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, NM_WEP_KEY_TYPE_KEY,
+		              NULL);
+	}
+	if (show_password)
+		g_print (_("Hotspot password: %s\n"), key);
+
+	return TRUE;
+}
+
+static NMCResultCode
+do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv)
+{
+	AddAndActivateInfo *info;
+	const char *ifname = NULL;
+	const char *con_name = NULL;
+	char *default_name = NULL;
+	const char *ssid = NULL;
+	const char *wifi_mode;
+	const char *band = NULL;
+	const char *channel = NULL;
+	unsigned long channel_int;
+	const char *password = NULL;
+	gboolean show_password = FALSE;
+	NMDevice *device = NULL;
+	int devices_idx;
+	const GPtrArray *devices;
+	NMDeviceWifiCapabilities caps;
+	NMConnection *connection = NULL;
+	NMSettingConnection *s_con;
+	NMSettingWireless *s_wifi;
+	NMSettingWirelessSecurity *s_wsec;
+	NMSettingIPConfig *s_ip4, *s_ip6;
+	GBytes *ssid_bytes;
+	GError *error = NULL;
+
+	/* Set default timeout waiting for operation completion. */
+	if (nmc->timeout == -1)
+		nmc->timeout = 60;
+
+	while (argc > 0) {
+		if (strcmp (*argv, "ifname") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			ifname = *argv;
+		} else if (strcmp (*argv, "con-name") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			con_name = *argv;
+		} else if (strcmp (*argv, "ssid") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			ssid = *argv;
+			if (strlen (ssid) > 32) {
+				g_string_printf (nmc->return_text, _("Error: ssid is too long."));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+		} else if (strcmp (*argv, "band") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			band = *argv;
+			if (strcmp (band, "a") && strcmp (band, "bg")) {
+				g_string_printf (nmc->return_text, _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."),
+				                 band);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+		} else if (strcmp (*argv, "channel") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			channel = *argv;
+		} else if (strcmp (*argv, "password") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			password = *argv;
+		/* --show-password is deprecated in favour of global --show-secrets option */
+		/* Keep it here for backwards compatibility */
+		} else if (nmc_arg_is_option (*argv, "show-password")) {
+			show_password = TRUE;
+		} else {
+			g_string_printf (nmc->return_text, _("Error: Unknown parameter %s."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto error;
+		}
+
+		argc--;
+		argv++;
+	}
+	show_password = nmc->show_secrets || show_password;
+
+	/* Verify band and channel parameters */
+	if (!channel) {
+		if (g_strcmp0 (band, "bg") == 0)
+			channel = "1";
+		if (g_strcmp0 (band, "a") == 0)
+			channel = "7";
+	}
+	if (channel) {
+		if (!band) {
+			g_string_printf (nmc->return_text, _("Error: channel requires band too."));
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto error;
+		}
+		if (   !nmc_string_to_uint (channel, TRUE, 1, 5825, &channel_int)
+		    || !nm_utils_wifi_is_channel_valid (channel_int, band)) {
+			g_string_printf (nmc->return_text, _("Error: channel '%s' not valid for band '%s'."),
+			                 channel, band);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto error;
+		}
+	}
+
+	/* Find Wi-Fi device. When no ifname is provided, the first Wi-Fi is used. */
+	devices = nm_client_get_devices (nmc->client);
+	devices_idx = 0;
+	device = find_wifi_device_by_iface (devices, ifname, &devices_idx);
+
+	if (!device) {
+		if (ifname)
+			g_string_printf (nmc->return_text, _("Error: Device '%s' is not a Wi-Fi device."), ifname);
+		else
+			g_string_printf (nmc->return_text, _("Error: No Wi-Fi device found."));
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto error;
+	}
+
+	/* Check device supported mode */
+	caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device));
+	if (caps & NM_WIFI_DEVICE_CAP_AP)
+		wifi_mode = NM_SETTING_WIRELESS_MODE_AP;
+	else if (caps & NM_WIFI_DEVICE_CAP_ADHOC)
+		wifi_mode = NM_SETTING_WIRELESS_MODE_ADHOC;
+	else {
+		g_string_printf (nmc->return_text, _("Error: Device '%s' supports neither AP nor Ad-Hoc mode."),
+		                 nm_device_get_iface (device));
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		goto error;
+	}
+
+	/* Create a connection with appropriate parameters */
+	connection = nm_simple_connection_new ();
+	s_con =  (NMSettingConnection *) nm_setting_connection_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_con));
+	if (!con_name)
+		con_name = default_name = nmc_unique_connection_name (nm_client_get_connections (nmc->client), "Hotspot");
+	g_object_set (s_con,
+                      NM_SETTING_CONNECTION_ID, con_name,
+	              NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+	              NULL);
+	g_free (default_name);
+
+	s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_wifi));
+	ssid_bytes = generate_ssid_for_hotspot (ssid);
+	g_object_set (s_wifi, NM_SETTING_WIRELESS_MODE, wifi_mode,
+	                      NM_SETTING_WIRELESS_SSID, ssid_bytes,
+	                      NULL);
+	g_bytes_unref (ssid_bytes);
+	if (channel)
+		g_object_set (s_wifi,
+		              NM_SETTING_WIRELESS_CHANNEL, (guint32) channel_int,
+		              NM_SETTING_WIRELESS_BAND, band,
+		              NULL);
+
+	s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_wsec));
+	if (!set_wireless_security_for_hotspot (s_wsec, wifi_mode, caps, password, show_password, &error)) {
+		g_object_unref (connection);
+		g_string_printf (nmc->return_text, _("Error: Invalid 'password': %s."), error->message);
+		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+		g_clear_error (&error);
+		goto error;
+	}
+
+	s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_ip4));
+	g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_SHARED, NULL);
+
+	s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_ip6));
+	g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
+
+	/* Activate the connection now */
+	nmc->nowait_flag = (nmc->timeout == 0);
+	nmc->should_wait = TRUE;
+
+	info = g_malloc0 (sizeof (AddAndActivateInfo));
+	info->nmc = nmc;
+	info->device = device;
+	info->hotspot = TRUE;
+
+	nm_client_add_and_activate_connection_async (nmc->client,
+	                                             connection,
+	                                             device,
+	                                             NULL,
+	                                             NULL,
+	                                             add_and_activate_cb,
+	                                             info);
+
+error:
+	return nmc->return_value;
+}
+
 static void
 request_rescan_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 {
@@ -2653,8 +3308,6 @@ do_device_wifi_rescan (NmCli *nmc, int argc, char **argv)
 	const char *ssid;
 	int i;
 
-	nmc->should_wait = TRUE;
-
 	ssids = g_ptr_array_new ();
 
 	/* Get the parameters */
@@ -2722,7 +3375,7 @@ do_device_wifi_rescan (NmCli *nmc, int argc, char **argv)
 	g_ptr_array_free (ssids, FALSE);
 	return nmc->return_value;
 error:
-	nmc->should_wait = FALSE;
+	nmc->should_wait++;
 	g_ptr_array_free (ssids, FALSE);
 	return nmc->return_value;
 }
@@ -2737,6 +3390,8 @@ do_device_wifi (NmCli *nmc, int argc, char **argv)
 			nmc->return_value = do_device_wifi_list (nmc, argc-1, argv+1);
 		} else if (matches (*argv, "connect") == 0) {
 			nmc->return_value = do_device_wifi_connect_network (nmc, argc-1, argv+1);
+		} else if (matches (*argv, "hotspot") == 0) {
+			nmc->return_value = do_device_wifi_hotspot (nmc, argc-1, argv+1);
 		} else if (matches (*argv, "rescan") == 0) {
 			nmc->return_value = do_device_wifi_rescan (nmc, argc-1, argv+1);
 		} else {
@@ -2748,46 +3403,98 @@ do_device_wifi (NmCli *nmc, int argc, char **argv)
 	return nmc->return_value;
 }
 
-#if WITH_WIMAX
-static void
-show_nsp_info (NMDevice *device, NmCli *nmc)
+static int
+show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *counter)
 {
-	const GPtrArray *nsps;
-	int i, idx = 1;
-	NmcOutputField *arr;
+	NmcOutputField *tmpl, *arr;
+	GPtrArray *neighbors;
+	size_t tmpl_len;
+	const char *str;
+	int i;
 
-	/* Add headers (field names) */
-	arr = nmc_dup_fields_array (nmc_fields_dev_wimax_list, sizeof (nmc_fields_dev_wimax_list),
-	                            NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
+	neighbors = nm_device_get_lldp_neighbors (device);
+
+	if (!neighbors || !neighbors->len)
+		return 0;
+
+	tmpl = nmc_fields_dev_lldp_list;
+	tmpl_len = sizeof (nmc_fields_dev_lldp_list);
+
+	/* Main header name */
+	nmc->print_fields.header_name = (char *) construct_header_name (_("Device LLDP neighbors"),
+	                                                                nm_device_get_iface (device));
+	nmc->print_fields.indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, NULL);
+	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
 	g_ptr_array_add (nmc->output_data, arr);
 
-	nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
-	for (i = 0; i < nsps->len; i++) {
-		NMWimaxNsp *nsp = g_ptr_array_index (nsps, i);
+	for (i = 0; i < neighbors->len; i++) {
+		NMLldpNeighbor *neighbor = neighbors->pdata[i];
+		guint value;
+
+		arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
+		set_val_str (arr, 0, g_strdup_printf ("NEIGHBOR[%d]", (*counter)++));
+
+		set_val_strc (arr, 1, nm_device_get_iface (device));
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_CHASSIS_ID, &str))
+			set_val_strc (arr, 2, str);
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_PORT_ID, &str))
+			set_val_strc (arr, 3, str);
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_PORT_DESCRIPTION, &str))
+			set_val_strc (arr, 4, str);
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_SYSTEM_NAME, &str))
+			set_val_strc (arr, 5, str);
 
-		fill_output_wimax_nsp (nsp, nmc, device, idx++, 0);
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_SYSTEM_DESCRIPTION, &str))
+			set_val_strc (arr, 6, str);
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_SYSTEM_CAPABILITIES, &value))
+			set_val_str (arr, 7, g_strdup_printf ("%u (%s)", value, nmc_parse_lldp_capabilities (value)));
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PVID, &value))
+			set_val_str (arr, 8, g_strdup_printf ("%u", value));
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PPVID, &value))
+			set_val_str (arr, 9, g_strdup_printf ("%u", value));
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS, &value))
+			set_val_str (arr, 10, g_strdup_printf ("%u", value));
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_VID, &value))
+			set_val_str (arr, 11, g_strdup_printf ("%u", value));
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME, &str))
+			set_val_strc (arr, 12, str);
+
+		if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_DESTINATION, &str))
+			set_val_strc (arr, 13, str);
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_CHASSIS_ID_TYPE, &value))
+			set_val_strc (arr, 14, g_strdup_printf ("%u", value));
+
+		if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_PORT_ID_TYPE, &value))
+			set_val_strc (arr, 15, g_strdup_printf ("%u", value));
+
+		g_ptr_array_add (nmc->output_data, arr);
 	}
-	print_data (nmc);  /* Print all data */
+
+	print_data (nmc);
 	nmc_empty_output_fields (nmc);
+
+	return neighbors->len;
 }
 
-static NMCResultCode
-do_device_wimax_list (NmCli *nmc, int argc, char **argv)
+static gboolean
+do_device_lldp_list (NmCli *nmc, int argc, char **argv)
 {
+	NMDevice *device = NULL, **devices = NULL;
 	GError *error = NULL;
-	NMDevice *device = NULL;
-	NMWimaxNsp *nsp = NULL;
 	const char *ifname = NULL;
-	const char *nsp_user = NULL;
-	const GPtrArray *devices;
-	const GPtrArray *nsps;
-	int i, j;
 	char *fields_str;
-	char *fields_all =    NMC_FIELDS_DEV_WIMAX_LIST_ALL;
-	char *fields_common = NMC_FIELDS_DEV_WIMAX_LIST_COMMON;
-	NmcOutputField *tmpl, *arr;
-	size_t tmpl_len;
-	const char *base_hdr = _("WiMAX NSP list");
+	int i, counter = 0;
 
 	while (argc > 0) {
 		if (strcmp (*argv, "ifname") == 0) {
@@ -2797,44 +3504,43 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv)
 				goto error;
 			}
 			ifname = *argv;
-		} else if (strcmp (*argv, "nsp") == 0) {
-			if (next_arg (&argc, &argv) != 0) {
-				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
-				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-				goto error;
-			}
-			nsp_user = *argv;
 		} else {
-			g_printerr (_("Unknown parameter: %s\n"), *argv);
+			g_string_printf (nmc->return_text, _("Error: unknown parameter: %s"), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			goto error;
 		}
 
 		argc--;
 		argv++;
 	}
 
+	if (argc > 0) {
+		g_string_printf (nmc->return_text, _("Error: invalid extra argument '%s'."), *argv);
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto error;
+	}
+
 	if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
-		fields_str = fields_common;
+		fields_str = NMC_FIELDS_DEV_LLDP_LIST_COMMON;
 	else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0)
-		fields_str = fields_all;
+		fields_str = NMC_FIELDS_DEV_LLDP_LIST_ALL;
 	else
 		fields_str = nmc->required_fields;
 
-	tmpl = nmc_fields_dev_wimax_list;
-	tmpl_len = sizeof (nmc_fields_dev_wimax_list);
-	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, &error);
 
 	if (error) {
-		g_string_printf (nmc->return_text, _("Error: 'device wimax': %s"), error->message);
+		g_string_printf (nmc->return_text, _("Error: 'device lldp list': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		goto error;
+		return nmc->return_value;
 	}
 
-	devices = nm_client_get_devices (nmc->client);
+	devices = get_devices_sorted (nmc->client);
+
 	if (ifname) {
-		/* Device specified - list only NSPs of this interface */
-		for (i = 0; i < devices->len; i++) {
-			NMDevice *candidate = g_ptr_array_index (devices, i);
+		for (i = 0; devices[i]; i++) {
+			NMDevice *candidate = devices[i];
 			const char *dev_iface = nm_device_get_iface (candidate);
 
 			if (!g_strcmp0 (dev_iface, ifname)) {
@@ -2849,126 +3555,34 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv)
 			goto error;
 		}
 
-		/* Main header name */
-		nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, ifname);
-
-		if (NM_IS_DEVICE_WIMAX (device)) {
-			if (nsp_user) {
-				/* Specific NSP requested - list only that */
-				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
-				for (j = 0, nsp = NULL; j < nsps->len; j++) {
-					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
-					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
-					char *nsp_up;
-
-					nsp_up = g_ascii_strup (nsp_user, -1);
-					if (!strcmp (nsp_up, candidate_name))
-						nsp = candidate_nsp;
-					g_free (nsp_up);
-				}
-				if (!nsp) {
-					g_string_printf (nmc->return_text, _("Error: NSP with name '%s' not found."), nsp_user);
-					nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
-					goto error;
-				}
-				/* Add headers (field names) */
-				arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
-				g_ptr_array_add (nmc->output_data, arr);
-				fill_output_wimax_nsp (nsp, nmc, device, 1, 0);
-				print_data (nmc);  /* Print all data */
-			} else {
-				show_nsp_info (device, nmc);
-			}
-		} else {
-			g_string_printf (nmc->return_text, _("Error: Device '%s' is not a WiMAX device."), ifname);
-			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-			goto error;
-		}
+		nmc_empty_output_fields (nmc);
+		show_device_lldp_list (device, nmc, fields_str, &counter);
 	} else {
-		gboolean empty_line = FALSE;
-
-		/* List NSPs for all devices */
-		if (nsp_user) {
-			/* Specific NSP requested - list only that */
-			for (i = 0; i < devices->len; i++) {
-				NMDevice *dev = g_ptr_array_index (devices, i);
-				int idx = 1;
-
-				if (!NM_IS_DEVICE_WIMAX (dev))
-					continue;
-
-				/* Main header name */
-				nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev));
-				nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL);
-
-				arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
-				g_ptr_array_add (nmc->output_data, arr);
-
-				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (dev));
-				for (j = 0, nsp = NULL; j < nsps->len; j++) {
-					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
-					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
-					char *nsp_up;
-
-					nsp_up = g_ascii_strup (nsp_user, -1);
-					if (!strcmp (nsp_up, candidate_name)) {
-						nsp = candidate_nsp;
-						fill_output_wimax_nsp (nsp, nmc, dev, idx, 0);
-					}
-					g_free (nsp_up);
-				}
-				if (empty_line)
-					g_print ("\n"); /* Empty line between devices' NSPs */
-				print_data (nmc);  /* Print all data */
-				nmc_empty_output_fields (nmc);
-				empty_line = TRUE;
-			}
-			if (!nsp) {
-				g_string_printf (nmc->return_text, _("Error: Access point with nsp '%s' not found."), nsp_user);
-				nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
-				goto error;
-			}
-		} else {
-			for (i = 0; i < devices->len; i++) {
-				NMDevice *dev = g_ptr_array_index (devices, i);
-
-				/* Main header name */
-				nmc->print_fields.header_name = (char *) construct_header_name (base_hdr,
-				                                                                nm_device_get_iface (dev));
-				nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL);
-
-				if (NM_IS_DEVICE_WIMAX (dev)) {
-					if (empty_line)
-						g_print ("\n"); /* Empty line between devices' NSPs */
-					show_nsp_info (dev, nmc);
-					empty_line = TRUE;
-				}
-			}
+		for (i = 0; devices[i]; i++) {
+			nmc_empty_output_fields (nmc);
+			show_device_lldp_list (devices[i], nmc, fields_str, &counter);
 		}
 	}
 
 error:
+	g_free (devices);
 	return nmc->return_value;
 }
 
 static NMCResultCode
-do_device_wimax (NmCli *nmc, int argc, char **argv)
+do_device_lldp (NmCli *nmc, int argc, char **argv)
 {
 	if (argc == 0)
-		nmc->return_value = do_device_wimax_list (nmc, argc-1, argv+1);
-	else if (argc > 0) {
-		if (matches (*argv, "list") == 0) {
-			nmc->return_value = do_device_wimax_list (nmc, argc-1, argv+1);
-		}
-		else {
-			g_string_printf (nmc->return_text, _("Error: 'device wimax' command '%s' is not valid."), *argv);
-			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-		}
+		nmc->return_value = do_device_lldp_list (nmc, argc, argv);
+	else if (matches (*argv, "list") == 0)
+		nmc->return_value = do_device_lldp_list (nmc, argc-1, argv+1);
+	else {
+		g_string_printf (nmc->return_text, _("Error: 'device lldp' command '%s' is not valid."), *argv);
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 	}
 
 	return nmc->return_value;
 }
-#endif
 
 static gboolean
 is_single_word (const char* line)
@@ -3101,6 +3715,13 @@ do_devices (NmCli *nmc, int argc, char **argv)
 			}
 			nmc->return_value = do_device_connect (nmc, argc-1, argv+1);
 		}
+		else if (matches (*argv, "reapply") == 0) {
+			if (nmc_arg_is_help (*(argv+1))) {
+				usage_device_reapply ();
+				goto usage_exit;
+			}
+			nmc->return_value = do_device_reapply (nmc, argc-1, argv+1);
+		}
 		else if (matches (*argv, "disconnect") == 0) {
 			if (nmc_arg_is_help (*(argv+1))) {
 				usage_device_disconnect ();
@@ -3115,6 +3736,20 @@ do_devices (NmCli *nmc, int argc, char **argv)
 			}
 			nmc->return_value = do_device_delete (nmc, argc-1, argv+1);
 		}
+		else if (matches (*argv, "set") == 0) {
+			if (nmc_arg_is_help (*(argv+1))) {
+				usage_device_set ();
+				goto usage_exit;
+			}
+			nmc->return_value = do_device_set (nmc, argc-1, argv+1);
+		}
+		else if (matches (*argv, "monitor") == 0) {
+			if (nmc_arg_is_help (*(argv+1))) {
+				usage_device_monitor ();
+				goto usage_exit;
+			}
+			nmc->return_value = do_device_monitor (nmc, argc-1, argv+1);
+		}
 		else if (matches (*argv, "wifi") == 0) {
 			if (nmc_arg_is_help (*(argv+1))) {
 				usage_device_wifi ();
@@ -3124,17 +3759,17 @@ do_devices (NmCli *nmc, int argc, char **argv)
 				goto opt_error;
 			nmc->return_value = do_device_wifi (nmc, argc-1, argv+1);
 		}
-#if WITH_WIMAX
-		else if (matches (*argv, "wimax") == 0) {
+		else if (matches (*argv, "lldp") == 0) {
 			if (nmc_arg_is_help (*(argv+1))) {
-				usage_device_wimax ();
+				usage_device_lldp ();
 				goto usage_exit;
 			}
 			if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
 				goto opt_error;
-			nmc->return_value = do_device_wimax (nmc, argc-1, argv+1);
+			if (!nmc->mode_specified)
+				nmc->multiline_output = TRUE;  /* multiline mode is default for 'device lldp' */
+			nmc->return_value = do_device_lldp (nmc, argc-1, argv+1);
 		}
-#endif
 		else {
 			usage ();
 			g_string_printf (nmc->return_text, _("Error: 'dev' command '%s' is not valid."), *argv);
@@ -3151,3 +3786,9 @@ opt_error:
 	g_error_free (error);
 	return nmc->return_value;
 }
+
+void
+monitor_devices (NmCli *nmc)
+{
+	do_device_monitor (nmc, 0, NULL);
+}
diff --git a/clients/cli/devices.h b/clients/cli/devices.h
index 152dd207..56fc9c2f 100644
--- a/clients/cli/devices.h
+++ b/clients/cli/devices.h
@@ -24,4 +24,6 @@
 
 NMCResultCode do_devices (NmCli *nmc, int argc, char **argv);
 
+void monitor_devices (NmCli *nmc);
+
 #endif /* NMC_DEVICES_H */
diff --git a/clients/cli/general.c b/clients/cli/general.c
index 44c63c35..5ed1f802 100644
--- a/clients/cli/general.c
+++ b/clients/cli/general.c
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 #include "config.h"
@@ -22,39 +22,33 @@
 #include <string.h>
 #include <stdlib.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
+#include "nm-default.h"
 #include "polkit-agent.h"
 #include "utils.h"
 #include "general.h"
 
+#include "devices.h"
+#include "connections.h"
 
 /* Available fields for 'general status' */
 static NmcOutputField nmc_fields_nm_status[] = {
-	{"RUNNING",      N_("RUNNING"),      15},  /* 0 */
-	{"VERSION",      N_("VERSION"),      10},  /* 1 */
-	{"STATE",        N_("STATE"),        15},  /* 2 */
-	{"STARTUP",      N_("STARTUP"),      10},  /* 3 */
-	{"CONNECTIVITY", N_("CONNECTIVITY"), 15},  /* 4 */
-	{"NETWORKING",   N_("NETWORKING"),   13},  /* 5 */
-	{"WIFI-HW",      N_("WIFI-HW"),      15},  /* 6 */
-	{"WIFI",         N_("WIFI"),         10},  /* 7 */
-	{"WWAN-HW",      N_("WWAN-HW"),      15},  /* 8 */
-	{"WWAN",         N_("WWAN"),         10},  /* 9 */
-	{"WIMAX-HW",     N_("WIMAX-HW"),     15},  /* 10 */
-	{"WIMAX",        N_("WIMAX"),        10},  /* 11 */
-	{NULL,           NULL,                0}
+	{"RUNNING",      N_("RUNNING")},       /* 0 */
+	{"VERSION",      N_("VERSION")},       /* 1 */
+	{"STATE",        N_("STATE")},         /* 2 */
+	{"STARTUP",      N_("STARTUP")},       /* 3 */
+	{"CONNECTIVITY", N_("CONNECTIVITY")},  /* 4 */
+	{"NETWORKING",   N_("NETWORKING")},    /* 5 */
+	{"WIFI-HW",      N_("WIFI-HW")},       /* 6 */
+	{"WIFI",         N_("WIFI")},          /* 7 */
+	{"WWAN-HW",      N_("WWAN-HW")},       /* 8 */
+	{"WWAN",         N_("WWAN")},          /* 9 */
+	{"WIMAX-HW",     N_("WIMAX-HW")},      /* 10 */
+	{"WIMAX",        N_("WIMAX")},         /* 11 */
+	{NULL, NULL}
 };
-#if WITH_WIMAX
-#define NMC_FIELDS_NM_STATUS_ALL     "RUNNING,VERSION,STATE,STARTUP,CONNECTIVITY,NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN,WIMAX-HW,WIMAX"
-#define NMC_FIELDS_NM_STATUS_SWITCH  "NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN,WIMAX-HW,WIMAX"
-#define NMC_FIELDS_NM_STATUS_RADIO   "WIFI-HW,WIFI,WWAN-HW,WWAN,WIMAX-HW,WIMAX"
-#else
 #define NMC_FIELDS_NM_STATUS_ALL     "RUNNING,VERSION,STATE,STARTUP,CONNECTIVITY,NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN"
 #define NMC_FIELDS_NM_STATUS_SWITCH  "NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN"
 #define NMC_FIELDS_NM_STATUS_RADIO   "WIFI-HW,WIFI,WWAN-HW,WWAN"
-#endif
 #define NMC_FIELDS_NM_STATUS_COMMON  "STATE,CONNECTIVITY,WIFI-HW,WIFI,WWAN-HW,WWAN"
 #define NMC_FIELDS_NM_NETWORKING     "NETWORKING"
 #define NMC_FIELDS_NM_WIFI           "WIFI"
@@ -65,18 +59,18 @@ static NmcOutputField nmc_fields_nm_status[] = {
 
 /* Available fields for 'general permissions' */
 static NmcOutputField nmc_fields_nm_permissions[] = {
-	{"PERMISSION", N_("PERMISSION"), 57},  /* 0 */
-	{"VALUE",      N_("VALUE"),      10},  /* 1 */
-	{NULL,         NULL,              0}
+	{"PERMISSION", N_("PERMISSION")},  /* 0 */
+	{"VALUE",      N_("VALUE")},       /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_NM_PERMISSIONS_ALL     "PERMISSION,VALUE"
 #define NMC_FIELDS_NM_PERMISSIONS_COMMON  "PERMISSION,VALUE"
 
 /* Available fields for 'general logging' */
 static NmcOutputField nmc_fields_nm_logging[] = {
-	{"LEVEL",   N_("LEVEL"),   10},  /* 0 */
-	{"DOMAINS", N_("DOMAINS"), 70},  /* 1 */
-	{NULL,      NULL,           0}
+	{"LEVEL",   N_("LEVEL")},    /* 0 */
+	{"DOMAINS", N_("DOMAINS")},  /* 1 */
+	{NULL, NULL}
 };
 #define NMC_FIELDS_NM_LOGGING_ALL     "LEVEL,DOMAINS"
 #define NMC_FIELDS_NM_LOGGING_COMMON  "LEVEL,DOMAINS"
@@ -181,13 +175,8 @@ static void
 usage_radio (void)
 {
 	g_printerr (_("Usage: nmcli radio { COMMAND | help }\n\n"
-#if WITH_WIMAX
-	              "COMMAND := { all | wifi | wwan | wimax }\n\n"
-	              "  all | wifi | wwan | wimax [ on | off ]\n\n"
-#else
 	              "COMMAND := { all | wifi | wwan }\n\n"
 	              "  all | wifi | wwan [ on | off ]\n\n"
-#endif
 	              ));
 }
 
@@ -221,17 +210,14 @@ usage_radio_wwan (void)
 	              "Get status of mobile broadband radio switch, or turn it on/off.\n\n"));
 }
 
-#if WITH_WIMAX
 static void
-usage_radio_wimax (void)
+usage_monitor (void)
 {
-	g_printerr (_("Usage: nmcli radio wimax { ARGUMENTS | help }\n"
-	              "\n"
-	              "ARGUMENTS := [on | off]\n"
+	g_printerr (_("Usage: nmcli monitor\n"
 	              "\n"
-	              "Get status of WiMAX radio switch, or turn it on/off.\n\n"));
+	              "Monitor NetworkManager changes.\n"
+	              "Prints a line whenever a change occurs in NetworkManager\n\n"));
 }
-#endif
 
 /* quit main loop */
 static void
@@ -264,6 +250,26 @@ nm_state_to_string (NMState state)
 	}
 }
 
+static NmcTermColor
+state_to_color (NMState state)
+{
+	switch (state) {
+	case NM_STATE_CONNECTING:
+		return NMC_TERM_COLOR_YELLOW;
+	case NM_STATE_CONNECTED_LOCAL:
+	case NM_STATE_CONNECTED_SITE:
+	case NM_STATE_CONNECTED_GLOBAL:
+		return NMC_TERM_COLOR_GREEN;
+	case NM_STATE_DISCONNECTING:
+		return NMC_TERM_COLOR_YELLOW;
+	case NM_STATE_ASLEEP:
+	case NM_STATE_DISCONNECTED:
+		return NMC_TERM_COLOR_RED;
+	default:
+		return NMC_TERM_COLOR_NORMAL;
+	}
+}
+
 static const char *
 nm_connectivity_to_string (NMConnectivityState connectivity)
 {
@@ -282,18 +288,31 @@ nm_connectivity_to_string (NMConnectivityState connectivity)
 	}
 }
 
+static NmcTermColor
+connectivity_to_color (NMConnectivityState connectivity)
+{
+	switch (connectivity) {
+	case NM_CONNECTIVITY_NONE:
+		return NMC_TERM_COLOR_RED;
+	case NM_CONNECTIVITY_PORTAL:
+	case NM_CONNECTIVITY_LIMITED:
+		return NMC_TERM_COLOR_YELLOW;
+	case NM_CONNECTIVITY_FULL:
+		return NMC_TERM_COLOR_GREEN;
+	default:
+		return NMC_TERM_COLOR_NORMAL;
+	}
+}
+
 static gboolean
 show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_flds)
 {
 	gboolean startup = FALSE;
 	NMState state = NM_STATE_UNKNOWN;
 	NMConnectivityState connectivity = NM_CONNECTIVITY_UNKNOWN;
-	const char *net_enabled_str;
-	const char *wireless_hw_enabled_str, *wireless_enabled_str;
-	const char *wwan_hw_enabled_str, *wwan_enabled_str;
-#if WITH_WIMAX
-	const char *wimax_hw_enabled_str, *wimax_enabled_str;
-#endif
+	gboolean net_enabled;
+	gboolean wireless_hw_enabled, wireless_enabled;
+	gboolean wwan_hw_enabled, wwan_enabled;
 	GError *error = NULL;
 	const char *fields_str;
 	const char *fields_all =    print_flds ? print_flds : NMC_FIELDS_NM_STATUS_ALL;
@@ -333,15 +352,11 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl
 	state = nm_client_get_state (nmc->client);
 	startup = nm_client_get_startup (nmc->client);
 	connectivity = nm_client_get_connectivity (nmc->client);
-	net_enabled_str = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-	wireless_hw_enabled_str = nm_client_wireless_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-	wireless_enabled_str = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-	wwan_hw_enabled_str = nm_client_wwan_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-	wwan_enabled_str = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-#if WITH_WIMAX
-	wimax_hw_enabled_str = nm_client_wimax_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-	wimax_enabled_str = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled");
-#endif
+	net_enabled = nm_client_networking_get_enabled (nmc->client);
+	wireless_hw_enabled = nm_client_wireless_hardware_get_enabled (nmc->client);
+	wireless_enabled = nm_client_wireless_get_enabled (nmc->client);
+	wwan_hw_enabled = nm_client_wwan_hardware_get_enabled (nmc->client);
+	wwan_enabled = nm_client_wwan_get_enabled (nmc->client);
 
 	nmc->print_fields.header_name = pretty_header_name ? (char *) pretty_header_name : _("NetworkManager status");
 	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
@@ -353,15 +368,22 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl
 	set_val_strc (arr, 2, nm_state_to_string (state));
 	set_val_strc (arr, 3, startup ? _("starting") : _("started"));
 	set_val_strc (arr, 4, nm_connectivity_to_string (connectivity));
-	set_val_strc (arr, 5, net_enabled_str);
-	set_val_strc (arr, 6, wireless_hw_enabled_str);
-	set_val_strc (arr, 7, wireless_enabled_str);
-	set_val_strc (arr, 8, wwan_hw_enabled_str);
-	set_val_strc (arr, 9, wwan_enabled_str);
-#if WITH_WIMAX
-	set_val_strc (arr, 10, wimax_hw_enabled_str);
-	set_val_strc (arr, 11, wimax_enabled_str);
-#endif
+	set_val_strc (arr, 5, net_enabled ? _("enabled") : _("disabled"));
+	set_val_strc (arr, 6, wireless_hw_enabled ? _("enabled") : _("disabled"));
+	set_val_strc (arr, 7, wireless_enabled ? _("enabled") : _("disabled"));
+	set_val_strc (arr, 8, wwan_hw_enabled ? _("enabled") : _("disabled"));
+	set_val_strc (arr, 9, wwan_enabled ? _("enabled") : _("disabled"));
+
+	/* Set colors */
+	arr[2].color = state_to_color (state);
+	arr[3].color = startup ? NMC_TERM_COLOR_YELLOW : NMC_TERM_COLOR_GREEN;
+	arr[4].color = connectivity_to_color (connectivity);
+	arr[5].color = net_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED;
+	arr[6].color = wireless_hw_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED;
+	arr[7].color = wireless_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED;
+	arr[8].color = wwan_hw_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED;
+	arr[9].color = wwan_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED;
+
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -609,7 +631,7 @@ do_general (NmCli *nmc, int argc, char **argv)
 				if (next_arg (&argc, &argv) == 0)
 					g_print ("Warning: ignoring extra garbage after '%s' hostname\n", hostname);
 
-				nmc->should_wait = TRUE;
+				nmc->should_wait++;
 				nmc->get_client (nmc); /* create NMClient */
 				nm_client_save_hostname_async (nmc->client, hostname, NULL, save_hostname_cb, nmc);
 			}
@@ -867,24 +889,6 @@ do_radio (NmCli *nmc, int argc, char **argv)
 				nm_client_wwan_set_enabled (nmc->client, enable_flag);
 			}
 		}
-#if WITH_WIMAX
-		else if (matches (*argv, "wimax") == 0) {
-			if (nmc_arg_is_help (*(argv+1))) {
-				usage_radio_wimax ();
-				goto finish;
-			}
-			if (next_arg (&argc, &argv) != 0) {
-				/* no argument, show current WiMAX state */
-				nmc_switch_show (nmc, NMC_FIELDS_NM_WIMAX, _("WiMAX radio switch"));
-			} else {
-				if (!nmc_switch_parse_on_off (nmc, *(argv-1), *argv, &enable_flag))
-					goto finish;
-
-				nmc->get_client (nmc); /* create NMClient */
-				nm_client_wimax_set_enabled (nmc->client, enable_flag);
-			}
-		}
-#endif
 		else {
 			usage_radio ();
 			g_string_printf (nmc->return_text, _("Error: 'radio' command '%s' is not valid."), *argv);
@@ -897,3 +901,121 @@ finish:
 	return nmc->return_value;
 }
 
+static void
+networkmanager_running (NMClient *client, GParamSpec *param, NmCli *nmc)
+{
+	gboolean running;
+	NmcTermColor color;
+	const char *message;
+	char *str;
+
+	running = nm_client_get_nm_running (client);
+	if (running) {
+		color = NMC_TERM_COLOR_GREEN;
+		message = _("NetworkManager has started");
+	} else {
+		color = NMC_TERM_COLOR_RED;
+		message = _("NetworkManager has stopped");
+	}
+
+	str = nmc_colorize (nmc, color, NMC_TERM_FORMAT_NORMAL, message);
+	g_print ("%s\n", str);
+	g_free (str);
+}
+
+static void
+client_hostname (NMClient *client, GParamSpec *param, NmCli *nmc)
+{
+	const char *hostname;
+
+	g_object_get (client, NM_CLIENT_HOSTNAME, &hostname, NULL);
+	g_print (_("Hostname set to '%s'\n"), hostname);
+}
+
+static void
+client_primary_connection (NMClient *client, GParamSpec *param, NmCli *nmc)
+{
+	NMActiveConnection *primary;
+	const char *id;
+
+	primary = nm_client_get_primary_connection (client);
+	if (primary) {
+		id = nm_active_connection_get_id (primary);
+		if (!id)
+			id = nm_active_connection_get_uuid (primary);
+
+		g_print (_("'%s' is now the primary connection\n"), id);
+	} else {
+		g_print (_("There's no primary connection\n"));
+	}
+}
+
+static void
+client_connectivity (NMClient *client, GParamSpec *param, NmCli *nmc)
+{
+	NMConnectivityState connectivity;
+	char *str;
+
+	g_object_get (client, NM_CLIENT_CONNECTIVITY, &connectivity, NULL);
+	str = nmc_colorize (nmc, connectivity_to_color (connectivity), NMC_TERM_FORMAT_NORMAL,
+	                    _("Connectivity is now '%s'\n"), nm_connectivity_to_string (connectivity));
+	g_print ("%s", str);
+	g_free (str);
+}
+
+static void
+client_state (NMClient *client, GParamSpec *param, NmCli *nmc)
+{
+	NMState state;
+	char *str;
+
+	g_object_get (client, NM_CLIENT_STATE, &state, NULL);
+	str = nmc_colorize (nmc, state_to_color (state), NMC_TERM_FORMAT_NORMAL,
+	                    _("Networkmanager is now in the '%s' state\n"),
+	                    nm_state_to_string (state));
+	g_print ("%s", str);
+	g_free (str);
+}
+
+NMCResultCode
+do_monitor (NmCli *nmc, int argc, char **argv)
+{
+	if (argc > 0) {
+		if (!nmc_arg_is_help (*argv)) {
+			g_string_printf (nmc->return_text, _("Error: 'monitor' command '%s' is not valid."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		}
+
+		usage_monitor ();
+		return nmc->return_value;
+	}
+
+	nmc->get_client (nmc); /* create NMClient */
+
+	if (!nm_client_get_nm_running (nmc->client)) {
+		char *str;
+
+		str = nmc_colorize (nmc, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL,
+		                    _("Networkmanager is not running (waiting for it)\n"));
+		g_print ("%s", str);
+		g_free (str);
+	}
+
+	g_signal_connect (nmc->client, "notify::" NM_CLIENT_NM_RUNNING,
+	                  G_CALLBACK (networkmanager_running), nmc);
+	g_signal_connect (nmc->client, "notify::" NM_CLIENT_HOSTNAME,
+	                  G_CALLBACK (client_hostname), nmc);
+	g_signal_connect (nmc->client, "notify::" NM_CLIENT_PRIMARY_CONNECTION,
+	                  G_CALLBACK (client_primary_connection), nmc);
+	g_signal_connect (nmc->client, "notify::" NM_CLIENT_CONNECTIVITY,
+	                  G_CALLBACK (client_connectivity), nmc);
+	g_signal_connect (nmc->client, "notify::" NM_CLIENT_STATE,
+	                  G_CALLBACK (client_state), nmc);
+
+	nmc->should_wait++;
+
+	monitor_devices (nmc);
+	monitor_connections (nmc);
+
+	return NMC_RESULT_SUCCESS;
+}
diff --git a/clients/cli/general.h b/clients/cli/general.h
index 7e8c21f9..40dddb20 100644
--- a/clients/cli/general.h
+++ b/clients/cli/general.h
@@ -25,5 +25,6 @@
 NMCResultCode do_general    (NmCli *nmc, int argc, char **argv);
 NMCResultCode do_networking (NmCli *nmc, int argc, char **argv);
 NMCResultCode do_radio      (NmCli *nmc, int argc, char **argv);
+NMCResultCode do_monitor    (NmCli *nmc, int argc, char **argv);
 
 #endif /* NMC_GENERAL_H */
diff --git a/clients/cli/nmcli-completion b/clients/cli/nmcli-completion
index 7bdd5255..f8c0298e 100644
--- a/clients/cli/nmcli-completion
+++ b/clients/cli/nmcli-completion
@@ -187,6 +187,33 @@ _nmcli_compl_OPTIONS()
             show-secrets)
                 _nmcli_array_delete_at words 0
                 ;;
+            order)
+                if [[ "${#words[@]}" -eq 2 ]]; then
+                   local ord="${words[1]}"
+                   local ord_sta=""
+                   local i
+                   local c=()
+
+                   # FIXME: currently the completion considers colon as separator
+                   # for words. Hence the following doesn't work as $ord will
+                   # not contain any colons at this point.
+                   # See https://bugzilla.gnome.org/show_bug.cgi?id=745157
+
+                   if [[ $ord = *":"* ]]; then
+                       ord_sta="${ord%:*}:"
+                       ord="${ord##*:}"
+                   fi
+                   if [[ $ord = [-+]* ]]; then
+                       ord_sta="$ord_sta${ord:0:1}"
+                   fi
+                   for i in active name type path; do
+                       c=("${c[@]}" "$ord_sta$i")
+                   done
+                   _nmcli_list "${c[*]}"
+                   return 0
+                fi
+                _nmcli_array_delete_at words 0 1
+                ;;
             active)
                 _nmcli_array_delete_at words 0
                 ;;
@@ -211,11 +238,18 @@ _nmcli_compl_OPTIONS()
                 fi
                 _nmcli_array_delete_at words 0 1
                 ;;
+            colors)
+                if [[ "${#words[@]}" -eq 2 ]]; then
+                    _nmcli_list "yes no auto"
+                   return 0
+                fi
+                _nmcli_array_delete_at words 0 1
+                ;;
             fields)
                 if [[ "${#words[@]}" -eq 2 ]]; then
                     _nmcli_list "all common
                         NAME UUID TYPE TIMESTAMP TIMESTAMP-REAL AUTOCONNECT READONLY DBUS-PATH ACTIVE DEVICE STATE ACTIVE-PATH
-                        connection 802-3-ethernet 802-1x 802-11-wireless 802-11-wireless-security ipv4 ipv6 serial ppp pppoe gsm cdma bluetooth 802-11-olpc-mesh vpn wimax infiniband bond vlan adsl bridge bridge-port team team-port dcb
+                        connection 802-3-ethernet 802-1x 802-11-wireless 802-11-wireless-security ipv4 ipv6 serial ppp pppoe gsm cdma bluetooth 802-11-olpc-mesh vpn wimax infiniband bond vlan adsl bridge bridge-port team team-port dcb tun ip-tunnel macvlan vxlan
                         GENERAL IP4 DHCP4 IP6 DHCP6 VPN
                         profile active"
                    return 0
@@ -248,6 +282,7 @@ _nmcli_compl_OPTIONS()
 # expects several options with parameters. This function can parse them and remove them from the words array.
 _nmcli_compl_ARGS()
 {
+    local aliases=${@}
     local OPTIONS_ALL N_REMOVE_WORDS REMOVE_OPTIONS OPTIONS_HAS_MANDATORY i
     OPTIONS_ALL=("${OPTIONS[@]}")
     OPTIONS_UNKNOWN_OPTION=
@@ -283,10 +318,20 @@ _nmcli_compl_ARGS()
 
         N_REMOVE_WORDS=2
         REMOVE_OPTIONS=("${words[0]}")
-        case "${words[0]}" in
+
+        # change option name to alias
+        WORD0="${words[0]}"
+        for alias in "${aliases[@]}" ; do
+            if [[ "${WORD0}" == ${alias%%:*} ]]; then
+                WORD0=${alias#*:}
+                break
+            fi
+        done
+
+        case "${WORD0}" in
             level)
                 if [[ "${#words[@]}" -eq 2 ]]; then
-                    _nmcli_list "ERR WARN INFO DEBUG TRACE"
+                    _nmcli_list "OFF ERR WARN INFO DEBUG TRACE"
                    return 0
                 fi
                 ;;
@@ -367,7 +412,7 @@ _nmcli_compl_ARGS()
                         # user friendly. Only complete them, if the current word already starts with an "8".
                         _nmcli_list "802-3-ethernet 802-11-wireless 802-11-olpc-mesh"
                     else
-                        _nmcli_list "ethernet wifi wimax gsm cdma infiniband bluetooth vpn olpc-mesh vlan bond bond-slave bridge bridge-slave team team-slave pppoe adsl"
+                        _nmcli_list "ethernet wifi wimax gsm cdma infiniband bluetooth vpn olpc-mesh vlan bond bridge team pppoe adsl tun ip-tunnel macvlan vxlan"
                     fi
                     return 0
                 fi
@@ -428,6 +473,15 @@ _nmcli_compl_ARGS()
                         "wifi")
                             _nmcli_list "infrastructure ap adhoc"
                             ;;
+                        "tun")
+                            _nmcli_list "tun tap"
+                            ;;
+                        "ip-tunnel")
+                            _nmcli_list "ipip gre sit isatap vti ip6ip6 ipip6 ip6gre vti6"
+                            ;;
+                        "macvlan")
+                            _nmcli_list "vepa bridge private passthru source"
+                            ;;
                         "bond"| \
                         *)
                         _nmcli_list "balance-rr active-backup balance-xor broadcast 802.3ad balance-tlb balance-alb"
@@ -447,6 +501,12 @@ _nmcli_compl_ARGS()
                     return 0
                 fi
                 ;;
+            slave-type)
+                if [[ "${#words[@]}" -eq 2 ]]; then
+                    _nmcli_list "bond team bridge"
+                    return 0
+                fi
+                ;;
             lacp-rate)
                 if [[ "${#words[@]}" -eq 2 ]]; then
                     _nmcli_list "slow fast"
@@ -465,12 +525,17 @@ _nmcli_compl_ARGS()
                     return 0
                 fi
                 ;;
+            managed| \
             autoconnect| \
             stp| \
             hairpin| \
             save| \
             hidden| \
-            private)
+            private| \
+            pi| \
+            vnet-hdr| \
+            multi-queue|\
+            tap)
                 if [[ "${#words[@]}" -eq 2 ]]; then
                     _nmcli_list "yes no"
                     return 0
@@ -518,7 +583,8 @@ _nmcli_compl_ARGS()
             username| \
             service| \
             password| \
-            passwd-file)
+            passwd-file| \
+            file)
                 if [[ "${#words[@]}" -eq 2 ]]; then
                     return 0
                 fi
@@ -548,6 +614,12 @@ _nmcli_compl_ARGS()
                     return 0
                 fi
                 ;;
+            band)
+                if [[ "${#words[@]}" -eq 2 ]]; then
+                    _nmcli_list "a bg"
+                    return 0
+                fi
+                ;;
             *)
                 return 1
                 ;;
@@ -581,6 +653,7 @@ _nmcli_compl_ARGS()
 
 # some commands expect a connection as parameter. This connection can either be given
 # as id|uuid|path|apath. Parse that connection parameter.
+# Actually, it can also ask for a device name, like `nmcli device set [ifname] <ifname>`
 _nmcli_compl_ARGS_CONNECTION()
 {
     if ! _nmcli_array_has_value OPTIONS "${words[0]}"; then
@@ -683,6 +756,25 @@ _nmcli_compl_COMMAND_nl() {
     _nmcli_list_nl "$(printf "%s%s\n%s" "" "$V" "$a")"
 }
 
+_nmcli_compl_PROPERTIES()
+{
+    while [[ "${#words[@]}" -gt 0 ]]; do
+        if [[ ${#words[@]} -le 1 ]]; then
+            local PREFIX=""
+
+            if [[ "${words[0]:0:1}" == [+-] ]]; then
+                PREFIX="${words[0]:0:1}"
+            fi
+            _nmcli_list_nl "$(echo -e 'print\nquit\nyes' |nmcli c edit "$@" 2>/dev/null |awk -F: '/\..*:/ {print "'$PREFIX'"$1}')"
+            return 0
+        elif [[ ${#words[@]} -le 2 ]]; then
+            return 0
+        fi
+        _nmcli_array_delete_at words 0 1
+    done
+    _nmcli_list_nl "$(echo -e 'print\nquit\nyes' |nmcli c edit "$@" 2>/dev/null |awk -F: '/\..*:/ {print $1}')"
+}
+
 _nmcli()
 {
     local cur prev words cword i
@@ -707,12 +799,12 @@ _nmcli()
         cur=''
     fi
 
-    local OPTIONS_UNKNOWN_OPTION OPTIONS_TYPE OPTIONS_TYPED OPTIONS OPTIONS_MANDATORY COMMAND_ARGS_WAIT_OPTIONS OPTIONS_IP OPTIONS_MANDATORY OPTIONS_NEXT_GROUP OPTIONS_REPEATABLE
+    local OPTIONS_UNKNOWN_OPTION OPTIONS_TYPE OPTIONS_TYPED OPTIONS OPTIONS_MANDATORY COMMAND_ARGS_WAIT_OPTIONS OPTIONS_IP OPTIONS_MANDATORY OPTIONS_NEXT_GROUP OPTIONS_SEP OPTIONS_REPEATABLE
     local COMMAND_CONNECTION_TYPE COMMAND_CONNECTION_ID OPTIONS_MANDATORY_IFNAME HELP_ONLY_AS_FIRST
     local COMMAND_CONNECTION_ACTIVE=""
 
     HELP_ONLY_AS_FIRST=
-    local LONG_OPTIONS=(terse pretty mode fields escape nocheck ask wait version help)
+    local LONG_OPTIONS=(terse pretty mode fields colors escape nocheck ask show-secrets wait version help)
     _nmcli_compl_OPTIONS
     i=$?
 
@@ -730,7 +822,7 @@ _nmcli()
             # (if the current word starts with a dash) or the OBJECT list
             # otherwise.
             if [[ "${words[0]:0:1}" != '-' ]]; then
-                OPTIONS=(help general networking radio connection device agent)
+                OPTIONS=(help general networking radio connection device agent monitor)
             elif [[ "${words[0]:1:1}" == '-' ||  "${words[0]}" == "-" ]]; then
                 OPTIONS=("${LONG_OPTIONS[@]/#/--}")
             else
@@ -791,10 +883,10 @@ _nmcli()
             ;;
         r|ra|rad|radi|radio)
             if [[ ${#words[@]} -eq 2 ]]; then
-                _nmcli_compl_COMMAND "$command" all wifi wwan wimax
+                _nmcli_compl_COMMAND "$command" all wifi wwan
             elif [[ ${#words[@]} -eq 3 ]]; then
                 case "$command" in
-                    a|al|all | w|wi|wif|wifi | ww|wwa|wwan | wim|wima|wimax)
+                    a|al|all | w|wi|wif|wifi | ww|wwa|wwan)
                         _nmcli_compl_COMMAND "${words[2]}" "on off"
                         ;;
                 esac
@@ -802,16 +894,16 @@ _nmcli()
             ;;
         c|co|con|conn|conne|connec|connect|connecti|connectio|connection)
             if [[ ${#words[@]} -eq 2 ]]; then
-                _nmcli_compl_COMMAND "$command" show up down add modify edit delete reload load
+                _nmcli_compl_COMMAND "$command" show up down add modify clone edit delete monitor reload load import export
             elif [[ ${#words[@]} -gt 2 ]]; then
                 case "$command" in
                     s|sh|sho|show)
                         if [[ ${#words[@]} -eq 3 ]]; then
-                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\napath\n%s" "$(_nmcli_con_show NAME)")" active show-secrets
+                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\napath\n%s" "$(_nmcli_con_show NAME)")" active order
                         elif [[ ${#words[@]} -gt 3 ]]; then
                             _nmcli_array_delete_at words 0 1
 
-                            LONG_OPTIONS=(help active show-secrets)
+                            LONG_OPTIONS=(help active order)
                             HELP_ONLY_AS_FIRST=1
                             _nmcli_compl_OPTIONS
                             i=$?
@@ -910,7 +1002,7 @@ _nmcli()
                         ;;
                     a|ad|add)
                         if [[ ${#words[@]} -eq 3 ]]; then
-                            _nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect
+                            _nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect master slave-type
                         elif [[ ${#words[@]} -gt 3 ]]; then
                             _nmcli_array_delete_at words 0 1
 
@@ -923,14 +1015,14 @@ _nmcli()
                                     ;;
                                 1)
                                     if [[ "$HELP_ONLY_AS_FIRST" == 1 ]]; then
-                                        _nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect
+                                        _nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect master slave-type
                                     fi
                                     return 0
                                     ;;
                             esac
 
                             OPTIONS_TYPE=
-                            OPTIONS=(type ifname con-name autoconnect save)
+                            OPTIONS=(type ifname con-name autoconnect save master slave-type)
                             OPTIONS_MANDATORY=(type ifname)
                             COMMAND_ARGS_WAIT_OPTIONS=1
                             OPTIONS_MANDATORY_IFNAME=1
@@ -951,6 +1043,7 @@ _nmcli()
                             fi
 
                             OPTIONS_IP=(ip4 ip6 gw4 gw6)
+                            OPTIONS_SEP=(--)
                             OPTIONS_MANDATORY=()
                             case "$OPTIONS_TYPE" in
                                 802-3|802-3-|802-3-e|802-3-et|802-3-eth|802-3-ethe|802-3-ether|802-3-ethern|802-3-etherne|802-3-ethernet| \
@@ -994,32 +1087,14 @@ _nmcli()
                                     OPTIONS_TYPE=bond
                                     OPTIONS_TYPED=(mode miimon downdelay updelay arp-interval arp-ip-target primary lacp-rate)
                                     ;;
-                                bond-|bond-s|bond-sl|bond-sla|bond-slav|bond-slave)
-                                    OPTIONS_TYPE=bond-slave
-                                    OPTIONS_TYPED=(master)
-                                    OPTIONS_MANDATORY=(master)
-                                    OPTIONS_IP=()
-                                    ;;
                                 team)
                                     OPTIONS_TYPE=team
                                     OPTIONS_TYPED=(config)
                                     ;;
-                                team-|team-s|team-sl|team-sla|team-slav|team-slave)
-                                    OPTIONS_TYPE=team-slave
-                                    OPTIONS_TYPED=(master config)
-                                    OPTIONS_MANDATORY=(master)
-                                    OPTIONS_IP=()
-                                    ;;
                                 bridge)
                                     OPTIONS_TYPE=bridge
                                     OPTIONS_TYPED=(stp priority forward-delay hello-time max-age ageing-time mac)
                                     ;;
-                                bridge-|bridge-s|bridge-sl|bridge-sla|bridge-slav|bridge-slave)
-                                    OPTIONS_TYPE=bridge-slave
-                                    OPTIONS_TYPED=(master priority path-cost hairpin)
-                                    OPTIONS_MANDATORY=(master)
-                                    OPTIONS_IP=()
-                                    ;;
                                 vp|vpn)
                                     OPTIONS_TYPE=vpn
                                     OPTIONS_TYPED=(vpn-type user)
@@ -1041,6 +1116,26 @@ _nmcli()
                                     OPTIONS_TYPED=(username password protocol encapsulation)
                                     OPTIONS_MANDATORY=(username protocol)
                                     ;;
+                                tu|tun)
+                                    OPTIONS_TYPE=tun
+                                    OPTIONS_TYPED=(mode owner group pi vnet-hdr multi-queue)
+                                    OPTIONS_MANDATORY=(mode)
+                                    ;;
+                                ip|ip-|ip-t|ip-tu|ip-tun|ip-tunn|ip-tunne|ip-tunnel)
+                                    OPTIONS_TYPE=ip-tunnel
+                                    OPTIONS_TYPED=(mode remote local dev)
+                                    OPTIONS_MANDATORY=(mode remote)
+                                    ;;
+                                m|ma|mac|macv|macvl|macvla|macvlan)
+                                    OPTIONS_TYPE=macvlan
+                                    OPTIONS_TYPED=(dev mode tap)
+                                    OPTIONS_MANDATORY=(dev mode)
+                                    ;;
+                                vx|vxl|vxla|vxlan)
+                                    OPTIONS_TYPE=vxlan
+                                    OPTIONS_TYPED=(id remote local dev source-port-min source-port-max destination-port)
+                                    OPTIONS_MANDATORY=(id remote)
+                                    ;;
                                 *)
                                     # for an unknown connection type, we stop completion here
                                     return 0
@@ -1052,7 +1147,7 @@ _nmcli()
                                 if [[ "${#OPTIONS_MANDATORY[@]}" -gt 0 ]]; then
                                     _nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_TYPED[@]}")"
                                 else
-                                    _nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_TYPED[@]}") $(echo "${OPTIONS_IP[@]}")"
+                                    _nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_TYPED[@]}") $(echo "${OPTIONS_IP[@]}") $(echo "${OPTIONS_SEP[@]}")"
                                 fi
                                 return 0
                             fi
@@ -1069,7 +1164,7 @@ _nmcli()
                                     if [[ "${#OPTIONS_MANDATORY[@]}" -gt 0 ]]; then
                                         _nmcli_list "$(echo "${OPTIONS[@]}")"
                                     else
-                                        _nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_IP[@]}")"
+                                        _nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_IP[@]}") $(echo "${OPTIONS_SEP[@]}")"
                                     fi
                                     return 0
                                 fi
@@ -1080,11 +1175,12 @@ _nmcli()
                                         # we have an unknown option, but still mandatory ones that must be fullfiled first.
                                         return 0
                                     fi
-                                    if ! _nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}"; then
-                                        # the unknown option is NOT an IP option.
+                                    if ! (_nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}" ||
+                                          _nmcli_array_has_value OPTIONS_SEP "${OPTIONS_UNKNOWN_OPTION:1}"); then
+                                        # the unknown option is neither an IP option nor a separator.
                                         return 0
                                     fi
-                                    # The unknown option is an IP option, which is fine... continue...
+                                    # The unknown option is an IP option or a separator, which is fine... continue...
                                 fi
 
                             fi
@@ -1101,8 +1197,9 @@ _nmcli()
                                 fi
 
                                 if [[ "$OPTIONS_UNKNOWN_OPTION" != "" ]]; then
-                                    if ! _nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}"; then
-                                        # the unknown option is NOT an IP option.
+                                    if ! (_nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}" ||
+                                          _nmcli_array_has_value OPTIONS_SEP "${OPTIONS_UNKNOWN_OPTION:1}"); then
+                                        # the unknown option is neither an IP option nor a separator.
                                         return 0
                                     fi
                                 fi
@@ -1110,8 +1207,8 @@ _nmcli()
 
 
                             # no mandatory options... do final completion including IP options
-                            OPTIONS=("${OPTIONS[@]}" "${OPTIONS_IP[@]}")
-                            OPTIONS_NEXT_GROUP=("${OPTIONS_IP[@]}")
+                            OPTIONS=("${OPTIONS[@]}" "${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
+                            OPTIONS_NEXT_GROUP=("${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
                             _nmcli_compl_ARGS && return 0
 
                             if [[ "$OPTIONS_UNKNOWN_OPTION" != "" ]]; then
@@ -1125,11 +1222,18 @@ _nmcli()
                                 return 0
                             fi
 
+
                             # process the last group of options, as the OPTIONS_TYPED are already handled...
-                            OPTIONS=("${OPTIONS_IP[@]}")
-                            OPTIONS_NEXT_GROUP=()
+                            OPTIONS=("${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
+                            OPTIONS_NEXT_GROUP=("${OPTIONS_SEP[@]}")
                             COMMAND_ARGS_WAIT_OPTIONS=0
                             _nmcli_compl_ARGS && return 0
+
+                            _nmcli_array_delete_at words 0
+                            _nmcli_compl_PROPERTIES type "$OPTIONS_TYPE"
+
+                            return 0
+
                         fi
                         ;;
                     e|ed|edi|edit)
@@ -1186,25 +1290,42 @@ _nmcli()
 
                             OPTIONS=(id uuid path)
                             _nmcli_compl_ARGS_CONNECTION && return 0
-                            while [[ "${#words[@]}" -gt 0 ]]; do
-                                if [[ ${#words[@]} -le 1 ]]; then
-                                    local PREFIX=""
 
-                                    if [[ "${words[0]:0:1}" == [+-] ]]; then
-                                        PREFIX="${words[0]:0:1}"
-                                    fi
-                                    _nmcli_list_nl "$(nmcli --fields profile connection show ${COMMAND_CONNECTION_TYPE} "$COMMAND_CONNECTION_ID" 2>/dev/null | sed -n 's/^\([^:]\+\):.*/'$PREFIX'\1/p')"
+                            _nmcli_compl_PROPERTIES ${COMMAND_CONNECTION_TYPE} "$COMMAND_CONNECTION_ID"
+
+                            return 0
+                        fi
+                        ;;
+                    c|cl|clo|clon|clone)
+                        if [[ ${#words[@]} -eq 3 ]]; then
+                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\n%s" "$(_nmcli_con_show NAME)")" temporary
+                        elif [[ ${#words[@]} -gt 3 ]]; then
+                            _nmcli_array_delete_at words 0 1
+
+                            LONG_OPTIONS=(help temporary)
+                            HELP_ONLY_AS_FIRST=1
+                            _nmcli_compl_OPTIONS
+                            case $? in
+                                0)
                                     return 0
-                                elif [[ ${#words[@]} -le 2 ]]; then
+                                    ;;
+                                1)
+                                    if [[ "$HELP_ONLY_AS_FIRST" == 1 ]]; then
+                                        _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\n%s" "$(_nmcli_con_show NAME)")" "${LONG_OPTIONS[@]}"
+                                    fi
                                     return 0
-                                fi
-                                _nmcli_array_delete_at words 0 1
-                            done
-                            _nmcli_list_nl "$(nmcli --fields profile connection show ${COMMAND_CONNECTION_TYPE} "$COMMAND_CONNECTION_ID" 2>/dev/null | sed -n 's/^\([^:]\+\):.*/\1/p')"
+                                    ;;
+                            esac
+
+                            OPTIONS=(id uuid path)
+                            _nmcli_compl_ARGS_CONNECTION && return 0
+
                             return 0
                         fi
                         ;;
-                    de|del|dele|delet|delete)
+
+                    de|del|dele|delet|delete| \
+                    m|mo|mon|moni|monit|monito|monitor)
                         if [[ ${#words[@]} -eq 3 ]]; then
                             _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\n%s" "$(_nmcli_con_show NAME)")"
                         elif [[ ${#words[@]} -gt 3 ]]; then
@@ -1238,12 +1359,67 @@ _nmcli()
                             COMPREPLY=()
                         fi
                         ;;
+                    i|im|imp|impo|impor|import)
+                        if [[ ${#words[@]} -eq 3 ]]; then
+                            _nmcli_compl_COMMAND "${words[2]}" type file --temporary
+                        elif [[ ${#words[@]} -gt 3 ]]; then
+                            _nmcli_array_delete_at words 0 1
+
+                            LONG_OPTIONS=(help temporary)
+                            HELP_ONLY_AS_FIRST=1
+                            _nmcli_compl_OPTIONS
+                            case $? in
+                                0)
+                                    return 0
+                                    ;;
+                                1)
+                                    if [[ "$HELP_ONLY_AS_FIRST" == 1 ]]; then
+                                        _nmcli_compl_COMMAND "${words[2]}" type file
+                                    fi
+                                    return 0
+                                    ;;
+                            esac
+
+                            OPTIONS=(type file)
+                            OPTIONS_MANDATORY=(type file)
+                            ALIASES=("type:vpn-type")
+                            _nmcli_compl_ARGS ${ALIASES[@]}
+                            return 0
+                        fi
+                        ;;
+                    e|ex|exp|expo|expor|export)
+                        if [[ ${#words[@]} -eq 3 ]]; then
+                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\n%s" "$(_nmcli_con_show NAME)")"
+                        elif [[ ${#words[@]} -gt 3 ]]; then
+                            _nmcli_array_delete_at words 0 1
+
+                            LONG_OPTIONS=(help)
+                            HELP_ONLY_AS_FIRST=1
+                            _nmcli_compl_OPTIONS
+                            case $? in
+                                0)
+                                    return 0
+                                    ;;
+                                1)
+                                    if [[ "$HELP_ONLY_AS_FIRST" == 1 ]]; then
+                                        _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "id\nuuid\npath\n%s" "$(_nmcli_con_show NAME)")" "${LONG_OPTIONS[@]}"
+                                    fi
+                                    return 0
+                                    ;;
+                            esac
+
+                            OPTIONS=(id uuid path)
+                            _nmcli_compl_ARGS_CONNECTION && return 0
+                            return 0
+                        fi
+                        ;;
+
                 esac
             fi
             ;;
         d|de|dev|devi|devic|device)
             if [[ ${#words[@]} -eq 2 ]]; then
-                _nmcli_compl_COMMAND "$command" status show connect disconnect delete wifi wimax
+                _nmcli_compl_COMMAND "$command" status show connect reapply disconnect delete monitor wifi set lldp
             elif [[ ${#words[@]} -gt 2 ]]; then
                 case "$command" in
                     s|st|sta|stat|statu|status)
@@ -1257,15 +1433,28 @@ _nmcli()
                             _nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
                         fi
                         ;;
+                    r|re|rea|reap|reapp|reappl|reapply| \
                     d|di|dis|disc|disco|discon|disconn|disconne|disconnec|disconnect| \
-                    de|del|dele|delet|delete)
+                    de|del|dele|delet|delete| \
+                    m|mo|mon|moni|monit|monito|monitor)
                         if [[ ${#words[@]} -ge 3 ]]; then
                             _nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
                         fi
                         ;;
+                    se|set)
+                        if [[ ${#words[@]} -eq 3 ]]; then
+                            _nmcli_compl_COMMAND_nl "${words[2]}" "$(printf "ifname\n%s" "$(_nmcli_dev_status DEVICE)")"
+                        else
+                            _nmcli_array_delete_at words 0 1
+                            OPTIONS=(ifname)
+                            _nmcli_compl_ARGS_CONNECTION && return 0
+                            OPTIONS=(autoconnect managed)
+                            _nmcli_compl_ARGS
+                        fi
+                        ;;
                     w|wi|wif|wifi)
                         if [[ ${#words[@]} -eq 3 ]]; then
-                            _nmcli_compl_COMMAND "${words[2]}" list connect rescan
+                            _nmcli_compl_COMMAND "${words[2]}" list connect hotspot rescan
                         else
                             case "${words[2]}" in
                                 l|li|lis|list)
@@ -1286,6 +1475,11 @@ _nmcli()
                                         _nmcli_compl_ARGS
                                     fi
                                     ;;
+                                h|ho|hot|hots|hotsp|hotspo|hotspot)
+                                    _nmcli_array_delete_at words 0 2
+                                    OPTIONS=(ifname con-name ssid band channel password)
+                                    _nmcli_compl_ARGS
+                                    ;;
                                 r|re|res|resc|resca|rescan)
                                     _nmcli_array_delete_at words 0 2
                                     OPTIONS_REPEATABLE=(ssid)
@@ -1295,20 +1489,19 @@ _nmcli()
                             esac
                         fi
                         ;;
-                    wim|wima|wimax)
+                    l|ll|lld|lldp)
                         if [[ ${#words[@]} -eq 3 ]]; then
                             _nmcli_compl_COMMAND "${words[2]}" list
                         else
                             case "${words[2]}" in
                                 l|li|lis|list)
                                     _nmcli_array_delete_at words 0 2
-                                    OPTIONS=(ifname nsp)
+                                    OPTIONS=(ifname)
                                     _nmcli_compl_ARGS
                                     ;;
                             esac
                         fi
                         ;;
-
                 esac
             fi
             ;;
@@ -1317,6 +1510,8 @@ _nmcli()
                 _nmcli_compl_COMMAND "$command" secret polkit all
             fi
             ;;
+        m|mo|mon|moni|monit|monito|monitor)
+            ;;
     esac
 
     return 0
diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c
index 8d9f7fef..437523da 100644
--- a/clients/cli/nmcli.c
+++ b/clients/cli/nmcli.c
@@ -16,7 +16,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 /* Generated configuration file */
@@ -33,9 +33,7 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
+#include "nm-default.h"
 #include "polkit-agent.h"
 #include "nmcli.h"
 #include "utils.h"
@@ -89,10 +87,12 @@ usage (const char *prog_name)
 	              "  -t[erse]                                   terse output\n"
 	              "  -p[retty]                                  pretty output\n"
 	              "  -m[ode] tabular|multiline                  output mode\n"
+	              "  -c[olors] auto|yes|no                      whether to use colors in output\n"
 	              "  -f[ields] <field1,field2,...>|all|common   specify fields to output\n"
 	              "  -e[scape] yes|no                           escape columns separators in values\n"
 	              "  -n[ocheck]                                 don't check nmcli and NetworkManager versions\n"
 	              "  -a[sk]                                     ask for missing parameters\n"
+	              "  -s[how-secrets]                            allow displaying passwords\n"
 	              "  -w[ait] <seconds>                          set timeout waiting for finishing operations\n"
 	              "  -v[ersion]                                 show program version\n"
 	              "  -h[elp]                                    print this help\n"
@@ -104,6 +104,7 @@ usage (const char *prog_name)
 	              "  c[onnection]    NetworkManager's connections\n"
 	              "  d[evice]        devices managed by NetworkManager\n"
 	              "  a[gent]         NetworkManager secret agent or polkit agent\n"
+	              "  m[monitor]      monitor NetworkManager changes\n"
 	              "\n"),
 	            prog_name);
 }
@@ -120,6 +121,7 @@ static const struct cmd {
 	NMCResultCode (*func) (NmCli *nmc, int argc, char **argv);
 } nmcli_cmds[] = {
 	{ "general",    do_general },
+	{ "monitor",    do_monitor },
 	{ "networking", do_networking },
 	{ "radio",      do_radio },
 	{ "connection", do_connections },
@@ -210,6 +212,24 @@ parse_command_line (NmCli *nmc, int argc, char **argv)
 				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 				return nmc->return_value;
 			}
+		} else if (matches (opt, "-colors") == 0) {
+			next_arg (&argc, &argv);
+			if (argc <= 1) {
+		 		g_string_printf (nmc->return_text, _("Error: missing argument for '%s' option."), opt);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				return nmc->return_value;
+			}
+			if (matches (argv[1], "auto") == 0)
+				nmc->use_colors = NMC_USE_COLOR_AUTO;
+			else if (matches (argv[1], "yes") == 0)
+				nmc->use_colors = NMC_USE_COLOR_YES;
+			else if (matches (argv[1], "no") == 0)
+				nmc->use_colors = NMC_USE_COLOR_NO;
+			else {
+		 		g_string_printf (nmc->return_text, _("Error: '%s' is not valid argument for '%s' option."), argv[1], opt);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				return nmc->return_value;
+			}
 		} else if (matches (opt, "-escape") == 0) {
 			next_arg (&argc, &argv);
 			if (argc <= 1) {
@@ -238,6 +258,8 @@ parse_command_line (NmCli *nmc, int argc, char **argv)
 			nmc->nocheck_ver = TRUE;
 		} else if (matches (opt, "-ask") == 0) {
 			nmc->ask = TRUE;
+		} else if (matches (opt, "-show-secrets") == 0) {
+			nmc->show_secrets = TRUE;
 		} else if (matches (opt, "-wait") == 0) {
 			unsigned long timeout;
 			next_arg (&argc, &argv);
@@ -515,7 +537,7 @@ nmc_init (NmCli *nmc)
 	nmc->pwds_hash = NULL;
 	nmc->pk_listener = NULL;
 
-	nmc->should_wait = FALSE;
+	nmc->should_wait = 0;
 	nmc->nowait_flag = TRUE;
 	nmc->print_output = NMC_PRINT_NORMAL;
 	nmc->multiline_output = FALSE;
@@ -526,6 +548,8 @@ nmc_init (NmCli *nmc)
 	memset (&nmc->print_fields, '\0', sizeof (NmcPrintFields));
 	nmc->nocheck_ver = FALSE;
 	nmc->ask = FALSE;
+	nmc->show_secrets = FALSE;
+	nmc->use_colors = NMC_USE_COLOR_AUTO;
 	nmc->in_editor = FALSE;
 	nmc->editor_status_line = FALSE;
 	nmc->editor_save_confirmation = TRUE;
@@ -587,10 +611,8 @@ main (int argc, char *argv[])
 	textdomain (GETTEXT_PACKAGE);
 #endif
 
-#if !GLIB_CHECK_VERSION (2, 35, 0)
-	g_type_init ();
-#endif
-	
+	nm_g_type_init ();
+
 	/* Save terminal settings */
 	tcgetattr (STDIN_FILENO, &termios_orig);
 
diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h
index 32e7e5dd..b26f2576 100644
--- a/clients/cli/nmcli.h
+++ b/clients/cli/nmcli.h
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 #ifndef NMC_NMCLI_H
@@ -69,6 +69,28 @@ typedef enum {
 } NMCResultCode;
 
 typedef enum {
+	NMC_TERM_COLOR_NORMAL  = 0,
+	NMC_TERM_COLOR_BLACK   = 1,
+	NMC_TERM_COLOR_RED     = 2,
+	NMC_TERM_COLOR_GREEN   = 3,
+	NMC_TERM_COLOR_YELLOW  = 4,
+	NMC_TERM_COLOR_BLUE    = 5,
+	NMC_TERM_COLOR_MAGENTA = 6,
+	NMC_TERM_COLOR_CYAN    = 7,
+	NMC_TERM_COLOR_WHITE   = 8
+} NmcTermColor;
+
+typedef enum {
+	NMC_TERM_FORMAT_NORMAL,
+	NMC_TERM_FORMAT_BOLD,
+	NMC_TERM_FORMAT_DIM,
+	NMC_TERM_FORMAT_UNDERLINE,
+	NMC_TERM_FORMAT_BLINK,
+	NMC_TERM_FORMAT_REVERSE,
+	NMC_TERM_FORMAT_HIDDEN,
+} NmcTermFormat;
+
+typedef enum {
 	NMC_PRINT_TERSE = 0,
 	NMC_PRINT_NORMAL = 1,
 	NMC_PRINT_PRETTY = 2
@@ -90,6 +112,8 @@ typedef struct _NmcOutputField {
 	gboolean value_is_array;        /* Whether value is char** instead of char* */
 	gboolean free_value;            /* Whether to free the value */
 	guint32 flags;                  /* Flags - whether and how to print values/field names/headers */
+	NmcTermColor color;             /* Use this color to print value */
+	NmcTermFormat color_fmt;        /* Use this terminal format to print value */
 } NmcOutputField;
 
 typedef struct {
@@ -99,16 +123,10 @@ typedef struct {
 } NmcPrintFields;
 
 typedef enum {
-	NMC_TERM_COLOR_NORMAL  = 0,
-	NMC_TERM_COLOR_BLACK   = 1,
-	NMC_TERM_COLOR_RED     = 2,
-	NMC_TERM_COLOR_GREEN   = 3,
-	NMC_TERM_COLOR_YELLOW  = 4,
-	NMC_TERM_COLOR_BLUE    = 5,
-	NMC_TERM_COLOR_MAGENTA = 6,
-	NMC_TERM_COLOR_CYAN    = 7,
-	NMC_TERM_COLOR_WHITE   = 8
-} NmcTermColor;
+	NMC_USE_COLOR_AUTO,
+	NMC_USE_COLOR_YES,
+	NMC_USE_COLOR_NO,
+} NmcColorOption;
 
 /* NmCli - main structure */
 typedef struct _NmCli {
@@ -126,17 +144,19 @@ typedef struct _NmCli {
 	GHashTable *pwds_hash;                            /* Hash table with passwords in passwd-file */
 	NMPolkitListener *pk_listener ;                   /* polkit agent listener */
 
-	gboolean should_wait;                             /* Indication that nmcli should not end yet */
+	int should_wait;                                  /* Semaphore indicating whether nmcli should not end or not yet */
 	gboolean nowait_flag;                             /* '--nowait' option; used for passing to callbacks */
 	NMCPrintOutput print_output;                      /* Output mode */
 	gboolean multiline_output;                        /* Multiline output instead of default tabular */
 	gboolean mode_specified;                          /* Whether tabular/multiline mode was specified via '--mode' option */
+	NmcColorOption use_colors;                        /* Whether to use colors for output: option '--color' */
 	gboolean escape_values;                           /* Whether to escape ':' and '\' in terse tabular mode */
 	char *required_fields;                            /* Required fields in output: '--fields' option */
 	GPtrArray *output_data;                           /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */
 	NmcPrintFields print_fields;                      /* Structure with field indices to print */
 	gboolean nocheck_ver;                             /* Don't check nmcli and NM versions: option '--nocheck' */
 	gboolean ask;                                     /* Ask for missing parameters: option '--ask' */
+	gboolean show_secrets;                            /* Whether to display secrets (both input and output): option '--show-secrets' */
 	gboolean in_editor;                               /* Whether running the editor - nmcli con edit' */
 	gboolean editor_status_line;                      /* Whether to display status line in connection editor */
 	gboolean editor_save_confirmation;                /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */
diff --git a/clients/cli/polkit-agent.c b/clients/cli/polkit-agent.c
index a163b824..b1fcaad8 100644
--- a/clients/cli/polkit-agent.c
+++ b/clients/cli/polkit-agent.c
@@ -25,11 +25,8 @@
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
-#include <termios.h>
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
 
+#include "nm-default.h"
 #include "polkit-agent.h"
 #include "nm-polkit-listener.h"
 #include "common.h"
@@ -44,18 +41,10 @@ polkit_request (const char *request,
 		gpointer user_data)
 {
 	char *response, *tmp, *p;
-	struct termios termios_orig, termios_new;
 
 	g_print ("%s\n", message);
 	g_print ("(action_id: %s)\n", action_id);
 
-	if (!echo_on) {
-		tcgetattr (STDIN_FILENO, &termios_orig);
-		termios_new = termios_orig;
-		termios_new.c_lflag &= ~(ECHO);
-		tcsetattr (STDIN_FILENO, TCSADRAIN, &termios_new);
-	}
-
 	/* Ask user for polkit authorization password */
 	if (user) {
 		/* chop of ": " if present */
@@ -63,16 +52,12 @@ polkit_request (const char *request,
 		p = strrchr (tmp, ':');
 		if (p && !strcmp (p, ": "))
 			*p = '\0';
-		response = nmc_readline ("%s (%s): ", tmp, user);
+		response = nmc_readline_echo (echo_on, "%s (%s): ", tmp, user);
 		g_free (tmp);
 	} else
-		response = nmc_readline ("%s", request);
+		response = nmc_readline_echo (echo_on, "%s", request);
 	g_print ("\n");
 
-	/* Restore original terminal settings */
-	if (!echo_on)
-		tcsetattr (STDIN_FILENO, TCSADRAIN, &termios_orig);
-
 	return response;
 }
 
@@ -142,7 +127,7 @@ nmc_start_polkit_agent_start_try (NmCli *nmc)
 #else
 /* polkit agent is not avalable; implement stub functions. */
 
-#include <glib.h>
+#include "nm-default.h"
 #include "nmcli.h"
 #include "polkit-agent.h"
 
diff --git a/clients/cli/settings-docs.c b/clients/cli/settings-docs.c
index eadc5076..8de1ed21 100644
--- a/clients/cli/settings-docs.c
+++ b/clients/cli/settings-docs.c
@@ -20,9 +20,11 @@ NmcPropertyDesc setting_802_11_wireless[] = {
 	{ "hidden", "If TRUE, indicates this network is a non-broadcasting network that hides its SSID.  In this case various workarounds may take place, such as probe-scanning the SSID for more reliable network discovery.  However, these workarounds expose inherent insecurities with hidden SSID networks, and thus hidden SSID networks should be used with caution." },
 	{ "mac-address", "If specified, this connection will only apply to the Wi-Fi device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing)." },
 	{ "mac-address-blacklist", "A list of permanent MAC addresses of Wi-Fi devices to which this connection should never apply.  Each MAC address should be given in the standard hex-digits-and-colons notation (eg \"00:11:22:33:44:55\")." },
+	{ "mac-address-randomization", "One of NM_SETTING_MAC_RANDOMIZATION_DEFAULT (0) (never randomize unless the user has set a global default to randomize and the supplicant supports randomization),  NM_SETTING_MAC_RANDOMIZATION_NEVER (1) (never randomize the MAC address), or NM_SETTING_MAC_RANDOMIZATION_ALWAYS (2) (always randomize the MAC address)." },
 	{ "mode", "Wi-Fi network mode; one of \"infrastructure\", \"adhoc\" or \"ap\".  If blank, infrastructure is assumed." },
 	{ "mtu", "If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple Ethernet frames." },
 	{ "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\"." },
+	{ "powersave", "If set to FALSE, Wi-Fi power saving behavior is disabled.  If set to TRUE, Wi-Fi power saving behavior is enabled.  All other values are reserved.  Note that even though only boolean values are allowed, the property type is an unsigned integer to allow for future expansion." },
 	{ "rate", "If non-zero, directs the device to only use the specified bitrate for communication with the access point.  Units are in Kb/s, ie 5500 = 5.5 Mbit/s.  This property is highly driver dependent and not all devices support setting a static bitrate." },
 	{ "seen-bssids", "A list of BSSIDs (each BSSID formatted as a MAC address like \"00:11:22:33:44:55\") that have been detected as part of the Wi-Fi network.  NetworkManager internally tracks previously seen BSSIDs. The property is only meant for reading and reflects the BSSID list of NetworkManager. The changes you make to this property will not be preserved." },
 	{ "ssid", "SSID of the Wi-Fi network. Must be specified." },
@@ -131,6 +133,7 @@ NmcPropertyDesc setting_bridge[] = {
 	{ "hello-time", "The Spanning Tree Protocol (STP) hello time, in seconds." },
 	{ "mac-address", "If specified, the MAC address of bridge. When creating a new bridge, this MAC address will be set. When matching an existing (outside NetworkManager created) bridge, this MAC address must match." },
 	{ "max-age", "The Spanning Tree Protocol (STP) maximum message age, in seconds." },
+	{ "multicast-snooping", "Controls whether IGMP snooping is enabled for this bridge. Note that if snooping was automatically disabled due to hash collisions, the system may refuse to enable the feature until the collisions are resolved." },
 	{ "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\"." },
 	{ "priority", "Sets the Spanning Tree Protocol (STP) priority for this bridge.  Lower values are \"better\"; the lowest priority bridge will be elected the root bridge." },
 	{ "stp", "Controls whether Spanning Tree Protocol (STP) is enabled for this bridge." },
@@ -158,8 +161,9 @@ NmcPropertyDesc setting_connection[] = {
 	{ "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." },
+	{ "lldp", "Whether LLDP is enabled for the connection." },
 	{ "master", "Interface name of the master device or UUID of the master connection." },
-	{ "metered", "Whether the connection is metered." },
+	{ "metered", "Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately." },
 	{ "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\"." },
 	{ "permissions", "An array of strings defining what access a given user has to this connection.  If this is NULL or empty, all users are allowed to access this connection.  Otherwise a user is allowed to access this connection if and only if they are in this list. Each entry is of the form \"[type]:[id]:[reserved]\"; for example, \"user:dcbw:blah\". At this time only the \"user\" [type] is allowed.  Any other values are ignored and reserved for future use.  [id] is the username that this permission refers to, which may not contain the \":\" character. Any [reserved] information present must be ignored and is reserved for future use.  All of [type], [id], and [reserved] must be valid UTF-8." },
 	{ "read-only", "FALSE if the connection can be modified using the provided settings service's D-Bus interface with the right privileges, or TRUE if the connection is read-only and cannot be modified." },
@@ -168,7 +172,7 @@ NmcPropertyDesc setting_connection[] = {
 	{ "timestamp", "The time, in seconds since the Unix Epoch, that the connection was last _successfully_ fully activated. NetworkManager updates the connection timestamp periodically when the connection is active to ensure that an active connection has the latest timestamp. The property is only meant for reading (changes to this property will not be preserved)." },
 	{ "type", "Base type of the connection. For hardware-dependent connections, should contain the setting name of the hardware-type specific setting (ie, \"802-3-ethernet\" or \"802-11-wireless\" or \"bluetooth\", etc), and for non-hardware dependent connections like VPN or otherwise, should contain the setting name of that setting type (ie, \"vpn\" or \"bridge\", etc)." },
 	{ "uuid", "A universally unique identifier for the connection, for example generated with libuuid.  It should be assigned when the connection is created, and never changed as long as the connection still applies to the same network.  For example, it should not be changed when the \"id\" property or NMSettingIP4Config changes, but might need to be re-created when the Wi-Fi SSID, mobile broadband network provider, or \"type\" property changes. The UUID must be in the format \"2815492f-7e56-435e-b2e9-246bd7cdc664\" (ie, contains only hexadecimal characters and \"-\")." },
-	{ "zone", "The trust level of a the connection.  Free form case-insensitive string (for example \"Home\", \"Work\", \"Public\").  NULL or unspecified zone means the connection will be placed in the default zone as defined by the firewall." },
+	{ "zone", "The trust level of a the connection.  Free form case-insensitive string (for example \"Home\", \"Work\", \"Public\").  NULL or unspecified zone means the connection will be placed in the default zone as defined by the firewall. When updating this property on a currently activated connection, the change takes effect immediately." },
 };
   
 NmcPropertyDesc setting_dcb[] = {
@@ -196,6 +200,7 @@ NmcPropertyDesc setting_generic[] = {
   
 NmcPropertyDesc setting_gsm[] = {
 	{ "apn", "The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network.  The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9." },
+	{ "device-id", "The device unique identifier (as given by the WWAN management service) which this connection applies to.  If given, the connection will only apply to the specified device." },
 	{ "home-only", "When TRUE, only connections to the home network will be allowed. Connections to roaming networks will not be made." },
 	{ "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\"." },
 	{ "network-id", "The Network ID (GSM LAI format, ie MCC-MNC) to force specific network registration.  If the Network ID is specified, NetworkManager will attempt to force the device to register only on the specified network. This can be used to ensure that the device does not roam when direct roaming control of the device is not otherwise possible." },
@@ -204,6 +209,8 @@ NmcPropertyDesc setting_gsm[] = {
 	{ "password-flags", "Flags indicating how to handle the \"password\" property." },
 	{ "pin", "If the SIM is locked with a PIN it must be unlocked before any other operations are requested.  Specify the PIN here to allow operation of the device." },
 	{ "pin-flags", "Flags indicating how to handle the \"pin\" property." },
+	{ "sim-id", "The SIM card unique identifier (as given by the WWAN management service) which this connection applies to.  If given, the connection will apply to any device also allowed by \"device-id\" which contains a SIM card matching the given identifier." },
+	{ "sim-operator-id", "A MCC/MNC string like \"310260\" or \"21601\" identifying the specific mobile network operator which this connection applies to.  If given, the connection will apply to any device also allowed by \"device-id\" and \"sim-id\" which contains a SIM card provisioined by the given operator." },
 	{ "username", "The username used to authenticate with the network, if required.  Many providers do not require a username, or accept any username.  But if a username is required, it is specified here." },
 };
   
@@ -216,12 +223,31 @@ NmcPropertyDesc setting_infiniband[] = {
 	{ "transport-mode", "The IP-over-InfiniBand transport mode. Either \"datagram\" or \"connected\"." },
 };
   
+NmcPropertyDesc setting_ip_tunnel[] = {
+	{ "encapsulation-limit", "How many additional levels of encapsulation are permitted to be prepended to packets. This property applies only to IPv6 tunnels." },
+	{ "flow-label", "The flow label to assign to tunnel packets. This property applies only to IPv6 tunnels." },
+	{ "input-key", "The key used for tunnel input packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used." },
+	{ "local", "The local endpoint of the tunnel; the value can be empty, otherwise it must contain an IPv4 or IPv6 address." },
+	{ "mode", "The tunneling mode, for example NM_IP_TUNNEL_MODE_IPIP (1) or NM_IP_TUNNEL_MODE_GRE (2)." },
+	{ "mtu", "None" },
+	{ "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\"." },
+	{ "output-key", "The key used for tunnel output packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used." },
+	{ "parent", "If given, specifies the parent interface name or parent connection UUID the new device will be bound to so that tunneled packets will only be routed via that interface." },
+	{ "path-mtu-discovery", "Whether to enable Path MTU Discovery on this tunnel." },
+	{ "remote", "The remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 address." },
+	{ "tos", "The type of service (IPv4) or traffic class (IPv6) field to be set on tunneled packets." },
+	{ "ttl", "The TTL to assign to tunneled packets. 0 is a special value meaning that packets inherit the TTL value." },
+};
+  
 NmcPropertyDesc setting_ipv4[] = {
 	{ "addresses", "Array of IP addresses." },
 	{ "dhcp-client-id", "A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options." },
-	{ "dhcp-hostname", "If the \"dhcp-send-hostname\" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease." },
+	{ "dhcp-fqdn", "If the \"dhcp-send-hostname\" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-hostname\" are mutually exclusive and cannot be set at the same time." },
+	{ "dhcp-hostname", "If the \"dhcp-send-hostname\" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-fqdn\" are mutually exclusive and cannot be set at the same time." },
 	{ "dhcp-send-hostname", "If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the \"dhcp-hostname\" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent." },
+	{ "dhcp-timeout", "A timeout for a DHCP transaction in seconds." },
 	{ "dns", "Array of IP addresses of DNS servers." },
+	{ "dns-options", "Array of DNS options. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties." },
 	{ "dns-search", "Array of DNS search domains." },
 	{ "gateway", "The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set." },
 	{ "ignore-auto-dns", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used." },
@@ -235,15 +261,17 @@ NmcPropertyDesc setting_ipv4[] = {
 };
   
 NmcPropertyDesc setting_ipv6[] = {
+	{ "addr-gen-mode", "Configure method for creating the address for use with RFC4862 IPv6 Stateless Address Autoconfiguration. The permitted values are: \"eui64\", \"stable-privacy\" or unset. If the property is set to \"eui64\", the addresses will be generated using the interface tokens derived from  hardware address. This makes the host part of the address to stay constant, making it possible to track host's presence when it changes networks. The address changes when the interface hardware is replaced. The value of \"stable-privacy\" enables use of cryptographically secure hash of a secret host-specific key along with the connection identification and the network address as specified by RFC7217. This makes it impossible to use the address track host's presence, and makes the address stable when the network interface hardware is replaced. Leaving this unset causes a default that could be subject to change in future versions to be used. Note that this setting is distinct from the Privacy Extensions as configured by \"ip6-privacy\" property and it does not affect the temporary addresses configured with this option." },
 	{ "addresses", "Array of IP addresses." },
-	{ "dhcp-hostname", "If the \"dhcp-send-hostname\" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease." },
+	{ "dhcp-hostname", "If the \"dhcp-send-hostname\" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-fqdn\" are mutually exclusive and cannot be set at the same time." },
 	{ "dhcp-send-hostname", "If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the \"dhcp-hostname\" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent." },
 	{ "dns", "Array of IP addresses of DNS servers." },
+	{ "dns-options", "Array of DNS options. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties." },
 	{ "dns-search", "Array of DNS search domains." },
 	{ "gateway", "The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set." },
 	{ "ignore-auto-dns", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used." },
 	{ "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: -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\"." },
+	{ "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\". Note that this setting is distinct from the Stable Privacy addresses that can be enabled with the \"addr-gen-mode\" property's \"stable-privacy\" setting as another way of avoiding host tracking with IPv6 addresses." },
 	{ "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\"." },
@@ -252,6 +280,14 @@ NmcPropertyDesc setting_ipv6[] = {
 	{ "routes", "Array of IP routes." },
 };
   
+NmcPropertyDesc setting_macvlan[] = {
+	{ "mode", "The macvlan mode, which specifies the communication mechanism between multiple macvlans on the same lower device." },
+	{ "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\"." },
+	{ "parent", "If given, specifies the parent interface name or parent connection UUID from which this MAC-VLAN interface should be created.  If this property is not specified, the connection must contain an \"802-3-ethernet\" setting with a \"mac-address\" property." },
+	{ "promiscuous", "Whether the interface should be put in promiscuous mode." },
+	{ "tap", "Whether the interface should be a MACVTAP." },
+};
+  
 NmcPropertyDesc setting_ppp[] = {
 	{ "baud", "If non-zero, instruct pppd to set the serial port to the specified baudrate.  This value should normally be left as 0 to automatically choose the speed." },
 	{ "crtscts", "If TRUE, specify that pppd should set the serial port to use hardware flow control with RTS and CTS signals.  This value should normally be set to FALSE." },
@@ -301,9 +337,19 @@ NmcPropertyDesc setting_team_port[] = {
 	{ "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\"." },
 };
   
+NmcPropertyDesc setting_tun[] = {
+	{ "group", "The group ID which will own the device. If set to NULL everyone will be able to use the device." },
+	{ "mode", "The operating mode of the virtual device. Allowed values are NM_SETTING_TUN_MODE_TUN (1) to create a layer 3 device and NM_SETTING_TUN_MODE_TAP (2) to create an Ethernet-like layer 2 one." },
+	{ "multi-queue", "If the property is set to TRUE, the interface will support multiple file descriptors (queues) to parallelize packet sending or receiving. Otherwise, the interface will only support a single queue." },
+	{ "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\"." },
+	{ "owner", "The user ID which will own the device. If set to NULL everyone will be able to use the device." },
+	{ "pi", "If TRUE the interface will prepend a 4 byte header describing the physical interface to the packets." },
+	{ "vnet-hdr", "If TRUE the IFF_VNET_HDR the tunnel packets will include a virtio network header." },
+};
+  
 NmcPropertyDesc setting_vlan[] = {
 	{ "egress-priority-map", "For outgoing packets, a list of mappings from Linux SKB priorities to 802.1p priorities.  The mapping is given in the format \"from:to\" where both \"from\" and \"to\" are unsigned integers, ie \"7:3\"." },
-	{ "flags", "One or more flags which control the behavior and features of the VLAN interface.  Flags include NM_VLAN_FLAG_REORDER_HEADERS (0x1) (reordering of output packet headers), NM_VLAN_FLAG_GVRP (0x2) (use of the GVRP protocol), and NM_VLAN_FLAG_LOOSE_BINDING (0x4) (loose binding of the interface to its master device's operating state)." },
+	{ "flags", "One or more flags which control the behavior and features of the VLAN interface.  Flags include NM_VLAN_FLAG_REORDER_HEADERS (0x1) (reordering of output packet headers), NM_VLAN_FLAG_GVRP (0x2) (use of the GVRP protocol), and NM_VLAN_FLAG_LOOSE_BINDING (0x4) (loose binding of the interface to its master device's operating state). NM_VLAN_FLAG_MVRP (0x8) (use of the MVRP protocol). The default value of this property is NM_VLAN_FLAG_REORDER_HEADERS, but it used to be 0. To preserve backward compatibility, the default-value in the D-Bus API continues to be 0 and a missing property on D-Bus is still considered as 0." },
 	{ "id", "The VLAN identifier that the interface created by this connection should be assigned." },
 	{ "ingress-priority-map", "For incoming packets, a list of mappings from 802.1p priorities to Linux SKB priorities.  The mapping is given in the format \"from:to\" where both \"from\" and \"to\" are unsigned integers, ie \"7:3\"." },
 	{ "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\"." },
@@ -316,13 +362,34 @@ NmcPropertyDesc setting_vpn[] = {
 	{ "persistent", "If the VPN service supports persistence, and this property is TRUE, the VPN will attempt to stay connected across link changes and outages, until explicitly disconnected." },
 	{ "secrets", "Dictionary of key/value pairs of VPN plugin specific secrets like passwords or private keys.  Both keys and values must be strings." },
 	{ "service-type", "D-Bus service name of the VPN plugin that this setting uses to connect to its network.  i.e. org.freedesktop.NetworkManager.vpnc for the vpnc plugin." },
+	{ "timeout", "Timeout for the VPN service to establish the connection. Some services may take quite a long time to connect. Value of 0 means a default timeout, which is 60 seconds (unless overriden by vpn.timeout in configuration file). Values greater than zero mean timeout in seconds." },
 	{ "user-name", "If the VPN connection requires a user name for authentication, that name should be provided here.  If the connection is available to more than one user, and the VPN requires each user to supply a different name, then leave this property empty.  If this property is empty, NetworkManager will automatically supply the username of the user which requested the VPN connection." },
 };
   
+NmcPropertyDesc setting_vxlan[] = {
+	{ "ageing", "Specifies the lifetime in seconds of FDB entries learnt by the kernel." },
+	{ "destination-port", "Specifies the UDP destination port to communicate to the remote VXLAN tunnel endpoint." },
+	{ "id", "Specifies the VXLAN Network Identifer (or VXLAN Segment Identifier) to use." },
+	{ "l2-miss", "Specifies whether netlink LL ADDR miss notifications are generated." },
+	{ "l3-miss", "Specifies whether netlink IP ADDR miss notifications are generated." },
+	{ "learning", "Specifies whether unknown source link layer addresses and IP addresses are entered into the VXLAN device forwarding database." },
+	{ "limit", "Specifies the maximum number of FDB entries. A value of zero means that the kernel will store unlimited entries." },
+	{ "local", "If given, specifies the source IP address to use in outgoing packets." },
+	{ "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\"." },
+	{ "parent", "If given, specifies the parent interface name or parent connection UUID." },
+	{ "proxy", "Specifies whether ARP proxy is turned on." },
+	{ "remote", "Specifies the unicast destination IP address to use in outgoing packets when the destination link layer address is not known in the VXLAN device forwarding database, or the multicast IP address to join." },
+	{ "rsc", "Specifies whether route short circuit is turned on." },
+	{ "source-port-max", "Specifies the maximum UDP source port to communicate to the remote VXLAN tunnel endpoint." },
+	{ "source-port-min", "Specifies the minimum UDP source port to communicate to the remote VXLAN tunnel endpoint." },
+	{ "tos", "Specifies the TOS value to use in outgoing packets." },
+	{ "ttl", "Specifies the time-to-live value to use in outgoing packets." },
+};
+  
 NmcPropertyDesc setting_wimax[] = {
-	{ "mac-address", "If specified, this connection will only apply to the WiMAX device whose MAC address matches. This property does not change the MAC address of the device (known as MAC spoofing)." },
+	{ "mac-address", "If specified, this connection will only apply to the WiMAX device whose MAC address matches. This property does not change the MAC address of the device (known as MAC spoofing). Deprecated: 1" },
 	{ "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\"." },
-	{ "network-name", "Network Service Provider (NSP) name of the WiMAX network this connection should use." },
+	{ "network-name", "Network Service Provider (NSP) name of the WiMAX network this connection should use. Deprecated: 1" },
 };
   
 
@@ -335,30 +402,34 @@ typedef struct {
 NmcSettingDesc all_settings[] = {
 
 	{ "802-11-olpc-mesh", setting_802_11_olpc_mesh, 4 },
-	{ "802-11-wireless", setting_802_11_wireless, 14 },
+	{ "802-11-wireless", setting_802_11_wireless, 16 },
 	{ "802-11-wireless-security", setting_802_11_wireless_security, 18 },
 	{ "802-1x", setting_802_1x, 33 },
 	{ "802-3-ethernet", setting_802_3_ethernet, 14 },
 	{ "adsl", setting_adsl, 8 },
 	{ "bluetooth", setting_bluetooth, 3 },
 	{ "bond", setting_bond, 2 },
-	{ "bridge", setting_bridge, 8 },
+	{ "bridge", setting_bridge, 9 },
 	{ "bridge-port", setting_bridge_port, 4 },
 	{ "cdma", setting_cdma, 5 },
-	{ "connection", setting_connection, 17 },
+	{ "connection", setting_connection, 18 },
 	{ "dcb", setting_dcb, 16 },
 	{ "generic", setting_generic, 1 },
-	{ "gsm", setting_gsm, 10 },
+	{ "gsm", setting_gsm, 13 },
 	{ "infiniband", setting_infiniband, 6 },
-	{ "ipv4", setting_ipv4, 15 },
-	{ "ipv6", setting_ipv6, 15 },
+	{ "ip-tunnel", setting_ip_tunnel, 13 },
+	{ "ipv4", setting_ipv4, 18 },
+	{ "ipv6", setting_ipv6, 17 },
+	{ "macvlan", setting_macvlan, 5 },
 	{ "ppp", setting_ppp, 19 },
 	{ "pppoe", setting_pppoe, 5 },
 	{ "serial", setting_serial, 6 },
 	{ "team", setting_team, 2 },
 	{ "team-port", setting_team_port, 2 },
+	{ "tun", setting_tun, 7 },
 	{ "vlan", setting_vlan, 6 },
-	{ "vpn", setting_vpn, 6 },
+	{ "vpn", setting_vpn, 7 },
+	{ "vxlan", setting_vxlan, 17 },
 	{ "wimax", setting_wimax, 3 },
 };
 
diff --git a/clients/cli/settings.c b/clients/cli/settings.c
index 6a3c90c2..9f95dfe2 100644
--- a/clients/cli/settings.c
+++ b/clients/cli/settings.c
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 #include "config.h"
@@ -22,13 +22,10 @@
 #include <stdlib.h>
 #include <arpa/inet.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
+#include "nm-default.h"
 #include "utils.h"
 #include "common.h"
 #include "settings.h"
-#include "nm-glib-compat.h"
 #include "nm-macros-internal.h"
 #include "gsystem-local-alloc.h"
 
@@ -41,27 +38,28 @@ typedef enum {
 } NmcPropertyGetType;
 
 /* Helper macro to define fields */
-#define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 }
+#define SETTING_FIELD(setting) { setting, N_(setting), 0, NULL, FALSE, FALSE, 0 }
 
 /* Available fields for NM_SETTING_CONNECTION_SETTING_NAME */
 NmcOutputField nmc_fields_setting_connection[] = {
-	SETTING_FIELD ("name",  15),                                     /* 0 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_ID, 25),                    /* 1 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_UUID, 38),                  /* 2 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_INTERFACE_NAME, 20),        /* 3 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_TYPE, 17),                  /* 4 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT, 13),           /* 5 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY, 10),  /* 6 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_TIMESTAMP, 10),             /* 7 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_READ_ONLY, 10),             /* 8 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_PERMISSIONS, 30),           /* 9 */
-	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_AUTOCONNECT_SLAVES, 13),    /* 13 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES, 40),           /* 14 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, 30),  /* 15 */
-	SETTING_FIELD (NM_SETTING_CONNECTION_METERED, 10),               /* 16 */
+	SETTING_FIELD ("name"),                                      /* 0 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_ID),                    /* 1 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_UUID),                  /* 2 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_INTERFACE_NAME),        /* 3 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_TYPE),                  /* 4 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT),           /* 5 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY),  /* 6 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_TIMESTAMP),             /* 7 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_READ_ONLY),             /* 8 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_PERMISSIONS),           /* 9 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_ZONE),                  /* 10 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_MASTER),                /* 11 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_SLAVE_TYPE),            /* 12 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES),    /* 13 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES),           /* 14 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT),  /* 15 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_METERED),               /* 16 */
+	SETTING_FIELD (NM_SETTING_CONNECTION_LLDP),                  /* 17 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_CONNECTION_ALL     "name"","\
@@ -80,25 +78,26 @@ NmcOutputField nmc_fields_setting_connection[] = {
                                               NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES","\
                                               NM_SETTING_CONNECTION_SECONDARIES","\
                                               NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT","\
-                                              NM_SETTING_CONNECTION_METERED
+                                              NM_SETTING_CONNECTION_METERED","\
+                                              NM_SETTING_CONNECTION_LLDP
 #define NMC_FIELDS_SETTING_CONNECTION_COMMON  NMC_FIELDS_SETTING_CONNECTION_ALL
 
 /* Available fields for NM_SETTING_WIRED_SETTING_NAME */
 NmcOutputField nmc_fields_setting_wired[] = {
-	SETTING_FIELD ("name",  17),                                  /* 0 */
-	SETTING_FIELD (NM_SETTING_WIRED_PORT, 8),                     /* 1 */
-	SETTING_FIELD (NM_SETTING_WIRED_SPEED, 10),                   /* 2 */
-	SETTING_FIELD (NM_SETTING_WIRED_DUPLEX, 10),                  /* 3 */
-	SETTING_FIELD (NM_SETTING_WIRED_AUTO_NEGOTIATE, 15),          /* 4 */
-	SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS, 19),             /* 5 */
-	SETTING_FIELD (NM_SETTING_WIRED_CLONED_MAC_ADDRESS, 19),      /* 6 */
-	SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST, 39),   /* 7 */
-	SETTING_FIELD (NM_SETTING_WIRED_MTU, 6),                      /* 8 */
-	SETTING_FIELD (NM_SETTING_WIRED_S390_SUBCHANNELS, 20),        /* 9 */
-	SETTING_FIELD (NM_SETTING_WIRED_S390_NETTYPE, 15),            /* 10 */
-	SETTING_FIELD (NM_SETTING_WIRED_S390_OPTIONS, 20),            /* 11 */
-	SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN, 10),             /* 12 */
-	SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, 20),    /* 13 */
+	SETTING_FIELD ("name"),                                  /* 0 */
+	SETTING_FIELD (NM_SETTING_WIRED_PORT),                   /* 1 */
+	SETTING_FIELD (NM_SETTING_WIRED_SPEED),                  /* 2 */
+	SETTING_FIELD (NM_SETTING_WIRED_DUPLEX),                 /* 3 */
+	SETTING_FIELD (NM_SETTING_WIRED_AUTO_NEGOTIATE),         /* 4 */
+	SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS),            /* 5 */
+	SETTING_FIELD (NM_SETTING_WIRED_CLONED_MAC_ADDRESS),     /* 6 */
+	SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST),  /* 7 */
+	SETTING_FIELD (NM_SETTING_WIRED_MTU),                    /* 8 */
+	SETTING_FIELD (NM_SETTING_WIRED_S390_SUBCHANNELS),       /* 9 */
+	SETTING_FIELD (NM_SETTING_WIRED_S390_NETTYPE),           /* 10 */
+	SETTING_FIELD (NM_SETTING_WIRED_S390_OPTIONS),           /* 11 */
+	SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN),            /* 12 */
+	SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD),   /* 13 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_WIRED_ALL     "name"","\
@@ -119,39 +118,39 @@ NmcOutputField nmc_fields_setting_wired[] = {
 
 /* Available fields for NM_SETTING_802_1X_SETTING_NAME */
 NmcOutputField nmc_fields_setting_8021X[] = {
-	SETTING_FIELD ("name", 10),                                              /* 0 */
-	SETTING_FIELD (NM_SETTING_802_1X_EAP, 10),                               /* 1 */
-	SETTING_FIELD (NM_SETTING_802_1X_IDENTITY, 15),                          /* 2 */
-	SETTING_FIELD (NM_SETTING_802_1X_ANONYMOUS_IDENTITY, 15),                /* 3 */
-	SETTING_FIELD (NM_SETTING_802_1X_PAC_FILE, 15),                          /* 4 */
-	SETTING_FIELD (NM_SETTING_802_1X_CA_CERT, 10),                           /* 5 */
-	SETTING_FIELD (NM_SETTING_802_1X_CA_PATH, 10),                           /* 6 */
-	SETTING_FIELD (NM_SETTING_802_1X_SUBJECT_MATCH, 10),                     /* 7 */
-	SETTING_FIELD (NM_SETTING_802_1X_ALTSUBJECT_MATCHES, 10),                /* 8 */
-	SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT, 10),                       /* 9 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPVER, 10),                    /* 10 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPLABEL, 10),                  /* 11 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, 10),          /* 12 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTH, 10),                       /* 13 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTHEAP, 10),                    /* 14 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT, 20),                    /* 15 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_PATH, 20),                    /* 16 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH, 10),              /* 17 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES, 10),         /* 18 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT, 20),                /* 19 */
-	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD, 10),                          /* 20 */
-	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_FLAGS, 20),                    /* 21 */
-	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW, 20),                      /* 22 */
-	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW_FLAGS, 20),                /* 23 */
-	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY, 15),                       /* 24 */
-	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, 20),              /* 25 */
-	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS, 20),        /* 26 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, 20),                /* 27 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, 20),       /* 28 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS, 20), /* 29 */
-	SETTING_FIELD (NM_SETTING_802_1X_PIN, 8),                                /* 30 */
-	SETTING_FIELD (NM_SETTING_802_1X_PIN_FLAGS, 20),                         /* 31 */
-	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS, 17),                   /* 32 */
+	SETTING_FIELD ("name"),                                               /* 0 */
+	SETTING_FIELD (NM_SETTING_802_1X_EAP),                                /* 1 */
+	SETTING_FIELD (NM_SETTING_802_1X_IDENTITY),                           /* 2 */
+	SETTING_FIELD (NM_SETTING_802_1X_ANONYMOUS_IDENTITY),                 /* 3 */
+	SETTING_FIELD (NM_SETTING_802_1X_PAC_FILE),                           /* 4 */
+	SETTING_FIELD (NM_SETTING_802_1X_CA_CERT),                            /* 5 */
+	SETTING_FIELD (NM_SETTING_802_1X_CA_PATH),                            /* 6 */
+	SETTING_FIELD (NM_SETTING_802_1X_SUBJECT_MATCH),                      /* 7 */
+	SETTING_FIELD (NM_SETTING_802_1X_ALTSUBJECT_MATCHES),                 /* 8 */
+	SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT),                        /* 9 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPVER),                     /* 10 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPLABEL),                   /* 11 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING),           /* 12 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTH),                        /* 13 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTHEAP),                     /* 14 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT),                     /* 15 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_PATH),                     /* 16 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH),               /* 17 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES),          /* 18 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT),                 /* 19 */
+	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD),                           /* 20 */
+	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_FLAGS),                     /* 21 */
+	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW),                       /* 22 */
+	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW_FLAGS),                 /* 23 */
+	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY),                        /* 24 */
+	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD),               /* 25 */
+	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS),         /* 26 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY),                 /* 27 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD),        /* 28 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS),  /* 29 */
+	SETTING_FIELD (NM_SETTING_802_1X_PIN),                                /* 30 */
+	SETTING_FIELD (NM_SETTING_802_1X_PIN_FLAGS),                          /* 31 */
+	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS),                    /* 32 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_802_1X_ALL     "name"","\
@@ -191,20 +190,22 @@ NmcOutputField nmc_fields_setting_8021X[] = {
 
 /* Available fields for NM_SETTING_WIRELESS_SETTING_NAME */
 NmcOutputField nmc_fields_setting_wireless[] = {
-	SETTING_FIELD ("name", 17),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SSID, 34),                      /* 1 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_MODE, 15),                      /* 2 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_BAND, 10),                      /* 3 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_CHANNEL, 10),                   /* 4 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_BSSID, 19),                     /* 5 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_RATE, 10),                      /* 6 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_TX_POWER, 10),                  /* 7 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS, 19),               /* 8 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS, 19),        /* 9 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST, 39),     /* 10 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_MTU, 6),                        /* 11 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SEEN_BSSIDS, 35),               /* 12 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_HIDDEN, 10),                    /* 13 */
+	SETTING_FIELD ("name"),                                        /* 0 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SSID),                      /* 1 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_MODE),                      /* 2 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_BAND),                      /* 3 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_CHANNEL),                   /* 4 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_BSSID),                     /* 5 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_RATE),                      /* 6 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_TX_POWER),                  /* 7 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS),               /* 8 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS),        /* 9 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST),     /* 10 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION), /* 11 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_MTU),                       /* 12 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SEEN_BSSIDS),               /* 13 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_HIDDEN),                    /* 14 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_POWERSAVE),                 /* 15 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_WIRELESS_ALL     "name"","\
@@ -218,31 +219,33 @@ NmcOutputField nmc_fields_setting_wireless[] = {
                                             NM_SETTING_WIRELESS_MAC_ADDRESS","\
                                             NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS","\
                                             NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST","\
+                                            NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION","\
                                             NM_SETTING_WIRELESS_MTU","\
                                             NM_SETTING_WIRELESS_SEEN_BSSIDS","\
-                                            NM_SETTING_WIRELESS_HIDDEN
+                                            NM_SETTING_WIRELESS_HIDDEN"," \
+                                            NM_SETTING_WIRELESS_POWERSAVE
 #define NMC_FIELDS_SETTING_WIRELESS_COMMON  NMC_FIELDS_SETTING_WIRELESS_ALL
 
 /* Available fields for NM_SETTING_WIRELESS_SECURITY_SETTING_NAME */
 NmcOutputField nmc_fields_setting_wireless_security[] = {
-	SETTING_FIELD ("name", 25),                                           /* 0 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, 10),            /* 1 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, 15),       /* 2 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_AUTH_ALG, 10),            /* 3 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PROTO, 10),               /* 4 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PAIRWISE, 10),            /* 5 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_GROUP, 10),               /* 6 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME, 15),       /* 7 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, 10),            /* 8 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY1, 10),            /* 9 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY2, 10),            /* 10 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY3, 10),            /* 11 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS, 20),       /* 12 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, 15),        /* 13 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK, 6),                  /* 14 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS, 20),           /* 15 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD, 15),       /* 16 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS, 20), /* 17 */
+	SETTING_FIELD ("name"),                                            /* 0 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_KEY_MGMT),             /* 1 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX),        /* 2 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_AUTH_ALG),             /* 3 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PROTO),                /* 4 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PAIRWISE),             /* 5 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_GROUP),                /* 6 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME),        /* 7 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0),             /* 8 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY1),             /* 9 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY2),             /* 10 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY3),             /* 11 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS),        /* 12 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE),         /* 13 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK),                  /* 14 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS),            /* 15 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD),        /* 16 */
+	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS),  /* 17 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL     "name"","\
@@ -267,27 +270,31 @@ NmcOutputField nmc_fields_setting_wireless_security[] = {
 
 /* Available fields for NM_SETTING_IP4_CONFIG_SETTING_NAME */
 NmcOutputField nmc_fields_setting_ip4_config[] = {
-	SETTING_FIELD ("name", 8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD, 10),                  /* 1 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS, 20),                     /* 2 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH, 15),              /* 3 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES, 20),               /* 4 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY, 20),                 /* 5 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES, 20),                  /* 6 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC, 15),            /* 7 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, 19),      /* 8 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, 16),         /* 9 */
-	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, 15),         /* 10 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, 19),      /* 11 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, 14),           /* 12 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT, 15),           /* 13 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL, 12),                /* 14 */
+	SETTING_FIELD ("name"),                                   /* 0 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD),              /* 1 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS),                 /* 2 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH),          /* 3 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS),         /* 4 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 5 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 6 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 7 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 8 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 9 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 10 */
+	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID),     /* 11 */
+	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT),       /* 12 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 13 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 14 */
+	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_FQDN),          /* 15 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 16 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 17 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_IP4_CONFIG_ALL     "name"","\
                                               NM_SETTING_IP_CONFIG_METHOD","\
                                               NM_SETTING_IP_CONFIG_DNS","\
                                               NM_SETTING_IP_CONFIG_DNS_SEARCH","\
+                                              NM_SETTING_IP_CONFIG_DNS_OPTIONS","\
                                               NM_SETTING_IP_CONFIG_ADDRESSES","\
                                               NM_SETTING_IP_CONFIG_GATEWAY","\
                                               NM_SETTING_IP_CONFIG_ROUTES","\
@@ -295,35 +302,40 @@ NmcOutputField nmc_fields_setting_ip4_config[] = {
                                               NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES","\
                                               NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS","\
                                               NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID","\
+                                              NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT","\
                                               NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME","\
                                               NM_SETTING_IP_CONFIG_DHCP_HOSTNAME","\
+                                              NM_SETTING_IP4_CONFIG_DHCP_FQDN","\
                                               NM_SETTING_IP_CONFIG_NEVER_DEFAULT","\
                                               NM_SETTING_IP_CONFIG_MAY_FAIL
 #define NMC_FIELDS_SETTING_IP4_CONFIG_COMMON  NMC_FIELDS_SETTING_IP4_CONFIG_ALL
 
 /* Available fields for NM_SETTING_IP6_CONFIG_SETTING_NAME */
 NmcOutputField nmc_fields_setting_ip6_config[] = {
-	SETTING_FIELD ("name", 8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD, 10),                  /* 1 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS, 20),                     /* 2 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH, 15),              /* 3 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES, 20),               /* 4 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY, 20),                 /* 5 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES, 20),                  /* 6 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC, 15),            /* 7 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, 19),      /* 8 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, 16),         /* 9 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT, 15),           /* 10 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL, 12),                /* 11 */
-	SETTING_FIELD (NM_SETTING_IP6_CONFIG_IP6_PRIVACY, 15),            /* 12 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, 19),      /* 13 */
-	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, 14),           /* 14 */
+	SETTING_FIELD ("name"),                                   /* 0 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD),              /* 1 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS),                 /* 2 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH),          /* 3 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS),         /* 4 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES),           /* 5 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY),             /* 6 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES),              /* 7 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC),        /* 8 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES),  /* 9 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS),     /* 10 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT),       /* 11 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL),            /* 12 */
+	SETTING_FIELD (NM_SETTING_IP6_CONFIG_IP6_PRIVACY),        /* 13 */
+	SETTING_FIELD (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE),      /* 14 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME),  /* 15 */
+	SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME),       /* 16 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_IP6_CONFIG_ALL     "name"","\
                                               NM_SETTING_IP_CONFIG_METHOD","\
                                               NM_SETTING_IP_CONFIG_DNS","\
                                               NM_SETTING_IP_CONFIG_DNS_SEARCH","\
+                                              NM_SETTING_IP_CONFIG_DNS_OPTIONS","\
                                               NM_SETTING_IP_CONFIG_ADDRESSES","\
                                               NM_SETTING_IP_CONFIG_GATEWAY","\
                                               NM_SETTING_IP_CONFIG_ROUTES","\
@@ -333,18 +345,19 @@ NmcOutputField nmc_fields_setting_ip6_config[] = {
                                               NM_SETTING_IP_CONFIG_NEVER_DEFAULT","\
                                               NM_SETTING_IP_CONFIG_MAY_FAIL","\
                                               NM_SETTING_IP6_CONFIG_IP6_PRIVACY","\
+                                              NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE","\
                                               NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME","\
                                               NM_SETTING_IP_CONFIG_DHCP_HOSTNAME
 #define NMC_FIELDS_SETTING_IP6_CONFIG_COMMON  NMC_FIELDS_SETTING_IP4_CONFIG_ALL
 
 /* Available fields for NM_SETTING_SERIAL_SETTING_NAME */
 NmcOutputField nmc_fields_setting_serial[] = {
-	SETTING_FIELD ("name", 10),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_SERIAL_BAUD, 10),                        /* 1 */
-	SETTING_FIELD (NM_SETTING_SERIAL_BITS, 10),                        /* 2 */
-	SETTING_FIELD (NM_SETTING_SERIAL_PARITY, 10),                      /* 3 */
-	SETTING_FIELD (NM_SETTING_SERIAL_STOPBITS, 10),                    /* 4 */
-	SETTING_FIELD (NM_SETTING_SERIAL_SEND_DELAY, 12),                  /* 5 */
+	SETTING_FIELD ("name"),                        /* 0 */
+	SETTING_FIELD (NM_SETTING_SERIAL_BAUD),        /* 1 */
+	SETTING_FIELD (NM_SETTING_SERIAL_BITS),        /* 2 */
+	SETTING_FIELD (NM_SETTING_SERIAL_PARITY),      /* 3 */
+	SETTING_FIELD (NM_SETTING_SERIAL_STOPBITS),    /* 4 */
+	SETTING_FIELD (NM_SETTING_SERIAL_SEND_DELAY),  /* 5 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_SERIAL_ALL     "name"","\
@@ -357,25 +370,25 @@ NmcOutputField nmc_fields_setting_serial[] = {
 
 /* Available fields for NM_SETTING_PPP_SETTING_NAME */
 NmcOutputField nmc_fields_setting_ppp[] = {
-	SETTING_FIELD ("name", 10),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_PPP_NOAUTH, 10),                         /* 1 */
-	SETTING_FIELD (NM_SETTING_PPP_REFUSE_EAP, 10),                     /* 2 */
-	SETTING_FIELD (NM_SETTING_PPP_REFUSE_PAP, 10),                     /* 3 */
-	SETTING_FIELD (NM_SETTING_PPP_REFUSE_CHAP, 10),                    /* 4 */
-	SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAP, 10),                  /* 5 */
-	SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAPV2, 10),                /* 6 */
-	SETTING_FIELD (NM_SETTING_PPP_NOBSDCOMP, 10),                      /* 7 */
-	SETTING_FIELD (NM_SETTING_PPP_NODEFLATE, 10),                      /* 8 */
-	SETTING_FIELD (NM_SETTING_PPP_NO_VJ_COMP, 10),                     /* 9 */
-	SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE, 10),                   /* 10 */
-	SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE_128, 10),               /* 11 */
-	SETTING_FIELD (NM_SETTING_PPP_MPPE_STATEFUL, 10),                  /* 12 */
-	SETTING_FIELD (NM_SETTING_PPP_CRTSCTS, 10),                        /* 13 */
-	SETTING_FIELD (NM_SETTING_PPP_BAUD, 10),                           /* 14 */
-	SETTING_FIELD (NM_SETTING_PPP_MRU, 10),                            /* 15 */
-	SETTING_FIELD (NM_SETTING_PPP_MTU, 10),                            /* 16 */
-	SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_FAILURE, 17),               /* 17 */
-	SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_INTERVAL, 18),              /* 18 */
+	SETTING_FIELD ("name"),                            /* 0 */
+	SETTING_FIELD (NM_SETTING_PPP_NOAUTH),             /* 1 */
+	SETTING_FIELD (NM_SETTING_PPP_REFUSE_EAP),         /* 2 */
+	SETTING_FIELD (NM_SETTING_PPP_REFUSE_PAP),         /* 3 */
+	SETTING_FIELD (NM_SETTING_PPP_REFUSE_CHAP),        /* 4 */
+	SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAP),      /* 5 */
+	SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAPV2),    /* 6 */
+	SETTING_FIELD (NM_SETTING_PPP_NOBSDCOMP),          /* 7 */
+	SETTING_FIELD (NM_SETTING_PPP_NODEFLATE),          /* 8 */
+	SETTING_FIELD (NM_SETTING_PPP_NO_VJ_COMP),         /* 9 */
+	SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE),       /* 10 */
+	SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE_128),   /* 11 */
+	SETTING_FIELD (NM_SETTING_PPP_MPPE_STATEFUL),      /* 12 */
+	SETTING_FIELD (NM_SETTING_PPP_CRTSCTS),            /* 13 */
+	SETTING_FIELD (NM_SETTING_PPP_BAUD),               /* 14 */
+	SETTING_FIELD (NM_SETTING_PPP_MRU),                /* 15 */
+	SETTING_FIELD (NM_SETTING_PPP_MTU),                /* 16 */
+	SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_FAILURE),   /* 17 */
+	SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_INTERVAL),  /* 18 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_PPP_ALL     "name"","\
@@ -401,11 +414,11 @@ NmcOutputField nmc_fields_setting_ppp[] = {
 
 /* Available fields for NM_SETTING_PPPOE_SETTING_NAME */
 NmcOutputField nmc_fields_setting_pppoe[] = {
-	SETTING_FIELD ("name", 10),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_PPPOE_SERVICE, 12),                      /* 1 */
-	SETTING_FIELD (NM_SETTING_PPPOE_USERNAME, 15),                     /* 2 */
-	SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD, 15),                     /* 3 */
-	SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD_FLAGS, 20),               /* 4 */
+	SETTING_FIELD ("name"),                           /* 0 */
+	SETTING_FIELD (NM_SETTING_PPPOE_SERVICE),         /* 1 */
+	SETTING_FIELD (NM_SETTING_PPPOE_USERNAME),        /* 2 */
+	SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD),        /* 3 */
+	SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD_FLAGS),  /* 4 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_PPPOE_ALL     "name"","\
@@ -417,14 +430,14 @@ NmcOutputField nmc_fields_setting_pppoe[] = {
 
 /* Available fields for NM_SETTING_ADSL_SETTING_NAME */
 NmcOutputField nmc_fields_setting_adsl[] = {
-	SETTING_FIELD ("name", 10),                                /* 0 */
-	SETTING_FIELD (NM_SETTING_ADSL_USERNAME, 15),              /* 1 */
-	SETTING_FIELD (NM_SETTING_ADSL_PASSWORD, 15),              /* 2 */
-	SETTING_FIELD (NM_SETTING_ADSL_PASSWORD_FLAGS, 20),        /* 3 */
-	SETTING_FIELD (NM_SETTING_ADSL_PROTOCOL, 10),              /* 4 */
-	SETTING_FIELD (NM_SETTING_ADSL_ENCAPSULATION, 10),         /* 5 */
-	SETTING_FIELD (NM_SETTING_ADSL_VPI, 10),                   /* 6 */
-	SETTING_FIELD (NM_SETTING_ADSL_VCI, 10),                   /* 7 */
+	SETTING_FIELD ("name"),                          /* 0 */
+	SETTING_FIELD (NM_SETTING_ADSL_USERNAME),        /* 1 */
+	SETTING_FIELD (NM_SETTING_ADSL_PASSWORD),        /* 2 */
+	SETTING_FIELD (NM_SETTING_ADSL_PASSWORD_FLAGS),  /* 3 */
+	SETTING_FIELD (NM_SETTING_ADSL_PROTOCOL),        /* 4 */
+	SETTING_FIELD (NM_SETTING_ADSL_ENCAPSULATION),   /* 5 */
+	SETTING_FIELD (NM_SETTING_ADSL_VPI),             /* 6 */
+	SETTING_FIELD (NM_SETTING_ADSL_VCI),             /* 7 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_ADSL_ALL     "name"","\
@@ -439,16 +452,19 @@ NmcOutputField nmc_fields_setting_adsl[] = {
 
 /* Available fields for NM_SETTING_GSM_SETTING_NAME */
 NmcOutputField nmc_fields_setting_gsm[] = {
-	SETTING_FIELD ("name", 10),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_GSM_NUMBER, 10),                         /* 1 */
-	SETTING_FIELD (NM_SETTING_GSM_USERNAME, 15),                       /* 2 */
-	SETTING_FIELD (NM_SETTING_GSM_PASSWORD, 15),                       /* 3 */
-	SETTING_FIELD (NM_SETTING_GSM_PASSWORD_FLAGS, 20),                 /* 4 */
-	SETTING_FIELD (NM_SETTING_GSM_APN, 25),                            /* 5 */
-	SETTING_FIELD (NM_SETTING_GSM_NETWORK_ID, 12),                     /* 6 */
-	SETTING_FIELD (NM_SETTING_GSM_PIN, 10),                            /* 7 */
-	SETTING_FIELD (NM_SETTING_GSM_PIN_FLAGS, 20),                      /* 8 */
-	SETTING_FIELD (NM_SETTING_GSM_HOME_ONLY, 10),                      /* 9 */
+	SETTING_FIELD ("name"),                         /* 0 */
+	SETTING_FIELD (NM_SETTING_GSM_NUMBER),          /* 1 */
+	SETTING_FIELD (NM_SETTING_GSM_USERNAME),        /* 2 */
+	SETTING_FIELD (NM_SETTING_GSM_PASSWORD),        /* 3 */
+	SETTING_FIELD (NM_SETTING_GSM_PASSWORD_FLAGS),  /* 4 */
+	SETTING_FIELD (NM_SETTING_GSM_APN),             /* 5 */
+	SETTING_FIELD (NM_SETTING_GSM_NETWORK_ID),      /* 6 */
+	SETTING_FIELD (NM_SETTING_GSM_PIN),             /* 7 */
+	SETTING_FIELD (NM_SETTING_GSM_PIN_FLAGS),       /* 8 */
+	SETTING_FIELD (NM_SETTING_GSM_HOME_ONLY),       /* 9 */
+	SETTING_FIELD (NM_SETTING_GSM_DEVICE_ID),       /* 10 */
+	SETTING_FIELD (NM_SETTING_GSM_SIM_ID),          /* 11 */
+	SETTING_FIELD (NM_SETTING_GSM_SIM_OPERATOR_ID), /* 12 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_GSM_ALL     "name"","\
@@ -460,16 +476,19 @@ NmcOutputField nmc_fields_setting_gsm[] = {
                                        NM_SETTING_GSM_NETWORK_ID","\
                                        NM_SETTING_GSM_PIN","\
                                        NM_SETTING_GSM_PIN_FLAGS","\
-                                       NM_SETTING_GSM_HOME_ONLY
+                                       NM_SETTING_GSM_HOME_ONLY","\
+                                       NM_SETTING_GSM_DEVICE_ID","\
+                                       NM_SETTING_GSM_SIM_ID","\
+                                       NM_SETTING_GSM_SIM_OPERATOR_ID
 #define NMC_FIELDS_SETTING_GSM_COMMON  NMC_FIELDS_SETTING_GSM_ALL
 
 /* Available fields for NM_SETTING_CDMA_SETTING_NAME */
 NmcOutputField nmc_fields_setting_cdma[] = {
-	SETTING_FIELD ("name", 10),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_CDMA_NUMBER, 15),                        /* 1 */
-	SETTING_FIELD (NM_SETTING_CDMA_USERNAME, 15),                      /* 2 */
-	SETTING_FIELD (NM_SETTING_CDMA_PASSWORD, 15),                      /* 3 */
-	SETTING_FIELD (NM_SETTING_CDMA_PASSWORD_FLAGS, 20),                /* 4 */
+	SETTING_FIELD ("name"),                          /* 0 */
+	SETTING_FIELD (NM_SETTING_CDMA_NUMBER),          /* 1 */
+	SETTING_FIELD (NM_SETTING_CDMA_USERNAME),        /* 2 */
+	SETTING_FIELD (NM_SETTING_CDMA_PASSWORD),        /* 3 */
+	SETTING_FIELD (NM_SETTING_CDMA_PASSWORD_FLAGS),  /* 4 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_CDMA_ALL     "name"","\
@@ -481,9 +500,9 @@ NmcOutputField nmc_fields_setting_cdma[] = {
 
 /* Available fields for NM_SETTING_BLUETOOTH_SETTING_NAME */
 NmcOutputField nmc_fields_setting_bluetooth[] = {
-	SETTING_FIELD ("name", 11),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_BLUETOOTH_BDADDR, 19),                   /* 1 */
-	SETTING_FIELD (NM_SETTING_BLUETOOTH_TYPE, 10),                     /* 2 */
+	SETTING_FIELD ("name"),                       /* 0 */
+	SETTING_FIELD (NM_SETTING_BLUETOOTH_BDADDR),  /* 1 */
+	SETTING_FIELD (NM_SETTING_BLUETOOTH_TYPE),    /* 2 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_BLUETOOTH_ALL     "name"","\
@@ -493,10 +512,10 @@ NmcOutputField nmc_fields_setting_bluetooth[] = {
 
 /* Available fields for NM_SETTING_OLPC_MESH_SETTING_NAME */
 NmcOutputField nmc_fields_setting_olpc_mesh[] = {
-	SETTING_FIELD ("name", 18),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_OLPC_MESH_SSID, 34),                     /* 1 */
-	SETTING_FIELD (NM_SETTING_OLPC_MESH_CHANNEL, 12),                  /* 2 */
-	SETTING_FIELD (NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS, 17),     /* 3 */
+	SETTING_FIELD ("name"),                                     /* 0 */
+	SETTING_FIELD (NM_SETTING_OLPC_MESH_SSID),                  /* 1 */
+	SETTING_FIELD (NM_SETTING_OLPC_MESH_CHANNEL),               /* 2 */
+	SETTING_FIELD (NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS),  /* 3 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_OLPC_MESH_ALL     "name"","\
@@ -507,12 +526,13 @@ NmcOutputField nmc_fields_setting_olpc_mesh[] = {
 
 /* Available fields for NM_SETTING_VPN_SETTING_NAME */
 NmcOutputField nmc_fields_setting_vpn[] = {
-	SETTING_FIELD ("name", 6),                                         /* 0 */
-	SETTING_FIELD (NM_SETTING_VPN_SERVICE_TYPE, 40),                   /* 1 */
-	SETTING_FIELD (NM_SETTING_VPN_USER_NAME, 12),                      /* 2 */
-	SETTING_FIELD (NM_SETTING_VPN_DATA, 30),                           /* 3 */
-	SETTING_FIELD (NM_SETTING_VPN_SECRETS, 15),                        /* 4 */
-	SETTING_FIELD (NM_SETTING_VPN_PERSISTENT, 15),                     /* 5 */
+	SETTING_FIELD ("name"),                       /* 0 */
+	SETTING_FIELD (NM_SETTING_VPN_SERVICE_TYPE),  /* 1 */
+	SETTING_FIELD (NM_SETTING_VPN_USER_NAME),     /* 2 */
+	SETTING_FIELD (NM_SETTING_VPN_DATA),          /* 3 */
+	SETTING_FIELD (NM_SETTING_VPN_SECRETS),       /* 4 */
+	SETTING_FIELD (NM_SETTING_VPN_PERSISTENT),    /* 5 */
+	SETTING_FIELD (NM_SETTING_VPN_TIMEOUT),       /* 6 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_VPN_ALL     "name"","\
@@ -520,14 +540,15 @@ NmcOutputField nmc_fields_setting_vpn[] = {
                                        NM_SETTING_VPN_USER_NAME","\
                                        NM_SETTING_VPN_DATA","\
                                        NM_SETTING_VPN_SECRETS","\
-                                       NM_SETTING_VPN_PERSISTENT
+                                       NM_SETTING_VPN_PERSISTENT","\
+                                       NM_SETTING_VPN_TIMEOUT
 #define NMC_FIELDS_SETTING_VPN_COMMON  NMC_FIELDS_SETTING_VPN_ALL
 
 /* Available fields for NM_SETTING_WIMAX_SETTING_NAME */
 NmcOutputField nmc_fields_setting_wimax[] = {
-	SETTING_FIELD ("name", 6),                                         /* 0 */
-	SETTING_FIELD (NM_SETTING_WIMAX_MAC_ADDRESS, 19),                  /* 1 */
-	SETTING_FIELD (NM_SETTING_WIMAX_NETWORK_NAME, 40),                 /* 2 */
+	SETTING_FIELD ("name"),                         /* 0 */
+	SETTING_FIELD (NM_SETTING_WIMAX_MAC_ADDRESS),   /* 1 */
+	SETTING_FIELD (NM_SETTING_WIMAX_NETWORK_NAME),  /* 2 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_WIMAX_ALL     "name"","\
@@ -537,12 +558,12 @@ NmcOutputField nmc_fields_setting_wimax[] = {
 
 /* Available fields for NM_SETTING_INFINIBAND_SETTING_NAME */
 NmcOutputField nmc_fields_setting_infiniband[] = {
-	SETTING_FIELD ("name",  12),                                       /* 0 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_MAC_ADDRESS, 61),             /* 1 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_MTU, 6),                      /* 2 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_TRANSPORT_MODE, 12),          /* 3 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_P_KEY, 6),                    /* 4 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_PARENT, 16),                  /* 5 */
+	SETTING_FIELD ("name"),                                /* 0 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_MAC_ADDRESS),     /* 1 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_MTU),             /* 2 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_TRANSPORT_MODE),  /* 3 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_P_KEY),           /* 4 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_PARENT),          /* 5 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_INFINIBAND_ALL     "name"","\
@@ -555,8 +576,8 @@ NmcOutputField nmc_fields_setting_infiniband[] = {
 
 /* Available fields for NM_SETTING_BOND_SETTING_NAME */
 NmcOutputField nmc_fields_setting_bond[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_BOND_OPTIONS, 30),                       /* 1 */
+	SETTING_FIELD ("name"),                   /* 0 */
+	SETTING_FIELD (NM_SETTING_BOND_OPTIONS),  /* 1 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_BOND_ALL     "name"","\
@@ -565,12 +586,12 @@ NmcOutputField nmc_fields_setting_bond[] = {
 
 /* Available fields for NM_SETTING_VLAN_SETTING_NAME */
 NmcOutputField nmc_fields_setting_vlan[] = {
-	SETTING_FIELD ("name",  6),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_VLAN_PARENT, 8),                         /* 1 */
-	SETTING_FIELD (NM_SETTING_VLAN_ID, 6),                             /* 2 */
-	SETTING_FIELD (NM_SETTING_VLAN_FLAGS, 45),                         /* 3 */
-	SETTING_FIELD (NM_SETTING_VLAN_INGRESS_PRIORITY_MAP, 22),          /* 4 */
-	SETTING_FIELD (NM_SETTING_VLAN_EGRESS_PRIORITY_MAP, 22),           /* 5 */
+	SETTING_FIELD ("name"),                                /* 0 */
+	SETTING_FIELD (NM_SETTING_VLAN_PARENT),                /* 1 */
+	SETTING_FIELD (NM_SETTING_VLAN_ID),                    /* 2 */
+	SETTING_FIELD (NM_SETTING_VLAN_FLAGS),                 /* 3 */
+	SETTING_FIELD (NM_SETTING_VLAN_INGRESS_PRIORITY_MAP),  /* 4 */
+	SETTING_FIELD (NM_SETTING_VLAN_EGRESS_PRIORITY_MAP),   /* 5 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_VLAN_ALL     "name"","\
@@ -583,14 +604,15 @@ NmcOutputField nmc_fields_setting_vlan[] = {
 
 /* Available fields for NM_SETTING_BRIDGE_SETTING_NAME */
 NmcOutputField nmc_fields_setting_bridge[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_MAC_ADDRESS, 19),                 /* 1 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_STP, 5),                          /* 2 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_PRIORITY, 6),                     /* 3 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_FORWARD_DELAY, 6),                /* 4 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_HELLO_TIME, 6),                   /* 5 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_MAX_AGE, 6),                      /* 6 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_AGEING_TIME, 6),                  /* 7 */
+	SETTING_FIELD ("name"),                                /* 0 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_MAC_ADDRESS),         /* 1 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_STP),                 /* 2 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_PRIORITY),            /* 3 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_FORWARD_DELAY),       /* 4 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_HELLO_TIME),          /* 5 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_MAX_AGE),             /* 6 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_AGEING_TIME),         /* 7 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_MULTICAST_SNOOPING),  /* 8 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_BRIDGE_ALL    "name"","\
@@ -600,15 +622,16 @@ NmcOutputField nmc_fields_setting_bridge[] = {
                                          NM_SETTING_BRIDGE_FORWARD_DELAY","\
                                          NM_SETTING_BRIDGE_HELLO_TIME","\
                                          NM_SETTING_BRIDGE_MAX_AGE","\
-                                         NM_SETTING_BRIDGE_AGEING_TIME
+                                         NM_SETTING_BRIDGE_AGEING_TIME","\
+                                         NM_SETTING_BRIDGE_MULTICAST_SNOOPING
 #define NMC_FIELDS_SETTING_BRIDGE_COMMON NMC_FIELDS_SETTING_BRIDGE_ALL
 
 /* Available fields for NM_SETTING_BRIDGE_PORT_SETTING_NAME */
 NmcOutputField nmc_fields_setting_bridge_port[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PRIORITY, 10),               /* 1 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PATH_COST, 12),              /* 2 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, 15),           /* 3 */
+	SETTING_FIELD ("name"),                               /* 0 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PRIORITY),      /* 1 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PATH_COST),     /* 2 */
+	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE),  /* 3 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_BRIDGE_PORT_ALL    "name"","\
@@ -619,8 +642,8 @@ NmcOutputField nmc_fields_setting_bridge_port[] = {
 
 /* Available fields for NM_SETTING_TEAM_SETTING_NAME */
 NmcOutputField nmc_fields_setting_team[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_TEAM_CONFIG, 30),                        /* 1 */
+	SETTING_FIELD ("name"),                  /* 0 */
+	SETTING_FIELD (NM_SETTING_TEAM_CONFIG),  /* 1 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_TEAM_ALL     "name"","\
@@ -629,8 +652,8 @@ NmcOutputField nmc_fields_setting_team[] = {
 
 /* Available fields for NM_SETTING_TEAM_PORT_SETTING_NAME */
 NmcOutputField nmc_fields_setting_team_port[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_TEAM_PORT_CONFIG, 30),                   /* 1 */
+	SETTING_FIELD ("name"),                       /* 0 */
+	SETTING_FIELD (NM_SETTING_TEAM_PORT_CONFIG),  /* 1 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_TEAM_PORT_ALL     "name"","\
@@ -639,22 +662,22 @@ NmcOutputField nmc_fields_setting_team_port[] = {
 
 /* Available fields for NM_SETTING_DCB_SETTING_NAME */
 NmcOutputField nmc_fields_setting_dcb[] = {
-	SETTING_FIELD ("name",  8),                                        /* 0 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_FLAGS, 5),                  /* 1 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_PRIORITY, 5),               /* 2 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_MODE, 8),                   /* 3 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_FLAGS, 5),                 /* 4 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_PRIORITY, 5),              /* 5 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_FIP_FLAGS, 5),                   /* 6 */
-	SETTING_FIELD (NM_SETTING_DCB_APP_FIP_PRIORITY, 5),                /* 7 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, 5),     /* 8 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, 10),          /* 9 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, 5),            /* 10 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_ID, 10),              /* 11 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, 30),       /* 12 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_BANDWIDTH, 30),             /* 13 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, 10),      /* 14 */
-	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, 30),         /* 15 */
+	SETTING_FIELD ("name"),                                      /* 0 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_FLAGS),               /* 1 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_PRIORITY),            /* 2 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_MODE),                /* 3 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_FLAGS),              /* 4 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_PRIORITY),           /* 5 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_FIP_FLAGS),                /* 6 */
+	SETTING_FIELD (NM_SETTING_DCB_APP_FIP_PRIORITY),             /* 7 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS),  /* 8 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL),        /* 9 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS),         /* 10 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_ID),            /* 11 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH),     /* 12 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_BANDWIDTH),           /* 13 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH),    /* 14 */
+	SETTING_FIELD (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS),       /* 15 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTING_DCB_ALL     "name"","\
@@ -675,8 +698,115 @@ NmcOutputField nmc_fields_setting_dcb[] = {
                                        NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS
 #define NMC_FIELDS_SETTING_DCB_COMMON  NMC_FIELDS_SETTING_DCB_ALL
 
-/*----------------------------------------------------------------------------*/
+/* Available fields for NM_SETTING_TUN_SETTING_NAME */
+NmcOutputField nmc_fields_setting_tun[] = {
+	SETTING_FIELD ("name"),                                /* 0 */
+	SETTING_FIELD (NM_SETTING_TUN_MODE),                   /* 1 */
+	SETTING_FIELD (NM_SETTING_TUN_OWNER),                  /* 2 */
+	SETTING_FIELD (NM_SETTING_TUN_GROUP),                  /* 3 */
+	SETTING_FIELD (NM_SETTING_TUN_PI),                     /* 4 */
+	SETTING_FIELD (NM_SETTING_TUN_VNET_HDR),               /* 5 */
+	SETTING_FIELD (NM_SETTING_TUN_MULTI_QUEUE),            /* 6 */
+	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
+};
+#define NMC_FIELDS_SETTING_TUN_ALL     "name"","\
+                                       NM_SETTING_TUN_MODE","\
+                                       NM_SETTING_TUN_OWNER","\
+                                       NM_SETTING_TUN_GROUP","\
+                                       NM_SETTING_TUN_PI","\
+                                       NM_SETTING_TUN_VNET_HDR","\
+                                       NM_SETTING_TUN_MULTI_QUEUE
+#define NMC_FIELDS_SETTING_TUN_COMMON  NMC_FIELDS_SETTING_TUN_ALL
+
+/* Available fields for NM_SETTING_IP_TUNNEL_SETTING_NAME */
+NmcOutputField nmc_fields_setting_ip_tunnel[] = {
+	SETTING_FIELD ("name"),                                       /* 0 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_MODE),                    /* 1 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_PARENT),                  /* 2 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_LOCAL),                   /* 3 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_REMOTE),                  /* 4 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_TTL),                     /* 5 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_TOS),                     /* 6 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY),      /* 7 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_INPUT_KEY),               /* 8 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_OUTPUT_KEY),              /* 9 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT),     /* 10 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_FLOW_LABEL),              /* 11 */
+	SETTING_FIELD (NM_SETTING_IP_TUNNEL_MTU),                     /* 12 */
+	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
+};
+#define NMC_FIELDS_SETTING_IP_TUNNEL_ALL     "name"","\
+                                              NM_SETTING_IP_TUNNEL_MODE","\
+                                              NM_SETTING_IP_TUNNEL_PARENT","\
+                                              NM_SETTING_IP_TUNNEL_LOCAL","\
+                                              NM_SETTING_IP_TUNNEL_REMOTE","\
+                                              NM_SETTING_IP_TUNNEL_TTL","\
+                                              NM_SETTING_IP_TUNNEL_TOS","\
+                                              NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY","\
+                                              NM_SETTING_IP_TUNNEL_INPUT_KEY","\
+                                              NM_SETTING_IP_TUNNEL_OUTPUT_KEY","\
+                                              NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT","\
+                                              NM_SETTING_IP_TUNNEL_FLOW_LABEL","\
+                                              NM_SETTING_IP_TUNNEL_MTU
+#define NMC_FIELDS_SETTING_IP_TUNNEL_COMMON   NMC_FIELDS_SETTING_IP_TUNNEL_ALL
+
+/* Available fields for NM_SETTING_MACVLAN_SETTING_NAME */
+NmcOutputField nmc_fields_setting_macvlan[] = {
+	SETTING_FIELD ("name"),                                 /* 0 */
+	SETTING_FIELD (NM_SETTING_MACVLAN_PARENT),              /* 1 */
+	SETTING_FIELD (NM_SETTING_MACVLAN_MODE),                /* 2 */
+	SETTING_FIELD (NM_SETTING_MACVLAN_PROMISCUOUS),         /* 3 */
+	SETTING_FIELD (NM_SETTING_MACVLAN_TAP),                 /* 4 */
+	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
+};
+#define NMC_FIELDS_SETTING_MACVLAN_ALL     "name"","\
+                                           NM_SETTING_MACVLAN_PARENT","\
+                                           NM_SETTING_MACVLAN_MODE","\
+                                           NM_SETTING_MACVLAN_PROMISCUOUS","\
+                                           NM_SETTING_MACVLAN_TAP
+#define NMC_FIELDS_SETTING_MACVLAN_COMMON  NMC_FIELDS_SETTING_MACVLAN_ALL
+
+/* Available fields for NM_SETTING_VXLAN_SETTING_NAME */
+NmcOutputField nmc_fields_setting_vxlan[] = {
+	SETTING_FIELD ("name"),                            /* 0 */
+	SETTING_FIELD (NM_SETTING_VXLAN_PARENT),           /* 1 */
+	SETTING_FIELD (NM_SETTING_VXLAN_ID),               /* 2 */
+	SETTING_FIELD (NM_SETTING_VXLAN_LOCAL),            /* 3 */
+	SETTING_FIELD (NM_SETTING_VXLAN_REMOTE),           /* 4 */
+	SETTING_FIELD (NM_SETTING_VXLAN_SOURCE_PORT_MIN),  /* 5 */
+	SETTING_FIELD (NM_SETTING_VXLAN_SOURCE_PORT_MAX),  /* 6 */
+	SETTING_FIELD (NM_SETTING_VXLAN_DESTINATION_PORT), /* 7 */
+	SETTING_FIELD (NM_SETTING_VXLAN_TOS),              /* 8 */
+	SETTING_FIELD (NM_SETTING_VXLAN_TTL),              /* 9 */
+	SETTING_FIELD (NM_SETTING_VXLAN_AGEING),           /* 10 */
+	SETTING_FIELD (NM_SETTING_VXLAN_LIMIT),            /* 11 */
+	SETTING_FIELD (NM_SETTING_VXLAN_LEARNING),         /* 12 */
+	SETTING_FIELD (NM_SETTING_VXLAN_PROXY),            /* 13 */
+	SETTING_FIELD (NM_SETTING_VXLAN_RSC),              /* 14 */
+	SETTING_FIELD (NM_SETTING_VXLAN_L2_MISS),          /* 15 */
+	SETTING_FIELD (NM_SETTING_VXLAN_L3_MISS),          /* 16 */
+	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
+};
+#define NMC_FIELDS_SETTING_VXLAN_ALL         "name"","\
+                                             NM_SETTING_VXLAN_PARENT","\
+                                             NM_SETTING_VXLAN_ID","\
+                                             NM_SETTING_VXLAN_LOCAL","\
+                                             NM_SETTING_VXLAN_REMOTE","\
+                                             NM_SETTING_VXLAN_SOURCE_PORT_MIN","\
+                                             NM_SETTING_VXLAN_SOURCE_PORT_MAX","\
+                                             NM_SETTING_VXLAN_DESTINATION_PORT","\
+                                             NM_SETTING_VXLAN_TOS","\
+                                             NM_SETTING_VXLAN_TTL","\
+                                             NM_SETTING_VXLAN_AGEING","\
+                                             NM_SETTING_VXLAN_LIMIT","\
+                                             NM_SETTING_VXLAN_LEARNING","\
+                                             NM_SETTING_VXLAN_PROXY","\
+                                             NM_SETTING_VXLAN_RSC","\
+                                             NM_SETTING_VXLAN_L2_MISS","\
+                                             NM_SETTING_VXLAN_L3_MISS
+#define NMC_FIELDS_SETTING_VXLAN_COMMON      NMC_FIELDS_SETTING_VXLAN_ALL
 
+/*----------------------------------------------------------------------------*/
 static char *
 wep_key_type_to_string (NMWepKeyType type)
 {
@@ -727,6 +857,8 @@ vlan_flags_to_string (guint32 flags)
 		g_string_append (flag_str, _("GVRP, "));
 	if (flags & NM_VLAN_FLAG_LOOSE_BINDING)
 		g_string_append (flag_str, _("LOOSE_BINDING, "));
+	if (flags & NM_VLAN_FLAG_MVRP)
+		g_string_append (flag_str, _("MVRP, "));
 
 	if (flag_str->str[flag_str->len-1] == '(')
 		g_string_append (flag_str, _("unknown"));
@@ -776,10 +908,11 @@ ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy, NmcPropertyGetType
 }
 
 static char *
-autoconnect_slaves_to_string (NMSettingConnectionAutoconnectSlaves autoconnect_slaves, NmcPropertyGetType get_type)
+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);
+		return g_strdup_printf ("%d", autoconnect_slaves);
 
 	switch (autoconnect_slaves) {
 	case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO:
@@ -849,6 +982,31 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
 		return s; \
 	}
 
+#define DEFINE_GETTER_WITH_DEFAULT(func_name, property_name, check_is_default) \
+	static char * \
+	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
+	{ \
+		const char *s; \
+		char *s_full; \
+		GValue val = G_VALUE_INIT; \
+		\
+		if ((check_is_default)) { \
+			if (get_type == NMC_PROPERTY_GET_PARSABLE) \
+				return g_strdup (""); \
+			return g_strdup (_("(default)")); \
+		} \
+		\
+		g_value_init (&val, G_TYPE_STRING); \
+		g_object_get_property (G_OBJECT (setting), property_name, &val); \
+		s = g_value_get_string (&val); \
+		if (get_type == NMC_PROPERTY_GET_PARSABLE) \
+			s_full = g_strdup (s && *s ? s : " "); \
+		else \
+			s_full = s ? g_strdup_printf ("\"%s\"", s) : g_strdup (""); \
+		g_value_unset (&val); \
+		return s_full; \
+	}
+
 #define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \
 	static char * \
 	func_name (NMSetting *setting, NmcPropertyGetType get_type) \
@@ -1032,6 +1190,7 @@ DEFINE_GETTER (nmc_property_bridge_get_forward_delay, NM_SETTING_BRIDGE_FORWARD_
 DEFINE_GETTER (nmc_property_bridge_get_hello_time, NM_SETTING_BRIDGE_HELLO_TIME)
 DEFINE_GETTER (nmc_property_bridge_get_max_age, NM_SETTING_BRIDGE_MAX_AGE)
 DEFINE_GETTER (nmc_property_bridge_get_ageing_time, NM_SETTING_BRIDGE_AGEING_TIME)
+DEFINE_GETTER (nmc_property_bridge_get_multicast_snooping, NM_SETTING_BRIDGE_MULTICAST_SNOOPING)
 
 /* --- NM_SETTING_BRIDGE_PORT_SETTING_NAME property get functions --- */
 DEFINE_GETTER (nmc_property_bridge_port_get_priority, NM_SETTING_BRIDGE_PORT_PRIORITY)
@@ -1224,11 +1383,46 @@ DEFINE_GETTER (nmc_property_gsm_get_network_id, NM_SETTING_GSM_NETWORK_ID)
 DEFINE_GETTER (nmc_property_gsm_get_pin, NM_SETTING_GSM_PIN)
 DEFINE_SECRET_FLAGS_GETTER (nmc_property_gsm_get_pin_flags, NM_SETTING_GSM_PIN_FLAGS)
 DEFINE_GETTER (nmc_property_gsm_get_home_only, NM_SETTING_GSM_HOME_ONLY)
+DEFINE_GETTER (nmc_property_gsm_get_device_id, NM_SETTING_GSM_DEVICE_ID)
+DEFINE_GETTER (nmc_property_gsm_get_sim_id, NM_SETTING_GSM_SIM_ID)
+DEFINE_GETTER (nmc_property_gsm_get_sim_operator_id, NM_SETTING_GSM_SIM_OPERATOR_ID)
 
 /* --- NM_SETTING_INFINIBAND_SETTING_NAME property get functions --- */
 DEFINE_GETTER (nmc_property_ib_get_mac_address, NM_SETTING_INFINIBAND_MAC_ADDRESS)
 DEFINE_GETTER (nmc_property_ib_get_transport_mode, NM_SETTING_INFINIBAND_TRANSPORT_MODE)
 
+/* --- NM_SETTING_TUN_SETTING_NAME property get functions --- */
+DEFINE_GETTER (nmc_property_tun_get_owner, NM_SETTING_TUN_OWNER);
+DEFINE_GETTER (nmc_property_tun_get_group, NM_SETTING_TUN_GROUP);
+DEFINE_GETTER (nmc_property_tun_get_pi, NM_SETTING_TUN_PI);
+DEFINE_GETTER (nmc_property_tun_get_vnet_hdr, NM_SETTING_TUN_VNET_HDR);
+DEFINE_GETTER (nmc_property_tun_get_multi_queue, NM_SETTING_TUN_MULTI_QUEUE);
+
+/* --- NM_SETTING_IP_TUNNEL_SETTING_NAME property get functions --- */
+DEFINE_GETTER (nmc_property_ip_tunnel_get_parent, NM_SETTING_IP_TUNNEL_PARENT);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_local, NM_SETTING_IP_TUNNEL_LOCAL);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_remote, NM_SETTING_IP_TUNNEL_REMOTE);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_ttl, NM_SETTING_IP_TUNNEL_TTL);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_tos, NM_SETTING_IP_TUNNEL_TOS);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_path_mtu_discovery, NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_input_key, NM_SETTING_IP_TUNNEL_INPUT_KEY);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_output_key, NM_SETTING_IP_TUNNEL_OUTPUT_KEY);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_encapsulation_limit, NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_flow_label, NM_SETTING_IP_TUNNEL_FLOW_LABEL);
+DEFINE_GETTER (nmc_property_ip_tunnel_get_mtu, NM_SETTING_IP_TUNNEL_MTU);
+
+static const char **
+nmc_property_ip_tunnel_allowed_mode (NMSetting *setting, const char *prop)
+{
+	static const char **words = NULL;
+
+	if (!words)
+		words = nm_utils_enum_get_values (nm_ip_tunnel_mode_get_type (),
+		                                  NM_IP_TUNNEL_MODE_UKNOWN + 1,
+		                                  G_MAXINT);
+	return words;
+}
+
 static char *
 nmc_property_ib_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
 {
@@ -1261,6 +1455,7 @@ DEFINE_GETTER (nmc_property_ib_get_parent, NM_SETTING_INFINIBAND_PARENT)
 DEFINE_GETTER (nmc_property_ipv4_get_method, NM_SETTING_IP_CONFIG_METHOD)
 DEFINE_GETTER (nmc_property_ipv4_get_dns, NM_SETTING_IP_CONFIG_DNS)
 DEFINE_GETTER (nmc_property_ipv4_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
+DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv4_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting))
 
 static char *
 nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type)
@@ -1349,8 +1544,10 @@ DEFINE_GETTER (nmc_property_ipv4_get_route_metric, NM_SETTING_IP_CONFIG_ROUTE_ME
 DEFINE_GETTER (nmc_property_ipv4_get_ignore_auto_routes, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES)
 DEFINE_GETTER (nmc_property_ipv4_get_ignore_auto_dns, NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS)
 DEFINE_GETTER (nmc_property_ipv4_get_dhcp_client_id, NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID)
+DEFINE_GETTER (nmc_property_ipv4_get_dhcp_timeout, NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT)
 DEFINE_GETTER (nmc_property_ipv4_get_dhcp_send_hostname, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME)
 DEFINE_GETTER (nmc_property_ipv4_get_dhcp_hostname, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME)
+DEFINE_GETTER (nmc_property_ipv4_get_dhcp_fqdn, NM_SETTING_IP4_CONFIG_DHCP_FQDN)
 DEFINE_GETTER (nmc_property_ipv4_get_never_default, NM_SETTING_IP_CONFIG_NEVER_DEFAULT)
 DEFINE_GETTER (nmc_property_ipv4_get_may_fail, NM_SETTING_IP_CONFIG_MAY_FAIL)
 
@@ -1358,6 +1555,7 @@ DEFINE_GETTER (nmc_property_ipv4_get_may_fail, NM_SETTING_IP_CONFIG_MAY_FAIL)
 DEFINE_GETTER (nmc_property_ipv6_get_method, NM_SETTING_IP_CONFIG_METHOD)
 DEFINE_GETTER (nmc_property_ipv6_get_dns, NM_SETTING_IP_CONFIG_DNS)
 DEFINE_GETTER (nmc_property_ipv6_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
+DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv6_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting))
 
 static char *
 nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
@@ -1488,6 +1686,7 @@ nmc_property_vpn_get_secrets (NMSetting *setting, NmcPropertyGetType get_type)
 }
 
 DEFINE_GETTER (nmc_property_vpn_get_persistent, NM_SETTING_VPN_PERSISTENT)
+DEFINE_GETTER (nmc_property_vpn_get_timeout, NM_SETTING_VPN_TIMEOUT)
 
 /* --- NM_SETTING_WIMAX_SETTING_NAME property get functions --- */
 DEFINE_GETTER (nmc_property_wimax_get_network_name, NM_SETTING_WIMAX_NETWORK_NAME)
@@ -1579,6 +1778,44 @@ nmc_property_wired_set_wake_on_lan (NMSetting *setting, const char *prop,
 	return TRUE;
 }
 
+static char *
+nmc_property_ip_tunnel_get_mode (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingIPTunnel *s_ip_tunnel = NM_SETTING_IP_TUNNEL (setting);
+	NMIPTunnelMode mode;
+
+	mode = nm_setting_ip_tunnel_get_mode (s_ip_tunnel);
+	return nm_utils_enum_to_str (nm_ip_tunnel_mode_get_type (), mode);
+}
+
+static gboolean
+nmc_property_ip_tunnel_set_mode (NMSetting *setting, const char *prop,
+                                  const char *val, GError **error)
+{
+	NMIPTunnelMode mode;
+	gboolean ret;
+
+	ret = nm_utils_enum_from_str (nm_ip_tunnel_mode_get_type(), val,
+	                               (int *) &mode, NULL);
+
+	if (!ret) {
+		gs_free const char **values = NULL;
+		gs_free char *values_str = NULL;
+
+		values = nm_utils_enum_get_values (nm_ip_tunnel_mode_get_type (),
+		                                   NM_IP_TUNNEL_MODE_UKNOWN + 1,
+		                                   G_MAXINT);
+		values_str = g_strjoinv (",", (char **) values);
+		g_set_error (error, 1, 0, _("invalid mode '%s', use one of %s"),
+		             val, values_str);
+
+		return FALSE;
+	}
+
+	g_object_set (setting, prop, mode, NULL);
+	return TRUE;
+}
+
 /* --- NM_SETTING_WIRELESS_SETTING_NAME property get functions --- */
 DEFINE_GETTER (nmc_property_wireless_get_mode, NM_SETTING_WIRELESS_MODE)
 DEFINE_GETTER (nmc_property_wireless_get_band, NM_SETTING_WIRELESS_BAND)
@@ -1621,6 +1858,37 @@ nmc_property_wireless_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
 		return g_strdup_printf ("%d", mtu);
 }
 
+static char *
+nmc_property_wireless_get_powersave (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
+	guint powersave = nm_setting_wireless_get_powersave (s_wireless);
+
+	if (powersave == 0)
+		return g_strdup (_("no"));
+	else if (powersave == 1)
+		return g_strdup (_("yes"));
+	else
+		return g_strdup_printf (_("yes (%u)"), powersave);
+}
+
+static char *
+nmc_property_wireless_get_mac_address_randomization (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingWireless *s_wifi = NM_SETTING_WIRELESS (setting);
+	NMSettingMacRandomization randomization = nm_setting_wireless_get_mac_address_randomization (s_wifi);
+
+	if (randomization == NM_SETTING_MAC_RANDOMIZATION_DEFAULT)
+		return g_strdup (_("default"));
+	else if (randomization == NM_SETTING_MAC_RANDOMIZATION_NEVER)
+		return g_strdup (_("never"));
+	else if (randomization == NM_SETTING_MAC_RANDOMIZATION_ALWAYS)
+		return g_strdup_printf (_("always"));
+	else
+		return g_strdup_printf (_("unknown"));
+}
+
+
 /* --- NM_SETTING_WIRELESS_SECURITY_SETTING_NAME property get functions --- */
 DEFINE_GETTER (nmc_property_wifi_sec_get_key_mgmt, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT)
 DEFINE_GETTER (nmc_property_wifi_sec_get_wep_tx_keyidx, NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX)
@@ -1670,6 +1938,91 @@ nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting, NmcPropertyGetType g
 	return wep_key_type_to_string (nm_setting_wireless_security_get_wep_key_type (s_wireless_sec));
 }
 
+/* --- NM_SETTING_MACVLAN_SETTING_NAME property get functions --- */
+DEFINE_GETTER (nmc_property_macvlan_get_parent, NM_SETTING_MACVLAN_PARENT)
+DEFINE_GETTER (nmc_property_macvlan_get_promiscuous, NM_SETTING_MACVLAN_PROMISCUOUS)
+DEFINE_GETTER (nmc_property_macvlan_get_tap, NM_SETTING_MACVLAN_TAP)
+
+static char *
+nmc_property_macvlan_get_mode (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingMacvlan *s_macvlan = NM_SETTING_MACVLAN (setting);
+	NMSettingMacvlanMode mode;
+	char *tmp, *str;
+
+	mode = nm_setting_macvlan_get_mode (s_macvlan);
+	tmp = nm_utils_enum_to_str (nm_setting_macvlan_mode_get_type (), mode);
+
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		str = g_strdup (tmp ? tmp : "");
+	else
+		str = g_strdup_printf ("%d (%s)", mode, tmp ? tmp : "");
+	g_free (tmp);
+
+	return str;
+}
+
+static gboolean
+nmc_property_macvlan_set_mode (NMSetting *setting, const char *prop,
+                               const char *val, GError **error)
+{
+	NMSettingMacvlanMode mode;
+	gs_free const char **options = NULL;
+	gs_free char *options_str = NULL;
+	long int t;
+	gboolean ret;
+
+	if (nmc_string_to_int_base (val, 0, TRUE, 0, _NM_SETTING_MACVLAN_MODE_NUM - 1, &t))
+		mode = (NMSettingMacvlanMode) t;
+	else {
+		ret = nm_utils_enum_from_str (nm_setting_macvlan_mode_get_type (), val,
+		                              (int *) &mode, NULL);
+
+		if (!ret) {
+				options = nm_utils_enum_get_values (nm_setting_macvlan_mode_get_type(),
+				                                    NM_SETTING_MACVLAN_MODE_UNKNOWN + 1,
+				                                    G_MAXINT);
+				options_str = g_strjoinv (",", (char **) options);
+				g_set_error (error, 1, 0, _("invalid option '%s', use one of [%s]"),
+				             val, options_str);
+				return FALSE;
+			}
+		}
+
+	g_object_set (setting, prop, (guint) mode, NULL);
+	return TRUE;
+}
+
+static const char **
+nmc_property_macvlan_allowed_mode (NMSetting *setting, const char *prop)
+{
+	static const char **words = NULL;
+
+	if (!words)
+		words = nm_utils_enum_get_values (nm_setting_macvlan_mode_get_type(),
+		                                  NM_SETTING_MACVLAN_MODE_UNKNOWN + 1,
+		                                  G_MAXINT);
+	return words;
+}
+
+/* --- NM_SETTING_VXLAN_SETTING_NAME property get functions --- */
+DEFINE_GETTER (nmc_property_vxlan_get_parent, NM_SETTING_VXLAN_PARENT)
+DEFINE_GETTER (nmc_property_vxlan_get_id, NM_SETTING_VXLAN_ID)
+DEFINE_GETTER (nmc_property_vxlan_get_local, NM_SETTING_VXLAN_LOCAL)
+DEFINE_GETTER (nmc_property_vxlan_get_remote, NM_SETTING_VXLAN_REMOTE)
+DEFINE_GETTER (nmc_property_vxlan_get_source_port_min, NM_SETTING_VXLAN_SOURCE_PORT_MIN)
+DEFINE_GETTER (nmc_property_vxlan_get_source_port_max, NM_SETTING_VXLAN_SOURCE_PORT_MAX)
+DEFINE_GETTER (nmc_property_vxlan_get_destination_port, NM_SETTING_VXLAN_DESTINATION_PORT)
+DEFINE_GETTER (nmc_property_vxlan_get_tos, NM_SETTING_VXLAN_TOS)
+DEFINE_GETTER (nmc_property_vxlan_get_ttl, NM_SETTING_VXLAN_TTL)
+DEFINE_GETTER (nmc_property_vxlan_get_ageing, NM_SETTING_VXLAN_AGEING)
+DEFINE_GETTER (nmc_property_vxlan_get_limit, NM_SETTING_VXLAN_LIMIT)
+DEFINE_GETTER (nmc_property_vxlan_get_learning, NM_SETTING_VXLAN_LEARNING)
+DEFINE_GETTER (nmc_property_vxlan_get_proxy, NM_SETTING_VXLAN_PROXY)
+DEFINE_GETTER (nmc_property_vxlan_get_rsc, NM_SETTING_VXLAN_RSC)
+DEFINE_GETTER (nmc_property_vxlan_get_l2_miss, NM_SETTING_VXLAN_L2_MISS)
+DEFINE_GETTER (nmc_property_vxlan_get_l3_miss, NM_SETTING_VXLAN_L3_MISS)
+
 /*----------------------------------------------------------------------------*/
 
 static void
@@ -2878,6 +3231,56 @@ nmc_property_connection_describe_metered (NMSetting *setting, const char *prop)
 	         "'unknown' to let NetworkManager choose a value using some heuristics\n");
 }
 
+/* 'lldp' */
+static char *
+nmc_property_connection_get_lldp (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingConnection *s_conn = NM_SETTING_CONNECTION (setting);
+	NMSettingConnectionLldp lldp;
+	char *tmp, *str;
+
+	lldp = nm_setting_connection_get_lldp (s_conn);
+	tmp = nm_utils_enum_to_str (nm_setting_connection_lldp_get_type (), lldp);
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		str = g_strdup_printf ("%s", tmp && *tmp ? tmp : "default");
+	else
+		str = g_strdup_printf ("%d (%s)", lldp, tmp && *tmp ? tmp : "default");
+	g_free (tmp);
+	return str;
+}
+
+static gboolean
+nmc_property_connection_set_lldp (NMSetting *setting, const char *prop,
+                                  const char *val, GError **error)
+{
+	NMSettingConnectionLldp lldp;
+	gboolean ret;
+	long int t;
+
+	if (nmc_string_to_int_base (val, 0, TRUE,
+	                           NM_SETTING_CONNECTION_LLDP_DEFAULT,
+	                           NM_SETTING_CONNECTION_LLDP_ENABLE_RX,
+	                           &t))
+		lldp = t;
+	else {
+		ret = nm_utils_enum_from_str (nm_setting_connection_lldp_get_type (), val,
+		                              (int *) &lldp, NULL);
+
+		if (!ret) {
+			if (g_ascii_strcasecmp (val, "enable") == 0)
+				lldp = NM_SETTING_CONNECTION_LLDP_ENABLE_RX;
+			else {
+				g_set_error (error, 1, 0, _("invalid option '%s', use one of [%s]"),
+				             val, "default,disable,enable-rx,enable");
+				return FALSE;
+			}
+		}
+	}
+
+	g_object_set (setting, prop, lldp, NULL);
+	return TRUE;
+}
+
 /* --- NM_SETTING_802_1X_SETTING_NAME property setter functions --- */
 #define DEFINE_SETTER_STR_LIST(def_func, set_func) \
 	static gboolean \
@@ -3497,6 +3900,44 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_ipv4_remove_dns_search,
                                nm_setting_ip_config_remove_dns_search,
                                _validate_and_remove_ipv4_dns_search)
 
+/* 'dns-options' */
+static gboolean
+nmc_property_ipv4_set_dns_options (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+	char **strv = NULL;
+	guint i = 0;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	nm_setting_ip_config_clear_dns_options (NM_SETTING_IP_CONFIG (setting), TRUE);
+	strv = nmc_strsplit_set (val, " \t,", 0);
+	while (strv && strv[i])
+		nm_setting_ip_config_add_dns_option (NM_SETTING_IP_CONFIG (setting), strv[i++]);
+	g_strfreev (strv);
+
+	return TRUE;
+}
+
+static gboolean
+_validate_and_remove_ipv4_dns_option (NMSettingIPConfig *setting,
+                                      const char *dns_option,
+                                      GError **error)
+{
+	gboolean ret;
+
+	ret = nm_setting_ip_config_remove_dns_option_by_value (setting, dns_option);
+	if (!ret)
+		g_set_error (error, 1, 0,
+		             _("the property doesn't contain DNS option '%s'"),
+		             dns_option);
+	return ret;
+}
+DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_ipv4_remove_dns_option,
+                               NM_SETTING_IP_CONFIG,
+                               nm_setting_ip_config_get_num_dns_options,
+                               nm_setting_ip_config_remove_dns_option,
+                               _validate_and_remove_ipv4_dns_option)
+
 /* 'addresses' */
 static NMIPAddress *
 _parse_ipv4_address (const char *address, GError **error)
@@ -3773,6 +4214,44 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_ipv6_remove_dns_search,
                                nm_setting_ip_config_remove_dns_search,
                                _validate_and_remove_ipv6_dns_search)
 
+/* 'dns-options' */
+static gboolean
+nmc_property_ipv6_set_dns_options (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+	char **strv = NULL;
+	guint i = 0;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	nm_setting_ip_config_clear_dns_options (NM_SETTING_IP_CONFIG (setting), TRUE);
+	strv = nmc_strsplit_set (val, " \t,", 0);
+	while (strv && strv[i])
+		nm_setting_ip_config_add_dns_option (NM_SETTING_IP_CONFIG (setting), strv[i++]);
+	g_strfreev (strv);
+
+	return TRUE;
+}
+
+static gboolean
+_validate_and_remove_ipv6_dns_option (NMSettingIPConfig *setting,
+                                      const char *dns_option,
+                                      GError **error)
+{
+	gboolean ret;
+
+	ret = nm_setting_ip_config_remove_dns_option_by_value (setting, dns_option);
+	if (!ret)
+		g_set_error (error, 1, 0,
+		             _("the property doesn't contain DNS option '%s'"),
+		             dns_option);
+	return ret;
+}
+DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_ipv6_remove_dns_option,
+                               NM_SETTING_IP_CONFIG,
+                               nm_setting_ip_config_get_num_dns_options,
+                               nm_setting_ip_config_remove_dns_option,
+                               _validate_and_remove_ipv6_dns_option)
+
 /* 'addresses' */
 static NMIPAddress *
 _parse_ipv6_address (const char *address, GError **error)
@@ -3945,6 +4424,36 @@ nmc_property_ipv6_set_ip6_privacy (NMSetting *setting, const char *prop, const c
 	return TRUE;
 }
 
+/* 'addr_gen_mode' */
+static char *
+nmc_property_ipv6_get_addr_gen_mode (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (setting);
+	NMSettingIP6ConfigAddrGenMode addr_gen_mode;
+
+	addr_gen_mode = nm_setting_ip6_config_get_addr_gen_mode (s_ip6);
+	return nm_utils_enum_to_str (nm_setting_ip6_config_addr_gen_mode_get_type (), addr_gen_mode);
+}
+
+
+static gboolean
+nmc_property_ipv6_set_addr_gen_mode (NMSetting *setting, const char *prop,
+                                     const char *val, GError **error)
+{
+	NMSettingIP6ConfigAddrGenMode addr_gen_mode;
+
+	if (!nm_utils_enum_from_str (nm_setting_ip6_config_addr_gen_mode_get_type (), val,
+	                             (int *) &addr_gen_mode, NULL)) {
+		g_set_error (error, 1, 0, _("invalid option '%s', use one of [%s]"),
+		             val, "eui64,stable-privacy");
+			return FALSE;
+	}
+
+	g_object_set (setting, prop, addr_gen_mode, NULL);
+	return TRUE;
+}
+
+
 /* --- NM_SETTING_OLPC_MESH_SETTING_NAME property setter functions --- */
 static gboolean
 nmc_property_olpc_set_channel (NMSetting *setting, const char *prop, const char *val, GError **error)
@@ -4413,6 +4922,60 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_wireless_remove_mac_address_blacklis
                                nm_setting_wireless_remove_mac_blacklist_item,
                                _validate_and_remove_wifi_mac_blacklist_item)
 
+/* 'powersave' */
+static gboolean
+nmc_property_wireless_set_powersave (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+	unsigned long powersave_int;
+	gboolean val_bool = FALSE;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	if (!nmc_string_to_uint (val, TRUE, 0, G_MAXUINT32, &powersave_int)) {
+		if (!nmc_string_to_bool (val, &val_bool, NULL)) {
+			g_set_error (error, 1, 0, _("'%s' is not a valid powersave value"), val);
+			return FALSE;
+		}
+		powersave_int = val_bool ? 1 : 0;
+	}
+
+	g_object_set (setting, prop, (guint32) powersave_int, NULL);
+	return TRUE;
+}
+
+static gboolean
+nmc_property_wireless_set_mac_address_randomization (NMSetting *setting,
+                                                     const char *prop,
+                                                     const char *val,
+                                                     GError **error)
+{
+	NMSettingMacRandomization randomization;
+	gs_free char *err_token = NULL;
+	gboolean ret;
+	long int t;
+
+	if (nmc_string_to_int_base (val, 0, TRUE,
+	                            NM_SETTING_MAC_RANDOMIZATION_DEFAULT,
+	                            NM_SETTING_MAC_RANDOMIZATION_ALWAYS,
+	                            &t))
+		randomization = (NMSettingMacRandomization) t;
+	else {
+		ret = nm_utils_enum_from_str (nm_setting_mac_randomization_get_type (),
+		                              val,
+		                              (int *) &randomization,
+		                              &err_token);
+
+		if (!ret) {
+			g_set_error (error, 1, 0, _("invalid option '%s', use 'default', 'never' or 'always'"),
+			             err_token);
+			return FALSE;
+		}
+	}
+
+	g_object_set (setting, prop, (guint) randomization, NULL);
+	return TRUE;
+}
+
 /* --- NM_SETTING_WIRELESS_SECURITY_SETTING_NAME property setter functions --- */
 /* 'key-mgmt' */
 static const char *wifi_sec_valid_key_mgmts[] = { "none", "ieee8021x", "wpa-none", "wpa-psk", "wpa-eap", NULL };
@@ -4434,14 +4997,15 @@ nmc_property_wifi_sec_set_auth_alg (NMSetting *setting, const char *prop, const
 	return check_and_set_string (setting, prop, val, wifi_sec_valid_auth_algs, error);
 }
 
-DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_proto,
-                              NM_SETTING_WIRELESS_SECURITY,
-                              nm_setting_wireless_security_add_proto)
 DEFINE_ALLOWED_VAL_FUNC (nmc_property_wifi_sec_allowed_auth_alg, wifi_sec_valid_auth_algs)
 
 /* 'proto' */
 static const char *wifi_sec_valid_protos[] = { "wpa", "rsn", NULL };
 
+DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_proto,
+                              NM_SETTING_WIRELESS_SECURITY,
+                              nm_setting_wireless_security_add_proto)
+
 static gboolean
 nmc_property_wifi_sec_set_proto (NMSetting *setting, const char *prop, const char *val, GError **error)
 {
@@ -4472,14 +5036,15 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_wifi_sec_remove_proto,
                                nm_setting_wireless_security_remove_proto,
                                _validate_and_remove_wifi_sec_proto)
 
-DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_pairwise,
-                              NM_SETTING_WIRELESS_SECURITY,
-                              nm_setting_wireless_security_add_pairwise)
 DEFINE_ALLOWED_VAL_FUNC (nmc_property_wifi_sec_allowed_proto, wifi_sec_valid_protos)
 
 /* 'pairwise' */
 static const char *wifi_sec_valid_pairwises[] = { "tkip", "ccmp", NULL };
 
+DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_pairwise,
+                              NM_SETTING_WIRELESS_SECURITY,
+                              nm_setting_wireless_security_add_pairwise)
+
 static gboolean
 nmc_property_wifi_sec_set_pairwise (NMSetting *setting, const char *prop, const char *val, GError **error)
 {
@@ -4510,14 +5075,15 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_wifi_sec_remove_pairwise,
                                nm_setting_wireless_security_remove_pairwise,
                                _validate_and_remove_wifi_sec_pairwise)
 
-DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_group,
-                              NM_SETTING_WIRELESS_SECURITY,
-                              nm_setting_wireless_security_add_group)
 DEFINE_ALLOWED_VAL_FUNC (nmc_property_wifi_sec_allowed_pairwise, wifi_sec_valid_pairwises)
 
 /* 'group' */
 static const char *wifi_sec_valid_groups[] = { "wep40", "wep104", "tkip", "ccmp", NULL };
 
+DEFINE_SETTER_STR_LIST_MULTI (check_and_add_wifi_sec_group,
+                              NM_SETTING_WIRELESS_SECURITY,
+                              nm_setting_wireless_security_add_group)
+
 static gboolean
 nmc_property_wifi_sec_set_group (NMSetting *setting, const char *prop, const char *val, GError **error)
 {
@@ -4928,6 +5494,77 @@ nmc_property_dcb_set_app_fcoe_mode (NMSetting *setting, const char *prop, const
 
 DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fcoe_modes)
 
+static gboolean
+nmc_property_gsm_set_sim_operator_id (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+	const char *p = val;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	if (strlen (val) != 5 && strlen (val) != 6) {
+		g_set_error_literal (error, 1, 0, _("SIM operator ID must be a 5 or 6 number MCCMNC code"));
+		return FALSE;
+	}
+
+	while (p && *p) {
+		if (!g_ascii_isdigit (*p++)) {
+			g_set_error_literal (error, 1, 0, _("SIM operator ID must be a 5 or 6 number MCCMNC code"));
+			return FALSE;
+		}
+	}
+	g_object_set (G_OBJECT (setting),
+	              NM_SETTING_GSM_SIM_OPERATOR_ID,
+	              val,
+	              NULL);
+	return TRUE;
+}
+
+static char *
+nmc_property_tun_get_mode (NMSetting *setting, NmcPropertyGetType get_type)
+{
+	NMSettingTun *s_tun = NM_SETTING_TUN (setting);
+	NMSettingTunMode mode;
+	char *tmp, *str;
+
+	mode = nm_setting_tun_get_mode (s_tun);
+	tmp = nm_utils_enum_to_str (nm_setting_tun_mode_get_type (), mode);
+	if (get_type == NMC_PROPERTY_GET_PARSABLE)
+		str = g_strdup_printf ("%s", tmp ? tmp : "");
+	else
+		str = g_strdup_printf ("%d (%s)", mode, tmp ? tmp : "");
+	g_free (tmp);
+	return str;
+}
+
+static gboolean
+nmc_property_tun_set_mode (NMSetting *setting, const char *prop,
+                           const char *val, GError **error)
+{
+	NMSettingTunMode mode;
+	gboolean ret;
+	long int t;
+
+	if (nmc_string_to_int_base (val, 0, TRUE, 0, NM_SETTING_TUN_MODE_TAP, &t))
+		mode = (NMSettingTunMode) t;
+	else {
+		ret = nm_utils_enum_from_str (nm_setting_tun_mode_get_type (), val,
+		                              (int *) &mode, NULL);
+
+		if (!ret) {
+			g_set_error (error, 1, 0, _("invalid option '%s', use '%s' or '%s'"),
+			             val, "tun", "tap");
+			return FALSE;
+		}
+	}
+
+	g_object_set (setting, prop, (guint) mode, NULL);
+	return TRUE;
+}
+
+static const char *tun_valid_modes[] = { "tun", "tap", "unknown", NULL };
+
+DEFINE_ALLOWED_VAL_FUNC (nmc_property_tun_allowed_mode, tun_valid_modes)
+
 /*----------------------------------------------------------------------------*/
 
 static inline void
@@ -5323,6 +5960,14 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 
+	nmc_add_prop_funcs (GLUE (BRIDGE, MULTICAST_SNOOPING),
+	                    nmc_property_bridge_get_multicast_snooping,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+
 	/* Add editable properties for NM_SETTING_BRIDGE_PORT_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (BRIDGE_PORT, PRIORITY),
 	                    nmc_property_bridge_port_get_priority,
@@ -5489,6 +6134,13 @@ nmc_properties_init (void)
 	                    nmc_property_connection_describe_metered,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (CONNECTION, LLDP),
+	                    nmc_property_connection_get_lldp,
+	                    nmc_property_connection_set_lldp,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 
 	/* Add editable properties for NM_SETTING_DCB_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (DCB, APP_FCOE_FLAGS),
@@ -5661,6 +6313,27 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (GSM, DEVICE_ID),
+	                    nmc_property_gsm_get_device_id,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (GSM, SIM_ID),
+	                    nmc_property_gsm_get_sim_id,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (GSM, SIM_OPERATOR_ID),
+	                    nmc_property_gsm_get_sim_operator_id,
+	                    nmc_property_gsm_set_sim_operator_id,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 
 	/* Add editable properties for NM_SETTING_INFINIBAND_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (INFINIBAND, MAC_ADDRESS),
@@ -5721,6 +6394,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE_IP (4, DNS_OPTIONS),
+	                    nmc_property_ipv4_get_dns_options,
+	                    nmc_property_ipv4_set_dns_options,
+	                    nmc_property_ipv4_remove_dns_option,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (4, ADDRESSES),
 	                    nmc_property_ip_get_addresses,
 	                    nmc_property_ipv4_set_addresses,
@@ -5770,6 +6450,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP4_CONFIG, DHCP_TIMEOUT),
+	                    nmc_property_ipv4_get_dhcp_timeout,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (4, DHCP_SEND_HOSTNAME),
 	                    nmc_property_ipv4_get_dhcp_send_hostname,
 	                    nmc_property_set_bool,
@@ -5784,6 +6471,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP4_CONFIG, DHCP_FQDN),
+	                    nmc_property_ipv4_get_dhcp_fqdn,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (4, NEVER_DEFAULT),
 	                    nmc_property_ipv4_get_never_default,
 	                    nmc_property_set_bool,
@@ -5821,6 +6515,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE_IP (6, DNS_OPTIONS),
+	                    nmc_property_ipv6_get_dns_options,
+	                    nmc_property_ipv6_set_dns_options,
+	                    nmc_property_ipv6_remove_dns_option,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (6, ADDRESSES),
 	                    nmc_property_ip_get_addresses,
 	                    nmc_property_ipv6_set_addresses,
@@ -5884,6 +6585,13 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP6_CONFIG, ADDR_GEN_MODE),
+	                    nmc_property_ipv6_get_addr_gen_mode,
+	                    nmc_property_ipv6_set_addr_gen_mode,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 	nmc_add_prop_funcs (GLUE_IP (6, DHCP_SEND_HOSTNAME),
 	                    nmc_property_ipv6_get_dhcp_send_hostname,
 	                    nmc_property_set_bool,
@@ -6209,6 +6917,14 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL);
 
+	nmc_add_prop_funcs (GLUE (VPN, TIMEOUT),
+	                    nmc_property_vpn_get_timeout,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+
 	/* Add editable properties for NM_SETTING_WIMAX_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (WIMAX, NETWORK_NAME),
 	                    nmc_property_wimax_get_network_name,
@@ -6414,6 +7130,20 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+	nmc_add_prop_funcs (GLUE (WIRELESS, POWERSAVE),
+	                    nmc_property_wireless_get_powersave,
+	                    nmc_property_wireless_set_powersave,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (WIRELESS, MAC_ADDRESS_RANDOMIZATION),
+	                    nmc_property_wireless_get_mac_address_randomization,
+	                    nmc_property_wireless_set_mac_address_randomization,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 
 	/* Add editable properties for NM_SETTING_WIRELESS_SECURITY_SETTING_NAME */
 	nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, KEY_MGMT),
@@ -6535,6 +7265,280 @@ nmc_properties_init (void)
 	                    NULL,
 	                    NULL,
 	                    NULL);
+
+	/* Add editable properties for NM_SETTING_TUN_SETTING_NAME */
+	nmc_add_prop_funcs (GLUE (TUN, MODE),
+	                    nmc_property_tun_get_mode,
+	                    nmc_property_tun_set_mode,
+	                    NULL,
+	                    NULL,
+	                    nmc_property_tun_allowed_mode,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (TUN, OWNER),
+	                    nmc_property_tun_get_owner,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (TUN, GROUP),
+	                    nmc_property_tun_get_group,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (TUN, PI),
+	                    nmc_property_tun_get_pi,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (TUN, VNET_HDR),
+	                    nmc_property_tun_get_vnet_hdr,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (TUN, MULTI_QUEUE),
+	                    nmc_property_tun_get_multi_queue,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+
+	/* Add editable properties for NM_SETTING_IP_TUNNEL_SETTING_NAME */
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, MODE),
+	                    nmc_property_ip_tunnel_get_mode,
+	                    nmc_property_ip_tunnel_set_mode,
+	                    NULL,
+	                    NULL,
+	                    nmc_property_ip_tunnel_allowed_mode,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, PARENT),
+	                    nmc_property_ip_tunnel_get_parent,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, LOCAL),
+	                    nmc_property_ip_tunnel_get_local,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, REMOTE),
+	                    nmc_property_ip_tunnel_get_remote,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, TTL),
+	                    nmc_property_ip_tunnel_get_ttl,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, TOS),
+	                    nmc_property_ip_tunnel_get_tos,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, PATH_MTU_DISCOVERY),
+	                    nmc_property_ip_tunnel_get_path_mtu_discovery,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, INPUT_KEY),
+	                    nmc_property_ip_tunnel_get_input_key,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, OUTPUT_KEY),
+	                    nmc_property_ip_tunnel_get_output_key,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, ENCAPSULATION_LIMIT),
+	                    nmc_property_ip_tunnel_get_encapsulation_limit,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, FLOW_LABEL),
+	                    nmc_property_ip_tunnel_get_flow_label,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (IP_TUNNEL, MTU),
+	                    nmc_property_ip_tunnel_get_mtu,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+
+	/* Add editable properties for NM_SETTING_MACVLAN_SETTING_NAME */
+	nmc_add_prop_funcs (GLUE (MACVLAN, PARENT),
+	                    nmc_property_macvlan_get_parent,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (MACVLAN, MODE),
+	                    nmc_property_macvlan_get_mode,
+	                    nmc_property_macvlan_set_mode,
+	                    NULL,
+	                    NULL,
+	                    nmc_property_macvlan_allowed_mode,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (MACVLAN, PROMISCUOUS),
+	                    nmc_property_macvlan_get_promiscuous,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (MACVLAN, TAP),
+	                    nmc_property_macvlan_get_tap,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+
+	/* Add editable properties for NM_SETTING_VXLAN_SETTING_NAME */
+	nmc_add_prop_funcs (GLUE (VXLAN, PARENT),
+	                    nmc_property_vxlan_get_parent,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, ID),
+	                    nmc_property_vxlan_get_id,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, LOCAL),
+	                    nmc_property_vxlan_get_local,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, REMOTE),
+	                    nmc_property_vxlan_get_remote,
+	                    nmc_property_set_string,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, SOURCE_PORT_MIN),
+	                    nmc_property_vxlan_get_source_port_min,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, SOURCE_PORT_MAX),
+	                    nmc_property_vxlan_get_source_port_max,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, DESTINATION_PORT),
+	                    nmc_property_vxlan_get_destination_port,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, TOS),
+	                    nmc_property_vxlan_get_tos,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, TTL),
+	                    nmc_property_vxlan_get_ttl,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, AGEING),
+	                    nmc_property_vxlan_get_ageing,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, LIMIT),
+	                    nmc_property_vxlan_get_limit,
+	                    nmc_property_set_uint,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, LEARNING),
+	                    nmc_property_vxlan_get_learning,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, PROXY),
+	                    nmc_property_vxlan_get_proxy,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, RSC),
+	                    nmc_property_vxlan_get_rsc,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, L2_MISS),
+	                    nmc_property_vxlan_get_l2_miss,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
+	nmc_add_prop_funcs (GLUE (VXLAN, L3_MISS),
+	                    nmc_property_vxlan_get_l3_miss,
+	                    nmc_property_set_bool,
+	                    NULL,
+	                    NULL,
+	                    NULL,
+	                    NULL);
 }
 
 void
@@ -6864,6 +7868,7 @@ setting_connection_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 	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));
 	set_val_str (arr, 16, nmc_property_connection_get_metered (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_connection_get_lldp (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -6994,9 +7999,11 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc,  const char *one_prop,
 	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));
+	set_val_str (arr, 11, nmc_property_wireless_get_mac_address_randomization (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_wireless_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_wireless_get_seen_bssids (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_wireless_get_hidden (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_wireless_get_powersave (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7067,17 +8074,20 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 	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));
+	set_val_str (arr, 4, nmc_property_ipv4_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_timeout (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_ipv4_get_dhcp_fqdn (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 17, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7106,17 +8116,19 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc,  const char *one_pro
 	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));
+	set_val_str (arr, 4, nmc_property_ipv6_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_ipv6_get_addr_gen_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_ipv6_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7253,6 +8265,9 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 	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, NMC_PROPERTY_GET_PRETTY));
 	set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_gsm_get_device_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_gsm_get_sim_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_gsm_get_sim_operator_id (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7367,6 +8382,7 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 	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, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_vpn_get_timeout (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7544,6 +8560,7 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, g
 	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));
+	set_val_str (arr, 8, nmc_property_bridge_get_multicast_snooping (setting, NMC_PROPERTY_GET_PRETTY));
 	g_ptr_array_add (nmc->output_data, arr);
 
 	print_data (nmc);  /* Print all data */
@@ -7671,6 +8688,144 @@ setting_dcb_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboo
 	return TRUE;
 }
 
+static gboolean
+setting_tun_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets)
+{
+	NMSettingTun *s_tun = NM_SETTING_TUN (setting);
+	NmcOutputField *tmpl, *arr;
+	size_t tmpl_len;
+
+	g_return_val_if_fail (NM_IS_SETTING_TUN (s_tun), FALSE);
+
+	tmpl = nmc_fields_setting_tun;
+	tmpl_len = sizeof (nmc_fields_setting_tun);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_TUN_ALL,
+	                                                 tmpl, FALSE, NULL, NULL);
+	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
+	g_ptr_array_add (nmc->output_data, arr);
+
+	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_tun_get_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_tun_get_owner (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_tun_get_group (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_tun_get_pi (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_tun_get_vnet_hdr (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_tun_get_multi_queue (setting, NMC_PROPERTY_GET_PRETTY));
+	g_ptr_array_add (nmc->output_data, arr);
+
+	print_data (nmc);  /* Print all data */
+
+	return TRUE;
+}
+
+static gboolean
+setting_ip_tunnel_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets)
+{
+	NMSettingIPTunnel *s_ip_tunnel = NM_SETTING_IP_TUNNEL (setting);
+	NmcOutputField *tmpl, *arr;
+	size_t tmpl_len;
+
+	g_return_val_if_fail (NM_IS_SETTING_IP_TUNNEL (s_ip_tunnel), FALSE);
+
+	tmpl = nmc_fields_setting_ip_tunnel;
+	tmpl_len = sizeof (nmc_fields_setting_ip_tunnel);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_IP_TUNNEL_ALL,
+	                                                 tmpl, FALSE, NULL, NULL);
+	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
+	g_ptr_array_add (nmc->output_data, arr);
+
+	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_ip_tunnel_get_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_ip_tunnel_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_ip_tunnel_get_local (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_ip_tunnel_get_remote (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_ip_tunnel_get_ttl (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_ip_tunnel_get_tos (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_ip_tunnel_get_path_mtu_discovery (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_ip_tunnel_get_input_key (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_ip_tunnel_get_output_key (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_ip_tunnel_get_encapsulation_limit (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_ip_tunnel_get_flow_label (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_ip_tunnel_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+	g_ptr_array_add (nmc->output_data, arr);
+
+	print_data (nmc);  /* Print all data */
+
+	return TRUE;
+}
+
+static gboolean
+setting_macvlan_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets)
+{
+	NMSettingMacvlan *s_macvlan = NM_SETTING_MACVLAN (setting);
+	NmcOutputField *tmpl, *arr;
+	size_t tmpl_len;
+
+	g_return_val_if_fail (NM_IS_SETTING_MACVLAN (s_macvlan), FALSE);
+
+	tmpl = nmc_fields_setting_macvlan;
+	tmpl_len = sizeof (nmc_fields_setting_macvlan);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_MACVLAN_ALL,
+	                                                 tmpl, FALSE, NULL, NULL);
+	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
+	g_ptr_array_add (nmc->output_data, arr);
+
+	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_macvlan_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_macvlan_get_mode (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_macvlan_get_promiscuous (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_macvlan_get_tap (setting, NMC_PROPERTY_GET_PRETTY));
+	g_ptr_array_add (nmc->output_data, arr);
+
+	print_data (nmc);  /* Print all data */
+
+	return TRUE;
+}
+
+ static gboolean
+setting_vxlan_details (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets)
+{
+	NMSettingVxlan *s_vxlan = NM_SETTING_VXLAN (setting);
+	NmcOutputField *tmpl, *arr;
+	size_t tmpl_len;
+
+	g_return_val_if_fail (NM_IS_SETTING_VXLAN (s_vxlan), FALSE);
+
+	tmpl = nmc_fields_setting_vxlan;
+	tmpl_len = sizeof (nmc_fields_setting_vxlan);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_VXLAN_ALL,
+	                                                 tmpl, FALSE, NULL, NULL);
+	arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
+	g_ptr_array_add (nmc->output_data, arr);
+
+	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_vxlan_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 2, nmc_property_vxlan_get_id (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 3, nmc_property_vxlan_get_local (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 4, nmc_property_vxlan_get_remote (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 5, nmc_property_vxlan_get_source_port_min (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 6, nmc_property_vxlan_get_source_port_max (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 7, nmc_property_vxlan_get_destination_port (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 8, nmc_property_vxlan_get_tos (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 9, nmc_property_vxlan_get_ttl (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 10, nmc_property_vxlan_get_ageing (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 11, nmc_property_vxlan_get_limit (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 12, nmc_property_vxlan_get_learning (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 13, nmc_property_vxlan_get_proxy (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 14, nmc_property_vxlan_get_rsc (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 15, nmc_property_vxlan_get_l2_miss (setting, NMC_PROPERTY_GET_PRETTY));
+	set_val_str (arr, 16, nmc_property_vxlan_get_l3_miss (setting, NMC_PROPERTY_GET_PRETTY));
+	g_ptr_array_add (nmc->output_data, arr);
+
+	print_data (nmc);  /* Print all data */
+
+	return TRUE;
+}
+
 typedef struct {
 	const char *sname;
 	gboolean (*func) (NMSetting *setting, NmCli *nmc,  const char *one_prop, gboolean secrets);
@@ -7702,6 +8857,10 @@ static const SettingDetails detail_printers[] = {
 	{ NM_SETTING_TEAM_SETTING_NAME,              setting_team_details },
 	{ NM_SETTING_TEAM_PORT_SETTING_NAME,         setting_team_port_details },
 	{ NM_SETTING_DCB_SETTING_NAME,               setting_dcb_details },
+	{ NM_SETTING_TUN_SETTING_NAME,               setting_tun_details },
+	{ NM_SETTING_IP_TUNNEL_SETTING_NAME,         setting_ip_tunnel_details },
+	{ NM_SETTING_MACVLAN_SETTING_NAME,           setting_macvlan_details },
+	{ NM_SETTING_VXLAN_SETTING_NAME,             setting_vxlan_details },
 	{ NULL },
 };
 
diff --git a/clients/cli/utils.c b/clients/cli/utils.c
index 47cd4392..898e7f26 100644
--- a/clients/cli/utils.c
+++ b/clients/cli/utils.c
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 /* Generated configuration file */
@@ -29,9 +29,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
+#include "nm-default.h"
 #include "utils.h"
 
 int
@@ -307,29 +305,160 @@ nmc_term_color_sequence (NmcTermColor color)
 	}
 }
 
+/* Parses @str for color as string or number */
+NmcTermColor
+nmc_term_color_parse_string (const char *str, GError **error)
+{
+	unsigned long color_int;
+	static const char *colors[] = { "normal", "black", "red", "green", "yellow",
+	                                "blue", "magenta", "cyan", "white", NULL };
+
+	if (nmc_string_to_uint (str, TRUE, 0, 8, &color_int)) {
+		return (NmcTermColor) color_int;
+	} else {
+		const char *color, **p;
+		int i;
+
+		color = nmc_string_is_valid (str, colors, error);
+		for (p = colors, i = 0; *p != NULL; p++, i++) {
+			if (*p == color)
+				return (NmcTermColor) i;
+		}
+		return -1;
+	}
+}
+
+const char *
+nmc_term_format_sequence (NmcTermFormat format)
+{
+	switch (format) {
+        case NMC_TERM_FORMAT_BOLD:
+		return "\33[1m";
+		break;
+        case NMC_TERM_FORMAT_DIM:
+		return "\33[2m";
+		break;
+        case NMC_TERM_FORMAT_UNDERLINE:
+		return "\33[4m";
+		break;
+        case NMC_TERM_FORMAT_BLINK:
+		return "\33[5m";
+		break;
+        case NMC_TERM_FORMAT_REVERSE:
+		return "\33[7m";
+		break;
+        case NMC_TERM_FORMAT_HIDDEN:
+		return "\33[8m";
+		break;
+	default:
+		return "";
+		break;
+	}
+}
+
+static gboolean
+use_colors (NmCli *nmc)
+{
+	if (nmc == NULL)
+		return FALSE;
+
+	if (nmc->use_colors == NMC_USE_COLOR_AUTO)
+		nmc->use_colors = isatty (fileno (stdout)) ? NMC_USE_COLOR_YES : NMC_USE_COLOR_NO;
+
+	return nmc->use_colors == NMC_USE_COLOR_YES;
+}
+
 char *
-nmc_colorize (NmcTermColor color, const char *fmt, ...)
+nmc_colorize (NmCli *nmc, NmcTermColor color, NmcTermFormat format, const char *fmt, ...)
 {
 	va_list args;
 	char *str, *colored;
-	const char *ansi_color, *color_end;
+	const char *ansi_color, *color_end, *ansi_fmt, *format_end;
+	static const char *end_seq = "\33[0m";
 
 	va_start (args, fmt);
 	str = g_strdup_vprintf (fmt, args);
 	va_end (args);
 
+	if (!use_colors (nmc))
+		return str;
+
 	ansi_color = nmc_term_color_sequence (color);
-	if (*ansi_color)
-		color_end = "\33[0m";
-	else
-		color_end = "";
+	ansi_fmt = nmc_term_format_sequence (format);
+	color_end = *ansi_color ? end_seq : "";
+	format_end = *ansi_fmt ? end_seq : "";
 
-	colored = g_strdup_printf ("%s%s%s", ansi_color, str, color_end);
+	colored = g_strdup_printf ("%s%s%s%s%s", ansi_fmt, ansi_color, str, color_end, format_end);
 	g_free (str);
 	return colored;
 }
 
 /*
+ * Count characters belonging to terminal color escape sequences.
+ * @start points to beginning of the string, @end points to the end,
+ * or NULL if the string is nul-terminated.
+ */
+static int
+nmc_count_color_escape_chars (const char *start, const char *end)
+{
+	int num = 0;
+	gboolean inside = FALSE;
+
+	if (end == NULL)
+		end = start + strlen (start);
+
+	while (start < end) {
+		if (*start == '\33' && *(start+1) == '[')
+			inside = TRUE;
+		if (inside)
+			num++;
+		if (*start == 'm') 
+			inside = FALSE;
+		start++;
+	}
+	return num;
+}
+
+/* Filter out possible ANSI color escape sequences */
+/* It directly modifies the passed string @str. */
+void
+nmc_filter_out_colors_inplace (char *str)
+{
+	const char *p1;
+	char *p2;
+	gboolean copy_char = TRUE;
+
+	if (!str)
+		return;
+
+	p1 = p2 = str;
+	while (*p1) {
+		if (*p1 == '\33' && *(p1+1) == '[')
+			copy_char = FALSE;
+		if (copy_char)
+			*p2++ = *p1;
+		if (!copy_char && *p1 == 'm')
+			copy_char = TRUE;
+		p1++;
+	}
+	*p2 = '\0';
+}
+
+/* Filter out possible ANSI color escape sequences */
+char *
+nmc_filter_out_colors (const char *str)
+{
+	char *filtered;
+
+	if (!str)
+		return NULL;
+
+	filtered = g_strdup (str);
+	nmc_filter_out_colors_inplace (filtered);
+	return filtered;
+}
+
+/*
  * Convert string to signed integer.
  * If required, the resulting number is checked to be in the <min,max> range.
  */
@@ -643,21 +772,24 @@ nmc_strsplit_set (const char *str, const char *delimiter, int max_tokens)
 }
 
 /*
- * Find out how many columns an UTF-8 string occupies on the screen
+ * Find out how many columns an UTF-8 string occupies on the screen.
  */
 int
 nmc_string_screen_width (const char *start, const char *end)
 {
 	int width = 0;
+	const char *p = start;
 
 	if (end == NULL)
 		end = start + strlen (start);
 
-	while (start < end) {
-		width += g_unichar_iswide (g_utf8_get_char (start)) ? 2 : g_unichar_iszerowidth (g_utf8_get_char (start)) ? 0 : 1;
-		start = g_utf8_next_char (start);
+	while (p < end) {
+		width += g_unichar_iswide (g_utf8_get_char (p)) ? 2 : g_unichar_iszerowidth (g_utf8_get_char (p)) ? 0 : 1;
+		p = g_utf8_next_char (p);
 	}
-	return width;
+
+	/* Subtract color escape sequences as they don't occupy space. */
+	return width - nmc_count_color_escape_chars (start, NULL);
 }
 
 void
@@ -692,6 +824,26 @@ set_val_arrc (NmcOutputField fields_array[], guint32 idx, const char **value)
 	fields_array[idx].free_value = FALSE;
 }
 
+void
+set_val_color_all (NmcOutputField fields_array[], NmcTermColor color)
+{
+	int i;
+
+	for (i = 0; fields_array[i].name; i++) {
+		fields_array[i].color = color;
+	}
+}
+
+void
+set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format)
+{
+	int i;
+
+	for (i = 0; fields_array[i].name; i++) {
+		fields_array[i].color_fmt = format;
+	}
+}
+
 /*
  * Free 'value' members in array of NmcOutputField
  */
@@ -910,23 +1062,55 @@ nmc_empty_output_fields (NmCli *nmc)
 }
 
 static char *
-get_value_to_print (NmcOutputField *fields,
+colorize_string (NmCli *nmc,
+                 NmcTermColor color,
+                 NmcTermFormat color_fmt,
+                 const char *str,
+                 gboolean *dealloc)
+{
+	char *out;
+
+	if (   use_colors (nmc)
+	    && (color != NMC_TERM_COLOR_NORMAL || color_fmt != NMC_TERM_FORMAT_NORMAL)) {
+		out = nmc_colorize (nmc, color, color_fmt, str);
+		*dealloc = TRUE;
+	} else {
+		out = (char *) str;
+		*dealloc = FALSE;
+	}
+	return out;
+}
+
+static char *
+get_value_to_print (NmCli *nmc,
+                    NmcOutputField *field,
                     gboolean field_name,
                     const char *not_set_str,
                     gboolean *dealloc)
 {
-	gboolean is_array = fields->value_is_array;
-	char *value;
+	gboolean is_array = field->value_is_array;
+	char *value, *out;
+	gboolean free_value, free_out;
 
 	if (field_name)
-		value = _(fields->name_l10n);
+		value = _(field->name_l10n);
 	else
-		value = fields->value ?
-		          (is_array ? g_strjoinv (" | ", (char **) fields->value) :
-		                      (char *) fields->value) :
+		value = field->value ?
+		          (is_array ? g_strjoinv (" | ", (char **) field->value) :
+		                      (char *) field->value) :
 		          (char *) not_set_str;
-	*dealloc = fields->value && is_array && !field_name;
-	return value;
+	free_value = field->value && is_array && !field_name;
+
+	/* colorize the value */
+	out = colorize_string (nmc, field->color, field->color_fmt, value, &free_out);
+	if (free_out) {
+		if (free_value)
+			g_free (value);
+		 *dealloc = TRUE;
+	} else
+		 *dealloc = free_value;
+
+	return out;
 }
 
 /*
@@ -985,6 +1169,7 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
 		if (!main_header_only && !field_names) {
 			for (i = 0; i < fields.indices->len; i++) {
 				char *tmp;
+				gboolean free_print_val;
 				int idx = g_array_index (fields.indices, int, i);
 				gboolean is_array = field_values[idx].value_is_array;
 
@@ -996,10 +1181,14 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
 
 				if (is_array) {
 					/* value is a null-terminated string array */
-					const char **p;
+					const char **p, *val;
+					char *print_val;
 					int j;
 
 					for (p = (const char **) field_values[idx].value, j = 1; p && *p; p++, j++) {
+						val = *p ? *p : not_set_str;
+						print_val = colorize_string (nmc, field_values[idx].color, field_values[idx].color_fmt,
+						                             val, &free_print_val);
 						tmp = g_strdup_printf ("%s%s%s[%d]:",
 						                       section_prefix ? (const char*) field_values[0].value : "",
 						                       section_prefix ? "." : "",
@@ -1007,24 +1196,30 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
 						                       j);
 						width1 = strlen (tmp);
 						width2 = nmc_string_screen_width (tmp, NULL);
-						g_print ("%-*s%s\n", terse ? 0 : ML_VALUE_INDENT+width1-width2, tmp,
-						         *p ? *p : not_set_str);
+						g_print ("%-*s%s\n", terse ? 0 : ML_VALUE_INDENT+width1-width2, tmp, print_val);
 						g_free (tmp);
+						if (free_print_val)
+							g_free (print_val);
 					}
 				} else {
 					/* value is a string */
 					const char *hdr_name = (const char*) field_values[0].value;
 					const char *val = (const char*) field_values[idx].value;
+					char *print_val;
 
+					val = val ? val : not_set_str;
+					print_val = colorize_string (nmc, field_values[idx].color, field_values[idx].color_fmt,
+					                             val, &free_print_val);
 					tmp = g_strdup_printf ("%s%s%s:",
 					                       section_prefix ? hdr_name : "",
 					                       section_prefix ? "." : "",
 					                       _(field_values[idx].name_l10n));
 					width1 = strlen (tmp);
 					width2 = nmc_string_screen_width (tmp, NULL);
-					g_print ("%-*s%s\n", terse ? 0 : ML_VALUE_INDENT+width1-width2, tmp,
-					         val ? val : not_set_str);
+					g_print ("%-*s%s\n", terse ? 0 : ML_VALUE_INDENT+width1-width2, tmp, print_val);
 					g_free (tmp);
+					if (free_print_val)
+						g_free (print_val);
 				}
 			}
 			if (pretty) {
@@ -1042,7 +1237,8 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
 	for (i = 0; i < fields.indices->len; i++) {
 		int idx = g_array_index (fields.indices, int, i);
 		gboolean dealloc;
-		char *value = get_value_to_print ((NmcOutputField *) field_values+idx, field_names, not_set_str, &dealloc);
+		char *value = get_value_to_print (nmc, (NmcOutputField *) field_values+idx, field_names,
+		                                  not_set_str, &dealloc);
 
 		if (terse) {
 			if (escape) {
@@ -1140,7 +1336,7 @@ print_data (NmCli *nmc)
 			char *value;
 			row = g_ptr_array_index (nmc->output_data, j);
 			field_names = row[0].flags & NMC_OF_FLAG_FIELD_NAMES;
-			value = get_value_to_print (row+i, field_names, "--", &dealloc);
+			value = get_value_to_print (NULL, row+i, field_names, "--", &dealloc);
 			len = nmc_string_screen_width (value, NULL);
 			max_width = len > max_width ? len : max_width;
 			if (dealloc)
diff --git a/clients/cli/utils.h b/clients/cli/utils.h
index ba649f8f..8047fe7f 100644
--- a/clients/cli/utils.h
+++ b/clients/cli/utils.h
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright 2010 - 2014 Red Hat, Inc.
+ * Copyright 2010 - 2015 Red Hat, Inc.
  */
 
 #ifndef NMC_UTILS_H
@@ -74,7 +74,11 @@ char *nmc_ip6_address_as_string (const struct in6_addr *ip, GError **error);
 void nmc_terminal_erase_line (void);
 void nmc_terminal_show_progress (const char *str);
 const char *nmc_term_color_sequence (NmcTermColor color);
-char *nmc_colorize (NmcTermColor color, const char * fmt, ...);
+const char *nmc_term_format_sequence (NmcTermFormat format);
+NmcTermColor nmc_term_color_parse_string (const char *str, GError **error);
+char *nmc_colorize (NmCli *nmc, NmcTermColor color, NmcTermFormat format, const char * fmt, ...);
+void nmc_filter_out_colors_inplace (char *str);
+char *nmc_filter_out_colors (const char *str);
 char *nmc_get_user_input (const char *ask_str);
 int nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
                              char ***argv, int *argc);
@@ -87,6 +91,8 @@ void set_val_str  (NmcOutputField fields_array[], guint32 index, char *value);
 void set_val_strc (NmcOutputField fields_array[], guint32 index, const char *value);
 void set_val_arr  (NmcOutputField fields_array[], guint32 index, char **value);
 void set_val_arrc (NmcOutputField fields_array[], guint32 index, const char **value);
+void set_val_color_all (NmcOutputField fields_array[], NmcTermColor color);
+void set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format);
 void nmc_free_output_field_values (NmcOutputField fields_array[]);
 GArray *parse_output_fields (const char *fields_str,
                              const NmcOutputField fields_array[],
diff --git a/clients/common/nm-polkit-listener.c b/clients/common/nm-polkit-listener.c
index c1c7c908..9646374e 100644
--- a/clients/common/nm-polkit-listener.c
+++ b/clients/common/nm-polkit-listener.c
@@ -36,10 +36,8 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <glib.h>
-#include <glib/gi18n-lib.h>
 
-#include "nm-glib-compat.h"
+#include "nm-default.h"
 #include "nm-polkit-listener.h"
 
 G_DEFINE_TYPE (NMPolkitListener, nm_polkit_listener, POLKIT_AGENT_TYPE_LISTENER)
diff --git a/clients/common/nm-polkit-listener.h b/clients/common/nm-polkit-listener.h
index 3cd75019..22c436c1 100644
--- a/clients/common/nm-polkit-listener.h
+++ b/clients/common/nm-polkit-listener.h
@@ -19,11 +19,11 @@
 #ifndef __NM_POLKIT_LISTENER_H__
 #define __NM_POLKIT_LISTENER_H__
 
-#include <glib.h>
-
 #define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE
 #include <polkitagent/polkitagent.h>
 
+#include "nm-default.h"
+
 G_BEGIN_DECLS
 
 #define NM_TYPE_POLKIT_LISTENER            (nm_polkit_listener_get_type ())
diff --git a/clients/common/nm-secret-agent-simple.c b/clients/common/nm-secret-agent-simple.c
index 6cb6c58d..233e1409 100644
--- a/clients/common/nm-secret-agent-simple.c
+++ b/clients/common/nm-secret-agent-simple.c
@@ -32,13 +32,11 @@
 #include "config.h"
 
 #include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <glib/gi18n-lib.h>
 
 #include <NetworkManager.h>
-#include <nm-core-internal.h>
+#include <nm-vpn-service-plugin.h>
 
+#include "nm-default.h"
 #include "nm-vpn-helpers.h"
 #include "nm-secret-agent-simple.h"
 
@@ -357,23 +355,9 @@ get_vpn_secret_flags (NMSettingVpn *s_vpn, const char *secret_name)
 {
 	NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
 	GHashTable *vpn_data;
-	char *flag_name;
-	const char *val;
-	unsigned long tmp;
 
 	g_object_get (s_vpn, NM_SETTING_VPN_DATA, &vpn_data, NULL);
-
-	flag_name = g_strdup_printf ("%s-flags", secret_name);
-
-	/* Try new flags value first */
-	val = g_hash_table_lookup (vpn_data, flag_name);
-	if (val) {
-		errno = 0;
-		tmp = strtoul (val, NULL, 10);
-		if (errno == 0 && tmp <= NM_SETTING_SECRET_FLAGS_ALL)
-			flags = (NMSettingSecretFlags) tmp;
-	}
-	g_free (flag_name);
+	nm_vpn_service_plugin_get_secret_flags (vpn_data, secret_name, &flags);
 	g_hash_table_unref (vpn_data);
 
 	return flags;
diff --git a/clients/common/nm-vpn-helpers.c b/clients/common/nm-vpn-helpers.c
index 370e128c..36e8e6b2 100644
--- a/clients/common/nm-vpn-helpers.c
+++ b/clients/common/nm-vpn-helpers.c
@@ -26,184 +26,53 @@
 #include "config.h"
 
 #include <string.h>
-#include <glib.h>
 #include <gmodule.h>
-#include <glib/gi18n-lib.h>
-
-#include <NetworkManager.h>
 
+#include "nm-default.h"
 #include "nm-utils.h"
 #include "nm-vpn-helpers.h"
-#include "nm-glib-compat.h"
-
-#define VPN_NAME_FILES_DIR NMCONFDIR "/VPN"
-#define DEFAULT_DIR_LIB    NMLIBDIR"/VPN"
-
-static gboolean plugins_loaded = FALSE;
-static GHashTable *plugins_hash = NULL;
-static GSList *plugins_list = NULL;
 
+#include "nm-macros-internal.h"
 
-GQuark nm_vpn_error_quark (void);
-G_DEFINE_QUARK (NM_VPN_ERROR, nm_vpn_error)
-#define NM_VPN_ERROR nm_vpn_error_quark ()
-#define NM_VPN_ERROR_GENERIC 0
+static gboolean plugins_loaded;
+static GSList *plugins = NULL;
 
 NMVpnEditorPlugin *
-nm_vpn_get_plugin_by_service (const char *service)
+nm_vpn_get_plugin_by_service (const char *service, GError **error)
 {
-	NMVpnEditorPlugin *plugin;
-	const char *str;
-	char *tmp = NULL;
+	NMVpnEditorPlugin *plugin = NULL;
+	NMVpnPluginInfo *plugin_info;
+	char *type = NULL;
 
 	g_return_val_if_fail (service != NULL, NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
 	if (G_UNLIKELY (!plugins_loaded))
-		nm_vpn_get_plugins (NULL);
-
-	if (!plugins_hash)
-		return NULL;
-
-	if (g_str_has_prefix (service, NM_DBUS_SERVICE))
-		str = service;
-	else
-		str = tmp = g_strdup_printf ("%s.%s", NM_DBUS_SERVICE, service);
-
-	plugin = g_hash_table_lookup (plugins_hash, str);
-	g_free (tmp);
-
+		nm_vpn_get_plugins ();
+
+	if (!g_str_has_prefix (service, NM_DBUS_INTERFACE))
+		service = type = g_strdup_printf ("%s.%s", NM_DBUS_INTERFACE, service);
+
+	plugin_info = nm_vpn_plugin_info_list_find_by_service (plugins, service);
+	if (plugin_info) {
+		plugin = nm_vpn_plugin_info_get_editor_plugin (plugin_info);
+		if (!plugin)
+			plugin = nm_vpn_plugin_info_load_editor_plugin (plugin_info, error);
+	} else
+		g_set_error_literal (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED,
+		                     _("could not get VPN plugin info"));
+	g_free (type);
 	return plugin;
 }
 
 GSList *
-nm_vpn_get_plugins (GError **error)
+nm_vpn_get_plugins (void)
 {
-	GDir *dir;
-	const char *f;
-	GHashTableIter iter;
-	NMVpnEditorPlugin *plugin;
-
-	if (error)
-		g_return_val_if_fail (*error == NULL, NULL);
-
 	if (G_LIKELY (plugins_loaded))
-		return plugins_list;
-
+		return plugins;
 	plugins_loaded = TRUE;
-
-	dir = g_dir_open (VPN_NAME_FILES_DIR, 0, NULL);
-	if (!dir) {
-		g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "Couldn't read VPN .name files directory " VPN_NAME_FILES_DIR ".");
-		return NULL;
-	}
-
-	plugins_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
-	                                      (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref);
-
-	while ((f = g_dir_read_name (dir))) {
-		char *path = NULL, *service = NULL;
-		char *so_path = NULL, *so_name = NULL;
-		GKeyFile *keyfile = NULL;
-		GModule *module = NULL;
-		NMVpnEditorPluginFactory factory = NULL;
-
-		if (!g_str_has_suffix (f, ".name"))
-			continue;
-
-		path = g_strdup_printf ("%s/%s", VPN_NAME_FILES_DIR, f);
-
-		keyfile = g_key_file_new ();
-		if (!g_key_file_load_from_file (keyfile, path, 0, NULL))
-			goto next;
-
-		service = g_key_file_get_string (keyfile, "VPN Connection", "service", NULL);
-		if (!service)
-			goto next;
-
-		so_path = g_key_file_get_string (keyfile,  "libnm", "plugin", NULL);
-		if (!so_path)
-			goto next;
-
-		if (g_path_is_absolute (so_path))
-			module = g_module_open (so_path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
-
-		if (!module) {
-			/* Remove any path and extension components, then reconstruct path
-			 * to the SO in LIBDIR
-			 */
-			so_name = g_path_get_basename (so_path);
-			g_free (so_path);
-			so_path = g_strdup_printf ("%s/NetworkManager/%s", NMLIBDIR, so_name);
-			g_free (so_name);
-
-			module = g_module_open (so_path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
-			if (!module) {
-				g_clear_error (error);
-				g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "Cannot load the VPN plugin which provides the "
-				             "service '%s'.", service);
-				goto next;
-			}
-		}
-
-		if (g_module_symbol (module, "nm_vpn_editor_plugin_factory", (gpointer) &factory)) {
-			GError *factory_error = NULL;
-			gboolean success = FALSE;
-
-			plugin = factory (&factory_error);
-			if (plugin) {
-				char *plug_name = NULL, *plug_service = NULL;
-
-				/* Validate plugin properties */
-				g_object_get (G_OBJECT (plugin),
-				              NM_VPN_EDITOR_PLUGIN_NAME, &plug_name,
-				              NM_VPN_EDITOR_PLUGIN_SERVICE, &plug_service,
-				              NULL);
-				if (!plug_name || !strlen (plug_name)) {
-					g_clear_error (error);
-					g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "cannot load VPN plugin in '%s': missing plugin name", 
-					             g_module_name (module));
-				} else if (!plug_service || strcmp (plug_service, service)) {
-					g_clear_error (error);
-					g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "cannot load VPN plugin in '%s': invalid service name", 
-					             g_module_name (module));
-				} else {
-					/* Success! */
-					g_object_set_data_full (G_OBJECT (plugin), "gmodule", module,
-					                        (GDestroyNotify) g_module_close);
-					g_hash_table_insert (plugins_hash, g_strdup (service), plugin);
-					success = TRUE;
-				}
-				g_free (plug_name);
-				g_free (plug_service);
-			} else {
-				g_clear_error (error);
-				g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "cannot load VPN plugin in '%s': %s", 
-				             g_module_name (module), g_module_error ());
-			}
-
-			if (!success)
-				g_module_close (module);
-		} else {
-			g_clear_error (error);
-			g_set_error (error, NM_VPN_ERROR, NM_VPN_ERROR_GENERIC, "cannot locate nm_vpn_editor_plugin_factory() in '%s': %s", 
-			             g_module_name (module), g_module_error ());
-			g_module_close (module);
-		}
-
-	next:
-		g_free (so_path);
-		g_free (service);
-		g_key_file_free (keyfile);
-		g_free (path);
-	}
-	g_dir_close (dir);
-
-	/* Copy hash to list */
-	g_hash_table_iter_init (&iter, plugins_hash);
-	while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &plugin))
-		plugins_list = g_slist_prepend (plugins_list, plugin);
-
-	return plugins_list;
+	plugins = nm_vpn_plugin_info_list_load ();
+	return plugins;
 }
 
 gboolean
@@ -220,11 +89,11 @@ nm_vpn_supports_ipv6 (NMConnection *connection)
 	service_type = nm_setting_vpn_get_service_type (s_vpn);
 	g_return_val_if_fail (service_type != NULL, FALSE);
 
-	plugin = nm_vpn_get_plugin_by_service (service_type);
+	plugin = nm_vpn_get_plugin_by_service (service_type, NULL);
 	g_return_val_if_fail (plugin != NULL, FALSE);
 
 	capabilities = nm_vpn_editor_plugin_get_capabilities (plugin);
-	return (capabilities & NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6) != 0;
+	return NM_FLAGS_HAS (capabilities, NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
 }
 
 const VpnPasswordName *
diff --git a/clients/common/nm-vpn-helpers.h b/clients/common/nm-vpn-helpers.h
index 6b3396ef..4f8d2194 100644
--- a/clients/common/nm-vpn-helpers.h
+++ b/clients/common/nm-vpn-helpers.h
@@ -19,19 +19,18 @@
 #ifndef __NM_VPN_HELPERS_H__
 #define __NM_VPN_HELPERS_H__
 
-#include <glib.h>
 #include <NetworkManager.h>
 
-#include <nm-vpn-editor-plugin.h>
+#include "nm-default.h"
 
 struct {
 	const char *name;
 	const char *ui_name;
 } typedef VpnPasswordName;
 
-GSList *nm_vpn_get_plugins (GError **error);
+GSList *nm_vpn_get_plugins (void);
 
-NMVpnEditorPlugin *nm_vpn_get_plugin_by_service (const char *service);
+NMVpnEditorPlugin *nm_vpn_get_plugin_by_service (const char *service, GError **error);
 
 gboolean nm_vpn_supports_ipv6 (NMConnection *connection);
 
diff --git a/clients/nm-online.c b/clients/nm-online.c
index 5a818bae..c02f9cc9 100644
--- a/clients/nm-online.c
+++ b/clients/nm-online.c
@@ -38,10 +38,10 @@
 #include <getopt.h>
 #include <locale.h>
 
-#include <glib/gi18n.h>
-
 #include <NetworkManager.h>
 
+#include "nm-default.h"
+
 #define PROGRESS_STEPS 15
 #define WAIT_STARTUP_TAG "wait-startup"
 
@@ -188,9 +188,7 @@ main (int argc, char *argv[])
 	}
 	remaining_ms = t_secs * 1000;
 
-#if !GLIB_CHECK_VERSION (2, 35, 0)
-	g_type_init ();
-#endif
+	nm_g_type_init ();
 
 	client = nm_client_new (NULL, &error);
 	if (!client) {
diff --git a/clients/tui/Makefile.am b/clients/tui/Makefile.am
index a84fcdff..caf792ee 100644
--- a/clients/tui/Makefile.am
+++ b/clients/tui/Makefile.am
@@ -4,8 +4,8 @@ SUBDIRS = newt .
 
 AM_CPPFLAGS= \
 	-I$(top_srcdir) \
-	-I$(top_srcdir)/include \
-	-I$(top_builddir)/include \
+	-I$(top_srcdir)/shared \
+	-I$(top_builddir)/shared \
 	-I$(top_srcdir)/libnm-core \
 	-I$(top_builddir)/libnm-core \
 	-I$(top_srcdir)/libnm \
@@ -18,8 +18,6 @@ AM_CPPFLAGS= \
 	-DG_LOG_DOMAIN=\""nmtui"\" \
 	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
 	-DLOCALEDIR=\""$(localedir)"\" \
-	-DNMCONFDIR=\"$(nmconfdir)\" \
-	-DNMLIBDIR=\"$(libdir)\" \
 	$(NULL)
 
 bin_PROGRAMS = nmtui
@@ -27,12 +25,12 @@ links = nmtui-edit nmtui-connect nmtui-hostname
 
 install-exec-hook:
 	for link in $(links); do \
-		ln -f $(DESTDIR)$(bindir)/nmtui $(DESTDIR)$(bindir)/$$link; \
+		$(LN_S) -f nmtui "$(DESTDIR)$(bindir)/$$link"; \
 	done
 
 uninstall-hook:
 	for link in $(links); do \
-		rm -f $(DESTDIR)$(bindir)/$$link; \
+		rm -f "$(DESTDIR)$(bindir)/$$link"; \
 	done
 
 nmtui_SOURCES = \
diff --git a/clients/tui/Makefile.in b/clients/tui/Makefile.in
index 866ae462..f489995d 100644
--- a/clients/tui/Makefile.in
+++ b/clients/tui/Makefile.in
@@ -311,7 +311,6 @@ BLUEZ5_LIBS = @BLUEZ5_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CKDB_PATH = @CKDB_PATH@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
 CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
@@ -323,8 +322,6 @@ CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DBUS_CFLAGS = @DBUS_CFLAGS@
-DBUS_GLIB_100_CFLAGS = @DBUS_GLIB_100_CFLAGS@
-DBUS_GLIB_100_LIBS = @DBUS_GLIB_100_LIBS@
 DBUS_LIBS = @DBUS_LIBS@
 DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
@@ -334,6 +331,7 @@ DHCPCD_PATH = @DHCPCD_PATH@
 DISTRO_NETWORK_SERVICE = @DISTRO_NETWORK_SERVICE@
 DLLTOOL = @DLLTOOL@
 DNSMASQ_PATH = @DNSMASQ_PATH@
+DNSSEC_TRIGGER_SCRIPT = @DNSSEC_TRIGGER_SCRIPT@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -388,16 +386,13 @@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
-IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
-IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAUDIT_CFLAGS = @LIBAUDIT_CFLAGS@
+LIBAUDIT_LIBS = @LIBAUDIT_LIBS@
 LIBDL = @LIBDL@
-LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
-LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
-LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBM = @LIBM@
@@ -434,6 +429,8 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
+NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
@@ -462,7 +459,6 @@ POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
 PPPD_PATH = @PPPD_PATH@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
-PPPOE_PATH = @PPPOE_PATH@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
@@ -477,6 +473,8 @@ SYSTEMD_200_CFLAGS = @SYSTEMD_200_CFLAGS@
 SYSTEMD_200_LIBS = @SYSTEMD_200_LIBS@
 SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
 SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_JOURNAL_CFLAGS = @SYSTEMD_JOURNAL_CFLAGS@
+SYSTEMD_JOURNAL_LIBS = @SYSTEMD_JOURNAL_LIBS@
 SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
 SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
@@ -537,6 +535,7 @@ mkdir_p = @mkdir_p@
 nmbinary = @nmbinary@
 nmconfdir = @nmconfdir@
 nmdatadir = @nmdatadir@
+nmlibdir = @nmlibdir@
 nmrundir = @nmrundir@
 nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
@@ -544,6 +543,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -562,8 +562,8 @@ with_valgrind = @with_valgrind@
 @BUILD_NMTUI_TRUE@SUBDIRS = newt .
 @BUILD_NMTUI_TRUE@AM_CPPFLAGS = \
 @BUILD_NMTUI_TRUE@	-I$(top_srcdir) \
-@BUILD_NMTUI_TRUE@	-I$(top_srcdir)/include \
-@BUILD_NMTUI_TRUE@	-I$(top_builddir)/include \
+@BUILD_NMTUI_TRUE@	-I$(top_srcdir)/shared \
+@BUILD_NMTUI_TRUE@	-I$(top_builddir)/shared \
 @BUILD_NMTUI_TRUE@	-I$(top_srcdir)/libnm-core \
 @BUILD_NMTUI_TRUE@	-I$(top_builddir)/libnm-core \
 @BUILD_NMTUI_TRUE@	-I$(top_srcdir)/libnm \
@@ -576,8 +576,6 @@ with_valgrind = @with_valgrind@
 @BUILD_NMTUI_TRUE@	-DG_LOG_DOMAIN=\""nmtui"\" \
 @BUILD_NMTUI_TRUE@	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
 @BUILD_NMTUI_TRUE@	-DLOCALEDIR=\""$(localedir)"\" \
-@BUILD_NMTUI_TRUE@	-DNMCONFDIR=\"$(nmconfdir)\" \
-@BUILD_NMTUI_TRUE@	-DNMLIBDIR=\"$(libdir)\" \
 @BUILD_NMTUI_TRUE@	$(NULL)
 
 @BUILD_NMTUI_TRUE@links = nmtui-edit nmtui-connect nmtui-hostname
@@ -1156,12 +1154,12 @@ uninstall-am: uninstall-binPROGRAMS
 
 @BUILD_NMTUI_TRUE@install-exec-hook:
 @BUILD_NMTUI_TRUE@	for link in $(links); do \
-@BUILD_NMTUI_TRUE@		ln -f $(DESTDIR)$(bindir)/nmtui $(DESTDIR)$(bindir)/$$link; \
+@BUILD_NMTUI_TRUE@		$(LN_S) -f nmtui "$(DESTDIR)$(bindir)/$$link"; \
 @BUILD_NMTUI_TRUE@	done
 
 @BUILD_NMTUI_TRUE@uninstall-hook:
 @BUILD_NMTUI_TRUE@	for link in $(links); do \
-@BUILD_NMTUI_TRUE@		rm -f $(DESTDIR)$(bindir)/$$link; \
+@BUILD_NMTUI_TRUE@		rm -f "$(DESTDIR)$(bindir)/$$link"; \
 @BUILD_NMTUI_TRUE@	done
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/clients/tui/newt/Makefile.am b/clients/tui/newt/Makefile.am
index e572238b..e07f9bef 100644
--- a/clients/tui/newt/Makefile.am
+++ b/clients/tui/newt/Makefile.am
@@ -1,5 +1,8 @@
 AM_CPPFLAGS= \
-	-I$(top_srcdir)/include \
+	-I$(top_srcdir)/shared \
+	-I$(top_builddir)/shared \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
 	-DG_LOG_DOMAIN=\""nmtui"\" \
 	$(GLIB_CFLAGS) \
 	$(NEWT_CFLAGS) \
diff --git a/clients/tui/newt/Makefile.in b/clients/tui/newt/Makefile.in
index ab647863..f1c579cb 100644
--- a/clients/tui/newt/Makefile.in
+++ b/clients/tui/newt/Makefile.in
@@ -212,7 +212,6 @@ BLUEZ5_LIBS = @BLUEZ5_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CKDB_PATH = @CKDB_PATH@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
 CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
@@ -224,8 +223,6 @@ CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DBUS_CFLAGS = @DBUS_CFLAGS@
-DBUS_GLIB_100_CFLAGS = @DBUS_GLIB_100_CFLAGS@
-DBUS_GLIB_100_LIBS = @DBUS_GLIB_100_LIBS@
 DBUS_LIBS = @DBUS_LIBS@
 DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
@@ -235,6 +232,7 @@ DHCPCD_PATH = @DHCPCD_PATH@
 DISTRO_NETWORK_SERVICE = @DISTRO_NETWORK_SERVICE@
 DLLTOOL = @DLLTOOL@
 DNSMASQ_PATH = @DNSMASQ_PATH@
+DNSSEC_TRIGGER_SCRIPT = @DNSSEC_TRIGGER_SCRIPT@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -289,16 +287,13 @@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
-IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
-IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAUDIT_CFLAGS = @LIBAUDIT_CFLAGS@
+LIBAUDIT_LIBS = @LIBAUDIT_LIBS@
 LIBDL = @LIBDL@
-LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
-LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
-LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBM = @LIBM@
@@ -335,6 +330,8 @@ NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
 NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
+NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
@@ -363,7 +360,6 @@ POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
 PPPD_PATH = @PPPD_PATH@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
-PPPOE_PATH = @PPPOE_PATH@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
@@ -378,6 +374,8 @@ SYSTEMD_200_CFLAGS = @SYSTEMD_200_CFLAGS@
 SYSTEMD_200_LIBS = @SYSTEMD_200_LIBS@
 SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
 SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_JOURNAL_CFLAGS = @SYSTEMD_JOURNAL_CFLAGS@
+SYSTEMD_JOURNAL_LIBS = @SYSTEMD_JOURNAL_LIBS@
 SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
 SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
@@ -438,6 +436,7 @@ mkdir_p = @mkdir_p@
 nmbinary = @nmbinary@
 nmconfdir = @nmconfdir@
 nmdatadir = @nmdatadir@
+nmlibdir = @nmlibdir@
 nmrundir = @nmrundir@
 nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
@@ -445,6 +444,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -461,7 +461,10 @@ with_netconfig = @with_netconfig@
 with_resolvconf = @with_resolvconf@
 with_valgrind = @with_valgrind@
 AM_CPPFLAGS = \
-	-I$(top_srcdir)/include \
+	-I$(top_srcdir)/shared \
+	-I$(top_builddir)/shared \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
 	-DG_LOG_DOMAIN=\""nmtui"\" \
 	$(GLIB_CFLAGS) \
 	$(NEWT_CFLAGS) \
diff --git a/clients/tui/newt/nmt-newt-form.c b/clients/tui/newt/nmt-newt-form.c
index 19bd3998..ce401e25 100644
--- a/clients/tui/newt/nmt-newt-form.c
+++ b/clients/tui/newt/nmt-newt-form.c
@@ -30,8 +30,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-newt-form.h"
 #include "nmt-newt-button.h"
 #include "nmt-newt-grid.h"
diff --git a/clients/tui/newt/nmt-newt-popup.c b/clients/tui/newt/nmt-newt-popup.c
index b604eaaa..f7813063 100644
--- a/clients/tui/newt/nmt-newt-popup.c
+++ b/clients/tui/newt/nmt-newt-popup.c
@@ -28,8 +28,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-newt-popup.h"
 #include "nmt-newt-form.h"
 #include "nmt-newt-hacks.h"
diff --git a/clients/tui/newt/nmt-newt-types.h b/clients/tui/newt/nmt-newt-types.h
index 608f7ff6..4ea0a7b8 100644
--- a/clients/tui/newt/nmt-newt-types.h
+++ b/clients/tui/newt/nmt-newt-types.h
@@ -19,9 +19,9 @@
 #ifndef NMT_NEWT_TYPES_H
 #define NMT_NEWT_TYPES_H
 
-#include <glib-object.h>
 #include <newt.h>
-#include "nm-glib-compat.h"
+
+#include "nm-default.h"
 
 G_BEGIN_DECLS
 
diff --git a/clients/tui/newt/nmt-newt-utils.c b/clients/tui/newt/nmt-newt-utils.c
index 70a65a84..841144d8 100644
--- a/clients/tui/newt/nmt-newt-utils.c
+++ b/clients/tui/newt/nmt-newt-utils.c
@@ -28,9 +28,7 @@
 #include <unistd.h>
 #include <sys/wait.h>
 
-#include <glib/gi18n-lib.h>
-
-#include "nm-glib-compat.h"
+#include "nm-default.h"
 #include "nmt-newt-utils.h"
 
 static void
diff --git a/clients/tui/newt/nmt-newt-utils.h b/clients/tui/newt/nmt-newt-utils.h
index 3b37868a..706f10d3 100644
--- a/clients/tui/newt/nmt-newt-utils.h
+++ b/clients/tui/newt/nmt-newt-utils.h
@@ -20,7 +20,8 @@
 #define NMT_NEWT_UTILS_H
 
 #include <newt.h>
-#include <glib.h>
+
+#include "nm-default.h"
 
 G_BEGIN_DECLS
 
diff --git a/clients/tui/nm-editor-bindings.c b/clients/tui/nm-editor-bindings.c
index 9218c31f..a21ed666 100644
--- a/clients/tui/nm-editor-bindings.c
+++ b/clients/tui/nm-editor-bindings.c
@@ -33,7 +33,6 @@
 #include <string.h>
 
 #include "nm-editor-bindings.h"
-#include "nm-gvaluearray-compat.h"
 
 static void
 value_transform_string_int (const GValue *src_value,
diff --git a/clients/tui/nm-editor-utils.c b/clients/tui/nm-editor-utils.c
index fa2a2752..026ef231 100644
--- a/clients/tui/nm-editor-utils.c
+++ b/clients/tui/nm-editor-utils.c
@@ -27,9 +27,9 @@
 
 #include "config.h"
 
-#include <glib/gi18n.h>
 #include <NetworkManager.h>
 
+#include "nm-default.h"
 #include "nm-editor-utils.h"
 #if 0
 #include "nm-vpn-helpers.h"
@@ -224,7 +224,7 @@ nm_editor_utils_get_connection_type_list (void)
 
 #if 0
 	/* Add "VPN" only if there are plugins */
-	vpn_plugins_hash = nm_vpn_get_plugins (NULL);
+	vpn_plugins_hash = nm_vpn_get_plugins ();
 	have_vpn_plugins  = vpn_plugins_hash && g_hash_table_size (vpn_plugins_hash);
 	if (have_vpn_plugins) {
 		GHashTableIter iter;
diff --git a/clients/tui/nmt-address-list.c b/clients/tui/nmt-address-list.c
index 42873c52..3faf3442 100644
--- a/clients/tui/nmt-address-list.c
+++ b/clients/tui/nmt-address-list.c
@@ -35,8 +35,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-address-list.h"
 #include "nmt-ip-entry.h"
 
diff --git a/clients/tui/nmt-connect-connection-list.c b/clients/tui/nmt-connect-connection-list.c
index 88502ba7..c21cc5be 100644
--- a/clients/tui/nmt-connect-connection-list.c
+++ b/clients/tui/nmt-connect-connection-list.c
@@ -27,7 +27,6 @@
 #include "config.h"
 
 #include <stdlib.h>
-#include <glib/gi18n-lib.h>
 
 #include <NetworkManager.h>
 
diff --git a/clients/tui/nmt-device-entry.c b/clients/tui/nmt-device-entry.c
index 2af5e584..2760b149 100644
--- a/clients/tui/nmt-device-entry.c
+++ b/clients/tui/nmt-device-entry.c
@@ -40,7 +40,6 @@
 #include <sys/socket.h>
 #include <linux/if_arp.h>
 
-#include <glib/gi18n-lib.h>
 #include <NetworkManager.h>
 
 #include "nmtui.h"
diff --git a/clients/tui/nmt-edit-connection-list.c b/clients/tui/nmt-edit-connection-list.c
index e1b982dd..72e8c706 100644
--- a/clients/tui/nmt-edit-connection-list.c
+++ b/clients/tui/nmt-edit-connection-list.c
@@ -26,8 +26,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmtui.h"
 #include "nmtui-edit.h"
 #include "nmt-edit-connection-list.h"
diff --git a/clients/tui/nmt-editor-page.c b/clients/tui/nmt-editor-page.c
index a46d0ed4..f2afc8c7 100644
--- a/clients/tui/nmt-editor-page.c
+++ b/clients/tui/nmt-editor-page.c
@@ -26,8 +26,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-editor-page.h"
 
 G_DEFINE_ABSTRACT_TYPE (NmtEditorPage, nmt_editor_page, G_TYPE_OBJECT)
diff --git a/clients/tui/nmt-editor-section.c b/clients/tui/nmt-editor-section.c
index ff463f7f..b9a3ae83 100644
--- a/clients/tui/nmt-editor-section.c
+++ b/clients/tui/nmt-editor-section.c
@@ -25,8 +25,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-editor-section.h"
 #include "nmt-newt-toggle-button.h"
 
diff --git a/clients/tui/nmt-editor.c b/clients/tui/nmt-editor.c
index abc92866..aaa73cbe 100644
--- a/clients/tui/nmt-editor.c
+++ b/clients/tui/nmt-editor.c
@@ -27,10 +27,9 @@
 
 #include "nmt-editor.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
 #include <nm-utils.h>
 
+#include "nm-default.h"
 #include "nmtui.h"
 
 #include "nm-editor-utils.h"
diff --git a/clients/tui/nmt-ip-entry.c b/clients/tui/nmt-ip-entry.c
index 30c7e2e4..d31a1f46 100644
--- a/clients/tui/nmt-ip-entry.c
+++ b/clients/tui/nmt-ip-entry.c
@@ -33,8 +33,6 @@
 #include <netinet/in.h>
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-ip-entry.h"
 
 G_DEFINE_TYPE (NmtIPEntry, nmt_ip_entry, NMT_TYPE_NEWT_ENTRY)
diff --git a/clients/tui/nmt-mac-entry.h b/clients/tui/nmt-mac-entry.h
index 2e3e6cd1..099bacb7 100644
--- a/clients/tui/nmt-mac-entry.h
+++ b/clients/tui/nmt-mac-entry.h
@@ -19,6 +19,7 @@
 #ifndef NMT_MAC_ENTRY_H
 #define NMT_MAC_ENTRY_H
 
+#include "nm-default.h"
 #include "nm-utils.h"
 #include "nmt-newt.h"
 
diff --git a/clients/tui/nmt-mtu-entry.c b/clients/tui/nmt-mtu-entry.c
index f599557a..9f11af0a 100644
--- a/clients/tui/nmt-mtu-entry.c
+++ b/clients/tui/nmt-mtu-entry.c
@@ -34,8 +34,6 @@
 
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-mtu-entry.h"
 
 G_DEFINE_TYPE (NmtMtuEntry, nmt_mtu_entry, NMT_TYPE_NEWT_GRID)
diff --git a/clients/tui/nmt-page-bond.c b/clients/tui/nmt-page-bond.c
index b043b513..ecc9aefc 100644
--- a/clients/tui/nmt-page-bond.c
+++ b/clients/tui/nmt-page-bond.c
@@ -27,9 +27,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-bond.h"
 
 #include "nmt-address-list.h"
diff --git a/clients/tui/nmt-page-bridge-port.c b/clients/tui/nmt-page-bridge-port.c
index c9ef14ed..fdf44039 100644
--- a/clients/tui/nmt-page-bridge-port.c
+++ b/clients/tui/nmt-page-bridge-port.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-bridge-port.h"
 
 G_DEFINE_TYPE (NmtPageBridgePort, nmt_page_bridge_port, NMT_TYPE_EDITOR_PAGE)
diff --git a/clients/tui/nmt-page-bridge.c b/clients/tui/nmt-page-bridge.c
index 460be60b..e9b0e66d 100644
--- a/clients/tui/nmt-page-bridge.c
+++ b/clients/tui/nmt-page-bridge.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-bridge.h"
 
 #include "nmt-address-list.h"
@@ -91,6 +89,12 @@ nmt_page_bridge_constructed (GObject *object)
 	label = nmt_newt_label_new (_("seconds"));
 	nmt_editor_grid_append (grid, _("Aging time"), widget, label);
 
+	widget = nmt_newt_checkbox_new (_("Enable IGMP snooping"));
+	g_object_bind_property (s_bridge, NM_SETTING_BRIDGE_MULTICAST_SNOOPING,
+	                        widget, "active",
+	                        G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+	nmt_editor_grid_append (grid, NULL, widget, NULL);
+
 	widget = stp = nmt_newt_checkbox_new (_("Enable STP (Spanning Tree Protocol)"));
 	g_object_bind_property (s_bridge, NM_SETTING_BRIDGE_STP,
 	                        widget, "active",
diff --git a/clients/tui/nmt-page-dsl.c b/clients/tui/nmt-page-dsl.c
index 1d476aa0..2346b496 100644
--- a/clients/tui/nmt-page-dsl.c
+++ b/clients/tui/nmt-page-dsl.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-dsl.h"
 #include "nmt-page-ethernet.h"
 #include "nmt-page-ppp.h"
diff --git a/clients/tui/nmt-page-dsl.h b/clients/tui/nmt-page-dsl.h
index b938ead2..dc84ca07 100644
--- a/clients/tui/nmt-page-dsl.h
+++ b/clients/tui/nmt-page-dsl.h
@@ -19,6 +19,7 @@
 #ifndef NMT_PAGE_DSL_H
 #define NMT_PAGE_DSL_H
 
+#include "nm-default.h"
 #include "nmt-editor-page-device.h"
 
 G_BEGIN_DECLS
diff --git a/clients/tui/nmt-page-ethernet.c b/clients/tui/nmt-page-ethernet.c
index cf4ef2c4..fed81f1c 100644
--- a/clients/tui/nmt-page-ethernet.c
+++ b/clients/tui/nmt-page-ethernet.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-ethernet.h"
 #include "nmt-mac-entry.h"
 #include "nmt-mtu-entry.h"
diff --git a/clients/tui/nmt-page-infiniband.c b/clients/tui/nmt-page-infiniband.c
index f39b0b84..e10c5a7a 100644
--- a/clients/tui/nmt-page-infiniband.c
+++ b/clients/tui/nmt-page-infiniband.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-infiniband.h"
 #include "nmt-mtu-entry.h"
 
diff --git a/clients/tui/nmt-page-ip4.c b/clients/tui/nmt-page-ip4.c
index c7009e2f..2cc4f6af 100644
--- a/clients/tui/nmt-page-ip4.c
+++ b/clients/tui/nmt-page-ip4.c
@@ -25,9 +25,7 @@
 
 #include <stdlib.h>
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-ip4.h"
 #include "nmt-ip-entry.h"
 #include "nmt-address-list.h"
diff --git a/clients/tui/nmt-page-ip6.c b/clients/tui/nmt-page-ip6.c
index 122c37f6..e547122b 100644
--- a/clients/tui/nmt-page-ip6.c
+++ b/clients/tui/nmt-page-ip6.c
@@ -25,9 +25,7 @@
 
 #include <stdlib.h>
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-ip6.h"
 #include "nmt-ip-entry.h"
 #include "nmt-address-list.h"
diff --git a/clients/tui/nmt-page-ppp.c b/clients/tui/nmt-page-ppp.c
index cec36549..662ebd9c 100644
--- a/clients/tui/nmt-page-ppp.c
+++ b/clients/tui/nmt-page-ppp.c
@@ -25,9 +25,7 @@
 
 #include <stdlib.h>
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-ppp.h"
 #include "nmt-newt-section.h"
 #include "nmt-newt-separator.h"
diff --git a/clients/tui/nmt-page-team-port.c b/clients/tui/nmt-page-team-port.c
index 645dc9d3..797c1cf1 100644
--- a/clients/tui/nmt-page-team-port.c
+++ b/clients/tui/nmt-page-team-port.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-team-port.h"
 
 G_DEFINE_TYPE (NmtPageTeamPort, nmt_page_team_port, NMT_TYPE_EDITOR_PAGE)
diff --git a/clients/tui/nmt-page-team.c b/clients/tui/nmt-page-team.c
index e520b02a..572941b6 100644
--- a/clients/tui/nmt-page-team.c
+++ b/clients/tui/nmt-page-team.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-team.h"
 
 #include "nmt-slave-list.h"
diff --git a/clients/tui/nmt-page-team.h b/clients/tui/nmt-page-team.h
index 2d8bf07a..994b63d3 100644
--- a/clients/tui/nmt-page-team.h
+++ b/clients/tui/nmt-page-team.h
@@ -19,6 +19,7 @@
 #ifndef NMT_PAGE_TEAM_H
 #define NMT_PAGE_TEAM_H
 
+#include "nm-default.h"
 #include "nmt-editor-page-device.h"
 
 G_BEGIN_DECLS
diff --git a/clients/tui/nmt-page-vlan.c b/clients/tui/nmt-page-vlan.c
index 9b9c8f52..d392c552 100644
--- a/clients/tui/nmt-page-vlan.c
+++ b/clients/tui/nmt-page-vlan.c
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nm-editor-bindings.h"
 
 #include "nmt-page-vlan.h"
diff --git a/clients/tui/nmt-page-wifi.c b/clients/tui/nmt-page-wifi.c
index 9cd20abf..c4b085ea 100644
--- a/clients/tui/nmt-page-wifi.c
+++ b/clients/tui/nmt-page-wifi.c
@@ -29,9 +29,7 @@
 
 #include <stdlib.h>
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-page-wifi.h"
 #include "nmt-mac-entry.h"
 #include "nmt-mtu-entry.h"
diff --git a/clients/tui/nmt-password-dialog.c b/clients/tui/nmt-password-dialog.c
index bf29dcf5..8eca7dc0 100644
--- a/clients/tui/nmt-password-dialog.c
+++ b/clients/tui/nmt-password-dialog.c
@@ -26,8 +26,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-password-dialog.h"
 #include "nm-secret-agent-simple.h"
 #include "nmtui.h"
diff --git a/clients/tui/nmt-password-fields.c b/clients/tui/nmt-password-fields.c
index 7ef037b9..cba64935 100644
--- a/clients/tui/nmt-password-fields.c
+++ b/clients/tui/nmt-password-fields.c
@@ -27,8 +27,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-password-fields.h"
 
 G_DEFINE_TYPE (NmtPasswordFields, nmt_password_fields, NMT_TYPE_NEWT_GRID)
diff --git a/clients/tui/nmt-route-editor.c b/clients/tui/nmt-route-editor.c
index 77bbec76..dc4d118b 100644
--- a/clients/tui/nmt-route-editor.c
+++ b/clients/tui/nmt-route-editor.c
@@ -27,9 +27,7 @@
 
 #include "config.h"
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
+#include "nm-default.h"
 #include "nmt-route-editor.h"
 #include "nmt-route-table.h"
 
diff --git a/clients/tui/nmt-route-entry.c b/clients/tui/nmt-route-entry.c
index 3a875520..1cc99940 100644
--- a/clients/tui/nmt-route-entry.c
+++ b/clients/tui/nmt-route-entry.c
@@ -32,7 +32,6 @@
 #include <netinet/in.h>
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
 #include <NetworkManager.h>
 
 #include "nmt-route-entry.h"
diff --git a/clients/tui/nmt-route-table.c b/clients/tui/nmt-route-table.c
index 523d8ee3..0731acb6 100644
--- a/clients/tui/nmt-route-table.c
+++ b/clients/tui/nmt-route-table.c
@@ -30,7 +30,6 @@
 #include <netinet/in.h>
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
 #include <NetworkManager.h>
 
 #include "nmt-route-table.h"
diff --git a/clients/tui/nmt-slave-list.c b/clients/tui/nmt-slave-list.c
index 9c8596f7..5a9b7482 100644
--- a/clients/tui/nmt-slave-list.c
+++ b/clients/tui/nmt-slave-list.c
@@ -26,7 +26,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
 #include <NetworkManager.h>
 
 #include "nmt-slave-list.h"
diff --git a/clients/tui/nmt-utils.h b/clients/tui/nmt-utils.h
index 7e24fcab..5531dbeb 100644
--- a/clients/tui/nmt-utils.h
+++ b/clients/tui/nmt-utils.h
@@ -19,7 +19,7 @@
 #ifndef NMT_UTILS_H
 #define NMT_UTILS_H
 
-#include <glib-object.h>
+#include "nm-default.h"
 
 G_BEGIN_DECLS
 
diff --git a/clients/tui/nmt-widget-list.c b/clients/tui/nmt-widget-list.c
index 9159ed98..b314e146 100644
--- a/clients/tui/nmt-widget-list.c
+++ b/clients/tui/nmt-widget-list.c
@@ -37,8 +37,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-widget-list.h"
 #include "nmt-newt.h"
 
diff --git a/clients/tui/nmtui-connect.c b/clients/tui/nmtui-connect.c
index 9838b6fd..9d705bf1 100644
--- a/clients/tui/nmtui-connect.c
+++ b/clients/tui/nmtui-connect.c
@@ -28,10 +28,6 @@
 
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
-
-#include "gsystem-local-alloc.h"
-
 #include "nmt-newt.h"
 
 #include "nmtui.h"
diff --git a/clients/tui/nmtui-edit.c b/clients/tui/nmtui-edit.c
index 0c3206da..258b798a 100644
--- a/clients/tui/nmtui-edit.c
+++ b/clients/tui/nmtui-edit.c
@@ -27,7 +27,6 @@
 
 #include <stdlib.h>
 
-#include <glib/gi18n-lib.h>
 #include <NetworkManager.h>
 
 #include "nmtui.h"
diff --git a/clients/tui/nmtui-hostname.c b/clients/tui/nmtui-hostname.c
index 23de95b8..f77a918b 100644
--- a/clients/tui/nmtui-hostname.c
+++ b/clients/tui/nmtui-hostname.c
@@ -25,8 +25,6 @@
 
 #include "config.h"
 
-#include <glib/gi18n-lib.h>
-
 #include "nmt-newt.h"
 
 #include "nmtui.h"
diff --git a/clients/tui/nmtui.c b/clients/tui/nmtui.c
index 0fac98eb..20e7d02b 100644
--- a/clients/tui/nmtui.c
+++ b/clients/tui/nmtui.c
@@ -30,11 +30,9 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
 #include <NetworkManager.h>
 
+#include "nm-default.h"
 #include "nmt-newt.h"
 #include "nm-editor-bindings.h"