diff --git a/LICENSE.mt19937-64 b/LICENSE.mt19937-64
deleted file mode 100644
--- a/LICENSE.mt19937-64
+++ /dev/null
@@ -1,54 +0,0 @@
-/* 
-   A C-program for MT19937-64 (2004/9/29 version).
-   Coded by Takuji Nishimura and Makoto Matsumoto.
-
-   This is a 64-bit version of Mersenne Twister pseudorandom number
-   generator.
-
-   Before using, initialize the state by using init_genrand64(seed)  
-   or init_by_array64(init_key, key_length).
-
-   Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura,
-   All rights reserved.                          
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
-
-     1. Redistributions of source code must retain the above copyright
-        notice, this list of conditions and the following disclaimer.
-
-     2. Redistributions in binary form must reproduce the above copyright
-        notice, this list of conditions and the following disclaimer in the
-        documentation and/or other materials provided with the distribution.
-
-     3. The names of its contributors may not be used to endorse or promote 
-        products derived from this software without specific prior written 
-        permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-   References:
-   T. Nishimura, ``Tables of 64-bit Mersenne Twisters''
-     ACM Transactions on Modeling and 
-     Computer Simulation 10. (2000) 348--357.
-   M. Matsumoto and T. Nishimura,
-     ``Mersenne Twister: a 623-dimensionally equidistributed
-       uniform pseudorandom number generator''
-     ACM Transactions on Modeling and 
-     Computer Simulation 8. (Jan. 1998) 3--30.
-
-   Any feedback is very welcome.
-   http://www.math.hiroshima-u.ac.jp/~m-mat/MT/emt.html
-   email: m-mat @ math.sci.hiroshima-u.ac.jp (remove spaces)
-*/
diff --git a/System/Random/Mersenne/Pure64/MTBlock.hs b/System/Random/Mersenne/Pure64/MTBlock.hs
--- a/System/Random/Mersenne/Pure64/MTBlock.hs
+++ b/System/Random/Mersenne/Pure64/MTBlock.hs
@@ -30,7 +30,11 @@
 ) where
 
 import GHC.Exts
+#if __GLASGOW_HASKELL__ >= 706
+import GHC.IO
+#else
 import GHC.IOBase
+#endif
 import GHC.Word
 import System.Random.Mersenne.Pure64.Base
 
diff --git a/TODO b/TODO
deleted file mode 100644
--- a/TODO
+++ /dev/null
@@ -1,17 +0,0 @@
--fvia-C seems to break things!
-   The problem is that the prototypes of the imported functions don't get
-   propagated properly, leading to warnings like this:
-
-   /tmp/ghc7602_0/ghc7602_0.hc:718:0:
-        warning: implicit declaration of function 'mix_bits'
-
-   This is actually an error on 32 bit machines - the default return type
-   int is not large enough to hold the 64 bit result.
-
-   This is fixed in ghc 6.9; the compiler emits its own prototypes.
-Check sequences are repeatable
-Investigate slow conversion to Double (x86 at least)
-   looking at the core, the conversion goes through toInteger and encodeFloat.
-   That's a pity, because the FPU has an instruction for this purpose.
-profile/benchmark
-tests driver
diff --git a/mersenne-random-pure64.cabal b/mersenne-random-pure64.cabal
--- a/mersenne-random-pure64.cabal
+++ b/mersenne-random-pure64.cabal
@@ -1,5 +1,5 @@
 name:            mersenne-random-pure64
-version:         0.2.0.3
+version:         0.2.0.4
 homepage:        http://code.haskell.org/~dons/code/mersenne-random-pure64/
 synopsis:        Generate high quality pseudorandom numbers purely using a Mersenne Twister
 description:
@@ -21,12 +21,16 @@
 category:        Math, System
 license:         BSD3
 license-file:    LICENSE
-copyright:       (c) 2008. Don Stewart <dons@galois.com>
+copyright:       (c) 2008. Don Stewart <dons00@gmail.com>
 author:          Don Stewart
-maintainer:      Don Stewart <dons@galois.com>
-cabal-version:   >= 1.2.0
+maintainer:      Don Stewart <dons00@gmail.com>
+cabal-version:   >= 1.6.0
 build-type:      Simple
-tested-with:     GHC == 6.8.3
+tested-with:     GHC == 7.6.2, GHC == 7.7
+
+source-repository head
+  type: git
+  location: git://github.com/bgamari/mersenne-random-pure64
 
 flag small_base
   description: Build with new smaller base library
diff --git a/tests/Unit.hs b/tests/Unit.hs
deleted file mode 100644
--- a/tests/Unit.hs
+++ /dev/null
@@ -1,165 +0,0 @@
-{-# LANGUAGE BangPatterns #-}
--- A basic correctness and performance test for mersenne-random-pure64.
---
--- Copyright (c) 2008, Don Stewart <dons@galois.com>
-
-import Control.Exception
-import Control.Monad
-import Data.Int
-import Data.Typeable
-import Data.Word
-import System.CPUTime
-import System.Environment
-import System.IO
-import Text.Printf
-import qualified System.Random as Old
-import qualified System.Random.Mersenne as Unsafe
-
-import System.Random.Mersenne.Pure64
-import System.Random.Mersenne.Pure64.Base
-import Control.Concurrent
-import Control.Concurrent.MVar
-
-time :: IO t -> IO t
-time a = do
-    start <- getCPUTime
-    v <- a
-    end   <- getCPUTime
-    let diff = (fromIntegral (end - start)) / (10^12)
-    printf "Computation time: %0.3f sec\n" (diff :: Double)
-    return v
-
-seed = 7
-
-main = do
-
-    c_init_genrand64_unsafe seed
-    let g = pureMT (fromIntegral seed)
-
-    ------------------------------------------------------------------------
-    -- calibrate
-    s <- newMVar 0 :: IO (MVar Int)
-    putStr "Calibrating ... " >> hFlush stdout
-
-    tid <- forkIO $ do
-        let go !i !g = do
-                let (!_, !g') = randomWord64 g
-                x <- swapMVar s i
-                x `seq` go (i+1) g'
-        go 0 g
-
-    threadDelay (1000 * 1000)
-    killThread tid
-    lim <- readMVar s -- 1 sec worth of generation
-    putStrLn $ "done. Using N=" ++ show lim
-
-    time $ do
-        let m = 2*lim
-        putStr $ "Checking against released mt19937-64.c to depth " ++ show m ++ " "
-        hFlush stdout
-        equivalent g m
-
-    speed lim
-
-    return ()
-
-------------------------------------------------------------------------
-
-equivalent !g !n | n > 0 = do
-
-    i'      <- c_genrand64_int64_unsafe
-    d'      <- c_genrand64_real2_unsafe
-
-    let (i, g')  = randomWord64 g
-        (d, g'') = randomDouble g'
-
-    if i == fromIntegral i' && d == realToFrac d'
-        then do when (n `rem` 500000 == 0) $ putChar '.' >> hFlush stdout
-                equivalent g'' (n-1)
-
-        else do print $ "Failed! " ++ show ((i,i') , (d,d'))
-                return g''
-
-equivalent g _ = do putStrLn "Matches model!"
-                    return g
-
-------------------------------------------------------------------------
--- compare with System.Random
-
--- overhead cause by random's badness
-speed lim = do
-
- time $ do
-    putStrLn $ "System.Random"
-    let g = Old.mkStdGen 5
-    let go :: Old.StdGen -> Int -> Int -> Int
-        go !g !n !acc
-            | n >= lim = acc
-            | otherwise     =
-                    let (a, g') = Old.random g
-                    in go g' (n+1) (if a > acc then a else acc)
-    print (go g 0 0)
-
- time $ do
-    putStrLn $ "System.Random with our generator"
-    let g = pureMT 5
-    let go :: PureMT -> Int -> Int -> Int
-        go !g !n !acc
-            | n >= lim = acc
-            | otherwise     =
-                    let (a,g') = Old.random g
-                    in go g' (n+1) (if a > acc then a else acc)
-    print (go g 0 0)
-
- time $ do
-    putStrLn $ "System.Random.Mersenne.Pure"
-    let g = pureMT 5
-    let go :: PureMT -> Int -> Int -> Int
-        go !g !n !acc
-            | n >= lim = acc
-            | otherwise     =
-                    let (a',g') = randomWord64 g
-                        a = fromIntegral a'
-                    in go g' (n+1) (if a > acc then a else acc)
-    print (go g 0 0)
-
- time $ do
-    putStrLn $ "System.Random.Mersenne.Pure generating Double"
-    let g = pureMT 5
-    let go :: PureMT -> Int -> Double -> Double
-        go !g !n !acc
-            | n >= lim = acc
-            | otherwise     =
-                    let (a, g') = randomDouble g
-                    in go g' (n+1) (if a > acc then a else acc)
-    print (go g 0 0)
-
- time $ do
-    putStrLn $ "System.Random.Mersenne.Pure (unique state)"
-    c_init_genrand64_unsafe 5
-    let go :: Int -> Int -> IO Int
-        go !n !acc
-            | n >= lim = return acc
-            | otherwise     = do
-                    a' <- c_genrand64_int64_unsafe
-                    let a = fromIntegral a'
-                    go (n+1) (if a > acc then a else acc)
-    print =<< go 0 0
-
- time $ do
-    putStrLn $ "System.Random.Mersenne.Unsafe"
-    g <- Unsafe.newMTGen (Just 5)
-
-    let go :: Int -> Int -> IO Int
-        go !n !acc
-            | n >= lim = return acc
-            | otherwise     = do
-                    a <- Unsafe.random g
-                    go (n+1) (if a > acc then a else acc)
-
-    print =<< go 0 0
-
-
---    printf "MT is %s times faster generating %s\n" (show $x`div`y) (show (typeOf ty))
---    return ()
-
diff --git a/tests/copy.hs b/tests/copy.hs
deleted file mode 100644
--- a/tests/copy.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-{-# LANGUAGE BangPatterns #-}
-
-import System.Random.Mersenne.Pure64
-
-main = do
-
-    let g = pureMT 7
-
-    let go :: Int -> PureMT -> IO ()
-        go 0 !p = return ()
-        go n !p  = do
-            let (_,q) = randomWord p
-            go (n-1) q
-
-    go 10000000 g -- 10s constant space
