diff --git a/hoauth.cabal b/hoauth.cabal
--- a/hoauth.cabal
+++ b/hoauth.cabal
@@ -1,5 +1,5 @@
 name: hoauth
-version: 0.2.3
+version: 0.2.4
 category: Network,Protocol,OAuth
 license: BSD3
 license-file: LICENSE
diff --git a/src/main/haskell/Network/OAuth/Consumer.hs b/src/main/haskell/Network/OAuth/Consumer.hs
--- a/src/main/haskell/Network/OAuth/Consumer.hs
+++ b/src/main/haskell/Network/OAuth/Consumer.hs
@@ -59,6 +59,7 @@
                      -- * OAuthMonad related functions
                      ,runOAuth
                      ,oauthRequest
+                     ,completeRequest
                      ,serviceRequest
                      ,cliAskAuthorization
                      ,ignite
@@ -207,22 +208,26 @@
 -- | Executes an oauth request which is intended to upgrade/refresh the current
 --   token. Use this combinator to get either a request token or an access
 --   token.
-oauthRequest :: (MonadIO m,HttpClient m) => SigMethod -> Maybe Realm -> Request -> OAuthMonad m (Either String Token)
+oauthRequest :: (MonadIO m,HttpClient m) => SigMethod -> Maybe Realm -> Request -> OAuthMonad m Token
 oauthRequest sigm realm req = do response <- serviceRequest sigm realm req
                                  token    <- get
                                  case (fromResponse response token)
-                                  of (Right token') -> do put token'
-                                                          return (Right token')
-                                     (Left err)     -> return (Left err)
+                                   of (Right token') -> do put token'
+                                                           return token'
+                                      (Left err)     -> fail err
 
+-- | Simply complete the request with the required information to perform the oauth request.
+completeRequest :: (MonadIO m) => SigMethod -> Token -> Maybe Realm -> Request -> m Request
+completeRequest sigm token realm req = do nonce     <- _nonce
+                                          timestamp <- _timestamp
+                                          let authValue = authorization sigm realm nonce timestamp token req
+                                          return (req {reqHeaders = insert ("Authorization",authValue) (reqHeaders req)})
+
 -- | Performs a signed request with the available token.
 serviceRequest :: (MonadIO m,HttpClient m) => SigMethod -> Maybe Realm -> Request -> OAuthMonad m Response
-serviceRequest sigm realm req = do nonce     <- _nonce
-                                   timestamp <- _timestamp
-                                   token     <- get
-                                   
-                                   let authValue = authorization sigm realm nonce timestamp token req
-                                   lift (request (req {reqHeaders = insert ("Authorization",authValue) (reqHeaders req)}))
+serviceRequest sigm realm req0 = do token <- get
+                                    req   <- completeRequest sigm token realm req0
+                                    lift (request req)
 
 -- | Extracts the token from the OAuthMonad.
 getToken :: (Monad m) => OAuthMonad m Token
diff --git a/src/main/haskell/Network/OAuth/Http/HttpClient.hs b/src/main/haskell/Network/OAuth/Http/HttpClient.hs
--- a/src/main/haskell/Network/OAuth/Http/HttpClient.hs
+++ b/src/main/haskell/Network/OAuth/Http/HttpClient.hs
@@ -45,14 +45,14 @@
   request :: Request -> m Response
 
   -- | Unpacks the monad and returns the inner IO monad.
-  unlift :: m a -> IO a
+  unpack :: m a -> IO a
 
 -- | The libcurl backend
 newtype CurlM a = CurlM { unCurlM :: IO a }
   deriving (Monad,MonadIO,MonadFix,Functor)
 
 instance HttpClient CurlM where
-  unlift = unCurlM
+  unpack = unCurlM
 
   request req = CurlM $ withCurlDo $ do c <- initialize
                                         setopts c opts
