diff --git a/Network/Curl.hs b/Network/Curl.hs
--- a/Network/Curl.hs
+++ b/Network/Curl.hs
@@ -39,6 +39,8 @@
        , curlGet             -- :: URLString -> [CurlOption] -> IO ()
        , curlGetString       -- :: URLString -> [CurlOption] -> IO (CurlCode, String)
        , curlGetResponse     -- :: URLString -> [CurlOption] -> IO CurlResponse
+       , perform_with_response -- :: Curl -> IO CurlResponse
+       , do_curl
 
           -- probing for gold..
        , curlHead            -- :: URLString
@@ -63,6 +65,7 @@
        , method_HEAD         -- :: [CurlOption]
        , method_POST         -- :: [CurlOption]
 
+       , parseStatusNHeaders, concRev
        ) where
 
 import Network.Curl.Opts
@@ -176,19 +179,53 @@
   setopt  h (CurlWriteFunction (gatherOutput body_ref))
   setopt  h (CurlHeaderFunction (gatherOutput hdr_ref))
   mapM_ (setopt h) opts
-  rc       <- perform h
-  bss      <- readIORef body_ref
-  hss      <- readIORef hdr_ref
-  rspCode  <- getResponseCode h
-  let (st,hs) = parseStatusNHeaders (concRev [] hss)
-  return CurlResponse
-    { respCurlCode   = rc
-    , respStatus     = rspCode
-    , respStatusLine = st
-    , respHeaders    = hs
-    , respBody       = concRev [] bss
-    , respGetInfo    = getInfo h  -- note: we're holding onto the handle here..
-    }
+  -- note that users cannot over-write the body and header handler
+  -- which makes sense because otherwise we will return a bogus reposnse.
+  perform_with_response h
+
+
+
+-- | Perform the actions already specified on the handle.
+-- Collects useful information about the returned message.
+-- Note that this function sets the
+-- 'CurlWriteFunction' and 'CurlHeaderFunction' options.
+perform_with_response :: Curl -> IO CurlResponse
+perform_with_response h =
+  do body_ref <- newIORef []
+     hdr_ref <- newIORef []
+
+     -- Insted of allocating a swparate handler for each
+     -- request we could just set this options one and forall
+     -- and just clear the IORefs.
+
+     setopt  h (CurlWriteFunction (gatherOutput body_ref))
+     setopt  h (CurlHeaderFunction (gatherOutput hdr_ref))
+     rc       <- perform h
+     bss      <- readIORef body_ref
+     hss      <- readIORef hdr_ref
+     rspCode  <- getResponseCode h
+     let (st,hs) = parseStatusNHeaders (concRev [] hss)
+     return CurlResponse
+       { respCurlCode   = rc
+       , respStatus     = rspCode
+       , respStatusLine = st
+       , respHeaders    = hs
+       , respBody       = concRev [] bss
+       -- note: we're holding onto the handle here..
+       -- note: with this interface this is not neccessary.
+       , respGetInfo    = getInfo h
+       }
+
+-- | Performs a curl request using an exisitng curl handle.
+-- The provided URL will overwride any 'CurlURL' options that
+-- are provided in the list of options.  See also: 'perform_with_response'.
+do_curl :: Curl -> URLString -> [CurlOption] -> IO CurlResponse
+do_curl h url opts =
+  do setDefaultSSLOpts h url
+     setopts h opts
+     setopt h (CurlURL url)
+     perform_with_response h
+
 
 -- | Get the headers associated with a particular URL.
 -- Returns the status line and the key-value pairs for the headers.
diff --git a/curl.cabal b/curl.cabal
--- a/curl.cabal
+++ b/curl.cabal
@@ -1,5 +1,5 @@
 name:               curl
-version:            1.3.1
+version:            1.3.2
 synopsis:           Haskell binding to libcurl
 description:
     libcurl is a client-side URL transfer library, supporting FTP, FTPS, HTTP,
@@ -35,10 +35,10 @@
 
   Extra-libraries: curl
   Extensions:      CPP, ForeignFunctionInterface
-  Ghc-options:     -Wall -fvia-C -O2
+  Ghc-options:     -Wall -fvia-C
 
   Build-Depends: base
   if flag(new-base)
-    Build-depends: base >= 3, containers, haskell98
+    Build-depends: base >= 3, containers
   else
     Build-depends: base < 3
