diff --git a/snap-core.cabal b/snap-core.cabal
--- a/snap-core.cabal
+++ b/snap-core.cabal
@@ -1,5 +1,5 @@
 name:           snap-core
-version:        0.9.3.1
+version:        0.9.4.0
 synopsis:       Snap: A Haskell Web Framework (core interfaces and types)
 
 description:
@@ -141,6 +141,7 @@
     directory                 >= 1       && < 2,
     enumerator                >= 0.4.15  && < 0.5,
     filepath                  >= 1.1     && < 2.0,
+    hashable                  >= 1.1     && < 1.2,
     HUnit                     >= 1.2     && < 2,
     MonadCatchIO-transformers >= 0.2.1   && < 0.4,
     mtl                       >= 2.0     && < 2.2,
diff --git a/src/Snap/Internal/Http/Types.hs b/src/Snap/Internal/Http/Types.hs
--- a/src/Snap/Internal/Http/Types.hs
+++ b/src/Snap/Internal/Http/Types.hs
@@ -289,6 +289,8 @@
       -- | The parameter mapping decoded from the POST body. Note that Snap
       -- only auto-decodes POST request bodies when the request's
       -- @Content-Type@ is @application/x-www-form-urlencoded@.
+      -- For @multipart/form-data@ use 'Snap.Util.FileUploads.handleFileUploads'
+      -- to decode the POST request and fill this mapping.
     , rqPostParams     :: Params
     }
 
diff --git a/src/Snap/Internal/Parsing.hs b/src/Snap/Internal/Parsing.hs
--- a/src/Snap/Internal/Parsing.hs
+++ b/src/Snap/Internal/Parsing.hs
@@ -8,27 +8,27 @@
 ------------------------------------------------------------------------------
 import           Blaze.ByteString.Builder
 import           Control.Applicative
-import           Control.Arrow (first, second)
+import           Control.Arrow                 (first, second)
 import           Control.Monad
 import           Data.Attoparsec.Char8
 import           Data.Bits
-import           Data.ByteString.Char8 (ByteString)
-import qualified Data.ByteString.Char8 as S
-import           Data.ByteString.Internal (c2w, w2c)
-import qualified Data.ByteString.Lazy.Char8 as L
-import qualified Data.CaseInsensitive as CI
-import           Data.CaseInsensitive (CI)
-import           Data.Char hiding (isDigit, isSpace)
+import           Data.ByteString.Char8         (ByteString)
+import qualified Data.ByteString.Char8         as S
+import           Data.ByteString.Internal      (c2w, w2c)
+import qualified Data.ByteString.Lazy.Char8    as L
+import           Data.CaseInsensitive          (CI)
+import qualified Data.CaseInsensitive          as CI
+import           Data.Char                     hiding (isDigit, isSpace)
 import           Data.Int
-import           Data.List (intersperse)
-import           Data.Map (Map)
-import qualified Data.Map as Map
+import           Data.List                     (intersperse)
+import           Data.Map                      (Map)
+import qualified Data.Map                      as Map
 import           Data.Maybe
 import           Data.Monoid
 import           Data.Word
 import           GHC.Exts
-import           GHC.Word (Word8(..))
-import           Prelude hiding (head, take, takeWhile)
+import           GHC.Word                      (Word8 (..))
+import           Prelude                       hiding (head, take, takeWhile)
 ------------------------------------------------------------------------------
 import           Snap.Internal.Http.Types
 import           Snap.Internal.Parsing.FastSet (FastSet)
diff --git a/test/suite/Snap/Core/Tests.hs b/test/suite/Snap/Core/Tests.hs
--- a/test/suite/Snap/Core/Tests.hs
+++ b/test/suite/Snap/Core/Tests.hs
@@ -22,7 +22,8 @@
 import           Data.IORef
 import           Data.Maybe (isJust)
 import           Data.Monoid
-import           Data.Text ()
+import           Data.Text (Text)
+import qualified Data.Text.Encoding as T
 import           Data.Text.Lazy ()
 import qualified Data.Map as Map
 import           Prelude hiding (catch)
@@ -69,7 +70,9 @@
         , testEvalSnap
         , testLocalRequest
         , testRedirect
-        , testBracketSnap ]
+        , testBracketSnap
+        , testPathArgs
+        ]
 
 
 expectSpecificException :: Exception e => e -> IO a -> IO ()
@@ -671,3 +674,17 @@
     assertEqual "redirect path" (Just "/bar/foo") $ getHeader "Location" rsp2
     assertEqual "redirect status" 307 $ rspStatus rsp2
     assertEqual "status description" "Temporary Redirect" $ rspStatusReason rsp2
+
+
+testPathArgs :: Test
+testPathArgs = testCase "types/pathArgs" $ do
+    (_, rsp) <- goPath "%e4%b8%ad" m
+    b <- getBody rsp
+    assertEqual "pathargs url- and utf8-decodes" "ok" b
+
+  where
+    m = pathArg f
+
+    f x = if x == ("\x4e2d" :: Text)
+            then writeBS "ok"
+            else writeBS $ "not ok: " `mappend` T.encodeUtf8 x
