diff --git a/Control/Monad/Stream.hs b/Control/Monad/Stream.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Stream.hs
@@ -0,0 +1,80 @@
+-- |
+-- Module      : Control.Monad.Stream
+-- Copyright   : Oleg Kiselyov
+-- License     : PublicDomain
+-- 
+-- Maintainer  : Sebastian Fischer (sebf@informatik.uni-kiel.de)
+-- Stability   : experimental
+-- Portability : portable
+-- 
+-- This Haskell library provides an implementation of the MonadPlus
+-- type class that enumerates results of a non-deterministic
+-- computation by interleaving subcomputations in a way that has
+-- usually much better memory performance than other strategies with
+-- the same termination properties.
+-- 
+-- By using supensions in strategic positions, the user can ensure
+-- that the search does not diverge if there are remaining
+-- non-deterministic results.
+-- 
+-- More information is available on the authors website:
+-- <http://okmij.org/ftp/Computation/monads.html#fair-bt-stream>
+-- 
+-- Warning: @Stream@ is only a monad when the results of @runStream@
+-- are interpreted as a multiset, i.e., a valid transformation
+-- according to the monad laws may change the order of the results.
+-- 
+module Control.Monad.Stream ( Stream, suspended, runStream ) where
+
+import Control.Monad
+
+-- |
+-- Results of non-deterministic computations of type @Stream a@ can be
+-- enumerated efficiently.
+-- 
+data Stream a = Nil | Single a | Cons a (Stream a) | Susp (Stream a)
+
+-- |
+-- Suspensions can be used to ensure fairness.
+-- 
+suspended :: Stream a -> Stream a
+suspended = Susp
+
+-- |
+-- The function @runStream@ enumerates the results of a
+-- non-deterministic computation.
+-- 
+runStream :: Stream a -> [a]
+runStream Nil         = []
+runStream (Single x)  = [x]
+runStream (Cons x xs) = x : runStream xs
+runStream (Susp xs)   = runStream xs
+
+instance Monad Stream
+ where
+  return = Single
+
+  Nil       >>= _ = Nil
+  Single x  >>= f = f x
+  Cons x xs >>= f = f x `mplus` suspended (xs >>= f)
+  Susp xs   >>= f = suspended (xs >>= f)
+
+instance MonadPlus Stream
+ where
+  mzero = Nil
+
+  Nil       `mplus` ys = suspended ys             -- suspending
+  Single x  `mplus` ys = Cons x ys
+  Cons x xs `mplus` ys = Cons x (ys `mplus` xs)   -- interleaving
+  Susp xs   `mplus` ys = ys `splus` xs            -- using `splus`
+
+-- The function `splus` is similar to `mplus` but suspends its result
+-- if the first argument is a suspension. It uses `mplus` in recursive
+-- calls.
+--
+splus :: Stream a -> Stream a -> Stream a
+Nil       `splus` ys = suspended ys
+Single x  `splus` ys = Cons x ys
+Cons x xs `splus` ys = Cons x (ys `mplus` xs)
+Susp xs   `splus` ys = suspended (ys `mplus` xs)  -- suspending
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,15 @@
+ALL PUBLIC DOMAIN MATERIAL IS OFFERED AS-IS. NO REPRESENTATIONS OR
+WARRANTIES OF ANY KIND ARE MADE CONCERNING THE MATERIALS, EXPRESS,
+IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION,
+WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR
+PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
+ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
+DISCOVERABLE.
+
+IN NO EVENT WILL THE AUTHOR(S), PUBLISHER(S), OR PRESENTER(S) OF ANY
+PUBLIC DOMAIN MATERIAL BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY
+SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
+ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF THE
+AUTHOR(S), PUBLISHER(S), OR PRESENTER(S) HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,13 @@
+Simple, Fair and Terminating Backtracking Monad
+===============================================
+
+This Haskell library provides an implementation of the MonadPlus type
+class that enumerates results of a non-deterministic computation by
+interleaving subcomputations in a way that has usually much better
+memory performance than other strategies with the same termination
+properties.
+
+More information is available on the authors website:
+
+    http://okmij.org/ftp/Computation/monads.html#fair-bt-stream
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,4 @@
+import Distribution.Simple
+
+main = defaultMain
+
diff --git a/stream-monad.cabal b/stream-monad.cabal
new file mode 100644
--- /dev/null
+++ b/stream-monad.cabal
@@ -0,0 +1,30 @@
+Name:          stream-monad
+Version:       0.1
+Cabal-Version: >= 1.6
+Synopsis:      Simple, Fair and Terminating Backtracking Monad
+Description:   This Haskell library provides an implementation of the
+               MonadPlus type class that enumerates results of a
+               non-deterministic computation by interleaving
+               subcomputations in a way that has usually much better
+               memory performance than other strategies with the same
+               termination properties.
+Category:      Control, Monads
+License:       PublicDomain
+License-File:  LICENSE
+Author:        Oleg Kiselyov
+Maintainer:    Sebastian Fischer (sebf@informatik.uni-kiel.de)
+Bug-Reports:   mailto:sebf@informatik.uni-kiel.de
+Homepage:      http://github.com/sebfisch/stream-monad
+Build-Type:    Simple
+Stability:     experimental
+
+Extra-Source-Files: README
+
+Library
+  Build-Depends:    base
+  Exposed-Modules:  Control.Monad.Stream
+  Ghc-Options:      -Wall
+
+Source-Repository head
+  type:     git
+  location: git://github.com/sebfisch/stream-monad.git
