diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013, Clark Gaebel
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * 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.
+
+    * Neither the name of Clark Gaebel nor the names of other
+      contributors may 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.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/System/Random/Effect.hs b/System/Random/Effect.hs
new file mode 100644
--- /dev/null
+++ b/System/Random/Effect.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE FlexibleContexts #-}
+-- | A random number effect, using a pure mersenne twister under
+--   the hood. This should be plug-and-play with any application
+--   making use of extensible effects.
+--
+--   Patches, even for the smallest of documentation bugs, are
+--   always welcome!
+module System.Random.Effect ( Random
+                            , mkRandom
+                            , mkRandomIO
+                            , randomInt
+                            , randomInt64
+                            , randomWord
+                            , randomWord64
+                            , randomDouble
+                            ) where
+
+import Data.Int
+import Data.Typeable
+import Data.Word
+import qualified System.Random.Mersenne.Pure64 as SR
+
+import Control.Eff
+import Control.Eff.State
+import Control.Eff.Lift
+
+-- | A pure mersenne twister pseudo-random number generator.
+data Random = Random {-# UNPACK #-} !SR.PureMT
+    deriving Typeable
+
+-- | Create a random number generator from a 'Word64' seed.
+mkRandom :: Word64 -> Random
+mkRandom = Random . SR.pureMT
+{-# INLINE mkRandom #-}
+
+-- | Create a new random number generator, using the clocktime as the base for
+--   the seed. This must be called from a computation with a lifted base effect
+--   of 'IO'.
+mkRandomIO :: Member (Lift IO) r
+           => Eff r Random
+mkRandomIO = lift (fmap Random SR.newPureMT)
+{-# INLINE mkRandomIO #-}
+
+-- | Runs an effectful random computation, returning the computation's result.
+runRandomState :: Random
+               -> Eff (State Random :> r) w
+               -> Eff r w
+runRandomState seed computation =
+    fmap snd (runState seed computation)
+{-# INLINE runRandomState #-}
+
+-- | A generalized form of generating a random number of the correct type
+--   from System.Random.Mersenne.Pure64.
+randomF :: Member (State Random) r
+        => (SR.PureMT -> (a, SR.PureMT))
+        -> Eff r a
+randomF f = do
+    (Random old) <- getState
+    let (val, new) = f old
+    putState (Random new)
+    return val
+{-# INLINE randomF #-}
+
+-- | Yield a new 'Int' value from the generator. The full 64 bits will be used
+--   on a 64 bit machine.
+randomInt :: Member (State Random) r => Eff r Int
+randomInt = randomF SR.randomInt
+{-# INLINE randomInt #-}
+
+-- | Yield a new 'Word' value from the generator.
+randomWord :: Member (State Random) r => Eff r Word
+randomWord = randomF SR.randomWord
+{-# INLINE randomWord #-}
+
+-- | Yield a new 'Int64' value from the generator.
+randomInt64 :: Member (State Random) r => Eff r Int64
+randomInt64 = randomF SR.randomInt64
+{-# INLINE randomInt64 #-}
+
+-- | Yield a new 'Word64' value from the generator.
+randomWord64 :: Member (State Random) r => Eff r Word64
+randomWord64 = randomF SR.randomWord64
+{-# INLINE randomWord64 #-}
+
+-- | Yield a new 53-bit precise 'Double' value from the generator.
+randomDouble :: Member (State Random) r => Eff r Double
+randomDouble = randomF SR.randomDouble
+{-# INLINE randomDouble #-}
diff --git a/system-random-effect.cabal b/system-random-effect.cabal
new file mode 100644
--- /dev/null
+++ b/system-random-effect.cabal
@@ -0,0 +1,20 @@
+name:                system-random-effect
+version:             0.1.0.0
+synopsis:            Random number generation for extensible effects.
+homepage:            https://github.com/wowus/system-random-effect
+license:             BSD3
+license-file:        LICENSE
+author:              Clark Gaebel
+maintainer:          cgaebel@uwaterloo.ca
+category:            System
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     System.Random.Effect
+
+  build-depends:       base >=4.6 && <4.7
+                     , extensible-effects == 1.1.*
+                     , mersenne-random-pure64 == 0.2.*
+
+  default-language:    Haskell2010
