diff --git a/Gtk2HsSetup.hs b/Gtk2HsSetup.hs
--- a/Gtk2HsSetup.hs
+++ b/Gtk2HsSetup.hs
@@ -6,9 +6,9 @@
 
 -- | Build a Gtk2hs package.
 --
-module Gtk2HsSetup ( 
-  gtk2hsUserHooks, 
-  getPkgConfigPackages, 
+module Gtk2HsSetup (
+  gtk2hsUserHooks,
+  getPkgConfigPackages,
   checkGtk2hsBuildtools,
   typeGenProgram,
   signalGenProgram,
@@ -55,8 +55,9 @@
 import Distribution.Version (Version(..))
 import Distribution.Verbosity
 import Control.Monad (when, unless, filterM, liftM, forM, forM_)
-import Data.Maybe ( isJust, isNothing, fromMaybe, maybeToList )
-import Data.List (isPrefixOf, isSuffixOf, stripPrefix, nub)
+import Data.Maybe ( isJust, isNothing, fromMaybe, maybeToList, catMaybes )
+import Data.List (isPrefixOf, isSuffixOf, nub, minimumBy, stripPrefix, tails )
+import Data.Ord as Ord (comparing)
 import Data.Char (isAlpha, isNumber)
 import qualified Data.Map as M
 import qualified Data.Set as S
@@ -113,9 +114,16 @@
 fixLibs :: [FilePath] -> [String] -> [String]
 fixLibs dlls = concatMap $ \ lib ->
     case filter (isLib lib) dlls of
-                dll:_ -> [dropExtension dll]
-                _     -> if lib == "z" then [] else [lib]
+                dlls@(_:_) -> [dropExtension (pickDll dlls)]
+                _          -> if lib == "z" then [] else [lib]
   where
+    -- If there are several .dll files matching the one we're after then we
+    -- just have to guess. For example for recent Windows cairo builds we get
+    -- libcairo-2.dll libcairo-gobject-2.dll libcairo-script-interpreter-2.dll
+    -- Our heuristic is to pick the one with the shortest name.
+    -- Yes this is a hack but the proper solution is hard: we would need to
+    -- parse the .a file and see which .dll file(s) it needed to link to.
+    pickDll = minimumBy (Ord.comparing length)
     isLib lib dll =
         case stripPrefix ("lib"++lib) dll of
             Just ('.':_)                -> True
@@ -154,9 +162,9 @@
 register :: PackageDescription -> LocalBuildInfo
          -> RegisterFlags -- ^Install in the user's database?; verbose
          -> IO ()
-register pkg@(library       -> Just lib )
-         lbi@(libraryConfig -> Just clbi) regFlags
+register pkg@PackageDescription { library       = Just lib  } lbi regFlags
   = do
+    let clbi = LBI.getComponentLocalBuildInfo lbi LBI.CLibName
 
     installedPkgInfoRaw <- generateRegistrationInfo
                            verbosity pkg lib lbi clbi inplace distPref
@@ -168,7 +176,7 @@
 
      -- Three different modes:
     case () of
-     _ | modeGenerateRegFile   -> die "Generate Reg File not supported"
+     _ | modeGenerateRegFile   -> writeRegistrationFile installedPkgInfo
        | modeGenerateRegScript -> die "Generate Reg Script not supported"
        | otherwise             -> registerPackage verbosity
                                     installedPkgInfo pkg lbi inplace
@@ -180,6 +188,8 @@
 
   where
     modeGenerateRegFile = isJust (flagToMaybe (regGenPkgConf regFlags))
+    regFile             = fromMaybe (display (packageId pkg) <.> "conf")
+                                    (fromFlag (regGenPkgConf regFlags))
     modeGenerateRegScript = fromFlag (regGenScript regFlags)
     inplace   = fromFlag (regInPlace regFlags)
     packageDbs = nub $ withPackageDB lbi
@@ -188,6 +198,10 @@
     distPref  = fromFlag (regDistPref regFlags)
     verbosity = fromFlag (regVerbosity regFlags)
 
+    writeRegistrationFile installedPkgInfo = do
+      notice verbosity ("Creating package registration file: " ++ regFile)
+      writeUTF8File regFile (showInstalledPackageInfo installedPkgInfo)
+
 register _ _ regFlags = notice verbosity "No package to register"
   where
     verbosity = fromFlag (regVerbosity regFlags)
@@ -247,11 +261,24 @@
     = nub $
       ["-I" ++ dir | dir <- PD.includeDirs bi]
    ++ [opt | opt@('-':c:_) <- PD.cppOptions bi ++ PD.ccOptions bi, c `elem` "DIU"]
-   ++ ["-D__GLASGOW_HASKELL__="++show (ghcDefine . versionBranch . compilerVersion $ LBI.compiler lbi)]
+   ++ ["-D__GLASGOW_HASKELL__="++show (ghcDefine . ghcVersion . compilerId $ LBI.compiler lbi)]
  where
   ghcDefine (v1:v2:_) = v1 * 100 + v2
   ghcDefine _ = __GLASGOW_HASKELL__
 
+  ghcVersion :: CompilerId -> [Int]
+-- This version is nicer, but we need to know the Cabal version that includes the new CompilerId
+-- #if CABAL_VERSION_CHECK(1,19,2)
+--   ghcVersion (CompilerId GHC v _) = versionBranch v
+--   ghcVersion (CompilerId _ _ (Just c)) = ghcVersion c
+-- #else
+--   ghcVersion (CompilerId GHC v) = versionBranch v
+-- #endif
+--   ghcVersion _ = []
+-- This version should work fine for now
+  ghcVersion = concat . take 1 . map (read . (++"]") . takeWhile (/=']')) . catMaybes
+               . map (stripPrefix "CompilerId GHC (Version {versionBranch = ") . tails . show
+
 installCHI :: PackageDescription -- ^information from the .cabal file
         -> LocalBuildInfo -- ^information from the configure step
         -> Verbosity -> CopyDest -- ^flags sent to copy or install
@@ -262,11 +289,11 @@
   -- a modules that does not have a .chi file
   mFiles <- mapM (findFileWithExtension' ["chi"] [buildDir lbi] . toFilePath)
                    (PD.libModules lib)
-                 
+
   let files = [ f | Just f <- mFiles ]
   installOrdinaryFiles verbosity libPref files
 
-  
+
 installCHI _ _ _ _ = return ()
 
 ------------------------------------------------------------------------------
@@ -292,13 +319,12 @@
 
 genSynthezisedFiles :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
 genSynthezisedFiles verb pd lbi = do
-
   cPkgs <- getPkgConfigPackages verb lbi pd
 
   let xList = maybe [] (customFieldsBI . libBuildInfo) (library pd)
               ++customFieldsPD pd
       typeOpts :: String -> [ProgArg]
-      typeOpts tag = concat [ map (\val -> '-':'-':drop (length tag) field++'=':val) (words content)
+      typeOpts tag = concat [ map (\val -> '-':'-':drop (length tag) field ++ '=':val) (words content)
                             | (field,content) <- xList,
                               tag `isPrefixOf` field,
                               field /= (tag++"file")]
@@ -306,8 +332,9 @@
                  | PackageIdentifier name (Version (major:minor:_) _) <- cPkgs
                  , let name' = filter isAlpha (display name)
                  , tag <- name'
-                        : [ name' ++ "-" ++ show major ++ "." ++ show digit
-                          | digit <- [0,2..minor] ]
+                        :[ name' ++ "-" ++ show maj ++ "." ++ show d2
+                          | (maj, d2) <- [(maj,   d2) | maj <- [0..(major-1)], d2 <- [0,2..20]]
+                                      ++ [(major, d2) | d2 <- [0,2..minor]] ]
                  ]
 
       signalsOpts :: [ProgArg]
@@ -426,14 +453,14 @@
 
 -- Extract the dependencies of this file. This is intentionally rather naive as it
 -- ignores CPP conditionals. We just require everything which means that the
--- existance of a .chs module may not depend on some CPP condition.  
+-- existance of a .chs module may not depend on some CPP condition.
 extractDeps :: ModDep -> IO ModDep
 extractDeps md@ModDep { mdLocation = Nothing } = return md
 extractDeps md@ModDep { mdLocation = Just f } = withUTF8FileContents f $ \con -> do
   let findImports acc (('{':'#':xs):xxs) = case (dropWhile (' ' ==) xs) of
         ('i':'m':'p':'o':'r':'t':' ':ys) ->
           case simpleParse (takeWhile ('#' /=) ys) of
-            Just m -> findImports (m:acc) xxs 
+            Just m -> findImports (m:acc) xxs
             Nothing -> die ("cannot parse chs import in "++f++":\n"++
                             "offending line is {#"++xs)
          -- no more imports after the first non-import hook
@@ -467,8 +494,8 @@
                          return (programName prog, location)
                       ) programs
   let printError name = do
-        putStrLn $ "Cannot find " ++ name ++ "\n" 
+        putStrLn $ "Cannot find " ++ name ++ "\n"
                  ++ "Please install `gtk2hs-buildtools` first and check that the install directory is in your PATH (e.g. HOME/.cabal/bin)."
         exitFailure
   forM_ programInfos $ \ (name, location) ->
-    when (isNothing location) (printError name) 
+    when (isNothing location) (printError name)
diff --git a/SetupWrapper.hs b/SetupWrapper.hs
--- a/SetupWrapper.hs
+++ b/SetupWrapper.hs
@@ -9,7 +9,7 @@
 import Distribution.Simple.Program
 import Distribution.Simple.Compiler
 import Distribution.Simple.BuildPaths (exeExtension)
-import Distribution.Simple.Configure (configCompiler)
+import Distribution.Simple.Configure (configCompilerEx)
 import Distribution.Simple.GHC (getInstalledPackages)
 import qualified Distribution.Simple.PackageIndex as PackageIndex
 import Distribution.Version
@@ -115,7 +115,7 @@
       when outOfDate $ do
         debug verbosity "Setup script is out of date, compiling..."
 
-        (comp, conf)    <- configCompiler (Just GHC) Nothing Nothing
+        (comp, _, conf) <- configCompilerEx (Just GHC) Nothing Nothing
                              defaultProgramConfiguration verbosity
         cabalLibVersion <- cabalLibVersionToUse comp conf
         let cabalPkgid = PackageIdentifier (PackageName "Cabal") cabalLibVersion
diff --git a/System/Gnome/GConf/GConfClient.chs b/System/Gnome/GConf/GConfClient.chs
--- a/System/Gnome/GConf/GConfClient.chs
+++ b/System/Gnome/GConf/GConfClient.chs
@@ -42,13 +42,13 @@
   -- * Creation operation
   --
   gconfGetDefault,
-  
+
   -- * Registering for change notifications
   --
   gconfAddDir, gconfRemoveDir,
   gconfNotifyAdd, gconfNotifyRemove,
   onValueChanged, afterValueChanged,
-  
+
   -- * Getting and setting configuration values
   --
   gconfGet, gconfSet,
@@ -80,11 +80,12 @@
   GConfPrimitiveValueClass,
   GConfValue,
   GConfValueDyn(..),
-  
+
 ) where
 
 import Control.Monad	(liftM, when)
 import Data.IORef (newIORef, readIORef, writeIORef)
+import Data.Text (Text)
 import System.IO.Unsafe (unsafePerformIO)
 
 import System.Glib.FFI
@@ -149,12 +150,12 @@
 -- As a rule of thumb, if you plan to get the value of almost all the keys in a
 -- directory, preloading that directory will probably enhance performance. If
 -- you plan to use only half the keys, preloading is likely a bad idea.
--- 
+--
 -- * PreloadNone specifies that no preload occurs
 -- * PreloadOnelevel loads the immediate children of the directory
 -- * PreloadRecursive loads all children of the directory and its
 --   subdirectories, recursively.
--- 
+--
 gconfAddDirWithPreload :: GConf -> String -> GConfPreloadType -> IO ()
 gconfAddDirWithPreload gc key preload =
   propagateGError $ \gerrorPtr ->
@@ -172,7 +173,7 @@
 gconfRemoveDir :: GConf -> String -> IO ()
 gconfRemoveDir gc key =
   propagateGError $ \gerrorPtr ->
-  withCString key $ \strPtr ->    
+  withCString key $ \strPtr ->
     {# call gconf_client_remove_dir #} gc strPtr gerrorPtr
 
 
@@ -189,7 +190,7 @@
 foreign import ccall "wrapper" mkHandler_GConfClientNotifyFunc ::
   GConfClientNotifyFunc -> IO (FunPtr GConfClientNotifyFunc)
 
-connect_GConfClientNotifyFunc :: 
+connect_GConfClientNotifyFunc ::
   GConf ->
   String ->
   (GConfEntry -> IO ()) ->
@@ -211,15 +212,15 @@
 
 newtype GConfConnectId = GConfConnectId {#type guint#}
 
-gconfNotifyAdd :: GConfValueClass value =>
+gconfNotifyAdd :: (GConfValueClass value, GlibString string) =>
                         GConf ->
                         String ->
-                        (String -> value -> IO ()) ->
+                        (string -> value -> IO ()) ->
 				                IO GConfConnectId
 gconfNotifyAdd gc key handler =
   connect_GConfClientNotifyFunc gc key (convertValueChangedHandler handler)
-  where convertValueChangedHandler :: GConfValueClass value =>
-                                      (String -> value -> IO ()) ->
+  where convertValueChangedHandler :: (GConfValueClass value, GlibString string) =>
+                                      (string -> value -> IO ()) ->
                                       (GConfEntry -> IO ())
         convertValueChangedHandler handler entry = do
           keyStrPtr <- {# call unsafe gconf_entry_get_key #} entry
@@ -237,39 +238,42 @@
 
 -- | Gets the value of a configuration key.
 --
-gconfGet :: GConfValueClass value => GConf
-         -> String   -- ^ Name of the key
+gconfGet :: (GConfValueClass value, GlibString string) => GConf
+         -> string   -- ^ Name of the key
 	 -> IO value
 gconfGet gc key = do
   value <- propagateGError $ \gerrorPtr ->
-           withCString key $ \strPtr ->
+           withUTFString key $ \strPtr ->
            {# call gconf_client_get #} gc strPtr gerrorPtr
   marshalFromGConfValue (GConfValue value)
-  
-gconfGetInt :: GConf -> String -> IO Int
+
+gconfGetInt :: GlibString string => GConf -> string -> IO Int
 gconfGetInt = gconfGet
 
-gconfGetBool :: GConf -> String -> IO Bool
+gconfGetBool :: GlibString string => GConf -> string -> IO Bool
 gconfGetBool = gconfGet
 
-gconfGetFloat :: GConf -> String -> IO Double
+gconfGetFloat :: GlibString string => GConf -> string -> IO Double
 gconfGetFloat = gconfGet
 
-gconfGetString :: GConf -> String -> IO String
-gconfGetString = gconfGet
+-- gconfGetString :: GlibString string => GConf -> string -> IO String
+-- gconfGetString = gconfGet
 
-gconfGetPair :: GConfValueClass (a,b) =>
-                GConf -> String -> IO (a, b)
+gconfGetText :: GlibString string => GConf -> string -> IO Text
+gconfGetText = gconfGet
+
+gconfGetPair :: (GConfValueClass (a,b), GlibString string) =>
+                GConf -> string -> IO (a, b)
 gconfGetPair = gconfGet
 
-gconfGetList :: GConfValueClass [a] =>
-                GConf -> String -> IO [a]
+gconfGetList :: (GConfValueClass [a], GlibString string) =>
+                GConf -> string -> IO [a]
 gconfGetList = gconfGet
 
 -- | Sets the value of a configuration key.
 --
-gconfSet :: GConfValueClass value => GConf
-         -> String  -- ^ Name of the key
+gconfSet :: (GConfValueClass value, GlibString string) => GConf
+         -> string  -- ^ Name of the key
 	 -> value   -- ^ New value
 	 -> IO ()
 gconfSet gc key val = do
@@ -277,27 +281,30 @@
   if ptr == nullPtr
     then gconfUnset gc key
     else propagateGError $ \gerrorPtr ->
-         withCString key $ \strPtr ->
+         withUTFString key $ \strPtr ->
          {# call gconf_client_set #} gc strPtr value gerrorPtr
 
-gconfSetInt :: GConf -> String -> Int -> IO ()
+gconfSetInt :: GlibString string => GConf -> string -> Int -> IO ()
 gconfSetInt = gconfSet
 
-gconfSetBool :: GConf -> String -> Bool -> IO ()
+gconfSetBool :: GlibString string => GConf -> string -> Bool -> IO ()
 gconfSetBool = gconfSet
 
-gconfSetFloat :: GConf -> String -> Double -> IO ()
+gconfSetFloat :: GlibString string => GConf -> string -> Double -> IO ()
 gconfSetFloat = gconfSet
 
-gconfSetString :: GConf -> String -> String -> IO ()
-gconfSetString = gconfSet
+-- gconfSetString :: GlibString string => GConf -> string -> String -> IO ()
+-- gconfSetString = gconfSet
 
-gconfSetPair :: GConfValueClass (a,b) =>
-                GConf -> String -> (a, b) -> IO ()
+gconfSetText :: GlibString string => GConf -> string -> Text -> IO ()
+gconfSetText = gconfSet
+
+gconfSetPair :: (GConfValueClass (a,b), GlibString string) =>
+                GConf -> string -> (a, b) -> IO ()
 gconfSetPair = gconfSet
 
-gconfSetList :: GConfValueClass [a] =>
-                GConf -> String -> [a] -> IO ()
+gconfSetList :: (GConfValueClass [a], GlibString string) =>
+                GConf -> string -> [a] -> IO ()
 gconfSetList = gconfSet
 
 -- | Gets the value of a configuration key.
@@ -330,10 +337,10 @@
 -- of note is 'GconfErrorOverridden', indicating that the system administrator
 -- has \"forced\" a value for this key.
 --
-gconfUnset :: GConf -> String -> IO ()
+gconfUnset :: GlibString string => GConf -> string -> IO ()
 gconfUnset gc key =
   propagateGError $ \gerrorPtr ->
-  withCString key $ \strPtr -> do
+  withUTFString key $ \strPtr -> do
   {# call gconf_client_unset #} gc strPtr gerrorPtr
   return ()
 
@@ -357,7 +364,7 @@
 
 -- | Suggests to gconfd that you've just finished a block of changes, and it
 -- would be an optimal time to sync to permanent storage. This is only a
--- suggestion; and gconfd will eventually sync even if you don't call 
+-- suggestion; and gconfd will eventually sync even if you don't call
 -- 'gconfSuggestSync'. This function is just a "hint" provided to gconfd to
 -- maximize efficiency and minimize data loss.
 --
@@ -366,12 +373,12 @@
   propagateGError $ \gerrorPtr ->
   {# call gconf_client_suggest_sync #} gc gerrorPtr
 
--- |  
+-- |
 --
-gconfAllEntries :: GConf -> String -> IO [(String, GConfValueDyn)]
+gconfAllEntries :: GlibString string => GConf -> string -> IO [(string, GConfValueDyn)]
 gconfAllEntries gc dir = do
   gsList <- propagateGError $ \gerrorPtr ->
-            withCString dir $ \strPtr ->
+            withUTFString dir $ \strPtr ->
             {# call gconf_client_all_entries #} gc strPtr gerrorPtr
   entryList <- fromGSList gsList
   mapM (\entry -> do let entry' = GConfEntry entry
@@ -386,11 +393,11 @@
                      return (key,value))
        entryList
 
--- | 
+-- |
 --
-gconfAllDirs :: GConf -> String -> IO [String]
+gconfAllDirs :: GlibString string => GConf -> string -> IO [string]
 gconfAllDirs gc dir = do
-  gsList <- withCString dir $ \strPtr ->
+  gsList <- withUTFString dir $ \strPtr ->
     {# call gconf_client_all_dirs #} gc strPtr nullPtr
   dirList <- fromGSList gsList
   mapM (\strPtr -> do str <- peekUTFString strPtr
@@ -398,7 +405,7 @@
                       return str)
        dirList
 
--- | 
+-- |
 --
 gconfDirExists :: GConf -> String -> IO Bool
 gconfDirExists gc dir =
@@ -408,18 +415,18 @@
 
 -- Signals
 
-onValueChanged, afterValueChanged :: GConf ->
-                                     (String -> Maybe GConfValueDyn -> IO ()) ->
+onValueChanged, afterValueChanged :: GlibString string => GConf ->
+                                     (string -> Maybe GConfValueDyn -> IO ()) ->
 				                             IO (ConnectId GConf)
 onValueChanged gc handler =
-  connect_STRING_PTR__NONE "value_changed" False gc
+  connect_GLIBSTRING_PTR__NONE "value_changed" False gc
   (convertValueChangedHandler handler)
 afterValueChanged gc handler =
-  connect_STRING_PTR__NONE "value_changed" True gc
+  connect_GLIBSTRING_PTR__NONE "value_changed" True gc
   (convertValueChangedHandler handler)
 
-convertValueChangedHandler :: (String -> Maybe GConfValueDyn -> IO ()) ->
-                              (String -> Ptr GConfValue -> IO ())
+convertValueChangedHandler :: GlibString string => (string -> Maybe GConfValueDyn -> IO ()) ->
+                              (string -> Ptr GConfValue -> IO ())
 convertValueChangedHandler handler key ptr = do
   value <- marshalFromGConfValue (GConfValue $ castPtr ptr)
   handler key value
diff --git a/System/Gnome/GConf/GConfValue.chs b/System/Gnome/GConf/GConfValue.chs
--- a/System/Gnome/GConf/GConfValue.chs
+++ b/System/Gnome/GConf/GConfValue.chs
@@ -1,3 +1,4 @@
+{-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE CPP, TypeSynonymInstances, OverlappingInstances, ScopedTypeVariables, FlexibleInstances #-}
 -- String & [a] overlap
 -- -*-haskell-*-
@@ -19,13 +20,13 @@
 --  Library General Public License for more details.
 --
 --  |
---  
+--
 --  Module for dealing with the values stored in the GConf system.
 --
 --  GConfValue has its own primitive type system which is represented in
 --  Haskell using type classes. This allows values to be get and set without
 --  needing to perform any dynamic type casting or needing a union type.
---  
+--
 --  Alternatively, a dynamic\/union type is provided for the rare occasions
 --  when that degree of flexability is required. It should only be necessary
 --  if you need to deal with configuration values without statically knowing
@@ -42,6 +43,7 @@
 import Control.Monad (liftM, when)
 import Control.Exception (catch, IOException)
 import Prelude hiding (catch)
+import Data.Text (Text)
 
 import System.Glib.FFI
 import System.Glib.UTFString
@@ -58,7 +60,7 @@
 class GConfValueClass value where
   --unsafe because assumes non-null pointer and correct type
   unsafeMarshalFromGConfValue :: GConfValue -> IO value
-  
+
   -- safe checked version, may throw exception
   marshalFromGConfValue :: GConfValue -> IO value
   marshalFromGConfValue value = do
@@ -77,7 +79,7 @@
 -- function that is prepared to asume ownership of the value.
 
 -- | Dynamic version for when the type is not known statically.
-data GConfValueDyn = GConfValueString String
+data GConfValueDyn = GConfValueString Text
                    | GConfValueInt Int
                    | GConfValueFloat Double
                    | GConfValueBool Bool
@@ -105,7 +107,7 @@
 instance GConfPrimitiveValueClass Int
 instance GConfPrimitiveValueClass Bool
 instance GConfPrimitiveValueClass Double
-instance GConfPrimitiveValueClass String
+instance GConfPrimitiveValueClass Text
 
 instance GConfValueClass Int where
   typeofGConfValue _ = GconfValueInt
@@ -137,7 +139,7 @@
 -- Now unfortunately String & [a] overlap, although really they don't since Char
 -- is not an instance of GConfPrimitiveValueClass, however classes are open so
 -- we don't know that Char would never be an instance. I want closed classes!
-instance GConfValueClass String where
+instance GlibString string => GConfValueClass string where
   typeofGConfValue _ = GconfValueString
 
   unsafeMarshalFromGConfValue value = do
@@ -147,7 +149,7 @@
   marshalToGConfValue s = do
     value <- {# call unsafe gconf_value_new #}
       (fromIntegral $ fromEnum GconfValueString)
-    withCString s $ \strPtr ->
+    withUTFString s $ \strPtr ->
       {# call unsafe gconf_value_set_string #} (GConfValue value) strPtr
     return (GConfValue value)
 
@@ -198,7 +200,7 @@
     return (GConfValue value)
 
 ----------------
--- For convenience and best practice, an instance for Enum 
+-- For convenience and best practice, an instance for Enum
 -- This conforms to the GConf GTK+/Gnome convention for storing enum types,
 -- which is to store them as a string using ThisStlyeOfCapitalisation.
 
@@ -313,11 +315,11 @@
       GconfValueSchema -> return GConfValueSchema
       GconfValueList   -> liftM GConfValueList   $ unsafeMarshalGConfValueDynListFromGConfValue value
       GconfValuePair   -> liftM GConfValuePair   $ unsafeMarshalGConfValueDynPairFromGConfValue value
-  
+
   marshalFromGConfValue value@(GConfValue ptr) = do
     when (ptr == nullPtr) $ fail "GConf: cannot get value of key, key is unset"
     unsafeMarshalFromGConfValue value
-  
+
   marshalToGConfValue v = case v of
     (GConfValueString v') -> marshalToGConfValue v'
     (GConfValueInt    v') -> marshalToGConfValue v'
diff --git a/System/Gnome/GConf/Signals.chs b/System/Gnome/GConf/Signals.chs
--- a/System/Gnome/GConf/Signals.chs
+++ b/System/Gnome/GConf/Signals.chs
@@ -28,7 +28,7 @@
 -- The object system in the second version of GTK is based on GObject from
 -- GLIB. This base class is rather primitive in that it only implements
 -- ref and unref methods (and others that are not interesting to us). If
--- the marshall list mentions OBJECT it refers to an instance of this 
+-- the marshall list mentions OBJECT it refers to an instance of this
 -- GObject which is automatically wrapped with a ref and unref call.
 -- Structures which are not derived from GObject have to be passed as
 -- BOXED which gives the signal connect function a possibility to do the
@@ -40,7 +40,7 @@
 module System.Gnome.GConf.Signals (
   module System.Glib.Signals,
 
-  connect_STRING_PTR__NONE,
+  connect_GLIBSTRING_PTR__NONE,
   
   ) where
 
@@ -48,9 +48,10 @@
 
 import System.Glib.FFI
 import System.Glib.UTFString   (peekUTFString,maybePeekUTFString)
+import qualified System.Glib.UTFString as Glib
 import System.Glib.GError      (failOnGError)
 {#import System.Glib.Signals#}
-{#import System.Glib.GObject#} 
+{#import System.Glib.GObject#}
 
 
 {#context lib="gtk" prefix="gtk" #}
@@ -61,12 +62,12 @@
 -- the last one is the user g_pointer. Both are ignored.
 
 
-connect_STRING_PTR__NONE :: 
-  GObjectClass obj => SignalName ->
+connect_GLIBSTRING_PTR__NONE :: 
+  (Glib.GlibString a', GObjectClass obj) => SignalName ->
   ConnectAfter -> obj ->
-  (String -> Ptr b -> IO ()) ->
+  (a' -> Ptr b -> IO ()) ->
   IO (ConnectId obj)
-connect_STRING_PTR__NONE signal after obj user =
+connect_GLIBSTRING_PTR__NONE signal after obj user =
   connectGeneric signal after obj action
   where action :: Ptr GObject -> CString -> Ptr () -> IO ()
         action _ str1 ptr2 =
diff --git a/gconf.cabal b/gconf.cabal
--- a/gconf.cabal
+++ b/gconf.cabal
@@ -1,5 +1,5 @@
 Name:           gconf
-Version:        0.12.5.0
+Version:        0.13.0.0
 License:        LGPL-2.1
 License-file:   COPYING
 Copyright:      (c) 2001-2010 The Gtk2Hs Team
@@ -9,7 +9,7 @@
 Cabal-Version:  >= 1.8
 Stability:      stable
 homepage:       http://projects.haskell.org/gtk2hs/
-bug-reports:    http://hackage.haskell.org/trac/gtk2hs/
+bug-reports:    https://github.com/gtk2hs/gconf/issues
 Synopsis:       Binding to the GNOME configuration database system.
 Description:    GConf is a configuration database system for storing application
                 preferences. It supports default or mandatory settings set by the
@@ -38,21 +38,23 @@
 
 Library
         build-depends:  base >= 4 && < 5,
-                        glib >= 0.12.5.0 && < 0.13
-						
-        build-tools:    gtk2hsC2hs >= 0.13.8,
+                        glib >= 0.13.0.0 && < 0.14,
+                        text >= 0.11.0.6 && < 1.2
+
+        build-tools:    gtk2hsC2hs >= 0.13.11,
                         gtk2hsHookGenerator, gtk2hsTypeGen
-						
+
         exposed-modules:
           System.Gnome.GConf
-          System.Gnome.GConf.GConfClient		  
+          System.Gnome.GConf.GConfClient		
         other-modules:
           System.Gnome.GConf.GConfValue
-          System.Gnome.GConf.Types		  
+          System.Gnome.GConf.Types		
           System.Gnome.GConf.Signals
 
         extensions:     ForeignFunctionInterface
-		
+
+        cpp-options:    -U__BLOCKS__
         x-Signals-File:  System/Gnome/GConf/Signals.chs
         x-Signals-Modname: System.Gnome.GConf.Signals
         x-Signals-Types: marshal.list
diff --git a/marshal.list b/marshal.list
--- a/marshal.list
+++ b/marshal.list
@@ -14,7 +14,7 @@
 #   FLAGS       for flag enumeration types (guint)
 #   FLOAT       for single-precision float types (gfloat)
 #   DOUBLE      for double-precision float types (gdouble)
-#   STRING      for string types (gchar*)
+#   GLIBSTRING  for string types (gchar*)
 #   BOXED       for boxed (anonymous but reference counted) types (GBoxed*)
 #   POINTER     for anonymous pointer types (gpointer)
 #   NONE        deprecated alias for VOID
@@ -42,4 +42,4 @@
 # If you add a new signal type, please check that it actually works!
 # If it is a Boxed type check that the reference counting is right.
 
-NONE:STRING,POINTER
+NONE:GLIBSTRING,POINTER
