diff --git a/ParseShortXML.hs b/ParseShortXML.hs
--- a/ParseShortXML.hs
+++ b/ParseShortXML.hs
@@ -53,11 +53,11 @@
           runX (pipeline (passthrough arg) (raw arg) pattern (input arg))
           return ()
 
-recoveryLimit = 20
+recoveryLimit = (20, [])
 
 pipeline :: Bool -> Bool -> Validator.Pattern -> String -> IOSArrow XmlTree XmlTree
 pipeline passthrough rawOutput pattern input =
-   readDocument [withValidate no] input
+   readDocument [withValidate no, withInputEncoding utf8] input
    >>>
    changeChildren (\l-> if null l then [XN.mkText ""] else l)
    >>>
@@ -72,9 +72,7 @@
         >>>
         (if rawOutput 
          then this 
-         else processTopDown (none `when` (isElem >>> hasNamespaceUri terminalNamespace) 
-                              >>> 
-                              changeElemName stripOmissiblePrefix)
+         else stripSyntax
         )
         >>>
         fromLA (cleanupNamespaces collectPrefixUriPairs)
@@ -83,10 +81,21 @@
    >>>
    writeDocument [withIndent no, withOutputEncoding utf8] ""
 
+stripSyntax :: IOSArrow XmlTree XmlTree
+stripSyntax = processTopDown ((getChildren >>> stripSyntax) `when` (isElem >>> hasNamespaceUri syntacticNamespace) 
+                              >>>
+                              none `when` (isElem >>> hasNamespaceUri terminalNamespace) 
+                              >>>
+                              changeElemName stripOmissiblePrefix)
+
 loadPattern :: String -> IO Validator.Pattern
 loadPattern schema = 
    fmap head $ runX (
-                      Validator.readForRelax schema 
+                      readDocument [withInputEncoding utf8] schema
+                      >>>
+                      canonicalizeAllNodes
+                      >>>
+                      propagateAndValidateNamespaces
                       >>>
                       createSimpleForm True False True
                       >>>
diff --git a/Text/XML/HXT/RelaxNG/Parser.hs b/Text/XML/HXT/RelaxNG/Parser.hs
--- a/Text/XML/HXT/RelaxNG/Parser.hs
+++ b/Text/XML/HXT/RelaxNG/Parser.hs
@@ -59,7 +59,7 @@
 data ResultDelta = StartTag XNode | Add XmlTree | EndTag | Penalty | Inferred ResultDelta
                    deriving (Eq, Show)
 
-type RecoveryLimits = Int
+type RecoveryLimits = (Int, [QName])
 
 pretty :: String -> Int -> RecoveryLimits -> Pattern -> String
 pretty _ _ _ Empty = "empty"
@@ -86,22 +86,26 @@
 pretty _ _ rl p = show p
 
 noRecovery :: RecoveryLimits
-noRecovery = 0
+noRecovery = (0, [])
 
 omissibleNamespacePrefix :: String
 omissibleNamespacePrefix = "omissible+"
 
 terminalNamespace :: String
-terminalNamespace ="http://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols#Terminal_symbols"
+terminalNamespace ="http://en.wikipedia.org/wiki/Terminal_symbol"
 
+syntacticNamespace :: String
+syntacticNamespace ="http://en.wikipedia.org/wiki/Nonterminal_symbol"
+
 noContext :: Context
 noContext = ("", [])
 
 recoveryAllowed :: QName -> RecoveryLimits -> Maybe RecoveryLimits
-recoveryAllowed _ 0 = Nothing
-recoveryAllowed qn rl | omissibleNamespacePrefix `isPrefixOf` namespaceUri qn = Just (pred rl)
-                      | terminalNamespace == namespaceUri qn = Just (pred rl)
-                      | otherwise = Nothing
+recoveryAllowed _ (0, _) = Nothing
+recoveryAllowed qn (rl, stk) | elem qn stk = Nothing
+                             | omissibleNamespacePrefix `isPrefixOf` namespaceUri qn = Just (pred rl, qn:stk)
+                             | namespaceUri qn `elem` [terminalNamespace, syntacticNamespace] = Just (pred rl, stk)
+                             | otherwise = Nothing
 
 startSet :: RecoveryLimits -> Pattern -> Set String
 startSet rl (Group p1 p2) = (if nullable rl p1 then startSet rl p2 else empty) `union` startSet rl p1
@@ -202,6 +206,8 @@
                              r -> Just (minimumBy (comparing (semanticLength 0)) r)
                              
 semanticLength :: Int -> [ResultDelta] -> Int
+semanticLength s (StartTag node : tail) | XN.getNamespaceUri node == Just syntacticNamespace = 
+   semanticLength s tail - 1
 semanticLength s (StartTag node : tail) | XN.getNamespaceUri node == Just terminalNamespace = 
    semanticLength s (dropContent 0 tail)
    where dropContent 0 (EndTag : rest) = rest
diff --git a/concrete-relaxng-parser.cabal b/concrete-relaxng-parser.cabal
--- a/concrete-relaxng-parser.cabal
+++ b/concrete-relaxng-parser.cabal
@@ -1,5 +1,5 @@
 Name:                concrete-relaxng-parser
-Version:             0.1
+Version:             0.1.1
 Cabal-Version:       >= 1.10
 Build-Type:          Simple
 Synopsis:            A parser driven by a standard RELAX NG schema with concrete syntax extensions.
@@ -11,12 +11,12 @@
   error or XML conforming to the schema.
   .
   If the input XML already conforms to the target schema, the parser acts as an ordinary RELAX NG validator. If not, it
-  attempts to insert the missing element tags and to parse the text nodes within the input XML into XML elements. The
-  target schema can be enriched by concrete syntax extensions, syntactically compatible with standard RELAX NG, to drive
-  the parsing process.
+  attempts to insert the missing element tags and to parse the input text nodes into XML elements. The target schema can
+  be enriched by concrete syntax extensions, syntactically compatible with standard RELAX NG, to drive the parsing
+  process.
   .
-  The included sample RELAX NG schema @xhtml-concrete.rng@ is an extension of the regular must be used together with
-  James Clark's modularized RELAX NG schema for XHTML, which can be downloaded from
+  The included sample RELAX NG schema @xhtml-concrete.rng@ is an extension of, and must be used together with, James
+  Clark's modularized RELAX NG schema for XHTML, which can be downloaded from
   <http://www.thaiopensource.com/relaxng/xhtml/>. Here is an example session:
   .
   > $ cat <<END >test.xhtml.short<?xml version="1.0" encoding="UTF-8"?>
@@ -60,6 +60,5 @@
   Main-is:           ParseShortXML.hs
   Other-Modules:     Text.XML.HXT.RelaxNG.Parser
   Build-Depends:     base < 5, containers >= 0.4 && < 0.6, hxt >= 9.2 && < 10, hxt-relaxng == 9.1.*,
-                     hxt-charproperties == 9.*, hxt-tagsoup == 9.1.*, hxt-curl == 9.1.*, cmdargs == 0.9.*
-  GHC-options:       -threaded
+                     hxt-charproperties == 9.*, hxt-tagsoup == 9.1.*, hxt-curl == 9.1.*, cmdargs >= 0.9 && < 0.11
   default-language:  Haskell2010
diff --git a/xhtml-concrete.rng b/xhtml-concrete.rng
--- a/xhtml-concrete.rng
+++ b/xhtml-concrete.rng
@@ -1,6 +1,6 @@
 <grammar ns="omissible+http://www.w3.org/1999/xhtml"
          xmlns:explicit="http://www.w3.org/1999/xhtml"
-         xmlns:terminal="http://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols#Terminal_symbols"
+         xmlns:terminal="http://en.wikipedia.org/wiki/Terminal_symbol"
          xmlns="http://relaxng.org/ns/structure/1.0">
 
 <include href="xhtml/xhtml-strict.rng"/>
