diff --git a/plat/associate.py b/plat/associate.py
index 0f3cd31..f9b5a76 100644
--- a/plat/associate.py
+++ b/plat/associate.py
@@ -31,69 +31,8 @@
 Holds functions that associate Miro with certain protocols
 """
 
-import gconf
-from miro.plat.config import gconf_lock
-
 def associate_protocols(command):
-    _associate_protocol("magnet", command, False)
+    pass
 
 def disassociate_protocols(command):
-    _disassociate_protocol("magnet", command)
-
-def _associate_protocol(name, command, overwrite_existing=False):
-    url_handlers_key = "/desktop/gnome/url-handlers/" + name + "/"
-    if not _is_associated(name) or overwrite_existing:
-        gconf_lock.acquire()
-        try:
-            gconf_client = gconf.client_get_default()
-            if gconf_client.set_string(url_handlers_key + "command", command):
-                gconf_client.set_bool(url_handlers_key + "needs_terminal", False)
-                gconf_client.set_bool(url_handlers_key + "enabled", True)
-                success = True
-            else:
-                success = False
-        finally:
-            gconf_lock.release()
-    else:
-        success = True
-    return success
-
-def _disassociate_protocol(name, command):
-    url_handlers_key = "/desktop/gnome/url-handlers/" + name + "/"
-    if _is_associated(name, command):
-        gconf_lock.acquire()
-        try:
-            gconf_client = gconf.client_get_default()
-            if gconf_client.set_bool(url_handlers_key + "enabled", False):
-                success = True
-            else:
-                success = False
-        finally:
-            gconf_lock.release()
-    else:
-        success = True
-    return success
-
-def _is_associated(protocol, command=None):
-    """ Checks whether a protocol currently is
-        associated with the given command, or,
-        if none is given, whether the protocol
-        is associated with anything at all.
-    """
-    url_handlers_key = "/desktop/gnome/url-handlers/" + protocol + "/"
-    gconf_lock.acquire()
-    try:
-        gconf_client = gconf.client_get_default()
-        key = gconf_client.get(url_handlers_key + "command")
-        if key is None:
-            associated = False
-        else:
-            enabled = gconf_client.get(url_handlers_key + "enabled")
-            if command:
-                associated = key.get_string() == command and enabled.get_bool()
-            else:
-                associated = key.get_string() != "" and enabled.get_bool()
-    finally:
-        gconf_lock.release()
-    return associated
-
+    pass
diff --git a/plat/config.py b/plat/config.py
index 40895af..24f8815 100644
--- a/plat/config.py
+++ b/plat/config.py
@@ -39,51 +39,20 @@ Preferences are listed in miro.pref and also miro.plat.options.
 import os
 import logging
 from miro import prefs
-import gconf
+import shelve
 import threading
 from miro.plat import options
 from miro.plat import resources
 
-client = gconf.client_get_default()
-gconf_lock = threading.RLock()
-
-
-def gconf_key(key):
-    if options.gconf_name is None:
-        options.gconf_name = "miro"
-    return '/apps/%s/%s' % (options.gconf_name, key)
-
-
-def _convert_gconf_value(value):
-    if value.type == gconf.VALUE_STRING:
-        return value.get_string()
-    if value.type == gconf.VALUE_INT:
-        return value.get_int()
-    if value.type == gconf.VALUE_BOOL:
-        return value.get_bool()
-    if value.type == gconf.VALUE_FLOAT:
-        return value.get_float()
-    if value.type == gconf.VALUE_LIST:
-        return [_convert_gconf_value(v) for v in value.get_list()]
-    raise TypeError("unknown gconf type %s" % value.type)
-
-
-def _get_gconf(fullkey, default=None):
-    gconf_lock.acquire()
-    try:
-        value = client.get(fullkey)
-        if value != None:
-            try:
-                return _convert_gconf_value(value)
-            except TypeError, e:
-                logging.warn("type error while getting gconf value %s: %s",
-                        fullkey, str(e))
-        return default
-    finally:
-        gconf_lock.release()
-
-
-class GconfDict:
+
+class ConfigFile(object):
+    def __init__(self):
+        support_dir = get(prefs.SUPPORT_DIRECTORY)
+        if not os.path.exists(support_dir):
+            os.makedirs(support_dir)
+        path = os.path.join(support_dir, 'config')
+        self.conf = shelve.open(path, 'c', -1, True)
+
     def get(self, key, default=None):
         if not isinstance(key, str):
             raise TypeError()
@@ -91,19 +56,16 @@ class GconfDict:
         if "MIRO_%s" % key.upper() in os.environ:
             return os.environ["MIRO_%s" % key.upper()]
 
-        fullkey = gconf_key(key)
-        return _get_gconf(fullkey, default)
+        return self.conf.get(key, default)
+
+    def __del__(self):
+        self.conf.close()
 
     def __contains__(self, key):
         if "MIRO_%s" % key.upper() in os.environ:
             return True
 
-        gconf_lock.acquire()
-        try:
-            fullkey = gconf_key(key)
-            return client.get(fullkey) is not None
-        finally:
-            gconf_lock.release()
+        return key in self.conf
 
     def __getitem__(self, key):
         rv = self.get(key)
@@ -116,43 +78,11 @@ class GconfDict:
         if "MIRO_%s" % key.upper() in os.environ:
             return
 
-        gconf_lock.acquire()
-        try:
-            if not isinstance(key, str):
-                raise TypeError()
-
-            fullkey = gconf_key(key)
-            if isinstance(value, str):
-                client.set_string(fullkey, value)
-            elif isinstance(value, bool):
-                client.set_bool(fullkey, value)
-            elif isinstance(value, int):
-                client.set_int(fullkey, value)
-            elif isinstance(value, float):
-                client.set_float(fullkey, value)
-            elif isinstance(value, list):
-                # this is lame, but there isn't enough information to
-                # figure it out another way
-                if len(value) == 0 or isinstance(value[0], str):
-                    list_type = gconf.VALUE_STRING
-                elif isinstance(value[0], int):
-                    list_type = gconf.VALUE_INT
-                elif isinstance(value[0], float):
-                    list_type = gconf.VALUE_FLOAT
-                elif isinstance(value[0], bool):
-                    list_type = gconf.VALUE_BOOL
-                else:
-                    raise TypeError("unknown gconf type %s" % type(value[0]))
-
-                client.set_list(fullkey, list_type, value)
-            else:
-                raise TypeError()
-        finally:
-            gconf_lock.release()
+        self.conf[key] = value
 
 
 def load():
-    return GconfDict()
+    return ConfigFile()
 
 
 def save(data):
@@ -208,25 +138,4 @@ def get(descriptor):
         value = get(prefs.SUPPORT_DIRECTORY)
         value = os.path.join(value, 'miro-helper.log')
 
-    elif descriptor == prefs.HTTP_PROXY_ACTIVE:
-        return _get_gconf("/system/http_proxy/use_http_proxy")
-
-    elif descriptor == prefs.HTTP_PROXY_HOST:
-        return _get_gconf("/system/http_proxy/host")
-
-    elif descriptor == prefs.HTTP_PROXY_PORT:
-        return _get_gconf("/system/http_proxy/port")
-
-    elif descriptor == prefs.HTTP_PROXY_AUTHORIZATION_ACTIVE:
-        return _get_gconf("/system/http_proxy/use_authentication")
-
-    elif descriptor == prefs.HTTP_PROXY_AUTHORIZATION_USERNAME:
-        return _get_gconf("/system/http_proxy/authentication_user")
-
-    elif descriptor == prefs.HTTP_PROXY_AUTHORIZATION_PASSWORD:
-        return _get_gconf("/system/http_proxy/authentication_password")
-
-    elif descriptor == prefs.HTTP_PROXY_IGNORE_HOSTS:
-        return _get_gconf("/system/http_proxy/ignore_hosts", [])
-
     return value
diff --git a/plat/frontends/widgets/application.py b/plat/frontends/widgets/application.py
index a1eaaf3..20f4c23 100644
--- a/plat/frontends/widgets/application.py
+++ b/plat/frontends/widgets/application.py
@@ -35,7 +35,6 @@ except RuntimeError:
     sys.exit(1)
 import gobject
 import os
-import gconf
 import shutil
 import platform
 
@@ -53,7 +52,6 @@ from miro import prefs
 from miro.frontends.widgets.application import Application
 # from miro.plat.frontends.widgets import threads
 from miro.plat import renderers, options
-from miro.plat.config import gconf_lock, gconf_key
 try:
     from miro.plat.frontends.widgets import miroappindicator
     APP_INDICATOR_SUPPORT = True
@@ -77,29 +75,13 @@ import sys
 
 
 def _get_pref(key, getter_name):
-    gconf_lock.acquire()
-    try:
-        client = gconf.client_get_default()
-        fullkey = gconf_key(key)
-        value = client.get(fullkey)
-        if value is not None:
-            getter = getattr(value, getter_name)
-            return getter()
-        else:
-            return None
-    finally:
-        gconf_lock.release()
+    # XXX: ugly!
+    return app.config._data.get(key)
 
 
 def _set_pref(key, setter_name, value):
-    gconf_lock.acquire()
-    try:
-        client = gconf.client_get_default()
-        fullkey = gconf_key(key)
-        setter = getattr(client, setter_name)
-        setter(fullkey, value)
-    finally:
-        gconf_lock.release()
+    # XXX: ugly!
+    app.config._data[key] = value
 
 
 def get_int(key):
diff --git a/plat/options.py b/plat/options.py
index 4ea1a67..8e75e20 100644
--- a/plat/options.py
+++ b/plat/options.py
@@ -69,14 +69,14 @@ USE_RENDERER = LinuxPref(
 
 GSTREAMER_IMAGESINK = LinuxPref(
     key="DefaultGstreamerImagesink",
-    default="gconfvideosink",
+    default="autovideosink",
     alias="gstreamer-imagesink",
     helptext=("Which GStreamer image sink to use for video.  "
               "(autovideosink, ximagesink, xvimagesink, gconfvideosink, ...)"))
 
 GSTREAMER_AUDIOSINK = LinuxPref(
     key="DefaultGstreamerAudiosink",
-    default="gconfaudiosink",
+    default="autoaudiosink",
     alias="gstreamer-audiosink",
     helptext=("Which GStreamer sink to use for audio.  "
               "(autoaudiosink, osssink, alsasink, gconfaudiosink, ...)"))
diff --git a/plat/upgrade.py b/plat/upgrade.py
index 9677e3a..f812ad4 100644
--- a/plat/upgrade.py
+++ b/plat/upgrade.py
@@ -30,7 +30,6 @@
 import os
 import shutil
 from miro.plat import resources
-import gconf
 
 
 def upgrade():
@@ -64,47 +63,3 @@ def upgrade():
             os.remove(old_file)
         except OSError:
             pass
-
-    # gconf settings
-    client = gconf.client_get_default()
-
-    def _copy_gconf(src, dst):
-        for entry in client.all_entries(src):
-            entry_dst = dst + '/' + entry.key.split('/')[-1]
-            client.set(entry_dst, entry.value)
-        for subdir in client.all_dirs(src):
-            subdir_dst = dst + '/' + subdir.split('/')[-1]
-            _copy_gconf(subdir, subdir_dst)
-
-    if ((client.dir_exists("/apps/democracy/player")
-         and not client.dir_exists("/apps/miro"))):
-        _copy_gconf("/apps/democracy/player", "/apps/miro")
-        client.recursive_unset("/apps/democracy", 1)
-
-    # Set the MoviesDirectory and NonVideoDirectory based on the
-    # possibilities that we've had over the years and what exists on
-    # the user's system.  This codifies it in the user's gconf so that
-    # when we change it in future, then the user isn't affected.
-    from miro.plat import options
-    if options.gconf_name is None:
-        options.gconf_name = "miro"
-    key = "/apps/%s/MoviesDirectory" % options.gconf_name
-    if client.get(key) is None:
-        for mem in ["~/.miro/Movies",     # packages
-                    "~/Videos/Miro",
-                    "~/Movies/Miro",      # pre 3.5
-                    "~/Movies/Democracy"  # democracy player
-                    ]:
-            mem = os.path.expanduser(mem)
-            if os.path.exists(mem):
-                client.set_string(key, mem)
-                break
-
-    key = "/apps/%s/NonVideoDirectory" % options.gconf_name
-    if client.get(key) is None:
-        for mem in ["~/.miro/Nonvideo"   # packages
-                    ]:
-            mem = os.path.expanduser(mem)
-            if os.path.exists(mem):
-                client.set_string(key, mem)
-                break