diff --git a/Network/Wai/Application/Static.hs b/Network/Wai/Application/Static.hs
--- a/Network/Wai/Application/Static.hs
+++ b/Network/Wai/Application/Static.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE CPP #-}
 -- | Static file serving for WAI.
 module Network.Wai.Application.Static
     ( -- * Generic, non-WAI code
@@ -55,6 +56,10 @@
 import Data.List (sortBy, intercalate)
 import Data.FileEmbed (embedFile)
 
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as TE
+import qualified Data.Text.Encoding.Error as TEE
+
 -- | A list of all possible extensions, starting from the largest.
 takeExtensions :: FilePath -> [String]
 takeExtensions s =
@@ -193,7 +198,7 @@
     | anyButLast null pieces =
         return $ Redirect $ filterButLast (not . null) pieces
     | otherwise = do
-        let fp = concat $ prefix : map ((:) '/') pieces
+        let fp = concat $ prefix : map ((:) '/') (map unfixPathName pieces)
         let (isFile, isFolder) =
                 case () of
                     ()
@@ -284,6 +289,20 @@
                         [ ("Content-Type", mt)
                         ] lbs
 
+fixPathName :: FilePath -> FilePath
+#if defined(mingw32_HOST_OS)
+fixPathName = id
+#else
+fixPathName = T.unpack . TE.decodeUtf8With TEE.lenientDecode . S8.pack
+#endif
+
+unfixPathName :: FilePath -> FilePath
+#if defined(mingw32_HOST_OS)
+unfixPathName = id
+#else
+unfixPathName = S8.unpack . TE.encodeUtf8 . T.pack
+#endif
+
 -- Code below taken from Happstack: http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-server/src/Happstack/Server/FileServe/BuildingBlocks.hs
 defaultListing :: Listing
 defaultListing pieces localPath = do
@@ -359,7 +378,7 @@
                               then return ()
                               else H.img ! A.src (H.stringValue folderSrc)
                                          ! A.alt (H.stringValue "Folder")
-                   H.td (H.a ! A.href (H.stringValue $ mdName md ++ if mdIsFile md then "" else "/")  $ H.string $ mdName md)
+                   H.td (H.a ! A.href (H.stringValue $ mdName' md ++ if mdIsFile md then "" else "/")  $ H.string $ mdName' md)
                    H.td ! A.class_ (H.stringValue "date") $ H.string $
                        if mdIsFile md
                            then formatCalendarTime defaultTimeLocale "%d-%b-%Y %X" $ mdModified md
@@ -383,6 +402,7 @@
       addCommas' (a:b:c:d:e) = a : b : c : ',' : addCommas' (d : e)
       addCommas' x = x
 
+mdName' = fixPathName . mdName
 
 data MetaData =
     FileMetaData
diff --git a/wai-app-static.cabal b/wai-app-static.cabal
--- a/wai-app-static.cabal
+++ b/wai-app-static.cabal
@@ -1,5 +1,5 @@
 name:            wai-app-static
-version:         0.0.1.3
+version:         0.0.1.4
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -26,6 +26,7 @@
                    , time                      >= 1.1.4    && < 1.3
                    , old-locale                >= 1.0.0.2  && < 1.1
                    , file-embed                >= 0.0.3.1  && < 0.1
+                   , text                      >= 0.5      && < 1.0
     exposed-modules: Network.Wai.Application.Static
     ghc-options:     -Wall
 
