diff --git a/Makefile.am b/Makefile.am
index e85c961..85fe93d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -23,9 +23,8 @@ desktopdir = $(datadir)/applications
 desktop_in_files = gucharmap.desktop.in.in
 desktop_DATA 	 = $(desktop_in_files:.desktop.in.in=.desktop)
 
-schemadir         = $(GCONF_SCHEMA_FILE_DIR)
-schema_in_files   = gucharmap.schemas.in
-schema_DATA       = $(schema_in_files:.schemas.in=.schemas)
+gsettings_schema	= org.gnome.gucharmap.schema.xml
+@GSETTINGS_RULES@
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = gucharmap-$(GUCHARMAP_API_PC_VERSION).pc
@@ -36,7 +35,7 @@ EXTRA_DIST = \
 	autogen.sh \
 	gtkrc.win32 \
 	gnome-doc-utils.make \
-	$(schema_in_files) \
+	$(gsettings_schema) \
 	COPYING.UNICODE \
 	$(NULL)
 
@@ -47,7 +46,6 @@ DISTCHECK_CONFIGURE_FLAGS = \
 
 CLEANFILES = \
 	$(desktop_DATA) \
-	$(schema_DATA) \
 	$(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -70,17 +68,6 @@ MAINTAINERCLEANFILES = \
 	$(srcdir)/gnome-doc-utils.make \
 	`find "$(srcdir)" -type f -name Makefile.in -print`
 
-if ENABLE_CHARMAP
-install-data-local: $(schema_DATA)
-if GCONF_SCHEMAS_INSTALL
-	if test -z "$(DESTDIR)" ; then \
-		for p in $^ ; do \
-			GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p 2>&1 > /dev/null; \
-		done \
-	fi
-endif # GCONF_SCHEMAS_INSTALL
-endif # ENABLE_CHARMAP
-
 ChangeLog:
 	$(AM_V_GEN) if test -f $(top_srcdir)/.git/HEAD; then \
 		git log --stat > $@; \
diff --git a/configure.ac b/configure.ac
index 7c58edc..2544103 100644
--- a/configure.ac
+++ b/configure.ac
@@ -56,6 +56,7 @@ AC_PROG_CC
 AC_DISABLE_STATIC
 AC_PROG_LIBTOOL
 IT_PROG_INTLTOOL([0.40.0])
+GLIB_GSETTINGS
 
 AM_PROG_CC_C_O
 
@@ -65,6 +66,9 @@ GNOME_DEBUG_CHECK
 GNOME_COMPILE_WARNINGS([maximum])
 #GNOME_MAINTAINER_MODE_DEFINES
 
+GLIB_REQUIRED=2.16.3
+GIO_REQUIRED=2.25.5
+
 # check for win32
 case "$host" in
   *-*-mingw*) os_win32="yes" ;; 
@@ -118,10 +122,9 @@ AC_SUBST([GUCHARMAP_LIBRARY_SUFFIX_U],[AS_TR_SH([$GUCHARMAP_LIBRARY_SUFFIX])])
 AM_CONDITIONAL([HAVE_GTK_2],[test "$with_gtk" = "2.0"])
 AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"])
 
-GLIB_REQUIRED=2.16.3
-
 PKG_CHECK_MODULES([GTK],[
   glib-2.0 >= $GLIB_REQUIRED
+  gio-2.0 >= $GIO_REQUIRED
   gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
 ])
 
@@ -130,24 +133,6 @@ AC_SUBST([GLIB_GENMARSHAL])
 GLIB_MKENUMS="$($PKG_CONFIG --variable=glib_mkenums glib-2.0)"
 AC_SUBST([GLIB_MKENUMS])
 
-AC_ARG_ENABLE([gconf],
-    [AS_HELP_STRING([--disable-gconf],[don't build with gconf support])],
-    [],[enable_gconf=yes])
-
-if test "$enable_gconf" = "yes"; then
-    GCONFPKGS="gconf-2.0 gthread-2.0"
-    PKG_CHECK_MODULES([GCONF],[$GCONFPKGS])
-
-    AC_DEFINE([HAVE_GCONF], [1], [Define if have gconf])
-else
-    GCONFPKGS=
-    AC_MSG_NOTICE([GCONF support disabled with --disable-gconf])
-fi  
-AC_SUBST([GCONFPKGS])
-
-AM_GCONF_SOURCE_2
-AC_PATH_PROG([GCONFTOOL],[gconftool-2],[no])
-
 AC_MSG_CHECKING([whether to build the charmap programme])
 AC_ARG_ENABLE([charmap],
   [AS_HELP_STRING([--disable-charmap],[disable building the charmap programme])],
@@ -162,9 +147,6 @@ AC_CHECK_FUNCS([bind_textdomain_codeset])
 AC_SUBST(GTK_CFLAGS)
 AC_SUBST(GTK_LIBS)
 
-AC_SUBST(GCONF_CFLAGS)
-AC_SUBST(GCONF_LIBS)
-
 AH_TEMPLATE([ENABLE_UNIHAN], [Define if you want CJK ideograph information])
 AC_ARG_ENABLE(unihan, 
               AC_HELP_STRING([--disable-unihan], 
diff --git a/gucharmap/Makefile.am b/gucharmap/Makefile.am
index 43a67d2..85e36a6 100644
--- a/gucharmap/Makefile.am
+++ b/gucharmap/Makefile.am
@@ -149,7 +149,6 @@ gucharmap_CPPFLAGS = \
 
 gucharmap_CFLAGS = \
 	$(GTK_CFLAGS)	\
-	$(GCONF_CFLAGS)	\
 	$(WARN_CFLAGS)	\
 	$(AM_CFLAGS)
 
@@ -159,7 +158,6 @@ gucharmap_LDFLAGS = \
 gucharmap_LDADD = \
 	libgucharmap@GUCHARMAP_LIBRARY_SUFFIX_U@.la	\
 	$(GTK_LIBS)	\
-	$(GCONF_LIBS)	\
 	$(INTL_LIBS)
 
 if OS_WIN32
diff --git a/gucharmap/gucharmap-settings.c b/gucharmap/gucharmap-settings.c
index 72e0858..f223925 100644
--- a/gucharmap/gucharmap-settings.c
+++ b/gucharmap/gucharmap-settings.c
@@ -27,10 +27,7 @@
 #include <gucharmap/gucharmap.h>
 #include "gucharmap-settings.h"
 
-#ifdef HAVE_GCONF
-#include <gconf/gconf-client.h>
-static GConfClient *client;
-#endif
+static GSettings *settings;
 
 /* The last unicode character we support */
 /* keep in sync with gucharmap-private.h! */
@@ -60,34 +57,29 @@ get_default_snap_pow2 (void)
   return FALSE;
 }
 
-#ifdef HAVE_GCONF
-
 void
 gucharmap_settings_initialize (void)
 {
-  client = gconf_client_get_default ();
+  settings = g_settings_new ();
 
-  if (client == NULL) {
-    g_message(_("GConf could not be initialized."));
+  if (settings == NULL) {
+    g_message(_("GSettings could not be initialized."));
     return;
   }
 
-  gconf_client_add_dir (client, GCONF_PREFIX,
-                        GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
 }
 
 void
 gucharmap_settings_shutdown (void)
 {
-  gconf_client_remove_dir (client, GCONF_PREFIX, NULL);
-  g_object_unref(client);
-  client = NULL;
+  g_object_unref(settings);
+  settings = NULL;
 }
 
 static gboolean
 gucharmap_settings_initialized (void) 
 {
-  return (client != NULL);
+  return (settings != NULL);
 }
 
 GucharmapChaptersMode
@@ -96,7 +88,7 @@ gucharmap_settings_get_chapters_mode (void)
   GucharmapChaptersMode ret;
   gchar *mode;
   
-  mode = gconf_client_get_string (client, GCONF_PREFIX"/chapters_mode", NULL);
+  mode = g_settings_get_string (settings, "chapters_mode");
   if (mode == NULL)
     return get_default_chapters_mode ();
 
@@ -117,11 +109,11 @@ gucharmap_settings_set_chapters_mode (GucharmapChaptersMode mode)
   switch (mode)
     {
       case GUCHARMAP_CHAPTERS_SCRIPT:
-        gconf_client_set_string (client, GCONF_PREFIX"/chapters_mode", "script", NULL);
+        g_settings_set_string (settings, "chapters_mode", "script");
       break;
 
       case GUCHARMAP_CHAPTERS_BLOCK:
-        gconf_client_set_string (client, GCONF_PREFIX"/chapters_mode", "block", NULL);
+        g_settings_set_string (settings, "chapters_mode", "block");
       break;
     }
 }
@@ -135,7 +127,7 @@ gucharmap_settings_get_font (void)
       return get_default_font ();
   }
   
-  font = gconf_client_get_string (client, GCONF_PREFIX"/font", NULL);
+  font = g_settings_get_string (settings, "font");
   if (!font || !font[0]) {
     g_free (font);
     return NULL;
@@ -151,7 +143,7 @@ gucharmap_settings_set_font (gchar *fontname)
       return;
   }
   
-  gconf_client_set_string (client, GCONF_PREFIX"/font", fontname, NULL);
+  g_settings_set_string (settings, "font", fontname);
 }
 
 gunichar
@@ -165,7 +157,7 @@ gucharmap_settings_get_last_char (void)
       return gucharmap_unicode_get_locale_character ();
   }
 
-  str = gconf_client_get_string (client, GCONF_PREFIX"/last_char", NULL);
+  str = g_settings_get_string (settings, "last_char");
   if (!str || !g_str_has_prefix (str, "U+")) {
     g_free (str);
     return gucharmap_unicode_get_locale_character  ();
@@ -195,7 +187,7 @@ gucharmap_settings_set_last_char (gunichar wc)
   
   g_snprintf (str, sizeof (str), "U+%04X", wc);
   str[sizeof (str) - 1] = '\0';
-  gconf_client_set_string (client, GCONF_PREFIX"/last_char", str, NULL);
+  g_settings_set_string (settings, "last_char", str);
 }
 
 gboolean
@@ -205,7 +197,7 @@ gucharmap_settings_get_snap_pow2 (void)
       return get_default_snap_pow2 ();
   }
   
-  return gconf_client_get_bool (client, GCONF_PREFIX"/snap_cols_pow2", NULL);
+  return g_settings_get_boolean (settings, "snap_cols_pow2");
 }
 
 void
@@ -215,7 +207,7 @@ gucharmap_settings_set_snap_pow2 (gboolean snap_pow2)
       return;
   }
   
-  gconf_client_set_bool (client, GCONF_PREFIX"/snap_cols_pow2", snap_pow2, NULL);
+  g_settings_set_boolean (settings, "snap_cols_pow2", snap_pow2);
 }
 
 #else /* HAVE_GCONF */
@@ -286,7 +278,6 @@ gucharmap_settings_set_snap_pow2 (gboolean snap_pow2)
   return;
 }
 
-#endif /* HAVE_GCONF */
 
 #ifdef HAVE_GCONF
 
@@ -301,8 +292,8 @@ typedef struct {
 static gboolean
 window_state_timeout_cb (WindowState *state)
 {
-  gconf_client_set_int (client, GCONF_PREFIX "/width", state->width, NULL);
-  gconf_client_set_int (client, GCONF_PREFIX "/height", state->height, NULL);
+  g_settings_set_int (settings, "width", state->width);
+  g_settings_set_int (settings, "height", state->height);
 
   state->timeout_id = 0;
   return FALSE;
@@ -348,11 +339,11 @@ window_state_event_cb (GtkWidget *widget,
 {
   if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) {
     state->is_maximised = (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
-    gconf_client_set_bool (client, GCONF_PREFIX "/maximized", state->is_maximised, NULL);
+    g_settings_set_boolean (settings, "maximized", state->is_maximised);
   }
   if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
     state->is_fullscreen = (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) != 0;
-    gconf_client_set_bool (client, GCONF_PREFIX "/fullscreen", state->is_fullscreen, NULL);
+    g_settings_set_boolean (settings, "fullscreen", state->is_fullscreen);
   }
 
   return FALSE;
@@ -392,10 +383,10 @@ gucharmap_settings_add_window (GtkWindow *window)
   g_signal_connect (window, "window-state-event",
                     G_CALLBACK (window_state_event_cb), state);
 
-  maximised = gconf_client_get_bool (client, GCONF_PREFIX "/maximized", NULL);
-  fullscreen = gconf_client_get_bool (client, GCONF_PREFIX "/fullscreen", NULL);
-  width = gconf_client_get_int (client, GCONF_PREFIX "/width", NULL);
-  height = gconf_client_get_int (client, GCONF_PREFIX "/height", NULL);
+  maximised = g_settings_get_boolean (settings, "maximized");
+  fullscreen = g_settings_get_boolean (settings, "fullscreen");
+  width = g_settings_get_int (settings, "width");
+  height = g_settings_get_int (settings, "height");
 
   if (width > 0 && height > 0) {
     gtk_window_set_default_size (GTK_WINDOW (window), width, height);
