diff --git a/apiary-cookie.cabal b/apiary-cookie.cabal
--- a/apiary-cookie.cabal
+++ b/apiary-cookie.cabal
@@ -1,5 +1,5 @@
 name:                apiary-cookie
-version:             0.4.0.0
+version:             0.4.1.0
 x-revision:          1
 synopsis:            Cookie support for apiary web framework.
 description:
@@ -27,7 +27,6 @@
                      , apiary             >=0.4   && <0.5
                      , cookie             >=0.4   && <0.5
                      , clientsession      >=0.9   && <0.10
-                     , reflection         >=1.4   && <1.5
                      , blaze-builder      >=0.3   && <0.4
                      , data-default-class >=0.0   && <0.1
 
diff --git a/src/Web/Apiary/Cookie.hs b/src/Web/Apiary/Cookie.hs
--- a/src/Web/Apiary/Cookie.hs
+++ b/src/Web/Apiary/Cookie.hs
@@ -3,8 +3,9 @@
 --
 -- @
 -- {-# LANGUAGE QuasiQuotes #-}
--- {-# LANGUAGE FlexibleContexts #-} -- for reflection
 -- {-# LANGUAGE OverloadedStrings #-}
+-- {-# LANGUAGE NoMonomorphismRestriction #-} -- for implicit signature
+-- {-# LANGUAGE FlexibleContexts #-} -- for explicit signature
 --
 -- import Web.Apiary
 -- import Web.Apiary.Cookie
@@ -30,19 +31,15 @@
 --     root $ action_ splittedAction
 -- @
 --
--- In splitted action, you must add sigunature
--- with 'Given' 'Cookie' ristriction.
---
 -- 'getCookie' functions, get and auto decrypt cookie.
 --
 -- @
--- splittedAction :: (Monad m, Given Cookie) => ActionT m ()
+-- splittedAction :: (Monad m, HasCookie) => ActionT m ()
 -- splittedAction = do
 --     s <- 'getCookie'' "param"
 --     p <- 'getCookie'' "dog"
 --     contentType "text/plain"
 --     lbs $ L.unlines [L.fromStrict s, L.fromStrict p]
--- 
 -- @
 --
 -- * first, access localhost:3000, 404 page not found shown.
@@ -57,7 +54,7 @@
 --
 
 module Web.Apiary.Cookie 
-    ( Cookie
+    ( HasCookie
     , CookieConfig(..)
     , withCookie
     -- * setter
@@ -66,11 +63,12 @@
     , getCookies, getCookies'
     , getCookie, getCookie'
     -- * Reexport
-    , def
-    , SetCookie(..)
-    , Given
+    -- | SetCookie(..)
+    , module Web.Cookie
+    -- | def
+    , module Data.Default.Class
     ) where
 
-import Web.Cookie
+import Web.Cookie (SetCookie(..))
+import Data.Default.Class
 import Web.Apiary.Cookie.Internal
-import Data.Reflection
diff --git a/src/Web/Apiary/Cookie/Internal.hs b/src/Web/Apiary/Cookie/Internal.hs
--- a/src/Web/Apiary/Cookie/Internal.hs
+++ b/src/Web/Apiary/Cookie/Internal.hs
@@ -4,6 +4,8 @@
 {-# LANGUAGE NoMonomorphismRestriction #-}
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE ImplicitParams #-}
+{-# LANGUAGE ConstraintKinds #-}
 
 module Web.Apiary.Cookie.Internal where
 
@@ -18,7 +20,6 @@
 import Blaze.ByteString.Builder
 import qualified Data.ByteString as S
 import Data.Default.Class
-import Data.Reflection
 
 newtype Cookie = Cookie
     { key :: Key
@@ -30,33 +31,34 @@
 instance Default CookieConfig where
     def = CookieConfig defaultKeyFile
 
+type HasCookie = ?webApiaryCookieCookie :: Cookie
+
 -- | Give cookie encryption key.
-withCookie :: CookieConfig -> (Given Cookie => IO b) -> IO b
+withCookie :: CookieConfig -> (HasCookie => IO b) -> IO b
 withCookie conf f = do
     k <- getKey $ keyFile conf
-    give (Cookie k) f
-
-setCookie :: (MonadIO m, Given Cookie) => SetCookie -> ActionT m ()
+    let ?webApiaryCookieCookie = Cookie k
+    f
+setCookie :: (MonadIO m, HasCookie) => SetCookie -> ActionT m ()
 setCookie sc = do
-    v' <- liftIO $ encryptIO (key given) (setCookieValue sc) 
+    v' <- liftIO $ encryptIO (key ?webApiaryCookieCookie) (setCookieValue sc) 
     let s = toByteString . renderSetCookie $ sc { setCookieValue = v' }
     addHeader "set-cookie" s
 
 -- | get cookies. first Maybe indicate cookie header exists or not, 
 -- second Maybe indicate decryption status.
-getCookies :: (Monad m, Given Cookie) => ActionT m (Maybe [(S.ByteString, Maybe S.ByteString)])
+getCookies :: (Monad m, HasCookie) => ActionT m (Maybe [(S.ByteString, Maybe S.ByteString)])
 getCookies = runMaybeT $ do
     raw <- MaybeT $ getRequestHeader "cookie"
-    return $ map (\(k,v) -> (k, decrypt (key given) v)) $ parseCookies raw
+    return $ map (\(k,v) -> (k, decrypt (key ?webApiaryCookieCookie) v)) $ parseCookies raw
 
 -- | like 'getCookies', but when cookie header isn't exists, pass next handler.
-getCookies' :: (Monad m, Given Cookie) => ActionT m [(S.ByteString, Maybe S.ByteString)]
+getCookies' :: (Monad m, HasCookie) => ActionT m [(S.ByteString, Maybe S.ByteString)]
 getCookies' = getCookies >>= maybe mzero return
 
 -- | get cookie of specific key.
-getCookie :: (Monad m, Given Cookie) => S.ByteString -> ActionT m (Maybe S.ByteString)
+getCookie :: (Monad m, HasCookie) => S.ByteString -> ActionT m (Maybe S.ByteString)
 getCookie k = getCookies >>= return . maybe Nothing (join . lookup k)
 
-getCookie' :: (Monad m, Given Cookie) => S.ByteString -> ActionT m S.ByteString
+getCookie' :: (Monad m, HasCookie) => S.ByteString -> ActionT m S.ByteString
 getCookie' k = getCookie k >>= maybe mzero return
-
