diff --git a/apiary-session.cabal b/apiary-session.cabal
--- a/apiary-session.cabal
+++ b/apiary-session.cabal
@@ -1,5 +1,5 @@
 name:                apiary-session
-version:             1.2.0
+version:             1.3.0
 synopsis:            session support for apiary web framework.
 description:
 license:             MIT
@@ -8,7 +8,7 @@
 maintainer:          HirotomoMoriwaki<philopon.dependence@gmail.com>
 Homepage:            https://github.com/philopon/apiary
 Bug-reports:         https://github.com/philopon/apiary/issues
-copyright:           (c) 2014 Hirotomo Moriwaki
+copyright:           (c) 2014-2015 Hirotomo Moriwaki
 category:            Web
 build-type:          Simple
 stability:           experimental
@@ -20,8 +20,9 @@
                        Web.Apiary.Session.Internal
   other-modules:       
   build-depends:       base               >=4.6   && <4.8
-                     , apiary             >=1.2   && <1.3
+                     , apiary             >=1.3   && <1.4
                      , wai                >=3.0   && <3.1
+                     , web-routing
   hs-source-dirs:      src
   ghc-options:         -O2 -Wall
   default-language:    Haskell2010
diff --git a/src/Web/Apiary/Session.hs b/src/Web/Apiary/Session.hs
--- a/src/Web/Apiary/Session.hs
+++ b/src/Web/Apiary/Session.hs
@@ -16,16 +16,16 @@
 
 import Control.Monad(mzero)
 
-import Control.Monad.Apiary(ApiaryT)
-import Control.Monad.Apiary.Action(ActionT, getParams)
-import Control.Monad.Apiary.Filter(focus, Doc(DocPrecondition))
+import Control.Monad.Apiary.Action(ActionT)
+import Control.Monad.Apiary.Filter(focus, Filter, Doc(DocPrecondition))
 
 import Web.Apiary.Session.Internal
     (Session(Session), backendGet, backendSet, backendDelete)
 
 import Data.Apiary.Extension(Has, getExt)
 import Data.Apiary.Compat(Proxy(Proxy), KnownSymbol)
-import qualified Data.Apiary.Dict as Dict
+import qualified Network.Routing.Dict as Dict
+import qualified Network.Routing as R
 
 -- | get session provided type.
 getSession :: (Has (Session sess m) exts, Monad m) => proxy sess -> ActionT exts prms m (Maybe sess)
@@ -47,23 +47,20 @@
     backendDelete b
 
 -- | filter by has session or not.
-session' :: (Has (Session sess actM) exts, KnownSymbol key, Monad actM, Dict.NotMember key kvs)
+session' :: (Has (Session sess actM) exts, KnownSymbol key, Monad actM, key Dict.</ kvs)
          => kProxy key -> sProxy sess
-         -> ApiaryT exts (key Dict.:= sess ': kvs) actM m ()
-         -> ApiaryT exts kvs actM m ()
-session' ky p = focus (DocPrecondition "session cookie required.") $ do
-    dict <- getParams
+         -> Filter exts actM m kvs (key Dict.:= sess ': kvs)
+session' ky p = focus (DocPrecondition "session cookie required.") Nothing $ R.raw "session" $ \d t ->
     getSession p >>= \case
         Nothing -> mzero
-        Just s  -> return $ Dict.insert ky s dict
+        Just s  -> return (Dict.add ky s d, t)
 
 -- | filter by has session or not. use \"session\" dict key.
 --
 -- @
 -- session = session' (Proxy :: Proxy "session")
 -- @
-session :: (Has (Session sess actM) exts, Monad actM, Dict.NotMember "session" kvs)
+session :: (Has (Session sess actM) exts, Monad actM, "session" Dict.</ kvs)
         => proxy sess
-        -> ApiaryT exts ("session" Dict.:= sess ': kvs) actM m ()
-        -> ApiaryT exts kvs actM m ()
+        -> Filter exts actM m kvs ("session" Dict.:= sess ': kvs)
 session = session' (Proxy :: Proxy "session")
