diff --git a/app/warp-static.hs b/app/warp-static.hs
new file mode 100644
--- /dev/null
+++ b/app/warp-static.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}
+import Network.Wai.Application.Static (staticApp, defaultFileServerSettings)
+import Network.Wai.Handler.Warp
+    ( runSettings, defaultSettings, settingsHost, settingsPort
+    )
+import System.Console.CmdArgs hiding (def)
+import Text.Printf (printf)
+import System.Directory (canonicalizePath)
+import Control.Monad (unless)
+import Network.Wai.Middleware.Autohead
+import Network.Wai.Middleware.RequestLogger (logStdout)
+import Network.Wai.Middleware.Gzip
+import qualified Data.Map as Map
+import qualified Data.ByteString.Char8 as S8
+import Control.Arrow ((***))
+import Data.Text (pack)
+import Data.String (fromString)
+import Network.Mime (defaultMimeMap, mimeByExt, defaultMimeType)
+import WaiAppStatic.Types (ssIndices, toPiece, ssGetMimeType, fileName, fromPiece)
+import Data.Maybe (mapMaybe)
+
+data Args = Args
+    { docroot :: FilePath
+    , index :: [FilePath]
+    , port :: Int
+    , noindex :: Bool
+    , quiet :: Bool
+    , verbose :: Bool
+    , mime :: [(String, String)]
+    , host :: String
+    }
+    deriving (Show, Data, Typeable)
+
+defaultArgs :: Args
+defaultArgs = Args "." ["index.html", "index.htm"] 3000 False False False [] "*"
+
+main :: IO ()
+main = do
+    Args {..} <- cmdArgs defaultArgs
+    let mime' = map (pack *** S8.pack) mime
+    let mimeMap = Map.fromList mime' `Map.union` defaultMimeMap
+    docroot' <- canonicalizePath docroot
+    unless quiet $ printf "Serving directory %s on port %d with %s index files.\n" docroot' port (if noindex then "no" else show index)
+    let middle = gzip def { gzipFiles = GzipCompress }
+               . (if verbose then logStdout else id)
+               . autohead
+    runSettings defaultSettings
+        { settingsPort = port
+        , settingsHost = fromString host
+        } $ middle $ staticApp (defaultFileServerSettings $ fromString docroot)
+        { ssIndices = if noindex then [] else mapMaybe (toPiece . pack) index
+        , ssGetMimeType = return . mimeByExt mimeMap defaultMimeType . fromPiece . fileName
+        }
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:         2.0.0.4
+version:         2.0.0.5
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -64,6 +64,20 @@
 
     if flag(print)
       cpp-options:  -DPRINT
+
+Executable warp
+  Main-is:        warp-static.hs
+  hs-source-dirs: app
+  Build-depends: base            >= 4                  && < 5
+               , warp            >= 2.0                && < 2.2
+               , wai-app-static  >= 2.0                && < 2.1
+               , wai-extra       >= 2.0                && < 2.2
+               , cmdargs         >= 0.6.7
+               , directory       >= 1.0
+               , containers      >= 0.2
+               , bytestring      >= 0.9.1.4
+               , text            >= 0.7
+               , mime-types      >= 0.1                && < 0.2
 
 test-suite runtests
     hs-source-dirs: test
