diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for path-dhall-instance
 
+# v0.2.0.0
+
+* Directory normalisation now works.
+
 # v0.1.0.1
 
 * `FromDhall` and `ToDhall` instances for `Path`.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
 # path-dhall-instance
 
 `FromDhall` and `ToDhall` instances for [path](https://hackage.haskell.org/package/path).
-
-Warning: This is not currently normalizing anything when parsing, because I don't understand dhall's instances.
diff --git a/path-dhall-instance.cabal b/path-dhall-instance.cabal
--- a/path-dhall-instance.cabal
+++ b/path-dhall-instance.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           path-dhall-instance
-version:        0.1.1.0
+version:        0.2.0.0
 synopsis:       ToDhall and FromDhall instances for Path.
 description:    ToDhall and FromDhall instances for Path.
 category:       Filesystem
@@ -27,8 +27,9 @@
   hs-source-dirs:
       src
   build-depends:
-      aeson
-    , base >=4.7 && <5
+      base >=4.7 && <5
     , dhall
+    , either
     , path
+    , text
   default-language: Haskell2010
diff --git a/src/Path/Dhall.hs b/src/Path/Dhall.hs
--- a/src/Path/Dhall.hs
+++ b/src/Path/Dhall.hs
@@ -7,14 +7,36 @@
 -}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 {-# LANGUAGE FlexibleInstances  #-}
-{-# LANGUAGE RecordWildCards #-}
 module Path.Dhall where
 
-import Data.Aeson
 import Dhall
+import qualified Data.Text as T
 import Path
+import Data.Either.Validation
 
-instance FromDhall (Path Rel File)
-instance FromDhall (Path Rel Dir)
+pathDecoder f opts =
+      Decoder
+            { extract = extractPath
+            , expected = expectedPath
+            }
+      where
+        filePathDecoder :: Decoder FilePath
+        filePathDecoder = autoWith opts
+
+        extractPath expression =
+          case extract filePathDecoder expression of
+              Success x -> case f x of
+                Left exception   -> Dhall.extractError (T.pack $ show exception)
+                Right path       -> Success path
+              Failure e        -> Failure e
+
+        expectedPath = expected filePathDecoder
+
+instance FromDhall (Path Rel Dir) where
+    autoWith options = pathDecoder parseRelDir options
+
+instance FromDhall (Path Rel File) where
+    autoWith options = pathDecoder parseRelFile options
+
 instance ToDhall (Path Rel File)
 instance ToDhall (Path Rel Dir)
