diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 3.0.11
+
+* Better HEAD support for files [#357](https://github.com/yesodweb/wai/pull/357)
+
 ## 3.0.10
 
 * Fix [missing `IORef` tweak](https://github.com/yesodweb/wai/issues/351)
diff --git a/Network/Wai/Handler/Warp/Response.hs b/Network/Wai/Handler/Warp/Response.hs
--- a/Network/Wai/Handler/Warp/Response.hs
+++ b/Network/Wai/Handler/Warp/Response.hs
@@ -174,6 +174,7 @@
 sendResponse defServer conn ii req reqidxhdr src response = do
     hs <- addServerAndDate hs0
     if hasBody s req then do
+        -- HEAD comes here even if it does not have body.
         sendRsp conn ver s hs rsp
         T.tickle th
         return ret
@@ -192,8 +193,9 @@
     mRange = reqidxhdr ! idxRange
     reqinfo@(isPersist,_) = infoFromRequest req reqidxhdr
     (isKeepAlive, needsChunked) = infoFromResponse rspidxhdr reqinfo
+    isHead = requestMethod req == H.methodHead
     rsp = case response of
-        ResponseFile _ _ path mPart -> RspFile path mPart mRange (T.tickle th)
+        ResponseFile _ _ path mPart -> RspFile path mPart mRange isHead (T.tickle th)
         ResponseBuilder _ _ b       -> RspBuilder b needsChunked
         ResponseStream _ _ fb       -> RspStream fb needsChunked th
         ResponseRaw raw _           -> RspRaw raw src (T.tickle th)
@@ -205,7 +207,7 @@
 
 ----------------------------------------------------------------
 
-data Rsp = RspFile FilePath (Maybe FilePart) (Maybe HeaderValue) (IO ())
+data Rsp = RspFile FilePath (Maybe FilePart) (Maybe HeaderValue) Bool (IO ())
          | RspBuilder Builder Bool
          | RspStream StreamingBody Bool T.Handle
          | RspRaw (IO ByteString -> (ByteString -> IO ()) -> IO ()) (IO ByteString) (IO ())
@@ -218,7 +220,7 @@
         -> H.ResponseHeaders
         -> Rsp
         -> IO ()
-sendRsp conn ver s0 hs0 (RspFile path mPart mRange hook) = do
+sendRsp conn ver s0 hs0 (RspFile path mPart mRange isHead hook) = do
     ex <- fileRange s0 hs path mPart mRange
     case ex of
         Left _ex ->
@@ -226,9 +228,13 @@
           print _ex >>
 #endif
           sendRsp conn ver s2 hs2 (RspBuilder body True)
-        Right (s, hs1, beg, len) | len >= 0 -> do
-            lheader <- composeHeader ver s hs1
-            connSendFile conn path beg len hook [lheader]
+        Right (s, hs1, beg, len)
+          | len >= 0 ->
+            if isHead then
+                sendRsp conn ver s hs1 (RspBuilder mempty False)
+              else do
+                lheader <- composeHeader ver s hs1
+                connSendFile conn path beg len hook [lheader]
           | otherwise -> do
             sendRsp conn ver H.status416
                 (filter (\(k, _) -> k /= "content-length") hs1)
@@ -353,7 +359,6 @@
 hasBody s req = sc /= 204
              && sc /= 304
              && sc >= 200
-             && method /= H.methodHead
   where
     sc = H.statusCode s
     method = requestMethod req
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             3.0.10.1
+Version:             3.0.11
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             MIT
 License-file:        LICENSE
