diff --git a/Network/IHttp/Header.hs b/Network/IHttp/Header.hs
--- a/Network/IHttp/Header.hs
+++ b/Network/IHttp/Header.hs
@@ -31,6 +31,18 @@
 import Network.IHttp.Types
 
 
+-- TODO: Turn a 'HeaderMap' to a record of common headers.
+
+-- commonHeaders :: HeaderMap -> CommonHeaders
+-- commonHeaders m =
+--     let (ctype, charset) = do
+--             typeStr <- M.lookup "CONTENT-TYPE" m
+
+--     CommonHeaders { contentCharsetHeader = undefined,
+--                     contentLengthHeader = undefined,
+--                     contentTypeHeader = undefined }
+
+
 -- | Enumerate a 'HeaderMap' as a protocol string stream.  You can use
 -- 'Data.Enumerator.Binary.iterHandle' to send it.  Note that this
 -- enumerator never generates continuation lines.  It also does not
diff --git a/Network/IHttp/Parsers.hs b/Network/IHttp/Parsers.hs
--- a/Network/IHttp/Parsers.hs
+++ b/Network/IHttp/Parsers.hs
@@ -32,6 +32,18 @@
 import Network.IHttp.Types
 
 
+-- TODO: Parse the content of the *Content-Type* header to MIME type and set
+-- of parameters.
+
+-- contentTypeP :: Parser (ByteString, Map ByteString ByteString)
+-- contentTypeP =
+--     contType <- httpTokenP
+--     char '/'
+--     subType <- httpTokenP
+--     char ';'
+--     skipSpace
+
+
 -- | Parse an HTTP status code.
 
 httpCodeP :: Parser Int
diff --git a/Network/IHttp/Request.hs b/Network/IHttp/Request.hs
--- a/Network/IHttp/Request.hs
+++ b/Network/IHttp/Request.hs
@@ -16,11 +16,15 @@
 
       -- * Enumerators
       enumRequest,
-      enumRequestLine
+      enumRequestLine,
+
+      -- * Helper functions
+      mkGetRequest
     )
     where
 
 import qualified Data.ByteString as B
+import qualified Data.Map as M
 import Data.ByteString (ByteString)
 import Data.Enumerator as E
 import Data.Enumerator.List as EL
@@ -65,6 +69,17 @@
                   showVersion version, "\r\n" ]
         where
         space = B.singleton 32
+
+
+-- | Construct a HTTP 1.1 GET request with the given domain (first
+-- argument) and URI (second argument).
+
+mkGetRequest :: ByteString -> ByteString -> Request
+mkGetRequest domain uri =
+    Request { requestHeaders = M.singleton "Host" domain,
+              requestMethod = GetMethod,
+              requestUri = uri,
+              requestVersion = Http1_1 }
 
 
 -- | Get the next full request from a 'netLinesEmpty'-splitted byte
diff --git a/Network/IHttp/Simple.hs b/Network/IHttp/Simple.hs
--- a/Network/IHttp/Simple.hs
+++ b/Network/IHttp/Simple.hs
@@ -14,16 +14,19 @@
 
       -- * Iteratees
       getRequest,
-      getResponse
+      getResponse,
+      httpRequest
     )
     where
 
+import Control.ContStuff
 import Data.ByteString (ByteString)
 import Data.Enumerator as E
 import Data.Enumerator.NetLines
 import Network.IHttp.Request
 import Network.IHttp.Response
 import Network.IHttp.Types
+import System.IO
 
 
 -- | HTTP iteratees configuration.
@@ -32,7 +35,8 @@
     HttpConfig {
       httpMaxLine          :: Int,  -- ^ Maximum protocol line length.
       httpMaxHeaderContent :: Int,  -- ^ Maximum header content length.
-      httpMaxHeaders       :: Int   -- ^ Maximum number of headers.
+      httpMaxHeaders       :: Int,  -- ^ Maximum number of headers.
+      httpTimeout          :: Int   -- ^ Write timeout in milliseconds.
     }
 
 
@@ -43,7 +47,8 @@
 defHttpConfig =
     HttpConfig { httpMaxLine = 1024,
                  httpMaxHeaderContent = 8192,
-                 httpMaxHeaders = 128 }
+                 httpMaxHeaders = 128,
+                 httpTimeout = 30000 }
 
 
 -- | Get the next full request from the given raw byte stream.
@@ -60,3 +65,13 @@
 getResponse cfg =
     joinI $ netLinesEmpty (httpMaxLine cfg) $$
     response (httpMaxHeaderContent cfg) (httpMaxHeaders cfg)
+
+
+-- | Send a request to the given output handle and return its response.
+
+httpRequest ::
+    MonadIO m =>
+    HttpConfig -> Handle -> Request -> Iteratee ByteString m Response
+httpRequest cfg h req = do
+    tryIO . run_ $ enumRequest req $$ iterHandleTimeout (httpTimeout cfg) h
+    getResponse cfg
diff --git a/Network/IHttp/Types.hs b/Network/IHttp/Types.hs
--- a/Network/IHttp/Types.hs
+++ b/Network/IHttp/Types.hs
@@ -23,9 +23,19 @@
     where
 
 import Control.Exception as Ex
-import Data.ByteString (ByteString)
+import Data.ByteString.Char8 (ByteString)
 import Data.Map (Map)
 import Data.Typeable
+
+
+-- TODO: Common HTTP headers with correct types.
+
+-- data CommonHeaders =
+--     CommonHeaders {
+--       contentCharsetHeader :: Maybe ByteString,  -- ^ Document character set.
+--       contentLengthHeader  :: Maybe Integer,     -- ^ Length of document in bytes.
+--       contentTypeHeader    :: Maybe ByteString   -- ^ MIME type of document.
+--     }
 
 
 -- | Map of HTTP headers.
diff --git a/ihttp.cabal b/ihttp.cabal
--- a/ihttp.cabal
+++ b/ihttp.cabal
@@ -1,5 +1,5 @@
 Name:          ihttp
-Version:       0.2.1
+Version:       0.2.2
 Category:      Network
 Synopsis:      Incremental HTTP iteratee
 Maintainer:    Ertugrul Söylemez <es@ertes.de>
@@ -37,6 +37,7 @@
 
 -- Executable ihttp-test
 --   Build-depends:
---     base >= 4 && <= 5
+--     base >= 4 && <= 5,
+--     network >= 2.2.1.10
 --   Main-is: Test.hs
 --   GHC-Options: -W
