diff --git a/hack2-contrib.cabal b/hack2-contrib.cabal
--- a/hack2-contrib.cabal
+++ b/hack2-contrib.cabal
@@ -1,5 +1,5 @@
 Name:                 hack2-contrib
-Version:              2011.10.12
+Version:              2012.1.19
 Build-type:           Simple
 Synopsis:             Hack2 contrib
 Description:          Common middlewares and utilities that helps working with Hack2
@@ -28,11 +28,10 @@
                   , data-default >= 0.2
                   , time
                   , air >= 2011.6.19
-                  , hack2 >= 2011.6.20
+                  , hack2 >= 2012.1.19
                   , utf8-string
                   -- , ansi-wl-pprint
                   , regexpr
-                  , enumerator
                   
   hs-source-dirs: src/
   
diff --git a/src/Hack2/Contrib/Middleware/File.hs b/src/Hack2/Contrib/Middleware/File.hs
--- a/src/Hack2/Contrib/Middleware/File.hs
+++ b/src/Hack2/Contrib/Middleware/File.hs
@@ -20,9 +20,7 @@
 import System.Directory
 import System.FilePath
 import qualified Data.ByteString.Char8 as B
-import qualified Data.ByteString.Lazy.Char8 as Lazy
 import Data.ByteString.Char8 (ByteString)
-import Data.Enumerator.Binary (enumFile)
 
 
 file :: Maybe ByteString -> Middleware
@@ -63,7 +61,7 @@
       serving path = do
         -- puts "serving path"
         
-        let file_enumerator = enumFile - b2u path
+        file_data <- B.readFile path
         
         size <- path.b2u.file_size ^ from_i
         -- puts - "size is " + show size
@@ -78,7 +76,7 @@
         
         return - 
           def 
-            .set_body (HackEnumerator file_enumerator)
+            .set_body_bytestring file_data
             .set_content_length size
             .set_content_type content_type
             .set_last_modified (B.pack mtime_str)
@@ -91,27 +89,27 @@
     def
       .set_status 404
       .set_content_type _TextPlain
-      .set_content_length (msg.Lazy.length)
+      .set_content_length (msg.B.length)
       .set_body_bytestring msg
 
-    where msg = "No permission: " + s2l path + "\n"
+    where msg = "No permission: " + path + "\n"
 
 not_found :: ByteString -> IO Response
 not_found path = return $
   def
     .set_status 404
     .set_content_type _TextPlain
-    .set_content_length (msg.Lazy.length)
+    .set_content_length (msg.B.length)
     .set_body_bytestring msg
   
-  where msg = "File not found: " + s2l path + "\n"
+  where msg = "File not found: " + path + "\n"
 
 forbidden :: IO Response
 forbidden = return - 
   def
     .set_status 403
     .set_content_type _TextPlain
-    .set_content_length (msg.Lazy.length)
+    .set_content_length (msg.B.length)
     .set_body_bytestring msg
 
   where msg = "Forbidden\n"
diff --git a/src/Hack2/Contrib/Middleware/Head.hs b/src/Hack2/Contrib/Middleware/Head.hs
--- a/src/Hack2/Contrib/Middleware/Head.hs
+++ b/src/Hack2/Contrib/Middleware/Head.hs
@@ -4,10 +4,9 @@
 import Hack2.Contrib.Response
 import Hack2.Contrib.Utils
 
-import Air.Env hiding (def, head)
+import Air.Env hiding (head)
 import Prelude ()
 import qualified Data.ByteString.Char8 as B
-import Data.Default (def)
 
 head :: Middleware
 head app = \env -> do
diff --git a/src/Hack2/Contrib/Request.hs b/src/Hack2/Contrib/Request.hs
--- a/src/Hack2/Contrib/Request.hs
+++ b/src/Hack2/Contrib/Request.hs
@@ -13,12 +13,11 @@
 import Network.CGI.Protocol
 import Prelude ()
 import qualified Data.ByteString.Char8 as B
-import qualified Data.ByteString.Lazy.Char8 as Lazy
 import Hack2.Contrib.AirBackports
 
 
-input_bytestring :: Env -> IO Lazy.ByteString
-input_bytestring = hack_input > unHackEnumerator > fromEnumerator
+input_bytestring :: Env -> IO ByteString
+input_bytestring = hack_input > return
 
 scheme :: Env -> ByteString
 scheme = hack_url_scheme > show > lower > B.pack
@@ -75,7 +74,7 @@
       .map_fst (B.unpack > upper > gsub "-" "_") -- cgi env use all cap letters
       .map_snd B.unpack
       .(("REQUEST_METHOD", env.request_method.show) : ) -- for cgi request
-      .flip decodeInput _body
+      .flip decodeInput (_body.s2l)
       .fst
       .concatMap to_headers
       
diff --git a/src/Hack2/Contrib/Response.hs b/src/Hack2/Contrib/Response.hs
--- a/src/Hack2/Contrib/Response.hs
+++ b/src/Hack2/Contrib/Response.hs
@@ -8,16 +8,13 @@
 import Hack2
 import Hack2.Contrib.Constants
 import Hack2.Contrib.Utils
-import Air.Env hiding (def)
+import Air.Env
 import Prelude ()
-import qualified Data.ByteString.Lazy.Char8 as Lazy
 import Hack2.Contrib.AirBackports
-import Data.Default (def)
-import Data.Enumerator (run_, enumList, Enumerator, ($$))
 import qualified Data.ByteString.Char8 as Strict
 
-body_bytestring :: Response -> IO Lazy.ByteString
-body_bytestring r = r.body.unHackEnumerator.fromEnumerator
+body_bytestring :: Response -> IO ByteString
+body_bytestring = body > return
 
 redirect :: ByteString -> Maybe Int -> Response -> Response
 redirect target code = 
@@ -50,14 +47,11 @@
 set_content_length :: (Integral a) => a -> Response -> Response
 set_content_length i r = r.set_header _ContentLength (i.show_bytestring)
 
-set_body :: HackEnumerator -> Response -> Response
+set_body :: ByteString -> Response -> Response
 set_body s r = r { body = s }
 
-set_body_bytestring :: Lazy.ByteString -> Response -> Response
-set_body_bytestring b r = 
-  let enum = b.toEnumerator :: (forall a. Enumerator Strict.ByteString IO a)
-  in
-  set_body (HackEnumerator enum) r
+set_body_bytestring :: ByteString -> Response -> Response
+set_body_bytestring = set_body
 
 set_status :: Int -> Response -> Response
 set_status i r = r { status = i }
diff --git a/src/Hack2/Contrib/Utils.hs b/src/Hack2/Contrib/Utils.hs
--- a/src/Hack2/Contrib/Utils.hs
+++ b/src/Hack2/Contrib/Utils.hs
@@ -16,28 +16,11 @@
 import Prelude ()
 import System.Locale (defaultTimeLocale)
 import qualified Data.ByteString.Char8 as B
-import qualified Data.ByteString.Lazy.Char8 as Lazy
 import qualified Data.Map as M
 import Hack2.Contrib.AirBackports
 
 import qualified Data.ByteString.Char8 as Strict
 
-import qualified Data.Enumerator.Binary as EB
-import qualified Data.Enumerator.List as EL
-
-import Data.Enumerator (run_, enumList, Enumerator, ($$))
-
-fromEnumerator :: Monad m => Enumerator Strict.ByteString m Lazy.ByteString -> m Lazy.ByteString
-fromEnumerator m = run_ - m $$ EB.consume
-
-toEnumerator :: Monad m => Lazy.ByteString -> Enumerator Strict.ByteString m a
-toEnumerator = enumList 1 < Lazy.toChunks
-
-withEnumerator :: Monad m => (Lazy.ByteString -> Lazy.ByteString) -> Enumerator Strict.ByteString m Lazy.ByteString -> m (Enumerator Strict.ByteString m a)
-withEnumerator f enum = do
-  bytes <- fromEnumerator enum
-  return - toEnumerator - f bytes
-
 empty_app :: Application
 empty_app = return def
 
@@ -53,8 +36,8 @@
 get :: (Eq a) => a -> [(a, b)] -> Maybe b
 get = lookup
 
-bytesize :: Lazy.ByteString -> Int
-bytesize = Lazy.length > from_i
+bytesize :: ByteString -> Int
+bytesize = B.length > from_i
 
 show_bytestring :: (Show a) => a -> ByteString
 show_bytestring = show > B.pack
@@ -102,7 +85,7 @@
 server_port       :: Env -> Int
 hack_version      :: Env -> (Int, Int, Int)
 hack_url_scheme   :: Env -> HackUrlScheme
-hack_input        :: Env -> HackEnumerator
+hack_input        :: Env -> ByteString
 hack_errors       :: Env -> HackErrors
 hack_headers       :: Env -> [(ByteString, ByteString)]
 
