diff --git a/bamboo.cabal b/bamboo.cabal
--- a/bamboo.cabal
+++ b/bamboo.cabal
@@ -1,5 +1,5 @@
 Name:                 bamboo
-Version:              2009.4.27
+Version:              2009.4.30
 Build-type:           Simple
 Synopsis:             A simple blog engine on Hack
 Description:          A simple blog engine on Hack
@@ -15,7 +15,7 @@
 
 library
   ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-name-shadowing -fno-warn-orphans -fno-warn-type-defaults
-  build-depends: base, cgi, network, haskell98, old-locale, old-time, time, unix, bytestring, template, base64-string, zlib, directory, ansi-wl-pprint, filepath, containers, process, mps >= 2008.11.6, parsedate >= 3000.0.0, rss >= 3000.0.1, xhtml, kibro >= 0.4.2, utf8-string >= 0.3.3, pandoc, parsec >= 2, MissingH, gravatar >= 0.3, data-default >= 0.2, hcheat >= 2008.11.6, hack >= 2009.4.28
+  build-depends: base, cgi, network, haskell98, old-locale, old-time, time, unix, bytestring, template, base64-string, zlib, directory, ansi-wl-pprint, filepath, containers, process, mps >= 2008.11.6, parsedate >= 3000.0.0, rss >= 3000.0.1, xhtml, kibro >= 0.4.2, utf8-string >= 0.3.3, pandoc, parsec >= 2, MissingH, gravatar >= 0.3, data-default >= 0.2, hcheat >= 2008.11.6, hack >= 2009.4.30, hack-contrib >= 2009.4.30
   hs-source-dirs: src/
   exposed-modules:  
                     Bamboo
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -3,6 +3,13 @@
 
 ### Feature
 
+* use new hack structure
+
+2009.4.27
+----------
+
+### Feature
+
 * middleware should be in Main.hs too, so bamboo is just an other middleware that can be plugged into any webapp
 
 2009.4.26
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -54,23 +54,34 @@
 
 ## Install
 
-### With Hyena handler
+### Install Bamboo Middleware
 
+
 #### update cabal
 
     cabal update
-    
-#### install hyena
 
+#### install bamboo
+
+    cabal install happy
+    cabal install rss
+    cabal install hack
+    cabal install hack-contrib
+    cabal install bamboo
+
+### Choose a hack handler
+
+#### Hyena
+
+##### install hyena
+
     git clone git://github.com/tibbe/hyena.git
     cd hyena
     cabal install
-
-#### install bamboo
-
-    cabal install happy; cabal install rss; cabal install bamboo
+    
+    cabal install hack-handler-hyena
 
-#### get a starter kit ( template )
+##### get a starter kit ( template )
 
     mkdir myblog
     cd myblog
@@ -78,7 +89,7 @@
     # get a template to start
     git clone git://github.com/nfjinjing/bamboo-template.git db
     
-#### create an entry point
+##### create an entry point
     
 put this into Main.hs
     
@@ -123,30 +134,21 @@
     main = run app
     
 
-#### run
+##### run
 
     ghc --make -O2 Main.hs
     ./Main
 
 It should be running on [http://127.0.0.1:3000](http://127.0.0.1:3000) now.
 
-### With Kibro handler
-
-#### update cabal
-
-    cabal update
-
-#### install hyena
-
-    git clone git://github.com/tibbe/hyena.git
-    cd hyena
-    cabal install
+#### Kibro
 
-#### install bamboo
+##### Install Kibro
 
-    cabal install happy; cabal install rss; cabal install bamboo
+    cabal install kibro
+    cabal install hack-handler-kibro
 
-### Install lighttpd 1.4.19 (used by kibro)
+##### Install lighttpd 1.4.19 (used by kibro)
 
     wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.gz
     tar zxfv lighttpd-1.4.19.tar.gz
@@ -155,8 +157,12 @@
     make
     make install
 
-#### bootstrap
+make sure `~/sbin` is in your `$PATH`.
 
+You also need [spawn-fcgi](http://redmine.lighttpd.net/projects/spawn-fcgi) in your path. I don't remember how I got mine, but it should come with lighttpd somewhere ...
+
+##### bootstrap
+
     # bamboo is a kibro project
     kibro new myblog
     cd myblog
@@ -165,7 +171,7 @@
     git clone git://github.com/nfjinjing/bamboo-template.git db
     sh db/extra/scripts/bootstrap.sh
     
-#### run
+##### run
 
     kibro start
 
@@ -173,5 +179,5 @@
 
 ## Links
 
-* [Hack](http://github.com/nfjinjing/hack/tree)
-* [Source](http://github.com/nfjinjing/bamboo/tree)
+* [Hack](http://github.com/nfjinjing/hack)
+* [Hack Contrib](http://github.com/nfjinjing/hack-contrib)
diff --git a/src/Bamboo.hs b/src/Bamboo.hs
--- a/src/Bamboo.hs
+++ b/src/Bamboo.hs
@@ -10,11 +10,8 @@
 
 import Bamboo.Controller.Application (paths)
 
-import Hack.Utils
 import Hack
-import Hack.Contrib.RawRouter
-
-import qualified Hack.Contrib.Head as H
+import Hack.Contrib.Middleware.RawRouter
 
 bamboo :: MiddleWare
 bamboo = route paths 
diff --git a/src/Bamboo/Controller/Application.hs b/src/Bamboo/Controller/Application.hs
--- a/src/Bamboo/Controller/Application.hs
+++ b/src/Bamboo/Controller/Application.hs
@@ -74,7 +74,7 @@
   
   posts.mapM (init_post tags) ^ PostV.list state >>= output_html
 
-index_feed env = do
+index_feed _ = do
   posts <- list
   posts.RSSV.rss "" "" .output_html
 
diff --git a/src/Bamboo/Helper/Helper.hs b/src/Bamboo/Helper/Helper.hs
--- a/src/Bamboo/Helper/Helper.hs
+++ b/src/Bamboo/Helper/Helper.hs
@@ -8,15 +8,12 @@
 module Bamboo.Helper.Helper where
 
 import Bamboo.Helper.PreludeEnv
-import Network.URI
 import Network.CGI
 
 import Text.XHtml.Strict hiding (p, meta, body)
 import qualified Text.XHtml.Strict as Html
-import Control.Monad hiding (join)
 import Data.Maybe
 import qualified Bamboo.Type.Pager as Pager
-import Char
 import Data.List hiding (length)
 import qualified Data.List as L 
 import Bamboo.Type.Reader
@@ -24,7 +21,6 @@
 import System.Time
 import qualified Prelude as P
 import Data.Default
-import Data.Map (Map)
 import System.Directory
 import Hack
 
diff --git a/src/Bamboo/Helper/StateHelper.hs b/src/Bamboo/Helper/StateHelper.hs
--- a/src/Bamboo/Helper/StateHelper.hs
+++ b/src/Bamboo/Helper/StateHelper.hs
@@ -7,7 +7,6 @@
 
 import Bamboo.Helper.Env
 import qualified Bamboo.Config.Global as G
-import Hack
 
 -- G.root = /blog
 -- raw_uri = blog/x
diff --git a/src/Bamboo/Model/Album.hs b/src/Bamboo/Model/Album.hs
--- a/src/Bamboo/Model/Album.hs
+++ b/src/Bamboo/Model/Album.hs
@@ -5,7 +5,6 @@
 -- env
 import Bamboo.Helper.Env hiding (title, body, size, path, meta, get)
 import qualified Bamboo.Config.Global as G
-import Bamboo.Helper.StateHelper
 import Bamboo.Helper.ThumbHelper
 import List (sort)
 
diff --git a/src/Bamboo/Model/Comment.hs b/src/Bamboo/Model/Comment.hs
--- a/src/Bamboo/Model/Comment.hs
+++ b/src/Bamboo/Model/Comment.hs
@@ -77,7 +77,6 @@
 instance Mappable Comment where
   from_assoc h = do
     let at s    = h.lookup (s.show_data) .fromJust
-    let body    = at Body
     let post_id = at PostId
 
     timestamp <- ( getClockTime >>= toCalendarTime ) ^ format_time G.comment_date_format
diff --git a/src/Bamboo/Model/Static.hs b/src/Bamboo/Model/Static.hs
--- a/src/Bamboo/Model/Static.hs
+++ b/src/Bamboo/Model/Static.hs
@@ -3,7 +3,6 @@
 
 -- env
 import Bamboo.Helper.Env hiding (match, body)
-import qualified Bamboo.Config.Global as G
 import Bamboo.Type.Reader
 import Bamboo.Model.Helper
 
diff --git a/src/Bamboo/Model/Video.hs b/src/Bamboo/Model/Video.hs
--- a/src/Bamboo/Model/Video.hs
+++ b/src/Bamboo/Model/Video.hs
@@ -4,8 +4,6 @@
 
 -- env
 import Bamboo.Helper.Env hiding (title, body, size, path, meta, get, width, height)
-import qualified Bamboo.Config.Global as G
-import Bamboo.Helper.StateHelper
 
 data VideoType = MediaPlayer deriving (Eq, Show, Read)
 
diff --git a/src/Bamboo/Type/Plugin.hs b/src/Bamboo/Type/Plugin.hs
--- a/src/Bamboo/Type/Plugin.hs
+++ b/src/Bamboo/Type/Plugin.hs
@@ -4,8 +4,8 @@
 import Bamboo.Helper.Env hiding (body, name)
 import qualified Bamboo.Model.Album as Album
 import qualified Bamboo.Model.Video as V
-import qualified Bamboo.View.Atom.Album as AlbumV
-import qualified Bamboo.View.Atom.Video as VV
+import qualified Bamboo.View.Atom.Album as AlbumV ()
+import qualified Bamboo.View.Atom.Video as VV ()
 
 data PluginType = PhotoAlbum | Video | None deriving (Show, Eq)
 
@@ -43,10 +43,10 @@
 
 match_result x = x.fromJust.snd.first.snd.b2u
 
-apply_plugin x = if r.isNothing then return x else r.sub_it where
+apply_plugin x = if r.isNothing then return x else sub_it where
   r = x.optimized_match
   plugin = r.match_result.parse_plugin
-  sub_it y = case plugin.plugin_type of
+  sub_it = case plugin.plugin_type of
     None -> return x
     PhotoAlbum -> do 
       album <- plugin.args.Album.from_list ^ render_plugin
diff --git a/src/Bamboo/View/Atom/Album.hs b/src/Bamboo/View/Atom/Album.hs
--- a/src/Bamboo/View/Atom/Album.hs
+++ b/src/Bamboo/View/Atom/Album.hs
@@ -3,7 +3,6 @@
   
 import Bamboo.Helper.Env hiding (name, id)
 import Bamboo.Model.Album
-import qualified Bamboo.Config.Global as G
 import Bamboo.Helper.Html
 
 instance DataRenderer Album where
@@ -21,11 +20,11 @@
       link l << img ! [src i, alt t]
 
 show_slide_viewer x = ul ! [id "slide-viewer", klass "svw"] << x.data_list.map picture_li where 
-  picture_li (l, t, i) = li << 
+  picture_li (_, t, i) = li << 
     img ! [src i, alt t]
 
 show_galleria x = ul ! [klass "gallery"] << x.data_list.map picture_li where 
-  picture_li (l, t, i) = li << 
+  picture_li (_, t, i) = li << 
     img ! [src i, alt t]
 
 show_fade x = ul ! [klass "fade-album"] << x.data_list.map picture_li where 
diff --git a/src/Bamboo/View/Atom/Video.hs b/src/Bamboo/View/Atom/Video.hs
--- a/src/Bamboo/View/Atom/Video.hs
+++ b/src/Bamboo/View/Atom/Video.hs
@@ -3,7 +3,6 @@
   
 import Bamboo.Helper.Env hiding (name, id)
 import Bamboo.Model.Video
-import qualified Bamboo.Config.Global as G
 import Bamboo.Helper.Html
 
 instance DataRenderer Video where
