diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+0.2.2
+* Depend on cryptocipher to provide an AES based DRBG
+* We now have a GenCounter instance that uses ctr from crypto-api
 0.1.4
 * Documentation fixes
 
diff --git a/Crypto/Random/DRBG.hs b/Crypto/Random/DRBG.hs
--- a/Crypto/Random/DRBG.hs
+++ b/Crypto/Random/DRBG.hs
@@ -38,7 +38,7 @@
 	  HmacDRBG, HashDRBG
 	, HmacDRBGWith, HashDRBGWith
 	-- * Basic Cipher-based Generator
-	, GenCounter
+	, GenAES, GenCounter
 	-- * CryptoRandomGen Transformers
 	, GenXor
 	, GenBuffered
@@ -60,6 +60,7 @@
 import Crypto.Hash.SHA256 (SHA256)
 import Crypto.Hash.SHA224 (SHA224)
 import Crypto.Hash.SHA1 (SHA1)
+import Crypto.Cipher.AES (AES128)
 import System.Crypto.Random
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Internal as BI
@@ -70,6 +71,7 @@
 import Control.Monad (liftM)
 import Control.Monad.Error () -- Either instance
 import Data.Serialize (encode)
+import Data.Word
 
 instance H.SeedLength SHA512 where
 	seedlen = Tagged 888
@@ -130,16 +132,11 @@
 -- interval of @i@ bytes, using the system random number generator as a seed.
 --
 -- See 'newGenAutoReseed'.
-newGenAutoReseedIO :: (CryptoRandomGen a, CryptoRandomGen b) =>
-                   Int -> IO (Either GenError (GenAutoReseed a b))
+newGenAutoReseedIO :: (CryptoRandomGen a, CryptoRandomGen b) => Int -> IO (GenAutoReseed a b)
 newGenAutoReseedIO i   = do
-	let p = Proxy
-	    getG :: (CryptoRandomGen a, CryptoRandomGen b) => 
-                    Proxy (GenAutoReseed a b) -> IO (Either GenError (GenAutoReseed a b))
-	    getG p = liftM (\bs -> newGenAutoReseed bs i `asProxyTypeOf` rightProxy p)
-                           (getEntropy (seed p))
-	g <- getG p
-	return (g `asProxyTypeOf` p)
+	g1 <- newGenIO
+	g2 <- newGenIO
+	return $ GenAutoReseed g1 g2 i 0
 
 seed :: CryptoRandomGen g => Proxy g -> Int
 seed x = proxy genSeedLength x
@@ -226,11 +223,7 @@
 	{-# SPECIALIZE instance CryptoRandomGen (GenAutoReseed HashDRBG HmacDRBG) #-}
 	{-# SPECIALIZE instance CryptoRandomGen (GenAutoReseed HmacDRBG HashDRBG) #-}
 	newGen bs = newGenAutoReseed bs (2^15)
-	newGenIO  = do
-		b <- newGenAutoReseedIO (2^15)
-		case b of
-			Left err -> error $ show err
-			Right g  -> return g
+	newGenIO  = newGenAutoReseedIO (2^15)
 	genSeedLength =
 		let a = helper1 res
 		    b = helper2 res
@@ -399,33 +392,41 @@
 eval (Left x) = Left x
 eval (Right (g,bs)) = bs `seq` (g `seq` (Right (g, bs)))
 
+-- |A random number generator using AES128 in ctr mode.
+type GenAES = GenCounter AES128
+
 -- |@GenCounter k@ is a cryptographic BlockCipher with key @k@
 -- being used in 'ctr' mode to generate random bytes.
-data GenCounter a = GenCounter a (IV a)
+data GenCounter a = GenCounter {-# UNPACK #-} !Word64 a (IV a)
 
 instance BlockCipher x => CryptoRandomGen (GenCounter x) where
-  newGen  bytes = case buildKey bytes of Nothing -> Left NotEnoughEntropy
-                                         Just x  -> Right (GenCounter x zeroIV)
+  newGen bytes =
+	let kl = keyLength
+	in case buildKey (B.take (untag kl `div` 8) bytes) of
+		Nothing -> Left NotEnoughEntropy
+		Just x  -> Right (GenCounter 0 (x `asTaggedTypeOf` kl) zeroIV)
   newGenIO = do
 	let b = keyLength
 	kd <- getEntropy ((untag b + 7) `div` 8)
 	case buildKey kd of
 		Nothing -> error "Failed to generate key for GenCounter"
-		Just k  -> return $ GenCounter (k `asTaggedTypeOf` b) zeroIV
+		Just k  -> return $ GenCounter 0 (k `asTaggedTypeOf` b) zeroIV
   genSeedLength =
 	let rt :: Tagged x Int -> Tagged (GenCounter x) Int
 	    rt = Tagged . (`div` 8) . unTagged
 	in rt keyLength
 
   -- If this is called for less than blockSize data 
-  genBytes req (GenCounter k counter) =
-	let bs = B.replicate req' 0
+  genBytes req (GenCounter rs k counter) =
+	let bs = B.replicate (req' * blkSz) 0
 	    blkSz = blockSizeBytes `for` k
 	    (rnd,iv) = ctr' incIV k counter bs
 	    req' = (req + blkSz - 1) `div` blkSz
-	in Right (B.take req rnd, GenCounter k iv)
+	in if rs >= 2^48
+		then Left NeedReseed
+		else Right (B.take req rnd, GenCounter (rs+1) k iv)
 
-  reseed bs (GenCounter k _) = newGen (xorExtendBS (encode k) bs)
+  reseed bs (GenCounter _ k _) = newGen (xorExtendBS (encode k) bs)
 
 xorExtendBS a b = res
    where
diff --git a/DRBG.cabal b/DRBG.cabal
--- a/DRBG.cabal
+++ b/DRBG.cabal
@@ -1,5 +1,5 @@
 name:		DRBG
-version:	0.2
+version:	0.2.2
 license:	BSD3
 license-file:	LICENSE
 author:		Thomas DuBuisson <thomas.dubuisson@gmail.com>
@@ -22,7 +22,8 @@
 Library
   Build-Depends: base >= 4.0 && < 5, cereal >= 0.2,
                  bytestring, prettyclass, tagged >= 0.2,
-                 crypto-api >= 0.6, cryptohash >= 0.6.1, parallel, mtl >= 2.0
+                 crypto-api >= 0.6, cryptohash >= 0.6.1, parallel, mtl >= 2.0,
+                 cryptocipher
   ghc-options: -O2
   hs-source-dirs:
   exposed-modules: Crypto.Random.DRBG.Hash, Crypto.Random.DRBG.HMAC, Crypto.Random.DRBG, Crypto.Random.DRBG.Types
