diff --git a/Control/CP/Herbrand/HerbrandT.hs b/Control/CP/Herbrand/HerbrandT.hs
--- a/Control/CP/Herbrand/HerbrandT.hs
+++ b/Control/CP/Herbrand/HerbrandT.hs
@@ -21,7 +21,10 @@
 import Control.CP.Herbrand.Herbrand (HState, Unify, HTerm,initState,addH,newvarH)
 
 newtype HerbrandT t s a = HerbrandT { unHT :: StateT (HState t (HerbrandT t s)) s a }
-  deriving Monad
+
+instance Monad s => Monad (HerbrandT t s) where
+  return   = HerbrandT . return
+  m >>= f  = HerbrandT $ unHT m >>= unHT . f 
 
 instance MonadTrans (HerbrandT t) where
   lift = HerbrandT . lift
diff --git a/Control/CP/SearchTree.hs b/Control/CP/SearchTree.hs
--- a/Control/CP/SearchTree.hs
+++ b/Control/CP/SearchTree.hs
@@ -9,9 +9,15 @@
 
 module Control.CP.SearchTree  where
 
-import Monad
 import Control.CP.Solver
 
+import Control.Monad
+import Control.Monad.Reader
+import Control.Monad.Writer
+import Control.Monad.State
+
+import Data.Monoid
+
 -------------------------------------------------------------------------------
 ----------------------------------- Tree --------------------------------------
 -------------------------------------------------------------------------------
@@ -29,8 +35,8 @@
   show (Return _) 	= "Return"
   show (Try l r)        = "Try (" ++ show l ++ ") (" ++ show r ++ ")"
   show (Add _ t)        = "Add (" ++ show t ++ ")"
-  show (NewVar _)       = "NewVar"
-  show (Label _)        = "Label"
+  show (NewVar _)       = "NewVar <function>"
+  show (Label _)        = "Label <monadic value>"
 
 instance Solver s => Functor (Tree s) where
 	fmap  = liftM 
@@ -128,6 +134,8 @@
 
 infixl 2 \/
 
+-- | Generalization of the search tree data type,
+--   allowing monad transformer decoration.
 class (Monad m, Solver (TreeSolver m)) => MonadTree m where
   type TreeSolver m :: * -> *
   addTo  :: Constraint (TreeSolver m) -> m a -> m a
@@ -144,7 +152,6 @@
   exists  =  NewVar
   label   =  Label
 
-
 -------------------------------------------------------------------------------
 ----------------------------------- Sugar -------------------------------------
 -------------------------------------------------------------------------------
@@ -183,3 +190,32 @@
 
 add :: MonadTree tree => Constraint (TreeSolver tree) -> tree ()
 add c = c `addTo` true
+
+-------------------------------------------------------------------------------
+--------------------------- Monad Transformer Instances -----------------------
+-------------------------------------------------------------------------------
+
+instance MonadTree t => MonadTree (ReaderT env t) where
+  type TreeSolver (ReaderT env t) = TreeSolver t
+  addTo constraint tree  = ReaderT $ \env -> addTo constraint (runReaderT tree env)
+  false     = lift false
+  l \/ r    = ReaderT $ \env -> runReaderT l env \/ runReaderT r env
+  exists f  = ReaderT $ \env -> exists (\var -> runReaderT (f var) env)
+  label p   = ReaderT $ \env -> label (p >>= \m -> return $ runReaderT m env)
+ 
+
+instance (Monoid w, MonadTree t) => MonadTree (WriterT w t) where
+  type TreeSolver (WriterT w t)  = TreeSolver t
+  addTo constraint tree  = WriterT $ addTo constraint (runWriterT tree)
+  false     = lift false 
+  l \/ r    = WriterT $ runWriterT l \/ runWriterT r
+  exists f  = WriterT $ exists (\var -> runWriterT (f var))
+  label p   = WriterT $ label (p >>= \m -> return $ runWriterT m)
+
+instance MonadTree t => MonadTree (StateT s t) where
+  type TreeSolver (StateT s t) = TreeSolver t
+  addTo constraint tree  = StateT $ \s -> addTo constraint (runStateT tree s)
+  false     = lift false
+  l \/ r    = StateT $ \s -> runStateT l s \/ runStateT r s
+  exists f  = StateT $ \s -> exists (\var -> runStateT (f var) s)
+  label p   = StateT $ \s -> label (p >>= \m -> return $ runStateT m s)
diff --git a/monadiccp.cabal b/monadiccp.cabal
--- a/monadiccp.cabal
+++ b/monadiccp.cabal
@@ -1,5 +1,5 @@
 Name:                monadiccp
-Version:             0.5.1
+Version:             0.5.2
 Description:         Monadic Constraint Programming framework
 License:             BSD3
 License-file:        LICENSE
