diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,10 @@
+2009.11.1
+---------
+
+### Fix
+
+* flush io in simple access logger
+
 2009.8.18
 ---------
 
diff --git a/hack-contrib.cabal b/hack-contrib.cabal
--- a/hack-contrib.cabal
+++ b/hack-contrib.cabal
@@ -1,5 +1,5 @@
 Name:                 hack-contrib
-Version:              2009.8.18
+Version:              2009.11.1
 Build-type:           Simple
 Synopsis:             Hack contrib
 Description:          Common middlewares and utilities that helps working with Hack
@@ -15,7 +15,24 @@
 
 library
   ghc-options: -Wall
-  build-depends: base >=4 && < 5, cgi, network, haskell98, old-locale, old-time, directory, filepath, containers, bytestring, ansi-wl-pprint, data-default >= 0.2, ansi-wl-pprint, time, pureMD5, mps >= 2009.8.18.1, hack >= 2009.7.15
+  build-depends: 
+                    base >=4 && < 5
+                  , cgi
+                  , network
+                  , haskell98
+                  , old-locale
+                  , old-time
+                  , directory
+                  , filepath
+                  , containers
+                  , bytestring
+                  , data-default >= 0.2
+                  , time
+                  , pureMD5
+                  , mps >= 2009.9.18
+                  , hack >= 2009.10.30
+                  , utf8-string
+                  , ansi-wl-pprint
   hs-source-dirs: src/
   exposed-modules:  
                     
@@ -29,7 +46,6 @@
                     Hack.Contrib.Middleware.ETag
                     Hack.Contrib.Middleware.File
                     Hack.Contrib.Middleware.Head
-                    Hack.Contrib.Middleware.Hub
                     Hack.Contrib.Middleware.Inspect
                     Hack.Contrib.Middleware.Lambda
                     Hack.Contrib.Middleware.Lucky
@@ -37,10 +53,12 @@
                     Hack.Contrib.Middleware.RegexpRouter
                     Hack.Contrib.Middleware.ShowExceptions
                     Hack.Contrib.Middleware.SimpleAccessLogger
+                    Hack.Contrib.Middleware.Hub
                     Hack.Contrib.Middleware.Static
                     Hack.Contrib.Middleware.URLMap
                     Hack.Contrib.Middleware.IOConfig
                     Hack.Contrib.Middleware.UserMime
+                    Hack.Contrib.Middleware.UTF8Body
                     Hack.Contrib.Mime
                     Hack.Contrib.Request
                     Hack.Contrib.Response
diff --git a/src/Hack/Contrib/Middleware/SimpleAccessLogger.hs b/src/Hack/Contrib/Middleware/SimpleAccessLogger.hs
--- a/src/Hack/Contrib/Middleware/SimpleAccessLogger.hs
+++ b/src/Hack/Contrib/Middleware/SimpleAccessLogger.hs
@@ -2,21 +2,35 @@
 
 import Data.Maybe
 import Hack
-import Hack.Contrib.Middleware.Hub
-import Hack.Contrib.Request
+import Hack.Contrib.Request hiding (referer)
+import Hack.Contrib.Constants
 import Hack.Contrib.Utils
-import MPS.Light
-import Prelude hiding ((.), (^), (>), log)
+import MPS (simple_time_format)
+import MPS.Env
+import Data.Maybe
+import Prelude ()
+import qualified Data.ByteString.Char8 as B
+import System.IO
 
 
-program :: String
-program = "SimpleAccessLogger"
-
 simple_access_logger :: Maybe (String -> IO ()) -> Middleware
 simple_access_logger stream app = \env -> do
-  let my_stream = stream.fromMaybe (env.hack_errors)
-  let log       = simple_logger my_stream program
-
-  Info .log (env.url.unescape_uri)
+  r <- app env
+  time <- now ^ format_time simple_time_format 
+  let puts' x     = x.B.pack.B.putStrLn >> hFlush stdout
+      puts        = stream.fromMaybe puts'
+      method      = env.request_method.show
+      http_status = env.hack_url_scheme.show 
+      access_path = env.fullpath.unescape_uri
+      
+      fields =
+        [ env.remote_host
+        , "-"
+        , "[" ++ time ++ "]"
+        , "\"" ++ method ++ " " ++ access_path ++ " " ++ http_status ++ "\""
+        , r.status.show
+        , r.headers.get _ContentLength .fromMaybe "-"
+        ]
   
-  app env
+  puts - fields.join " "
+  return r
diff --git a/src/Hack/Contrib/Middleware/UTF8Body.hs b/src/Hack/Contrib/Middleware/UTF8Body.hs
new file mode 100644
--- /dev/null
+++ b/src/Hack/Contrib/Middleware/UTF8Body.hs
@@ -0,0 +1,14 @@
+module Hack.Contrib.Middleware.UTF8Body (utf8_body) where
+
+import MPS.Env
+import Prelude ()
+import MPS.Heavy
+import Hack
+import Data.ByteString.Lazy.Char8 (unpack)
+import Data.ByteString.Lazy.UTF8 (fromString)
+
+utf8_body :: Middleware
+utf8_body app = \env -> do
+  r <- app env
+  let raw_body = r.body
+  return r {body = raw_body.unpack.unescape_xml.fromString}
diff --git a/src/Hack/Contrib/Utils.hs b/src/Hack/Contrib/Utils.hs
--- a/src/Hack/Contrib/Utils.hs
+++ b/src/Hack/Contrib/Utils.hs
@@ -80,6 +80,7 @@
 hack_input        :: Env -> ByteString
 hack_errors       :: Env -> HackErrors
 custom            :: Env -> [(String, String)]
+remote_host       :: Env -> String
 
 request_method  = requestMethod
 script_name     = scriptName
@@ -92,4 +93,5 @@
 hack_input      = hackInput
 hack_errors     = hackErrors
 custom          = hackHeaders
+remote_host     = remoteHost
 
