diff --git a/Benchs/Bench.hs b/Benchs/Bench.hs
--- a/Benchs/Bench.hs
+++ b/Benchs/Bench.hs
@@ -10,15 +10,15 @@
 import Crypto.PubKey.RSA.OAEP as OAEP
 import Crypto.PubKey.RSA.PSS as PSS
 import Crypto.PubKey.HashDescr
+import Crypto.Random
 
-import Crypto.Random.AESCtr
 import qualified Data.ByteString as B
 
 right (Right r) = r
 right (Left _)  = error "left received"
 
 main = do
-    rng <- makeSystem
+    rng <- cprgCreate `fmap` createEntropyPool :: IO SystemRNG
     let !bs = B.replicate 32 0
         !encryptedMsgPKCS = (right . fst . PKCS15.encrypt rng rsaPublickey) bs
         !encryptedMsgOAEP = (right . fst . OAEP.encrypt rng oaepParams rsaPublickey) bs
diff --git a/Crypto/PubKey/HashDescr.hs b/Crypto/PubKey/HashDescr.hs
--- a/Crypto/PubKey/HashDescr.hs
+++ b/Crypto/PubKey/HashDescr.hs
@@ -25,6 +25,7 @@
     ) where
 
 import Data.ByteString (ByteString)
+import Data.Byteable (toBytes)
 import qualified Data.ByteString as B
 import Crypto.Hash
 
@@ -40,50 +41,50 @@
 -- | Describe the MD2 hashing algorithm
 hashDescrMD2 :: HashDescr
 hashDescrMD2 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest MD2)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest MD2)
               , digestToASN1 = toHashWithInfo "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02\x05\x00\x04\x10"
               }
 -- | Describe the MD5 hashing algorithm
 hashDescrMD5 :: HashDescr
 hashDescrMD5 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest MD5)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest MD5)
               , digestToASN1 = toHashWithInfo "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10"
               }
 -- | Describe the SHA1 hashing algorithm
 hashDescrSHA1 :: HashDescr
 hashDescrSHA1 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest SHA1)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest SHA1)
               , digestToASN1 = toHashWithInfo "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"
               }
 -- | Describe the SHA224 hashing algorithm
 hashDescrSHA224 :: HashDescr
 hashDescrSHA224 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest SHA224)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest SHA224)
               , digestToASN1 = toHashWithInfo "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c"
               }
 -- | Describe the SHA256 hashing algorithm
 hashDescrSHA256 :: HashDescr
 hashDescrSHA256 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest SHA256)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest SHA256)
               , digestToASN1 = toHashWithInfo "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20"
               }
 -- | Describe the SHA384 hashing algorithm
 hashDescrSHA384 :: HashDescr
 hashDescrSHA384 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest SHA384)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest SHA384)
               , digestToASN1 = toHashWithInfo "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30"
               }
 -- | Describe the SHA512 hashing algorithm
 hashDescrSHA512 :: HashDescr
 hashDescrSHA512 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest SHA512)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest SHA512)
               , digestToASN1 = toHashWithInfo "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40"
               }
 
 -- | Describe the RIPEMD160 hashing algorithm
 hashDescrRIPEMD160 :: HashDescr
 hashDescrRIPEMD160 =
-    HashDescr { hashFunction = digestToByteString . (hash :: ByteString -> Digest RIPEMD160)
+    HashDescr { hashFunction = toBytes . (hash :: ByteString -> Digest RIPEMD160)
               , digestToASN1 = toHashWithInfo "\x30\x21\x30\x09\x06\x05\x2b\x24\x03\x02\x01\x05\x00\x04\x14"
               }
 
diff --git a/Crypto/PubKey/RSA/OAEP.hs b/Crypto/PubKey/RSA/OAEP.hs
--- a/Crypto/PubKey/RSA/OAEP.hs
+++ b/Crypto/PubKey/RSA/OAEP.hs
@@ -86,7 +86,7 @@
 encrypt g oaep pk msg = (encryptWithSeed seed oaep pk msg, g')
     where hashF      = oaepHash oaep
           hashLen    = B.length (hashF B.empty)
-          (seed, g') = genRandomBytes hashLen g
+          (seed, g') = cprgGenerate hashLen g
 
 -- | un-pad a OAEP encoded message.
 --
diff --git a/Crypto/PubKey/RSA/PKCS15.hs b/Crypto/PubKey/RSA/PKCS15.hs
--- a/Crypto/PubKey/RSA/PKCS15.hs
+++ b/Crypto/PubKey/RSA/PKCS15.hs
@@ -43,7 +43,7 @@
         where {- get random non-null bytes -}
               getNonNullRandom :: CPRG g => g -> Int -> (ByteString, g)
               getNonNullRandom g n =
-                    let (bs0,g') = genRandomBytes n g
+                    let (bs0,g') = cprgGenerate n g
                         bytes    = B.pack $ filter (/= 0) $ B.unpack $ bs0
                         left     = (n - B.length bytes)
                      in if left == 0
diff --git a/Crypto/PubKey/RSA/PSS.hs b/Crypto/PubKey/RSA/PSS.hs
--- a/Crypto/PubKey/RSA/PSS.hs
+++ b/Crypto/PubKey/RSA/PSS.hs
@@ -19,6 +19,7 @@
 import Crypto.Random.API
 import Crypto.Types.PubKey.RSA
 import Data.ByteString (ByteString)
+import Data.Byteable
 import qualified Data.ByteString as B
 import Crypto.PubKey.RSA.Prim
 import Crypto.PubKey.RSA.Types
@@ -47,7 +48,7 @@
 
 -- | Default Params using SHA1 algorithm.
 defaultPSSParamsSHA1 :: PSSParams
-defaultPSSParamsSHA1 = defaultPSSParams (digestToByteString . (hash :: ByteString -> Digest SHA1))
+defaultPSSParamsSHA1 = defaultPSSParams (toBytes . (hash :: ByteString -> Digest SHA1))
 
 -- | Sign using the PSS parameters and the salt explicitely passed as parameters.
 --
@@ -85,7 +86,7 @@
      -> ByteString      -- ^ Message to sign
      -> (Either Error ByteString, g)
 sign rng blinder params pk m = (signWithSalt salt blinder params pk m, rng')
-    where (salt,rng') = genRandomBytes (pssSaltLength params) rng
+    where (salt,rng') = cprgGenerate (pssSaltLength params) rng
 
 -- | Sign using the PSS Parameters and an automatically generated blinder.
 signSafer :: CPRG g
diff --git a/Tests/RNG.hs b/Tests/RNG.hs
--- a/Tests/RNG.hs
+++ b/Tests/RNG.hs
@@ -2,8 +2,9 @@
 
 import Data.Word
 import Data.List (foldl')
+import Data.Byteable
 import qualified Data.ByteString as B
-import Crypto.Random.API
+import Crypto.Random
 import Control.Arrow (first)
 
 {- this is a just test rng. this is absolutely not a serious RNG. DO NOT use elsewhere -}
@@ -24,10 +25,21 @@
      in (b:l, g'')
 
 instance CPRG Rng where
-    cprgGenBytes len g    = first B.pack $ getBytes len g
-    cprgSupplyEntropy e g = reseed e g
-    cprgNeedReseed _      = NeverReseed
+    cprgCreate pool = let ent = grabEntropy 4 pool in generate (B.unpack $ toBytes ent)
+    cprgSetReseedThreshold _ g = g
+    cprgGenerate len g = first B.pack $ getBytes len g
+    cprgGenerateWithEntropy = cprgGenerate
+    cprgFork g = let (bs, g') = getBytes 4 g
+                    in case bs of
+                        [a,b,c,d] -> let g2 = Rng (fromIntegral a * 256 + fromIntegral b, fromIntegral c * 256 + fromIntegral d)
+                                      in (g2, g')
+                        _         -> error "getBytes assertion"
 
+
+generate :: [Word8] -> Rng
+generate [a,b,c,d] = Rng (fromIntegral a * 256 + fromIntegral b, fromIntegral c * 256 + fromIntegral d)
+generate _ = error "generate assertion: need 4 bytes"
+
 reseed :: B.ByteString -> Rng -> Rng
 reseed bs (Rng (a,b)) = Rng (fromIntegral a', b')
         where a' = foldl' (\v i -> ((fromIntegral v) + (fromIntegral i) * 36969) `mod` 65536) a l
@@ -35,4 +47,4 @@
               l  = B.unpack bs
 
 rng :: Rng
-rng = Rng (1,2) 
+rng = Rng (2,2)
diff --git a/crypto-pubkey.cabal b/crypto-pubkey.cabal
--- a/crypto-pubkey.cabal
+++ b/crypto-pubkey.cabal
@@ -1,5 +1,5 @@
 Name:                crypto-pubkey
-Version:             0.1.4
+Version:             0.2.0
 Description:
     Public Key cryptography
     .
@@ -27,10 +27,11 @@
 Library
   Build-Depends:     base >= 4 && < 5
                    , bytestring
-                   , crypto-random-api >= 0.2 && < 0.3
+                   , byteable
+                   , crypto-random >= 0.0 && < 0.1
                    , crypto-pubkey-types >= 0.4 && < 0.5
-                   , cryptohash >= 0.8
-                   , crypto-numbers
+                   , cryptohash >= 0.9.1
+                   , crypto-numbers >= 0.2
   Exposed-modules:   Crypto.PubKey.RSA
                      Crypto.PubKey.RSA.PKCS15
                      Crypto.PubKey.RSA.OAEP
@@ -51,10 +52,11 @@
   Main-Is:           Tests.hs
   Build-depends:     base >= 4 && < 5
                    , bytestring
+                   , byteable
                    , cryptohash
                    , crypto-pubkey
                    , crypto-numbers
-                   , crypto-random-api
+                   , crypto-random
                    , QuickCheck >= 2
                    , HUnit
                    , test-framework >= 0.3.3
@@ -67,9 +69,8 @@
   type:              exitcode-stdio-1.0
   Build-depends:     base >= 4 && < 5
                    , bytestring
-                   , cprng-aes >= 0.3.0
                    , cryptohash
-                   , crypto-random-api
+                   , crypto-random
                    , crypto-pubkey
                    , criterion
                    , mtl
