diff --git a/Text/XML/Stream/Render.hs b/Text/XML/Stream/Render.hs
--- a/Text/XML/Stream/Render.hs
+++ b/Text/XML/Stream/Render.hs
@@ -9,6 +9,7 @@
     , RenderSettings
     , def
     , rsPretty
+    , prettify
     ) where
 
 import Data.XML.Types (Event (..), Content (..), Name (..))
@@ -33,7 +34,7 @@
 -- changes the meaning of some documents, by inserting/modifying whitespace.
 prettyBuilder :: Monad m => E.Enumeratee Event Builder m b
 prettyBuilder step0 =
-    E.joinI $ prettify 0 [] $$ loop [] step0
+    E.joinI $ prettify $$ loop [] step0
   where
     loop stack = E.checkDone $ step stack
     step stack k = do
@@ -192,8 +193,13 @@
         | x `elem` xs = findUnused (x `T.snoc` '_') xs
         | otherwise = x
 
-prettify :: Monad m => Int -> [Name] -> E.Enumeratee Event Event m a
-prettify level names (Continue k) = do
+-- | Convert a stream of 'Event's into a prettified one, adding extra
+-- whitespace. Note that this can change the meaning of your XML.
+prettify :: Monad m => E.Enumeratee Event Event m a
+prettify = prettify' 0 []
+
+prettify' :: Monad m => Int -> [Name] -> E.Enumeratee Event Event m a
+prettify' level names (Continue k) = do
     mx <- eventHead
     case mx of
         Nothing -> return $ Continue k
@@ -216,22 +222,18 @@
                         let newLevel = level - 1
                         return ([before newLevel, EventEndElement $ head names, after], newLevel, tail names)
                     (Right EventBeginDocument, _) -> do
-                        _ <- takeContents id
                         return ([EventBeginDocument], level, names)
                     (Right EventEndDocument, _) -> do
-                        _ <- takeContents id
                         return ([EventEndDocument, after], level, names)
                     (Right (EventComment t), _) -> do
-                        _ <- takeContents id
                         return ([before level, EventComment $ T.map normalSpace t, after], level, names)
                     (Right e, _) -> do
-                        _ <- takeContents id
                         return ([before level, e, after], level, names)
-            k (E.Chunks chunks) >>== prettify level' names'
+            k (E.Chunks chunks) >>== prettify' level' names'
   where
     before l = EventContent $ ContentText $ T.replicate l "    "
     after = EventContent $ ContentText "\n"
-prettify _ _ step = return step
+prettify' _ _ step = return step
 
 eventHead :: Monad m => Iteratee Event m (Maybe (Either [Content] Event))
 eventHead = do
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -29,6 +29,7 @@
         , it "has working choose function" testChoose
         , it "has working many function" testMany
         , it "has working orE" testOrE
+        , it "is idempotent to parse and pretty render a document" documentParsePrettyRender
         ]
     , describe "XML Cursors"
         [ it "has correct parent" cursorParent
@@ -84,6 +85,22 @@
             "<foo><?instr this is a processing instruction?></foo>"
         , D.parseLBS_ def
             "<foo><!-- this is a comment --></foo>"
+        ]
+
+documentParsePrettyRender :: IO ()
+documentParsePrettyRender =
+    L.unpack (D.renderLBS def { D.rsPretty = True } (D.parseLBS_ def $ doc True)) @?= L.unpack (doc False)
+  where
+    doc x = L.unlines
+        [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+        , "<foo>"
+        , "    <?bar bar?>"
+        , if x
+            then "    text"
+            else "    text     "
+        , "    <?bin bin?>"
+        , "</foo>"
+        , ""
         ]
 
 combinators :: Assertion
diff --git a/xml-enumerator.cabal b/xml-enumerator.cabal
--- a/xml-enumerator.cabal
+++ b/xml-enumerator.cabal
@@ -1,5 +1,5 @@
 name:            xml-enumerator
-version:         0.4.0
+version:         0.4.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michaels@suite-sol.com>, Aristid Breitkreuz <aristidb@googlemail.com>
