diff --git a/.dconf.metadata b/.dconf.metadata
index f57b4b5..9ce0c2f 100644
--- a/.dconf.metadata
+++ b/.dconf.metadata
@@ -1 +1 @@
-4845e185a63297830c49a1889a72290337968b22 SOURCES/dconf-0.16.0.tar.xz
+d1a03938451b19a53f0d2fd09b6c737542fdd4c4 SOURCES/dconf-0.22.0.tar.xz
diff --git a/.gitignore b/.gitignore
index 14973cc..bf28c19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/dconf-0.16.0.tar.xz
+SOURCES/dconf-0.22.0.tar.xz
diff --git a/SOURCES/0001-DConfChangeset-expose-concept-of-sealing.patch b/SOURCES/0001-DConfChangeset-expose-concept-of-sealing.patch
deleted file mode 100644
index 76b6557..0000000
--- a/SOURCES/0001-DConfChangeset-expose-concept-of-sealing.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From 40f887db43dc89e546ecef9c2d2f31a61858badc Mon Sep 17 00:00:00 2001
-From: Ryan Lortie <desrt@desrt.ca>
-Date: Tue, 25 Jun 2013 14:39:26 -0400
-Subject: [PATCH 1/2] DConfChangeset: expose concept of "sealing"
-
-DConfChangeset is a partially threadsafe type.
-
-when first created, it is mutable and can only be used from one thread.
-After it is filled in, the intention is that it can be shared between
-threads as long as it isn't changed.
-
-Previously, this transition was made when dconf_changeset_describe() was
-called.  After that, it was not possible to make any more changes.
-
-Formalise and document this concept and add an explicit call for it:
-dconf_changeset_seal().
-
-https://bugzilla.gnome.org/show_bug.cgi?id=703073
----
- common/dconf-changeset.c | 49 ++++++++++++++++++++++++++++++++++++++++++------
- common/dconf-changeset.h |  2 ++
- 2 files changed, 45 insertions(+), 6 deletions(-)
-
-diff --git a/common/dconf-changeset.c b/common/dconf-changeset.c
-index d9b9f41..54be719 100644
---- a/common/dconf-changeset.c
-+++ b/common/dconf-changeset.c
-@@ -54,7 +54,8 @@
- struct _DConfChangeset
- {
-   GHashTable *table;
--  gboolean is_database;
-+  guint is_database : 1;
-+  guint is_sealed : 1;
-   gint ref_count;
- 
-   gchar *prefix;
-@@ -195,7 +196,7 @@ dconf_changeset_set (DConfChangeset *changeset,
-                      const gchar    *path,
-                      GVariant       *value)
- {
--  g_return_if_fail (changeset->prefix == NULL);
-+  g_return_if_fail (!changeset->is_sealed);
-   g_return_if_fail (dconf_is_path (path, NULL));
- 
-   /* Check if we are performing a path reset */
-@@ -366,12 +367,44 @@ dconf_changeset_string_ptr_compare (gconstpointer a_p,
-   return strcmp (*a, *b);
- }
- 
--static void
--dconf_changeset_build_description (DConfChangeset *changeset)
-+/**
-+ * dconf_changeset_seal:
-+ * @changeset: a #DConfChangeset
-+ *
-+ * Seals @changeset.
-+ *
-+ * When a #DConfChangeset is first created, it is mutable and
-+ * non-threadsafe.  Once the changeset is populated with the required
-+ * changes, it can be shared between multiple threads, but only by
-+ * making it immutable by "sealing" it.
-+ *
-+ * After the changeset is sealed, you cannot call dconf_changeset_set()
-+ * or any other functions that would modify it.  It is safe, however, to
-+ * share it between multiple threads.
-+ *
-+ * All changesets are unsealed on creation, including those that are
-+ * made by copying changesets that are sealed.
-+ * dconf_changeset_describe() will implicitly seal a changeset.
-+ *
-+ * This function is idempotent.
-+ *
-+ * Since: 0.18
-+ **/
-+void
-+dconf_changeset_seal (DConfChangeset *changeset)
- {
-   gsize prefix_length;
-   gint n_items;
- 
-+  if (changeset->is_sealed)
-+    return;
-+
-+  changeset->is_sealed = TRUE;
-+
-+  /* This function used to be called dconf_changeset_build_description()
-+   * because that's basically what sealing is...
-+   */
-+
-   n_items = g_hash_table_size (changeset->table);
- 
-   /* If there are no items then what is there to describe? */
-@@ -501,6 +534,9 @@ dconf_changeset_build_description (DConfChangeset *changeset)
-  * The @paths array is returned in an order such that dir will always
-  * come before keys contained within those dirs.
-  *
-+ * If @changeset is not already sealed then this call will implicitly
-+ * seal it.  See dconf_changeset_seal().
-+ *
-  * Returns: the number of changes (the length of @changes and @values).
-  **/
- guint
-@@ -513,8 +549,7 @@ dconf_changeset_describe (DConfChangeset       *changeset,
- 
-   n_items = g_hash_table_size (changeset->table);
- 
--  if (n_items && !changeset->prefix)
--    dconf_changeset_build_description (changeset);
-+  dconf_changeset_seal (changeset);
- 
-   if (prefix)
-     *prefix = changeset->prefix;
-@@ -664,6 +699,8 @@ dconf_changeset_change (DConfChangeset *changeset,
-   gsize prefix_len;
-   gint i;
- 
-+  g_return_if_fail (!changeset->is_sealed);
-+
-   /* Handling resets is a little bit tricky...
-    *
-    * Consider the case that we have @changeset containing a key /a/b and
-diff --git a/common/dconf-changeset.h b/common/dconf-changeset.h
-index 7228105..8a9cb48 100644
---- a/common/dconf-changeset.h
-+++ b/common/dconf-changeset.h
-@@ -70,4 +70,6 @@ void                    dconf_changeset_change                          (DConfCh
- DConfChangeset *        dconf_changeset_diff                            (DConfChangeset           *from,
-                                                                          DConfChangeset           *to);
- 
-+void                    dconf_changeset_seal                            (DConfChangeset           *changeset);
-+
- #endif /* __dconf_changeset_h__ */
--- 
-1.8.3.1
-
diff --git a/SOURCES/0002-engine-seal-changesets-on-changes.patch b/SOURCES/0002-engine-seal-changesets-on-changes.patch
deleted file mode 100644
index e1b2cb7..0000000
--- a/SOURCES/0002-engine-seal-changesets-on-changes.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From ba512dc4225a043b94ef13718f1cbe8a806f5b55 Mon Sep 17 00:00:00 2001
-From: Ryan Lortie <desrt@desrt.ca>
-Date: Tue, 25 Jun 2013 14:43:58 -0400
-Subject: [PATCH 2/2] engine: seal changesets on changes
-
-When we do change operations, make sure we seal our DConfChangeset
-before sharing it between threads.
-
-This will ensure it gets sealed in only one thread instead of being
-implicitly sealed in two different threads at the same time when each of
-them calls dconf_changeset_describe().
-
-https://bugzilla.gnome.org/show_bug.cgi?id=703073
----
- engine/dconf-engine.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
-index 446619e..7beff95 100644
---- a/engine/dconf-engine.c
-+++ b/engine/dconf-engine.c
-@@ -1035,6 +1035,8 @@ dconf_engine_change_fast (DConfEngine     *engine,
-   if (!dconf_engine_changeset_changes_only_writable_keys (engine, changeset, error))
-     return FALSE;
- 
-+  dconf_changeset_seal (changeset);
-+
-   /* Check for duplicates in the pending queue.
-    *
-    * Note: order doesn't really matter here since "similarity" is an
-@@ -1105,6 +1107,8 @@ dconf_engine_change_sync (DConfEngine     *engine,
-   if (!dconf_engine_changeset_changes_only_writable_keys (engine, changeset, error))
-     return FALSE;
- 
-+  dconf_changeset_seal (changeset);
-+
-   /* we know that we have at least one source because we checked writability */
-   reply = dconf_engine_dbus_call_sync_func (engine->sources[0]->bus_type,
-                                             engine->sources[0]->bus_name,
--- 
-1.8.3.1
-
diff --git a/SOURCES/dconf-shutdown-hang.patch b/SOURCES/dconf-shutdown-hang.patch
deleted file mode 100644
index f675c45..0000000
--- a/SOURCES/dconf-shutdown-hang.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- a/service/dconf-service.c
-+++ b/service/dconf-service.c
-@@ -39,6 +39,8 @@ typedef struct
-   DConfBlame  *blame;
-   GHashTable  *writers;
-   GArray      *subtree_ids;
-+
-+  gboolean     signalled;
- } DConfService;
- 
- G_DEFINE_TYPE (DConfService, dconf_service, G_TYPE_APPLICATION)
-@@ -48,7 +50,10 @@ dconf_service_signalled (gpointer user_data)
- {
-   DConfService *service = user_data;
- 
--  g_application_release (G_APPLICATION (service));
-+  if (!service->signalled)
-+    g_application_release (G_APPLICATION (service));
-+
-+  service->signalled = TRUE;
- 
-   return G_SOURCE_REMOVE;
- }
--- 
-1.8.5.3
-
diff --git a/SPECS/dconf.spec b/SPECS/dconf.spec
index 1f5afc6..637bfdf 100644
--- a/SPECS/dconf.spec
+++ b/SPECS/dconf.spec
@@ -1,21 +1,16 @@
-%define glib2_version 2.27.2
-%define vala_version 0.11.7
+%define glib2_version 2.39.1
+%define vala_version 0.18.0
 
 Name:           dconf
-Version:        0.16.0
-Release:        6%{?dist}
+Version:        0.22.0
+Release:        2%{?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.16/dconf-%{version}.tar.xz
-
-# upstream fixes
-Patch0:         0001-DConfChangeset-expose-concept-of-sealing.patch
-Patch1:         0002-engine-seal-changesets-on-changes.patch
-Patch2:         dconf-shutdown-hang.patch
+Source0:        http://download.gnome.org/sources/dconf/0.22/dconf-%{version}.tar.xz
 
 BuildRequires:  glib2-devel >= %{glib2_version}
 BuildRequires:  gtk3-devel
@@ -26,6 +21,7 @@ BuildRequires:  gtk-doc
 BuildRequires:  intltool
 
 Requires:       dbus
+Requires:       glib2%{?_isa} >= %{glib2_version}
 
 %description
 dconf is a low-level configuration system. Its main purpose is to provide a
@@ -51,13 +47,10 @@ dconf-editor allows you to browse and modify dconf databases.
 
 %prep
 %setup -q
-%patch0 -p1
-%patch1 -p1
-%patch2 -p1
 
 %build
 %configure --disable-static
-make %{?_smp_mflags}
+make V=1 %{?_smp_mflags}
 
 
 %install
@@ -100,6 +93,8 @@ done
 
 %postun editor
 if [ $1 -eq 0 ] ; then
+  glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
+
   for d in hicolor HighContrast ; do
     touch --no-create %{_datadir}/icons/$d &>/dev/null || :
     gtk-update-icon-cache %{_datadir}/icons/$d &>/dev/null || :
@@ -107,6 +102,8 @@ if [ $1 -eq 0 ] ; then
 fi
 
 %posttrans editor
+glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
+
 for d in hicolor HighContrast ; do
   gtk-update-icon-cache %{_datadir}/icons/$d &>/dev/null || :
 done
@@ -114,6 +111,9 @@ done
 
 %files -f dconf.lang
 %doc COPYING
+%dir %{_sysconfdir}/dconf
+%dir %{_sysconfdir}/dconf/db
+%dir %{_sysconfdir}/dconf/profile
 %{_libdir}/gio/modules/libdconfsettings.so
 %{_libexecdir}/dconf-service
 %{_datadir}/dbus-1/services/ca.desrt.dconf.service
@@ -121,7 +121,6 @@ done
 %{_libdir}/libdconf.so.*
 %{_libdir}/libdconf-dbus-1.so.*
 %{_datadir}/bash-completion/completions/dconf
-%{_datadir}/glib-2.0/schemas/ca.desrt.dconf-editor.gschema.xml
 %{_mandir}/man1/dconf-service.1.gz
 %{_mandir}/man1/dconf.1.gz
 %{_mandir}/man7/dconf.7.gz
@@ -148,15 +147,23 @@ done
 
 %files editor
 %{_bindir}/dconf-editor
-%{_datadir}/applications/dconf-editor.desktop
-%dir %{_datadir}/dconf-editor
-%{_datadir}/dconf-editor/dconf-editor.ui
-%{_datadir}/dconf-editor/dconf-editor-menu.ui
+%{_datadir}/appdata/ca.desrt.dconf-editor.appdata.xml
+%{_datadir}/applications/ca.desrt.dconf-editor.desktop
+%{_datadir}/dbus-1/services/ca.desrt.dconf-editor.service
+%{_datadir}/glib-2.0/schemas/ca.desrt.dconf-editor.gschema.xml
 %{_datadir}/icons/hicolor/*/apps/dconf-editor.png
 %{_datadir}/icons/HighContrast/*/apps/dconf-editor.png
 %{_mandir}/man1/dconf-editor.1.gz
 
 %changelog
+* Tue Mar 24 2015 Marek Kasik <mkasik@redhat.com> - 0.22.0-2
+- Remove unused patches
+- Resolves: #1174448
+
+* Fri Sep 19 2014 Kalev Lember <kalevlember@gmail.com> - 0.22.0-1
+- Update to 0.22.0
+- Resolves: #1174448
+
 * Fri Apr  4 2014 Marek Kasik <mkasik@redhat.com> - 0.16.0-6
 - Don't hang shutdown
 - Resolves: #1082994