diff --git a/README.textile b/README.textile
new file mode 100644
--- /dev/null
+++ b/README.textile
@@ -0,0 +1,62 @@
+h1.  ANSI Wadler/Leijen Pretty Printer
+
+You can help improve this README with extra snippets and advice by using the "GitHub wiki":http://github.com/batterseapower/ansi-wl-pprint/wikis/readme.
+
+
+h2. Installing
+
+To just install the library:
+
+<pre>
+<code>runghc Setup.lhs configure
+runghc Setup.lhs build
+sudo runghc Setup.lhs install</code>
+</pre>
+
+If you want to build the example, to check it's all working:
+
+<pre>
+<code>runghc Setup.lhs configure -fexample
+runghc Setup.lhs build
+dist/build/ansi-wl-pprint-example/ansi-wl-pprint-example</code>
+</pre>
+
+
+h2. Description
+
+A pretty printing library based on Wadler's paper "A Prettier Printer". It has been enhanced with support for ANSI terminal colored output using the "ansi-terminal":http://github.com/batterseapower/ansi-terminal package.
+
+This package is extensively based on Daan Leijen's excellent "wl-pprint":http://hackage.haskell.org/cgi-bin/hackage-scripts/package/wl-pprint library.
+
+
+h2. Example
+
+A full example is provided with the package, and can be compiled by suppling Cabal with the @-fexample@ flag. It is also available online at "GitHub":http://github.com/batterseapower/ansi-wl-pprint/tree/master/Text/PrettyPrint/ANSI/Example.hs.
+
+
+h2. Manual
+
+The library provides the obvious API, which just allows colorization of any @Doc@ value. It looks something like this:
+
+<pre>
+<code>-- | Displays a document with the given forecolor
+black, red, green, yellow, blue, magenta, cyan, white :: Doc -> Doc
+ 
+-- | Displays a document with a forecolor given in the first parameter
+color :: ANSIColor -> Doc -> Doc
+ 
+-- | Displays a document with the given backcolor
+blackb, redb, greenb, yellowb, blueb, magentab, cyanb, whiteb :: Doc -> Doc
+ 
+-- | Displays a document with a backcolor given in the first parameter
+colorb :: ANSIColor -> Doc -> Doc</code>
+</pre>
+
+Due to a technical limitation with ANSI colors on Windows, no colors will be displayed on that platform if you output via a @String@. However, @putDoc@ and @hPutDoc@ should work just fine on Windows.
+
+
+h2. Linkage
+
+* "Hackage":http://hackage.haskell.org/cgi-bin/hackage-scripts/package/ansi-wl-pprint/
+* "Bug Tracker":http://bsp.lighthouseapp.com/projects/16293-hs-ansi-wl-pprint/
+* "GitHub":http://github.com/batterseapower/ansi-wl-pprint/
diff --git a/Text/PrettyPrint/ANSI/Example.hs b/Text/PrettyPrint/ANSI/Example.hs
--- a/Text/PrettyPrint/ANSI/Example.hs
+++ b/Text/PrettyPrint/ANSI/Example.hs
@@ -2,9 +2,16 @@
 
 import Text.PrettyPrint.ANSI.Leijen
 
+import System.IO
+
+
 main :: IO ()
 main = do
+    -- Going directly to the console is portable across Unix and Windows...
     putDoc $ red (text "Red") <> text "," <+> white (text "white") <+> text "and" <+> blue (text "blue") <> char '!' <> linebreak
     putDoc $ blue (text "Nested" <+> yellow (text "colors") <+> text "example") <> linebreak
-    putDoc $ redb (text "Red") <> text "," <+> whiteb (text "white") <+> text "and" <+> blueb (text "blue") <> char '!' <> linebreak
-    putDoc $ blueb (text "Nested" <+> yellowb (text "colors") <+> text "example") <> linebreak
+    hPutDoc stdout $ redb (text "Red") <> text "," <+> whiteb (text "white") <+> text "and" <+> blueb (text "blue") <> char '!' <> linebreak
+    hPutDoc stdout $ blueb (text "Nested" <+> yellowb (text "colors") <+> text "example") <> linebreak
+    
+    -- ...but going via a string will only preserve color information on Unix
+    putStr $ show $ green (text "I will be green on Unix but uncolored on Windows") <> linebreak
diff --git a/Text/PrettyPrint/ANSI/Leijen.hs b/Text/PrettyPrint/ANSI/Leijen.hs
--- a/Text/PrettyPrint/ANSI/Leijen.hs
+++ b/Text/PrettyPrint/ANSI/Leijen.hs
@@ -117,9 +117,9 @@
 
         ) where
 
-import System.IO (Handle,hPutStr,hPutChar,stdout)
+import System.IO (Handle,hPutStr,hPutChar,hFlush,stdout)
 
-import System.Console.ANSI (ANSIColor(..), ANSISGR(..), setSGR)
+import System.Console.ANSI (ANSIColor(..), ANSISGR(..), hSetSGR, setSGRCode)
 
 import Control.Monad (when)
 
@@ -714,8 +714,8 @@
                 | Column  (Int -> Doc)
                 | Nesting (Int -> Doc)
                 | Color ColorLayer ANSIColor Doc  -- Introduces coloring /around/ the embedded document
-                | EndColor ColorLayer ANSIColor   -- Only used during the rendered phase, to signal a color end marker should be output before continuing
-                           ANSIColor ANSIColor    -- These are the colors to revert the current forecolor/backcolor to (i.e. those from before the start of the Color block)
+                | EndColor (Maybe ANSIColor)      -- Only used during the rendered phase, to signal a color end marker should be output before continuing
+                           (Maybe ANSIColor)      -- These are the colors to revert the current forecolor/backcolor to (i.e. those from before the start of the Color block)
 
 
 -- | The data type @SimpleDoc@ represents rendered documents and is
@@ -730,7 +730,7 @@
                 | SChar Char SimpleDoc
                 | SText !Int String SimpleDoc
                 | SLine !Int SimpleDoc
-                | SColor ColorLayer ANSIColor SimpleDoc
+                | SSGR ANSISGR SimpleDoc
 
 
 -- | The empty document is, indeed, empty. Although @empty@ has no
@@ -860,7 +860,7 @@
 -- higher, the ribbon width will be 0 or @width@ respectively.
 renderPretty :: Float -> Int -> Doc -> SimpleDoc
 renderPretty rfrac w x
-    = best 0 0 Black White (Cons 0 x Nil)
+    = SSGR Reset $ best 0 0 Nothing Nothing (Cons 0 x Nil)
     where
       -- r :: the ribbon width in characters
       r  = max 0 (min w (round (fromIntegral w * rfrac)))
@@ -868,25 +868,27 @@
       -- best :: n = indentation of current line
       --         k = current column
       --        (ie. (k >= n) && (k - n == count of inserted characters)
-      best n k fc bc Nil = SEmpty
-      best n k fc bc (Cons i d ds)
+      best n k mb_fc mb_bc Nil = SEmpty
+      best n k mb_fc mb_bc (Cons i d ds)
         = case d of
-            Empty                -> best n k fc bc ds
-            Char c               -> let k' = k+1 in seq k' (SChar c (best n k' fc bc ds))
-            Text l s             -> let k' = k+l in seq k' (SText l s (best n k' fc bc ds))
-            Line _               -> SLine i (best i i fc bc ds)
-            Cat x y              -> best n k fc bc (Cons i x (Cons i y ds))
-            Nest j x             -> let i' = i+j in seq i' (best n k fc bc (Cons i' x ds))
-            Union x y            -> nicest n k (best n k fc bc (Cons i x ds))
-                                         (best n k fc bc (Cons i y ds))
-            Column f             -> best n k fc bc (Cons i (f k) ds)
-            Nesting f            -> best n k fc bc (Cons i (f i) ds)
-            Color l c x          -> SColor l c (best n k fc' bc' (Cons i x (Cons i (EndColor l revert_c fc bc) ds)))
+            Empty                -> best n k mb_fc mb_bc ds
+            Char c               -> let k' = k+1 in seq k' (SChar c (best n k' mb_fc mb_bc ds))
+            Text l s             -> let k' = k+l in seq k' (SText l s (best n k' mb_fc mb_bc ds))
+            Line _               -> SLine i (best i i mb_fc mb_bc ds)
+            Cat x y              -> best n k mb_fc mb_bc (Cons i x (Cons i y ds))
+            Nest j x             -> let i' = i+j in seq i' (best n k mb_fc mb_bc (Cons i' x ds))
+            Union x y            -> nicest n k (best n k mb_fc mb_bc (Cons i x ds))
+                                         (best n k mb_fc mb_bc (Cons i y ds))
+            Column f             -> best n k mb_fc mb_bc (Cons i (f k) ds)
+            Nesting f            -> best n k mb_fc mb_bc (Cons i (f i) ds)
+            Color l c x          -> SSGR (toSGR l c) (best n k mb_fc' mb_bc' (Cons i x (Cons i (EndColor mb_fc mb_bc) ds)))
               where
-                fc' = case l of { Background -> fc; Foreground -> c }
-                bc' = case l of { Background -> c; Foreground -> bc }
-                revert_c = case l of { Background -> bc; Foreground -> fc }
-            EndColor l c fc' bc' -> SColor l c (best n k fc' bc' ds)
+                mb_fc' = case l of { Background -> mb_fc; Foreground -> Just c }
+                mb_bc' = case l of { Background -> Just c; Foreground -> mb_bc }
+            EndColor mb_fc' mb_bc' -> SSGR Reset $ fc_sgr $ bc_sgr (best n k mb_fc' mb_bc' ds)
+              where
+                fc_sgr = maybe id (SSGR . toSGR Foreground) mb_fc'
+                bc_sgr = maybe id (SSGR . toSGR Background) mb_bc'
 
       --nicest :: r = ribbon width, w = page width,
       --          n = indentation of current line, k = current column
@@ -897,13 +899,17 @@
                         where
                           width = min (w - k) (r - k + n)
 
+toSGR :: ColorLayer -> ANSIColor -> ANSISGR
+toSGR Background = BackgroundNormalIntensity
+toSGR Foreground = ForegroundNormalIntensity
 
+
 fits w x        | w < 0     = False
 fits w SEmpty               = True
 fits w (SChar c x)          = fits (w - 1) x
 fits w (SText l s x)        = fits (w - l) x
 fits w (SLine i x)          = True
-fits w (SColor _ _ x)       = fits w x
+fits w (SSGR s x)           = fits w x
 
 
 -----------------------------------------------------------
@@ -925,17 +931,17 @@
     where
       scan k []     = SEmpty
       scan k (d:ds) = case d of
-                        Empty            -> scan k ds
-                        Char c           -> let k' = k+1 in seq k' (SChar c (scan k' ds))
-                        Text l s         -> let k' = k+l in seq k' (SText l s (scan k' ds))
-                        Line _           -> SLine 0 (scan 0 ds)
-                        Cat x y          -> scan k (x:y:ds)
-                        Nest j x         -> scan k (x:ds)
-                        Union x y        -> scan k (y:ds)
-                        Column f         -> scan k (f k:ds)
-                        Nesting f        -> scan k (f 0:ds)
-                        Color _ _ x      -> scan k (x:ds)
-                        EndColor _ _ _ _ -> scan k (x:ds)
+                        Empty        -> scan k ds
+                        Char c       -> let k' = k+1 in seq k' (SChar c (scan k' ds))
+                        Text l s     -> let k' = k+l in seq k' (SText l s (scan k' ds))
+                        Line _       -> SLine 0 (scan 0 ds)
+                        Cat x y      -> scan k (x:y:ds)
+                        Nest j x     -> scan k (x:ds)
+                        Union x y    -> scan k (y:ds)
+                        Column f     -> scan k (f k:ds)
+                        Nesting f    -> scan k (f 0:ds)
+                        Color _ _ x  -> scan k (x:ds)
+                        EndColor _ _ -> scan k ds
 
 
 
@@ -951,13 +957,15 @@
 -- > showWidth :: Int -> Doc -> String
 -- > showWidth w x   = displayS (renderPretty 0.4 w x) ""
 --
--- Color information is discarded by this function.
+-- ANSI color information will be discarded by this function unless
+-- you are running on a Unix-like operating system. This is due to
+-- a technical limitation in Windows ANSI support.
 displayS :: SimpleDoc -> ShowS
 displayS SEmpty             = id
 displayS (SChar c x)        = showChar c . displayS x
 displayS (SText l s x)      = showString s . displayS x
 displayS (SLine i x)        = showString ('\n':indentation i) . displayS x
-displayS (SColor _ _ x)     = displayS x
+displayS (SSGR s x)         = showString (setSGRCode s) . displayS x
 
 
 -- | @(displayIO handle simpleDoc)@ writes @simpleDoc@ to the file
@@ -965,29 +973,20 @@
 --
 -- > hPutDoc handle doc  = displayIO handle (renderPretty 0.4 100 doc)
 --
--- Due to technical limitations, colorisation is not performed by this
--- function even if the handle is that of an ANSI console output stream.
+-- Any ANSI colorisation in @simpleDoc@ will be output.
 displayIO :: Handle -> SimpleDoc -> IO ()
-displayIO handle simpleDoc = displayIO' (Just handle) simpleDoc
-
--- | Because ANSI terminal output is only supported on stdout, we need to
--- have a special case for that.  If the handle is @Nothing@, this function
--- will output to stdout, using ANSI colors.  Otherwise, it will output a raw
--- string to the handle.
-displayIO' :: Maybe Handle -> SimpleDoc -> IO ()
-displayIO' mb_handle simpleDoc
+displayIO handle simpleDoc
     = display simpleDoc
     where
-      handle = fromMaybe stdout mb_handle
-      
       display SEmpty         = return ()
       display (SChar c x)    = do{ hPutChar handle c; display x}
       display (SText l s x)  = do{ hPutStr handle s; display x}
       display (SLine i x)    = do{ hPutStr handle ('\n':indentation i); display x}
-      display (SColor l c x) = do{ when (isNothing mb_handle) (reColor l c); display x}
-      
-      reColor Background c = setSGR (BackgroundNormalIntensity c)
-      reColor Foreground c = setSGR (ForegroundNormalIntensity c)
+      -- It's VERY IMPORTANT that we flush before issuing a SetSGR because on Windows the arrival of SGRs
+      -- is not necessarily synchronised with that of the text they are attempting to modify, so if we don't
+      -- flush more often than not the text simply comes out uncolored because all the SGRs have arrived /before/
+      -- any text at all was pushed out to the console!
+      display (SSGR s x)     = do{ hFlush handle; hSetSGR handle s; display x}
 
 -----------------------------------------------------------
 -- default pretty printers: show, putDoc and hPutDoc
@@ -1007,8 +1006,10 @@
 -- @
 -- hello world
 -- @
+--
+-- Any ANSI colorisation in @doc@ will be output.
 putDoc :: Doc -> IO ()
-putDoc doc              = hPutDoc' Nothing doc
+putDoc doc              = hPutDoc stdout doc
 
 -- | @(hPutDoc handle doc)@ pretty prints document @doc@ to the file
 -- handle @handle@ with a page width of 100 characters and a ribbon
@@ -1020,15 +1021,9 @@
 -- >          ; hClose handle
 -- >          }
 --
--- Due to technical limitations, colorisation is not performed by this
--- function even if the handle is that of an ANSI console output stream.
+-- Any ANSI colorisation in @doc@ will be output.
 hPutDoc :: Handle -> Doc -> IO ()
-hPutDoc handle doc      = hPutDoc' (Just handle) doc
-
--- | Because ANSI terminal output is only supported on stdout, we need to
--- have a special case for that.
-hPutDoc' :: Maybe Handle -> Doc -> IO ()
-hPutDoc' mb_handle doc  = displayIO' mb_handle (renderPretty 0.4 80 doc)
+hPutDoc handle doc  = displayIO handle (renderPretty 0.4 80 doc)
 
 
 
diff --git a/ansi-wl-pprint.cabal b/ansi-wl-pprint.cabal
--- a/ansi-wl-pprint.cabal
+++ b/ansi-wl-pprint.cabal
@@ -1,15 +1,16 @@
-Name:           ansi-wl-pprint
-Version:        0.2
-Cabal-Version:  >= 1.2
-Category:       User Interfaces
-Synopsis:       The Wadler/Leijen Pretty Printer for colored ANSI terminal output
-Description:    This is a pretty printing library based on Wadler's paper "A Prettier Printer". It has been enhanced with support for ANSI terminal colored output using the ansi-terminal package.
-License:        BSD3
-License-File:   LICENSE
-Author:         Daan Leijen and Max Bolingbroke
-Maintainer:     batterseapower@hotmail.com
-Homepage:       http://bsp.lighthouseapp.com/projects/16293-hs-ansi-wl-pprint/overview
-Build-Type:     Simple
+Name:                ansi-wl-pprint
+Version:             0.3.0
+Cabal-Version:       >= 1.2
+Category:            User Interfaces, Text
+Synopsis:            The Wadler/Leijen Pretty Printer for colored ANSI terminal output
+Description:         This is a pretty printing library based on Wadler's paper "A Prettier Printer". It has been enhanced with support for ANSI terminal colored output using the ansi-terminal package.
+License:             BSD3
+License-File:        LICENSE
+Extra-Source-Files:  README.textile
+Author:              Daan Leijen and Max Bolingbroke
+Maintainer:          batterseapower@hotmail.com
+Homepage:            http://github.com/batterseapower/ansi-wl-pprint
+Build-Type:          Simple
 
 Flag SplitBase
         Description:    Choose the new smaller, split-up base package
@@ -23,7 +24,7 @@
 Library
         Exposed-Modules:        Text.PrettyPrint.ANSI.Leijen
         
-        Build-Depends:          ansi-terminal >= 0.2.1
+        Build-Depends:          ansi-terminal >= 0.3.0
         if flag(splitBase)
                 Build-Depends:  base >= 3
         else
@@ -32,7 +33,7 @@
 Executable ansi-wl-pprint-example
         Main-Is:                Text/PrettyPrint/ANSI/Example.hs
         
-        Build-Depends:          ansi-terminal >= 0.2.1
+        Build-Depends:          ansi-terminal >= 0.3.0
         if flag(splitBase)
                 Build-Depends:  base >= 3
         else
