summary refs log tree commit diff
path: root/libnm-util
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-util')
-rw-r--r--libnm-util/Makefile.am11
-rw-r--r--libnm-util/Makefile.in107
-rw-r--r--libnm-util/libnm-util.ver28
-rw-r--r--libnm-util/nm-connection.c366
-rw-r--r--libnm-util/nm-connection.h4
-rw-r--r--libnm-util/nm-setting-8021x.c8
-rw-r--r--libnm-util/nm-setting-adsl.c7
-rw-r--r--libnm-util/nm-setting-bluetooth.c9
-rw-r--r--libnm-util/nm-setting-bond.c36
-rw-r--r--libnm-util/nm-setting-bridge-port.c281
-rw-r--r--libnm-util/nm-setting-bridge-port.h86
-rw-r--r--libnm-util/nm-setting-bridge.c498
-rw-r--r--libnm-util/nm-setting-bridge.h98
-rw-r--r--libnm-util/nm-setting-cdma.c7
-rw-r--r--libnm-util/nm-setting-connection.c133
-rw-r--r--libnm-util/nm-setting-connection.h7
-rw-r--r--libnm-util/nm-setting-gsm.c18
-rw-r--r--libnm-util/nm-setting-gsm.h8
-rw-r--r--libnm-util/nm-setting-infiniband.c8
-rw-r--r--libnm-util/nm-setting-ip4-config.c17
-rw-r--r--libnm-util/nm-setting-ip6-config.c56
-rw-r--r--libnm-util/nm-setting-ip6-config.h3
-rw-r--r--libnm-util/nm-setting-olpc-mesh.c8
-rw-r--r--libnm-util/nm-setting-ppp.c8
-rw-r--r--libnm-util/nm-setting-pppoe.c7
-rw-r--r--libnm-util/nm-setting-private.h12
-rw-r--r--libnm-util/nm-setting-serial.c8
-rw-r--r--libnm-util/nm-setting-vlan.c80
-rw-r--r--libnm-util/nm-setting-vlan.h7
-rw-r--r--libnm-util/nm-setting-vpn.c7
-rw-r--r--libnm-util/nm-setting-wimax.c8
-rw-r--r--libnm-util/nm-setting-wired.c9
-rw-r--r--libnm-util/nm-setting-wireless-security.c14
-rw-r--r--libnm-util/nm-setting-wireless.c68
-rw-r--r--libnm-util/nm-setting-wireless.h8
-rw-r--r--libnm-util/nm-utils-enum-types.c45
-rw-r--r--libnm-util/nm-utils-enum-types.h4
-rw-r--r--libnm-util/nm-utils.c101
-rw-r--r--libnm-util/nm-utils.h7
-rw-r--r--libnm-util/tests/Makefile.am5
-rw-r--r--libnm-util/tests/Makefile.in331
-rw-r--r--libnm-util/tests/certs/Makefile.in57
-rw-r--r--libnm-util/tests/test-general.c1
43 files changed, 2024 insertions, 567 deletions
diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am
index 76acd99f..bd1b3fc0 100644
--- a/libnm-util/Makefile.am
+++ b/libnm-util/Makefile.am
@@ -1,6 +1,6 @@
 include $(GLIB_MAKEFILE)
 
-SUBDIRS=. tests
+SUBDIRS = . tests
 
 INCLUDES = -I${top_srcdir} -I${top_srcdir}/include -I${top_builddir}/include
 
@@ -9,8 +9,7 @@ lib_LTLIBRARIES=libnm-util.la
 libnm_util_la_CPPFLAGS = \
 	$(GLIB_CFLAGS) \
 	$(DBUS_CFLAGS) \
-	$(UUID_CFLAGS) \
-	-DG_DISABLE_DEPRECATED
+	$(UUID_CFLAGS)
 
 libnm_util_include_HEADERS = 		\
 	nm-connection.h			\
@@ -19,6 +18,8 @@ libnm_util_include_HEADERS = 		\
 	nm-setting-adsl.h		\
 	nm-setting-bluetooth.h		\
 	nm-setting-bond.h		\
+	nm-setting-bridge.h		\
+	nm-setting-bridge-port.h	\
 	nm-setting-connection.h		\
 	nm-setting-infiniband.h		\
 	nm-setting-ip4-config.h		\
@@ -53,6 +54,8 @@ libnm_util_la_csources = \
 	nm-setting-adsl.c		\
 	nm-setting-bluetooth.c		\
 	nm-setting-bond.c		\
+	nm-setting-bridge.c		\
+	nm-setting-bridge-port.c	\
 	nm-setting-connection.c		\
 	nm-setting-infiniband.c		\
 	nm-setting-ip4-config.c		\
@@ -165,7 +168,7 @@ typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 CLEANFILES += $(gir_DATA) $(typelib_DATA)
 endif
 
-if WITH_TESTS
+if ENABLE_TESTS
 
 check-local:
 	$(top_srcdir)/tools/check-exports.sh $(builddir)/.libs/libnm-util.so $(SYMBOL_VIS_FILE)
diff --git a/libnm-util/Makefile.in b/libnm-util/Makefile.in
index ec767a82..0e8d8891 100644
--- a/libnm-util/Makefile.in
+++ b/libnm-util/Makefile.in
@@ -72,16 +72,18 @@ DIST_COMMON = $(libnm_util_include_HEADERS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/libnm-util.pc.in COPYING
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
-	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
-	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gnome-code-coverage.m4 \
+	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
+	$(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -129,6 +131,7 @@ libnm_util_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 am__libnm_util_la_SOURCES_DIST = crypto.c nm-connection.c \
 	nm-param-spec-specialized.c nm-setting.c nm-setting-8021x.c \
 	nm-setting-adsl.c nm-setting-bluetooth.c nm-setting-bond.c \
+	nm-setting-bridge.c nm-setting-bridge-port.c \
 	nm-setting-connection.c nm-setting-infiniband.c \
 	nm-setting-ip4-config.c nm-setting-vlan.c \
 	nm-setting-ip6-config.c nm-setting-ppp.c nm-setting-pppoe.c \
@@ -144,6 +147,8 @@ am__objects_1 = libnm_util_la-crypto.lo libnm_util_la-nm-connection.lo \
 	libnm_util_la-nm-setting-adsl.lo \
 	libnm_util_la-nm-setting-bluetooth.lo \
 	libnm_util_la-nm-setting-bond.lo \
+	libnm_util_la-nm-setting-bridge.lo \
+	libnm_util_la-nm-setting-bridge-port.lo \
 	libnm_util_la-nm-setting-connection.lo \
 	libnm_util_la-nm-setting-infiniband.lo \
 	libnm_util_la-nm-setting-ip4-config.lo \
@@ -271,6 +276,10 @@ AWK = @AWK@
 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@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -285,9 +294,7 @@ DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DHCLIENT_PATH = @DHCLIENT_PATH@
-DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
-DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
@@ -297,17 +304,14 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GENHTML = @GENHTML@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-GIO_CFLAGS = @GIO_CFLAGS@
-GIO_LIBS = @GIO_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_MAKEFILE = @GLIB_MAKEFILE@
 GLIB_MKENUMS = @GLIB_MKENUMS@
-GMODULE_CFLAGS = @GMODULE_CFLAGS@
-GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
@@ -348,6 +352,7 @@ 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@
 LIBDL = @LIBDL@
@@ -364,11 +369,7 @@ LIBNL2_LIBS = @LIBNL2_LIBS@
 LIBNL3_CFLAGS = @LIBNL3_CFLAGS@
 LIBNL3_LIBS = @LIBNL3_LIBS@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
-LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@
-LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@
 LIBNL_LIBS = @LIBNL_LIBS@
-LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@
-LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@
@@ -383,6 +384,8 @@ MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MM_GLIB_CFLAGS = @MM_GLIB_CFLAGS@
+MM_GLIB_LIBS = @MM_GLIB_LIBS@
 MOC = @MOC@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
@@ -392,6 +395,7 @@ NMEDIT = @NMEDIT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
+NM_MODIFY_SYSTEM_POLICY = @NM_MODIFY_SYSTEM_POLICY@
 NM_VERSION = @NM_VERSION@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -418,13 +422,14 @@ PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
-RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
-SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
-SYSTEMD_LIBS = @SYSTEMD_LIBS@
+SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
+SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
+SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
 UDEV_BASE_DIR = @UDEV_BASE_DIR@
 USE_NLS = @USE_NLS@
@@ -479,6 +484,11 @@ localedir = @localedir@
 localstatedir = @localstatedir@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+nmbinary = @nmbinary@
+nmconfdir = @nmconfdir@
+nmdatadir = @nmdatadir@
+nmrundir = @nmrundir@
+nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
 prefix = @prefix@
@@ -493,11 +503,15 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+with_dhclient = @with_dhclient@
+with_dhcpcd = @with_dhcpcd@
+with_netconfig = @with_netconfig@
+with_resolvconf = @with_resolvconf@
 SUBDIRS = . tests
 INCLUDES = -I${top_srcdir} -I${top_srcdir}/include -I${top_builddir}/include
 lib_LTLIBRARIES = libnm-util.la
 libnm_util_la_CPPFLAGS = $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(UUID_CFLAGS) \
-	-DG_DISABLE_DEPRECATED $(am__append_2) $(am__append_5)
+	$(am__append_2) $(am__append_5)
 libnm_util_include_HEADERS = \
 	nm-connection.h			\
 	nm-setting.h			\
@@ -505,6 +519,8 @@ libnm_util_include_HEADERS = \
 	nm-setting-adsl.h		\
 	nm-setting-bluetooth.h		\
 	nm-setting-bond.h		\
+	nm-setting-bridge.h		\
+	nm-setting-bridge-port.h	\
 	nm-setting-connection.h		\
 	nm-setting-infiniband.h		\
 	nm-setting-ip4-config.h		\
@@ -539,6 +555,8 @@ libnm_util_la_csources = \
 	nm-setting-adsl.c		\
 	nm-setting-bluetooth.c		\
 	nm-setting-bond.c		\
+	nm-setting-bridge.c		\
+	nm-setting-bridge-port.c	\
 	nm-setting-connection.c		\
 	nm-setting-infiniband.c		\
 	nm-setting-ip4-config.c		\
@@ -701,6 +719,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-adsl.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-bluetooth.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-bond.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-bridge-port.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-bridge.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-cdma.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-connection.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnm_util_la-nm-setting-gsm.Plo@am__quote@
@@ -725,25 +745,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_crypto_la-crypto_nss.Plo@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -804,6 +821,20 @@ libnm_util_la-nm-setting-bond.lo: nm-setting-bond.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnm_util_la-nm-setting-bond.lo `test -f 'nm-setting-bond.c' || echo '$(srcdir)/'`nm-setting-bond.c
 
+libnm_util_la-nm-setting-bridge.lo: nm-setting-bridge.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnm_util_la-nm-setting-bridge.lo -MD -MP -MF $(DEPDIR)/libnm_util_la-nm-setting-bridge.Tpo -c -o libnm_util_la-nm-setting-bridge.lo `test -f 'nm-setting-bridge.c' || echo '$(srcdir)/'`nm-setting-bridge.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libnm_util_la-nm-setting-bridge.Tpo $(DEPDIR)/libnm_util_la-nm-setting-bridge.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nm-setting-bridge.c' object='libnm_util_la-nm-setting-bridge.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnm_util_la-nm-setting-bridge.lo `test -f 'nm-setting-bridge.c' || echo '$(srcdir)/'`nm-setting-bridge.c
+
+libnm_util_la-nm-setting-bridge-port.lo: nm-setting-bridge-port.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnm_util_la-nm-setting-bridge-port.lo -MD -MP -MF $(DEPDIR)/libnm_util_la-nm-setting-bridge-port.Tpo -c -o libnm_util_la-nm-setting-bridge-port.lo `test -f 'nm-setting-bridge-port.c' || echo '$(srcdir)/'`nm-setting-bridge-port.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libnm_util_la-nm-setting-bridge-port.Tpo $(DEPDIR)/libnm_util_la-nm-setting-bridge-port.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nm-setting-bridge-port.c' object='libnm_util_la-nm-setting-bridge-port.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnm_util_la-nm-setting-bridge-port.lo `test -f 'nm-setting-bridge-port.c' || echo '$(srcdir)/'`nm-setting-bridge-port.c
+
 libnm_util_la-nm-setting-connection.lo: nm-setting-connection.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_util_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnm_util_la-nm-setting-connection.lo -MD -MP -MF $(DEPDIR)/libnm_util_la-nm-setting-connection.Tpo -c -o libnm_util_la-nm-setting-connection.lo `test -f 'nm-setting-connection.c' || echo '$(srcdir)/'`nm-setting-connection.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libnm_util_la-nm-setting-connection.Tpo $(DEPDIR)/libnm_util_la-nm-setting-connection.Plo
@@ -1245,7 +1276,7 @@ distdir: $(DISTFILES)
 	      || exit 1; \
 	  fi; \
 	done
-@WITH_TESTS_FALSE@check-local:
+@ENABLE_TESTS_FALSE@check-local:
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) check-local
 check: $(BUILT_SOURCES)
@@ -1394,8 +1425,8 @@ include $(GLIB_MAKEFILE)
 
 @HAVE_INTROSPECTION_TRUE@NetworkManager-1.0.gir: libnm-util.la
 
-@WITH_TESTS_TRUE@check-local:
-@WITH_TESTS_TRUE@	$(top_srcdir)/tools/check-exports.sh $(builddir)/.libs/libnm-util.so $(SYMBOL_VIS_FILE)
+@ENABLE_TESTS_TRUE@check-local:
+@ENABLE_TESTS_TRUE@	$(top_srcdir)/tools/check-exports.sh $(builddir)/.libs/libnm-util.so $(SYMBOL_VIS_FILE)
 
 # 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/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver
index 4f0c27c5..e40531ea 100644
--- a/libnm-util/libnm-util.ver
+++ b/libnm-util/libnm-util.ver
@@ -18,6 +18,8 @@ global:
 	nm_connection_get_setting_adsl;
 	nm_connection_get_setting_bluetooth;
 	nm_connection_get_setting_bond;
+	nm_connection_get_setting_bridge;
+	nm_connection_get_setting_bridge_port;
 	nm_connection_get_setting_by_name;
 	nm_connection_get_setting_cdma;
 	nm_connection_get_setting_connection;
@@ -201,6 +203,24 @@ global:
 	nm_setting_bond_get_valid_options;
 	nm_setting_bond_new;
 	nm_setting_bond_remove_option;
+	nm_setting_bridge_error_get_type;
+	nm_setting_bridge_error_quark;
+	nm_setting_bridge_get_ageing_time;
+	nm_setting_bridge_get_forward_delay;
+	nm_setting_bridge_get_hello_time;
+	nm_setting_bridge_get_interface_name;
+	nm_setting_bridge_get_max_age;
+	nm_setting_bridge_get_priority;
+	nm_setting_bridge_get_stp;
+	nm_setting_bridge_get_type;
+	nm_setting_bridge_new;
+	nm_setting_bridge_port_error_get_type;
+	nm_setting_bridge_port_error_quark;
+	nm_setting_bridge_port_get_hairpin_mode;
+	nm_setting_bridge_port_get_path_cost;
+	nm_setting_bridge_port_get_priority;
+	nm_setting_bridge_port_get_type;
+	nm_setting_bridge_port_new;
 	nm_setting_cdma_error_get_type;
 	nm_setting_cdma_error_quark;
 	nm_setting_cdma_get_number;
@@ -214,6 +234,7 @@ global:
 	nm_setting_compare;
 	nm_setting_compare_flags_get_type;
 	nm_setting_connection_add_permission;
+	nm_setting_connection_add_secondary;
 	nm_setting_connection_error_get_type;
 	nm_setting_connection_error_quark;
 	nm_setting_connection_get_autoconnect;
@@ -221,8 +242,10 @@ global:
 	nm_setting_connection_get_id;
 	nm_setting_connection_get_master;
 	nm_setting_connection_get_num_permissions;
+	nm_setting_connection_get_num_secondaries;
 	nm_setting_connection_get_permission;
 	nm_setting_connection_get_read_only;
+	nm_setting_connection_get_secondary;
 	nm_setting_connection_get_slave_type;
 	nm_setting_connection_get_timestamp;
 	nm_setting_connection_get_type;
@@ -232,6 +255,7 @@ global:
 	nm_setting_connection_new;
 	nm_setting_connection_permissions_user_allowed;
 	nm_setting_connection_remove_permission;
+	nm_setting_connection_remove_secondary;
 	nm_setting_diff;
 	nm_setting_diff_result_get_type;
 	nm_setting_duplicate;
@@ -310,6 +334,7 @@ global:
 	nm_setting_ip6_config_error_get_type;
 	nm_setting_ip6_config_error_quark;
 	nm_setting_ip6_config_get_address;
+	nm_setting_ip6_config_get_dhcp_hostname;
 	nm_setting_ip6_config_get_dns;
 	nm_setting_ip6_config_get_dns_search;
 	nm_setting_ip6_config_get_ignore_auto_dns;
@@ -491,6 +516,7 @@ global:
 	nm_setting_wireless_security_remove_pairwise;
 	nm_setting_wireless_security_remove_proto;
 	nm_setting_wireless_security_set_wep_key;
+	nm_utils_ap_mode_security_valid;
 	nm_utils_deinit;
 	nm_utils_escape_ssid;
 	nm_utils_file_is_pkcs12;
@@ -500,6 +526,7 @@ global:
 	nm_utils_hwaddr_len;
 	nm_utils_hwaddr_ntoa;
 	nm_utils_hwaddr_type;
+	nm_utils_iface_valid_name;
 	nm_utils_init;
 	nm_utils_ip4_addresses_from_gvalue;
 	nm_utils_ip4_addresses_to_gvalue;
@@ -515,6 +542,7 @@ global:
 	nm_utils_ip6_routes_from_gvalue;
 	nm_utils_ip6_routes_to_gvalue;
 	nm_utils_is_empty_ssid;
+	nm_utils_is_uuid;
 	nm_utils_rsa_key_encrypt;
 	nm_utils_same_ssid;
 	nm_utils_security_type_get_type;
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c
index 66df511f..47a9ec09 100644
--- a/libnm-util/nm-connection.c
+++ b/libnm-util/nm-connection.c
@@ -30,6 +30,7 @@
 #include "nm-utils.h"
 #include "nm-utils-private.h"
 #include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
 
 #include "nm-setting-8021x.h"
 #include "nm-setting-bluetooth.h"
@@ -48,6 +49,8 @@
 #include "nm-setting-vpn.h"
 #include "nm-setting-olpc-mesh.h"
 #include "nm-setting-bond.h"
+#include "nm-setting-bridge.h"
+#include "nm-setting-bridge-port.h"
 #include "nm-setting-vlan.h"
 #include "nm-setting-serial.h"
 #include "nm-setting-gsm.h"
@@ -116,203 +119,116 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
+/*************************************************************/
+
 static GHashTable *registered_settings = NULL;
 
-#define DEFAULT_MAP_SIZE 20
+static void __attribute__((constructor))
+_ensure_registered (void)
+{
+	g_type_init ();
+	_nm_utils_register_value_transformations ();
+	if (G_UNLIKELY (registered_settings == NULL))
+		registered_settings = g_hash_table_new (g_str_hash, g_str_equal);
+}
 
-static struct SettingInfo {
-	const char *name;
+typedef struct {
 	GType type;
 	guint32 priority;
-	gboolean base_type;
 	GQuark error_quark;
-} default_map[DEFAULT_MAP_SIZE] = { { NULL } };
-
-static void
-setting_register (const char *name, GType type)
-{
-	g_return_if_fail (name != NULL);
-	g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (type));
-
-	if (G_UNLIKELY (!registered_settings)) {
-		registered_settings = g_hash_table_new_full (g_str_hash, g_str_equal, 
-		                                             (GDestroyNotify) g_free,
-		                                             (GDestroyNotify) g_free);
-	}
-
-	if (g_hash_table_lookup (registered_settings, name))
-		g_warning ("Already have a creator function for '%s', overriding", name);
-
-	g_hash_table_insert (registered_settings, g_strdup (name), g_strdup (g_type_name (type)));
-}
+} SettingInfo;
 
-#if 0
-static void
-setting_unregister (const char *name)
-{
-	if (registered_settings)
-		g_hash_table_remove (registered_settings, name);
-}
-#endif
-
-static void
-register_one_setting (const char *name,
-                      GType type,
-                      GQuark error_quark,
-                      guint32 priority,
-                      gboolean base_type)
+/*
+ * _nm_register_setting:
+ * @name: the name of the #NMSetting object to register
+ * @type: the #GType of the #NMSetting
+ * @priority: the sort priority of the setting, see below
+ * @error_quark: the setting's error quark
+ *
+ * INTERNAL ONLY: registers a setting's internal properties, like its priority
+ * and its error quark type, with libnm-util.
+ *
+ * A setting's priority should roughly follow the OSI layer model, but it also
+ * controls which settings get asked for secrets first.  Thus settings which
+ * relate to things that must be working first, like hardware, should get a
+ * higher priority than things which layer on top of the hardware.  For example,
+ * the GSM/CDMA settings should provide secrets before the PPP setting does,
+ * because a PIN is required to unlock the device before PPP can even start.
+ * Even settings without secrets should be assigned the right priority.
+ *
+ * 0: reserved for the Connection setting
+ *
+ * 1: hardware-related settings like Ethernet, WiFi, Infiniband, Bridge, etc.
+ * These priority 1 settings are also "base types", which means that at least
+ * one of them is required for the connection to be valid, and their name is
+ * valid in the 'type' property of the Connection setting.
+ *
+ * 2: hardware-related auxiliary settings that require a base setting to be
+ * successful first, like WiFi security, 802.1x, etc.
+ *
+ * 3: hardware-independent settings that are required before IP connectivity
+ * can be established, like PPP, PPPoE, etc.
+ *
+ * 4: IP-level stuff
+ */
+void
+_nm_register_setting (const char *name,
+                      const GType type,
+                      const guint32 priority,
+                      const GQuark error_quark)
 {
-	static guint32 i = 0;
-
-	g_return_if_fail (i < DEFAULT_MAP_SIZE);
-	g_return_if_fail (default_map[i].name == NULL);
+	SettingInfo *info;
 
-	default_map[i].name = name;
-	default_map[i].type = type;
-	default_map[i].error_quark = error_quark;
-	default_map[i].priority = priority;
-	default_map[i].base_type = base_type;
-	i++;
-
-	setting_register (name, type);
-}
+	g_return_if_fail (name != NULL);
+	g_return_if_fail (type != G_TYPE_INVALID);
+	g_return_if_fail (type != G_TYPE_NONE);
+	g_return_if_fail (error_quark != 0);
+	g_return_if_fail (priority <= 4);
 
-static void
-register_default_settings (void)
-{
-	_nm_utils_register_value_transformations ();
+	_ensure_registered ();
 
-	if (G_LIKELY (default_map[0].name))
+	if (G_LIKELY (g_hash_table_lookup (registered_settings, name)))
 		return;
 
-	register_one_setting (NM_SETTING_CONNECTION_SETTING_NAME,
-	                      NM_TYPE_SETTING_CONNECTION,
-	                      NM_SETTING_CONNECTION_ERROR,
-	                      0, FALSE);
-
-	register_one_setting (NM_SETTING_WIRED_SETTING_NAME,
-	                      NM_TYPE_SETTING_WIRED,
-	                      NM_SETTING_WIRED_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_WIRELESS_SETTING_NAME,
-	                      NM_TYPE_SETTING_WIRELESS,
-	                      NM_SETTING_WIRELESS_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_OLPC_MESH_SETTING_NAME,
-	                      NM_TYPE_SETTING_OLPC_MESH,
-	                      NM_SETTING_OLPC_MESH_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_GSM_SETTING_NAME,
-	                      NM_TYPE_SETTING_GSM,
-	                      NM_SETTING_GSM_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_CDMA_SETTING_NAME,
-	                      NM_TYPE_SETTING_CDMA,
-	                      NM_SETTING_CDMA_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_BLUETOOTH_SETTING_NAME,
-	                      NM_TYPE_SETTING_BLUETOOTH,
-	                      NM_SETTING_BLUETOOTH_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_WIMAX_SETTING_NAME,
-	                      NM_TYPE_SETTING_WIMAX,
-	                      NM_SETTING_WIMAX_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_BOND_SETTING_NAME,
-	                      NM_TYPE_SETTING_BOND,
-	                      NM_SETTING_BOND_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_INFINIBAND_SETTING_NAME,
-	                      NM_TYPE_SETTING_INFINIBAND,
-	                      NM_SETTING_INFINIBAND_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_VLAN_SETTING_NAME,
-	                      NM_TYPE_SETTING_VLAN,
-	                      NM_SETTING_VLAN_ERROR,
-	                      1, TRUE);
-
-	register_one_setting (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
-	                      NM_TYPE_SETTING_WIRELESS_SECURITY,
-	                      NM_SETTING_WIRELESS_SECURITY_ERROR,
-	                      2, FALSE);
-
-	register_one_setting (NM_SETTING_SERIAL_SETTING_NAME,
-	                      NM_TYPE_SETTING_SERIAL,
-	                      NM_SETTING_SERIAL_ERROR,
-	                      2, FALSE);
-
-	register_one_setting (NM_SETTING_PPP_SETTING_NAME,
-	                      NM_TYPE_SETTING_PPP,
-	                      NM_SETTING_PPP_ERROR,
-	                      3, FALSE);
-
-	register_one_setting (NM_SETTING_PPPOE_SETTING_NAME,
-	                      NM_TYPE_SETTING_PPPOE,
-	                      NM_SETTING_PPPOE_ERROR,
-	                      3, TRUE);
-
-	register_one_setting (NM_SETTING_ADSL_SETTING_NAME,
-	                      NM_TYPE_SETTING_ADSL,
-	                      NM_SETTING_ADSL_ERROR,
-	                      3, TRUE);
-
-	register_one_setting (NM_SETTING_802_1X_SETTING_NAME,
-	                      NM_TYPE_SETTING_802_1X,
-	                      NM_SETTING_802_1X_ERROR,
-	                      3, FALSE);
-
-	register_one_setting (NM_SETTING_VPN_SETTING_NAME,
-	                      NM_TYPE_SETTING_VPN,
-	                      NM_SETTING_VPN_ERROR,
-	                      4, TRUE);
-
-	register_one_setting (NM_SETTING_IP4_CONFIG_SETTING_NAME,
-	                      NM_TYPE_SETTING_IP4_CONFIG,
-	                      NM_SETTING_IP4_CONFIG_ERROR,
-	                      6, FALSE);
-
-	register_one_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME,
-	                      NM_TYPE_SETTING_IP6_CONFIG,
-	                      NM_SETTING_IP6_CONFIG_ERROR,
-	                      6, FALSE);
-
-	/* Be sure to update DEFAULT_MAP_SIZE if you add another setting!! */
+	if (priority == 0)
+		g_assert_cmpstr (name, ==, NM_SETTING_CONNECTION_SETTING_NAME);
+
+	info = g_slice_new0 (SettingInfo);
+	info->type = type;
+	info->priority = priority;
+	info->error_quark = error_quark;
+	g_hash_table_insert (registered_settings, (gpointer) name, info);
 }
 
 static guint32
-get_priority_for_setting_type (GType type)
+_get_setting_priority (NMSetting *setting)
 {
-	int i;
+	GHashTableIter iter;
+	SettingInfo *info;
 
-	for (i = 0; default_map[i].name; i++) {
-		if (default_map[i].type == type)
-			return default_map[i].priority;
-	}
+	_ensure_registered ();
 
+	g_hash_table_iter_init (&iter, registered_settings);
+	while (g_hash_table_iter_next (&iter, NULL, (gpointer) &info)) {
+		if (G_OBJECT_TYPE (setting) == info->type)
+			return info->priority;
+	}
 	return G_MAXUINT32;
 }
 
 static gboolean
-get_base_type_for_setting_type (GType type)
+_is_setting_base_type (NMSetting *setting)
 {
-	int i;
-
-	for (i = 0; default_map[i].name; i++) {
-		if (default_map[i].type == type)
-			return default_map[i].base_type;
-	}
-	return FALSE;
+	/* Historical oddity: PPPoE is a base-type even though it's not
+	 * priority 1.  It needs to be sorted *after* lower-level stuff like
+	 * WiFi security or 802.1x for secrets, but it's still allowed as a
+	 * base type.
+	 */
+	return _get_setting_priority (setting) == 1 || NM_IS_SETTING_PPPOE (setting);
 }
 
+/*************************************************************/
+
 /**
  * nm_connection_lookup_setting_type:
  * @name: a setting name
@@ -324,25 +240,18 @@ get_base_type_for_setting_type (GType type)
 GType
 nm_connection_lookup_setting_type (const char *name)
 {
-	char *type_name;
-	GType type;
+	SettingInfo *info;
 
 	g_return_val_if_fail (name != NULL, G_TYPE_NONE);
 
-	if (!registered_settings)
-		register_default_settings ();
+	_ensure_registered ();
 
-	type_name = (char *) g_hash_table_lookup (registered_settings, name);
-	if (type_name) {
-		type = g_type_from_name (type_name);
-		if (!type)
-			g_warning ("Can not get type for '%s'.", type_name);
-	} else {
-		type = 0;
-		g_warning ("Unknown setting '%s'", name);
-	}
+	info = g_hash_table_lookup (registered_settings, name);
+	if (info)
+		return info->type;
 
-	return type;
+	g_warning ("Unknown setting '%s'", name);
+	return G_TYPE_INVALID;
 }
 
 /**
@@ -357,13 +266,16 @@ nm_connection_lookup_setting_type (const char *name)
 GType
 nm_connection_lookup_setting_type_by_quark (GQuark error_quark)
 {
-	int i;
+	SettingInfo *info;
+	GHashTableIter iter;
 
-	for (i = 0; default_map[i].name; i++) {
-		if (default_map[i].error_quark == error_quark)
-			return default_map[i].type;
-	}
+	_ensure_registered ();
 
+	g_hash_table_iter_init (&iter, registered_settings);
+	while (g_hash_table_iter_next (&iter, NULL, (gpointer) &info)) {
+		if (info->error_quark == error_quark)
+			return info->type;
+	}
 	return G_TYPE_INVALID;
 }
 
@@ -739,8 +651,8 @@ nm_connection_verify (NMConnection *connection, GError **error)
 	gpointer value;
 	GSList *all_settings = NULL;
 	gboolean success = TRUE;
+	NMSetting *base;
 	const char *ctype;
-	GType base_type;
 
 	if (error)
 		g_return_val_if_fail (*error == NULL, FALSE);
@@ -791,8 +703,8 @@ nm_connection_verify (NMConnection *connection, GError **error)
 		return FALSE;
 	}
 
-	base_type = nm_connection_lookup_setting_type (ctype);
-	if (base_type == 0) {
+	base = nm_connection_get_setting_by_name (connection, ctype);
+	if (!base) {
 		g_set_error_literal (error,
 		                     NM_CONNECTION_ERROR,
 		                     NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID,
@@ -800,7 +712,7 @@ nm_connection_verify (NMConnection *connection, GError **error)
 		return FALSE;
 	}
 
-	if (!get_base_type_for_setting_type (base_type)) {
+	if (!_is_setting_base_type (base)) {
 		g_set_error (error,
 			         NM_CONNECTION_ERROR,
 			         NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID,
@@ -896,8 +808,8 @@ setting_priority_compare (gconstpointer a, gconstpointer b)
 {
 	guint32 prio_a, prio_b;
 
-	prio_a = get_priority_for_setting_type (G_OBJECT_TYPE (NM_SETTING (a)));
-	prio_b = get_priority_for_setting_type (G_OBJECT_TYPE (NM_SETTING (b)));
+	prio_a = _get_setting_priority (NM_SETTING (a));
+	prio_b = _get_setting_priority (NM_SETTING (b));
 
 	if (prio_a < prio_b)
 		return -1;
@@ -906,14 +818,6 @@ setting_priority_compare (gconstpointer a, gconstpointer b)
 	return 1;
 }
 
-static void
-add_setting_to_list (gpointer key, gpointer data, gpointer user_data)
-{
-	GSList **list = (GSList **) user_data;
-
-	*list = g_slist_insert_sorted (*list, NM_SETTING (data), setting_priority_compare);
-}
-
 /**
  * nm_connection_need_secrets:
  * @connection: the #NMConnection
@@ -938,9 +842,11 @@ nm_connection_need_secrets (NMConnection *connection,
                             GPtrArray **hints)
 {
 	NMConnectionPrivate *priv;
+	GHashTableIter hiter;
 	GSList *settings = NULL;
 	GSList *iter;
 	const char *name = NULL;
+	NMSetting *setting;
 
 	g_return_val_if_fail (connection != NULL, NULL);
 	g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
@@ -950,15 +856,14 @@ nm_connection_need_secrets (NMConnection *connection,
 	priv = NM_CONNECTION_GET_PRIVATE (connection);
 
 	/* Get list of settings in priority order */
-	g_hash_table_foreach (priv->settings, add_setting_to_list, &settings);
+	g_hash_table_iter_init (&hiter, priv->settings);
+	while (g_hash_table_iter_next (&hiter, NULL, (gpointer) &setting))
+		settings = g_slist_insert_sorted (settings, setting, setting_priority_compare);
 
 	for (iter = settings; iter; iter = g_slist_next (iter)) {
-		NMSetting *setting = NM_SETTING (iter->data);
 		GPtrArray *secrets;
 
-		// FIXME: do something with requested secrets rather than asking for
-		// all of them.  Maybe make secrets a hash table mapping
-		// settings name :: [list of secrets key names].
+		setting = NM_SETTING (iter->data);
 		secrets = nm_setting_need_secrets (setting);
 		if (secrets) {
 			if (hints)
@@ -1234,14 +1139,7 @@ nm_connection_get_virtual_iface_name (NMConnection *connection)
 NMConnection *
 nm_connection_new (void)
 {
-	GObject *object;
-
-	if (!registered_settings)
-		register_default_settings ();
-
-	object = g_object_new (NM_TYPE_CONNECTION, NULL);
-
-	return NM_CONNECTION (object);
+	return (NMConnection *) g_object_new (NM_TYPE_CONNECTION, NULL);
 }
 
 /**
@@ -1405,6 +1303,23 @@ nm_connection_get_setting_bond (NMConnection *connection)
 }
 
 /**
+ * nm_connection_get_setting_bridge:
+ * @connection: the #NMConnection
+ *
+ * A shortcut to return any #NMSettingBridge the connection might contain.
+ *
+ * Returns: (transfer none): an #NMSettingBridge if the connection contains one, otherwise NULL
+ **/
+NMSettingBridge *
+nm_connection_get_setting_bridge (NMConnection *connection)
+{
+	g_return_val_if_fail (connection != NULL, NULL);
+	g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+
+	return (NMSettingBridge *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BRIDGE);
+}
+
+/**
  * nm_connection_get_setting_cdma:
  * @connection: the #NMConnection
  *
@@ -1677,6 +1592,23 @@ nm_connection_get_setting_wireless_security (NMConnection *connection)
 }
 
 /**
+ * nm_connection_get_setting_bridge_port:
+ * @connection: the #NMConnection
+ *
+ * A shortcut to return any #NMSettingBridgePort the connection might contain.
+ *
+ * Returns: (transfer none): an #NMSettingBridgePort if the connection contains one, otherwise NULL
+ **/
+NMSettingBridgePort *
+nm_connection_get_setting_bridge_port (NMConnection *connection)
+{
+	g_return_val_if_fail (connection != NULL, NULL);
+	g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+
+	return (NMSettingBridgePort *) nm_connection_get_setting (connection, NM_TYPE_SETTING_BRIDGE_PORT);
+}
+
+/**
  * nm_connection_get_setting_vlan:
  * @connection: the #NMConnection
  *
diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h
index 0fd878c3..4d060cc9 100644
--- a/libnm-util/nm-connection.h
+++ b/libnm-util/nm-connection.h
@@ -33,6 +33,8 @@
 #include <nm-setting-8021x.h>
 #include <nm-setting-bluetooth.h>
 #include <nm-setting-bond.h>
+#include <nm-setting-bridge.h>
+#include <nm-setting-bridge-port.h>
 #include <nm-setting-cdma.h>
 #include <nm-setting-connection.h>
 #include <nm-setting-gsm.h>
@@ -188,6 +190,8 @@ const char *  nm_connection_get_id        (NMConnection *connection);
 NMSetting8021x *           nm_connection_get_setting_802_1x            (NMConnection *connection);
 NMSettingBluetooth *       nm_connection_get_setting_bluetooth         (NMConnection *connection);
 NMSettingBond *            nm_connection_get_setting_bond              (NMConnection *connection);
+NMSettingBridge *          nm_connection_get_setting_bridge            (NMConnection *connection);
+NMSettingBridgePort *      nm_connection_get_setting_bridge_port       (NMConnection *connection);
 NMSettingCdma *            nm_connection_get_setting_cdma              (NMConnection *connection);
 NMSettingConnection *      nm_connection_get_setting_connection        (NMConnection *connection);
 NMSettingGsm *             nm_connection_get_setting_gsm               (NMConnection *connection);
diff --git a/libnm-util/nm-setting-8021x.c b/libnm-util/nm-setting-8021x.c
index 28c0d3f9..32eda889 100644
--- a/libnm-util/nm-setting-8021x.c
+++ b/libnm-util/nm-setting-8021x.c
@@ -24,7 +24,6 @@
  */
 
 #include <string.h>
-#include <ctype.h>
 #include <dbus/dbus-glib.h>
 #include "nm-setting-8021x.h"
 #include "nm-param-spec-specialized.h"
@@ -82,7 +81,12 @@ nm_setting_802_1x_error_quark (void)
 	return quark;
 }
 
-G_DEFINE_TYPE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_802_1X_SETTING_NAME,
+                                               g_define_type_id,
+                                               2,
+                                               NM_SETTING_802_1X_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_802_1X)
 
 #define NM_SETTING_802_1X_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_802_1X, NMSetting8021xPrivate))
 
diff --git a/libnm-util/nm-setting-adsl.c b/libnm-util/nm-setting-adsl.c
index 6103c715..de0850e6 100644
--- a/libnm-util/nm-setting-adsl.c
+++ b/libnm-util/nm-setting-adsl.c
@@ -55,7 +55,12 @@ nm_setting_adsl_error_quark (void)
 	return quark;
 }
 
-G_DEFINE_TYPE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_ADSL_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_ADSL_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_ADSL)
 
 #define NM_SETTING_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_ADSL, NMSettingAdslPrivate))
 
diff --git a/libnm-util/nm-setting-bluetooth.c b/libnm-util/nm-setting-bluetooth.c
index 52f0b81e..161b3715 100644
--- a/libnm-util/nm-setting-bluetooth.c
+++ b/libnm-util/nm-setting-bluetooth.c
@@ -25,7 +25,6 @@
  */
 
 #include <string.h>
-#include <ctype.h>
 #include <net/ethernet.h>
 
 #include "nm-param-spec-specialized.h"
@@ -33,6 +32,7 @@
 #include "nm-setting-bluetooth.h"
 #include "nm-setting-cdma.h"
 #include "nm-setting-gsm.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-bluetooth
@@ -63,7 +63,12 @@ nm_setting_bluetooth_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_BLUETOOTH_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_BLUETOOTH_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BLUETOOTH)
 
 #define NM_SETTING_BLUETOOTH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothPrivate))
 
diff --git a/libnm-util/nm-setting-bond.c b/libnm-util/nm-setting-bond.c
index b7994f4a..a3dbd766 100644
--- a/libnm-util/nm-setting-bond.c
+++ b/libnm-util/nm-setting-bond.c
@@ -22,7 +22,6 @@
  */
 
 #include <string.h>
-#include <ctype.h>
 #include <stdlib.h>
 #include <dbus/dbus-glib.h>
 
@@ -31,6 +30,7 @@
 #include "nm-utils.h"
 #include "nm-utils-private.h"
 #include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-bond
@@ -59,7 +59,12 @@ nm_setting_bond_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_BOND_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_BOND_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BOND)
 
 #define NM_SETTING_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BOND, NMSettingBondPrivate))
 
@@ -329,31 +334,6 @@ nm_setting_bond_get_option_default (NMSettingBond *setting, const char *name)
 	g_assert_not_reached ();
 }
 
-/*
- * This function is a 1:1 copy of the kernel's
- * dev_valid_name() in net/core/dev.c
- */
-static gboolean
-dev_valid_name(const char *name)
-{
-	if (*name == '\0')
-		return FALSE;
-
-	if (strlen (name) >= 16)
-		return FALSE;
-
-	if (!strcmp (name, ".") || !strcmp (name, ".."))
-		return FALSE;
-
-	while (*name) {
-		if (*name == '/' || isspace (*name))
-			return FALSE;
-		name++;
-	}
-
-	return TRUE;
-}
-
 static gint
 find_setting_by_name (gconstpointer a, gconstpointer b)
 {
@@ -388,7 +368,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		return FALSE;
 	}
 
-	if (!dev_valid_name (priv->interface_name)) {
+	if (!nm_utils_iface_valid_name (priv->interface_name)) {
 		g_set_error (error,
 		             NM_SETTING_BOND_ERROR,
 		             NM_SETTING_BOND_ERROR_INVALID_PROPERTY,
diff --git a/libnm-util/nm-setting-bridge-port.c b/libnm-util/nm-setting-bridge-port.c
new file mode 100644
index 00000000..d7f3dd59
--- /dev/null
+++ b/libnm-util/nm-setting-bridge-port.c
@@ -0,0 +1,281 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * Dan Williams <dcbw@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2012 Red Hat, Inc.
+ */
+
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <dbus/dbus-glib.h>
+
+#include "nm-setting-bridge-port.h"
+#include "nm-utils.h"
+#include "nm-utils-private.h"
+#include "nm-setting-private.h"
+
+/**
+ * SECTION:nm-setting-bridge-port
+ * @short_description: Describes connection properties for bridge ports
+ * @include: nm-setting-bridge-port.h
+ *
+ * The #NMSettingBridgePort object is a #NMSetting subclass that describes
+ * optional properties that apply to bridge ports.
+ **/
+
+/**
+ * nm_setting_bridge_port_error_quark:
+ *
+ * Registers an error quark for #NMSettingBridgePort if necessary.
+ *
+ * Returns: the error quark used for #NMSettingBridgePort errors.
+ **/
+GQuark
+nm_setting_bridge_port_error_quark (void)
+{
+	static GQuark quark;
+
+	if (G_UNLIKELY (!quark))
+		quark = g_quark_from_static_string ("nm-setting-bridge-port-error-quark");
+	return quark;
+}
+
+G_DEFINE_TYPE_WITH_CODE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_BRIDGE_PORT_SETTING_NAME,
+                                               g_define_type_id,
+                                               3,
+                                               NM_SETTING_BRIDGE_PORT_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BRIDGE_PORT)
+
+#define NM_SETTING_BRIDGE_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortPrivate))
+
+typedef struct {
+	guint16 priority;
+	guint16 path_cost;
+	gboolean hairpin_mode;
+} NMSettingBridgePortPrivate;
+
+enum {
+	PROP_0,
+	PROP_PRIORITY,
+	PROP_PATH_COST,
+	PROP_HAIRPIN_MODE,
+	LAST_PROP
+};
+
+/**************************************************************************/
+
+/**
+ * nm_setting_bridge_port_get_priority:
+ * @setting: the #NMSettingBridgePort
+ *
+ * Returns: the #NMSettingBridgePort:priority property of the setting
+ **/
+guint16
+nm_setting_bridge_port_get_priority (NMSettingBridgePort *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), 0);
+
+	return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->priority;
+}
+
+/**
+ * nm_setting_bridge_port_get_path_cost:
+ * @setting: the #NMSettingBridgePort
+ *
+ * Returns: the #NMSettingBridgePort:path-cost property of the setting
+ **/
+guint16
+nm_setting_bridge_port_get_path_cost (NMSettingBridgePort *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), 0);
+
+	return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->path_cost;
+}
+
+/**
+ * nm_setting_bridge_port_get_hairpin_mode:
+ * @setting: the #NMSettingBridgePort
+ *
+ * Returns: the #NMSettingBridgePort:hairpin-mode property of the setting
+ **/
+gboolean
+nm_setting_bridge_port_get_hairpin_mode (NMSettingBridgePort *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), FALSE);
+
+	return NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting)->hairpin_mode;
+}
+
+/**************************************************************************/
+
+#define BR_MAX_PORT_PRIORITY 63
+#define BR_DEF_PRIORITY      32
+
+#define BR_MIN_PATH_COST     1
+#define BR_MAX_PATH_COST     65535
+
+static gboolean
+verify (NMSetting *setting, GSList *all_settings, GError **error)
+{
+	NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting);
+
+	if (priv->priority > BR_MAX_PORT_PRIORITY) {
+		g_set_error (error,
+		             NM_SETTING_BRIDGE_PORT_ERROR,
+		             NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY,
+		             NM_SETTING_BRIDGE_PORT_PRIORITY);
+		return FALSE;
+	}
+
+	if (priv->path_cost > BR_MAX_PATH_COST) {
+		g_set_error (error,
+		             NM_SETTING_BRIDGE_PORT_ERROR,
+		             NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY,
+		             NM_SETTING_BRIDGE_PORT_PATH_COST);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+/**************************************************************************/
+
+/**
+ * nm_setting_bridge_port_new:
+ *
+ * Creates a new #NMSettingBridgePort object with default values.
+ *
+ * Returns: (transfer full): the new empty #NMSettingBridgePort object
+ **/
+NMSetting *
+nm_setting_bridge_port_new (void)
+{
+	return (NMSetting *) g_object_new (NM_TYPE_SETTING_BRIDGE_PORT, NULL);
+}
+
+static void
+nm_setting_bridge_port_init (NMSettingBridgePort *setting)
+{
+	g_object_set (setting, NM_SETTING_NAME, NM_SETTING_BRIDGE_PORT_SETTING_NAME, NULL);
+}
+
+static void
+set_property (GObject *object, guint prop_id,
+              const GValue *value, GParamSpec *pspec)
+{
+	NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_PRIORITY:
+		priv->priority = (guint16) (g_value_get_uint (value) & 0xFFFF);
+		break;
+	case PROP_PATH_COST:
+		priv->path_cost = (guint16) (g_value_get_uint (value) & 0xFFFF);
+		break;
+	case PROP_HAIRPIN_MODE:
+		priv->hairpin_mode = g_value_get_boolean (value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+              GValue *value, GParamSpec *pspec)
+{
+	NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_PRIORITY:
+		g_value_set_uint (value, priv->priority);
+		break;
+	case PROP_PATH_COST:
+		g_value_set_uint (value, priv->path_cost);
+		break;
+	case PROP_HAIRPIN_MODE:
+		g_value_set_boolean (value, priv->hairpin_mode);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
+	NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
+
+	g_type_class_add_private (setting_class, sizeof (NMSettingBridgePortPrivate));
+
+	/* virtual methods */
+	object_class->set_property = set_property;
+	object_class->get_property = get_property;
+	parent_class->verify       = verify;
+
+	/* Properties */
+	/**
+	 * NMSettingBridgePort:priority:
+	 *
+	 * The Spanning Tree Protocol (STP) priority of this bridge port.
+	 **/
+	g_object_class_install_property
+		(object_class, PROP_PRIORITY,
+		 g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PRIORITY,
+		                    "Priority",
+		                    "The Spanning Tree Protocol (STP) priority of this bridge port",
+		                    0, BR_MAX_PORT_PRIORITY, BR_DEF_PRIORITY,
+		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridgePort:path-cost:
+	 *
+	 * The Spanning Tree Protocol (STP) port cost for destinations via this port.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_PATH_COST,
+		 g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PATH_COST,
+		                    "Path Cost",
+		                    "The Spanning Tree Protocol (STP) port cost for "
+		                    "destinations via this port.",
+		                    0, BR_MAX_PATH_COST, 100,
+		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridgePort:hairpin-mode:
+	 *
+	 * Enables or disabled 'hairpin mode' for the port, which allows frames to
+	 * be sent back out through the port the frame was received on.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_HAIRPIN_MODE,
+		 g_param_spec_boolean (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE,
+		                       "Hairpin Mode",
+		                       "Enables or disabled 'hairpin mode' for the "
+		                       "port, which allows frames to be sent back out "
+		                       "through the port the frame was received on.",
+		                       FALSE,
+		                       G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
+
+}
diff --git a/libnm-util/nm-setting-bridge-port.h b/libnm-util/nm-setting-bridge-port.h
new file mode 100644
index 00000000..5123f0a7
--- /dev/null
+++ b/libnm-util/nm-setting-bridge-port.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * Dan Williams <dcbw@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2012 Red Hat, Inc.
+ */
+
+#ifndef NM_SETTING_BRIDGE_PORT_H
+#define NM_SETTING_BRIDGE_PORT_H
+
+#include <nm-setting.h>
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_SETTING_BRIDGE_PORT            (nm_setting_bridge_port_get_type ())
+#define NM_SETTING_BRIDGE_PORT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePort))
+#define NM_SETTING_BRIDGE_PORT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortClass))
+#define NM_IS_SETTING_BRIDGE_PORT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BRIDGE_PORT))
+#define NM_IS_SETTING_BRIDGE_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BRIDGE_PORT))
+#define NM_SETTING_BRIDGE_PORT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortClass))
+
+#define NM_SETTING_BRIDGE_PORT_SETTING_NAME "bridge-port"
+
+/**
+ * NMSettingBridgePortError:
+ * @NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN: unknown or unclassified error
+ * @NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY: the property was invalid
+ * @NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY: the property was missing and
+ * is required
+ */
+typedef enum {
+	NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN = 0,      /*< nick=UnknownError >*/
+	NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/
+	NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/
+} NMSettingBridgePortError;
+
+#define NM_SETTING_BRIDGE_PORT_ERROR nm_setting_bridge_port_error_quark ()
+GQuark nm_setting_bridge_port_error_quark (void);
+
+#define NM_SETTING_BRIDGE_PORT_PRIORITY     "priority"
+#define NM_SETTING_BRIDGE_PORT_PATH_COST    "path-cost"
+#define NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE "hairpin-mode"
+
+typedef struct {
+	NMSetting parent;
+} NMSettingBridgePort;
+
+typedef struct {
+	NMSettingClass parent;
+
+	/* Padding for future expansion */
+	void (*_reserved1) (void);
+	void (*_reserved2) (void);
+	void (*_reserved3) (void);
+	void (*_reserved4) (void);
+} NMSettingBridgePortClass;
+
+GType nm_setting_bridge_port_get_type (void);
+
+NMSetting * nm_setting_bridge_port_new              (void);
+
+guint16     nm_setting_bridge_port_get_priority     (NMSettingBridgePort *setting);
+
+guint16     nm_setting_bridge_port_get_path_cost    (NMSettingBridgePort *setting);
+
+gboolean    nm_setting_bridge_port_get_hairpin_mode (NMSettingBridgePort *setting);
+
+G_END_DECLS
+
+#endif /* NM_SETTING_BRIDGE_PORT_H */
diff --git a/libnm-util/nm-setting-bridge.c b/libnm-util/nm-setting-bridge.c
new file mode 100644
index 00000000..3363ffd4
--- /dev/null
+++ b/libnm-util/nm-setting-bridge.c
@@ -0,0 +1,498 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * Thomas Graf <tgraf@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2011 - 2012 Red Hat, Inc.
+ */
+
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <dbus/dbus-glib.h>
+
+#include "nm-setting-bridge.h"
+#include "nm-param-spec-specialized.h"
+#include "nm-setting-private.h"
+#include "nm-utils.h"
+#include "nm-utils-private.h"
+#include "nm-dbus-glib-types.h"
+
+/**
+ * SECTION:nm-setting-bridge
+ * @short_description: Describes connection properties for bridges
+ * @include: nm-setting-bridge.h
+ *
+ * The #NMSettingBridge object is a #NMSetting subclass that describes properties
+ * necessary for bridging connections.
+ **/
+
+/**
+ * nm_setting_bridge_error_quark:
+ *
+ * Registers an error quark for #NMSettingBridge if necessary.
+ *
+ * Returns: the error quark used for #NMSettingBridge errors.
+ **/
+GQuark
+nm_setting_bridge_error_quark (void)
+{
+	static GQuark quark;
+
+	if (G_UNLIKELY (!quark))
+		quark = g_quark_from_static_string ("nm-setting-bridge-error-quark");
+	return quark;
+}
+
+
+G_DEFINE_TYPE_WITH_CODE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_BRIDGE_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_BRIDGE_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BRIDGE)
+
+#define NM_SETTING_BRIDGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE, NMSettingBridgePrivate))
+
+typedef struct {
+	char *   interface_name;
+	gboolean stp;
+	guint16  priority;
+	guint16  forward_delay;
+	guint16  hello_time;
+	guint16  max_age;
+	guint32  ageing_time;
+} NMSettingBridgePrivate;
+
+enum {
+	PROP_0,
+	PROP_INTERFACE_NAME,
+	PROP_STP,
+	PROP_PRIORITY,
+	PROP_FORWARD_DELAY,
+	PROP_HELLO_TIME,
+	PROP_MAX_AGE,
+	PROP_AGEING_TIME,
+	LAST_PROP
+};
+
+/**
+ * nm_setting_bridge_new:
+ *
+ * Creates a new #NMSettingBridge object with default values.
+ *
+ * Returns: (transfer full): the new empty #NMSettingBridge object
+ **/
+NMSetting *
+nm_setting_bridge_new (void)
+{
+	return (NMSetting *) g_object_new (NM_TYPE_SETTING_BRIDGE, NULL);
+}
+
+/**
+ * nm_setting_bridge_get_interface_name:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:interface-name property of the setting
+ **/
+const char *
+nm_setting_bridge_get_interface_name (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->interface_name;
+}
+
+/**
+ * nm_setting_bridge_get_stp:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:stp property of the setting
+ **/
+gboolean
+nm_setting_bridge_get_stp (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), FALSE);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->stp;
+}
+
+/**
+ * nm_setting_bridge_get_priority:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:priority property of the setting
+ **/
+guint16
+nm_setting_bridge_get_priority (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->priority;
+}
+
+/**
+ * nm_setting_bridge_get_forward_delay:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:forward-delay property of the setting
+ **/
+guint16
+nm_setting_bridge_get_forward_delay (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->forward_delay;
+}
+
+/**
+ * nm_setting_bridge_get_hello_time:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:hello-time property of the setting
+ **/
+guint16
+nm_setting_bridge_get_hello_time (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->hello_time;
+}
+
+/**
+ * nm_setting_bridge_get_max_age:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:max-age property of the setting
+ **/
+guint16
+nm_setting_bridge_get_max_age (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->max_age;
+}
+
+/**
+ * nm_setting_bridge_get_ageing_time:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:ageing-time property of the setting
+ **/
+guint
+nm_setting_bridge_get_ageing_time (NMSettingBridge *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+	return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->ageing_time;
+}
+
+/* IEEE 802.1D-1998 timer values */
+#define BR_MIN_HELLO_TIME    1
+#define BR_MAX_HELLO_TIME    10
+
+#define BR_MIN_FORWARD_DELAY 2
+#define BR_MAX_FORWARD_DELAY 30
+
+#define BR_MIN_MAX_AGE       6
+#define BR_MAX_MAX_AGE       40
+
+/* IEEE 802.1D-1998 Table 7.4 */
+#define BR_MIN_AGEING_TIME   0
+#define BR_MAX_AGEING_TIME   1000000
+
+static inline gboolean
+check_range (guint32 val,
+             guint32 min,
+             guint32 max,
+             const char *prop,
+             GError **error)
+{
+	if ((val != 0) && (val < min || val > max)) {
+		g_set_error_literal (error,
+		                     NM_SETTING_BRIDGE_ERROR,
+		                     NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY,
+		                     prop);
+		return FALSE;
+	}
+	return TRUE;
+}
+
+static gboolean
+verify (NMSetting *setting, GSList *all_settings, GError **error)
+{
+	NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (setting);
+
+	if (!priv->interface_name || !strlen(priv->interface_name)) {
+		g_set_error (error,
+		             NM_SETTING_BRIDGE_ERROR,
+		             NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY,
+		             NM_SETTING_BRIDGE_INTERFACE_NAME);
+		return FALSE;
+	}
+
+	if (!nm_utils_iface_valid_name (priv->interface_name)) {
+		g_set_error (error,
+		             NM_SETTING_BRIDGE_ERROR,
+		             NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY,
+		             NM_SETTING_BRIDGE_INTERFACE_NAME);
+		return FALSE;
+	}
+
+	if (!check_range (priv->forward_delay,
+	                  BR_MIN_FORWARD_DELAY,
+	                  BR_MAX_FORWARD_DELAY,
+	                  NM_SETTING_BRIDGE_FORWARD_DELAY,
+	                  error))
+		return FALSE;
+
+	if (!check_range (priv->hello_time,
+	                  BR_MIN_HELLO_TIME,
+	                  BR_MAX_HELLO_TIME,
+	                  NM_SETTING_BRIDGE_HELLO_TIME,
+	                  error))
+		return FALSE;
+
+	if (!check_range (priv->max_age,
+	                  BR_MIN_MAX_AGE,
+	                  BR_MAX_MAX_AGE,
+	                  NM_SETTING_BRIDGE_MAX_AGE,
+	                  error))
+		return FALSE;
+
+	if (!check_range (priv->ageing_time,
+	                  BR_MIN_AGEING_TIME,
+	                  BR_MAX_AGEING_TIME,
+	                  NM_SETTING_BRIDGE_AGEING_TIME,
+	                  error))
+		return FALSE;
+
+	return TRUE;
+}
+
+static const char *
+get_virtual_iface_name (NMSetting *setting)
+{
+	NMSettingBridge *self = NM_SETTING_BRIDGE (setting);
+
+	return nm_setting_bridge_get_interface_name (self);
+}
+
+static void
+nm_setting_bridge_init (NMSettingBridge *setting)
+{
+	g_object_set (setting, NM_SETTING_NAME, NM_SETTING_BRIDGE_SETTING_NAME, NULL);
+}
+
+static void
+finalize (GObject *object)
+{
+	NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object);
+
+	g_free (priv->interface_name);
+
+	G_OBJECT_CLASS (nm_setting_bridge_parent_class)->finalize (object);
+}
+
+static void
+set_property (GObject *object, guint prop_id,
+              const GValue *value, GParamSpec *pspec)
+{
+	NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_INTERFACE_NAME:
+		g_free (priv->interface_name);
+		priv->interface_name = g_value_dup_string (value);
+		break;
+	case PROP_STP:
+		priv->stp = g_value_get_boolean (value);
+		break;
+	case PROP_PRIORITY:
+		priv->priority = (guint16) g_value_get_uint (value);
+		break;
+	case PROP_FORWARD_DELAY:
+		priv->forward_delay = (guint16) g_value_get_uint (value);
+		break;
+	case PROP_HELLO_TIME:
+		priv->hello_time = (guint16) g_value_get_uint (value);
+		break;
+	case PROP_MAX_AGE:
+		priv->max_age = (guint16) g_value_get_uint (value);
+		break;
+	case PROP_AGEING_TIME:
+		priv->ageing_time = g_value_get_uint (value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+              GValue *value, GParamSpec *pspec)
+{
+	NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (object);
+	NMSettingBridge *setting = NM_SETTING_BRIDGE (object);
+
+	switch (prop_id) {
+	case PROP_INTERFACE_NAME:
+		g_value_set_string (value, nm_setting_bridge_get_interface_name (setting));
+		break;
+	case PROP_STP:
+		g_value_set_boolean (value, priv->stp);
+		break;
+	case PROP_PRIORITY:
+		g_value_set_uint (value, priv->priority);
+		break;
+	case PROP_FORWARD_DELAY:
+		g_value_set_uint (value, priv->forward_delay);
+		break;
+	case PROP_HELLO_TIME:
+		g_value_set_uint (value, priv->hello_time);
+		break;
+	case PROP_MAX_AGE:
+		g_value_set_uint (value, priv->max_age);
+		break;
+	case PROP_AGEING_TIME:
+		g_value_set_uint (value, priv->ageing_time);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
+	NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
+
+	g_type_class_add_private (setting_class, sizeof (NMSettingBridgePrivate));
+
+	/* virtual methods */
+	object_class->set_property = set_property;
+	object_class->get_property = get_property;
+	object_class->finalize     = finalize;
+	parent_class->verify       = verify;
+	parent_class->get_virtual_iface_name = get_virtual_iface_name;
+
+	/* Properties */
+	/**
+	 * NMSettingBridge:interface-name:
+	 *
+	 * The name of the virtual in-kernel briding network interface
+	 **/
+	g_object_class_install_property
+		(object_class, PROP_INTERFACE_NAME,
+		 g_param_spec_string (NM_SETTING_BRIDGE_INTERFACE_NAME,
+		                      "InterfaceName",
+		                      "The name of the virtual in-kernel bridging network interface",
+		                      NULL,
+		                      G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge:stp:
+	 *
+	 * Controls whether Spanning Tree Protocol (STP) is enabled for this bridge.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_STP,
+		  g_param_spec_boolean (NM_SETTING_BRIDGE_STP,
+		                        "STP",
+		                        "Controls whether Spanning Tree Protocol (STP) "
+		                        "is enabled for this bridge.",
+		                        TRUE,
+		                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge: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.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_PRIORITY,
+		  g_param_spec_uint (NM_SETTING_BRIDGE_PRIORITY,
+		                     "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.",
+		                     0, G_MAXUINT16, 0x80,
+		                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge:forward-delay:
+	 *
+	 * The Spanning Tree Protocol (STP) forwarding delay, in seconds.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_FORWARD_DELAY,
+		  g_param_spec_uint (NM_SETTING_BRIDGE_FORWARD_DELAY,
+		                     "ForwardDelay",
+		                     "The Spanning Tree Protocol (STP) forwarding "
+		                     "delay, in seconds.",
+		                     0, BR_MAX_FORWARD_DELAY, 15,
+		                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge:hello-time:
+	 *
+	 * The Spanning Tree Protocol (STP) hello time, in seconds.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_HELLO_TIME,
+		  g_param_spec_uint (NM_SETTING_BRIDGE_HELLO_TIME,
+		                     "HelloTime",
+		                     "The Spanning Tree Protocol (STP) hello time, in "
+		                     "seconds.",
+		                     0, BR_MAX_HELLO_TIME, 2,
+		                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge:max-age:
+	 *
+	 * The Spanning Tree Protocol (STP) maximum message age, in seconds.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_MAX_AGE,
+		  g_param_spec_uint (NM_SETTING_BRIDGE_MAX_AGE,
+		                     "MaxAge",
+		                     "The Spanning Tree Protocol (STP) maximum message "
+		                     "age, in seconds.",
+		                     0, BR_MAX_MAX_AGE, 20,
+		                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
+	 * NMSettingBridge:ageing-time:
+	 *
+	 * The ethernet MAC address aging time, in seconds.
+	 **/
+	 g_object_class_install_property
+		 (object_class, PROP_AGEING_TIME,
+		  g_param_spec_uint (NM_SETTING_BRIDGE_AGEING_TIME,
+		                     "AgeingTime",
+		                     "The ethernet MAC address aging time, in seconds.",
+		                     0, BR_MAX_AGEING_TIME, 300,
+		                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+}
+
diff --git a/libnm-util/nm-setting-bridge.h b/libnm-util/nm-setting-bridge.h
new file mode 100644
index 00000000..7b9f92be
--- /dev/null
+++ b/libnm-util/nm-setting-bridge.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * Thomas Graf <tgraf@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2011 - 2012 Red Hat, Inc.
+ */
+
+#ifndef NM_SETTING_BRIDGE_H
+#define NM_SETTING_BRIDGE_H
+
+#include <nm-setting.h>
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_SETTING_BRIDGE            (nm_setting_bridge_get_type ())
+#define NM_SETTING_BRIDGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_BRIDGE, NMSettingBridge))
+#define NM_SETTING_BRIDGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_BRIDGE, NMSettingBridgeClass))
+#define NM_IS_SETTING_BRIDGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_BRIDGE))
+#define NM_IS_SETTING_BRIDGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_BRIDGE))
+#define NM_SETTING_BRIDGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_BRIDGE, NMSettingBridgeClass))
+
+#define NM_SETTING_BRIDGE_SETTING_NAME "bridge"
+
+/**
+ * NMSettingBridgeError:
+ * @NM_SETTING_BRIDGE_ERROR_UNKNOWN: unknown or unclassified error
+ * @NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY: the property was invalid
+ * @NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY: the property was missing and is
+ * required
+ */
+typedef enum {
+	NM_SETTING_BRIDGE_ERROR_UNKNOWN = 0,      /*< nick=UnknownError >*/
+	NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/
+	NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/
+} NMSettingBridgeError;
+
+#define NM_SETTING_BRIDGE_ERROR nm_setting_bridge_error_quark ()
+GQuark nm_setting_bridge_error_quark (void);
+
+#define NM_SETTING_BRIDGE_INTERFACE_NAME "interface-name"
+#define NM_SETTING_BRIDGE_STP            "stp"
+#define NM_SETTING_BRIDGE_PRIORITY       "priority"
+#define NM_SETTING_BRIDGE_FORWARD_DELAY  "forward-delay"
+#define NM_SETTING_BRIDGE_HELLO_TIME     "hello-time"
+#define NM_SETTING_BRIDGE_MAX_AGE        "max-age"
+#define NM_SETTING_BRIDGE_AGEING_TIME    "ageing-time"
+
+typedef struct {
+	NMSetting parent;
+} NMSettingBridge;
+
+typedef struct {
+	NMSettingClass parent;
+
+	/* Padding for future expansion */
+	void (*_reserved1) (void);
+	void (*_reserved2) (void);
+	void (*_reserved3) (void);
+	void (*_reserved4) (void);
+} NMSettingBridgeClass;
+
+GType nm_setting_bridge_get_type (void);
+
+NMSetting *  nm_setting_bridge_new                (void);
+
+const char * nm_setting_bridge_get_interface_name (NMSettingBridge *setting);
+
+gboolean     nm_setting_bridge_get_stp            (NMSettingBridge *setting);
+
+guint16      nm_setting_bridge_get_priority       (NMSettingBridge *setting);
+
+guint16      nm_setting_bridge_get_forward_delay  (NMSettingBridge *setting);
+
+guint16      nm_setting_bridge_get_hello_time     (NMSettingBridge *setting);
+
+guint16      nm_setting_bridge_get_max_age        (NMSettingBridge *setting);
+
+guint32      nm_setting_bridge_get_ageing_time    (NMSettingBridge *setting);
+
+G_END_DECLS
+
+#endif /* NM_SETTING_BRIDGE_H */
diff --git a/libnm-util/nm-setting-cdma.c b/libnm-util/nm-setting-cdma.c
index 43bf93b1..d68531a6 100644
--- a/libnm-util/nm-setting-cdma.c
+++ b/libnm-util/nm-setting-cdma.c
@@ -54,7 +54,12 @@ nm_setting_cdma_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_CDMA_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_CDMA_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CDMA)
 
 #define NM_SETTING_CDMA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CDMA, NMSettingCdmaPrivate))
 
diff --git a/libnm-util/nm-setting-connection.c b/libnm-util/nm-setting-connection.c
index 80380f3c..1222f976 100644
--- a/libnm-util/nm-setting-connection.c
+++ b/libnm-util/nm-setting-connection.c
@@ -19,16 +19,16 @@
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
+ * (C) Copyright 2007 - 2012 Red Hat, Inc.
  * (C) Copyright 2007 - 2008 Novell, Inc.
  */
 
 #include <string.h>
-#include <ctype.h>
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-param-spec-specialized.h"
 #include "nm-setting-connection.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-connection
@@ -59,7 +59,12 @@ nm_setting_connection_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_CONNECTION_SETTING_NAME,
+                                               g_define_type_id,
+                                               0,
+                                               NM_SETTING_CONNECTION_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CONNECTION)
 
 #define NM_SETTING_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionPrivate))
 
@@ -83,6 +88,7 @@ typedef struct {
 	guint64 timestamp;
 	gboolean read_only;
 	char *zone;
+	GSList *secondaries; /* secondary connections to activate with the base connection */
 } NMSettingConnectionPrivate;
 
 enum {
@@ -97,6 +103,7 @@ enum {
 	PROP_ZONE,
 	PROP_MASTER,
 	PROP_SLAVE_TYPE,
+	PROP_SECONDARIES,
 
 	LAST_PROP
 };
@@ -529,31 +536,103 @@ nm_setting_connection_is_slave_type (NMSettingConnection *setting,
 	return !g_strcmp0 (NM_SETTING_CONNECTION_GET_PRIVATE (setting)->slave_type, type);
 }
 
-static gint
-find_setting_by_name (gconstpointer a, gconstpointer b)
+/**
+ * nm_setting_connection_get_num_secondaries:
+ * @setting: the #NMSettingConnection
+ *
+ * Returns: the number of configured secondary connection UUIDs
+ **/
+guint32
+nm_setting_connection_get_num_secondaries (NMSettingConnection *setting)
 {
-	NMSetting *setting = NM_SETTING (a);
-	const char *str = (const char *) b;
+	g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), 0);
 
-	return strcmp (nm_setting_get_name (setting), str);
+	return g_slist_length (NM_SETTING_CONNECTION_GET_PRIVATE (setting)->secondaries);
 }
 
-static gboolean
-validate_uuid (const char *uuid)
+/**
+ * nm_setting_connection_get_secondary:
+ * @setting: the #NMSettingConnection
+ * @idx: the zero-based index of the secondary connection UUID entry
+ *
+ * Returns: the secondary connection UUID at index @idx
+ **/
+const char *
+nm_setting_connection_get_secondary (NMSettingConnection *setting, guint32 idx)
 {
-	int i;
+	NMSettingConnectionPrivate *priv;
 
-	if (!uuid || !strlen (uuid))
-		return FALSE;
+	g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL);
+
+	priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting);
+	g_return_val_if_fail (idx <= g_slist_length (priv->secondaries), NULL);
+
+	return (const char *) g_slist_nth_data (priv->secondaries, idx);
+}
+
+/**
+ * nm_setting_connection_add_secondary:
+ * @setting: the #NMSettingConnection
+ * @sec_uuid: the secondary connection UUID to add
+ *
+ * Adds a new secondary connetion UUID to the setting.
+ *
+ * Returns: %TRUE if the secondary connection UUID was added; %FALSE if the UUID
+ * was already present
+ **/
+gboolean
+nm_setting_connection_add_secondary (NMSettingConnection *setting,
+                                     const char *sec_uuid)
+{
+	NMSettingConnectionPrivate *priv;
+	GSList *iter;
 
-	for (i = 0; i < strlen (uuid); i++) {
-		if (!isxdigit (uuid[i]) && (uuid[i] != '-'))
+	g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE);
+	g_return_val_if_fail (sec_uuid != NULL, FALSE);
+	g_return_val_if_fail (sec_uuid[0] != '\0', FALSE);
+
+	priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting);
+	for (iter = priv->secondaries; iter; iter = g_slist_next (iter)) {
+		if (!strcmp (sec_uuid, (char *) iter->data))
 			return FALSE;
 	}
 
+	priv->secondaries = g_slist_append (priv->secondaries, g_strdup (sec_uuid));
 	return TRUE;
 }
 
+/**
+ * nm_setting_connection_remove_secondary:
+ * @setting: the #NMSettingConnection
+ * @idx: index number of the secondary connection UUID
+ *
+ * Removes the secondary coonnection UUID at index @idx.
+ **/
+void
+nm_setting_connection_remove_secondary (NMSettingConnection *setting, guint32 idx)
+{
+	NMSettingConnectionPrivate *priv;
+	GSList *elt;
+
+	g_return_if_fail (NM_IS_SETTING_CONNECTION (setting));
+
+	priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting);
+	elt = g_slist_nth (priv->secondaries, idx);
+	g_return_if_fail (elt != NULL);
+
+	g_free (elt->data);
+	priv->secondaries = g_slist_delete_link (priv->secondaries, elt);
+}
+
+static gint
+find_setting_by_name (gconstpointer a, gconstpointer b)
+{
+	NMSetting *setting = NM_SETTING (a);
+	const char *str = (const char *) b;
+
+	return strcmp (nm_setting_get_name (setting), str);
+}
+
 static gboolean
 verify (NMSetting *setting, GSList *all_settings, GError **error)
 {
@@ -579,7 +658,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		             NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY,
 		             NM_SETTING_CONNECTION_UUID);
 		return FALSE;
-	} else if (!validate_uuid (priv->uuid)) {
+	} else if (!nm_utils_is_uuid (priv->uuid)) {
 		g_set_error (error,
 		             NM_SETTING_CONNECTION_ERROR,
 		             NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY,
@@ -750,6 +829,10 @@ set_property (GObject *object, guint prop_id,
 		g_free (priv->slave_type);
 		priv->slave_type = g_value_dup_string (value);
 		break;
+	case PROP_SECONDARIES:
+		nm_utils_slist_free (priv->secondaries, g_free);
+		priv->secondaries = g_value_dup_boxed (value);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -804,6 +887,9 @@ get_property (GObject *object, guint prop_id,
 	case PROP_SLAVE_TYPE:
 		g_value_set_string (value, nm_setting_connection_get_slave_type (setting));
 		break;
+	case PROP_SECONDARIES:
+		g_value_set_boxed (value, priv->secondaries);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -1042,4 +1128,19 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
 		                      "connection is not a slave.",
 		                      NULL,
 		                      G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE));
+
+	/**
+	 * NMSettingConnection:secondaries:
+	 *
+	 * List of connection UUIDs that should be activated when the base connection
+	 * itself is activated.
+	 **/
+	g_object_class_install_property
+		(object_class, PROP_SECONDARIES,
+		 _nm_param_spec_specialized (NM_SETTING_CONNECTION_SECONDARIES,
+		                             "Secondaries",
+		                             "List of connection UUIDs that should be activated "
+		                             "when the base connection itself is activated.",
+		                             DBUS_TYPE_G_LIST_OF_STRING,
+		                             G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE));
 }
diff --git a/libnm-util/nm-setting-connection.h b/libnm-util/nm-setting-connection.h
index 44b0f845..73c598cb 100644
--- a/libnm-util/nm-setting-connection.h
+++ b/libnm-util/nm-setting-connection.h
@@ -19,7 +19,7 @@
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * (C) Copyright 2007 - 2012 Red Hat, Inc.
  * (C) Copyright 2007 - 2008 Novell, Inc.
  */
 
@@ -78,6 +78,7 @@ GQuark nm_setting_connection_error_quark (void);
 #define NM_SETTING_CONNECTION_ZONE        "zone"
 #define NM_SETTING_CONNECTION_MASTER      "master"
 #define NM_SETTING_CONNECTION_SLAVE_TYPE  "slave-type"
+#define NM_SETTING_CONNECTION_SECONDARIES "secondaries"
 
 /**
  * NMSettingConnection:
@@ -127,6 +128,10 @@ const char *nm_setting_connection_get_master           (NMSettingConnection *set
 gboolean    nm_setting_connection_is_slave_type        (NMSettingConnection *setting,
 							const char *type);
 const char *nm_setting_connection_get_slave_type       (NMSettingConnection *setting);
+guint32     nm_setting_connection_get_num_secondaries  (NMSettingConnection *setting);
+const char *nm_setting_connection_get_secondary        (NMSettingConnection *setting, guint32 idx);
+gboolean    nm_setting_connection_add_secondary        (NMSettingConnection *setting, const char *sec_uuid);
+void        nm_setting_connection_remove_secondary     (NMSettingConnection *setting, guint32 idx);
 
 G_END_DECLS
 
diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c
index 2264d008..ea83c73c 100644
--- a/libnm-util/nm-setting-gsm.c
+++ b/libnm-util/nm-setting-gsm.c
@@ -24,7 +24,6 @@
  */
 
 #include <string.h>
-#include <ctype.h>
 #include "nm-setting-gsm.h"
 #include "nm-utils.h"
 #include "nm-setting-private.h"
@@ -57,7 +56,12 @@ nm_setting_gsm_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_GSM_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_GSM_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_GSM)
 
 #define NM_SETTING_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GSM, NMSettingGsmPrivate))
 
@@ -306,7 +310,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		 * like space ( ) and such.
 		 */
 		for (i = 0; i < apn_len; i++) {
-			if (   !isalnum (priv->apn[i])
+			if (   !g_ascii_isalnum (priv->apn[i])
 			    && (priv->apn[i] != '.')
 			    && (priv->apn[i] != '_')
 			    && (priv->apn[i] != '-')) {
@@ -349,7 +353,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		}
 
 		for (i = 0; i < nid_len; i++) {
-			if (!isdigit (priv->network_id[i])) {
+			if (!g_ascii_isdigit (priv->network_id[i])) {
 				g_set_error (error,
 				             NM_SETTING_GSM_ERROR,
 				             NM_SETTING_GSM_ERROR_INVALID_PROPERTY,
@@ -658,10 +662,10 @@ nm_setting_gsm_class_init (NMSettingGsmClass *setting_class)
 					    "Network preference to force the device to only use "
 					    "specific network technologies.  The permitted values "
 					    "are: -1: any, 0: 3G only, 1: GPRS/EDGE only, "
-					    "2: prefer 3G, and 3: prefer 2G.  Note that not all "
-					    "devices allow network preference control.",
+					    "2: prefer 3G, 3: prefer 2G, 4: prefer 4G/LTE, 5: 4G/LTE only. "
+					    "Note that not all devices allow network preference control.",
 					    NM_SETTING_GSM_NETWORK_TYPE_ANY,
-					    NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE,
+					    NM_SETTING_GSM_NETWORK_TYPE_4G,
 					    NM_SETTING_GSM_NETWORK_TYPE_ANY,
 					    G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
 
diff --git a/libnm-util/nm-setting-gsm.h b/libnm-util/nm-setting-gsm.h
index 12114e32..2303f762 100644
--- a/libnm-util/nm-setting-gsm.h
+++ b/libnm-util/nm-setting-gsm.h
@@ -81,6 +81,10 @@ GQuark nm_setting_gsm_error_quark (void);
  * preferred but 2G-type technologies may be used as a fallback
  * @NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE: 2G-type technologies are
  * preferred but 3G-type technologies may be used as a fallback
+ * @NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G: 4G/LTE-type technologies are
+ * preferred but 3G/2/-type technologies may be used as a fallback
+ * @NM_SETTING_GSM_NETWORK_TYPE_4G: only 4G/LTE type
+ * technologies may be used
  *
  * #NMSettingGsmNetworkType values indicate the allowed access technologies
  * the device may use when connecting to this network.
@@ -90,7 +94,9 @@ typedef enum {
 	NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA = 0,
 	NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE = 1,
 	NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA = 2,
-	NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE = 3
+	NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE = 3,
+	NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G = 4,
+	NM_SETTING_GSM_NETWORK_TYPE_4G = 5
 } NMSettingGsmNetworkType;
 
 /**
diff --git a/libnm-util/nm-setting-infiniband.c b/libnm-util/nm-setting-infiniband.c
index dbef5b8a..ee40aa0e 100644
--- a/libnm-util/nm-setting-infiniband.c
+++ b/libnm-util/nm-setting-infiniband.c
@@ -25,6 +25,7 @@
 #include "nm-setting-infiniband.h"
 #include "nm-param-spec-specialized.h"
 #include "nm-utils-private.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-infiniband
@@ -52,7 +53,12 @@ nm_setting_infiniband_error_quark (void)
 	return quark;
 }
 
-G_DEFINE_TYPE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_INFINIBAND_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_INFINIBAND_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_INFINIBAND)
 
 #define NM_SETTING_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandPrivate))
 
diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c
index 5dc9199b..c6becefb 100644
--- a/libnm-util/nm-setting-ip4-config.c
+++ b/libnm-util/nm-setting-ip4-config.c
@@ -31,7 +31,7 @@
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-glib-compat.h"
-
+#include "nm-setting-private.h"
 
 
 /**
@@ -63,7 +63,12 @@ nm_setting_ip4_config_error_quark (void)
 G_DEFINE_BOXED_TYPE (NMIP4Address, nm_ip4_address, nm_ip4_address_dup, nm_ip4_address_unref)
 G_DEFINE_BOXED_TYPE (NMIP4Route, nm_ip4_route, nm_ip4_route_dup, nm_ip4_route_unref)
 
-G_DEFINE_TYPE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_IP4_CONFIG_SETTING_NAME,
+                                               g_define_type_id,
+                                               4,
+                                               NM_SETTING_IP4_CONFIG_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP4_CONFIG)
 
 #define NM_SETTING_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigPrivate))
 
@@ -996,7 +1001,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
 	 * List of DNS servers (network byte order).  For the 'auto' method, these
 	 * DNS servers are appended to those (if any) returned by automatic
 	 * configuration.  DNS servers cannot be used with the 'shared', 'link-local',
-	 * or 'disabled' methods as there is no usptream network.  In all other
+	 * or 'disabled' methods as there is no upstream network.  In all other
 	 * methods, these DNS servers are used as the only DNS servers for this
 	 * connection.
 	 **/
@@ -1009,7 +1014,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
 							   "appended to those (if any) returned by automatic "
 							   "configuration.  DNS servers cannot be used with "
 							   "the 'shared', 'link-local', or 'disabled' "
-							   "methods as there is no usptream network.  In all "
+							   "methods as there is no upstream network.  In all "
 							   "other methods, these DNS servers are used as the "
 							   "only DNS servers for this connection.",
 							   DBUS_TYPE_G_UINT_ARRAY,
@@ -1143,7 +1148,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
 	 * NMSettingIP4Config:dhcp-client-id:
 	 *
 	 * A string sent to the DHCP server to identify the local machine which the
-	 * DHCP server may use to cusomize the DHCP lease and options.
+	 * DHCP server may use to customize the DHCP lease and options.
 	 **/
 	g_object_class_install_property
 		(object_class, PROP_DHCP_CLIENT_ID,
@@ -1151,7 +1156,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
 						   "DHCP Client ID",
 						   "A string sent to the DHCP server to identify the "
 						   "local machine which the DHCP server may use to "
-						   "cusomize the DHCP lease and options.",
+						   "customize the DHCP lease and options.",
 						   NULL,
 						   G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
 
diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c
index c6a84f8e..00e27aea 100644
--- a/libnm-util/nm-setting-ip6-config.c
+++ b/libnm-util/nm-setting-ip6-config.c
@@ -30,6 +30,7 @@
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-glib-compat.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-ip6-config
@@ -60,12 +61,18 @@ nm_setting_ip6_config_error_quark (void)
 G_DEFINE_BOXED_TYPE (NMIP6Address, nm_ip6_address, nm_ip6_address_dup, nm_ip6_address_unref)
 G_DEFINE_BOXED_TYPE (NMIP6Route, nm_ip6_route, nm_ip6_route_dup, nm_ip6_route_unref)
 
-G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME,
+                                               g_define_type_id,
+                                               4,
+                                               NM_SETTING_IP6_CONFIG_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP6_CONFIG)
 
 #define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate))
 
 typedef struct {
 	char *method;
+	char *dhcp_hostname;
 	GSList *dns;        /* array of struct in6_addr */
 	GSList *dns_search; /* list of strings */
 	GSList *addresses;  /* array of NMIP6Address */
@@ -81,6 +88,7 @@ typedef struct {
 enum {
 	PROP_0,
 	PROP_METHOD,
+	PROP_DHCP_HOSTNAME,
 	PROP_DNS,
 	PROP_DNS_SEARCH,
 	PROP_ADDRESSES,
@@ -122,6 +130,23 @@ nm_setting_ip6_config_get_method (NMSettingIP6Config *setting)
 }
 
 /**
+ * nm_setting_ip6_config_get_dhcp_hostname:
+ * @setting: the #NMSettingIP6Config
+ *
+ * Returns the value contained in the #NMSettingIP6Config:dhcp-hostname
+ * property.
+ *
+ * Returns: the configured hostname to send to the DHCP server
+ **/
+const char *
+nm_setting_ip6_config_get_dhcp_hostname (NMSettingIP6Config *setting)
+{
+	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL);
+
+	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dhcp_hostname;
+}
+
+/**
  * nm_setting_ip6_config_get_num_dns:
  * @setting: the #NMSettingIP6Config
  *
@@ -693,6 +718,14 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		return FALSE;
 	}
 
+	if (priv->dhcp_hostname && !strlen (priv->dhcp_hostname)) {
+		g_set_error (error,
+		             NM_SETTING_IP6_CONFIG_ERROR,
+		             NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY,
+		             NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME);
+		return FALSE;
+	}
+
 	return TRUE;
 }
 
@@ -751,6 +784,10 @@ set_property (GObject *object, guint prop_id,
 	case PROP_IGNORE_AUTO_DNS:
 		priv->ignore_auto_dns = g_value_get_boolean (value);
 		break;
+	case PROP_DHCP_HOSTNAME:
+		g_free (priv->dhcp_hostname);
+		priv->dhcp_hostname = g_value_dup_string (value);
+		break;
 	case PROP_NEVER_DEFAULT:
 		priv->never_default = g_value_get_boolean (value);
 		break;
@@ -794,6 +831,9 @@ get_property (GObject *object, guint prop_id,
 	case PROP_IGNORE_AUTO_DNS:
 		g_value_set_boolean (value, priv->ignore_auto_dns);
 		break;
+	case PROP_DHCP_HOSTNAME:
+		g_value_set_string (value, priv->dhcp_hostname);
+		break;
 	case PROP_NEVER_DEFAULT:
 		g_value_set_boolean (value, priv->never_default);
 		break;
@@ -860,6 +900,20 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
 						      G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
 
 	/**
+	 * NMSettingIP6Config:dhcp-hostname:
+	 *
+	 * The specified name will be sent to the DHCP server when acquiring a lease.
+	 **/
+	g_object_class_install_property
+		(object_class, PROP_DHCP_HOSTNAME,
+		 g_param_spec_string (NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME,
+		                      "DHCP Hostname",
+		                      "The specified name will be sent to the DHCP server "
+		                      "when acquiring a lease.",
+		                      NULL,
+		                      G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
+
+	/**
 	 * NMSettingIP6Config:dns:
 	 *
 	 * Array of DNS servers, where each member of the array is a byte array
diff --git a/libnm-util/nm-setting-ip6-config.h b/libnm-util/nm-setting-ip6-config.h
index 05c16668..29650486 100644
--- a/libnm-util/nm-setting-ip6-config.h
+++ b/libnm-util/nm-setting-ip6-config.h
@@ -69,6 +69,8 @@ GQuark nm_setting_ip6_config_error_quark (void);
 #define NM_SETTING_IP6_CONFIG_NEVER_DEFAULT      "never-default"
 #define NM_SETTING_IP6_CONFIG_MAY_FAIL           "may-fail"
 #define NM_SETTING_IP6_CONFIG_IP6_PRIVACY        "ip6-privacy"
+#define NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME      "dhcp-hostname"
+
 
 /**
  * NM_SETTING_IP6_CONFIG_METHOD_IGNORE:
@@ -239,6 +241,7 @@ void                   nm_setting_ip6_config_clear_routes           (NMSettingIP
 gboolean               nm_setting_ip6_config_get_ignore_auto_routes (NMSettingIP6Config *setting);
 
 gboolean               nm_setting_ip6_config_get_ignore_auto_dns    (NMSettingIP6Config *setting);
+const char *           nm_setting_ip6_config_get_dhcp_hostname      (NMSettingIP6Config *setting);
 gboolean               nm_setting_ip6_config_get_never_default      (NMSettingIP6Config *setting);
 gboolean               nm_setting_ip6_config_get_may_fail           (NMSettingIP6Config *setting);
 NMSettingIP6ConfigPrivacy nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting);
diff --git a/libnm-util/nm-setting-olpc-mesh.c b/libnm-util/nm-setting-olpc-mesh.c
index 96770e4f..bf87aa57 100644
--- a/libnm-util/nm-setting-olpc-mesh.c
+++ b/libnm-util/nm-setting-olpc-mesh.c
@@ -35,6 +35,7 @@
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-utils-private.h"
+#include "nm-setting-private.h"
 
 GQuark
 nm_setting_olpc_mesh_error_quark (void)
@@ -48,7 +49,12 @@ nm_setting_olpc_mesh_error_quark (void)
 
 static void nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting);
 
-G_DEFINE_TYPE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_OLPC_MESH_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_OLPC_MESH_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_OLPC_MESH)
 
 #define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate))
 
diff --git a/libnm-util/nm-setting-ppp.c b/libnm-util/nm-setting-ppp.c
index ee9b5f59..09cf3de6 100644
--- a/libnm-util/nm-setting-ppp.c
+++ b/libnm-util/nm-setting-ppp.c
@@ -24,6 +24,7 @@
  */
 
 #include "nm-setting-ppp.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-ppp
@@ -54,7 +55,12 @@ nm_setting_ppp_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingPPP, nm_setting_ppp, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingPPP, nm_setting_ppp, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_PPP_SETTING_NAME,
+                                               g_define_type_id,
+                                               3,
+                                               NM_SETTING_PPP_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPP)
 
 #define NM_SETTING_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPP, NMSettingPPPPrivate))
 
diff --git a/libnm-util/nm-setting-pppoe.c b/libnm-util/nm-setting-pppoe.c
index 62c42f01..2785dfa9 100644
--- a/libnm-util/nm-setting-pppoe.c
+++ b/libnm-util/nm-setting-pppoe.c
@@ -56,7 +56,12 @@ nm_setting_pppoe_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingPPPOE, nm_setting_pppoe, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingPPPOE, nm_setting_pppoe, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_PPPOE_SETTING_NAME,
+                                               g_define_type_id,
+                                               3,
+                                               NM_SETTING_PPPOE_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPPOE)
 
 #define NM_SETTING_PPPOE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPPOE, NMSettingPPPOEPrivate))
 
diff --git a/libnm-util/nm-setting-private.h b/libnm-util/nm-setting-private.h
index 5c4e0a5e..1460841c 100644
--- a/libnm-util/nm-setting-private.h
+++ b/libnm-util/nm-setting-private.h
@@ -21,11 +21,23 @@
 #ifndef NM_SETTING_PRIVATE_H
 #define NM_SETTING_PRIVATE_H
 
+#include "nm-glib-compat.h"
+
 #define NM_SETTING_SECRET_FLAGS_ALL \
 	(NM_SETTING_SECRET_FLAG_NONE | \
 	 NM_SETTING_SECRET_FLAG_AGENT_OWNED | \
 	 NM_SETTING_SECRET_FLAG_NOT_SAVED | \
 	 NM_SETTING_SECRET_FLAG_NOT_REQUIRED)
 
+void _nm_register_setting (const char *name,
+                           const GType type,
+                           const guint32 priority,
+                           const GQuark error_quark);
+
+/* Ensure the setting's GType is registered at library load time */
+#define NM_SETTING_REGISTER_TYPE(x) \
+static void __attribute__((constructor)) register_setting (void) \
+{ g_type_init (); g_type_ensure (x); }
+
 #endif  /* NM_SETTING_PRIVATE_H */
 
diff --git a/libnm-util/nm-setting-serial.c b/libnm-util/nm-setting-serial.c
index 44f14986..203f5748 100644
--- a/libnm-util/nm-setting-serial.c
+++ b/libnm-util/nm-setting-serial.c
@@ -27,6 +27,7 @@
 
 #include "nm-setting-serial.h"
 #include "nm-glib-compat.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-serial
@@ -57,7 +58,12 @@ nm_setting_serial_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_SERIAL_SETTING_NAME,
+                                               g_define_type_id,
+                                               2,
+                                               NM_SETTING_SERIAL_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_SERIAL)
 
 #define NM_SETTING_SERIAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_SERIAL, NMSettingSerialPrivate))
 
diff --git a/libnm-util/nm-setting-vlan.c b/libnm-util/nm-setting-vlan.c
index f69e0d85..df7f0702 100644
--- a/libnm-util/nm-setting-vlan.c
+++ b/libnm-util/nm-setting-vlan.c
@@ -21,12 +21,16 @@
  * (C) Copyright 2011 - 2012 Red Hat, Inc.
  */
 
+#include <stdlib.h>
+#include <string.h>
 #include <dbus/dbus-glib.h>
+
 #include "nm-setting-vlan.h"
 #include "nm-param-spec-specialized.h"
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-setting-connection.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-vlan
@@ -54,7 +58,12 @@ nm_setting_vlan_error_quark (void)
 	return quark;
 }
 
-G_DEFINE_TYPE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_VLAN_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_VLAN_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VLAN)
 
 #define NM_SETTING_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VLAN, NMSettingVlanPrivate))
 
@@ -436,29 +445,68 @@ static gboolean
 verify (NMSetting *setting, GSList *all_settings, GError **error)
 {
 	NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting);
-
-	if (priv->iface_name && !priv->iface_name[0]) {
-		g_set_error (error,
-		             NM_SETTING_VLAN_ERROR,
-		             NM_SETTING_VLAN_ERROR_INVALID_PROPERTY,
-		             NM_SETTING_VLAN_INTERFACE_NAME);
-		return FALSE;
+	NMSettingConnection *s_con = NULL;
+	NMSettingWired *s_wired = NULL;
+	GSList *iter;
+
+	for (iter = all_settings; iter; iter = iter->next) {
+		if (NM_IS_SETTING_CONNECTION (iter->data))
+			s_con = iter->data;
+		else if (NM_IS_SETTING_WIRED (iter->data))
+			s_wired = iter->data;
 	}
 
-	if (priv->parent && !priv->parent[0]) {
+	/* If iface_name is specified, it must be a valid interface name. We
+	 * don't check that it matches parent and/or id, because we allowing
+	 * renaming vlans to arbitrary names.
+	 */
+	if (priv->iface_name && !nm_utils_iface_valid_name (priv->iface_name)) {
 		g_set_error (error,
 		             NM_SETTING_VLAN_ERROR,
 		             NM_SETTING_VLAN_ERROR_INVALID_PROPERTY,
-		             NM_SETTING_VLAN_PARENT);
+		             NM_SETTING_VLAN_INTERFACE_NAME);
 		return FALSE;
 	}
 
-	if (priv->id > 4095) {
-		g_set_error (error,
-		             NM_SETTING_VLAN_ERROR,
-		             NM_SETTING_VLAN_ERROR_INVALID_PROPERTY,
-		             NM_SETTING_VLAN_ID);
-		return FALSE;
+	if (priv->parent) {
+		if (nm_utils_is_uuid (priv->parent)) {
+			/* If we have an NMSettingConnection:master with slave-type="vlan",
+			 * then it must be the same UUID.
+			 */
+			if (s_con) {
+				const char *master = NULL, *slave_type = NULL;
+
+				slave_type = nm_setting_connection_get_slave_type (s_con);
+				if (!g_strcmp0 (slave_type, NM_SETTING_VLAN_SETTING_NAME))
+					master = nm_setting_connection_get_master (s_con);
+
+				if (master && g_strcmp0 (priv->parent, master) != 0) {
+					g_set_error (error,
+					             NM_SETTING_VLAN_ERROR,
+					             NM_SETTING_VLAN_ERROR_INVALID_PARENT,
+					             NM_SETTING_CONNECTION_MASTER);
+					return FALSE;
+				}
+			}
+		} else if (!nm_utils_iface_valid_name (priv->parent)) {
+			/* parent must be either a UUID or an interface name */
+			g_set_error (error,
+			             NM_SETTING_VLAN_ERROR,
+			             NM_SETTING_VLAN_ERROR_INVALID_PROPERTY,
+			             NM_SETTING_VLAN_PARENT);
+			return FALSE;
+		} 
+	} else {
+		/* If parent is NULL, the parent must be specified via
+		 * NMSettingWired:mac-address.
+		 */
+		if (!s_wired || !nm_setting_wired_get_mac_address (s_wired)) {
+			g_set_error (error,
+			             NM_SETTING_VLAN_ERROR,
+			             NM_SETTING_VLAN_ERROR_MISSING_PROPERTY,
+			             NM_SETTING_VLAN_PARENT);
+			return FALSE;
+		}
 	}
 
 	if (priv->flags & ~(NM_VLAN_FLAG_REORDER_HEADERS |
diff --git a/libnm-util/nm-setting-vlan.h b/libnm-util/nm-setting-vlan.h
index 9d2d728b..019c6da0 100644
--- a/libnm-util/nm-setting-vlan.h
+++ b/libnm-util/nm-setting-vlan.h
@@ -43,12 +43,15 @@ G_BEGIN_DECLS
  * @NM_SETTING_VLAN_ERROR_UNKNOWN: unknown or unclassified error
  * @NM_SETTING_VLAN_ERROR_INVALID_PROPERTY: the property was invalid
  * @NM_SETTING_VLAN_ERROR_MISSING_PROPERTY: the property was missing and is
- * required
+ *   required
+ * @NM_SETTING_VLAN_ERROR_INVALID_PARENT: the VLAN parent was specified
+ *   inconsistently
  */
 typedef enum {
 	NM_SETTING_VLAN_ERROR_UNKNOWN = 0,      /*< nick=Unknown >*/
 	NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, /*< nick=InvalidProperty >*/
-	NM_SETTING_VLAN_ERROR_MISSING_PROPERTY  /*< nick=MissingProperty >*/
+	NM_SETTING_VLAN_ERROR_MISSING_PROPERTY, /*< nick=MissingProperty >*/
+	NM_SETTING_VLAN_ERROR_INVALID_PARENT    /*< nick=InvalidParent >*/
 } NMSettingVlanError;
 
 #define NM_SETTING_VLAN_ERROR nm_setting_vlan_error_quark ()
diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c
index d1fc8b76..0acd9a52 100644
--- a/libnm-util/nm-setting-vpn.c
+++ b/libnm-util/nm-setting-vpn.c
@@ -64,7 +64,12 @@ nm_setting_vpn_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingVPN, nm_setting_vpn, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingVPN, nm_setting_vpn, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_VPN_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_VPN_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VPN)
 
 #define NM_SETTING_VPN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VPN, NMSettingVPNPrivate))
 
diff --git a/libnm-util/nm-setting-wimax.c b/libnm-util/nm-setting-wimax.c
index a099cad2..b4a0d418 100644
--- a/libnm-util/nm-setting-wimax.c
+++ b/libnm-util/nm-setting-wimax.c
@@ -26,6 +26,7 @@
 
 #include "nm-setting-wimax.h"
 #include "nm-param-spec-specialized.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-wimax
@@ -54,7 +55,12 @@ nm_setting_wimax_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_WIMAX_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_WIMAX_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIMAX)
 
 #define NM_SETTING_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIMAX, NMSettingWimaxPrivate))
 
diff --git a/libnm-util/nm-setting-wired.c b/libnm-util/nm-setting-wired.c
index fb21711d..f44d6df6 100644
--- a/libnm-util/nm-setting-wired.c
+++ b/libnm-util/nm-setting-wired.c
@@ -24,7 +24,6 @@
  */
 
 #include <string.h>
-#include <ctype.h>
 #include <net/ethernet.h>
 #include <dbus/dbus-glib.h>
 #include <netinet/ether.h>
@@ -34,6 +33,7 @@
 #include "nm-utils.h"
 #include "nm-utils-private.h"
 #include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-wired
@@ -62,7 +62,12 @@ nm_setting_wired_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_WIRED_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_WIRED_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRED)
 
 #define NM_SETTING_WIRED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRED, NMSettingWiredPrivate))
 
diff --git a/libnm-util/nm-setting-wireless-security.c b/libnm-util/nm-setting-wireless-security.c
index 336773c8..404a38ad 100644
--- a/libnm-util/nm-setting-wireless-security.c
+++ b/libnm-util/nm-setting-wireless-security.c
@@ -25,7 +25,6 @@
 
 #include <config.h>
 #include <string.h>
-#include <ctype.h>
 #include <dbus/dbus-glib.h>
 #include "nm-setting-wireless-security.h"
 #include "nm-setting-8021x.h"
@@ -76,7 +75,12 @@ nm_setting_wireless_security_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
+                                               g_define_type_id,
+                                               2,
+                                               NM_SETTING_WIRELESS_SECURITY_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS_SECURITY)
 
 #define NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityPrivate))
 
@@ -704,13 +708,13 @@ verify_wep_key (const char *key, NMWepKeyType wep_type)
 		if (keylen == 10 || keylen == 26) {
 			/* Hex key */
 			for (i = 0; i < keylen; i++) {
-				if (!isxdigit (key[i]))
+				if (!g_ascii_isxdigit (key[i]))
 					return FALSE;
 			}
 		} else if (keylen == 5 || keylen == 13) {
 			/* ASCII key */
 			for (i = 0; i < keylen; i++) {
-				if (!isascii (key[i]))
+				if (!g_ascii_isprint (key[i]))
 					return FALSE;
 			}
 		} else
@@ -739,7 +743,7 @@ verify_wpa_psk (const char *psk)
 	if (psklen == 64) {
 		/* Hex PSK */
 		for (i = 0; i < psklen; i++) {
-			if (!isxdigit (psk[i]))
+			if (!g_ascii_isxdigit (psk[i]))
 				return FALSE;
 		}
 	}
diff --git a/libnm-util/nm-setting-wireless.c b/libnm-util/nm-setting-wireless.c
index f9ed3108..ace22cbc 100644
--- a/libnm-util/nm-setting-wireless.c
+++ b/libnm-util/nm-setting-wireless.c
@@ -34,6 +34,7 @@
 #include "nm-utils.h"
 #include "nm-dbus-glib-types.h"
 #include "nm-utils-private.h"
+#include "nm-setting-private.h"
 
 /**
  * SECTION:nm-setting-wireless
@@ -62,7 +63,12 @@ nm_setting_wireless_error_quark (void)
 }
 
 
-G_DEFINE_TYPE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING,
+                         _nm_register_setting (NM_SETTING_WIRELESS_SETTING_NAME,
+                                               g_define_type_id,
+                                               1,
+                                               NM_SETTING_WIRELESS_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS)
 
 #define NM_SETTING_WIRELESS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessPrivate))
 
@@ -187,14 +193,21 @@ nm_setting_wireless_ap_security_compatible (NMSettingWireless *s_wireless,
 	if (!strcmp (key_mgmt, "wpa-none")) {
 		if (ap_mode != NM_802_11_MODE_ADHOC)
 			return FALSE;
-		// FIXME: validate ciphers if the BSSID actually puts WPA/RSN IE in
-		// it's beacon
+		/* FIXME: validate ciphers if they're in the beacon */
 		return TRUE;
 	}
 
-	/* Stuff after this point requires infrastructure */
-	if (ap_mode != NM_802_11_MODE_INFRA)
-		return FALSE;
+	/* Adhoc WPA2 (ie, RSN IBSS) */
+	if (ap_mode == NM_802_11_MODE_ADHOC) {
+		if (strcmp (key_mgmt, "wpa-psk"))
+			return FALSE;
+
+		/* Ensure the AP has RSN PSK capability */
+		if (!(ap_rsn & NM_802_11_AP_SEC_KEY_MGMT_PSK))
+			return FALSE;
+
+		/* Fall through and check ciphers in generic WPA-PSK code */
+	}
 
 	/* Dynamic WEP or LEAP */
 	if (!strcmp (key_mgmt, "ieee8021x")) {
@@ -502,15 +515,16 @@ nm_setting_wireless_get_hidden (NMSettingWireless *setting)
  * @setting: the #NMSettingWireless
  * @bssid: the new BSSID to add to the list
  *
- * Adds a new WiFi AP's BSSID to the previously seen BSSID list of the setting.
- * NetworkManager tracks previously seen BSSIDs internally so this function
- * no longer has much use.
+ * Adds a new Wi-Fi AP's BSSID to the previously seen BSSID list of the setting.
+ * NetworkManager now tracks previously seen BSSIDs internally so this function
+ * no longer has much use. Actually, changes you make using this function will
+ * not be preserved.
  *
  * Returns: %TRUE if @bssid was already known, %FALSE if not
  **/
 gboolean
 nm_setting_wireless_add_seen_bssid (NMSettingWireless *setting,
-									const char *bssid)
+                                    const char *bssid)
 {
 	NMSettingWirelessPrivate *priv;
 	char *lower_bssid;
@@ -584,7 +598,7 @@ static gboolean
 verify (NMSetting *setting, GSList *all_settings, GError **error)
 {
 	NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting);
-	const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, NM_SETTING_WIRELESS_MODE_ADHOC, NULL };
+	const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, NM_SETTING_WIRELESS_MODE_ADHOC, NM_SETTING_WIRELESS_MODE_AP, NULL };
 	const char *valid_bands[] = { "a", "bg", NULL };
 	GSList *iter;
 
@@ -881,15 +895,15 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_class)
 	/**
 	 * NMSettingWireless:mode:
 	 *
-	 * WiFi network mode; one of 'infrastructure' or 'adhoc'.  If blank,
+	 * WiFi network mode; one of 'infrastructure', 'adhoc' or 'ap'.  If blank,
 	 * infrastructure is assumed.
 	 **/
 	g_object_class_install_property
 		(object_class, PROP_MODE,
 		 g_param_spec_string (NM_SETTING_WIRELESS_MODE,
 						  "Mode",
-						  "WiFi network mode; one of 'infrastructure' or "
-						  "'adhoc'.  If blank, infrastructure is assumed.",
+						  "WiFi network mode; one of 'infrastructure', "
+						  "'adhoc' or 'ap'.  If blank, infrastructure is assumed.",
 						  NULL,
 						  G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
 
@@ -1054,21 +1068,25 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_class)
 	 * NMSettingWireless: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 WiFI network.
-	 * NetworkManager internally tracks previously seen BSSIDs so this property
-	 * is no longer of much use.
+	 * '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 BBSID list of NetworkManager. The changes you
+	 * make to this property will not be preserved.
 	 **/
 	g_object_class_install_property
 		(object_class, PROP_SEEN_BSSIDS,
 		 _nm_param_spec_specialized (NM_SETTING_WIRELESS_SEEN_BSSIDS,
-							   "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 WiFI network. "
-							   "NetworkManager internally tracks previously seen "
-							   "BSSIDs so this property is no longer of much use.",
-							   DBUS_TYPE_G_LIST_OF_STRING,
-							   G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE));
+		                             "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 WiFI network. "
+		                             "NetworkManager internally tracks previously seen "
+		                             "BSSIDs. The property is only meant for reading "
+		                             "and reflects the BBSID list of NetworkManager. "
+		                             "The changes you make to this property will not be "
+		                             "preserved.",
+		                             DBUS_TYPE_G_LIST_OF_STRING,
+		                             G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE));
 
 	/**
 	 * NMSettingWireless:mtu:
diff --git a/libnm-util/nm-setting-wireless.h b/libnm-util/nm-setting-wireless.h
index e54e8353..6e9c4d68 100644
--- a/libnm-util/nm-setting-wireless.h
+++ b/libnm-util/nm-setting-wireless.h
@@ -86,6 +86,14 @@ GQuark nm_setting_wireless_error_quark (void);
 #define NM_SETTING_WIRELESS_MODE_ADHOC  "adhoc"
 
 /**
+ * NM_SETTING_WIRELESS_MODE_AP:
+ *
+ * Indicates AP/master mode where the wireless device is started as an access
+ * point/hotspot.
+ */
+#define NM_SETTING_WIRELESS_MODE_AP     "ap"
+
+/**
  * NM_SETTING_WIRELESS_MODE_INFRA:
  *
  * Indicates infrastructure mode where an access point is expected to be present
diff --git a/libnm-util/nm-utils-enum-types.c b/libnm-util/nm-utils-enum-types.c
index 332eb98b..7df362be 100644
--- a/libnm-util/nm-utils-enum-types.c
+++ b/libnm-util/nm-utils-enum-types.c
@@ -11,6 +11,8 @@
 #include "nm-setting-adsl.h" 
 #include "nm-setting-bluetooth.h" 
 #include "nm-setting-bond.h" 
+#include "nm-setting-bridge.h" 
+#include "nm-setting-bridge-port.h" 
 #include "nm-setting-connection.h" 
 #include "nm-setting-infiniband.h" 
 #include "nm-setting-ip4-config.h" 
@@ -280,6 +282,46 @@ nm_setting_bond_error_get_type (void)
   return g_define_type_id__volatile;
 }
 GType
+nm_setting_bridge_error_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const GEnumValue values[] = {
+        { NM_SETTING_BRIDGE_ERROR_UNKNOWN, "NM_SETTING_BRIDGE_ERROR_UNKNOWN", "UnknownError" },
+        { NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY, "NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY", "InvalidProperty" },
+        { NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY, "NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY", "MissingProperty" },
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_enum_register_static (g_intern_static_string ("NMSettingBridgeError"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+    }
+
+  return g_define_type_id__volatile;
+}
+GType
+nm_setting_bridge_port_error_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const GEnumValue values[] = {
+        { NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN, "NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN", "UnknownError" },
+        { NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY, "NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY", "InvalidProperty" },
+        { NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY, "NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY", "MissingProperty" },
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_enum_register_static (g_intern_static_string ("NMSettingBridgePortError"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+    }
+
+  return g_define_type_id__volatile;
+}
+GType
 nm_setting_connection_error_get_type (void)
 {
   static volatile gsize g_define_type_id__volatile = 0;
@@ -353,6 +395,7 @@ nm_setting_vlan_error_get_type (void)
         { NM_SETTING_VLAN_ERROR_UNKNOWN, "NM_SETTING_VLAN_ERROR_UNKNOWN", "Unknown" },
         { NM_SETTING_VLAN_ERROR_INVALID_PROPERTY, "NM_SETTING_VLAN_ERROR_INVALID_PROPERTY", "InvalidProperty" },
         { NM_SETTING_VLAN_ERROR_MISSING_PROPERTY, "NM_SETTING_VLAN_ERROR_MISSING_PROPERTY", "MissingProperty" },
+        { NM_SETTING_VLAN_ERROR_INVALID_PARENT, "NM_SETTING_VLAN_ERROR_INVALID_PARENT", "InvalidParent" },
         { 0, NULL, NULL }
       };
       GType g_define_type_id =
@@ -540,6 +583,8 @@ nm_setting_gsm_network_type_get_type (void)
         { NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE, "NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE", "gprs-edge" },
         { NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA, "NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA", "prefer-umts-hspa" },
         { NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE, "NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE", "prefer-gprs-edge" },
+        { NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G, "NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G", "prefer-4g" },
+        { NM_SETTING_GSM_NETWORK_TYPE_4G, "NM_SETTING_GSM_NETWORK_TYPE_4G", "4g" },
         { 0, NULL, NULL }
       };
       GType g_define_type_id =
diff --git a/libnm-util/nm-utils-enum-types.h b/libnm-util/nm-utils-enum-types.h
index d88fda24..44737b92 100644
--- a/libnm-util/nm-utils-enum-types.h
+++ b/libnm-util/nm-utils-enum-types.h
@@ -33,6 +33,10 @@ GType nm_setting_bluetooth_error_get_type (void) G_GNUC_CONST;
 #define NM_TYPE_SETTING_BLUETOOTH_ERROR (nm_setting_bluetooth_error_get_type ())
 GType nm_setting_bond_error_get_type (void) G_GNUC_CONST;
 #define NM_TYPE_SETTING_BOND_ERROR (nm_setting_bond_error_get_type ())
+GType nm_setting_bridge_error_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_SETTING_BRIDGE_ERROR (nm_setting_bridge_error_get_type ())
+GType nm_setting_bridge_port_error_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_SETTING_BRIDGE_PORT_ERROR (nm_setting_bridge_port_error_get_type ())
 GType nm_setting_connection_error_get_type (void) G_GNUC_CONST;
 #define NM_TYPE_SETTING_CONNECTION_ERROR (nm_setting_connection_error_get_type ())
 GType nm_setting_infiniband_error_get_type (void) G_GNUC_CONST;
diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c
index ad966c25..51ddfeb8 100644
--- a/libnm-util/nm-utils.c
+++ b/libnm-util/nm-utils.c
@@ -25,7 +25,6 @@
  */
 
 #include "config.h"
-#include <ctype.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -1204,6 +1203,42 @@ device_supports_ap_ciphers (guint32 dev_caps,
 }
 
 /**
+ * nm_utils_ap_mode_security_valid:
+ * @type: the security type to check device capabilties against,
+ * e.g. #NMU_SEC_STATIC_WEP
+ * @wifi_caps: bitfield of the capabilities of the specific WiFi device, e.g.
+ * #NM_WIFI_DEVICE_CAP_CIPHER_WEP40
+ *
+ * Given a set of device capabilities, and a desired security type to check
+ * against, determines whether the combination of device capabilities and
+ * desired security type are valid for AP/Hotspot connections.
+ *
+ * Returns: TRUE if the device capabilities are compatible with the desired
+ * @type, FALSE if they are not.
+ **/
+gboolean
+nm_utils_ap_mode_security_valid (NMUtilsSecurityType type,
+                                 NMDeviceWifiCapabilities wifi_caps)
+{
+	if (!(wifi_caps & NM_WIFI_DEVICE_CAP_AP))
+		return FALSE;
+
+	/* Return TRUE for any security that wpa_supplicant's lightweight AP
+	 * mode can handle: which is open, WEP, and WPA/WPA2 PSK.
+	 */
+	switch (type) {
+	case NMU_SEC_NONE:
+	case NMU_SEC_STATIC_WEP:
+	case NMU_SEC_WPA_PSK:
+	case NMU_SEC_WPA2_PSK:
+		return TRUE;
+	default:
+		break;
+	}
+	return FALSE;
+}
+
+/**
  * nm_utils_security_valid:
  * @type: the security type to check AP flags and device capabilties against,
  * e.g. #NMU_SEC_STATIC_WEP
@@ -1221,6 +1256,9 @@ device_supports_ap_ciphers (guint32 dev_caps,
  * against, determines whether the combination of device, desired security
  * type, and AP capabilities intersect.
  *
+ * NOTE: this function cannot handle checking security for AP/Hotspot mode;
+ * use nm_utils_ap_mode_security_valid() instead.
+ *
  * Returns: TRUE if the device capabilities and AP capabilties intersect and are
  * compatible with the desired @type, FALSE if they are not
  **/
@@ -2504,11 +2542,11 @@ nm_utils_hwaddr_aton (const char *asc, int type, gpointer buffer)
 	while (left && *in) {
 		guint8 d1 = in[0], d2 = in[1];
 
-		if (!isxdigit (d1))
+		if (!g_ascii_isxdigit (d1))
 			return NULL;
 
 		/* If there's no leading zero (ie "aa:b:cc") then fake it */
-		if (d2 && isxdigit (d2)) {
+		if (d2 && g_ascii_isxdigit (d2)) {
 			*out++ = (HEXVAL (d1) << 4) + HEXVAL (d2);
 			in += 2;
 		} else {
@@ -2582,3 +2620,60 @@ nm_utils_hwaddr_ntoa (gconstpointer addr, int type)
 
 	return g_string_free (out, FALSE);
 }
+
+/**
+ * nm_utils_iface_valid_name:
+ * @name: Name of interface
+ *
+ * This function is a 1:1 copy of the kernel's interface validation
+ * function in net/core/dev.c.
+ *
+ * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned.
+ */
+gboolean
+nm_utils_iface_valid_name (const char *name)
+{
+	g_return_val_if_fail (name != NULL, FALSE);
+
+	if (*name == '\0')
+		return FALSE;
+
+	if (strlen (name) >= 16)
+		return FALSE;
+
+	if (!strcmp (name, ".") || !strcmp (name, ".."))
+		return FALSE;
+
+	while (*name) {
+		if (*name == '/' || g_ascii_isspace (*name))
+			return FALSE;
+		name++;
+	}
+
+	return TRUE;
+}
+
+/**
+ * nm_utils_is_uuid:
+ * @str: a string that might be a UUID
+ *
+ * Checks if @str is a UUID
+ *
+ * Returns: %TRUE if @str is a UUID, %FALSE if not
+ */
+gboolean
+nm_utils_is_uuid (const char *str)
+{
+	const char *p = str;
+	int num_dashes = 0;
+
+	while (*p) {
+		if (*p == '-')
+			num_dashes++;
+		else if (!g_ascii_isxdigit (*p))
+			return FALSE;
+		p++;
+	}
+
+	return (num_dashes == 4) && (p - str == 36);
+}
diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h
index dd29230b..203d83b5 100644
--- a/libnm-util/nm-utils.h
+++ b/libnm-util/nm-utils.h
@@ -87,6 +87,9 @@ gboolean nm_utils_security_valid (NMUtilsSecurityType type,
                                   NM80211ApSecurityFlags ap_wpa,
                                   NM80211ApSecurityFlags ap_rsn);
 
+gboolean nm_utils_ap_mode_security_valid (NMUtilsSecurityType type,
+                                          NMDeviceWifiCapabilities wifi_caps);
+
 GSList *nm_utils_ip4_addresses_from_gvalue (const GValue *value);
 void nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value);
 
@@ -135,6 +138,10 @@ char       *nm_utils_hwaddr_ntoa  (gconstpointer addr, int type);
 GByteArray *nm_utils_hwaddr_atoba (const char *asc, int type);
 guint8     *nm_utils_hwaddr_aton  (const char *asc, int type, gpointer buffer);
 
+gboolean    nm_utils_iface_valid_name(const char *name);
+
+gboolean nm_utils_is_uuid (const char *str);
+
 G_END_DECLS
 
 #endif /* NM_UTILS_H */
diff --git a/libnm-util/tests/Makefile.am b/libnm-util/tests/Makefile.am
index 46a4d142..98f8aad8 100644
--- a/libnm-util/tests/Makefile.am
+++ b/libnm-util/tests/Makefile.am
@@ -1,3 +1,5 @@
+if ENABLE_TESTS
+
 SUBDIRS=certs
 
 INCLUDES = \
@@ -73,8 +75,6 @@ test_setting_8021x_LDADD = \
 	$(GLIB_LIBS) \
 	$(DBUS_LIBS)
 
-if WITH_TESTS
-
 check-local: test-settings-defaults test-crypto test-secrets
 	$(abs_builddir)/test-settings-defaults
 	$(abs_builddir)/test-secrets
@@ -137,4 +137,3 @@ check-local: test-settings-defaults test-crypto test-secrets
 		"1234567890"
 
 endif
-
diff --git a/libnm-util/tests/Makefile.in b/libnm-util/tests/Makefile.in
index 4d7b082e..4a1731f9 100644
--- a/libnm-util/tests/Makefile.in
+++ b/libnm-util/tests/Makefile.in
@@ -51,23 +51,26 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = test-settings-defaults$(EXEEXT) test-crypto$(EXEEXT) \
-	test-secrets$(EXEEXT) test-general$(EXEEXT) \
-	test-setting-8021x$(EXEEXT)
+@ENABLE_TESTS_TRUE@noinst_PROGRAMS = test-settings-defaults$(EXEEXT) \
+@ENABLE_TESTS_TRUE@	test-crypto$(EXEEXT) test-secrets$(EXEEXT) \
+@ENABLE_TESTS_TRUE@	test-general$(EXEEXT) \
+@ENABLE_TESTS_TRUE@	test-setting-8021x$(EXEEXT)
 subdir = libnm-util/tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
-	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
-	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gnome-code-coverage.m4 \
+	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
+	$(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -75,35 +78,43 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
-am_test_crypto_OBJECTS = test_crypto-test-crypto.$(OBJEXT)
+am__test_crypto_SOURCES_DIST = test-crypto.c
+@ENABLE_TESTS_TRUE@am_test_crypto_OBJECTS =  \
+@ENABLE_TESTS_TRUE@	test_crypto-test-crypto.$(OBJEXT)
 test_crypto_OBJECTS = $(am_test_crypto_OBJECTS)
 am__DEPENDENCIES_1 =
-test_crypto_DEPENDENCIES =  \
-	$(top_builddir)/libnm-util/libtest-crypto.la \
-	$(top_builddir)/libnm-util/libnm-util.la $(am__DEPENDENCIES_1)
+@ENABLE_TESTS_TRUE@test_crypto_DEPENDENCIES = $(top_builddir)/libnm-util/libtest-crypto.la \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(am__DEPENDENCIES_1)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
-am_test_general_OBJECTS = test_general-test-general.$(OBJEXT)
+am__test_general_SOURCES_DIST = test-general.c
+@ENABLE_TESTS_TRUE@am_test_general_OBJECTS =  \
+@ENABLE_TESTS_TRUE@	test_general-test-general.$(OBJEXT)
 test_general_OBJECTS = $(am_test_general_OBJECTS)
-test_general_DEPENDENCIES = $(top_builddir)/libnm-util/libnm-util.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_secrets_OBJECTS = test_secrets-test-secrets.$(OBJEXT)
+@ENABLE_TESTS_TRUE@test_general_DEPENDENCIES =  \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__test_secrets_SOURCES_DIST = test-secrets.c
+@ENABLE_TESTS_TRUE@am_test_secrets_OBJECTS =  \
+@ENABLE_TESTS_TRUE@	test_secrets-test-secrets.$(OBJEXT)
 test_secrets_OBJECTS = $(am_test_secrets_OBJECTS)
-test_secrets_DEPENDENCIES = $(top_builddir)/libnm-util/libnm-util.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_setting_8021x_OBJECTS =  \
-	test_setting_8021x-test-setting-8021x.$(OBJEXT)
+@ENABLE_TESTS_TRUE@test_secrets_DEPENDENCIES =  \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__test_setting_8021x_SOURCES_DIST = test-setting-8021x.c
+@ENABLE_TESTS_TRUE@am_test_setting_8021x_OBJECTS = test_setting_8021x-test-setting-8021x.$(OBJEXT)
 test_setting_8021x_OBJECTS = $(am_test_setting_8021x_OBJECTS)
-test_setting_8021x_DEPENDENCIES =  \
-	$(top_builddir)/libnm-util/libnm-util.la $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_settings_defaults_OBJECTS =  \
-	test_settings_defaults-test-settings-defaults.$(OBJEXT)
+@ENABLE_TESTS_TRUE@test_setting_8021x_DEPENDENCIES =  \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__test_settings_defaults_SOURCES_DIST = test-settings-defaults.c
+@ENABLE_TESTS_TRUE@am_test_settings_defaults_OBJECTS = test_settings_defaults-test-settings-defaults.$(OBJEXT)
 test_settings_defaults_OBJECTS = $(am_test_settings_defaults_OBJECTS)
-test_settings_defaults_DEPENDENCIES =  \
-	$(top_builddir)/libnm-util/libnm-util.la $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
+@ENABLE_TESTS_TRUE@test_settings_defaults_DEPENDENCIES =  \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -133,9 +144,11 @@ am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(test_crypto_SOURCES) $(test_general_SOURCES) \
 	$(test_secrets_SOURCES) $(test_setting_8021x_SOURCES) \
 	$(test_settings_defaults_SOURCES)
-DIST_SOURCES = $(test_crypto_SOURCES) $(test_general_SOURCES) \
-	$(test_secrets_SOURCES) $(test_setting_8021x_SOURCES) \
-	$(test_settings_defaults_SOURCES)
+DIST_SOURCES = $(am__test_crypto_SOURCES_DIST) \
+	$(am__test_general_SOURCES_DIST) \
+	$(am__test_secrets_SOURCES_DIST) \
+	$(am__test_setting_8021x_SOURCES_DIST) \
+	$(am__test_settings_defaults_SOURCES_DIST)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
 	install-dvi-recursive install-exec-recursive \
@@ -155,7 +168,7 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
 	distdir
 ETAGS = etags
 CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
+DIST_SUBDIRS = certs
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -194,6 +207,10 @@ AWK = @AWK@
 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@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -208,9 +225,7 @@ DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DHCLIENT_PATH = @DHCLIENT_PATH@
-DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
-DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
@@ -220,17 +235,14 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GENHTML = @GENHTML@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-GIO_CFLAGS = @GIO_CFLAGS@
-GIO_LIBS = @GIO_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_MAKEFILE = @GLIB_MAKEFILE@
 GLIB_MKENUMS = @GLIB_MKENUMS@
-GMODULE_CFLAGS = @GMODULE_CFLAGS@
-GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
@@ -271,6 +283,7 @@ 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@
 LIBDL = @LIBDL@
@@ -287,11 +300,7 @@ LIBNL2_LIBS = @LIBNL2_LIBS@
 LIBNL3_CFLAGS = @LIBNL3_CFLAGS@
 LIBNL3_LIBS = @LIBNL3_LIBS@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
-LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@
-LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@
 LIBNL_LIBS = @LIBNL_LIBS@
-LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@
-LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@
@@ -306,6 +315,8 @@ MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MM_GLIB_CFLAGS = @MM_GLIB_CFLAGS@
+MM_GLIB_LIBS = @MM_GLIB_LIBS@
 MOC = @MOC@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
@@ -315,6 +326,7 @@ NMEDIT = @NMEDIT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
+NM_MODIFY_SYSTEM_POLICY = @NM_MODIFY_SYSTEM_POLICY@
 NM_VERSION = @NM_VERSION@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -341,13 +353,14 @@ PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
-RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
-SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
-SYSTEMD_LIBS = @SYSTEMD_LIBS@
+SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
+SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
+SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
 UDEV_BASE_DIR = @UDEV_BASE_DIR@
 USE_NLS = @USE_NLS@
@@ -402,6 +415,11 @@ localedir = @localedir@
 localstatedir = @localstatedir@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+nmbinary = @nmbinary@
+nmconfdir = @nmconfdir@
+nmdatadir = @nmdatadir@
+nmrundir = @nmrundir@
+nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
 prefix = @prefix@
@@ -416,72 +434,76 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = certs
-INCLUDES = \
-	-I$(top_srcdir)/include \
-	-I$(top_builddir)/include \
-	-I$(top_srcdir)/libnm-util \
-	-I$(top_builddir)/libnm-util
-
-test_settings_defaults_SOURCES = \
-	test-settings-defaults.c
-
-test_settings_defaults_CPPFLAGS = \
-	$(GLIB_CFLAGS) \
-	$(DBUS_CFLAGS)
-
-test_settings_defaults_LDADD = \
-	$(top_builddir)/libnm-util/libnm-util.la \
-	$(GLIB_LIBS) \
-	$(DBUS_LIBS)
-
-test_crypto_SOURCES = \
-	test-crypto.c
-
-test_crypto_CPPFLAGS = \
-	$(GLIB_CFLAGS)
-
-test_crypto_LDADD = \
-	$(top_builddir)/libnm-util/libtest-crypto.la \
-	$(top_builddir)/libnm-util/libnm-util.la \
-	$(GLIB_LIBS)
-
-test_secrets_SOURCES = \
-	test-secrets.c
-
-test_secrets_CPPFLAGS = \
-	-DTEST_CERT_DIR=\"$(top_srcdir)/libnm-util/tests/certs/\" \
-	$(GLIB_CFLAGS) \
-	$(DBUS_CFLAGS)
-
-test_secrets_LDADD = \
-	$(top_builddir)/libnm-util/libnm-util.la \
-	$(GLIB_LIBS) \
-	$(DBUS_LIBS)
-
-test_general_SOURCES = \
-	test-general.c
-
-test_general_CPPFLAGS = \
-	$(GLIB_CFLAGS) \
-	$(DBUS_CFLAGS)
-
-test_general_LDADD = \
-	$(top_builddir)/libnm-util/libnm-util.la \
-	$(GLIB_LIBS) \
-	$(DBUS_LIBS)
-
-test_setting_8021x_SOURCES = \
-	test-setting-8021x.c
-
-test_setting_8021x_CPPFLAGS = \
-	$(GLIB_CFLAGS) \
-	$(DBUS_CFLAGS)
-
-test_setting_8021x_LDADD = \
-	$(top_builddir)/libnm-util/libnm-util.la \
-	$(GLIB_LIBS) \
-	$(DBUS_LIBS)
+with_dhclient = @with_dhclient@
+with_dhcpcd = @with_dhcpcd@
+with_netconfig = @with_netconfig@
+with_resolvconf = @with_resolvconf@
+@ENABLE_TESTS_TRUE@SUBDIRS = certs
+@ENABLE_TESTS_TRUE@INCLUDES = \
+@ENABLE_TESTS_TRUE@	-I$(top_srcdir)/include \
+@ENABLE_TESTS_TRUE@	-I$(top_builddir)/include \
+@ENABLE_TESTS_TRUE@	-I$(top_srcdir)/libnm-util \
+@ENABLE_TESTS_TRUE@	-I$(top_builddir)/libnm-util
+
+@ENABLE_TESTS_TRUE@test_settings_defaults_SOURCES = \
+@ENABLE_TESTS_TRUE@	test-settings-defaults.c
+
+@ENABLE_TESTS_TRUE@test_settings_defaults_CPPFLAGS = \
+@ENABLE_TESTS_TRUE@	$(GLIB_CFLAGS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_CFLAGS)
+
+@ENABLE_TESTS_TRUE@test_settings_defaults_LDADD = \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(GLIB_LIBS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_LIBS)
+
+@ENABLE_TESTS_TRUE@test_crypto_SOURCES = \
+@ENABLE_TESTS_TRUE@	test-crypto.c
+
+@ENABLE_TESTS_TRUE@test_crypto_CPPFLAGS = \
+@ENABLE_TESTS_TRUE@	$(GLIB_CFLAGS)
+
+@ENABLE_TESTS_TRUE@test_crypto_LDADD = \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libtest-crypto.la \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(GLIB_LIBS)
+
+@ENABLE_TESTS_TRUE@test_secrets_SOURCES = \
+@ENABLE_TESTS_TRUE@	test-secrets.c
+
+@ENABLE_TESTS_TRUE@test_secrets_CPPFLAGS = \
+@ENABLE_TESTS_TRUE@	-DTEST_CERT_DIR=\"$(top_srcdir)/libnm-util/tests/certs/\" \
+@ENABLE_TESTS_TRUE@	$(GLIB_CFLAGS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_CFLAGS)
+
+@ENABLE_TESTS_TRUE@test_secrets_LDADD = \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(GLIB_LIBS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_LIBS)
+
+@ENABLE_TESTS_TRUE@test_general_SOURCES = \
+@ENABLE_TESTS_TRUE@	test-general.c
+
+@ENABLE_TESTS_TRUE@test_general_CPPFLAGS = \
+@ENABLE_TESTS_TRUE@	$(GLIB_CFLAGS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_CFLAGS)
+
+@ENABLE_TESTS_TRUE@test_general_LDADD = \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(GLIB_LIBS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_LIBS)
+
+@ENABLE_TESTS_TRUE@test_setting_8021x_SOURCES = \
+@ENABLE_TESTS_TRUE@	test-setting-8021x.c
+
+@ENABLE_TESTS_TRUE@test_setting_8021x_CPPFLAGS = \
+@ENABLE_TESTS_TRUE@	$(GLIB_CFLAGS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_CFLAGS)
+
+@ENABLE_TESTS_TRUE@test_setting_8021x_LDADD = \
+@ENABLE_TESTS_TRUE@	$(top_builddir)/libnm-util/libnm-util.la \
+@ENABLE_TESTS_TRUE@	$(GLIB_LIBS) \
+@ENABLE_TESTS_TRUE@	$(DBUS_LIBS)
 
 all: all-recursive
 
@@ -555,25 +577,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_settings_defaults-test-settings-defaults.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -844,7 +863,7 @@ distdir: $(DISTFILES)
 	      || exit 1; \
 	  fi; \
 	done
-@WITH_TESTS_FALSE@check-local:
+@ENABLE_TESTS_FALSE@check-local:
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) check-local
 check: check-recursive
@@ -971,66 +990,66 @@ uninstall-am:
 	tags tags-recursive uninstall uninstall-am
 
 
-@WITH_TESTS_TRUE@check-local: test-settings-defaults test-crypto test-secrets
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-settings-defaults
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-secrets
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-general
+@ENABLE_TESTS_TRUE@check-local: test-settings-defaults test-crypto test-secrets
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-settings-defaults
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-secrets
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-general
 
 # Private key and CA certificate in the same file (PEM)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test_key_and_cert.pem "test"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test_key_and_cert.pem "test"
 
 # Private key by itself (PEM)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
 
 # PKCS#8 private key by itself (PEM)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/pkcs8-enc-key.pem "1234567890"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/pkcs8-enc-key.pem "1234567890"
 
 # Private key and CA certificate in the same file (pkcs12)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
 
 # Normal CA certificate
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.pem
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.pem
 
 # Another CA certificate
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_ca_cert.pem
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_ca_cert.pem
 
 # Normal CA certificate (DER format)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.der
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.der
 
 # CA certificate without an ending newline
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/ca-no-ending-newline.pem
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/ca-no-ending-newline.pem
 
 # Combined user cert and private key
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_key_and_cert.pem
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_key_and_cert.pem
 
 # Another combined user cert and private key
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_key_and_cert.pem
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_key_and_cert.pem
 
 # Private key with 8 bytes of tail padding
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
-@WITH_TESTS_TRUE@		$(srcdir)/certs/test_key_and_cert.pem \
-@WITH_TESTS_TRUE@		"test" \
-@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
+@ENABLE_TESTS_TRUE@		$(srcdir)/certs/test_key_and_cert.pem \
+@ENABLE_TESTS_TRUE@		"test" \
+@ENABLE_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
 
 # Private key only (not combined with a cert)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
-@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only.pem \
-@WITH_TESTS_TRUE@		"test" \
-@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
+@ENABLE_TESTS_TRUE@		$(srcdir)/certs/test-key-only.pem \
+@ENABLE_TESTS_TRUE@		"test" \
+@ENABLE_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
 
 # Private key with 6 bytes of tail padding
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key $(srcdir)/certs/test2_key_and_cert.pem "12345testing"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --key $(srcdir)/certs/test2_key_and_cert.pem "12345testing"
 
 # PKCS#12 file
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test-cert.p12 "test"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test-cert.p12 "test"
 
 # Another PKCS#12 file
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
 
 # PKCS#8 encrypted private key
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --pkcs8 \
-@WITH_TESTS_TRUE@		$(srcdir)/certs/pkcs8-enc-key.pem \
-@WITH_TESTS_TRUE@		"1234567890"
+@ENABLE_TESTS_TRUE@	$(abs_builddir)/test-crypto --pkcs8 \
+@ENABLE_TESTS_TRUE@		$(srcdir)/certs/pkcs8-enc-key.pem \
+@ENABLE_TESTS_TRUE@		"1234567890"
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/libnm-util/tests/certs/Makefile.in b/libnm-util/tests/certs/Makefile.in
index 400042f9..0e60e300 100644
--- a/libnm-util/tests/certs/Makefile.in
+++ b/libnm-util/tests/certs/Makefile.in
@@ -63,16 +63,18 @@ subdir = libnm-util/tests/certs
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
-	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
-	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gnome-code-coverage.m4 \
+	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
+	$(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -105,6 +107,10 @@ AWK = @AWK@
 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@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -119,9 +125,7 @@ DBUS_SYS_DIR = @DBUS_SYS_DIR@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DHCLIENT_PATH = @DHCLIENT_PATH@
-DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
-DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
@@ -131,17 +135,14 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GENHTML = @GENHTML@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-GIO_CFLAGS = @GIO_CFLAGS@
-GIO_LIBS = @GIO_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_MAKEFILE = @GLIB_MAKEFILE@
 GLIB_MKENUMS = @GLIB_MKENUMS@
-GMODULE_CFLAGS = @GMODULE_CFLAGS@
-GMODULE_LIBS = @GMODULE_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
@@ -182,6 +183,7 @@ 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@
 LIBDL = @LIBDL@
@@ -198,11 +200,7 @@ LIBNL2_LIBS = @LIBNL2_LIBS@
 LIBNL3_CFLAGS = @LIBNL3_CFLAGS@
 LIBNL3_LIBS = @LIBNL3_LIBS@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
-LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@
-LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@
 LIBNL_LIBS = @LIBNL_LIBS@
-LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@
-LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@
@@ -217,6 +215,8 @@ MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MM_GLIB_CFLAGS = @MM_GLIB_CFLAGS@
+MM_GLIB_LIBS = @MM_GLIB_LIBS@
 MOC = @MOC@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
@@ -226,6 +226,7 @@ NMEDIT = @NMEDIT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
+NM_MODIFY_SYSTEM_POLICY = @NM_MODIFY_SYSTEM_POLICY@
 NM_VERSION = @NM_VERSION@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -252,13 +253,14 @@ PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
-RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
-SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
-SYSTEMD_LIBS = @SYSTEMD_LIBS@
+SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
+SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
+SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
 SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
 UDEV_BASE_DIR = @UDEV_BASE_DIR@
 USE_NLS = @USE_NLS@
@@ -313,6 +315,11 @@ localedir = @localedir@
 localstatedir = @localstatedir@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+nmbinary = @nmbinary@
+nmconfdir = @nmconfdir@
+nmdatadir = @nmdatadir@
+nmrundir = @nmrundir@
+nmstatedir = @nmstatedir@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
 prefix = @prefix@
@@ -327,6 +334,10 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+with_dhclient = @with_dhclient@
+with_dhcpcd = @with_dhcpcd@
+with_netconfig = @with_netconfig@
+with_resolvconf = @with_resolvconf@
 EXTRA_DIST = \
 	test_ca_cert.pem \
 	test_ca_cert.der \
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index 2acb31b3..7c5399df 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -874,6 +874,7 @@ test_connection_diff_a_only (void)
 			{ NM_SETTING_CONNECTION_ZONE,        NM_SETTING_DIFF_RESULT_IN_A },
 			{ NM_SETTING_CONNECTION_MASTER,      NM_SETTING_DIFF_RESULT_IN_A },
 			{ NM_SETTING_CONNECTION_SLAVE_TYPE,  NM_SETTING_DIFF_RESULT_IN_A },
+			{ NM_SETTING_CONNECTION_SECONDARIES, NM_SETTING_DIFF_RESULT_IN_A },
 			{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }
 		} },
 		{ NM_SETTING_WIRED_SETTING_NAME, {