diff --git a/Network/TLS/ErrT.hs b/Network/TLS/ErrT.hs
new file mode 100644
--- /dev/null
+++ b/Network/TLS/ErrT.hs
@@ -0,0 +1,28 @@
+-- |
+-- Module      : Network.TLS.ErrT
+-- License     : BSD-style
+-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
+-- Stability   : experimental
+-- Portability : unknown
+--
+-- a simple compat ErrorT and other error stuff
+{-# LANGUAGE CPP #-}
+module Network.TLS.ErrT
+    ( runErrT
+    , ErrT
+    , Error(..)
+    , MonadError(..)
+    ) where
+
+#if MIN_VERSION_mtl(2,2,1)
+import Control.Monad.Except
+import Control.Monad.Error.Class (Error(..))
+runErrT :: ExceptT e m a -> m (Either e a)
+runErrT = runExceptT
+type ErrT = ExceptT
+#else
+import Control.Monad.Error
+runErrT = runErrorT
+type ErrT = ErrorT
+#endif
+
diff --git a/Network/TLS/Handshake/Client.hs b/Network/TLS/Handshake/Client.hs
--- a/Network/TLS/Handshake/Client.hs
+++ b/Network/TLS/Handshake/Client.hs
@@ -18,6 +18,7 @@
 import Network.TLS.Cipher
 import Network.TLS.Compression
 import Network.TLS.Packet
+import Network.TLS.ErrT
 import Network.TLS.Extension
 import Network.TLS.IO
 import Network.TLS.State hiding (getNegotiatedProtocol)
@@ -33,7 +34,6 @@
 
 import Control.Applicative ((<$>), (<*>))
 import Control.Monad.State
-import Control.Monad.Error
 import Control.Exception (SomeException)
 
 import Network.TLS.Handshake.Common
diff --git a/Network/TLS/Handshake/Process.hs b/Network/TLS/Handshake/Process.hs
--- a/Network/TLS/Handshake/Process.hs
+++ b/Network/TLS/Handshake/Process.hs
@@ -15,12 +15,14 @@
 
 import Control.Applicative
 import Control.Concurrent.MVar
-import Control.Monad.Error
 import Control.Monad.State (gets)
+import Control.Monad
+import Control.Monad.IO.Class (liftIO)
 
 import Network.TLS.Types (Role(..), invertRole)
 import Network.TLS.Util
 import Network.TLS.Packet
+import Network.TLS.ErrT
 import Network.TLS.Struct
 import Network.TLS.State
 import Network.TLS.Context.Internal
diff --git a/Network/TLS/Receiving.hs b/Network/TLS/Receiving.hs
--- a/Network/TLS/Receiving.hs
+++ b/Network/TLS/Receiving.hs
@@ -15,11 +15,11 @@
     ) where
 
 import Control.Monad.State
-import Control.Monad.Error
 import Control.Concurrent.MVar
 
 import Network.TLS.Context.Internal
 import Network.TLS.Struct
+import Network.TLS.ErrT
 import Network.TLS.Record
 import Network.TLS.Packet
 import Network.TLS.Wire
diff --git a/Network/TLS/Record/Disengage.hs b/Network/TLS/Record/Disengage.hs
--- a/Network/TLS/Record/Disengage.hs
+++ b/Network/TLS/Record/Disengage.hs
@@ -15,9 +15,9 @@
         ) where
 
 import Control.Monad.State
-import Control.Monad.Error
 
 import Network.TLS.Struct
+import Network.TLS.ErrT
 import Network.TLS.Cap
 import Network.TLS.Record.State
 import Network.TLS.Record.Types
diff --git a/Network/TLS/Record/State.hs b/Network/TLS/Record/State.hs
--- a/Network/TLS/Record/State.hs
+++ b/Network/TLS/Record/State.hs
@@ -25,9 +25,9 @@
 import Data.Word
 import Control.Applicative
 import Control.Monad.State
-import Control.Monad.Error
 import Network.TLS.Compression
 import Network.TLS.Cipher
+import Network.TLS.ErrT
 import Network.TLS.Struct
 import Network.TLS.Wire
 
diff --git a/Network/TLS/State.hs b/Network/TLS/State.hs
--- a/Network/TLS/State.hs
+++ b/Network/TLS/State.hs
@@ -54,7 +54,7 @@
 import Network.TLS.Wire (GetContinuation)
 import qualified Data.ByteString as B
 import Control.Monad.State
-import Control.Monad.Error
+import Network.TLS.ErrT
 import Crypto.Random
 import Data.X509 (CertificateChain)
 
@@ -74,7 +74,7 @@
     , stClientContext       :: Role
     }
 
-newtype TLSSt a = TLSSt { runTLSSt :: ErrorT TLSError (State TLSState) a }
+newtype TLSSt a = TLSSt { runTLSSt :: ErrT TLSError (State TLSState) a }
     deriving (Monad, MonadError TLSError, Functor, Applicative)
 
 instance MonadState TLSState TLSSt where
@@ -85,7 +85,7 @@
 #endif
 
 runTLSState :: TLSSt a -> TLSState -> (Either TLSError a, TLSState)
-runTLSState f st = runState (runErrorT (runTLSSt f)) st
+runTLSState f st = runState (runErrT (runTLSSt f)) st
 
 newTLSState :: CPRG g => g -> Role -> TLSState
 newTLSState rng clientContext = TLSState
diff --git a/Network/TLS/Struct.hs b/Network/TLS/Struct.hs
--- a/Network/TLS/Struct.hs
+++ b/Network/TLS/Struct.hs
@@ -9,6 +9,7 @@
 --
 -- the Struct module contains all definitions and values of the TLS protocol
 --
+{-# LANGUAGE CPP #-}
 module Network.TLS.Struct
     ( Bytes
     , Version(..)
@@ -56,7 +57,6 @@
 import Data.Word
 import Data.X509 (CertificateChain, DistinguishedName)
 import Data.Typeable
-import Control.Monad.Error (Error(..))
 import Control.Exception (Exception(..))
 import Network.TLS.Types
 import Network.TLS.Crypto.DH
@@ -129,9 +129,12 @@
     | Error_Packet_Parsing String
     deriving (Eq, Show, Typeable)
 
+#if MIN_VERSION_mtl(2,2,1)
+#else
 instance Error TLSError where
     noMsg  = Error_Misc ""
     strMsg = Error_Misc
+#endif
 
 instance Exception TLSError
 
diff --git a/Network/TLS/Wire.hs b/Network/TLS/Wire.hs
--- a/Network/TLS/Wire.hs
+++ b/Network/TLS/Wire.hs
@@ -50,7 +50,7 @@
 import qualified Data.Serialize.Get as G
 import Data.Serialize.Put
 import Control.Applicative ((<$>))
-import Control.Monad.Error
+import Control.Monad
 import qualified Data.ByteString as B
 import Data.Word
 import Data.Bits
diff --git a/Tests/Certificate.hs b/Tests/Certificate.hs
--- a/Tests/Certificate.hs
+++ b/Tests/Certificate.hs
@@ -6,10 +6,10 @@
     , simpleX509
     ) where
 
-import Test.QuickCheck
+import Control.Applicative
+import Test.Tasty.QuickCheck
 import Data.X509
-import Data.Time.Calendar (fromGregorian)
-import Data.Time.Clock (secondsToDiffTime, UTCTime(..))
+import Data.Hourglass
 import qualified Data.ByteString as B
 
 import PubKey
@@ -18,24 +18,34 @@
 
 arbitraryDN = return $ DistinguishedName []
 
-arbitraryTime = do
-    year   <- choose (1951, 2050)
-    month  <- choose (1, 12)
-    day    <- choose (1, 30)
-    hour   <- choose (0, 23)
-    minute <- choose (0, 59)
-    second <- choose (0, 59)
-    --z      <- arbitrary
-    return $ UTCTime (fromGregorian year month day) (secondsToDiffTime (hour * 3600 + minute * 60 + second))
+instance Arbitrary Date where
+    arbitrary = do
+        y <- choose (1951, 2050)
+        m <- elements [ January .. December]
+        d <- choose (1, 30)
+        return $ normalizeDate $ Date y m d
 
+normalizeDate :: Date -> Date
+normalizeDate d = timeConvert (timeConvert d :: Elapsed)
+
+instance Arbitrary TimeOfDay where
+    arbitrary = do
+        h    <- choose (0, 23)
+        mi   <- choose (0, 59)
+        se   <- choose (0, 59)
+        nsec <- return 0
+        return $ TimeOfDay (Hours h) (Minutes mi) (Seconds se) nsec
+
+instance Arbitrary DateTime where
+    arbitrary = DateTime <$> arbitrary <*> arbitrary
+
 maxSerial = 16777216
 
 arbitraryCertificate pubKey = do
     serial    <- choose (0,maxSerial)
     issuerdn  <- arbitraryDN
     subjectdn <- arbitraryDN
-    time1     <- arbitraryTime
-    time2     <- arbitraryTime
+    validity  <- (,) <$> arbitrary <*> arbitrary
     let sigalg = SignatureALG HashSHA1 (pubkeyToAlg pubKey)
     return $ Certificate
             { certVersion      = 3
@@ -43,7 +53,7 @@
             , certSignatureAlg = sigalg
             , certIssuerDN     = issuerdn
             , certSubjectDN    = subjectdn
-            , certValidity     = (time1, time2)
+            , certValidity     = validity
             , certPubKey       = pubKey
             , certExtensions   = Extensions $ Just
                 [ testExtensionEncode True $ ExtKeyUsage [KeyUsage_digitalSignature,KeyUsage_keyEncipherment,KeyUsage_keyCertSign]
@@ -63,8 +73,8 @@
                 [ testExtensionEncode True $ ExtKeyUsage [KeyUsage_digitalSignature,KeyUsage_keyEncipherment]
                 ]
         }
-  where time1 = UTCTime (fromGregorian 1999 1 1) 0
-        time2 = UTCTime (fromGregorian 2901 1 1) 0
+  where time1 = DateTime (Date 1999 January 1) (TimeOfDay 0 0 0 0)
+        time2 = DateTime (Date 2049 January 1) (TimeOfDay 0 0 0 0)
         simpleDN = DistinguishedName []
 
 simpleX509 pubKey = do
diff --git a/Tests/Ciphers.hs b/Tests/Ciphers.hs
--- a/Tests/Ciphers.hs
+++ b/Tests/Ciphers.hs
@@ -4,7 +4,7 @@
 
 import Control.Applicative ((<$>), (<*>))
 
-import Test.QuickCheck
+import Test.Tasty.QuickCheck
 
 import qualified Data.ByteString as B
 import Network.TLS.Cipher
diff --git a/Tests/Connection.hs b/Tests/Connection.hs
--- a/Tests/Connection.hs
+++ b/Tests/Connection.hs
@@ -8,7 +8,7 @@
     , streamCipher
     ) where
 
-import Test.QuickCheck
+import Test.Tasty.QuickCheck
 import Certificate
 import PubKey
 import PipeChan
diff --git a/Tests/Marshalling.hs b/Tests/Marshalling.hs
--- a/Tests/Marshalling.hs
+++ b/Tests/Marshalling.hs
@@ -3,7 +3,7 @@
 
 import Control.Monad
 import Control.Applicative
-import Test.QuickCheck
+import Test.Tasty.QuickCheck
 import Network.TLS.Internal
 import Network.TLS
 
@@ -24,15 +24,6 @@
             , ProtocolType_Alert
             , ProtocolType_Handshake
             , ProtocolType_AppData ]
-
-#if MIN_VERSION_QuickCheck(2,3,0)
-#else
-instance Arbitrary Word8 where
-    arbitrary = fromIntegral <$> (choose (0,255) :: Gen Int)
-
-instance Arbitrary Word16 where
-    arbitrary = fromIntegral <$> (choose (0,65535) :: Gen Int)
-#endif
 
 instance Arbitrary Header where
     arbitrary = Header <$> arbitrary <*> arbitrary <*> arbitrary
diff --git a/Tests/PubKey.hs b/Tests/PubKey.hs
--- a/Tests/PubKey.hs
+++ b/Tests/PubKey.hs
@@ -8,7 +8,7 @@
     , rsaParams
     ) where
 
-import Test.QuickCheck
+import Test.Tasty.QuickCheck
 
 import qualified Crypto.PubKey.DH as DH
 import Crypto.Random (createTestEntropyPool)
diff --git a/Tests/Tests.hs b/Tests/Tests.hs
--- a/Tests/Tests.hs
+++ b/Tests/Tests.hs
@@ -1,9 +1,8 @@
 {-# LANGUAGE CPP #-}
 
-import Test.QuickCheck
+import Test.Tasty
+import Test.Tasty.QuickCheck
 import Test.QuickCheck.Monadic
-import Test.Framework (defaultMain, testGroup)
-import Test.Framework.Providers.QuickCheck2 (testProperty)
 
 import PipeChan
 import Connection
@@ -159,7 +158,7 @@
 assertEq expected got = unless (expected == got) $ error ("got " ++ show got ++ " but was expecting " ++ show expected)
 
 main :: IO ()
-main = defaultMain
+main = defaultMain $ testGroup "tls"
     [ tests_marshalling
     , tests_ciphers
     , tests_handshake
diff --git a/tls.cabal b/tls.cabal
--- a/tls.cabal
+++ b/tls.cabal
@@ -1,5 +1,5 @@
 Name:                tls
-Version:             1.2.10
+Version:             1.2.11
 Description:
    Native Haskell TLS and SSL protocol implementation for server and client.
    .
@@ -34,6 +34,7 @@
 Library
   Build-Depends:     base >= 3 && < 5
                    , mtl
+                   , transformers
                    , cereal >= 0.4
                    , bytestring
                    , byteable
@@ -70,6 +71,7 @@
                      Network.TLS.Backend
                      Network.TLS.Crypto
                      Network.TLS.Crypto.DH
+                     Network.TLS.ErrT
                      Network.TLS.Extension
                      Network.TLS.Handshake
                      Network.TLS.Handshake.Common
@@ -103,8 +105,6 @@
                      Network.TLS.Wire
                      Network.TLS.X509
   ghc-options:       -Wall -fwarn-tabs
-  if impl(ghc == 7.6.1)
-    ghc-options:     -O0
   if flag(compat)
     cpp-options:     -DSSLV2_COMPATIBLE
 
@@ -116,16 +116,16 @@
                    , mtl
                    , cereal >= 0.3
                    , data-default-class
-                   , QuickCheck >= 2
-                   , test-framework
-                   , test-framework-quickcheck2
+                   , tasty
+                   , tasty-quickcheck
+                   , QuickCheck
                    , cprng-aes >= 0.5
                    , crypto-pubkey >= 0.2
                    , bytestring
                    , x509
                    , x509-validation
                    , tls
-                   , time
+                   , hourglass
                    , crypto-random
                    , crypto-pubkey
   ghc-options:       -Wall -fno-warn-orphans -fno-warn-missing-signatures -fwarn-tabs
@@ -145,7 +145,7 @@
                    , mtl
                    , bytestring
                    , crypto-pubkey >= 0.2
-                   , time
+                   , hourglass
                    , QuickCheck >= 2
 
 source-repository head
