diff --git a/Control/Monad/Journal.hs b/Control/Monad/Journal.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Journal.hs
@@ -0,0 +1,17 @@
+{- |
+Module      :  Control.Monad.Journal
+Description :  Journal monad class
+Copyright   :  (c) Dimitri Sabadie
+License     :  GPL-3
+
+Maintainer  :  dimitri.sabadie@gmail.com
+Stability   :  stable
+Portability :  portable
+
+-}
+
+module Control.Monad.Journal (
+    module X
+  ) where
+
+import Control.Monad.Journal.Class as X
diff --git a/Control/Monad/Journal/Class.hs b/Control/Monad/Journal/Class.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Journal/Class.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE FunctionalDependencies #-}
+
+{- |
+Module      :  Control.Monad.Journal.Class
+Description :  `MonadJournal` class
+Copyright   :  (c) Dimitri Sabadie
+License     :  GPL-3
+
+Maintainer  :  dimitri.sabadie@gmail.com
+Stability   :  stable
+Portability :  portable
+
+-}
+
+module Control.Monad.Journal.Class (
+    -- * MonadJournal
+    MonadJournal(..)
+  , sink
+  , absorb
+  ) where
+
+import Control.Monad ( Monad )
+import Control.Monad.Trans ( MonadIO, liftIO )
+import Data.Monoid ( Monoid, mappend, mempty )
+
+class (Monoid w, Monad m) => MonadJournal w m | m -> w where
+  -- |Log something.
+  journal :: w -> m ()
+  -- |Extract the logs history.
+  history :: m w
+  -- |Clear the logs history.
+  clear :: m ()
+  
+-- |Sink all logs history through `MonadIO` then clean it.
+sink :: (MonadJournal w m, MonadIO m) => (w -> IO ()) -> m ()
+sink out = history >>= liftIO . out >> clear
+
+-- |Absorb a logs history and pass around the value.
+absorb :: (MonadJournal w m) => (a,w) -> m a
+absorb (a,w) = journal w >> return a
diff --git a/Control/Monad/Trans/Journal.hs b/Control/Monad/Trans/Journal.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Trans/Journal.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+
+{- |
+Module      :  Control.Monad.Trans.Journal
+Description :  Journal monad transformer
+Copyright   :  (c) Dimitri Sabadie
+License     :  GPL-3
+
+Maintainer  :  dimitri.sabadie@gmail.com
+Stability   :  stable
+Portability :  portable
+
+-}
+
+module Control.Monad.Trans.Journal (
+    -- * LoggerT monad transformer
+    LoggerT
+  , runLoggerT
+  , module X
+  ) where
+
+import Control.Applicative ( Applicative )
+import Control.Monad.Journal.Class as X
+import Control.Monad.Trans ( MonadTrans, MonadIO )
+import Control.Monad.Trans.State ( StateT, get, modify, put, runStateT )
+import Data.Monoid ( Monoid(..) )
+
+newtype LoggerT w m a = LoggerT (StateT w m a) deriving (Applicative,Functor,Monad,MonadTrans,MonadIO)
+
+instance (Monoid w, Monad m) => MonadJournal w (LoggerT w m) where
+  journal = LoggerT . modify . flip mappend
+  history = LoggerT get
+  clear   = LoggerT (put mempty)
+
+runLoggerT :: (Monoid w, Monad m) => LoggerT w m a -> m (a,w)
+runLoggerT (LoggerT s) = runStateT s mempty
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/monad-journal.cabal b/monad-journal.cabal
new file mode 100644
--- /dev/null
+++ b/monad-journal.cabal
@@ -0,0 +1,29 @@
+name:                monad-journal
+license:             PublicDomain
+version:             0.1.0.0
+synopsis:            On-the-fly logging typeclass and monad transformer 
+description:         This package provides a typeclass for logging situations
+                     when you want to deal with the logs on-the-fly.
+                     It also exports a monad transformer that enables such a
+                     kind of logging in any monad.
+homepage:            https://github.com/skypers/monad-journal
+author:              DimitriSabadie
+maintainer:          dimitri.sabadie@gmail.com
+category:            Control
+build-type:          Simple
+
+cabal-version:       >= 1.10
+
+library
+  default-extensions:      FlexibleInstances
+                         , MultiParamTypeClasses
+  other-extensions:        FunctionalDependencies
+                         , GeneralizedNewtypeDeriving
+  exposed-modules:         Control.Monad.Journal
+                         , Control.Monad.Journal.Class
+                         , Control.Monad.Trans.Journal
+  build-depends:           base         >= 4.5 && < 4.6
+                         , mtl          == 2.1.*
+                         , transformers == 0.3.*
+  default-language:        Haskell2010
+  
