diff --git a/citeproc-hs.cabal b/citeproc-hs.cabal
--- a/citeproc-hs.cabal
+++ b/citeproc-hs.cabal
@@ -1,5 +1,5 @@
 name:               citeproc-hs
-version:            0.3.0
+version:            0.3.1
 homepage:           http://code.haskell.org/citeproc-hs
 synopsis:           A Citation Style Language implementation in Haskell
 
@@ -94,16 +94,16 @@
     ghc-options:      -funbox-strict-fields -Wall
     ghc-prof-options: -prof -auto-all
     hs-source-dirs:   src
-    build-depends:    containers, directory, mtl, xml, json, filepath,
-                      pandoc-types == 1.7
+    build-depends:    containers, directory, mtl, xml, json, utf8-string,
+                      bytestring, filepath, pandoc-types >= 1.8 && < 1.9
 
     if flag(bibutils)
-       build-depends: hs-bibutils >= 0.3
-       extensions:    CPP
-       cpp-options:   -DUSE_BIBUTILS
+       build-depends:   hs-bibutils >= 0.3
+       extensions:      CPP
+       cpp-options:     -DUSE_BIBUTILS
 
     if flag(network)
-       build-depends: network >= 2, HTTP >= 4000.0.5
+       build-depends: network >= 2, HTTP >= 4000.0.9
        extensions:    CPP
        cpp-options:   -DUSE_NETWORK
 
diff --git a/src/Text/CSL/Input/Bibutils.hs b/src/Text/CSL/Input/Bibutils.hs
--- a/src/Text/CSL/Input/Bibutils.hs
+++ b/src/Text/CSL/Input/Bibutils.hs
@@ -15,15 +15,18 @@
     ( readBiblioFile
     ) where
 
+import Data.Char
+import System.FilePath ( takeExtension )
 import Text.CSL.Reference
 import Text.CSL.Input.Json
 import Text.CSL.Input.MODS
-import System.FilePath ( takeExtension, (</>) )
 
 #ifdef USE_BIBUTILS
-import Data.Char
-import System.Directory ( getTemporaryDirectory, removeFile )
-import System.IO
+import Control.Exception ( bracket )
+import Control.Monad.Trans ( liftIO )
+import System.FilePath ( (</>), (<.>) )
+import System.IO.Error ( isAlreadyExistsError )
+import System.Directory
 import Text.Bibutils
 #endif
 
@@ -64,22 +67,33 @@
 readBiblioFile' :: FilePath -> BiblioIn -> IO [Reference]
 readBiblioFile' fin bin
     | bin == mods_in = readModsCollectionFile fin
-    | otherwise      = do
-   tdir  <- getTemporaryDirectory
-   (f,h) <- openTempFile tdir "citeproc.txt"
-   hClose h
-   let tfile = tdir </> f
-   param <- bibl_initparams bin mods_out "hs-bibutils"
-   bibl  <- bibl_init
-   unsetBOM        param
-   setNoSplitTitle param
-   setCharsetIn    param bibl_charset_unicode
-   setCharsetOut   param bibl_charset_unicode
-   _ <- bibl_read  param bibl fin
-   _ <- bibl_write param bibl tfile
-   bibl_free bibl
-   bibl_freeparams param
-   refs <- readModsCollectionFile tfile
-   removeFile tfile
-   return refs
+    | otherwise      = withTempDir "citeproc" $ \tdir -> do
+                          let tfile = tdir </> "bibutils-tmp"
+                          param <- bibl_initparams bin mods_out "hs-bibutils"
+                          bibl  <- bibl_init
+                          unsetBOM        param
+                          setNoSplitTitle param
+                          setCharsetIn    param bibl_charset_unicode
+                          setCharsetOut   param bibl_charset_unicode
+                          _ <- bibl_read  param bibl fin
+                          _ <- bibl_write param bibl tfile
+                          bibl_free bibl
+                          bibl_freeparams param
+                          refs <- readModsCollectionFile tfile
+                          return $! refs
+
+-- | Perform a function in a temporary directory and clean up.
+withTempDir :: FilePath -> (FilePath -> IO a) -> IO a
+withTempDir baseName = bracket (createTempDir 0 baseName)
+  (removeDirectoryRecursive)
+
+-- | Create a temporary directory with a unique name.
+createTempDir :: Integer -> FilePath -> IO FilePath
+createTempDir num baseName = do
+  sysTempDir <- getTemporaryDirectory
+  let dirName = sysTempDir </> baseName <.> show num
+  liftIO $ catch (createDirectory dirName >> return dirName) $
+      \e -> if isAlreadyExistsError e
+               then createTempDir (num + 1) baseName
+               else ioError e
 #endif
diff --git a/src/Text/CSL/Pickle.hs b/src/Text/CSL/Pickle.hs
--- a/src/Text/CSL/Pickle.hs
+++ b/src/Text/CSL/Pickle.hs
@@ -22,6 +22,9 @@
 import Data.List        ( elemIndex     )
 import Data.Maybe
 import System.Directory ( doesFileExist )
+import qualified Data.ByteString as B
+import Data.ByteString.UTF8 ( toString )
+import Control.Monad ( liftM )
 
 import Text.XML.Light
 
@@ -387,7 +390,7 @@
 readXmlFile :: Show a => PU a -> String -> IO a
 readXmlFile xp f = do
   flip unless (error $ f ++ " file does not exist") =<< doesFileExist f
-  readXmlString xp `fmap` readFile f
+  readXmlString xp `fmap` liftM toString (B.readFile f)
 
 getStyleVersion :: [Content] -> String
 getStyleVersion c
