diff --git a/Crypto/Random/AESCtr.hs b/Crypto/Random/AESCtr.hs
--- a/Crypto/Random/AESCtr.hs
+++ b/Crypto/Random/AESCtr.hs
@@ -21,7 +21,6 @@
     ) where
 
 import Crypto.Random
-import System.Random (RandomGen(..))
 import Crypto.Random.AESCtr.Internal
 import Control.Arrow (second)
 
@@ -56,8 +55,8 @@
     , aesrngEntropy      = entPool
     , aesrngThreshold    = 1024 -- in blocks generated, so 1mb
     , aesrngCache        = B.empty }
-  where rng            = RNG (get128 iv) (get128 cnt) 0 key
-        (key, cnt, iv) = makeParams b
+  where rng = RNG entropy cnt 0 key
+        (key, cnt, entropy) = makeParams b
 
 -- | make an AES RNG from an EntropyPool.
 --
@@ -106,9 +105,9 @@
   where
         lvl = aesrngThreshold rng
         reseedState :: ByteString -> RNG -> RNG
-        reseedState b g@(RNG _ cnt1 _ _) = RNG (get128 r16 `xor128` get128 iv2) (cnt1 `xor128` get128 cnt2) 0 key2
-            where (r16, _)          = genNextChunk g
-                  (key2, cnt2, iv2) = makeParams b
+        reseedState b g@(RNG _ cnt1 _ _) = RNG left cnt2 0 key2
+            where -- (r16, _)           = genNextChunk g
+                  (key2, cnt2, left) = makeParams b
 
 instance CPRG AESRNG where
     cprgCreate                      = make
@@ -122,6 +121,7 @@
     cprgFork rng = let (b,rng') = genRanBytes rng 64
                     in (rng', makeFrom (aesrngEntropy rng) b)
 
+{-
 instance RandomGen AESRNG where
     next rng =
         let (bs, rng') = genRanBytes rng 16 in
@@ -132,3 +132,4 @@
         let rng' = make (aesrngEntropy rng)
          in (rng, rng')
     genRange _ = (0, 0x7fffffff)
+-}
diff --git a/Crypto/Random/AESCtr/Internal.hs b/Crypto/Random/AESCtr/Internal.hs
--- a/Crypto/Random/AESCtr/Internal.hs
+++ b/Crypto/Random/AESCtr/Internal.hs
@@ -6,6 +6,7 @@
 -- Portability : unknown
 --
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE BangPatterns #-}
 module Crypto.Random.AESCtr.Internal where
 
 import qualified Crypto.Cipher.AES as AES
@@ -13,68 +14,28 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
 
-import Data.Word
-import Data.Bits (xor)
-
-import Foreign.Ptr
-#if __GLASGOW_HASKELL__ > 704
-import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
-#else
-import Foreign.ForeignPtr (unsafeForeignPtrToPtr)
-#endif
-
-import Foreign.Storable
-import qualified Data.ByteString.Internal as B
-
-data Word128 = Word128 {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
-
 {-| An opaque object containing an AES CPRNG -}
 data RNG = RNG
-    {-# UNPACK #-} !Word128 -- iv
-    {-# UNPACK #-} !Word128 -- cnt
-    {-# UNPACK #-} !Int     -- number of chunks generated since reseed
-    {-# UNPACK #-} !AES.AES -- AES context
+    {-# UNPACK #-} !ByteString -- left over entropy. can be use to reseed
+    {-# UNPACK #-} !AES.AESIV  -- counter
+    {-# UNPACK #-} !Int        -- number of chunks generated since reseed
+    {-# UNPACK #-} !AES.AES    -- AES context
 
 getNbChunksGenerated :: RNG -> Int
 getNbChunksGenerated (RNG _ _ c _) = c
 
-put128 :: Word128 -> ByteString
-put128 (Word128 a b) = B.unsafeCreate 16 (write64 . castPtr)
-    where write64 :: Ptr Word64 -> IO ()
-          write64 ptr = poke ptr a >> poke (ptr `plusPtr` 8) b
-
-get128 :: ByteString -> Word128
-get128 (B.PS ps s _) = B.inlinePerformIO $ do
-    let ptr = castPtr (unsafeForeignPtrToPtr ps `plusPtr` s) :: Ptr Word64
-    a <- peek ptr
-    b <- peek (ptr `plusPtr` 8)
-    return $ Word128 a b
-
-xor128 :: Word128 -> Word128 -> Word128
-xor128 (Word128 a1 b1) (Word128 a2 b2) = Word128 (a1 `xor` a2) (b1 `xor` b2)
-
-add64 :: Word128 -> Word128
-add64 (Word128 a b) = if nb < 64 then Word128 (a+1) nb else Word128 a nb
-  where nb = b + 64
-
-{-
-withBsPtr :: ByteString -> (Ptr Word8 -> IO a) -> IO a
-withBsPtr (B.PS ps s _) f = withForeignPtr ps $ \ptr -> f (ptr `plusPtr` s)
--}
-
-makeParams :: ByteString -> (AES.AES, ByteString, ByteString)
-makeParams b = (key, cnt, iv)
-    where
-        key          = AES.initAES $ B.take 32 left2
-        (cnt, left2) = B.splitAt 16 left1
-        (iv, left1)  = B.splitAt 16 b
+makeParams :: ByteString -> (AES.AES, AES.AESIV, ByteString)
+makeParams b = key `seq` entropy `seq` (key, AES.aesIV_ cnt, entropy)
+  where (keyBS, r1) = B.splitAt 32 b
+        (cnt, r2)   = B.splitAt 16 r1
+        !entropy    = B.copy r2
+        !key        = AES.initAES keyBS
 
 chunkSize :: Int
 chunkSize = 1024
 
 genNextChunk :: RNG -> (ByteString, RNG)
-genNextChunk (RNG iv counter nbChunks key) = (chunk, newrng)
+genNextChunk (RNG entropy counter nbChunks key) = (chunk, newrng)
   where
-        newrng = RNG (get128 chunk) (add64 counter) (nbChunks+1) key
-        chunk  = AES.genCTR key bytes chunkSize
-        bytes  = put128 (iv `xor128` counter)
+        newrng = RNG entropy newCounter (nbChunks+1) key
+        (chunk,newCounter) = AES.genCounter key counter chunkSize
diff --git a/cprng-aes.cabal b/cprng-aes.cabal
--- a/cprng-aes.cabal
+++ b/cprng-aes.cabal
@@ -1,5 +1,5 @@
 Name:                cprng-aes
-Version:             0.5.2
+Version:             0.6.0
 Description:         
     Simple crypto pseudo-random-number-generator with really good randomness property.
     .
@@ -34,13 +34,12 @@
   Build-Depends:     base >= 3 && < 5
                    , bytestring
                    , byteable
-                   , random
                    , crypto-random >= 0.0.7 && < 0.1
+                   , cipher-aes >= 0.2.9 && < 0.3
+
   Exposed-modules:   Crypto.Random.AESCtr
   Other-modules:     Crypto.Random.AESCtr.Internal
   ghc-options:       -Wall
-
-  Build-Depends:   cipher-aes >= 0.2 && < 0.3
 
 Benchmark bench-cprng-aes
   hs-source-dirs:    Benchmarks
