diff --git a/Control/Monad/Extra.hs b/Control/Monad/Extra.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Extra.hs
@@ -0,0 +1,47 @@
+module Control.Monad.Extra where
+
+import Control.Applicative
+import Control.Monad.Trans.Cont
+
+-- | Synonym for @return ()@.
+skip :: Monad m => m ()
+skip = return ()
+
+-- | Synonym for @pure ()@.
+obvious :: Applicative f => f ()
+obvious = pure ()
+
+-- | Function name for '>>=', as 'fmap' is to '<$>'.
+bind :: Monad m => m a -> (a -> m b) -> m b
+bind = (>>=)
+
+-- | Combinator for working with monadic values:
+--
+-- >>> om when (return True) $ print "Hello"
+-- "Hello"
+-- >>> return True >>= flip when (print "Hello")
+-- "Hello"
+-- >>> om forM_ (return [True]) print
+-- True
+-- >>> flip forM_ print =<< return [True]
+-- True
+-- >>> mapM_ print =<< return [True]
+-- True
+--
+-- Subsumes the need for individual functions for 'whenM', 'unlessM', etc.
+om :: Monad m => (a -> b -> m c) -> m a -> b -> m c
+om f m = (m >>=) . flip f
+
+-- | Variant of 'om' which changes the roles of the 2nd and 3rd arguments.
+--
+-- >>> nom mapM_ print $ return [True]
+-- True
+-- >>> mapM_ print =<< return [True]
+-- True
+nom :: Monad m => (a -> b -> m c) -> a -> m b -> m c
+nom f x m = m >>= f x
+
+-- | Convenience function if all you want to use is
+--   'Control.Monad.Trans.Cont.callCC'.
+doCallCC :: Monad m => ((r -> ContT r m b) -> ContT r m r) -> m r
+doCallCC = flip runContT return . callCC
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013, John Wiegley, Chriys Done
+
+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 John Wiegley, Chriys Done 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/monad-extras.cabal b/monad-extras.cabal
new file mode 100644
--- /dev/null
+++ b/monad-extras.cabal
@@ -0,0 +1,21 @@
+name:           monad-extras
+version:        0.1.0.0
+synopsis:       Extra utility functions for working with monads
+-- description: 
+homepage:       http://github.com/jwiegley/monad-extras
+license:        BSD3
+license-file:   LICENSE
+author:         John Wiegley, Chris Done
+maintainer:     johnw@fpcomplete.com
+-- copyright:   
+category:       Control
+build-type:     Simple
+cabal-version:  >=1.10
+
+library
+    default-language: Haskell98
+    exposed-modules:     
+        Control.Monad.Extra
+    build-depends:
+        base >= 4 && < 5
+      , transformers
