diff --git a/Control/Monad/IfElse.hs b/Control/Monad/IfElse.hs
--- a/Control/Monad/IfElse.hs
+++ b/Control/Monad/IfElse.hs
@@ -70,6 +70,18 @@
 aifM :: Monad m => m (Maybe a) -> (a -> m b) -> m b -> m b
 aifM test ifclause elseclause = test >>= \t -> aif t ifclause elseclause
 
+-- | Contrapositive of whenM, if not x then do y
+unlessM a = whenM (liftM not $ a)
+
+-- | unless-else chain.
+ncond [] = return ()
+ncond ((test , action) : rest) = if not test then action else ncond rest
+
+-- | monadic unless-else chain
+ncondM :: Monad m => [(m Bool, m ())] -> m ()
+ncondM [] = return ()
+ncondM ((test , action) : rest) = test >>= \t -> if not t then action else ncondM rest
+
 -- | IO lifted @ && @
 (&&^) = liftM2 (&&)
 
@@ -80,6 +92,14 @@
 (>>?) = when
 infixl 1 >>?
 
+-- | unless the left side is true, perform the right action
+(>>!) = unless
+infixl 1 >>!
+
+-- | unless the (monadic) left side is true, perform the right action
+(>>=>>!) = unlessM
+infixl 1 >>=>>!
+
 -- | Bind the result of the last expression in an anaphoric when.  
 (>>=?) = awhen
 infixl 1 >>=?
@@ -91,3 +111,51 @@
 -- | composition of @ >>= @ and @ >>=? @
 (>>=>>=?) = awhenM
 infixl 1 >>=>>=?
+
+--
+-- The following is from Control.Monad.Extras by Wren Thornton.
+--
+
+-- | Execute a monadic action so long as a monadic boolean returns
+-- true.
+{-# SPECIALIZE whileM :: IO Bool -> IO () -> IO () #-}
+whileM                :: (Monad m) => m Bool -> m () -> m ()
+whileM mb m = do b <- mb ; when b (m >> whileM mb m)
+
+
+-- Named with M because 'Prelude.until' exists
+-- | Negation of 'whileM': execute an action so long as the boolean
+-- returns false.
+{-# SPECIALIZE untilM :: IO Bool -> IO () -> IO () #-}
+untilM                :: (Monad m) => m Bool -> m () -> m ()
+untilM mb m = do b <- mb ; unless b (m >> untilM mb m)
+
+
+-- | Strict version of 'return' because usually we don't need that
+-- extra thunk.
+{-# INLINE return' #-}
+return'  :: (Monad m) => a -> m a
+return' x = return $! x
+
+
+-- | Take an action and make it into a side-effecting 'return'.
+-- Because I seem to keep running into @m ()@ and the like.
+infixr 8 `returning`
+{-# INLINE returning #-}
+returning      :: (Monad m) => (a -> m b) -> (a -> m a)
+f `returning` x = f x >> return x
+
+
+-- For reference this is also helpful:
+-- >    liftM2 (>>) f g == \x -> f x >> g x
+
+
+-- | This conversion is common enough to make a name for.
+{-# INLINE maybeMP #-}
+maybeMP :: (MonadPlus m) => Maybe a -> m a
+maybeMP  = maybe mzero return
+
+-- This rule should only fire when type-safe
+{-# RULES "maybeMP/id" maybeMP = id #-}
+
+
diff --git a/IfElse.cabal b/IfElse.cabal
--- a/IfElse.cabal
+++ b/IfElse.cabal
@@ -1,9 +1,9 @@
 Name:           IfElse
-Version:        0.82
+Version:        0.85
 Cabal-Version:  >= 1.2
 License:        BSD3
 License-File:   LICENSE
-Author:         J.R. Heard
+Author:         J.R. Heard and Wren Thornton
 Maintainer:     J.R. Heard
 Category:       Control
 Description:    Anaphoric and miscellaneous useful control-flow
