diff --git a/anansi.cabal b/anansi.cabal
--- a/anansi.cabal
+++ b/anansi.cabal
@@ -1,6 +1,5 @@
 name: anansi
-version: 0.3.2.1
-synopsis: Simple literate programming preprocessor
+version: 0.3.3
 license: GPL-3
 license-file: license.txt
 author: John Millikin
@@ -10,28 +9,45 @@
 category: Development
 stability: experimental
 bug-reports: mailto:jmillikin@gmail.com
-homepage: http://john-millikin.com/software/anansi/
+homepage: https://john-millikin.com/software/anansi/
 tested-with: GHC==6.12.1
 
+synopsis: Simple literate programming preprocessor
+description:
+  Anansi is a preprocessor for literate programs, in the model of NoWeb or
+  nuweb. Literate programming allows computer code and a human-readable
+  document to be generated from the same source. Compared to NoWeb,
+  Anansi&#x2019;s primary benefits are the ability to include separate files,
+  and to automatically generate an entire directory tree from a project
+  without having to enumerate each output.
+  .
+  This package is split into a library and an executable. The executable is
+  suitable for simple cases, such as generating basic HTML or NoWeb. The
+  library is useful for users who would like to write their own output formats
+  (called &#x201C;looms&#x201D;).
+
 source-repository head
   type: bazaar
-  location: http://john-millikin.com/software/anansi/
+  location: https://john-millikin.com/software/anansi/
 
+source-repository this
+  type: bazaar
+  location: https://john-millikin.com/branches/anansi/0.3/
+  tag: anansi_0.3.3
+
 library
   hs-source-dirs: lib
-
-  if true
-    ghc-options: -Wall
+  ghc-options: -Wall
 
   build-depends:
-      base >=4.0 && < 5.0
-    , parsec >= 3.0 && < 3.2
+      base >= 4.0 && < 5.0
     , bytestring >= 0.9 && < 0.10
-    , text >= 0.7 && < 0.12
-    , monads-tf >= 0.1 && < 0.2
     , containers >= 0.1 && < 0.5
-    , system-filepath >= 0.3 && < 0.4
-    , system-fileio >= 0.1 && < 0.3
+    , monads-tf >= 0.1 && < 0.2
+    , parsec >= 3.0 && < 3.2
+    , system-filepath >= 0.3.1 && < 0.5
+    , system-fileio >= 0.2.1 && < 0.4
+    , text >= 0.7 && < 0.12
 
   exposed-modules:
     Anansi
@@ -48,17 +64,16 @@
     Anansi.Util
 
 executable anansi
-  hs-source-dirs: src
   main-is: Main.hs
-
-  if true
-    ghc-options: -Wall
+  hs-source-dirs: lib,src
+  ghc-options: -Wall
 
   build-depends:
-      base >=4.0 && < 5.0
+      base >= 4.0 && < 5.0
     , bytestring >= 0.9 && < 0.10
-    , text >= 0.7 && < 0.12
+    , containers >= 0.1 && < 0.5
     , monads-tf >= 0.1 && < 0.2
-    , system-filepath >= 0.3 && < 0.4
-    , system-fileio >= 0.1 && < 0.3
-    , anansi
+    , parsec >= 3.0 && < 3.2
+    , system-filepath >= 0.3.1 && < 0.5
+    , system-fileio >= 0.2.1 && < 0.4
+    , text >= 0.7 && < 0.12
diff --git a/lib/Anansi/Parser.hs b/lib/Anansi/Parser.hs
--- a/lib/Anansi/Parser.hs
+++ b/lib/Anansi/Parser.hs
@@ -32,9 +32,9 @@
 import qualified Data.Text.Encoding as TE
 import qualified Data.Text.Lazy as TL
 import qualified Data.Map as Map
-import System.FilePath (FilePath)
-import qualified System.FilePath.CurrentOS as FP
-import qualified System.File
+import Filesystem.Path (FilePath)
+import qualified Filesystem.Path.CurrentOS as FP
+import qualified Filesystem
 import Anansi.Types
 import Anansi.Util
 
@@ -71,7 +71,7 @@
 getPosition :: Monad m => P.ParsecT s u m Position
 getPosition = do
 	pos <- P.getPosition
-	return $ Position (fromString (P.sourceName pos)) (toInteger (P.sourceLine pos))
+	return $ Position (FP.decodeString (P.sourceName pos)) (toInteger (P.sourceLine pos))
 
 parseLines :: P.Parsec String u [Line]
 parseLines = do
@@ -220,9 +220,9 @@
 	
 	getLines :: FilePath -> IO [Line]
 	getLines path = do
-		bytes <- System.File.readFile path
+		bytes <- Filesystem.readFile path
 		let contents = T.unpack (TE.decodeUtf8 bytes)
-		case P.parse parseLines (show path) contents of
+		case P.parse parseLines (FP.encodeString path) contents of
 			Right x -> return x
 			Left err -> let
 				msg = TL.pack $ "getLines parse failed (internal error): " ++ show err
diff --git a/lib/Anansi/Tangle.hs b/lib/Anansi/Tangle.hs
--- a/lib/Anansi/Tangle.hs
+++ b/lib/Anansi/Tangle.hs
@@ -23,8 +23,8 @@
 import Data.String (fromString)
 import qualified Data.Text.Lazy as TL
 import qualified Data.Map as Map
-import System.FilePath (FilePath)
-import qualified System.FilePath.CurrentOS as FP
+import Filesystem.Path (FilePath)
+import qualified Filesystem.Path.CurrentOS as FP
 import Anansi.Types
 import Anansi.Util
 
diff --git a/lib/Anansi/Types.hs b/lib/Anansi/Types.hs
--- a/lib/Anansi/Types.hs
+++ b/lib/Anansi/Types.hs
@@ -20,7 +20,7 @@
 	) where
 import Prelude hiding (FilePath)
 import Data.Text.Lazy (Text)
-import System.FilePath.CurrentOS (FilePath)
+import Filesystem.Path.CurrentOS (FilePath)
 
 data Block
 	= BlockText Text
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -28,14 +28,13 @@
 import qualified Data.ByteString.Lazy as BL
 import Data.Version (showVersion)
 
+import qualified Filesystem
+import Filesystem.Path (FilePath)
+import qualified Filesystem.Path.CurrentOS as FP
 import System.Console.GetOpt
-import System.Directory
 import System.Environment
 import System.Exit
-import System.FilePath (FilePath)
-import qualified System.FilePath.CurrentOS as FP
 import System.IO hiding (withFile, FilePath)
-import qualified System.File
 
 data Output = Tangle | Weave
 	deriving (Eq)
@@ -81,7 +80,7 @@
 withFile :: FilePath -> (Handle -> IO a) -> IO a
 withFile path io = if FP.null path
 	then io stdout
-	else System.File.withFile path WriteMode io
+	else Filesystem.withFile path WriteMode io
 
 loomMap :: [(TL.Text, Loom)]
 loomMap = [(loomName l, l) | l <- looms]
@@ -142,9 +141,9 @@
 realTangle :: FilePath -> FilePath -> TL.Text -> IO ()
 realTangle root path text = do
 	let fullpath = FP.append root path
-	createTree (FP.parent fullpath)
+	Filesystem.createTree (FP.parent fullpath)
 	let bytes = encodeUtf8 text
-	System.File.withFile fullpath ReadWriteMode $ \h -> do
+	Filesystem.withFile fullpath ReadWriteMode $ \h -> do
 		equal <- fileContentsEqual h bytes
 		unless equal $ do
 			hSetFileSize h 0
