diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2009, IIJ Innovation Institute Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+  * Neither the name of the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/Network/Wai/Logger/Prefork.hs b/Network/Wai/Logger/Prefork.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Logger/Prefork.hs
@@ -0,0 +1,41 @@
+module Network.Wai.Logger.Prefork (
+    logCheck
+  , logInit
+  , logController
+  , ApacheLogger
+  , LogType(..)
+  , IPAddrSource(..)
+  , FileLogSpec(..)
+  , LogController
+  ) where
+
+import Control.Concurrent
+import Control.Monad
+import Network.Wai.Logger
+import Network.Wai.Logger.Prefork.File
+import Network.Wai.Logger.Prefork.Stdout
+import Network.Wai.Logger.Prefork.Types
+import System.Log.FastLogger
+
+logCheck :: LogType -> IO ()
+logCheck LogNone   = return ()
+logCheck LogStdout = return ()
+logCheck (LogFile spec) = check spec
+
+logInit :: IPAddrSource -> LogType -> IO ApacheLogger
+logInit _ LogNone            = noLoggerInit
+logInit ipsrc LogStdout      = stdoutLoggerInit ipsrc
+logInit ipsrc (LogFile spec) = fileLoggerInit ipsrc spec
+
+noLoggerInit :: IO ApacheLogger
+noLoggerInit = return noLogger
+  where
+    noLogger _ _ _ = return ()
+
+logController :: LogType -> LogController
+logController LogNone        = noLoggerController
+logController LogStdout      = noLoggerController
+logController (LogFile spec) = fileLoggerController spec
+
+noLoggerController :: LogController
+noLoggerController _ = forever $ threadDelay 10000000
diff --git a/Network/Wai/Logger/Prefork/File.hs b/Network/Wai/Logger/Prefork/File.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Logger/Prefork/File.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DoAndIfThenElse #-}
+
+module Network.Wai.Logger.Prefork.File where
+
+import Control.Applicative
+import Control.Concurrent
+import Control.Exception (handle, SomeException, catch)
+import Control.Monad
+import Data.IORef
+import Network.Wai.Logger
+import Network.Wai.Logger.Prefork.Types
+import Prelude hiding (catch)
+import System.IO
+import System.Log.FastLogger
+import System.Posix
+
+----------------------------------------------------------------
+
+logBufSize :: Int
+logBufSize = 4096
+
+----------------------------------------------------------------
+
+newtype HandleRef = HandleRef (IORef Handle)
+
+getHandle :: HandleRef -> IO Handle
+getHandle (HandleRef ref) = readIORef ref
+
+----------------------------------------------------------------
+
+fileLoggerInit :: IPAddrSource -> FileLogSpec -> IO ApacheLogger
+fileLoggerInit ipsrc spec = do
+    hdl <- open spec
+    hdlref <- HandleRef <$> newIORef hdl
+    forkIO $ fileFlusher hdlref
+    dateref <- dateInit
+    installHandler sigUSR1 (Catch $ reopen spec hdlref) Nothing
+    return $ fileLogger ipsrc dateref hdlref
+
+{-
+ For BlockBuffering, hPut flushes the buffer before writing
+ the target string. In other words, hPut does not split
+ the target string. So, to implment multiple line buffering,
+ just use BlockBuffering.
+-}
+open :: FileLogSpec -> IO Handle
+open spec = do
+    hdl <- openFile file AppendMode
+    hSetBuffering hdl (BlockBuffering (Just logBufSize))
+    return hdl
+  where
+    file = log_file spec
+
+reopen :: FileLogSpec -> HandleRef -> IO ()
+reopen spec (HandleRef ref) = do
+    hdl <- open spec
+    oldhdl <- atomicModifyIORef ref (\oh -> (hdl,oh))
+    hClose oldhdl
+
+----------------------------------------------------------------
+
+fileLogger :: IPAddrSource -> DateRef -> HandleRef -> ApacheLogger
+fileLogger ipsrc dateref hdlref req status msiz = do
+    date <- getDate dateref
+    hdl <- getHandle hdlref
+    hPutLogStr hdl $ apacheFormat ipsrc date req status msiz
+
+fileFlusher :: HandleRef -> IO ()
+fileFlusher hdlref = forever $ do
+    threadDelay 10000000
+    getHandle hdlref >>= hFlush
+
+----------------------------------------------------------------
+
+fileLoggerController :: FileLogSpec -> LogController
+fileLoggerController spec pids = forever $ do
+    isOver <- over
+    when isOver $ do
+        rotate spec
+        mapM_ sendSignal pids
+    threadDelay 10000000
+  where
+    file = log_file spec
+    over = handle handler $ do
+        siz <- fromIntegral . fileSize <$> getFileStatus file
+        if siz > log_file_size spec then
+            return True
+        else
+            return False
+    sendSignal pid = signalProcess sigUSR1 pid `catch` ignore
+    handler :: SomeException -> IO Bool
+    handler _ = return False
+    ignore :: SomeException -> IO ()
+    ignore _ = return ()
diff --git a/Network/Wai/Logger/Prefork/Stdout.hs b/Network/Wai/Logger/Prefork/Stdout.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Logger/Prefork/Stdout.hs
@@ -0,0 +1,21 @@
+module Network.Wai.Logger.Prefork.Stdout (stdoutLoggerInit) where
+
+import Control.Applicative
+import qualified Data.ByteString as BS
+import Data.ByteString.Char8 (pack)
+import Network.Wai.Logger
+import Network.Wai.Logger.Prefork.Types
+import System.Log.FastLogger
+
+stdoutLoggerInit :: IPAddrSource -> IO ApacheLogger
+stdoutLoggerInit ipsrc = stdoutLogger ipsrc <$> dateInit
+
+stdoutLogger :: IPAddrSource -> DateRef -> ApacheLogger
+stdoutLogger ipsrc dateref req status msiz = do
+    date <- getDate dateref
+    putToStdout $ logmsg date
+  where
+    putToStdout = BS.putStr . BS.concat . map toBS
+    logmsg date = apacheFormat ipsrc date req status msiz
+    toBS (LS s) = pack s
+    toBS (LB s) = s
diff --git a/Network/Wai/Logger/Prefork/Types.hs b/Network/Wai/Logger/Prefork/Types.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Logger/Prefork/Types.hs
@@ -0,0 +1,17 @@
+module Network.Wai.Logger.Prefork.Types (
+    ApacheLogger
+  , FileLogSpec(..)
+  , LogType(..)
+  , LogController
+  ) where
+
+import Network.HTTP.Types
+import Network.Wai
+import System.Log.FastLogger
+import System.Posix (ProcessID)
+
+data LogType = LogNone | LogStdout | LogFile FileLogSpec
+
+type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()
+
+type LogController = [ProcessID] -> IO ()
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/wai-logger-prefork.cabal b/wai-logger-prefork.cabal
new file mode 100644
--- /dev/null
+++ b/wai-logger-prefork.cabal
@@ -0,0 +1,22 @@
+Name:                   wai-logger-prefork
+Version:                0.1.0
+Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
+Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
+License:                BSD3
+License-File:           LICENSE
+Synopsis:               A logging system for preforked WAI apps
+Description:            A logging system for preforked WAI apps
+Category:               Web, Yesod
+Cabal-Version:          >= 1.6
+Build-Type:             Simple
+library
+  GHC-Options:          -Wall -fno-warn-unused-do-bind
+  Exposed-Modules:      Network.Wai.Logger.Prefork
+  Other-Modules:        Network.Wai.Logger.Prefork.File
+                        Network.Wai.Logger.Prefork.Stdout
+                        Network.Wai.Logger.Prefork.Types
+  Build-Depends:        base >= 4 && < 5, unix, bytestring,
+                        wai, fast-logger, wai-logger, http-types
+Source-Repository head
+  Type:                 git
+  Location:             git://github.com/kazu-yamamoto/wai-logger-prefork.git
