diff --git a/Control/Monad/Product.hs b/Control/Monad/Product.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Product.hs
@@ -0,0 +1,58 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Monad.Product
+-- Copyright   :  (C) 2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- Monad Products 
+----------------------------------------------------------------------------
+
+module Control.Monad.Product
+  ( Product(..)
+  ) where
+
+import Control.Applicative
+import Data.Functor.Bind
+import Data.Functor.Alt
+import Control.Monad
+
+-- | disjoint 'Graph' union as a 'Monad' product
+newtype Product g h a = Product { runProduct :: (g a, h a) } 
+
+instance (Functor g, Functor h) => Functor (Product g h) where
+  fmap f (Product (g, h)) = Product (fmap f g, fmap f h)
+  b <$ Product (g, h) = Product (b <$ g, b <$ h)
+
+instance (Apply g, Apply h) => Apply (Product g h) where
+  Product (gf, hf) <.> Product (ga, ha) = Product (gf <.> ga, hf <.> ha)
+  Product (gf, hf) <.  Product (ga, ha) = Product (gf <.  ga, hf <.  ha)
+  Product (gf, hf)  .> Product (ga, ha) = Product (gf  .> ga, hf  .> ha)
+
+instance (Applicative g, Applicative h) => Applicative (Product g h) where
+  pure a = Product (pure a, pure a)
+  Product (gf, hf) <*> Product (ga, ha) = Product (gf <*> ga, hf <*> ha)
+  Product (gf, hf) <*  Product (ga, ha) = Product (gf <*  ga, hf <*  ha)
+  Product (gf, hf)  *> Product (ga, ha) = Product (gf  *> ga, hf  *> ha)
+
+instance (Bind g, Bind h) => Bind (Product g h) where
+  Product (g, h) >>- k = Product (g >>- fst . runProduct . k, h >>- snd . runProduct . k)
+  
+instance (Monad g, Monad h) => Monad (Product g h) where
+  return a = Product (return a, return a)
+  Product (g, h) >>= k = Product (g >>= fst . runProduct . k, h >>= snd . runProduct . k)
+  Product (ga, ha) >> Product (gb, hb) = Product (ga >> gb, ha >> hb)
+
+instance (Alt g, Alt h) => Alt (Product g h) where
+  Product (ga, ha) <!> Product (gb, hb) = Product (ga <!> gb, ha <!> hb)
+
+instance (Alternative g, Alternative h) => Alternative (Product g h) where
+  empty = Product (empty, empty)
+  Product (ga, ha) <|> Product (gb, hb) = Product (ga <|> gb, ha <|> hb)
+
+instance (MonadPlus g, MonadPlus h) => MonadPlus (Product g h) where
+  mzero = Product (mzero, mzero)
+  Product (ga, ha) `mplus` Product (gb, hb) = Product (ga `mplus` gb, ha `mplus` hb)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright 2011 Edward Kmett
+
+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. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,7 @@
+#!/usr/bin/runhaskell
+> module Main (main) where
+
+> import Distribution.Simple
+
+> main :: IO ()
+> main = defaultMain
diff --git a/monad-products.cabal b/monad-products.cabal
new file mode 100644
--- /dev/null
+++ b/monad-products.cabal
@@ -0,0 +1,28 @@
+name:          monad-products
+category:      Control, Monads
+version:       0.2.0
+license:       BSD3
+cabal-version: >= 1.6
+license-file:  LICENSE
+author:        Edward A. Kmett
+maintainer:    Edward A. Kmett <ekmett@gmail.com>
+stability:     provisional
+homepage:      http://github.com/ekmett/monad-products
+copyright:     Copyright (C) 2011 Edward A. Kmett
+synopsis:      Haskell 98 monad products
+description:   Haskell 98 monad products
+build-type:    Simple
+
+source-repository head
+  type: git
+  location: git://github.com/ekmett/monad-products.git
+
+library
+  build-depends: 
+    base >= 4 && < 4.4,
+    semigroupoids >= 1.2.1 && < 1.3.0
+
+  exposed-modules:
+    Control.Monad.Product
+
+  ghc-options: -Wall 
