diff --git a/Crypto/Random/DRBG.hs b/Crypto/Random/DRBG.hs
--- a/Crypto/Random/DRBG.hs
+++ b/Crypto/Random/DRBG.hs
@@ -58,10 +58,8 @@
 module Crypto.Random.DRBG
         (
         -- * Basic Hash-based Generators
-          HmacDRBG, HashDRBG
-        , HmacDRBGWith, HashDRBGWith
-        -- * Basic Cipher-based Generator
-        , GenAES, GenCounter
+          HmacDRBG, HashDRBG, CtrDRBG
+        , HmacDRBGWith, HashDRBGWith, CtrDRBGWith
         -- * CryptoRandomGen Transformers
         , GenXor
         , GenBuffered
@@ -118,12 +116,19 @@
 -- of the underlying hash algorithm.
 type HashDRBGWith = H.State
 
+-- |The Hash DRBG state (of kind * -> *) allowing selection
+-- of the underlying cipher algorithm.
+type CtrDRBGWith = CTR.State
+
 -- |An alias for an HMAC DRBG generator using SHA512.
 type HmacDRBG = M.State SHA512
 
 -- |An Alias for a Hash DRBG generator using SHA512.
 type HashDRBG = H.State SHA512
 
+-- |An Alias for a Counter DRBG generator using AES 128.
+type CtrDRBG = CTR.State AESKey
+
 -- |@newGenAutoReseed bs i@ creates a new 'GenAutoReseed' with a custom interval
 -- of @i@ bytes using the provided entropy in @bs@.
 --
@@ -380,7 +385,7 @@
         g <- newGen bs
         (rs,g') <- genBytes min g
         let new = wrapErr (genBytes min g') g'
-        (let !_ = rs in ()) `par` return (GenBuffered min max new rs)
+        rs `par` return (GenBuffered min max new rs)
 
 newGenBufferedIO :: CryptoRandomGen g => Int -> Int -> IO (GenBuffered g)
 newGenBufferedIO min max = do
@@ -388,12 +393,13 @@
         let !(Right !gBuf) = do
                 (rs,g') <- genBytes min g
                 let new = wrapErr (genBytes min g') g'
-                (let !_ = rs in ()) `par` return (GenBuffered min max new rs)
+                rs `par` return (GenBuffered min max new rs)
         return gBuf
 
 instance (CryptoRandomGen g) => CryptoRandomGen (GenBuffered g) where
         {-# SPECIALIZE instance CryptoRandomGen (GenBuffered HmacDRBG) #-}
         {-# SPECIALIZE instance CryptoRandomGen (GenBuffered HashDRBG) #-}
+        {-# SPECIALIZE instance CryptoRandomGen (GenBuffered CtrDRBG) #-}
         newGen = newGenBuffered bufferMinDef bufferMaxDef
         newGenIO = newGenBufferedIO bufferMinDef bufferMaxDef
         genSeedLength =
@@ -409,7 +415,14 @@
                         case g of
                                 Left (err,_)  -> Left err
                                 Right g   -> Left (GenErrorOther "Buffering generator failed to buffer properly - unknown reason")
-                | req > B.length bs = Left RequestedTooManyBytes
+                | req > B.length bs =
+                    case g of
+                      Left (err,_) -> Left err
+                      Right (bo,g2)     ->
+                        case genBytes req g2 of
+                          Left err -> Left err
+                          Right (b,g3) ->
+                            Right (b, GenBuffered min max (Right (bo,g3)) bs)
                 | remSize < min =
                         case g of
                                 Left (err,_) -> Left err
@@ -443,14 +456,7 @@
 eval (Left x) = Left x
 eval (Right (g,bs)) = bs `seq` (g `seq` (Right (g, bs)))
 
--- |A random number generator using AESKey in ctr mode.
-type GenAES = GenCounter AESKey
-
--- |@GenCounter k@ is a cryptographic BlockCipher with key @k@
--- being used in 'ctr' mode to generate random bytes.
-type GenCounter a = CTR.State a
-
-instance BlockCipher x => CryptoRandomGen (GenCounter x) where
+instance BlockCipher x => CryptoRandomGen (CtrDRBGWith x) where
   newGen bytes =
       case CTR.instantiate bytes B.empty of
         Nothing -> Left NotEnoughEntropy
@@ -466,14 +472,15 @@
         Just st -> return st
 
   genSeedLength =
-        let rt :: Tagged x Int -> Tagged x Int -> Tagged (GenCounter x) Int
+        let rt :: Tagged x Int -> Tagged x Int -> Tagged (CtrDRBGWith x) Int
             rt x y = Tagged $ 
                 let k = unTagged x
                     b = unTagged y
                 in k + b
         in rt keyLengthBytes blockSizeBytes
 
-  -- If this is called for less than blockSize data 
+  -- Generates req bytes (even if that is over the 2^16 bytes allowed by
+  -- the NIST standard!)
   genBytes req st =
       case CTR.generate st req B.empty of
             Nothing       -> Left NeedReseed
diff --git a/DRBG.cabal b/DRBG.cabal
--- a/DRBG.cabal
+++ b/DRBG.cabal
@@ -1,5 +1,5 @@
 name:           DRBG
-version:        0.4
+version:        0.5
 license:        BSD3
 license-file:   LICENSE
 author:         Thomas DuBuisson <thomas.dubuisson@gmail.com>
diff --git a/Test/KAT.hs b/Test/KAT.hs
--- a/Test/KAT.hs
+++ b/Test/KAT.hs
@@ -28,15 +28,13 @@
 import Test.HUnit.Base (assertEqual)
 import Test.Framework.Providers.HUnit (testCase)
 
-import Debug.Trace
-
 import Crypto.Cipher.AES128
 
 main = do
   h <- nistTests_HMAC
   s <- nistTests_Hash
   c <- nistTests_CTR
-  defaultMain c -- (c ++ s ++ h)
+  defaultMain (c ++ s ++ h)
 
 nistTests_CTR :: IO [Test]
 nistTests_CTR = do
