diff --git a/Makefile.am b/Makefile.am
index 1f47e59..bf32064 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,6 +9,14 @@ SUBDIRS = \
 	extras \
 	po
 
+gsettings_SCHEMAS = $(top_srcdir)/bin/org.gnome.banshee.gschema.xml
+@GSETTINGS_RULES@
+
+gschemas:
+	@pushd build; \
+	make gschemas; \
+	popd;
+
 # Important targets
 
 clean-local:
@@ -58,7 +66,7 @@ check-bootstrap-env:
 	fi
 
 run: check-bootstrap-env $(MO_FILES)
-	(cd bin; $(MONO) --debug $(BANSHEE_DEV_MONO_OPTIONS) Nereid.exe --debug --uninstalled $(BANSHEE_DEV_OPTIONS))
+	(cd bin; $(MONO) --runtime=v4.0 --debug $(BANSHEE_DEV_MONO_OPTIONS) Nereid.exe --debug --uninstalled $(BANSHEE_DEV_OPTIONS))
 
 run-profiled: check-bootstrap-env $(MO_FILES)
 	(cd bin; LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):/usr/local/lib $(MONO) --debug $(BANSHEE_DEV_MONO_OPTIONS) --profile=log:time=fast,calls,noalloc,maxframes=5 Nereid.exe --uninstalled $(BANSHEE_DEV_OPTIONS))
@@ -105,7 +113,7 @@ csharp:
 	@pushd .; \
     echo ""; \
     echo "Starting csharp with Gtk#, Hyena, Banshee, etc referenced"; \
-    csharp -lib:bin/ -pkg:glib-sharp-2.0 -pkg:gtk-sharp-2.0 -pkg:gconf-sharp-2.0 -pkg:dbus-sharp -pkg:taglib-sharp -pkg:ipod-sharp -pkg:mono-addins $(addprefix "-reference:", $(wildcard bin/*.dll)); \
+    csharp -lib:bin/ -pkg:glib-sharp-2.0 -pkg:gtk-sharp-2.0 -pkg:dbus-sharp -pkg:taglib-sharp -pkg:ipod-sharp -pkg:mono-addins $(addprefix "-reference:", $(wildcard bin/*.dll)); \
 	popd;
 
 test:
diff --git a/build/GSettingsSchemaExtractor.cs b/build/GSettingsSchemaExtractor.cs
index b4ecc80..fc36fce 100644
--- a/build/GSettingsSchemaExtractor.cs
+++ b/build/GSettingsSchemaExtractor.cs
@@ -110,14 +110,7 @@ public class GSettingsSchemaExtractorProgram
         }
 
         string type_definition = field.FieldType.GetGenericTypeDefinition ().Name;
-
-        if (type_definition.StartsWith ("SchemaEntry")) {
-            Console.WriteLine ("Found SchemaEntry: " + type.FullName + "." + field.Name);
-
-            return true;
-        }
-
-        return false;
+        return (type_definition.StartsWith ("SchemaEntry") || type_definition.StartsWith ("DynamicSchemaEntry"));
     }
 
     private static string GetStringValueOfFieldNamed (object schemaEntryObject, string fieldName)
@@ -168,26 +161,35 @@ public class GSettingsSchemaExtractorProgram
     internal struct GSettingsSchema
     {
         internal string Id { get; private set; }
-        internal string Path { get { return Id.Replace ("org.gnome.", "/apps/").Replace (".", "/") + "/"; } }
+        internal bool Dynamic { get; private set; }
+
+        internal string Path {
+            get {
+                return Dynamic ? String.Empty :
+                           String.Format ("path=\"{0}\"", Id.Replace ("org.gnome.", "/apps/")
+                                                            .Replace (".", "/") + "/");
+            }
+        }
 
         internal HashSet<GSettingsKey> Keys { get; private set; }
 
-        internal GSettingsSchema (string id) : this ()
+        internal GSettingsSchema (string id, bool dynamic) : this ()
         {
             Id = id;
+            Dynamic = dynamic;
             Keys = new HashSet<GSettingsKey> ();
         }
 
         public override string ToString ()
         {
             string result = String.Empty;
-            result += String.Format ("  <schema id=\"{0}\" path=\"{1}\" gettext-domain=\"banshee\">\n", Id, Path);
+            result += String.Format ("  <schema id=\"{0}\" {1} gettext-domain=\"banshee\">\n", Id, Path);
             foreach (var key in Keys) {
                 result += key.ToString ();
             }
@@ -212,6 +214,8 @@ public class GSettingsSchemaExtractorProgram
                 throw new ArgumentNullException ("field");
             }
 
+            Console.WriteLine ("Found SchemaEntry: " + field.DeclaringType.FullName + "." + field.Name);
+
             object schema = field.GetValue (null);
             if (schema == null) {
                 throw new InvalidSchemaException (String.Format (
@@ -219,6 +223,8 @@ public class GSettingsSchemaExtractorProgram
                     field.Name, field.DeclaringType.FullName));
             }
 
+            bool dynamic = field.FieldType.Name.StartsWith ("Dynamic");
+
             var default_value_field = schema.GetType ().GetField ("DefaultValue");
             var default_value = default_value_field.GetValue (schema);
 
@@ -228,14 +234,16 @@ public class GSettingsSchemaExtractorProgram
             var short_description = GetStringValueOfFieldNamed (schema, "ShortDescription");
             var long_description = GetStringValueOfFieldNamed (schema, "LongDescription");
 
-            return new GSettingsKey (schemaSet, default_value, default_value_type, namespce, key, short_description, long_description);
+            return new GSettingsKey (schemaSet, dynamic,
+                                     default_value, default_value_type, namespce, key, short_description, long_description);
         }
 
-        private GSettingsKey (SchemaSet schemaSet, object defaultValue, Type defaultValueType,
+        private GSettingsKey (SchemaSet schemaSet, bool dynamic,
+                              object defaultValue, Type defaultValueType,
                               string namespce, string key,
                               string short_desc, string long_desc) : this ()
         {
-            ParentSchema = schemaSet.RetrieveOrCreate (namespce);
+            ParentSchema = schemaSet.RetrieveOrCreate (namespce, dynamic);
 
             Default = GetDefault (defaultValue, defaultValueType);
             KeyName = key.Replace ("_", "-");
@@ -272,12 +280,12 @@ public class GSettingsSchemaExtractorProgram
             return "org.gnome.banshee." + CamelCaseToUnderScoreLowerCase (namespce);
         }
 
-        internal GSettingsSchema RetrieveOrCreate (string namespce)
+        internal GSettingsSchema RetrieveOrCreate (string namespce, bool dynamic)
         {
             string id = NamespaceToId (namespce);
             GSettingsSchema schema;
             if (!Schemas.TryGetValue (id, out schema)) {
-                schema = new GSettingsSchema (id);
+                schema = new GSettingsSchema (id, dynamic);
                 Schemas [id] = schema;
             }
             return schema;
@@ -328,7 +336,7 @@ public class GSettingsSchemaExtractorProgram
         string undercase = String.Empty;
         string [] tokens = Regex.Split (s, "([A-Z]{1}[a-z]+)");
         
-        for(int i = 0; i < tokens.Length; i++) {
+        for (int i = 0; i < tokens.Length; i++) {
             if (tokens [i] == String.Empty) {
                 continue;
             }
diff --git a/build/GSettingsSchemaExtractorTests.cs b/build/GSettingsSchemaExtractorTests.cs
index 2e91980..d326993 100644
--- a/build/GSettingsSchemaExtractorTests.cs
+++ b/build/GSettingsSchemaExtractorTests.cs
@@ -286,6 +286,34 @@ namespace GSettingsSchemaExtractor
             Assert.That (result.ToString ().Trim (), Is.StringContaining ("<schema id="));
         }
 
+        internal class DynamicType {
+            public static readonly DynamicSchemaEntry<int> VolumeSchema = new DynamicSchemaEntry<int> (
+                "player_engine", "volume",
+                80,
+                "Volume",
+                "Volume of playback relative to mixer output"
+            );
+        }
+
+        [Test]
+        public void RelocatableSchema ()
+        {
+            StringBuilder result = GSettingsSchemaExtractorProgram.Extract (new Type [] { typeof (DynamicType) });
+
+            Assert.That (result, Is.Not.Null);
+            Assert.That (result.ToString ().Trim (), Is.EqualTo (@"
+<schemalist>
+  <schema id=""org.gnome.banshee.player_engine""  gettext-domain=""banshee"">
+    <key name=""volume"" type=""i"">
+      <default>80</default>
+      <summary>Volume</summary>
+      <description>Volume of playback relative to mixer output</description>
+    </key>
+  </schema>
+</schemalist>"
+                .Trim ()));
+        }
+
     }
 }
 
diff --git a/build/Makefile.am b/build/Makefile.am
index 6109183..0d32cf0 100644
--- a/build/Makefile.am
+++ b/build/Makefile.am
@@ -1,19 +1,19 @@
 SUBDIRS = pkg-config m4
 
-GCONF_SCHEMA_EXTRACTOR_ASSEMBLY = gconf-schema-extractor.exe
+gsettings_SCHEMAS = org.gnome.banshee.gschema.xml
+GSETTINGS_SCHEMA_EXTRACTOR_ASSEMBLY = gsettings-schema-extractor.exe
 TRANSLATOR_EXTRACTOR_ASSEMBLY = translator-extractor.exe
 DLL_MAP_VERIFIER_ASSEMBLY = dll-map-verifier.exe
 ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY = addin-xml-string-extractor.exe
 GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY = gobject-intptr-ctor-verifier.exe
 
-ALL_TARGETS = $(TRANSLATOR_EXTRACTOR_ASSEMBLY) $(DLL_MAP_VERIFIER_ASSEMBLY) $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY) $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY)
+ALL_TARGETS = \
+	$(TRANSLATOR_EXTRACTOR_ASSEMBLY) \
+	$(DLL_MAP_VERIFIER_ASSEMBLY) \
+	$(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY) \
+	$(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY)
 
-if GCONF_SCHEMAS_INSTALL
-bansheedir = $(pkglibdir)
-banshee_SCRIPTS = $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY)
-$(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY): GConfSchemaExtractor.cs
-	$(MCS) -out:$@ $<
-endif
+gschemas: $(gsettings_SCHEMAS)
 
 all: $(ALL_TARGETS)
 
@@ -26,6 +26,25 @@ $(TRANSLATOR_EXTRACTOR_ASSEMBLY): TranslatorExtractor.cs
 $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs
 	$(MCS) -out:$@ $<
 
+#GSE_NUNIT_LINK = $(shell echo "$(NUNIT_LIBS)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
+
+$(GSETTINGS_SCHEMA_EXTRACTOR_ASSEMBLY): GSettingsSchemaExtractor.cs GSettingsSchemaExtractorTests.cs
+	@dmcs \
+		-r:$(top_srcdir)/bin/Banshee.Core.dll \
+		-r:/usr/lib/cli/nunit.core-2.6/nunit.core.dll \
+		-r:/usr/lib/cli/nunit.framework-2.6/nunit.framework.dll \
+		-define:ENABLE_TESTS \
+		GSettingsSchemaExtractor.cs GSettingsSchemaExtractorTests.cs \
+		-out:$@ 
+
+test: $(GSETTINGS_SCHEMA_EXTRACTOR_ASSEMBLY)
+	MONO_PATH=$(top_srcdir)/bin:/usr/lib/cli/nunit.core-2.6:/usr/lib/cli/nunit.framework-2.6:/usr/lib/cli/Mono.Addins-0.2 nunit-console $(GSETTINGS_SCHEMA_EXTRACTOR_ASSEMBLY) 
+
+#-run:GSettingsSchemaExtractor.Tests.SchemaWithString
+
+$(gsettings_SCHEMAS): $(GSETTINGS_SCHEMA_EXTRACTOR_ASSEMBLY)
+	MONO_PATH=/usr/lib/cli/nunit.core-2.6:/usr/lib/cli/dbus-sharp-1.0/:$(top_srcdir)/bin:/usr/lib/cli/taglib-sharp-2.1:/usr/lib/cli/Mono.Addins-0.2:/usr/lib/mono/gtk-sharp-3.0 /opt/mono/bin/mono --debug $< $(top_srcdir)/bin/
+
 $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY): AddinXmlStringExtractor.cs
 	$(MCS) -r:System.Xml -out:$@ $<
 
@@ -35,13 +54,13 @@ $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY): GObjectIntPtrCtorVerifier.cs
 EXTRA_DIST = \
 	icon-theme-installer \
 	private-icon-theme-installer \
-	GConfSchemaExtractor.cs \
+	GSettingsSchemaExtractor.cs \
+	GSettingsSchemaExtractorTests.cs \
 	TranslatorExtractor.cs \
 	DllMapVerifier.cs \
 	AddinXmlStringExtractor.cs \
 	GObjectIntPtrCtorVerifier.cs \
 	dll-map-makefile-verifier \
-	gconf-schema-rules \
 	gnome-doc-utils.make
 
 CLEANFILES = *.exe *.mdb
diff --git a/build/build.environment.mk b/build/build.environment.mk
index 2092e13..35fb3c7 100644
--- a/build/build.environment.mk
+++ b/build/build.environment.mk
@@ -169,7 +169,7 @@ REF_EXTENSION_WIKIPEDIA= $(LINK_BANSHEE_WEBBROWSER_DEPS)
 
 # Backends
 REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO) $(LINK_GUDEV)
-REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF)
+REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
 REF_BACKEND_OSX = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(MONOMAC_LIBS)
diff --git a/build/m4/banshee/gconf.m4 b/build/m4/banshee/gconf.m4
deleted file mode 100644
index 16239db..0000000
--- a/build/m4/banshee/gconf.m4
+++ /dev/null
@@ -1,12 +0,0 @@
-AC_DEFUN([BANSHEE_CHECK_GCONF],
-[
-	AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
-
-	# libgconf check needed because its -devel pkg should contain AM_GCONF_SOURCE_2 macro, see bgo#604416
-	PKG_CHECK_MODULES(LIBGCONF, gconf-2.0)
-
-	# needed so autoconf doesn't complain before checking the existence of libgconf2-devel above
-	m4_pattern_allow([AM_GCONF_SOURCE_2])
-
-	AM_GCONF_SOURCE_2
-])
diff --git a/configure.ac b/configure.ac
index 2751b13..4b88a2c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -137,10 +137,9 @@ dnl GNOME (optional)
 AC_ARG_ENABLE(gnome, AC_HELP_STRING([--disable-gnome], [Disable GNOME support]), , enable_gnome="yes")
 if test "x$enable_gnome" = "xyes"; then
 	BANSHEE_CHECK_GNOME_SHARP
-	BANSHEE_CHECK_GCONF
 	AM_CONDITIONAL(ENABLE_GNOME, true)
+	GLIB_GSETTINGS
 else
-	AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, false)
 	AM_CONDITIONAL(ENABLE_GNOME, false)
 fi
 
diff --git a/src/Backends/Banshee.Gnome/Banshee.Gnome.addin.xml b/src/Backends/Banshee.Gnome/Banshee.Gnome.addin.xml
index 47ad5c6..7bbed4c 100644
--- a/src/Backends/Banshee.Gnome/Banshee.Gnome.addin.xml
+++ b/src/Backends/Banshee.Gnome/Banshee.Gnome.addin.xml
@@ -19,7 +19,7 @@
   </Extension>
 
   <Extension path="/Banshee/Platform/ConfigurationClient">
-    <ConfigurationClient class="Banshee.GnomeBackend.GConfConfigurationClient"/>
+    <ConfigurationClient class="Banshee.GnomeBackend.GSettingsConfigurationClient"/>
   </Extension>
 
   <Extension path="/Banshee/Platform/DiscDuplicator">
diff --git a/src/Backends/Banshee.Gnome/Banshee.Gnome.csproj b/src/Backends/Banshee.Gnome/Banshee.Gnome.csproj
index a25fd52..cf4a094 100644
--- a/src/Backends/Banshee.Gnome/Banshee.Gnome.csproj
+++ b/src/Backends/Banshee.Gnome/Banshee.Gnome.csproj
@@ -73,9 +73,6 @@
     <Reference Include="gtk-sharp">
       <SpecificVersion>False</SpecificVersion>
     </Reference>
-    <Reference Include="gconf-sharp">
-      <SpecificVersion>False</SpecificVersion>
-    </Reference>
     <Reference Include="Mono.Posix">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..bin\Mono.Posix.dll</HintPath>
@@ -90,12 +87,11 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Banshee.GnomeBackend\GConfConfigurationClient.cs" />
     <Compile Include="Banshee.GnomeBackend\GnomeService.cs" />
     <Compile Include="Banshee.GnomeBackend\Brasero.cs" />
     <Compile Include="Banshee.GnomeBackend\DiscDuplicator.cs" />
     <Compile Include="Banshee.GnomeBackend\GnomeScreensaverManager.cs" />
-    <Compile Include="Banshee.GnomeBackend\GConfProxy.cs" />
+    <Compile Include="Banshee.GnomeBackend\GSettingsConfigurationClient.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Banshee.Gnome.addin.xml">
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs
deleted file mode 100644
index 72af89f..0000000
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-// GConfConfigurationClient.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2006-2008 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using GConf;
-
-using Hyena;
-using Banshee.Base;
-using Banshee.Configuration;
-
-namespace Banshee.GnomeBackend
-{
-    public class GConfConfigurationClient : IConfigurationClient
-    {
-        private GConf.Client client;
-        private Dictionary<string, string> key_table = new Dictionary<string, string> ();
-
-        private static bool disable_gconf_checked = false;
-        private static bool disable_gconf = false;
-
-        private static bool DisableGConf {
-            get {
-                if (!disable_gconf_checked) {
-                    disable_gconf = ApplicationContext.EnvironmentIsSet ("BANSHEE_DISABLE_GCONF");
-                    disable_gconf_checked = true;
-                }
-
-                return disable_gconf;
-            }
-        }
-
-        private static string base_key;
-        private static string BaseKey {
-            get {
-                if (base_key == null) {
-                    base_key = ApplicationContext.CommandLine["gconf-base-key"];
-                    if (!base_key.StartsWith ("/apps/") || !base_key.EndsWith ("/")) {
-                        Log.Debug ("Using default gconf-base-key");
-                        base_key = "/apps/banshee-1/";
-                    }
-                }
-                return base_key;
-            }
-        }
-
-        public GConfConfigurationClient ()
-        {
-            if (Hyena.PlatformDetection.IsMeeGo) {
-                throw new InvalidOperationException ("GConf is not supported on MeeGo");
-            }
-        }
-
-        private string CreateKey (string @namespace, string part)
-        {
-            string hash_key = String.Concat (@namespace, part);
-            lock (((ICollection)key_table).SyncRoot) {
-                if (!key_table.ContainsKey (hash_key)) {
-                    part = part.Replace ('/', '_');
-                    if (@namespace == null) {
-                        key_table.Add (hash_key, String.Concat (BaseKey, StringUtil.CamelCaseToUnderCase (part)));
-                    } else if (@namespace.StartsWith ("/")) {
-                        key_table.Add (hash_key, String.Concat (@namespace,
-                            @namespace.EndsWith ("/") ? String.Empty : "/", StringUtil.CamelCaseToUnderCase (part)));
-                    } else {
-                        @namespace = @namespace.Replace ('/', '_');
-                        key_table.Add (hash_key, String.Concat (BaseKey,
-                            StringUtil.CamelCaseToUnderCase (String.Concat (@namespace.Replace ('.', '/'), "/", part))
-                        ));
-                    }
-
-                    key_table[hash_key] = key_table[hash_key].Replace (' ', '_');
-                }
-
-                return key_table[hash_key];
-            }
-        }
-
-        public bool TryGet<T> (string @namespace, string key, out T result)
-        {
-            if (DisableGConf || key == null) {
-                result = default (T);
-                return false;
-            }
-
-            if (client == null) {
-                client = new GConf.Client ();
-            }
-
-            try {
-                result = (T)client.Get (CreateKey (@namespace, key));
-                return true;
-            } catch (GConf.NoSuchKeyException) {
-            } catch (Exception e) {
-                Log.Exception (String.Format ("Could not read GConf key {0}.{1}", @namespace, key), e);
-            }
-
-            result = default (T);
-            return false;
-        }
-
-        public void Set<T> (string @namespace, string key, T value)
-        {
-            if (DisableGConf || key == null) {
-                return;
-            }
-
-            if (client == null) {
-                client = new GConf.Client ();
-            }
-
-            // We wrap the Set call in a try/catch to work around bgo#659835,
-            // which causes Banshee to go haywire (see bgo#659841)
-            try {
-                client.Set (CreateKey (@namespace, key), value);
-            } catch (Exception e) {
-                Log.Exception (String.Format ("Could not set GConf key {0}.{1}.", @namespace, key), e);
-            }
-        }
-    }
-}
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
index b6a18f0..ee17e86 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
@@ -35,8 +35,6 @@ namespace Banshee.GnomeBackend
 {
     public class GnomeService : IExtensionService, IDisposable
     {
-        private GConfProxy gconf_proxy;
-
         private Brasero brasero;
         internal Brasero Brasero {
             get { return brasero; }
@@ -49,14 +47,6 @@ namespace Banshee.GnomeBackend
         public void Initialize ()
         {
             try {
-                // FIXME: this needs to be deferred/delayed initialized
-                gconf_proxy = new GConfProxy ();
-            } catch (Exception e) {
-                Hyena.Log.Exception ("GConfProxy", e);
-                gconf_proxy = null;
-            }
-
-            try {
                 brasero = new Brasero ();
                 brasero.Initialize ();
             } catch {
@@ -75,11 +65,6 @@ namespace Banshee.GnomeBackend
                 brasero = null;
             }
 
-            if (gconf_proxy != null) {
-                gconf_proxy.Dispose ();
-                gconf_proxy = null;
-            }
-
             if (Browser.OpenHandler == (Banshee.Web.Browser.OpenUrlHandler) OpenUrl) {
                 Browser.OpenHandler = null;
             }
diff --git a/src/Backends/Banshee.Gnome/Makefile.am b/src/Backends/Banshee.Gnome/Makefile.am
index 4a1b0bc..80d1d25 100644
--- a/src/Backends/Banshee.Gnome/Makefile.am
+++ b/src/Backends/Banshee.Gnome/Makefile.am
@@ -6,10 +6,9 @@ INSTALL_DIR = $(BACKENDS_INSTALL_DIR)
 SOURCES =  \
 	Banshee.GnomeBackend/Brasero.cs \
 	Banshee.GnomeBackend/DiscDuplicator.cs \
-	Banshee.GnomeBackend/GConfConfigurationClient.cs \
-	Banshee.GnomeBackend/GConfProxy.cs \
 	Banshee.GnomeBackend/GnomeScreensaverManager.cs \
-	Banshee.GnomeBackend/GnomeService.cs
+	Banshee.GnomeBackend/GnomeService.cs \
+	Banshee.GnomeBackend/GSettingsConfigurationClient.cs
 
 RESOURCES =  \
 	Banshee.Gnome.addin.xml \
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
index d7831c3..1dd4720 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
@@ -31,19 +31,21 @@ namespace Banshee.Configuration
     public interface IConfigurationClient
     {
         bool TryGet<T> (string @namespace, string key, out T result);
+        bool TryGet<T> (string @namespace, string relocatedNamespace, string key, out T result);
         void Set<T> (string @namespace, string key, T value);
+        void Set<T> (string @namespace, string relocatedNamespace, string key, T value);
     }
 
     public static class Extensions
     {
         public static T Get<T> (this IConfigurationClient client, SchemaEntry<T> entry)
         {
-            return client.Get<T> (entry.Namespace, entry.Key, entry.DefaultValue);
+            return client.Get<T> (entry.Namespace, entry.RelocatedNamespace, entry.Key, entry.DefaultValue);
         }
 
         public static T Get<T> (this IConfigurationClient client, SchemaEntry<T> entry, T fallback)
         {
-            return client.Get<T> (entry.Namespace, entry.Key, fallback);
+            return client.Get<T> (entry.Namespace, entry.RelocatedNamespace, entry.Key, fallback);
         }
 
         public static T Get<T> (this IConfigurationClient client, string key, T fallback)
@@ -53,13 +55,18 @@ namespace Banshee.Configuration
 
         public static T Get<T> (this IConfigurationClient client, string namespce, string key, T fallback)
         {
+            return client.Get<T> (namespce, null, key, fallback);
+        }
+
+        public static T Get<T> (this IConfigurationClient client, string namespce, string relocatedNamespace, string key, T fallback)
+        {
             T result;
-            return client.TryGet<T> (namespce, key, out result) ? result : fallback;
+            return client.TryGet<T> (namespce, relocatedNamespace, key, out result) ? result : fallback;
         }
 
         public static void Set<T> (this IConfigurationClient client, SchemaEntry<T> entry, T value)
         {
-            client.Set (entry.Namespace, entry.Key, value);
+            client.Set (entry.Namespace, entry.RelocatedNamespace, entry.Key, value);
         }
 
         public static void Set<T> (this IConfigurationClient client, string key, T value)
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
index a4a7fc9..64be933 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
@@ -58,6 +58,11 @@ namespace Banshee.Configuration
             }
         }
 
+        public bool TryGet<T> (string namespce, string relocatedNamespace, string key, out T result)
+        {
+            return TryGet<T> (relocatedNamespace, key, out result);
+        }
+
         public void Set<T> (string namespce, string key, T value)
         {
             lock (this) {
@@ -70,6 +75,11 @@ namespace Banshee.Configuration
             }
         }
 
+        public void Set<T> (string namespce, string relocatedNamespace, string key, T value)
+        {
+            Set <T> (relocatedNamespace, key, value);
+        }
+
         public static string MakeKey (string namespce, string key)
         {
             return String.Format ("{0}{1}{2}", namespce, String.IsNullOrEmpty (namespce) ? String.Empty : ".", key);
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs b/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
index 52334a2..30ace9a 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
@@ -54,7 +54,21 @@ namespace Banshee.Configuration
         }
 
         public SchemaEntry (string @namespace, string key, T defaultValue, T minValue, T maxValue,
-            string shortDescription, string longDescription)
+                            string shortDescription, string longDescription) :
+            this (@namespace, null, key, defaultValue, maxValue, minValue, shortDescription, longDescription)
+        {
+        }
+
+        internal SchemaEntry (string @namespace, string relocatedNamespace,
+                              string key, T defaultValue,
+                              string shortDescription, string longDescription) :
+            this (@namespace, relocatedNamespace, key, defaultValue, default (T), default (T), shortDescription, longDescription)
+        {
+        }
+
+        internal SchemaEntry (string @namespace, string relocatedNamespace, string key,
+                              T defaultValue, T minValue, T maxValue,
+                              string shortDescription, string longDescription)
         {
             Namespace = @namespace;
             Key = key;
@@ -63,6 +77,7 @@ namespace Banshee.Configuration
             MaxValue = maxValue;
             ShortDescription = shortDescription;
             LongDescription = longDescription;
+            RelocatedNamespace = relocatedNamespace;
 
             SchemaEntry.OnSchemaAdded (Namespace, Key, Get ());
         }
@@ -91,6 +106,7 @@ namespace Banshee.Configuration
         }
 
         public readonly string Namespace;
+        public readonly string RelocatedNamespace;
         public readonly string Key;
         public readonly T DefaultValue;
         public readonly T MinValue;
@@ -100,7 +116,7 @@ namespace Banshee.Configuration
 
         public bool Equals (SchemaEntry<T> entry)
         {
-            return Namespace == entry.Namespace && Key == entry.Key;
+            return Namespace == entry.Namespace && RelocatedNamespace == entry.RelocatedNamespace && Key == entry.Key;
         }
 
         public override bool Equals (object o)
@@ -110,7 +126,10 @@ namespace Banshee.Configuration
 
         public override int GetHashCode ()
         {
-            return Namespace.GetHashCode () ^ Key.GetHashCode ();
+            if (RelocatedNamespace == null) {
+                return Namespace.GetHashCode () ^ Key.GetHashCode ();
+            }
+            return Namespace.GetHashCode () ^ RelocatedNamespace.GetHashCode () ^ Key.GetHashCode ();
         }
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
index a19a451..fc2a88f 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
@@ -110,6 +110,11 @@ namespace Banshee.Configuration
             }
         }
 
+        public bool TryGet<T> (string namespce, string relocatedNamespace, string key, out T result)
+        {
+            return TryGet <T> (relocatedNamespace, key, out result);
+        }
+
         public void Set<T>(SchemaEntry<T> entry, T value)
         {
             Set(entry.Namespace, entry.Key, value);
@@ -158,6 +163,11 @@ namespace Banshee.Configuration
             }
         }
 
+        public void Set<T> (string namespce, string relocatedNamespace, string key, T value)
+        {
+            Set (relocatedNamespace, key, value);
+        }
+
         private XmlNode GetNamespaceNode(string [] namespace_parts, bool create)
         {
             return GetNamespaceNode(xml_document.DocumentElement, namespace_parts, create);
diff --git a/src/Core/Banshee.Core/Banshee.Core.csproj b/src/Core/Banshee.Core/Banshee.Core.csproj
index 22650af..17c44f7 100644
--- a/src/Core/Banshee.Core/Banshee.Core.csproj
+++ b/src/Core/Banshee.Core/Banshee.Core.csproj
@@ -141,6 +135,7 @@
     <Compile Include="Banshee.IO\Tests.cs" />
     <Compile Include="Banshee.Collection\YearInfo.cs" />
     <Compile Include="Banshee.IO\ProviderConfiguration.cs" />
+    <Compile Include="Banshee.Configuration\DynamicSchemaEntry.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Resources\contributors.xml">
diff --git a/src/Core/Banshee.Core/Makefile.am b/src/Core/Banshee.Core/Makefile.am
index 3b0e064..dc19416 100644
--- a/src/Core/Banshee.Core/Makefile.am
+++ b/src/Core/Banshee.Core/Makefile.am
@@ -27,6 +27,7 @@ SOURCES =  \
 	Banshee.Collection/YearInfo.cs \
 	Banshee.Configuration.Schema/ImportSchema.cs \
 	Banshee.Configuration/ConfigurationClient.cs \
+	Banshee.Configuration/DynamicSchemaEntry.cs \
 	Banshee.Configuration/IConfigurationClient.cs \
 	Banshee.Configuration/MemoryConfigurationClient.cs \
 	Banshee.Configuration/SchemaEntry.cs \
diff --git a/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs b/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
index 3097c4e..222f95e 100644
--- a/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
+++ b/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
@@ -78,6 +78,11 @@ namespace Banshee.Configuration
             return false;
         }
 
+        public bool TryGet <T> (string namespce, string relocatedNamespace, string key, out T result)
+        {
+            return TryGet <T> (relocatedNamespace, key, out result);
+        }
+
         private IDataReader Get (string namespce, string key)
         {
             return connection.Query (select_value_command,
@@ -94,6 +99,11 @@ namespace Banshee.Configuration
             }
         }
 
+        public void Set <T> (string namespce, string relocatedNamespace, string key, T value)
+        {
+            Set<T> (relocatedNamespace, key, value);
+        }
+
         protected virtual string TableName {
             get { return "CoreConfiguration"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
index 64622b6..89fb6ae 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
@@ -116,11 +116,18 @@ namespace Banshee.Sources
             get { return DatabaseTrackInfo.Provider; }
         }
 
+        internal static readonly DynamicSchemaEntry<string[]> CurrentFiltersSchema = new DynamicSchemaEntry<string[]> (
+            "sources",
+            "current_filters",
+            new string [0],
+            null, null
+        );
+
         private void DatabaseSourceInitialize ()
         {
             InitializeTrackModel ();
 
-            current_filters_schema = CreateSchema<string[]> ("current_filters");
+            current_filters_schema = CurrentFiltersSchema.ToSchemaEntry (CurrentFiltersSchema.Namespace + "." + ParentConfigurationId);
 
             DatabaseSource filter_src = Parent as DatabaseSource ?? this;
             foreach (IFilterListModel filter in filter_src.CreateFiltersFor (this)) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
index ac712ad..5a92345 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
@@ -39,39 +39,26 @@ namespace Banshee.Gui
 
         private static Dictionary<string, PersistentPaneController> controllers = new Dictionary<string, PersistentPaneController> ();
 
-        private string @namespace;
-        private string key;
-        private int fallback;
+        private SchemaEntry<int> entry;
         private uint timer_id = 0;
         private bool pending_changes;
         private Paned pane;
         private int last_position;
 
-        public static void Control (Paned pane, string name)
-        {
-            Control (pane, String.Format ("{0}.{1}", NamespacePrefix, name), "position", pane.Position);
-        }
-
         public static void Control (Paned pane, SchemaEntry<int> entry)
         {
-            Control (pane, entry.Namespace, entry.Key, entry.DefaultValue);
-        }
-
-        private static void Control (Paned pane, string @namespace, string key, int defaultValue)
-        {
-            string dict_key = String.Format ("{0}.{1}", @namespace, key);
+            string namespce = String.IsNullOrEmpty (entry.RelocatedNamespace) ? entry.Namespace : entry.RelocatedNamespace;
+            string dict_key = String.Format ("{0}.{1}", namespce, entry.Key);
             if (controllers.ContainsKey (dict_key)) {
                 controllers[dict_key].Paned = pane;
             } else {
-                controllers.Add (dict_key, new PersistentPaneController (pane, @namespace, key, defaultValue));
+                controllers.Add (dict_key, new PersistentPaneController (pane, entry));
             }
         }
 
-        private PersistentPaneController (Paned pane, string @namespace, string key, int fallback)
+        private PersistentPaneController (Paned pane, SchemaEntry<int> entry)
         {
-            this.@namespace = @namespace;
-            this.key = key;
-            this.fallback = fallback;
+            this.entry = entry;
             Paned = pane;
         }
 
@@ -86,7 +73,7 @@ namespace Banshee.Gui
                 }
 
                 pane = value;
-                pane.Position = ConfigurationClient.Instance.Get<int> (@namespace, key, fallback);
+                pane.Position = entry.Get ();
                 //pane.MoveHandle += OnPaneMoved;
                 //pane.AcceptPosition += delegate { Console.WriteLine ("accept pos called, pos = {0}", pane.Position); };
                 pane.SizeAllocated += OnPaneMoved;
@@ -114,7 +101,7 @@ namespace Banshee.Gui
                 return true;
             } else {
                 if (pane.Position != last_position) {
-                    ConfigurationClient.Instance.Set<int> (@namespace, key, pane.Position);
+                    entry.Set (pane.Position);
                     last_position = pane.Position;
                 }
                 timer_id = 0;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
index 5b2551d..9c45342 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
@@ -63,6 +63,9 @@ namespace Banshee.Sources.Gui
         protected static readonly int DEFAULT_PANE_TOP_POSITION = 375;
         protected static readonly int DEFAULT_PANE_LEFT_POSITION = 275;
 
+        private static readonly int DEFAULT_INNER_PANE_TOP_POSITION = 180;
+        private static readonly int DEFAULT_INNER_PANE_LEFT_POSITION = 350;
+
         private Dictionary<object, double> model_positions = new Dictionary<object, double> ();
 
         private Paned container;
@@ -89,6 +92,20 @@ namespace Banshee.Sources.Gui
             </ui>
         ";
 
+        public static readonly DynamicSchemaEntry<int> InnerPaneTopPosition = new DynamicSchemaEntry<int> (
+            String.Format ("{0}.filtered_list_source_contents.innerpane.position", PersistentPaneController.NamespacePrefix),
+            "top", DEFAULT_INNER_PANE_TOP_POSITION,
+            "Position for inner pane inside browser container at the top",
+            "Position for inner pane inside browser container (albumartist, podcast, iradio...) to determine its height"
+        );
+
+        public static readonly DynamicSchemaEntry<int> InnerPaneLeftPosition = new DynamicSchemaEntry<int> (
+            String.Format ("{0}.filtered_list_source_contents.innerpane.position", PersistentPaneController.NamespacePrefix),
+            "left", DEFAULT_INNER_PANE_LEFT_POSITION,
+            "Position for inner pane inside browser container on the left",
+            "Position for inner pane inside browser container (albumartist, podcast, iradio...) to determine its width"
+        );
+
         public FilteredListSourceContents (string name,
                                            SchemaEntry<int> pane_top_position,
                                            SchemaEntry<int> pane_left_position)
@@ -227,8 +244,8 @@ namespace Banshee.Sources.Gui
         {
             //Hyena.Log.Information ("ListBrowser LayoutLeft");
             Reset ();
-
             SchemaEntry<int> current_entry = top ? pane_top_position : pane_left_position;
+            DynamicSchemaEntry<int> current_inner_pane_dentry = top ? InnerPaneTopPosition : InnerPaneLeftPosition;
 
             container = GetPane (!top);
             Paned filter_box = GetPane (top);
@@ -236,20 +253,22 @@ namespace Banshee.Sources.Gui
             Paned current_pane = filter_box;
 
             for (int i = 0; i < filter_scrolled_windows.Count; i++) {
+                var current_inner_pane_entry = current_inner_pane_dentry.ToSchemaEntry (current_entry.Namespace + "." + i.ToString ());
+
                 ScrolledWindow window = filter_scrolled_windows[i];
                 bool last_even_filter = (i == filter_scrolled_windows.Count - 1 && filter_scrolled_windows.Count % 2 == 0);
                 if (i > 0 && !last_even_filter) {
                     Paned new_pane = GetPane (top);
                     current_pane.Pack2 (new_pane, true, false);
-                    current_pane.Position = top ? 180 : 350;
-                    PersistentPaneController.Control (current_pane, ControllerName (top, i));
+                    current_pane.Position = current_inner_pane_entry.DefaultValue;
+                    PersistentPaneController.Control (current_pane, current_inner_pane_entry);
                     current_pane = new_pane;
                 }
 
                 if (last_even_filter) {
                     current_pane.Pack2 (window, true, false);
-                    current_pane.Position = top ? 180 : 350;
-                    PersistentPaneController.Control (current_pane, ControllerName (top, i));
+                    current_pane.Position = current_inner_pane_entry.DefaultValue;
+                    PersistentPaneController.Control (current_pane, current_inner_pane_entry);
                 } else {
                     current_pane.Pack1 (window, false, false);
                 }
@@ -269,15 +288,6 @@ namespace Banshee.Sources.Gui
             ShowPack ();
         }
 
-        private string ControllerName (bool top, int filter)
-        {
-            if (filter < 0) {
-                throw new ArgumentException ("filter should be positive", "filter");
-            }
-
-            return String.Format ("{0}.browser.{1}.{2}", name, top ? "top" : "left", filter);
-        }
-
         private Paned GetPane (bool hpane)
         {
             if (hpane)
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GSettingsConfigurationClient.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GSettingsConfigurationClient.cs
new file mode 100644
index 0000000..c33e2e1
--- /dev/null
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GSettingsConfigurationClient.cs
@@ -0,0 +1,87 @@
+//
+// GSettingsConfigurationClient.cs
+//
+// Author:
+//   Andres G. Aragoneses <knocte@gmail.com>
+//
+// Copyright 2012 Andres G. Aragoneses
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Banshee.Configuration;
+
+namespace Banshee.GnomeBackend
+{
+    public class GSettingsConfigurationClient : IConfigurationClient
+    {
+        private static string base_schema = "org.gnome.banshee.";
+
+        public bool TryGet<T> (string @namespace, string key, out T result)
+        {
+            return TryGet<T> (@namespace, null, key, out result);
+        }
+
+        public bool TryGet<T> (string @namespace, string path, string key, out T result)
+        {
+            GLib.Settings settings;
+            if (String.IsNullOrEmpty (path)) {
+                settings = new GLib.Settings (base_schema + @namespace);
+            } else {
+                settings = new GLib.Settings (base_schema + @namespace, (@namespace + "." + path).Replace (".", "/"));
+            }
+
+            result = (T)Get (typeof (T), settings,
+
+                             // gsettings doesn't allow underscores in the keys
+                             key.Replace ("_", "-"));
+            return true;
+        }
+
+        private object Get (Type type, GLib.Settings settings, string key)
+        {
+            if (type == typeof (bool)) {
+                return settings.GetBoolean (key);
+            }
+            if (type == typeof (string)) {
+                return settings.GetString (key);
+            }
+            if (type == typeof (int)) {
+                return settings.GetInt (key);
+            }
+            if (type == typeof (string[])) {
+                string[] result = settings.GetStrv (key);
+            }
+            throw new NotImplementedException (String.Format ("Type {0} not supported in {1}",
+                                                              type.FullName, 
+                                                              this.GetType ().Name));
+        }
+
+        public void Set<T> (string @namespace, string key, T value)
+        {
+            //throw new NotImplementedException ("SET not yet! for " + @namespace + "=>" + key);
+        }
+
+        public void Set<T> (string @namespace, string path, string key, T value)
+        {
+            //throw new NotImplementedException ("SET not yet! for " + @namespace + "=>" + key);
+        }
+    }
+}
+
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/DynamicSchemaEntry.cs b/src/Core/Banshee.Core/Banshee.Configuration/DynamicSchemaEntry.cs
new file mode 100644
index 0000000..e1731d1
--- /dev/null
+++ b/src/Core/Banshee.Core/Banshee.Configuration/DynamicSchemaEntry.cs
@@ -0,0 +1,65 @@
+//
+// DynamicSchemaEntry.cs
+//
+// Author:
+//   Andres G. Aragoneses <knocte@gmail.com>
+//
+// Copyright 2013 Andres G. Aragoneses
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+
+namespace Banshee.Configuration
+{
+    public class DynamicSchemaEntry<T>
+    {
+        public readonly string Namespace;
+        public readonly string RelocatedNamespace;
+        public readonly string Key;
+        public readonly T DefaultValue;
+        public readonly string ShortDescription;
+        public readonly string LongDescription;
+
+        Dictionary<string, SchemaEntry<T>> relocated_entries = new Dictionary<string, SchemaEntry<T>> ();
+
+        public DynamicSchemaEntry (string @namespace, string key, T defaultValue,
+                                   string shortDescription, string longDescription)
+        {
+            Namespace = @namespace;
+            Key = key;
+            DefaultValue = defaultValue;
+            ShortDescription = shortDescription;
+            LongDescription = longDescription;
+        }
+
+        public SchemaEntry<T> ToSchemaEntry (string relocatedNamespace)
+        {
+            SchemaEntry<T> schemaEntry;
+            if (!relocated_entries.TryGetValue (relocatedNamespace, out schemaEntry)) {
+                schemaEntry = new SchemaEntry<T> (Namespace, relocatedNamespace,
+                                                  Key, DefaultValue,
+                                                  ShortDescription, LongDescription);
+                relocated_entries [relocatedNamespace] = schemaEntry;
+            }
+            return schemaEntry;
+        }
+    }
+}
+
