diff --git a/bamboo.cabal b/bamboo.cabal
--- a/bamboo.cabal
+++ b/bamboo.cabal
@@ -1,5 +1,5 @@
 Name:                 bamboo
-Version:              2009.5.18
+Version:              2009.5.18.1
 Build-type:           Simple
 Synopsis:             A simple blog middleware on hack
 Description:          A simple blog middleware on hack
@@ -47,6 +47,7 @@
                     Bamboo.Type.StaticWidget
                     Bamboo.Type.Reader
                     Bamboo.Type.Extension
+                    Bamboo.Type.Cache
                     
                     Bamboo.View.Atom.Tag
                     Bamboo.View.Atom.Post
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,11 @@
+2009.5.18.1
+-----------
+
+### Fix
+
+* Add Type.Cache to cabal
+
+
 2009.5.18
 ---------
 
diff --git a/src/Bamboo/Type/Cache.hs b/src/Bamboo/Type/Cache.hs
new file mode 100644
--- /dev/null
+++ b/src/Bamboo/Type/Cache.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+module Bamboo.Type.Cache (cache, cache'') where
+
+import Bamboo.Helper.Env hiding (body, name, get)
+import qualified Bamboo.Config.Global as G
+
+import qualified Data.ByteString.Char8 as C
+import qualified Database.TokyoCabinet as TC
+import Data.ByteString.Char8 (ByteString)
+    
+pack = u2b > C.pack
+unpack = C.unpack > b2u  
+cache_file = G.cache_uri
+
+set k v = TC.runTCM $ putsample cache_file [(k.pack, v.pack)]
+get k = do
+  v <- TC.runTCM $ getsample cache_file (k.pack)
+  return $ v ^ unpack
+
+cache g f x =
+  if G.use_cache 
+    then cache' g f x
+    else f x
+
+cache'' _ f x = f x
+
+-- etag generator -> value function -> model -> value
+cache' :: (a -> IO String) -> (a -> IO String) -> a -> (IO String)
+cache' g f x = do
+  k <- g x
+  c <- get k
+  case c of 
+    Nothing -> do
+      v <- f x
+      set k v
+      return v
+    Just v -> do
+      -- putStrLn $ "Cached: " ++ (v.take 20.u2b)
+      return v
+
+
+putsample :: String -> [(ByteString, ByteString)] -> TC.TCM Bool
+putsample file kv =
+    do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
+       TC.open tc file [TC.OWRITER, TC.OCREAT]
+       mapM (uncurry $ TC.put tc) kv
+       TC.close tc
+
+getsample :: String -> ByteString -> TC.TCM (Maybe ByteString)
+getsample file key =
+    do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
+       TC.open tc file [TC.OREADER]
+       val <- TC.get tc key
+       TC.close tc
+       return val
+
+  
