summary refs log tree commit diff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/Makefile.am8
-rw-r--r--tools/Makefile.in609
-rwxr-xr-xtools/create-exports-NetworkManager.sh117
-rwxr-xr-xtools/enums-to-docbook.pl7
-rwxr-xr-xtools/run-nm-test.sh260
-rwxr-xr-xtools/run-test-dbus-session.sh10
-rwxr-xr-xtools/run-test-valgrind.sh159
-rwxr-xr-xtools/test-networkmanager-service.py207
8 files changed, 532 insertions, 845 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am
deleted file mode 100644
index 966487c6..00000000
--- a/tools/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-EXTRA_DIST = \
-	check-exports.sh \
-	debug-helper.py \
-	run-test-valgrind.sh \
-	run-test-dbus-session.sh \
-	test-networkmanager-service.py \
-	test-sudo-wrapper.sh \
-	enums-to-docbook.pl
diff --git a/tools/Makefile.in b/tools/Makefile.in
deleted file mode 100644
index 8bdb192a..00000000
--- a/tools/Makefile.in
+++ /dev/null
@@ -1,609 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 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 = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-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@
-subdir = tools
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/attributes.m4 \
-	$(top_srcdir)/m4/ax_lib_readline.m4 \
-	$(top_srcdir)/m4/compiler_options.m4 \
-	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/git-sha-record.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)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-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 = 
-SOURCES =
-DIST_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)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALL_LINGUAS = @ALL_LINGUAS@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLUEZ5_CFLAGS = @BLUEZ5_CFLAGS@
-BLUEZ5_LIBS = @BLUEZ5_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-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@
-DBUS_CFLAGS = @DBUS_CFLAGS@
-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@
-DL_LIBS = @DL_LIBS@
-DNSMASQ_PATH = @DNSMASQ_PATH@
-DNSSEC_TRIGGER_SCRIPT = @DNSSEC_TRIGGER_SCRIPT@
-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_CHECK_PATH = @GTKDOC_CHECK_PATH@
-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@
-JANSSON_CFLAGS = @JANSSON_CFLAGS@
-JANSSON_LIBS = @JANSSON_LIBS@
-KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBAUDIT_CFLAGS = @LIBAUDIT_CFLAGS@
-LIBAUDIT_LIBS = @LIBAUDIT_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@
-LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
-LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
-LIBTEAMDCTL_CFLAGS = @LIBTEAMDCTL_CFLAGS@
-LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LOG_DRIVER = @LOG_DRIVER@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-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_CONFIG_DEFAULT_DNS_RC_MANAGER = @NM_CONFIG_DEFAULT_DNS_RC_MANAGER@
-NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT = @NM_CONFIG_DEFAULT_LOGGING_AUDIT_TEXT@
-NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT = @NM_CONFIG_LOGGING_BACKEND_DEFAULT_TEXT@
-NM_MAJOR_VERSION = @NM_MAJOR_VERSION@
-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@
-QT_CFLAGS = @QT_CFLAGS@
-QT_LIBS = @QT_LIBS@
-RANLIB = @RANLIB@
-READLINE_LIBS = @READLINE_LIBS@
-SANITIZERS = @SANITIZERS@
-SANITIZER_ENV = @SANITIZER_ENV@
-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_JOURNAL_CFLAGS = @SYSTEMD_JOURNAL_CFLAGS@
-SYSTEMD_JOURNAL_LIBS = @SYSTEMD_JOURNAL_LIBS@
-SYSTEMD_LOGIN_CFLAGS = @SYSTEMD_LOGIN_CFLAGS@
-SYSTEMD_LOGIN_LIBS = @SYSTEMD_LOGIN_LIBS@
-SYSTEM_CA_PATH = @SYSTEM_CA_PATH@
-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@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-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@
-nmlibdir = @nmlibdir@
-nmrundir = @nmrundir@
-nmstatedir = @nmstatedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-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@
-EXTRA_DIST = \
-	check-exports.sh \
-	debug-helper.py \
-	run-test-valgrind.sh \
-	run-test-dbus-session.sh \
-	test-networkmanager-service.py \
-	test-sudo-wrapper.sh \
-	enums-to-docbook.pl
-
-all: all-am
-
-.SUFFIXES:
-$(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 tools/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu tools/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):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-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
-check: check-am
-all-am: Makefile
-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 mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-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 -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	cscopelist-am ctags-am distclean distclean-generic \
-	distclean-libtool 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# 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/tools/create-exports-NetworkManager.sh b/tools/create-exports-NetworkManager.sh
new file mode 100755
index 00000000..3a4619a4
--- /dev/null
+++ b/tools/create-exports-NetworkManager.sh
@@ -0,0 +1,117 @@
+#!/bin/bash
+
+set -e
+
+die() {
+    echo "$@"
+    exit 1
+}
+
+# generates the linker version script src/NetworkManager.ver
+# by looking at the symbols needed by the device and settings
+# plugins. Note that this depends on how NetworkManager and
+# the plugins are build. For example, compiling without
+# --with-more-asserts will yield less symbols.
+#
+# _build re-builds NetworkManager with relevant compile time
+# options to yield the most symbols.
+_build() {
+    git clean -fdx
+    ./autogen.sh --enable-ld-gc --enable-ifcfg-rh --enable-ifupdown \
+        --enable-ifnet --enable-ibft --enable-teamdctl --enable-wifi \
+        --with-modem-manager-1 --with-ofono --with-more-asserts \
+        --with-more-logging
+    make -j20
+}
+
+_sort() {
+    LANG=C sort -u
+}
+
+call_nm() {
+    nm "$1" |
+        sed -n 's/.* \([^ ]\) \([^ ]*\)$/\1 \2/p'
+}
+
+get_symbols_nm () {
+    call_nm ./src/.libs/libNetworkManager.a |
+        sed -n 's/^[tTDRB] //p' |
+        _sort
+}
+
+get_symbols_explict() {
+    cat <<EOF | _sort
+_IO_stdin_used
+EOF
+}
+
+get_symbols_missing() {
+    (for f in ./src/settings/plugins/*/.libs/*.so \
+              ./src/devices/*/.libs/*.so \
+              ./src/ppp/.libs/libnm-ppp-plugin.so; do
+        call_nm "$f" |
+            sed -n 's/^\([U]\) \(\(nm_\|nmp_\|_nm\|NM\|_NM\).*\)$/\2/p'
+    done) |
+        _sort |
+        grep -Fx -f <(get_symbols_explict) -v |
+        grep -Fx -f <(get_symbols_nm)
+}
+
+pretty() {
+    sed 's/.*/\t\0;/'
+}
+
+do_build() {
+    do_update
+    make
+}
+
+do_rebuild() {
+    _build
+    do_build
+}
+
+do_update() {
+    do_generate > ./src/NetworkManager.ver
+}
+
+do_generate() {
+    cat <<EOF
+# this file is generated by $0
+{
+global:
+$(get_symbols_missing | pretty)
+
+$(get_symbols_explict | pretty)
+local:
+	*;
+};
+EOF
+}
+
+test -f ./src/.libs/libNetworkManager.a || die "must be called from NetworkManager \$(top_builddir) after building the tree"
+
+case "$1" in
+    rebuild)
+        do_rebuild
+        ;;
+    build)
+        do_build
+        ;;
+    '--called-from-make')
+        if test -z "${NM_BUILD_NO_CREATE_EXPORTS+x}"; then
+            do_update
+        else
+            if test -f "./src/NetworkManager.ver"; then
+                touch ./src/NetworkManager.ver
+            fi
+        fi
+        ;;
+    update)
+        do_update
+        ;;
+    *)
+        do_generate
+        ;;
+esac
+
diff --git a/tools/enums-to-docbook.pl b/tools/enums-to-docbook.pl
index d3d8c33c..845598ac 100755
--- a/tools/enums-to-docbook.pl
+++ b/tools/enums-to-docbook.pl
@@ -62,8 +62,11 @@ sub inc
 {
 	my $val = shift;
 
-	if ($val =~ /^\d+$/) {
+	if ($val =~ /^-?\d+$/) {
 		my $len = length $val;
+		if ($val =~ /^-/ && ($val + 1 == 0)) {
+			$len = $len - 1
+		}
 		return sprintf "%0${len}d", $val + 1;
 	} elsif ($val =~ /^0x(.+)$/) {
 		my $len = length $1;
@@ -117,7 +120,7 @@ if (/^\/\*\*$/) {
 	$choice = undef;
 } elsif (/^typedef enum/) {
 	# Start of an enum
-	$val = 0;
+	$val = -1;
 } elsif (/^\s+(\S+)\s+=\s+([^,\s]+)/) {
 	# A choice with a literal value
 	next unless @choices;
diff --git a/tools/run-nm-test.sh b/tools/run-nm-test.sh
new file mode 100755
index 00000000..7159ad8a
--- /dev/null
+++ b/tools/run-nm-test.sh
@@ -0,0 +1,260 @@
+#!/bin/bash
+
+die() {
+    echo "$@"
+    exit 5
+}
+
+_is_true() {
+    case "$1" in
+        y|Y|yes|YES|1|true|TRUE)
+            return 0
+            ;;
+        n|N|no|NO|0|false|FALSE)
+            return 1
+            ;;
+        *)
+            if test -n "$2"; then
+                _is_true "$2"
+                return $?
+            fi
+            return 2
+            ;;
+    esac
+}
+
+SCRIPT_PATH="${SCRIPT_PATH:-$(readlink -f "$(dirname "$0")")}"
+
+VALGRIND_ERROR=37
+
+if [ "$1" == "--called-from-make" ]; then
+    shift
+    CALLED_FROM_MAKE=1
+else
+    CALLED_FROM_MAKE=0
+fi
+
+if [ "$CALLED_FROM_MAKE" == 1 ]; then
+    NMTST_LIBTOOL=($1 --mode=execute); shift
+    NMTST_VALGRIND_ARG="$1"; shift
+    if [[ "$NMTST_VALGRIND_ARG" == no ]]; then
+        NMTST_VALGRIND_ARG=
+    fi
+
+    if [[ -z "${NMTST_VALGRIND}" ]]; then
+        # the valgrind path can be specified via $NMTST_VALGRIND.
+        # Otherwise, it can be determined by the configure scripts.
+        # Otherwise, it is found in the current $PATH (below).
+        if [[ "$NMTST_VALGRIND_ARG" != "" ]]; then
+            NMTST_VALGRIND="${NMTST_VALGRIND_ARG}"
+        fi
+    fi
+    if [[ -z "${NMTST_USE_VALGRIND+x}" ]]; then
+        # whether to use valgrind can be specified via $NMTST_USE_VALGRIND.
+        # Otherwise, it depends on the configure option.
+        if [ "$NMTST_VALGRIND_ARG" == "" ]; then
+            NMTST_USE_VALGRIND=0
+        else
+            NMTST_USE_VALGRIND=1
+        fi
+    fi
+
+    NMTST_SUPPRESSIONS_ARGS="$1"; shift
+    if [[ -z "${NMTST_SUPPRESSIONS+x}" ]]; then
+        if [[ "$NMTST_SUPPRESSIONS_ARGS" == "" ]]; then
+            NMTST_SUPPRESSIONS="$SCRIPT_PATH/../valgrind.suppressions"
+        else
+            NMTST_SUPPRESSIONS="${NMTST_SUPPRESSIONS_ARGS}"
+        fi
+    fi
+
+
+    if [ "$1" = "--launch-dbus" ]; then
+        NMTST_LAUNCH_DBUS=1
+        shift
+    elif [ "$1" = "--launch-dbus=auto" ]; then
+        NMTST_LAUNCH_DBUS=
+        shift
+    else
+        NMTST_LAUNCH_DBUS=0
+    fi
+    TEST="$1"; shift
+    NMTST_MAKE_FIRST=0
+
+else
+    if [[ -z "${NMTST_USE_VALGRIND+x}" ]]; then
+        # by default, disable valgrind checks.
+        NMTST_USE_VALGRIND=0
+    fi
+
+    if [ -n "${NMTST_LIBTOOL-:x}" ]; then
+        NMTST_LIBTOOL=(sh "$SCRIPT_PATH/../libtool" --mode=execute)
+    elif [ -n "${NMTST_LIBTOOL-x}" ]; then
+        NMTST_LIBTOOL=()
+    else
+        NMTST_LIBTOOL=($NMTST_LIBTOOL --mode=execute)
+    fi
+    for a in "$@"; do
+        case "$a" in
+        "--launch-dbus")
+            NMTST_LAUNCH_DBUS=1
+            shift
+            ;;
+        "--no-launch-dbus"|"-D")
+            NMTST_LAUNCH_DBUS=0
+            shift
+            ;;
+        "--no-libtool")
+            NMTST_LIBTOOL=()
+            shift
+            ;;
+        --make-first|-m)
+            NMTST_MAKE_FIRST=1
+            shift
+            ;;
+        "--valgrind"|-v)
+            NMTST_USE_VALGRIND=1
+            shift;
+            ;;
+        "--no-valgrind"|-V)
+            NMTST_USE_VALGRIND=0
+            shift;
+            ;;
+        "--")
+            shift
+            break
+            ;;
+        *)
+            break
+            ;;
+        esac
+    done
+    # we support calling the script directly. In this case,
+    # only pass the path to the test to run.
+    TEST="$1"; shift
+    if [[ -z "${NMTST_SUPPRESSIONS+x}" ]]; then
+        NMTST_SUPPRESSIONS="$SCRIPT_PATH/../valgrind.suppressions"
+    fi
+
+fi
+
+[ -x "$TEST" ] || die "Test \"$TEST\" does not exist"
+TEST_PATH="$(readlink -f "$(dirname "$TEST")")"
+TEST_NAME="${TEST##*/}"
+
+if [ -z "${NMTST_LAUNCH_DBUS}" ]; then
+    # autodetect whether to launch D-Bus based on the test path.
+    if [[ $TEST_PATH == */libnm/tests || $TEST_PATH == */libnm-glib/tests ]]; then
+        NMTST_LAUNCH_DBUS=1
+    else
+        NMTST_LAUNCH_DBUS=0
+    fi
+fi
+
+if _is_true "$NMTST_MAKE_FIRST" 0; then
+    git_dir="$(readlink -f "$(git rev-parse --show-toplevel)")"
+    rel_path="${TEST_PATH/#$(printf '%s/' "$git_dir")}/$TEST_NAME"
+    cd "$git_dir"
+    make -j5 "$rel_path" || die "make of $TEST failed ($git_dir / $rel_path)"
+    cd - 1>/dev/null
+fi
+
+# if the user wishes, change first into the directory of the test
+if _is_true "$NMTST_CHANGE_DIRECTORY" 0; then
+    cd "$TEST_PATH"
+    TEST="./$TEST_NAME"
+fi
+
+NMTST_DBUS_RUN_SESSION=()
+if _is_true "$NMTST_LAUNCH_DBUS"; then
+    if ! which dbus-run-session &>/dev/null ; then
+        eval `dbus-launch --sh-syntax`
+        trap "kill $DBUS_SESSION_BUS_PID" EXIT
+    else
+        NMTST_DBUS_RUN_SESSION=(dbus-run-session --)
+    fi
+fi
+
+[ -x "$TEST" ] || die "Cannot execute test \"$TEST\""
+
+
+if ! _is_true "$NMTST_USE_VALGRIND" 0; then
+    "${NMTST_DBUS_RUN_SESSION[@]}" \
+    "$TEST" "$@"
+    exit $?
+fi
+
+if [[ -z "${NMTST_VALGRIND}" ]]; then
+    NMTST_VALGRIND=`which valgrind` || die "cannot find valgrind binary. Set \$NMTST_VALGRIND"
+else
+    test -e "${NMTST_VALGRIND}" || die "cannot find valgrind binary from NMTST_VALGRIND=\"${NMTST_VALGRIND}\""
+fi
+
+if [[ "${NMTST_SUPPRESSIONS}" != "" ]]; then
+    NMTST_SUPPRESSIONS=("--suppressions=$NMTST_SUPPRESSIONS")
+else
+    NMTST_SUPPRESSIONS=()
+fi
+
+LOGFILE="${TEST}.valgrind-log"
+
+export G_SLICE=always-malloc
+export G_DEBUG=gc-friendly
+"${NMTST_DBUS_RUN_SESSION[@]}" \
+"${NMTST_LIBTOOL[@]}" \
+"$NMTST_VALGRIND" \
+    --quiet \
+    --error-exitcode=$VALGRIND_ERROR \
+    --leak-check=full \
+    --gen-suppressions=all \
+    "${NMTST_SUPPRESSIONS[@]}" \
+    --num-callers=100 \
+    --log-file="$LOGFILE" \
+    "$TEST" \
+    "$@"
+RESULT=$?
+
+test -s "$LOGFILE"
+HAS_ERRORS=$?
+
+if [ $RESULT -ne 0 -a $RESULT -ne 77 ]; then
+    if [ $HAS_ERRORS -ne 0 ]; then
+        rm -f "$LOGFILE"
+    elif [ $RESULT -ne $VALGRIND_ERROR ]; then
+        # the test (probably) didn't fail due to valgrind.
+        echo "The test failed. Also check the valgrind log at '`realpath "$LOGFILE"`'" >&2
+    else
+        echo "valgrind failed! Check the log at '`realpath "$LOGFILE"`'" >&2
+        UNRESOLVED=$(awk -F: '/obj:\// {print $NF}' "$LOGFILE" | sort | uniq)
+        if [ -n "$UNRESOLVED" ]; then
+            echo Some addresses could not be resolved into symbols. >&2
+            echo The errors might get suppressed when you install the debuging symbols. >&2
+            if [ -x /usr/bin/dnf ]; then
+                echo Hint: dnf debuginfo-install $UNRESOLVED >&2
+            elif [ -x /usr/bin/debuginfo-install ]; then
+                echo Hint: debuginfo-install $UNRESOLVED >&2
+            else
+                echo Files without debugging symbols: $UNRESOLVED >&2
+            fi
+        fi
+    fi
+    exit $RESULT
+fi
+
+if [ $HAS_ERRORS -eq 0 ]; then
+    # valgrind doesn't support setns syscall and spams the logfile.
+    # hack around it...
+    if [ "$TEST_NAME" = 'test-link-linux' -a -z "$(sed -e '/^--[0-9]\+-- WARNING: unhandled .* syscall: /,/^--[0-9]\+-- it at http.*\.$/d' "$LOGFILE")" ]; then
+        HAS_ERRORS=1
+    fi
+fi
+
+if [ $HAS_ERRORS -eq 0 ]; then
+    # shouldn't actually happen...
+    echo "valgrind succeeded, but log is not empty: '`realpath "$LOGFILE"`'" >&2
+    exit 1
+fi
+
+rm -f "$LOGFILE"
+
+exit $RESULT
diff --git a/tools/run-test-dbus-session.sh b/tools/run-test-dbus-session.sh
deleted file mode 100755
index c6a94fa6..00000000
--- a/tools/run-test-dbus-session.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-if ! which dbus-run-session >/dev/null 2>&1; then
-    eval `dbus-launch --sh-syntax`
-    trap "kill $DBUS_SESSION_BUS_PID" EXIT
-    "$@"
-    exit $?
-fi
-
-dbus-run-session -- "$@"
diff --git a/tools/run-test-valgrind.sh b/tools/run-test-valgrind.sh
deleted file mode 100755
index 634ca2c4..00000000
--- a/tools/run-test-valgrind.sh
+++ /dev/null
@@ -1,159 +0,0 @@
-#!/bin/bash
-
-die() {
-    echo "$@"
-    exit 5
-}
-
-SCRIPT_PATH="${SCRIPT_PATH:-$(readlink -f "$(dirname "$0")")}"
-
-VALGRIND_ERROR=37
-if [ "$1" == "--called-from-make" ]; then
-    shift
-    NMTST_LIBTOOL=($1 --mode=execute); shift
-    NMTST_VALGRIND="$1"; shift
-    SUPPRESSIONS="$1"; shift
-    if [ "$1" = "--launch-dbus" ]; then
-        NMTST_LAUNCH_DBUS=yes
-        shift
-    else
-        NMTST_LAUNCH_DBUS=no
-    fi
-    TEST="$1"; shift
-else
-    if [ -n "${NMTST_LIBTOOL-:x}" ]; then
-        NMTST_LIBTOOL=(sh "$SCRIPT_PATH/../libtool" --mode=execute)
-    elif [ -n "${NMTST_LIBTOOL-x}" ]; then
-        NMTST_LIBTOOL=()
-    else
-        NMTST_LIBTOOL=($NMTST_LIBTOOL --mode=execute)
-    fi
-    for a in "$@"; do
-        case "$a" in
-        "--launch-dbus")
-            NMTST_LAUNCH_DBUS=yes
-            shift
-            ;;
-        "--no-launch-dbus"|"-D")
-            NMTST_LAUNCH_DBUS=no
-            shift
-            ;;
-        "--no-libtool")
-            NMTST_LIBTOOL=()
-            shift
-            ;;
-        "--")
-            shift
-            break
-            ;;
-        *)
-            break
-            ;;
-        esac
-    done
-    # we support calling the script directly. In this case,
-    # only pass the path to the test to run.
-    TEST="$1"; shift
-    NMTST_VALGRIND="${NMTST_VALGRIND:-valgrind}"
-    if [ "$SUPPRESSIONS" == "" ]; then
-        SUPPRESSIONS="$SCRIPT_PATH/../valgrind.suppressions"
-    fi
-
-    [ -x "$TEST" ] || die "Test \"$TEST\" does not exist"
-
-    TEST_PATH="$(readlink -f "$(dirname "$TEST")")"
-
-    if [ -n "${NMTST_LAUNCH_DBUS-x}" ]; then
-        # autodetect whether to launch D-Bus based on the test path.
-        if [[ $TEST_PATH == */libnm/tests || $TEST_PATH == */libnm-glib/tests ]]; then
-            NMTST_LAUNCH_DBUS=yes
-        else
-            NMTST_LAUNCH_DBUS=no
-        fi
-    fi
-
-    # some tests require you to cd into the base directory.
-    # do that.
-    if [ "$NMTST_VALGRIND_NO_CD" == "" ]; then
-        cd "$TEST_PATH"
-        TEST="./$(basename "$TEST")"
-    fi
-fi
-
-NMTST_DBUS_RUN_SESSION=()
-if [ "$NMTST_LAUNCH_DBUS" == "yes" ]; then
-    if ! which dbus-run-session &>/dev/null ; then
-        eval `dbus-launch --sh-syntax`
-        trap "kill $DBUS_SESSION_BUS_PID" EXIT
-    else
-        NMTST_DBUS_RUN_SESSION=(dbus-run-session --)
-    fi
-fi
-
-if [ "$NMTST_NO_VALGRIND" != "" ]; then
-	"${NMTST_DBUS_RUN_SESSION[@]}" \
-	"$TEST" "$@"
-	exit $?
-fi
-
-LOGFILE="${TEST}.valgrind-log"
-
-export G_SLICE=always-malloc
-export G_DEBUG=gc-friendly
-"${NMTST_DBUS_RUN_SESSION[@]}" \
-"${NMTST_LIBTOOL[@]}" "$NMTST_VALGRIND" \
-	--quiet \
-	--error-exitcode=$VALGRIND_ERROR \
-	--leak-check=full \
-	--gen-suppressions=all \
-	--suppressions="$SUPPRESSIONS" \
-	--num-callers=100 \
-	--log-file="$LOGFILE" \
-	"$TEST" \
-	"$@"
-RESULT=$?
-
-test -s "$LOGFILE"
-HAS_ERRORS=$?
-
-if [ $RESULT -ne 0 -a $RESULT -ne 77 ]; then
-	if [ $HAS_ERRORS -ne 0 ]; then
-		rm -f "$LOGFILE"
-	elif [ $RESULT -ne $VALGRIND_ERROR ]; then
-		# the test (probably) didn't fail due to valgrind.
-		echo "The test failed. Also check the valgrind log at '`realpath "$LOGFILE"`'" >&2
-	else
-		echo "valgrind failed! Check the log at '`realpath "$LOGFILE"`'" >&2
-		UNRESOLVED=$(awk -F: '/obj:\// {print $NF}' "$LOGFILE" | sort | uniq)
-		if [ -n "$UNRESOLVED" ]; then
-			echo Some addresses could not be resolved into symbols. >&2
-			echo The errors might get suppressed when you install the debuging symbols. >&2
-			if [ -x /usr/bin/dnf ]; then
-				echo Hint: dnf debuginfo-install $UNRESOLVED >&2
-			elif [ -x /usr/bin/debuginfo-install ]; then
-				echo Hint: debuginfo-install $UNRESOLVED >&2
-			else
-				echo Files without debugging symbols: $UNRESOLVED >&2
-			fi
-		fi
-	fi
-	exit $RESULT
-fi
-
-if [ $HAS_ERRORS -eq 0 ]; then
-	# valgrind doesn't support setns syscall and spams the logfile.
-	# hack around it...
-	if [ "$(basename "$TEST")" = 'test-link-linux' -a -z "$(sed -e '/^--[0-9]\+-- WARNING: unhandled .* syscall: /,/^--[0-9]\+-- it at http.*\.$/d' "$LOGFILE")" ]; then
-		HAS_ERRORS=1
-	fi
-fi
-
-if [ $HAS_ERRORS -eq 0 ]; then
-	# shouldn't actually happen...
-	echo "valgrind succeeded, but log is not empty: '`realpath "$LOGFILE"`'" >&2
-	exit 1
-fi
-
-rm -f "$LOGFILE"
-
-exit $RESULT
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py
index 3a32d91d..68097778 100755
--- a/tools/test-networkmanager-service.py
+++ b/tools/test-networkmanager-service.py
@@ -92,9 +92,15 @@ class ExportedObj(dbus.service.Object):
         dbus.service.Object.__init__(self, bus, object_path)
         self._bus = bus
         self.path = object_path
-        self.__dbus_ifaces = {}
+        self.__ensure_dbus_ifaces()
+        object_manager.add_object(self)
+
+    def __ensure_dbus_ifaces(self):
+        if not hasattr(self, '_ExportedObj__dbus_ifaces'):
+            self.__dbus_ifaces = {}
 
     def add_dbus_interface(self, dbus_iface, get_props_func, prop_changed_func):
+        self.__ensure_dbus_ifaces()
         self.__dbus_ifaces[dbus_iface] = ExportedObj.DBusInterface(dbus_iface, get_props_func, prop_changed_func)
 
     def __dbus_interface_get(self, dbus_iface):
@@ -113,6 +119,11 @@ class ExportedObj(dbus.service.Object):
     def _dbus_property_notify(self, dbus_iface, propname):
         prop = self._dbus_property_get(dbus_iface, propname)
         self.__dbus_interface_get(dbus_iface).prop_changed_func(self, { propname: prop })
+        ExportedObj.PropertiesChanged(self, dbus_iface, { propname: prop }, [])
+
+    @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as')
+    def PropertiesChanged(self, iface, changed, invalidated):
+        pass
 
     @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}')
     def GetAll(self, dbus_iface):
@@ -122,6 +133,16 @@ class ExportedObj(dbus.service.Object):
     def Get(self, dbus_iface, name):
         return self._dbus_property_get(dbus_iface, name)
 
+    def get_managed_ifaces(self):
+        my_ifaces = {}
+        for iface in self.__dbus_ifaces:
+            my_ifaces[iface] = self.__dbus_ifaces[iface].get_props_func()
+        return self.path, my_ifaces
+
+    def remove_from_connection(self):
+        object_manager.remove_object(self)
+        dbus.service.Object.remove_from_connection(self)
+
 ###################################################################
 IFACE_DEVICE = 'org.freedesktop.NetworkManager.Device'
 
@@ -148,8 +169,6 @@ class Device(ExportedObj):
     def __init__(self, bus, iface, devtype):
         object_path = "/org/freedesktop/NetworkManager/Devices/%d" % Device.counter
         Device.counter = Device.counter + 1
-        ExportedObj.__init__(self, bus, object_path)
-        self.add_dbus_interface(IFACE_DEVICE, self.__get_props, Device.PropertiesChanged)
 
         self.iface = iface
         self.udi = "/sys/devices/virtual/%s" % iface
@@ -162,6 +181,9 @@ class Device(ExportedObj):
         self.dhcp6_config = None
         self.available_connections = []
 
+        self.add_dbus_interface(IFACE_DEVICE, self.__get_props, Device.PropertiesChanged)
+        ExportedObj.__init__(self, bus, object_path)
+
     # Properties interface
     def __get_props(self):
         props = {}
@@ -221,8 +243,6 @@ PE_S390_SUBCHANNELS = "S390Subchannels"
 
 class WiredDevice(Device):
     def __init__(self, bus, iface, mac, subchannels):
-        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_ETHERNET)
-        self.add_dbus_interface(IFACE_WIRED, self.__get_props, WiredDevice.PropertiesChanged)
 
         if mac is None:
             self.mac = random_mac()
@@ -231,6 +251,9 @@ class WiredDevice(Device):
         self.carrier = False
         self.s390_subchannels = subchannels
 
+        self.add_dbus_interface(IFACE_WIRED, self.__get_props, WiredDevice.PropertiesChanged)
+        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_ETHERNET)
+
     # Properties interface
     def __get_props(self):
         props = {}
@@ -257,19 +280,19 @@ PV_VLAN_ID = "VlanId"
 
 class VlanDevice(Device):
     def __init__(self, bus, iface):
-        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_VLAN)
-        self.add_dbus_interface(IFACE_VLAN, self.__get_props, VlanDevice.PropertiesChanged)
-
         self.mac = random_mac()
         self.carrier = False
         self.vlan_id = 1
 
+        self.add_dbus_interface(IFACE_VLAN, self.__get_props, VlanDevice.PropertiesChanged)
+        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_VLAN)
+
     # Properties interface
     def __get_props(self):
         props = {}
         props[PV_HW_ADDRESS] = self.mac
         props[PV_CARRIER] = self.carrier
-        props[PV_VLAN_ID] = self.vlan_id
+        props[PV_VLAN_ID] = dbus.UInt32(self.vlan_id)
         return props
 
     @dbus.service.signal(IFACE_VLAN, signature='a{sv}')
@@ -295,8 +318,6 @@ class WifiAp(ExportedObj):
     def __init__(self, bus, ssid, mac, flags, wpaf, rsnf, freq):
         path = "/org/freedesktop/NetworkManager/AccessPoint/%d" % WifiAp.counter
         WifiAp.counter = WifiAp.counter + 1
-        ExportedObj.__init__(self, bus, path)
-        self.add_dbus_interface(IFACE_WIFI_AP, self.__get_props, WifiAp.PropertiesChanged)
 
         self.ssid = ssid
         if mac:
@@ -310,6 +331,9 @@ class WifiAp(ExportedObj):
         self.strength = random.randint(0, 100)
         self.strength_id = GLib.timeout_add_seconds(10, self.strength_cb, None)
 
+        self.add_dbus_interface(IFACE_WIFI_AP, self.__get_props, WifiAp.PropertiesChanged)
+        ExportedObj.__init__(self, bus, path)
+
     def __del__(self):
         if self.strength_id > 0:
             GLib.source_remove(self.strength_id)
@@ -357,13 +381,13 @@ PW_WIRELESS_CAPABILITIES = "WirelessCapabilities"
 
 class WifiDevice(Device):
     def __init__(self, bus, iface):
-        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIFI)
-        self.add_dbus_interface(IFACE_WIFI, self.__get_props, WifiDevice.PropertiesChanged)
-
         self.mac = random_mac()
         self.aps = []
         self.active_ap = None
 
+        self.add_dbus_interface(IFACE_WIFI, self.__get_props, WifiDevice.PropertiesChanged)
+        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIFI)
+
     # methods
     @dbus.service.method(dbus_interface=IFACE_WIFI, in_signature='', out_signature='ao')
     def GetAccessPoints(self):
@@ -443,13 +467,14 @@ class WimaxNsp(ExportedObj):
     def __init__(self, bus, name):
         path = "/org/freedesktop/NetworkManager/Nsp/%d" % WimaxNsp.counter
         WimaxNsp.counter = WimaxNsp.counter + 1
-        ExportedObj.__init__(self, bus, path)
-        self.add_dbus_interface(IFACE_WIMAX_NSP, self.__get_props, WimaxNsp.PropertiesChanged)
 
         self.name = name
         self.strength = random.randint(0, 100)
         self.strength_id = GLib.timeout_add_seconds(10, self.strength_cb, None)
 
+        self.add_dbus_interface(IFACE_WIMAX_NSP, self.__get_props, WimaxNsp.PropertiesChanged)
+        ExportedObj.__init__(self, bus, path)
+
     def __del__(self):
         if self.strength_id > 0:
             GLib.source_remove(self.strength_id)
@@ -492,14 +517,14 @@ PX_ACTIVE_NSP = "ActiveNsp"
 
 class WimaxDevice(Device):
     def __init__(self, bus, iface):
-        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIMAX)
-        self.add_dbus_interface(IFACE_WIMAX, self.__get_props, WimaxDevice.PropertiesChanged)
-
         self.mac = random_mac()
         self.bsid = random_mac()
         self.nsps = []
         self.active_nsp = None
 
+        self.add_dbus_interface(IFACE_WIMAX, self.__get_props, WimaxDevice.PropertiesChanged)
+        Device.__init__(self, bus, iface, NM_DEVICE_TYPE_WIMAX)
+
     # methods
     @dbus.service.method(dbus_interface=IFACE_WIMAX, in_signature='', out_signature='ao')
     def GetNspList(self):
@@ -582,8 +607,6 @@ class ActiveConnection(ExportedObj):
     def __init__(self, bus, device, connection, specific_object):
         object_path = "/org/freedesktop/NetworkManager/ActiveConnection/%d" % ActiveConnection.counter
         ActiveConnection.counter = ActiveConnection.counter + 1
-        ExportedObj.__init__(self, bus, object_path)
-        self.add_dbus_interface(IFACE_ACTIVE_CONNECTION, self.__get_props, ActiveConnection.PropertiesChanged)
 
         self.device = device
         self.conn = connection
@@ -598,6 +621,9 @@ class ActiveConnection(ExportedObj):
         self.vpn = False
         self.master = None
 
+        self.add_dbus_interface(IFACE_ACTIVE_CONNECTION, self.__get_props, ActiveConnection.PropertiesChanged)
+        ExportedObj.__init__(self, bus, object_path)
+
     # Properties interface
     def __get_props(self):
         props = {}
@@ -659,9 +685,6 @@ def set_device_ac_cb(device, ac):
 
 class NetworkManager(ExportedObj):
     def __init__(self, bus, object_path):
-        ExportedObj.__init__(self, bus, object_path)
-        self.add_dbus_interface(IFACE_NM, self.__get_props, NetworkManager.PropertiesChanged)
-
         self._bus = bus;
         self.devices = []
         self.active_connections = []
@@ -670,6 +693,9 @@ class NetworkManager(ExportedObj):
         self.state = NM_STATE_DISCONNECTED
         self.connectivity = 1
 
+        self.add_dbus_interface(IFACE_NM, self.__get_props, NetworkManager.PropertiesChanged)
+        ExportedObj.__init__(self, bus, object_path)
+
     @dbus.service.signal(IFACE_NM, signature='u')
     def StateChanged(self, new_state):
         pass
@@ -736,6 +762,7 @@ class NetworkManager(ExportedObj):
 
         if s_con['id'] == 'object-creation-failed-test':
             self.active_connections.remove(ac)
+            self.__notify(PM_ACTIVE_CONNECTIONS)
             ac.remove_from_connection()
         else:
             GLib.timeout_add(50, set_device_ac_cb, device, ac)
@@ -930,6 +957,11 @@ class NetworkManager(ExportedObj):
     def UpdateConnection(self, path, connection, verify_connection):
         return settings.update_connection(connection, path, verify_connection)
 
+    @dbus.service.method(dbus_interface=IFACE_TEST, in_signature='', out_signature='')
+    def Restart(self):
+        bus.release_name("org.freedesktop.NetworkManager")
+        bus.request_name("org.freedesktop.NetworkManager")
+
 
 ###################################################################
 IFACE_CONNECTION = 'org.freedesktop.NetworkManager.Settings.Connection'
@@ -946,7 +978,7 @@ class InvalidSettingException(dbus.DBusException):
 class MissingSettingException(dbus.DBusException):
     _dbus_error_name = IFACE_CONNECTION + '.MissingSetting'
 
-class Connection(dbus.service.Object):
+class Connection(ExportedObj):
     def __init__(self, bus, object_path, settings, remove_func, verify_connection=True):
 
         if self.get_uuid(settings) is None:
@@ -955,8 +987,6 @@ class Connection(dbus.service.Object):
             settings['connection']['uuid'] = uuid.uuid4()
         self.verify(settings, verify_strict=verify_connection)
 
-        dbus.service.Object.__init__(self, bus, object_path)
-
         self.path = object_path
         self.settings = settings
         self.remove_func = remove_func
@@ -964,6 +994,9 @@ class Connection(dbus.service.Object):
         self.props = {}
         self.props['Unsaved'] = False
 
+        self.add_dbus_interface(IFACE_CONNECTION, self.__get_props, None)
+        ExportedObj.__init__(self, bus, object_path)
+
     def get_uuid(self, settings=None):
         if settings is None:
             settings = self.settings
@@ -1003,20 +1036,11 @@ class Connection(dbus.service.Object):
         self.settings = settings;
         self.Updated()
 
-    # Properties interface
-    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}')
-    def GetAll(self, iface):
-        if iface != IFACE_CONNECTION:
-            raise UnknownInterfaceException()
+    def __get_props(self):
         return self.props
 
-    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v')
-    def Get(self, iface, name):
-        if iface != IFACE_CONNECTION:
-            raise UnknownInterfaceException()
-        if not name in self.props.keys():
-            raise UnknownPropertyException()
-        return self.props[name]
+    def __notify(self, propname):
+        self._dbus_property_notify(IFACE_CONNECTION, propname)
 
     # Connection methods
     @dbus.service.method(dbus_interface=IFACE_CONNECTION, in_signature='', out_signature='a{sa{sv}}')
@@ -1054,9 +1078,8 @@ IFACE_SETTINGS = 'org.freedesktop.NetworkManager.Settings'
 class InvalidHostnameException(dbus.DBusException):
     _dbus_error_name = IFACE_SETTINGS + '.InvalidHostname'
 
-class Settings(dbus.service.Object):
+class Settings(ExportedObj):
     def __init__(self, bus, object_path):
-        dbus.service.Object.__init__(self, bus, object_path)
         self.connections = {}
         self.bus = bus
         self.counter = 1
@@ -1066,6 +1089,9 @@ class Settings(dbus.service.Object):
         self.props['CanModify'] = True
         self.props['Connections'] = dbus.Array([], 'o')
 
+        self.add_dbus_interface(IFACE_SETTINGS, self.__get_props, Settings.PropertiesChanged)
+        ExportedObj.__init__(self, bus, object_path)
+
     def auto_remove_next_connection(self):
         self.remove_next_connection = True;
 
@@ -1092,7 +1118,7 @@ class Settings(dbus.service.Object):
         self.connections[path] = con
         self.props['Connections'] = dbus.Array(self.connections.keys(), 'o')
         self.NewConnection(path)
-        self.PropertiesChanged({ 'connections': self.props['Connections'] })
+        self.__notify('Connections')
 
         if self.remove_next_connection:
             self.remove_next_connection = False
@@ -1111,7 +1137,7 @@ class Settings(dbus.service.Object):
     def delete_connection(self, connection):
         del self.connections[connection.path]
         self.props['Connections'] = dbus.Array(self.connections.keys(), 'o')
-        self.PropertiesChanged({ 'connections': self.props['Connections'] })
+        self.__notify('Connections')
 
     @dbus.service.method(dbus_interface=IFACE_SETTINGS, in_signature='s', out_signature='')
     def SaveHostname(self, hostname):
@@ -1119,21 +1145,13 @@ class Settings(dbus.service.Object):
         if hostname.find('.') == -1:
             raise InvalidHostnameException()
         self.props['Hostname'] = hostname
-        self.PropertiesChanged({ 'hostname': hostname })
+        self.__notify('Hostname')
 
-    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}')
-    def GetAll(self, iface):
-        if iface != IFACE_SETTINGS:
-            raise UnknownInterfaceException()
+    def __get_props(self):
         return self.props
 
-    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v')
-    def Get(self, iface, name):
-        if iface != IFACE_SETTINGS:
-            raise UnknownInterfaceException()
-        if not name in self.props.keys():
-            raise UnknownPropertyException()
-        return self.props[name]
+    def __notify(self, propname):
+        self._dbus_property_notify(IFACE_SETTINGS, propname)
 
     @dbus.service.signal(IFACE_SETTINGS, signature='o')
     def NewConnection(self, path):
@@ -1207,7 +1225,80 @@ class AgentManager(dbus.service.Object):
         return secrets
 
 ###################################################################
+IFACE_OBJECT_MANAGER = 'org.freedesktop.DBus.ObjectManager'
+
+PATH_OBJECT_MANAGER = '/org/freedesktop'
+
+class ObjectManager(dbus.service.Object):
+    def __init__(self, bus, object_path):
+        dbus.service.Object.__init__(self, bus, object_path)
+        self.objs = []
+        self.bus = bus
 
+    @dbus.service.method(dbus_interface=IFACE_OBJECT_MANAGER,
+                         in_signature='', out_signature='a{oa{sa{sv}}}',
+                         sender_keyword='sender')
+    def GetManagedObjects(self, sender=None):
+        managed_objects = {}
+        for obj in self.objs:
+            name, ifaces = obj.get_managed_ifaces()
+            managed_objects[name] = ifaces
+        return managed_objects
+
+    def add_object(self, obj):
+        self.objs.append(obj)
+        name, ifaces = obj.get_managed_ifaces()
+        self.InterfacesAdded(name, ifaces)
+
+    def remove_object(self, obj):
+        self.objs.remove(obj)
+        name, ifaces = obj.get_managed_ifaces()
+        self.InterfacesRemoved(name, ifaces.keys())
+
+    @dbus.service.signal(IFACE_OBJECT_MANAGER, signature='oa{sa{sv}}')
+    def InterfacesAdded(self, name, ifaces):
+        pass
+
+    @dbus.service.signal(IFACE_OBJECT_MANAGER, signature='oas')
+    def InterfacesRemoved(self, name, ifaces):
+        pass
+
+###################################################################
+IFACE_DNS_MANAGER = 'org.freedesktop.NetworkManager.DnsManager'
+
+class DnsManager(ExportedObj):
+    def __init__(self, bus, object_path):
+        self.props = {}
+        self.props['Mode'] = "dnsmasq"
+        self.props['RcManager'] = "symlink"
+        self.props['Configuration'] = dbus.Array([
+            dbus.Dictionary(
+                { 'nameservers' : dbus.Array(['1.2.3.4', '5.6.7.8'], 's'),
+                  'priority'    : dbus.Int32(100) },
+                'sv') ],
+            'a{sv}')
+
+        self.add_dbus_interface(IFACE_DNS_MANAGER, self.__get_props, None)
+        ExportedObj.__init__(self, bus, object_path)
+
+    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}')
+    def GetAll(self, iface):
+        if iface != IFACE_DNS_MANAGER:
+            raise UnknownInterfaceException()
+        return self.props
+
+    @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v')
+    def Get(self, iface, name):
+        if iface != IFACE_DNS_MANAGER:
+            raise UnknownInterfaceException()
+        if not name in self.props.keys():
+            raise UnknownPropertyException()
+        return self.props[name]
+
+    def __get_props(self):
+        return self.props
+
+###################################################################
 def stdin_cb(io, condition):
     mainloop.quit()
 
@@ -1219,12 +1310,14 @@ def main():
 
     random.seed()
 
-    bus = dbus.SessionBus()
+    global manager, settings, agent_manager, dns_manager, object_manager, bus
 
-    global manager, settings, agent_manager
+    bus = dbus.SessionBus()
+    object_manager = ObjectManager(bus, "/org/freedesktop")
     manager = NetworkManager(bus, "/org/freedesktop/NetworkManager")
     settings = Settings(bus, "/org/freedesktop/NetworkManager/Settings")
     agent_manager = AgentManager(bus, "/org/freedesktop/NetworkManager/AgentManager")
+    dns_manager = DnsManager(bus, "/org/freedesktop/NetworkManager/DnsManager")
 
     if not bus.request_name("org.freedesktop.NetworkManager"):
         sys.exit(1)