diff --git a/Text/XML/Expat/Format.hs b/Text/XML/Expat/Format.hs
--- a/Text/XML/Expat/Format.hs
+++ b/Text/XML/Expat/Format.hs
@@ -55,6 +55,8 @@
 import Data.List.Class
 import Data.Monoid
 import Data.Word
+import Data.Text (Text)
+import Text.XML.Expat.Tree (UNode)
 
 -- | DEPRECATED: Renamed to 'format'.
 formatTree :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
@@ -67,6 +69,7 @@
           n [] tag text
        -> L.ByteString
 format node = L.fromChunks (xmlHeader : formatNodeG node)
+{-# SPECIALIZE format :: UNode Text -> L.ByteString #-}
 
 -- | Format document with <?xml.. header - generalized variant that returns a generic
 -- list of strict ByteStrings.
@@ -105,6 +108,7 @@
               n c tag text
            -> c B.ByteString
 formatNodeG = formatSAXG . treeToSAX
+{-# SPECIALIZE formatNodeG :: UNode Text -> [B.ByteString] #-}
 
 -- | Format an XML document - lazy variant that returns lazy ByteString.
 formatDocument :: (Doc.DocumentClass d [], GenericXMLString tag, GenericXMLString text) =>
@@ -173,6 +177,7 @@
   where
     singleton = return
     concatL = join
+{-# SPECIALIZE treeToSAX :: UNode Text -> [(SAXEvent Text Text)] #-}
 
 -- | Format SAX events with no header - lazy variant that returns lazy ByteString.
 formatSAX :: (GenericXMLString tag, GenericXMLString text) =>
@@ -210,6 +215,7 @@
           c (SAXEvent tag text)    -- ^ SAX events
        -> c B.ByteString
 formatSAXG l1 = formatSAXGb l1 False
+{-# SPECIALIZE formatSAXG :: [SAXEvent Text Text] -> [B.ByteString] #-}
 
 formatSAXGb :: forall c tag text . (List c, GenericXMLString tag,
               GenericXMLString text) =>
@@ -287,21 +293,29 @@
             formatSAXGb l2 cd
         Cons (FailDocument _) l2 ->
             formatSAXGb l2 cd
+{-# SPECIALIZE formatSAXGb :: [SAXEvent Text Text] -> Bool -> [B.ByteString] #-}
 
 pack :: String -> B.ByteString
 pack = B.pack . map c2w
 
-escapees :: [Word8]
-escapees = map c2w "&<\"'"
+isSafeChar :: Word8 -> Bool
+isSafeChar c =
+     (c /= c2w '&')
+  && (c /= c2w '<')
+  && (c /= c2w '>')
+  && (c /= c2w '"')
+  && (c /= c2w '\'')
+{-# INLINE isSafeChar #-}
 
 escapeText :: B.ByteString -> [B.ByteString]
 escapeText str | B.null str = []
 escapeText str =
-    let (good, bad) = B.span (`notElem` escapees) str
+    let (good, bad) = B.span isSafeChar str
     in  if B.null good
             then case w2c $ B.head str of
                 '&'  -> pack "&amp;":escapeText rema
                 '<'  -> pack "&lt;":escapeText rema
+                '>'  -> pack "&gt;":escapeText rema
                 '"'  -> pack "&quot;":escapeText rema
                 '\'' -> pack "&apos;":escapeText rema
                 _        -> error "hexpat: impossible"
diff --git a/hexpat.cabal b/hexpat.cabal
--- a/hexpat.cabal
+++ b/hexpat.cabal
@@ -1,6 +1,6 @@
 Cabal-Version: >= 1.6
 Name: hexpat
-Version: 0.19.8
+Version: 0.19.9
 Synopsis: XML parser/formatter based on expat
 Description:
   This package provides a general purpose Haskell XML library using Expat to
@@ -51,7 +51,8 @@
     on Linux, Mac and Windows (thanks Jacob Stanley); 0.19.3 fix misconfiguration of expat
     which broke entity parsing; 0.19.4 bump version constraint for text; 0.19.5 bump text
     to < 0.12 and fix text-0.10.0.1 breakage; 0.19.6 dependency breakage with List;
-    0.19.7 ghc-7.2.1 compatibility; 0.19.8 fix space leak on lazy parse under ghc-7.2.1
+    0.19.7 ghc-7.2.1 compatibility; 0.19.8 fix space leak on lazy parse under ghc-7.2.1;
+    0.19.9 fix formatting of > character + improve performance
 Category: XML
 License: BSD3
 License-File: LICENSE
@@ -62,16 +63,18 @@
   Evan Martin (who started the project),
   Matthew Pocock [drdozer],
   Kevin Jardine,
-  Jacob Stanley
+  Jacob Stanley,
+  Simon Hengel
 Maintainer: http://blacksapphire.com/antispam/
 Copyright:
   (c) 2009 Doug Beardsley <mightybyte@gmail.com>,
-  (c) 2009-2010 Stephen Blackheath <http://blacksapphire.com/antispam/>,
+  (c) 2009-2012 Stephen Blackheath <http://blacksapphire.com/antispam/>,
   (c) 2009 Gregory Collins,
   (c) 2008 Evan Martin <martine@danga.com>,
   (c) 2009 Matthew Pocock <matthew.pocock@ncl.ac.uk>,
   (c) 2007-2009 Galois Inc.,
-  (c) 2010 Kevin Jardine
+  (c) 2010 Kevin Jardine,
+  (c) 2012 Simon Hengel
 Homepage: http://haskell.org/haskellwiki/Hexpat/
 Extra-Source-Files:
   test/hexpat-tests.cabal,
diff --git a/test/suite/Text/XML/Expat/ParseFormat.hs b/test/suite/Text/XML/Expat/ParseFormat.hs
--- a/test/suite/Text/XML/Expat/ParseFormat.hs
+++ b/test/suite/Text/XML/Expat/ParseFormat.hs
@@ -141,6 +141,14 @@
                      [Text "Ro", Text "se & Crown"] ()] ()),  -- Test text normalization
             pfOutXML = [],
             pfImpls = [Tree, Annotated, Extended]
+        },
+        PFTest {
+            pfName = "escaping of >",
+            pfXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<text>]]&gt;</text>",
+            pfDoc = Document (Just (XMLDeclaration "1.0" (Just "UTF-8") Nothing)) Nothing [] (
+                Element "text" [] [Text "]]>"] ()),
+            pfOutXML = [],
+            pfImpls = [Extended]
         }
     ]
 
