diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -0,0 +1,7 @@
+2014.5.19
+---------
+
+* get rid of CGI dependency
+* removed from Request
+    * inputs
+    * cookies
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:              2014.4.14
+Version:              2014.5.19
 Build-type:           Simple
 Synopsis:             Hack2 contrib
 Description:          Common middlewares and utilities for Hack2
@@ -18,7 +18,6 @@
 
   build-depends:
                     base >=4 && < 100
-                  , cgi
                   , network
                   , old-locale
                   , directory
@@ -58,8 +57,3 @@
                     Hack2.Contrib.Request
                     Hack2.Contrib.Response
                     Hack2.Contrib.Utils
-
-
-
-
-
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
@@ -9,13 +9,13 @@
 import Hack2.Contrib.Constants
 import Hack2.Contrib.Utils
 import Air.Env hiding (Default, def)
-import Network.CGI.Cookie
-import Network.CGI.Protocol
 import Prelude ()
 import qualified Data.ByteString.Char8 as B
 import Hack2.Contrib.AirBackports
 import Data.List (all)
 import Data.Char (isSpace)
+import Data.Text (Text, splitOn)
+import Data.Text.Encoding (decodeUtf8, encodeUtf8)
 
 
 input_bytestring :: Env -> IO ByteString
@@ -44,7 +44,7 @@
 media_type_params :: Env -> [(ByteString, ByteString)]
 media_type_params env
   | env.content_type.B.unpack.empty = []
-  | otherwise = 
+  | otherwise =
       env
         .content_type
         .B.unpack
@@ -69,41 +69,52 @@
 params env =
   if env.query_string.B.unpack.all isSpace
     then []
-    else env.query_string.B.unpack.formDecode.map_both (u2b > B.pack)
-
-inputs :: Env -> IO [(ByteString, ByteString)]
-inputs env = do
-  _body <- env.input_bytestring
-  return - 
-    env
-      .httpHeaders
-      .map_fst (B.unpack > upper > map (\x -> if x == '-' then '_' else x)) -- cgi env use all cap letters
-      .map_snd B.unpack
-      .(("REQUEST_METHOD", env.request_method.show) : ) -- for cgi request
-      .flip decodeInput (_body.s2l)
-      .fst
-      .concatMap to_headers
-      
+    else env.query_string.decodeUtf8.decode_params.map_both encodeUtf8
   where
-    to_headers (k, input) = case input.inputFilename of
-      Nothing -> [(k.B.pack, input.inputValue.l2s)]
-      Just name -> 
-        [  (k.B.pack, input.inputValue.l2s)
-        ,  ("hack2_input_file_name_" + k.B.pack, name.B.pack)
-        ]
+    decode_params :: Text -> [(Text, Text)]
+    decode_params x =
+      x.splitOn "&".map decode_pair
 
+    decode_pair :: Text -> (Text, Text)
+    decode_pair x =
+      case x.splitOn "=" of
+        [] -> ("", "")
+        [x] -> (x, "")
+        (x:y:_) -> (x,y)
+
+-- inputs :: Env -> IO [(ByteString, ByteString)]
+-- inputs env = do
+--   _body <- env.input_bytestring
+--   return -
+--     env
+--       .httpHeaders
+--       .map_fst (B.unpack > upper > map (\x -> if x == '-' then '_' else x)) -- cgi env use all cap letters
+--       .map_snd B.unpack
+--       .(("REQUEST_METHOD", env.request_method.show) : ) -- for cgi request
+--       .flip decodeInput (_body.s2l)
+--       .fst
+--       .concatMap to_headers
+--
+--   where
+--     to_headers (k, input) = case input.inputFilename of
+--       Nothing -> [(k.B.pack, input.inputValue.l2s)]
+--       Just name ->
+--         [  (k.B.pack, input.inputValue.l2s)
+--         ,  ("hack2_input_file_name_" + k.B.pack, name.B.pack)
+--         ]
+
 referer :: Env -> ByteString
 referer = httpHeaders > get _Referer > fromMaybe "/"
 
-cookies :: Env -> [(ByteString, ByteString)]
-cookies env = case env.httpHeaders.get _Cookie of
-  Nothing -> []
-  Just s -> s.B.unpack.readCookies .map_both B.pack
+-- cookies :: Env -> [(ByteString, ByteString)]
+-- cookies env = case env.httpHeaders.get _Cookie of
+--   Nothing -> []
+--   Just s -> s.B.unpack.readCookies .map_both B.pack
 
 fullpath :: Env -> ByteString
-fullpath env = 
-  if env.query_string.B.unpack.all isSpace 
-    then env.path 
+fullpath env =
+  if env.query_string.B.unpack.all isSpace
+    then env.path
     else env.path + "?" + env.query_string
 
 set_http_header :: ByteString -> ByteString -> Env -> Env
@@ -122,13 +133,13 @@
   ]
   .B.concat
   where
-    port_string = 
-      if (env.scheme.is "https" && env.port.is_not 443 || 
+    port_string =
+      if (env.scheme.is "https" && env.port.is_not 443 ||
           env.scheme.is "http" && env.port.is_not 80 )
         then ":" + env.server_port.show_bytestring
         else ""
 
 
 remote_host :: Env -> ByteString
-remote_host env = 
+remote_host env =
   ( env.hackHeaders + env.httpHeaders ) .lookup "RemoteHost" .fromMaybe ""
