[epiphany] gsettings: port epiphany to gsettings



commit 5df7af9e3041102a5f5601d60faa11c38b48de75
Author: Diego Escalante Urrelo <descalante igalia com>
Date:   Sun Jul 25 01:59:55 2010 +0200

    gsettings: port epiphany to gsettings
    
    Adds our own schemas, a migration file and removes old gconf API and files.
    
    Bug #624485

 configure.ac                             |   21 +-
 data/Makefile.am                         |   37 +-
 data/epiphany-lockdown.schemas.in        |  119 ---
 data/epiphany.convert                    |   56 ++
 data/epiphany.schemas.in                 |  536 --------------
 data/glade/prefs-dialog.ui               |   17 +-
 data/org.gnome.epiphany.gschema.xml.in   |  237 ++++++
 data/ui/epiphany-bookmark-editor-ui.xml  |    2 +-
 embed/downloader-view.c                  |   44 +-
 embed/ephy-embed-prefs.c                 |  353 ++++------
 embed/ephy-embed-prefs.h                 |   23 -
 embed/ephy-embed-single.c                |    7 +-
 embed/ephy-embed.c                       |   10 +-
 embed/ephy-encodings.c                   |   42 +-
 embed/ephy-history.c                     |   23 +-
 embed/ephy-web-view.c                    |   14 +-
 lib/Makefile.am                          |    4 +-
 lib/eel-gconf-extensions.c               |  724 -------------------
 lib/eel-gconf-extensions.h               |   83 ---
 lib/ephy-dialog.c                        | 1144 +-----------------------------
 lib/ephy-dialog.h                        |   38 -
 lib/ephy-file-chooser.c                  |   12 +-
 lib/ephy-file-helpers.c                  |    5 +-
 lib/ephy-prefs.h                         |  126 +++--
 lib/ephy-settings.c                      |   65 ++
 lib/ephy-settings.h                      |   44 ++
 po/POTFILES.in                           |    4 +-
 src/bookmarks/ephy-bookmark-properties.c |    6 +-
 src/bookmarks/ephy-bookmarks-editor.c    |  126 +---
 src/bookmarks/ephy-bookmarks-import.c    |   18 +-
 src/bookmarks/ephy-bookmarks-ui.c        |    7 +-
 src/bookmarks/ephy-bookmarks.c           |   31 +-
 src/ephy-activation.c                    |    5 +-
 src/ephy-encoding-dialog.c               |   42 +-
 src/ephy-extensions-manager.c            |  181 +++---
 src/ephy-history-window.c                |  256 ++------
 src/ephy-home-action.c                   |    5 +-
 src/ephy-lockdown.c                      |  378 +++++------
 src/ephy-main.c                          |   12 +-
 src/ephy-net-monitor.c                   |   46 +--
 src/ephy-notebook.c                      |   24 +-
 src/ephy-session.c                       |   10 +-
 src/ephy-shell.c                         |   11 +-
 src/ephy-toolbar-editor.c                |   14 +-
 src/ephy-toolbars-model.c                |   24 +-
 src/ephy-window.c                        |   89 ++--
 src/pdm-dialog.c                         |   77 +--
 src/popup-commands.c                     |    2 +-
 src/prefs-dialog.c                       |  548 ++++++++-------
 src/window-commands.c                    |   12 +-
 50 files changed, 1564 insertions(+), 4150 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 006c540..64caf2b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,8 @@ AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums])
 
 IT_PROG_INTLTOOL([0.40.0])
 
+GLIB_GSETTINGS
+
 PKG_PROG_PKG_CONFIG
 
 GNOME_DEBUG_CHECK
@@ -87,10 +89,10 @@ DEPRECATION_FLAGS=
 if test "$enable_maintainer_mode" = "yes"; then
 	AC_DEFINE([MAINTAINER_MODE],[1],[Define to enable 'maintainer-only' behaviour])
 	enable_debug=yes
-	DEPRECATION_FLAGS="-DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGCONF_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE"
+	DEPRECATION_FLAGS="-DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE"
 fi
 
-GLIB_REQUIRED=2.19.7
+GLIB_REQUIRED=2.25.13
 GTK_REQUIRED=2.91.1
 LIBXML_REQUIRED=2.6.12
 LIBXSLT_REQUIRED=1.1.7
@@ -100,6 +102,7 @@ DBUS_GLIB_REQUIRED=0.35
 WEBKIT_GTK_REQUIRED=1.3.2
 LIBSOUP_GNOME_REQUIRED=2.29.91
 GNOME_KEYRING_REQUIRED=2.26.0
+GSETTINGS_DESKTOP_SCHEMAS_REQUIRED=0.0.2
 
 PKG_CHECK_EXISTS([libnotify >= $LIBNOTIFY_REQUIRED],[have_libnotify=yes],[have_libnotify=no])
 
@@ -131,12 +134,12 @@ PKG_CHECK_MODULES([DEPENDENCIES], [
 		  sm
 		  libxml-2.0 >= $LIBXML_REQUIRED
 		  libxslt >= $LIBXSLT_REQUIRED
-		  gconf-2.0
 		  libstartup-notification-1.0 >= $LIBSTARTUP_NOTIFICATION_REQUIRED
 		  $LIBNOTIFY_PACKAGE
 		  webkitgtk-3.0 >= $WEBKIT_GTK_REQUIRED
 		  libsoup-gnome-2.4 >= $LIBSOUP_GNOME_REQUIRED
 		  gnome-keyring-1 >= $GNOME_KEYRING_REQUIRED
+                  gsettings-desktop-schemas >= $GSETTINGS_DESKTOP_SCHEMAS_REQUIRED
 		  ])
 
 # ****
@@ -151,18 +154,6 @@ if test "$DBUS_BINDING_TOOL" = "no"; then
 	AC_MSG_ERROR([dbus-binding-tool not found])
 fi
 
-# *****
-# GConf
-# *****
-
-AM_GCONF_SOURCE_2
-
-AC_PATH_PROG([GCONFTOOL], [gconftool-2], [no])
-
-if test "$GCONFTOOL" = "no"; then
-	AC_MSG_ERROR([gconftool-2 not found])
-fi
-
 # ******************
 # Portability checks
 # ******************
diff --git a/data/Makefile.am b/data/Makefile.am
index 87f8c1d..e6ab83e 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -2,16 +2,21 @@ SUBDIRS = art glade icons ui
 
 @INTLTOOL_SERVER_RULE@
 @INTLTOOL_DESKTOP_RULE@
- INTLTOOL_SCHEMAS_RULE@
- INTLTOOL_XML_RULE@
 
 desktop_in_files = epiphany.desktop.in.in bme.desktop.in.in
 desktopdir = $(datadir)/applications
 desktop_DATA = $(desktop_in_files:.desktop.in.in=.desktop)
 
-schemadir = $(GCONF_SCHEMA_FILE_DIR)
-schema_in_files = epiphany.schemas.in epiphany-lockdown.schemas.in
-schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+convertdir = $(datarootdir)/GConf/gsettings
+convert_DATA = epiphany.convert
+
+gsettings_ENUM_NAMESPACE = org.gnome.Epiphany
+gsettings_ENUM_FILES = $(top_srcdir)/lib/ephy-prefs.h
+
+gsettings_files = org.gnome.epiphany.gschema.xml.in
+gsettings_SCHEMAS = $(gsettings_files:.xml.in=.xml)
+ INTLTOOL_XML_NOMERGE_RULE@
+ GSETTINGS_RULES@
 
 aboutdir = $(pkgdatadir)
 about_DATA = epiphany.xhtml
@@ -53,19 +58,9 @@ $(default_bookmarks_DATA): $(default_bookmarks_in_files) Makefile $(INTLTOOL_MER
 	sed -e "s|\ pkgdatadir\@|$(pkgdatadir)|g" $  tmp > $@ || rm -f $  tmp
 	rm -f $  tmp
 
-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
-
 EXTRA_DIST = \
 	$(aboutdialog_DATA)		\
 	$(service_in_files)		\
-	$(schema_in_files)		\
 	$(desktop_in_files)		\
 	$(about_DATA)			\
 	$(mimepermission_DATA)		\
@@ -74,12 +69,14 @@ EXTRA_DIST = \
 	$(service_DATA)			\
 	$(m4data_DATA)			\
 	$(default_bookmarks_in_files)	\
+	$(gsettings_files)		\
+	$(convert_DATA)			\
 	epiphany-service.xml		\
 	check-mime.py
 
 DISTCLEANFILES = \
-	$(service_DATA)		\
-	$(schema_in_files:.schemas.in=.schemas)	\
-	$(pkgconfig_DATA)	\
-	$(desktop_DATA)		\
-	$(default_bookmarks_DATA)
+	$(service_DATA)			\
+	$(pkgconfig_DATA)		\
+	$(desktop_DATA)			\
+	$(default_bookmarks_DATA)	\
+	$(gsettings_SCHEMAS)
diff --git a/data/epiphany.convert b/data/epiphany.convert
new file mode 100644
index 0000000..c938c76
--- /dev/null
+++ b/data/epiphany.convert
@@ -0,0 +1,56 @@
+[org.gnome.Epiphany]
+homepage-url = /apps/epiphany/general/homepage
+user-agent = /apps/epiphany/general/user_agent
+cache-size = /apps/epiphany/web/cache_size
+new-windows-in-tabs = /apps/epiphany/general/open_new_windows_in_tab
+automatic-downloads = /apps/epiphany/general/automatic_downloads
+warn-on-close-unsubmitted-data = /apps/epiphany/dialogs/warn_on_close_unsubmitted_data
+middle-click-opens-url = /apps/epiphany/general/middle_click_open_url
+remember-passwords = /apps/epiphany/general/remember_passwords
+keyword-search-url = /apps/epiphany/general/url_search
+managed-network = /apps/epiphany/general/managed_network
+enable-smooth-scrolling = /apps/epiphany/web/smooth_scroll
+enable-web-inspector = /apps/epiphany/web/inspector_enabled
+enable-caret-browsing = /apps/epiphany/web/browse_with_caret
+enabled-extensions = /apps/epiphany/general/active_extensions
+
+[org.gnome.Epiphany.ui]
+always-show-tabs-bar = /apps/epiphany/general/always_show_tabs_bar
+show-toolbars = /apps/epiphany/general/show_toolbars
+show-bookmarks-bar = /apps/epiphany/general/show_bookmarks_bar
+toolbar-style = /apps/epiphany/general/toolbar_style
+downloads-hidden = /apps/epiphany/dialogs/downloads_hidden
+
+[org.gnome.Epiphany.web]
+min-font-size = /apps/epiphany/web/minimum_font_size
+language = /apps/epiphany/web/language
+use-own-fonts = /apps/epiphany/web/use_own_fonts
+use-own-colors = /apps/epiphany/web/use_own_colors
+enable-user-css = /apps/epiphany/web/user_css_enabled
+enable-popups = /apps/epiphany/web/allow_popups
+enable-plugins = /apps/epiphany/web/plugins_enabled
+enable-javascript = /apps/epiphany/web/javascript_enabled
+image-animation-mode = /apps/epiphany/web/image_animation
+default-encoding = /apps/epiphany/web/default_encoding
+
+[org.gnome.Epiphany.state]
+save-dir = /apps/epiphany/directories/save
+save-image-dir = /apps/epiphany/directories/saveimage
+open-dir = /apps/epiphany/directories/open
+download-dir = /apps/epiphany/directories/downloads_folder
+upload-dir = /apps/epiphany/directories/upload
+recent-encodings =/apps/epiphany/general/recent_encodings
+
+[org.gnome.Epiphany.lockdown]
+disable-fullscreen = /apps/epiphany/lockdown/fullscreen
+disable-arbitrary-url = /apps/epiphany/lockdown/disable_arbitrary_url
+disable-bookmark-editing = /apps/epiphany/lockdown/disable_bookmark_editing
+disable-toolbar-editing = /apps/epiphany/lockdown/disable_toolbar_editing
+disable-history = /apps/epiphany/lockdown/disable_history
+disable-save-to-disk = /desktop/gnome/lockdown/disable_save_to_disk
+disable-printing = /desktop/gnome/lockdown/disable_printing
+disable-print-setup = /desktop/gnome/lockdown/disable_print_setup
+disable-command-line = /desktop/gnome/lockdown/disable_command_line
+disable-quit = /apps/epiphany/lockdown/disable_quit
+disable-javascript-chrome = /apps/epiphany/lockdown/disable_javascript_chrome
+disable-menubar = /apps/epiphany/lockdown/hide_menubar
diff --git a/data/glade/prefs-dialog.ui b/data/glade/prefs-dialog.ui
index 81c2478..32a9e13 100644
--- a/data/glade/prefs-dialog.ui
+++ b/data/glade/prefs-dialog.ui
@@ -555,8 +555,9 @@
                             <property name="visible">True</property>
                             <property name="spacing">6</property>
                             <child>
-                              <object class="GtkRadioButton" id="cookies_radiobutton">
+                              <object class="GtkRadioButton" id="cookies_always_radiobutton">
                                 <property name="label" translatable="yes">_Always accept</property>
+                                <property name="name">always</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
@@ -570,14 +571,15 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkRadioButton" id="radiobutton58">
+                              <object class="GtkRadioButton" id="cookies_no_third_party_radiobutton">
                                 <property name="label" translatable="yes">Only _from sites you visit</property>
+                                <property name="name">no-third-party</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="draw_indicator">True</property>
-                                <property name="group">cookies_radiobutton</property>
+                                <property name="group">cookies_always_radiobutton</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
@@ -605,14 +607,15 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkRadioButton" id="radiobutton59">
+                              <object class="GtkRadioButton" id="cookies_never_radiobutton">
                                 <property name="label" translatable="yes">_Never accept</property>
+                                <property name="name">never</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="draw_indicator">True</property>
-                                <property name="group">cookies_radiobutton</property>
+                                <property name="group">cookies_always_radiobutton</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
@@ -707,7 +710,7 @@
                                 <property name="visible">True</property>
                                 <property name="label" translatable="yes">_Disk space:</property>
                                 <property name="use_underline">True</property>
-                                <property name="mnemonic_widget">disk_cache_spin</property>
+                                <property name="mnemonic_widget">disk_cache_spinbutton</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
@@ -720,7 +723,7 @@
                                 <property name="visible">True</property>
                                 <property name="spacing">6</property>
                                 <child>
-                                  <object class="GtkSpinButton" id="disk_cache_spin">
+                                  <object class="GtkSpinButton" id="disk_cache_spinbutton">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
                                     <property name="adjustment">adjustment2</property>
diff --git a/data/org.gnome.epiphany.gschema.xml.in b/data/org.gnome.epiphany.gschema.xml.in
new file mode 100644
index 0000000..6bc4089
--- /dev/null
+++ b/data/org.gnome.epiphany.gschema.xml.in
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist>
+	<schema path="/apps/epiphany/" id="org.gnome.Epiphany">
+		<child schema="org.gnome.Epiphany.ui" name="ui"/>
+		<child schema="org.gnome.Epiphany.web" name="web"/>
+		<child schema="org.gnome.Epiphany.state" name="state"/>
+		<child schema="org.gnome.Epiphany.lockdown" name="lockdown"/>
+		<key type="b" name="enable-caret-browsing">
+			<default>false</default>
+			<summary>Browse with caret</summary>
+		</key>
+		<key type="b" name="enable-web-inspector">
+			<default>false</default>
+			<summary>Enable Web Inspector</summary>
+		</key>
+		<key type="s" name="homepage-url">
+			<default>'http://www.google.com'</default>
+			<summary>Home page</summary>
+			<description>Address of the user's home page.</description>
+		</key>
+		<key type="s" name="keyword-search-url">
+			<default>'http://www.google.com/search?q=%s&amp;ie=UTF-8&amp;oe=UTF-8'
+			</default>
+			<summary>URL Search</summary>
+			<description>Search string for keywords entered in the URL bar.</description>
+		</key>
+		<key type="s" name="user-agent">
+			<default>''</default>
+			<summary>User agent</summary>
+			<description>String that will be used as user agent, to identify the browser to the web servers.</description>
+		</key>
+		<key type="b" name="automatic-downloads">
+			<default>true</default>
+			<summary>Automatic downloads</summary>
+			<description>When files cannot be opened by the browser they are automatically downloaded to the download folder and opened with the appropriate application.</description>
+		</key>
+		<key type="b" name="middle-click-opens-url">
+			<default>false</default>
+			<summary>Middle click to open the web page pointed to by the currently selected text</summary>
+			<description>Middle clicking on the main view pane will open the web page pointed to by the currently selected text.</description>
+		</key>
+		<key type="b" name="new-windows-in-tabs">
+			<default>false</default>
+			<summary>Force new windows to be opened in tabs</summary>
+			<description>Force new window requests to be opened in tabs instead of using a new window.</description>
+		</key>
+		<key type="b" name="remember-passwords">
+			<default>true</default>
+			<summary>Remember passwords</summary>
+			<description>Whether to store and prefill passwords in web sites.</description>
+		</key>
+		<key type="b" name="managed-network">
+			<default>true</default>
+			<summary>Automatically manage offline status with NetworkManager</summary>
+		</key>
+		<key type="b" name="warn-on-close-unsubmitted-data">
+			<default>true</default>
+		</key>
+		<key type="b" name="enable-smooth-scrolling">
+			<default>false</default>
+			<summary>Enable smooth scrolling</summary>
+		</key>
+		<key type="as" name="enabled-extensions">
+			<default>['extensions-manager-ui' ]</default>
+			<summary>Active extensions</summary>
+			<description>Lists the active extensions.</description>
+		</key>
+	</schema>
+	<schema path="/apps/epiphany/ui/" id="org.gnome.Epiphany.ui">
+		<key type="b" name="show-toolbars">
+			<default>true</default>
+			<summary>Show toolbars by default</summary>
+		</key>
+		<key type="b" name="show-bookmarks-bar">
+			<default>false</default>
+			<summary>Show bookmarks bar by default</summary>
+		</key>
+		<key name="toolbar-style" enum="org.gnome.Epiphany.EphyPrefsUIToolbarStyle">
+			<default>'both-horiz'</default>
+			<summary>Toolbar style</summary>
+			<description>Toolbar style. Allowed values are "" (use GNOME default style), "both" (text and icons), "both-horiz" (text besides icons), "icons", and "text".</description>
+		</key>
+		<key type="b" name="always-show-tabs-bar">
+			<default>false</default>
+			<summary>Always show the tab bar</summary>
+			<description>Show the tab bar also when there is only one tab open.</description>
+		</key>
+		<key type="b" name="downloads-hidden">
+			<default>false</default>
+			<summary>Visibility of the downloads window</summary>
+			<description>Hide or show the downloads window. When hidden, a notification will be shown when new downloads are started.</description>
+		</key>
+	</schema>
+	<schema path="/apps/epiphany/web/" id="org.gnome.Epiphany.web">
+		<key type="i" name="min-font-size">
+			<default>7</default>
+			<summary>Minimum font size</summary>
+		</key>
+		<key type="b" name="use-own-colors">
+			<default>false</default>
+			<summary>Use own colors</summary>
+			<description>Use your own colors instead of the colors the page requests.</description>
+		</key>
+		<key type="b" name="use-own-fonts">
+			<default>false</default>
+			<summary>Use own fonts</summary>
+			<description>Use your own fonts instead of the fonts the page requests.</description>
+		</key>
+		<key type="b" name="enable-user-css">
+			<default>false</default>
+			<summary>Use a custom CSS</summary>
+			<description>Use a custom CSS file to modify websites own CSS.</description>
+		</key>
+		<key type="s" name="default-encoding">
+			<default>'UTF-8'</default>
+			<summary>Default encoding</summary>
+			<description>Default encoding. Accepted values are the ones WebKitGTK+ can understand.</description>
+		</key>
+		<key type="i" name="cache-size">
+			<default>50</default>
+			<summary>Size of disk cache</summary>
+			<description>Size of disk cache, in MB.</description>
+		</key>
+		<key type="as" name="language">
+			<default>[]</default>
+			<summary>Languages</summary>
+			<description>Preferred languages, two letter codes.</description>
+		</key>
+		<key name="cookies-policy" enum="org.gnome.Epiphany.EphyPrefsWebCookiesPolicy">
+			<default>'no-third-party'</default>
+			<summary>Cookie accept</summary>
+			<description>Where to accept cookies from. Possible values are "anywhere", "current site" and "nowhere".</description>
+		</key>
+		<key type="s" name="image-animation-mode">
+			<default>'normal'</default>
+			<summary>Image animation mode</summary>
+			<description>How to present animated images. Possible values are "normal", "once" and "disabled".</description>
+		</key>
+		<key type="b" name="enable-popups">
+			<default>true</default>
+			<summary>Allow popups</summary>
+			<description>Allow sites to open new windows using JavaScript (if JavaScript is enabled).</description>
+		</key>
+		<key type="b" name="enable-plugins">
+			<default>true</default>
+			<summary>Enable Plugins</summary>
+		</key>
+		<key type="b" name="enable-javascript">
+			<default>true</default>
+			<summary>Enable JavaScript</summary>
+		</key>
+	</schema>
+	<schema path="/apps/epiphany/state/" id="org.gnome.Epiphany.state">
+		<key type="s" name="open-dir">
+			<default>'~'</default>
+		</key>
+		<key type="s" name="save-dir">
+			<default>'~'</default>
+		</key>
+		<key type="s" name="save-image-dir">
+			<default>'~'</default>
+		</key>
+		<key type="s" name="upload-dir">
+			<default>'~'</default>
+		</key>
+		<key type="s" name="download-dir">
+			<default>'Downloads'</default>
+			<summary>The downloads folder</summary>
+			<description>The path of the folder where to download files to; or "Downloads" to use the default downloads folder, or "Desktop" to use the desktop folder.</description>
+		</key>
+		<key type="as" name="recent-encodings">
+			<default>['' ]</default>
+		</key>
+		<key type="i" name="history-date-filter">
+			<default>1</default>
+			<summary>History pages time range</summary>
+		</key>
+		<key type="b" name="history-view-title">
+			<default>true</default>
+			<summary>Whether to show the title column in the history window.</summary>
+		</key>
+		<key type="b" name="history-view-address">
+			<default>true</default>
+			<summary>Whether to show the address column in the history window.</summary>
+		</key>
+		<key type="b" name="history-view-date">
+			<default>false</default>
+			<summary>Whether to show the date-time column in the history window.</summary>
+		</key>
+		<key type="b" name="bookmarks-view-title">
+			<default>true</default>
+			<summary>Whether to show the title column in the bookmarks window.</summary>
+		</key>
+		<key type="b" name="bookmarks-view-address">
+			<default>false</default>
+			<summary>Whether to show the address column in the bookmarks window.</summary>
+		</key>
+	</schema>
+	<schema path="/apps/epiphany/lockdown/" id="org.gnome.Epiphany.lockdown">
+		<key type="b" name="disable-fullscreen">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-arbitrary-url">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-bookmark-editing">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-toolbar-editing">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-history">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-save-to-disk">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-printing">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-print-setup">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-command-line">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-quit">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-javascript-chrome">
+			<default>false</default>
+		</key>
+		<key type="b" name="disable-menubar">
+			<default>false</default>
+		</key>
+	</schema>
+</schemalist>
diff --git a/data/ui/epiphany-bookmark-editor-ui.xml b/data/ui/epiphany-bookmark-editor-ui.xml
index 7475a79..ac4ae96 100644
--- a/data/ui/epiphany-bookmark-editor-ui.xml
+++ b/data/ui/epiphany-bookmark-editor-ui.xml
@@ -29,7 +29,7 @@
 
 <menu name="ViewMenu" action="View">
 	<menuitem action="ViewTitle"/>
-	<menuitem action="ViewTitleAddress"/>
+	<menuitem action="ViewAddress"/>
 </menu>
 
 <menu name="HelpMenu" action="Help">
diff --git a/embed/downloader-view.c b/embed/downloader-view.c
index e62064a..698a0fe 100644
--- a/embed/downloader-view.c
+++ b/embed/downloader-view.c
@@ -28,7 +28,7 @@
 #include "ephy-gui.h"
 #include "ephy-debug.h"
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
+#include "ephy-settings.h"
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -76,25 +76,6 @@ struct _DownloaderViewPrivate
 
 enum
 {
-	PROP_WINDOW,
-	PROP_TREEVIEW,
-	PROP_PAUSE_BUTTON,
-	PROP_ABORT_BUTTON,
-};
-
-static const
-EphyDialogProperty properties [] =
-{
-	{ "download_manager_dialog",	NULL, PT_NORMAL, 0 },
-	{ "clist",			NULL, PT_NORMAL, 0 },
-	{ "pause_button",		NULL, PT_NORMAL, 0 },
-	{ "abort_button",		NULL, PT_NORMAL, 0 },
-
-	{ NULL }
-};
-
-enum
-{
 	RESPONSE_PAUSE = 1,
 	RESPONSE_STOP = 2
 };
@@ -146,12 +127,14 @@ show_downloader_cb (DownloaderView *dv)
 	if (!gtk_window_has_toplevel_focus (GTK_WINDOW (dv->priv->window)))
 	{
 		ephy_dialog_show (EPHY_DIALOG (dv));
-		eel_gconf_set_boolean (CONF_DOWNLOADS_HIDDEN, FALSE);
+		g_settings_set_boolean (EPHY_SETTINGS_UI,
+					EPHY_PREFS_UI_DOWNLOADS_HIDDEN, FALSE);
 	}
 	else
 	{
 		ephy_dialog_hide (EPHY_DIALOG (dv));
-		eel_gconf_set_boolean (CONF_DOWNLOADS_HIDDEN, TRUE);
+		g_settings_set_boolean (EPHY_SETTINGS_UI,
+					EPHY_PREFS_UI_DOWNLOADS_HIDDEN, TRUE);
 	}
 }
 
@@ -752,7 +735,8 @@ downloader_view_add_download (DownloaderView *dv,
 		return;
 	}
 	
-	if (eel_gconf_get_boolean (CONF_DOWNLOADS_HIDDEN) && !visible)
+	if (g_settings_get_boolean (EPHY_SETTINGS_UI,
+				    EPHY_PREFS_UI_DOWNLOADS_HIDDEN) && !visible)
 	{
 #ifdef HAVE_LIBNOTIFY
 		char *name;
@@ -864,19 +848,17 @@ downloader_view_build_ui (DownloaderView *dv)
 	GtkTreeSelection *selection;
 
 	ephy_dialog_construct (d,
-			       properties,
 			       ephy_file ("epiphany.ui"),
 			       "download_manager_dialog",
 			       NULL);
 
 	/* lookup needed widgets */
-	ephy_dialog_get_controls
-		(d,
-		 properties[PROP_WINDOW].id, &priv->window,
-		 properties[PROP_TREEVIEW].id, &priv->treeview,
-		 properties[PROP_PAUSE_BUTTON].id, &priv->pause_button,
-		 properties[PROP_ABORT_BUTTON].id, &priv->abort_button,
-		 NULL);
+	ephy_dialog_get_controls (d,
+				  "download_manager_dialog", &priv->window,
+				  "clist", &priv->treeview,
+				  "pause_button", &priv->pause_button,
+				  "abort_button", &priv->abort_button,
+				  NULL);
 
 	g_signal_connect (priv->window, "response",
 			  G_CALLBACK (download_dialog_response_cb), dv);
diff --git a/embed/ephy-embed-prefs.c b/embed/ephy-embed-prefs.c
index b39238b..2b43f69 100644
--- a/embed/ephy-embed-prefs.c
+++ b/embed/ephy-embed-prefs.c
@@ -1,4 +1,5 @@
 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/* vim: set sw=2 ts=2 sts=2 et: */
 /*  Copyright © 2008 Xan Lopez <xan gnome org>
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -22,105 +23,34 @@
 #include <glib.h>
 #include <webkit/webkit.h>
 
-#include "eel-gconf-extensions.h"
 #include "ephy-embed-prefs.h"
+#include "ephy-embed-shell.h"
 #include "ephy-embed-utils.h"
 #include "ephy-file-helpers.h"
 #include "ephy-langs.h"
+#include "ephy-prefs.h"
+#include "ephy-settings.h"
 
 typedef struct
 {
-  char *gconf_key;
+  char *schema;
+  char *key;
   char *webkit_pref;
-  GConfClientNotifyFunc func;
-  guint cnxn_id;
+  GCallback callback;
 } PrefData;
 
-static WebKitWebSettings *settings = NULL;
-static guint *connections = NULL;
+static WebKitWebSettings *webkit_settings = NULL;
 
 static void
-webkit_pref_callback_int (GConfClient *client,
-                          guint cnxn_id,
-                          GConfEntry *entry,
-                          gpointer data)
-{
-  GConfValue *gcvalue;
-  gint value = 0;
-  char *webkit_pref = data;
-
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_INT) {
-      value = gconf_value_get_int (gcvalue);
-      value = MAX (value, 0);
-  }
-
-  g_object_set (settings, webkit_pref, value, NULL);
-}
-
-static void
-webkit_pref_callback_boolean (GConfClient *client,
-                              guint cnxn_id,
-                              GConfEntry *entry,
-                              gpointer data)
-{
-  GConfValue *gcvalue;
-  gboolean value = FALSE;
-  char *webkit_pref = data;
-
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_BOOL) {
-      value = gconf_value_get_bool (gcvalue);
-  }
-
-  g_object_set (settings, webkit_pref, value, NULL);
-}
-
-static void
-webkit_pref_callback_string (GConfClient *client,
-                             guint cnxn_id,
-                             GConfEntry *entry,
-                             gpointer data)
-{
-  GConfValue *gcvalue;
-  const char *value = NULL;
-  char *webkit_pref = data;
-
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_STRING) {
-      value = gconf_value_get_string (gcvalue);
-  }
-
-  g_object_set (settings, webkit_pref, value, NULL);
-}
-
-static void
-webkit_pref_callback_user_stylesheet (GConfClient *client,
-                                      guint cnxn_id,
-                                      GConfEntry *entry,
+webkit_pref_callback_user_stylesheet (GSettings *settings,
+                                      char *key,
                                       gpointer data)
 {
-  GConfValue *gcvalue;
   gboolean value = FALSE;
   char *uri = NULL;
   char *webkit_pref = data;
 
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_BOOL) {
-      value = gconf_value_get_bool (gcvalue);
-  }
+  value = g_settings_get_boolean (settings, key);
 
   if (value)
     /* We need the leading file://, so use g_strconcat instead
@@ -130,7 +60,8 @@ webkit_pref_callback_user_stylesheet (GConfClient *client,
                        G_DIR_SEPARATOR_S,
                        USER_STYLESHEET_FILENAME,
                        NULL);
-  g_object_set (settings, webkit_pref, uri, NULL);
+
+  g_object_set (webkit_settings, webkit_pref, uri, NULL);
   g_free (uri);
 }
 
@@ -175,7 +106,7 @@ webkit_pref_get_internal_user_agent (void)
 
   g_key_file_free (branding_keyfile);
 
-  g_object_get (settings, "user-agent", &webkit_user_agent, NULL);
+  g_object_get (webkit_settings, "user-agent", &webkit_user_agent, NULL);
 
   user_agent = g_strconcat (webkit_user_agent, " ",
                             vendor_user_agent ? vendor_user_agent : "",
@@ -190,51 +121,37 @@ webkit_pref_get_internal_user_agent (void)
 }
 
 static void
-webkit_pref_callback_user_agent (GConfClient *client,
-                                 guint cnxn_id,
-                                 GConfEntry *entry,
+webkit_pref_callback_user_agent (GSettings *settings,
+                                 char *key,
                                  gpointer data)
 {
-  GConfValue *gcvalue;
-  const char *value = NULL;
+  char *value = NULL;
   static char *internal_user_agent = NULL;
   char *webkit_pref = data;
 
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_STRING) {
-      value = gconf_value_get_string (gcvalue);
-  }
+  value = g_settings_get_string (settings, key);
 
   if (value == NULL || value[0] == '\0') {
     if (internal_user_agent == NULL)
       internal_user_agent = webkit_pref_get_internal_user_agent ();
 
-    g_object_set (settings, webkit_pref, internal_user_agent, NULL);
+    g_object_set (webkit_settings, webkit_pref, internal_user_agent, NULL);
   } else
-    g_object_set (settings, webkit_pref, value, NULL);
+    g_object_set (webkit_settings, webkit_pref, value, NULL);
+
+  g_free (value);
 }
 
 static void
-webkit_pref_callback_font_size (GConfClient *client,
-                                guint cnxn_id,
-                                GConfEntry *entry,
+webkit_pref_callback_font_size (GSettings *settings,
+                                char *key,
                                 gpointer data)
 {
-  GConfValue *gcvalue;
   char *webkit_pref = data;
-  const char *value = NULL;
+  char *value = NULL;
   int size = 9; /* FIXME: What to use here? */
 
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_STRING) {
-      value = gconf_value_get_string (gcvalue);
-  }
+  value = g_settings_get_string (settings, key);
 
   if (value) {
     PangoFontDescription* desc;
@@ -246,26 +163,19 @@ webkit_pref_callback_font_size (GConfClient *client,
     pango_font_description_free (desc);
   }
 
-  g_object_set (settings, webkit_pref, size, NULL);
+  g_object_set (webkit_settings, webkit_pref, size, NULL);
+  g_free (value);
 }
 
 static void
-webkit_pref_callback_font_family (GConfClient *client,
-                                  guint cnxn_id,
-                                  GConfEntry *entry,
+webkit_pref_callback_font_family (GSettings *settings,
+                                  char *key,
                                   gpointer data)
 {
-  GConfValue *gcvalue;
   char *webkit_pref = data;
-  const char *value = NULL;
-
-  gcvalue = gconf_entry_get_value (entry);
+  char *value = NULL;
 
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_STRING) {
-      value = gconf_value_get_string (gcvalue);
-  }
+  value = g_settings_get_string (settings, key);
 
   if (value) {
     PangoFontDescription* desc;
@@ -273,9 +183,11 @@ webkit_pref_callback_font_family (GConfClient *client,
 
     desc = pango_font_description_from_string (value);
     family = pango_font_description_get_family (desc);
-    g_object_set (settings, webkit_pref, family, NULL);
+    g_object_set (webkit_settings, webkit_pref, family, NULL);
     pango_font_description_free (desc);
   }
+
+  g_free (value);
 }
 
 /* Part of this code taken from libsoup (soup-session.c) */
@@ -324,40 +236,31 @@ build_accept_languages_header (GArray *languages)
 /* Based on Christian Persch's code from gecko backend of epiphany
    (old transform_accept_languages_list() function) */
 static void
-webkit_pref_callback_accept_languages (GConfClient *client,
-                                       guint cnxn_id,
-                                       GConfEntry *entry,
+webkit_pref_callback_accept_languages (GSettings *settings,
+                                       char *key,
                                        gpointer data)
 {
   SoupSession *session;
-  GConfValue *gcvalue;
   GArray *array;
-  GSList *languages, *l;
-  char **array_data;
+  char **languages;
   char *langs_str;
   char *webkit_pref;
+  int i;
 
   webkit_pref = data;
-  gcvalue = gconf_entry_get_value (entry);
-  if (gcvalue == NULL ||
-      gcvalue->type != GCONF_VALUE_LIST ||
-      gconf_value_get_list_type (gcvalue) != GCONF_VALUE_STRING)
-    return;
 
-  languages = gconf_value_get_list (gcvalue);
+  languages = g_settings_get_strv (settings, key);
 
   array = g_array_new (TRUE, FALSE, sizeof (char *));
 
-  for (l = languages; l != NULL; l = l->next) {
-      const char *lang = gconf_value_get_string ((GConfValue *) l->data);
-
-      if ((lang != NULL) && !g_strcmp0 (lang, "system")) {
-          ephy_langs_append_languages (array);
-        } else if (lang != NULL && lang[0] != '\0') {
-          char *str = g_ascii_strdown (lang, -1);
-          g_array_append_val (array, str);
-        }
-    }
+  for (i = 0; languages[i]; i++) {
+      if (!g_strcmp0 (languages[i], "system")) {
+        ephy_langs_append_languages (array);
+      } else if (languages[i][0] != '\0') {
+        char *str = g_ascii_strdown (languages[i], -1);
+        g_array_append_val (array, str);
+      }
+  }
 
   ephy_langs_sanitise (array);
 
@@ -367,26 +270,24 @@ webkit_pref_callback_accept_languages (GConfClient *client,
   session = webkit_get_default_session ();
   g_object_set (G_OBJECT (session), webkit_pref, langs_str, NULL);
 
-  /* Free memory */
-  array_data = (char **) g_array_free (array, FALSE);
-  g_strfreev (array_data);
+  g_strfreev (languages);
   g_free (langs_str);
 }
 
 void
 ephy_embed_prefs_set_cookie_jar_policy (SoupCookieJar *jar,
-                                        const char *gconf_policy)
+                                        const char *settings_policy)
 {
   SoupCookieJarAcceptPolicy policy;
 
   g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
-  g_return_if_fail (gconf_policy != NULL);
+  g_return_if_fail (settings_policy != NULL);
 
-  if (g_str_equal (gconf_policy, "nowhere"))
+  if (g_str_equal (settings_policy, "never"))
     policy = SOUP_COOKIE_JAR_ACCEPT_NEVER;
-  else if (g_str_equal (gconf_policy, "anywhere"))
+  else if (g_str_equal (settings_policy, "always"))
     policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
-  else if (g_str_equal (gconf_policy, "current site"))
+  else if (g_str_equal (settings_policy, "no-third-party"))
     policy = SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
   else {
     g_warn_if_reached ();
@@ -397,25 +298,16 @@ ephy_embed_prefs_set_cookie_jar_policy (SoupCookieJar *jar,
 }
 
 static void
-webkit_pref_callback_cookie_accept_policy (GConfClient *client,
-                                           guint cnxn_id,
-                                           GConfEntry *entry,
+webkit_pref_callback_cookie_accept_policy (GSettings *settings,
+                                           char *key,
                                            gpointer data)
 {
   SoupSession *session;
   char *webkit_pref;
-  GConfValue *gcvalue;
-  const char *value = NULL;
+  char *value = NULL;
 
   webkit_pref = data;
-
-  gcvalue = gconf_entry_get_value (entry);
-
-  /* happens on initial notify if the key doesn't exist */
-  if (gcvalue != NULL &&
-      gcvalue->type == GCONF_VALUE_STRING) {
-      value = gconf_value_get_string (gcvalue);
-  }
+  value = g_settings_get_string (settings, key);
 
   if (value) {
     SoupSessionFeature *jar;
@@ -427,58 +319,48 @@ webkit_pref_callback_cookie_accept_policy (GConfClient *client,
     
     ephy_embed_prefs_set_cookie_jar_policy (SOUP_COOKIE_JAR (jar), value);
   }
+
+  g_free (value);
 }
 
 static const PrefData webkit_pref_entries[] =
   {
-    { CONF_RENDERING_FONT_MIN_SIZE,
-      "minimum-logical-font-size",
-      webkit_pref_callback_int },
-    { CONF_DESKTOP_FONT_VAR_NAME,
+    { "org.gnome.desktop.interface",
+      "font-name",
       "default-font-size",
-      webkit_pref_callback_font_size },
-    { CONF_DESKTOP_FONT_VAR_NAME,
+      G_CALLBACK (webkit_pref_callback_font_size) },
+    { "org.gnome.desktop.interface",
+      "font-name",
       "default-font-family",
-      webkit_pref_callback_font_family },
-    { CONF_DESKTOP_FONT_VAR_NAME,
+      G_CALLBACK (webkit_pref_callback_font_family) },
+    { "org.gnome.desktop.interface",
+      "font-name",
       "sans-serif-font-family",
-      webkit_pref_callback_font_family },
-    { CONF_DESKTOP_FONT_FIXED_NAME,
+      G_CALLBACK (webkit_pref_callback_font_family) },
+    { "org.gnome.desktop.interface",
+      "monospace-font-name",
       "default-monospace-font-size",
-      webkit_pref_callback_font_size },
-    { CONF_DESKTOP_FONT_FIXED_NAME,
+      G_CALLBACK (webkit_pref_callback_font_size) },
+    { "org.gnome.desktop.interface",
+      "monospace-font-name",
       "monospace-font-family",
-      webkit_pref_callback_font_family },
-    { CONF_SECURITY_JAVASCRIPT_ENABLED,
-      "enable-scripts",
-      webkit_pref_callback_boolean },
-    { CONF_LANGUAGE_DEFAULT_ENCODING,
-      "default-encoding",
-      webkit_pref_callback_string },
-    { CONF_WEB_INSPECTOR_ENABLED,
-      "enable-developer-extras",
-      webkit_pref_callback_boolean },
-    { CONF_USER_CSS_ENABLED,
+      G_CALLBACK (webkit_pref_callback_font_family) },
+    { EPHY_PREFS_WEB_SCHEMA,
+      EPHY_PREFS_WEB_ENABLE_USER_CSS,
       "user-stylesheet-uri",
-      webkit_pref_callback_user_stylesheet },
-    { CONF_CARET_BROWSING_ENABLED,
-      "enable-caret-browsing",
-      webkit_pref_callback_boolean },
-    { CONF_SECURITY_ALLOW_POPUPS,
-      "javascript-can-open-windows-automatically",
-      webkit_pref_callback_boolean },
-    { CONF_RENDERING_LANGUAGE,
+      G_CALLBACK (webkit_pref_callback_user_stylesheet) },
+    { EPHY_PREFS_WEB_SCHEMA,
+      EPHY_PREFS_WEB_LANGUAGE,
       "accept-language",
-      webkit_pref_callback_accept_languages },
-    { CONF_USER_AGENT,
+      G_CALLBACK (webkit_pref_callback_accept_languages) },
+    { EPHY_PREFS_SCHEMA,
+      EPHY_PREFS_USER_AGENT,
       "user-agent",
-      webkit_pref_callback_user_agent },
-    { CONF_SECURITY_COOKIES_ACCEPT,
+      G_CALLBACK (webkit_pref_callback_user_agent) },
+    { EPHY_PREFS_WEB_SCHEMA,
+      EPHY_PREFS_WEB_COOKIES_POLICY,
       "accept-policy",
-      webkit_pref_callback_cookie_accept_policy },
-    { CONF_SECURITY_PLUGINS_ENABLED,
-      "enable-plugins",
-      webkit_pref_callback_boolean }
+      G_CALLBACK (webkit_pref_callback_cookie_accept_policy) },
   };
 
 static void
@@ -493,12 +375,10 @@ ephy_embed_prefs_init (void)
 {
   int i;
 
-  eel_gconf_monitor_add ("/apps/epiphany/web");
-
-  settings = webkit_web_settings_new ();
+  webkit_settings = webkit_web_settings_new ();
 
   /* Hardcoded settings */
-  g_object_set (settings,
+  g_object_set (webkit_settings,
                 "auto-shrink-images", FALSE,
                 "enable-default-context-menu", FALSE,
                 "enable-site-specific-quirks", TRUE,
@@ -506,33 +386,58 @@ ephy_embed_prefs_init (void)
                 "auto-resize-window", TRUE,
                 NULL);
 
-  /* Connections */
-  connections = g_malloc (sizeof (guint) * G_N_ELEMENTS (webkit_pref_entries));
-
   for (i = 0; i < G_N_ELEMENTS (webkit_pref_entries); i++) {
-    connections[i] = eel_gconf_notification_add (webkit_pref_entries[i].gconf_key,
-                                                 webkit_pref_entries[i].func,
-                                                 webkit_pref_entries[i].webkit_pref);
+    GSettings *settings;
+    char *key;
+
+    settings = ephy_settings_get (webkit_pref_entries[i].schema);
+    key = g_strconcat ("changed::", webkit_pref_entries[i].key, NULL);
 
-    eel_gconf_notify (webkit_pref_entries[i].gconf_key);
+    g_signal_connect (settings, key,
+                      webkit_pref_entries[i].callback,
+                      webkit_pref_entries[i].webkit_pref);
+    g_free (key);
   }
+
+  g_settings_bind (EPHY_SETTINGS_WEB,
+                   EPHY_PREFS_WEB_ENABLE_JAVASCRIPT,
+                   webkit_settings, "enable-scripts",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_MAIN,
+                   EPHY_PREFS_ENABLE_WEB_INSPECTOR,
+                   webkit_settings, "enable-developer-extras",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_MAIN,
+                   EPHY_PREFS_ENABLE_CARET_BROWSING,
+                   webkit_settings, "enable-caret-browsing",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_WEB,
+                   EPHY_PREFS_WEB_ENABLE_POPUPS,
+                   webkit_settings, "javascript-can-open-windows-automatically",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_WEB,
+                   EPHY_PREFS_WEB_ENABLE_PLUGINS,
+                   webkit_settings, "enable-plugins",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_WEB,
+                   EPHY_PREFS_WEB_FONT_MIN_SIZE,
+                   webkit_settings, "minimum-logical-font-size",
+                   G_SETTINGS_BIND_GET);
+  g_settings_bind (EPHY_SETTINGS_WEB,
+                   EPHY_PREFS_WEB_DEFAULT_ENCODING,
+                   webkit_settings, "default-encoding",
+                   G_SETTINGS_BIND_GET);
 }
 
 void
 ephy_embed_prefs_shutdown (void)
 {
-  int i;
-
-  for (i = 0; i < G_N_ELEMENTS (webkit_pref_entries); i++)
-    eel_gconf_notification_remove (connections[i]);
-
-  g_free (connections);
-  g_object_unref (settings);
+  g_object_unref (webkit_settings);
 }
 
 void
 ephy_embed_prefs_add_embed (EphyEmbed *embed)
 {
-  ephy_embed_prefs_apply (embed, settings);
+  ephy_embed_prefs_apply (embed, webkit_settings);
 }
 
diff --git a/embed/ephy-embed-prefs.h b/embed/ephy-embed-prefs.h
index 4cb63a3..0afbef5 100644
--- a/embed/ephy-embed-prefs.h
+++ b/embed/ephy-embed-prefs.h
@@ -23,29 +23,6 @@
 
 #include "ephy-embed.h"
 
-#define CONF_NETWORK_CACHE_SIZE "/apps/epiphany/web/cache_size"
-#define CONF_RENDERING_FONT "/apps/epiphany/web/font"
-#define CONF_RENDERING_FONT_MIN_SIZE "/apps/epiphany/web/minimum_font_size"
-#define CONF_RENDERING_LANGUAGE "/apps/epiphany/web/language"
-#define CONF_RENDERING_USE_OWN_COLORS "/apps/epiphany/web/use_own_colors"
-#define CONF_RENDERING_USE_OWN_FONTS "/apps/epiphany/web/use_own_fonts"
-#define CONF_USER_CSS_ENABLED "/apps/epiphany/web/user_css_enabled"
-#define CONF_SECURITY_ALLOW_POPUPS "/apps/epiphany/web/allow_popups"
-#define CONF_SECURITY_PLUGINS_ENABLED "/apps/epiphany/web/plugins_enabled"
-#define CONF_SECURITY_JAVASCRIPT_ENABLED "/apps/epiphany/web/javascript_enabled"
-#define CONF_SECURITY_COOKIES_ACCEPT "/apps/epiphany/web/cookie_accept"
-#define CONF_LANGUAGE_AUTODETECT_ENCODING "/apps/epiphany/web/autodetect_encoding"
-#define CONF_LANGUAGE_DEFAULT_ENCODING "/apps/epiphany/web/default_encoding"
-#define CONF_IMAGE_ANIMATION_MODE "/apps/epiphany/web/image_animation"
-#define CONF_IMAGE_LOADING_MODE "/apps/epiphany/web/image_loading"
-#define CONF_DISPLAY_SMOOTHSCROLL "/apps/epiphany/web/smooth_scroll"
-#define CONF_WEB_INSPECTOR_ENABLED "/apps/epiphany/web/inspector_enabled"
-#define CONF_CARET_BROWSING_ENABLED "/apps/epiphany/web/browse_with_caret"
-#define CONF_USER_AGENT "/apps/epiphany/general/user_agent"
-
-#define CONF_DESKTOP_FONT_VAR_NAME "/desktop/gnome/interface/font_name"
-#define CONF_DESKTOP_FONT_FIXED_NAME "/desktop/gnome/interface/monospace_font_name"
-
 #if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
 #error "Only <epiphany/epiphany.h> can be included directly."
 #endif
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index 04ead3f..560eb34 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -23,8 +23,8 @@
 #define LIBSOUP_I_HAVE_READ_BUG_594377_AND_KNOW_SOUP_PASSWORD_MANAGER_MIGHT_GO_AWAY
 #define NSPLUGINWRAPPER_SETUP "/usr/bin/mozilla-plugin-config"
 
-#include "eel-gconf-extensions.h"
 #include "ephy-embed-single.h"
+#include "ephy-embed-shell.h"
 #include "ephy-embed-prefs.h"
 #include "ephy-embed-type-builtins.h"
 #include "ephy-debug.h"
@@ -33,6 +33,8 @@
 #include "ephy-signal-accumulator.h"
 #include "ephy-permission-manager.h"
 #include "ephy-profile-migration.h"
+#include "ephy-prefs.h"
+#include "ephy-settings.h"
 
 #ifdef ENABLE_CERTIFICATE_MANAGER
 #include "ephy-certificate-manager.h"
@@ -480,7 +482,8 @@ ephy_embed_single_initialize (EphyEmbedSingle *single)
   filename = g_build_filename (ephy_dot_dir (), "cookies.sqlite", NULL);
   jar = soup_cookie_jar_sqlite_new (filename, FALSE);
   g_free (filename);
-  cookie_policy = eel_gconf_get_string (CONF_SECURITY_COOKIES_ACCEPT);
+  cookie_policy = g_settings_get_string (EPHY_SETTINGS_WEB,
+                                         EPHY_PREFS_WEB_COOKIES_POLICY);
   ephy_embed_prefs_set_cookie_jar_policy (jar, cookie_policy);
   g_free (cookie_policy);
 
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 0f6b011..77066d3 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -26,7 +26,6 @@
 #include "config.h"
 
 #include "downloader-view.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-adblock-manager.h"
 #include "ephy-debug.h"
 #include "ephy-embed.h"
@@ -40,6 +39,7 @@
 #include "ephy-file-helpers.h"
 #include "ephy-history.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-stock-icons.h"
 #include "ephy-string.h"
 #include "ephy-web-view.h"
@@ -445,7 +445,7 @@ request_destination_uri (WebKitWebView *web_view,
   dialog = ephy_file_chooser_new (_("Save"),
                                   window,
                                   GTK_FILE_CHOOSER_ACTION_SAVE,
-                                  CONF_STATE_SAVE_DIR,
+                                  EPHY_PREFS_STATE_SAVE_DIR,
                                   EPHY_FILE_FILTER_ALL_SUPPORTED);
   gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
   gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested_filename);
@@ -823,7 +823,8 @@ download_status_changed_cb (GObject *object,
      */
     g_object_freeze_notify (G_OBJECT (download));
 
-    if (eel_gconf_get_boolean (CONF_AUTO_DOWNLOADS)) {
+    if (g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+                                EPHY_PREFS_AUTO_DOWNLOADS)) {
       perform_auto_download (download);
       /* User won't select a destination, unfreeze. */
       g_object_thaw_notify (G_OBJECT (download));
@@ -857,7 +858,8 @@ download_requested_cb (WebKitWebView *web_view,
                        EphyEmbed *embed)
 {
   /* Is download locked down? */
-  if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK))
+  if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+                              EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK))
     return FALSE;
 
   /* Wait for the request to be sent in all cases, so that we have a
diff --git a/embed/ephy-encodings.c b/embed/ephy-encodings.c
index 15230ac..597f531 100644
--- a/embed/ephy-encodings.c
+++ b/embed/ephy-encodings.c
@@ -24,8 +24,9 @@
 #include "ephy-encodings.h"
 #include "ephy-node-db.h"
 #include "ephy-file-helpers.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
+#include "ephy-prefs.h"
+#include "ephy-settings.h"
 
 #include <glib/gi18n.h>
 #include <string.h>
@@ -146,7 +147,6 @@ enum
 	DETECTORS_NODE_ID = 5
 };
 
-#define RECENT_KEY	"/apps/epiphany/general/recent_encodings"
 #define RECENT_MAX	4
 
 static void ephy_encodings_class_init	(EphyEncodingsClass *klass);
@@ -326,7 +326,8 @@ void
 ephy_encodings_add_recent (EphyEncodings *encodings,
 			   const char *code)
 {
-	GSList *element;
+	GSList *element, *l;
+	GVariantBuilder builder;
 
 	g_return_if_fail (EPHY_IS_ENCODINGS (encodings));
 	g_return_if_fail (code != NULL);
@@ -358,8 +359,15 @@ ephy_encodings_add_recent (EphyEncodings *encodings,
 			g_slist_remove_link (encodings->priv->recent, tail);
 	}
 
-	/* persist the list */
-	eel_gconf_set_string_list (RECENT_KEY, encodings->priv->recent);
+	g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+	for (l = encodings->priv->recent; l; l = l->next)
+	{
+		g_variant_builder_add (&builder, "s", l->data);
+	}
+
+	g_settings_set (EPHY_SETTINGS_STATE,
+			EPHY_PREFS_STATE_RECENT_ENCODINGS,
+			"as", &builder);
 }
 
 GList *
@@ -385,8 +393,8 @@ static void
 ephy_encodings_init (EphyEncodings *encodings)
 {
 	EphyNodeDb *db;
-	GSList *list, *l;
-	guint i;
+	char **list;
+	int i;
 
 	encodings->priv = EPHY_ENCODINGS_GET_PRIVATE (encodings);
 
@@ -412,29 +420,29 @@ ephy_encodings_init (EphyEncodings *encodings)
 	}
 
 	/* get the list of recently used encodings */
-	list = eel_gconf_get_string_list (RECENT_KEY);
+	list = g_settings_get_strv (EPHY_SETTINGS_STATE,
+				    EPHY_PREFS_STATE_RECENT_ENCODINGS);
 
 	/* make sure the list has no duplicates (GtkUIManager goes
 	 * crazy otherwise), and only valid entries
 	 */
 	encodings->priv->recent = NULL;
-	for (l = list; l != NULL; l = l->next)
+	for (i = 0; list[i]; i++)
 	{
-		if (g_slist_find (encodings->priv->recent, l->data) == NULL
+		char *item;
+		item = list[i];
+
+		if (g_slist_find (encodings->priv->recent, item) == NULL
 		    && g_slist_length (encodings->priv->recent) < RECENT_MAX
-		    && ephy_encodings_get_node (encodings, l->data, FALSE) != NULL)
+		    && ephy_encodings_get_node (encodings, item, FALSE) != NULL)
 		{
 			encodings->priv->recent =
 				g_slist_prepend (encodings->priv->recent,
-						 l->data);
-		}
-		else
-		{
-			g_free (l->data);
+						 g_strdup (item));
 		}
 	}
 	encodings->priv->recent = g_slist_reverse (encodings->priv->recent);
-	g_slist_free (list);
+	g_strfreev (list);
 }
 
 EphyEncodings *
diff --git a/embed/ephy-history.c b/embed/ephy-history.c
index 117315c..86a4aaa 100644
--- a/embed/ephy-history.c
+++ b/embed/ephy-history.c
@@ -26,8 +26,8 @@
 #include "ephy-debug.h"
 #include "ephy-node-db.h"
 #include "ephy-node-common.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-string.h"
 
 #include <time.h>
@@ -59,7 +59,6 @@ struct _EphyHistoryPrivate
 	GHashTable *pages_hash;
 	guint autosave_timeout;
 	guint update_hosts_idle;
-	guint disable_history_notifier_id;
 	gboolean dirty;
 	gboolean enabled;
 };
@@ -469,16 +468,6 @@ connect_page_removed_from_host (char *url,
 }
 
 static void
-disable_history_notifier (GConfClient *client,
-			  guint cnxn_id,
-			  GConfEntry *entry,
-			  EphyHistory *history)
-{
-	ephy_history_set_enabled
-		(history, !eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_HISTORY));
-}
-
-static void
 ephy_history_init (EphyHistory *eb)
 {
 	EphyNodeDb *db;
@@ -561,10 +550,10 @@ ephy_history_init (EphyHistory *eb)
 		       (GSourceFunc)periodic_save_cb,
 		       eb);
 
-	disable_history_notifier (NULL, 0, NULL, eb);
-	eb->priv->disable_history_notifier_id = eel_gconf_notification_add
-		(CONF_LOCKDOWN_DISABLE_HISTORY,
-		 (GConfClientNotifyFunc) disable_history_notifier, eb);
+	g_settings_bind (EPHY_SETTINGS_LOCKDOWN,
+			 EPHY_PREFS_LOCKDOWN_HISTORY,
+			 eb, "enabled",
+			 G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_GET);
 }
 
 static void
@@ -589,8 +578,6 @@ ephy_history_finalize (GObject *object)
 
 	g_source_remove (eb->priv->autosave_timeout);
 
-	eel_gconf_notification_remove (eb->priv->disable_history_notifier_id);
-
 	g_free (eb->priv->xml_file);
 
 	LOG ("Global history finalized");
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index ba2f48f..ac68164 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -29,7 +29,6 @@
 #include <webkit/webkit.h>
 #include <gnome-keyring.h>
 
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
 #include "ephy-embed.h"
 #include "ephy-embed-container.h"
@@ -45,6 +44,7 @@
 #include "ephy-profile-migration.h"
 #include "ephy-favicon-cache.h"
 #include "ephy-history.h"
+#include "ephy-settings.h"
 #include "ephy-string.h"
 #include "ephy-web-view.h"
 #include "ephy-zoom.h"
@@ -345,8 +345,8 @@ ephy_web_view_get_popups_allowed (EphyWebView *view)
       break;
     case EPHY_PERMISSION_DEFAULT:
     default:
-      allow = eel_gconf_get_boolean
-              (CONF_SECURITY_ALLOW_POPUPS);
+      allow = g_settings_get_boolean (EPHY_SETTINGS_WEB,
+                                      EPHY_PREFS_WEB_ENABLE_POPUPS);
       break;
   }
 
@@ -1990,7 +1990,8 @@ load_status_cb (WebKitWebView *web_view,
       g_object_notify (object, "embed-title");
 
     if (ephy_has_private_profile () == FALSE &&
-        eel_gconf_get_boolean (CONF_PRIVACY_REMEMBER_PASSWORDS))
+        g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+                                EPHY_PREFS_REMEMBER_PASSWORDS))
       _ephy_web_view_hook_into_forms (view);
 
     _ephy_web_view_hook_into_links (view);
@@ -2220,7 +2221,8 @@ normalize_or_autosearch_url (EphyWebView *view, const char *url)
       !g_regex_match (priv->non_search_regex, url, 0, NULL)) {
     char *query_param, *url_search;
 
-    url_search = eel_gconf_get_string (CONF_URL_SEARCH);
+    url_search = g_settings_get_string (EPHY_SETTINGS_MAIN,
+                                        EPHY_PREFS_KEYWORD_SEARCH_URL);
 
     if (url_search == NULL || url_search[0] == '\0') {
       g_free (url_search);
@@ -3561,7 +3563,7 @@ ephy_web_view_load_homepage (EphyWebView *view)
 
   g_signal_emit_by_name (view, "loading-homepage");
 
-  home = eel_gconf_get_string (CONF_GENERAL_HOMEPAGE);
+  home = g_settings_get_string (EPHY_SETTINGS_MAIN, EPHY_PREFS_HOMEPAGE_URL);
 
   if (home == NULL || home[0] == '\0')
   {
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 08f1922..b98c1b3 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -8,7 +8,6 @@ header_DATA = \
 	$(INST_H_FILES)
 
 NOINST_H_FILES = \
-	eel-gconf-extensions.h			\
 	ephy-debug.h				\
 	ephy-dnd.h				\
 	ephy-file-chooser.h			\
@@ -38,10 +37,10 @@ INST_H_FILES = \
 	ephy-loader.h				\
 	ephy-node.h				\
 	ephy-node-db.h				\
+	ephy-settings.h				\
 	ephy-state.h
 
 libephymisc_la_SOURCES = \
-	eel-gconf-extensions.c			\
 	ephy-debug.c				\
 	ephy-dialog.c				\
 	ephy-dnd.c				\
@@ -60,6 +59,7 @@ libephymisc_la_SOURCES = \
 	ephy-prefs.h				\
 	ephy-profile-migration.c	        \
 	ephy-print-utils.c			\
+	ephy-settings.c				\
 	ephy-shlib-loader.c			\
 	ephy-signal-accumulator.c		\
 	ephy-state.c				\
diff --git a/lib/ephy-dialog.c b/lib/ephy-dialog.c
index f39a9f7..1ca4d0d 100644
--- a/lib/ephy-dialog.c
+++ b/lib/ephy-dialog.c
@@ -23,7 +23,6 @@
 #include "ephy-dialog.h"
 #include "ephy-state.h"
 #include "ephy-gui.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
 
 #include <stdlib.h>
@@ -46,41 +45,17 @@ enum
 	PROP_DEFAULT_HEIGHT
 };
 
-typedef enum
-{
-	PT_TOGGLEBUTTON,
-	PT_RADIOBUTTON,
-	PT_SPINBUTTON,
-	PT_COMBOBOX,
-	PT_EDITABLE,
-	PT_UNKNOWN
-} WidgetType;
-
-typedef struct
-{
-	const char *id;
-	EphyDialog *dialog;
-	char *pref;
-	EphyDialogApplyType apply_type;
-	GtkWidget *widget;
-	WidgetType widget_type;
-	GType data_type;
-	GList *string_enum;
-	int data_col;
-	gboolean loaded;
-	gboolean sane_state;
-} PropertyInfo;
-
 #define EPHY_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_DIALOG, EphyDialogPrivate))
 
 struct _EphyDialogPrivate
 {
 	char *name;
 
-	GHashTable *props;
 	GtkWidget *parent;
 	GtkWidget *dialog;
 
+	GtkBuilder *builder;
+
 	guint has_default_size : 1;
 	guint disposing : 1;
 	guint initialized : 1;
@@ -89,8 +64,6 @@ struct _EphyDialogPrivate
 	int default_height;
 };
 
-#define SPIN_DELAY 0.20
-
 enum
 {
 	CHANGED,
@@ -132,905 +105,6 @@ ephy_dialog_get_type (void)
 	return type;
 }
 
-static PropertyInfo *
-lookup_info (EphyDialog *dialog, const char *id)
-{
-	return g_hash_table_lookup (dialog->priv->props, id);
-}
-
-static void
-set_sensitivity (PropertyInfo *info, gboolean sensitive)
-{
-	g_return_if_fail (info->widget != NULL);
-
-	if (info->widget_type == PT_RADIOBUTTON)
-	{
-		GSList *list, *l;
-
-		list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (info->widget));
-
-		for (l = list; l != NULL; l = l->next)
-		{
-			sensitive = gtk_widget_is_sensitive (GTK_WIDGET (l->data)) && sensitive;
-			gtk_widget_set_sensitive (GTK_WIDGET (l->data), sensitive);
-		}
-	}
-	else if (info->widget_type == PT_EDITABLE)
-	{
-		sensitive = gtk_widget_is_sensitive (info->widget) && sensitive;
-		gtk_editable_set_editable (GTK_EDITABLE (info->widget), sensitive);
-	}
-	else
-	{
-		sensitive = gtk_widget_is_sensitive (info->widget) && sensitive;
-		gtk_widget_set_sensitive (info->widget, sensitive);
-	}
-}
-
-static void
-set_value_from_pref (PropertyInfo *info, GValue *value)
-{
-	char *text;
-
-	switch (info->data_type)
-	{
-		case G_TYPE_STRING:
-			g_value_init (value, G_TYPE_STRING);
-			text = eel_gconf_get_string (info->pref);
-			g_value_take_string (value, text);
-			break;
-		case G_TYPE_INT:
-			g_value_init (value, G_TYPE_INT);
-			g_value_set_int (value, eel_gconf_get_integer (info->pref));
-			break;
-		case G_TYPE_FLOAT:
-			g_value_init (value, G_TYPE_FLOAT);
-			g_value_set_float (value, eel_gconf_get_float (info->pref));
-			break;
-		case G_TYPE_BOOLEAN:
-			g_value_init (value, G_TYPE_BOOLEAN);
-			g_value_set_boolean (value, eel_gconf_get_boolean (info->pref));
-			break;
-		default:
-			g_warning ("Unsupported value read from pref %s\n", info->pref);
-			break;
-	}
-}
-
-static void
-set_pref_from_value (PropertyInfo *info, GValue *value)
-{
-	const char *pref = info->pref;
-
-	if (!G_VALUE_HOLDS (value, info->data_type))
-	{
-		g_warning ("Value type mismatch for id[%s], pref[%s]", info->id, info->pref);
-		return;
-	}
-
-	switch (info->data_type)
-	{
-		case G_TYPE_STRING:
-		{
-			const char *string = g_value_get_string (value);
-			if (string != NULL)
-			{
-				eel_gconf_set_string (pref, string);
-			}
-			else
-			{
-				eel_gconf_unset_key (pref);
-			}
-			break;
-		}
-		case G_TYPE_INT:
-			eel_gconf_set_integer (pref, g_value_get_int (value));
-			break;
-		case G_TYPE_FLOAT:
-			eel_gconf_set_float (pref, g_value_get_float (value));
-			break;
-		case G_TYPE_BOOLEAN:
-			eel_gconf_set_boolean (pref, g_value_get_boolean (value));
-			break;
-		default:
-			break;
-	}
-}
-
-static gboolean
-set_value_from_editable (PropertyInfo *info, GValue *value)
-{
-	char *text;
-	gboolean retval = TRUE;
-	gboolean free_text = TRUE;
-
-	g_return_val_if_fail (GTK_IS_EDITABLE (info->widget), FALSE);
-
-	text = gtk_editable_get_chars (GTK_EDITABLE (info->widget), 0, -1);
-
-	g_value_init (value, info->data_type);
-	switch (info->data_type)
-	{
-		case G_TYPE_STRING:
-			g_value_take_string (value, text);
-			free_text = FALSE;
-			break;
-		/* FIXME : handle possible errors in the input for int and float */
-		case G_TYPE_INT:
-			g_value_set_int (value, atoi (text));
-			break;
-		case G_TYPE_FLOAT:
-			g_value_set_float (value, strtod (text, NULL));
-			break;
-		default:
-			retval = FALSE;
-			g_value_unset (value);
-			g_warning ("Unsupported value type for editable %s", info->id);
-			break;
-	}
-
-	if (free_text)
-	{
-		g_free (text);
-	}
-
-	return retval;
-}
-
-static gboolean
-set_value_from_combobox (PropertyInfo *info, GValue *value)
-{
-	g_return_val_if_fail (GTK_IS_COMBO_BOX (info->widget), FALSE);
-
-	if (info->data_col != -1)
-	{
-		GtkTreeModel *model;
-		GtkTreeIter iter;
-
-		if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (info->widget), &iter))
-		{
-			model = gtk_combo_box_get_model (GTK_COMBO_BOX (info->widget));
-			gtk_tree_model_get_value (model, &iter, info->data_col, value);
-
-			return TRUE;
-		}
-	}
-	else if (info->data_type == G_TYPE_INT)
-	{
-		int index;
-
-		index = gtk_combo_box_get_active (GTK_COMBO_BOX (info->widget));
-
-		if (index >= 0)
-		{
-			g_value_init (value, G_TYPE_INT);
-			g_value_set_int (value, index);
-
-			return TRUE;
-		}
-	}
-	else
-	{
-		g_warning ("Unsupported data type for combo %s\n", info->id);
-	}
-
-	return FALSE;
-}
-
-static int
-get_radio_button_active_index (GtkWidget *radiobutton)
-{
-	GtkToggleButton *toggle_button;
-	GSList *list;
-	int index, i, length;
-
-	/* get group list */
-	list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton));
-	length = g_slist_length (list);
-
-	/* iterate over list to find active button */
-	for (i = 0; list != NULL; i++, list = list->next)
-	{
-		/* get button and text */
-		toggle_button = GTK_TOGGLE_BUTTON (list->data);
-		if (gtk_toggle_button_get_active (toggle_button))
-		{
-			break;
-		}
-	}
-
-	/* check we didn't run off end */
-	g_assert (list != NULL);
-
-	/* return index (reverse order!) */
-	return index = (length - 1) - i;
-}
-
-static gboolean
-set_value_from_radiobuttongroup (PropertyInfo *info, GValue *value)
-{
-	gboolean retval = TRUE;
-	int index;
-
-	g_return_val_if_fail (GTK_IS_RADIO_BUTTON (info->widget), FALSE);
-
-	index = get_radio_button_active_index (info->widget);
-	g_return_val_if_fail (index >= 0, FALSE);
-
-	if (info->data_type == G_TYPE_STRING)
-	{
-		g_return_val_if_fail (info->string_enum != NULL, FALSE);
-		g_return_val_if_fail (g_list_nth_data (info->string_enum, index) != NULL, FALSE);
-
-		g_value_init (value, G_TYPE_STRING);
-		g_value_set_string (value, (char*) g_list_nth_data (info->string_enum, index));
-	}
-	else if (info->data_type == G_TYPE_INT)
-	{
-		g_value_init (value, G_TYPE_INT);
-		g_value_set_int (value, index);
-	}
-	else
-	{
-		retval = FALSE;
-		g_warning ("unsupported data type for radio button %s\n", info->id);
-	}
-
-	return retval;
-}
-
-static gboolean
-set_value_from_spin_button (PropertyInfo *info, GValue *value)
-{
-	gboolean retval = TRUE;
-	gdouble f;
-	gboolean is_int;
-
-	g_return_val_if_fail (GTK_IS_SPIN_BUTTON (info->widget), FALSE);
-
-	f = gtk_spin_button_get_value (GTK_SPIN_BUTTON (info->widget));
-
-	is_int = (gtk_spin_button_get_digits (GTK_SPIN_BUTTON(info->widget)) == 0);
-
-	if (info->data_type == G_TYPE_INT && is_int)
-	{
-		g_value_init (value, G_TYPE_INT);
-		g_value_set_int (value, (int) f);
-	}
-	else if (info->data_type == G_TYPE_FLOAT)
-	{
-		g_value_init (value, G_TYPE_FLOAT);
-		g_value_set_float (value, f);
-	}
-	else
-	{
-		retval = FALSE;
-		g_warning ("Unsupported data type for spin button %s\n", info->id);
-	}
-
-	return retval;
-}
-
-static gboolean
-set_value_from_togglebutton (PropertyInfo *info, GValue *value)
-{
-	gboolean retval = TRUE;
-	gboolean active;
-
-	g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (info->widget), FALSE);
-
-	active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (info->widget));
-
-	if (info->apply_type & PT_INVERTED)
-	{
-		active = !active;
-	}
-
-	if (info->data_type == G_TYPE_BOOLEAN)
-	{
-		g_value_init (value, info->data_type);
-		g_value_set_boolean (value, active);
-	}
-	else
-	{
-		retval = FALSE;
-		g_warning ("Unsupported data type for toggle button %s\n", info->id);
-	}
-
-	return retval;
-}
-
-static gboolean
-set_value_from_info (PropertyInfo *info, GValue *value)
-{
-	gboolean retval;
-
-	if (info->sane_state == FALSE)
-	{
-		return FALSE;
-	}
-
-	switch (info->widget_type)
-	{
-		case PT_SPINBUTTON:
-			retval = set_value_from_spin_button (info, value);
-			break;
-		case PT_RADIOBUTTON:
-			retval = set_value_from_radiobuttongroup (info, value);
-			break;
-		case PT_TOGGLEBUTTON:
-			retval = set_value_from_togglebutton (info, value);
-			break;
-		case PT_EDITABLE:
-			retval = set_value_from_editable (info, value);
-			break;
-		case PT_COMBOBOX:
-			retval = set_value_from_combobox (info, value);
-			break;
-		default:
-			retval = FALSE;
-			g_warning ("Unsupported widget type\n");
-			break;
-	}
-
-	return retval;
-}
-
-static void
-set_editable_from_value (PropertyInfo *info, const GValue *value)
-{
-	char *text = NULL;
-	int pos = 0; /* insertion position */
-
-	g_return_if_fail (GTK_IS_EDITABLE (info->widget));
-
-	switch (info->data_type)
-	{
-		case G_TYPE_STRING:
-			text = g_value_dup_string (value);
-			break;
-		case G_TYPE_INT:
-			text = g_strdup_printf ("%d", g_value_get_int (value));
-			break;
-		case G_TYPE_FLOAT:
-			text = g_strdup_printf ("%.2f", g_value_get_float (value));
-			break;
-		default:
-			break;
-	}
-
-	if (text == NULL)
-	{
-		text = g_strdup ("");
-	}
-
-	info->sane_state = TRUE;
-
-	gtk_editable_delete_text (GTK_EDITABLE (info->widget), 0, -1);
-	gtk_editable_insert_text (GTK_EDITABLE (info->widget), text, strlen (text), &pos);
-
-	g_free (text);
-}
-
-static int
-strcmp_with_null (const char *key1,
-		  const char *key2)
-{
-	if (key1 == NULL && key2 == NULL)
-	{
-		return 0;
-	}
-	if (key1 == NULL)
-	{
-		return -1;
-	}
-	if (key2 == NULL)
-	{
-		return 1;
-	}
-
-	return strcmp (key1, key2);
-}
-
-static int
-get_index_from_value (const GValue *value, GList *string_enum)
-{
-	int index = -1;
-	const char *val;
-	GList *s = NULL;
-
-	if (string_enum)
-	{
-		val = g_value_get_string (value);
-
-		s = g_list_find_custom (string_enum, val, (GCompareFunc) strcmp_with_null);
-
-		if (s)
-		{
-			index = g_list_position (string_enum, s);
-		}
-
-	}
-	else
-	{
-		index = g_value_get_int (value);
-	}
-
-	return index;
-}
-
-static gboolean
-compare_values (const GValue *a, const GValue *b)
-{
-	if (G_VALUE_HOLDS (a, G_TYPE_STRING))
-	{
-		const char *ta, *tb;
-
-		ta = g_value_get_string (a);
-		tb = g_value_get_string (b);
-
-		return (strcmp_with_null (ta, tb) == 0);
-	}
-	else if (G_VALUE_HOLDS (a, G_TYPE_INT))
-	{
-		return g_value_get_int (a) == g_value_get_int (b);
-	}
-	else if (G_VALUE_HOLDS (a, G_TYPE_FLOAT))
-	{
-		return g_value_get_float (a) == g_value_get_float (b);
-	}
-	else if (G_VALUE_HOLDS (a, G_TYPE_BOOLEAN))
-	{
-		return g_value_get_boolean (a) == g_value_get_boolean (b);
-	}
-
-	return FALSE;
-}
-
-static void
-set_combo_box_from_value (PropertyInfo *info, const  GValue *value)
-{
-	g_return_if_fail (GTK_IS_COMBO_BOX (info->widget));
-
-	if (info->data_col != -1)
-	{
-		GValue data = { 0, };
-		GtkTreeModel *model;
-		GtkTreeIter iter;
-		gboolean valid, found = FALSE;
-
-		model = gtk_combo_box_get_model (GTK_COMBO_BOX (info->widget));
-
-		valid = gtk_tree_model_get_iter_first (model, &iter);
-		while (valid)
-		{
-			gtk_tree_model_get_value (model, &iter, info->data_col, &data);
-			found = compare_values (&data, value);
-			g_value_unset (&data);
-
-			if (found) break;
-
-			valid = gtk_tree_model_iter_next (model, &iter);
-		}
-
-		if (found)
-		{
-			gtk_combo_box_set_active_iter (GTK_COMBO_BOX (info->widget), &iter);
-		}
-		else
-		{
-			gtk_combo_box_set_active (GTK_COMBO_BOX (info->widget), 0);
-		}
-
-		info->sane_state = found;
-	}
-	else if (info->data_type == G_TYPE_INT)
-	{
-		int index;
-
-		index = g_value_get_int (value);
-
-		info->sane_state = index >= 0;
-
-		g_return_if_fail (index >= -1);
-
-		gtk_combo_box_set_active (GTK_COMBO_BOX (info->widget), index);
-	}
-	else
-	{
-		g_warning ("Unsupported data type for combo box %s\n", info->id);
-	}
-}
-
-static void
-set_radiobuttongroup_from_value (PropertyInfo *info, const GValue *value)
-{
-	GtkToggleButton *button;
-	GSList *list;
-	gint length;
-	int index;
-
-	g_return_if_fail (GTK_IS_RADIO_BUTTON (info->widget));
-
-	list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (info->widget));
-
-	length = g_slist_length (list);
-
-	index = get_index_from_value (value, info->string_enum);
-
-	/* new buttons are *prepended* to the list, so button added as first
-	 * has last position in the list */
-	index = (length - 1) - index;
-
-	if (index < 0 || index >= length)
-	{
-		info->sane_state = FALSE;
-		g_return_if_fail (index >= 0 && index < length);
-		return;
-	}
-
-	button = GTK_TOGGLE_BUTTON (g_slist_nth_data (list, index));
-	g_return_if_fail (button != NULL);
-
-	info->sane_state = TRUE;
-
-	if (gtk_toggle_button_get_active (button) == FALSE)
-	{
-		gtk_toggle_button_set_active (button, TRUE);
-	}
-}
-
-static void
-set_spin_button_from_value (PropertyInfo *info, const GValue *value)
-{
-	gdouble f = 0.0;
-	gboolean is_int;
-
-	g_return_if_fail (GTK_IS_SPIN_BUTTON (info->widget));
-
-	is_int = (gtk_spin_button_get_digits (GTK_SPIN_BUTTON (info->widget)) == 0);
-
-	if (info->data_type == G_TYPE_INT && is_int)
-	{
-		f = (float) g_value_get_int (value);
-	}
-	else if (info->data_type == G_TYPE_FLOAT)
-	{
-		f = g_value_get_float (value);
-	}
-	else
-	{
-		info->sane_state = FALSE;
-		g_warning ("Unsupported data type for spin button %s\n", info->id);
-		return;
-	}
-
-	info->sane_state = TRUE;
-
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (info->widget), f);
-}
-
-static void
-set_togglebutton_from_value (PropertyInfo *info, const GValue *value)
-{
-	gboolean active;
-
-	g_return_if_fail (GTK_IS_TOGGLE_BUTTON (info->widget));
-	g_return_if_fail (info->data_type == G_TYPE_BOOLEAN);
-
-	active = g_value_get_boolean (value);
-
-	if (info->apply_type & PT_INVERTED)
-	{
-		active = !active;
-	}
-
-	info->sane_state = TRUE;
-
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (info->widget), active);
-}
-
-static void
-set_info_from_value (PropertyInfo *info, const GValue *value)
-{
-	if (!G_VALUE_HOLDS (value, info->data_type))
-	{
-		g_warning ("Incompatible value types for id %s\n", info->id);
-		return;
-	}
-
-	switch (info->widget_type)
-	{
-		case PT_SPINBUTTON:
-			set_spin_button_from_value (info, value);
-			break;
-		case PT_RADIOBUTTON:
-			set_radiobuttongroup_from_value (info, value);
-			break;
-		case PT_TOGGLEBUTTON:
-			set_togglebutton_from_value (info, value);
-			break;
-		case PT_EDITABLE:
-			set_editable_from_value (info, value);
-			break;
-		case PT_COMBOBOX:
-			set_combo_box_from_value (info, value);
-			break;
-		default:
-			g_warning ("Unknown widget type\n");
-			break;
-	}
-}
-
-/* widget changed callbacks */
-
-static void
-set_pref_from_info_and_emit (PropertyInfo *info)
-{
-	GValue value = { 0, };
-
-	if (!set_value_from_info (info, &value))
-	{
-		return;
-	}
-
-	g_signal_emit (info->dialog, signals[CHANGED], g_quark_from_string (info->id), &value);
-
-	if ((info->apply_type & PT_AUTOAPPLY) && info->pref != NULL)
-	{
-		set_pref_from_value (info, &value);
-	}
-
-	g_value_unset (&value);
-}
-
-static void
-togglebutton_clicked_cb (GtkWidget *widget, PropertyInfo *info)
-{
-	info->sane_state = TRUE;
-
-	set_pref_from_info_and_emit (info);
-}
-
-static void
-radiobutton_clicked_cb (GtkWidget *widget, PropertyInfo *info)
-{
-	info->sane_state = TRUE;
-
-	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)))
-	{
-		return;
-	}
-
-	set_pref_from_info_and_emit (info);
-}
-
-static gboolean
-spinbutton_timeout_cb (PropertyInfo *info)
-{
-	GTimer *spin_timer;
-
-	spin_timer = (GTimer *) g_object_get_data (G_OBJECT (info->widget), "timer");
-
-	/* timer still valid? */
-	if (spin_timer == NULL)
-	{
-		/* don't call me again */
-		return FALSE;
-	}
-
-	/* okay, we're ready to set */
-	if (g_timer_elapsed (spin_timer, NULL) >= SPIN_DELAY)
-	{
-		/* kill off the timer */
-		g_timer_destroy (spin_timer);
-		g_object_set_data (G_OBJECT (info->widget), "timer", NULL);
-
-		/* HACK update the spinbutton here so that the
-		 * changes made directly in the entry are accepted
-		 * and set in the pref. Otherwise the old value is used */
-		gtk_spin_button_update (GTK_SPIN_BUTTON (info->widget));
-
-		info->sane_state = TRUE;
-
-		set_pref_from_info_and_emit (info);
-
-		/* done, don't run again */
-		return FALSE;
-	}
-
-	/* not elapsed yet, call me again */
-	return TRUE;
-}
-
-static void
-spinbutton_changed_cb (GtkWidget *widget, PropertyInfo *info)
-{
-	GTimer *spin_timer;
-
-	if ((info->apply_type & PT_AUTOAPPLY) == 0) return;
-
-	spin_timer = g_object_get_data (G_OBJECT (info->widget), "timer");
-
-	/* destroy an existing timer */
-	if (spin_timer != NULL)
-	{
-		g_timer_destroy (spin_timer);
-	}
-
-	/* start tnew timer */
-	spin_timer = g_timer_new();
-	g_timer_start (spin_timer);
-	g_object_set_data (G_OBJECT (info->widget), "timer", spin_timer);
-
-	g_timeout_add (50, (GSourceFunc) spinbutton_timeout_cb, info);
-}
-
-static void
-changed_cb (GtkWidget *widget, PropertyInfo *info)
-{
-	info->sane_state = TRUE;
-
-	set_pref_from_info_and_emit (info);
-}
-
-static void
-connect_signals (gpointer key, PropertyInfo *info, EphyDialog *dialog)
-{
-	GSList *list;
-
-	g_return_if_fail (info->widget != NULL);
-
-	switch (info->widget_type)
-	{
-		case PT_TOGGLEBUTTON:
-			g_signal_connect (G_OBJECT (info->widget), "clicked",
-					  G_CALLBACK (togglebutton_clicked_cb),
-					  (gpointer)info);
-			break;
-		case PT_RADIOBUTTON:
-			list = gtk_radio_button_get_group
-				(GTK_RADIO_BUTTON (info->widget));
-			for (; list != NULL; list = list->next)
-			{
-				g_signal_connect
-					(G_OBJECT (list->data), "clicked",
-					 G_CALLBACK (radiobutton_clicked_cb),
-					 info);
-			}
-			break;
-		case PT_SPINBUTTON:
-			g_signal_connect (G_OBJECT (info->widget), "changed",
-					  G_CALLBACK (spinbutton_changed_cb),
-					  info);
-			break;
-		case PT_COMBOBOX:
-			g_signal_connect (G_OBJECT (info->widget), "changed",
-					  G_CALLBACK (changed_cb), info);
-			break;
-		case PT_EDITABLE:
-			g_signal_connect (G_OBJECT (info->widget), "changed",
-					  G_CALLBACK (changed_cb), info);
-			break;
-		case PT_UNKNOWN:
-			break;
-	}
-}
-
-static void
-disconnect_signals (gpointer key, PropertyInfo *info, EphyDialog *dialog)
-{
-	g_return_if_fail (info->widget != NULL);
-
-	g_signal_handlers_disconnect_matched (info->widget, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, info);
-}
-
-static void
-init_props (EphyDialog *dialog, const EphyDialogProperty *properties, GtkBuilder *builder)
-{
-	int i;
-
-	for (i = 0 ; properties[i].id != NULL; i++)
-	{
-		PropertyInfo *info = g_new0 (PropertyInfo, 1);
-
-		info->id = properties[i].id;
-		info->dialog = dialog;
-		info->pref = g_strdup (properties[i].pref);
-		info->apply_type = properties[i].apply_type;
-		info->string_enum = NULL;
-		info->data_col = -1;
-
-		info->widget = (GtkWidget*)gtk_builder_get_object (builder, info->id);
-		
-		if (GTK_IS_COMBO_BOX (info->widget))
-		{
-			info->widget_type = PT_COMBOBOX;
-			info->data_type = G_TYPE_INT;
-		}
-		else if (GTK_IS_SPIN_BUTTON (info->widget))
-		{
-			info->widget_type = PT_SPINBUTTON;
-			info->data_type = G_TYPE_INT;
-		}
-		else if (GTK_IS_RADIO_BUTTON (info->widget))
-		{
-			info->widget_type = PT_RADIOBUTTON;
-			info->data_type = G_TYPE_INT;
-		}
-		else if (GTK_IS_TOGGLE_BUTTON (info->widget))
-		{
-			info->widget_type = PT_TOGGLEBUTTON;
-			info->data_type = G_TYPE_BOOLEAN;
-		}
-		else if (GTK_IS_EDITABLE (info->widget))
-		{
-			info->widget_type = PT_EDITABLE;
-			info->data_type = G_TYPE_STRING;
-		}
-		else
-		{
-			info->widget_type = PT_UNKNOWN;
-			info->data_type = G_TYPE_INVALID;
-		}
-
-		if (properties[i].data_type != 0)
-		{
-			info->data_type = properties[i].data_type;
-		}
-
-		info->loaded = FALSE;
-		info->sane_state = FALSE;
-
-		g_hash_table_insert (dialog->priv->props, (char *) info->id, info);		
-	}
-}
-
-static void
-load_info (gpointer key, PropertyInfo *info, EphyDialog *dialog)
-{
-	GValue value = { 0, };
-
-	g_return_if_fail (info->widget != NULL);
-
-	if (info->pref != NULL)
-	{
-		set_value_from_pref (info, &value);
-		set_info_from_value (info, &value);
-
-		g_signal_emit (info->dialog, signals[CHANGED], g_quark_from_string (info->id), &value);
-
-		g_value_unset (&value);
-	
-		set_sensitivity (info, eel_gconf_key_is_writable (info->pref));
-	}
-
-	info->loaded = TRUE;
-}
-
-static void
-save_info (gpointer key, PropertyInfo *info, EphyDialog *dialog)
-{
-	GValue value = { 0, };
-
-	if (info->pref == NULL || (info->apply_type & PT_NORMAL) == 0)
-	{
-		return;
-	}
-
-	if (!info->sane_state)
-	{
-		g_warning ("Not persisting insane state of id[%s]", info->id);
-		return;
-	}
-
-	if (set_value_from_info (info, &value))
-	{
-		set_pref_from_value (info, &value);
-		g_value_unset (&value);
-	}
-}
-
 static void
 setup_default_size (EphyDialog *dialog)
 {
@@ -1058,8 +132,6 @@ setup_default_size (EphyDialog *dialog)
 static void
 dialog_destroy_cb (GtkWidget *widget, EphyDialog *dialog)
 {
-	g_hash_table_foreach (dialog->priv->props, (GHFunc) save_info, dialog);
-
 	if (dialog->priv->disposing == FALSE)
 	{
 		g_object_unref (dialog);
@@ -1068,7 +140,6 @@ dialog_destroy_cb (GtkWidget *widget, EphyDialog *dialog)
 
 static void
 impl_construct (EphyDialog *dialog,
-		const EphyDialogProperty *properties,
 		const char *file,
 		const char *name,
 		const char *domain)
@@ -1087,7 +158,9 @@ impl_construct (EphyDialog *dialog,
 		return;
 	}
 
-	priv->dialog = (GtkWidget*)gtk_builder_get_object (builder, name);
+	priv->builder = g_object_ref (builder);
+	priv->dialog = GTK_WIDGET (gtk_builder_get_object (builder, name));
+
 	g_return_if_fail (priv->dialog != NULL);
 
 	if (priv->name == NULL)
@@ -1095,11 +168,6 @@ impl_construct (EphyDialog *dialog,
 		priv->name = g_strdup (name);
 	}
 
-	if (properties)
-	{
-		init_props (dialog, properties, builder);
-	}
-
 	g_signal_connect_object (dialog->priv->dialog, "destroy",
 				 G_CALLBACK(dialog_destroy_cb), dialog, 0);
 
@@ -1109,14 +177,6 @@ impl_construct (EphyDialog *dialog,
 static void
 impl_show (EphyDialog *dialog)
 {
-	if (dialog->priv->initialized == FALSE)
-	{
-		dialog->priv->initialized = TRUE;
-
-		g_hash_table_foreach (dialog->priv->props, (GHFunc) load_info, dialog);
-		g_hash_table_foreach (dialog->priv->props, (GHFunc) connect_signals, dialog);
-	}
-
 	setup_default_size (dialog);
 
 	if (dialog->priv->parent != NULL)
@@ -1132,100 +192,6 @@ impl_show (EphyDialog *dialog)
 }
 
 /**
- * ephy_dialog_add_enum:
- * @dialog: an #EphyDialog
- * @property_id: string identifier of the property to modify
- * @n_items: length of @items array
- * @items: array of items to add to @property_id
- *
- * Modifies the property identified by @property_id in @dialog to have its
- * string_enum member set to a #GList constructed with the elements given as
- * @items.
- **/
-void
-ephy_dialog_add_enum (EphyDialog *dialog,
-		      const char *property_id,
-		      guint n_items,
-		      const char *const *items)
-{
-	PropertyInfo *info;
-	int i = 0;
-	GList *l = NULL;
-
-	g_return_if_fail (EPHY_IS_DIALOG (dialog));
-
-	info = lookup_info (dialog, property_id);
-	g_return_if_fail (info != NULL);
-
-	for (i = 0; i < n_items; i++)
-	{
-		l = g_list_prepend (l, g_strdup (items[i]));
-	}
-
-	info->string_enum = g_list_reverse (l);
-}
-
-/**
- * ephy_dialog_set_data_column:
- * @dialog: an #EphyDialog
- * @property_id: string identifier of the property to modify
- * @column: value for the data_col member of @property_id
- *
- * Sets the data_col member of the property identified by @property_id in @dialog
- * to @column.
- **/
-void
-ephy_dialog_set_data_column (EphyDialog *dialog,
-			     const char *property_id,
-			     int column)
-{
-	PropertyInfo *info;
-
-	g_return_if_fail (EPHY_IS_DIALOG (dialog));
-
-	info = lookup_info (dialog, property_id);
-	g_return_if_fail (info != NULL);
-
-	info->data_col = column;
-}
-
-/**
- * ephy_dialog_set_pref:
- * @dialog: an #EphyDialog
- * @property_id: string identifier of the property to modify
- * @pref: preference value of the property identified by @property_id
- *
- * Sets the pref member of the property of @dialog identified by @property_id
- * to @pref.
- **/
-void
-ephy_dialog_set_pref (EphyDialog *dialog,
-		      const char *property_id,
-		      const char *pref)
-{
-	PropertyInfo *info;
-
-	g_return_if_fail (EPHY_IS_DIALOG (dialog));
-
-	info = lookup_info (dialog, property_id);
-	g_return_if_fail (info != NULL);
-
-	disconnect_signals (NULL, info, dialog);
-
-	info->loaded = FALSE;
-	info->sane_state = FALSE;
-	g_free (info->pref);
-	info->pref = g_strdup (pref);
-
-	if (dialog->priv->initialized)
-	{
-		/* dialog is already initialised, so initialise this here */
-		load_info (NULL, info, dialog);
-		connect_signals (NULL, info, dialog);
-	}
-}
-
-/**
  * ephy_dialog_set_size_group:
  * @dialog: an #EphyDialog
  * @first_id: id of a widget in @dialog
@@ -1250,14 +216,12 @@ ephy_dialog_set_size_group (EphyDialog *dialog,
 
 	while (first_id != NULL)
 	{
-		PropertyInfo *info;
+		GtkWidget *widget;
 
-		info = lookup_info (dialog, first_id);
-		g_return_if_fail (info != NULL);
+		widget = ephy_dialog_get_control (dialog, first_id);
+		g_return_if_fail (widget != NULL);
 
-		g_return_if_fail (info->widget != NULL);
-
-		gtk_size_group_add_widget (size_group, info->widget);
+		gtk_size_group_add_widget (size_group, widget);
 
 		first_id = va_arg (vl, const char*);
 	}
@@ -1270,24 +234,21 @@ ephy_dialog_set_size_group (EphyDialog *dialog,
 /**
  * ephy_dialog_construct:
  * @dialog: an #EphyDialog
- * @properties: an array of #EphyDialogProperty elements
  * @file: the path to a #GtkBuilder file
  * @name: name of the widget to use for @dialog, found in @file
  * @domain: translation domain to set for @dialog
  *
  * Constructs the widget part of @dialog using the widget identified by @name
- * in the #GtkBuilder file found at @file. Fills the dialog properties with
- * @properties and sets translation domain to @domain.
+ * in the #GtkBuilder file found at @file.
  **/
 void
 ephy_dialog_construct (EphyDialog *dialog,
-		       const EphyDialogProperty *properties,
 		       const char *file,
 		       const char *name,
 		       const char *domain)
 {
 	EphyDialogClass *klass = EPHY_DIALOG_GET_CLASS (dialog);
-	klass->construct (dialog, properties, file, name, domain);
+	klass->construct (dialog, file, name, domain);
 }
 
 /**
@@ -1354,16 +315,16 @@ ephy_dialog_run (EphyDialog *dialog)
  **/
 GtkWidget *
 ephy_dialog_get_control (EphyDialog *dialog,
-			 const char *property_id)
+			 const char *object_id)
 {
-	PropertyInfo *info;
+	GtkWidget *widget;
 
 	g_return_val_if_fail (EPHY_IS_DIALOG (dialog), NULL);
 
-	info = lookup_info (dialog, property_id);
-	g_return_val_if_fail (info != NULL, NULL);
+	widget = GTK_WIDGET (gtk_builder_get_object (dialog->priv->builder,
+						     object_id));
 
-	return info->widget;
+	return widget;
 }
 
 /**
@@ -1383,7 +344,6 @@ ephy_dialog_get_controls (EphyDialog *dialog,
 			  const char *first_id,
 			  ...)
 {
-	PropertyInfo *info;
 	GtkWidget **wptr;
 	va_list varargs;
 
@@ -1391,11 +351,8 @@ ephy_dialog_get_controls (EphyDialog *dialog,
 
 	while (first_id != NULL)
 	{
-		info = lookup_info (dialog, first_id);
-		g_return_if_fail (info != NULL);
-
 		wptr = va_arg (varargs, GtkWidget **);
-		*wptr = info->widget;
+		*wptr = ephy_dialog_get_control (dialog, first_id);
 
 		first_id = va_arg (varargs, const char *);
 	}
@@ -1403,68 +360,6 @@ ephy_dialog_get_controls (EphyDialog *dialog,
 	va_end (varargs);
 }
 
-/**
- * ephy_dialog_get_value:
- * @dialog: an #EphyDialog
- * @property_id: property name
- * @value: (out): location to store the value of @property_id
- *
- * Gets the value of @property_id and stores it in @value.
- *
- * Returns: %TRUE if the operation was successful
- */
-gboolean
-ephy_dialog_get_value (EphyDialog *dialog,
-		       const char *property_id,
-		       GValue *value)
-{
-	PropertyInfo *info;
-
-	g_return_val_if_fail (EPHY_IS_DIALOG (dialog), FALSE);
-
-	info = lookup_info (dialog, property_id);
-	g_return_val_if_fail (info != NULL, FALSE);
-
-	return set_value_from_info (info, value);
-}
-
-/**
- * ephy_dialog_set_value:
- * @dialog: an #EphyDialog
- * @property_id: @dialog property to set
- * @value: value to set @property_id to
- *
- * Sets the property identified by @property_id to @value in @dialog.
- **/
-void
-ephy_dialog_set_value (EphyDialog *dialog,
-		       const char *property_id,
-		       const GValue *value)
-{
-	PropertyInfo *info;
-
-	g_return_if_fail (EPHY_IS_DIALOG (dialog));
-
-	info = lookup_info (dialog, property_id);
-	g_return_if_fail (info != NULL);
-
-	set_info_from_value (info, value);
-}
-
-static void
-free_prop_info (PropertyInfo *info)
-{
-	if (info->string_enum)
-	{
-		g_list_foreach (info->string_enum, (GFunc)g_free, NULL);
-		g_list_free (info->string_enum);
-	}
-
-	g_free (info->pref);
-
-	g_free (info);
-}
-
 static void
 ephy_dialog_init (EphyDialog *dialog)
 {
@@ -1472,9 +367,6 @@ ephy_dialog_init (EphyDialog *dialog)
 
 	dialog->priv->default_width = -1;
 	dialog->priv->default_height = -1;
-
-	dialog->priv->props = g_hash_table_new_full 
-		(g_str_hash, g_str_equal, NULL, (GDestroyNotify) free_prop_info);
 }
 
 static void
@@ -1497,8 +389,6 @@ ephy_dialog_finalize (GObject *object)
 {
 	EphyDialog *dialog = EPHY_DIALOG (object);
 
-	g_hash_table_destroy (dialog->priv->props);
-
 	g_free (dialog->priv->name);
 
 	G_OBJECT_CLASS (parent_class)->finalize (object);
diff --git a/lib/ephy-dialog.h b/lib/ephy-dialog.h
index 4e73ab8..0373ea8 100644
--- a/lib/ephy-dialog.h
+++ b/lib/ephy-dialog.h
@@ -43,21 +43,6 @@ typedef struct _EphyDialog		EphyDialog;
 typedef struct _EphyDialogPrivate	EphyDialogPrivate;
 typedef struct _EphyDialogProperty	EphyDialogProperty;
 
-typedef enum
-{
-	PT_NORMAL	= 0,
-	PT_AUTOAPPLY	= 1 << 0,
-	PT_INVERTED	= 1 << 1
-} EphyDialogApplyType;
-
-struct _EphyDialogProperty
-{
-	const char *id;
-	const char *pref;
-	EphyDialogApplyType apply_type;
-	GType data_type;
-};
-
 struct _EphyDialogClass
 {
 	GObjectClass parent_class;
@@ -69,7 +54,6 @@ struct _EphyDialogClass
 
 	/* Methods */
 	void	(* construct)	(EphyDialog *dialog,
-				 const EphyDialogProperty *properties,
 				 const char *file,
 				 const char *name,
 				 const char *domain);
@@ -91,20 +75,10 @@ EphyDialog     *ephy_dialog_new			(void);
 EphyDialog     *ephy_dialog_new_with_parent	(GtkWidget *parent_window);
 
 void		ephy_dialog_construct		(EphyDialog *dialog,
-						 const EphyDialogProperty *properties,
 						 const char *file,
 						 const char *name,
 						 const char *domain);
 
-void		ephy_dialog_add_enum		(EphyDialog *dialog,
-						 const char *property_id,
-						 guint n_items,
-						 const char * const *items);
-
-void		ephy_dialog_set_data_column	(EphyDialog *dialog,
-						 const char *property_id,
-						 int column);
-
 void		ephy_dialog_set_size_group	(EphyDialog *dialog,
 						 const char *first_id,
 						 ...);
@@ -127,18 +101,6 @@ void		ephy_dialog_get_controls	(EphyDialog *dialog,
 						 const char *first_id,
 						 ...);
 
-gboolean	ephy_dialog_get_value		(EphyDialog *dialog,
-						 const char *property_id,
-						 GValue *value);
-
-void		ephy_dialog_set_value		(EphyDialog *dialog,
-						 const char *property_id,
-						 const GValue *value);
-
-void		ephy_dialog_set_pref		(EphyDialog *dialog,
-						 const char *property_id,
-						 const char *pref);
-
 G_END_DECLS
 
 #endif
diff --git a/lib/ephy-file-chooser.c b/lib/ephy-file-chooser.c
index 2fd9a7d..fe85eee 100644
--- a/lib/ephy-file-chooser.c
+++ b/lib/ephy-file-chooser.c
@@ -22,10 +22,10 @@
 
 #include "ephy-file-chooser.h"
 #include "ephy-file-helpers.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-state.h"
 #include "ephy-gui.h"
 #include "ephy-debug.h"
+#include "ephy-settings.h"
 #include "ephy-stock-icons.h"
 #include "ephy-string.h"
 
@@ -64,7 +64,8 @@ current_folder_changed_cb (GtkFileChooser *chooser, EphyFileChooser *dialog)
 
 		dir = gtk_file_chooser_get_current_folder (chooser);
 
-		eel_gconf_set_path (dialog->priv->persist_key, dir);
+		g_settings_set_string (EPHY_SETTINGS_STATE,
+				       dialog->priv->persist_key, dir);
 
 		g_free (dir);
 	}
@@ -86,7 +87,10 @@ file_chooser_response_cb (GtkWidget *widget,
 
 			dir = g_path_get_dirname (filename);
                         if (dir != NULL)
-        			eel_gconf_set_path (dialog->priv->persist_key, dir);
+				g_settings_set_string
+					(EPHY_SETTINGS_STATE,
+					 dialog->priv->persist_key,
+					 dir);
 
 			g_free (dir);
 			g_free (filename);
@@ -143,7 +147,7 @@ ephy_file_chooser_set_persist_key (EphyFileChooser *dialog, const char *key)
 
 	dialog->priv->persist_key = g_strdup (key);
 
-	dir = eel_gconf_get_string (key);
+	dir = g_settings_get_string (EPHY_SETTINGS_STATE, key);
 	if (dir != NULL)
 	{
 		/* FIXME: Maybe we will find a better way to do this when the
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c
index 495164d..1a36cb4 100644
--- a/lib/ephy-file-helpers.c
+++ b/lib/ephy-file-helpers.c
@@ -25,8 +25,8 @@
 #include "ephy-file-helpers.h"
 
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
+#include "ephy-settings.h"
 #include "ephy-string.h"
 
 #include <glib.h>
@@ -154,7 +154,8 @@ ephy_file_get_downloads_dir (void)
 {
 	char *download_dir, *expanded;
 
-	download_dir = eel_gconf_get_string (CONF_STATE_DOWNLOAD_DIR);
+	download_dir = g_settings_get_string (EPHY_SETTINGS_STATE,
+					      EPHY_PREFS_STATE_DOWNLOAD_DIR);
 
 	if (download_dir && strcmp (download_dir, _("Downloads")) == 0)
 	{
diff --git a/lib/ephy-prefs.h b/lib/ephy-prefs.h
index 5f2fa16..e61a49e 100644
--- a/lib/ephy-prefs.h
+++ b/lib/ephy-prefs.h
@@ -1,5 +1,6 @@
 /*
  *  Copyright © 2000-2003 Marco Pesenti Gritti
+ *  Copyright © 2010 Igalia S.L.
  *
  *  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
@@ -26,54 +27,93 @@
 
 G_BEGIN_DECLS
 
-#define EPIPHANY_SCHEMA_VERSION 1
-#define CONF_SCHEMA_VERSION "/apps/epiphany/schema_version"
+typedef enum
+{
+	EPHY_PREFS_UI_TOOLBAR_STYLE_BOTH,
+	EPHY_PREFS_UI_TOOLBAR_STYLE_BOTH_HORIZ,
+	EPHY_PREFS_UI_TOOLBAR_STYLE_BOTH_ICONS,
+	EPHY_PREFS_UI_TOOLBAR_STYLE_BOTH_TEXT
+} EphyPrefsUIToolbarStyle;
 
-/* General */
-#define CONF_GENERAL_HOMEPAGE			"/apps/epiphany/general/homepage"
-#define CONF_URL_SEARCH     			"/apps/epiphany/general/url_search"
-#define CONF_ALWAYS_SHOW_TABS_BAR		"/apps/epiphany/general/always_show_tabs_bar"
-#define CONF_WINDOWS_SHOW_TOOLBARS		"/apps/epiphany/general/show_toolbars"
-#define CONF_WINDOWS_SHOW_BOOKMARKS_BAR		"/apps/epiphany/general/show_bookmarks_bar"
-#define CONF_WINDOWS_SHOW_STATUSBAR		"/apps/epiphany/general/show_statusbar"
-#define CONF_INTERFACE_MIDDLE_CLICK_OPEN_URL	"/apps/epiphany/general/middle_click_open_url"
-#define CONF_INTERFACE_TOOLBAR_STYLE		"/apps/epiphany/general/toolbar_style"
-#define CONF_INTERFACE_OPEN_NEW_WINDOWS_IN_TAB	"/apps/epiphany/general/open_new_windows_in_tab"
-#define CONF_AUTO_DOWNLOADS			"/apps/epiphany/general/automatic_downloads"
-#define CONF_DESKTOP_IS_HOME_DIR		"/apps/nautilus/preferences/desktop_is_home_dir"
-#define CONF_NETWORK_MANAGED			"/apps/epiphany/general/managed_network"
-#define CONF_DOWNLOADS_HIDDEN			"/apps/epiphany/dialogs/downloads_hidden"
-#define CONF_WARN_ON_CLOSE_UNSUBMITTED_DATA     "/apps/epiphany/dialogs/warn_on_close_unsubmitted_data"
+typedef enum
+{
+	EPHY_PREFS_WEB_COOKIES_POLICY_ALWAYS,
+	EPHY_PREFS_WEB_COOKIES_POLICY_NO_THIRD_PARTY,
+	EPHY_PREFS_WEB_COOKIES_POLICY_NEVER
+} EphyPrefsWebCookiesPolicy;
 
-/* Directories */
-#define CONF_STATE_SAVE_DIR		"/apps/epiphany/directories/save"
-#define CONF_STATE_SAVE_IMAGE_DIR	"/apps/epiphany/directories/saveimage"
-#define CONF_STATE_OPEN_DIR		"/apps/epiphany/directories/open"
-#define CONF_STATE_DOWNLOAD_DIR		"/apps/epiphany/directories/downloads_folder"
-#define CONF_STATE_UPLOAD_DIR		"/apps/epiphany/directories/upload"
+typedef enum
+{
+	EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_HALF_HOUR,
+	EPHY_PREFS_STATE_HISTORY_DATE_FILTER_EVER,
+	EPHY_PREFS_STATE_HISTORY_DATE_FILTER_TODAY,
+	EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_TWO_DAYS,
+	EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_THREE_DAYS
+} EphyPrefsStateHistoryDateFilter;
 
-/* Lockdown */
-#define CONF_LOCKDOWN_FULLSCREEN		"/apps/epiphany/lockdown/fullscreen"
-#define CONF_LOCKDOWN_DISABLE_ARBITRARY_URL	"/apps/epiphany/lockdown/disable_arbitrary_url"
-#define CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING  "/apps/epiphany/lockdown/disable_bookmark_editing"
-#define CONF_LOCKDOWN_DISABLE_TOOLBAR_EDITING	"/apps/epiphany/lockdown/disable_toolbar_editing"
-#define CONF_LOCKDOWN_DISABLE_HISTORY		"/apps/epiphany/lockdown/disable_history"
-#define CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK	"/desktop/gnome/lockdown/disable_save_to_disk"
-#define CONF_LOCKDOWN_DISABLE_HISTORY		"/apps/epiphany/lockdown/disable_history"
-#define CONF_LOCKDOWN_DISABLE_PRINTING		"/desktop/gnome/lockdown/disable_printing"
-#define CONF_LOCKDOWN_DISABLE_PRINT_SETUP	"/desktop/gnome/lockdown/disable_print_setup"
-#define CONF_LOCKDOWN_DISABLE_COMMAND_LINE	"/desktop/gnome/lockdown/disable_command_line"
-#define CONF_LOCKDOWN_DISABLE_QUIT		"/apps/epiphany/lockdown/disable_quit"
-#define CONF_LOCKDOWN_DISABLE_JAVASCRIPT_CHROME	"/apps/epiphany/lockdown/disable_javascript_chrome"
+#define EPHY_PREFS_UI_SCHEMA			"org.gnome.Epiphany.ui"
+#define EPHY_PREFS_UI_ALWAYS_SHOW_TABS_BAR	"always-show-tabs-bar"
+#define EPHY_PREFS_UI_SHOW_TOOLBARS		"show-toolbars"
+#define EPHY_PREFS_UI_SHOW_BOOKMARKS_BAR	"show-bookmarks-bar"
+#define EPHY_PREFS_UI_TOOLBAR_STYLE		"toolbar-style"
+#define EPHY_PREFS_UI_DOWNLOADS_HIDDEN		"downloads-hidden"
 
-/* System prefs */
-#define CONF_DESKTOP_FTP_HANDLER	"/desktop/gnome/url-handlers/ftp/command"
-#define CONF_DESKTOP_TOOLBAR_STYLE	"/desktop/gnome/interface/toolbar_style"
-#define CONF_DESKTOP_BG_PICTURE		"/desktop/gnome/background/picture_filename"
-#define CONF_DESKTOP_BG_TYPE		"/desktop/gnome/background/picture_options"
+#define EPHY_PREFS_STATE_SCHEMA			"org.gnome.Epiphany.state"
+#define EPHY_PREFS_STATE_SAVE_DIR		"save-dir"
+#define EPHY_PREFS_STATE_SAVE_IMAGE_DIR		"save-image-dir"
+#define EPHY_PREFS_STATE_OPEN_DIR		"open-dir"
+#define EPHY_PREFS_STATE_DOWNLOAD_DIR		"download-dir"
+#define EPHY_PREFS_STATE_UPLOAD_DIR		"upload-dir"
+#define EPHY_PREFS_STATE_RECENT_ENCODINGS	"recent-encodings"
+#define EPHY_PREFS_STATE_BOOKMARKS_VIEW_TITLE	"bookmarks-view-title"
+#define EPHY_PREFS_STATE_BOOKMARKS_VIEW_ADDRESS	"bookmarks-view-address"
+#define EPHY_PREFS_STATE_HISTORY_VIEW_TITLE	"history-view-title"
+#define EPHY_PREFS_STATE_HISTORY_VIEW_ADDRESS	"history-view-address"
+#define EPHY_PREFS_STATE_HISTORY_VIEW_DATE	"history-view-date"
+#define EPHY_PREFS_STATE_HISTORY_DATE_FILTER	"history-date-filter"
 
-/* Privacy */
-#define CONF_PRIVACY_REMEMBER_PASSWORDS "/apps/epiphany/general/remember_passwords"
+#define EPHY_PREFS_WEB_SCHEMA			"org.gnome.Epiphany.web"
+#define EPHY_PREFS_WEB_FONT_MIN_SIZE		"min-font-size"
+#define EPHY_PREFS_WEB_LANGUAGE			"language"
+#define EPHY_PREFS_WEB_USE_OWN_FONTS		"use-own-fonts"
+#define EPHY_PREFS_WEB_USE_OWN_COLORS		"use-own-colors"
+#define EPHY_PREFS_WEB_ENABLE_USER_CSS		"enable-user-css"
+#define EPHY_PREFS_WEB_ENABLE_POPUPS		"enable-popups"
+#define EPHY_PREFS_WEB_ENABLE_PLUGINS		"enable-plugins"
+#define EPHY_PREFS_WEB_ENABLE_JAVASCRIPT	"enable-javascript"
+#define EPHY_PREFS_WEB_COOKIES_POLICY		"cookies-policy"
+#define EPHY_PREFS_WEB_IMAGE_ANIMATION_MODE	"image-animation-mode"
+#define EPHY_PREFS_WEB_DEFAULT_ENCODING		"default-encoding"
+
+#define EPHY_PREFS_SCHEMA			"org.gnome.Epiphany"
+#define EPHY_PREFS_HOMEPAGE_URL			"homepage-url"
+#define EPHY_PREFS_USER_AGENT			"user-agent"
+#define EPHY_PREFS_CACHE_SIZE			"cache-size"
+#define EPHY_PREFS_NEW_WINDOWS_IN_TABS		"new-windows-in-tabs"
+#define EPHY_PREFS_AUTO_DOWNLOADS		"automatic-downloads"
+#define EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA	"warn-on-close-unsubmitted-data"
+#define EPHY_PREFS_MIDDLE_CLICK_OPENS_URL	"middle-click-opens-url"
+#define EPHY_PREFS_REMEMBER_PASSWORDS		"remember-passwords"
+#define EPHY_PREFS_KEYWORD_SEARCH_URL		"keyword-search-url"
+#define EPHY_PREFS_MANAGED_NETWORK		"managed-network"
+#define EPHY_PREFS_ENABLE_SMOOTH_SCROLLING	"enable-smooth-scrolling"
+#define EPHY_PREFS_ENABLE_WEB_INSPECTOR		"enable-web-inspector"
+#define EPHY_PREFS_ENABLE_CARET_BROWSING	"enable-caret-browsing"
+#define EPHY_PREFS_ENABLED_EXTENSIONS		"enabled-extensions"
+
+#define EPHY_PREFS_LOCKDOWN_SCHEMA		"org.gnome.Epiphany.lockdown"
+#define EPHY_PREFS_LOCKDOWN_FULLSCREEN		"disable-fullscreen"
+#define EPHY_PREFS_LOCKDOWN_ARBITRARY_URL	"disable-arbitrary-url"
+#define EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING	"disable-bookmark-editing"
+#define EPHY_PREFS_LOCKDOWN_TOOLBAR_EDITING	"disable-toolbar-editing"
+#define EPHY_PREFS_LOCKDOWN_HISTORY		"disable-history"
+#define EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK	"disable-save-to-disk"
+#define EPHY_PREFS_LOCKDOWN_PRINTING		"disable-printing"
+#define EPHY_PREFS_LOCKDOWN_PRINT_SETUP		"disable-print-setup"
+#define EPHY_PREFS_LOCKDOWN_COMMAND_LINE	"disable-command-line"
+#define EPHY_PREFS_LOCKDOWN_QUIT		"disable-quit"
+#define EPHY_PREFS_LOCKDOWN_JAVASCRIPT_CHROME	"disable-javascript-chrome"
+#define EPHY_PREFS_LOCKDOWN_MENUBAR		"disable-menubar"
 
 G_END_DECLS
 
diff --git a/lib/ephy-settings.c b/lib/ephy-settings.c
new file mode 100644
index 0000000..4c98109
--- /dev/null
+++ b/lib/ephy-settings.c
@@ -0,0 +1,65 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=2 sts=2 et: */
+/*
+ *  Copyright © 2010 Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+
+#include "ephy-settings.h"
+
+#include "ephy-debug.h"
+
+#include <glib.h>
+#include <gio/gio.h>
+
+static GHashTable *settings = NULL;
+
+void
+ephy_settings_shutdown (void)
+{
+  if (settings != NULL) {
+    g_hash_table_remove_all (settings);
+    g_hash_table_unref (settings);
+  }
+}
+
+GSettings *
+ephy_settings_get (const char *schema)
+{
+  GSettings *gsettings = NULL;
+
+  if (settings == NULL) {
+    settings = g_hash_table_new_full (g_str_hash,
+                                      g_str_equal, g_free,
+                                      g_object_unref);
+  }
+
+  gsettings = g_hash_table_lookup (settings, schema);
+
+  if (gsettings == NULL) {
+    gsettings = g_settings_new (schema);
+
+    if (gsettings == NULL)
+      g_warning ("Invalid schema requested");
+    else
+      g_hash_table_insert (settings, g_strdup (schema), gsettings);
+  }
+
+  return gsettings;
+}
diff --git a/lib/ephy-settings.h b/lib/ephy-settings.h
new file mode 100644
index 0000000..197941c
--- /dev/null
+++ b/lib/ephy-settings.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=2 sts=2 et: */
+/*
+ *  Copyright © 2010 Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
+#error "Only <epiphany/epiphany.h> can be included directly."
+#endif
+
+#ifndef EPHY_SETTINGS_H
+#define EPHY_SETTINGS_H
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include "ephy-prefs.h"
+
+#define EPHY_SETTINGS_MAIN      ephy_settings_get (EPHY_PREFS_SCHEMA)
+#define EPHY_SETTINGS_UI        ephy_settings_get (EPHY_PREFS_UI_SCHEMA)
+#define EPHY_SETTINGS_WEB       ephy_settings_get (EPHY_PREFS_WEB_SCHEMA)
+#define EPHY_SETTINGS_LOCKDOWN  ephy_settings_get (EPHY_PREFS_LOCKDOWN_SCHEMA)
+#define EPHY_SETTINGS_STATE     ephy_settings_get (EPHY_PREFS_STATE_SCHEMA)
+
+GSettings *ephy_settings_get (const char *schema);
+
+void ephy_settings_shutdown (void);
+
+#endif /* EPHY_SETTINGS_H */
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 03d922a..85ca445 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -4,8 +4,7 @@
 data/bme.desktop.in.in
 [type: gettext/xml] data/default-bookmarks.rdf.in
 data/epiphany.desktop.in.in
-data/epiphany-lockdown.schemas.in
-data/epiphany.schemas.in
+data/org.gnome.epiphany.gschema.xml.in
 [type: gettext/glade] data/glade/certificate-dialogs.ui
 [type: gettext/glade] data/glade/epiphany.ui
 [type: gettext/glade] data/glade/form-signing-dialog.ui
@@ -20,7 +19,6 @@ embed/ephy-embed-utils.c
 embed/ephy-encodings.c
 embed/ephy-history.c
 embed/ephy-web-view.c
-lib/eel-gconf-extensions.c
 lib/egg/eggdesktopfile.c
 lib/egg/eggsmclient.c
 lib/egg/egg-editable-toolbar.c
diff --git a/src/bookmarks/ephy-bookmark-properties.c b/src/bookmarks/ephy-bookmark-properties.c
index b681f21..c566678 100644
--- a/src/bookmarks/ephy-bookmark-properties.c
+++ b/src/bookmarks/ephy-bookmark-properties.c
@@ -34,8 +34,7 @@
 #include "ephy-gui.h"
 #include "ephy-dnd.h"
 #include "ephy-prefs.h"
-
-#include "eel-gconf-extensions.h"
+#include "ephy-settings.h"
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -523,7 +522,8 @@ ephy_bookmark_properties_constructor (GType type,
 				       EPHY_STATE_WINDOW_SAVE_SIZE);
 	}
 	/* Lockdown */
-	lockdown = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING);
+	lockdown = g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+					   EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING);
 
 	update_window_title (properties);
 	content_area = gtk_dialog_get_content_area (dialog);
diff --git a/src/bookmarks/ephy-bookmarks-editor.c b/src/bookmarks/ephy-bookmarks-editor.c
index 2f81b8c..32a25ca 100644
--- a/src/bookmarks/ephy-bookmarks-editor.c
+++ b/src/bookmarks/ephy-bookmarks-editor.c
@@ -34,6 +34,7 @@
 #include "ephy-node-view.h"
 #include "ephy-window.h"
 #include "ephy-dnd.h"
+#include "ephy-settings.h"
 #include "ephy-shell.h"
 #include "ephy-session.h"
 #include "ephy-file-helpers.h"
@@ -45,7 +46,6 @@
 #include "ephy-stock-icons.h"
 #include "ephy-search-entry.h"
 #include "ephy-favicon-cache.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
 #include "egg-toolbars-model.h"
 #include "ephy-prefs.h"
@@ -126,8 +126,6 @@ static void cmd_help_contents		  (GtkAction *action,
 
 #define EPHY_BOOKMARKS_EDITOR_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_BOOKMARKS_EDITOR, EphyBookmarksEditorPrivate))
 
-#define CONF_BOOKMARKS_VIEW_DETAILS "/apps/epiphany/dialogs/bookmarks_view_details"
-
 #define RESERVED_STRING N_("Remove from this topic")
 
 struct _EphyBookmarksEditorPrivate
@@ -216,22 +214,11 @@ static const GtkToggleActionEntry ephy_bookmark_toggle_entries [] = {
 	{ "ShowOnToolbar", NULL, N_("_Show on Toolbar"), NULL,
 	  N_("Show the selected bookmark on a toolbar"), 
 	  G_CALLBACK (cmd_toolbar), FALSE },
-};
-
-enum
-{
-	VIEW_TITLE,
-	VIEW_TITLE_AND_ADDRESS
-};
-
-static const GtkRadioActionEntry ephy_bookmark_radio_entries [] =
-{
 	/* View Menu */
 	{ "ViewTitle", NULL, N_("_Title"), NULL,
-	  N_("Show only the title column"), VIEW_TITLE },
-	{ "ViewTitleAddress", NULL, N_("T_itle and Address"), NULL,
-	  N_("Show both the title and address columns"),
-	  VIEW_TITLE_AND_ADDRESS } 
+	  N_("Show the title column"), NULL, TRUE },
+	{ "ViewAddress", NULL, N_("Address"), NULL,
+	  N_("Show the address column"), NULL, FALSE }
 };
 
 G_DEFINE_TYPE (EphyBookmarksEditor, ephy_bookmarks_editor, GTK_TYPE_WINDOW)
@@ -1117,50 +1104,6 @@ cmd_help_contents (GtkAction *action,
 }
 
 static void
-set_columns_visibility (EphyBookmarksEditor *editor, int value)
-{
-	switch (value)
-	{
-		case VIEW_TITLE:
-			gtk_tree_view_column_set_visible (editor->priv->title_col, TRUE);
-			gtk_tree_view_column_set_visible (editor->priv->address_col, FALSE);
-			break;
-		case VIEW_TITLE_AND_ADDRESS:
-			gtk_tree_view_column_set_visible (editor->priv->title_col, TRUE);
-			gtk_tree_view_column_set_visible (editor->priv->address_col, TRUE);
-			break;
-	}
-}
-
-static void
-cmd_view_columns (GtkAction *action,
-		  GtkRadioAction *current,
-		  EphyBookmarksEditor *editor)
-{
-	int value;
-	GSList *svalues = NULL;
-
-	g_return_if_fail (EPHY_IS_BOOKMARKS_EDITOR (editor));
-
-	value = gtk_radio_action_get_current_value (current);
-	set_columns_visibility (editor, value);
-
-	switch (value)
-	{
-		case VIEW_TITLE:
-			svalues = g_slist_append (svalues, (gpointer)"title");
-			break;
-		case VIEW_TITLE_AND_ADDRESS:
-			svalues = g_slist_append (svalues, (gpointer)"title");
-			svalues = g_slist_append (svalues, (gpointer)"address");
-			break;
-	}
-
-	eel_gconf_set_string_list (CONF_BOOKMARKS_VIEW_DETAILS, svalues);
-	g_slist_free (svalues);
-}
-
-static void
 ephy_bookmarks_editor_show (GtkWidget *widget)
 {
 	EphyBookmarksEditor *editor = EPHY_BOOKMARKS_EDITOR (widget);
@@ -1699,31 +1642,6 @@ provide_keyword_uri (EphyNode *node, GValue *value, gpointer data)
 	g_free (uri);
 }
 
-static int
-get_details_value (EphyBookmarksEditor *editor)
-{
-	int value;
-	GSList *svalues;
-
-	svalues = eel_gconf_get_string_list (CONF_BOOKMARKS_VIEW_DETAILS);
-
-	if (svalues &&
-	    g_slist_find_custom (svalues, "title", (GCompareFunc)strcmp) &&
-	    g_slist_find_custom (svalues, "address", (GCompareFunc)strcmp))
-	{
-		value = VIEW_TITLE_AND_ADDRESS;
-	}
-	else
-	{
-		value = VIEW_TITLE;
-	}
-
-	g_slist_foreach (svalues, (GFunc) g_free, NULL);
-	g_slist_free (svalues);
-
-	return value;
-}
-
 static void
 ephy_bookmarks_editor_construct (EphyBookmarksEditor *editor)
 {
@@ -1735,7 +1653,7 @@ ephy_bookmarks_editor_construct (EphyBookmarksEditor *editor)
 	GtkUIManager *ui_merge;
 	GtkActionGroup *action_group;
 	GtkAction *action;
-	int col_id, url_col_id, title_col_id, details_value;
+	int col_id, url_col_id, title_col_id;
 
 	ephy_gui_ensure_window_group (GTK_WINDOW (editor));
 
@@ -1758,13 +1676,6 @@ ephy_bookmarks_editor_construct (EphyBookmarksEditor *editor)
 	gtk_action_group_add_toggle_actions (action_group, ephy_bookmark_toggle_entries,
 					     G_N_ELEMENTS (ephy_bookmark_toggle_entries), editor);
 
-	details_value = get_details_value (editor);
-	gtk_action_group_add_radio_actions (action_group,
-					    ephy_bookmark_radio_entries,
-					    G_N_ELEMENTS (ephy_bookmark_radio_entries),
-					    details_value,
-					    G_CALLBACK (cmd_view_columns), 
-					    editor);
 	gtk_ui_manager_insert_action_group (ui_merge,
 					    action_group, 0);
 	gtk_ui_manager_add_ui_from_file (ui_merge,
@@ -1901,6 +1812,27 @@ ephy_bookmarks_editor_construct (EphyBookmarksEditor *editor)
 	gtk_container_add (GTK_CONTAINER (scrolled_window), bm_view);
 	gtk_widget_show (bm_view);
 	editor->priv->bm_view = bm_view;
+
+	action = gtk_action_group_get_action (action_group, "ViewTitle");
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_BOOKMARKS_VIEW_TITLE,
+			 action, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_BOOKMARKS_VIEW_TITLE,
+			 editor->priv->title_col, "visible",
+			 G_SETTINGS_BIND_DEFAULT);
+
+	action = gtk_action_group_get_action (action_group, "ViewAddress");
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_BOOKMARKS_VIEW_ADDRESS,
+			 action, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_BOOKMARKS_VIEW_ADDRESS,
+			 editor->priv->address_col, "visible",
+			 G_SETTINGS_BIND_DEFAULT);
+
 	g_signal_connect (G_OBJECT (bm_view),
 			  "key_press_event",
 			  G_CALLBACK (key_pressed_cb),
@@ -1931,12 +1863,12 @@ ephy_bookmarks_editor_construct (EphyBookmarksEditor *editor)
 			       "bookmarks_paned",
 			       130);
 
-	set_columns_visibility (editor, details_value);
-
 	/* Lockdown settings */
 	action = gtk_action_group_get_action (action_group, "Export");
 	gtk_action_set_sensitive (action,
-				  eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK) == FALSE);
+				  g_settings_get_boolean
+				   (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK) == FALSE);
 }
 
 void
diff --git a/src/bookmarks/ephy-bookmarks-import.c b/src/bookmarks/ephy-bookmarks-import.c
index 1efdb71..f6ed781 100644
--- a/src/bookmarks/ephy-bookmarks-import.c
+++ b/src/bookmarks/ephy-bookmarks-import.c
@@ -32,8 +32,7 @@
 #include "ephy-bookmarks-import.h"
 #include "ephy-debug.h"
 #include "ephy-prefs.h"
-
-#include "eel-gconf-extensions.h"
+#include "ephy-settings.h"
 
 /**
  * NSItemType: netscape bookmark item type
@@ -73,7 +72,9 @@ ephy_bookmarks_import (EphyBookmarks *bookmarks,
 	GFile *file;
 	GFileInfo *file_info;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return FALSE;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
+		return FALSE;
 
 	g_return_val_if_fail (filename != NULL, FALSE);
 	
@@ -712,7 +713,9 @@ ephy_bookmarks_import_mozilla (EphyBookmarks *bookmarks,
 	char *parsedname;
 	GList *folders = NULL;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return FALSE;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
+		return FALSE;
 
 	name = g_string_new (NULL);
 	url = g_string_new (NULL);
@@ -792,7 +795,9 @@ ephy_bookmarks_import_xbel (EphyBookmarks *bookmarks,
 	xmlTextReaderPtr reader;
 	int ret;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return FALSE;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
+		return FALSE;
 
 	if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE)
 	{
@@ -969,7 +974,8 @@ ephy_bookmarks_import_rdf (EphyBookmarks *bookmarks,
 	xmlNodePtr child;
 	xmlNodePtr root;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return FALSE;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
 
 	if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE)
 		return FALSE;
diff --git a/src/bookmarks/ephy-bookmarks-ui.c b/src/bookmarks/ephy-bookmarks-ui.c
index 91479db..1f97edd 100644
--- a/src/bookmarks/ephy-bookmarks-ui.c
+++ b/src/bookmarks/ephy-bookmarks-ui.c
@@ -20,7 +20,6 @@
 
 #include "config.h"
 
-#include "eel-gconf-extensions.h"
 #include "ephy-bookmarks.h"
 #include "ephy-bookmarks-ui.h"
 #include "ephy-bookmarks-menu.h"
@@ -36,6 +35,7 @@
 #include "ephy-node-common.h"
 #include "ephy-link.h"
 #include "ephy-dnd.h"
+#include "ephy-embed-shell.h"
 #include "ephy-history.h"
 #include "ephy-shell.h"
 #include "ephy-string.h"
@@ -44,6 +44,7 @@
 #include "ephy-gui.h"
 #include "ephy-stock-icons.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "egg-editable-toolbar.h"
 
 #include <string.h>
@@ -434,7 +435,9 @@ ephy_bookmarks_ui_add_bookmark (GtkWindow *parent,
 	EphyNode *bookmark;
 	GtkWidget *dialog;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
+		return;
 	
 	bookmarks = ephy_shell_get_bookmarks (ephy_shell_get_default ());
 	bookmark = ephy_bookmarks_add (bookmarks, title, location);
diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c
index 5074269..43c1ad9 100644
--- a/src/bookmarks/ephy-bookmarks.c
+++ b/src/bookmarks/ephy-bookmarks.c
@@ -34,12 +34,11 @@
 #include "ephy-bookmarks-import.h"
 #include "ephy-bookmark-properties.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-marshal.h"
 #include "ephy-signal-accumulator.h"
 #include "ephy-stock-icons.h"
 
-#include "eel-gconf-extensions.h"
-
 #include <string.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -82,7 +81,6 @@ struct _EphyBookmarksPrivate
 	EphyNode *smartbookmarks;
 	EphyNode *lower_fav;
 	double lower_score;
-	guint disable_bookmark_editing_notifier_id;
 
 #ifdef ENABLE_ZEROCONF
 	/* Local sites */
@@ -630,14 +628,6 @@ topics_removed_cb (EphyNode *node,
 }
 
 static void
-update_bookmark_editing (EphyBookmarks *eb)
-{
-	g_object_set (G_OBJECT (eb->priv->db),
-		      "immutable", eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING),
-		      NULL);
-}
-
-static void
 fix_hierarchy_topic (EphyBookmarks *eb,
 		     EphyNode *topic)
 {
@@ -693,15 +683,6 @@ fix_hierarchy (EphyBookmarks *eb)
 }
 
 static void
-disable_bookmark_editing_notifier (GConfClient *client,
-				   guint cnxn_id,
-				   GConfEntry *entry,
-				   EphyBookmarks *eb)
-{
-	update_bookmark_editing (eb);
-}
-
-static void
 backup_file (const char *original_filename, const char *extension)
 {
 	char *template, *backup_filename;
@@ -1339,10 +1320,10 @@ ephy_bookmarks_init (EphyBookmarks *eb)
 	
 	fix_hierarchy (eb);
 
-	eb->priv->disable_bookmark_editing_notifier_id = eel_gconf_notification_add
-		(CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING,
-		 (GConfClientNotifyFunc)disable_bookmark_editing_notifier, eb);
-	update_bookmark_editing (eb);
+	g_settings_bind (EPHY_SETTINGS_LOCKDOWN,
+			 EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING,
+			 eb->priv->db, "immutable",
+			 G_SETTINGS_BIND_GET);
 
 	ephy_setup_history_notifiers (eb);
 	ephy_bookmarks_update_favorites (eb);
@@ -1354,8 +1335,6 @@ ephy_bookmarks_finalize (GObject *object)
 	EphyBookmarks *eb = EPHY_BOOKMARKS (object);
 	EphyBookmarksPrivate *priv = eb->priv;
 
-	eel_gconf_notification_remove (priv->disable_bookmark_editing_notifier_id);
-
 	if (priv->save_timeout_id != 0)
 	{
 		g_source_remove (priv->save_timeout_id);
diff --git a/src/ephy-activation.c b/src/ephy-activation.c
index 85e2cf9..802ca4b 100644
--- a/src/ephy-activation.c
+++ b/src/ephy-activation.c
@@ -21,10 +21,10 @@
 
 #include "ephy-activation.h"
 
+#include "ephy-settings.h"
 #include "ephy-shell.h"
 #include "ephy-session.h"
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
 
 static gboolean
@@ -86,7 +86,8 @@ ephy_activation_open_bookmarks_editor (EphyDbus *ephy_dbus,
 				       guint startup_id,
 				       GError **error)
 {
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING))
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
 	{
 		g_set_error (error,
 			     g_quark_from_static_string ("ephy-activation-error"),
diff --git a/src/ephy-encoding-dialog.c b/src/ephy-encoding-dialog.c
index 7bb055c..009a3dd 100644
--- a/src/ephy-encoding-dialog.c
+++ b/src/ephy-encoding-dialog.c
@@ -39,25 +39,6 @@
 #include <string.h>
 #include <webkit/webkit.h>
 
-enum
-{
-	WINDOW_PROP,
-	SCROLLED_WINDOW_PROP,
-	AUTOMATIC_PROP,
-	MANUAL_PROP
-};
-
-static const
-EphyDialogProperty properties [] =
-{
-	{ "encoding_dialog",	NULL, PT_NORMAL, 0 },
-	{ "scrolled_window",	NULL, PT_NORMAL, 0 },
-	{ "automatic_button",	NULL, PT_NORMAL, 0 },
-	{ "manual_button",	NULL, PT_NORMAL, 0 },
-
-	{ NULL }
-};
-
 #define EPHY_ENCODING_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ENCODING_DIALOG, EphyEncodingDialogPrivate))
 
 struct _EphyEncodingDialogPrivate
@@ -127,7 +108,8 @@ sync_encoding_against_embed (EphyEncodingDialog *dialog)
 		g_list_free (rows);
 	}
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[AUTOMATIC_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+					  "automatic_button");
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), is_automatic);
 
 	dialog->priv->update_tag = FALSE;
@@ -206,7 +188,8 @@ activate_choice (EphyEncodingDialog *dialog)
 	embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG (dialog));
 	g_return_if_fail (EPHY_IS_EMBED (embed));
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[AUTOMATIC_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+					  "automatic_button");
 	is_automatic = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
 
 	view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
@@ -253,7 +236,7 @@ view_node_selected_cb (EphyNodeView *view,
 
 	if (dialog->priv->update_tag) return;
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[MANUAL_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
 
 	activate_choice (dialog);
@@ -270,7 +253,7 @@ view_node_activated_cb (GtkWidget *view,
 
 	if (dialog->priv->update_tag) return;
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[MANUAL_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
 
 	activate_choice (dialog);
@@ -302,12 +285,12 @@ ephy_encoding_dialog_init (EphyEncodingDialog *dialog)
 				(EPHY_EMBED_SHELL (ephy_shell)));
 
 	ephy_dialog_construct (EPHY_DIALOG (dialog),
-			       properties,
 			       ephy_file ("epiphany.ui"),
 			       "encoding_dialog",
 			       NULL);
 
-	window = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[WINDOW_PROP].id);
+	window = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+					  "encoding_dialog");
 	g_signal_connect (window, "response",
 			  G_CALLBACK (ephy_encoding_dialog_response_cb), dialog);
 
@@ -341,17 +324,18 @@ ephy_encoding_dialog_init (EphyEncodingDialog *dialog)
 
 	gtk_widget_show (treeview);
 
-	scroller = ephy_dialog_get_control
-			(EPHY_DIALOG (dialog), properties[SCROLLED_WINDOW_PROP].id);
+	scroller = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+					    "scrolled_window");
 	gtk_container_add (GTK_CONTAINER (scroller), treeview);
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[AUTOMATIC_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+					  "automatic_button");
 	child = gtk_bin_get_child (GTK_BIN (button));
 	gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
 	g_signal_connect (button, "toggled",
 			  G_CALLBACK (automatic_toggled_cb), dialog);
 
-	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[MANUAL_PROP].id);
+	button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
 	gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
 
 	dialog->priv->enc_view = treeview;
diff --git a/src/ephy-extensions-manager.c b/src/ephy-extensions-manager.c
index e3e57ff..35122c8 100644
--- a/src/ephy-extensions-manager.c
+++ b/src/ephy-extensions-manager.c
@@ -32,12 +32,11 @@
 
 #include "ephy-node-db.h"
 #include "ephy-shell.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-file-helpers.h"
 #include "ephy-object-helpers.h"
 #include "ephy-debug.h"
-
-#include <gconf/gconf-client.h>
+#include "ephy-prefs.h"
+#include "ephy-settings.h"
 
 #include <gio/gio.h>
 #include <gmodule.h>
@@ -47,7 +46,6 @@
 #include "ephy-seed-loader.h"
 #endif
 
-#define CONF_LOADED_EXTENSIONS	"/apps/epiphany/general/active_extensions"
 #define EE_GROUP		"Epiphany Extension"
 #define DOT_INI			".ephy-extension"
 #define RELOAD_DELAY		333 /* ms */
@@ -64,7 +62,6 @@ struct _EphyExtensionsManagerPrivate
 	GList *extensions;
 	GList *dir_monitors;
 	GList *windows;
-	guint active_extensions_notifier_id;
 	guint sync_timeout_id;
 	GHashTable *reload_hash;
 };
@@ -110,35 +107,60 @@ G_DEFINE_TYPE_WITH_CODE (EphyExtensionsManager, ephy_extensions_manager, G_TYPE_
 			 G_IMPLEMENT_INTERFACE (EPHY_TYPE_EXTENSION,
 						ephy_extensions_manager_iface_init))
 
-/**
- * ephy_extensions_manager_load:
- * @manager: an #EphyExtensionsManager
- * @identifier: identifier of the extension to load
- *
- * Loads the extension corresponding to @identifier.
- **/
-void
-ephy_extensions_manager_load (EphyExtensionsManager *manager,
-			      const char *identifier)
+static void
+ephy_extensions_manager_toggle_load (EphyExtensionsManager *manager,
+				     const char *identifier,
+				     gboolean status)
 {
-	GSList *gconf_exts;
+	char **exts;
+	GVariantBuilder builder;
+	gboolean dirty = FALSE;
+	int i;
 
 	g_return_if_fail (EPHY_IS_EXTENSIONS_MANAGER (manager));
 	g_return_if_fail (identifier != NULL);
 
-	LOG ("Adding '%s' to extensions", identifier);
+	if (status)
+		LOG ("Adding '%s' to extensions", identifier);
+	else
+		LOG ("Removing '%s' from extensions", identifier);
 
-	gconf_exts = eel_gconf_get_string_list (CONF_LOADED_EXTENSIONS);
+	exts = g_settings_get_strv (EPHY_SETTINGS_MAIN,
+				    EPHY_PREFS_ENABLED_EXTENSIONS);
 
-	if (!g_slist_find_custom (gconf_exts, identifier, (GCompareFunc) strcmp))
+	g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+	for (i = 0; exts[i]; i++)
 	{
-		gconf_exts = g_slist_prepend (gconf_exts, g_strdup (identifier));
+		if (g_strcmp0 (exts[i], identifier) == 0)
+		{
+			dirty = TRUE;
+			if (status)
+				break;
+			else
+				continue;
+		}
 
-		eel_gconf_set_string_list (CONF_LOADED_EXTENSIONS, gconf_exts);
+		g_variant_builder_add (&builder, "s", exts[i]);
 	}
 
-	g_slist_foreach (gconf_exts, (GFunc) g_free, NULL);
-	g_slist_free (gconf_exts);
+	if (!dirty)
+		g_settings_set (EPHY_SETTINGS_MAIN,
+				EPHY_PREFS_ENABLED_EXTENSIONS,
+				"as", &builder);
+}
+
+/**
+ * ephy_extensions_manager_load:
+ * @manager: an #EphyExtensionsManager
+ * @identifier: identifier of the extension to load
+ *
+ * Loads the extension corresponding to @identifier.
+ **/
+void
+ephy_extensions_manager_load (EphyExtensionsManager *manager,
+			      const char *identifier)
+{
+	ephy_extensions_manager_toggle_load (manager, identifier, TRUE);
 }
 
 /**
@@ -156,29 +178,7 @@ void
 ephy_extensions_manager_unload (EphyExtensionsManager *manager,
 				const char *identifier)
 {
-	GSList *gconf_exts;
-	GSList *l;
-
-	g_return_if_fail (EPHY_IS_EXTENSIONS_MANAGER (manager));
-	g_return_if_fail (identifier != NULL);
-
-	LOG ("Removing '%s' from extensions", identifier);
-
-	gconf_exts = eel_gconf_get_string_list (CONF_LOADED_EXTENSIONS);
-
-	l = g_slist_find_custom (gconf_exts, identifier, (GCompareFunc) strcmp);
-
-	if (l != NULL)
-	{
-		gconf_exts = g_slist_remove_link (gconf_exts, l);
-		g_free (l->data);
-		g_slist_free_1 (l);
-
-		eel_gconf_set_string_list (CONF_LOADED_EXTENSIONS, gconf_exts);
-	}
-
-	g_slist_foreach (gconf_exts, (GFunc) g_free, NULL);
-	g_slist_free (gconf_exts);
+	ephy_extensions_manager_toggle_load (manager, identifier, FALSE);
 }
 
 /**
@@ -629,50 +629,65 @@ unload_extension (EphyExtensionsManager *manager,
 static void
 sync_loaded_extensions (EphyExtensionsManager *manager)
 {
-	GConfClient *client;
-	GConfValue *value;
-	GSList *active_extensions = NULL;
+	char **extensions;
+	GVariantBuilder builder;
+	int i;
+	gboolean has_ui = FALSE;
 	GList *l;
-	gboolean active;
 	ExtensionInfo *info;
 
 	LOG ("Synching changed list of active extensions");
 
-	client = gconf_client_get_default ();
-	g_return_if_fail (client != NULL);
+	extensions = g_settings_get_strv (EPHY_SETTINGS_MAIN,
+					  EPHY_PREFS_ENABLED_EXTENSIONS);
 
-	value = gconf_client_get (client, CONF_LOADED_EXTENSIONS, NULL);
+	g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
 
-	/* make sure the extensions-manager-ui is loaded */
-	if (value == NULL ||
-	    value->type != GCONF_VALUE_LIST ||
-	    gconf_value_get_list_type (value) != GCONF_VALUE_STRING)
+	/* Make sure the extensions-manager-ui is always loaded. */
+	for (i = 0; extensions[i]; i++)
 	{
-		active_extensions = g_slist_prepend (active_extensions,
-						     g_strdup ("extensions-manager-ui"));
-		eel_gconf_set_string_list (CONF_LOADED_EXTENSIONS, active_extensions);
+		if (!has_ui && g_strcmp0 (extensions[i],
+					  "extensions-manager-ui") == 0)
+			has_ui = TRUE;
+
+		g_variant_builder_add (&builder, "s", extensions[i]);
 	}
-	else
+
+	if (!has_ui)
 	{
-		active_extensions = eel_gconf_get_string_list (CONF_LOADED_EXTENSIONS);
+		g_variant_builder_add (&builder, "s", "extensions-manager-ui");
+		g_settings_set (EPHY_SETTINGS_MAIN,
+				EPHY_PREFS_ENABLED_EXTENSIONS,
+				"as", &builder);
+
+		g_strfreev (extensions);
+		extensions = g_settings_get_strv
+					(EPHY_SETTINGS_MAIN,
+					 EPHY_PREFS_ENABLED_EXTENSIONS);
 	}
 
+
 	for (l = manager->priv->data; l != NULL; l = l->next)
 	{
 		gboolean changed;
+		gboolean active = FALSE;
+		int j;
 		
 		info = (ExtensionInfo *) l->data;
 
-		active = (g_slist_find_custom (active_extensions,
-					       info->info.identifier,
-					       (GCompareFunc) strcmp) != NULL);
+		for (j = 0; extensions[j]; j++)
+		{
+			if (!active && g_strcmp0 (extensions[j],
+						  info->info.identifier) == 0)
+				active = TRUE;
+		}
 
 		LOG ("Extension '%s' is %sactive and %sloaded",
 		     info->info.identifier,
 		     active ? "" : "not ",
 		     info->info.active ? "" : "not ");
 
-		changed = ( info->info.enabled != active );
+		changed = (info->info.enabled != active);
 
 		info->info.enabled = active;
 
@@ -699,14 +714,7 @@ sync_loaded_extensions (EphyExtensionsManager *manager)
 		}
 	}
 
-	g_slist_foreach (active_extensions, (GFunc) g_free, NULL);
-	g_slist_free (active_extensions);
-
-	if (value != NULL)
-	{
-		gconf_value_free (value);
-	}
-	g_object_unref (client);
+	g_strfreev (extensions);
 }
 
 static void
@@ -920,10 +928,9 @@ ephy_extensions_manager_load_dir (EphyExtensionsManager *manager,
 }
 
 static void
-active_extensions_notifier (GConfClient *client,
-			    guint cnxn_id,
-			    GConfEntry *entry,
-			    EphyExtensionsManager *manager)
+active_extensions_cb (GSettings *settings,
+		      char *key,
+		      EphyExtensionsManager *manager)
 {
 	sync_loaded_extensions (manager);
 }
@@ -964,12 +971,12 @@ ephy_extensions_manager_startup (EphyExtensionsManager *manager)
 
 	ephy_extensions_manager_load_dir (manager, EXTENSIONS_DIR);
 
-	active_extensions_notifier (NULL, 0, NULL, manager);
-	manager->priv->active_extensions_notifier_id =
-		eel_gconf_notification_add
-			(CONF_LOADED_EXTENSIONS,
-			 (GConfClientNotifyFunc) active_extensions_notifier,
-			 manager);
+	sync_loaded_extensions (manager);
+
+	g_signal_connect (EPHY_SETTINGS_MAIN,
+			  "changed::" EPHY_PREFS_ENABLED_EXTENSIONS,
+			  G_CALLBACK (active_extensions_cb),
+			  manager);
 }
 
 static void
@@ -978,12 +985,6 @@ ephy_extensions_manager_dispose (GObject *object)
 	EphyExtensionsManager *manager = EPHY_EXTENSIONS_MANAGER (object);
 	EphyExtensionsManagerPrivate *priv = manager->priv;
 
-	if (priv->active_extensions_notifier_id != 0)
-	{
-		eel_gconf_notification_remove (priv->active_extensions_notifier_id);
-		priv->active_extensions_notifier_id = 0;
-	}
-
 	if (priv->reload_hash != NULL)
 	{
 		g_hash_table_destroy (priv->reload_hash);
diff --git a/src/ephy-history-window.c b/src/ephy-history-window.c
index 6fabfbd..ba81c6e 100644
--- a/src/ephy-history-window.c
+++ b/src/ephy-history-window.c
@@ -39,12 +39,12 @@
 #include "ephy-search-entry.h"
 #include "ephy-session.h"
 #include "ephy-favicon-cache.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-node.h"
 #include "ephy-node-common.h"
 #include "ephy-node-view.h"
 #include "ephy-bookmarks-ui.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-gui.h"
 #include "ephy-time-helpers.h"
 
@@ -90,17 +90,12 @@ static void cmd_select_all		  (GtkAction *action,
 					   EphyHistoryWindow *editor);
 static void cmd_help_contents		  (GtkAction *action,
 					   EphyHistoryWindow *editor);
-static void cmd_view_columns		  (GtkAction *action,
-					   EphyHistoryWindow *view);
 static void search_entry_search_cb 	  (GtkWidget *entry,
 					   char *search_text,
 					   EphyHistoryWindow *editor);
 
 #define EPHY_HISTORY_WINDOW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_HISTORY_WINDOW, EphyHistoryWindowPrivate))
 
-#define CONF_HISTORY_DATE_FILTER "/apps/epiphany/dialogs/history_date_filter"
-#define CONF_HISTORY_VIEW_DETAILS "/apps/epiphany/dialogs/history_view_details"
-
 struct _EphyHistoryWindowPrivate
 {
 	EphyHistory *history;
@@ -127,21 +122,6 @@ enum
 	PROP_HISTORY
 };
 
-enum
-{
-	TIME_LAST_HALF_HOUR,
-	TIME_TODAY,
-	TIME_LAST_TWO_DAYS,
-	TIME_LAST_THREE_DAYS,
-	TIME_EVER
-};
-
-#define TIME_LAST_HALF_HOUR_STRING "last_half_hour"
-#define TIME_EVER_STRING "ever"
-#define TIME_TODAY_STRING "today"
-#define TIME_LAST_TWO_DAYS_STRING "last_two_days"
-#define TIME_LAST_THREE_DAYS_STRING "last_three_days"
-
 static const GtkActionEntry ephy_history_ui_entries [] = {
 	/* Toplevel */
 	{ "File", NULL, N_("_File") },
@@ -204,11 +184,11 @@ static const GtkToggleActionEntry ephy_history_toggle_entries [] =
 {
 	/* View Menu */
 	{ "ViewTitle", NULL, N_("_Title"), NULL,
-	  N_("Show the title column"), G_CALLBACK (cmd_view_columns), TRUE },
+	  N_("Show the title column"), NULL, TRUE },
 	{ "ViewAddress", NULL, N_("_Address"), NULL,
-	  N_("Show the address column"), G_CALLBACK (cmd_view_columns), TRUE },
+	  N_("Show the address column"), NULL, TRUE },
 	{ "ViewDateTime", NULL, N_("_Date and Time"), NULL,
-	  N_("Show the date and time column"), G_CALLBACK (cmd_view_columns), TRUE }
+	  N_("Show the date and time column"), NULL, TRUE }
 };
 
 static void
@@ -493,77 +473,6 @@ cmd_help_contents (GtkAction *action,
 	ephy_gui_help (GTK_WIDGET (editor), "ephy-managing-history");
 }
 
-static void
-set_column_visibility (EphyHistoryWindow *view,
-		       const char *action_name,
-		       gboolean active)
-{
-	if (strcmp (action_name, "ViewTitle") == 0)
-	{
-		gtk_tree_view_column_set_visible (view->priv->title_col, active);
-	}
-	if (strcmp (action_name, "ViewAddress") == 0)
-	{
-		gtk_tree_view_column_set_visible (view->priv->address_col, active);
-	}
-	if (strcmp (action_name, "ViewDateTime") == 0)
-	{
-		gtk_tree_view_column_set_visible (view->priv->datetime_col, active);
-	}
-}
-
-static void
-set_all_columns_visibility (EphyHistoryWindow *view,
-			    EphyHistoryWindowColumns details_value)
-{
-	GtkActionGroup *action_group;
-	GtkAction *action_title, *action_address, *action_datetime;
-
-	action_group = view->priv->action_group;
-	action_title = gtk_action_group_get_action (action_group, "ViewTitle");
-	action_address = gtk_action_group_get_action (action_group, "ViewAddress");
-	action_datetime = gtk_action_group_get_action (action_group, "ViewDateTime");
-	
-	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action_title), (details_value & VIEW_TITLE));
-	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action_address), (details_value & VIEW_ADDRESS));
-	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action_datetime), (details_value & VIEW_DATETIME));
-}
-
-static void
-cmd_view_columns (GtkAction *action,
-		  EphyHistoryWindow *view)
-{
-	gboolean active;
-	const char *action_name;
-	GSList *svalues = NULL;
-
-	active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-	action_name = gtk_action_get_name (action);
-	set_column_visibility (view, action_name, active);
-	
-	svalues = eel_gconf_get_string_list (CONF_HISTORY_VIEW_DETAILS);
-
-	if (active)
-	{
-		if (!g_slist_find_custom (svalues, (gpointer) action_name, (GCompareFunc) strcmp))
-		{
-			svalues = g_slist_append (svalues, (gpointer) action_name);
-		}
-	}
-	else
-	{
-		GSList *delete;
-		delete = g_slist_find_custom (svalues, (gpointer) action_name, (GCompareFunc) strcmp);
-		if (delete)
-		{
-			svalues = g_slist_delete_link (svalues, delete);
-		}
-	}
-
-	eel_gconf_set_string_list (CONF_HISTORY_VIEW_DETAILS, svalues);
-	g_slist_free (svalues);
-}
-
 G_DEFINE_TYPE (EphyHistoryWindow, ephy_history_window, GTK_TYPE_WINDOW)
 
 static void
@@ -719,7 +628,9 @@ ephy_history_window_update_menu (EphyHistoryWindow *editor)
 	open_in_window = (pages_focus && pages_selection);
 	open_in_tab = (pages_focus && pages_selection);
         delete = (pages_focus && pages_selection);
-	bookmarks_locked = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING);
+	bookmarks_locked = g_settings_get_boolean
+				(EPHY_SETTINGS_LOCKDOWN,
+				 EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING);
 	bookmark_page = (pages_focus && single_page_selected) && !bookmarks_locked;
 
 	action_group = editor->priv->action_group;
@@ -853,7 +764,7 @@ add_by_date_filter (EphyHistoryWindow *editor,
 		(GTK_COMBO_BOX (editor->priv->time_combo));
 
 	/* no need to setup a new filter */
-	if (time_range == TIME_EVER) return;
+	if (time_range == EPHY_PREFS_STATE_HISTORY_DATE_FILTER_EVER) return;
 
 	now = time (NULL);
 	if (localtime_r (&now, &btime) == NULL) return;
@@ -866,16 +777,18 @@ add_by_date_filter (EphyHistoryWindow *editor,
 
 	switch (time_range)
 	{
-		case TIME_LAST_HALF_HOUR:
+		case EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_HALF_HOUR:
 			cmp_time = now - 30 * 60;
 			break;
-		case TIME_LAST_THREE_DAYS:
+		case EPHY_PREFS_STATE_HISTORY_DATE_FILTER_TODAY:
+			cmp_time = midnight;
+			break;
+		case EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_TWO_DAYS:
 			days++;
-			/* fall-through */
-		case TIME_LAST_TWO_DAYS:
+			cmp_time = midnight;
+			break;
+		case EPHY_PREFS_STATE_HISTORY_DATE_FILTER_LAST_THREE_DAYS:
 			days++;
-			/* fall-through */
-		case TIME_TODAY:
 			cmp_time = midnight;
 			break;
 		default:
@@ -1019,7 +932,6 @@ build_search_box (EphyHistoryWindow *editor)
 	GtkWidget *box, *label, *entry;
 	GtkWidget *combo;
 	char *str;
-	int time_range;
 
 	box = gtk_hbox_new (FALSE, 6);
 	gtk_container_set_border_width (GTK_CONTAINER (box), 6);
@@ -1045,42 +957,25 @@ build_search_box (EphyHistoryWindow *editor)
 
 	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Last 30 minutes"));
 	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Today"));
+
 	str = g_strdup_printf (ngettext ("Last %d day", "Last %d days", 2), 2);
 	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), str);
 	g_free (str);
+
 	str = g_strdup_printf (ngettext ("Last %d day", "Last %d days", 3), 3);
 	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), str);
 	g_free (str);
-	/* keep this in sync with embed/ephy-history.c's HISTORY_PAGE_OBSOLETE_DAYS */
+
+	/* keep this in sync with embed/ephy-history.c's
+	 * HISTORY_PAGE_OBSOLETE_DAYS */
 	str = g_strdup_printf (ngettext ("Last %d day", "Last %d days", 10), 10);
 	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), str);
 	g_free (str);
 
-	str = eel_gconf_get_string (CONF_HISTORY_DATE_FILTER);
-	if (str && strcmp (TIME_LAST_HALF_HOUR_STRING, str) == 0)
-	{
-		time_range = TIME_LAST_HALF_HOUR;
-	}
-	if (str && strcmp (TIME_TODAY_STRING, str) == 0)
-	{
-		time_range = TIME_TODAY;
-	}
-	else if (str && strcmp (TIME_LAST_TWO_DAYS_STRING, str) == 0)
-	{
-		time_range = TIME_LAST_TWO_DAYS;
-	}
-	else if (str && strcmp (TIME_LAST_THREE_DAYS_STRING, str) == 0)
-	{
-		time_range = TIME_LAST_THREE_DAYS;
-	}
-	else
-	{
-		time_range = TIME_EVER;
-	}
-	g_free (str);
-
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combo),
-				  time_range);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_DATE_FILTER,
+			 combo, "active",
+			 G_SETTINGS_BIND_DEFAULT);
 
 	editor->priv->time_combo = combo;
 
@@ -1184,40 +1079,6 @@ view_selection_changed_cb (GtkWidget *view, EphyHistoryWindow *editor)
 	ephy_history_window_update_menu (editor);
 }
 
-static EphyHistoryWindowColumns
-get_details_value (void)
-{
-	guint value = 0;
-	GSList *svalues;
-
-	svalues = eel_gconf_get_string_list (CONF_HISTORY_VIEW_DETAILS);
-	if (svalues == NULL) 
-	{
-		svalues = g_slist_append (svalues, (gpointer) "ViewAddress");
-		svalues = g_slist_append (svalues, (gpointer) "ViewTitle");
-		eel_gconf_set_string_list (CONF_HISTORY_VIEW_DETAILS, svalues);
-		return (VIEW_ADDRESS | VIEW_TITLE);
-	}
-
-	if (g_slist_find_custom (svalues, "ViewTitle", (GCompareFunc)strcmp))
-	{
-		value |= VIEW_TITLE;
-	}
-	if (g_slist_find_custom (svalues, "ViewAddress", (GCompareFunc)strcmp))
-	{
-		value |= VIEW_ADDRESS;
-	}
-	if (g_slist_find_custom (svalues, "ViewDateTime", (GCompareFunc)strcmp))
-	{
-		value |= VIEW_DATETIME;
-	}
-
-	g_slist_foreach (svalues, (GFunc) g_free, NULL);
-	g_slist_free (svalues);
-
-	return value;
-}
-
 static void
 ephy_history_window_construct (EphyHistoryWindow *editor)
 {
@@ -1229,8 +1090,8 @@ ephy_history_window_construct (EphyHistoryWindow *editor)
 	EphyNode *node;
 	GtkUIManager *ui_merge;
 	GtkActionGroup *action_group;
+	GtkAction *action;
 	int url_col_id, title_col_id, datetime_col_id;
-	EphyHistoryWindowColumns details_value;
 
 	ephy_gui_ensure_window_group (GTK_WINDOW (editor));
 
@@ -1253,7 +1114,6 @@ ephy_history_window_construct (EphyHistoryWindow *editor)
 	gtk_action_group_add_actions (action_group, ephy_history_ui_entries,
 				      G_N_ELEMENTS (ephy_history_ui_entries), editor);
 
-	details_value = get_details_value ();
 	gtk_action_group_add_toggle_actions (action_group,
 					     ephy_history_toggle_entries,
 					     G_N_ELEMENTS (ephy_history_toggle_entries),
@@ -1391,6 +1251,36 @@ ephy_history_window_construct (EphyHistoryWindow *editor)
 	gtk_widget_show (pages_view);
 	editor->priv->pages_view = pages_view;
 
+	action = gtk_action_group_get_action (action_group, "ViewTitle");
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_TITLE,
+			 action, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_TITLE,
+			 editor->priv->title_col, "visible",
+			 G_SETTINGS_BIND_DEFAULT);
+
+	action = gtk_action_group_get_action (action_group, "ViewAddress");
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_ADDRESS,
+			 action, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_ADDRESS,
+			 editor->priv->address_col, "visible",
+			 G_SETTINGS_BIND_DEFAULT);
+
+	action = gtk_action_group_get_action (action_group, "ViewDateTime");
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_DATE,
+			 action, "active",
+			 G_SETTINGS_BIND_DEFAULT);
+	g_settings_bind (EPHY_SETTINGS_STATE,
+			 EPHY_PREFS_STATE_HISTORY_VIEW_DATE,
+			 editor->priv->datetime_col, "visible",
+			 G_SETTINGS_BIND_DEFAULT);
+
 	g_signal_connect (G_OBJECT (pages_view),
 			  "node_activated",
 			  G_CALLBACK (ephy_history_window_node_activated_cb),
@@ -1420,7 +1310,6 @@ ephy_history_window_construct (EphyHistoryWindow *editor)
 			       "history_paned",
 		               130);
 
-	set_all_columns_visibility (editor, details_value);
 	setup_filters (editor, TRUE, TRUE);
 }
 
@@ -1508,37 +1397,6 @@ ephy_history_window_init (EphyHistoryWindow *editor)
 }
 
 static void
-save_date_filter (EphyHistoryWindow *editor)
-{
-	const char *time_string = NULL;
-	int time_range;
-
-	time_range = gtk_combo_box_get_active
-		(GTK_COMBO_BOX (editor->priv->time_combo));
-
-	switch (time_range)
-	{
-		case TIME_LAST_HALF_HOUR:
-			time_string = TIME_LAST_HALF_HOUR_STRING;
-			break;
-		case TIME_EVER:
-			time_string = TIME_EVER_STRING;
-			break;
-		case TIME_TODAY:
-			time_string = TIME_TODAY_STRING;
-			break;
-		case TIME_LAST_TWO_DAYS:
-			time_string = TIME_LAST_TWO_DAYS_STRING;
-			break;
-		case TIME_LAST_THREE_DAYS:
-			time_string = TIME_LAST_THREE_DAYS_STRING;
-			break;
-	}
-
-	eel_gconf_set_string (CONF_HISTORY_DATE_FILTER, time_string);
-}
-
-static void
 ephy_history_window_dispose (GObject *object)
 {
 	EphyHistoryWindow *editor;
@@ -1555,8 +1413,6 @@ ephy_history_window_dispose (GObject *object)
 		remove_focus_monitor (editor, editor->priv->search_entry);
 
 		editor->priv->sites_view = NULL;
-
-		save_date_filter (editor);
 	}
 
 	G_OBJECT_CLASS (ephy_history_window_parent_class)->dispose (object);
diff --git a/src/ephy-home-action.c b/src/ephy-home-action.c
index c2826a3..05290a0 100644
--- a/src/ephy-home-action.c
+++ b/src/ephy-home-action.c
@@ -22,9 +22,9 @@
 #include "ephy-home-action.h"
 #include "ephy-link.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-gui.h"
 #include "ephy-dnd.h"
-#include "eel-gconf-extensions.h"
 
 #include <string.h>
 
@@ -162,7 +162,8 @@ ephy_home_action_activate (GtkAction *action)
 
 	g_object_get (G_OBJECT (action), "name", &action_name, NULL);
 		
-	address = eel_gconf_get_string (CONF_GENERAL_HOMEPAGE);
+	address = g_settings_get_string (EPHY_SETTINGS_MAIN,
+					 EPHY_PREFS_HOMEPAGE_URL);
 
 	action_name_association (action, action_name, address, FALSE);
 
diff --git a/src/ephy-lockdown.c b/src/ephy-lockdown.c
index 1910aca..61aec8d 100644
--- a/src/ephy-lockdown.c
+++ b/src/ephy-lockdown.c
@@ -2,6 +2,7 @@
 /*
  *  Copyright © 2000, 2001, 2002, 2003, 2004 Marco Pesenti Gritti
  *  Copyright © 2003, 2004, 2005 Christian Persch
+ *  Copyright © 2010 Igalia S.L.
  *
  *  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
@@ -21,49 +22,25 @@
 
 #include "config.h"
 
+#include "ephy-action-helper.h"
 #include "ephy-embed-container.h"
+#include "ephy-embed-shell.h"
 #include "ephy-embed-utils.h"
 #include "ephy-web-view.h"
 #include "ephy-lockdown.h"
 #include "ephy-extension.h"
-#include "ephy-action-helper.h"
+#include "ephy-settings.h"
 #include "ephy-toolbar.h"
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-debug.h"
 
 #include <gtk/gtk.h>
 
 #include <string.h>
 
-static void ephy_lockdown_iface_init (EphyExtensionIface *iface);
-
-/* Make sure these don't overlap with those in ephy-window.c and ephy-toolbar.c */
-enum
-{
-	LOCKDOWN_FLAG = 1 << 31
-};
+#define LOCKDOWN_FLAG 1 << 8
 
-static const char * const keys [] =
-{
-	CONF_LOCKDOWN_DISABLE_ARBITRARY_URL,
-	CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING,
-	CONF_LOCKDOWN_DISABLE_COMMAND_LINE,
-	CONF_LOCKDOWN_DISABLE_HISTORY,
-	CONF_LOCKDOWN_DISABLE_PRINTING,
-	CONF_LOCKDOWN_DISABLE_PRINT_SETUP,
-	CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK,
-	CONF_LOCKDOWN_DISABLE_TOOLBAR_EDITING,
-	CONF_LOCKDOWN_FULLSCREEN
-};
-
-#define EPHY_LOCKDOWN_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_LOCKDOWN, EphyLockdownPrivate))
-
-struct _EphyLockdownPrivate
-{
-	guint notifier_id[G_N_ELEMENTS (keys)];
-	GList *windows;
-};
+static void ephy_lockdown_iface_init (EphyExtensionIface *iface);
 
 static int
 find_name (GtkActionGroup *action_group,
@@ -86,237 +63,226 @@ find_action_group (GtkUIManager *manager,
 }
 
 static void
-update_location_editable (EphyWindow *window,
-			  GtkAction *action,
-			  gboolean editable)
+arbitrary_url_cb (GSettings *settings,
+		  char *key,
+		  EphyWindow *window)
 {
 	EphyEmbed *embed;
 	GtkWidget *toolbar;
 	char *address;
 
-	g_object_set (action, "editable", editable, NULL);
-
 	/* Restore the real web page address when disabling entry */
-	if (editable == FALSE)
+	if (g_settings_get_boolean (settings, key))
 	{
-		toolbar = ephy_window_get_toolbar (window);
 		embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
 		/* embed is NULL on startup */
-		if (embed != NULL)
-		{
-			address = ephy_web_view_get_location (ephy_embed_get_web_view (embed), TRUE);
-			ephy_toolbar_set_location (EPHY_TOOLBAR (toolbar), address);
-			ephy_web_view_set_typed_address (ephy_embed_get_web_view (embed), NULL);
-			g_free (address);
-		}
+		if (embed == NULL)
+			return;
+
+		toolbar = ephy_window_get_toolbar (window);
+		address = ephy_web_view_get_location (ephy_embed_get_web_view (embed), TRUE);
+		ephy_toolbar_set_location (EPHY_TOOLBAR (toolbar), address);
+		ephy_web_view_set_typed_address (ephy_embed_get_web_view (embed), NULL);
+		g_free (address);
 	}
 }
 
-/* NOTE: If you bring more actions under lockdown control, make sure
- * that all sensitivity updates on them are done using the helpers!
- */
 static void
-update_window (EphyWindow *window,
-	       EphyLockdown *lockdown)
+fullscreen_cb (GSettings *settings,
+	       char *key,
+	       EphyWindow *window)
 {
-	GtkUIManager *manager;
-	GtkActionGroup *action_group, *popups_action_group;
-	GtkActionGroup *toolbar_action_group, *special_toolbar_action_group;
-	GtkAction *action;
-	gboolean disabled, fullscreen, print_setup_disabled, writable;
-
-	LOG ("Updating window %p", window);
-
-	manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window));
-	action_group = find_action_group (manager, "WindowActions");
-	popups_action_group = find_action_group (manager, "PopupsActions");
-	toolbar_action_group = find_action_group (manager, "ToolbarActions");
-	special_toolbar_action_group = find_action_group (manager, "SpecialToolbarActions");
-	g_return_if_fail (action_group != NULL
-			  && popups_action_group != NULL
-			  && toolbar_action_group != NULL
-			  && special_toolbar_action_group != NULL);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINTING);
-	print_setup_disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINT_SETUP) ||
-			       eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_COMMAND_LINE);
-	action = gtk_action_group_get_action (action_group, "FilePrintSetup");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled || print_setup_disabled);
-	action = gtk_action_group_get_action (action_group, "FilePrintPreview");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (action_group, "FilePrint");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-
-	writable = eel_gconf_key_is_writable (CONF_WINDOWS_SHOW_TOOLBARS);
-	action = gtk_action_group_get_action (action_group, "ViewToolbar");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, !writable);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_ARBITRARY_URL);
-	action = gtk_action_group_get_action (action_group, "GoLocation");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (special_toolbar_action_group, "Location");
-	update_location_editable (window, action, !disabled);
-	action = gtk_action_group_get_action (special_toolbar_action_group, "NavigationUp");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_HISTORY);
-	action = gtk_action_group_get_action (action_group, "GoHistory");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (special_toolbar_action_group, "NavigationBack");
-	gtk_action_set_visible (action, !disabled);
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (special_toolbar_action_group, "NavigationForward");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	gtk_action_set_visible (action, !disabled);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING);
-	action = gtk_action_group_get_action (action_group, "GoBookmarks");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (action_group, "FileBookmarkPage");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (popups_action_group, "BookmarkLink");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK);
-	action = gtk_action_group_get_action (action_group, "FileSaveAs");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (popups_action_group, "DownloadLink");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (popups_action_group, "DownloadLinkAs");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (popups_action_group, "SaveImageAs");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (popups_action_group, "OpenImage");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	writable = eel_gconf_key_is_writable (CONF_DESKTOP_BG_PICTURE);
-	action = gtk_action_group_get_action (popups_action_group, "SetImageAsBackground");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled || !writable);
-
-	disabled = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_TOOLBAR_EDITING);
-	action = gtk_action_group_get_action (action_group, "ViewToolbarEditor");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (toolbar_action_group, "MoveToolItem");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (toolbar_action_group, "RemoveToolItem");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-	action = gtk_action_group_get_action (toolbar_action_group, "RemoveToolbar");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, disabled);
-
-	fullscreen = eel_gconf_get_boolean (CONF_LOCKDOWN_FULLSCREEN);
-	action = gtk_action_group_get_action (special_toolbar_action_group, "FileNewWindow");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, fullscreen);
-	action = gtk_action_group_get_action (action_group, "ViewFullscreen");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, fullscreen);
-
-	action = gtk_action_group_get_action (action_group, "TabsDetach");
-	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, fullscreen);
-
-	if (fullscreen)
-	{
+	if (g_settings_get_boolean (settings, key))
 		gtk_window_fullscreen (GTK_WINDOW (window));
-	}
+	else
+		gtk_window_unfullscreen (GTK_WINDOW (window));
 }
 
-static void
-notifier (GConfClient *client,
-	  guint cnxn_id,
-	  GConfEntry *entry,
-	  EphyLockdown *lockdown)
-{
-	EphyLockdownPrivate *priv = lockdown->priv;
+typedef struct {
+	char *key;
+	char *action;
+	char *prop;
+} BindAction;
 
-	LOG ("Key %s changed", entry->key);
+static const BindAction window_actions[] = {
+	{ EPHY_PREFS_LOCKDOWN_PRINTING, "FilePrint", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_PRINTING, "FilePrintPreview", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_PRINTING, "FilePrintSetup", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_PRINT_SETUP, "FilePrintSetup", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_COMMAND_LINE, "FilePrintSetup", "sensitive" },
 
-	g_list_foreach (priv->windows, (GFunc) update_window, lockdown);
-}
+	{ EPHY_PREFS_LOCKDOWN_TOOLBAR_EDITING, "ViewToolbarEditor", "sensitive" },
 
-static void
-ephy_lockdown_init (EphyLockdown *lockdown)
+	{ EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "GoBookmarks", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "FileBookmarkPage", "sensitive" },
+
+	{ EPHY_PREFS_LOCKDOWN_ARBITRARY_URL, "GoLocation", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "FileSaveAs", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_HISTORY, "GoHistory", "sensitive" },
+
+	{ EPHY_PREFS_LOCKDOWN_FULLSCREEN, "ViewFullscreen", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_FULLSCREEN, "TabsDetach", "sensitive" }
+};
+
+static const BindAction popup_actions[] = {
+	{ EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "DownloadLink", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "DownloadLinkAs", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "SaveImageAs", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "OpenImage", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "BookmarkLink", "sensitive" }
+};
+
+static const BindAction special_toolbar_actions[] = {
+	{ EPHY_PREFS_LOCKDOWN_ARBITRARY_URL, "Location", "editable" },
+	{ EPHY_PREFS_LOCKDOWN_ARBITRARY_URL, "NavigationUp", "sensitive" },
+
+	{ EPHY_PREFS_LOCKDOWN_HISTORY, "NavigationBack", "visible" },
+	{ EPHY_PREFS_LOCKDOWN_HISTORY, "NavigationBack", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_HISTORY, "NavigationForward", "visible" },
+	{ EPHY_PREFS_LOCKDOWN_HISTORY, "NavigationForward", "sensitive" },
+
+	{ EPHY_PREFS_LOCKDOWN_FULLSCREEN, "FileNewWindow", "sensitive" }
+};
+
+static const BindAction toolbar_actions[] = {
+	{ EPHY_PREFS_LOCKDOWN_TOOLBAR_EDITING, "MoveToolItem", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_TOOLBAR_EDITING, "RemoveToolItem", "sensitive" },
+	{ EPHY_PREFS_LOCKDOWN_TOOLBAR_EDITING, "RemoveToolbar", "sensitive" }
+};
+
+static gboolean
+sensitive_get_mapping (GValue *value,
+		       GVariant *variant,
+		       gpointer data)
 {
-	EphyLockdownPrivate *priv;
-	guint i;
+	GtkAction *action;
+	gboolean active, before, after;
 
-	lockdown->priv = priv = EPHY_LOCKDOWN_GET_PRIVATE (lockdown);
+	action = GTK_ACTION (data);
+	active = g_variant_get_boolean (variant);
 
-	LOG ("EphyLockdown initialising");
+	before = gtk_action_get_sensitive (action);
+	ephy_action_change_sensitivity_flags (action, LOCKDOWN_FLAG, active);
+	after = gtk_action_get_sensitive (action);
 
-	for (i = 0; i < G_N_ELEMENTS (keys); i++)
-	{
-		priv->notifier_id[i] =eel_gconf_notification_add
-			(keys[i], (GConfClientNotifyFunc) notifier, lockdown);
-	}
-	/* We know that no windows are open yet,
-	 * so we don't need to do notify here.
-	 */
+	/* Set (GtkAction::sensitive) to the value in GSettings _only if_
+	 * the LOCKDOWN_FLAG had some real effect in the GtkAction */
+	g_value_set_boolean (value, (before != after) ? after : before);
 
-	eel_gconf_monitor_add ("/apps/epiphany/lockdown");
-	eel_gconf_monitor_add ("/desktop/gnome/lockdown");
+	return TRUE;
 }
 
-G_DEFINE_TYPE_WITH_CODE (EphyLockdown, ephy_lockdown, G_TYPE_OBJECT,
-			 G_IMPLEMENT_INTERFACE (EPHY_TYPE_EXTENSION,
-						ephy_lockdown_iface_init))
-
 static void
-ephy_lockdown_finalize (GObject *object)
+bind_settings_and_actions (GSettings *settings,
+			   GtkActionGroup *action_group,
+			   const BindAction *actions,
+			   int actions_n)
 {
-	EphyLockdown *lockdown = EPHY_LOCKDOWN (object);
-	EphyLockdownPrivate *priv = lockdown->priv;
-	guint i;
+	int i;
 
-	LOG ("EphyLockdown finalising");
+	for (i = 0; i < actions_n; i++)
+	{
+		GtkAction *action;
 
-	eel_gconf_monitor_remove ("/apps/epiphany/lockdown");
-	eel_gconf_monitor_remove ("/desktop/gnome/lockdown");
+		action = gtk_action_group_get_action (action_group,
+						      actions[i].action);
 
-	for (i = 0; i < G_N_ELEMENTS (keys); i++)
-	{
-		eel_gconf_notification_remove (priv->notifier_id[i]);
+		if (g_strcmp0 (actions[i].prop, "visible") == 0)
+		{
+			g_settings_bind (settings, actions[i].key,
+					 action, actions[i].prop,
+					 G_SETTINGS_BIND_GET |
+					 G_SETTINGS_BIND_INVERT_BOOLEAN);
+		}
+		else
+		{
+			/* We need a custom get_mapping for 'sensitive'
+			 * properties, see usage of
+			 * ephy_action_change_sensitivity_flags in
+			 * ephy-window.c. */
+			g_settings_bind_with_mapping (settings, actions[i].key,
+						      action, actions[i].prop,
+						      G_SETTINGS_BIND_GET,
+						      sensitive_get_mapping,
+						      NULL,
+						      action, NULL);
+		}
 	}
-
-	G_OBJECT_CLASS (ephy_lockdown_parent_class)->finalize (object);
 }
 
 static void
 impl_attach_window (EphyExtension *extension,
 		    EphyWindow *window)
 {
-	EphyLockdown *lockdown = EPHY_LOCKDOWN (extension);
-	EphyLockdownPrivate *priv = lockdown->priv;
+	GtkUIManager *manager;
+	GtkActionGroup *action_group;
+	GtkAction *action;
+	GSettings *settings;
+
+	g_signal_connect (EPHY_SETTINGS_LOCKDOWN,
+			  "changed::" EPHY_PREFS_LOCKDOWN_FULLSCREEN,
+			  G_CALLBACK (fullscreen_cb), window);
+	g_signal_connect (EPHY_SETTINGS_LOCKDOWN,
+			  "changed::" EPHY_PREFS_LOCKDOWN_ARBITRARY_URL,
+			  G_CALLBACK (arbitrary_url_cb), window);
+
+	/* Trigger an initial state on these elements. */
+	fullscreen_cb (EPHY_SETTINGS_LOCKDOWN,
+		       EPHY_PREFS_LOCKDOWN_FULLSCREEN, window);
+	arbitrary_url_cb (EPHY_SETTINGS_LOCKDOWN,
+			  EPHY_PREFS_LOCKDOWN_ARBITRARY_URL, window);
+
+	manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window));
 
-	priv->windows = g_list_prepend (priv->windows, window);
+	action_group = find_action_group (manager, "WindowActions");
+	bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
+				   action_group, window_actions,
+				   G_N_ELEMENTS (window_actions));
 
-	update_window (window, lockdown);
+	action = gtk_action_group_get_action (action_group, "ViewToolbar");
+	g_settings_bind_writable (EPHY_SETTINGS_UI,
+				  EPHY_PREFS_UI_SHOW_TOOLBARS,
+				  action, "sensitive", FALSE);
+
+	action_group = find_action_group (manager, "PopupsActions");
+	bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
+				   action_group, popup_actions,
+				   G_N_ELEMENTS (popup_actions));
+
+	action = gtk_action_group_get_action (action_group,
+					      "SetImageAsBackground");
+	settings = ephy_settings_get ("org.gnome.desktop.background");
+	g_settings_bind_writable (settings, "picture-filename",
+				  action, "sensitive", FALSE);
+
+	action_group = find_action_group (manager, "SpecialToolbarActions");
+	bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
+				   action_group, special_toolbar_actions,
+				   G_N_ELEMENTS (special_toolbar_actions));
+
+	action_group = find_action_group (manager, "ToolbarActions");
+	bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
+				   action_group, toolbar_actions,
+				   G_N_ELEMENTS (toolbar_actions));
 }
 
 static void
-impl_detach_window (EphyExtension *extension,
-		    EphyWindow *window)
+ephy_lockdown_init (EphyLockdown *lockdown)
 {
-	EphyLockdown *lockdown = EPHY_LOCKDOWN (extension);
-	EphyLockdownPrivate *priv = lockdown->priv;
-
-	priv->windows = g_list_remove (priv->windows, window);
-
-	/* Since we know that the window closes now, we don't have to
-	 * undo anything.
-	 */
+	LOG ("EphyLockdown initialising");
 }
 
+G_DEFINE_TYPE_WITH_CODE (EphyLockdown, ephy_lockdown, G_TYPE_OBJECT,
+			 G_IMPLEMENT_INTERFACE (EPHY_TYPE_EXTENSION,
+						ephy_lockdown_iface_init))
+
 static void
 ephy_lockdown_iface_init (EphyExtensionIface *iface)
 {
 	iface->attach_window = impl_attach_window;
-	iface->detach_window = impl_detach_window;
 }
 
 static void
 ephy_lockdown_class_init (EphyLockdownClass *klass)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize = ephy_lockdown_finalize;
-
-	g_type_class_add_private (object_class, sizeof (EphyLockdownPrivate));
 }
-
diff --git a/src/ephy-main.c b/src/ephy-main.c
index dd7b69f..1f06928 100644
--- a/src/ephy-main.c
+++ b/src/ephy-main.c
@@ -20,13 +20,13 @@
 
 #include "config.h"
 
+#include "ephy-settings.h"
 #include "ephy-shell.h"
 #include "ephy-file-helpers.h"
 #include "ephy-object-helpers.h"
 #include "ephy-state.h"
 #include "ephy-debug.h"
 #include "ephy-stock-icons.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-dbus-client-bindings.h"
 #include "ephy-activation.h"
 #include "ephy-session.h"
@@ -438,6 +438,7 @@ main (int argc,
 	DBusGProxy *proxy;
 	GError *error = NULL;
 	guint32 user_time;
+	gboolean arbitrary_url;
 
 #ifdef ENABLE_NLS
 	/* Initialize the i18n stuff */
@@ -572,8 +573,10 @@ main (int argc,
 		exit (1);
 	}
 
-	if (arguments != NULL &&
-	    eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_ARBITRARY_URL))
+	arbitrary_url = g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+						EPHY_PREFS_LOCKDOWN_ARBITRARY_URL);
+
+	if (arguments != NULL && arbitrary_url)
 	{
 		g_print ("URL loading is locked down\n");
 		exit (1);
@@ -718,7 +721,6 @@ main (int argc,
         if (ephy_has_private_profile () == FALSE)
           _ephy_profile_migrate ();
 
-	eel_gconf_monitor_add ("/apps/epiphany/general");
 	ephy_stock_icons_init ();
 	load_accels ();
 
@@ -745,9 +747,9 @@ main (int argc,
 	if (notify_is_initted ())
 		notify_uninit ();
 #endif
-	eel_gconf_monitor_remove ("/apps/epiphany/general");
 	save_accels ();
 	ephy_state_save ();
+	ephy_settings_shutdown ();
 	ephy_file_helpers_shutdown ();
 	xmlCleanupParser ();
 
diff --git a/src/ephy-net-monitor.c b/src/ephy-net-monitor.c
index a6fb56f..3c970c1 100644
--- a/src/ephy-net-monitor.c
+++ b/src/ephy-net-monitor.c
@@ -21,9 +21,9 @@
 
 #include "ephy-net-monitor.h"
 
-#include "eel-gconf-extensions.h"
 #include "ephy-dbus.h"
 #include "ephy-debug.h"
+#include "ephy-settings.h"
 #include "ephy-prefs.h"
 
 #include <NetworkManager.h>
@@ -41,7 +41,6 @@ typedef enum
 struct _EphyNetMonitorPrivate
 {
 	DBusConnection *bus;
-	guint notify_id;
 	guint active : 1;
 	NetworkStatus status;
 };
@@ -285,31 +284,6 @@ ephy_net_monitor_shutdown (EphyNetMonitor *monitor)
 }
 
 static void
-notify_network_managed_cb (GConfClient *client,
-			   guint cnxn_id,
-			   GConfEntry *entry,
-			   EphyNetMonitor *monitor)
-{
-	EphyNetMonitorPrivate *priv = monitor->priv;
-	GConfValue *value;
-	gboolean active = TRUE;
-
-	LOG (CONF_NETWORK_MANAGED " key changed");
-
-	g_assert (entry != NULL);
-
-	value = gconf_entry_get_value (entry);
-	if (value != NULL && value->type == GCONF_VALUE_BOOL)
-	{
-		active = gconf_value_get_bool (value);
-	}
-
-	priv->active = active;
-
-	g_object_notify (G_OBJECT (monitor), "network-status");
-}
-
-static void
 ephy_net_monitor_init (EphyNetMonitor *monitor)
 {
 	EphyNetMonitorPrivate *priv;
@@ -320,12 +294,6 @@ ephy_net_monitor_init (EphyNetMonitor *monitor)
 
 	priv->status = NETWORK_UP;
 
-	priv->notify_id = eel_gconf_notification_add
-		(CONF_NETWORK_MANAGED,
-		 (GConfClientNotifyFunc) notify_network_managed_cb,
-		 monitor);
-	eel_gconf_notify (CONF_NETWORK_MANAGED);
-
 	ephy_net_monitor_startup (monitor);
 }
 
@@ -333,18 +301,11 @@ static void
 ephy_net_monitor_dispose (GObject *object)
 {
 	EphyNetMonitor *monitor = EPHY_NET_MONITOR (object);
-	EphyNetMonitorPrivate *priv = monitor->priv;
 
 	LOG ("EphyNetMonitor finalising");
 
 	ephy_net_monitor_shutdown (monitor);
 
-	if (priv->notify_id != 0)
-	{
-		eel_gconf_notification_remove (priv->notify_id);
-		priv->notify_id = 0;
-	}
-
 	G_OBJECT_CLASS (ephy_net_monitor_parent_class)->dispose (object);
 }
 
@@ -401,10 +362,13 @@ gboolean
 ephy_net_monitor_get_net_status	(EphyNetMonitor *monitor)
 {
 	EphyNetMonitorPrivate *priv;
+	gboolean managed;
 
 	g_return_val_if_fail (EPHY_IS_NET_MONITOR (monitor), FALSE);
 
 	priv = monitor->priv;
+	managed = g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+					  EPHY_PREFS_MANAGED_NETWORK);
 
-	return !priv->active || priv->status != NETWORK_DOWN;
+	return !managed || priv->status != NETWORK_DOWN;
 }
diff --git a/src/ephy-notebook.c b/src/ephy-notebook.c
index 73fad2b..23805d2 100644
--- a/src/ephy-notebook.c
+++ b/src/ephy-notebook.c
@@ -23,8 +23,8 @@
 #include "config.h"
 
 #include "ephy-notebook.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-marshal.h"
 #include "ephy-file-helpers.h"
 #include "ephy-dnd.h"
@@ -371,7 +371,8 @@ notebook_drag_data_received_cb (GtkWidget* widget,
 
 	g_signal_stop_emission_by_name (widget, "drag_data_received");
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_ARBITRARY_URL)) return;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_ARBITRARY_URL)) return;
 
 	data = gtk_selection_data_get_data (selection_data);
 	if (gtk_selection_data_get_length (selection_data) <= 0 || data == NULL) return;
@@ -437,17 +438,18 @@ update_tabs_visibility (EphyNotebook *nb,
 
 	if (before_inserting) num++;
 
-	show_tabs = (eel_gconf_get_boolean (CONF_ALWAYS_SHOW_TABS_BAR) || num > 1) &&
+	show_tabs = (g_settings_get_boolean (EPHY_SETTINGS_UI,
+					     EPHY_PREFS_UI_ALWAYS_SHOW_TABS_BAR)
+		     || num > 1) &&
 		    priv->show_tabs == TRUE;
 
 	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), show_tabs);
 }
 
 static void
-tabs_visibility_notifier (GConfClient *client,
-			  guint cnxn_id,
-			  GConfEntry *entry,
-			  EphyNotebook *nb)
+show_tabs_changed_cb (GSettings *settings,
+		      char *key,
+		      EphyNotebook *nb)
 {
 	update_tabs_visibility (nb, FALSE);
 }
@@ -484,9 +486,9 @@ ephy_notebook_init (EphyNotebook *notebook)
 			   GDK_ACTION_MOVE | GDK_ACTION_COPY);
 	gtk_drag_dest_add_text_targets (widget);
 
-	priv->tabs_vis_notifier_id = eel_gconf_notification_add
-		(CONF_ALWAYS_SHOW_TABS_BAR,
-		 (GConfClientNotifyFunc)tabs_visibility_notifier, notebook);
+	g_signal_connect (EPHY_SETTINGS_UI,
+			  "changed::" EPHY_PREFS_UI_ALWAYS_SHOW_TABS_BAR,
+			  G_CALLBACK (show_tabs_changed_cb), notebook);
 }
 
 static void
@@ -495,8 +497,6 @@ ephy_notebook_finalize (GObject *object)
 	EphyNotebook *notebook = EPHY_NOTEBOOK (object);
 	EphyNotebookPrivate *priv = notebook->priv;
 
-	eel_gconf_notification_remove (priv->tabs_vis_notifier_id);
-
 	g_list_free (priv->focused_pages);
 
 	G_OBJECT_CLASS (ephy_notebook_parent_class)->finalize (object);
diff --git a/src/ephy-session.c b/src/ephy-session.c
index 9adf2dc..558793c 100644
--- a/src/ephy-session.c
+++ b/src/ephy-session.c
@@ -32,11 +32,11 @@
 #include "ephy-embed-container.h"
 #include "ephy-extension.h"
 #include "ephy-file-helpers.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-gui.h"
 #include "ephy-history-window.h"
 #include "ephy-notebook.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-shell.h"
 #include "ephy-stock-icons.h"
 #include "ephy-window.h"
@@ -1667,14 +1667,18 @@ ephy_session_load (EphySession *session,
 
 			if (id && xmlStrEqual ((const xmlChar *) BOOKMARKS_EDITOR_ID, id))
 			{
-				if (!eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING))
+				if (!g_settings_get_boolean
+				    (EPHY_SETTINGS_LOCKDOWN,
+				     EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING))
 				{
 					widget = ephy_shell_get_bookmarks_editor (ephy_shell);
 				}
 			}
 			else if (id && xmlStrEqual ((const xmlChar *) HISTORY_WINDOW_ID, id))
 			{
-				if (!eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_HISTORY))
+				if (!g_settings_get_boolean
+				    (EPHY_SETTINGS_LOCKDOWN,
+				     EPHY_PREFS_LOCKDOWN_HISTORY))
 				{
 					widget = ephy_shell_get_history_window (ephy_shell);
 				}
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 2d575d0..f15ceda 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -30,10 +30,8 @@
 #include "ephy-shell.h"
 #include "ephy-type-builtins.h"
 #include "ephy-embed-container.h"
-#include "ephy-embed-shell.h"
 #include "ephy-embed-single.h"
 #include "ephy-embed-utils.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-prefs.h"
 #include "ephy-file-helpers.h"
 #include "ephy-favicon-cache.h"
@@ -54,6 +52,7 @@
 #include "egg-toolbars-model.h"
 #include "ephy-toolbars-model.h"
 #include "ephy-toolbar.h"
+#include "ephy-settings.h"
 #include "ephy-prefs.h"
 #include "ephy-gui.h"
 #include "ephy-stock-icons.h"
@@ -124,7 +123,8 @@ ephy_shell_new_window_cb (EphyEmbedSingle *single,
 
 	LOG ("ephy_shell_new_window_cb tab chrome %d", chromemask);
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_JAVASCRIPT_CHROME))
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_JAVASCRIPT_CHROME))
 	{
 		chromemask = EPHY_WEB_VIEW_CHROME_ALL;
 	}
@@ -368,7 +368,10 @@ ephy_shell_new_tab_full (EphyShell *shell,
 	if (flags & EPHY_NEW_TAB_IN_EXISTING_WINDOW) in_new_window = FALSE;
 	if (flags & EPHY_NEW_TAB_DONT_COPY_HISTORY) copy_history = FALSE;
 
-	in_new_window = in_new_window && !eel_gconf_get_boolean (CONF_LOCKDOWN_FULLSCREEN);
+	in_new_window = in_new_window &&
+			!g_settings_get_boolean
+					(EPHY_SETTINGS_LOCKDOWN,
+					 EPHY_PREFS_LOCKDOWN_FULLSCREEN);
 	g_return_val_if_fail (open_page == (gboolean)(request != NULL), NULL);
 
 	jump_to = (flags & EPHY_NEW_TAB_JUMP) != 0;
diff --git a/src/ephy-toolbar-editor.c b/src/ephy-toolbar-editor.c
index 4476e1f..2fd4925 100644
--- a/src/ephy-toolbar-editor.c
+++ b/src/ephy-toolbar-editor.c
@@ -20,19 +20,19 @@
 
 #include "config.h"
 
-#include "ephy-toolbar-editor.h"
+#include "ephy-debug.h"
 #include "ephy-gui.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-state.h"
 #include "ephy-file-helpers.h"
 #include "ephy-shell.h"
+#include "ephy-stock-icons.h"
+#include "ephy-toolbar-editor.h"
 #include "eggtypebuiltins.h"
 #include "egg-toolbars-model.h"
 #include "egg-editable-toolbar.h"
 #include "egg-toolbar-editor.h"
-#include "eel-gconf-extensions.h"
-#include "ephy-stock-icons.h"
-#include "ephy-debug.h"
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -115,7 +115,8 @@ combo_changed_cb (GtkComboBox *combo,
 		pref = value->value_nick;
 	}
 
-	eel_gconf_set_string (CONF_INTERFACE_TOOLBAR_STYLE, pref);
+	g_settings_set_string (EPHY_SETTINGS_UI,
+			       EPHY_PREFS_UI_TOOLBAR_STYLE, pref);
 
 	g_type_class_unref (flags_class);
 }
@@ -240,7 +241,8 @@ ephy_toolbar_editor_constructor (GType type,
 	gtk_widget_show_all (hbox);
 
 	/* get active from pref */
-	pref = eel_gconf_get_string (CONF_INTERFACE_TOOLBAR_STYLE);
+	pref = g_settings_get_string (EPHY_SETTINGS_UI,
+				      EPHY_PREFS_UI_TOOLBAR_STYLE);
 	if (pref != NULL)
 	{
 		flags_class = g_type_class_ref (EGG_TYPE_TB_MODEL_FLAGS);
diff --git a/src/ephy-toolbars-model.c b/src/ephy-toolbars-model.c
index a10fc3a..5dc6cf4 100644
--- a/src/ephy-toolbars-model.c
+++ b/src/ephy-toolbars-model.c
@@ -23,7 +23,7 @@
 #include "ephy-toolbars-model.h"
 #include "ephy-file-helpers.h"
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
+#include "ephy-settings.h"
 #include "eggtypebuiltins.h"
 #include "ephy-debug.h"
 
@@ -39,7 +39,6 @@ struct _EphyToolbarsModelPrivate
 	char *xml_file;
 	EggTbModelFlags style;
 	guint timeout;
-	guint style_notifier_id;
 };
 
 static void ephy_toolbars_model_class_init (EphyToolbarsModelClass *klass);
@@ -118,7 +117,8 @@ get_toolbar_style (void)
 	EggTbModelFlags flags = 0;
 	char *pref;
 
-	pref = eel_gconf_get_string (CONF_INTERFACE_TOOLBAR_STYLE);
+	pref = g_settings_get_string (EPHY_SETTINGS_UI,
+				      EPHY_PREFS_UI_TOOLBAR_STYLE);
 	if (pref != NULL)
 	{
 		flags_class = g_type_class_ref (EGG_TYPE_TB_MODEL_FLAGS);
@@ -137,10 +137,9 @@ get_toolbar_style (void)
 }
 
 static void
-toolbar_style_notifier (GConfClient *client,
-			guint cnxn_id,
-			GConfEntry *entry,
-			EphyToolbarsModel *model)
+toolbar_style_changed_cb (GSettings *settings,
+			  char *key,
+			  EphyToolbarsModel *model)
 {
 	model->priv->style = get_toolbar_style ();
 
@@ -233,9 +232,9 @@ ephy_toolbars_model_init (EphyToolbarsModel *model)
 					   NULL);
 
 	priv->style = get_toolbar_style ();
-	priv->style_notifier_id = eel_gconf_notification_add
-		(CONF_INTERFACE_TOOLBAR_STYLE,
-		 (GConfClientNotifyFunc) toolbar_style_notifier, model);
+	g_signal_connect (EPHY_SETTINGS_UI,
+			  "changed::" EPHY_PREFS_UI_TOOLBAR_STYLE,
+			  G_CALLBACK (toolbar_style_changed_cb), model);
 	
 	g_signal_connect_after (model, "item_added",
 				G_CALLBACK (save_changes), NULL);
@@ -263,11 +262,6 @@ ephy_toolbars_model_finalize (GObject *object)
 	EphyToolbarsModel *model = EPHY_TOOLBARS_MODEL (object);
 	EphyToolbarsModelPrivate *priv = model->priv;
 
-	if (priv->style_notifier_id != 0)
-	{
-		eel_gconf_notification_remove (priv->style_notifier_id);
-	}
-
 	if (priv->timeout != 0)
 	{
 		g_source_remove (priv->timeout);
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 0f8a666..7cd5253 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -31,8 +31,8 @@
 #include "ephy-embed-single.h"
 #include "ephy-embed-utils.h"
 #include "ephy-shell.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-embed-prefs.h"
 #include "ephy-embed-utils.h"
 #include "ephy-zoom.h"
@@ -412,8 +412,6 @@ static const struct
 #endif /* HAVE_X11_XF86KEYSYM_H */
 };
 
-#define CONF_LOCKDOWN_HIDE_MENUBAR "/apps/epiphany/lockdown/hide_menubar"
-
 #define BOOKMARKS_MENU_PATH "/menubar/BookmarksMenu"
 
 #define SETTINGS_CONNECTION_DATA_KEY	"EphyWindowSettings"
@@ -446,8 +444,6 @@ struct _EphyWindowPrivate
 	guint idle_worker;
 	GtkWidget *entry;
 
-	guint browse_with_caret_notifier_id;
-	guint allow_popups_notifier_id;
 	guint clear_progress_timeout_id;
 
 	guint menubar_accel_keyval;
@@ -552,7 +548,8 @@ construct_confirm_close_dialog (EphyWindow *window)
 static gboolean
 confirm_close_with_modified_forms (EphyWindow *window)
 {
-	if (eel_gconf_get_boolean (CONF_WARN_ON_CLOSE_UNSUBMITTED_DATA))
+	if (g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+				    EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA))
 	{
 		GtkWidget *dialog;
 		int response;
@@ -817,7 +814,9 @@ ephy_window_fullscreen (EphyWindow *window)
 
 	priv->fullscreen_mode = TRUE;
 
-	lockdown_fs = eel_gconf_get_boolean (CONF_LOCKDOWN_FULLSCREEN);
+	lockdown_fs = g_settings_get_boolean
+				(EPHY_SETTINGS_LOCKDOWN,
+				 EPHY_PREFS_LOCKDOWN_FULLSCREEN);
 
 	popup = ephy_fullscreen_popup_new (window);
 	ephy_fullscreen_popup_set_show_leave
@@ -975,7 +974,8 @@ ephy_window_key_press_event (GtkWidget *widget,
 	}
 
 	/* Don't activate menubar in lockdown mode */
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_HIDE_MENUBAR))
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_MENUBAR))
 	{
 		return GTK_WIDGET_CLASS (ephy_window_parent_class)->key_press_event (widget, event);
 	}
@@ -1014,7 +1014,8 @@ ephy_window_delete_event (GtkWidget *widget,
 
 	/* We ignore the delete_event if the disable_quit lockdown has been set
 	 */
-	if (eel_gconf_get_boolean("/apps/epiphany/lockdown/disable_quit")) return TRUE;
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_QUIT)) return TRUE;
 
 	tabs = impl_get_children (EPHY_EMBED_CONTAINER (window));
 	for (l = tabs; l != NULL; l = l->next)
@@ -1080,7 +1081,9 @@ update_popup_actions_visibility (EphyWindow *window,
 	action = gtk_action_group_get_action (action_group, "OpenFrame");
 	gtk_action_set_visible (action, is_frame);
 
-	inspector_enabled = eel_gconf_get_boolean (CONF_WEB_INSPECTOR_ENABLED);
+	inspector_enabled = g_settings_get_boolean
+					(EPHY_SETTINGS_MAIN,
+					 EPHY_PREFS_ENABLE_WEB_INSPECTOR);
 	action = gtk_action_group_get_action (action_group, "InspectElement");
 	gtk_action_set_visible (action, inspector_enabled);
 }
@@ -2251,8 +2254,11 @@ ephy_window_dom_mouse_click_cb (WebKitWebView *view,
 	is_middle_click = (button == 2);
 
 	middle_click_opens =
-		eel_gconf_get_boolean (CONF_INTERFACE_MIDDLE_CLICK_OPEN_URL) &&
-		!eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_ARBITRARY_URL);
+		g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+					EPHY_PREFS_MIDDLE_CLICK_OPENS_URL) &&
+		!g_settings_get_boolean
+				(EPHY_SETTINGS_LOCKDOWN,
+				 EPHY_PREFS_LOCKDOWN_ARBITRARY_URL);
 
 	is_link = (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) != 0;
 	is_image = (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) != 0;
@@ -2400,7 +2406,8 @@ create_web_view_cb (WebKitWebView *web_view,
 	EphyNewTabFlags flags;
 	EphyWindow *parent_window;
 
-	if (eel_gconf_get_boolean (CONF_INTERFACE_OPEN_NEW_WINDOWS_IN_TAB))
+	if (g_settings_get_boolean (EPHY_SETTINGS_MAIN,
+				    EPHY_PREFS_NEW_WINDOWS_IN_TABS))
 	{
 		parent_window = window;
 		flags = EPHY_NEW_TAB_IN_EXISTING_WINDOW |
@@ -2973,7 +2980,8 @@ notebook_page_close_request_cb (EphyNotebook *notebook,
 {
 	EphyWindowPrivate *priv = window->priv;
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_QUIT) &&
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_QUIT) &&
 	    gtk_notebook_get_n_pages (priv->notebook) == 1)
 	{
 		return;
@@ -3045,12 +3053,14 @@ ephy_window_set_chrome (EphyWindow *window, EphyWebViewChrome mask)
 		window->priv->should_save_chrome = TRUE;
 	}
 
-	if (!eel_gconf_get_boolean (CONF_WINDOWS_SHOW_TOOLBARS))
+	if (!g_settings_get_boolean (EPHY_SETTINGS_UI,
+				     EPHY_PREFS_UI_SHOW_TOOLBARS))
 	{
 		chrome_mask &= ~EPHY_WEB_VIEW_CHROME_TOOLBAR;
 	}
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_HIDE_MENUBAR))
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_MENUBAR))
 	{
 		chrome_mask &= ~EPHY_WEB_VIEW_CHROME_MENUBAR;
 	}
@@ -3089,11 +3099,6 @@ ephy_window_dispose (GObject *object)
 		g_signal_handlers_disconnect_by_func
 			(single, G_CALLBACK (sync_network_status), window);
 	
-		eel_gconf_notification_remove (priv->browse_with_caret_notifier_id);
-		eel_gconf_notification_remove (priv->allow_popups_notifier_id);
-		priv->browse_with_caret_notifier_id = 0;
-		priv->allow_popups_notifier_id = 0;
-
 		if (priv->idle_resize_handler != 0)
 		{
 			g_source_remove (priv->idle_resize_handler);
@@ -3282,24 +3287,8 @@ ephy_window_class_init (EphyWindowClass *klass)
 }
 
 static void
-browse_with_caret_notifier (GConfClient *client,
-			    guint cnxn_id,
-			    GConfEntry *entry,
-			    EphyWindow *window)
-{
-	GtkAction *action;
-	gboolean enabled;
-
-	enabled = eel_gconf_get_boolean (CONF_CARET_BROWSING_ENABLED);
-	action = gtk_action_group_get_action (window->priv->action_group,
-					      "BrowseWithCaret");
-	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), enabled);
-}
-
-static void
-allow_popups_notifier (GConfClient *client,
-		       guint cnxn_id,
-		       GConfEntry *entry,
+allow_popups_notifier (GSettings *settings,
+		       char *key,
 		       EphyWindow *window)
 {
 	GList *tabs;
@@ -3539,14 +3528,17 @@ ephy_window_constructor (GType type,
 		(EGG_EDITABLE_TOOLBAR (priv->toolbar), model);
 
 	/* other notifiers */
-	browse_with_caret_notifier (NULL, 0, NULL, window);
-	priv->browse_with_caret_notifier_id = eel_gconf_notification_add
-		(CONF_CARET_BROWSING_ENABLED,
-		 (GConfClientNotifyFunc)browse_with_caret_notifier, window);
+	action = gtk_action_group_get_action (window->priv->action_group,
+					      "BrowseWithCaret");
+
+	g_settings_bind (EPHY_SETTINGS_MAIN,
+			 EPHY_PREFS_ENABLE_CARET_BROWSING,
+			 action, "active",
+			 G_SETTINGS_BIND_GET);
 
-	priv->allow_popups_notifier_id = eel_gconf_notification_add
-		(CONF_SECURITY_ALLOW_POPUPS,
-		 (GConfClientNotifyFunc)allow_popups_notifier, window);
+	g_signal_connect (EPHY_SETTINGS_WEB,
+			  "changed::" EPHY_PREFS_WEB_ENABLE_POPUPS,
+			  G_CALLBACK (allow_popups_notifier), window);
 
 	/* network status */
 	single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell));
@@ -3850,8 +3842,9 @@ sync_prefs_with_chrome (EphyWindow *window)
 
 	if (window->priv->should_save_chrome)
 	{
-		eel_gconf_set_boolean (CONF_WINDOWS_SHOW_TOOLBARS,
-				       flags & EPHY_WEB_VIEW_CHROME_TOOLBAR);
+		g_settings_set_boolean (EPHY_SETTINGS_UI,
+					EPHY_PREFS_UI_SHOW_TOOLBARS,
+				        flags & EPHY_WEB_VIEW_CHROME_TOOLBAR);
 	}
 }
 
diff --git a/src/pdm-dialog.c b/src/pdm-dialog.c
index aae26c0..1b3e94c 100644
--- a/src/pdm-dialog.c
+++ b/src/pdm-dialog.c
@@ -67,7 +67,7 @@ struct PdmActionInfo
 	GtkTreeView *treeview;
 	GtkTreeSelection *selection;
 	GtkTreeModel *model;
-	int remove_id;
+	const char *remove_id;
 	int data_col;
 	char *scroll_to_host;
 	gboolean filled;
@@ -115,37 +115,9 @@ enum
 
 enum
 {
-	PROP_WINDOW,
-	PROP_NOTEBOOK,
-	PROP_COOKIES_TREEVIEW,
-	PROP_COOKIES_REMOVE,
-	PROP_COOKIES_PROPERTIES,
-	PROP_PASSWORDS_TREEVIEW,
-	PROP_PASSWORDS_REMOVE,
-	PROP_PASSWORDS_SHOW
-};
-
-enum
-{
 	PDM_DIALOG_RESPONSE_CLEAR = 1
 };
 
-static const
-EphyDialogProperty properties [] =
-{
-	{ "pdm_dialog",			NULL, PT_NORMAL, 0 },
-	{ "pdm_notebook",		NULL, PT_NORMAL, 0 },
-
-	{ "cookies_treeview",		NULL, PT_NORMAL, 0 },
-	{ "cookies_remove_button",	NULL, PT_NORMAL, 0 },
-	{ "cookies_properties_button",	NULL, PT_NORMAL, 0 },
-	{ "passwords_treeview",		NULL, PT_NORMAL, 0 },
-	{ "passwords_remove_button",	NULL, PT_NORMAL, 0 },
-	{ "passwords_show_button",	NULL, PT_NORMAL, 0 },
-
-	{ NULL }
-};
-
 static void pdm_dialog_class_init	(PdmDialogClass *klass);
 static void pdm_dialog_init		(PdmDialog *dialog);
 static void pdm_dialog_finalize		(GObject *object);
@@ -174,11 +146,10 @@ pdm_dialog_show_help (PdmDialog *pd)
 		"managing-passwords"
 	};
 
-	ephy_dialog_get_controls
-		(EPHY_DIALOG (pd),
-		 properties[PROP_WINDOW].id, &window,
-		 properties[PROP_NOTEBOOK].id, &notebook,
-		 NULL);
+	ephy_dialog_get_controls (EPHY_DIALOG (pd),
+				  "pdm_dialog", &window,
+				  "pdm_notebook", &notebook,
+				  NULL);
 
 	id = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook));
 	g_return_if_fail (id == 0 || id == 1);
@@ -488,7 +459,7 @@ action_treeview_selection_changed_cb (GtkTreeSelection *selection,
 
 	has_selection = gtk_tree_selection_count_selected_rows (selection) > 0;
 
-	widget = ephy_dialog_get_control (d, properties[action->remove_id].id);
+	widget = ephy_dialog_get_control (d, action->remove_id);
 	gtk_widget_set_sensitive (widget, has_selection);
 
 }
@@ -616,7 +587,7 @@ setup_action (PdmActionInfo *action)
 	GtkTreeSelection *selection;
 
 	widget = ephy_dialog_get_control (EPHY_DIALOG(action->dialog),
-					  properties[action->remove_id].id);
+					  action->remove_id);
 	g_signal_connect (widget, "clicked",
 			  G_CALLBACK (pdm_dialog_remove_button_clicked_cb),
 			  action);
@@ -645,8 +616,7 @@ show_cookies_properties (PdmDialog *dialog,
 	GtkWidget *content_area;
 	char *str;
 
-	parent = ephy_dialog_get_control (EPHY_DIALOG(dialog),
-					  properties[PROP_WINDOW].id);
+	parent = ephy_dialog_get_control (EPHY_DIALOG(dialog), "pdm_dialog");
 
 	gdialog = gtk_dialog_new_with_buttons
 		 (_("Cookie Properties"),
@@ -791,7 +761,7 @@ cookies_treeview_selection_changed_cb (GtkTreeSelection *selection,
 
 	has_selection = gtk_tree_selection_count_selected_rows (selection) == 1;
 
-	widget = ephy_dialog_get_control (d, properties[PROP_COOKIES_PROPERTIES].id);
+	widget = ephy_dialog_get_control (d, "cookies_properties_button");
 	gtk_widget_set_sensitive (widget, has_selection);
 }
 
@@ -828,8 +798,8 @@ pdm_dialog_cookies_construct (PdmActionInfo *info)
 	LOG ("pdm_dialog_cookies_construct");
 
 	ephy_dialog_get_controls (EPHY_DIALOG (dialog),
-				  properties[PROP_COOKIES_TREEVIEW].id, &treeview,
-				  properties[PROP_COOKIES_PROPERTIES].id, &button,
+				  "cookies_treeview", &treeview,
+				  "cookies_properties_button", &button,
 				  NULL);
 
 	g_signal_connect (button, "clicked",
@@ -1234,8 +1204,8 @@ passwords_show_toggled_cb (GtkWidget *button,
 	GtkTreeViewColumn *column;
 	gboolean active;
 
-	treeview = GTK_TREE_VIEW (ephy_dialog_get_control
-			(EPHY_DIALOG(dialog), properties[PROP_PASSWORDS_TREEVIEW].id));
+	treeview = GTK_TREE_VIEW (ephy_dialog_get_control (EPHY_DIALOG(dialog),
+							   "passwords_treeview"));
 	column = gtk_tree_view_get_column (treeview, COL_PASSWORDS_PASSWORD);
 
 	active = gtk_toggle_button_get_active ((GTK_TOGGLE_BUTTON (button)));
@@ -1257,8 +1227,8 @@ pdm_dialog_passwords_construct (PdmActionInfo *info)
 	LOG ("pdm_dialog_passwords_construct");
 
 	ephy_dialog_get_controls (EPHY_DIALOG (dialog),
-				  properties[PROP_PASSWORDS_TREEVIEW].id, &treeview,
-				  properties[PROP_PASSWORDS_SHOW].id, &button,
+				  "passwords_treeview", &treeview,
+				  "passwords_show_button", &button,
 				  NULL);
 
 	g_signal_connect (button, "toggled",
@@ -1521,7 +1491,7 @@ pdm_dialog_response_cb (GtkDialog *widget,
 		GtkWidget *parent;
 
 		parent = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-						  properties[PROP_WINDOW].id);
+						  "pdm_dialog");
 
 		page = gtk_notebook_get_current_page (GTK_NOTEBOOK (dialog->priv->notebook));
 		if (page == 0)
@@ -1554,14 +1524,13 @@ pdm_dialog_init (PdmDialog *dialog)
 	priv = dialog->priv = EPHY_PDM_DIALOG_GET_PRIVATE (dialog);
 
 	ephy_dialog_construct (EPHY_DIALOG(dialog),
-			       properties,
 			       ephy_file ("epiphany.ui"),
 			       "pdm_dialog",
 			       NULL);
 
 	ephy_dialog_get_controls (EPHY_DIALOG (dialog),
-				  properties[PROP_WINDOW].id, &window,
-				  properties[PROP_NOTEBOOK].id, &priv->notebook,
+				  "pdm_dialog", &window,
+				  "pdm_notebook", &priv->notebook,
 				  NULL);
 
 	ephy_gui_ensure_window_group (GTK_WINDOW (window));
@@ -1576,9 +1545,9 @@ pdm_dialog_init (PdmDialog *dialog)
 	 * one set of buttons is wider than another.
 	 */
 	ephy_dialog_set_size_group (EPHY_DIALOG (dialog),
-				    properties[PROP_COOKIES_REMOVE].id,
-				    properties[PROP_COOKIES_PROPERTIES].id,
-				    properties[PROP_PASSWORDS_REMOVE].id,
+				    "cookies_remove_button",
+				    "cookies_properties_button",
+				    "passwords_remove_button",
 				    NULL);
 
 	cookies = g_new0 (PdmActionInfo, 1);
@@ -1589,7 +1558,7 @@ pdm_dialog_init (PdmDialog *dialog)
 	cookies->remove = pdm_dialog_cookie_remove;
 	cookies->scroll_to = pdm_dialog_cookie_scroll_to;
 	cookies->dialog = dialog;
-	cookies->remove_id = PROP_COOKIES_REMOVE;
+	cookies->remove_id = "cookies_remove_button";
 	cookies->data_col = COL_COOKIES_DATA;
 	cookies->scroll_to_host = NULL;
 	cookies->filled = FALSE;
@@ -1603,7 +1572,7 @@ pdm_dialog_init (PdmDialog *dialog)
 	passwords->add = pdm_dialog_password_add;
 	passwords->remove = pdm_dialog_password_remove;
 	passwords->dialog = dialog;
-	passwords->remove_id = PROP_PASSWORDS_REMOVE;
+	passwords->remove_id = "passwords_remove_button";
 	passwords->data_col = COL_PASSWORDS_DATA;
 	passwords->scroll_to_host = NULL;
 	passwords->filled = FALSE;
diff --git a/src/popup-commands.c b/src/popup-commands.c
index c90dcf0..4db684e 100644
--- a/src/popup-commands.c
+++ b/src/popup-commands.c
@@ -234,7 +234,7 @@ save_property_url (GtkAction *action,
 		(persist, EPHY_EMBED_PERSIST_FROM_CACHE |
 			  (ask_dest ? EPHY_EMBED_PERSIST_ASK_DESTINATION : 0));
 	ephy_embed_persist_set_persist_key
-		(persist, CONF_STATE_SAVE_DIR);
+		(persist, EPHY_PREFS_STATE_SAVE_DIR);
 	ephy_embed_persist_set_source (persist, location);
 	ephy_embed_persist_set_embed (persist, embed);
 
diff --git a/src/prefs-dialog.c b/src/prefs-dialog.c
index 437a88b..b1dcc71 100644
--- a/src/prefs-dialog.c
+++ b/src/prefs-dialog.c
@@ -2,6 +2,7 @@
 /*
  *  Copyright © 200-2003 Marco Pesenti Gritti
  *  Copyright © 2003, 2004, 2005 Christian Persch
+ *  Copyright © 2010 Igalia S.L.
  *
  *  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
@@ -24,6 +25,7 @@
 #include "prefs-dialog.h"
 #include "ephy-dialog.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-embed-container.h"
 #include "ephy-embed-shell.h"
 #include "ephy-embed-utils.h"
@@ -33,7 +35,6 @@
 #include "ephy-embed-single.h"
 #include "ephy-shell.h"
 #include "ephy-gui.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-langs.h"
 #include "ephy-encodings.h"
 #include "ephy-debug.h"
@@ -54,115 +55,6 @@ static void prefs_dialog_init		(PrefsDialog *pd);
 
 #include "languages.h"
 
-static const char * const cookies_accept_enum [] =
-{
-	"anywhere", "current site", "nowhere"
-};
-
-enum
-{
-	WINDOW_PROP,
-	NOTEBOOK_PROP,
-
-	/* General */
-	HOMEPAGE_ENTRY_PROP,
-	HOMEPAGE_CURRENT_PROP,
-	HOMEPAGE_BLANK_PROP,
-	AUTO_OPEN_PROP,
-	DOWNLOAD_PATH_HBOX_PROP,
-	DOWNLOAD_PATH_LABEL_PROP,
-	WEB_INSPECTOR_BUTTON_PROP,
-
-	/* Fonts and Colors */
-	USE_FONTS_PROP,
-	MIN_SIZE_PROP,
-	USE_COLORS_PROP,
-	CSS_CONTAINER_PROP,
-	CSS_CHECKBOX_PROP,
-	CSS_EDIT_BOX_PROP,
-	CSS_EDIT_BUTTON_PROP,
-
-	/* Privacy */
-	ALLOW_POPUPS_PROP,
-	ALLOW_JAVA_PROP,
-	ALLOW_JS_PROP,
-	ACCEPT_COOKIES_PROP,
-	REMEMBER_PASSWORDS_PROP,
-	DISK_CACHE_PROP,
-	CLEAR_CACHE_BUTTON_PROP,
-
-	/* Language */
-	DEFAULT_ENCODING_PROP,
-	DEFAULT_ENCODING_LABEL_PROP,
-	LANGUAGE_ADD_BUTTON_PROP,
-	LANGUAGE_REMOVE_BUTTON_PROP,
-	LANGUAGE_UP_BUTTON_PROP,
-	LANGUAGE_DOWN_BUTTON_PROP,
-	LANGUAGE_TREEVIEW_PROP
-};
-
-static const
-EphyDialogProperty properties [] =
-{
-	{ "prefs_dialog",	NULL, PT_NORMAL, 0},
-	{ "prefs_notebook",	NULL, PT_NORMAL, 0},
-
-	/* General */
-	{ "homepage_entry",			CONF_GENERAL_HOMEPAGE,	    PT_AUTOAPPLY,  G_TYPE_STRING },
-	{ "homepage_current_button",		NULL,			    PT_NORMAL,	   0 },
-	{ "homepage_blank_button",		NULL,			    PT_NORMAL,	   0 },
-	{ "automatic_downloads_checkbutton",	CONF_AUTO_DOWNLOADS,        PT_AUTOAPPLY,  0 },
-	{ "download_button_hbox",		NULL,			    PT_NORMAL,	   0 },
-	{ "download_button_label",		NULL,			    PT_NORMAL,	   0 },
-	{ "web_inspector_checkbutton",	        CONF_WEB_INSPECTOR_ENABLED, PT_AUTOAPPLY,  0 },
-
-	/* Fonts and Colors */
-	{ "use_fonts_checkbutton",	CONF_RENDERING_USE_OWN_FONTS,	PT_AUTOAPPLY | PT_INVERTED,	0 },
-	{ "min_size_spinbutton",	CONF_RENDERING_FONT_MIN_SIZE,	PT_AUTOAPPLY,	0 },
-	{ "use_colors_checkbutton",	CONF_RENDERING_USE_OWN_COLORS,	PT_AUTOAPPLY | PT_INVERTED,	0 },
-	{ "css_container",		NULL,				PT_NORMAL,	0 },
-	{ "css_checkbox",		CONF_USER_CSS_ENABLED,		PT_AUTOAPPLY,	0 },
-	{ "css_edit_box",		NULL,				PT_NORMAL,	0 },
-	{ "css_edit_button",		NULL,				PT_NORMAL,	0 },
-
-	/* Privacy */
-	{ "popups_allow_checkbutton",		CONF_SECURITY_ALLOW_POPUPS,	  PT_AUTOAPPLY, 0 },
-	{ "enable_plugins_checkbutton",		CONF_SECURITY_PLUGINS_ENABLED,	  PT_AUTOAPPLY, 0 },
-	{ "enable_javascript_checkbutton",	CONF_SECURITY_JAVASCRIPT_ENABLED, PT_AUTOAPPLY, 0 },
-	{ "cookies_radiobutton",		CONF_SECURITY_COOKIES_ACCEPT,	  PT_AUTOAPPLY, G_TYPE_STRING },
-	{ "remember_passwords_checkbutton",	CONF_PRIVACY_REMEMBER_PASSWORDS,  PT_AUTOAPPLY, 0 },
-	{ "disk_cache_spin",			CONF_NETWORK_CACHE_SIZE,	  PT_AUTOAPPLY, 0 },
-	{ "clear_cache_button",			NULL,				  PT_NORMAL,	0 },
-
-	/* Languages */
-	{ "default_encoding_combo",	CONF_LANGUAGE_DEFAULT_ENCODING,		PT_AUTOAPPLY,	G_TYPE_STRING },
-	{ "default_encoding_label",	NULL,					PT_NORMAL,	0 },
-	{ "lang_add_button",		NULL,					PT_NORMAL,	0 },
-	{ "lang_remove_button",		NULL,					PT_NORMAL,	0 },
-	{ "lang_up_button",		NULL,					PT_NORMAL,	0 },
-	{ "lang_down_button",		NULL,					PT_NORMAL,	0 },
-	{ "lang_treeview",		NULL,					PT_NORMAL,	0 },
-
-	{ NULL }
-};
-
-enum
-{
-	LANGUAGE_DIALOG,
-	LANGUAGE_PROP,
-	LANGUAGE_ACCEPT_BUTTON_PROP
-};
-
-static const
-EphyDialogProperty add_lang_props [] =
-{
-	{ "add_language_dialog", NULL,	PT_NORMAL,	0 },
-	{ "languages_treeview",	 NULL,	PT_NORMAL,	G_TYPE_STRING },
-	{ "add_button",		 NULL,	PT_NORMAL,	0 },
-
-	{ NULL }
-};
-
 enum
 {
 	COL_LANG_NAME,
@@ -232,8 +124,8 @@ prefs_dialog_show_help (EphyDialog *dialog)
 	};
 
 	ephy_dialog_get_controls (dialog,
-				  properties[WINDOW_PROP].id, &window,
-				  properties[NOTEBOOK_PROP].id, &notebook,
+				  "prefs_dialog", &window,
+				  "prefs_notebook", &notebook,
 				  NULL);
 
 	id = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook));
@@ -243,13 +135,6 @@ prefs_dialog_show_help (EphyDialog *dialog)
 }
 
 static void
-css_checkbox_toggled (GtkToggleButton *button,
-		      GtkWidget *widget)
-{
-	g_object_set (widget, "sensitive", gtk_toggle_button_get_active (button), NULL);
-}
-
-static void
 css_edit_button_clicked_cb (GtkWidget *button,
 			    PrefsDialog *pd)
 {
@@ -264,12 +149,73 @@ css_edit_button_clicked_cb (GtkWidget *button,
 	g_object_unref (css_file);
 }
 
+static gboolean
+combo_get_mapping (GValue *value,
+		   GVariant *variant,
+		   gpointer user_data)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	gboolean valid = FALSE;
+	const char *settings_name;
+	int i;
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (user_data));
+	valid = gtk_tree_model_get_iter_first (model, &iter);
+	settings_name = g_variant_get_string (variant, NULL);
+	i = 0;
+
+	while (valid)
+	{
+		char *item_name;
+		gtk_tree_model_get (model, &iter, 1, &item_name, -1);
+
+		if (g_strcmp0 (item_name, settings_name) == 0)
+		{
+			g_value_set_int (value, i);
+			break;
+		}
+
+		i++;
+		valid = gtk_tree_model_iter_next (model, &iter);
+		g_free (item_name);
+	}
+
+	return TRUE;
+}
+
+static GVariant *
+combo_set_mapping (const GValue *value,
+		   const GVariantType *expected_type,
+		   gpointer user_data)
+{
+	GVariant *variant = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	gboolean valid = FALSE;
+	int n;
+
+	n = g_value_get_int (value);
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (user_data));
+	valid = gtk_tree_model_iter_nth_child (model, &iter, NULL, n);
+
+	if (valid)
+	{
+		char *item_name;
+		gtk_tree_model_get (model, &iter, 1, &item_name, -1);
+
+		variant = g_variant_new_string (item_name);
+
+		g_free (item_name);
+	}
+
+	return variant;
+}
+
 static void
 create_node_combo (EphyDialog *dialog,
-		   int prop,
 		   EphyEncodings *encodings,
 		   EphyNode *node,
-		   const char *key,
 		   const char *default_value)
 {
 	EphyTreeModelNode *nodemodel;
@@ -279,15 +225,19 @@ create_node_combo (EphyDialog *dialog,
 	char *code;
 	int title_col, data_col;
 
-	code = eel_gconf_get_string (key);
+	code = g_settings_get_string (EPHY_SETTINGS_WEB,
+				      EPHY_PREFS_WEB_DEFAULT_ENCODING);
 	if (code == NULL || ephy_encodings_get_node (encodings, code, FALSE) == NULL)
 	{
 		/* safe default */
-		eel_gconf_set_string (key, default_value);
+		g_settings_set_string (EPHY_SETTINGS_WEB,
+				       EPHY_PREFS_WEB_DEFAULT_ENCODING,
+				       default_value);
 	}
 	g_free (code);
 
-	combo = GTK_COMBO_BOX (ephy_dialog_get_control (dialog, properties[prop].id));
+	combo = GTK_COMBO_BOX (ephy_dialog_get_control (dialog,
+							"default_encoding_combo"));
 
 	nodemodel = ephy_tree_model_node_new (node);
 
@@ -309,7 +259,14 @@ create_node_combo (EphyDialog *dialog,
                                         "text", title_col,
                                         NULL);
 
-	ephy_dialog_set_data_column (dialog, properties[prop].id, data_col);
+	g_settings_bind_with_mapping (EPHY_SETTINGS_WEB,
+				      EPHY_PREFS_WEB_DEFAULT_ENCODING,
+				      combo, "active",
+				      G_SETTINGS_BIND_DEFAULT,
+				      combo_get_mapping,
+				      combo_set_mapping,
+				      combo,
+				      NULL);
 
 	g_object_unref (nodemodel);
 	g_object_unref (sortmodel);
@@ -358,10 +315,12 @@ static void
 language_editor_update_pref (PrefsDialog *pd)
 {
 	GtkTreeIter iter;
-	GSList *codes = NULL;
+	GVariantBuilder builder;
 
 	if (gtk_tree_model_get_iter_first (pd->priv->lang_model, &iter))
 	{
+		g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+
 		do
 		{
 			char *code;
@@ -369,17 +328,15 @@ language_editor_update_pref (PrefsDialog *pd)
 			gtk_tree_model_get (pd->priv->lang_model, &iter,
 					    COL_LANG_CODE, &code,
 					    -1);
-
-			codes = g_slist_prepend (codes, code);
+			g_variant_builder_add (&builder, "s", code);
+			g_free (code);
 		}
 		while (gtk_tree_model_iter_next (pd->priv->lang_model, &iter));
-	}
 
-	codes = g_slist_reverse (codes);
-	eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, codes);
-
-	g_slist_foreach (codes, (GFunc) g_free, NULL);
-	g_slist_free (codes);
+		g_settings_set (EPHY_SETTINGS_WEB,
+				EPHY_PREFS_WEB_LANGUAGE,
+				"as", &builder);
+	}
 }
 
 static void
@@ -420,7 +377,7 @@ add_lang_dialog_selection_changed (GtkTreeSelection *selection,
 	GtkWidget *button;
 	int n_selected;
 
-	button = ephy_dialog_get_control (dialog, add_lang_props[LANGUAGE_ACCEPT_BUTTON_PROP].id);
+	button = ephy_dialog_get_control (dialog, "add_button");
 
 	n_selected = gtk_tree_selection_count_selected_rows (selection);
 	gtk_widget_set_sensitive (button, n_selected > 0);
@@ -443,7 +400,7 @@ add_lang_dialog_response_cb (GtkWidget *widget,
 	if (response == GTK_RESPONSE_ACCEPT)
 	{
 		treeview = GTK_TREE_VIEW (ephy_dialog_get_control
-				(dialog, add_lang_props[LANGUAGE_PROP].id));
+				(dialog, "languages_treeview"));
 		selection = gtk_tree_view_get_selection (treeview);
 
 		rows = gtk_tree_selection_get_selected_rows (selection, &model);
@@ -572,7 +529,7 @@ setup_add_language_dialog (PrefsDialog *pd)
 	GtkTreeIter iter;
 	int i;
 
-	parent = ephy_dialog_get_control (EPHY_DIALOG (pd), properties[WINDOW_PROP].id);
+	parent = ephy_dialog_get_control (EPHY_DIALOG (pd), "prefs_dialog");
 
 	dialog =  EPHY_DIALOG (g_object_new (EPHY_TYPE_DIALOG,
 					     "parent-window", parent,
@@ -581,7 +538,6 @@ setup_add_language_dialog (PrefsDialog *pd)
 					     NULL));
 
 	ephy_dialog_construct (dialog, 
-			       add_lang_props,
 			       ephy_file ("prefs-dialog.ui"),
 			       "add_language_dialog",
 			       NULL);
@@ -610,8 +566,8 @@ setup_add_language_dialog (PrefsDialog *pd)
 		(GTK_TREE_SORTABLE (sortmodel), COL_LANG_NAME, GTK_SORT_ASCENDING);
 
 	ephy_dialog_get_controls (dialog,
-				  add_lang_props[LANGUAGE_PROP].id, &treeview,
-				  add_lang_props[LANGUAGE_DIALOG].id, &window,
+				  "languages_treeview", &treeview,
+				  "add_language_dialog", &window,
 				  NULL);
 
 	gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (parent)),
@@ -776,18 +732,19 @@ create_language_section (EphyDialog *dialog)
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
 	GtkTreeSelection *selection;
-	GSList *list, *l, *ulist = NULL;
+	char **list = NULL;
+	int i;
 
 	pd->priv->iso_639_table = ephy_langs_iso_639_table ();
 	pd->priv->iso_3166_table = ephy_langs_iso_3166_table ();
 
 	ephy_dialog_get_controls
 		(dialog,
-		 properties[LANGUAGE_TREEVIEW_PROP].id, &treeview,
-		 properties[LANGUAGE_ADD_BUTTON_PROP].id, &pd->priv->lang_add_button,
-		 properties[LANGUAGE_REMOVE_BUTTON_PROP].id, &pd->priv->lang_remove_button,
-		 properties[LANGUAGE_UP_BUTTON_PROP].id, &pd->priv->lang_up_button, 
-		 properties[LANGUAGE_DOWN_BUTTON_PROP].id, &pd->priv->lang_down_button,
+		 "lang_treeview", &treeview,
+		 "lang_add_button", &pd->priv->lang_add_button,
+		 "lang_remove_button", &pd->priv->lang_remove_button,
+		 "lang_up_button", &pd->priv->lang_up_button,
+		 "lang_down_button", &pd->priv->lang_down_button,
 		 NULL);
 
 	g_signal_connect (pd->priv->lang_add_button, "clicked",
@@ -802,16 +759,13 @@ create_language_section (EphyDialog *dialog)
 	/* setup the languages treeview */
 	pd->priv->lang_treeview = treeview;
 
-	gtk_tree_view_set_reorderable (GTK_TREE_VIEW (treeview), TRUE);
+	gtk_tree_view_set_reorderable (treeview, TRUE);
+	gtk_tree_view_set_headers_visible (treeview, FALSE);
 
 	store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
 
 	pd->priv->lang_model = GTK_TREE_MODEL (store);
-
 	gtk_tree_view_set_model (treeview, pd->priv->lang_model);
-	g_object_unref (store);
-
-	gtk_tree_view_set_headers_visible (treeview, FALSE);
 
 	renderer = gtk_cell_renderer_text_new ();
 
@@ -833,28 +787,13 @@ create_language_section (EphyDialog *dialog)
 	g_signal_connect (G_OBJECT (selection), "changed",
 			  G_CALLBACK (language_editor_selection_changed_cb), pd);
 
-	list = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE);
-
-	/* uniquify list */
-	for (l = list; l != NULL; l = l->next)
-	{
-		if (g_slist_find_custom (ulist, l->data, (GCompareFunc) strcmp) == NULL)
-		{
-			ulist = g_slist_prepend (ulist, g_strdup (l->data));
-		}
-	}
-	ulist = g_slist_reverse (ulist);
-
-	/* if modified, write back */
-	if (g_slist_length (ulist) != g_slist_length (list))
-	{
-		eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, ulist);
-	}
+	list = g_settings_get_strv (EPHY_SETTINGS_WEB,
+				    EPHY_PREFS_WEB_LANGUAGE);
 
 	/* Fill languages editor */
-	for (l = ulist; l != NULL; l = l->next)
+	for (i = 0; list[i]; i++)
 	{
-		const char *code = (const char *) l->data;
+		const char *code = (const char *) list[i];
 
 		if (strcmp (code, "system") == 0)
 		{
@@ -869,24 +808,27 @@ create_language_section (EphyDialog *dialog)
 			g_free (text);
 		}
 	}
+	g_object_unref (store);
 
 	language_editor_update_buttons (pd);
+	g_strfreev (list);
 
 	/* Lockdown if key is not writable */
-	if (eel_gconf_key_is_writable (CONF_RENDERING_LANGUAGE) == FALSE)
-	{
-		gtk_widget_set_sensitive (pd->priv->lang_add_button, FALSE);
-		gtk_widget_set_sensitive (pd->priv->lang_remove_button, FALSE);
-		gtk_widget_set_sensitive (pd->priv->lang_up_button, FALSE);
-		gtk_widget_set_sensitive (pd->priv->lang_down_button, FALSE);
-		gtk_widget_set_sensitive (GTK_WIDGET (pd->priv->lang_treeview), FALSE);
-	}
-
-	g_slist_foreach (list, (GFunc) g_free, NULL);
-	g_slist_free (list);
-
-	g_slist_foreach (ulist, (GFunc) g_free, NULL);
-	g_slist_free (ulist);
+	g_settings_bind_writable (EPHY_SETTINGS_WEB,
+				  EPHY_PREFS_WEB_LANGUAGE,
+				  pd->priv->lang_add_button, "sensitive", FALSE);
+	g_settings_bind_writable (EPHY_SETTINGS_WEB,
+				  EPHY_PREFS_WEB_LANGUAGE,
+				  pd->priv->lang_remove_button, "sensitive", FALSE);
+	g_settings_bind_writable (EPHY_SETTINGS_WEB,
+				  EPHY_PREFS_WEB_LANGUAGE,
+				  pd->priv->lang_up_button, "sensitive", FALSE);
+	g_settings_bind_writable (EPHY_SETTINGS_WEB,
+				  EPHY_PREFS_WEB_LANGUAGE,
+				  pd->priv->lang_down_button, "sensitive", FALSE);
+	g_settings_bind_writable (EPHY_SETTINGS_WEB,
+				  EPHY_PREFS_WEB_LANGUAGE,
+				  pd->priv->lang_treeview, "sensitive", FALSE);
 }
 
 static void
@@ -909,15 +851,20 @@ download_path_changed_cb (GtkFileChooser *button)
 	 * two ephy_file_ functions. */
 	if (strcmp (dir, downloads_dir) == 0)
 	{
-		eel_gconf_set_string (CONF_STATE_DOWNLOAD_DIR, _("Downloads"));
+		g_settings_set_string (EPHY_SETTINGS_STATE,
+				       EPHY_PREFS_STATE_DOWNLOAD_DIR,
+				       _("Downloads"));
 	}
 	else if (strcmp (dir, desktop_dir) == 0)
 	{
-		eel_gconf_set_string (CONF_STATE_DOWNLOAD_DIR, _("Desktop"));
+		g_settings_set_string (EPHY_SETTINGS_STATE,
+				       EPHY_PREFS_STATE_DOWNLOAD_DIR,
+				       _("Desktop"));
 	}
 	else
 	{
-		eel_gconf_set_path (CONF_STATE_DOWNLOAD_DIR, dir);
+		g_settings_set_string (EPHY_SETTINGS_STATE,
+				       EPHY_PREFS_STATE_DOWNLOAD_DIR, dir);
 	}
 
 	g_free (dir);
@@ -935,9 +882,9 @@ create_download_path_button (EphyDialog *dialog)
 	dir = ephy_file_get_downloads_dir ();
 
 	ephy_dialog_get_controls (dialog,
-				  properties[DOWNLOAD_PATH_HBOX_PROP].id, &hbox,
-				  properties[DOWNLOAD_PATH_LABEL_PROP].id, &label,
-				  properties[WINDOW_PROP].id, &parent,
+				  "download_button_hbox", &hbox,
+				  "download_button_label", &label,
+				  "prefs_dialog", &parent,
 				  NULL);
 
 	fc = ephy_file_chooser_new (_("Select a Directory"),
@@ -945,7 +892,8 @@ create_download_path_button (EphyDialog *dialog)
 				    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
 				    NULL, EPHY_FILE_FILTER_NONE);
 
-	/* Unset the destroy-with-parent, since gtkfilechooserbutton doesn't expect this */
+	/* Unset the destroy-with-parent, since gtkfilechooserbutton doesn't
+	 * expect this */
 	gtk_window_set_destroy_with_parent (GTK_WINDOW (fc), FALSE);
 
 	button = gtk_file_chooser_button_new_with_dialog (GTK_WIDGET (fc));
@@ -958,7 +906,9 @@ create_download_path_button (EphyDialog *dialog)
 	gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
 	gtk_widget_show (button);
 
-	gtk_widget_set_sensitive (button, eel_gconf_key_is_writable (CONF_STATE_DOWNLOAD_DIR));
+	g_settings_bind_writable (EPHY_SETTINGS_STATE,
+				  EPHY_PREFS_STATE_DOWNLOAD_DIR,
+				  button, "sensitive", FALSE);
 	g_free (dir);
 }
 
@@ -977,37 +927,25 @@ prefs_dialog_response_cb (GtkDialog *widget,
 }
 
 static void
-prefs_clear_cache_button_clicked_cb (GtkWidget *button,
-				     PrefsDialog *dialog)
+clear_cache_button_clicked_cb (GtkWidget *button,
+			       PrefsDialog *dialog)
 {
 	GtkWidget *parent;
 
 	parent = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-					  properties[WINDOW_PROP].id);
-	pdm_dialog_show_clear_all_dialog (EPHY_DIALOG (dialog),
-					  parent,
+					  "prefs_dialog");
+	pdm_dialog_show_clear_all_dialog (EPHY_DIALOG (dialog), parent,
 					  CLEAR_ALL_CACHE);
 }
 
 static void
-set_homepage_entry (EphyDialog *dialog,
-		    const char *new_location)
-{
-	GValue value = { 0, };
-
-	g_value_init (&value, G_TYPE_STRING);
-	g_value_set_string (&value, new_location);
-	ephy_dialog_set_value (dialog, properties[HOMEPAGE_ENTRY_PROP].id, &value);
-	g_value_unset (&value);
-}
-
-static void
-prefs_homepage_current_button_clicked_cb (GtkWidget *button,
-					  EphyDialog *dialog)
+homepage_current_button_clicked_cb (GtkWidget *button,
+				    EphyDialog *dialog)
 {
 	EphySession *session;
 	EphyWindow *window;
 	EphyEmbed *embed;
+	EphyWebView *view;
 
 	session = EPHY_SESSION (ephy_shell_get_session (ephy_shell_get_default ()));
 	window = ephy_session_get_active_window (session);
@@ -1019,16 +957,127 @@ prefs_homepage_current_button_clicked_cb (GtkWidget *button,
           (EPHY_EMBED_CONTAINER (window));
 	g_return_if_fail (embed != NULL);
 
-	set_homepage_entry (dialog, ephy_web_view_get_address (ephy_embed_get_web_view (embed)));
+	view = ephy_embed_get_web_view (embed);
+
+	g_settings_set_string (EPHY_SETTINGS_MAIN, EPHY_PREFS_HOMEPAGE_URL,
+			       ephy_web_view_get_address (view));
 }
 
 static void
-prefs_homepage_blank_button_clicked_cb (GtkWidget *button,
-					EphyDialog *dialog)
+homepage_blank_button_clicked_cb (GtkWidget *button,
+				  EphyDialog *dialog)
+{
+	g_settings_set_string (EPHY_SETTINGS_MAIN,
+			       EPHY_PREFS_HOMEPAGE_URL, "");
+}
+
+static gboolean
+cookies_get_mapping (GValue *value,
+		     GVariant *variant,
+		     gpointer user_data)
 {
-	set_homepage_entry (dialog, NULL);
+	const char *setting;
+	char *name;
+
+	setting = g_variant_get_string (variant, NULL);
+
+	g_object_get (user_data, "name", &name, NULL);
+
+	/* If the button name matches the setting, it should be active. */
+	if (g_strcmp0 (name, setting) == 0)
+		g_value_set_boolean (value, TRUE);
+
+	g_free (name);
+
+	return TRUE;
+}
+
+static GVariant *
+cookies_set_mapping (const GValue *value,
+		     const GVariantType *expected_type,
+		     gpointer user_data)
+{
+	GVariant *variant = NULL;
+	char *name;
+
+	/* Don't act unless the button has been activated (turned ON). */
+	if (!g_value_get_boolean (value))
+		return NULL;
+
+	g_object_get (user_data, "name", &name, NULL);
+	variant = g_variant_new_string (name);
+
+	g_free (name);
+
+	return variant;
 }
 
+typedef struct
+{
+	char *obj;
+	char *prop;
+	char *schema;
+	char *key;
+	GSettingsBindFlags flags;
+	GSettingsBindGetMapping get_mapping;
+	GSettingsBindSetMapping set_mapping;
+} PrefsDialogPreference;
+
+static const PrefsDialogPreference preferences[] =
+{
+	{ "homepage_entry", "text",
+	  EPHY_PREFS_SCHEMA, EPHY_PREFS_HOMEPAGE_URL,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "automatic_downloads_checkbutton", "active",
+	  EPHY_PREFS_SCHEMA, EPHY_PREFS_AUTO_DOWNLOADS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "web_inspector_checkbutton", "active",
+	  EPHY_PREFS_SCHEMA, EPHY_PREFS_ENABLE_WEB_INSPECTOR,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "remember_passwords_checkbutton", "active",
+	  EPHY_PREFS_SCHEMA, EPHY_PREFS_REMEMBER_PASSWORDS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+
+	{ "disk_cache_spinbutton", "value",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_CACHE_SIZE,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "use_fonts_checkbutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_USE_OWN_FONTS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "min_size_spinbutton", "value",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_FONT_MIN_SIZE,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "use_colors_checkbutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_USE_OWN_COLORS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "popups_allow_checkbutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_ENABLE_POPUPS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "enable_plugins_checkbutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_ENABLE_PLUGINS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "enable_javascript_checkbutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_ENABLE_JAVASCRIPT,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "css_checkbox", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_ENABLE_USER_CSS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+	{ "css_edit_button", "sensitive",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_ENABLE_USER_CSS,
+	  G_SETTINGS_BIND_DEFAULT, NULL, NULL },
+
+	/* Has mapping */
+	{ "cookies_always_radiobutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_COOKIES_POLICY,
+	  G_SETTINGS_BIND_DEFAULT, cookies_get_mapping, cookies_set_mapping },
+	{ "cookies_no_third_party_radiobutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_COOKIES_POLICY,
+	  G_SETTINGS_BIND_DEFAULT, cookies_get_mapping, cookies_set_mapping },
+	{ "cookies_never_radiobutton", "active",
+	  EPHY_PREFS_WEB_SCHEMA, EPHY_PREFS_WEB_COOKIES_POLICY,
+	  G_SETTINGS_BIND_DEFAULT, cookies_get_mapping, cookies_set_mapping },
+};
+
 static void
 prefs_dialog_init (PrefsDialog *pd)
 {
@@ -1036,31 +1085,42 @@ prefs_dialog_init (PrefsDialog *pd)
 	EphyEncodings *encodings;
 	GtkWidget *window, *curr_button, *blank_button;
 	GtkWidget *clear_cache_button;
-	GtkWidget *css_checkbox, *css_edit_box, *css_edit_button, *css_container;
-	gboolean sensitive;
+	GtkWidget *css_checkbox, *css_edit_button;
+	int i;
 
 	pd->priv = EPHY_PREFS_DIALOG_GET_PRIVATE (pd);
 
 	ephy_dialog_construct (dialog,
-			       properties,
 			       ephy_file ("prefs-dialog.ui"),
 			       "prefs_dialog",
 			       NULL);
 
-	ephy_dialog_add_enum (dialog, properties[ACCEPT_COOKIES_PROP].id,
-			      G_N_ELEMENTS (cookies_accept_enum), cookies_accept_enum);
+	for (i = 0; i < G_N_ELEMENTS (preferences); i++)
+	{
+		PrefsDialogPreference pref;
+		GtkWidget *widget;
+		GSettings *settings;
+
+		pref = preferences[i];
+		settings = ephy_settings_get (pref.schema);
+		widget = ephy_dialog_get_control (dialog, pref.obj);
+
+		g_settings_bind_with_mapping (settings, pref.key,
+					      widget, pref.prop,
+					      pref.flags,
+					      pref.get_mapping,
+					      pref.set_mapping,
+					      widget, NULL);
+	}
 
-	ephy_dialog_get_controls
-		(dialog,
-		 properties[WINDOW_PROP].id, &window,
-		 properties[HOMEPAGE_CURRENT_PROP].id, &curr_button,
-		 properties[HOMEPAGE_BLANK_PROP].id, &blank_button,
-		 properties[CSS_CHECKBOX_PROP].id, &css_checkbox,
-		 properties[CSS_EDIT_BOX_PROP].id, &css_edit_box,
-		 properties[CSS_EDIT_BUTTON_PROP].id, &css_edit_button,
-		 properties[CSS_CONTAINER_PROP].id, &css_container,
-		 properties[CLEAR_CACHE_BUTTON_PROP].id, &clear_cache_button,
-		 NULL);
+	ephy_dialog_get_controls (dialog,
+				  "prefs_dialog", &window,
+				  "homepage_current_button", &curr_button,
+				  "homepage_blank_button", &blank_button,
+				  "css_checkbox", &css_checkbox,
+				  "css_edit_button", &css_edit_button,
+				  "clear_cache_button", &clear_cache_button,
+				  NULL);
 
 	ephy_gui_ensure_window_group (GTK_WINDOW (window));
 
@@ -1068,31 +1128,31 @@ prefs_dialog_init (PrefsDialog *pd)
 			  G_CALLBACK (prefs_dialog_response_cb), dialog);
 
 	g_signal_connect (curr_button, "clicked",
-			  G_CALLBACK (prefs_homepage_current_button_clicked_cb), dialog);
+			  G_CALLBACK (homepage_current_button_clicked_cb),
+			  dialog);
 	g_signal_connect (blank_button, "clicked",
-			  G_CALLBACK (prefs_homepage_blank_button_clicked_cb), dialog);
+			  G_CALLBACK (homepage_blank_button_clicked_cb),
+			  dialog);
 
 	/* set homepage button sensitivity */
-	sensitive = eel_gconf_key_is_writable (CONF_GENERAL_HOMEPAGE);
-	gtk_widget_set_sensitive (curr_button, sensitive);
-	gtk_widget_set_sensitive (blank_button, sensitive);
-
-	css_checkbox_toggled (GTK_TOGGLE_BUTTON (css_checkbox), css_edit_box);
-	g_signal_connect (css_checkbox, "toggled",
-			  G_CALLBACK (css_checkbox_toggled), css_edit_box);
+	g_settings_bind_writable (EPHY_SETTINGS_MAIN,
+				  EPHY_PREFS_HOMEPAGE_URL,
+				  curr_button, "sensitive", FALSE);
+	g_settings_bind_writable (EPHY_SETTINGS_MAIN,
+				  EPHY_PREFS_HOMEPAGE_URL,
+				  blank_button, "sensitive", FALSE);
 
 	g_signal_connect (css_edit_button, "clicked",
 			  G_CALLBACK (css_edit_button_clicked_cb), dialog);
 
 	g_signal_connect (clear_cache_button, "clicked",
-			  G_CALLBACK (prefs_clear_cache_button_clicked_cb), dialog);
+			  G_CALLBACK (clear_cache_button_clicked_cb), dialog);
 
 	encodings = EPHY_ENCODINGS (ephy_embed_shell_get_encodings
 					(EPHY_EMBED_SHELL (ephy_shell)));
 
-	create_node_combo (dialog, DEFAULT_ENCODING_PROP, encodings,
-			   ephy_encodings_get_all (encodings),
-			   CONF_LANGUAGE_DEFAULT_ENCODING, "ISO-8859-1");
+	create_node_combo (dialog, encodings,
+			   ephy_encodings_get_all (encodings), "ISO-8859-1");
 
 	create_language_section	(dialog);
 
diff --git a/src/window-commands.c b/src/window-commands.c
index 7859907..163f35a 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -30,8 +30,8 @@
 #include "ephy-embed-persist.h"
 #include "ephy-debug.h"
 #include "window-commands.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-prefs.h"
+#include "ephy-settings.h"
 #include "ephy-embed-prefs.h"
 #include "ephy-dialog.h"
 #include "ephy-bookmarks-editor.h"
@@ -313,7 +313,7 @@ window_cmd_file_open (GtkAction *action,
 	dialog = ephy_file_chooser_new (_("Open"),
 					GTK_WIDGET (window),
 					GTK_FILE_CHOOSER_ACTION_OPEN,
-					CONF_STATE_OPEN_DIR,
+					EPHY_PREFS_STATE_OPEN_DIR,
 					EPHY_FILE_FILTER_ALL_SUPPORTED);
 
 	g_signal_connect (dialog, "response",
@@ -343,7 +343,7 @@ window_cmd_file_save_as (GtkAction *action,
 	dialog = ephy_file_chooser_new (_("Save"),
 					GTK_WIDGET (window),
 					GTK_FILE_CHOOSER_ACTION_SAVE,
-					CONF_STATE_SAVE_DIR,
+					EPHY_PREFS_STATE_SAVE_DIR,
 					EPHY_FILE_FILTER_ALL);
 
 	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
@@ -396,7 +396,8 @@ window_cmd_file_close_window (GtkAction *action,
 
 	notebook = ephy_window_get_notebook (window);
 
-	if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_QUIT) &&
+	if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
+				    EPHY_PREFS_LOCKDOWN_QUIT) &&
 	    gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 1)
 	{
 		return;
@@ -1232,5 +1233,6 @@ window_cmd_browse_with_caret (GtkAction *action,
 		}
 	}
 
-	eel_gconf_set_boolean (CONF_CARET_BROWSING_ENABLED, active);
+	g_settings_set_boolean (EPHY_SETTINGS_MAIN,
+				EPHY_PREFS_ENABLE_CARET_BROWSING, active);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]