diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -0,0 +1,11 @@
+language: haskell
+
+ghc:
+    - 7.8
+    - "7.10"
+
+#env:
+# - GHCVER='7.10.1'
+ 
+script:
+    - cabal install
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@
 module TaintExample where
 
 import Data.Tainted
+import Control.Monad
 
 data Expr = 
       Number (Tainted Int)
@@ -41,7 +42,7 @@
 evalExpr (Number n) = Number n
 evalExpr (Add e1 e2) = 
     case (evalExpr e1, evalExpr e2) of
-        (Number i, Number j) -> Number $ (+) <$> i <*> j
+        (Number i, Number j) -> Number $ liftM2 (+) i j
         (x, y) -> Add x y
 
 reducedExpr1 = evalExpr expr1
diff --git a/Tainted.cabal b/Tainted.cabal
--- a/Tainted.cabal
+++ b/Tainted.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                Tainted
-version:             0.0.1
+version:             0.1.0
 synopsis:            Tainted type, and associated operations
 description:            Tainted type, and associated operations
 homepage:            https://github.com/RossMeikleham/Tainted
@@ -11,7 +11,7 @@
 author:              RossMeikleham
 maintainer:          rossmeikleham@hotmail.co.uk
 copyright:           Copyright (C) 2015 Ross Meikleham
-category:            Data, Monads
+category:            Data, Monads, Control, Trans
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:
@@ -26,8 +26,9 @@
 
 
 library
-  exposed-modules:     Data.Tainted
-  build-depends:       base >=4.8 && <4.9
+  exposed-modules:     Data.Tainted Control.Monad.Trans.Tainted
+  build-depends:       base >=4     && < 5,
+                       mtl  >= 2.0  && < 2.3
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options: -Wall
diff --git a/src/Control/Monad/Trans/Tainted.hs b/src/Control/Monad/Trans/Tainted.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/Tainted.hs
@@ -0,0 +1,54 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Monad
+-- Copyright   :  Ross Meikleham
+-- License     :  BSD-style 
+-- 
+-- Maintainer  :  RossMeikleham@hotmail.co.uk
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- The Tainted type, and associated operations.
+-----------------------------------------------------------------------------
+
+module Control.Monad.Trans.Tainted(TaintedT(..), hoistTainted)
+
+where
+
+import Control.Monad
+import Control.Monad.Trans
+import Data.Tainted
+
+-- | 'TaintedT' is a monad transformed of 'Tainted'
+newtype TaintedT m a = TaintedT {runTainted :: m (Tainted a)}
+
+
+instance Monad m => Functor (TaintedT m) where
+    fmap f = TaintedT . fmap (fmap f) . runTainted
+
+instance Monad m => Applicative (TaintedT m) where
+    pure = return
+    (<*>) = ap
+
+
+instance Monad m => Monad (TaintedT m) where
+    return = TaintedT . return . return
+    TaintedT x >>= f = TaintedT $ do
+        res <- x
+        case res of
+            Clean v -> runTainted $ f v
+            Dirty t -> do
+                    -- Ensure Dirty stays Dirty
+                    res <- runTainted $ f t
+                    return $ case res of
+                        Clean u -> Dirty u 
+                        d       -> d
+                                
+
+instance MonadTrans TaintedT where
+    lift = TaintedT . liftM return
+
+
+-- | Lift a 'Tainted' into an 'TaintedT'
+hoistTainted :: Monad m => Tainted a -> TaintedT m a
+hoistTainted = TaintedT . return
