diff --git a/.dconf.metadata b/.dconf.metadata
index 1b9b98a..0fda437 100644
--- a/.dconf.metadata
+++ b/.dconf.metadata
@@ -1 +1 @@
-d4ab94969864c3e00515d0c0ee5b8090a7e0f896 SOURCES/dconf-0.26.0.tar.xz
+e6b10da51df002a1661ce938941770c549cd5b87 SOURCES/dconf-0.28.0.tar.xz
diff --git a/.gitignore b/.gitignore
index 46ea2cd..7125557 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/dconf-0.26.0.tar.xz
+SOURCES/dconf-0.28.0.tar.xz
diff --git a/SOURCES/dconf-0.26.0-Remove-libdbus-1-support.patch b/SOURCES/dconf-0.26.0-Remove-libdbus-1-support.patch
deleted file mode 100644
index 651197c..0000000
--- a/SOURCES/dconf-0.26.0-Remove-libdbus-1-support.patch
+++ /dev/null
@@ -1,815 +0,0 @@
-From 1fb178fddf7adb041806078b20b00c89cb8a4cd1 Mon Sep 17 00:00:00 2001
-From: Allison Ryan Lortie <desrt@desrt.ca>
-Date: Wed, 16 Dec 2015 14:54:31 +0000
-Subject: [PATCH 35/47] Remove libdbus-1 support
-
-Stop building the dconf-dbus-1 client library.  Nobody is using it
-anymore and we will soon be taking a non-conditional dependency on
-libgio in any case.
-
-It is now only possible to use dconf with GDBus.
----
- Makefile.am               |   2 +-
- configure.ac              |   3 -
- dbus-1/.gitignore         |   6 -
- dbus-1/Makefile.am        |  47 ------
- dbus-1/dconf-dbus-1.c     | 188 ------------------------
- dbus-1/dconf-dbus-1.h     |  56 -------
- dbus-1/dconf-dbus-1.pc.in |  11 --
- dbus-1/dconf-libdbus-1.c  | 365 ----------------------------------------------
- dbus-1/dconf-libdbus-1.h  |  11 --
- tests/Makefile.am         |   8 -
- 10 files changed, 1 insertion(+), 696 deletions(-)
- delete mode 100644 dbus-1/.gitignore
- delete mode 100644 dbus-1/Makefile.am
- delete mode 100644 dbus-1/dconf-dbus-1.c
- delete mode 100644 dbus-1/dconf-dbus-1.h
- delete mode 100644 dbus-1/dconf-dbus-1.pc.in
- delete mode 100644 dbus-1/dconf-libdbus-1.c
- delete mode 100644 dbus-1/dconf-libdbus-1.h
-
-diff --git a/Makefile.am b/Makefile.am
-index 83cd492..dd3571a 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -2,7 +2,7 @@ include Makefile.gtester
- 
- ACLOCAL_AMFLAGS = -I m4
- 
--SUBDIRS = shm gvdb common engine service gdbus gsettings dbus-1 client bin docs tests
-+SUBDIRS = shm gvdb common engine service gdbus gsettings client bin docs tests
- 
- DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
- EXTRA_DIST = trim-lcov.py m4
-diff --git a/configure.ac b/configure.ac
-index 21b57cb..95ca9d9 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -47,7 +47,6 @@ GTK_DOC_CHECK([1.15])
- # Dependencies
- PKG_CHECK_MODULES(glib, glib-2.0 >= 2.44.0)
- PKG_CHECK_MODULES(gio, gio-unix-2.0)
--PKG_CHECK_MODULES(dbus, dbus-1)
- 
- AC_ARG_WITH(gio_modules_dir, [  --with-gio-modules-dir=PATH choose directory for the GIO module, [default=LIBDIR/gio/modules]], giomodulesdir="$withval", giomodulesdir=${libdir}/gio/modules)
- AC_SUBST(giomodulesdir)
-@@ -83,11 +82,9 @@ AC_CONFIG_FILES([
-   engine/Makefile
-   gdbus/Makefile
-   gsettings/Makefile
--  dbus-1/dconf-dbus-1.pc
-   client/dconf.pc
-   client/Makefile
-   service/Makefile
--  dbus-1/Makefile
-   bin/Makefile
-   tests/Makefile
-   docs/Makefile
-diff --git a/dbus-1/.gitignore b/dbus-1/.gitignore
-deleted file mode 100644
-index 36fad9e..0000000
---- a/dbus-1/.gitignore
-+++ /dev/null
-@@ -1,6 +0,0 @@
--libdconf-libdbus-1.a
--libdconf-libdbus-1-shared.a
--libdconf-dbus-1.so
--libdconf-dbus-1.so.0
--libdconf-dbus-1.so.0.0.0
--dconf-dbus-1.pc
-diff --git a/dbus-1/Makefile.am b/dbus-1/Makefile.am
-deleted file mode 100644
-index 4e60d01..0000000
---- a/dbus-1/Makefile.am
-+++ /dev/null
-@@ -1,47 +0,0 @@
--include $(top_srcdir)/Makefile.gtester
--
--noinst_LIBRARIES = libdconf-libdbus-1.a libdconf-libdbus-1-shared.a
--
--libdconf_libdbus_1_a_CFLAGS = $(dbus_CFLAGS) $(glib_CFLAGS) -DG_LOG_DOMAIN=\"dconf\"
--libdconf_libdbus_1_a_SOURCES = \
--	dconf-libdbus-1.h		\
--	dconf-libdbus-1.c
--
--libdconf_libdbus_1_shared_a_CFLAGS = $(libdconf_libdbus_1_a_CFLAGS) -fPIC -DPIC
--libdconf_libdbus_1_shared_a_SOURCES = $(libdconf_libdbus_1_a_SOURCES)
--
--dconf_dbus_1includedir = $(includedir)/dconf-dbus-1
--dconf_dbus_1include_HEADERS = dconf-dbus-1.h
--
--pkgconfigdir = $(libdir)/pkgconfig
--pkgconfig_DATA = dconf-dbus-1.pc
--
--shlibdir = $(libdir)
--shlib_PROGRAMS = libdconf-dbus-1.so.0.0.0
--
--libdconf_dbus_1_so_0_0_0_CFLAGS = $(dbus_CFLAGS) $(gio_CFLAGS) -fPIC -DPIC
--libdconf_dbus_1_so_0_0_0_LDADD = \
--	../engine/libdconf-engine-shared.a		\
--	../common/libdconf-common-hidden.a		\
--	./libdconf-libdbus-1-shared.a			\
--	../gvdb/libgvdb-shared.a			\
--	../shm/libdconf-shm-shared.a			\
--	 $(dbus_LIBS)					\
--	$(glib_LIBS)
--libdconf_dbus_1_so_0_0_0_LDFLAGS = -shared -Wl,-soname=libdconf-dbus-1.so.0
--libdconf_dbus_1_so_0_0_0_SOURCES = dconf-dbus-1.c
--
--nodist_noinst_DATA = libdconf-dbus-1.so libdconf-dbus-1.so.0
--
--libdconf-dbus-1.so.0 libdconf-dbus-1.so: libdconf-dbus-1.so.0.0.0
--	$(AM_V_GEN) ln -fs libdconf-dbus-1.so.0.0.0 $@
--
--install-data-hook:
--	ln -fs libdconf-dbus-1.so.0.0.0 $(DESTDIR)$(shlibdir)/libdconf-dbus-1.so.0
--	ln -fs libdconf-dbus-1.so.0.0.0 $(DESTDIR)$(shlibdir)/libdconf-dbus-1.so
--
--uninstall-hook:
--	rm -f $(DESTDIR)$(shlibdir)/libdconf-dbus-1.so.0
--	rm -f $(DESTDIR)$(shlibdir)/libdconf-dbus-1.so
--
--CLEANFILES = libdconf-dbus-1.so.0 libdconf-dbus-1.so
-diff --git a/dbus-1/dconf-dbus-1.c b/dbus-1/dconf-dbus-1.c
-deleted file mode 100644
-index 67de4a0..0000000
---- a/dbus-1/dconf-dbus-1.c
-+++ /dev/null
-@@ -1,188 +0,0 @@
--/**
-- * Copyright © 2010 Canonical Limited
-- *
-- * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
-- *
-- * Author: Ryan Lortie <desrt@desrt.ca>
-- **/
--
--#include "config.h"
--
--#include "dconf-dbus-1.h"
--
--#include "../engine/dconf-engine.h"
--#include "dconf-libdbus-1.h"
--
--#include <string.h>
--
--struct _DConfDBusClient
--{
--  DConfEngine *engine;
--  GSList *watches;
--  gint ref_count;
--};
--
--typedef struct
--{
--  gchar           *path;
--  DConfDBusNotify  notify;
--  gpointer         user_data;
--} Watch;
--
--void
--dconf_engine_change_notify (DConfEngine         *engine,
--                            const gchar         *prefix,
--                            const gchar * const *changes,
--                            const gchar         *tag,
--                            gboolean             is_writability,
--                            gpointer             origin_tag,
--                            gpointer             user_data)
--{
--  DConfDBusClient *dcdbc = user_data;
--  gchar **my_changes;
--  gint n_changes;
--  GSList *iter;
--  gint i;
--
--  n_changes = g_strv_length ((gchar **) changes);
--  my_changes = g_new (gchar *, n_changes + 1);
--
--  for (i = 0; i < n_changes; i++)
--    my_changes[i] = g_strconcat (prefix, changes[i], NULL);
--  my_changes[i] = NULL;
--
--  for (iter = dcdbc->watches; iter; iter = iter->next)
--    {
--      Watch *watch = iter->data;
--
--      for (i = 0; i < n_changes; i++)
--        if (g_str_has_prefix (my_changes[i], watch->path))
--          watch->notify (dcdbc, my_changes[i], watch->user_data);
--    }
--
--  g_strfreev (my_changes);
--}
--
--GVariant *
--dconf_dbus_client_read (DConfDBusClient *dcdbc,
--                        const gchar     *key)
--{
--  return dconf_engine_read (dcdbc->engine, NULL, key);
--}
--
--gboolean
--dconf_dbus_client_write (DConfDBusClient *dcdbc,
--                         const gchar     *key,
--                         GVariant        *value)
--{
--  DConfChangeset *changeset;
--  gboolean success;
--
--  changeset = dconf_changeset_new_write (key, value);
--  success = dconf_engine_change_fast (dcdbc->engine, changeset, NULL, NULL);
--  dconf_changeset_unref (changeset);
--
--  return success;
--}
--
--void
--dconf_dbus_client_subscribe (DConfDBusClient *dcdbc,
--                             const gchar     *path,
--                             DConfDBusNotify  notify,
--                             gpointer         user_data)
--{
--  Watch *watch;
--
--  watch = g_slice_new (Watch);
--  watch->path = g_strdup (path);
--  watch->notify = notify;
--  watch->user_data = user_data;
--
--  dcdbc->watches = g_slist_prepend (dcdbc->watches, watch);
--
--  dconf_engine_watch_fast (dcdbc->engine, path);
--}
--
--void
--dconf_dbus_client_unsubscribe (DConfDBusClient *dcdbc,
--                               DConfDBusNotify  notify,
--                               gpointer         user_data)
--{
--  GSList **ptr;
--
--  for (ptr = &dcdbc->watches; *ptr; ptr = &(*ptr)->next)
--    {
--      Watch *watch = (*ptr)->data;
--
--      if (watch->notify == notify && watch->user_data == user_data)
--        {
--          *ptr = g_slist_remove_link (*ptr, *ptr);
--          dconf_engine_unwatch_fast (dcdbc->engine, watch->path);
--          g_free (watch->path);
--          g_slice_free (Watch, watch);
--          return;
--        }
--    }
--
--  g_warning ("No matching watch found to unsubscribe");
--}
--
--gboolean
--dconf_dbus_client_has_pending (DConfDBusClient *dcdbc)
--{
--  return dconf_engine_has_outstanding (dcdbc->engine);
--}
--
--DConfDBusClient *
--dconf_dbus_client_new (const gchar    *profile,
--                       DBusConnection *session,
--                       DBusConnection *system)
--{
--  DConfDBusClient *dcdbc;
--
--  if (session == NULL)
--    session = dbus_bus_get (DBUS_BUS_SESSION, NULL);
--
--  if (system == NULL)
--    system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
--
--  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session);
--  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system);
--
--  dcdbc = g_slice_new (DConfDBusClient);
--  dcdbc->engine = dconf_engine_new (NULL, dcdbc, NULL);
--  dcdbc->watches = NULL;
--  dcdbc->ref_count = 1;
--
--  return dcdbc;
--}
--
--void
--dconf_dbus_client_unref (DConfDBusClient *dcdbc)
--{
--  if (--dcdbc->ref_count == 0)
--    {
--      g_return_if_fail (dcdbc->watches == NULL);
--
--      g_slice_free (DConfDBusClient, dcdbc);
--    }
--}
--
--DConfDBusClient *
--dconf_dbus_client_ref (DConfDBusClient *dcdbc)
--{
--  dcdbc->ref_count++;
--
--  return dcdbc;
--}
-diff --git a/dbus-1/dconf-dbus-1.h b/dbus-1/dconf-dbus-1.h
-deleted file mode 100644
-index bd204be..0000000
---- a/dbus-1/dconf-dbus-1.h
-+++ /dev/null
-@@ -1,56 +0,0 @@
--/**
-- * Copyright © 2010 Canonical Limited
-- *
-- * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
-- *
-- * Author: Ryan Lortie <desrt@desrt.ca>
-- **/
--
--#ifndef _dconf_dbus_1_h_
--#define _dconf_dbus_1_h_
--
--#include <dbus/dbus.h>
--#include <glib.h>
--
--G_BEGIN_DECLS
--
--typedef struct _DConfDBusClient DConfDBusClient;
--
--typedef void         (* DConfDBusNotify)                                (DConfDBusClient *dcdbc,
--                                                                         const gchar     *key,
--                                                                         gpointer         user_data);
--
--DConfDBusClient *       dconf_dbus_client_new                           (const gchar     *profile,
--                                                                         DBusConnection  *session,
--                                                                         DBusConnection  *system);
--void                    dconf_dbus_client_unref                         (DConfDBusClient *dcdbc);
--DConfDBusClient *       dconf_dbus_client_ref                           (DConfDBusClient *dcdbc);
--
--GVariant *              dconf_dbus_client_read                          (DConfDBusClient *dcdbc,
--                                                                         const gchar     *key);
--gboolean                dconf_dbus_client_write                         (DConfDBusClient *dcdbc,
--                                                                         const gchar     *key,
--                                                                         GVariant        *value);
--void                    dconf_dbus_client_subscribe                     (DConfDBusClient *dcdbc,
--                                                                         const gchar     *name,
--                                                                         DConfDBusNotify  notify,
--                                                                         gpointer         user_data);
--void                    dconf_dbus_client_unsubscribe                   (DConfDBusClient *dcdbc,
--                                                                         DConfDBusNotify  notify,
--                                                                         gpointer         user_data);
--gboolean                dconf_dbus_client_has_pending                   (DConfDBusClient *dcdbc);
--
--G_END_DECLS
--
--#endif /* _dconf_dbus_1_h_ */
-diff --git a/dbus-1/dconf-dbus-1.pc.in b/dbus-1/dconf-dbus-1.pc.in
-deleted file mode 100644
-index c4c3380..0000000
---- a/dbus-1/dconf-dbus-1.pc.in
-+++ /dev/null
-@@ -1,11 +0,0 @@
--prefix=@prefix@
--exec_prefix=@exec_prefix@
--libdir=@libdir@
--includedir=@includedir@
--
--Name: dconf-dbus-1
--Description: dconf client library for libdbus-1
--Version: @VERSION@
--Requires: dbus-1, glib-2.0
--Libs: -L${libdir} -ldconf-dbus-1
--Cflags: -I${includedir}/dconf-dbus-1
-diff --git a/dbus-1/dconf-libdbus-1.c b/dbus-1/dconf-libdbus-1.c
-deleted file mode 100644
-index 8ea187b..0000000
---- a/dbus-1/dconf-libdbus-1.c
-+++ /dev/null
-@@ -1,365 +0,0 @@
--/**
-- * Copyright © 2010 Canonical Limited
-- *
-- * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
-- *
-- * Author: Ryan Lortie <desrt@desrt.ca>
-- **/
--
--#include "config.h"
--
--#include "dconf-libdbus-1.h"
--
--#include "../engine/dconf-engine.h"
--
--#include <string.h>
--
--static DBusConnection *dconf_libdbus_1_buses[5];
--
--struct _DConfDBusClient
--{
--  DConfEngine *engine;
--  GSList *watches;
--  gint ref_count;
--};
--
--#define DCONF_LIBDBUS_1_ERROR (g_quark_from_static_string("DCONF_LIBDBUS_1_ERROR"))
--#define DCONF_LIBDBUS_1_ERROR_FAILED 0
--
--static DBusMessage *
--dconf_libdbus_1_new_method_call (const gchar *bus_name,
--                                 const gchar *object_path,
--                                 const gchar *interface_name,
--                                 const gchar *method_name,
--                                 GVariant    *parameters)
--{
--  DBusMessageIter dbus_iter;
--  DBusMessage *message;
--  GVariantIter iter;
--  GVariant *child;
--
--  g_variant_ref_sink (parameters);
--
--  message = dbus_message_new_method_call (bus_name, object_path, interface_name, method_name);
--  dbus_message_iter_init_append (message, &dbus_iter);
--  g_variant_iter_init (&iter, parameters);
--
--  while ((child = g_variant_iter_next_value (&iter)))
--    {
--      if (g_variant_is_of_type (child, G_VARIANT_TYPE_STRING))
--        {
--          const gchar *str;
--
--          str = g_variant_get_string (child, NULL);
--          dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_STRING, &str);
--        }
--
--      else if (g_variant_is_of_type (child, G_VARIANT_TYPE_UINT32))
--        {
--          guint32 uint;
--
--          uint = g_variant_get_uint32 (child);
--          dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_UINT32, &uint);
--        }
--
--      else
--        {
--          DBusMessageIter subiter;
--          const guint8 *bytes;
--          gsize n_elements;
--
--          g_assert (g_variant_is_of_type (child, G_VARIANT_TYPE_BYTESTRING));
--
--          bytes = g_variant_get_fixed_array (child, &n_elements, sizeof (guint8));
--          dbus_message_iter_open_container (&dbus_iter, DBUS_TYPE_ARRAY, "y", &subiter);
--          dbus_message_iter_append_fixed_array (&subiter, DBUS_TYPE_BYTE, &bytes, n_elements);
--          dbus_message_iter_close_container (&dbus_iter, &subiter);
--        }
--
--      g_variant_unref (child);
--    }
--
--  g_variant_unref (parameters);
--
--  return message;
--}
--
--static GVariant *
--dconf_libdbus_1_get_message_body (DBusMessage  *message,
--                                  GError      **error)
--{
--  GVariantBuilder builder;
--  const gchar *signature;
--  DBusMessageIter iter;
--
--  /* We support two types: strings and arrays of strings.
--   *
--   * It's very simple to detect if the message contains only these
--   * types: check that the signature contains only the letters "a" and
--   * "s" and that it does not contain "aa".
--   */
--  signature = dbus_message_get_signature (message);
--  if (signature[strspn(signature, "as")] != '\0' || strstr (signature, "aa"))
--    {
--      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
--                   "unable to handle message type '(%s)'", signature);
--      return NULL;
--    }
--
--  g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
--  dbus_message_iter_init (message, &iter);
--  while (dbus_message_iter_get_arg_type (&iter))
--    {
--      const gchar *string;
--
--      if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING)
--        {
--          dbus_message_iter_get_basic (&iter, &string);
--          g_variant_builder_add (&builder, "s", string);
--        }
--      else
--        {
--          DBusMessageIter sub;
--
--          g_assert (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY &&
--                    dbus_message_iter_get_element_type (&iter) == DBUS_TYPE_STRING);
--
--          g_variant_builder_open (&builder, G_VARIANT_TYPE_STRING_ARRAY);
--          dbus_message_iter_recurse (&iter, &sub);
--
--          while (dbus_message_iter_get_arg_type (&sub))
--            {
--              const gchar *string;
--              dbus_message_iter_get_basic (&sub, &string);
--              g_variant_builder_add (&builder, "s", string);
--              dbus_message_iter_next (&sub);
--            }
--
--          g_variant_builder_close (&builder);
--        }
--      dbus_message_iter_next (&iter);
--    }
--
--  return g_variant_ref_sink (g_variant_builder_end (&builder));
--}
--
--static GVariant *
--dconf_libdbus_1_interpret_result (DBusMessage         *result,
--                                  const GVariantType  *expected_type,
--                                  GError             **error)
--{
--  GVariant *reply;
--
--  if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR)
--    {
--      const gchar *errstr = "(no message)";
--
--      dbus_message_get_args (result, NULL, DBUS_TYPE_STRING, &errstr, DBUS_TYPE_INVALID);
--      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
--                   "%s: %s", dbus_message_get_error_name (result), errstr);
--      return NULL;
--    }
--
--  reply = dconf_libdbus_1_get_message_body (result, error);
--
--  if (reply && expected_type && !g_variant_is_of_type (reply, expected_type))
--    {
--      gchar *expected_string;
--
--      expected_string = g_variant_type_dup_string (expected_type);
--      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
--                   "received reply '%s' is not of the expected type %s",
--                   g_variant_get_type_string (reply), expected_string);
--      g_free (expected_string);
--
--      g_variant_unref (reply);
--      reply = NULL;
--    }
--
--  return reply;
--}
--
--static void
--dconf_libdbus_1_method_call_done (DBusPendingCall *pending,
--                                  gpointer         user_data)
--{
--  DConfEngineCallHandle *handle = user_data;
--  const GVariantType *expected_type;
--  DBusMessage *message;
--  GError *error = NULL;
--  GVariant *reply;
--
--  if (pending == NULL)
--    return;
--
--  message = dbus_pending_call_steal_reply (pending);
--  dbus_pending_call_unref (pending);
--
--  expected_type = dconf_engine_call_handle_get_expected_type (handle);
--  reply = dconf_libdbus_1_interpret_result (message, expected_type, &error);
--  dbus_message_unref (message);
--
--  dconf_engine_call_handle_reply (handle, reply, error);
--
--  if (reply)
--    g_variant_unref (reply);
--  if (error)
--    g_error_free (error);
--}
--
--gboolean
--dconf_engine_dbus_call_async_func (GBusType                bus_type,
--                                   const gchar            *bus_name,
--                                   const gchar            *object_path,
--                                   const gchar            *interface_name,
--                                   const gchar            *method_name,
--                                   GVariant               *parameters,
--                                   DConfEngineCallHandle  *handle,
--                                   GError                **error)
--{
--  DBusConnection *connection;
--  DBusPendingCall *pending;
--  DBusMessage *message;
--
--  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
--  connection = dconf_libdbus_1_buses[bus_type];
--  g_assert (connection != NULL);
--
--  message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
--  dbus_connection_send_with_reply (connection, message, &pending, -1);
--  dbus_pending_call_set_notify (pending, dconf_libdbus_1_method_call_done, handle, NULL);
--  dbus_message_unref (message);
--
--  return TRUE;
--}
--
--static void
--dconf_libdbus_1_convert_error (DBusError  *dbus_error,
--                               GError    **error)
--{
--  g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
--               "%s: %s", dbus_error->name, dbus_error->message);
--}
--
--GVariant *
--dconf_engine_dbus_call_sync_func (GBusType             bus_type,
--                                  const gchar         *bus_name,
--                                  const gchar         *object_path,
--                                  const gchar         *interface_name,
--                                  const gchar         *method_name,
--                                  GVariant            *parameters,
--                                  const GVariantType  *expected_type,
--                                  GError             **error)
--{
--  DBusConnection *connection;
--  DBusMessage *message;
--  DBusError dbus_error;
--  DBusMessage *result;
--  GVariant *reply;
--
--  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
--  connection = dconf_libdbus_1_buses[bus_type];
--  g_assert (connection != NULL);
--
--  dbus_error_init (&dbus_error);
--  message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
--  result = dbus_connection_send_with_reply_and_block (connection, message, -1, &dbus_error);
--  dbus_message_unref (message);
--
--  if (result == NULL)
--    {
--      dconf_libdbus_1_convert_error (&dbus_error, error);
--      dbus_error_free (&dbus_error);
--      return NULL;
--    }
--
--  reply = dconf_libdbus_1_interpret_result (result, expected_type, error);
--  dbus_message_unref (result);
--
--  return reply;
--}
--
--static DBusHandlerResult
--dconf_libdbus_1_filter (DBusConnection *connection,
--                        DBusMessage    *message,
--                        gpointer        user_data)
--{
--  GBusType bus_type = GPOINTER_TO_INT (user_data);
--
--  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
--    {
--      const gchar *interface;
--
--      interface = dbus_message_get_interface (message);
--
--      if (interface && g_str_equal (interface, "ca.desrt.dconf.Writer"))
--        {
--          GVariant *parameters;
--
--          parameters = dconf_libdbus_1_get_message_body (message, NULL);
--
--          if (parameters != NULL)
--            {
--              dconf_engine_handle_dbus_signal (bus_type,
--                                               dbus_message_get_sender (message),
--                                               dbus_message_get_path (message),
--                                               dbus_message_get_member (message),
--                                               parameters);
--              g_variant_unref (parameters);
--            }
--        }
--    }
--
--  return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
--}
--
--void
--dconf_libdbus_1_provide_bus (GBusType        bus_type,
--                             DBusConnection *connection)
--{
--  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
--
--  if (!dconf_libdbus_1_buses[bus_type])
--    {
--      dconf_libdbus_1_buses[bus_type] = dbus_connection_ref (connection);
--      dbus_connection_add_filter (connection, dconf_libdbus_1_filter, GINT_TO_POINTER (bus_type), NULL);
--    }
--}
--
--#ifndef PIC
--static gboolean
--dconf_libdbus_1_check_connection (gpointer user_data)
--{
--  DBusConnection *connection = user_data;
--
--  dbus_connection_read_write (connection, 0);
--  dbus_connection_dispatch (connection);
--
--  return G_SOURCE_CONTINUE;
--}
--
--void
--dconf_engine_dbus_init_for_testing (void)
--{
--  DBusConnection *session;
--  DBusConnection *system;
--
--  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session = dbus_bus_get (DBUS_BUS_SESSION, NULL));
--  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL));
--
--  /* "mainloop integration" */
--  g_timeout_add (1, dconf_libdbus_1_check_connection, session);
--  g_timeout_add (1, dconf_libdbus_1_check_connection, system);
--}
--#endif
-diff --git a/dbus-1/dconf-libdbus-1.h b/dbus-1/dconf-libdbus-1.h
-deleted file mode 100644
-index 201096a..0000000
---- a/dbus-1/dconf-libdbus-1.h
-+++ /dev/null
-@@ -1,11 +0,0 @@
--#ifndef __dconf_libdbus_1_h__
--#define __dconf_libdbus_1_h__
--
--#include <dbus/dbus.h>
--#include <gio/gio.h>
--
--G_GNUC_INTERNAL
--void                    dconf_libdbus_1_provide_bus                     (GBusType        bus_type,
--                                                                         DBusConnection *connection);
--
--#endif /* __dconf_libdbus_1_h__ */
-diff --git a/tests/Makefile.am b/tests/Makefile.am
-index adc8519..0a53ee6 100644
---- a/tests/Makefile.am
-+++ b/tests/Makefile.am
-@@ -64,14 +64,6 @@ gdbus_filter_LDADD = \
- 	$(gio_LIBS)
- gdbus_filter_SOURCES = dbus.c
- 
--TEST_PROGS += libdbus-1
--libdbus_1_CFLAGS = $(gio_CFLAGS) -DDBUS_BACKEND=\"/libdbus-1\"
--libdbus_1_LDADD = \
--	../dbus-1/libdconf-libdbus-1.a		\
--	$(glib_LIBS)				\
--	$(dbus_LIBS)
--libdbus_1_SOURCES = dbus.c
--
- TEST_PROGS += engine
- engine_CFLAGS = $(glib_CFLAGS) -DSRCDIR=\"$(abs_srcdir)\"
- engine_LDADD = \
--- 
-2.9.3
-
diff --git a/SOURCES/dconf-0.26.0-db-mtime.patch b/SOURCES/dconf-0.26.0-db-mtime.patch
deleted file mode 100644
index 69fe241..0000000
--- a/SOURCES/dconf-0.26.0-db-mtime.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 6a6797446f13378035a2700253546b524d629c8a Mon Sep 17 00:00:00 2001
-From: Marek Kasik <mkasik@redhat.com>
-Date: Tue, 10 Jul 2018 18:29:16 +0200
-Subject: [PATCH] Check mtimes of files when updating databases
-
-Do not check just mtimes of directories in /etc/dconf/db/
-but also mtimes of the files in those directories
-to catch all modifications in them.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=708258
----
- bin/dconf-update.vala | 41 ++++++++++++++++++++++++++++++++++-------
- 1 file changed, 34 insertions(+), 7 deletions(-)
-
-diff --git a/bin/dconf-update.vala b/bin/dconf-update.vala
-index d452092..5aac6c7 100644
---- a/bin/dconf-update.vala
-+++ b/bin/dconf-update.vala
-@@ -162,21 +162,48 @@ Gvdb.HashTable read_directory (string dirname) throws GLib.Error {
- 	return table;
- }
- 
-+time_t get_directory_mtime (string dirname, Posix.Stat dir_buf) throws GLib.Error {
-+	Posix.Stat lockdir_buf;
-+	Posix.Stat file_buf;
-+	time_t dir_mtime = dir_buf.st_mtime;
-+
-+	var files = list_directory (dirname, Posix.S_IFREG);
-+	files.sort (strcmp);
-+	files.reverse ();
-+
-+	foreach (var filename in files) {
-+		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_mtime)
-+			dir_mtime = file_buf.st_mtime;
-+	}
-+
-+	if (Posix.stat (dirname + "/locks", out lockdir_buf) == 0 && Posix.S_ISDIR (lockdir_buf.st_mode)) {
-+		if (lockdir_buf.st_mtime > dir_mtime) {
-+			// if the lock directory has been updated more recently then consider its timestamp instead
-+			dir_mtime = lockdir_buf.st_mtime;
-+		}
-+
-+		files = list_directory (dirname + "/locks", Posix.S_IFREG);
-+		files.sort (strcmp);
-+		files.reverse ();
-+
-+		foreach (var filename in files) {
-+			if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_mtime)
-+				dir_mtime = file_buf.st_mtime;
-+		}
-+	}
-+
-+	return dir_mtime;
-+}
-+
- void maybe_update_from_directory (string dirname) throws GLib.Error {
- 	Posix.Stat dir_buf;
- 
- 	if (Posix.stat (dirname, out dir_buf) == 0 && Posix.S_ISDIR (dir_buf.st_mode)) {
--		Posix.Stat lockdir_buf;
- 		Posix.Stat file_buf;
- 
- 		var filename = dirname.substring (0, dirname.length - 2);
- 
--		if (Posix.stat (dirname + "/locks", out lockdir_buf) == 0 && lockdir_buf.st_mtime > dir_buf.st_mtime) {
--			// if the lock directory has been updated more recently then consider its timestamp instead
--			dir_buf.st_mtime = lockdir_buf.st_mtime;
--		}
--
--		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_buf.st_mtime) {
-+		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > get_directory_mtime (dirname, dir_buf)) {
- 			return;
- 		}
- 
--- 
-2.17.1
-
diff --git a/SOURCES/dconf-0.26.0-read-flag.patch b/SOURCES/dconf-0.26.0-read-flag.patch
deleted file mode 100644
index 541cb24..0000000
--- a/SOURCES/dconf-0.26.0-read-flag.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- dconf-0.26.0/dbus-1/dconf-dbus-1.c.orig	2017-02-10 16:56:10.000000000 +0100
-+++ dconf-0.26.0/dbus-1/dconf-dbus-1.c	2017-02-10 16:56:15.686442282 +0100
-@@ -78,7 +78,7 @@ GVariant *
- dconf_dbus_client_read (DConfDBusClient *dcdbc,
-                         const gchar     *key)
- {
--  return dconf_engine_read (dcdbc->engine, NULL, key);
-+  return dconf_engine_read (dcdbc->engine, DCONF_READ_FLAGS_NONE, NULL, key);
- }
- 
- gboolean
diff --git a/SOURCES/dconf-0.28.0-db-mtime.patch b/SOURCES/dconf-0.28.0-db-mtime.patch
new file mode 100644
index 0000000..69fe241
--- /dev/null
+++ b/SOURCES/dconf-0.28.0-db-mtime.patch
@@ -0,0 +1,77 @@
+From 6a6797446f13378035a2700253546b524d629c8a Mon Sep 17 00:00:00 2001
+From: Marek Kasik <mkasik@redhat.com>
+Date: Tue, 10 Jul 2018 18:29:16 +0200
+Subject: [PATCH] Check mtimes of files when updating databases
+
+Do not check just mtimes of directories in /etc/dconf/db/
+but also mtimes of the files in those directories
+to catch all modifications in them.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=708258
+---
+ bin/dconf-update.vala | 41 ++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 34 insertions(+), 7 deletions(-)
+
+diff --git a/bin/dconf-update.vala b/bin/dconf-update.vala
+index d452092..5aac6c7 100644
+--- a/bin/dconf-update.vala
++++ b/bin/dconf-update.vala
+@@ -162,21 +162,48 @@ Gvdb.HashTable read_directory (string dirname) throws GLib.Error {
+ 	return table;
+ }
+ 
++time_t get_directory_mtime (string dirname, Posix.Stat dir_buf) throws GLib.Error {
++	Posix.Stat lockdir_buf;
++	Posix.Stat file_buf;
++	time_t dir_mtime = dir_buf.st_mtime;
++
++	var files = list_directory (dirname, Posix.S_IFREG);
++	files.sort (strcmp);
++	files.reverse ();
++
++	foreach (var filename in files) {
++		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_mtime)
++			dir_mtime = file_buf.st_mtime;
++	}
++
++	if (Posix.stat (dirname + "/locks", out lockdir_buf) == 0 && Posix.S_ISDIR (lockdir_buf.st_mode)) {
++		if (lockdir_buf.st_mtime > dir_mtime) {
++			// if the lock directory has been updated more recently then consider its timestamp instead
++			dir_mtime = lockdir_buf.st_mtime;
++		}
++
++		files = list_directory (dirname + "/locks", Posix.S_IFREG);
++		files.sort (strcmp);
++		files.reverse ();
++
++		foreach (var filename in files) {
++			if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_mtime)
++				dir_mtime = file_buf.st_mtime;
++		}
++	}
++
++	return dir_mtime;
++}
++
+ void maybe_update_from_directory (string dirname) throws GLib.Error {
+ 	Posix.Stat dir_buf;
+ 
+ 	if (Posix.stat (dirname, out dir_buf) == 0 && Posix.S_ISDIR (dir_buf.st_mode)) {
+-		Posix.Stat lockdir_buf;
+ 		Posix.Stat file_buf;
+ 
+ 		var filename = dirname.substring (0, dirname.length - 2);
+ 
+-		if (Posix.stat (dirname + "/locks", out lockdir_buf) == 0 && lockdir_buf.st_mtime > dir_buf.st_mtime) {
+-			// if the lock directory has been updated more recently then consider its timestamp instead
+-			dir_buf.st_mtime = lockdir_buf.st_mtime;
+-		}
+-
+-		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > dir_buf.st_mtime) {
++		if (Posix.stat (filename, out file_buf) == 0 && file_buf.st_mtime > get_directory_mtime (dirname, dir_buf)) {
+ 			return;
+ 		}
+ 
+-- 
+2.17.1
+
diff --git a/SOURCES/dconf-0.28.0-dbus-1.patch b/SOURCES/dconf-0.28.0-dbus-1.patch
new file mode 100644
index 0000000..a895f92
--- /dev/null
+++ b/SOURCES/dconf-0.28.0-dbus-1.patch
@@ -0,0 +1,706 @@
+--- a/meson.build
++++ b/meson.build
+@@ -75,6 +75,7 @@ gio_unix_req_version = '>= 2.25.7'
+ 
+ glib_dep = dependency('glib-2.0', version: '>= 2.44.0')
+ gio_unix_dep = dependency('gio-unix-2.0', version: gio_unix_req_version)
++dbus_1_dep = dependency('dbus-1')
+ 
+ gio_querymodules = find_program('gio-querymodules', required: false)
+ if gio_querymodules.found()
+@@ -101,6 +102,7 @@ subdir('gvdb')
+ subdir('common')
+ subdir('engine')
+ subdir('service')
++subdir('dbus-1')
+ subdir('gdbus')
+ subdir('gsettings')
+ subdir('client')
+--- /dev/null
++++ b/dbus-1/meson.build
+@@ -0,0 +1,43 @@
++client_inc = include_directories('.')
++
++libdbus_1_sources = files('dconf-libdbus-1.c', 'dconf-libdbus-1.h')
++
++cflags = '-DG_LOG_DOMAIN="@0@"'.format(meson.project_name())
++
++libdconf_libdbus_1_shared = static_library(
++  meson.project_name() + '-libdbus-1-shared',
++  sources: libdbus_1_sources,
++  include_directories: top_inc,
++  dependencies: [gio_unix_dep, dbus_1_dep],
++  c_args: cflags,
++  pic: true
++)
++
++libdconf_libdbus_1 = static_library(
++  meson.project_name() + '-libdbus-1',
++  sources: libdbus_1_sources,
++  include_directories: top_inc,
++  dependencies: [gio_unix_dep, dbus_1_dep],
++  c_args: cflags,
++)
++
++dbus_1_sources = files('dconf-dbus-1.c')
++
++libdconf_dbus_1 = shared_library(
++  meson.project_name() + '-dbus-1',
++  sources: dbus_1_sources,
++  version: '0.0.0',
++  soversion: '0',
++  include_directories: top_inc,
++  dependencies: [gio_unix_dep, dbus_1_dep],
++  c_args: cflags,
++  link_with: [
++    libdconf_common_hidden,
++    libdconf_engine_shared,
++    libdconf_libdbus_1_shared,
++    libdconf_shm_shared,
++    libgvdb_shared
++  ],
++  install: true,
++  install_dir: dconf_libdir
++)
+--- /dev/null
++++ b/dbus-1/dconf-dbus-1.c
+@@ -0,0 +1,188 @@
++/**
++ * Copyright © 2010 Canonical Limited
++ *
++ * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
++ *
++ * Author: Ryan Lortie <desrt@desrt.ca>
++ **/
++
++#include "config.h"
++
++#include "dconf-dbus-1.h"
++
++#include "../engine/dconf-engine.h"
++#include "dconf-libdbus-1.h"
++
++#include <string.h>
++
++struct _DConfDBusClient
++{
++  DConfEngine *engine;
++  GSList *watches;
++  gint ref_count;
++};
++
++typedef struct
++{
++  gchar           *path;
++  DConfDBusNotify  notify;
++  gpointer         user_data;
++} Watch;
++
++void
++dconf_engine_change_notify (DConfEngine         *engine,
++                            const gchar         *prefix,
++                            const gchar * const *changes,
++                            const gchar         *tag,
++                            gboolean             is_writability,
++                            gpointer             origin_tag,
++                            gpointer             user_data)
++{
++  DConfDBusClient *dcdbc = user_data;
++  gchar **my_changes;
++  gint n_changes;
++  GSList *iter;
++  gint i;
++
++  n_changes = g_strv_length ((gchar **) changes);
++  my_changes = g_new (gchar *, n_changes + 1);
++
++  for (i = 0; i < n_changes; i++)
++    my_changes[i] = g_strconcat (prefix, changes[i], NULL);
++  my_changes[i] = NULL;
++
++  for (iter = dcdbc->watches; iter; iter = iter->next)
++    {
++      Watch *watch = iter->data;
++
++      for (i = 0; i < n_changes; i++)
++        if (g_str_has_prefix (my_changes[i], watch->path))
++          watch->notify (dcdbc, my_changes[i], watch->user_data);
++    }
++
++  g_strfreev (my_changes);
++}
++
++GVariant *
++dconf_dbus_client_read (DConfDBusClient *dcdbc,
++                        const gchar     *key)
++{
++  return dconf_engine_read (dcdbc->engine, DCONF_READ_FLAGS_NONE, NULL, key);
++}
++
++gboolean
++dconf_dbus_client_write (DConfDBusClient *dcdbc,
++                         const gchar     *key,
++                         GVariant        *value)
++{
++  DConfChangeset *changeset;
++  gboolean success;
++
++  changeset = dconf_changeset_new_write (key, value);
++  success = dconf_engine_change_fast (dcdbc->engine, changeset, NULL, NULL);
++  dconf_changeset_unref (changeset);
++
++  return success;
++}
++
++void
++dconf_dbus_client_subscribe (DConfDBusClient *dcdbc,
++                             const gchar     *path,
++                             DConfDBusNotify  notify,
++                             gpointer         user_data)
++{
++  Watch *watch;
++
++  watch = g_slice_new (Watch);
++  watch->path = g_strdup (path);
++  watch->notify = notify;
++  watch->user_data = user_data;
++
++  dcdbc->watches = g_slist_prepend (dcdbc->watches, watch);
++
++  dconf_engine_watch_fast (dcdbc->engine, path);
++}
++
++void
++dconf_dbus_client_unsubscribe (DConfDBusClient *dcdbc,
++                               DConfDBusNotify  notify,
++                               gpointer         user_data)
++{
++  GSList **ptr;
++
++  for (ptr = &dcdbc->watches; *ptr; ptr = &(*ptr)->next)
++    {
++      Watch *watch = (*ptr)->data;
++
++      if (watch->notify == notify && watch->user_data == user_data)
++        {
++          *ptr = g_slist_remove_link (*ptr, *ptr);
++          dconf_engine_unwatch_fast (dcdbc->engine, watch->path);
++          g_free (watch->path);
++          g_slice_free (Watch, watch);
++          return;
++        }
++    }
++
++  g_warning ("No matching watch found to unsubscribe");
++}
++
++gboolean
++dconf_dbus_client_has_pending (DConfDBusClient *dcdbc)
++{
++  return dconf_engine_has_outstanding (dcdbc->engine);
++}
++
++DConfDBusClient *
++dconf_dbus_client_new (const gchar    *profile,
++                       DBusConnection *session,
++                       DBusConnection *system)
++{
++  DConfDBusClient *dcdbc;
++
++  if (session == NULL)
++    session = dbus_bus_get (DBUS_BUS_SESSION, NULL);
++
++  if (system == NULL)
++    system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
++
++  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session);
++  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system);
++
++  dcdbc = g_slice_new (DConfDBusClient);
++  dcdbc->engine = dconf_engine_new (NULL, dcdbc, NULL);
++  dcdbc->watches = NULL;
++  dcdbc->ref_count = 1;
++
++  return dcdbc;
++}
++
++void
++dconf_dbus_client_unref (DConfDBusClient *dcdbc)
++{
++  if (--dcdbc->ref_count == 0)
++    {
++      g_return_if_fail (dcdbc->watches == NULL);
++
++      g_slice_free (DConfDBusClient, dcdbc);
++    }
++}
++
++DConfDBusClient *
++dconf_dbus_client_ref (DConfDBusClient *dcdbc)
++{
++  dcdbc->ref_count++;
++
++  return dcdbc;
++}
+--- /dev/null
++++ b/dbus-1/dconf-dbus-1.h
+@@ -0,0 +1,56 @@
++/**
++ * Copyright © 2010 Canonical Limited
++ *
++ * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
++ *
++ * Author: Ryan Lortie <desrt@desrt.ca>
++ **/
++
++#ifndef _dconf_dbus_1_h_
++#define _dconf_dbus_1_h_
++
++#include <dbus/dbus.h>
++#include <glib.h>
++
++G_BEGIN_DECLS
++
++typedef struct _DConfDBusClient DConfDBusClient;
++
++typedef void         (* DConfDBusNotify)                                (DConfDBusClient *dcdbc,
++                                                                         const gchar     *key,
++                                                                         gpointer         user_data);
++
++DConfDBusClient *       dconf_dbus_client_new                           (const gchar     *profile,
++                                                                         DBusConnection  *session,
++                                                                         DBusConnection  *system);
++void                    dconf_dbus_client_unref                         (DConfDBusClient *dcdbc);
++DConfDBusClient *       dconf_dbus_client_ref                           (DConfDBusClient *dcdbc);
++
++GVariant *              dconf_dbus_client_read                          (DConfDBusClient *dcdbc,
++                                                                         const gchar     *key);
++gboolean                dconf_dbus_client_write                         (DConfDBusClient *dcdbc,
++                                                                         const gchar     *key,
++                                                                         GVariant        *value);
++void                    dconf_dbus_client_subscribe                     (DConfDBusClient *dcdbc,
++                                                                         const gchar     *name,
++                                                                         DConfDBusNotify  notify,
++                                                                         gpointer         user_data);
++void                    dconf_dbus_client_unsubscribe                   (DConfDBusClient *dcdbc,
++                                                                         DConfDBusNotify  notify,
++                                                                         gpointer         user_data);
++gboolean                dconf_dbus_client_has_pending                   (DConfDBusClient *dcdbc);
++
++G_END_DECLS
++
++#endif /* _dconf_dbus_1_h_ */
+--- /dev/null
++++ b/dbus-1/dconf-libdbus-1.c
+@@ -0,0 +1,365 @@
++/**
++ * Copyright © 2010 Canonical Limited
++ *
++ * 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 3 of the licence, 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, see <http://www.gnu.org/licenses/>.
++ *
++ * Author: Ryan Lortie <desrt@desrt.ca>
++ **/
++
++#include "config.h"
++
++#include "dconf-libdbus-1.h"
++
++#include "../engine/dconf-engine.h"
++
++#include <string.h>
++
++static DBusConnection *dconf_libdbus_1_buses[5];
++
++struct _DConfDBusClient
++{
++  DConfEngine *engine;
++  GSList *watches;
++  gint ref_count;
++};
++
++#define DCONF_LIBDBUS_1_ERROR (g_quark_from_static_string("DCONF_LIBDBUS_1_ERROR"))
++#define DCONF_LIBDBUS_1_ERROR_FAILED 0
++
++static DBusMessage *
++dconf_libdbus_1_new_method_call (const gchar *bus_name,
++                                 const gchar *object_path,
++                                 const gchar *interface_name,
++                                 const gchar *method_name,
++                                 GVariant    *parameters)
++{
++  DBusMessageIter dbus_iter;
++  DBusMessage *message;
++  GVariantIter iter;
++  GVariant *child;
++
++  g_variant_ref_sink (parameters);
++
++  message = dbus_message_new_method_call (bus_name, object_path, interface_name, method_name);
++  dbus_message_iter_init_append (message, &dbus_iter);
++  g_variant_iter_init (&iter, parameters);
++
++  while ((child = g_variant_iter_next_value (&iter)))
++    {
++      if (g_variant_is_of_type (child, G_VARIANT_TYPE_STRING))
++        {
++          const gchar *str;
++
++          str = g_variant_get_string (child, NULL);
++          dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_STRING, &str);
++        }
++
++      else if (g_variant_is_of_type (child, G_VARIANT_TYPE_UINT32))
++        {
++          guint32 uint;
++
++          uint = g_variant_get_uint32 (child);
++          dbus_message_iter_append_basic (&dbus_iter, DBUS_TYPE_UINT32, &uint);
++        }
++
++      else
++        {
++          DBusMessageIter subiter;
++          const guint8 *bytes;
++          gsize n_elements;
++
++          g_assert (g_variant_is_of_type (child, G_VARIANT_TYPE_BYTESTRING));
++
++          bytes = g_variant_get_fixed_array (child, &n_elements, sizeof (guint8));
++          dbus_message_iter_open_container (&dbus_iter, DBUS_TYPE_ARRAY, "y", &subiter);
++          dbus_message_iter_append_fixed_array (&subiter, DBUS_TYPE_BYTE, &bytes, n_elements);
++          dbus_message_iter_close_container (&dbus_iter, &subiter);
++        }
++
++      g_variant_unref (child);
++    }
++
++  g_variant_unref (parameters);
++
++  return message;
++}
++
++static GVariant *
++dconf_libdbus_1_get_message_body (DBusMessage  *message,
++                                  GError      **error)
++{
++  GVariantBuilder builder;
++  const gchar *signature;
++  DBusMessageIter iter;
++
++  /* We support two types: strings and arrays of strings.
++   *
++   * It's very simple to detect if the message contains only these
++   * types: check that the signature contains only the letters "a" and
++   * "s" and that it does not contain "aa".
++   */
++  signature = dbus_message_get_signature (message);
++  if (signature[strspn(signature, "as")] != '\0' || strstr (signature, "aa"))
++    {
++      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
++                   "unable to handle message type '(%s)'", signature);
++      return NULL;
++    }
++
++  g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
++  dbus_message_iter_init (message, &iter);
++  while (dbus_message_iter_get_arg_type (&iter))
++    {
++      const gchar *string;
++
++      if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING)
++        {
++          dbus_message_iter_get_basic (&iter, &string);
++          g_variant_builder_add (&builder, "s", string);
++        }
++      else
++        {
++          DBusMessageIter sub;
++
++          g_assert (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY &&
++                    dbus_message_iter_get_element_type (&iter) == DBUS_TYPE_STRING);
++
++          g_variant_builder_open (&builder, G_VARIANT_TYPE_STRING_ARRAY);
++          dbus_message_iter_recurse (&iter, &sub);
++
++          while (dbus_message_iter_get_arg_type (&sub))
++            {
++              const gchar *string;
++              dbus_message_iter_get_basic (&sub, &string);
++              g_variant_builder_add (&builder, "s", string);
++              dbus_message_iter_next (&sub);
++            }
++
++          g_variant_builder_close (&builder);
++        }
++      dbus_message_iter_next (&iter);
++    }
++
++  return g_variant_ref_sink (g_variant_builder_end (&builder));
++}
++
++static GVariant *
++dconf_libdbus_1_interpret_result (DBusMessage         *result,
++                                  const GVariantType  *expected_type,
++                                  GError             **error)
++{
++  GVariant *reply;
++
++  if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR)
++    {
++      const gchar *errstr = "(no message)";
++
++      dbus_message_get_args (result, NULL, DBUS_TYPE_STRING, &errstr, DBUS_TYPE_INVALID);
++      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
++                   "%s: %s", dbus_message_get_error_name (result), errstr);
++      return NULL;
++    }
++
++  reply = dconf_libdbus_1_get_message_body (result, error);
++
++  if (reply && expected_type && !g_variant_is_of_type (reply, expected_type))
++    {
++      gchar *expected_string;
++
++      expected_string = g_variant_type_dup_string (expected_type);
++      g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
++                   "received reply '%s' is not of the expected type %s",
++                   g_variant_get_type_string (reply), expected_string);
++      g_free (expected_string);
++
++      g_variant_unref (reply);
++      reply = NULL;
++    }
++
++  return reply;
++}
++
++static void
++dconf_libdbus_1_method_call_done (DBusPendingCall *pending,
++                                  gpointer         user_data)
++{
++  DConfEngineCallHandle *handle = user_data;
++  const GVariantType *expected_type;
++  DBusMessage *message;
++  GError *error = NULL;
++  GVariant *reply;
++
++  if (pending == NULL)
++    return;
++
++  message = dbus_pending_call_steal_reply (pending);
++  dbus_pending_call_unref (pending);
++
++  expected_type = dconf_engine_call_handle_get_expected_type (handle);
++  reply = dconf_libdbus_1_interpret_result (message, expected_type, &error);
++  dbus_message_unref (message);
++
++  dconf_engine_call_handle_reply (handle, reply, error);
++
++  if (reply)
++    g_variant_unref (reply);
++  if (error)
++    g_error_free (error);
++}
++
++gboolean
++dconf_engine_dbus_call_async_func (GBusType                bus_type,
++                                   const gchar            *bus_name,
++                                   const gchar            *object_path,
++                                   const gchar            *interface_name,
++                                   const gchar            *method_name,
++                                   GVariant               *parameters,
++                                   DConfEngineCallHandle  *handle,
++                                   GError                **error)
++{
++  DBusConnection *connection;
++  DBusPendingCall *pending;
++  DBusMessage *message;
++
++  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
++  connection = dconf_libdbus_1_buses[bus_type];
++  g_assert (connection != NULL);
++
++  message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
++  dbus_connection_send_with_reply (connection, message, &pending, -1);
++  dbus_pending_call_set_notify (pending, dconf_libdbus_1_method_call_done, handle, NULL);
++  dbus_message_unref (message);
++
++  return TRUE;
++}
++
++static void
++dconf_libdbus_1_convert_error (DBusError  *dbus_error,
++                               GError    **error)
++{
++  g_set_error (error, DCONF_LIBDBUS_1_ERROR, DCONF_LIBDBUS_1_ERROR_FAILED,
++               "%s: %s", dbus_error->name, dbus_error->message);
++}
++
++GVariant *
++dconf_engine_dbus_call_sync_func (GBusType             bus_type,
++                                  const gchar         *bus_name,
++                                  const gchar         *object_path,
++                                  const gchar         *interface_name,
++                                  const gchar         *method_name,
++                                  GVariant            *parameters,
++                                  const GVariantType  *expected_type,
++                                  GError             **error)
++{
++  DBusConnection *connection;
++  DBusMessage *message;
++  DBusError dbus_error;
++  DBusMessage *result;
++  GVariant *reply;
++
++  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
++  connection = dconf_libdbus_1_buses[bus_type];
++  g_assert (connection != NULL);
++
++  dbus_error_init (&dbus_error);
++  message = dconf_libdbus_1_new_method_call (bus_name, object_path, interface_name, method_name, parameters);
++  result = dbus_connection_send_with_reply_and_block (connection, message, -1, &dbus_error);
++  dbus_message_unref (message);
++
++  if (result == NULL)
++    {
++      dconf_libdbus_1_convert_error (&dbus_error, error);
++      dbus_error_free (&dbus_error);
++      return NULL;
++    }
++
++  reply = dconf_libdbus_1_interpret_result (result, expected_type, error);
++  dbus_message_unref (result);
++
++  return reply;
++}
++
++static DBusHandlerResult
++dconf_libdbus_1_filter (DBusConnection *connection,
++                        DBusMessage    *message,
++                        gpointer        user_data)
++{
++  GBusType bus_type = GPOINTER_TO_INT (user_data);
++
++  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
++    {
++      const gchar *interface;
++
++      interface = dbus_message_get_interface (message);
++
++      if (interface && g_str_equal (interface, "ca.desrt.dconf.Writer"))
++        {
++          GVariant *parameters;
++
++          parameters = dconf_libdbus_1_get_message_body (message, NULL);
++
++          if (parameters != NULL)
++            {
++              dconf_engine_handle_dbus_signal (bus_type,
++                                               dbus_message_get_sender (message),
++                                               dbus_message_get_path (message),
++                                               dbus_message_get_member (message),
++                                               parameters);
++              g_variant_unref (parameters);
++            }
++        }
++    }
++
++  return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++}
++
++void
++dconf_libdbus_1_provide_bus (GBusType        bus_type,
++                             DBusConnection *connection)
++{
++  g_assert_cmpint (bus_type, <, G_N_ELEMENTS (dconf_libdbus_1_buses));
++
++  if (!dconf_libdbus_1_buses[bus_type])
++    {
++      dconf_libdbus_1_buses[bus_type] = dbus_connection_ref (connection);
++      dbus_connection_add_filter (connection, dconf_libdbus_1_filter, GINT_TO_POINTER (bus_type), NULL);
++    }
++}
++
++#ifndef PIC
++static gboolean
++dconf_libdbus_1_check_connection (gpointer user_data)
++{
++  DBusConnection *connection = user_data;
++
++  dbus_connection_read_write (connection, 0);
++  dbus_connection_dispatch (connection);
++
++  return G_SOURCE_CONTINUE;
++}
++
++void
++dconf_engine_dbus_init_for_testing (void)
++{
++  DBusConnection *session;
++  DBusConnection *system;
++
++  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SESSION, session = dbus_bus_get (DBUS_BUS_SESSION, NULL));
++  dconf_libdbus_1_provide_bus (G_BUS_TYPE_SYSTEM, system = dbus_bus_get (DBUS_BUS_SYSTEM, NULL));
++
++  /* "mainloop integration" */
++  g_timeout_add (1, dconf_libdbus_1_check_connection, session);
++  g_timeout_add (1, dconf_libdbus_1_check_connection, system);
++}
++#endif
+--- /dev/null
++++ b/dbus-1/dconf-libdbus-1.h
+@@ -0,0 +1,11 @@
++#ifndef __dconf_libdbus_1_h__
++#define __dconf_libdbus_1_h__
++
++#include <dbus/dbus.h>
++#include <gio/gio.h>
++
++G_GNUC_INTERNAL
++void                    dconf_libdbus_1_provide_bus                     (GBusType        bus_type,
++                                                                         DBusConnection *connection);
++
++#endif /* __dconf_libdbus_1_h__ */
+--- a/tests/meson.build
++++ b/tests/meson.build
+@@ -23,6 +23,7 @@ unit_tests = [
+   ['gvdb', 'gvdb.c', '-DSRCDIR="@0@"'.format(test_dir), glib_dep, libgvdb],
+   ['gdbus-thread', 'dbus.c', '-DDBUS_BACKEND="/gdbus/thread"', gio_unix_dep, libdconf_gdbus_thread],
+   ['gdbus-filter', 'dbus.c', '-DDBUS_BACKEND="/gdbus/filter"', gio_unix_dep, libdconf_gdbus_filter],
++  ['libdbus-1', 'dbus.c', '-DDBUS_BACKEND="/libdbus-1"', gio_unix_dep, libdconf_libdbus_1],
+   ['engine', 'engine.c', '-DSRCDIR="@0@"'.format(test_dir), [glib_dep, dl_dep, m_dep], [libdconf_engine, libdconf_common, libdconf_mock]],
+   ['client', 'client.c', '-DSRCDIR="@0@"'.format(test_dir), gio_unix_dep, [libdconf_client, libdconf_engine, libdconf_common, libdconf_mock]]
+ ]
diff --git a/SPECS/dconf.spec b/SPECS/dconf.spec
index 42aa675..d280279 100644
--- a/SPECS/dconf.spec
+++ b/SPECS/dconf.spec
@@ -1,33 +1,28 @@
 %define glib2_version 2.44.0
-%define vala_version 0.18.0
 
 Name:           dconf
-Version:        0.26.0
-Release:        3%{?dist}.1
+Version:        0.28.0
+Release:        4%{?dist}
 Summary:        A configuration system
 
-Group:          System Environment/Base
 License:        LGPLv2+ and GPLv2+ and GPLv3+
 URL:            http://live.gnome.org/dconf
-#VCS:           git:git://git.gnome.org/dconf
-Source0:        http://download.gnome.org/sources/dconf/0.22/dconf-%{version}.tar.xz
+Source0:        http://download.gnome.org/sources/dconf/0.28/dconf-%{version}.tar.xz
 
-# https://bugzilla.redhat.com/show_bug.cgi?id=1386841
-Patch0:         dconf-0.26.0-Remove-libdbus-1-support.patch
-Patch1:         dconf-0.26.0-read-flag.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=1567184
+Patch1:         dconf-0.28.0-dbus-1.patch
 
 # https://bugzilla.redhat.com/show_bug.cgi?id=1281253
 Patch2:         dconf-0.26.0-permissions.patch
 
-# https://bugzilla.redhat.com/show_bug.cgi?id=1626372
-Patch3:         dconf-0.26.0-db-mtime.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=1570569
+Patch3:         dconf-0.28.0-db-mtime.patch
 
 BuildRequires:  glib2-devel >= %{glib2_version}
-BuildRequires:  libxml2-devel
 BuildRequires:  dbus-devel
-BuildRequires:  vala-devel >= %{vala_version}
 BuildRequires:  gtk-doc
-BuildRequires:  intltool
+BuildRequires:  meson
+BuildRequires:  vala
 
 Requires:       dbus
 Requires:       glib2%{?_isa} >= %{glib2_version}
@@ -38,7 +33,6 @@ backend to the GSettings API in GLib.
 
 %package devel
 Summary: Header files and libraries for dconf development
-Group: Development/Libraries
 Requires: %{name}%{?_isa} = %{version}-%{release}
 
 %description devel
@@ -46,23 +40,17 @@ dconf development package. Contains files needed for doing software
 development using dconf.
 
 %prep
-%setup -q
-%patch0 -p1 -R -b .libdbus
-%patch1 -p1 -b .read-flag
-%patch2 -p1 -b .permissions
-%patch3 -p1 -b .mtimes
-
-autoreconf -ivf
+%autosetup -p1
 
 %build
-%configure --disable-static
-make V=1 %{?_smp_mflags}
-
+%meson -Denable-gtk-doc=true
+%meson_build
 
 %install
-make install DESTDIR=$RPM_BUILD_ROOT
+%meson_install
 
 mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/dconf/profile
+
 cat << EOF > $RPM_BUILD_ROOT%{_sysconfdir}/dconf/profile/user
 user-db:user
 system-db:local
@@ -76,14 +64,11 @@ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/dconf/db/distro.d/locks
 
 # dconf-dbus-1 was removed in dconf 0.24,
 # we keep just the library for compatibility
-rm -fv $RPM_BUILD_ROOT%{_libdir}/pkgconfig/dconf-dbus-1.pc
-rm -fv $RPM_BUILD_ROOT%{_includedir}/dconf-dbus-1/*
-rmdir -v $RPM_BUILD_ROOT%{_includedir}/dconf-dbus-1/
+rm -fv $RPM_BUILD_ROOT%{_libdir}/libdconf-dbus-1.so
 
 %post
 /sbin/ldconfig
 gio-querymodules-%{__isa_bits} %{_libdir}/gio/modules
-dconf update
 
 %postun
 /sbin/ldconfig
@@ -94,47 +79,53 @@ fi
 
 %posttrans
 glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
-
+dconf update
 
 %files
 %license COPYING
 %dir %{_sysconfdir}/dconf
 %dir %{_sysconfdir}/dconf/db
+%dir %{_sysconfdir}/dconf/db/local.d
+%dir %{_sysconfdir}/dconf/db/local.d/locks
+%dir %{_sysconfdir}/dconf/db/site.d
+%dir %{_sysconfdir}/dconf/db/site.d/locks
+%dir %{_sysconfdir}/dconf/db/distro.d
+%dir %{_sysconfdir}/dconf/db/distro.d/locks
 %dir %{_sysconfdir}/dconf/profile
 %{_libdir}/gio/modules/libdconfsettings.so
 %{_libexecdir}/dconf-service
 %{_datadir}/dbus-1/services/ca.desrt.dconf.service
 %{_bindir}/dconf
-%{_libdir}/libdconf.so.*
-%{_libdir}/libdconf-dbus-1.so.*
+%{_libdir}/libdconf.so.1*
+%{_libdir}/libdconf-dbus-1.so.0*
 %{_datadir}/bash-completion/completions/dconf
 %{_mandir}/man1/dconf-service.1.gz
 %{_mandir}/man1/dconf.1.gz
 %{_mandir}/man7/dconf.7.gz
 %config(noreplace) %{_sysconfdir}/dconf/profile/user
-%dir %{_sysconfdir}/dconf
-%dir %{_sysconfdir}/dconf/profile
-%dir %{_sysconfdir}/dconf/db
-%dir %{_sysconfdir}/dconf/db/local.d
-%dir %{_sysconfdir}/dconf/db/local.d/locks
-%dir %{_sysconfdir}/dconf/db/site.d
-%dir %{_sysconfdir}/dconf/db/site.d/locks
-%dir %{_sysconfdir}/dconf/db/distro.d
-%dir %{_sysconfdir}/dconf/db/distro.d/locks
 
 %files devel
 %{_includedir}/dconf
 %{_libdir}/libdconf.so
 %{_libdir}/pkgconfig/dconf.pc
-%{_libdir}/libdconf-dbus-1.so
+%dir %{_datadir}/gtk-doc
+%dir %{_datadir}/gtk-doc/html
 %{_datadir}/gtk-doc/html/dconf
 %{_datadir}/vala
 
 %changelog
-* Fri Sep 14 2018 Marek Kasik <mkasik@redhat.com> - 0.26.0-3
+* Wed Jul 25 2018 Marek Kasik <mkasik@redhat.com> - 0.28.0-3
 - Check mtimes of files in /etc/dconf/db/*.d/ directories
 - when running "dconf update"
-- Resolves: #1626372
+- Resolves: #1570569
+
+* Wed May 23 2018 Marek Kasik <mkasik@redhat.com> - 0.28.0-2
+- Return dconf-dbus-1 library (without devel files)
+- Related: #1567184
+
+* Tue Mar 13 2018 Kalev Lember <klember@redhat.com> - 0.28.0-1
+- Update to 0.28.0
+- Resolves: #1567184
 
 * Mon Mar  6 2017 Marek Kasik <mkasik@redhat.com> - 0.26.0-2
 - Restore permissions on updated database