diff --git a/HCL.cabal b/HCL.cabal
--- a/HCL.cabal
+++ b/HCL.cabal
@@ -1,5 +1,5 @@
 Name:           HCL
-Version:        1.6
+Version:        1.7
 License:        BSD3
 Author:         Justin Bailey
 Homepage:       http://github.com/m4dc4p/hcl/tree/master
@@ -37,7 +37,6 @@
   other-modules:
     Spec.AndReq
     Spec.Constructors
-    Spec.Common
     Spec.NotReq
     Spec.OrReq
     Spec.ReqIf
diff --git a/src/System/Console/HCL.hs b/src/System/Console/HCL.hs
--- a/src/System/Console/HCL.hs
+++ b/src/System/Console/HCL.hs
@@ -279,11 +279,13 @@
   
 -}
 
+{-# LANGUAGE ScopedTypeVariables #-}
+
 module System.Console.HCL 
 (
 -- * Request type and related functions
-  Request,
-  runRequest, execReq, reqIO, makeReq,
+  Request (..),
+  runRequest, execReq, reqIO, reqLiftMaybe, makeReq,
 -- * Request building blocks
   reqResp, reqInteger, reqInt, reqRead, reqChar, reqPassword,
 -- * Functions lifted into Requests
@@ -306,6 +308,7 @@
 import System.Random
 import Data.Maybe (isNothing, isJust)
 import Control.Applicative (Alternative (..))
+import Control.Exception (catch, IOException)
 import Control.Monad (when, MonadPlus)
 import Control.Monad.Trans 
 
@@ -406,12 +409,14 @@
 type. Same as @liftIO@ in "MonadIO" class (in @Control.Monad.Trans@ module) -}
 reqIO :: IO a -- ^ IO action to perform
          -> Request a -- ^ Result of the IO action, as a Request.
-reqIO io = Request ioVal
-  where
-    ioVal =
-      do
-        val <- io
-        return $ Just val
+reqIO io = Request $ catch (fmap Just io) $
+  \(_ :: IOException) -> return Nothing
+
+{- |
+Lifts a @"Maybe" a@ into a @'Request' a@. -}
+reqLiftMaybe :: Maybe a -- ^ the value to lift
+                -> Request a -- ^ the resulting 'Request'
+reqLiftMaybe = Request . return
 
 {- |
 The basic request - get a string from the user. If a newline or all whitespace
diff --git a/test/Spec/AndReq.hs b/test/Spec/AndReq.hs
--- a/test/Spec/AndReq.hs
+++ b/test/Spec/AndReq.hs
@@ -4,8 +4,6 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "andReq" $ TestList $ map test'
   [ ( Nothing,    Nothing,    Nothing    )
   , ( Just False, Nothing,    Just False )
@@ -19,5 +17,5 @@
 
 test' (x, y, expect) = let label = show x ++ " andReq " ++ show y
   in TestLabel label $ TestCase $ do
-    val <- runRequest $ req x `andReq` req y
+    val <- runRequest $ reqLiftMaybe x `andReq` reqLiftMaybe y
     assertEqual "" val expect
diff --git a/test/Spec/Common.hs b/test/Spec/Common.hs
deleted file mode 100644
--- a/test/Spec/Common.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Spec.Common where
-
-import Test.HUnit
-
-import System.Console.HCL
-
-req x = case x of
-  Just x  -> makeReq x
-  Nothing -> reqFail
diff --git a/test/Spec/Constructors.hs b/test/Spec/Constructors.hs
--- a/test/Spec/Constructors.hs
+++ b/test/Spec/Constructors.hs
@@ -4,14 +4,35 @@
 
 import System.Console.HCL
 
-tests = TestLabel "constructors" $ TestList [makeReqTests, reqFailTest]
+tests = TestLabel "constructors" $ TestList
+  [ makeReqTests
+  , reqFailTest
+  , reqLiftMaybeTests
+  , reqIOTests
+  ]
 
-makeReqTests = TestLabel "makeReq" $ TestList $ map test' [ True, False ]
+makeReqTests = TestLabel "makeReq" $ TestList $ map makeReqTest [ True, False ]
 
-test' x = TestLabel (show x) $ TestCase $ do
+makeReqTest x = TestLabel (show x) $ TestCase $ do
   val <- runRequest $ makeReq x
   assertEqual "" (Just x) val
 
 reqFailTest = TestLabel "reqFail" $ TestCase $ do
   val <- runRequest (reqFail :: Request ())
   assertEqual "" Nothing val
+
+reqLiftMaybeTests = TestLabel "reqMaybe" $ TestList $ map reqLiftMaybeTest
+  [Nothing, Just ()]
+
+reqLiftMaybeTest x = TestLabel (show x) $ TestCase $ do
+  val <- runRequest $ reqLiftMaybe x
+  assertEqual "" x val
+
+reqIOTests = TestLabel "reqIO" $ TestList $ map reqIOTest
+  [ ( "success", return (), Just () )
+  , ( "failure", fail "",   Nothing )
+  ]
+
+reqIOTest (label, x, expect) = TestLabel label $ TestCase $ do
+  val <- runRequest $ reqIO x
+  assertEqual "" expect val
diff --git a/test/Spec/NotReq.hs b/test/Spec/NotReq.hs
--- a/test/Spec/NotReq.hs
+++ b/test/Spec/NotReq.hs
@@ -4,8 +4,6 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "notReq" $ TestList $ map test'
   [ ( Nothing,    Nothing    )
   , ( Just False, Just True  )
@@ -14,5 +12,5 @@
 
 test' (x, expect) = let label = "notReq " ++ show x in
   TestLabel label $ TestCase $ do
-    val <- runRequest $ notReq $ req x
+    val <- runRequest $ notReq $ reqLiftMaybe x
     assertEqual "" expect val
diff --git a/test/Spec/OrReq.hs b/test/Spec/OrReq.hs
--- a/test/Spec/OrReq.hs
+++ b/test/Spec/OrReq.hs
@@ -4,8 +4,6 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "orReq" $ TestList $ map test'
   [ ( Nothing,    Nothing,    Nothing    )
   , ( Just True,  Nothing,    Just True  )
@@ -19,5 +17,5 @@
 
 test' (x, y, expect) = let label = show x ++ " orReq " ++ show y
   in TestLabel label $ TestCase $ do
-    val <- runRequest $ req x `orReq` req y
+    val <- runRequest $ reqLiftMaybe x `orReq` reqLiftMaybe y
     assertEqual "" val expect
diff --git a/test/Spec/ReqIf.hs b/test/Spec/ReqIf.hs
--- a/test/Spec/ReqIf.hs
+++ b/test/Spec/ReqIf.hs
@@ -4,8 +4,6 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "reqIf" $ TestList $ map test'
   [ ( Nothing,    Nothing  )
   , ( Just True,  Just 'a' )
@@ -14,5 +12,5 @@
 
 test' (x, expect) = let label = "reqIf " ++ show x in
   TestLabel label $ TestCase $ do
-    val <- runRequest $ reqIf (req x) (return 'a') (return 'b')
+    val <- runRequest $ reqIf (reqLiftMaybe x) (return 'a') (return 'b')
     assertEqual "" expect val
diff --git a/test/Spec/ReqLift.hs b/test/Spec/ReqLift.hs
--- a/test/Spec/ReqLift.hs
+++ b/test/Spec/ReqLift.hs
@@ -4,13 +4,11 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "reqLift" $ TestList $ map test'
   [ ( Nothing, Nothing )
   , ( Just 1,  Just 2  )
   ]
 
 test' (x, expect) = TestLabel (show x) $ TestCase $ do
-  val <- runRequest $ reqLift succ $ req x
+  val <- runRequest $ reqLift succ $ reqLiftMaybe x
   assertEqual "" expect val
diff --git a/test/Spec/ReqLift2.hs b/test/Spec/ReqLift2.hs
--- a/test/Spec/ReqLift2.hs
+++ b/test/Spec/ReqLift2.hs
@@ -4,8 +4,6 @@
 
 import System.Console.HCL
 
-import Spec.Common
-
 tests = TestLabel "reqLift2" $ TestList $ map test'
   [ ( Nothing, Nothing, Nothing )
   , ( Just 1,  Nothing, Nothing )
@@ -15,5 +13,5 @@
 
 test' (x, y, expect) = let label = show x ++ " + " ++ show y in
   TestLabel label $ TestCase $ do
-    val <- runRequest $ reqLift2 (+) (req x) (req y)
+    val <- runRequest $ reqLift2 (+) (reqLiftMaybe x) (reqLiftMaybe y)
     assertEqual "" expect val
