summary refs log tree commit diff
path: root/src/tests
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2015-01-22 00:29:39 +0100
committerMichael Biebl <biebl@debian.org>2015-01-22 00:29:39 +0100
commit2c032d8f1c6292c1338a615e6ec40252889ba85c (patch)
tree1f77182220b2b0264288ba4a476ab47e5bc48716 /src/tests
parent33491bc4279481db8ae47213e34a6d695a0e8830 (diff)
Imported Upstream version 1.0.0 upstream/1.0.0
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/Makefile.am69
-rw-r--r--src/tests/Makefile.in304
-rw-r--r--src/tests/config/Makefile.am33
-rw-r--r--src/tests/config/Makefile.in871
-rw-r--r--src/tests/config/NetworkManager.conf15
-rw-r--r--src/tests/config/bad.conf1
-rw-r--r--src/tests/config/conf.d/00-overrides.conf11
-rw-r--r--src/tests/config/conf.d/10-more.conf11
-rw-r--r--src/tests/config/conf.d/90-last.conf5
-rw-r--r--src/tests/config/nm-test-device.c99
-rw-r--r--src/tests/config/nm-test-device.h50
-rw-r--r--src/tests/config/test-config.c308
-rw-r--r--src/tests/test-dcb.c2
-rw-r--r--src/tests/test-dhcp-options.c937
-rw-r--r--src/tests/test-general-with-expect.c349
-rw-r--r--src/tests/test-general.c357
-rw-r--r--src/tests/test-ip4-config.c49
-rw-r--r--src/tests/test-ip6-config.c87
-rw-r--r--src/tests/test-resolvconf-capture.c5
-rw-r--r--src/tests/test-wired-defname.c130
20 files changed, 2503 insertions, 1190 deletions
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index ee5be17d..65bc2199 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -1,38 +1,28 @@
+SUBDIRS = config
+
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/include \
-	-I$(top_builddir)/include \
-	-I$(top_srcdir)/libnm-util \
-	-I$(top_builddir)/libnm-util \
-	-I$(top_srcdir)/src/logging \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
 	-I$(top_srcdir)/src/platform \
 	-I$(top_srcdir)/src/dhcp-manager \
+	-I$(top_srcdir)/src/devices \
 	-I$(top_srcdir)/src \
 	-I$(top_builddir)/src \
 	-DG_LOG_DOMAIN=\""NetworkManager"\" \
+	-DNETWORKMANAGER_COMPILATION \
 	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
 	$(GLIB_CFLAGS) \
 	$(DBUS_CFLAGS)
 
 noinst_PROGRAMS = \
-	test-dhcp-options \
 	test-general \
+	test-general-with-expect \
 	test-ip4-config \
 	test-ip6-config \
 	test-dcb \
-	test-resolvconf-capture
-
-####### DHCP options test #######
-
-test_dhcp_options_SOURCES = \
-	test-dhcp-options.c
-
-test_dhcp_options_CPPFLAGS = \
-	$(AM_CPPFLAGS) \
-	-DDHCLIENT_PATH=\"$(DHCLIENT_PATH)\" \
-	-DDHCPCD_PATH=\"$(DHCPCD_PATH)\"
-
-test_dhcp_options_LDADD = \
-	$(top_builddir)/src/libNetworkManager.la
+	test-resolvconf-capture \
+	test-wired-defname
 
 ####### ip4 config test #######
 
@@ -74,11 +64,50 @@ test_general_SOURCES = \
 test_general_LDADD = \
 	$(top_builddir)/src/libNetworkManager.la
 
+####### general-with-expect test #######
+
+test_general_with_expect_SOURCES = \
+	test-general-with-expect.c
+
+test_general_with_expect_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
+####### wired defname test #######
+
+test_wired_defname_SOURCES = \
+	test-wired-defname.c
+
+test_wired_defname_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
 ####### secret agent interface test #######
 
 EXTRA_DIST = test-secret-agent.py
 
 ###########################################
 
-TESTS = test-dhcp-options test-ip4-config test-ip6-config test-dcb test-resolvconf-capture test-general
+TESTS = \
+	test-ip4-config \
+	test-ip6-config \
+	test-dcb \
+	test-resolvconf-capture \
+	test-general \
+	test-general-with-expect \
+	test-wired-defname
+
+
+if ENABLE_TESTS
+
+check-local:
+	@for t in bond bridge ethernet gre infiniband macvlan tun veth vlan vxlan; do \
+		# Ensure the device subclass factory registration constructors exist \
+		# which could inadvertently break if src/Makefile.am gets changed \
+		if ! LC_ALL=C nm $(top_builddir)/src/NetworkManager | LC_ALL=C grep -q "register_device_factory_internal_$$t" ; then \
+			echo "Testing device factory symbols... FAILED" ; \
+			exit 1 ; \
+		fi \
+	done
+	@echo "Testing device factory symbols... PASSED"
+
+endif
 
diff --git a/src/tests/Makefile.in b/src/tests/Makefile.in
index b9af7c31..a5d5b3a8 100644
--- a/src/tests/Makefile.in
+++ b/src/tests/Makefile.in
@@ -78,12 +78,14 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = test-dhcp-options$(EXEEXT) test-general$(EXEEXT) \
-	test-ip4-config$(EXEEXT) test-ip6-config$(EXEEXT) \
-	test-dcb$(EXEEXT) test-resolvconf-capture$(EXEEXT)
-TESTS = test-dhcp-options$(EXEEXT) test-ip4-config$(EXEEXT) \
+noinst_PROGRAMS = test-general$(EXEEXT) \
+	test-general-with-expect$(EXEEXT) test-ip4-config$(EXEEXT) \
 	test-ip6-config$(EXEEXT) test-dcb$(EXEEXT) \
-	test-resolvconf-capture$(EXEEXT) test-general$(EXEEXT)
+	test-resolvconf-capture$(EXEEXT) test-wired-defname$(EXEEXT)
+TESTS = test-ip4-config$(EXEEXT) test-ip6-config$(EXEEXT) \
+	test-dcb$(EXEEXT) test-resolvconf-capture$(EXEEXT) \
+	test-general$(EXEEXT) test-general-with-expect$(EXEEXT) \
+	test-wired-defname$(EXEEXT)
 subdir = src/tests
 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
 	$(top_srcdir)/build-aux/depcomp
@@ -115,14 +117,15 @@ AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-am_test_dhcp_options_OBJECTS =  \
-	test_dhcp_options-test-dhcp-options.$(OBJEXT)
-test_dhcp_options_OBJECTS = $(am_test_dhcp_options_OBJECTS)
-test_dhcp_options_DEPENDENCIES =  \
-	$(top_builddir)/src/libNetworkManager.la
 am_test_general_OBJECTS = test-general.$(OBJEXT)
 test_general_OBJECTS = $(am_test_general_OBJECTS)
 test_general_DEPENDENCIES = $(top_builddir)/src/libNetworkManager.la
+am_test_general_with_expect_OBJECTS =  \
+	test-general-with-expect.$(OBJEXT)
+test_general_with_expect_OBJECTS =  \
+	$(am_test_general_with_expect_OBJECTS)
+test_general_with_expect_DEPENDENCIES =  \
+	$(top_builddir)/src/libNetworkManager.la
 am_test_ip4_config_OBJECTS = test-ip4-config.$(OBJEXT)
 test_ip4_config_OBJECTS = $(am_test_ip4_config_OBJECTS)
 test_ip4_config_DEPENDENCIES =  \
@@ -137,6 +140,10 @@ test_resolvconf_capture_OBJECTS =  \
 	$(am_test_resolvconf_capture_OBJECTS)
 test_resolvconf_capture_DEPENDENCIES =  \
 	$(top_builddir)/src/libNetworkManager.la
+am_test_wired_defname_OBJECTS = test-wired-defname.$(OBJEXT)
+test_wired_defname_OBJECTS = $(am_test_wired_defname_OBJECTS)
+test_wired_defname_DEPENDENCIES =  \
+	$(top_builddir)/src/libNetworkManager.la
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -171,17 +178,35 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(test_dcb_SOURCES) $(test_dhcp_options_SOURCES) \
-	$(test_general_SOURCES) $(test_ip4_config_SOURCES) \
-	$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES)
-DIST_SOURCES = $(test_dcb_SOURCES) $(test_dhcp_options_SOURCES) \
-	$(test_general_SOURCES) $(test_ip4_config_SOURCES) \
-	$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES)
+SOURCES = $(test_dcb_SOURCES) $(test_general_SOURCES) \
+	$(test_general_with_expect_SOURCES) $(test_ip4_config_SOURCES) \
+	$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES) \
+	$(test_wired_defname_SOURCES)
+DIST_SOURCES = $(test_dcb_SOURCES) $(test_general_SOURCES) \
+	$(test_general_with_expect_SOURCES) $(test_ip4_config_SOURCES) \
+	$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES) \
+	$(test_wired_defname_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -223,7 +248,33 @@ am__tty_colors = { \
     std=''; \
   fi; \
 }
+DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
@@ -233,6 +284,8 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BLUEZ5_CFLAGS = @BLUEZ5_CFLAGS@
+BLUEZ5_LIBS = @BLUEZ5_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -356,6 +409,7 @@ NEWT_CFLAGS = @NEWT_CFLAGS@
 NEWT_LIBS = @NEWT_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
 NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
 NM_MICRO_VERSION = @NM_MICRO_VERSION@
 NM_MINOR_VERSION = @NM_MINOR_VERSION@
@@ -375,6 +429,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
@@ -401,7 +456,7 @@ 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@
+UDEV_DIR = @UDEV_DIR@
 USE_NLS = @USE_NLS@
 UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
@@ -480,35 +535,23 @@ with_dhcpcd = @with_dhcpcd@
 with_netconfig = @with_netconfig@
 with_resolvconf = @with_resolvconf@
 with_valgrind = @with_valgrind@
+SUBDIRS = config
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/include \
-	-I$(top_builddir)/include \
-	-I$(top_srcdir)/libnm-util \
-	-I$(top_builddir)/libnm-util \
-	-I$(top_srcdir)/src/logging \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
 	-I$(top_srcdir)/src/platform \
 	-I$(top_srcdir)/src/dhcp-manager \
+	-I$(top_srcdir)/src/devices \
 	-I$(top_srcdir)/src \
 	-I$(top_builddir)/src \
 	-DG_LOG_DOMAIN=\""NetworkManager"\" \
+	-DNETWORKMANAGER_COMPILATION \
 	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
 	$(GLIB_CFLAGS) \
 	$(DBUS_CFLAGS)
 
 
-####### DHCP options test #######
-test_dhcp_options_SOURCES = \
-	test-dhcp-options.c
-
-test_dhcp_options_CPPFLAGS = \
-	$(AM_CPPFLAGS) \
-	-DDHCLIENT_PATH=\"$(DHCLIENT_PATH)\" \
-	-DDHCPCD_PATH=\"$(DHCPCD_PATH)\"
-
-test_dhcp_options_LDADD = \
-	$(top_builddir)/src/libNetworkManager.la
-
-
 ####### ip4 config test #######
 test_ip4_config_SOURCES = \
 	test-ip4-config.c
@@ -549,9 +592,25 @@ test_general_LDADD = \
 	$(top_builddir)/src/libNetworkManager.la
 
 
+####### general-with-expect test #######
+test_general_with_expect_SOURCES = \
+	test-general-with-expect.c
+
+test_general_with_expect_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
+
+####### wired defname test #######
+test_wired_defname_SOURCES = \
+	test-wired-defname.c
+
+test_wired_defname_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
+
 ####### secret agent interface test #######
 EXTRA_DIST = test-secret-agent.py
-all: all-am
+all: all-recursive
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -599,14 +658,14 @@ test-dcb$(EXEEXT): $(test_dcb_OBJECTS) $(test_dcb_DEPENDENCIES) $(EXTRA_test_dcb
 	@rm -f test-dcb$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_dcb_OBJECTS) $(test_dcb_LDADD) $(LIBS)
 
-test-dhcp-options$(EXEEXT): $(test_dhcp_options_OBJECTS) $(test_dhcp_options_DEPENDENCIES) $(EXTRA_test_dhcp_options_DEPENDENCIES) 
-	@rm -f test-dhcp-options$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(test_dhcp_options_OBJECTS) $(test_dhcp_options_LDADD) $(LIBS)
-
 test-general$(EXEEXT): $(test_general_OBJECTS) $(test_general_DEPENDENCIES) $(EXTRA_test_general_DEPENDENCIES) 
 	@rm -f test-general$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_general_OBJECTS) $(test_general_LDADD) $(LIBS)
 
+test-general-with-expect$(EXEEXT): $(test_general_with_expect_OBJECTS) $(test_general_with_expect_DEPENDENCIES) $(EXTRA_test_general_with_expect_DEPENDENCIES) 
+	@rm -f test-general-with-expect$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_general_with_expect_OBJECTS) $(test_general_with_expect_LDADD) $(LIBS)
+
 test-ip4-config$(EXEEXT): $(test_ip4_config_OBJECTS) $(test_ip4_config_DEPENDENCIES) $(EXTRA_test_ip4_config_DEPENDENCIES) 
 	@rm -f test-ip4-config$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_ip4_config_OBJECTS) $(test_ip4_config_LDADD) $(LIBS)
@@ -619,6 +678,10 @@ test-resolvconf-capture$(EXEEXT): $(test_resolvconf_capture_OBJECTS) $(test_reso
 	@rm -f test-resolvconf-capture$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_resolvconf_capture_OBJECTS) $(test_resolvconf_capture_LDADD) $(LIBS)
 
+test-wired-defname$(EXEEXT): $(test_wired_defname_OBJECTS) $(test_wired_defname_DEPENDENCIES) $(EXTRA_test_wired_defname_DEPENDENCIES) 
+	@rm -f test-wired-defname$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_wired_defname_OBJECTS) $(test_wired_defname_LDADD) $(LIBS)
+
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 
@@ -626,11 +689,12 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-dcb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-general-with-expect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-general.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ip4-config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ip6-config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-resolvconf-capture.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dhcp_options-test-dhcp-options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-wired-defname.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -653,34 +717,67 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-test_dhcp_options-test-dhcp-options.o: test-dhcp-options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_dhcp_options_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_dhcp_options-test-dhcp-options.o -MD -MP -MF $(DEPDIR)/test_dhcp_options-test-dhcp-options.Tpo -c -o test_dhcp_options-test-dhcp-options.o `test -f 'test-dhcp-options.c' || echo '$(srcdir)/'`test-dhcp-options.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_dhcp_options-test-dhcp-options.Tpo $(DEPDIR)/test_dhcp_options-test-dhcp-options.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='test-dhcp-options.c' object='test_dhcp_options-test-dhcp-options.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_dhcp_options_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_dhcp_options-test-dhcp-options.o `test -f 'test-dhcp-options.c' || echo '$(srcdir)/'`test-dhcp-options.c
-
-test_dhcp_options-test-dhcp-options.obj: test-dhcp-options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_dhcp_options_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_dhcp_options-test-dhcp-options.obj -MD -MP -MF $(DEPDIR)/test_dhcp_options-test-dhcp-options.Tpo -c -o test_dhcp_options-test-dhcp-options.obj `if test -f 'test-dhcp-options.c'; then $(CYGPATH_W) 'test-dhcp-options.c'; else $(CYGPATH_W) '$(srcdir)/test-dhcp-options.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/test_dhcp_options-test-dhcp-options.Tpo $(DEPDIR)/test_dhcp_options-test-dhcp-options.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='test-dhcp-options.c' object='test_dhcp_options-test-dhcp-options.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_dhcp_options_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_dhcp_options-test-dhcp-options.obj `if test -f 'test-dhcp-options.c'; then $(CYGPATH_W) 'test-dhcp-options.c'; else $(CYGPATH_W) '$(srcdir)/test-dhcp-options.c'; fi`
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
 
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
+tags: tags-recursive
 TAGS: tags
 
 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 	set x; \
 	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
 	$(am__define_uniq_tagged_files); \
 	shift; \
 	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
@@ -693,7 +790,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 	      $$unique; \
 	  fi; \
 	fi
-ctags: ctags-am
+ctags: ctags-recursive
 
 CTAGS: ctags
 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
@@ -706,7 +803,7 @@ GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
+cscopelist: cscopelist-recursive
 
 cscopelist-am: $(am__tagged_files)
 	list='$(am__tagged_files)'; \
@@ -848,20 +945,47 @@ distdir: $(DISTFILES)
 	    || exit 1; \
 	  fi; \
 	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+@ENABLE_TESTS_FALSE@check-local:
 check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local
+check: check-recursive
 all-am: Makefile $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
 	if test -z '$(STRIP)'; then \
 	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -883,94 +1007,106 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
 	mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
 	mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am:
 
-.MAKE: check-am install-am install-strip
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
-	ctags ctags-am distclean distclean-compile distclean-generic \
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-TESTS check-am check-local clean clean-generic \
+	clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
 	install-data-am install-dvi install-dvi-am install-exec \
 	install-exec-am install-html install-html-am install-info \
 	install-info-am install-man install-pdf install-pdf-am \
 	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	installcheck-am installdirs installdirs-am maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags tags-am uninstall uninstall-am
 
 
+@ENABLE_TESTS_TRUE@check-local:
+@ENABLE_TESTS_TRUE@	@for t in bond bridge ethernet gre infiniband macvlan tun veth vlan vxlan; do \
+@ENABLE_TESTS_TRUE@		# Ensure the device subclass factory registration constructors exist \
+@ENABLE_TESTS_TRUE@		# which could inadvertently break if src/Makefile.am gets changed \
+@ENABLE_TESTS_TRUE@		if ! LC_ALL=C nm $(top_builddir)/src/NetworkManager | LC_ALL=C grep -q "register_device_factory_internal_$$t" ; then \
+@ENABLE_TESTS_TRUE@			echo "Testing device factory symbols... FAILED" ; \
+@ENABLE_TESTS_TRUE@			exit 1 ; \
+@ENABLE_TESTS_TRUE@		fi \
+@ENABLE_TESTS_TRUE@	done
+@ENABLE_TESTS_TRUE@	@echo "Testing device factory symbols... PASSED"
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/tests/config/Makefile.am b/src/tests/config/Makefile.am
new file mode 100644
index 00000000..66009c87
--- /dev/null
+++ b/src/tests/config/Makefile.am
@@ -0,0 +1,33 @@
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/include \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
+	-I$(top_srcdir)/src/ \
+	-I$(top_srcdir)/src/devices \
+	-I${top_srcdir}/src/platform \
+	-DG_LOG_DOMAIN=\""NetworkManager"\" \
+	-DNETWORKMANAGER_COMPILATION \
+	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
+	$(GLIB_CFLAGS) \
+	$(DBUS_CFLAGS) \
+	-DSRCDIR=\""$(srcdir)"\"
+
+noinst_PROGRAMS = \
+	test-config
+
+test_config_SOURCES = \
+	nm-test-device.c \
+	nm-test-device.h \
+	test-config.c
+
+test_config_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
+TESTS = test-config
+
+EXTRA_DIST = \
+	NetworkManager.conf \
+	bad.conf \
+	conf.d/00-overrides.conf \
+	conf.d/10-more.conf \
+	conf.d/90-last.conf
diff --git a/src/tests/config/Makefile.in b/src/tests/config/Makefile.in
new file mode 100644
index 00000000..81fb0885
--- /dev/null
+++ b/src/tests/config/Makefile.in
@@ -0,0 +1,871 @@
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = test-config$(EXEEXT)
+TESTS = test-config$(EXEEXT)
+subdir = src/tests/config
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib_readline.m4 \
+	$(top_srcdir)/m4/compiler_warnings.m4 \
+	$(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/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
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_test_config_OBJECTS = nm-test-device.$(OBJEXT) \
+	test-config.$(OBJEXT)
+test_config_OBJECTS = $(am_test_config_OBJECTS)
+test_config_DEPENDENCIES = $(top_builddir)/src/libNetworkManager.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(test_config_SOURCES)
+DIST_SOURCES = $(test_config_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BLUEZ5_CFLAGS = @BLUEZ5_CFLAGS@
+BLUEZ5_LIBS = @BLUEZ5_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CKDB_PATH = @CKDB_PATH@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_GLIB_100_CFLAGS = @DBUS_GLIB_100_CFLAGS@
+DBUS_GLIB_100_LIBS = @DBUS_GLIB_100_LIBS@
+DBUS_LIBS = @DBUS_LIBS@
+DBUS_SYS_DIR = @DBUS_SYS_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DHCLIENT_PATH = @DHCLIENT_PATH@
+DHCPCD_PATH = @DHCPCD_PATH@
+DISTRO_NETWORK_SERVICE = @DISTRO_NETWORK_SERVICE@
+DLLTOOL = @DLLTOOL@
+DNSMASQ_PATH = @DNSMASQ_PATH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GENHTML = @GENHTML@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MAKEFILE = @GLIB_MAKEFILE@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GUDEV_CFLAGS = @GUDEV_CFLAGS@
+GUDEV_LIBS = @GUDEV_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
+KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDL = @LIBDL@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBNDP_CFLAGS = @LIBNDP_CFLAGS@
+LIBNDP_LIBS = @LIBNDP_LIBS@
+LIBNL_CFLAGS = @LIBNL_CFLAGS@
+LIBNL_LIBS = @LIBNL_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@
+LIBSOUP_LIBS = @LIBSOUP_LIBS@
+LIBTEAMDCTL_CFLAGS = @LIBTEAMDCTL_CFLAGS@
+LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+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@
+MSGMERGE = @MSGMERGE@
+NEWT_CFLAGS = @NEWT_CFLAGS@
+NEWT_LIBS = @NEWT_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT = @NM_CONFIG_DEFAULT_AUTH_POLKIT_TEXT@
+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@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POLKIT_CFLAGS = @POLKIT_CFLAGS@
+POLKIT_LIBS = @POLKIT_LIBS@
+POSUB = @POSUB@
+PPPD_PATH = @PPPD_PATH@
+PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
+PPPOE_PATH = @PPPOE_PATH@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+SED = @SED@
+SELINUX_CFLAGS = @SELINUX_CFLAGS@
+SELINUX_LIBS = @SELINUX_LIBS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SYSTEMD_200_CFLAGS = @SYSTEMD_200_CFLAGS@
+SYSTEMD_200_LIBS = @SYSTEMD_200_LIBS@
+SYSTEMD_INHIBIT_CFLAGS = @SYSTEMD_INHIBIT_CFLAGS@
+SYSTEMD_INHIBIT_LIBS = @SYSTEMD_INHIBIT_LIBS@
+SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
+SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
+SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
+UDEV_DIR = @UDEV_DIR@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_RULES = @VALGRIND_RULES@
+VAPIGEN = @VAPIGEN@
+VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@
+VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
+libdir = @libdir@
+libexecdir = @libexecdir@
+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@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+systemdsystemunitdir = @systemdsystemunitdir@
+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@
+with_valgrind = @with_valgrind@
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/include \
+	-I$(top_srcdir)/libnm-core \
+	-I$(top_builddir)/libnm-core \
+	-I$(top_srcdir)/src/ \
+	-I$(top_srcdir)/src/devices \
+	-I${top_srcdir}/src/platform \
+	-DG_LOG_DOMAIN=\""NetworkManager"\" \
+	-DNETWORKMANAGER_COMPILATION \
+	-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
+	$(GLIB_CFLAGS) \
+	$(DBUS_CFLAGS) \
+	-DSRCDIR=\""$(srcdir)"\"
+
+test_config_SOURCES = \
+	nm-test-device.c \
+	nm-test-device.h \
+	test-config.c
+
+test_config_LDADD = \
+	$(top_builddir)/src/libNetworkManager.la
+
+EXTRA_DIST = \
+	NetworkManager.conf \
+	bad.conf \
+	conf.d/00-overrides.conf \
+	conf.d/10-more.conf \
+	conf.d/90-last.conf
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/config/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu src/tests/config/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+test-config$(EXEEXT): $(test_config_OBJECTS) $(test_config_DEPENDENCIES) $(EXTRA_test_config_DEPENDENCIES) 
+	@rm -f test-config$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_config_OBJECTS) $(test_config_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-test-device.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-config.Po@am__quote@
+
+.c.o:
+@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 $<
+
+.c.obj:
+@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 `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@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 $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/tests/config/NetworkManager.conf b/src/tests/config/NetworkManager.conf
new file mode 100644
index 00000000..401ba48a
--- /dev/null
+++ b/src/tests/config/NetworkManager.conf
@@ -0,0 +1,15 @@
+[main]
+dhcp=dhclient
+plugins=foo,bar,baz
+no-auto-default=11:11:11:11:11:11
+
+[logging]
+level=INFO
+
+[connectivity]
+uri=http://example.com
+interval=100
+response=Hello
+
+[extra-section]
+extra-key=some value
diff --git a/src/tests/config/bad.conf b/src/tests/config/bad.conf
new file mode 100644
index 00000000..20d6a67a
--- /dev/null
+++ b/src/tests/config/bad.conf
@@ -0,0 +1 @@
+This is not a keyfile.
diff --git a/src/tests/config/conf.d/00-overrides.conf b/src/tests/config/conf.d/00-overrides.conf
new file mode 100644
index 00000000..0aa19d48
--- /dev/null
+++ b/src/tests/config/conf.d/00-overrides.conf
@@ -0,0 +1,11 @@
+[main]
+dhcp=dhcpcd
+
+[logging]
+domains=PLATFORM,DNS,WIFI
+
+[order]
+a=0
+b=0
+c=0
+
diff --git a/src/tests/config/conf.d/10-more.conf b/src/tests/config/conf.d/10-more.conf
new file mode 100644
index 00000000..b1424a4b
--- /dev/null
+++ b/src/tests/config/conf.d/10-more.conf
@@ -0,0 +1,11 @@
+[main]
+extra=hello
+new+=something
+
+[connectivity]
+uri=http://example.net
+
+[order]
+a=10
+b=10
+
diff --git a/src/tests/config/conf.d/90-last.conf b/src/tests/config/conf.d/90-last.conf
new file mode 100644
index 00000000..dc1de394
--- /dev/null
+++ b/src/tests/config/conf.d/90-last.conf
@@ -0,0 +1,5 @@
+[main]
+plugins+=one,two
+
+[order]
+a=90
diff --git a/src/tests/config/nm-test-device.c b/src/tests/config/nm-test-device.c
new file mode 100644
index 00000000..63067b25
--- /dev/null
+++ b/src/tests/config/nm-test-device.c
@@ -0,0 +1,99 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2013 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include "nm-test-device.h"
+#include "nm-device-private.h"
+#include "nm-utils.h"
+
+static GObjectClass *g_object_class;
+
+G_DEFINE_TYPE (NMTestDevice, nm_test_device, NM_TYPE_DEVICE)
+
+static void
+nm_test_device_init (NMTestDevice *self)
+{
+}
+
+/* We jump over NMDevice's construct/destruct methods, which require NMPlatform
+ * and NMConnectionProvider to be initialized.
+ */
+
+static GObject*
+constructor (GType type,
+             guint n_construct_params,
+             GObjectConstructParam *construct_params)
+{
+	return g_object_class->constructor (type,
+	                                    n_construct_params,
+	                                    construct_params);
+}
+
+static void
+constructed (GObject *object)
+{
+	g_object_class->constructed (object);
+}
+
+static void
+dispose (GObject *object)
+{
+	g_object_class->dispose (object);
+}
+
+static void
+finalize (GObject *object)
+{
+	g_object_class->finalize (object);
+}
+
+static guint32
+get_generic_capabilities (NMDevice *device)
+{
+	return NM_DEVICE_CAP_IS_NON_KERNEL;
+}
+
+static void
+nm_test_device_class_init (NMTestDeviceClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
+
+	g_object_class = g_type_class_peek (G_TYPE_OBJECT);
+
+	object_class->constructor = constructor;
+	object_class->constructed = constructed;
+	object_class->dispose = dispose;
+	object_class->finalize = finalize;
+
+	device_class->get_generic_capabilities = get_generic_capabilities;
+}
+
+NMDevice *
+nm_test_device_new (const char *hwaddr)
+{
+	return g_object_new (NM_TYPE_TEST_DEVICE,
+	                     NM_DEVICE_IFACE, "dummy",
+	                     NM_DEVICE_HW_ADDRESS, hwaddr,
+	                     NULL);
+}
diff --git a/src/tests/config/nm-test-device.h b/src/tests/config/nm-test-device.h
new file mode 100644
index 00000000..00b21c42
--- /dev/null
+++ b/src/tests/config/nm-test-device.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2013 Red Hat, Inc.
+ */
+
+#ifndef __NETWORKMANAGER_TEST_DEVICE_H__
+#define __NETWORKMANAGER_TEST_DEVICE_H__
+
+#include <nm-device.h>
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_TEST_DEVICE            (nm_test_device_get_type ())
+#define NM_TEST_DEVICE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_TEST_DEVICE, NMTestDevice))
+#define NM_TEST_DEVICE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  NM_TYPE_TEST_DEVICE, NMTestDeviceClass))
+#define NM_IS_TEST_DEVICE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_TEST_DEVICE))
+#define NM_IS_TEST_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  NM_TYPE_TEST_DEVICE))
+#define NM_TEST_DEVICE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  NM_TYPE_TEST_DEVICE, NMTestDeviceClass))
+
+typedef struct {
+	NMDevice parent;
+
+} NMTestDevice;
+
+typedef struct {
+	NMDeviceClass parent;
+} NMTestDeviceClass;
+
+GType nm_test_device_get_type (void);
+
+NMDevice *nm_test_device_new (const char *hwaddr);
+
+G_END_DECLS
+
+#endif	/* NM_DEVICE_H */
diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c
new file mode 100644
index 00000000..808fc670
--- /dev/null
+++ b/src/tests/config/test-config.c
@@ -0,0 +1,308 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2013 Red Hat, Inc.
+ *
+ */
+
+#include "config.h"
+
+#include <unistd.h>
+
+#include <glib.h>
+
+#include <nm-config.h>
+#include "nm-test-device.h"
+#include "nm-fake-platform.h"
+
+static void
+setup_config (const char *config_file, const char *config_dir, ...)
+{
+	va_list ap;
+	GPtrArray *args;
+	char **argv, *arg;
+	int argc;
+	GOptionContext *context;
+	gboolean success;
+
+	args = g_ptr_array_new ();
+	g_ptr_array_add (args, "test-config");
+	g_ptr_array_add (args, "--config");
+	g_ptr_array_add (args, (char *)config_file);
+	g_ptr_array_add (args, "--config-dir");
+	g_ptr_array_add (args, (char *)config_dir);
+
+	va_start (ap, config_dir);
+	while ((arg = va_arg (ap, char *)))
+		g_ptr_array_add (args, arg);
+	va_end (ap);
+
+	argv = (char **)args->pdata;
+	argc = args->len;
+
+	context = g_option_context_new (NULL);
+	g_option_context_add_main_entries (context, nm_config_get_options (), NULL);
+	success = g_option_context_parse (context, &argc, &argv, NULL);
+	g_option_context_free (context);
+
+	if (!success)
+		g_printerr ("Invalid options.\n");
+
+	g_ptr_array_free (args, TRUE);
+}
+
+static void
+test_config_simple (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+	const char **plugins;
+	char *value;
+
+	setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir", NULL);
+	config = nm_config_new (&error);
+	g_assert_no_error (error);
+
+	g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+	g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhclient");
+	g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
+	g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 100);
+
+	plugins = nm_config_get_plugins (config);
+	g_assert_cmpint (g_strv_length ((char **)plugins), ==, 3);
+	g_assert_cmpstr (plugins[0], ==, "foo");
+	g_assert_cmpstr (plugins[1], ==, "bar");
+	g_assert_cmpstr (plugins[2], ==, "baz");
+
+	value = nm_config_get_value (config, "extra-section", "extra-key", NULL);
+	g_assert_cmpstr (value, ==, "some value");
+	g_free (value);
+
+	value = nm_config_get_value (config, "extra-section", "no-key", &error);
+	g_assert (!value);
+	g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+	g_clear_error (&error);
+
+	value = nm_config_get_value (config, "no-section", "no-key", &error);
+	g_assert (!value);
+	g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+	g_clear_error (&error);
+
+	g_object_unref (config);
+}
+
+static void
+test_config_non_existent (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+
+	setup_config (SRCDIR "/no-such-file", "/no/such/dir", NULL);
+	config = nm_config_new (&error);
+	g_assert (!config);
+	g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND);
+}
+
+static void
+test_config_parse_error (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+
+	setup_config (SRCDIR "/bad.conf", "/no/such/dir", NULL);
+	config = nm_config_new (&error);
+	g_assert (!config);
+	g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
+}
+
+static void
+test_config_override (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+	const char **plugins;
+
+	setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
+	              "--plugins", "alpha,beta,gamma,delta",
+	              "--connectivity-interval", "12",
+	              NULL);
+	config = nm_config_new (&error);
+	g_assert_no_error (error);
+
+	g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+	g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhclient");
+	g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
+	g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 12);
+
+	plugins = nm_config_get_plugins (config);
+	g_assert_cmpint (g_strv_length ((char **)plugins), ==, 4);
+	g_assert_cmpstr (plugins[0], ==, "alpha");
+	g_assert_cmpstr (plugins[1], ==, "beta");
+	g_assert_cmpstr (plugins[2], ==, "gamma");
+	g_assert_cmpstr (plugins[3], ==, "delta");
+
+	g_object_unref (config);
+}
+
+static void
+test_config_no_auto_default (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+	int fd, nwrote;
+	char *state_file;
+	NMDevice *dev1, *dev2, *dev3, *dev4;
+
+	fd = g_file_open_tmp (NULL, &state_file, &error);
+	g_assert_no_error (error);
+
+	nwrote = write (fd, "22:22:22:22:22:22\n", 18);
+	g_assert_cmpint (nwrote, ==, 18);
+	nwrote = write (fd, "44:44:44:44:44:44\n", 18);
+	g_assert_cmpint (nwrote, ==, 18);
+	close (fd);
+
+	setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
+	              "--no-auto-default", state_file,
+	              NULL);
+	config = nm_config_new (&error);
+	g_assert_no_error (error);
+
+	dev1 = nm_test_device_new ("11:11:11:11:11:11");
+	dev2 = nm_test_device_new ("22:22:22:22:22:22");
+	dev3 = nm_test_device_new ("33:33:33:33:33:33");
+	dev4 = nm_test_device_new ("44:44:44:44:44:44");
+
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1));
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2));
+	g_assert (nm_config_get_ethernet_can_auto_default (config, dev3));
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4));
+
+	nm_config_set_ethernet_no_auto_default (config, dev3);
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3));
+
+	g_object_unref (config);
+
+	setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
+	              "--no-auto-default", state_file,
+	              NULL);
+	config = nm_config_new (&error);
+	g_assert_no_error (error);
+
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1));
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2));
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3));
+	g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4));
+
+	g_object_unref (config);
+
+	g_object_unref (dev1);
+	g_object_unref (dev2);
+	g_object_unref (dev3);
+	g_object_unref (dev4);
+
+	unlink (state_file);
+	g_free (state_file);
+}
+
+static void
+test_config_confdir (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+	const char **plugins;
+	char *value;
+
+	setup_config (SRCDIR "/NetworkManager.conf", SRCDIR "/conf.d", NULL);
+	config = nm_config_new (&error);
+	g_assert_no_error (error);
+
+	g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+	g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhcpcd");
+	g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
+	g_assert_cmpstr (nm_config_get_log_domains (config), ==, "PLATFORM,DNS,WIFI");
+	g_assert_cmpstr (nm_config_get_connectivity_uri (config), ==, "http://example.net");
+	g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 100);
+
+	plugins = nm_config_get_plugins (config);
+	g_assert_cmpint (g_strv_length ((char **)plugins), ==, 5);
+	g_assert_cmpstr (plugins[0], ==, "foo");
+	g_assert_cmpstr (plugins[1], ==, "bar");
+	g_assert_cmpstr (plugins[2], ==, "baz");
+	g_assert_cmpstr (plugins[3], ==, "one");
+	g_assert_cmpstr (plugins[4], ==, "two");
+
+	value = nm_config_get_value (config, "main", "extra", NULL);
+	g_assert_cmpstr (value, ==, "hello");
+	g_free (value);
+
+	value = nm_config_get_value (config, "main", "new", NULL);
+	g_assert_cmpstr (value, ==, "something"); /* not ",something" */
+	g_free (value);
+
+	value = nm_config_get_value (config, "order", "a", NULL);
+	g_assert_cmpstr (value, ==, "90");
+	g_free (value);
+	value = nm_config_get_value (config, "order", "b", NULL);
+	g_assert_cmpstr (value, ==, "10");
+	g_free (value);
+	value = nm_config_get_value (config, "order", "c", NULL);
+	g_assert_cmpstr (value, ==, "0");
+	g_free (value);
+
+	g_object_unref (config);
+}
+
+static void
+test_config_confdir_parse_error (void)
+{
+	NMConfig *config;
+	GError *error = NULL;
+
+	/* Using SRCDIR as the conf dir will pick up bad.conf */
+	setup_config (SRCDIR "/NetworkManager.conf", SRCDIR, NULL);
+	config = nm_config_new (&error);
+	g_assert (!config);
+	g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
+}
+
+int
+main (int argc, char **argv)
+{
+#if !GLIB_CHECK_VERSION (2, 35, 0)
+	g_type_init ();
+#endif
+
+	g_test_init (&argc, &argv, NULL);
+
+	nm_fake_platform_setup ();
+
+	g_test_add_func ("/config/simple", test_config_simple);
+	g_test_add_func ("/config/non-existent", test_config_non_existent);
+	g_test_add_func ("/config/parse-error", test_config_parse_error);
+	g_test_add_func ("/config/no-auto-default", test_config_no_auto_default);
+	g_test_add_func ("/config/confdir", test_config_confdir);
+	g_test_add_func ("/config/confdir-parse-error", test_config_confdir_parse_error);
+
+	/* This one has to come last, because it leaves its values in
+	 * nm-config.c's global variables, and there's no way to reset
+	 * those to NULL.
+	 */
+	g_test_add_func ("/config/override", test_config_override);
+
+	return g_test_run ();
+}
+
diff --git a/src/tests/test-dcb.c b/src/tests/test-dcb.c
index c28f05b9..dacb1f52 100644
--- a/src/tests/test-dcb.c
+++ b/src/tests/test-dcb.c
@@ -18,6 +18,8 @@
  *
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <string.h>
 
diff --git a/src/tests/test-dhcp-options.c b/src/tests/test-dhcp-options.c
deleted file mode 100644
index 5df17e58..00000000
--- a/src/tests/test-dhcp-options.c
+++ /dev/null
@@ -1,937 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* nm-dhcp-manager.c - Handle the DHCP daemon for NetworkManager
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright (C) 2008 - 2011 Red Hat, Inc.
- *
- */
-
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <string.h>
-
-#include <nm-utils.h>
-
-#include "nm-dhcp-manager.h"
-#include "nm-logging.h"
-
-#include "nm-test-utils.h"
-
-typedef struct {
-	const char *name;
-	const char *value;
-} Option;
-
-static void
-destroy_gvalue (gpointer data)
-{
-	GValue *value = (GValue *) data;
-
-	g_value_unset (value);
-	g_slice_free (GValue, value);
-}
-
-static GValue *
-string_to_byte_array_gvalue (const char *str)
-{
-	GByteArray *array;
-	GValue *val;
-
-	array = g_byte_array_sized_new (strlen (str));
-	g_byte_array_append (array, (const guint8 *) str, strlen (str));
-
-	val = g_slice_new0 (GValue);
-	g_value_init (val, DBUS_TYPE_G_UCHAR_ARRAY);
-	g_value_take_boxed (val, array);
-
-	return val;
-}
-
-static GHashTable *
-fill_table (Option *test_options, GHashTable *table)
-{
-	Option *opt;
-
-	if (!table)
-		table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroy_gvalue);
-	for (opt = test_options; opt->name; opt++) {
-		g_hash_table_insert (table,
-		                     (gpointer) opt->name,
-		                     string_to_byte_array_gvalue (opt->value));
-	}
-	return table;
-}
-
-static Option generic_options[] = {
-	{ "new_subnet_mask",            "255.255.255.0" },
-	{ "new_ip_address",             "192.168.1.106" },
-	{ "new_network_number",         "192.168.1.0" },
-	{ "interface",                  "eth0" },
-	{ "reason",                     "BOUND" },
-	{ "new_expiry",                 "1232324877" },
-	{ "new_dhcp_lease_time",        "3600" },
-	{ "new_dhcp_server_identifier", "192.168.1.1" },
-	{ "new_routers",                "192.168.1.1" },
-	{ "new_domain_name_servers",    "216.254.95.2 216.231.41.2" },
-	{ "new_dhcp_message_type",      "5" },
-	{ "new_broadcast_address",      "192.168.1.255" },
-	{ "new_domain_search",          "foobar.com blah.foobar.com" },
-	{ "new_host_name",              "nmreallywhipsthe" },
-	{ "new_domain_name",            "lamasass.com" },
-	{ "new_interface_mtu",          "987" },
-	{ "new_static_routes",          "10.1.1.5 10.1.1.1 100.99.88.56 10.1.1.1" },
-	{ NULL, NULL }
-};
-
-static void
-test_generic_options (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const NMPlatformIP4Address *address;
-	const NMPlatformIP4Route *route;
-	guint32 tmp;
-	const char *expected_addr = "192.168.1.106";
-	const char *expected_gw = "192.168.1.1";
-	const char *expected_dns1 = "216.254.95.2";
-	const char *expected_dns2 = "216.231.41.2";
-	const char *expected_search1 = "foobar.com";
-	const char *expected_search2 = "blah.foobar.com";
-	const char *expected_route1_dest = "10.1.1.5";
-	const char *expected_route1_gw = "10.1.1.1";
-	const char *expected_route2_dest = "100.99.88.56";
-	const char *expected_route2_gw = "10.1.1.1";
-
-	options = fill_table (generic_options, NULL);
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-generic", "failed to parse DHCP4 options");
-
-	/* IP4 address */
-	ASSERT (nm_ip4_config_get_num_addresses (ip4_config) == 1,
-	        "dhcp-generic", "unexpected number of IP addresses");
-	address = nm_ip4_config_get_address (ip4_config, 0);
-
-	ASSERT (inet_pton (AF_INET, expected_addr, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected IP address");
-	ASSERT (address->address == tmp,
-	        "dhcp-generic", "unexpected IP address");
-	ASSERT (address->peer_address == 0,
-	        "dhcp-generic", "unexpected PTP address");
-
-	ASSERT (address->plen == 24,
-	        "dhcp-generic", "unexpected IP address prefix length");
-
-	/* Gateway */
-	ASSERT (inet_pton (AF_INET, expected_gw, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected IP gateway");
-	ASSERT (nm_ip4_config_get_gateway (ip4_config) == tmp,
-	        "dhcp-generic", "unexpected IP gateway");
-
-	ASSERT (nm_ip4_config_get_num_wins (ip4_config) == 0,
-	        "dhcp-generic", "unexpected number of WINS servers");
-
-	ASSERT (nm_ip4_config_get_mtu (ip4_config) == 987,
-	        "dhcp-generic", "unexpected MTU");
-
-	/* Domain searches */
-	ASSERT (nm_ip4_config_get_num_searches (ip4_config) == 2,
-	        "dhcp-generic", "unexpected number of domain searches");
-	ASSERT (strcmp (nm_ip4_config_get_search (ip4_config, 0), expected_search1) == 0,
-	        "dhcp-generic", "unexpected domain search #1");
-	ASSERT (strcmp (nm_ip4_config_get_search (ip4_config, 1), expected_search2) == 0,
-	        "dhcp-generic", "unexpected domain search #2");
-
-	/* DNS servers */
-	ASSERT (nm_ip4_config_get_num_nameservers (ip4_config) == 2,
-	        "dhcp-generic", "unexpected number of domain name servers");
-	ASSERT (inet_pton (AF_INET, expected_dns1, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected DNS server address #1");
-	ASSERT (nm_ip4_config_get_nameserver (ip4_config, 0) == tmp,
-	        "dhcp-generic", "unexpected domain name server #1");
-	ASSERT (inet_pton (AF_INET, expected_dns2, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected DNS server address #2");
-	ASSERT (nm_ip4_config_get_nameserver (ip4_config, 1) == tmp,
-	        "dhcp-generic", "unexpected domain name server #2");
-
-	/* Routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-generic", "unexpected number of routes");
-
-	/* Route #1 */
-	route = nm_ip4_config_get_route (ip4_config, 0);
-	ASSERT (inet_pton (AF_INET, expected_route1_dest, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected route destination #1");
-	ASSERT (route->network == tmp,
-	        "dhcp-generic", "unexpected route #1 destination");
-
-	ASSERT (inet_pton (AF_INET, expected_route1_gw, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected route next hop #1");
-	ASSERT (route->gateway == tmp,
-	        "dhcp-generic", "unexpected route #1 next hop");
-
-	ASSERT (route->plen == 32,
-	        "dhcp-generic", "unexpected route #1 prefix");
-	ASSERT (route->metric == 0,
-	        "dhcp-generic", "unexpected route #1 metric");
-
-	/* Route #2 */
-	route = nm_ip4_config_get_route (ip4_config, 1);
-	ASSERT (inet_pton (AF_INET, expected_route2_dest, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected route destination #2");
-	ASSERT (route->network == tmp,
-	        "dhcp-generic", "unexpected route #2 destination");
-
-	ASSERT (inet_pton (AF_INET, expected_route2_gw, &tmp) > 0,
-	        "dhcp-generic", "couldn't convert expected route next hop #2");
-	ASSERT (route->gateway == tmp,
-	        "dhcp-generic", "unexpected route #2 next hop");
-
-	ASSERT (route->plen == 32,
-	        "dhcp-generic", "unexpected route #2 prefix");
-	ASSERT (route->metric == 0,
-	        "dhcp-generic", "unexpected route #2 metric");
-
-	g_hash_table_destroy (options);
-}
-
-static Option wins_options[] = {
-	{ "new_netbios_name_servers", "63.12.199.5 150.4.88.120" },
-	{ NULL, NULL }
-};
-
-static void
-test_wins_options (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const NMPlatformIP4Address *address;
-	guint32 tmp;
-	const char *expected_wins1 = "63.12.199.5";
-	const char *expected_wins2 = "150.4.88.120";
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (wins_options, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-wins", "failed to parse DHCP4 options");
-
-	/* IP4 address */
-	ASSERT (nm_ip4_config_get_num_addresses (ip4_config) == 1,
-	        "dhcp-wins", "unexpected number of IP addresses");
-	address = nm_ip4_config_get_address (ip4_config, 0);
-	ASSERT (address != NULL, "dhcp-wins", "unexpectedly did not get address #0");
-
-	ASSERT (nm_ip4_config_get_num_wins (ip4_config) == 2,
-	        "dhcp-wins", "unexpected number of WINS servers");
-	ASSERT (inet_pton (AF_INET, expected_wins1, &tmp) > 0,
-	        "dhcp-wins", "couldn't convert expected WINS server address #1");
-	ASSERT (nm_ip4_config_get_wins (ip4_config, 0) == tmp,
-	        "dhcp-wins", "unexpected WINS server #1");
-	ASSERT (inet_pton (AF_INET, expected_wins2, &tmp) > 0,
-	        "dhcp-wins", "couldn't convert expected WINS server address #1");
-	ASSERT (nm_ip4_config_get_wins (ip4_config, 1) == tmp,
-	        "dhcp-wins", "unexpected WINS server #1");
-
-	g_hash_table_destroy (options);
-}
-
-static void
-ip4_test_route (const char *test,
-                NMIP4Config *ip4_config,
-                guint route_num,
-                const char *expected_dest,
-                const char *expected_gw,
-                guint expected_prefix)
-{
-	const NMPlatformIP4Route *route;
-	guint32 tmp;
-
-	route = nm_ip4_config_get_route (ip4_config, route_num);
-	ASSERT (inet_pton (AF_INET, expected_dest, &tmp) > 0,
-	        test, "couldn't convert expected route destination #1");
-	ASSERT (route->network == tmp,
-	        test, "unexpected route %d destination", route_num + 1);
-
-	ASSERT (inet_pton (AF_INET, expected_gw, &tmp) > 0,
-	        test, "couldn't convert expected route next hop %d",
-	        route_num + 1);
-	ASSERT (route->gateway == tmp,
-	        test, "unexpected route %d next hop", route_num + 1);
-
-	ASSERT (route->plen == expected_prefix,
-	        test, "unexpected route %d prefix", route_num + 1);
-	ASSERT (route->metric == 0,
-	        test, "unexpected route %d metric", route_num + 1);
-}
-
-static void
-ip4_test_gateway (const char *test,
-                  NMIP4Config *ip4_config,
-                  const char *expected_gw)
-{
-	guint32 tmp;
-
-	ASSERT (nm_ip4_config_get_num_addresses (ip4_config) == 1,
-	        test, "unexpected number of IP addresses");
-	ASSERT (inet_pton (AF_INET, expected_gw, &tmp) > 0,
-	        test, "couldn't convert expected IP gateway");
-	ASSERT (nm_ip4_config_get_gateway (ip4_config) == tmp,
-	        test, "unexpected IP gateway");
-}
-
-static void
-test_classless_static_routes_1 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	const char *expected_route2_dest = "10.0.0.0";
-	const char *expected_route2_gw = "10.17.66.41";
-	static Option data[] = {
-		/* dhclient custom format */
-		{ "new_rfc3442_classless_static_routes", "24 192 168 10 192 168 1 1 8 10 10 17 66 41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-classless-1", "failed to parse DHCP4 options");
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-classless-1", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-classless-1", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-	ip4_test_route ("dhcp-classless-1", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 8);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_classless_static_routes_2 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	const char *expected_route2_dest = "10.0.0.0";
-	const char *expected_route2_gw = "10.17.66.41";
-	static Option data[] = {
-		/* dhcpcd format */
-		{ "new_classless_static_routes", "192.168.10.0/24 192.168.1.1 10.0.0.0/8 10.17.66.41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-classless-2", "failed to parse DHCP4 options");
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-classless-2", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-classless-2", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-	ip4_test_route ("dhcp-classless-2", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 8);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_fedora_dhclient_classless_static_routes (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "129.210.177.128";
-	const char *expected_route1_gw = "192.168.0.113";
-	const char *expected_route2_dest = "2.0.0.0";
-	const char *expected_route2_gw = "10.34.255.6";
-	const char *expected_gateway = "192.168.0.113";
-	static Option data[] = {
-		/* Fedora dhclient format */
-		{ "new_classless_static_routes", "0 192.168.0.113 25.129.210.177.132 192.168.0.113 7.2 10.34.255.6" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-fedora-dhclient-classless", "failed to parse DHCP4 options");
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-fedora-dhclient-classless", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-fedora-dhclient-classless", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 25);
-	ip4_test_route ("dhcp-fedora-dhclient-classless", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 7);
-
-	/* Gateway */
-	ip4_test_gateway ("dhcp-fedora-dhclient-classless", ip4_config, expected_gateway);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhclient_invalid_classless_routes_1 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	static Option data[] = {
-		/* dhclient format */
-		{ "new_rfc3442_classless_static_routes", "24 192 168 10 192 168 1 1 45 10 17 66 41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*ignoring invalid classless static routes*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhclient-classless-invalid-1", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 1,
-	        "dhcp-dhclient-classless-invalid-1", "unexpected number of IP routes");
-
-	ip4_test_route ("dhcp-dhclient-classless-invalid-1", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhcpcd_invalid_classless_routes_1 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "10.1.1.5";
-	const char *expected_route1_gw = "10.1.1.1";
-	const char *expected_route2_dest = "100.99.88.56";
-	const char *expected_route2_gw = "10.1.1.1";
-	static Option data[] = {
-		/* dhcpcd format */
-		{ "new_classless_static_routes", "192.168.10.0/24 192.168.1.1 10.0.adfadf/44 10.17.66.41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*ignoring invalid classless static routes*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhcpcd-classless-invalid-1", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* Test falling back to old-style static routes if the classless static
-	 * routes are invalid.
-	 */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-dhcpcdp-classless-invalid-1", "unexpected number of routes");
-	ip4_test_route ("dhcp-dhcpcdp-classless-invalid-1", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 32);
-	ip4_test_route ("dhcp-dhcpcdp-classless-invalid-1", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 32);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhclient_invalid_classless_routes_2 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "10.1.1.5";
-	const char *expected_route1_gw = "10.1.1.1";
-	const char *expected_route2_dest = "100.99.88.56";
-	const char *expected_route2_gw = "10.1.1.1";
-	static Option data[] = {
-		{ "new_rfc3442_classless_static_routes", "45 10 17 66 41 24 192 168 10 192 168 1 1" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*ignoring invalid classless static routes*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhclient-classless-invalid-2", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* Test falling back to old-style static routes if the classless static
-	 * routes are invalid.
-	 */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-dhclient-classless-invalid-2", "unexpected number of routes");
-	ip4_test_route ("dhcp-dhclient-classless-invalid-2", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 32);
-	ip4_test_route ("dhcp-dhclient-classless-invalid-2", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 32);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhcpcd_invalid_classless_routes_2 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "10.1.1.5";
-	const char *expected_route1_gw = "10.1.1.1";
-	const char *expected_route2_dest = "100.99.88.56";
-	const char *expected_route2_gw = "10.1.1.1";
-	static Option data[] = {
-		{ "new_classless_static_routes", "10.0.adfadf/44 10.17.66.41 192.168.10.0/24 192.168.1.1" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*ignoring invalid classless static routes*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhcpcd-classless-invalid-2", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* Test falling back to old-style static routes if the classless static
-	 * routes are invalid.
-	 */
-
-	/* Routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 2,
-	        "dhcp-dhcpcd-classless-invalid-2", "unexpected number of routes");
-	ip4_test_route ("dhcp-dhcpcd-classless-invalid-2", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 32);
-	ip4_test_route ("dhcp-dhcpcd-classless-invalid-2", ip4_config, 1,
-	                expected_route2_dest, expected_route2_gw, 32);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhclient_invalid_classless_routes_3 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	static Option data[] = {
-		{ "new_rfc3442_classless_static_routes", "24 192 168 10 192 168 1 1 32 128 10 17 66 41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*ignoring invalid classless static routes*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhclient-classless-invalid-3", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 1,
-	        "dhcp-dhclient-classless-invalid-3", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-dhclient-classless-invalid-3", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhcpcd_invalid_classless_routes_3 (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	static Option data[] = {
-		{ "new_classless_static_routes", "192.168.10.0/24 192.168.1.1 128/32 10.17.66.41" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*DHCP provided invalid classless static route*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhcpcd-classless-invalid-3", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 1,
-	        "dhcp-dhcpcd-classless-invalid-3", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-dhcpcd-classless-invalid-3", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhclient_gw_in_classless_routes (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	const char *expected_gateway = "192.2.3.4";
-	static Option data[] = {
-		{ "new_rfc3442_classless_static_routes", "24 192 168 10 192 168 1 1 0 192 2 3 4" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhclient-classless-gateway", "failed to parse DHCP4 options");
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 1,
-	        "dhcp-dhclient-classless-gateway", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-dhclient-classless-gateway", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-
-	/* Gateway */
-	ip4_test_gateway ("dhcp-dhclient-classless-gateway", ip4_config, expected_gateway);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_dhcpcd_gw_in_classless_routes (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_route1_dest = "192.168.10.0";
-	const char *expected_route1_gw = "192.168.1.1";
-	const char *expected_gateway = "192.2.3.4";
-	static Option data[] = {
-		{ "new_classless_static_routes", "192.168.10.0/24 192.168.1.1 0.0.0.0/0 192.2.3.4" },
-		{ NULL, NULL }
-	};
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (data, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-dhcpcd-classless-gateway", "failed to parse DHCP4 options");
-
-	/* IP4 routes */
-	ASSERT (nm_ip4_config_get_num_routes (ip4_config) == 1,
-	        "dhcp-dhcpcd-classless-gateway", "unexpected number of IP routes");
-	ip4_test_route ("dhcp-dhcpcd-classless-gateway", ip4_config, 0,
-	                expected_route1_dest, expected_route1_gw, 24);
-
-	/* Gateway */
-	ip4_test_gateway ("dhcp-dhcpcd-classless-gateway", ip4_config, expected_gateway);
-
-	g_hash_table_destroy (options);
-}
-
-static Option escaped_searches_options[] = {
-	{ "new_domain_search", "host1\\032host2\\032host3" },
-	{ NULL, NULL }
-};
-
-static void
-test_escaped_domain_searches (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const char *expected_search0 = "host1";
-	const char *expected_search1 = "host2";
-	const char *expected_search2 = "host3";
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (escaped_searches_options, options);
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-escaped-domain-searches", "failed to parse DHCP4 options");
-
-	/* domain searches */
-	ASSERT (nm_ip4_config_get_num_searches (ip4_config) == 3,
-	        "dhcp-escaped-domain-searches", "unexpected number of searches");
-	ASSERT (!strcmp (nm_ip4_config_get_search (ip4_config, 0), expected_search0),
-	        "dhcp-escaped-domain-searches", "unexpected domain search #1");
-	ASSERT (!strcmp (nm_ip4_config_get_search (ip4_config, 1), expected_search1),
-	        "dhcp-escaped-domain-searches", "unexpected domain search #1");
-	ASSERT (!strcmp (nm_ip4_config_get_search (ip4_config, 2), expected_search2),
-	        "dhcp-escaped-domain-searches", "unexpected domain search #1");
-
-	g_hash_table_destroy (options);
-}
-
-static Option invalid_escaped_searches_options[] = {
-	{ "new_domain_search", "host1\\aahost2\\032host3" },
-	{ NULL, NULL }
-};
-
-static void
-test_invalid_escaped_domain_searches (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-
-	options = fill_table (generic_options, NULL);
-	options = fill_table (invalid_escaped_searches_options, options);
-
-	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
-	                       "*invalid domain search*");
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-invalid-escaped-domain-searches", "failed to parse DHCP4 options");
-	g_test_assert_expected_messages ();
-
-	/* domain searches */
-	ASSERT (nm_ip4_config_get_num_searches (ip4_config) == 0,
-	        "dhcp-invalid-escaped-domain-searches", "unexpected domain searches");
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_ip4_missing_prefix (const char *client, const char *ip, guint32 expected_prefix)
-{
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const NMPlatformIP4Address *address;
-
-	options = fill_table (generic_options, NULL);
-	g_hash_table_insert (options, "new_ip_address", string_to_byte_array_gvalue (ip));
-	g_hash_table_remove (options, "new_subnet_mask");
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-ip4-missing-prefix", "failed to parse DHCP4 options");
-
-	ASSERT (nm_ip4_config_get_num_addresses (ip4_config) == 1,
-	        "dhcp-ip4-missing-prefix", "unexpected number of IP4 addresses (not 1)");
-
-	address = nm_ip4_config_get_address (ip4_config, 0);
-	ASSERT (address,
-	        "dhcp-ip4-missing-prefix", "missing IP4 address #1");
-
-	ASSERT (address->plen == expected_prefix,
-	        "dhcp-ip4-missing-prefix", "unexpected IP4 address prefix %d (expected %d)",
-	        address->plen, expected_prefix);
-
-	g_hash_table_destroy (options);
-}
-
-static void
-test_ip4_missing_prefix_24 (gconstpointer test_data)
-{
-	const char *client = test_data;
-
-	test_ip4_missing_prefix (client, "192.168.1.10", 24);
-}
-
-static void
-test_ip4_missing_prefix_16 (gconstpointer test_data)
-{
-	const char *client = test_data;
-
-	test_ip4_missing_prefix (client, "172.16.54.50", 16);
-}
-
-static void
-test_ip4_missing_prefix_8 (gconstpointer test_data)
-{
-	const char *client = test_data;
-
-	test_ip4_missing_prefix (client, "10.1.2.3", 8);
-}
-
-static void
-test_ip4_prefix_classless (gconstpointer test_data)
-{
-	const char *client = test_data;
-	GHashTable *options;
-	NMIP4Config *ip4_config;
-	const NMPlatformIP4Address *address;
-
-	/* Ensure that the missing-subnet-mask handler doesn't mangle classless
-	 * subnet masks at all.  The handler should trigger only if the server
-	 * doesn't send the subnet mask.
-	 */
-
-	options = fill_table (generic_options, NULL);
-	g_hash_table_insert (options, "new_ip_address", string_to_byte_array_gvalue ("172.16.54.22"));
-	g_hash_table_insert (options, "new_subnet_mask", string_to_byte_array_gvalue ("255.255.252.0"));
-
-	ip4_config = nm_dhcp_manager_test_ip4_options_to_config (client, "eth0", options, "rebind");
-	ASSERT (ip4_config != NULL,
-	        "dhcp-ip4-prefix-classless", "failed to parse DHCP4 options");
-
-	ASSERT (nm_ip4_config_get_num_addresses (ip4_config) == 1,
-	        "dhcp-ip4-prefix-classless", "unexpected number of IP4 addresses (not 1)");
-
-	address = nm_ip4_config_get_address (ip4_config, 0);
-	ASSERT (address,
-	        "dhcp-ip4-prefix-classless", "missing IP4 address #1");
-
-	ASSERT (address->plen == 22,
-	        "dhcp-ip4-prefix-classless", "unexpected IP4 address prefix %d (expected 22)",
-	        address->plen);
-
-	g_hash_table_destroy (options);
-}
-
-NMTST_DEFINE ();
-
-int main (int argc, char **argv)
-{
-	char *path;
-	const char *clients[2][2] = { {DHCLIENT_PATH, "dhclient"}, {DHCPCD_PATH, "dhcpcd"} };
-	guint32 i;
-
-	nmtst_init_assert_logging (&argc, &argv);
-	nm_logging_setup ("WARN", "DEFAULT", NULL, NULL);
-
-	for (i = 0; i < 2; i++) {
-		const char *client_path = clients[i][0];
-		const char *client = clients[i][1];
-
-		if (!client_path || !strlen (client_path))
-			continue;
-
-		path = g_strdup_printf ("/dhcp/%s/generic-options", client);
-		g_test_add_data_func (path, client, test_generic_options);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/wins-options", client);
-		g_test_add_data_func (path, client, test_wins_options);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/classless-static-routes-1", client);
-		g_test_add_data_func (path, client, test_classless_static_routes_1);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/classless-static-routes-2", client);
-		g_test_add_data_func (path, client, test_classless_static_routes_2);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/fedora-dhclient-classless-static-routes", client);
-		g_test_add_data_func (path, client, test_fedora_dhclient_classless_static_routes);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhclient-invalid-classless-routes-1", client);
-		g_test_add_data_func (path, client, test_dhclient_invalid_classless_routes_1);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhcpcd-invalid-classless-routes-1", client);
-		g_test_add_data_func (path, client, test_dhcpcd_invalid_classless_routes_1);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhclient-invalid-classless-routes-2", client);
-		g_test_add_data_func (path, client, test_dhclient_invalid_classless_routes_2);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhcpcd-invalid-classless-routes-2", client);
-		g_test_add_data_func (path, client, test_dhcpcd_invalid_classless_routes_2);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhclient-invalid-classless-routes-3", client);
-		g_test_add_data_func (path, client, test_dhclient_invalid_classless_routes_3);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhcpcd-invalid-classless-routes-3", client);
-		g_test_add_data_func (path, client, test_dhcpcd_invalid_classless_routes_3);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhclient-gw-in-classless-routes", client);
-		g_test_add_data_func (path, client, test_dhclient_gw_in_classless_routes);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/dhcpcd-gw-in-classless-routes", client);
-		g_test_add_data_func (path, client, test_dhcpcd_gw_in_classless_routes);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/escaped-domain-searches", client);
-		g_test_add_data_func (path, client, test_escaped_domain_searches);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/invalid-escaped-domain-searches", client);
-		g_test_add_data_func (path, client, test_invalid_escaped_domain_searches);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/ip4-missing-prefix-24", client);
-		g_test_add_data_func (path, client, test_ip4_missing_prefix_24);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/ip4-missing-prefix-16", client);
-		g_test_add_data_func (path, client, test_ip4_missing_prefix_16);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/ip4-missing-prefix-8", client);
-		g_test_add_data_func (path, client, test_ip4_missing_prefix_8);
-		g_free (path);
-
-		path = g_strdup_printf ("/dhcp/%s/ip4-prefix-classless", client);
-		g_test_add_data_func (path, client, test_ip4_prefix_classless);
-		g_free (path);
-	}
-
-	return g_test_run ();
-}
-
diff --git a/src/tests/test-general-with-expect.c b/src/tests/test-general-with-expect.c
new file mode 100644
index 00000000..f5010dae
--- /dev/null
+++ b/src/tests/test-general-with-expect.c
@@ -0,0 +1,349 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <string.h>
+#include <errno.h>
+#include <netinet/ether.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "NetworkManagerUtils.h"
+#include "nm-logging.h"
+
+#include "nm-test-utils.h"
+
+/*******************************************/
+
+struct test_nm_utils_kill_child_async_data
+{
+	GMainLoop *loop;
+	pid_t pid;
+	gboolean called;
+	gboolean expected_success;
+	const int *expected_child_status;
+};
+
+static void
+test_nm_utils_kill_child_async_cb (pid_t pid, gboolean success, int child_status, void *user_data)
+{
+	struct test_nm_utils_kill_child_async_data *data = user_data;
+
+	g_assert (success == !!data->expected_success);
+	g_assert (pid == data->pid);
+	if (data->expected_child_status)
+		g_assert_cmpint (*data->expected_child_status, ==, child_status);
+	if (!success)
+		g_assert_cmpint (child_status, ==, -1);
+
+	data->called = TRUE;
+
+	g_assert (data->loop);
+	g_main_loop_quit (data->loop);
+}
+
+static gboolean
+test_nm_utils_kill_child_async_fail_cb (void *user_data)
+{
+	g_assert_not_reached ();
+}
+
+static void
+test_nm_utils_kill_child_async_do (const char *name, pid_t pid, int sig, guint32 wait_before_kill_msec, gboolean expected_success, const int *expected_child_status)
+{
+	gboolean success;
+	struct test_nm_utils_kill_child_async_data data = { };
+	int timeout_id;
+
+	data.pid = pid;
+	data.expected_success = expected_success;
+	data.expected_child_status = expected_child_status;
+
+	nm_utils_kill_child_async (pid, sig, LOGD_CORE, name, wait_before_kill_msec, test_nm_utils_kill_child_async_cb, &data);
+	g_assert (!data.called);
+
+	timeout_id = g_timeout_add_seconds (5, test_nm_utils_kill_child_async_fail_cb, &data);
+
+	data.loop = g_main_loop_new (NULL, FALSE);
+	g_main_run (data.loop);
+
+	g_assert (data.called);
+	success = g_source_remove (timeout_id);
+	g_assert (success);
+
+	g_main_destroy (data.loop);
+}
+
+static void
+test_nm_utils_kill_child_sync_do (const char *name, pid_t pid, int sig, guint32 wait_before_kill_msec, gboolean expected_success, const int *expected_child_status)
+{
+	gboolean success;
+	int child_status = -1;
+
+	success = nm_utils_kill_child_sync (pid, sig, LOGD_CORE, name, &child_status, wait_before_kill_msec, 0);
+	g_assert (success == !!expected_success);
+	if (expected_child_status)
+		g_assert_cmpint (*expected_child_status, ==, child_status);
+
+	g_test_assert_expected_messages ();
+}
+
+static pid_t
+test_nm_utils_kill_child_spawn (char **argv, gboolean do_not_reap_child)
+{
+	GError *error = NULL;
+	int success;
+	GPid child_pid;
+
+	success = g_spawn_async (NULL,
+	                         argv,
+	                         NULL,
+	                         G_SPAWN_SEARCH_PATH | (do_not_reap_child ? G_SPAWN_DO_NOT_REAP_CHILD : 0),
+	                         NULL,
+	                         NULL,
+	                         &child_pid,
+	                         &error);
+	g_assert (success && !error);
+	return child_pid;
+}
+
+static pid_t
+test_nm_utils_kill_child_create_and_join_pgroup (void)
+{
+	int err, tmp = 0;
+	int pipefd[2];
+	pid_t pgid;
+
+	err = pipe (pipefd);
+	g_assert (err == 0);
+
+	pgid = fork();
+	if (pgid < 0) {
+		g_assert_not_reached ();
+		return pgid;
+	}
+
+	if (pgid == 0) {
+		/* child process... */
+		close (pipefd[0]);
+
+		err = setpgid (0, 0);
+		g_assert (err == 0);
+
+		err = write (pipefd[1], &tmp, sizeof (tmp));
+		g_assert (err == sizeof (tmp));
+
+		close (pipefd[1]);
+		exit (0);
+	}
+
+	close (pipefd[1]);
+
+	err = read (pipefd[0], &tmp, sizeof (tmp));
+	g_assert (err == sizeof (tmp));
+
+	close (pipefd[0]);
+
+	err = setpgid (0, pgid);
+	g_assert (err == 0);
+
+
+	do {
+		err = waitpid (pgid, &tmp, 0);
+	} while (err == -1 && errno == EINTR);
+	g_assert (err == pgid);
+	g_assert (WIFEXITED (tmp) && WEXITSTATUS(tmp) == 0);
+
+	return pgid;
+}
+
+#define TEST_TOKEN  "nm_test_kill_child_process"
+
+static void
+test_nm_utils_kill_child (void)
+{
+	int err;
+	GLogLevelFlags fatal_mask;
+	char *argv_watchdog[] = {
+			"sh",
+			"-c",
+			"sleep 4; "
+			"kill -KILL 0; #watchdog for #" TEST_TOKEN,
+			NULL,
+		};
+	char *argv1[] = {
+			"sh",
+			"-c",
+			"trap \"sleep 0.3; exit 10\" EXIT; "
+			"sleep 100000; exit $? #" TEST_TOKEN,
+			NULL,
+		};
+	char *argv2[] = {
+			"sh",
+			"-c",
+			"exit 47; #" TEST_TOKEN,
+			NULL,
+		};
+	char *argv3[] = {
+			"sh",
+			"-c",
+			"trap \"exit 47\" TERM; while true; do :; done; #" TEST_TOKEN,
+			NULL,
+		};
+	char *argv4[] = {
+			"sh",
+			"-c",
+			"trap \"while true; do :; done\" TERM; while true; do :; done; #" TEST_TOKEN,
+			NULL,
+		};
+	pid_t gpid;
+	pid_t pid1a_1, pid1a_2, pid1a_3, pid2a, pid3a, pid4a;
+	pid_t pid1s_1, pid1s_2, pid1s_3, pid2s, pid3s, pid4s;
+
+	const int expected_exit_47 = 12032; /* exit with status 47 */
+	const int expected_signal_TERM = SIGTERM;
+	const int expected_signal_KILL = SIGKILL;
+
+	gpid = test_nm_utils_kill_child_create_and_join_pgroup ();
+
+	test_nm_utils_kill_child_spawn (argv_watchdog, FALSE);
+
+	pid1s_1 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid1s_2 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid1s_3 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid2s = test_nm_utils_kill_child_spawn (argv2, TRUE);
+	pid3s = test_nm_utils_kill_child_spawn (argv3, TRUE);
+	pid4s = test_nm_utils_kill_child_spawn (argv4, TRUE);
+
+	pid1a_1 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid1a_2 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid1a_3 = test_nm_utils_kill_child_spawn (argv1, TRUE);
+	pid2a = test_nm_utils_kill_child_spawn (argv2, TRUE);
+	pid3a = test_nm_utils_kill_child_spawn (argv3, TRUE);
+	pid4a = test_nm_utils_kill_child_spawn (argv4, TRUE);
+
+	/* give processes time to start (and potentially block signals) ... */
+	g_usleep (G_USEC_PER_SEC / 10);
+
+
+	fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-1' (*): waiting up to 500 milliseconds for process to terminate normally after sending SIGTERM (15)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-1' (*): after sending SIGTERM (15), process * exited by signal 15 (* usec elapsed)");
+	test_nm_utils_kill_child_sync_do ("test-s-1-1", pid1s_1, SIGTERM, 1000 / 2, TRUE,  &expected_signal_TERM);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-2' (*): waiting for process to terminate after sending SIGKILL (9)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-2' (*): after sending SIGKILL (9), process * exited by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_sync_do ("test-s-1-2", pid1s_2, SIGKILL, 1000 / 2, TRUE,  &expected_signal_KILL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-3' (*): waiting up to 1 milliseconds for process to terminate normally after sending no signal (0)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-3' (*): sending SIGKILL...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-1-3' (*): after sending no signal (0) and SIGKILL, process * exited by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_sync_do ("test-s-1-3", pid1s_3, 0, 1, TRUE,  &expected_signal_KILL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-2' (*): process * already terminated normally with status 47");
+	test_nm_utils_kill_child_sync_do ("test-s-2", pid2s, SIGTERM, 1000 / 2, TRUE,  &expected_exit_47);
+
+	/* send invalid signal. */
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING, "*kill child process 'test-s-3-0' (*): failed to send Unexpected signal: Invalid argument (22)");
+	test_nm_utils_kill_child_sync_do ("test-s-3-0", pid3s, -1, 0, FALSE, NULL);
+
+	/* really kill pid3s */
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-3-1' (*): waiting up to 500 milliseconds for process to terminate normally after sending SIGTERM (15)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-3-1' (*): after sending SIGTERM (15), process * exited normally with status 47 (* usec elapsed)");
+	test_nm_utils_kill_child_sync_do ("test-s-3-1", pid3s, SIGTERM, 1000 / 2, TRUE,  &expected_exit_47);
+
+	/* pid3s should not be a valid process, hence the call should fail. Note, that there
+	 * is a race here. */
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING, "*kill child process 'test-s-3-2' (*): failed due to unexpected return value -1 by waitpid (No child processes, 10) after sending no signal (0)");
+	test_nm_utils_kill_child_sync_do ("test-s-3-2", pid3s, 0, 0, FALSE, NULL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-4' (*): waiting up to 1 milliseconds for process to terminate normally after sending SIGTERM (15)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-4' (*): sending SIGKILL...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-s-4' (*): after sending SIGTERM (15) and SIGKILL, process * exited by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_sync_do ("test-s-4", pid4s, SIGTERM, 1, TRUE, &expected_signal_KILL);
+
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-1' (*): wait for process to terminate after sending SIGTERM (15) (send SIGKILL in 500 milliseconds)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-1' (*): terminated by signal 15 (* usec elapsed)");
+	test_nm_utils_kill_child_async_do ("test-a-1-1", pid1a_1, SIGTERM, 1000 / 2, TRUE, &expected_signal_TERM);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-2' (*): wait for process to terminate after sending SIGKILL (9)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-2' (*): terminated by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_async_do ("test-a-1-2", pid1a_2, SIGKILL, 1000 / 2, TRUE, &expected_signal_KILL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-3' (*): wait for process to terminate after sending no signal (0) (send SIGKILL in 1 milliseconds)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-3' (*): process not terminated after * usec. Sending SIGKILL signal");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-1-3' (*): terminated by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_async_do ("test-a-1-3", pid1a_3, 0, 1, TRUE, &expected_signal_KILL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-2' (*): process * already terminated normally with status 47");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-2' (*): invoke callback: terminated normally with status 47");
+	test_nm_utils_kill_child_async_do ("test-a-2", pid2a, SIGTERM, 1000 / 2, TRUE, &expected_exit_47);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING, "*kill child process 'test-a-3-0' (*): unexpected error sending Unexpected signal: Invalid argument (22)");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-3-0' (*): invoke callback: killing child failed");
+	/* coverity[negative_returns] */
+	test_nm_utils_kill_child_async_do ("test-a-3-0", pid3a, -1, 1000 / 2, FALSE, NULL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-3-1' (*): wait for process to terminate after sending SIGTERM (15) (send SIGKILL in 500 milliseconds)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-3-1' (*): terminated normally with status 47 (* usec elapsed)");
+	test_nm_utils_kill_child_async_do ("test-a-3-1", pid3a, SIGTERM, 1000 / 2, TRUE, &expected_exit_47);
+
+	/* pid3a should not be a valid process, hence the call should fail. Note, that there
+	 * is a race here. */
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING, "*kill child process 'test-a-3-2' (*): failed due to unexpected return value -1 by waitpid (No child processes, 10) after sending no signal (0)");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-3-2' (*): invoke callback: killing child failed");
+	test_nm_utils_kill_child_async_do ("test-a-3-2", pid3a, 0, 0, FALSE, NULL);
+
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-4' (*): wait for process to terminate after sending SIGTERM (15) (send SIGKILL in 1 milliseconds)...");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-4' (*): process not terminated after * usec. Sending SIGKILL signal");
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_DEBUG, "*kill child process 'test-a-4' (*): terminated by signal 9 (* usec elapsed)");
+	test_nm_utils_kill_child_async_do ("test-a-4", pid4a, SIGTERM, 1, TRUE, &expected_signal_KILL);
+
+	err = setpgid (0, 0);
+	g_assert (err == 0);
+
+	kill (-gpid, SIGKILL);
+
+	g_log_set_always_fatal (fatal_mask);
+
+	g_test_assert_expected_messages ();
+}
+
+
+/*******************************************/
+
+NMTST_DEFINE ();
+
+int
+main (int argc, char **argv)
+{
+	nmtst_init_assert_logging (&argc, &argv);
+
+	nm_logging_setup ("DEBUG", "DEFAULT", NULL, NULL);
+
+	g_test_add_func ("/general/nm_utils_kill_child", test_nm_utils_kill_child);
+
+	return g_test_run ();
+}
+
diff --git a/src/tests/test-general.c b/src/tests/test-general.c
index 11c03f0d..f118156b 100644
--- a/src/tests/test-general.c
+++ b/src/tests/test-general.c
@@ -18,14 +18,17 @@
  *
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <string.h>
 #include <errno.h>
-#include <netinet/ether.h>
 
 #include "NetworkManagerUtils.h"
-#include "nm-utils.h"
+#include "nm-logging.h"
+#include "nm-core-internal.h"
 
+#include "nm-test-utils.h"
 
 static void
 test_nm_utils_ascii_str_to_int64_check (const char *str, guint base, gint64 min,
@@ -66,7 +69,7 @@ test_nm_utils_ascii_str_to_int64_do (const char *str, guint base, gint64 min,
 		NULL,
 	};
 	const char **ws_pre, **ws_post, **null;
-	int i;
+	guint i;
 
 	if (str == NULL || exp_errno != 0) {
 		test_nm_utils_ascii_str_to_int64_check (str, base, min, max, fallback, exp_errno, exp_val);
@@ -179,51 +182,104 @@ ip6_address_clear_host_address_reference (struct in6_addr *dst, struct in6_addr
 }
 
 static void
-_randomize_in6_addr (struct in6_addr *addr, GRand *rand)
+_randomize_in6_addr (struct in6_addr *addr, GRand *r)
 {
 	int i;
 
 	for (i=0; i < 4; i++)
-		((guint32 *)addr)[i] = g_rand_int (rand);
+		((guint32 *)addr)[i] = g_rand_int (r);
 }
 
 static void
 test_nm_utils_ip6_address_clear_host_address (void)
 {
-	GRand *rand = g_rand_new ();
+	GRand *r = g_rand_new ();
 	int plen, i;
 
-	g_rand_set_seed (rand, 0);
+	g_rand_set_seed (r, 0);
 
 	for (plen = 0; plen <= 128; plen++) {
 		for (i =0; i<50; i++) {
 			struct in6_addr addr_src, addr_ref;
 			struct in6_addr addr1, addr2;
 
-			_randomize_in6_addr (&addr_src, rand);
-			_randomize_in6_addr (&addr_ref, rand);
-			_randomize_in6_addr (&addr1, rand);
-			_randomize_in6_addr (&addr2, rand);
+			_randomize_in6_addr (&addr_src, r);
+			_randomize_in6_addr (&addr_ref, r);
+			_randomize_in6_addr (&addr1, r);
+			_randomize_in6_addr (&addr2, r);
 
 			addr1 = addr_src;
 			ip6_address_clear_host_address_reference (&addr_ref, &addr1, plen);
 
-			_randomize_in6_addr (&addr1, rand);
-			_randomize_in6_addr (&addr2, rand);
+			_randomize_in6_addr (&addr1, r);
+			_randomize_in6_addr (&addr2, r);
 			addr1 = addr_src;
 			nm_utils_ip6_address_clear_host_address (&addr2, &addr1, plen);
 			g_assert_cmpint (memcmp (&addr1, &addr_src, sizeof (struct in6_addr)), ==, 0);
 			g_assert_cmpint (memcmp (&addr2, &addr_ref, sizeof (struct in6_addr)), ==, 0);
 
 			/* test for self assignment/inplace update. */
-			_randomize_in6_addr (&addr1, rand);
+			_randomize_in6_addr (&addr1, r);
 			addr1 = addr_src;
 			nm_utils_ip6_address_clear_host_address (&addr1, &addr1, plen);
 			g_assert_cmpint (memcmp (&addr1, &addr_ref, sizeof (struct in6_addr)), ==, 0);
 		}
 	}
 
-	g_rand_free (rand);
+	g_rand_free (r);
+}
+
+
+static void
+test_nm_utils_log_connection_diff (void)
+{
+	NMConnection *connection;
+	NMConnection *connection2;
+
+	/* if logging is disabled (the default), nm_utils_log_connection_diff() returns
+	 * early without doing anything. Hence, in the normal testing, this test does nothing.
+	 * It only gets interesting, when run verbosely with NMTST_DEBUG=debug ... */
+
+	nm_log (LOGL_DEBUG, LOGD_CORE, "START TEST test_nm_utils_log_connection_diff...");
+
+	connection = nm_simple_connection_new ();
+	nm_connection_add_setting (connection, nm_setting_connection_new ());
+	nm_utils_log_connection_diff (connection, NULL, LOGL_DEBUG, LOGD_CORE, "test1", ">>> ");
+
+	nm_connection_add_setting (connection, nm_setting_wired_new ());
+	nm_utils_log_connection_diff (connection, NULL, LOGL_DEBUG, LOGD_CORE, "test2", ">>> ");
+
+	connection2 = nm_simple_connection_new_clone (connection);
+	nm_utils_log_connection_diff (connection, connection2, LOGL_DEBUG, LOGD_CORE, "test3", ">>> ");
+
+	g_object_set (nm_connection_get_setting_connection (connection),
+	              NM_SETTING_CONNECTION_ID, "id",
+	              NM_SETTING_CONNECTION_UUID, "uuid",
+	              NULL);
+	g_object_set (nm_connection_get_setting_connection (connection2),
+	              NM_SETTING_CONNECTION_ID, "id2",
+	              NM_SETTING_CONNECTION_MASTER, "master2",
+	              NULL);
+	nm_utils_log_connection_diff (connection, connection2, LOGL_DEBUG, LOGD_CORE, "test4", ">>> ");
+
+	nm_connection_add_setting (connection, nm_setting_802_1x_new ());
+	nm_utils_log_connection_diff (connection, connection2, LOGL_DEBUG, LOGD_CORE, "test5", ">>> ");
+
+	g_object_set (nm_connection_get_setting_802_1x (connection),
+	              NM_SETTING_802_1X_PASSWORD, "id2",
+	              NM_SETTING_802_1X_PASSWORD_FLAGS, NM_SETTING_SECRET_FLAG_NOT_SAVED,
+	              NULL);
+	nm_utils_log_connection_diff (connection, NULL, LOGL_DEBUG, LOGD_CORE, "test6", ">>> ");
+	nm_utils_log_connection_diff (connection, connection2, LOGL_DEBUG, LOGD_CORE, "test7", ">>> ");
+	nm_utils_log_connection_diff (connection2, connection, LOGL_DEBUG, LOGD_CORE, "test8", ">>> ");
+
+	g_clear_object (&connection);
+	g_clear_object (&connection2);
+
+	connection = nmtst_create_minimal_connection ("id-vpn-1", NULL, NM_SETTING_VPN_SETTING_NAME, NULL);
+	nm_utils_log_connection_diff (connection, NULL, LOGL_DEBUG, LOGD_CORE, "test-vpn-1", ">>> ");
+
+	g_clear_object (&connection);
 }
 
 /*******************************************/
@@ -234,11 +290,10 @@ _match_connection_new (void)
 	NMConnection *connection;
 	NMSettingConnection *s_con;
 	NMSettingWired *s_wired;
-	NMSettingIP4Config *s_ip4;
-	NMSettingIP6Config *s_ip6;
+	NMSettingIPConfig *s_ip4, *s_ip6;
 	char *uuid;
 
-	connection = nm_connection_new ();
+	connection = nm_simple_connection_new ();
 
 	s_con = (NMSettingConnection *) nm_setting_connection_new ();
 	nm_connection_add_setting (connection, (NMSetting *) s_con);
@@ -254,16 +309,16 @@ _match_connection_new (void)
 	s_wired = (NMSettingWired *) nm_setting_wired_new ();
 	nm_connection_add_setting (connection, (NMSetting *) s_wired);
 
-	s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new ();
+	s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
 	nm_connection_add_setting (connection, (NMSetting *) s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
 	              NULL);
 
-	s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new ();
+	s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
 	nm_connection_add_setting (connection, (NMSetting *) s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
 	              NULL);
 
 	return connection;
@@ -274,10 +329,10 @@ test_connection_match_basic (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP4Config *s_ip4;
+	NMSettingIPConfig *s_ip4;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
@@ -287,7 +342,7 @@ test_connection_match_basic (void)
 	s_ip4 = nm_connection_get_setting_ip4_config (orig);
 	g_assert (s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL,
 	              NULL);
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
 	g_assert (matched == NULL);
@@ -302,10 +357,10 @@ test_connection_match_ip6_method (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP6Config *s_ip6;
+	NMSettingIPConfig *s_ip6;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if the generated connection is IPv6 method=link-local, and the
@@ -315,14 +370,14 @@ test_connection_match_ip6_method (void)
 	s_ip6 = nm_connection_get_setting_ip6_config (orig);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
 	              NULL);
 
 	s_ip6 = nm_connection_get_setting_ip6_config (copy);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
-	              NM_SETTING_IP6_CONFIG_MAY_FAIL, TRUE,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
+	              NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
 	              NULL);
 
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
@@ -338,10 +393,10 @@ test_connection_match_ip6_method_ignore (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP6Config *s_ip6;
+	NMSettingIPConfig *s_ip6;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if the generated connection is IPv6 method=link-local, and the
@@ -350,13 +405,13 @@ test_connection_match_ip6_method_ignore (void)
 	s_ip6 = nm_connection_get_setting_ip6_config (orig);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
 	              NULL);
 
 	s_ip6 = nm_connection_get_setting_ip6_config (copy);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
 	              NULL);
 
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
@@ -372,10 +427,10 @@ test_connection_match_ip6_method_ignore_auto (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP6Config *s_ip6;
+	NMSettingIPConfig *s_ip6;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if the generated connection is IPv6 method=auto, and the
@@ -384,13 +439,13 @@ test_connection_match_ip6_method_ignore_auto (void)
 	s_ip6 = nm_connection_get_setting_ip6_config (orig);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
 	              NULL);
 
 	s_ip6 = nm_connection_get_setting_ip6_config (copy);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
 	              NULL);
 
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
@@ -407,10 +462,10 @@ test_connection_match_ip4_method (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP4Config *s_ip4;
+	NMSettingIPConfig *s_ip4;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if the generated connection is IPv4 method=disabled, and the
@@ -420,14 +475,14 @@ test_connection_match_ip4_method (void)
 	s_ip4 = nm_connection_get_setting_ip4_config (orig);
 	g_assert (s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
 	              NULL);
 
 	s_ip4 = nm_connection_get_setting_ip4_config (copy);
 	g_assert (s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
-	              NM_SETTING_IP4_CONFIG_MAY_FAIL, TRUE,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+	              NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
 	              NULL);
 
 	matched = nm_utils_match_connection (connections, orig, FALSE, NULL, NULL);
@@ -450,7 +505,7 @@ test_connection_match_interface_name (void)
 	NMSettingConnection *s_con;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if the generated connection has an interface name and the
@@ -482,18 +537,13 @@ test_connection_match_wired (void)
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
 	NMSettingWired *s_wired;
-	GPtrArray *subchan_arr = g_ptr_array_sized_new (3);
-	GByteArray *mac;
-
-	g_ptr_array_add (subchan_arr, "0.0.8000");
-	g_ptr_array_add (subchan_arr, "0.0.8001");
-	g_ptr_array_add (subchan_arr, "0.0.8002");
+	char *subchan_arr[] = { "0.0.8000", "0.0.8001", "0.0.8002", NULL };
+	const char *mac = "52:54:00:ab:db:23";
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
-	mac = nm_utils_hwaddr_atoba ("52:54:00:ab:db:23", ARPHRD_ETHER);
 	s_wired = nm_connection_get_setting_wired (orig);
 	g_assert (s_wired);
 	g_object_set (G_OBJECT (s_wired),
@@ -502,7 +552,6 @@ test_connection_match_wired (void)
 	              NM_SETTING_WIRED_S390_SUBCHANNELS, subchan_arr,
 	              NM_SETTING_WIRED_S390_NETTYPE, "qeth",
 	              NULL);
-	g_byte_array_free (mac, TRUE);
 
 	s_wired = nm_connection_get_setting_wired (copy);
 	g_assert (s_wired);
@@ -515,7 +564,6 @@ test_connection_match_wired (void)
 	g_assert (matched == copy);
 
 	g_slist_free (connections);
-	g_ptr_array_free (subchan_arr, TRUE);
 	g_object_unref (orig);
 	g_object_unref (copy);
 }
@@ -525,13 +573,12 @@ test_connection_no_match_ip4_addr (void)
 {
 	NMConnection *orig, *copy, *matched;
 	GSList *connections = NULL;
-	NMSettingIP4Config *s_ip4;
-	NMSettingIP6Config *s_ip6;
-	NMIP4Address *nm_addr;
-	guint32 addr, gw;
+	NMSettingIPConfig *s_ip4, *s_ip6;
+	NMIPAddress *nm_addr;
+	GError *error = NULL;
 
 	orig = _match_connection_new ();
-	copy = nm_connection_duplicate (orig);
+	copy = nm_simple_connection_new_clone (orig);
 	connections = g_slist_append (connections, copy);
 
 	/* Check that if we have two differences, ipv6.method (exception we allow) and
@@ -540,43 +587,37 @@ test_connection_no_match_ip4_addr (void)
 	s_ip6 = nm_connection_get_setting_ip6_config (orig);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
 	              NULL);
 
 	s_ip6 = nm_connection_get_setting_ip6_config (copy);
 	g_assert (s_ip6);
 	g_object_set (G_OBJECT (s_ip6),
-	              NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
 	              NULL);
 
 
 	s_ip4 = nm_connection_get_setting_ip4_config (orig);
 	g_assert (s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+	              NM_SETTING_IP_CONFIG_GATEWAY, "1.1.1.254",
 	              NULL);
-	nm_addr = nm_ip4_address_new ();
-	inet_pton (AF_INET, "1.1.1.4", &addr);
-	inet_pton (AF_INET, "1.1.1.254", &gw);
-	nm_ip4_address_set_address (nm_addr, addr);
-	nm_ip4_address_set_prefix (nm_addr, 24);
-	nm_ip4_address_set_gateway (nm_addr, gw);
-	nm_setting_ip4_config_add_address (s_ip4, nm_addr);
-	nm_ip4_address_unref (nm_addr);
+	nm_addr = nm_ip_address_new (AF_INET, "1.1.1.4", 24, &error);
+	g_assert_no_error (error);
+	nm_setting_ip_config_add_address (s_ip4, nm_addr);
+	nm_ip_address_unref (nm_addr);
 
 	s_ip4 = nm_connection_get_setting_ip4_config (copy);
 	g_assert (s_ip4);
 	g_object_set (G_OBJECT (s_ip4),
-	              NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+	              NM_SETTING_IP_CONFIG_GATEWAY, "2.2.2.254",
 	              NULL);
-	nm_addr = nm_ip4_address_new ();
-	inet_pton (AF_INET, "2.2.2.4", &addr);
-	inet_pton (AF_INET, "2.2.2.254", &gw);
-	nm_ip4_address_set_address (nm_addr, addr);
-	nm_ip4_address_set_prefix (nm_addr, 24);
-	nm_ip4_address_set_gateway (nm_addr, gw);
-	nm_setting_ip4_config_add_address (s_ip4, nm_addr);
-	nm_ip4_address_unref (nm_addr);
+	nm_addr = nm_ip_address_new (AF_INET, "2.2.2.4", 24, &error);
+	g_assert_no_error (error);
+	nm_setting_ip_config_add_address (s_ip4, nm_addr);
+	nm_ip_address_unref (nm_addr);
 
 	matched = nm_utils_match_connection (connections, orig, TRUE, NULL, NULL);
 	g_assert (matched != copy);
@@ -586,19 +627,163 @@ test_connection_no_match_ip4_addr (void)
 	g_object_unref (copy);
 }
 
+static NMConnection *
+_create_connection_autoconnect (const char *id, gboolean autoconnect, int autoconnect_priority)
+{
+	NMConnection *c;
+	NMSettingConnection *s_con;
+
+	c = nmtst_create_minimal_connection (id, NULL, NM_SETTING_WIRED_SETTING_NAME, &s_con);
+	g_object_set (s_con,
+	              NM_SETTING_CONNECTION_AUTOCONNECT, autoconnect,
+	              NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY, autoconnect_priority,
+	              NULL);
+	nmtst_connection_normalize (c);
+	return c;
+}
+
+static void
+_test_connection_sort_autoconnect_priority_one (NMConnection **list, gboolean shuffle)
+{
+	int i, j;
+	int count = 0;
+	gs_unref_ptrarray GPtrArray *connections = g_ptr_array_new ();
+
+	while (list[count])
+		count++;
+	g_assert (count > 1);
+
+	/* copy the list of connections over to @connections and shuffle. */
+	for (i = 0; i < count; i++)
+		g_ptr_array_add (connections, list[i]);
+	if (shuffle) {
+		for (i = count - 1; i > 0; i--) {
+			j = g_rand_int (nmtst_get_rand ()) % (i + 1);
+			NMTST_SWAP (connections->pdata[i], connections->pdata[j]);
+		}
+	}
+
+	/* sort it... */
+	g_ptr_array_sort (connections, (GCompareFunc) nm_utils_cmp_connection_by_autoconnect_priority);
+
+	for (i = 0; i < count; i++) {
+		if (list[i] == connections->pdata[i])
+			continue;
+		if (shuffle && nm_utils_cmp_connection_by_autoconnect_priority (&list[i], (NMConnection **) &connections->pdata[i]) == 0)
+			continue;
+		g_message ("After sorting, the order of connections is not as expected!! Offending index: %d", i);
+		for (j = 0; j < count; j++)
+			g_message ("  %3d:  %p/%-20s - %p/%-20s", j, list[j], nm_connection_get_id (list[j]), connections->pdata[j], nm_connection_get_id (connections->pdata[j]));
+		g_assert_not_reached ();
+	}
+}
+
+static void
+_test_connection_sort_autoconnect_priority_free (NMConnection **list)
+{
+	while (*list) {
+		g_object_unref (*list);
+		*list = NULL;
+	}
+}
+
+static void
+test_connection_sort_autoconnect_priority (void)
+{
+	NMConnection *c1[] = {
+		_create_connection_autoconnect ("AC/100", TRUE, 100),
+		_create_connection_autoconnect ("AC/100", TRUE, 100),
+		_create_connection_autoconnect ("AC/99", TRUE, 99),
+		_create_connection_autoconnect ("AC/0", TRUE, 0),
+		_create_connection_autoconnect ("AC/0", TRUE, 0),
+		_create_connection_autoconnect ("AC/-1", TRUE, -1),
+		_create_connection_autoconnect ("AC/-3", TRUE, -3),
+		_create_connection_autoconnect ("ac/0", FALSE, 0),
+		_create_connection_autoconnect ("ac/0", FALSE, 0),
+		_create_connection_autoconnect ("ac/1", FALSE, 1),
+		_create_connection_autoconnect ("ac/-1", FALSE, -1),
+		_create_connection_autoconnect ("ac/1", FALSE, 1),
+		_create_connection_autoconnect ("ac/0", FALSE, 0),
+		NULL,
+	};
+	NMConnection *c2[] = {
+		_create_connection_autoconnect ("AC/100", TRUE, 100),
+		_create_connection_autoconnect ("AC/99", TRUE, 99),
+		_create_connection_autoconnect ("AC/0", TRUE, 0),
+		_create_connection_autoconnect ("AC/-1", TRUE, -1),
+		_create_connection_autoconnect ("AC/-3", TRUE, -3),
+		_create_connection_autoconnect ("ac/0", FALSE, 0),
+		NULL,
+	};
+
+	_test_connection_sort_autoconnect_priority_one (c1, FALSE);
+	_test_connection_sort_autoconnect_priority_one (c2, FALSE);
+	_test_connection_sort_autoconnect_priority_one (c1, TRUE);
+	_test_connection_sort_autoconnect_priority_one (c2, TRUE);
+
+	_test_connection_sort_autoconnect_priority_free (c1);
+	_test_connection_sort_autoconnect_priority_free (c2);
+}
+
 /*******************************************/
 
+static void
+__test_uuid (const char *expected_uuid, const char *str, gssize slen, char *uuid_test)
+{
+	g_assert (uuid_test);
+	g_assert (nm_utils_is_uuid (uuid_test));
+
+	if (strcmp (uuid_test, expected_uuid)) {
+		g_error ("UUID test failed (1): text=%s, len=%lld, expected=%s, uuid_test=%s",
+		         str, (long long) slen, expected_uuid, uuid_test);
+	}
+	g_free (uuid_test);
+
+	uuid_test = nm_utils_uuid_generate_from_string (str, slen, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
+
+	g_assert (uuid_test);
+	g_assert (nm_utils_is_uuid (uuid_test));
+
+	if (strcmp (uuid_test, expected_uuid)) {
+		g_error ("UUID test failed (2): text=%s; len=%lld, expected=%s, uuid2=%s",
+		         str, (long long) slen, expected_uuid, uuid_test);
+	}
+	g_free (uuid_test);
+}
+
+#define _test_uuid(expected_uuid, str, strlen, ...) __test_uuid (expected_uuid, str, strlen, nm_utils_uuid_generate_from_strings(__VA_ARGS__, NULL))
+
+static void
+test_nm_utils_uuid_generate_from_strings (void)
+{
+	_test_uuid ("b07c334a-399b-32de-8d50-58e4e08f98e3", "",         0, NULL);
+	_test_uuid ("b8a426cb-bcb5-30a3-bd8f-6786fea72df9", "\0",       1, "");
+	_test_uuid ("12a4a982-7aae-39e1-951e-41aeb1250959", "a\0",      2, "a");
+	_test_uuid ("69e22c7e-f89f-3a43-b239-1cb52ed8db69", "aa\0",     3, "aa");
+	_test_uuid ("59829fd3-5ad5-3d90-a7b0-4911747e4088", "\0\0",     2, "",   "");
+	_test_uuid ("01ad0e06-6c50-3384-8d86-ddab81421425", "a\0\0",    3, "a",  "");
+	_test_uuid ("e1ed8647-9ed3-3ec8-8c6d-e8204524d71d", "aa\0\0",   4, "aa", "");
+	_test_uuid ("fb1c7cd6-275c-3489-9382-83b900da8af0", "\0a\0",    3, "",   "a");
+	_test_uuid ("5d79494e-c4ba-31a6-80a2-d6016ccd7e17", "a\0a\0",   4, "a",  "a");
+	_test_uuid ("fd698d86-1b60-3ebe-855f-7aada9950a8d", "aa\0a\0",  5, "aa", "a");
+	_test_uuid ("8c573b48-0f01-30ba-bb94-c5f59f4fe517", "\0aa\0",   4, "",   "aa");
+	_test_uuid ("2bdd3d46-eb83-3c53-a41b-a724d04b5544", "a\0aa\0",  5, "a",  "aa");
+	_test_uuid ("13d4b780-07c1-3ba7-b449-81c4844ef039", "aa\0aa\0", 6, "aa", "aa");
+	_test_uuid ("dd265bf7-c05a-3037-9939-b9629858a477", "a\0b\0",   4, "a",  "b");
+}
+
+/*******************************************/
+
+NMTST_DEFINE ();
+
 int
 main (int argc, char **argv)
 {
-	g_test_init (&argc, &argv, NULL);
-
-#if !GLIB_CHECK_VERSION (2, 35, 0)
-	g_type_init ();
-#endif
+	nmtst_init_with_logging (&argc, &argv, NULL, "ALL");
 
 	g_test_add_func ("/general/nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64);
 	g_test_add_func ("/general/nm_utils_ip6_address_clear_host_address", test_nm_utils_ip6_address_clear_host_address);
+	g_test_add_func ("/general/nm_utils_log_connection_diff", test_nm_utils_log_connection_diff);
 
 	g_test_add_func ("/general/connection-match/basic", test_connection_match_basic);
 	g_test_add_func ("/general/connection-match/ip6-method", test_connection_match_ip6_method);
@@ -609,6 +794,10 @@ main (int argc, char **argv)
 	g_test_add_func ("/general/connection-match/wired", test_connection_match_wired);
 	g_test_add_func ("/general/connection-match/no-match-ip4-addr", test_connection_no_match_ip4_addr);
 
+	g_test_add_func ("/general/connection-sort/autoconnect-priority", test_connection_sort_autoconnect_priority);
+
+	g_test_add_func ("/general/nm_utils_uuid_generate_from_strings", test_nm_utils_uuid_generate_from_strings);
+
 	return g_test_run ();
 }
 
diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c
index 3eee5f13..657f7e05 100644
--- a/src/tests/test-ip4-config.c
+++ b/src/tests/test-ip4-config.c
@@ -18,11 +18,14 @@
  *
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <string.h>
 #include <arpa/inet.h>
 
 #include "nm-ip4-config.h"
+#include "nm-platform.h"
 
 static void
 addr_init (NMPlatformIP4Address *a, const char *addr, const char *peer, guint plen)
@@ -138,7 +141,7 @@ test_subtract (void)
 	nm_ip4_config_add_wins (dst, expected_wins);
 
 	nm_ip4_config_set_mss (dst, expected_mss);
-	nm_ip4_config_set_mtu (dst, expected_mtu);
+	nm_ip4_config_set_mtu (dst, expected_mtu, NM_IP_CONFIG_SOURCE_UNKNOWN);
 
 	nm_ip4_config_subtract (dst, src);
 
@@ -193,18 +196,18 @@ test_compare_with_source (void)
 
 	/* Address */
 	addr_init (&addr, "1.2.3.4", NULL, 24);
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_address (a, &addr);
 
-	addr.source = NM_PLATFORM_SOURCE_VPN;
+	addr.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip4_config_add_address (b, &addr);
 
 	/* Route */
 	route_new (&route, "10.0.0.0", 8, "192.168.1.1");
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_route (a, &route);
 
-	route.source = NM_PLATFORM_SOURCE_VPN;
+	route.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip4_config_add_route (b, &route);
 
 	/* Assert that the configs are basically the same, eg that the source is ignored */
@@ -225,31 +228,31 @@ test_add_address_with_source (void)
 
 	/* Test that a higher priority source is not overwritten */
 	addr_init (&addr, "1.2.3.4", NULL, 24);
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_address (a, &addr);
 
 	test_addr = nm_ip4_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
-	addr.source = NM_PLATFORM_SOURCE_VPN;
+	addr.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip4_config_add_address (a, &addr);
 
 	test_addr = nm_ip4_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	/* Test that a lower priority address source is overwritten */
 	nm_ip4_config_del_address (a, 0);
-	addr.source = NM_PLATFORM_SOURCE_KERNEL;
+	addr.source = NM_IP_CONFIG_SOURCE_KERNEL;
 	nm_ip4_config_add_address (a, &addr);
 
 	test_addr = nm_ip4_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_KERNEL);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_KERNEL);
 
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_address (a, &addr);
 
 	test_addr = nm_ip4_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	g_object_unref (a);
 }
@@ -265,31 +268,31 @@ test_add_route_with_source (void)
 
 	/* Test that a higher priority source is not overwritten */
 	route_new (&route, "1.2.3.4", 24, "1.2.3.1");
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_route (a, &route);
 
 	test_route = nm_ip4_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
-	route.source = NM_PLATFORM_SOURCE_VPN;
+	route.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip4_config_add_route (a, &route);
 
 	test_route = nm_ip4_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	/* Test that a lower priority address source is overwritten */
 	nm_ip4_config_del_route (a, 0);
-	route.source = NM_PLATFORM_SOURCE_KERNEL;
+	route.source = NM_IP_CONFIG_SOURCE_KERNEL;
 	nm_ip4_config_add_route (a, &route);
 
 	test_route = nm_ip4_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_KERNEL);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_KERNEL);
 
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip4_config_add_route (a, &route);
 
 	test_route = nm_ip4_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	g_object_unref (a);
 }
@@ -309,9 +312,9 @@ test_merge_subtract_mss_mtu (void)
 
 	/* add MSS, MTU to configs to test them */
 	nm_ip4_config_set_mss (cfg2, expected_mss2);
-	nm_ip4_config_set_mtu (cfg2, expected_mtu2);
+	nm_ip4_config_set_mtu (cfg2, expected_mtu2, NM_IP_CONFIG_SOURCE_UNKNOWN);
 	nm_ip4_config_set_mss (cfg3, expected_mss3);
-	nm_ip4_config_set_mtu (cfg3, expected_mtu3);
+	nm_ip4_config_set_mtu (cfg3, expected_mtu3, NM_IP_CONFIG_SOURCE_UNKNOWN);
 
 	nm_ip4_config_merge (cfg1, cfg2);
 	/* ensure MSS and MTU are in cfg1 */
diff --git a/src/tests/test-ip6-config.c b/src/tests/test-ip6-config.c
index 75fe28ee..9e1d5651 100644
--- a/src/tests/test-ip6-config.c
+++ b/src/tests/test-ip6-config.c
@@ -18,6 +18,8 @@
  *
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <string.h>
 #include <arpa/inet.h>
@@ -25,6 +27,7 @@
 #include "nm-ip6-config.h"
 
 #include "nm-logging.h"
+#include "nm-platform.h"
 #include "nm-test-utils.h"
 
 static NMIP6Config *
@@ -131,18 +134,18 @@ test_compare_with_source (void)
 
 	/* Address */
 	addr = *nmtst_platform_ip6_address ("1122:3344:5566::7788", NULL, 64);
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_address (a, &addr);
 
-	addr.source = NM_PLATFORM_SOURCE_VPN;
+	addr.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip6_config_add_address (b, &addr);
 
 	/* Route */
 	route = *nmtst_platform_ip6_route ("abcd:1234:4321::", 24, "abcd:1234:4321:cdde::2");
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_route (a, &route);
 
-	route.source = NM_PLATFORM_SOURCE_VPN;
+	route.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip6_config_add_route (b, &route);
 
 	/* Assert that the configs are basically the same, eg that the source is ignored */
@@ -163,31 +166,31 @@ test_add_address_with_source (void)
 
 	/* Test that a higher priority source is not overwritten */
 	addr = *nmtst_platform_ip6_address ("1122:3344:5566::7788", NULL, 64);
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_address (a, &addr);
 
 	test_addr = nm_ip6_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
-	addr.source = NM_PLATFORM_SOURCE_VPN;
+	addr.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip6_config_add_address (a, &addr);
 
 	test_addr = nm_ip6_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	/* Test that a lower priority address source is overwritten */
 	nm_ip6_config_del_address (a, 0);
-	addr.source = NM_PLATFORM_SOURCE_KERNEL;
+	addr.source = NM_IP_CONFIG_SOURCE_KERNEL;
 	nm_ip6_config_add_address (a, &addr);
 
 	test_addr = nm_ip6_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_KERNEL);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_KERNEL);
 
-	addr.source = NM_PLATFORM_SOURCE_USER;
+	addr.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_address (a, &addr);
 
 	test_addr = nm_ip6_config_get_address (a, 0);
-	g_assert_cmpint (test_addr->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_addr->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	g_object_unref (a);
 }
@@ -203,31 +206,31 @@ test_add_route_with_source (void)
 
 	/* Test that a higher priority source is not overwritten */
 	route = *nmtst_platform_ip6_route ("abcd:1234:4321::", 24, "abcd:1234:4321:cdde::2");
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_route (a, &route);
 
 	test_route = nm_ip6_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
-	route.source = NM_PLATFORM_SOURCE_VPN;
+	route.source = NM_IP_CONFIG_SOURCE_VPN;
 	nm_ip6_config_add_route (a, &route);
 
 	test_route = nm_ip6_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	/* Test that a lower priority address source is overwritten */
 	nm_ip6_config_del_route (a, 0);
-	route.source = NM_PLATFORM_SOURCE_KERNEL;
+	route.source = NM_IP_CONFIG_SOURCE_KERNEL;
 	nm_ip6_config_add_route (a, &route);
 
 	test_route = nm_ip6_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_KERNEL);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_KERNEL);
 
-	route.source = NM_PLATFORM_SOURCE_USER;
+	route.source = NM_IP_CONFIG_SOURCE_USER;
 	nm_ip6_config_add_route (a, &route);
 
 	test_route = nm_ip6_config_get_route (a, 0);
-	g_assert_cmpint (test_route->source, ==, NM_PLATFORM_SOURCE_USER);
+	g_assert_cmpint (test_route->source, ==, NM_IP_CONFIG_SOURCE_USER);
 
 	g_object_unref (a);
 }
@@ -285,33 +288,33 @@ test_nm_ip6_config_addresses_sort (void)
 #define ADDR_ADD(...) nm_ip6_config_add_address (config, nmtst_platform_ip6_address_full (__VA_ARGS__))
 
 	nm_ip6_config_reset_addresses (config);
-	ADDR_ADD("2607:f0d0:1002:51::4",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::5",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::6",     NULL,  64, 0, NM_PLATFORM_SOURCE_RDISC,  0, 0, 0, IFA_F_MANAGETEMPADDR);
-	ADDR_ADD("2607:f0d0:1002:51::3",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("2607:f0d0:1002:51::8",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("2607:f0d0:1002:51::0",     NULL,  64, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("fec0::1",                  NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("fe80::208:74ff:feda:625c", NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("fe80::208:74ff:feda:625d", NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("::1",                      NULL, 128, 0, NM_PLATFORM_SOURCE_USER, 0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::2",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_TENTATIVE);
+	ADDR_ADD("2607:f0d0:1002:51::4",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::5",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::6",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_RDISC,  0, 0, 0, IFA_F_MANAGETEMPADDR);
+	ADDR_ADD("2607:f0d0:1002:51::3",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("2607:f0d0:1002:51::8",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("2607:f0d0:1002:51::0",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("fec0::1",                  NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("fe80::208:74ff:feda:625c", NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("fe80::208:74ff:feda:625d", NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("::1",                      NULL, 128, 0, NM_IP_CONFIG_SOURCE_USER, 0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::2",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_TENTATIVE);
 	test_nm_ip6_config_addresses_sort_check (config, NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN, 8);
 	test_nm_ip6_config_addresses_sort_check (config, NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED, 8);
 	test_nm_ip6_config_addresses_sort_check (config, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR, 8);
 
 	nm_ip6_config_reset_addresses (config);
-	ADDR_ADD("2607:f0d0:1002:51::3",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("2607:f0d0:1002:51::4",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::5",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::8",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("2607:f0d0:1002:51::0",     NULL,  64, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, IFA_F_SECONDARY);
-	ADDR_ADD("2607:f0d0:1002:51::6",     NULL,  64, 0, NM_PLATFORM_SOURCE_RDISC,  0, 0, 0, IFA_F_MANAGETEMPADDR);
-	ADDR_ADD("fec0::1",                  NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("fe80::208:74ff:feda:625c", NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("fe80::208:74ff:feda:625d", NULL, 128, 0, NM_PLATFORM_SOURCE_KERNEL, 0, 0, 0, 0);
-	ADDR_ADD("::1",                      NULL, 128, 0, NM_PLATFORM_SOURCE_USER, 0, 0, 0, 0);
-	ADDR_ADD("2607:f0d0:1002:51::2",     NULL,  64, 0, NM_PLATFORM_SOURCE_USER,   0, 0, 0, IFA_F_TENTATIVE);
+	ADDR_ADD("2607:f0d0:1002:51::3",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("2607:f0d0:1002:51::4",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::5",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::8",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("2607:f0d0:1002:51::0",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, IFA_F_SECONDARY);
+	ADDR_ADD("2607:f0d0:1002:51::6",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_RDISC,  0, 0, 0, IFA_F_MANAGETEMPADDR);
+	ADDR_ADD("fec0::1",                  NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("fe80::208:74ff:feda:625c", NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("fe80::208:74ff:feda:625d", NULL, 128, 0, NM_IP_CONFIG_SOURCE_KERNEL, 0, 0, 0, 0);
+	ADDR_ADD("::1",                      NULL, 128, 0, NM_IP_CONFIG_SOURCE_USER, 0, 0, 0, 0);
+	ADDR_ADD("2607:f0d0:1002:51::2",     NULL,  64, 0, NM_IP_CONFIG_SOURCE_USER,   0, 0, 0, IFA_F_TENTATIVE);
 	test_nm_ip6_config_addresses_sort_check (config, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR, 8);
 
 #undef ADDR_ADD
diff --git a/src/tests/test-resolvconf-capture.c b/src/tests/test-resolvconf-capture.c
index cde4bbe5..f5cb298b 100644
--- a/src/tests/test-resolvconf-capture.c
+++ b/src/tests/test-resolvconf-capture.c
@@ -18,10 +18,15 @@
  *
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <string.h>
+#include <arpa/inet.h>
 
 #include "NetworkManagerUtils.h"
+#include "nm-ip4-config.h"
+#include "nm-ip6-config.h"
 #include "nm-platform.h"
 
 static void
diff --git a/src/tests/test-wired-defname.c b/src/tests/test-wired-defname.c
new file mode 100644
index 00000000..a05588b8
--- /dev/null
+++ b/src/tests/test-wired-defname.c
@@ -0,0 +1,130 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <nm-simple-connection.h>
+#include <nm-setting-connection.h>
+#include "nm-device-ethernet-utils.h"
+
+static NMConnection *
+_new_connection (const char *id)
+{
+	NMConnection *a;
+	NMSetting *setting;
+
+	a = nm_simple_connection_new ();
+	setting = nm_setting_connection_new ();
+	g_object_set (setting, NM_SETTING_CONNECTION_ID, id, NULL);
+	nm_connection_add_setting (a, setting);
+	return a;
+}
+
+/*******************************************/
+
+static void
+test_defname_no_connections (void)
+{
+	char *name;
+
+	name = nm_device_ethernet_utils_get_default_wired_name (NULL);
+	g_assert_cmpstr (name, ==, "Wired connection 1");
+}
+
+/*******************************************/
+
+static void
+test_defname_no_conflict (void)
+{
+	GSList *list = NULL;
+	char *name;
+
+	list = g_slist_append (list, _new_connection ("asdfasdfasdfadf"));
+	list = g_slist_append (list, _new_connection ("work wifi"));
+	list = g_slist_append (list, _new_connection ("random gsm connection"));
+
+	name = nm_device_ethernet_utils_get_default_wired_name (list);
+	g_assert_cmpstr (name, ==, "Wired connection 1");
+
+	g_slist_free_full (list, g_object_unref);
+}
+
+/*******************************************/
+
+static void
+test_defname_conflict (void)
+{
+	GSList *list = NULL;
+	char *name;
+
+	list = g_slist_append (list, _new_connection ("asdfasdfasdfadf"));
+	list = g_slist_append (list, _new_connection ("Wired connection 1"));
+	list = g_slist_append (list, _new_connection ("random gsm connection"));
+
+	name = nm_device_ethernet_utils_get_default_wired_name (list);
+	g_assert_cmpstr (name, ==, "Wired connection 2");
+
+	g_slist_free_full (list, g_object_unref);
+}
+
+/*******************************************/
+
+static void
+test_defname_multiple_conflicts (void)
+{
+	GSList *list = NULL;
+	char *name;
+
+	list = g_slist_append (list, _new_connection ("random gsm connection"));
+	list = g_slist_append (list, _new_connection ("home wifi"));
+	list = g_slist_append (list, _new_connection ("Wired connection 1"));
+	list = g_slist_append (list, _new_connection ("Wired connection 2"));
+	list = g_slist_append (list, _new_connection ("Wired connection 3"));
+	list = g_slist_append (list, _new_connection ("work wifi"));
+	list = g_slist_append (list, _new_connection ("a vpn"));
+
+	name = nm_device_ethernet_utils_get_default_wired_name (list);
+	g_assert_cmpstr (name, ==, "Wired connection 4");
+
+	g_slist_free_full (list, g_object_unref);
+}
+
+/*******************************************/
+
+int
+main (int argc, char **argv)
+{
+#if !GLIB_CHECK_VERSION (2, 35, 0)
+	g_type_init ();
+#endif
+
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/defname/no_connections", test_defname_no_connections);
+	g_test_add_func ("/defname/no_conflict", test_defname_no_conflict);
+	g_test_add_func ("/defname/conflict", test_defname_conflict);
+	g_test_add_func ("/defname/multiple_conflicts", test_defname_multiple_conflicts);
+
+	return g_test_run ();
+}
+