diff --git a/Network/Wai/Application/Classic.hs b/Network/Wai/Application/Classic.hs
--- a/Network/Wai/Application/Classic.hs
+++ b/Network/Wai/Application/Classic.hs
@@ -2,12 +2,23 @@
   WAI (Web Application Interface) Application for static files and CGI.
 -}
 
-module Network.Wai.Application.Classic (module Classic) where
-
-import Network.Wai.Application.Classic.CGI as Classic
-import Network.Wai.Application.Classic.File as Classic
-import Network.Wai.Application.Classic.Types as Classic
-import Network.Wai.Application.Classic.Header as Classic
-import Network.Wai.Application.Classic.Utils as Classic
-
+module Network.Wai.Application.Classic (
+  -- * Types
+    AppSpec(..)
+  , RspBody(..)
+  , Range(..)
+  -- * Files
+  , FileRoute(..), fileApp
+  -- * CGI
+  , CgiRoute(..), cgiApp
+  -- * Utilities for logging
+  , NumericAddress, getPeerAddr
+  , FieldKey
+  , lookupRequestField, lookupRequestField'
+  ) where
 
+import Network.Wai.Application.Classic.CGI
+import Network.Wai.Application.Classic.File
+import Network.Wai.Application.Classic.Types
+import Network.Wai.Application.Classic.Utils
+import Network.Wai.Application.Classic.Header
diff --git a/Network/Wai/Application/Classic/CGI.hs b/Network/Wai/Application/Classic/CGI.hs
--- a/Network/Wai/Application/Classic/CGI.hs
+++ b/Network/Wai/Application/Classic/CGI.hs
@@ -65,7 +65,7 @@
                     Nothing    -> (status500,[],True)
                     Just (s,h) -> (s,h,False)
                 hdr' = addHeader hdr
-            liftIO $ logger spec req st NoBody -- cannot know body length
+            liftIO $ logger spec req st Nothing -- cannot know body length
             if emp
                then emptyBody =$ response build st hdr'
                else              response build st hdr')
diff --git a/Network/Wai/Application/Classic/Field.hs b/Network/Wai/Application/Classic/Field.hs
--- a/Network/Wai/Application/Classic/Field.hs
+++ b/Network/Wai/Application/Classic/Field.hs
@@ -7,10 +7,10 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS hiding (pack)
 import Data.ByteString.Char8 as BS (pack)
-import Data.HashMap (Map)
-import qualified Data.HashMap as M
-import Data.Map as Map (toList)
+import qualified Data.Map as Map (toList)
 import Data.Maybe
+import Data.StaticHash (StaticHash)
+import qualified Data.StaticHash as SH
 import Network.HTTP.Date
 import Network.HTTP.Types
 import Network.Wai
@@ -50,7 +50,7 @@
 mimeType file =fromMaybe defaultMimeType . foldr1 mplus . map lok $ targets
   where
     targets = extensions file
-    lok x = M.lookup x defaultMimeTypes'
+    lok x = SH.lookup x defaultMimeTypes'
 
 extensions :: ByteString -> [ByteString]
 extensions file = exts
@@ -60,5 +60,5 @@
         (_,x)  -> BS.tail x
     exts = if entire == "" then [] else entire : BS.split 46 file
 
-defaultMimeTypes' :: Map ByteString MimeType
-defaultMimeTypes' = M.fromList $ map (first BS.pack) $ Map.toList defaultMimeTypes
+defaultMimeTypes' :: StaticHash ByteString MimeType
+defaultMimeTypes' = SH.fromList $ map (first BS.pack) $ Map.toList defaultMimeTypes
diff --git a/Network/Wai/Application/Classic/File.hs b/Network/Wai/Application/Classic/File.hs
--- a/Network/Wai/Application/Classic/File.hs
+++ b/Network/Wai/Application/Classic/File.hs
@@ -8,7 +8,7 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS hiding (unpack, pack)
 import qualified Data.ByteString.Char8 as BS (unpack, pack)
-import qualified Data.ByteString.Lazy.Char8 as BL ()
+import qualified Data.ByteString.Lazy.Char8 as BL (length)
 import Network.HTTP.Types
 import Network.Wai
 import Network.Wai.Application.Classic.Field
@@ -44,17 +44,21 @@
         "GET"  -> processGET  req file ishtml rfile
         "HEAD" -> processHEAD req file ishtml rfile
         _      -> return notAllowed
-    liftIO $ logger spec req st body
-    let hdr' = addServer hdr
-    case body of
-        NoBody     -> return $ responseLBS st hdr' ""
-        BodyLBS bd -> return $ responseLBS st hdr' bd
-        BodyFile afile (Entire len) -> do
-            let hdr'' = addLength hdr' len
-            return $ ResponseFile st hdr'' (BS.unpack afile) Nothing
-        BodyFile afile (Part skip len) -> do
-            let hdr'' = addLength hdr' len
-            return $ ResponseFile st hdr'' (BS.unpack afile) (Just (FilePart skip len))
+    let hdr'= addServer hdr
+        (response, mlen) = case body of
+            NoBody     -> (responseLBS st hdr' "", Nothing)
+            BodyLBS bd ->
+                let len = fromIntegral $ BL.length bd
+                in (responseLBS st hdr' bd, Just len)
+            BodyFile afile rng ->
+                let (len, mfp) = case rng of
+                        Entire bytes    -> (bytes, Nothing)
+                        Part skip bytes -> (bytes, Just (FilePart skip bytes))
+                    hdr''  = addLength hdr' len
+                    afile' = BS.unpack afile
+                in (ResponseFile st hdr'' afile' mfp, Just len)
+    liftIO $ logger spec req st mlen
+    return response
   where
     method = requestMethod req
     path = pathinfoToFilePath req filei
diff --git a/Network/Wai/Application/Classic/Types.hs b/Network/Wai/Application/Classic/Types.hs
--- a/Network/Wai/Application/Classic/Types.hs
+++ b/Network/Wai/Application/Classic/Types.hs
@@ -13,7 +13,7 @@
     -- | Whether this is an HTML or not.
   , isHTML :: ByteString -> Bool
     -- | A function for logging.
-  , logger :: Request -> Status -> RspBody -> IO ()
+  , logger :: Request -> Status -> Maybe Integer -> IO ()
   }
 
 data FileRoute = FileRoute {
diff --git a/wai-app-file-cgi.cabal b/wai-app-file-cgi.cabal
--- a/wai-app-file-cgi.cabal
+++ b/wai-app-file-cgi.cabal
@@ -1,5 +1,5 @@
 Name:                   wai-app-file-cgi
-Version:                0.2.0
+Version:                0.2.1
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -17,16 +17,16 @@
   else
     GHC-Options:        -Wall
   Exposed-Modules:      Network.Wai.Application.Classic
-                        Network.Wai.Application.Classic.CGI
-                        Network.Wai.Application.Classic.File
-                        Network.Wai.Application.Classic.Types
-                        Network.Wai.Application.Classic.Header
-  Other-Modules:        Network.Wai.Application.Classic.EnumLine
+  Other-Modules:        Network.Wai.Application.Classic.CGI
+                        Network.Wai.Application.Classic.EnumLine
                         Network.Wai.Application.Classic.Field
+                        Network.Wai.Application.Classic.File
                         Network.Wai.Application.Classic.FileInfo
+                        Network.Wai.Application.Classic.Header
                         Network.Wai.Application.Classic.Lang
                         Network.Wai.Application.Classic.MaybeIter
                         Network.Wai.Application.Classic.Range
+                        Network.Wai.Application.Classic.Types
                         Network.Wai.Application.Classic.Utils
   Build-Depends:        base >= 4 && < 5, process, haskell98,
                         network, transformers,
@@ -35,7 +35,7 @@
                         wai, enumerator >= 0.4.9,
                         bytestring, blaze-builder,
                         wai-app-static, http-types, http-date,
-                        case-insensitive, hashmap, array
+                        case-insensitive, static-hash
 Source-Repository head
   Type:                 git
   Location:             git://github.com/kazu-yamamoto/wai-app-file-cgi.git
