diff --git a/Network/Download.hsc b/Network/Download.hsc
--- a/Network/Download.hsc
+++ b/Network/Download.hsc
@@ -1,3 +1,8 @@
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE ForeignFunctionInterface   #-}
+{-# LANGUAGE EmptyDataDecls             #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+
 --------------------------------------------------------------------
 -- |
 -- Module    : Network.Download
@@ -8,21 +13,27 @@
 -- Stability :  provisional
 -- Portability: posix
 --
--- A binding to libdownload, a efficient, high‐level library for
+-- A binding to libdownload, an efficient, high level library for
 -- retrieving files using Uniform Resource Locators (URLs). This
--- provides simple, uniform access to file, ftp and http resources.
--- Content may be retrieved as a string, bytestring or as parsed tags.
---
--- Example:
+-- provides simple, uniform access to file, FTP and HTTP resources.
+-- Content may be retrieved as a strings, "ByteString" or parsed
+-- as HTML tags, XML or RSS and Atom feeds.
 --
--- > s <- openURI "http://haskell.org"
+-- Error handling is encapsulated in the "Either" type.
 --
 --------------------------------------------------------------------
 
 module Network.Download (
+
+        -- * The basic interface to network content
           openURI
         , openURIString
-        , parseURI
+
+        -- * Parsers for common formats
+        , parseTags
+        , parseXML
+        , parseFeed
+
     ) where
 
 import Foreign
@@ -37,33 +48,34 @@
 import System.IO.Unsafe
 import Control.Exception
 
-import qualified Data.ByteString          as S
-import qualified Data.ByteString.Unsafe   as S
 import qualified Data.ByteString.Internal as S
-
 import qualified Data.ByteString.Char8    as Char8
-import Text.HTML.TagSoup
 
+-- Parsers
+import qualified Text.HTML.TagSoup    as TagSoup
+import qualified Text.XML.Light       as XML
+import qualified Text.Feed.Import     as Feed
+import qualified Text.Feed.Types      as Feed
+
 #include "download.h"
 
 ------------------------------------------------------------------------
--- Some API ideas:
 
 -- | Download content specified by url (in RFC1738 form), using either
--- ftp, http or file protocols, returning the content as a strict
--- 'ByteString'.
+-- FTP, HTTP or file protocols, returning the content as a strict
+-- "ByteString".
 --
--- If the url is malformed, a 'Left' value is returned.
--- Similarly, if an error occurs, 'Left' is returned, with a
+-- If the url is malformed, a "Left" value is returned.
+-- Similarly, if an error occurs, "Left" is returned, with a
 -- protocol-specific error string.
 --
 -- If the file protocol is used, documents will be retrieved from the
 -- local filesystem. If the ftp scheme is used, the FTP protocol
 -- (RFC959) is used. If no user name or passoword are provided,
--- anonymous login, with user name "anonymous" and password "anonymous@<hostname>".
+-- anonymous login, with user name 'anonymous' and password 'anonymous'
 -- will be attempted.
 --
--- If the http method is used, HTTP/1.1 will be used.
+-- If the http method is used, HTTP\/1.1 will be used.
 --
 -- Examples:
 --
@@ -74,21 +86,46 @@
      Nothing  -> return $ Left $ "Malformed url: "++ s
      Just url -> do
         e <- getFile url []
-        case e of
-             Left err -> return $ Left $ "Failed to connect: " ++ err
-             Right s  -> return $ Right s
+        return $ case e of
+             Left err   -> Left $ "Failed to connect: " ++ err
+             Right src  -> Right src
 
 -- | Like openURI, but returns the result as a 'String'
 --
+-- Examples:
+--
+-- > openURIString "http://haskell.org"
+--
 openURIString :: String -> IO (Either String String)
 openURIString s = (fmap Char8.unpack) `fmap` openURI s
 
--- | Download the content via openURI, but return it as a list of parsed
--- tags using the tagsoup html parser.
+------------------------------------------------------------------------
+-- Parser interface:
+
+-- | Download the content as for "openURI", but return it as a list of
+-- parsed tags using the tagsoup html parser.
 --
-parseURI :: String -> IO (Either String [Tag])
-parseURI s = (fmap parseTags) `fmap` openURIString s
+parseTags:: String -> IO (Either String [TagSoup.Tag])
+parseTags s = (fmap TagSoup.parseTags) `fmap` openURIString s
 
+-- | Download the content as for "openURI", but return it as parsed XML,
+-- using the xml-light parser.
+--
+parseXML:: String -> IO (Either String [XML.Content])
+parseXML s = (fmap XML.parseXML) `fmap` openURIString s
+
+-- | Download the content as for "openURI", but return it as parsed RSS
+-- or Atom content, using the feed library parser.
+--
+parseFeed :: String -> IO (Either String Feed.Feed)
+parseFeed s = do
+       e <- openURIString s
+       return $ case e of
+        Left  err -> Left err   -- gluing Either -> Maybe
+        Right src -> case Feed.parseFeedString src of
+                        Nothing   -> Left "Unable to parse feed"
+                        Just src' -> Right src'
+
 ------------------------------------------------------------------------
 -- Internal:
 
@@ -98,7 +135,7 @@
 data URL = URL {-# UNPACK #-} !(ForeignPtr URL_)
         deriving (Eq, Ord, Show)
 
-data URL_ = URL_
+data URL_
 
 -- | Takes a URL in the form of a String and splits it into its
 -- components function according to the Common Internet Scheme Syntax
@@ -149,8 +186,8 @@
 --      scheme‐dependent, and is detailed in the appropriate section below.
 --
 getFile :: URL -> [Flag] -> IO (Either String S.ByteString)
-getFile (URL fp) flags = do
-  withForeignPtr fp $ \c_url ->
+getFile (URL url_fp) flags = do
+  withForeignPtr url_fp $ \c_url ->
    withCString (map encodeFlag flags) $ \c_flags ->
      bracket
         (do sp <- c_get c_url c_flags
@@ -243,21 +280,24 @@
 
 ------------------------------------------------------------------------
 
+{-
 version :: String
 version = #const_str USER_AGENT_STRING
+-}
 
 ------------------------------------------------------------------------
 
-type URLLen = Int
-
-#{enum URLLen,
-    , url_schemelen = URL_SCHEMELEN
-    , url_userlen   = URL_USERLEN
-    , url_pwdlen    = URL_PWDLEN
-    }
+-- type URLLen = Int
+-- 
+-- #{enum URLLen,
+--     , url_schemelen = URL_SCHEMELEN
+--     , url_userlen   = URL_USERLEN
+--    , url_pwdlen    = URL_PWDLEN
+--     }
 
 ------------------------------------------------------------------------
 
+{-
 newtype Scheme = Scheme { unScheme :: String }
     deriving (Eq, Show)
 
@@ -266,14 +306,18 @@
 scheme_http  = Scheme #const_str SCHEME_HTTP
 scheme_https = Scheme #const_str SCHEME_HTTPS
 scheme_file  = Scheme #const_str SCHEME_FILE
+-}
 
 ------------------------------------------------------------------------
 
-newtype DLError = DLError { unDLError :: CInt }
+newtype DLError = DLError CInt
     deriving (Eq, Show)
 
 #{enum DLError, DLError
     , dlerr_none    = DLERR_NONE
+    }
+
+{-
     , dlerr_abort   = DLERR_ABORT
     , dlerr_auth    = DLERR_AUTH
     , dlerr_down    = DLERR_DOWN
@@ -293,4 +337,4 @@
     , dlerr_unknown = DLERR_UNKNOWN
     , dlerr_url     = DLERR_URL
     , dlerr_verbose = DLERR_VERBOSE
-    }
+-}
diff --git a/download.cabal b/download.cabal
--- a/download.cabal
+++ b/download.cabal
@@ -1,11 +1,13 @@
 name:            download
-version:         0.1
+version:         0.2
 homepage:        http://code.haskell.org/~dons/code/download
 synopsis:        High-level file download based on URLs
-description:     High-level File download based on URLs
+description:     High-level file download based on URLs
                  .
-                 Download content as bytestrings, strings or parsed
-                 tags, via ftp, http or file protocols.
+                 Download web content as strict bytestring, strings,
+                 HTML tags, XML, RSS or Atom feeds or JSON, via HTTP,
+                 FTP or file protocols, using a URL interface.
+                 .                 
 category:        Network
 license:         BSD3
 license-file:    LICENSE
@@ -20,17 +22,25 @@
 --  description: Build with an external libdownload
 --  default:     False
 
--- flag small_base
---  description: Build with new smaller base library
+flag small_base
+  description: Build with new smaller base library
 
 library
     exposed-modules: Network.Download
     extensions:      CPP,
                      ForeignFunctionInterface,
+                     EmptyDataDecls,
                      GeneralizedNewtypeDeriving
+
     ghc-options:     -Wall -fvia-C
-    build-depends:   base, bytestring, tagsoup
 
+    if flag(small_base)
+        build-depends:   base >= 3, bytestring
+    else
+        build-depends:   base > 3
+
+    build-depends: tagsoup, feed, xml
+
     ------------------------------------------------------------------------
     -- Building libdownload
     --
@@ -45,17 +55,9 @@
 --    else
 
     cc-options:         -O2
-                        -pipe
                         -DINET6
                         -D_GNU_SOURCE
                         -D_FILE_OFFSET_BITS=64
-                        -Wall
-                        -Wstrict-prototypes
-                        -Wsign-compare
-                        -Wchar-subscripts
-                        -Wpointer-arith
-                        -Wcast-align
-                        -Wsign-compare
                         -UDEBUG
 
     c-sources:          cbits/download.c
