diff --git a/ide/html.validation/external/binaries-list b/ide/html.validation/external/binaries-list
index 4ca9418..853738e 100644
--- a/ide/html.validation/external/binaries-list
+++ b/ide/html.validation/external/binaries-list
@@ -14,9 +14,11 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-0DCC973606CBD9737541AA5F3E76DED6E3F4D0D0 com.hp.hpl.jena:iri:0.5
+CC78B59E2539C78AF923C12939D8D1CDE44B5CC1 com.hp.hpl.jena:iri:0.8
 483A61B688B13C62BB201A683D98A6688B5373B6 jing-0unknown.jar
 F0A0D2E29ED910808C33135A3A5A51BBA6358F7B log4j:log4j:1.2.15
-3D5058C101AEC048A48C257F3236055BA2A0C154 validator-20200626-patched.jar
-85A67D883A879E7BF767758A8413B690DEF29735 saxon9B-9.1.0.2.jar
+2EF7FD1E7A714E04EF0881FB451CC4E85AD3D23F validator-20200626-patched.jar
 FACC6D84B0B0A650B1D44FED941E9ADD9F326862 isorelax-20041111.jar
+FF0A7D89CE99F8D9EACDDC9D5D0B154462CA9935 com.shapesecurity:salvation:2.7.2
+FCF9C70F53B9C0E7BC723F43558488BF58390B33 nu.validator:galimatias:0.1.3
+4568003757802ADD587776B1DC23133F6AD7701E nu.validator:langdetect:1.2
\ No newline at end of file
diff --git a/ide/html.validation/external/galimatias-0.1.3-license.txt b/ide/html.validation/external/galimatias-0.1.3-license.txt
new file mode 100644
index 0000000..5b961c1
--- /dev/null
+++ b/ide/html.validation/external/galimatias-0.1.3-license.txt
@@ -0,0 +1,25 @@
+Name: ISO-RELAX
+Description: Relax validation APIs
+Version: 0.1.3
+License: MIT-galimatias
+Origin: https://github.com/validator/galimatias
+
+Copyright (c) 2013-2014 Santiago M. Mola <santi@mola.io>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/ide/html.validation/external/iri-0.5-license.txt b/ide/html.validation/external/iri-0.8-license.txt
similarity index 99%
rename from ide/html.validation/external/iri-0.5-license.txt
rename to ide/html.validation/external/iri-0.8-license.txt
index c8c8ed8..79affeb 100644
--- a/ide/html.validation/external/iri-0.5-license.txt
+++ b/ide/html.validation/external/iri-0.8-license.txt
@@ -1,6 +1,6 @@
 Name: JENA-IRI
 Description: The Jena IRI Library is an implementation of RFC 3987 (IRI) and RFC 3986 (URI), and a partial implementation of other related standards.
-Version: 0.5
+Version: 0.8
 Origin: SourceForge
 License: BSD-iri
 URL: http://jena.sourceforge.net/iri/index.html
diff --git a/ide/html.validation/external/langdetect-1.2-license.txt b/ide/html.validation/external/langdetect-1.2-license.txt
new file mode 100644
index 0000000..34e11e7
--- /dev/null
+++ b/ide/html.validation/external/langdetect-1.2-license.txt
@@ -0,0 +1,209 @@
+Name: langdetect
+Description: Fork of the com.cybozu.labs.langdetect language-detection library
+Version: 1.2
+Origin: Apache Software Foundation
+License: Apache-2.0
+URL: https://github.com/validator/language-detection/
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ide/html.validation/external/salvation-2.7.2-license.txt b/ide/html.validation/external/salvation-2.7.2-license.txt
new file mode 100644
index 0000000..ea1cc62
--- /dev/null
+++ b/ide/html.validation/external/salvation-2.7.2-license.txt
@@ -0,0 +1,209 @@
+Name: salvation
+Description: This is a general purpose library for working with Content Security Policy policies.
+Version: 2.7.2
+Origin: Apache Software Foundation
+License: Apache-2.0
+URL: https://github.com/shapesecurity/salvation
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ide/html.validation/external/saxon9B-9.1.0.2-license.txt b/ide/html.validation/external/saxon9B-9.1.0.2-license.txt
deleted file mode 100644
index 9e3f661..0000000
--- a/ide/html.validation/external/saxon9B-9.1.0.2-license.txt
+++ /dev/null
@@ -1,367 +0,0 @@
-Name: Saxon
-Description: Complete and conformant implementation of the XSLT 2.0, XQuery 1.0, and XPath 2.0 Recommendations published on 23 January 2007 by W3C.
-Version: 9.1.0.2
-License: MPL-1.0
-Origin: SourceForge
-URL: http://saxon.sourceforge.net/
-
-                           MOZILLA PUBLIC LICENSE
-                                Version 1.0
-
-                              ----------------
-
-1. Definitions.
-
-     1.1. ``Contributor'' means each entity that creates or contributes to
-     the creation of Modifications.
-
-     1.2. ``Contributor Version'' means the combination of the Original
-     Code, prior Modifications used by a Contributor, and the Modifications
-     made by that particular Contributor.
-
-     1.3. ``Covered Code'' means the Original Code or Modifications or the
-     combination of the Original Code and Modifications, in each case
-     including portions thereof.
-
-     1.4. ``Electronic Distribution Mechanism'' means a mechanism generally
-     accepted in the software development community for the electronic
-     transfer of data.
-
-     1.5. ``Executable'' means Covered Code in any form other than Source
-     Code.
-
-     1.6. ``Initial Developer'' means the individual or entity identified as
-     the Initial Developer in the Source Code notice required by Exhibit A.
-
-     1.7. ``Larger Work'' means a work which combines Covered Code or
-     portions thereof with code not governed by the terms of this License.
-
-     1.8. ``License'' means this document.
-
-     1.9. ``Modifications'' means any addition to or deletion from the
-     substance or structure of either the Original Code or any previous
-     Modifications. When Covered Code is released as a series of files, a
-     Modification is:
-
-          A. Any addition to or deletion from the contents of a file
-          containing Original Code or previous Modifications.
-
-          B. Any new file that contains any part of the Original Code or
-          previous Modifications.
-
-     1.10. ``Original Code'' means Source Code of computer software code
-     which is described in the Source Code notice required by Exhibit A as
-     Original Code, and which, at the time of its release under this License
-     is not already Covered Code governed by this License.
-
-     1.11. ``Source Code'' means the preferred form of the Covered Code for
-     making modifications to it, including all modules it contains, plus any
-     associated interface definition files, scripts used to control
-     compilation and installation of an Executable, or a list of source code
-     differential comparisons against either the Original Code or another
-     well known, available Covered Code of the Contributor's choice. The
-     Source Code can be in a compressed or archival form, provided the
-     appropriate decompression or de-archiving software is widely available
-     for no charge.
-
-     1.12. ``You'' means an individual or a legal entity exercising rights
-     under, and complying with all of the terms of, this License or a future
-     version of this License issued under Section 6.1. For legal entities,
-     ``You'' includes any entity which controls, is controlled by, or is
-     under common control with You. For purposes of this definition,
-     ``control'' means (a) the power, direct or indirect, to cause the
-     direction or management of such entity, whether by contract or
-     otherwise, or (b) ownership of fifty percent (50%) or more of the
-     outstanding shares or beneficial ownership of such entity.
-
-2. Source Code License.
-
-     2.1. The Initial Developer Grant.
-     The Initial Developer hereby grants You a world-wide, royalty-free,
-     non-exclusive license, subject to third party intellectual property
-     claims:
-
-          (a) to use, reproduce, modify, display, perform, sublicense and
-          distribute the Original Code (or portions thereof) with or without
-          Modifications, or as part of a Larger Work; and
-
-          (b) under patents now or hereafter owned or controlled by Initial
-          Developer, to make, have made, use and sell (``Utilize'') the
-          Original Code (or portions thereof), but solely to the extent that
-          any such patent is reasonably necessary to enable You to Utilize
-          the Original Code (or portions thereof) and not to any greater
-          extent that may be necessary to Utilize further Modifications or
-          combinations.
-
-     2.2. Contributor Grant.
-     Each Contributor hereby grants You a world-wide, royalty-free,
-     non-exclusive license, subject to third party intellectual property
-     claims:
-
-          (a) to use, reproduce, modify, display, perform, sublicense and
-          distribute the Modifications created by such Contributor (or
-          portions thereof) either on an unmodified basis, with other
-          Modifications, as Covered Code or as part of a Larger Work; and
-
-          (b) under patents now or hereafter owned or controlled by
-          Contributor, to Utilize the Contributor Version (or portions
-          thereof), but solely to the extent that any such patent is
-          reasonably necessary to enable You to Utilize the Contributor
-          Version (or portions thereof), and not to any greater extent that
-          may be necessary to Utilize further Modifications or combinations.
-
-3. Distribution Obligations.
-
-     3.1. Application of License.
-     The Modifications which You create or to which You contribute are
-     governed by the terms of this License, including without limitation
-     Section 2.2. The Source Code version of Covered Code may be distributed
-     only under the terms of this License or a future version of this
-     License released under Section 6.1, and You must include a copy of this
-     License with every copy of the Source Code You distribute. You may not
-     offer or impose any terms on any Source Code version that alters or
-     restricts the applicable version of this License or the recipients'
-     rights hereunder. However, You may include an additional document
-     offering the additional rights described in Section 3.5.
-
-     3.2. Availability of Source Code.
-     Any Modification which You create or to which You contribute must be
-     made available in Source Code form under the terms of this License
-     either on the same media as an Executable version or via an accepted
-     Electronic Distribution Mechanism to anyone to whom you made an
-     Executable version available; and if made available via Electronic
-     Distribution Mechanism, must remain available for at least twelve (12)
-     months after the date it initially became available, or at least six
-     (6) months after a subsequent version of that particular Modification
-     has been made available to such recipients. You are responsible for
-     ensuring that the Source Code version remains available even if the
-     Electronic Distribution Mechanism is maintained by a third party.
-
-     3.3. Description of Modifications.
-     You must cause all Covered Code to which you contribute to contain a
-     file documenting the changes You made to create that Covered Code and
-     the date of any change. You must include a prominent statement that the
-     Modification is derived, directly or indirectly, from Original Code
-     provided by the Initial Developer and including the name of the Initial
-     Developer in (a) the Source Code, and (b) in any notice in an
-     Executable version or related documentation in which You describe the
-     origin or ownership of the Covered Code.
-
-     3.4. Intellectual Property Matters
-
-          (a) Third Party Claims.
-          If You have knowledge that a party claims an intellectual property
-          right in particular functionality or code (or its utilization
-          under this License), you must include a text file with the source
-          code distribution titled ``LEGAL'' which describes the claim and
-          the party making the claim in sufficient detail that a recipient
-          will know whom to contact. If you obtain such knowledge after You
-          make Your Modification available as described in Section 3.2, You
-          shall promptly modify the LEGAL file in all copies You make
-          available thereafter and shall take other steps (such as notifying
-          appropriate mailing lists or newsgroups) reasonably calculated to
-          inform those who received the Covered Code that new knowledge has
-          been obtained.
-
-          (b) Contributor APIs.
-          If Your Modification is an application programming interface and
-          You own or control patents which are reasonably necessary to
-          implement that API, you must also include this information in the
-          LEGAL file.
-
-     3.5. Required Notices.
-     You must duplicate the notice in Exhibit A in each file of the Source
-     Code, and this License in any documentation for the Source Code, where
-     You describe recipients' rights relating to Covered Code. If You
-     created one or more Modification(s), You may add your name as a
-     Contributor to the notice described in Exhibit A. If it is not possible
-     to put such notice in a particular Source Code file due to its
-     structure, then you must include such notice in a location (such as a
-     relevant directory file) where a user would be likely to look for such
-     a notice. You may choose to offer, and to charge a fee for, warranty,
-     support, indemnity or liability obligations to one or more recipients
-     of Covered Code. However, You may do so only on Your own behalf, and
-     not on behalf of the Initial Developer or any Contributor. You must
-     make it absolutely clear than any such warranty, support, indemnity or
-     liability obligation is offered by You alone, and You hereby agree to
-     indemnify the Initial Developer and every Contributor for any liability
-     incurred by the Initial Developer or such Contributor as a result of
-     warranty, support, indemnity or liability terms You offer.
-
-     3.6. Distribution of Executable Versions.
-     You may distribute Covered Code in Executable form only if the
-     requirements of Section 3.1-3.5 have been met for that Covered Code,
-     and if You include a notice stating that the Source Code version of the
-     Covered Code is available under the terms of this License, including a
-     description of how and where You have fulfilled the obligations of
-     Section 3.2. The notice must be conspicuously included in any notice in
-     an Executable version, related documentation or collateral in which You
-     describe recipients' rights relating to the Covered Code. You may
-     distribute the Executable version of Covered Code under a license of
-     Your choice, which may contain terms different from this License,
-     provided that You are in compliance with the terms of this License and
-     that the license for the Executable version does not attempt to limit
-     or alter the recipient's rights in the Source Code version from the
-     rights set forth in this License. If You distribute the Executable
-     version under a different license You must make it absolutely clear
-     that any terms which differ from this License are offered by You alone,
-     not by the Initial Developer or any Contributor. You hereby agree to
-     indemnify the Initial Developer and every Contributor for any liability
-     incurred by the Initial Developer or such Contributor as a result of
-     any such terms You offer.
-
-     3.7. Larger Works.
-     You may create a Larger Work by combining Covered Code with other code
-     not governed by the terms of this License and distribute the Larger
-     Work as a single product. In such a case, You must make sure the
-     requirements of this License are fulfilled for the Covered Code.
-
-4. Inability to Comply Due to Statute or Regulation.
-
-     If it is impossible for You to comply with any of the terms of this
-     License with respect to some or all of the Covered Code due to statute
-     or regulation then You must: (a) comply with the terms of this License
-     to the maximum extent possible; and (b) describe the limitations and
-     the code they affect. Such description must be included in the LEGAL
-     file described in Section 3.4 and must be included with all
-     distributions of the Source Code. Except to the extent prohibited by
-     statute or regulation, such description must be sufficiently detailed
-     for a recipient of ordinary skill to be able to understand it.
-
-5. Application of this License.
-
-     This License applies to code to which the Initial Developer has
-     attached the notice in Exhibit A, and to related Covered Code.
-
-6. Versions of the License.
-
-     6.1. New Versions.
-     Netscape Communications Corporation (``Netscape'') may publish revised
-     and/or new versions of the License from time to time. Each version will
-     be given a distinguishing version number.
-
-     6.2. Effect of New Versions.
-     Once Covered Code has been published under a particular version of the
-     License, You may always continue to use it under the terms of that
-     version. You may also choose to use such Covered Code under the terms
-     of any subsequent version of the License published by Netscape. No one
-     other than Netscape has the right to modify the terms applicable to
-     Covered Code created under this License.
-
-     6.3. Derivative Works.
-     If you create or use a modified version of this License (which you may
-     only do in order to apply it to code which is not already Covered Code
-     governed by this License), you must (a) rename Your license so that the
-     phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or
-     any confusingly similar phrase do not appear anywhere in your license
-     and (b) otherwise make it clear that your version of the license
-     contains terms which differ from the Mozilla Public License and
-     Netscape Public License. (Filling in the name of the Initial Developer,
-     Original Code or Contributor in the notice described in Exhibit A shall
-     not of themselves be deemed to be modifications of this License.)
-
-7. DISCLAIMER OF WARRANTY.
-
-     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
-     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
-     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
-     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
-     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
-     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
-     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
-     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
-     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
-     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-8. TERMINATION.
-
-     This License and the rights granted hereunder will terminate
-     automatically if You fail to comply with terms herein and fail to cure
-     such breach within 30 days of becoming aware of the breach. All
-     sublicenses to the Covered Code which are properly granted shall
-     survive any termination of this License. Provisions which, by their
-     nature, must remain in effect beyond the termination of this License
-     shall survive.
-
-9. LIMITATION OF LIABILITY.
-
-     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
-     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL
-     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
-     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER
-     PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
-     OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
-     GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
-     ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
-     BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
-     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
-     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
-     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
-     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT
-     EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-10. U.S. GOVERNMENT END USERS.
-
-     The Covered Code is a ``commercial item,'' as that term is defined in
-     48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer
-     software'' and ``commercial computer software documentation,'' as such
-     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
-     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
-     all U.S. Government End Users acquire Covered Code with only those
-     rights set forth herein.
-
-11. MISCELLANEOUS.
-
-     This License represents the complete agreement concerning subject
-     matter hereof. If any provision of this License is held to be
-     unenforceable, such provision shall be reformed only to the extent
-     necessary to make it enforceable. This License shall be governed by
-     California law provisions (except to the extent applicable law, if any,
-     provides otherwise), excluding its conflict-of-law provisions. With
-     respect to disputes in which at least one party is a citizen of, or an
-     entity chartered or registered to do business in, the United States of
-     America: (a) unless otherwise agreed in writing, all disputes relating
-     to this License (excepting any dispute relating to intellectual
-     property rights) shall be subject to final and binding arbitration,
-     with the losing party paying all costs of arbitration; (b) any
-     arbitration relating to this Agreement shall be held in Santa Clara
-     County, California, under the auspices of JAMS/EndDispute; and (c) any
-     litigation relating to this Agreement shall be subject to the
-     jurisdiction of the Federal Courts of the Northern District of
-     California, with venue lying in Santa Clara County, California, with
-     the losing party responsible for costs, including without limitation,
-     court costs and reasonable attorneys fees and expenses. The application
-     of the United Nations Convention on Contracts for the International
-     Sale of Goods is expressly excluded. Any law or regulation which
-     provides that the language of a contract shall be construed against the
-     drafter shall not apply to this License.
-
-12. RESPONSIBILITY FOR CLAIMS.
-
-     Except in cases where another Contributor has failed to comply with
-     Section 3.4, You are responsible for damages arising, directly or
-     indirectly, out of Your utilization of rights under this License, based
-     on the number of copies of Covered Code you made available, the
-     revenues you received from utilizing such rights, and other relevant
-     factors. You agree to work with affected parties to distribute
-     responsibility on an equitable basis.
-
-EXHIBIT A.
-
-     ``The contents of this file are subject to the Mozilla Public License
-     Version 1.0 (the "License"); you may not use this file except in
-     compliance with the License. You may obtain a copy of the License at
-     http://www.mozilla.org/MPL/
-
-     Software distributed under the License is distributed on an "AS IS"
-     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-     License for the specific language governing rights and limitations
-     under the License.
-
-     The Original Code is ______________________________________.
-
-     The Initial Developer of the Original Code is ________________________.
-     Portions created by ______________________ are Copyright (C) ______
-     _______________________. All Rights Reserved.
-
-     Contributor(s): ______________________________________.''
diff --git a/ide/html.validation/external/validator-20200626.patch b/ide/html.validation/external/validator-20200626.patch
index 2d496e7..d504cde 100644
--- a/ide/html.validation/external/validator-20200626.patch
+++ b/ide/html.validation/external/validator-20200626.patch
@@ -30,6 +30,183 @@
  ]
  
  moduleDependencyPackages = [
+diff --git a/src/nu/validator/checker/schematronequiv/Assertions.java b/src/nu/validator/checker/schematronequiv/Assertions.java
+index 917182f3..6aba4301 100644
+--- a/src/nu/validator/checker/schematronequiv/Assertions.java
++++ b/src/nu/validator/checker/schematronequiv/Assertions.java
+@@ -65,12 +65,6 @@ import nu.validator.messages.MessageEmitterAdapter;
+ 
+ import org.relaxng.datatype.DatatypeException;
+ 
+-import org.w3c.css.css.StyleSheetParser;
+-import org.w3c.css.parser.CssError;
+-import org.w3c.css.parser.CssParseException;
+-import org.w3c.css.parser.Errors;
+-import org.w3c.css.util.ApplContext;
+-
+ import org.xml.sax.Attributes;
+ import org.xml.sax.Locator;
+ import org.xml.sax.SAXException;
+@@ -1506,93 +1500,6 @@ public class Assertions extends Checker {
+             } else if ("option" == localName
+                     && !stack[currentPtr].hasOption()) {
+                 stack[currentPtr].setOptionFound();
+-            } else if ("style" == localName) {
+-                String styleContents = node.getTextContent().toString();
+-                int lineOffset = 0;
+-                if (styleContents.startsWith("\n")) {
+-                    lineOffset = 1;
+-                }
+-                ApplContext ac = new ApplContext("en");
+-                ac.setCssVersionAndProfile("css3svg");
+-                ac.setMedium("all");
+-                ac.setSuggestPropertyName(false);
+-                ac.setTreatVendorExtensionsAsWarnings(true);
+-                ac.setTreatCssHacksAsWarnings(true);
+-                ac.setWarningLevel(-1);
+-                ac.setFakeURL("file://localhost/StyleElement");
+-                StyleSheetParser styleSheetParser = new StyleSheetParser();
+-                styleSheetParser.parseStyleSheet(ac,
+-                        new StringReader(styleContents.substring(lineOffset)),
+-                        null);
+-                styleSheetParser.getStyleSheet().findConflicts(ac);
+-                Errors errors = styleSheetParser.getStyleSheet().getErrors();
+-                if (errors.getErrorCount() > 0) {
+-                    incrementUseCounter("style-element-errors-found");
+-                }
+-                for (int i = 0; i < errors.getErrorCount(); i++) {
+-                    String message = "";
+-                    String cssProperty = "";
+-                    String cssMessage = "";
+-                    CssError error = errors.getErrorAt(i);
+-                    int beginLine = error.getBeginLine() + lineOffset;
+-                    int beginColumn = error.getBeginColumn();
+-                    int endLine = error.getEndLine() + lineOffset;
+-                    int endColumn = error.getEndColumn();
+-                    if (beginLine == 0) {
+-                        continue;
+-                    }
+-                    Throwable ex = error.getException();
+-                    if (ex instanceof CssParseException) {
+-                        CssParseException cpe = (CssParseException) ex;
+-                        if ("generator.unrecognize" //
+-                                .equals(cpe.getErrorType())) {
+-                            cssMessage = "Parse Error";
+-                        }
+-                        if (cpe.getProperty() != null) {
+-                            cssProperty = String.format("\u201c%s\u201D: ",
+-                                    cpe.getProperty());
+-                        }
+-                        if (cpe.getMessage() != null) {
+-                            cssMessage = cpe.getMessage();
+-                        }
+-                        if (!"".equals(cssMessage)) {
+-                            message = cssProperty + cssMessage.trim();
+-                            if (!".".equals(
+-                                    message.substring(message.length() - 1))) {
+-                                message = message + ".";
+-                            }
+-                        }
+-                    } else {
+-                        message = ex.getMessage();
+-                    }
+-                    if (!"".equals(message)) {
+-                        int lastLine = node.locator.getLineNumber() //
+-                                + endLine - 1;
+-                        int lastColumn = endColumn;
+-                        int columnOffset = node.locator.getColumnNumber();
+-                        if (error.getBeginLine() == 1) {
+-                            if (lineOffset != 0) {
+-                                columnOffset = 0;
+-                            }
+-                        } else {
+-                            columnOffset = 0;
+-                        }
+-                        String prefix = sourceIsCss ? "" : "CSS: ";
+-                        SAXParseException spe = new SAXParseException( //
+-                                prefix + message, publicId, systemId, //
+-                                lastLine, lastColumn);
+-                        int[] start = {
+-                                node.locator.getLineNumber() + beginLine - 1,
+-                                beginColumn, columnOffset };
+-                        if ((getErrorHandler() instanceof MessageEmitterAdapter)
+-                                && !(getErrorHandler() instanceof TestRunner)) {
+-                            ((MessageEmitterAdapter) getErrorHandler()) //
+-                                    .errorWithStart(spe, start);
+-                        } else {
+-                            getErrorHandler().error(spe);
+-                        }
+-                    }
+-                }
+             }
+             if ("article" == localName || "aside" == localName
+                     || "nav" == localName || "section" == localName) {
+@@ -1743,64 +1650,7 @@ public class Assertions extends Checker {
+                                     + " XML-compatible.");
+                         }
+                     }
+-                    if ("style" == attLocal) {
+-                        String styleContents = atts.getValue(i);
+-                        ApplContext ac = new ApplContext("en");
+-                        ac.setCssVersionAndProfile("css3svg");
+-                        ac.setMedium("all");
+-                        ac.setSuggestPropertyName(false);
+-                        ac.setTreatVendorExtensionsAsWarnings(true);
+-                        ac.setTreatCssHacksAsWarnings(true);
+-                        ac.setWarningLevel(-1);
+-                        ac.setFakeURL("file://localhost/StyleAttribute");
+-                        StyleSheetParser styleSheetParser = //
+-                                new StyleSheetParser();
+-                        styleSheetParser.parseStyleAttribute(ac,
+-                                new ByteArrayInputStream(
+-                                        styleContents.getBytes()),
+-                                "", ac.getFakeURL(),
+-                                getDocumentLocator().getLineNumber());
+-                        styleSheetParser.getStyleSheet().findConflicts(ac);
+-                        Errors errors = //
+-                                styleSheetParser.getStyleSheet().getErrors();
+-                        if (errors.getErrorCount() > 0) {
+-                            incrementUseCounter("style-attribute-errors-found");
+-                        }
+-                        for (int j = 0; j < errors.getErrorCount(); j++) {
+-                            String message = "";
+-                            String cssProperty = "";
+-                            String cssMessage = "";
+-                            CssError error = errors.getErrorAt(j);
+-                            Throwable ex = error.getException();
+-                            if (ex instanceof CssParseException) {
+-                                CssParseException cpe = (CssParseException) ex;
+-                                if ("generator.unrecognize" //
+-                                        .equals(cpe.getErrorType())) {
+-                                    cssMessage = "Parse Error";
+-                                }
+-                                if (cpe.getProperty() != null) {
+-                                    cssProperty = String.format(
+-                                            "\u201c%s\u201D: ",
+-                                            cpe.getProperty());
+-                                }
+-                                if (cpe.getMessage() != null) {
+-                                    cssMessage = cpe.getMessage();
+-                                }
+-                                if (!"".equals(cssMessage)) {
+-                                    message = cssProperty + cssMessage.trim();
+-                                    if (!".".equals(message.substring(
+-                                            message.length() - 1))) {
+-                                        message = message + ".";
+-                                    }
+-                                }
+-                            } else {
+-                                message = ex.getMessage();
+-                            }
+-                            if (!"".equals(message)) {
+-                                err("CSS: " + message);
+-                            }
+-                        }
+-                    } else if ("tabindex" == attLocal) {
++                    if ("tabindex" == attLocal) {
+                         tabindex = true;
+                     } else if ("href" == attLocal) {
+                         href = true;
 diff --git a/src/nu/validator/datatype/IriRef.java b/src/nu/validator/datatype/IriRef.java
 index 8fb8de35..461c753c 100644
 --- a/src/nu/validator/datatype/IriRef.java
@@ -154,6 +331,80 @@
              if (!isScript(subtag)) {
                  throw newDatatypeException("Bad script subtag.");
              }
+diff --git a/src/nu/validator/datatype/MediaQuery.java b/src/nu/validator/datatype/MediaQuery.java
+index dff51c58..1a2c86cd 100644
+--- a/src/nu/validator/datatype/MediaQuery.java
++++ b/src/nu/validator/datatype/MediaQuery.java
+@@ -22,14 +22,7 @@
+ 
+ package nu.validator.datatype;
+ 
+-import java.io.StringReader;
+-
+ import org.relaxng.datatype.DatatypeException;
+-import org.w3c.css.css.StyleSheetParser;
+-import org.w3c.css.parser.CssError;
+-import org.w3c.css.parser.CssParseException;
+-import org.w3c.css.parser.Errors;
+-import org.w3c.css.util.ApplContext;
+ 
+ public class MediaQuery extends AbstractDatatype {
+ 
+@@ -44,54 +37,6 @@ public class MediaQuery extends AbstractDatatype {
+ 
+     @Override
+     public void checkValid(CharSequence literal) throws DatatypeException {
+-        ApplContext ac = new ApplContext("en");
+-        ac.setCssVersionAndProfile("css3svg");
+-        ac.setMedium("all");
+-        ac.setSuggestPropertyName(false);
+-        ac.setTreatVendorExtensionsAsWarnings(true);
+-        ac.setTreatCssHacksAsWarnings(true);
+-        ac.setWarningLevel(-1);
+-        ac.setFakeURL("file://localhost/StyleElement");
+-        String literalString = literal.toString();
+-        String style;
+-        if (isMediaCondition()) {
+-            style = String.format("@media all and %s %s", literalString, "{}");
+-        } else {
+-            style = String.format("@media %s %s", literalString, "{}");
+-        }
+-        StyleSheetParser styleSheetParser = new StyleSheetParser();
+-        styleSheetParser.parseStyleSheet(ac, new StringReader(style), null);
+-        styleSheetParser.getStyleSheet().findConflicts(ac);
+-        Errors errors = styleSheetParser.getStyleSheet().getErrors();
+-        for (int i = 0; i < errors.getErrorCount(); i++) {
+-            String message = "";
+-            String cssProperty = "";
+-            String cssMessage = "";
+-            CssError error = errors.getErrorAt(i);
+-            Throwable ex = error.getException();
+-            if (ex instanceof CssParseException) {
+-                CssParseException cpe = (CssParseException) ex;
+-                if ("generator.unrecognize" //
+-                        .equals(cpe.getErrorType())) {
+-                    cssMessage = "Parse Error";
+-                }
+-                if (cpe.getProperty() != null) {
+-                    cssProperty = String.format("\u201c%s\u201D: ",
+-                            cpe.getProperty());
+-                }
+-                if (cpe.getMessage() != null) {
+-                    cssMessage = cpe.getMessage();
+-                }
+-                if (!"".equals(cssMessage)) {
+-                    message = cssProperty + cssMessage + ".";
+-                }
+-            } else {
+-                message = ex.getMessage();
+-            }
+-            if (!"".equals(message)) {
+-                throw newDatatypeException(message);
+-            }
+-        }
+     }
+ 
+     protected boolean isMediaCondition() {
 diff --git a/src/nu/validator/io/DataUri.java b/src/nu/validator/io/DataUri.java
 index eb6fba26..d68f74a5 100644
 --- a/src/nu/validator/io/DataUri.java
diff --git a/ide/html.validation/external/validator-howto-build.txt b/ide/html.validation/external/validator-howto-build.txt
new file mode 100644
index 0000000..49708f9
--- /dev/null
+++ b/ide/html.validation/external/validator-howto-build.txt
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements; and to You under the Apache License, Version 2.0.
+#
+# This way the validator-20200626-patched.jar was build:
+git clone https://github.com/validator/validator.git
+cd validator
+git checkout 787a7a7e972719edf7a79009d768f5111e1d93bc
+git apply ../validator-20200626.patch
+python3 checker.py all
+# ignore the error messages
+cd jars
+mv validator.jar validator-20200626-patched.jar
+sha1sum validator-20200626-patched.jar | awk '{print "mv "$2" "toupper($1)"-"$2}' | sh
+# At this point the directory cotains a build of the validator in the format
+# needed for the upload to the netbeans.osuosl.org
\ No newline at end of file
diff --git a/ide/html.validation/external/validator.patch b/ide/html.validation/external/validator.patch
deleted file mode 100644
index 33a23da..0000000
--- a/ide/html.validation/external/validator.patch
+++ /dev/null
@@ -1,8898 +0,0 @@
-diff --git a/build/build.py b/build/build.py
-index 1a03b4c..7a99cf4 100755
---- a/build/build.py
-+++ b/build/build.py
-@@ -168,6 +168,7 @@ runDependencyJars = [
-   "jetty-util-ajax-9.2.9.v20150224.jar",
-   "log4j-1.2.17.jar",
-   "rhino-1.7R5.jar",
-+  "iri.jar"
- ]
- 
- buildOnlyDependencyJars = [
-@@ -641,6 +642,7 @@ def buildEmitters():
-     '-d "%s"' % classDir,
-     '-encoding UTF-8',
-   ]
-+  return
-   if javaVersion != "":
-     args.append('-target ' + javaVersion)
-     args.append('-source ' + javaVersion)
-diff --git a/htmlparser b/htmlparser
-deleted file mode 160000
-index 543cc3e..0000000
---- a/htmlparser
-+++ /dev/null
-@@ -1 +0,0 @@
--Subproject commit 543cc3e7d442874c10ed40e114317115bcff1ca5
-diff --git a/jing-trang b/jing-trang
-deleted file mode 160000
-index 35eb11b..0000000
---- a/jing-trang
-+++ /dev/null
-@@ -1 +0,0 @@
--Subproject commit 35eb11b84a230ee4d7168f12f98a28bf40e940aa
-diff --git a/src/nu/validator/client/TestRunner.java b/src/nu/validator/client/TestRunner.java
-deleted file mode 100644
-index 551df39..0000000
---- a/src/nu/validator/client/TestRunner.java
-+++ /dev/null
-@@ -1,611 +0,0 @@
--/*
-- * Copyright (c) 2013-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.client;
--
--import java.io.BufferedWriter;
--import java.io.File;
--import java.io.FileInputStream;
--import java.io.FileOutputStream;
--import java.io.InputStreamReader;
--import java.io.IOException;
--import java.io.OutputStreamWriter;
--import java.io.PrintWriter;
--import java.net.MalformedURLException;
--import java.util.ArrayList;
--import java.util.HashMap;
--import java.util.LinkedHashMap;
--import java.util.List;
--import java.util.Map;
--import java.util.regex.Pattern;
--
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXParseException;
--
--import org.eclipse.jetty.util.ajax.JSON;
--
--import org.relaxng.datatype.DatatypeException;
--import com.thaiopensource.relaxng.exceptions.BadAttributeValueException;
--
--import nu.validator.datatype.Html5DatatypeException;
--
--import nu.validator.validation.SimpleDocumentValidator;
--
--public class TestRunner implements ErrorHandler {
--
--    private boolean inError = false;
--
--    private boolean emitMessages = false;
--
--    private boolean exceptionIsWarning = false;
--
--    private boolean expectingError = false;
--
--    private Exception exception = null;
--
--    private SimpleDocumentValidator validator;
--
--    private PrintWriter err;
--
--    private PrintWriter out;
--
--    private String schema = "http://s.validator.nu/html5-all.rnc";
--
--    private boolean failed = false;
--
--    private static File messagesFile;
--
--    private static String[] ignoreList = null;
--
--    private static boolean writeMessages;
--
--    private static boolean verbose;
--
--    private String baseDir = null;
--
--    private Map<String, String> expectedMessages;
--
--    private Map<String, String> reportedMessages;
--
--    public TestRunner() throws IOException {
--        reportedMessages = new LinkedHashMap<String, String>();
--        validator = new SimpleDocumentValidator();
--        try {
--            this.err = new PrintWriter(new OutputStreamWriter(System.err,
--                    "UTF-8"));
--            this.out = new PrintWriter(new OutputStreamWriter(System.out,
--                    "UTF-8"));
--        } catch (Exception e) {
--            // If this happens, the JDK is too broken anyway
--            throw new RuntimeException(e);
--        }
--    }
--
--    private void checkHtmlFile(File file) throws IOException, SAXException {
--        if (!file.exists()) {
--            if (verbose) {
--                out.println(String.format("\"%s\": warning: File not found.",
--                        file.toURI().toURL().toString()));
--                out.flush();
--            }
--            return;
--        }
--        if (verbose) {
--            out.println(file);
--            out.flush();
--        }
--        if (isHtml(file)) {
--            validator.checkHtmlFile(file, true);
--        } else if (isXhtml(file)) {
--            validator.checkXmlFile(file);
--        } else {
--            if (verbose) {
--                out.println(String.format(
--                        "\"%s\": warning: File was not checked."
--                                + " Files must have a .html, .xhtml, .htm,"
--                                + " or .xht extension.",
--                        file.toURI().toURL().toString()));
--                out.flush();
--            }
--        }
--    }
--
--    private boolean isXhtml(File file) {
--        String name = file.getName();
--        return name.endsWith(".xhtml") || name.endsWith(".xht");
--    }
--
--    private boolean isHtml(File file) {
--        String name = file.getName();
--        return name.endsWith(".html") || name.endsWith(".htm");
--    }
--
--    private boolean isCheckableFile(File file) {
--        return file.isFile() && (isHtml(file) || isXhtml(file));
--    }
--
--    private void recurseDirectory(File directory) throws SAXException,
--            IOException {
--        File[] files = directory.listFiles();
--        for (int i = 0; i < files.length; i++) {
--            File file = files[i];
--            if (file.isDirectory()) {
--                recurseDirectory(file);
--            } else {
--                checkHtmlFile(file);
--            }
--        }
--    }
--
--    private boolean isIgnorable(File file) throws IOException {
--        String testPathname = file.getAbsolutePath().substring(
--                baseDir.length() + 1);
--        if (ignoreList != null) {
--            for (String substring : ignoreList) {
--                if (testPathname.contains(substring)) {
--                    if (verbose) {
--                        out.println(String.format(
--                                "\"%s\": warning: File ignored.",
--                                file.toURI().toURL().toString()));
--                        out.flush();
--                    }
--                    return true;
--                }
--            }
--        }
--        return false;
--    }
--
--    private void checkFiles(List<File> files) throws IOException {
--        for (File file : files) {
--            if (isIgnorable(file)) {
--                continue;
--            }
--            reset();
--            emitMessages = true;
--            try {
--                if (file.isDirectory()) {
--                    recurseDirectory(file);
--                } else {
--                    checkHtmlFile(file);
--                }
--            } catch (IOException e) {
--            } catch (SAXException e) {
--            }
--            if (inError) {
--                failed = true;
--            }
--        }
--    }
--
--    private boolean messageMatches(String testFilename) {
--        // p{C} = Other = Control+Format+Private_Use+Surrogate+Unassigned
--        // http://www.regular-expressions.info/unicode.html#category
--        // http://www.unicode.org/reports/tr18/#General_Category_Property
--        String messageReported = exception.getMessage().replaceAll("\\p{C}",
--                "?");
--        String messageExpected = expectedMessages.get(testFilename).replaceAll(
--                "\\p{C}", "?");
--        // FIXME: The string replacements below are a hack to "normalize"
--        // error messages reported for bad values of the ins/del datetime
--        // attribute, to work around the fact that in Java 8, parts of
--        // those error messages don't always get emitted in the same order
--        // that they do in Java 7 and earlier.
--        Pattern p;
--        p = Pattern.compile("(Bad datetime with timezone: .+) (Bad date: .+)");
--        messageExpected = p.matcher(messageExpected).replaceAll("$2 $1");
--        messageReported = p.matcher(messageReported).replaceAll("$2 $1");
--        return messageReported.equals(messageExpected);
--    }
--
--    private void checkInvalidFiles(List<File> files) throws IOException {
--        String testFilename;
--        expectingError = true;
--        for (File file : files) {
--            if (isIgnorable(file)) {
--                continue;
--            }
--            reset();
--            try {
--                if (file.isDirectory()) {
--                    recurseDirectory(file);
--                } else {
--                    checkHtmlFile(file);
--                }
--            } catch (IOException e) {
--            } catch (SAXException e) {
--            }
--            if (exception != null) {
--                testFilename = file.getAbsolutePath().substring(
--                        baseDir.length() + 1);
--                if (writeMessages) {
--                    reportedMessages.put(testFilename, exception.getMessage());
--                } else if (expectedMessages != null
--                        && expectedMessages.get(testFilename) == null) {
--                    try {
--                        err.println(String.format(
--                                "\"%s\": warning: No expected message in"
--                                        + " messages file.",
--                                file.toURI().toURL().toString()));
--                        err.flush();
--                    } catch (MalformedURLException e) {
--                        throw new RuntimeException(e);
--                    }
--                } else if (expectedMessages != null
--                        && !messageMatches(testFilename)) {
--                    failed = true;
--                    try {
--                        err.println(String.format(
--                                "\"%s\": error: Expected \"%s\""
--                                        + " but instead encountered \"%s\".",
--                                file.toURI().toURL().toString(),
--                                expectedMessages.get(testFilename),
--                                exception.getMessage()));
--                        err.flush();
--                    } catch (MalformedURLException e) {
--                        throw new RuntimeException(e);
--                    }
--                }
--            }
--            if (!inError) {
--                failed = true;
--                try {
--                    err.println(String.format(
--                            "\"%s\": error: Expected an error but did not"
--                                    + " encounter any.",
--                            file.toURI().toURL().toString()));
--                    err.flush();
--                } catch (MalformedURLException e) {
--                    throw new RuntimeException(e);
--                }
--            }
--        }
--    }
--
--    private void checkHasWarningFiles(List<File> files) throws IOException {
--        String testFilename;
--        expectingError = false;
--        for (File file : files) {
--            if (isIgnorable(file)) {
--                continue;
--            }
--            reset();
--            try {
--                if (file.isDirectory()) {
--                    recurseDirectory(file);
--                } else {
--                    checkHtmlFile(file);
--                }
--            } catch (IOException e) {
--            } catch (SAXException e) {
--            }
--            if (exception != null) {
--                testFilename = file.getAbsolutePath().substring(
--                        baseDir.length() + 1);
--                if (writeMessages) {
--                    reportedMessages.put(testFilename, exception.getMessage());
--                } else if (expectedMessages != null
--                        && expectedMessages.get(testFilename) == null) {
--                    try {
--                        err.println(String.format(
--                                "\"%s\": warning: No expected message in"
--                                        + " messages file.",
--                                file.toURI().toURL().toString()));
--                        err.flush();
--                    } catch (MalformedURLException e) {
--                        throw new RuntimeException(e);
--                    }
--                } else if (expectedMessages != null
--                        && !messageMatches(testFilename)) {
--                    try {
--                        err.println(String.format(
--                                "\"%s\": error: Expected \"%s\""
--                                        + " but instead encountered \"%s\".",
--                                file.toURI().toURL().toString(),
--                                expectedMessages.get(testFilename),
--                                exception.getMessage()));
--                        err.flush();
--                    } catch (MalformedURLException e) {
--                        throw new RuntimeException(e);
--                    }
--                }
--            }
--            if (inError) {
--                failed = true;
--                try {
--                    err.println(String.format(
--                            "\"%s\": error: Expected a warning but encountered"
--                                    + " an error first.",
--                            file.toURI().toURL().toString()));
--                    err.flush();
--                } catch (MalformedURLException e) {
--                    throw new RuntimeException(e);
--                }
--            } else if (!exceptionIsWarning) {
--                try {
--                    err.println(String.format(
--                            "\"%s\": error: Expected a warning but did not"
--                                    + " encounter any.",
--                            file.toURI().toURL().toString()));
--                    err.flush();
--                } catch (MalformedURLException e) {
--                    throw new RuntimeException(e);
--                }
--            }
--            if (inError) {
--                failed = true;
--                try {
--                    err.println(String.format(
--                            "\"%s\": error: Expected a warning only but"
--                                    + " encountered at least one error.",
--                            file.toURI().toURL().toString()));
--                    err.flush();
--                } catch (MalformedURLException e) {
--                    throw new RuntimeException(e);
--                }
--            }
--        }
--    }
--
--    private enum State {
--        EXPECTING_INVALID_FILES, EXPECTING_VALID_FILES, EXPECTING_ANYTHING
--    }
--
--    private void checkTestDirectoryAgainstSchema(File directory,
--            String schemaUrl) throws SAXException, Exception {
--        validator.setUpMainSchema(schemaUrl, this);
--        checkTestFiles(directory, State.EXPECTING_ANYTHING);
--    }
--
--    private void checkTestFiles(File directory, State state)
--            throws SAXException, IOException {
--        File[] files = directory.listFiles();
--        List<File> validFiles = new ArrayList<File>();
--        List<File> invalidFiles = new ArrayList<File>();
--        List<File> hasWarningFiles = new ArrayList<File>();
--        if (files == null) {
--            if (verbose) {
--                try {
--                    out.println(String.format(
--                            "\"%s\": warning: No files found in directory.",
--                            directory.toURI().toURL().toString()));
--                    out.flush();
--                } catch (MalformedURLException mue) {
--                    throw new RuntimeException(mue);
--                }
--            }
--            return;
--        }
--        for (int i = 0; i < files.length; i++) {
--            File file = files[i];
--            if (file.isDirectory()) {
--                if (state != State.EXPECTING_ANYTHING) {
--                    checkTestFiles(file, state);
--                } else if ("invalid".equals(file.getName())) {
--                    checkTestFiles(file, State.EXPECTING_INVALID_FILES);
--                } else if ("valid".equals(file.getName())) {
--                    checkTestFiles(file, State.EXPECTING_VALID_FILES);
--                } else {
--                    checkTestFiles(file, State.EXPECTING_ANYTHING);
--                }
--            } else if (isCheckableFile(file)) {
--                if (state == State.EXPECTING_INVALID_FILES) {
--                    invalidFiles.add(file);
--                } else if (state == State.EXPECTING_VALID_FILES) {
--                    validFiles.add(file);
--                } else if (file.getPath().indexOf("novalid") > 0) {
--                    invalidFiles.add(file);
--                } else if (file.getPath().indexOf("haswarn") > 0) {
--                    hasWarningFiles.add(file);
--                } else {
--                    validFiles.add(file);
--                }
--            }
--        }
--        if (validFiles.size() > 0) {
--            validator.setUpValidatorAndParsers(this, false, false);
--            checkFiles(validFiles);
--        }
--        if (invalidFiles.size() > 0) {
--            validator.setUpValidatorAndParsers(this, false, false);
--            checkInvalidFiles(invalidFiles);
--        }
--        if (hasWarningFiles.size() > 0) {
--            validator.setUpValidatorAndParsers(this, false, false);
--            checkHasWarningFiles(hasWarningFiles);
--        }
--        if (writeMessages) {
--            OutputStreamWriter out = new OutputStreamWriter(
--                    new FileOutputStream(messagesFile), "utf-8");
--            BufferedWriter bw = new BufferedWriter(out);
--            bw.write(JSON.toString(reportedMessages));
--            bw.close();
--        }
--    }
--
--    public boolean runTestSuite() throws SAXException, Exception {
--        if (messagesFile != null) {
--            baseDir = messagesFile.getAbsoluteFile().getParent();
--            FileInputStream fis = new FileInputStream(messagesFile);
--            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
--            expectedMessages = (HashMap<String, String>) JSON.parse(reader);
--        } else {
--            baseDir = System.getProperty("user.dir");
--        }
--        for (File directory : new File(baseDir).listFiles()) {
--            if (directory.isDirectory()) {
--                if (directory.getName().contains("rdfalite")) {
--                    checkTestDirectoryAgainstSchema(directory,
--                            "http://s.validator.nu/html5-rdfalite.rnc");
--                } else if (directory.getName().contains("xhtml")) {
--                    checkTestDirectoryAgainstSchema(directory,
--                            "http://s.validator.nu/xhtml5-all.rnc");
--                } else {
--                    checkTestDirectoryAgainstSchema(directory, schema);
--                }
--            }
--        }
--        if (verbose) {
--            if (failed) {
--                out.println("Failure!");
--                out.flush();
--            } else {
--                out.println("Success!");
--                out.flush();
--            }
--        }
--        return !failed;
--    }
--
--    private void emitMessage(SAXParseException e, String messageType) {
--        String systemId = e.getSystemId();
--        err.write((systemId == null) ? "" : '\"' + systemId + '\"');
--        err.write(":");
--        err.write(Integer.toString(e.getLineNumber()));
--        err.write(":");
--        err.write(Integer.toString(e.getColumnNumber()));
--        err.write(": ");
--        err.write(messageType);
--        err.write(": ");
--        err.write(e.getMessage());
--        err.write("\n");
--        err.flush();
--    }
--
--    public void warning(SAXParseException e) throws SAXException {
--        if (emitMessages) {
--            emitMessage(e, "warning");
--        } else if (exception == null && !expectingError) {
--            exception = e;
--            exceptionIsWarning = true;
--        }
--    }
--
--    public void error(SAXParseException e) throws SAXException {
--        if (emitMessages) {
--            emitMessage(e, "error");
--        } else if (exception == null) {
--            exception = e;
--            if (e instanceof BadAttributeValueException) {
--                BadAttributeValueException ex = (BadAttributeValueException) e;
--                Map<String, DatatypeException> datatypeErrors = ex.getExceptions();
--                for (Map.Entry<String, DatatypeException> entry : datatypeErrors.entrySet()) {
--                    DatatypeException dex = entry.getValue();
--                    if (dex instanceof Html5DatatypeException) {
--                        Html5DatatypeException ex5 = (Html5DatatypeException) dex;
--                        if (ex5.isWarning()) {
--                            exceptionIsWarning = true;
--                            return;
--                        }
--                    }
--                }
--            }
--        }
--        inError = true;
--    }
--
--    public void fatalError(SAXParseException e) throws SAXException {
--        inError = true;
--        if (emitMessages) {
--            emitMessage(e, "fatal error");
--            return;
--        } else if (exception == null) {
--            exception = e;
--        }
--    }
--
--    public void reset() {
--        exception = null;
--        inError = false;
--        emitMessages = false;
--        exceptionIsWarning = false;
--    }
--
--    public static void main(String[] args) throws SAXException, Exception {
--        if (args.length < 1) {
--            usage();
--            System.exit(0);
--        }
--        verbose = false;
--        String messagesFilename = null;
--        System.setProperty("nu.validator.datatype.warn", "true");
--        for (int i = 0; i < args.length; i++) {
--            if ("--verbose".equals(args[i])) {
--                verbose = true;
--            } else if ("--errors-only".equals(args[i])) {
--                System.setProperty("nu.validator.datatype.warn", "false");
--            } else if ("--write-messages".equals(args[i])) {
--                writeMessages = true;
--            } else if (args[i].startsWith("--ignore=")) {
--                ignoreList = args[i].substring(9, args[i].length()).split(",");
--            } else if (args[i].startsWith("--")) {
--                System.out.println(String.format(
--                        "\nError: There is no option \"%s\".", args[i]));
--                usage();
--                System.exit(1);
--            } else {
--                if (args[i].endsWith(".json")) {
--                    messagesFilename = args[i];
--                } else {
--                    System.out.println("\nError: Expected the name of a messages"
--                            + " file with a .json extension.");
--                    usage();
--                    System.exit(1);
--                }
--            }
--        }
--        if (messagesFilename != null) {
--            messagesFile = new File(messagesFilename);
--            if (!messagesFile.exists()) {
--                System.out.println("\nError: \"" + messagesFilename
--                        + "\" file not found.");
--                System.exit(1);
--            } else if (!messagesFile.isFile()) {
--                System.out.println("\nError: \"" + messagesFilename
--                        + "\" is not a file.");
--                System.exit(1);
--            }
--        } else if (writeMessages) {
--            System.out.println("\nError: Expected the name of a messages"
--                    + " file with a .json extension.");
--            usage();
--            System.exit(1);
--        }
--        TestRunner tr = new TestRunner();
--        if (tr.runTestSuite()) {
--            System.exit(0);
--        } else {
--            System.exit(1);
--        }
--    }
--
--    private static void usage() {
--        System.out.println("\nUsage:");
--        System.out.println("\n    java nu.validator.client.TestRunner [--errors-only] [--write-messages]");
--        System.out.println("          [--verbose] [MESSAGES.json]");
--        System.out.println("\n...where the MESSAGES.json file contains name/value pairs in which the name is");
--        System.out.println("a pathname of a document to check and the value is the first error message or");
--        System.out.println("warning message the validator is expected to report when checking that document.");
--        System.out.println("Use the --write-messages option to create the file.");
--    }
--}
-diff --git a/src/nu/validator/datatype/FunctionBody.java b/src/nu/validator/datatype/FunctionBody.java
-index 5e8bd69..35642ef 100644
---- a/src/nu/validator/datatype/FunctionBody.java
-+++ b/src/nu/validator/datatype/FunctionBody.java
-@@ -27,9 +27,9 @@ import java.io.IOException;
- import java.io.Reader;
- import java.io.StringReader;
- 
--import org.mozilla.javascript.Context;
--import org.mozilla.javascript.ContextFactory;
--import org.mozilla.javascript.RhinoException;
-+//import org.mozilla.javascript.Context;
-+//import org.mozilla.javascript.ContextFactory;
-+//import org.mozilla.javascript.RhinoException;
- import org.relaxng.datatype.DatatypeException;
- 
- public class FunctionBody extends AbstractDatatype {
-@@ -44,25 +44,25 @@ public class FunctionBody extends AbstractDatatype {
-     }
- 
-     public void checkValid(CharSequence literal) throws DatatypeException {
--        try {
--            Reader reader = new BufferedReader((new StringReader(
--                    "function(event){" + literal.toString() + "}")));
--            reader.mark(1);
--            try {
--                Context context = ContextFactory.getGlobal().enterContext();
--                context.setOptimizationLevel(0);
--                context.setLanguageVersion(Context.VERSION_1_6);
--                // -1 for lineno arg prevents Rhino from appending
--                // "(unnamed script#1)" to all error messages
--                context.compileReader(reader, null, -1, null);
--            } finally {
--                Context.exit();
--            }
--        } catch (IOException e) {
--            throw newDatatypeException(e.getMessage());
--        } catch (RhinoException e) {
--            throw newDatatypeException(e.getMessage());
--        }
-+//        try {
-+//            Reader reader = new BufferedReader((new StringReader(
-+//                    "function(event){" + literal.toString() + "}")));
-+//            reader.mark(1);
-+//            try {
-+//                Context context = ContextFactory.getGlobal().enterContext();
-+//                context.setOptimizationLevel(0);
-+//                context.setLanguageVersion(Context.VERSION_1_6);
-+//                // -1 for lineno arg prevents Rhino from appending
-+//                // "(unnamed script#1)" to all error messages
-+//                context.compileReader(reader, null, -1, null);
-+//            } finally {
-+//                Context.exit();
-+//            }
-+//        } catch (IOException e) {
-+//            throw newDatatypeException(e.getMessage());
-+//        } catch (RhinoException e) {
-+//            throw newDatatypeException(e.getMessage());
-+//        }
-     }
- 
-     @Override public String getName() {
-diff --git a/src/nu/validator/datatype/IriRef.java b/src/nu/validator/datatype/IriRef.java
-index e9d6fff..2b42415 100644
---- a/src/nu/validator/datatype/IriRef.java
-+++ b/src/nu/validator/datatype/IriRef.java
-@@ -29,18 +29,18 @@ import java.io.InputStream;
- import java.io.Reader;
- import java.io.StringReader;
- 
--import org.mozilla.javascript.Context;
--import org.mozilla.javascript.ContextFactory;
--import org.mozilla.javascript.RhinoException;
-+//import org.mozilla.javascript.Context;
-+//import org.mozilla.javascript.ContextFactory;
-+//import org.mozilla.javascript.RhinoException;
- import org.relaxng.datatype.DatatypeException;
- import nu.validator.io.DataUri;
- import nu.validator.io.DataUriException;
- import nu.validator.io.Utf8PercentDecodingReader;
- 
--import io.mola.galimatias.URL;
--import io.mola.galimatias.URLParsingSettings;
--import io.mola.galimatias.GalimatiasParseException;
--import io.mola.galimatias.StrictErrorHandler;
-+//import io.mola.galimatias.URL;
-+//import io.mola.galimatias.URLParsingSettings;
-+//import io.mola.galimatias.GalimatiasParseException;
-+//import io.mola.galimatias.StrictErrorHandler;
- 
- public class IriRef extends AbstractDatatype {
- 
-@@ -93,112 +93,112 @@ public class IriRef extends AbstractDatatype {
-     }
- 
-     public void checkValid(CharSequence literal) throws DatatypeException {
--        String messagePrologue = "";
--        int length = literal.length();
--        if (reportValue()) {
--            if (length < ELIDE_LIMIT) {
--                messagePrologue = "\u201c" + literal + "\u201d: ";
--            } else {
--                StringBuilder sb = new StringBuilder(ELIDE_LIMIT + 1);
--                sb.append(literal, 0, ELIDE_LIMIT / 2);
--                sb.append('\u2026');
--                sb.append(literal, length - ELIDE_LIMIT / 2, length);
--                messagePrologue = "\u201c" + sb.toString() + "\u201d: ";
--            }
--        }
--        if ("".equals(trimHtmlSpaces(literal.toString()))) {
--            throw newDatatypeException("Must be non-empty.");
--        }
--        URL url = null;
--        URLParsingSettings settings = URLParsingSettings.create().withErrorHandler(
--                StrictErrorHandler.getInstance());
--        boolean data = false;
--        try {
--            CharSequencePair pair = splitScheme(literal);
--            if (pair == null) {
--                // no scheme or scheme is private
--                if (isAbsolute()) {
--                    throw newDatatypeException("The string \u201c" + literal
--                            + "\u201d is not an absolute URL.");
--                } else {
--                    // in this case, doc's actual base URL isn't relevant,
--                    // so just use http://example.org/foo/bar as base
--                    url = URL.parse(settings,
--                            URL.parse("http://example.org/foo/bar"),
--                            literal.toString());
--                }
--            } else {
--                CharSequence scheme = pair.getHead();
--                CharSequence tail = pair.getTail();
--                if (isWellKnown(scheme)) {
--                    url = URL.parse(settings, literal.toString());
--                } else if ("javascript".contentEquals(scheme)) {
--                    // StringBuilder sb = new StringBuilder(2 +
--                    // literal.length());
--                    // sb.append("x-").append(literal);
--                    // iri = fac.construct(sb.toString());
--                    url = null; // Don't bother user with generic IRI syntax
--                    Reader reader = new BufferedReader(
--                            new Utf8PercentDecodingReader(new StringReader(
--                                    "function(event){" + tail.toString() + "}")));
--                    // XXX CharSequenceReader
--                    reader.mark(1);
--                    int c = reader.read();
--                    if (c != 0xFEFF) {
--                        reader.reset();
--                    }
--                    try {
--                        Context context = ContextFactory.getGlobal().enterContext();
--                        context.setOptimizationLevel(0);
--                        context.setLanguageVersion(Context.VERSION_1_6);
--                        // -1 for lineno arg prevents Rhino from appending
--                        // "(unnamed script#1)" to all error messages
--                        context.compileReader(reader, null, -1, null);
--                    } finally {
--                        Context.exit();
--                    }
--                } else if ("data".contentEquals(scheme)) {
--                    data = true;
--                    url = URL.parse(settings, literal.toString());
--                } else if (isHttpAlias(scheme)) {
--                    StringBuilder sb = new StringBuilder(5 + tail.length());
--                    sb.append("http:").append(tail);
--                    url = URL.parse(settings, sb.toString());
--                } else {
--                    StringBuilder sb = new StringBuilder(2 + literal.length());
--                    sb.append("x-").append(literal);
--                    url = URL.parse(settings, sb.toString());
--                }
--            }
--        } catch (GalimatiasParseException e) {
--            throw newDatatypeException(messagePrologue + e.getMessage() + ".");
--        } catch (IOException e) {
--            throw newDatatypeException(messagePrologue + e.getMessage());
--        } catch (RhinoException e) {
--            throw newDatatypeException(messagePrologue + e.getMessage());
--        }
--        if (url != null) {
--            if (data) {
--                try {
--                    DataUri dataUri = new DataUri(url);
--                    InputStream is = dataUri.getInputStream();
--                    while (is.read() >= 0) {
--                        // spin
--                    }
--                } catch (DataUriException e) {
--                    throw newDatatypeException(e.getIndex(), e.getHead(),
--                            e.getLiteral(), e.getTail());
--                } catch (IOException e) {
--                    String msg = e.getMessage();
--                    if (WARN
--                            && "Fragment is not allowed for data: URIs according to RFC 2397.".equals(msg)) {
--                        throw newDatatypeException(messagePrologue + msg, WARN);
--                    } else {
--                        throw newDatatypeException(messagePrologue + msg);
--                    }
--                }
--            }
--        }
-+//        String messagePrologue = "";
-+//        int length = literal.length();
-+//        if (reportValue()) {
-+//            if (length < ELIDE_LIMIT) {
-+//                messagePrologue = "\u201c" + literal + "\u201d: ";
-+//            } else {
-+//                StringBuilder sb = new StringBuilder(ELIDE_LIMIT + 1);
-+//                sb.append(literal, 0, ELIDE_LIMIT / 2);
-+//                sb.append('\u2026');
-+//                sb.append(literal, length - ELIDE_LIMIT / 2, length);
-+//                messagePrologue = "\u201c" + sb.toString() + "\u201d: ";
-+//            }
-+//        }
-+//        if ("".equals(trimHtmlSpaces(literal.toString()))) {
-+//            throw newDatatypeException("Must be non-empty.");
-+//        }
-+//        URL url = null;
-+//        URLParsingSettings settings = URLParsingSettings.create().withErrorHandler(
-+//                StrictErrorHandler.getInstance());
-+//        boolean data = false;
-+//        try {
-+//            CharSequencePair pair = splitScheme(literal);
-+//            if (pair == null) {
-+//                // no scheme or scheme is private
-+//                if (isAbsolute()) {
-+//                    throw newDatatypeException("The string \u201c" + literal
-+//                            + "\u201d is not an absolute URL.");
-+//                } else {
-+//                    // in this case, doc's actual base URL isn't relevant,
-+//                    // so just use http://example.org/foo/bar as base
-+//                    url = URL.parse(settings,
-+//                            URL.parse("http://example.org/foo/bar"),
-+//                            literal.toString());
-+//                }
-+//            } else {
-+//                CharSequence scheme = pair.getHead();
-+//                CharSequence tail = pair.getTail();
-+//                if (isWellKnown(scheme)) {
-+//                    url = URL.parse(settings, literal.toString());
-+//                } else if ("javascript".contentEquals(scheme)) {
-+//                    // StringBuilder sb = new StringBuilder(2 +
-+//                    // literal.length());
-+//                    // sb.append("x-").append(literal);
-+//                    // iri = fac.construct(sb.toString());
-+//                    url = null; // Don't bother user with generic IRI syntax
-+//                    Reader reader = new BufferedReader(
-+//                            new Utf8PercentDecodingReader(new StringReader(
-+//                                    "function(event){" + tail.toString() + "}")));
-+//                    // XXX CharSequenceReader
-+//                    reader.mark(1);
-+//                    int c = reader.read();
-+//                    if (c != 0xFEFF) {
-+//                        reader.reset();
-+//                    }
-+//                    try {
-+//                        Context context = ContextFactory.getGlobal().enterContext();
-+//                        context.setOptimizationLevel(0);
-+//                        context.setLanguageVersion(Context.VERSION_1_6);
-+//                        // -1 for lineno arg prevents Rhino from appending
-+//                        // "(unnamed script#1)" to all error messages
-+//                        context.compileReader(reader, null, -1, null);
-+//                    } finally {
-+//                        Context.exit();
-+//                    }
-+//                } else if ("data".contentEquals(scheme)) {
-+//                    data = true;
-+//                    url = URL.parse(settings, literal.toString());
-+//                } else if (isHttpAlias(scheme)) {
-+//                    StringBuilder sb = new StringBuilder(5 + tail.length());
-+//                    sb.append("http:").append(tail);
-+//                    url = URL.parse(settings, sb.toString());
-+//                } else {
-+//                    StringBuilder sb = new StringBuilder(2 + literal.length());
-+//                    sb.append("x-").append(literal);
-+//                    url = URL.parse(settings, sb.toString());
-+//                }
-+//            }
-+//        } catch (GalimatiasParseException e) {
-+//            throw newDatatypeException(messagePrologue + e.getMessage() + ".");
-+//        } catch (IOException e) {
-+//            throw newDatatypeException(messagePrologue + e.getMessage());
-+//        } catch (RhinoException e) {
-+//            throw newDatatypeException(messagePrologue + e.getMessage());
-+//        }
-+//        if (url != null) {
-+//            if (data) {
-+//                try {
-+//                    DataUri dataUri = new DataUri(url);
-+//                    InputStream is = dataUri.getInputStream();
-+//                    while (is.read() >= 0) {
-+//                        // spin
-+//                    }
-+//                } catch (DataUriException e) {
-+//                    throw newDatatypeException(e.getIndex(), e.getHead(),
-+//                            e.getLiteral(), e.getTail());
-+//                } catch (IOException e) {
-+//                    String msg = e.getMessage();
-+//                    if (WARN
-+//                            && "Fragment is not allowed for data: URIs according to RFC 2397.".equals(msg)) {
-+//                        throw newDatatypeException(messagePrologue + msg, WARN);
-+//                    } else {
-+//                        throw newDatatypeException(messagePrologue + msg);
-+//                    }
-+//                }
-+//            }
-+//        }
-     }
- 
-     private final boolean isHttpAlias(CharSequence scheme) {
-diff --git a/src/nu/validator/datatype/Language.java b/src/nu/validator/datatype/Language.java
-index b61913d..24fb4a4 100644
---- a/src/nu/validator/datatype/Language.java
-+++ b/src/nu/validator/datatype/Language.java
-@@ -227,7 +227,7 @@ public final class Language extends AbstractDatatype {
-             checkPrivateUse(i, subtags);
-             return;
-         }
--        if (subtag.length() == 4 & isLowerCaseAlpha(subtag)) {
-+        if (subtag.length() == 4 && isLowerCaseAlpha(subtag)) {
-             if (!isScript(subtag)) {
-                 throw newDatatypeException("Bad script subtag.");
-             }
-diff --git a/src/nu/validator/datatype/Pattern.java b/src/nu/validator/datatype/Pattern.java
-index aa10750..67766c7 100644
---- a/src/nu/validator/datatype/Pattern.java
-+++ b/src/nu/validator/datatype/Pattern.java
-@@ -22,10 +22,10 @@
- 
- package nu.validator.datatype;
- 
--import org.mozilla.javascript.Context;
--import org.mozilla.javascript.ContextFactory;
--import org.mozilla.javascript.EcmaError;
--import org.mozilla.javascript.regexp.RegExpImpl;
-+//import org.mozilla.javascript.Context;
-+//import org.mozilla.javascript.ContextFactory;
-+//import org.mozilla.javascript.EcmaError;
-+//import org.mozilla.javascript.regexp.RegExpImpl;
- import org.relaxng.datatype.DatatypeException;
- 
- /**
-@@ -58,18 +58,18 @@ public final class Pattern extends AbstractDatatype {
-     public void checkValid(CharSequence literal)
-             throws DatatypeException {
-         // TODO find out what kind of thread concurrency guarantees are made
--        ContextFactory cf = new ContextFactory();
--        Context cx = cf.enterContext();
--        cx.setOptimizationLevel(0);
--        RegExpImpl rei = new RegExpImpl();
--        String anchoredRegex = "^(?:" + literal + ")$";
--        try {
--            rei.compileRegExp(cx, anchoredRegex, "");
--        } catch (EcmaError ee) {
--            throw newDatatypeException(ee.getErrorMessage());
--        } finally {
--            Context.exit();
--        }
-+//        ContextFactory cf = new ContextFactory();
-+//        Context cx = cf.enterContext();
-+//        cx.setOptimizationLevel(0);
-+//        RegExpImpl rei = new RegExpImpl();
-+//        String anchoredRegex = "^(?:" + literal + ")$";
-+//        try {
-+//            rei.compileRegExp(cx, anchoredRegex, "");
-+//        } catch (EcmaError ee) {
-+//            throw newDatatypeException(ee.getErrorMessage());
-+//        } finally {
-+//            Context.exit();
-+//        }
-     }
- 
-     @Override
-diff --git a/src/nu/validator/datatype/SourceSizeList.java b/src/nu/validator/datatype/SourceSizeList.java
-index 1c61f81..e3bd20a 100644
---- a/src/nu/validator/datatype/SourceSizeList.java
-+++ b/src/nu/validator/datatype/SourceSizeList.java
-@@ -26,7 +26,6 @@ import java.text.ParseException;
- import java.util.LinkedHashSet;
- import java.util.Set;
- 
--import nu.validator.datatype.tools.CssParser;
- import org.relaxng.datatype.DatatypeException;
- 
- public class SourceSizeList extends AbstractDatatype {
-@@ -41,8 +40,6 @@ public class SourceSizeList extends AbstractDatatype {
- 
-     private static final StringBuilder VALID_UNITS = new StringBuilder();
- 
--    private static CssParser cssParser = new CssParser();
--
-     static {
-         /* font-relative lengths */
-         LENGTH_UNITS.add("em");
-@@ -119,18 +116,6 @@ public class SourceSizeList extends AbstractDatatype {
-             errEmpty(isFirst, isLast, extract);
-             return;
-         }
--        try {
--            cssParser.tokenize(unparsedSize.toString());
--            if ('(' == unparsedSize.codePointAt(0)) {
--                cssParser.parseARule("@media " + unparsedSize.toString()
--                        + " {}");
--            } else {
--                cssParser.parseARule(".foo { width: " + unparsedSize.toString()
--                        + " }");
--            }
--        } catch (ParseException e) {
--            errCssParseError(e.getMessage(), unparsedSize, extract);
--        }
-         if (')' == unparsedSize.charAt(unparsedSize.length() - 1)) {
-             checkCalc(unparsedSize, extract, isLast);
-             return;
-diff --git a/src/nu/validator/datatype/tools/CssParser.java b/src/nu/validator/datatype/tools/CssParser.java
-deleted file mode 100644
-index 9daa67f..0000000
---- a/src/nu/validator/datatype/tools/CssParser.java
-+++ /dev/null
-@@ -1,88 +0,0 @@
--/*
-- * Copyright (c) 2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.datatype.tools;
--
--import java.io.BufferedReader;
--import java.io.IOException;
--import java.io.InputStreamReader;
--import java.text.ParseException;
--
--import org.mozilla.javascript.Context;
--import org.mozilla.javascript.ContextFactory;
--import org.mozilla.javascript.Function;
--import org.mozilla.javascript.JavaScriptException;
--import org.mozilla.javascript.ScriptableObject;
--
--public class CssParser {
--
--    private static ScriptableObject scope;
--
--    private static Function tokenizer;
--
--    private static Function ruleParser;
--
--    static {
--        try {
--            BufferedReader br = new BufferedReader(
--                    new InputStreamReader(
--                            CssParser.class.getClassLoader().getResourceAsStream(
--                                    "nu/validator/localentities/files/parse-css-js")));
--            br.mark(1);
--            Context context = ContextFactory.getGlobal().enterContext();
--            context.setOptimizationLevel(1);
--            context.setLanguageVersion(Context.VERSION_1_6);
--            scope = context.initStandardObjects();
--            context.evaluateReader(scope, br, null, -1, null);
--            tokenizer = (Function) scope.get("tokenize", scope);
--            ruleParser = (Function) scope.get("parseARule", scope);
--        } catch (IOException e) {
--        }
--    }
--
--    public String[] tokenize(CharSequence cs) throws ParseException {
--        try {
--            Context context = ContextFactory.getGlobal().enterContext();
--            context.setOptimizationLevel(0);
--            context.setLanguageVersion(Context.VERSION_1_6);
--            return (String[]) Context.jsToJava(
--                    tokenizer.call(context, scope, scope, new Object[] { cs }),
--                    String[].class);
--        } catch (JavaScriptException e) {
--            throw new ParseException(e.details(), -1);
--        }
--    }
--
--    public String parseARule(CharSequence cs) throws ParseException {
--        try {
--            Context context = ContextFactory.getGlobal().enterContext();
--            context.setOptimizationLevel(0);
--            context.setLanguageVersion(Context.VERSION_1_6);
--            return (String) Context.jsToJava(ruleParser.call(context, scope, scope,
--                    new Object[] { tokenizer.call(context, scope, scope,
--                            new Object[] { cs }) }), String.class);
--        } catch (JavaScriptException e) {
--            throw new ParseException(e.details(), -1);
--        }
--    }
--
--}
-diff --git a/src/nu/validator/io/DataUri.java b/src/nu/validator/io/DataUri.java
-index 74811a9..9677758 100644
---- a/src/nu/validator/io/DataUri.java
-+++ b/src/nu/validator/io/DataUri.java
-@@ -22,13 +22,14 @@
- 
- package nu.validator.io;
- 
-+import com.hp.hpl.jena.iri.IRIFactory;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.StringReader;
- import java.net.MalformedURLException;
- 
--import io.mola.galimatias.URL;
--import io.mola.galimatias.GalimatiasParseException;
-+//import io.mola.galimatias.URL;
-+//import io.mola.galimatias.GalimatiasParseException;
- 
- public class DataUri {
- 
-@@ -54,17 +55,17 @@ public class DataUri {
-      * @throws MalformedURLException
-      * @throws IOException
-      */
--    protected void init(URL url) throws IOException, MalformedURLException {
--        if (!url.scheme().equals("data")) {
-+    protected void init(com.hp.hpl.jena.iri.IRI url) throws IOException, MalformedURLException {
-+        if (!url.getScheme().equals("data")) {
-             throw new IllegalArgumentException("The input did not start with data:.");
-         }
- 
--        if (url.fragment() != null) {
-+        if (url.getRawFragment() != null) {
-             throw new MalformedURLException(
-                     "Fragment is not allowed for data: URIs according to RFC 2397.");
-         }
- 
--        InputStream is = new PercentDecodingReaderInputStream(new StringReader(url.schemeData()));
-+        InputStream is = new PercentDecodingReaderInputStream(new StringReader(url.getRawPath()));
-         StringBuilder sb = new StringBuilder();
-         State state = State.AT_START;
-         int i = 0; // string counter
-@@ -254,11 +255,15 @@ public class DataUri {
-     }
- 
-     public DataUri(String url) throws IOException {
--        try {
--            init(URL.parse(url));
--        } catch (GalimatiasParseException e) {
--            throw new MalformedURLException(e.getMessage());
--        }
-+        
-+        IRIFactory fac = new IRIFactory();
-+        fac.shouldViolation(true, false);
-+        fac.securityViolation(true, false);
-+        fac.dnsViolation(true, false);
-+        fac.mintingViolation(false, false);
-+        fac.useSpecificationIRI(true);
-+        init(fac.construct(url));
-+        
-     }
- 
-     /**
-@@ -266,7 +271,7 @@ public class DataUri {
-      * @throws MalformedURLException
-      * @throws IOException
-      */
--    public DataUri(URL url) throws IOException, MalformedURLException {
-+    public DataUri(com.hp.hpl.jena.iri.IRI url) throws IOException, MalformedURLException {
-         init(url);
-     }
- 
-diff --git a/src/nu/validator/localentities/LocalCacheEntityResolver.java b/src/nu/validator/localentities/LocalCacheEntityResolver.java
-index 8b6ac69..18de3b8 100644
---- a/src/nu/validator/localentities/LocalCacheEntityResolver.java
-+++ b/src/nu/validator/localentities/LocalCacheEntityResolver.java
-@@ -4,6 +4,7 @@ import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
-+import java.net.URL;
- import java.util.HashMap;
- import java.util.Map;
- 
-@@ -41,7 +42,7 @@ public class LocalCacheEntityResolver implements EntityResolver {
-     }
- 
-     public static InputStream getPresetsAsStream() {
--        return LOADER.getResourceAsStream("nu/validator/localentities/files/presets");
-+        return LOADER.getResourceAsStream("nu/validator/localentities/presets");
-     }
- 
-     public static InputStream getHtml5SpecAsStream() {
-@@ -53,18 +54,27 @@ public class LocalCacheEntityResolver implements EntityResolver {
-     private boolean allowRnc = false;
- 
-     /**
-+     * The map must be safe for concurrent reads.
-+     * 
-+     * @param pathMap
-      * @param delegate
-      */
-     public LocalCacheEntityResolver(EntityResolver delegate) {
-         this.delegate = delegate;
-     }
- 
-+    public static URL getResource(String systemId) {
-+        String path = PATH_MAP.get(systemId);
-+        return path != null ? LOADER.getResource(path) : null;
-+    }
-+
-     /**
-      * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String,
-      *      java.lang.String)
-      */
-     public InputSource resolveEntity(String publicId, String systemId)
-             throws SAXException, IOException {
-+        long a = System.currentTimeMillis();
-         String path = PATH_MAP.get(systemId);
-         if (path != null) {
-             InputStream stream = LOADER.getResourceAsStream(path);
-@@ -89,6 +99,7 @@ public class LocalCacheEntityResolver implements EntityResolver {
-                 return is;
-             }
-         }
-+        System.out.println("resolve :" + publicId +" " + systemId); 
-         return delegate.resolveEntity(publicId, systemId);
-     }
- 
-@@ -106,4 +117,4 @@ public class LocalCacheEntityResolver implements EntityResolver {
-     public void setAllowRnc(boolean allowRnc) {
-         this.allowRnc = allowRnc;
-     }
--}
-+}
-\ No newline at end of file
-diff --git a/src/nu/validator/localentities/presets b/src/nu/validator/localentities/presets
-new file mode 100644
-index 0000000..7966803
---- /dev/null
-+++ b/src/nu/validator/localentities/presets
-@@ -0,0 +1,10 @@
-+-1	-	HTML5 + SVG 1.1 + MathML 3.0	http://s.validator.nu/html5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-+-1	-	HTML5 + SVG 1.1 + MathML 3.0 + ITS 2.0	http://s.validator.nu/html5-its.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-+3	-	HTML5 + SVG 1.1 + MathML 3.0 + RDFa Lite 1.1	http://s.validator.nu/html5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-+2	-	HTML 4.01 Strict + IRI / XHTML 1.0 Strict + IRI	http://s.validator.nu/xhtml10/xhtml-strict.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all-html4/
-+1	-	HTML 4.01 Transitional + IRI / XHTML 1.0 Transitional + IRI	http://s.validator.nu/xhtml10/xhtml-transitional.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all-html4/
-+-1	-	HTML 4.01 Frameset + IRI / XHTML 1.0 Frameset + IRI	http://s.validator.nu/xhtml10/xhtml-frameset.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all-html4/
-+-1	-	XHTML5 + SVG 1.1 + MathML 3.0	http://s.validator.nu/xhtml5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-+7	http://www.w3.org/1999/xhtml	XHTML5 + SVG 1.1 + MathML 3.0 + RDFa Lite 1.1	http://s.validator.nu/xhtml5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-+-1	-	XHTML 1.0 Strict + IRI + Ruby + SVG 1.1 + MathML 3.0	http://s.validator.nu/xhtml1-ruby-rdf-svg-mathml.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all-html4/
-+-1	http://www.w3.org/2000/svg	SVG 1.1 + IRI + XHTML5 + MathML 3.0	http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/
-\ No newline at end of file
-diff --git a/src/nu/validator/messages/BufferingRootNamespaceSniffer.java b/src/nu/validator/messages/BufferingRootNamespaceSniffer.java
-new file mode 100644
-index 0000000..13e5b07
---- /dev/null
-+++ b/src/nu/validator/messages/BufferingRootNamespaceSniffer.java
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright (c) 2006 Henri Sivonen
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a 
-+ * copy of this software and associated documentation files (the "Software"), 
-+ * to deal in the Software without restriction, including without limitation 
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-+ * and/or sell copies of the Software, and to permit persons to whom the 
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in 
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+package nu.validator.messages;
-+
-+import java.util.Iterator;
-+import java.util.LinkedList;
-+import java.util.List;
-+import org.xml.sax.Attributes;
-+import org.xml.sax.ContentHandler;
-+import org.xml.sax.Locator;
-+import org.xml.sax.SAXException;
-+
-+public class BufferingRootNamespaceSniffer implements ContentHandler {
-+
-+    private ContentHandler ch = null;
-+
-+    private Locator locator = null;
-+    
-+    private List<String[]> namespaces = new LinkedList<String[]>();
-+    
-+    private ValidationTransaction vst;
-+    
-+    public BufferingRootNamespaceSniffer(ValidationTransaction vst) {
-+        super();
-+        this.vst = vst;
-+    }
-+
-+    public void setContentHandler(ContentHandler contentHandler) throws SAXException {
-+        this.ch = contentHandler;
-+        if (locator != null) {
-+            ch.setDocumentLocator(locator);
-+        }
-+        ch.startDocument();
-+        for (Iterator<String[]> iter = namespaces.iterator(); iter.hasNext();) {
-+            String[] element = iter.next();
-+            ch.startPrefixMapping(element[0], element[1]);
-+        }
-+    }
-+    
-+    /**
-+     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
-+     */
-+    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
-+        if (ch != null) {
-+            ch.characters(arg0, arg1, arg2);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endDocument()
-+     */
-+    public void endDocument() throws SAXException {
-+        if (ch != null) {
-+            ch.endDocument();
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
-+     *      java.lang.String, java.lang.String)
-+     */
-+    public void endElement(String arg0, String arg1, String arg2)
-+            throws SAXException {
-+        if (ch != null) {
-+            ch.endElement(arg0, arg1, arg2);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
-+     */
-+    public void endPrefixMapping(String arg0) throws SAXException {
-+        if (ch != null) {
-+            ch.endPrefixMapping(arg0);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
-+     */
-+    public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
-+            throws SAXException {
-+        if (ch != null) {
-+            ch.ignorableWhitespace(arg0, arg1, arg2);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String,
-+     *      java.lang.String)
-+     */
-+    public void processingInstruction(String arg0, String arg1)
-+            throws SAXException {
-+        if (ch != null) {
-+            ch.processingInstruction(arg0, arg1);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
-+     */
-+    public void setDocumentLocator(Locator arg0) {
-+        locator = arg0;
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
-+     */
-+    public void skippedEntity(String arg0) throws SAXException {
-+        if (ch != null) {
-+            ch.skippedEntity(arg0);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startDocument()
-+     */
-+    public void startDocument() throws SAXException {
-+
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
-+     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
-+     */
-+    public void startElement(String arg0, String arg1, String arg2,
-+            Attributes arg3) throws SAXException {
-+        if (ch != null) {
-+            ch.startElement(arg0, arg1, arg2, arg3);
-+        } else {
-+            vst.rootNamespace(arg0, locator);
-+            ch.startElement(arg0, arg1, arg2, arg3);
-+        }
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
-+     *      java.lang.String)
-+     */
-+    public void startPrefixMapping(String arg0, String arg1)
-+            throws SAXException {
-+        if (ch != null) {
-+            ch.startPrefixMapping(arg0, arg1);
-+        } else {
-+            String[] arr = new String[2];
-+            arr[0] = arg0;
-+            arr[1] = arg1;
-+            namespaces.add(arr);
-+        }
-+    }
-+
-+}
-diff --git a/src/nu/validator/messages/RootNamespaceSniffer.java b/src/nu/validator/messages/RootNamespaceSniffer.java
-new file mode 100644
-index 0000000..1981475
---- /dev/null
-+++ b/src/nu/validator/messages/RootNamespaceSniffer.java
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (c) 2006 Henri Sivonen
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a 
-+ * copy of this software and associated documentation files (the "Software"), 
-+ * to deal in the Software without restriction, including without limitation 
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-+ * and/or sell copies of the Software, and to permit persons to whom the 
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in 
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+package nu.validator.messages;
-+
-+import org.xml.sax.Attributes;
-+import org.xml.sax.ContentHandler;
-+import org.xml.sax.Locator;
-+import org.xml.sax.SAXException;
-+
-+public class RootNamespaceSniffer implements ContentHandler {
-+
-+    private ValidationTransaction vst;
-+    private ContentHandler ch;
-+    private Locator locator;
-+
-+    public RootNamespaceSniffer(ValidationTransaction vst, ContentHandler ch) {
-+        super();
-+        this.vst = vst;
-+        this.ch = ch;
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
-+     */
-+    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
-+        ch.characters(arg0, arg1, arg2);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endDocument()
-+     */
-+    public void endDocument() throws SAXException {
-+        ch.endDocument();
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
-+     */
-+    public void endElement(String arg0, String arg1, String arg2) throws SAXException {
-+        ch.endElement(arg0, arg1, arg2);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
-+     */
-+    public void endPrefixMapping(String arg0) throws SAXException {
-+        ch.endPrefixMapping(arg0);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
-+     */
-+    public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException {
-+        ch.ignorableWhitespace(arg0, arg1, arg2);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
-+     */
-+    public void processingInstruction(String arg0, String arg1) throws SAXException {
-+        ch.processingInstruction(arg0, arg1);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
-+     */
-+    public void setDocumentLocator(Locator arg0) {
-+        this.locator = arg0;
-+        ch.setDocumentLocator(arg0);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
-+     */
-+    public void skippedEntity(String arg0) throws SAXException {
-+        ch.skippedEntity(arg0);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startDocument()
-+     */
-+    public void startDocument() throws SAXException {
-+        ch.startDocument();
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
-+     */
-+    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
-+        vst.rootNamespace(arg0, locator);
-+        ch.startElement(arg0, arg1, arg2, arg3);
-+    }
-+
-+    /**
-+     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
-+     */
-+    public void startPrefixMapping(String arg0, String arg1) throws SAXException {
-+        ch.startPrefixMapping(arg0, arg1);
-+    }
-+
-+}
-diff --git a/src/nu/validator/messages/ValidationTransaction.java b/src/nu/validator/messages/ValidationTransaction.java
-new file mode 100644
-index 0000000..9b60092
---- /dev/null
-+++ b/src/nu/validator/messages/ValidationTransaction.java
-@@ -0,0 +1,466 @@
-+package nu.validator.messages;
-+
-+import com.thaiopensource.relaxng.impl.CombineValidator;
-+import com.thaiopensource.util.PropertyMap;
-+import com.thaiopensource.validate.IncorrectSchemaException;
-+import com.thaiopensource.validate.Schema;
-+import com.thaiopensource.validate.SchemaReader;
-+import com.thaiopensource.validate.SchemaResolver;
-+import com.thaiopensource.validate.Validator;
-+import com.thaiopensource.validate.auto.AutoSchemaReader;
-+import com.thaiopensource.validate.prop.wrap.WrapProperty;
-+import com.thaiopensource.validate.rng.CompactSchemaReader;
-+import java.io.IOException;
-+import java.lang.ref.SoftReference;
-+import java.util.Arrays;
-+import java.util.HashMap;
-+import java.util.Map;
-+import java.util.logging.Level;
-+import java.util.logging.Logger;
-+import java.util.regex.Pattern;
-+import nu.validator.checker.XmlPiChecker;
-+import nu.validator.checker.jing.CheckerSchema;
-+import nu.validator.htmlparser.common.DocumentMode;
-+import nu.validator.htmlparser.common.DocumentModeHandler;
-+import nu.validator.htmlparser.sax.HtmlParser;
-+import nu.validator.localentities.LocalCacheEntityResolver;
-+import nu.validator.spec.Spec;
-+import nu.validator.xml.TypedInputSource;
-+import org.xml.sax.ContentHandler;
-+import org.xml.sax.EntityResolver;
-+import org.xml.sax.Locator;
-+import org.xml.sax.SAXException;
-+import org.xml.sax.SAXParseException;
-+import org.xml.sax.XMLReader;
-+import org.xml.sax.ext.LexicalHandler;
-+
-+/**
-+ * This class code was mainly extracted from the original class {@link VerifierServletTransaction}.
-+ *
-+ * @author hsivonen, mfukala@netbeans.org
-+ */
-+public class ValidationTransaction implements DocumentModeHandler, SchemaResolver {
-+    private static final Logger LOGGER = Logger.getLogger(ValidationTransaction.class.getCanonicalName());
-+
-+    // XXX SVG!!!
-+    private static final String[] KNOWN_CONTENT_TYPES = {
-+        "application/atom+xml", "application/docbook+xml",
-+        "application/xhtml+xml", "application/xv+xml", "image/svg+xml"};
-+    private static final String[] NAMESPACES_FOR_KNOWN_CONTENT_TYPES = {
-+        "http://www.w3.org/2005/Atom", "http://docbook.org/ns/docbook",
-+        "http://www.w3.org/1999/xhtml", "http://www.w3.org/1999/xhtml",
-+        "http://www.w3.org/2000/svg"};
-+    protected static final String[] ALL_CHECKERS = {
-+        "http://c.validator.nu/table/", "http://c.validator.nu/nfc/",
-+        "http://c.validator.nu/text-content/",
-+        "http://c.validator.nu/unchecked/",
-+        "http://c.validator.nu/usemap/", "http://c.validator.nu/obsolete/",
-+        "http://c.validator.nu/xml-pi/"};
-+    private static final String[] ALL_CHECKERS_HTML4 = {
-+        "http://c.validator.nu/table/", "http://c.validator.nu/nfc/",
-+        "http://c.validator.nu/unchecked/", "http://c.validator.nu/usemap/"};
-+    
-+    protected BufferingRootNamespaceSniffer bufferingRootNamespaceSniffer = null;
-+    protected boolean rootNamespaceSeen = false;
-+    protected String contentType = null;
-+    
-+    protected static int[] presetDoctypes;
-+    protected static String[] presetLabels;
-+    protected static String[] presetUrls;
-+    protected static String[] presetNamespaces;
-+    
-+    protected MessageEmitterAdapter errorHandler;
-+    protected static String[] preloadedSchemaUrls;
-+    protected static Schema[] preloadedSchemas;
-+    
-+    private Map<String, Validator> loadedValidatorUrls = new HashMap<String, Validator>();
-+    
-+    protected Validator validator = null;
-+    protected LocalCacheEntityResolver entityResolver;
-+    
-+    private static final Pattern SPACE = Pattern.compile("\\s+");
-+    protected static final int HTML5_SCHEMA = 3;
-+    protected static final int XHTML1STRICT_SCHEMA = 2;
-+    protected static final int XHTML1FRAMESET_SCHEMA = 4;
-+    protected static final int XHTML1TRANSITIONAL_SCHEMA = 1;
-+    protected static final int XHTML5_SCHEMA = 7;
-+    
-+    public HtmlParser htmlParser = null;
-+    protected PropertyMap jingPropertyMap;
-+    protected static Spec html5spec;
-+    
-+    protected XMLReader reader;
-+    protected LexicalHandler lexicalHandler;
-+    
-+    public void rootNamespace(String namespace, Locator locator) throws SAXException {
-+        if (validator == null) {
-+            int index = -1;
-+            for (int i = 0; i < presetNamespaces.length; i++) {
-+                if (namespace.equals(presetNamespaces[i])) {
-+                    index = i;
-+                    break;
-+                }
-+            }
-+            if (index == -1) {
-+                String message = "Cannot find preset schema for namespace: \u201C"
-+                        + namespace + "\u201D.";
-+                SAXException se = new SAXException(message);
-+                errorHandler.schemaError(se);
-+                throw se;
-+            }
-+            String label = presetLabels[index];
-+            String urls = presetUrls[index];
-+            errorHandler.info("Using the preset for " + label
-+                    + " based on the root namespace " + namespace);
-+            try {
-+                validator = validatorByUrls(urls);
-+            } catch (IOException ioe) {
-+                // At this point the schema comes from memory.
-+                throw new RuntimeException(ioe);
-+            } catch (IncorrectSchemaException e) {
-+                // At this point the schema comes from memory.
-+                throw new RuntimeException(e);
-+            }
-+            if (bufferingRootNamespaceSniffer == null) {
-+                throw new RuntimeException(
-+                        "Bug! bufferingRootNamespaceSniffer was null.");
-+            }
-+            bufferingRootNamespaceSniffer.setContentHandler(validator.getContentHandler());
-+        }
-+
-+        if (!rootNamespaceSeen) {
-+            rootNamespaceSeen = true;
-+            if (contentType != null) {
-+                int i;
-+                if ((i = Arrays.binarySearch(KNOWN_CONTENT_TYPES, contentType)) > -1) {
-+                    if (!NAMESPACES_FOR_KNOWN_CONTENT_TYPES[i].equals(namespace)) {
-+                        String message = "".equals(namespace) ? "\u201C"
-+                                + contentType
-+                                + "\u201D is not an appropriate Content-Type for a document whose root element is not in a namespace."
-+                                : "\u201C"
-+                                + contentType
-+                                + "\u201D is not an appropriate Content-Type for a document whose root namespace is \u201C"
-+                                + namespace + "\u201D.";
-+                        SAXParseException spe = new SAXParseException(message,
-+                                locator);
-+                        errorHandler.warning(spe);
-+                    }
-+                }
-+            }
-+        }
-+    }
-+    
-+    @Override
-+    public void documentMode(DocumentMode mode, String publicIdentifier,
-+            String systemIdentifier, boolean html4SpecificAdditionalErrorChecks)
-+            throws SAXException {
-+        if (validator == null) {
-+            try {
-+                if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("XHTML 1.0 Transitional doctype seen. Appendix C is not supported. Proceeding anyway for your convenience. The parser is still an HTML parser, so namespace processing is not performed and \u201Cxml:*\u201D attributes are not supported. Using the schema for "
-+                            + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
-+                            : ""));
-+                    validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
-+                } else if ("-//W3C//DTD XHTML 1.0 Strict//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("XHTML 1.0 Strict doctype seen. Appendix C is not supported. Proceeding anyway for your convenience. The parser is still an HTML parser, so namespace processing is not performed and \u201Cxml:*\u201D attributes are not supported. Using the schema for "
-+                            + getPresetLabel(XHTML1STRICT_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
-+                            : ""));
-+                    validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
-+                } else if ("-//W3C//DTD HTML 4.01 Transitional//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("HTML 4.01 Transitional doctype seen. Using the schema for "
-+                            + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? ""
-+                            : " HTML4-specific tokenization errors are not enabled."));
-+                    validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
-+                } else if ("-//W3C//DTD HTML 4.01//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("HTML 4.01 Strict doctype seen. Using the schema for "
-+                            + getPresetLabel(XHTML1STRICT_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? ""
-+                            : " HTML4-specific tokenization errors are not enabled."));
-+                    validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
-+                } else if ("-//W3C//DTD HTML 4.0 Transitional//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("Legacy HTML 4.0 Transitional doctype seen.  Please consider using HTML 4.01 Transitional instead. Proceeding anyway for your convenience with the schema for "
-+                            + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? ""
-+                            : " HTML4-specific tokenization errors are not enabled."));
-+                    validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
-+                } else if ("-//W3C//DTD HTML 4.0//EN".equals(publicIdentifier)) {
-+                    errorHandler.info("Legacy HTML 4.0 Strict doctype seen. Please consider using HTML 4.01 instead. Proceeding anyway for your convenience with the schema for "
-+                            + getPresetLabel(XHTML1STRICT_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? ""
-+                            : " HTML4-specific tokenization errors are not enabled."));
-+                    validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
-+                } else {
-+                    errorHandler.info("Using the schema for "
-+                            + getPresetLabel(HTML5_SCHEMA)
-+                            + "."
-+                            + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
-+                            : ""));
-+                    validator = validatorByDoctype(HTML5_SCHEMA);
-+                }
-+            } catch (IOException ioe) {
-+                // At this point the schema comes from memory.
-+                throw new RuntimeException(ioe);
-+            } catch (IncorrectSchemaException e) {
-+                // At this point the schema comes from memory.
-+                throw new RuntimeException(e);
-+            }
-+            ContentHandler ch = validator.getContentHandler();
-+            ch.setDocumentLocator(htmlParser.getDocumentLocator());
-+            ch.startDocument();
-+            reader.setContentHandler(ch);
-+        } else {
-+            if (html4SpecificAdditionalErrorChecks) {
-+                errorHandler.info("HTML4-specific tokenization errors are enabled.");
-+            }
-+        }
-+    }
-+
-+    public Schema resolveSchema(String url, PropertyMap options)
-+            throws SAXException, IOException, IncorrectSchemaException {
-+        int i = Arrays.binarySearch(preloadedSchemaUrls, url);
-+        if (i > -1) {
-+            Schema rv = preloadedSchemas[i];
-+            if (options.contains(WrapProperty.ATTRIBUTE_OWNER)) {
-+                if(rv instanceof ValidationTransaction.ProxySchema && ((ValidationTransaction.ProxySchema)rv).getWrappedSchema() instanceof CheckerSchema) {
-+                    errorHandler.error(new SAXParseException(
-+                            "A non-schema checker cannot be used as an attribute schema.",
-+                            null, url, -1, -1));
-+                    throw new IncorrectSchemaException();
-+                } else {
-+                    // ugly fall through
-+                }
-+            } else {
-+                return rv;
-+            }
-+        }
-+
-+        //this code line should not normally be encountered since the necessary
-+        //schemas have been preloaded
-+        LOGGER.log(Level.INFO, "Going to create a non preloaded Schema for {0}", url); //NOI18N
-+        
-+        TypedInputSource schemaInput = (TypedInputSource) entityResolver.resolveEntity(
-+                null, url);
-+        SchemaReader sr = null;
-+        if ("application/relax-ng-compact-syntax".equals(schemaInput.getType())) {
-+            sr = CompactSchemaReader.getInstance();
-+        } else {
-+            sr = new AutoSchemaReader();
-+        }
-+        Schema sch = sr.createSchema(schemaInput, options);
-+        return sch;
-+    }
-+    
-+    /**
-+     * @param validator
-+     * @return
-+     * @throws SAXException
-+     * @throws IOException
-+     * @throws IncorrectSchemaException
-+     */
-+    protected Validator validatorByUrls(String schemaList) throws SAXException,
-+            IOException, IncorrectSchemaException {
-+        Validator v = null;
-+        String[] schemas = SPACE.split(schemaList);
-+        for (int i = schemas.length - 1; i > -1; i--) {
-+            String url = schemas[i];
-+            if ("http://c.validator.nu/all/".equals(url)
-+                    || "http://hsivonen.iki.fi/checkers/all/".equals(url)) {
-+                for (int j = 0; j < ALL_CHECKERS.length; j++) {
-+                    v = combineValidatorByUrl(v, ALL_CHECKERS[j]);
-+                }
-+            } else if ("http://c.validator.nu/all-html4/".equals(url)
-+                    || "http://hsivonen.iki.fi/checkers/all-html4/".equals(url)) {
-+                for (int j = 0; j < ALL_CHECKERS_HTML4.length; j++) {
-+                    v = combineValidatorByUrl(v, ALL_CHECKERS_HTML4[j]);
-+                }
-+            } else {
-+                v = combineValidatorByUrl(v, url);
-+            }
-+        }
-+        return v;
-+    }
-+    
-+    /**
-+     * @param val
-+     * @param url
-+     * @return
-+     * @throws SAXException
-+     * @throws IOException
-+     * @throws IncorrectSchemaException
-+     */
-+    private Validator combineValidatorByUrl(Validator val, String url)
-+            throws SAXException, IOException, IncorrectSchemaException {
-+        if (!"".equals(url)) {
-+            Validator v = validatorByUrl(url);
-+            if (val == null) {
-+                val = v;
-+            } else {
-+                val = new CombineValidator(v, val);
-+            }
-+        }
-+        return val;
-+    }
-+    
-+    /**
-+     * @param url
-+     * @return
-+     * @throws SAXException
-+     * @throws IOException
-+     * @throws IncorrectSchemaException
-+     */
-+    private Validator validatorByUrl(String url) throws SAXException,
-+            IOException, IncorrectSchemaException {
-+        Validator v = loadedValidatorUrls.get(url);
-+        if (v != null) {
-+            return v;
-+        }
-+
-+
-+        if ("http://s.validator.nu/html5/html5full-aria.rnc".equals(url)
-+                || "http://s.validator.nu/xhtml5-aria-rdf-svg-mathml.rnc".equals(url)
-+                || "http://s.validator.nu/html5/html5full.rnc".equals(url)
-+                || "http://s.validator.nu/html5/xhtml5full-xhtml.rnc".equals(url)
-+                || "http://s.validator.nu/html5-aria-svg-mathml.rnc".equals(url)) {
-+            errorHandler.setSpec(html5spec);
-+        }
-+        Schema sch = resolveSchema(url, jingPropertyMap);
-+        Validator validatorInstance = sch.createValidator(jingPropertyMap);
-+        if (validatorInstance.getContentHandler() instanceof XmlPiChecker) {
-+            lexicalHandler = (LexicalHandler) validatorInstance.getContentHandler();
-+        }
-+
-+        loadedValidatorUrls.put(url, v);
-+        return validatorInstance;
-+    }
-+    
-+    private String getPresetLabel(int schemaId) {
-+        for (int i = 0; i < presetDoctypes.length; i++) {
-+            if (presetDoctypes[i] == schemaId) {
-+                return presetLabels[i];
-+            }
-+        }
-+        return "unknown";
-+    }
-+    
-+    protected Validator validatorByDoctype(int schemaId) throws SAXException,
-+            IOException, IncorrectSchemaException {
-+        if (schemaId == 0) {
-+            return null;
-+        }
-+        for (int i = 0; i < presetDoctypes.length; i++) {
-+            if (presetDoctypes[i] == schemaId) {
-+                return validatorByUrls(presetUrls[i]);
-+            }
-+        }
-+        throw new RuntimeException("Doctype mappings not initialized properly.");
-+    }
-+    
-+    
-+    /**
-+     * @param url
-+     * @return
-+     * @throws SAXException
-+     * @throws IOException
-+     * @throws IncorrectSchemaException
-+     */
-+    private static Schema schemaByUrl(String url, EntityResolver resolver,
-+            PropertyMap pMap) throws SAXException, IOException,
-+            IncorrectSchemaException {
-+        LOGGER.fine(String.format("Will load schema: %s", url));
-+        long a = System.currentTimeMillis();
-+        TypedInputSource schemaInput;
-+        try {
-+            schemaInput = (TypedInputSource) resolver.resolveEntity(
-+                    null, url);
-+        } catch (ClassCastException e) {
-+            LOGGER.log(Level.SEVERE, url, e);
-+            throw e;
-+        }
-+
-+        SchemaReader sr = null;
-+        if ("application/relax-ng-compact-syntax".equals(schemaInput.getType())) {
-+            sr = CompactSchemaReader.getInstance();
-+            LOGGER.log(Level.FINE, "Used CompactSchemaReader");
-+        } else {
-+            sr = new AutoSchemaReader();
-+            LOGGER.log(Level.FINE, "Used AutoSchemaReader");
-+        }
-+        long c = System.currentTimeMillis();
-+
-+        Schema sch = sr.createSchema(schemaInput, pMap);
-+        LOGGER.log(Level.FINE, String.format("Schema created in %s ms.", (System.currentTimeMillis() - c)));
-+        return sch;
-+    }
-+    
-+    protected static Schema proxySchemaByUrl(String uri, EntityResolver resolver, PropertyMap pMap) {
-+        return new ProxySchema(uri, resolver, pMap);
-+    }
-+    
-+    /**
-+     * A Schema instance delegate, the delegated instance if softly reachable so it should 
-+     * not be GCed so often. If the delegate is GCed a new instance is recreated.
-+     */
-+    private static class ProxySchema implements Schema {
-+    
-+        private String uri;
-+        private EntityResolver resolver;
-+        private PropertyMap pMap;
-+        
-+        private SoftReference<Schema> delegateWeakRef;
-+        
-+        private ProxySchema(String uri, EntityResolver resolver, PropertyMap pMap) {
-+            this.uri = uri;
-+            this.resolver = resolver;
-+            this.pMap = pMap;
-+        }
-+
-+        //exposing just because of some instanceof test used in the code
-+        private Schema getWrappedSchema() throws SAXException, IOException, IncorrectSchemaException {
-+            return getSchemaDelegate();
-+        }
-+        
-+        public Validator createValidator(PropertyMap pm) {
-+            try {
-+                return getSchemaDelegate().createValidator(pm);
-+            } catch (Exception ex) { //SAXException, IOException, IncorrectSchemaException
-+                LOGGER.log(Level.INFO, "Cannot create schema delegate", ex); //NOI18N
-+            }
-+            return null;
-+        }
-+
-+        public PropertyMap getProperties() {
-+            try {
-+                return getSchemaDelegate().getProperties();
-+            } catch (Exception ex) { //SAXException, IOException, IncorrectSchemaException
-+                LOGGER.log(Level.INFO, "Cannot create schema delegate", ex); //NOI18N
-+            }
-+            return null;
-+        }
-+        
-+        private synchronized Schema getSchemaDelegate() throws SAXException, IOException, IncorrectSchemaException {
-+            Schema delegate = delegateWeakRef != null ? delegateWeakRef.get() : null;
-+            if(delegate == null) {
-+                long a = System.currentTimeMillis();
-+                delegate = schemaByUrl(uri, resolver, pMap);
-+                long b = System.currentTimeMillis();
-+                delegateWeakRef = new SoftReference<Schema>(delegate);
-+                LOGGER.log(Level.FINE, "Created new Schema instance for {0} in {1}ms.", new Object[]{uri, (b-a)});
-+            } else {
-+                LOGGER.log(Level.FINE, "Using cached Schema instance for {0}", uri);
-+            }
-+            return delegate;
-+        }
-+        
-+        
-+    }
-+    
-+}
-diff --git a/src/nu/validator/servlet/BufferingRootNamespaceSniffer.java b/src/nu/validator/servlet/BufferingRootNamespaceSniffer.java
-deleted file mode 100644
-index f339667..0000000
---- a/src/nu/validator/servlet/BufferingRootNamespaceSniffer.java
-+++ /dev/null
-@@ -1,173 +0,0 @@
--/*
-- * Copyright (c) 2006 Henri Sivonen
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.util.Iterator;
--import java.util.LinkedList;
--import java.util.List;
--
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--
--public class BufferingRootNamespaceSniffer implements ContentHandler {
--
--    private ContentHandler ch = null;
--
--    private Locator locator = null;
--    
--    private List<String[]> namespaces = new LinkedList<String[]>();
--    
--    private VerifierServletTransaction vst;
--    
--    public BufferingRootNamespaceSniffer(VerifierServletTransaction vst) {
--        super();
--        this.vst = vst;
--    }
--
--    public void setContentHandler(ContentHandler contentHandler) throws SAXException {
--        this.ch = contentHandler;
--        if (locator != null) {
--            ch.setDocumentLocator(locator);
--        }
--        ch.startDocument();
--        for (Iterator<String[]> iter = namespaces.iterator(); iter.hasNext();) {
--            String[] element = iter.next();
--            ch.startPrefixMapping(element[0], element[1]);
--        }
--    }
--    
--    /**
--     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
--     */
--    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
--        if (ch != null) {
--            ch.characters(arg0, arg1, arg2);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endDocument()
--     */
--    public void endDocument() throws SAXException {
--        if (ch != null) {
--            ch.endDocument();
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
--     *      java.lang.String, java.lang.String)
--     */
--    public void endElement(String arg0, String arg1, String arg2)
--            throws SAXException {
--        if (ch != null) {
--            ch.endElement(arg0, arg1, arg2);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
--     */
--    public void endPrefixMapping(String arg0) throws SAXException {
--        if (ch != null) {
--            ch.endPrefixMapping(arg0);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
--     */
--    public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
--            throws SAXException {
--        if (ch != null) {
--            ch.ignorableWhitespace(arg0, arg1, arg2);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String,
--     *      java.lang.String)
--     */
--    public void processingInstruction(String arg0, String arg1)
--            throws SAXException {
--        if (ch != null) {
--            ch.processingInstruction(arg0, arg1);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
--     */
--    public void setDocumentLocator(Locator arg0) {
--        locator = arg0;
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
--     */
--    public void skippedEntity(String arg0) throws SAXException {
--        if (ch != null) {
--            ch.skippedEntity(arg0);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startDocument()
--     */
--    public void startDocument() throws SAXException {
--
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
--     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
--     */
--    public void startElement(String arg0, String arg1, String arg2,
--            Attributes arg3) throws SAXException {
--        if (ch != null) {
--            ch.startElement(arg0, arg1, arg2, arg3);
--        } else {
--            vst.rootNamespace(arg0, locator);
--            ch.startElement(arg0, arg1, arg2, arg3);
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
--     *      java.lang.String)
--     */
--    public void startPrefixMapping(String arg0, String arg1)
--            throws SAXException {
--        if (ch != null) {
--            ch.startPrefixMapping(arg0, arg1);
--        } else {
--            String[] arr = new String[2];
--            arr[0] = arg0;
--            arr[1] = arg1;
--            namespaces.add(arr);
--        }
--    }
--
--}
-diff --git a/src/nu/validator/servlet/CharsetEmitter.java b/src/nu/validator/servlet/CharsetEmitter.java
-deleted file mode 100644
-index 6b795b8..0000000
---- a/src/nu/validator/servlet/CharsetEmitter.java
-+++ /dev/null
-@@ -1,38 +0,0 @@
--/* This code was generated by nu.validator.tools.SaxCompiler. Please regenerate instead of editing. */
--package nu.validator.servlet;
--public final class CharsetEmitter {
--private CharsetEmitter() {}
--public static void emit(org.xml.sax.ContentHandler contentHandler, nu.validator.servlet.VerifierServletTransaction t) throws org.xml.sax.SAXException {
--org.xml.sax.helpers.AttributesImpl __attrs__ = new org.xml.sax.helpers.AttributesImpl();
--contentHandler.startPrefixMapping("", "http://www.w3.org/1999/xhtml");
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "Override for transfer protocol character encoding declaration.");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "for", "for", "CDATA", "charset");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "label", "label", __attrs__);
--contentHandler.characters(__chars__, 0, 8);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "label", "label");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "id", "id", "CDATA", "charset");
--__attrs__.addAttribute("", "name", "name", "CDATA", "charset");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "select", "select", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "value", "value", "CDATA", "");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "option", "option", __attrs__);
--contentHandler.characters(__chars__, 8, 25);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "option", "option");
--t.emitCharsetOptions(); 
--		
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "select", "select");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--contentHandler.endPrefixMapping("");
--}
--private static final char[] __chars__ = { 'E', 'n', 'c', 'o', 'd', 'i', 'n', 'g', 'A', 's', ' ', 's', 'e', 't', ' ', 'b', 'y', ' ', 't', 'h', 'e', ' ', 's', 'e', 'r', 'v', 'e', 'r', '/', 'p', 'a', 'g', 'e' };
--}
-diff --git a/src/nu/validator/servlet/CssDetector.java b/src/nu/validator/servlet/CssDetector.java
-deleted file mode 100644
-index e9308d7..0000000
---- a/src/nu/validator/servlet/CssDetector.java
-+++ /dev/null
-@@ -1,160 +0,0 @@
--/*
-- * Copyright (c) 2008 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.util.regex.Matcher;
--import java.util.regex.Pattern;
--
--import nu.validator.checker.AttributeUtil;
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.DTDHandler;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--
--import com.thaiopensource.validate.Validator;
--
--public class CssDetector implements Validator, ContentHandler {
--
--    public static boolean lowerCaseLiteralEqualsIgnoreAsciiCase(String lowerCaseLiteral,
--            String string) {
--        if (string == null) {
--            return false;
--        }
--        if (lowerCaseLiteral.length() != string.length()) {
--            return false;
--        }
--        for (int i = 0; i < lowerCaseLiteral.length(); i++) {
--            char c0 = lowerCaseLiteral.charAt(i);
--            char c1 = string.charAt(i);
--            if (c1 >= 'A' && c1 <= 'Z') {
--                c1 += 0x20;
--            }
--            if (c0 != c1) {
--                return false;
--            }
--        }
--        return true;
--    }
--    
--    private static final Pattern TEXT_CSS = Pattern.compile("^[tT][eE][xX][tT]/[cC][sS][sS]\\s*(?:;.*)?$");
--    
--    private boolean sawCss = false;
--    
--    public ContentHandler getContentHandler() {
--        return this;
--    }
--
--    public DTDHandler getDTDHandler() {
--        return null;
--    }
--
--    public void reset() {
--        sawCss = false;
--    }
--
--    public void characters(char[] ch, int start, int length)
--            throws SAXException {
--        
--    }
--
--    public void endDocument() throws SAXException {
--        
--    }
--
--    public void endElement(String uri, String localName, String name)
--            throws SAXException {
--        
--    }
--
--    public void endPrefixMapping(String prefix) throws SAXException {
--        // TODO Auto-generated method stub
--        
--    }
--
--    public void ignorableWhitespace(char[] ch, int start, int length)
--            throws SAXException {
--        
--    }
--
--    public void processingInstruction(String target, String data)
--            throws SAXException {
--        
--    }
--
--    public void setDocumentLocator(Locator locator) {
--        
--    }
--
--    public void skippedEntity(String name) throws SAXException {
--        
--    }
--
--    public void startDocument() throws SAXException {
--        reset();
--    }
--
--    public void startElement(String uri, String localName, String name,
--            Attributes atts) throws SAXException {
--        if ("http://www.w3.org/1999/xhtml" == uri) {
--            if ("style" == localName) {
--                checkType(atts);
--                return;
--            } else if ("link" == localName) {
--                String rel = atts.getValue("", "rel");
--                if (rel != null) {
--                    String[] tokens = AttributeUtil.split(rel);
--                    for (int i = 0; i < tokens.length; i++) {
--                        String token = tokens[i];
--                        if (lowerCaseLiteralEqualsIgnoreAsciiCase("stylesheet", token)) {
--                            checkType(atts);
--                            return;
--                        }
--                    }
--                }
--            } else {
--                if (atts.getIndex("", "style") > -1) {
--                    sawCss = true;
--                }
--            }
--        }
--    }
--
--    private void checkType(Attributes atts) {
--        String type = atts.getValue("", "type");
--        if (type == null) {
--            sawCss = true;
--        } else {
--            Matcher m = TEXT_CSS.matcher(type);
--            if (m.matches()) {
--                sawCss = true;                
--            }
--        }
--    }
--
--    public void startPrefixMapping(String prefix, String uri)
--            throws SAXException {
--        
--    }
--
--}
-diff --git a/src/nu/validator/servlet/DelegatingServletInputStream.java b/src/nu/validator/servlet/DelegatingServletInputStream.java
-deleted file mode 100644
-index db669fa..0000000
---- a/src/nu/validator/servlet/DelegatingServletInputStream.java
-+++ /dev/null
-@@ -1,166 +0,0 @@
--/*
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.io.InputStream;
--
--import javax.servlet.ReadListener;
--import javax.servlet.ServletInputStream;
--
--public final class DelegatingServletInputStream extends ServletInputStream {
--
--    private final InputStream delegate;
--
--    public DelegatingServletInputStream(InputStream delegate) {
--        this.delegate = delegate;
--    }
--
--    /**
--     * @return
--     * @throws IOException
--     * @see java.io.InputStream#available()
--     */
--    public int available() throws IOException {
--        return delegate.available();
--    }
--
--    /**
--     * @throws IOException
--     * @see java.io.InputStream#close()
--     */
--    public void close() throws IOException {
--        delegate.close();
--    }
--
--    /**
--     * @param obj
--     * @return
--     * @see java.lang.Object#equals(java.lang.Object)
--     */
--    public boolean equals(Object obj) {
--        return delegate.equals(obj);
--    }
--
--    /**
--     * @return
--     * @see java.lang.Object#hashCode()
--     */
--    public int hashCode() {
--        return delegate.hashCode();
--    }
--
--    /**
--     * @param readlimit
--     * @see java.io.InputStream#mark(int)
--     */
--    public void mark(int readlimit) {
--        delegate.mark(readlimit);
--    }
--
--    /**
--     * @return
--     * @see java.io.InputStream#markSupported()
--     */
--    public boolean markSupported() {
--        return delegate.markSupported();
--    }
--
--    /**
--     * @return
--     * @throws IOException
--     * @see java.io.InputStream#read()
--     */
--    public int read() throws IOException {
--        return delegate.read();
--    }
--
--    /**
--     * @param b
--     * @param off
--     * @param len
--     * @return
--     * @throws IOException
--     * @see java.io.InputStream#read(byte[], int, int)
--     */
--    public int read(byte[] b, int off, int len) throws IOException {
--        return delegate.read(b, off, len);
--    }
--
--    /**
--     * @param b
--     * @return
--     * @throws IOException
--     * @see java.io.InputStream#read(byte[])
--     */
--    public int read(byte[] b) throws IOException {
--        return delegate.read(b);
--    }
--
--    /**
--     * @throws IOException
--     * @see java.io.InputStream#reset()
--     */
--    public void reset() throws IOException {
--        delegate.reset();
--    }
--
--    /**
--     * @param n
--     * @return
--     * @throws IOException
--     * @see java.io.InputStream#skip(long)
--     */
--    public long skip(long n) throws IOException {
--        return delegate.skip(n);
--    }
--
--    /**
--     * @return
--     * @see java.lang.Object#toString()
--     */
--    public String toString() {
--        return delegate.toString();
--    }
--
--    /**
--     * @return
--     */
--    @Override public boolean isFinished() {
--        return false;
--    }
--
--    /**
--     * @return
--     */
--    @Override public boolean isReady() {
--        return false;
--    }
--
--    /**
--     * @param arg0
--     */
--    @Override public void setReadListener(ReadListener arg0) {
--    }
--
--}
-diff --git a/src/nu/validator/servlet/Html5ConformanceCheckerTransaction.java b/src/nu/validator/servlet/Html5ConformanceCheckerTransaction.java
-deleted file mode 100644
-index f9837f8..0000000
---- a/src/nu/validator/servlet/Html5ConformanceCheckerTransaction.java
-+++ /dev/null
-@@ -1,194 +0,0 @@
--/*
-- * Copyright (c) 2005, 2006 Henri Sivonen
-- * Copyright (c) 2007-2010 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--
--import javax.servlet.ServletException;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletResponse;
--
--import nu.validator.htmlparser.common.DoctypeExpectation;
--
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXNotRecognizedException;
--import org.xml.sax.SAXNotSupportedException;
--import org.xml.sax.SAXParseException;
--
--import com.thaiopensource.validate.IncorrectSchemaException;
--
--
--public class Html5ConformanceCheckerTransaction extends
--        VerifierServletTransaction {
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#isSimple()
--     */
--    @Override
--    protected boolean isSimple() {
--        return true;
--    }
--    
--    private final static String GENERIC_FACET = (VerifierServlet.GENERIC_HOST.isEmpty() ? "" : ("//" + VerifierServlet.GENERIC_HOST)) + VerifierServlet.GENERIC_PATH;
--
--    private static final char[] GENERIC_UI = "More options".toCharArray();    
--    
--    private static final char[] SERVICE_TITLE = (System.getProperty(
--            "nu.validator.servlet.service-name", "Validator.nu") + " (X)HTML5 Validator ").toCharArray();
--
--    private static final char[] TECHNOLOGY_PREVIEW = "(Living Validator)".toCharArray();
--
--    private static final char[] RESULTS_TITLE = "(X)HTML5 validation results".toCharArray();
--
--    private static final char[] FOR = " for ".toCharArray();
--    
--    private static final String SUCCESS_HTML = "The document is valid HTML5 + ARIA + SVG 1.1 + MathML 2.0 (subject to the utter previewness of this service).";
--
--    private static final String SUCCESS_XHTML = "The document is valid XHTML5 + ARIA + SVG 1.1 + MathML 2.0 (subject to the utter previewness of this service).";
--
--    private static final String FAILURE_HTML = "There were errors. (Tried in the text/html mode.)";
--
--    private static final String FAILURE_XHTML = "There were errors. (Tried in the XHTML mode.)";
--
--    private boolean usingHtml = false;
--    
--    public Html5ConformanceCheckerTransaction(HttpServletRequest request,
--            HttpServletResponse response) {
--        super(request, response);
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#successMessage()
--     */
--    protected String successMessage() throws SAXException {
--        if (usingHtml) {
--            return SUCCESS_HTML;
--        } else {
--            return SUCCESS_XHTML;
--        }
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#loadDocAndSetupParser()
--     */
--    protected void loadDocAndSetupParser() throws SAXException, IOException, IncorrectSchemaException, SAXNotRecognizedException, SAXNotSupportedException {
--        setAllowGenericXml(false);
--        setAcceptAllKnownXmlTypes(false);
--        setAllowHtml(true);
--        setAllowXhtml(true);
--        loadDocumentInput();
--        String type = documentInput.getType();
--        if ("text/html".equals(type) || "text/html-sandboxed".equals(type)) {
--            validator = validatorByDoctype(HTML5_SCHEMA);
--            usingHtml = true;
--            newHtmlParser();
--            htmlParser.setDoctypeExpectation(DoctypeExpectation.HTML);
--            htmlParser.setDocumentModeHandler(this);
--            htmlParser.setContentHandler(validator.getContentHandler());
--            reader = htmlParser;
--        } else {
--            validator = validatorByDoctype(XHTML5_SCHEMA);
--            setupXmlParser();
--            if (!("application/xhtml+xml".equals(type) || "application/xml".equals(type))) {
--                String message = "The preferred Content-Type for XHTML5 is application/xhtml+xml. The Content-Type was " + type + ".";
--                SAXParseException spe = new SAXParseException(message, null, documentInput.getSystemId(), -1, -1);
--                errorHandler.warning(spe);
--            }
--        }
--
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#setup()
--     */
--    protected void setup() throws ServletException {
--        // No-op
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#emitTitle()
--     */
--    void emitTitle(boolean markupAllowed) throws SAXException {
--        if (willValidate()) {
--            emitter.characters(RESULTS_TITLE);
--            if (document != null && document.length() > 0) {
--                emitter.characters(FOR);                
--                emitter.characters(scrub(shortenDataUri(document)));                
--            }
--        } else {
--            emitter.characters(SERVICE_TITLE);
--            if (markupAllowed && System.getProperty("nu.validator.servlet.service-name", "Validator.nu").equals("Validator.nu")) {
--                emitter.startElement("span");
--                emitter.characters(TECHNOLOGY_PREVIEW);
--                emitter.endElement("span");
--            }
--        }
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#tryToSetupValidator()
--     */
--    protected void tryToSetupValidator() throws SAXException, IOException, IncorrectSchemaException {
--        // No-op
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#failureMessage()
--     */
--    protected String failureMessage() throws SAXException {
--        if (usingHtml) {
--            return FAILURE_HTML;
--        } else {
--            return FAILURE_XHTML;
--        }
--    }
--
--    /**
--     * @see nu.validator.servlet.VerifierServletTransaction#emitFormContent()
--     */
--    protected void emitFormContent() throws SAXException {
--        Html5FormEmitter.emit(contentHandler, this);
--    }
--
--    void maybeEmitNsfilterField() throws SAXException {
--        if (request.getParameter("nsfilter") != null) {
--            NsFilterEmitter.emit(contentHandler, this);
--        }
--    }
--
--    void maybeEmitCharsetField() throws SAXException {
--        if (request.getParameter("charset") != null) {
--            CharsetEmitter.emit(contentHandler, this);
--        }
--    }
--    
--    void emitOtherFacetLink() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("href", GENERIC_FACET);
--        emitter.startElement("a", attrs);
--        emitter.characters(GENERIC_UI);
--        emitter.endElement("a");   
--    }
--
--}
-diff --git a/src/nu/validator/servlet/Html5FormEmitter.java b/src/nu/validator/servlet/Html5FormEmitter.java
-deleted file mode 100644
-index a2901ba..0000000
---- a/src/nu/validator/servlet/Html5FormEmitter.java
-+++ /dev/null
-@@ -1,90 +0,0 @@
--/* This code was generated by nu.validator.tools.SaxCompiler. Please regenerate instead of editing. */
--package nu.validator.servlet;
--public final class Html5FormEmitter {
--private Html5FormEmitter() {}
--public static void emit(org.xml.sax.ContentHandler contentHandler, nu.validator.servlet.VerifierServletTransaction t) throws org.xml.sax.SAXException {
--org.xml.sax.helpers.AttributesImpl __attrs__ = new org.xml.sax.helpers.AttributesImpl();
--contentHandler.startPrefixMapping("", "http://www.w3.org/1999/xhtml");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "fieldset", "fieldset", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "legend", "legend", __attrs__);
--contentHandler.characters(__chars__, 0, 15);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "legend", "legend");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "table", "table", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tbody", "tbody", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "The document to validate.");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "for", "for", "CDATA", "doc");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "label", "label", __attrs__);
--contentHandler.characters(__chars__, 15, 8);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "label", "label");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--t.emitDocField(); 
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--t.maybeEmitCharsetField(); t.maybeEmitNsfilterField(); 
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "Display a report about the textual alternatives for images.");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "for", "for", "CDATA", "showimagereport");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "label", "label", __attrs__);
--t.emitShowImageReportField(); 
--						
--contentHandler.characters(__chars__, 23, 18);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "label", "label");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "Display the markup source of the input document.");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "for", "for", "CDATA", "showsource");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "label", "label", __attrs__);
--t.emitShowSourceField(); 
--						
--contentHandler.characters(__chars__, 41, 12);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "label", "label");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "value", "value", "CDATA", "Validate");
--__attrs__.addAttribute("", "type", "type", "CDATA", "submit");
--__attrs__.addAttribute("", "id", "id", "CDATA", "submit");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "input", "input", __attrs__);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "input", "input");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tbody", "tbody");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "table", "table");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "fieldset", "fieldset");
--contentHandler.endPrefixMapping("");
--}
--private static final char[] __chars__ = { 'V', 'a', 'l', 'i', 'd', 'a', 't', 'o', 'r', ' ', 'I', 'n', 'p', 'u', 't', 'D', 'o', 'c', 'u', 'm', 'e', 'n', 't', ' ', 'S', 'h', 'o', 'w', ' ', 'I', 'm', 'a', 'g', 'e', ' ', 'R', 'e', 'p', 'o', 'r', 't', ' ', 'S', 'h', 'o', 'w', ' ', 'S', 'o', 'u', 'r', 'c', 'e' };
--}
-diff --git a/src/nu/validator/servlet/InboundGzipFilter.java b/src/nu/validator/servlet/InboundGzipFilter.java
-deleted file mode 100644
-index e5c13a9..0000000
---- a/src/nu/validator/servlet/InboundGzipFilter.java
-+++ /dev/null
-@@ -1,180 +0,0 @@
--/*
-- * Copyright (c) 2007-2008 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.util.ArrayList;
--import java.util.Collections;
--import java.util.Enumeration;
--import java.util.List;
--import java.util.zip.GZIPInputStream;
--
--import javax.servlet.Filter;
--import javax.servlet.FilterChain;
--import javax.servlet.FilterConfig;
--import javax.servlet.ServletException;
--import javax.servlet.ServletInputStream;
--import javax.servlet.ServletRequest;
--import javax.servlet.ServletResponse;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletRequestWrapper;
--import javax.servlet.http.HttpServletResponse;
--
--public final class InboundGzipFilter implements Filter {
--
--    public void destroy() {
--    }
--
--    public void doFilter(ServletRequest req, ServletResponse res,
--            FilterChain chain) throws IOException, ServletException {
--        HttpServletRequest request = (HttpServletRequest) req;
--        HttpServletResponse response = (HttpServletResponse) res;
--        response.setHeader("Accept-Encoding", "gzip");
--        String ce = request.getHeader("Content-Encoding");
--        if (ce != null && "gzip".equalsIgnoreCase(ce.trim())) {
--            chain.doFilter(new RequestWrapper(request), res);
--        } else {
--            chain.doFilter(req, res);
--        }
--    }
--
--    public void init(FilterConfig config) throws ServletException {
--    }
--
--    private final class RequestWrapper extends HttpServletRequestWrapper {
--
--        private ServletInputStream stream = null;
--
--        public RequestWrapper(HttpServletRequest req) throws IOException {
--            super(req);
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getDateHeader(java.lang.String)
--         */
--        @Override
--        public long getDateHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return -1;
--            } else {
--                return super.getDateHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeader(java.lang.String)
--         */
--        @Override
--        public String getHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return null;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return null;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return null;
--            } else {
--                return super.getHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeaderNames()
--         */
--        @Override
--        public Enumeration getHeaderNames() {
--            Enumeration e = super.getHeaderNames();
--            List<String> list = new ArrayList<String>();
--            while (e.hasMoreElements()) {
--                String name = (String) e.nextElement();
--                if ("Content-Length".equalsIgnoreCase(name)) {
--                    continue;
--                } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                    continue;
--                } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                    continue;
--                } else {
--                    list.add(name);
--                }
--            }
--            return Collections.enumeration(list);
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeaders(java.lang.String)
--         */
--        @SuppressWarnings("unchecked")
--        @Override
--        public Enumeration getHeaders(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else {
--                return super.getHeaders(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getIntHeader(java.lang.String)
--         */
--        @Override
--        public int getIntHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return -1;
--            } else {
--                return super.getIntHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getContentLength()
--         */
--        @Override
--        public int getContentLength() {
--            return -1;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getInputStream()
--         */
--        @Override
--        public ServletInputStream getInputStream() throws IOException {
--            if (stream == null) {
--                stream = new DelegatingServletInputStream(new GZIPInputStream(super.getInputStream()));
--            }
--            return stream;
--        }
--
--    }
--
--}
-diff --git a/src/nu/validator/servlet/InboundSizeLimitFilter.java b/src/nu/validator/servlet/InboundSizeLimitFilter.java
-deleted file mode 100644
-index dc8b6ee..0000000
---- a/src/nu/validator/servlet/InboundSizeLimitFilter.java
-+++ /dev/null
-@@ -1,91 +0,0 @@
--/*
-- * Copyright (c) 2007-2008 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--
--import javax.servlet.Filter;
--import javax.servlet.FilterChain;
--import javax.servlet.FilterConfig;
--import javax.servlet.ServletException;
--import javax.servlet.ServletInputStream;
--import javax.servlet.ServletRequest;
--import javax.servlet.ServletResponse;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletRequestWrapper;
--
--import nu.validator.io.BoundedInputStream;
--import nu.validator.io.StreamBoundException;
--
--public final class InboundSizeLimitFilter implements Filter {
--
--    private long sizeLimit;
--    
--    /**
--     * @param sizeLimit
--     */
--    public InboundSizeLimitFilter(final long sizeLimit) {
--        this.sizeLimit = sizeLimit;
--    }
--    
--    public InboundSizeLimitFilter() {
--        this(Long.MAX_VALUE);
--    }
--    
--    public void destroy() {
--    }
--
--    public void doFilter(ServletRequest req, ServletResponse res,
--            FilterChain chain) throws IOException, ServletException {
--        HttpServletRequest request = (HttpServletRequest) req;
--        chain.doFilter(new RequestWrapper(request), res);
--    }
--
--    public void init(FilterConfig config) throws ServletException {
--        // XXX add configurability
--    }
--
--    private final class RequestWrapper extends HttpServletRequestWrapper {
--
--        private ServletInputStream stream = null;
--
--        public RequestWrapper(HttpServletRequest req) throws IOException {
--            super(req);
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getInputStream()
--         */
--        @Override
--        public ServletInputStream getInputStream() throws IOException {
--            if (stream == null) {
--                if (super.getContentLength() > sizeLimit) {
--                    throw new StreamBoundException("Resource size exceeds limit.");
--                }
--                stream = new DelegatingServletInputStream(new BoundedInputStream(super.getInputStream(), sizeLimit, super.getHeader("Content-Location")));
--            }
--            return stream;
--        }
--    }
--
--}
-diff --git a/src/nu/validator/servlet/ListErrorHandler.java b/src/nu/validator/servlet/ListErrorHandler.java
-deleted file mode 100644
-index 90bb994..0000000
---- a/src/nu/validator/servlet/ListErrorHandler.java
-+++ /dev/null
-@@ -1,66 +0,0 @@
--/*
-- * Copyright (c) 2007 Henri Sivonen
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.util.LinkedList;
--
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXParseException;
--
--public class ListErrorHandler implements ErrorHandler {
--
--    private boolean fatal = false;
--    
--    private LinkedList<String> errors = new LinkedList<String>();
--    
--    public void error(SAXParseException spe) throws SAXException {
--        errors.add(Integer.toString(spe.getColumnNumber()) + ": " + spe.getMessage());
--    }
--
--    public void fatalError(SAXParseException arg0) throws SAXException {
--        fatal = true;
--    }
--
--    public void warning(SAXParseException arg0) throws SAXException {
--    }
--
--    /**
--     * Returns the errors.
--     * 
--     * @return the errors
--     */
--    public LinkedList<String> getErrors() {
--        return errors;
--    }
--
--    /**
--     * Returns the fatal.
--     * 
--     * @return the fatal
--     */
--    public boolean isFatal() {
--        return fatal;
--    }
--
--}
-diff --git a/src/nu/validator/servlet/Main.java b/src/nu/validator/servlet/Main.java
-deleted file mode 100644
-index 631e57b..0000000
---- a/src/nu/validator/servlet/Main.java
-+++ /dev/null
-@@ -1,121 +0,0 @@
--/*
-- * Copyright (c) 2005 Henri Sivonen
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.InputStream;
--import java.io.OutputStream;
--import java.net.ConnectException;
--import java.net.InetAddress;
--import java.net.ServerSocket;
--import java.net.Socket;
--import java.util.EnumSet;
--
--import javax.servlet.DispatcherType;
--
--import org.apache.log4j.PropertyConfigurator;
--import org.eclipse.jetty.server.Connector;
--import org.eclipse.jetty.server.HttpConfiguration;
--import org.eclipse.jetty.server.HttpConnectionFactory;
--import org.eclipse.jetty.server.Server;
--import org.eclipse.jetty.server.ServerConnector;
--import org.eclipse.jetty.servlet.ServletContextHandler;
--import org.eclipse.jetty.servlet.FilterHolder;
--import org.eclipse.jetty.servlet.ServletHolder;
--import org.eclipse.jetty.servlets.GzipFilter;
--import org.eclipse.jetty.util.thread.QueuedThreadPool;
--
--/**
-- * @version $Id$
-- * @author hsivonen
-- */
--public class Main {
--
--    private static final long SIZE_LIMIT = Integer.parseInt(System.getProperty(
--            "nu.validator.servlet.max-file-size", "2097152"));
--
--    public static void main(String[] args) throws Exception {
--        if (!"1".equals(System.getProperty("nu.validator.servlet.read-local-log4j-properties"))) {
--            PropertyConfigurator.configure(Main.class.getClassLoader().getResource(
--                    "nu/validator/localentities/files/log4j.properties"));
--        } else {
--            PropertyConfigurator.configure(System.getProperty(
--                    "nu.validator.servlet.log4j-properties", "log4j.properties"));
--        }
--
--        ServletContextHandler contextHandler = new ServletContextHandler();
--        contextHandler.setContextPath("/");
--        contextHandler.addFilter(new FilterHolder(new GzipFilter()), "/*",
--                EnumSet.of(DispatcherType.REQUEST));
--        contextHandler.addFilter(new FilterHolder(new InboundSizeLimitFilter(
--                SIZE_LIMIT)), "/*", EnumSet.of(DispatcherType.REQUEST));
--        contextHandler.addFilter(new FilterHolder(new InboundGzipFilter()),
--                "/*", EnumSet.of(DispatcherType.REQUEST));
--        contextHandler.addFilter(
--                new FilterHolder(new MultipartFormDataFilter()), "/*",
--                EnumSet.of(DispatcherType.REQUEST));
--        contextHandler.addServlet(new ServletHolder(new VerifierServlet()),
--                "/*");
--
--        Server server = new Server(new QueuedThreadPool(100));
--        server.setHandler(contextHandler);
--
--        ServerConnector serverConnector = new ServerConnector(server,
--                new HttpConnectionFactory(new HttpConfiguration()));
--        int port = args.length > 0 ? Integer.parseInt(args[0]) : 8888;
--        serverConnector.setPort(port);
--        server.setConnectors(new Connector[] { serverConnector });
--
--        int stopPort = -1;
--        if (args.length > 1) {
--            stopPort = Integer.parseInt(args[1]);
--        }
--        if (stopPort != -1) {
--            try {
--                Socket clientSocket = new Socket(
--                        InetAddress.getByName("127.0.0.1"), stopPort);
--                InputStream in = clientSocket.getInputStream();
--                in.read();
--                in.close();
--                clientSocket.close();
--            } catch (ConnectException e) {
--
--            }
--
--            server.start();
--
--            ServerSocket serverSocket = new ServerSocket(stopPort, 0,
--                    InetAddress.getByName("127.0.0.1"));
--            Socket s = serverSocket.accept();
--
--            server.stop();
--
--            OutputStream out = s.getOutputStream();
--            out.close();
--            s.close();
--            serverSocket.close();
--        } else {
--            server.start();
--        }
--    }
--}
-diff --git a/src/nu/validator/servlet/MultipartFormDataFilter.java b/src/nu/validator/servlet/MultipartFormDataFilter.java
-deleted file mode 100644
-index 4c976ab..0000000
---- a/src/nu/validator/servlet/MultipartFormDataFilter.java
-+++ /dev/null
-@@ -1,400 +0,0 @@
--/*
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.BufferedReader;
--import java.io.ByteArrayInputStream;
--import java.io.IOException;
--import java.io.InputStream;
--import java.io.InputStreamReader;
--import java.io.Reader;
--import java.nio.charset.CharacterCodingException;
--import java.nio.charset.Charset;
--import java.nio.charset.CharsetDecoder;
--import java.nio.charset.CodingErrorAction;
--import java.util.ArrayList;
--import java.util.Collections;
--import java.util.Enumeration;
--import java.util.HashMap;
--import java.util.List;
--import java.util.Map;
--import java.util.regex.Matcher;
--import java.util.regex.Pattern;
--
--import javax.servlet.Filter;
--import javax.servlet.FilterChain;
--import javax.servlet.FilterConfig;
--import javax.servlet.ServletException;
--import javax.servlet.ServletInputStream;
--import javax.servlet.ServletRequest;
--import javax.servlet.ServletResponse;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletRequestWrapper;
--import javax.servlet.http.HttpServletResponse;
--
--import org.apache.commons.fileupload.FileItemIterator;
--import org.apache.commons.fileupload.FileItemStream;
--import org.apache.commons.fileupload.FileUploadException;
--import org.apache.commons.fileupload.servlet.ServletFileUpload;
--
--public final class MultipartFormDataFilter implements Filter {
--
--    private static Pattern EXTENSION = Pattern.compile("^.*\\.(.+)$");
--
--    private final static Map<String, String> EXTENSION_TO_TYPE = new HashMap<String, String>();
--
--    static {
--        EXTENSION_TO_TYPE.put("html", "text/html");
--        EXTENSION_TO_TYPE.put("htm", "text/html");
--        EXTENSION_TO_TYPE.put("xhtml", "application/xhtml+xml");
--        EXTENSION_TO_TYPE.put("xht", "application/xhtml+xml");
--        EXTENSION_TO_TYPE.put("atom", "application/atom+xml");
--        EXTENSION_TO_TYPE.put("rng", "application/xml");
--        EXTENSION_TO_TYPE.put("xsl", "application/xml");
--        EXTENSION_TO_TYPE.put("xml", "application/xml");
--        EXTENSION_TO_TYPE.put("dbk", "application/xml");
--        EXTENSION_TO_TYPE.put("csl", "application/xml");
--    }
--
--    private static String utf8ByteStreamToString(InputStream stream)
--            throws IOException {
--        CharsetDecoder dec = Charset.forName("UTF-8").newDecoder();
--        dec.onMalformedInput(CodingErrorAction.REPORT);
--        dec.onUnmappableCharacter(CodingErrorAction.REPORT);
--        Reader reader = new InputStreamReader(stream, dec);
--        StringBuilder builder = new StringBuilder();
--        int c;
--        int i = 0;
--        while ((c = reader.read()) != -1) {
--            if (i > 2048) {
--                throw new IOException("Form field value too large.");
--            }
--            builder.append((char) c);
--            i++;
--        }
--        return builder.toString();
--    }
--
--    private static void putParam(Map<String, String[]> params, String key,
--            String value) {
--        String[] oldVal = params.get(key);
--        if (oldVal == null) {
--            String[] arr = new String[1];
--            arr[0] = value;
--            params.put(key, arr);
--        } else {
--            for (int i = 0; i < oldVal.length; i++) {
--                String string = oldVal[i];
--                if (string.equals(value)) {
--                    return;
--                }
--            }
--            String[] arr = new String[oldVal.length + 1];
--            System.arraycopy(oldVal, 0, arr, 0, oldVal.length);
--            arr[oldVal.length] = value;
--            params.put(key, arr);
--        }
--    }
--
--    public void destroy() {
--    }
--
--    public void doFilter(ServletRequest req, ServletResponse res,
--            FilterChain chain) throws IOException, ServletException {
--        HttpServletRequest request = (HttpServletRequest) req;
--        HttpServletResponse response = (HttpServletResponse) res;
--        if (ServletFileUpload.isMultipartContent(request)) {
--            try {
--                boolean utf8 = false;
--                String contentType = null;
--                Map<String, String[]> params = new HashMap<String, String[]>();
--                InputStream fileStream = null;
--                ServletFileUpload upload = new ServletFileUpload();
--                FileItemIterator iter = upload.getItemIterator(request);
--                while (iter.hasNext()) {
--                    FileItemStream fileItemStream = iter.next();
--                    if (fileItemStream.isFormField()) {
--                        String fieldName = fileItemStream.getFieldName();
--                        if ("content".equals(fieldName)) {
--                            utf8 = true;
--                            String[] parser = params.get("parser");
--                            if (parser != null && parser[0].startsWith("xml")) {
--                                contentType = "application/xml";
--                            } else {
--                                contentType = "text/html";
--                            }
--                            request.setAttribute("nu.validator.servlet.MultipartFormDataFilter.type", "textarea");
--                            fileStream = fileItemStream.openStream();
--                            break;
--                        } else {
--                            putParam(
--                                    params,
--                                    fieldName,
--                                    utf8ByteStreamToString(fileItemStream.openStream()));
--                        }
--                    } else {
--                        String fileName = fileItemStream.getName();
--                        if (fileName != null) {
--                            putParam(params, fileItemStream.getFieldName(),
--                                    fileName);
--                            request.setAttribute(
--                                    "nu.validator.servlet.MultipartFormDataFilter.filename",
--                                    fileName);
--                            Matcher m = EXTENSION.matcher(fileName);
--                            if (m.matches()) {
--                                contentType = EXTENSION_TO_TYPE.get(m.group(1));
--                            }
--                        }
--                        if (contentType == null) {
--                            contentType = fileItemStream.getContentType();
--                        }
--                        request.setAttribute("nu.validator.servlet.MultipartFormDataFilter.type", "file");
--                        fileStream = fileItemStream.openStream();
--                        break;
--                    }
--                }
--                if (fileStream == null) {
--                    fileStream = new ByteArrayInputStream(new byte[0]);
--                }
--                if (contentType == null) {
--                    contentType = "application/octet-stream";
--                }
--                chain.doFilter(new RequestWrapper(request, params, contentType,
--                        utf8, fileStream), response);
--            } catch (FileUploadException e) {
--                response.sendError(415, e.getMessage());
--            } catch (CharacterCodingException e) {
--                response.sendError(415, e.getMessage());
--            } catch (IOException e) {
--                response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                        e.getMessage());
--            }
--        } else {
--            chain.doFilter(req, res);
--        }
--    }
--
--    public void init(FilterConfig arg0) throws ServletException {
--    }
--
--    private final class RequestWrapper extends HttpServletRequestWrapper {
--
--        private final Map<String, String[]> params;
--
--        private final String contentType;
--
--        private final boolean utf8;
--
--        private final ServletInputStream stream;
--
--        public RequestWrapper(HttpServletRequest req,
--                Map<String, String[]> params, String contentType, boolean utf8,
--                InputStream stream) {
--            super(req);
--            this.params = Collections.unmodifiableMap(params);
--            this.contentType = contentType;
--            this.utf8 = utf8;
--            this.stream = new DelegatingServletInputStream(stream);
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getDateHeader(java.lang.String)
--         */
--        @Override
--        public long getDateHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Type".equalsIgnoreCase(name)) {
--                return -1;
--            } else {
--                return super.getDateHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeader(java.lang.String)
--         */
--        @Override
--        public String getHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return null;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return null;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return null;
--            } else if ("Content-Type".equalsIgnoreCase(name)) {
--                return getContentType();
--            } else {
--                return super.getHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeaderNames()
--         */
--        @Override
--        public Enumeration getHeaderNames() {
--            Enumeration e = super.getHeaderNames();
--            List<String> list = new ArrayList<String>();
--            while (e.hasMoreElements()) {
--                String name = (String) e.nextElement();
--                if ("Content-Length".equalsIgnoreCase(name)) {
--                    continue;
--                } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                    continue;
--                } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                    continue;
--                } else if ("Content-Type".equalsIgnoreCase(name)) {
--                    list.add(getContentType());
--                } else {
--                    list.add(name);
--                }
--            }
--            return Collections.enumeration(list);
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getHeaders(java.lang.String)
--         */
--        @SuppressWarnings("unchecked")
--        @Override
--        public Enumeration getHeaders(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.EMPTY_SET);
--            } else if ("Content-Type".equalsIgnoreCase(name)) {
--                return Collections.enumeration(Collections.singleton(getContentType()));
--            } else {
--                return super.getHeaders(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.http.HttpServletRequestWrapper#getIntHeader(java.lang.String)
--         */
--        @Override
--        public int getIntHeader(String name) {
--            if ("Content-Length".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-MD5".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Encoding".equalsIgnoreCase(name)) {
--                return -1;
--            } else if ("Content-Type".equalsIgnoreCase(name)) {
--                return -1;
--            } else {
--                return super.getIntHeader(name);
--            }
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getCharacterEncoding()
--         */
--        @Override
--        public String getCharacterEncoding() {
--            return utf8 ? "utf-8" : null;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getContentLength()
--         */
--        @Override
--        public int getContentLength() {
--            return -1;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getContentType()
--         */
--        @Override
--        public String getContentType() {
--            return utf8 ? contentType + "; charset=utf-8" : contentType;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getInputStream()
--         */
--        @Override
--        public ServletInputStream getInputStream() throws IOException {
--            return stream;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
--         */
--        @Override
--        public String getParameter(String key) {
--            String[] arr = params.get(key);
--            if (arr == null) {
--                return null;
--            } else {
--                return arr[0];
--            }
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getParameterMap()
--         */
--        @Override
--        public Map getParameterMap() {
--            return params;
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getParameterNames()
--         */
--        @Override
--        public Enumeration getParameterNames() {
--            return Collections.enumeration(params.keySet());
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String)
--         */
--        @Override
--        public String[] getParameterValues(String key) {
--            return params.get(key);
--        }
--
--        /**
--         * @see javax.servlet.ServletRequestWrapper#getReader()
--         */
--        @Override
--        public BufferedReader getReader() throws IOException {
--            CharsetDecoder dec = Charset.forName("UTF-8").newDecoder();
--            dec.onMalformedInput(CodingErrorAction.REPORT);
--            dec.onUnmappableCharacter(CodingErrorAction.REPORT);
--            Reader reader = new InputStreamReader(stream, dec);
--            return new BufferedReader(reader);
--        }
--
--    }
--
--}
-diff --git a/src/nu/validator/servlet/NsFilterEmitter.java b/src/nu/validator/servlet/NsFilterEmitter.java
-deleted file mode 100644
-index d9e23be..0000000
---- a/src/nu/validator/servlet/NsFilterEmitter.java
-+++ /dev/null
-@@ -1,33 +0,0 @@
--/* This code was generated by nu.validator.tools.SaxCompiler. Please regenerate instead of editing. */
--package nu.validator.servlet;
--public final class NsFilterEmitter {
--private NsFilterEmitter() {}
--public static void emit(org.xml.sax.ContentHandler contentHandler, nu.validator.servlet.VerifierServletTransaction t) throws org.xml.sax.SAXException {
--org.xml.sax.helpers.AttributesImpl __attrs__ = new org.xml.sax.helpers.AttributesImpl();
--contentHandler.startPrefixMapping("", "http://www.w3.org/1999/xhtml");
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "Space-separated list of namespace URIs.");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "tr", "tr", __attrs__);
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "th", "th", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "for", "for", "CDATA", "nsfilter");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "label", "label", __attrs__);
--__attrs__.clear();
--__attrs__.addAttribute("", "title", "title", "CDATA", "XML namespace");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "abbr", "abbr", __attrs__);
--contentHandler.characters(__chars__, 0, 5);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "abbr", "abbr");
--contentHandler.characters(__chars__, 5, 1);
--contentHandler.characters(__chars__, 6, 6);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "label", "label");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "th", "th");
--__attrs__.clear();
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "td", "td", __attrs__);
--t.emitNsfilterField(); 
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "td", "td");
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "tr", "tr");
--contentHandler.endPrefixMapping("");
--}
--private static final char[] __chars__ = { 'X', 'M', 'L', 'N', 'S', '\u00a0', 'F', 'i', 'l', 't', 'e', 'r' };
--}
-diff --git a/src/nu/validator/servlet/OutlineBuildingXMLReaderWrapper.java b/src/nu/validator/servlet/OutlineBuildingXMLReaderWrapper.java
-deleted file mode 100644
-index a22b654..0000000
---- a/src/nu/validator/servlet/OutlineBuildingXMLReaderWrapper.java
-+++ /dev/null
-@@ -1,847 +0,0 @@
--/*
-- * Copyright (c) 2012 Vadim Zaslawski, Ontos AG
-- * Copyright (c) 2012-2014 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- *
-- * This code contains comments that are verbatim quotations from the
-- * document "HTML: The Living Standard", which has the following copyright
-- * and permission notice:
-- *
-- *   Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and
-- *   Opera Software ASA. You are granted a license to use, reproduce and
-- *   create derivative works of this document.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.util.Arrays;
--import java.util.Deque;
--import java.util.LinkedList;
--import java.util.regex.Pattern;
--
--import javax.servlet.http.HttpServletRequest;
--
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.DTDHandler;
--import org.xml.sax.EntityResolver;
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.InputSource;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXNotRecognizedException;
--import org.xml.sax.SAXNotSupportedException;
--import org.xml.sax.XMLReader;
--
--public final class OutlineBuildingXMLReaderWrapper implements XMLReader,
--        ContentHandler {
--
--    private final XMLReader wrappedReader;
--
--    private final HttpServletRequest request;
--
--    private ContentHandler contentHandler;
--
--    public OutlineBuildingXMLReaderWrapper(XMLReader wrappedReader,
--            HttpServletRequest request) {
--        this.request = request;
--        this.wrappedReader = wrappedReader;
--        this.contentHandler = wrappedReader.getContentHandler();
--        wrappedReader.setContentHandler(this);
--    }
--
--    private static final int MAX_EXCERPT = 500;
--
--    private static final String[] SECTIONING_CONTENT_ELEMENTS = { "article",
--            "aside", "nav", "section" };
--
--    private static final String[] SECTIONING_ROOT_ELEMENTS = { "blockquote",
--            "body", "details", "fieldset", "figure", "td" };
--
--    private static final String[] HEADING_CONTENT_ELEMENTS = { "h1", "h2",
--            "h3", "h4", "h5", "h6", "hgroup", };
--
--    private Deque<Section> outline;
--
--    public Deque<Section> getOutline() {
--        return this.outline;
--    }
--
--    protected void setOutline(Deque<Section> outline) {
--        this.outline = outline;
--    }
--
--    // an outlinee, a heading content element, or an element with a hidden
--    // attribute;
--    // during a walk over the nodes of a DOM tree, nodes are identified with
--    // their depth and local name
--    private class Element {
--        // the depth of element in the DOM
--        final private int depth;
--
--        // the local name of element
--        final private String name;
--
--        // whether the element is hidden
--        final private boolean hidden;
--
--        // the outline for a sectioning content element or a sectioning root
--        // element consists of a list of one or more potentially nested sections
--        final private Deque<Section> outline = new LinkedList<Section>();
--
--        public Element(int depth, String name, boolean hidden) {
--            this.depth = depth;
--            this.name = name;
--            this.hidden = hidden;
--        }
--
--        public boolean isHidden() {
--            return hidden;
--        }
--
--        public boolean equals(int depth, String name) {
--            return this.depth == depth && this.name.equals(name);
--        }
--
--        /**
--         * @return the outline
--         */
--        public Deque<Section> getOutline() {
--            return outline;
--        }
--
--        /**
--         * @return 1-6 for a heading content element MAX_VALUE for an implied
--         *         heading -1 for no section
--         */
--        public int getLastSectionHeadingRank() {
--            Section section = outline.peekLast();
--            return section != null ? section.getHeadingRank() : -1;
--        }
--    }
--
--    // a section is a container that corresponds to some nodes in the original
--    // DOM tree
--    public class Section {
--        // the section that contains this section
--        private Section parent;
--
--        // an outlinee or a heading content element
--        final String elementName;
--
--        // each section can have one heading associated with it
--        final private StringBuilder headingTextBuilder = new StringBuilder();
--
--        // we generate an "implied heading" for some sections that lack headings
--        private boolean hasImpliedHeading;
--
--        // Generating a special kind of implied heading specifically for
--        // the "empty heading" case (e.g., empty <h1></h1> descendant) as
--        // opposed to the "no heading" case (no h1-h6 descendants at all)
--        // isn't required by the spec, but it's nonetheless useful.
--        private boolean hasEmptyHeading;
--
--        // MAX_VALUE for an implied heading, 1-6 for a heading content element
--        private int headingRank = Integer.MAX_VALUE;
--
--        // each section can contain any number of further nested sections
--        final public Deque<Section> sections = new LinkedList<Section>();
--
--        public Section(String elementName) {
--            this.elementName = elementName;
--        }
--
--        /**
--         * @return the parent section
--         */
--        public Section getParent() {
--            return parent;
--        }
--
--        /**
--         * @return the lement name
--         */
--        public String getElementName() {
--            return elementName;
--        }
--
--        /**
--         * @param parent
--         *            the parent section to set
--         */
--        public void setParent(Section parent) {
--            this.parent = parent;
--        }
--
--        /**
--         * @return the heading text builder
--         */
--        public StringBuilder getHeadingTextBuilder() {
--            return headingTextBuilder;
--        }
--
--        /**
--         * @return the heading rank
--         */
--        public int getHeadingRank() {
--            return headingRank;
--        }
--
--        /**
--         * @return the sections
--         */
--        public Deque<Section> getSections() {
--            return sections;
--        }
--
--        public void setHeadingRank(int headingRank) {
--            this.headingRank = headingRank;
--        }
--
--        public boolean hasHeading() {
--            return headingRank < 7 || hasImpliedHeading;
--        }
--
--        public void createImpliedHeading() {
--            hasImpliedHeading = true;
--        }
--
--        public void createEmptyHeading() {
--            hasEmptyHeading = true;
--        }
--
--        public boolean hasEmptyHeading() {
--            return hasEmptyHeading;
--        }
--    }
--
--    // tracks the depth of walk through the DOM
--    private int currentWalkDepth;
--
--    // holds the element whose outline is being created;
--    // a sectioning content element or a sectioning root element
--    private Element currentOutlinee;
--
--    // A stack (not defined in the spec) to hold all open elements. We just
--    // use this stack for the purpose of checking whether there are any
--    // open elements at all with a "hidden" attribute -- including elements
--    // that may be descendants of heading-content elements (which per the
--    // spec never end up on the outline stack).
--    private Deque<Element> elementStack = new LinkedList<Element>();
--
--    private boolean inHiddenSubtree() {
--        for (Element element : elementStack) {
--            if (element.isHidden()) {
--                return true;
--            }
--        }
--        return false;
--    }
--
--    // A stack, defined in the spec, to which we only add open
--    // heading-content elements and elements with a "hidden" attribute that
--    // are ancestors to heading-content elements.
--    private Deque<Element> outlineStack = new LinkedList<Element>();
--
--    // The top of the outline stack defined in the spec is always either a
--    // heading content element or an element with a hidden attribute.
--    private boolean inHeadingContentOrHiddenElement;
--
--    private boolean needHeading;
--
--    private boolean skipHeading;
--
--    // holds a pointer to a section, so that elements in the DOM can all be
--    // associated with a section
--    private Section currentSection;
--
--    private boolean isWalkOver;
--
--    private static final Pattern excerptPattern = Pattern.compile("\\W*\\S*$");
--
--    private static final Pattern whitespacePattern = Pattern.compile("\\s+");
--
--    /*
--     * Returns the string excerpt.
--     */
--    private String excerpt(String str, int maxLength) {
--        return str.length() > maxLength ? excerptPattern.matcher(
--                str.substring(0, maxLength)).replaceFirst("&hellip;") : str;
--    }
--
--    /**
--     * @see org.xml.sax.helpers.XMLFilterImpl#characters(char[], int, int)
--     */
--    public void characters(char[] ch, int start, int length)
--            throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        if (isWalkOver) {
--            contentHandler.characters(ch, start, length);
--            return;
--        }
--
--        if (inHeadingContentOrHiddenElement && !inHiddenSubtree()) {
--            currentSection.getHeadingTextBuilder().append(ch, start, length);
--        }
--        contentHandler.characters(ch, start, length);
--    }
--
--    /**
--     * @see org.xml.sax.helpers.XMLFilterImpl#endElement(java.lang.String,
--     *      java.lang.String, java.lang.String)
--     */
--    public void endElement(String uri, String localName, String qName)
--            throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        elementStack.pop();
--        if ("hgroup".equals(localName)) {
--            needHeading = false;
--            skipHeading = false;
--        }
--        if (isWalkOver) {
--            contentHandler.endElement(uri, localName, qName);
--            return;
--        }
--
--        int depth = currentWalkDepth--;
--
--        if (inHeadingContentOrHiddenElement) {
--            // When exiting an element, if that element is the element at the
--            // top of the stack
--            // Note: The element being exited is a heading content element or an
--            // element with a hidden attribute.
--            Element topElement = outlineStack.peek();
--            assert topElement != null;
--            if (topElement.equals(depth, localName)) {
--                // Pop that element from the stack.
--                outlineStack.pop();
--                inHeadingContentOrHiddenElement = false;
--
--                if (currentSection != null) {
--                    StringBuilder headingTextBuilder = currentSection.getHeadingTextBuilder();
--                    String heading = excerpt(
--                            whitespacePattern.matcher(headingTextBuilder).replaceAll(
--                                    " ").trim(), MAX_EXCERPT);
--                    headingTextBuilder.setLength(0);
--                    if (heading.length() > 0) {
--                        headingTextBuilder.append(heading);
--                    } else {
--                        currentSection.createEmptyHeading();
--                    }
--                }
--            }
--
--            // If the top of the stack is a heading content element or an
--            // element with a hidden attribute
--            // Do nothing.
--            contentHandler.endElement(uri, localName, qName);
--            return;
--        }
--
--        if (Arrays.binarySearch(SECTIONING_CONTENT_ELEMENTS, localName) > -1) {
--            // When exiting a sectioning content element, if the stack is not
--            // empty
--            if (!outlineStack.isEmpty()) {
--                // If the current section has no heading,
--                if (currentSection != null && !currentSection.hasHeading()) {
--                    // create an implied heading and let that be the heading for
--                    // the current section.
--                    currentSection.createImpliedHeading();
--                }
--                Element exitedSectioningContentElement = currentOutlinee;
--                assert exitedSectioningContentElement != null;
--
--                // Pop the top element from the stack, and let the current
--                // outlinee be that element.
--                currentOutlinee = outlineStack.pop();
--
--                // Let current section be the last section in the outline of the
--                // current outlinee element.
--                currentSection = currentOutlinee.getOutline().peekLast();
--                assert currentSection != null;
--
--                // Append the outline of the sectioning content element being
--                // exited to the current section.
--                // (This does not change which section is the last section in
--                // the outline.)
--                for (Section section : exitedSectioningContentElement.outline) {
--                    section.setParent(currentSection);
--                    currentSection.sections.add(section);
--                }
--            }
--        } else if (Arrays.binarySearch(SECTIONING_ROOT_ELEMENTS, localName) > -1) {
--            // When exiting a sectioning root element, if the stack is not empty
--            if (!outlineStack.isEmpty()) {
--                // Run these steps:
--
--                // If the current section has no heading,
--                if (currentSection != null && !currentSection.hasHeading()) {
--                    // create an implied heading and let that be the heading for
--                    // the current section.
--                    currentSection.createImpliedHeading();
--                }
--
--                // Pop the top element from the stack, and let the current
--                // outlinee be that element.
--                currentOutlinee = outlineStack.pop();
--
--                // Let current section be the last section in the outline of the
--                // current outlinee element.
--                currentSection = currentOutlinee.getOutline().peekLast();
--
--                // Finding the deepest child:
--                // If current section has no child sections, stop these steps.
--                while (!currentSection.sections.isEmpty())
--                    // Let current section be the last child section of the
--                    // current current section.
--                    currentSection = currentSection.sections.peekLast();
--                // Go back to the substep labeled finding the deepest child.
--            }
--        } else {
--            // neither a sectioning content element nor a sectioning root
--            // element
--            contentHandler.endElement(uri, localName, qName);
--            return;
--        }
--
--        // When exiting a sectioning content element or a sectioning root
--        // element
--        // Note: The current outlinee is the element being exited, and
--        // it is the sectioning content element or a sectioning root element at
--        // the root of the subtree for which an outline is being generated.
--
--        // If the current section has no heading,
--        if (currentSection != null && !currentSection.hasHeading()) {
--            // create an implied heading and let that be the heading for the
--            // current section.
--            currentSection.createImpliedHeading();
--        }
--
--        // Skip to the next step in the overall set of steps.
--        // (The walk is over.)
--        // / isWalkOver = true;
--
--        contentHandler.endElement(uri, localName, qName);
--    }
--
--    /**
--     * @see org.xml.sax.helpers.XMLFilterImpl#startDocument()
--     */
--    public void startDocument() throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.startDocument();
--    }
--
--    /**
--     * @see org.xml.sax.helpers.XMLFilterImpl#startElement(java.lang.String,
--     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
--     */
--    public void startElement(String uri, String localName, String qName,
--            Attributes atts) throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        if (isWalkOver) {
--            contentHandler.startElement(uri, localName, qName, atts);
--            return;
--        }
--
--        ++currentWalkDepth;
--
--        boolean hidden = atts.getIndex("", "hidden") >= 0;
--        elementStack.push(new Element(currentWalkDepth, localName, hidden));
--
--        // If the top of the stack is a heading content element or an element
--        // with a hidden attribute
--        if (inHeadingContentOrHiddenElement) {
--            if (!inHiddenSubtree() && "img".equals(localName)
--                    && atts.getIndex("", "alt") >= 0) {
--                currentSection.getHeadingTextBuilder().append(
--                        atts.getValue("", "alt"));
--            }
--            // Do nothing.
--            contentHandler.startElement(uri, localName, qName, atts);
--            return;
--        }
--
--        // When entering an element with a hidden attribute
--        if (hidden) {
--            // Push the element being entered onto the stack. (This causes the
--            // algorithm to skip that element and any descendants of the
--            // element.)
--            outlineStack.push(new Element(currentWalkDepth, localName, hidden));
--            inHeadingContentOrHiddenElement = true;
--            contentHandler.startElement(uri, localName, qName, atts);
--            return;
--        }
--
--        // When entering a sectioning content element or a sectioning root
--        // element
--        if (Arrays.binarySearch(SECTIONING_CONTENT_ELEMENTS, localName) > -1
--                || Arrays.binarySearch(SECTIONING_ROOT_ELEMENTS, localName) > -1) {
--            if (currentOutlinee != null) {
--                // If current outlinee is not null, and the current section has
--                // no heading,
--                // create an implied heading and let that be the heading for the
--                // current section.
--                if (currentSection != null && !currentSection.hasHeading()) {
--                    currentSection.createImpliedHeading();
--                }
--                // If current outlinee is not null, push current outlinee onto
--                // the stack.
--                outlineStack.push(currentOutlinee);
--            }
--
--            // Let current outlinee be the element that is being entered.
--            currentOutlinee = new Element(currentWalkDepth, localName, hidden);
--
--            // Let current section be a newly created section for the current
--            // outlinee element.
--            // Associate current outlinee with current section.
--            currentSection = new Section(localName);
--
--            // Let there be a new outline for the new current outlinee,
--            // initialized with just the new current section as the only section
--            // in the outline.
--            currentOutlinee.getOutline().add(currentSection);
--            contentHandler.startElement(uri, localName, qName, atts);
--            return;
--        }
--
--        // When entering a heading content element
--        // Note: Recall that h1 has the highest rank, and h6 has the lowest
--        // rank.
--        if (Arrays.binarySearch(HEADING_CONTENT_ELEMENTS, localName) > -1
--                && currentOutlinee != null) {
--            if ("hgroup".equals(localName)) {
--                needHeading = true;
--                skipHeading = false;
--                contentHandler.startElement(uri, localName, qName, atts);
--                return;
--            } else if (skipHeading) {
--                contentHandler.startElement(uri, localName, qName, atts);
--                return;
--            } else if (needHeading) {
--                skipHeading = true;
--                needHeading = false;
--            }
--            int rank = localName.charAt(1) - '0';
--
--            // If the current section has no heading,
--            // let the element being entered be the heading for the current
--            // section.
--            if (currentSection != null && !currentSection.hasHeading()) {
--                currentSection.setHeadingRank(rank);
--            }
--            // Otherwise, if the element being entered has a rank equal to
--            // or higher than the heading of the last section of the
--            // outline of the current outlinee, or if the heading of the
--            // last section of the outline of the current outlinee is an
--            // implied heading,
--            else if (rank <= currentOutlinee.getLastSectionHeadingRank()) {
--                // then create a new section and append it to the outline
--                // of the current outlinee element, so that this new
--                // section is the new last section of that outline.
--                // Let current section be that new section.
--                currentSection = new Section(localName);
--                currentOutlinee.getOutline().add(currentSection);
--
--                // Let the element being entered be the new heading for the
--                // current section.
--                currentSection.setHeadingRank(rank);
--            }
--            // Otherwise, run these substeps:
--            else {
--                // Let candidate section be current section.
--                Section candidateSection = currentSection;
--
--                // Heading loop:
--                while (candidateSection != null) {
--                    // If the element being entered has a rank lower than the
--                    // rank of the heading of the candidate section,
--                    if (rank > candidateSection.getHeadingRank()) {
--                        // then create a new section, and append it to candidate
--                        // section.
--                        // (This does not change which section is the last
--                        // section in the outline.)
--                        // Let current section be this new section.
--                        currentSection = new Section(localName);
--                        currentSection.setParent(candidateSection);
--                        candidateSection.getSections().add(currentSection);
--
--                        // Let the element being entered be the new heading for
--                        // the current section.
--                        currentSection.setHeadingRank(rank);
--
--                        // Abort these substeps.
--                        break;
--                    }
--
--                    // Let new candidate section be the section that contains
--                    // candidate section in the outline of current outlinee.
--                    // Let candidate section be new candidate section.
--                    candidateSection = candidateSection.getParent();
--
--                    // Return to the step labeled heading loop.
--                }
--            }
--
--            // Push the element being entered onto the stack.
--            // (This causes the algorithm to skip any descendants of the
--            // element.)
--            outlineStack.push(new Element(currentWalkDepth, localName, hidden));
--            inHeadingContentOrHiddenElement = true;
--        }
--        contentHandler.startElement(uri, localName, qName, atts);
--    }
--
--    /**
--     * @see org.xml.sax.helpers.XMLFilterImpl#setDocumentLocator(org.xml.sax.Locator)
--     */
--    public void setDocumentLocator(Locator locator) {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.setDocumentLocator(locator);
--    }
--
--    public ContentHandler getContentHandler() {
--        return contentHandler;
--    }
--
--    /**
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#endDocument()
--     */
--    public void endDocument() throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        if (currentOutlinee != null) {
--            request.setAttribute(
--                    "http://validator.nu/properties/document-outline",
--                    (Deque<Section>) currentOutlinee.outline);
--            setOutline(currentOutlinee.outline);
--        }
--        contentHandler.endDocument();
--    }
--
--    /**
--     * @param prefix
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
--     */
--    public void endPrefixMapping(String prefix) throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.endPrefixMapping(prefix);
--    }
--
--    /**
--     * @param ch
--     * @param start
--     * @param length
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
--     */
--    public void ignorableWhitespace(char[] ch, int start, int length)
--            throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.ignorableWhitespace(ch, start, length);
--    }
--
--    /**
--     * @param target
--     * @param data
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String,
--     *      java.lang.String)
--     */
--    public void processingInstruction(String target, String data)
--            throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.processingInstruction(target, data);
--    }
--
--    /**
--     * @param name
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
--     */
--    public void skippedEntity(String name) throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.skippedEntity(name);
--    }
--
--    /**
--     * @param prefix
--     * @param uri
--     * @throws SAXException
--     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
--     *      java.lang.String)
--     */
--    public void startPrefixMapping(String prefix, String uri)
--            throws SAXException {
--        if (contentHandler == null) {
--            return;
--        }
--        contentHandler.startPrefixMapping(prefix, uri);
--    }
--
--    /**
--     * @return
--     * @see org.xml.sax.XMLReader#getDTDHandler()
--     */
--    public DTDHandler getDTDHandler() {
--        return wrappedReader.getDTDHandler();
--    }
--
--    /**
--     * @return
--     * @see org.xml.sax.XMLReader#getEntityResolver()
--     */
--    public EntityResolver getEntityResolver() {
--        return wrappedReader.getEntityResolver();
--    }
--
--    /**
--     * @return
--     * @see org.xml.sax.XMLReader#getErrorHandler()
--     */
--    public ErrorHandler getErrorHandler() {
--        return wrappedReader.getErrorHandler();
--    }
--
--    /**
--     * @param name
--     * @return
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     * @see org.xml.sax.XMLReader#getFeature(java.lang.String)
--     */
--    public boolean getFeature(String name) throws SAXNotRecognizedException,
--            SAXNotSupportedException {
--        return wrappedReader.getFeature(name);
--    }
--
--    /**
--     * @param name
--     * @return
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     * @see org.xml.sax.XMLReader#getProperty(java.lang.String)
--     */
--    public Object getProperty(String name) throws SAXNotRecognizedException,
--            SAXNotSupportedException {
--        return wrappedReader.getProperty(name);
--    }
--
--    /**
--     * @param input
--     * @throws IOException
--     * @throws SAXException
--     * @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource)
--     */
--    public void parse(InputSource input) throws IOException, SAXException {
--        wrappedReader.parse(input);
--    }
--
--    /**
--     * @param systemId
--     * @throws IOException
--     * @throws SAXException
--     * @see org.xml.sax.XMLReader#parse(java.lang.String)
--     */
--    public void parse(String systemId) throws IOException, SAXException {
--        wrappedReader.parse(systemId);
--    }
--
--    /**
--     * @param handler
--     * @see org.xml.sax.XMLReader#setContentHandler(org.xml.sax.ContentHandler)
--     */
--    public void setContentHandler(ContentHandler handler) {
--        contentHandler = handler;
--    }
--
--    /**
--     * @param handler
--     * @see org.xml.sax.XMLReader#setDTDHandler(org.xml.sax.DTDHandler)
--     */
--    public void setDTDHandler(DTDHandler handler) {
--        wrappedReader.setDTDHandler(handler);
--    }
--
--    /**
--     * @param resolver
--     * @see org.xml.sax.XMLReader#setEntityResolver(org.xml.sax.EntityResolver)
--     */
--    public void setEntityResolver(EntityResolver resolver) {
--        wrappedReader.setEntityResolver(resolver);
--    }
--
--    /**
--     * @param handler
--     * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
--     */
--    public void setErrorHandler(ErrorHandler handler) {
--        wrappedReader.setErrorHandler(handler);
--    }
--
--    /**
--     * @param name
--     * @param value
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     * @see org.xml.sax.XMLReader#setFeature(java.lang.String, boolean)
--     */
--    public void setFeature(String name, boolean value)
--            throws SAXNotRecognizedException, SAXNotSupportedException {
--        wrappedReader.setFeature(name, value);
--    }
--
--    /**
--     * @param name
--     * @param value
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     * @see org.xml.sax.XMLReader#setProperty(java.lang.String,
--     *      java.lang.Object)
--     */
--    public void setProperty(String name, Object value)
--            throws SAXNotRecognizedException, SAXNotSupportedException {
--        wrappedReader.setProperty(name, value);
--    }
--
--}
-diff --git a/src/nu/validator/servlet/ParseTreePrinter.java b/src/nu/validator/servlet/ParseTreePrinter.java
-deleted file mode 100644
-index 4203c1c..0000000
---- a/src/nu/validator/servlet/ParseTreePrinter.java
-+++ /dev/null
-@@ -1,198 +0,0 @@
--/*
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.io.OutputStreamWriter;
--import java.io.StringReader;
--import java.io.Writer;
--
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletResponse;
--
--import nu.validator.gnu.xml.aelfred2.SAXDriver;
--import nu.validator.htmlparser.common.Heuristics;
--import nu.validator.htmlparser.common.XmlViolationPolicy;
--import nu.validator.io.BoundedInputStream;
--import nu.validator.io.StreamBoundException;
--import nu.validator.xml.ContentTypeParser;
--import nu.validator.xml.NullEntityResolver;
--import nu.validator.xml.PrudentHttpEntityResolver;
--import nu.validator.xml.TypedInputSource;
--
--import org.xml.sax.SAXException;
--import org.xml.sax.XMLReader;
--
--import io.mola.galimatias.URL;
--import io.mola.galimatias.GalimatiasParseException;
--
--public class ParseTreePrinter {
--    
--    private static final String FORM_HTML = "<!DOCTYPE html><title>Parse Tree Dump</title><form><p><input type='url' name='doc' id='doc' pattern='(?:https?://.+)?'> <input name='submit' value='Print Tree' type='submit' id='submit'></form><hr><form><p><select id=parser name=parser><option value=xml>XML; don\u2019t load external entities</option><option value=html5 selected>HTML5</option></select><p><textarea name=content rows=20 cols=72></textarea> <input name='submit' value='Print Tree' type='submit' id='submit'></form>";
--    
--    private static final long SIZE_LIMIT = Integer.parseInt(System.getProperty(
--            "nu.validator.servlet.max-file-size", "2097152"));
--    
--    private final HttpServletRequest request;
--
--    private final HttpServletResponse response;
--
--    /**
--     * @param request
--     * @param response
--     */
--    public ParseTreePrinter(final HttpServletRequest request,
--            final HttpServletResponse response) {
--        this.request = request;
--        this.response = response;
--    }
--
--    private String scrubUrl(String urlStr) {
--        if (urlStr == null) {
--            return null;
--        }
--        try {
--            return URL.parse(urlStr).toString();
--        } catch (GalimatiasParseException e) {
--            return null;
--        }
--    }
--
--    public void service() throws IOException {
--        request.setCharacterEncoding("utf-8");
--        String content = null;
--        String document = scrubUrl(request.getParameter("doc"));
--        document = ("".equals(document)) ? null : document;
--        Writer writer = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
--        if (document == null && methodIsGet() && (content = request.getParameter("content")) == null) {
--            response.setContentType("text/html; charset=utf-8");
--            writer.write(FORM_HTML);
--            writer.flush();
--            writer.close();
--            return;
--        } else {
--            response.setContentType("text/plain; charset=utf-8");
--            try {
--            PrudentHttpEntityResolver entityResolver = new PrudentHttpEntityResolver(
--                    2048 * 1024, false, null);
--            entityResolver.setAllowGenericXml(false);
--            entityResolver.setAcceptAllKnownXmlTypes(false);
--            entityResolver.setAllowHtml(true);
--            entityResolver.setAllowXhtml(true);
--            TypedInputSource documentInput;
--            if (methodIsGet()) {
--                if (content == null) {
--                    documentInput = (TypedInputSource) entityResolver.resolveEntity(
--                            null, document);
--                } else {
--                    documentInput = new TypedInputSource(new StringReader(content));
--                    if ("xml".equals(request.getParameter("parser"))) {
--                        documentInput.setType("application/xhtml+xml");
--                    } else {
--                        documentInput.setType("text/html");
--                    }
--                }
--            } else { // POST
--                String postContentType = request.getContentType();
--                if (postContentType == null) {
--                    response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                            "Content-Type missing");
--                    return;
--                } else if (postContentType.trim().toLowerCase().startsWith(
--                        "application/x-www-form-urlencoded")) {
--                    response.sendError(
--                            HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
--                            "application/x-www-form-urlencoded not supported. Please use multipart/form-data.");
--                    return;
--                }
--                long len = request.getContentLength();
--                if (len > SIZE_LIMIT) {
--                    throw new StreamBoundException("Resource size exceeds limit.");
--                }
--                ContentTypeParser contentTypeParser = new ContentTypeParser(null, false);
--                contentTypeParser.setAllowGenericXml(false);
--                contentTypeParser.setAcceptAllKnownXmlTypes(false);
--                contentTypeParser.setAllowHtml(true);
--                contentTypeParser.setAllowXhtml(true);
--                documentInput = contentTypeParser.buildTypedInputSource(document,
--                        null, postContentType);
--                documentInput.setByteStream(len < 0 ? new BoundedInputStream(
--                        request.getInputStream(), SIZE_LIMIT, document)
--                        : request.getInputStream());
--                documentInput.setSystemId(request.getHeader("Content-Location"));
--            }
--            String type = documentInput.getType();
--            XMLReader parser;
--            if ("text/html".equals(type) || "text/html-sandboxed".equals(type)) {
--                writer.write("HTML parser\n\n#document\n");
--                parser = new nu.validator.htmlparser.sax.HtmlParser();
--                parser.setProperty("http://validator.nu/properties/heuristics", Heuristics.ALL);
--                parser.setProperty("http://validator.nu/properties/xml-policy", XmlViolationPolicy.ALLOW);
--            } else if ("application/xhtml+xml".equals(type)) {
--                writer.write("XML parser\n\n#document\n");
--                parser = new SAXDriver();
--                parser.setFeature(
--                        "http://xml.org/sax/features/external-general-entities",
--                        false);
--                parser.setFeature(
--                        "http://xml.org/sax/features/external-parameter-entities",
--                        false);
--                parser.setEntityResolver(new NullEntityResolver());
--            } else {
--                writer.write("Unsupported content type.\n");
--                writer.flush();
--                writer.close();
--                return;
--            }
--            TreeDumpContentHandler treeDumpContentHandler = new TreeDumpContentHandler(writer, false);
--            ListErrorHandler listErrorHandler = new ListErrorHandler();
--            parser.setContentHandler(treeDumpContentHandler);
--            parser.setProperty("http://xml.org/sax/properties/lexical-handler", treeDumpContentHandler);
--            parser.setErrorHandler(listErrorHandler);
--            parser.parse(documentInput);
--            writer.write("#errors\n");
--            for (String err : listErrorHandler.getErrors()) {
--                writer.write(err);
--                writer.write('\n');
--            }
--            } catch (SAXException e) {
--                writer.write("SAXException:\n");
--                writer.write(e.getMessage());
--                writer.write("\n");
--            } catch (IOException e) {
--                writer.write("IOException:\n");
--                writer.write(e.getMessage());
--                writer.write("\n");
--            } finally {
--                writer.flush();
--                writer.close();
--            }
--        }
--    }
--
--    private boolean methodIsGet() {
--        return "GET".equals(request.getMethod())
--                || "HEAD".equals(request.getMethod());
--    }
--
--}
-diff --git a/src/nu/validator/servlet/RootNamespaceSniffer.java b/src/nu/validator/servlet/RootNamespaceSniffer.java
-deleted file mode 100644
-index df4bad2..0000000
---- a/src/nu/validator/servlet/RootNamespaceSniffer.java
-+++ /dev/null
-@@ -1,121 +0,0 @@
--/*
-- * Copyright (c) 2006 Henri Sivonen
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--
--public class RootNamespaceSniffer implements ContentHandler {
--
--    private VerifierServletTransaction vst;
--    private ContentHandler ch;
--    private Locator locator;
--
--    public RootNamespaceSniffer(VerifierServletTransaction vst, ContentHandler ch) {
--        super();
--        this.vst = vst;
--        this.ch = ch;
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
--     */
--    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
--        ch.characters(arg0, arg1, arg2);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endDocument()
--     */
--    public void endDocument() throws SAXException {
--        ch.endDocument();
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
--     */
--    public void endElement(String arg0, String arg1, String arg2) throws SAXException {
--        ch.endElement(arg0, arg1, arg2);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
--     */
--    public void endPrefixMapping(String arg0) throws SAXException {
--        ch.endPrefixMapping(arg0);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
--     */
--    public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException {
--        ch.ignorableWhitespace(arg0, arg1, arg2);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
--     */
--    public void processingInstruction(String arg0, String arg1) throws SAXException {
--        ch.processingInstruction(arg0, arg1);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
--     */
--    public void setDocumentLocator(Locator arg0) {
--        this.locator = arg0;
--        ch.setDocumentLocator(arg0);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
--     */
--    public void skippedEntity(String arg0) throws SAXException {
--        ch.skippedEntity(arg0);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startDocument()
--     */
--    public void startDocument() throws SAXException {
--        ch.startDocument();
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
--     */
--    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
--        vst.rootNamespace(arg0, locator);
--        ch.startElement(arg0, arg1, arg2, arg3);
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
--     */
--    public void startPrefixMapping(String arg0, String arg1) throws SAXException {
--        ch.startPrefixMapping(arg0, arg1);
--    }
--
--}
-diff --git a/src/nu/validator/servlet/Statistics.java b/src/nu/validator/servlet/Statistics.java
-deleted file mode 100644
-index 37ada19..0000000
---- a/src/nu/validator/servlet/Statistics.java
-+++ /dev/null
-@@ -1,248 +0,0 @@
--/*
-- * Copyright (c) 2012 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.text.DecimalFormat;
--
--import javax.servlet.http.HttpServletResponse;
--
--import nu.validator.htmlparser.sax.HtmlSerializer;
--import nu.validator.xml.EmptyAttributes;
--
--import org.xml.sax.ContentHandler;
--import org.xml.sax.SAXException;
--
--public class Statistics {
--
--    public static final Statistics STATISTICS;
--
--    private static final char[] VALIDATOR_STATISTICS = "Validator statistics".toCharArray();
--
--    private static final char[] COUNTER_NAME = "Counter".toCharArray();
--
--    private static final char[] COUNTER_VALUE = "Value".toCharArray();
--
--    private static final char[] COUNTER_PROPORTION = "Proportion".toCharArray();
--
--    private static final char[] TOTAL_VALIDATIONS = "Total number of validations".toCharArray();
--
--    private static final char[] UPTIME_DAYS = "Uptime in days".toCharArray();
--
--    private static final char[] VALIDATIONS_PER_SECOND = "Validations per second".toCharArray();
--
--    public enum Field {
--        // Sigh. Eclipse's formatting of the following code is sad.
--        CUSTOM_ENC("Manually set character encoding"), AUTO_SCHEMA(
--                "Automatically chosen schema"), PRESET_SCHEMA("Preset schema"), BUILT_IN_NON_PRESET(
--                "Custom schema combined from built-ins"), HTML5_SCHEMA(
--                "(X)HTML5 schema"), HTML5_RDFA_LITE_SCHEMA(
--                "(X)HTML5+RDFa Lite schema"), HTML4_STRICT_SCHEMA(
--                "Legacy Strict schema"), HTML4_TRANSITIONAL_SCHEMA(
--                "Legacy Transitional schema"), HTML4_FRAMESET_SCHEMA(
--                "Legacy Frameset schema"), XHTML1_COMPOUND_SCHEMA(
--                "Legacy XHTML+SVG+MathML schema"), SVG_SCHEMA("SVG schema"), EXTERNAL_SCHEMA_NON_SCHEMATRON(
--                "non-Schematron custom schema"), EXTERNAL_SCHEMA_SCHEMATRON(
--                "Schematron custom schema"), LOGIC_ERROR(
--                "Logic errors in schema stats"), PARSER_XML_EXTERNAL(
--                "Parser set to XML with external entities"), PARSER_HTML4(
--                "Parser set to explicit HTML4 mode"), XMLNS_FILTER(
--                "XMLNS filter set"), LAX_TYPE(
--                "Being lax about HTTP content type"), IMAGE_REPORT(
--                "Image report"), SHOW_SOURCE("Show source"), SHOW_OUTLINE(
--                "Show outline"), INPUT_GET("GET-based input"), INPUT_POST(
--                "POST-based input"), INPUT_TEXT_FIELD("\u2514 Text-field input"), INPUT_FILE_UPLOAD(
--                "\u2514 File-upload input"), INPUT_ENTITY_BODY(
--                "\u2514 Entity-body input"), OUTPUT_HTML("HTML output"), OUTPUT_XHTML(
--                "XHTML output"), OUTPUT_XML("XML output"), OUTPUT_JSON(
--                "JSON output"), OUTPUT_GNU("GNU output"), OUTPUT_TEXT(
--                "Text output"), INPUT_HTML("HTML input"), INPUT_XML("XML input");
--
--        Field(String description) {
--            this.description = description;
--        }
--
--        private final String description;
--
--        /**
--         * @see java.lang.Enum#toString()
--         */
--        @Override public String toString() {
--            return description;
--        }
--    }
--
--    static {
--        if ("1".equals(System.getProperty("nu.validator.servlet.statistics"))) {
--            STATISTICS = new Statistics();
--        } else {
--            STATISTICS = null;
--        }
--    }
--
--    private final long startTime = System.currentTimeMillis();
--
--    private long total = 0;
--
--    private final long[] counters;
--
--    private Statistics() {
--        counters = new long[Field.values().length];
--    }
--
--    public void incrementTotal() {
--        total++;
--    }
--
--    public void incrementField(Field field) {
--        counters[field.ordinal()]++;
--    }
--
--    public void writeToResponse(HttpServletResponse response)
--            throws IOException {
--        try {
--            long totalCopy;
--            long[] countersCopy = new long[counters.length];
--            synchronized (this) {
--                totalCopy = total;
--                System.arraycopy(counters, 0, countersCopy, 0, counters.length);
--            }
--            double totalDouble = (double) totalCopy;
--            double uptimeMillis = (double) (System.currentTimeMillis() - startTime);
--            response.setContentType("text/html; charset=utf-8");
--            ContentHandler ch = new HtmlSerializer(response.getOutputStream());
--            try {
--                ch.startDocument();
--                startElement(ch, "html");
--                startElement(ch, "head");
--                startElement(ch, "title");
--                characters(ch, VALIDATOR_STATISTICS);
--                endElement(ch, "title");
--                endElement(ch, "head");
--                startElement(ch, "body");
--                startElement(ch, "h1");
--                characters(ch, VALIDATOR_STATISTICS);
--                endElement(ch, "h1");
--
--                startElement(ch, "dl");
--                startElement(ch, "dt");
--                characters(ch, TOTAL_VALIDATIONS);
--                endElement(ch, "dt");
--                startElement(ch, "dd");
--                characters(ch, totalCopy);
--                endElement(ch, "dd");
--
--                startElement(ch, "dt");
--                characters(ch, UPTIME_DAYS);
--                endElement(ch, "dt");
--                startElement(ch, "dd");
--                characters(ch, uptimeMillis / (1000 * 60 * 60 * 24));
--                endElement(ch, "dd");
--
--                startElement(ch, "dt");
--                characters(ch, VALIDATIONS_PER_SECOND);
--                endElement(ch, "dt");
--                startElement(ch, "dd");
--                characters(ch, totalDouble / (uptimeMillis / 1000.0));
--                endElement(ch, "dd");
--
--                endElement(ch, "dl");
--
--                startElement(ch, "table");
--                startElement(ch, "thead");
--                startElement(ch, "tr");
--                startElement(ch, "th");
--                characters(ch, COUNTER_NAME);
--                endElement(ch, "th");
--                startElement(ch, "th");
--                characters(ch, COUNTER_VALUE);
--                endElement(ch, "th");
--                startElement(ch, "th");
--                characters(ch, COUNTER_PROPORTION);
--                endElement(ch, "th");
--                endElement(ch, "tr");
--                endElement(ch, "thead");
--                startElement(ch, "tbody");
--                for (int i = 0; i < countersCopy.length; i++) {
--                    long count = countersCopy[i];
--                    startElement(ch, "tr");
--                    startElement(ch, "td");
--
--                    characters(ch, Field.values()[i].toString());
--
--                    endElement(ch, "td");
--                    startElement(ch, "td");
--
--                    characters(ch, count);
--
--                    endElement(ch, "td");
--                    startElement(ch, "td");
--
--                    characters(ch, ((double) count) / totalDouble);
--
--                    endElement(ch, "td");
--                    endElement(ch, "tr");
--                }
--                endElement(ch, "tbody");
--                endElement(ch, "table");
--                endElement(ch, "body");
--                endElement(ch, "html");
--            } finally {
--                ch.endDocument();
--            }
--        } catch (SAXException e) {
--            throw new IOException(e);
--        }
--    }
--
--    private void characters(ContentHandler ch, double d) throws SAXException {
--        // Let's just create a new DecimalFormat each time to avoid the 
--        // complexity of recycling an instance correctly without threading
--        // hazards.
--        DecimalFormat df = new DecimalFormat("#,###,##0.000000");
--        characters(ch, df.format(d));
--    }
--
--    private void characters(ContentHandler ch, long l) throws SAXException {
--        characters(ch, Long.toString(l));
--    }
--
--    private void characters(ContentHandler ch, String str) throws SAXException {
--        characters(ch, str.toCharArray());
--    }
--
--    private void characters(ContentHandler ch, char[] cs) throws SAXException {
--        ch.characters(cs, 0, cs.length);
--    }
--
--    private void endElement(ContentHandler ch, String name) throws SAXException {
--        ch.endElement("http://www.w3.org/1999/xhtml", name, name);
--    }
--
--    private void startElement(ContentHandler ch, String name)
--            throws SAXException {
--        ch.startElement("http://www.w3.org/1999/xhtml", name, name,
--                EmptyAttributes.EMPTY_ATTRIBUTES);
--    }
--
--}
-diff --git a/src/nu/validator/servlet/StatsEmitter.java b/src/nu/validator/servlet/StatsEmitter.java
-deleted file mode 100644
-index 9ed17a1..0000000
---- a/src/nu/validator/servlet/StatsEmitter.java
-+++ /dev/null
-@@ -1,18 +0,0 @@
--/* This code was generated by nu.validator.tools.SaxCompiler. Please regenerate instead of editing. */
--package nu.validator.servlet;
--public final class StatsEmitter {
--private StatsEmitter() {}
--public static void emit(org.xml.sax.ContentHandler contentHandler, nu.validator.servlet.VerifierServletTransaction t) throws org.xml.sax.SAXException {
--org.xml.sax.helpers.AttributesImpl __attrs__ = new org.xml.sax.helpers.AttributesImpl();
--contentHandler.startPrefixMapping("", "http://www.w3.org/1999/xhtml");
--__attrs__.clear();
--__attrs__.addAttribute("", "class", "class", "CDATA", "stats");
--contentHandler.startElement("http://www.w3.org/1999/xhtml", "p", "p", __attrs__);
--contentHandler.characters(__chars__, 0, 21);
--t.emitTotalDuration(); 
--contentHandler.characters(__chars__, 21, 14);
--contentHandler.endElement("http://www.w3.org/1999/xhtml", "p", "p");
--contentHandler.endPrefixMapping("");
--}
--private static final char[] __chars__ = { 'T', 'o', 't', 'a', 'l', ' ', 'e', 'x', 'e', 'c', 'u', 't', 'i', 'o', 'n', ' ', 't', 'i', 'm', 'e', ' ', ' ', 'm', 'i', 'l', 'l', 'i', 's', 'e', 'c', 'o', 'n', 'd', 's', '.' };
--}
-diff --git a/src/nu/validator/servlet/TreeDumpContentHandler.java b/src/nu/validator/servlet/TreeDumpContentHandler.java
-deleted file mode 100644
-index 5728c8d..0000000
---- a/src/nu/validator/servlet/TreeDumpContentHandler.java
-+++ /dev/null
-@@ -1,232 +0,0 @@
--/*
-- * Copyright (c) 2007 Henri Sivonen
-- * Copyright (c) 2008 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.io.Writer;
--import java.util.Map;
--import java.util.TreeMap;
--
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--import org.xml.sax.ext.LexicalHandler;
--
--public class TreeDumpContentHandler implements ContentHandler, LexicalHandler {
--
--    private final Writer writer;
--
--    private int level = 0;
--
--    private boolean inCharacters = false;
--
--    private boolean close;
--
--    /**
--     * @param writer
--     */
--    public TreeDumpContentHandler(final Writer writer, boolean close) {
--        this.writer = writer;
--        this.close = close;
--    }
--
--    public TreeDumpContentHandler(final Writer writer) {
--        this(writer, true);
--    }
--
--    private void printLead() throws IOException {
--        if (inCharacters) {
--            writer.write("\"\n");
--            inCharacters = false;
--        }
--        writer.write("| ");
--        for (int i = 0; i < level; i++) {
--            writer.write("  ");
--        }
--    }
--
--    /**
--     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
--     */
--    public void characters(char[] ch, int start, int length)
--            throws SAXException {
--        try {
--            if (!inCharacters) {
--                printLead();
--                writer.write('"');
--                inCharacters = true;
--            }
--            writer.write(ch, start, length);
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void endElement(String uri, String localName, String qName)
--            throws SAXException {
--        try {
--            if (inCharacters) {
--                writer.write("\"\n");
--                inCharacters = false;
--            }
--            level--;
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void startElement(String uri, String localName, String qName,
--            Attributes atts) throws SAXException {
--        try {
--            printLead();
--            writer.write('<');
--            if ("http://www.w3.org/1998/Math/MathML" == uri) {
--                writer.write("math ");                
--            } else if ("http://www.w3.org/2000/svg" == uri) {
--                writer.write("svg ");                                
--            } else if ("http://www.w3.org/1999/xhtml" != uri) {
--                writer.write("otherns ");                                
--            }
--            writer.write(localName);
--            writer.write(">\n");
--            level++;
--
--            TreeMap<String, String> map = new TreeMap<String, String>();
--            for (int i = 0; i < atts.getLength(); i++) {
--                String ns = atts.getURI(i);
--                String name;
--                if ("http://www.w3.org/1999/xlink" == ns) {
--                    name = "xlink " + atts.getLocalName(i);
--                } else if ("http://www.w3.org/XML/1998/namespace" == ns) {
--                    name = "xml " + atts.getLocalName(i);                    
--                } else if ("http://www.w3.org/2000/xmlns/" == ns) {
--                    name = "xmlns " + atts.getLocalName(i);                    
--                } else if ("" != uri) {
--                    name = atts.getLocalName(i);                    
--                } else {
--                    name = "otherns " + atts.getLocalName(i);                    
--                }
--                map.put(name, atts.getValue(i));
--            }
--            for (Map.Entry<String, String> entry : map.entrySet()) {
--                printLead();
--                writer.write(entry.getKey());
--                writer.write("=\"");
--                writer.write(entry.getValue());
--                writer.write("\"\n");
--            }
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void comment(char[] ch, int offset, int len) throws SAXException {
--        try {
--            printLead();
--            writer.write("<!-- ");
--            writer.write(ch, offset, len);
--            writer.write(" -->\n");
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void startDTD(String name, String publicIdentifier,
--            String systemIdentifier) throws SAXException {
--        try {
--            printLead();
--            writer.write("<!DOCTYPE ");
--            writer.write(name);
--            if (publicIdentifier.length() > 0 || systemIdentifier.length() > 0) {
--                writer.write(' ');
--                writer.write('\"');
--                writer.write(publicIdentifier);
--                writer.write('\"');
--                writer.write(' ');
--                writer.write('\"');
--                writer.write(systemIdentifier);
--                writer.write('\"');
--            }
--            writer.write(">\n");
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void endDocument() throws SAXException {
--        try {
--            if (inCharacters) {
--                writer.write("\"\n");
--                inCharacters = false;
--            }
--            if (close) {
--                writer.flush();
--                writer.close();
--            }
--        } catch (IOException e) {
--            throw new SAXException(e);
--        }
--    }
--
--    public void startPrefixMapping(String prefix, String uri)
--            throws SAXException {
--    }
--
--    public void startEntity(String arg0) throws SAXException {
--    }
--
--    public void endCDATA() throws SAXException {
--    }
--
--    public void endDTD() throws SAXException {
--    }
--
--    public void endEntity(String arg0) throws SAXException {
--    }
--
--    public void startCDATA() throws SAXException {
--    }
--
--    public void endPrefixMapping(String prefix) throws SAXException {
--    }
--
--    public void ignorableWhitespace(char[] ch, int start, int length)
--            throws SAXException {
--    }
--
--    public void processingInstruction(String target, String data)
--            throws SAXException {
--    }
--
--    public void setDocumentLocator(Locator locator) {
--    }
--
--    public void skippedEntity(String name) throws SAXException {
--    }
--
--    public void startDocument() throws SAXException {
--    }
--
--}
-diff --git a/src/nu/validator/servlet/VerifierServlet.java b/src/nu/validator/servlet/VerifierServlet.java
-deleted file mode 100644
-index 987fed9..0000000
---- a/src/nu/validator/servlet/VerifierServlet.java
-+++ /dev/null
-@@ -1,306 +0,0 @@
--/*
-- * Copyright (c) 2005 Henri Sivonen
-- * Copyright (c) 2007-2014 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.io.InputStream;
--import java.io.OutputStream;
--import java.io.ByteArrayOutputStream;
--import java.io.UnsupportedEncodingException;
--
--import javax.servlet.ServletException;
--import javax.servlet.http.HttpServlet;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletResponse;
--
--import nu.validator.messages.MessageEmitterAdapter;
--import nu.validator.xml.PrudentHttpEntityResolver;
--
--import org.apache.log4j.Logger;
--
--
--/**
-- * @version $Id$
-- * @author hsivonen
-- */
--public class VerifierServlet extends HttpServlet {
--    /**
--     * 
--     */
--    private static final long serialVersionUID = 7811043632732680935L;
--
--    private static final Logger log4j = Logger.getLogger(VerifierServlet.class);
--
--    static final String GENERIC_HOST = System.getProperty("nu.validator.servlet.host.generic", "");
--
--    static final String HTML5_HOST = System.getProperty("nu.validator.servlet.host.html5", "");
--
--    static final String PARSETREE_HOST = System.getProperty("nu.validator.servlet.host.parsetree", "");
--
--    static final String GENERIC_PATH = System.getProperty("nu.validator.servlet.path.generic", "/");
--
--    static final String HTML5_PATH = System.getProperty("nu.validator.servlet.path.html5", "/html5/");
--
--    static final String PARSETREE_PATH = System.getProperty("nu.validator.servlet.path.parsetree", "/parsetree/");
--
--    private static final byte[] GENERIC_ROBOTS_TXT;
--
--    private static final byte[] HTML5_ROBOTS_TXT;
--
--    private static final byte[] PARSETREE_ROBOTS_TXT;
--
--    private static final byte[] STYLE_CSS;
--
--    private static final byte[] SCRIPT_JS;
--
--    private static final byte[] ICON_PNG;
--
--    private static final byte[] ABOUT_HTML;
--
--    static {
--        try {
--            GENERIC_ROBOTS_TXT = buildRobotsTxt(GENERIC_HOST, GENERIC_PATH, HTML5_HOST, HTML5_PATH, PARSETREE_HOST, PARSETREE_PATH);
--            HTML5_ROBOTS_TXT = buildRobotsTxt(HTML5_HOST, HTML5_PATH, GENERIC_HOST, GENERIC_PATH, PARSETREE_HOST, PARSETREE_PATH);
--            PARSETREE_ROBOTS_TXT = buildRobotsTxt(PARSETREE_HOST, PARSETREE_PATH, HTML5_HOST, HTML5_PATH, GENERIC_HOST, GENERIC_PATH);
--        } catch (UnsupportedEncodingException e) {
--            throw new RuntimeException(e);
--        }
--        try {
--            STYLE_CSS = readFromClassLoaderIntoByteArray("nu/validator/localentities/files/style.css");
--            SCRIPT_JS = readFromClassLoaderIntoByteArray("nu/validator/localentities/files/script.js");
--            ICON_PNG = readFromClassLoaderIntoByteArray("nu/validator/localentities/files/icon.png");
--            ABOUT_HTML = readFromClassLoaderIntoByteArray("nu/validator/localentities/files/about.html");
--        } catch (IOException e) {
--            throw new RuntimeException(e);
--        }
--        PrudentHttpEntityResolver.setParams(
--            Integer.parseInt(System.getProperty("nu.validator.servlet.connection-timeout","5000")),
--            Integer.parseInt(System.getProperty("nu.validator.servlet.socket-timeout","5000")),
--            100);
--        // force some class loading
--        new VerifierServletTransaction(null, null);
--        new MessageEmitterAdapter(null, false, null, 0, false, null);
--    }
--
--    /**
--     * @return
--     * @throws UnsupportedEncodingException
--     */
--    private static byte[] buildRobotsTxt(String primaryHost, String primaryPath, String secondaryHost, String secondaryPath, String tertiaryHost, String tertiaryPath) throws UnsupportedEncodingException {
--        StringBuilder builder = new StringBuilder();
--        builder.append("User-agent: *\nDisallow: ");
--        builder.append(primaryPath);
--        builder.append("?\n");
--        if (primaryHost.equals(secondaryHost)) {
--            builder.append("Disallow: ");
--            builder.append(secondaryPath);
--            builder.append("?\n");
--        }
--        if (primaryHost.equals(tertiaryHost)) {
--            builder.append("Disallow: ");
--            builder.append(tertiaryPath);
--            builder.append("?\n");
--        }
--        return builder.toString().getBytes("UTF-8");
--    }
--
--    private static byte[] readFromClassLoaderIntoByteArray(String name)
--            throws IOException {
--        InputStream ios = VerifierServlet.class.getClassLoader().getResourceAsStream(
--                name);
--        ByteArrayOutputStream baos = new ByteArrayOutputStream();
--        try {
--            for (int b = ios.read(); b != -1; b = ios.read()) {
--                baos.write(b);
--            }
--            ios.close();
--            baos.close();
--        } catch (IOException e) {
--            throw new RuntimeException(e);
--        }
--        return baos.toByteArray();
--    }
--
--    private void writeResponse(byte[] buffer, String type,
--            HttpServletResponse response) throws IOException {
--        try {
--            response.setContentType(type);
--            response.setContentLength(buffer.length);
--            response.setDateHeader("Expires",
--                    System.currentTimeMillis() + 43200000); // 12 hours
--            OutputStream out = response.getOutputStream();
--            out.write(buffer);
--            out.flush();
--            out.close();
--        } catch (IOException e) {
--            throw new RuntimeException(e);
--        }
--    }
--
--    /**
--     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
--     */
--    @Override
--    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
--        if ("/robots.txt".equals(request.getPathInfo())) {
--            String serverName = request.getServerName();
--            byte[] robotsTxt = null;
--            if (hostMatch(GENERIC_HOST, serverName)) {
--                robotsTxt = GENERIC_ROBOTS_TXT;
--            } else if (hostMatch(HTML5_HOST, serverName)) {
--                robotsTxt = HTML5_ROBOTS_TXT;
--            } else if (hostMatch(PARSETREE_HOST, serverName)) {
--                robotsTxt = PARSETREE_ROBOTS_TXT;
--            } else {
--                response.sendError(HttpServletResponse.SC_NOT_FOUND);
--                return;
--            }
--            writeResponse(robotsTxt, "text/plain; charset=utf-8", response);
--            return;
--        } else if ("/style.css".equals(request.getPathInfo())) {
--            writeResponse(STYLE_CSS, "text/css; charset=utf-8", response);
--            return;
--        } else if ("/script.js".equals(request.getPathInfo())) {
--            writeResponse(SCRIPT_JS, "text/javascript; charset=utf-8", response);
--            return;
--        } else if ("/icon.png".equals(request.getPathInfo())) {
--            writeResponse(ICON_PNG, "image/png", response);
--            return;
--        } else if ("/about.html".equals(request.getPathInfo())) {
--            writeResponse(ABOUT_HTML, "text/html; charset=utf-8", response);
--            return;
--        } else if (Statistics.STATISTICS != null && "/stats.html".equals(request.getPathInfo())) {
--            Statistics.STATISTICS.writeToResponse(response);
--            return;
--        }
--        doPost(request, response);
--    }
--
--    private boolean hostMatch(String reference, String host) {
--        if ("".equals(reference)) {
--            return true;
--        } else {
--            // XXX case-sensitivity
--            return reference.equalsIgnoreCase(host);
--        }
--    }
--
--    /**
--     * @see javax.servlet.http.HttpServlet#doOptions(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
--     */
--    @Override
--    protected void doOptions(HttpServletRequest request,
--            HttpServletResponse response) throws ServletException, IOException {
--        String pathInfo = request.getPathInfo();
--        if ("*".equals(pathInfo)) { // useless RFC 2616 complication
--            return;
--        } else if ("/robots.txt".equals(pathInfo)) {
--            String serverName = request.getServerName();
--            if (hostMatch(GENERIC_HOST, serverName)
--                    || hostMatch(HTML5_HOST, serverName)
--                    || hostMatch(PARSETREE_HOST, serverName)) {
--                sendGetOnlyOptions(request, response);
--                return;
--            } else {
--                response.sendError(HttpServletResponse.SC_NOT_FOUND);
--                return;
--            }
--        }
--        doPost(request, response);
--    }
--
--    /**
--     * @see javax.servlet.http.HttpServlet#doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
--     */
--    @Override
--    protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
--        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
--    }
--
--    /**
--     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
--     *      javax.servlet.http.HttpServletResponse)
--     */
--    protected void doPost(HttpServletRequest request,
--            HttpServletResponse response) throws ServletException, IOException {
--        String pathInfo = request.getPathInfo();
--        if (pathInfo == null) {
--            pathInfo = "/"; // Fix for Jigsaw
--        }
--        String serverName = request.getServerName();
--        if ("/robots.txt".equals(pathInfo)) {
--            // if we get here, we've got a POST
--            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
--            return;
--        }
--        log4j.debug("pathInfo: " + pathInfo);
--        log4j.debug("serverName: " + serverName);
--        boolean isOptions = "OPTIONS".equals(request.getMethod());
--
--        if ("validator.nu".equals(serverName) && "/html5/".equals(pathInfo)) {
--                response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
--                String queryString = request.getQueryString();
--                response.setHeader("Location", "http://html5.validator.nu/" + (queryString == null ? "" : "?" + queryString));
--        } else if (hostMatch(GENERIC_HOST, serverName) && GENERIC_PATH.equals(pathInfo)) {
--            response.setHeader("Access-Control-Allow-Origin", "*");
--            response.setHeader("Access-Control-Allow-Headers", "content-type");
--            if (isOptions) {
--                sendOptions(request, response);
--            } else {
--                new VerifierServletTransaction(request, response).service();
--            }
--        } else if (hostMatch(HTML5_HOST, serverName) && HTML5_PATH.equals(pathInfo)) {
--            response.setHeader("Access-Control-Allow-Origin", "*");
--            response.setHeader("Access-Control-Allow-Headers", "content-type");
--            if (isOptions) {
--                sendOptions(request, response);
--            } else {
--                new Html5ConformanceCheckerTransaction(request, response).service();
--            }
--        } else if (hostMatch(PARSETREE_HOST, serverName) && PARSETREE_PATH.equals(pathInfo)) {
--            if (isOptions) {
--                sendGetOnlyOptions(request, response);
--            } else {
--                new ParseTreePrinter(request, response).service();
--            }
--        } else {
--            response.sendError(HttpServletResponse.SC_NOT_FOUND);
--        }
--    }
--
--    private void sendGetOnlyOptions(HttpServletRequest request, HttpServletResponse response) {
--        response.setHeader("Allow", "GET, HEAD, OPTIONS");
--        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, OPTIONS");
--        response.setContentType("application/octet-stream");
--        response.setContentLength(0);
--    }
--
--    private void sendOptions(HttpServletRequest request, HttpServletResponse response) {
--        response.setHeader("Access-Control-Max-Age", "43200"); // 12 hours
--        response.setHeader("Allow", "GET, HEAD, POST, OPTIONS");
--        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, OPTIONS");
--        response.setContentType("application/octet-stream");
--        response.setContentLength(0);
--    }
--}
-diff --git a/src/nu/validator/servlet/VerifierServletTransaction.java b/src/nu/validator/servlet/VerifierServletTransaction.java
-deleted file mode 100644
-index 5239a06..0000000
---- a/src/nu/validator/servlet/VerifierServletTransaction.java
-+++ /dev/null
-@@ -1,2051 +0,0 @@
--/*
-- * Copyright (c) 2005, 2006 Henri Sivonen
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.BufferedReader;
--import java.io.IOException;
--import java.io.InputStreamReader;
--import java.io.OutputStream;
--import java.util.Arrays;
--import java.util.Deque;
--import java.util.HashMap;
--import java.util.HashSet;
--import java.util.LinkedHashSet;
--import java.util.LinkedList;
--import java.util.List;
--import java.util.Map;
--import java.util.Properties;
--import java.util.Set;
--import java.util.SortedMap;
--import java.util.TreeMap;
--import java.util.regex.Matcher;
--import java.util.regex.Pattern;
--
--import javax.servlet.ServletException;
--import javax.servlet.http.HttpServletRequest;
--import javax.servlet.http.HttpServletResponse;
--
--import nu.validator.checker.XmlPiChecker;
--import nu.validator.checker.jing.CheckerSchema;
--import nu.validator.gnu.xml.aelfred2.SAXDriver;
--import nu.validator.htmlparser.common.DoctypeExpectation;
--import nu.validator.htmlparser.common.DocumentMode;
--import nu.validator.htmlparser.common.DocumentModeHandler;
--import nu.validator.htmlparser.common.Heuristics;
--import nu.validator.htmlparser.common.XmlViolationPolicy;
--import nu.validator.htmlparser.sax.HtmlParser;
--import nu.validator.htmlparser.sax.HtmlSerializer;
--import nu.validator.htmlparser.sax.XmlSerializer;
--import nu.validator.io.BoundedInputStream;
--import nu.validator.io.DataUri;
--import nu.validator.io.StreamBoundException;
--import nu.validator.localentities.LocalCacheEntityResolver;
--import nu.validator.messages.GnuMessageEmitter;
--import nu.validator.messages.JsonMessageEmitter;
--import nu.validator.messages.MessageEmitterAdapter;
--import nu.validator.messages.TextMessageEmitter;
--import nu.validator.messages.TooManyErrorsException;
--import nu.validator.messages.XhtmlMessageEmitter;
--import nu.validator.messages.XmlMessageEmitter;
--import nu.validator.servlet.imagereview.ImageCollector;
--import nu.validator.servlet.OutlineBuildingXMLReaderWrapper.Section;
--import nu.validator.source.SourceCode;
--import nu.validator.spec.Spec;
--import nu.validator.spec.html5.Html5SpecBuilder;
--import nu.validator.xml.AttributesImpl;
--import nu.validator.xml.AttributesPermutingXMLReaderWrapper;
--import nu.validator.xml.BaseUriTracker;
--import nu.validator.xml.CharacterUtil;
--import nu.validator.xml.CombineContentHandler;
--import nu.validator.xml.ContentTypeParser;
--import nu.validator.xml.DataUriEntityResolver;
--import nu.validator.xml.IdFilter;
--import nu.validator.xml.NamespaceDroppingXMLReaderWrapper;
--import nu.validator.xml.NullEntityResolver;
--import nu.validator.xml.PrudentHttpEntityResolver;
--import nu.validator.xml.SystemErrErrorHandler;
--import nu.validator.xml.TypedInputSource;
--import nu.validator.xml.WiretapXMLReaderWrapper;
--import nu.validator.xml.XhtmlSaxEmitter;
--import nu.validator.xml.dataattributes.DataAttributeDroppingSchemaWrapper;
--import nu.validator.xml.langattributes.XmlLangAttributeDroppingSchemaWrapper;
--import nu.validator.xml.roleattributes.RoleAttributeFilteringSchemaWrapper;
--
--import org.xml.sax.ContentHandler;
--import org.xml.sax.EntityResolver;
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXNotRecognizedException;
--import org.xml.sax.SAXNotSupportedException;
--import org.xml.sax.SAXParseException;
--import org.xml.sax.XMLReader;
--import org.xml.sax.ext.LexicalHandler;
--
--import com.thaiopensource.relaxng.impl.CombineValidator;
--import com.thaiopensource.util.PropertyMap;
--import com.thaiopensource.util.PropertyMapBuilder;
--import com.thaiopensource.validate.IncorrectSchemaException;
--import com.thaiopensource.validate.Schema;
--import com.thaiopensource.validate.SchemaReader;
--import com.thaiopensource.validate.SchemaResolver;
--import com.thaiopensource.validate.ValidateProperty;
--import com.thaiopensource.validate.Validator;
--import com.thaiopensource.validate.auto.AutoSchemaReader;
--import com.thaiopensource.validate.prop.rng.RngProperty;
--import com.thaiopensource.validate.prop.wrap.WrapProperty;
--import com.thaiopensource.validate.rng.CompactSchemaReader;
--
--import org.apache.log4j.Logger;
--import com.ibm.icu.text.Normalizer;
--
--/**
-- * @version $Id: VerifierServletTransaction.java,v 1.10 2005/07/24 07:32:48
-- *          hsivonen Exp $
-- * @author hsivonen
-- */
--class VerifierServletTransaction implements DocumentModeHandler, SchemaResolver {
--
--    private enum OutputFormat {
--        HTML, XHTML, TEXT, XML, JSON, RELAXED, SOAP, UNICORN, GNU
--    }
--
--    private static final Logger log4j = Logger.getLogger(VerifierServletTransaction.class);
--
--    private static final Pattern SPACE = Pattern.compile("\\s+");
--
--    private static final Pattern JS_IDENTIFIER = Pattern.compile("[\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}_\\$][\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}_\\$\\p{Mn}\\p{Mc}\\p{Nd}\\p{Pc}]*");
--
--    private static final String[] JS_RESERVED_WORDS = { "abstract", "boolean",
--            "break", "byte", "case", "catch", "char", "class", "const",
--            "continue", "debugger", "default", "delete", "do", "double",
--            "else", "enum", "export", "extends", "final", "finally", "float",
--            "for", "function", "goto", "if", "implements", "import", "in",
--            "instanceof", "int", "interface", "long", "native", "new",
--            "package", "private", "protected", "public", "return", "short",
--            "static", "super", "switch", "synchronized", "this", "throw",
--            "throws", "transient", "try", "typeof", "var", "void", "volatile",
--            "while", "with" };
--
--    private static final String[] CHARSETS = { "UTF-8", "UTF-16",
--            "Windows-1250", "Windows-1251", "Windows-1252", "Windows-1253",
--            "Windows-1254", "Windows-1255", "Windows-1256", "Windows-1257",
--            "Windows-1258", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3",
--            "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
--            "ISO-8859-8", "ISO-8859-9", "ISO-8859-13", "ISO-8859-15", "KOI8-R",
--            "TIS-620", "GBK", "GB18030", "Big5", "Big5-HKSCS", "Shift_JIS",
--            "ISO-2022-JP", "EUC-JP", "ISO-2022-KR", "EUC-KR" };
--
--    private static final char[][] CHARSET_DESCRIPTIONS = {
--            "UTF-8 (Global)".toCharArray(), "UTF-16 (Global)".toCharArray(),
--            "Windows-1250 (Central European)".toCharArray(),
--            "Windows-1251 (Cyrillic)".toCharArray(),
--            "Windows-1252 (Western)".toCharArray(),
--            "Windows-1253 (Greek)".toCharArray(),
--            "Windows-1254 (Turkish)".toCharArray(),
--            "Windows-1255 (Hebrew)".toCharArray(),
--            "Windows-1256 (Arabic)".toCharArray(),
--            "Windows-1257 (Baltic)".toCharArray(),
--            "Windows-1258 (Vietnamese)".toCharArray(),
--            "ISO-8859-1 (Western)".toCharArray(),
--            "ISO-8859-2 (Central European)".toCharArray(),
--            "ISO-8859-3 (South European)".toCharArray(),
--            "ISO-8859-4 (Baltic)".toCharArray(),
--            "ISO-8859-5 (Cyrillic)".toCharArray(),
--            "ISO-8859-6 (Arabic)".toCharArray(),
--            "ISO-8859-7 (Greek)".toCharArray(),
--            "ISO-8859-8 (Hebrew)".toCharArray(),
--            "ISO-8859-9 (Turkish)".toCharArray(),
--            "ISO-8859-13 (Baltic)".toCharArray(),
--            "ISO-8859-15 (Western)".toCharArray(),
--            "KOI8-R (Russian)".toCharArray(), "TIS-620 (Thai)".toCharArray(),
--            "GBK (Chinese, simplified)".toCharArray(),
--            "GB18030 (Chinese, simplified)".toCharArray(),
--            "Big5 (Chinese, traditional)".toCharArray(),
--            "Big5-HKSCS (Chinese, traditional)".toCharArray(),
--            "Shift_JIS (Japanese)".toCharArray(),
--            "ISO-2022-JP (Japanese)".toCharArray(),
--            "EUC-JP (Japanese)".toCharArray(),
--            "ISO-2022-KR (Korean)".toCharArray(),
--            "EUC-KR (Korean)".toCharArray() };
--
--    protected static final int HTML5_SCHEMA = 3;
--
--    protected static final int XHTML1STRICT_SCHEMA = 2;
--
--    protected static final int XHTML1TRANSITIONAL_SCHEMA = 1;
--
--    protected static final int XHTML5_SCHEMA = 7;
--
--    private static final char[] SERVICE_TITLE;
--
--    private static final char[] LIVING_VERSION = "Living Validator".toCharArray();
--
--    private static final char[] VERSION;
--
--    private static final char[] RESULTS_TITLE;
--
--    private static final char[] FOR = " for ".toCharArray();
--
--    private static final char[] ABOUT_THIS_SERVICE = "About this Service".toCharArray();
--
--    private static final char[] SIMPLE_UI = "Simplified Interface".toCharArray();
--
--    private static final String USER_AGENT;
--
--    private static Spec html5spec;
--
--    private static int[] presetDoctypes;
--
--    private static String[] presetLabels;
--
--    private static String[] presetUrls;
--
--    private static String[] presetNamespaces;
--
--    // XXX SVG!!!
--
--    private static final String[] KNOWN_CONTENT_TYPES = {
--            "application/atom+xml", "application/docbook+xml",
--            "application/xhtml+xml", "application/xv+xml", "image/svg+xml" };
--
--    private static final String[] NAMESPACES_FOR_KNOWN_CONTENT_TYPES = {
--            "http://www.w3.org/2005/Atom", "http://docbook.org/ns/docbook",
--            "http://www.w3.org/1999/xhtml", "http://www.w3.org/1999/xhtml",
--            "http://www.w3.org/2000/svg" };
--
--    private static final String[] ALL_CHECKERS = {
--            "http://c.validator.nu/table/", "http://c.validator.nu/nfc/",
--            "http://c.validator.nu/text-content/",
--            "http://c.validator.nu/unchecked/",
--            "http://c.validator.nu/usemap/", "http://c.validator.nu/obsolete/",
--            "http://c.validator.nu/xml-pi/", "http://c.validator.nu/unsupported/",
--            "http://c.validator.nu/microdata/" };
--
--    private static final String[] ALL_CHECKERS_HTML4 = {
--            "http://c.validator.nu/table/", "http://c.validator.nu/nfc/",
--            "http://c.validator.nu/unchecked/", "http://c.validator.nu/usemap/" };
--
--    private long start = System.currentTimeMillis();
--
--    protected final HttpServletRequest request;
--
--    private final HttpServletResponse response;
--
--    protected String document = null;
--
--    private ParserMode parser = ParserMode.AUTO;
--
--    private String profile = "";
--
--    private boolean laxType = false;
--
--    protected ContentHandler contentHandler;
--
--    protected XhtmlSaxEmitter emitter;
--
--    protected MessageEmitterAdapter errorHandler;
--
--    protected final AttributesImpl attrs = new AttributesImpl();
--
--    private OutputStream out;
--
--    private PropertyMap jingPropertyMap;
--
--    protected LocalCacheEntityResolver entityResolver;
--
--    private static long lastModified;
--
--    private static String[] preloadedSchemaUrls;
--
--    private static Schema[] preloadedSchemas;
--
--    private final static String ABOUT_PAGE = System.getProperty(
--            "nu.validator.servlet.about-page", "https://about.validator.nu/");
--
--    private final static String HTML5_FACET = (VerifierServlet.HTML5_HOST.isEmpty() ? "" : ("//" + VerifierServlet.HTML5_HOST)) + VerifierServlet.HTML5_PATH;
--
--    private final static String STYLE_SHEET = System.getProperty(
--            "nu.validator.servlet.style-sheet",
--            "style.css");
--
--    private final static String ICON = System.getProperty(
--            "nu.validator.servlet.icon",
--            "icon.png");
--
--    private final static String SCRIPT = System.getProperty(
--            "nu.validator.servlet.script",
--            "script.js");
--
--    private final static String[] LEGACY_HOSTS = System.getProperty(
--            "nu.validator.servlet.host.legacy", "").split("\\s+");
--
--    private static final long SIZE_LIMIT = Integer.parseInt(System.getProperty(
--            "nu.validator.servlet.max-file-size", "2097152"));
--
--    private String schemaUrls = null;
--
--    protected Validator validator = null;
--
--    private BufferingRootNamespaceSniffer bufferingRootNamespaceSniffer = null;
--
--    private String contentType = null;
--
--    protected HtmlParser htmlParser = null;
--
--    protected SAXDriver xmlParser = null;
--
--    protected XMLReader reader;
--
--    protected TypedInputSource documentInput;
--
--    protected PrudentHttpEntityResolver httpRes;
--
--    protected DataUriEntityResolver dataRes;
--
--    protected ContentTypeParser contentTypeParser;
--
--    private Set<String> loadedValidatorUrls = new HashSet<String>();
--
--    private boolean checkNormalization = false;
--
--    private boolean rootNamespaceSeen = false;
--
--    private OutputFormat outputFormat;
--
--    private String postContentType;
--
--    private boolean methodIsGet;
--
--    private SourceCode sourceCode = new SourceCode();
--
--    private Deque<Section> outline;
--
--    private boolean showSource;
--
--    private boolean showOutline;
--
--    private String userAgent;
--
--    private BaseUriTracker baseUriTracker = null;
--
--    private String charsetOverride = null;
--
--    private Set<String> filteredNamespaces = new LinkedHashSet<String>(); // linked
--
--    private LexicalHandler lexicalHandler;
--
--    // for
--    // UI
--    // stability
--
--    protected ImageCollector imageCollector;
--
--    private boolean externalSchema = false;
--
--    private boolean externalSchematron = false;
--
--    private String schemaListForStats = null;
--
--    static {
--        try {
--            log4j.debug("Starting static initializer.");
--
--            lastModified = 0;
--            BufferedReader r = new BufferedReader(new InputStreamReader(LocalCacheEntityResolver.getPresetsAsStream(), "UTF-8"));
--            String line;
--            List<String> doctypes = new LinkedList<String>();
--            List<String> namespaces = new LinkedList<String>();
--            List<String> labels = new LinkedList<String>();
--            List<String> urls = new LinkedList<String>();
--            Properties props = new Properties();
--
--            log4j.debug("Reading miscellaneous properties.");
--
--            props.load(VerifierServlet.class.getClassLoader().getResourceAsStream(
--                    "nu/validator/localentities/files/misc.properties"));
--            SERVICE_TITLE = (System.getProperty(
--                    "nu.validator.servlet.service-name",
--                    props.getProperty("nu.validator.servlet.service-name",
--                            "Validator.nu")) + " ").toCharArray();
--            RESULTS_TITLE = (System.getProperty(
--                    "nu.validator.servlet.results-title", props.getProperty(
--                            "nu.validator.servlet.results-title",
--                            "Validation results"))).toCharArray();
--            VERSION = (System.getProperty("nu.validator.servlet.version",
--                    props.getProperty("nu.validator.servlet.version",
--                            "Living Validator"))).toCharArray();
--            USER_AGENT= (System.getProperty("nu.validator.servlet.user-agent",
--                    props.getProperty("nu.validator.servlet.user-agent",
--                            "Validator.nu/LV")));
--
--            log4j.debug("Starting to loop over config file lines.");
--
--            while ((line = r.readLine()) != null) {
--                if ("".equals(line.trim())) {
--                    break;
--                }
--                String s[] = line.split("\t");
--                doctypes.add(s[0]);
--                namespaces.add(s[1]);
--                labels.add(s[2]);
--                urls.add(s[3]);
--            }
--
--            log4j.debug("Finished reading config.");
--
--            String[] presetDoctypesAsStrings = doctypes.toArray(new String[0]);
--            presetNamespaces = namespaces.toArray(new String[0]);
--            presetLabels = labels.toArray(new String[0]);
--            presetUrls = urls.toArray(new String[0]);
--
--            log4j.debug("Converted config to arrays.");
--
--            for (int i = 0; i < presetNamespaces.length; i++) {
--                String str = presetNamespaces[i];
--                if ("-".equals(str)) {
--                    presetNamespaces[i] = null;
--                } else {
--                    presetNamespaces[i] = presetNamespaces[i].intern();
--                }
--            }
--
--            log4j.debug("Prepared namespace array.");
--
--            presetDoctypes = new int[presetDoctypesAsStrings.length];
--            for (int i = 0; i < presetDoctypesAsStrings.length; i++) {
--                presetDoctypes[i] = Integer.parseInt(presetDoctypesAsStrings[i]);
--            }
--
--            log4j.debug("Parsed doctype numbers into ints.");
--
--            String prefix = System.getProperty("nu.validator.servlet.cachepathprefix");
--
--            log4j.debug("The cache path prefix is: " + prefix);
--
--            ErrorHandler eh = new SystemErrErrorHandler();
--            LocalCacheEntityResolver er = new LocalCacheEntityResolver(new NullEntityResolver());
--            er.setAllowRnc(true);
--            PropertyMapBuilder pmb = new PropertyMapBuilder();
--            pmb.put(ValidateProperty.ERROR_HANDLER, eh);
--            pmb.put(ValidateProperty.ENTITY_RESOLVER, er);
--            pmb.put(ValidateProperty.XML_READER_CREATOR,
--                    new VerifierServletXMLReaderCreator(eh, er));
--            RngProperty.CHECK_ID_IDREF.add(pmb);
--            PropertyMap pMap = pmb.toPropertyMap();
--
--            log4j.debug("Parsing set up. Starting to read schemas.");
--
--            SortedMap<String, Schema> schemaMap = new TreeMap<String, Schema>();
--
--            schemaMap.put("http://c.validator.nu/table/",
--                    CheckerSchema.TABLE_CHECKER);
--            schemaMap.put("http://hsivonen.iki.fi/checkers/table/",
--                    CheckerSchema.TABLE_CHECKER);
--            schemaMap.put("http://c.validator.nu/nfc/",
--                    CheckerSchema.NORMALIZATION_CHECKER);
--            schemaMap.put("http://hsivonen.iki.fi/checkers/nfc/",
--                    CheckerSchema.NORMALIZATION_CHECKER);
--            schemaMap.put("http://c.validator.nu/debug/",
--                    CheckerSchema.DEBUG_CHECKER);
--            schemaMap.put("http://hsivonen.iki.fi/checkers/debug/",
--                    CheckerSchema.DEBUG_CHECKER);
--            schemaMap.put("http://c.validator.nu/text-content/",
--                    CheckerSchema.TEXT_CONTENT_CHECKER);
--            schemaMap.put("http://hsivonen.iki.fi/checkers/text-content/",
--                    CheckerSchema.TEXT_CONTENT_CHECKER);
--            schemaMap.put("http://c.validator.nu/usemap/",
--                    CheckerSchema.USEMAP_CHECKER);
--            schemaMap.put("http://n.validator.nu/checkers/usemap/",
--                    CheckerSchema.USEMAP_CHECKER);
--            schemaMap.put("http://c.validator.nu/unchecked/",
--                    CheckerSchema.UNCHECKED_SUBTREE_WARNER);
--            schemaMap.put("http://s.validator.nu/html5/assertions.sch",
--                    CheckerSchema.ASSERTION_SCH);
--            schemaMap.put("http://s.validator.nu/html4/assertions.sch",
--                    CheckerSchema.HTML4ASSERTION_SCH);
--            schemaMap.put("http://c.validator.nu/obsolete/",
--                    CheckerSchema.CONFORMING_BUT_OBSOLETE_WARNER);
--            schemaMap.put("http://c.validator.nu/xml-pi/",
--                    CheckerSchema.XML_PI_CHECKER);
--            schemaMap.put("http://c.validator.nu/unsupported/",
--                    CheckerSchema.UNSUPPORTED_CHECKER);
--            schemaMap.put("http://c.validator.nu/microdata/",
--                    CheckerSchema.MICRODATA_CHECKER);
--            schemaMap.put("http://c.validator.nu/rdfalite/",
--                    CheckerSchema.RDFALITE_CHECKER);
--
--            for (int i = 0; i < presetUrls.length; i++) {
--                String[] urls1 = SPACE.split(presetUrls[i]);
--                for (int j = 0; j < urls1.length; j++) {
--                    String url = urls1[j];
--                    if (schemaMap.get(url) == null && !isCheckerUrl(url)) {
--                        Schema sch = schemaByUrl(url, er, pMap);
--                        schemaMap.put(url, sch);
--                    }
--                }
--            }
--
--            log4j.debug("Schemas read.");
--
--            preloadedSchemaUrls = new String[schemaMap.size()];
--            preloadedSchemas = new Schema[schemaMap.size()];
--            int i = 0;
--            for (Map.Entry<String, Schema> entry : schemaMap.entrySet()) {
--                preloadedSchemaUrls[i] = entry.getKey().intern();
--                Schema s = entry.getValue();
--                String u = entry.getKey();
--                if (isDataAttributeDroppingSchema(u)) {
--                    s = new DataAttributeDroppingSchemaWrapper(
--                            s);
--                }
--                if (isXmlLangAllowingSchema(u)) {
--                    s = new XmlLangAttributeDroppingSchemaWrapper(s);
--                }
--                if (isRoleAttributeFilteringSchema(u)) {
--                    s = new RoleAttributeFilteringSchemaWrapper(s);
--                }
--                preloadedSchemas[i] = s;
--                i++;
--            }
--
--            log4j.debug("Reading spec.");
--
--            html5spec = Html5SpecBuilder.parseSpec(LocalCacheEntityResolver.getHtml5SpecAsStream());
--
--            log4j.debug("Spec read.");
--
--            log4j.debug("Initialization complete.");
--        } catch (Exception e) {
--            throw new RuntimeException(e);
--        }
--    }
--
--    protected static String scrub(CharSequence s) {
--        return Normalizer.normalize(
--                CharacterUtil.prudentlyScrubCharacterData(s), Normalizer.NFC);
--    }
--
--    private static boolean isDataAttributeDroppingSchema(String key) {
--        return ("http://s.validator.nu/xhtml5.rnc".equals(key)
--                || "http://s.validator.nu/html5.rnc".equals(key)
--                || "http://s.validator.nu/html5-all.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-all.rnc".equals(key)
--                || "http://s.validator.nu/html5-its.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-rdfalite.rnc".equals(key)
--                || "http://s.validator.nu/html5-rdfalite.rnc".equals(key));
--    }
--
--    private static boolean isXmlLangAllowingSchema(String key) {
--        return ("http://s.validator.nu/xhtml5.rnc".equals(key)
--                || "http://s.validator.nu/html5.rnc".equals(key)
--                || "http://s.validator.nu/html5-all.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-all.rnc".equals(key)
--                || "http://s.validator.nu/html5-its.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-rdfalite.rnc".equals(key)
--                || "http://s.validator.nu/html5-rdfalite.rnc".equals(key));
--    }
--
--    private static boolean isRoleAttributeFilteringSchema(String key) {
--        return ("http://s.validator.nu/xhtml5.rnc".equals(key)
--                || "http://s.validator.nu/html5.rnc".equals(key)
--                || "http://s.validator.nu/html5-all.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-all.rnc".equals(key)
--                || "http://s.validator.nu/html5-its.rnc".equals(key)
--                || "http://s.validator.nu/xhtml5-rdfalite.rnc".equals(key)
--                || "http://s.validator.nu/html5-rdfalite.rnc".equals(key));
--    }
--
--    private static boolean isCheckerUrl(String url) {
--        if ("http://c.validator.nu/all/".equals(url)
--                || "http://hsivonen.iki.fi/checkers/all/".equals(url)) {
--            return true;
--        } else if ("http://c.validator.nu/all-html4/".equals(url)
--                || "http://hsivonen.iki.fi/checkers/all-html4/".equals(url)) {
--            return true;
--        } else if ("http://c.validator.nu/base/".equals(url)) {
--            return true;
--        } else if ("http://c.validator.nu/rdfalite/".equals(url)) {
--            return true;
--        }
--        for (int i = 0; i < ALL_CHECKERS.length; i++) {
--            if (ALL_CHECKERS[i].equals(url)) {
--                return true;
--            }
--        }
--        return false;
--    }
--
--    /**
--     * @param request
--     * @param response
--     */
--    VerifierServletTransaction(HttpServletRequest request,
--            HttpServletResponse response) {
--        this.request = request;
--        this.response = response;
--    }
--
--    protected boolean willValidate() {
--        if (methodIsGet) {
--            return document != null;
--        } else { // POST
--            return true;
--        }
--    }
--
--    void service() throws ServletException, IOException {
--        this.methodIsGet = "GET".equals(request.getMethod())
--                || "HEAD".equals(request.getMethod());
--
--        this.out = response.getOutputStream();
--
--        System.setProperty("nu.validator.servlet.request.legacy", "false");
--
--        if (Arrays.asList(LEGACY_HOSTS).contains(request.getRemoteHost())) {
--            System.setProperty("nu.validator.servlet.request.legacy", "true");
--        }
--
--        try {
--            request.setCharacterEncoding("utf-8");
--        } catch (NoSuchMethodError e) {
--            log4j.debug("Vintage Servlet API doesn't support setCharacterEncoding().", e);
--        }
--
--        if (!methodIsGet) {
--            postContentType = request.getContentType();
--            if (postContentType == null) {
--                response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                        "Content-Type missing");
--                return;
--            } else if (postContentType.trim().toLowerCase().startsWith(
--                    "application/x-www-form-urlencoded")) {
--                response.sendError(
--                        HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
--                        "application/x-www-form-urlencoded not supported. Please use multipart/form-data.");
--                return;
--            }
--        }
--
--        String outFormat = request.getParameter("out");
--        if (outFormat == null) {
--            outputFormat = OutputFormat.HTML;
--        } else {
--            if ("html".equals(outFormat)) {
--                outputFormat = OutputFormat.HTML;
--            } else if ("xhtml".equals(outFormat)) {
--                outputFormat = OutputFormat.XHTML;
--            } else if ("text".equals(outFormat)) {
--                outputFormat = OutputFormat.TEXT;
--            } else if ("gnu".equals(outFormat)) {
--                outputFormat = OutputFormat.GNU;
--            } else if ("xml".equals(outFormat)) {
--                outputFormat = OutputFormat.XML;
--            } else if ("json".equals(outFormat)) {
--                outputFormat = OutputFormat.JSON;
--            } else {
--                response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                        "Unsupported output format");
--                return;
--            }
--        }
--
--        if (!methodIsGet) {
--            document = request.getHeader("Content-Location");
--        }
--        if (document == null) {
--            document = request.getParameter("doc");
--        }
--        if (document == null) {
--            document = request.getParameter("file");
--        }
--
--        document = ("".equals(document)) ? null : document;
--
--        String callback = null;
--        if (outputFormat == OutputFormat.JSON) {
--            callback = request.getParameter("callback");
--            if (callback != null) {
--                Matcher m = JS_IDENTIFIER.matcher(callback);
--                if (m.matches()) {
--                    if (Arrays.binarySearch(JS_RESERVED_WORDS, callback) >= 0) {
--                        response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                                "Callback is a reserved word.");
--                        return;
--                    }
--                } else {
--                    response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                            "Callback is not a valid ECMA 262 IdentifierName.");
--                    return;
--                }
--            }
--        }
--
--        if (willValidate()) {
--            response.setDateHeader("Expires", 0);
--            response.setHeader("Cache-Control", "no-cache");
--        } else if (outputFormat == OutputFormat.HTML
--                || outputFormat == OutputFormat.XHTML) {
--            response.setDateHeader("Last-Modified", lastModified);
--        } else {
--            response.sendError(HttpServletResponse.SC_BAD_REQUEST,
--                    "No input document");
--            return;
--        }
--
--        setup();
--
--        if (request.getParameter("useragent") != null) {
--            userAgent = scrub(request.getParameter("useragent"));
--        } else {
--            userAgent = USER_AGENT;
--        }
--        showSource = (request.getParameter("showsource") != null);
--        showOutline = (request.getParameter("showoutline") != null);
--        if (request.getParameter("showimagereport") != null) {
--            imageCollector = new ImageCollector(sourceCode);
--        }
--
--        String charset = request.getParameter("charset");
--        if (charset != null) {
--            charset = scrub(charset.trim());
--            if (!"".equals(charset)) {
--                charsetOverride = charset;
--            }
--        }
--
--        String nsfilter = request.getParameter("nsfilter");
--        if (nsfilter != null) {
--            String[] nsfilterArr = SPACE.split(nsfilter);
--            for (int i = 0; i < nsfilterArr.length; i++) {
--                String ns = nsfilterArr[i];
--                if (ns.length() > 0) {
--                    filteredNamespaces.add(ns);
--                }
--            }
--        }
--
--        boolean errorsOnly = ("error".equals(request.getParameter("level")));
--
--        boolean asciiQuotes = (request.getParameter("asciiquotes") != null);
--
--        int lineOffset = 0;
--        String lineOffsetStr = request.getParameter("lineoffset");
--        if (lineOffsetStr != null) {
--            try {
--                lineOffset = Integer.parseInt(lineOffsetStr);
--            } catch (NumberFormatException e) {
--
--            }
--        }
--
--        try {
--            if (outputFormat == OutputFormat.HTML
--                    || outputFormat == OutputFormat.XHTML) {
--                if (outputFormat == OutputFormat.HTML) {
--                    response.setContentType("text/html; charset=utf-8");
--                    contentHandler = new HtmlSerializer(out);
--                } else {
--                    response.setContentType("application/xhtml+xml");
--                    contentHandler = 
--                            new XmlSerializer(out);
--                }
--                emitter = new XhtmlSaxEmitter(contentHandler);
--                errorHandler = new MessageEmitterAdapter(sourceCode,
--                        showSource, imageCollector, lineOffset, false,
--                        new XhtmlMessageEmitter(contentHandler));
--                PageEmitter.emit(contentHandler, this);
--            } else {
--                if (outputFormat == OutputFormat.TEXT) {
--                    response.setContentType("text/plain; charset=utf-8");
--                    errorHandler = new MessageEmitterAdapter(sourceCode,
--                            showSource, null, lineOffset, false,
--                            new TextMessageEmitter(out, asciiQuotes));
--                } else if (outputFormat == OutputFormat.GNU) {
--                    response.setContentType("text/plain; charset=utf-8");
--                    errorHandler = new MessageEmitterAdapter(sourceCode,
--                            showSource, null, lineOffset, false,
--                            new GnuMessageEmitter(out, asciiQuotes));
--                } else if (outputFormat == OutputFormat.XML) {
--                    response.setContentType("application/xml");
--                    errorHandler = new MessageEmitterAdapter(sourceCode,
--                            showSource, null, lineOffset, false,
--                            new XmlMessageEmitter(new XmlSerializer(out)));
--                } else if (outputFormat == OutputFormat.JSON) {
--                    if (callback == null) {
--                        response.setContentType("application/json; charset=utf-8");
--                    } else {
--                        response.setContentType("application/javascript; charset=utf-8");
--                    }
--                    errorHandler = new MessageEmitterAdapter(sourceCode,
--                            showSource, null, lineOffset, false,
--                            new JsonMessageEmitter(
--                                    new nu.validator.json.Serializer(out),
--                                    callback));
--                } else {
--                    throw new RuntimeException("Unreachable.");
--                }
--                errorHandler.setErrorsOnly(errorsOnly);
--                validate();
--            }
--        } catch (SAXException e) {
--            throw new ServletException(e);
--        }
--    }
--
--    /**
--     * @throws ServletException
--     */
--    protected void setup() throws ServletException {
--        String preset = request.getParameter("preset");
--
--        if (preset != null && !"".equals(preset)) {
--            schemaUrls = preset;
--        } else {
--            schemaUrls = request.getParameter("schema");
--        }
--        if (schemaUrls == null) {
--            schemaUrls = "";
--        }
--
--        String parserStr = request.getParameter("parser");
--
--        if ("html".equals(parserStr)) {
--            parser = ParserMode.HTML_AUTO;
--        } else if ("xmldtd".equals(parserStr)) {
--            parser = ParserMode.XML_EXTERNAL_ENTITIES_NO_VALIDATION;
--        } else if ("xml".equals(parserStr)) {
--            parser = ParserMode.XML_NO_EXTERNAL_ENTITIES;
--        } else if ("html5".equals(parserStr)) {
--            parser = ParserMode.HTML;
--        } else if ("html4".equals(parserStr)) {
--            parser = ParserMode.HTML401_STRICT;
--        } else if ("html4tr".equals(parserStr)) {
--            parser = ParserMode.HTML401_TRANSITIONAL;
--        } // else auto
--
--        laxType = (request.getParameter("laxtype") != null);
--    }
--
--    private boolean useHtml5Schema() {
--        if ("".equals(schemaUrls)) {
--            return false;
--        }
--        return (schemaUrls.contains("http://s.validator.nu/html5.rnc")
--                || schemaUrls.contains("http://s.validator.nu/html5-all.rnc")
--                || schemaUrls.contains("http://s.validator.nu/html5-its.rnc")
--                || schemaUrls.contains("http://s.validator.nu/html5-rdfalite.rnc"));
--    }
--
--    private boolean isHtmlUnsafePreset() {
--        if ("".equals(schemaUrls)) {
--            return false;
--        }
--        boolean preset = false;
--        for (int i = 0; i < presetUrls.length; i++) {
--            if (presetUrls[i].equals(schemaUrls)) {
--                preset = true;
--                break;
--            }
--        }
--        if (!preset) {
--            return false;
--        }
--        return !(schemaUrls.startsWith("http://s.validator.nu/xhtml10/xhtml-basic.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/xhtml10/xhtml-strict.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/xhtml10/xhtml-transitional.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/xhtml10/xhtml-frameset.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/html5.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/html5-all.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/html5-its.rnc")
--                || schemaUrls.startsWith("http://s.validator.nu/html5-rdfalite.rnc"));
--
--    }
--
--    /**
--     * @throws SAXException
--     */
--    @SuppressWarnings("deprecation") void validate() throws SAXException {
--        if (!willValidate()) {
--            return;
--        }
--
--        boolean isHtmlOrXhtml = (outputFormat == OutputFormat.HTML || outputFormat == OutputFormat.XHTML);
--        if (isHtmlOrXhtml) {
--            try {
--                out.flush();
--            } catch (IOException e1) {
--                throw new SAXException(e1);
--            }
--        }
--        httpRes = new PrudentHttpEntityResolver(SIZE_LIMIT, laxType,
--                errorHandler);
--        httpRes.setUserAgent(userAgent);
--        dataRes = new DataUriEntityResolver(httpRes, laxType, errorHandler);
--        contentTypeParser = new ContentTypeParser(errorHandler, laxType);
--        entityResolver = new LocalCacheEntityResolver(dataRes);
--        setAllowRnc(true);
--        try {
--            this.errorHandler.start(document);
--            PropertyMapBuilder pmb = new PropertyMapBuilder();
--            pmb.put(ValidateProperty.ERROR_HANDLER, errorHandler);
--            pmb.put(ValidateProperty.ENTITY_RESOLVER, entityResolver);
--            pmb.put(ValidateProperty.XML_READER_CREATOR,
--                    new VerifierServletXMLReaderCreator(errorHandler,
--                            entityResolver));
--            pmb.put(ValidateProperty.SCHEMA_RESOLVER, this);
--            RngProperty.CHECK_ID_IDREF.add(pmb);
--            jingPropertyMap = pmb.toPropertyMap();
--
--            tryToSetupValidator();
--
--            setAllowRnc(false);
--
--            loadDocAndSetupParser();
--            setErrorProfile();
--
--            reader.setErrorHandler(errorHandler);
--            contentType = documentInput.getType();
--            sourceCode.initialize(documentInput);
--            if (validator == null) {
--                checkNormalization = true;
--            }
--            if (checkNormalization) {
--                reader.setFeature(
--                        "http://xml.org/sax/features/unicode-normalization-checking",
--                        true);
--            }
--            WiretapXMLReaderWrapper wiretap = new WiretapXMLReaderWrapper(
--                    reader);
--            ContentHandler recorder = sourceCode.getLocationRecorder();
--            if (baseUriTracker == null) {
--                wiretap.setWiretapContentHander(recorder);
--            } else {
--                wiretap.setWiretapContentHander(new CombineContentHandler(
--                        recorder, baseUriTracker));
--            }
--            wiretap.setWiretapLexicalHandler((LexicalHandler) recorder);
--            reader = wiretap;
--            if (htmlParser != null) {
--                htmlParser.addCharacterHandler(sourceCode);
--                htmlParser.setMappingLangToXmlLang(true);
--                htmlParser.setErrorHandler(errorHandler.getExactErrorHandler());
--                htmlParser.setTreeBuilderErrorHandlerOverride(errorHandler);
--                errorHandler.setHtml(true);
--            } else if (xmlParser != null) {
--                // this must be after wiretap!
--                if (!filteredNamespaces.isEmpty()) {
--                    reader = new NamespaceDroppingXMLReaderWrapper(reader,
--                            filteredNamespaces);
--                }
--                xmlParser.setErrorHandler(errorHandler.getExactErrorHandler());
--                xmlParser.lockErrorHandler();
--            } else {
--                throw new RuntimeException("Bug. Unreachable.");
--            }
--            reader = new AttributesPermutingXMLReaderWrapper(reader); // make
--            // RNG
--            // validation
--            // better
--            if (charsetOverride != null) {
--                String charset = documentInput.getEncoding();
--                if (charset == null) {
--                    errorHandler.warning(new SAXParseException(
--                            "Overriding document character encoding from none to \u201C"
--                                    + charsetOverride + "\u201D.", null));
--                } else {
--                    errorHandler.warning(new SAXParseException(
--                            "Overriding document character encoding from \u201C"
--                                    + charset + "\u201D to \u201C"
--                                    + charsetOverride + "\u201D.", null));
--                }
--                documentInput.setEncoding(charsetOverride);
--            }
--            if (showOutline) {
--                reader = new OutlineBuildingXMLReaderWrapper(reader, request);
--                reader.parse(documentInput);
--                outline = (Deque<Section>) request.getAttribute("http://validator.nu/properties/document-outline");
--            } else {
--                reader.parse(documentInput);
--            }
--        } catch (TooManyErrorsException e) {
--            log4j.debug("TooManyErrorsException", e);
--            errorHandler.fatalError(e);
--        } catch (SAXException e) {
--            log4j.debug("SAXException", e);
--        } catch (IOException e) {
--            isHtmlOrXhtml = false;
--            log4j.info("IOException", e);
--            errorHandler.ioError(e);
--        } catch (IncorrectSchemaException e) {
--            log4j.debug("IncorrectSchemaException", e);
--            errorHandler.schemaError(e);
--        } catch (RuntimeException e) {
--            isHtmlOrXhtml = false;
--            log4j.error("RuntimeException, doc: " + document + " schema: "
--                    + schemaUrls + " lax: " + laxType, e);
--            errorHandler.internalError(
--                    e,
--                    "Oops. That was not supposed to happen. A bug manifested itself in the application internals. Unable to continue. Sorry. The admin was notified.");
--        } catch (Error e) {
--            isHtmlOrXhtml = false;
--            log4j.error("Error, doc: " + document + " schema: " + schemaUrls
--                    + " lax: " + laxType, e);
--            errorHandler.internalError(
--                    e,
--                    "Oops. That was not supposed to happen. A bug manifested itself in the application internals. Unable to continue. Sorry. The admin was notified.");
--        } finally {
--            errorHandler.end(successMessage(), failureMessage());
--            gatherStatistics();
--        }
--        if (isHtmlOrXhtml) {
--            XhtmlOutlineEmitter outlineEmitter = new XhtmlOutlineEmitter(
--                    contentHandler, outline);
--            outlineEmitter.emit();
--            StatsEmitter.emit(contentHandler, this);
--        }
--    }
--
--    private void gatherStatistics() {
--        Statistics stats = Statistics.STATISTICS;
--        if (stats == null) {
--            return;
--        }
--        synchronized (stats) {
--            stats.incrementTotal();
--            if (charsetOverride != null) {
--                stats.incrementField(Statistics.Field.CUSTOM_ENC);
--            }
--            switch (parser) {
--                case HTML401_STRICT:
--                case HTML401_TRANSITIONAL:
--                    stats.incrementField(Statistics.Field.PARSER_HTML4);
--                    break;
--                case XML_EXTERNAL_ENTITIES_NO_VALIDATION:
--                    stats.incrementField(Statistics.Field.PARSER_XML_EXTERNAL);
--                    break;
--            }
--            if (!filteredNamespaces.isEmpty()) {
--                stats.incrementField(Statistics.Field.XMLNS_FILTER);
--            }
--            if (laxType) {
--                stats.incrementField(Statistics.Field.LAX_TYPE);
--            }
--            if (imageCollector != null) {
--                stats.incrementField(Statistics.Field.IMAGE_REPORT);
--            }
--            if (showSource) {
--                stats.incrementField(Statistics.Field.SHOW_SOURCE);
--            }
--            if (showOutline) {
--                stats.incrementField(Statistics.Field.SHOW_OUTLINE);
--            }
--            if (methodIsGet) {
--                stats.incrementField(Statistics.Field.INPUT_GET);
--            } else { // POST
--                stats.incrementField(Statistics.Field.INPUT_POST);
--                Object inputType = request.getAttribute("nu.validator.servlet.MultipartFormDataFilter.type");
--                if ("textarea".equals(inputType)) {
--                    stats.incrementField(Statistics.Field.INPUT_TEXT_FIELD);
--                } else if ("file".equals(inputType)) {
--                    stats.incrementField(Statistics.Field.INPUT_FILE_UPLOAD);
--                } else {
--                    stats.incrementField(Statistics.Field.INPUT_ENTITY_BODY);
--                }
--            }
--            if (htmlParser != null) {
--                stats.incrementField(Statistics.Field.INPUT_HTML);
--            }
--            if (xmlParser != null) {
--                stats.incrementField(Statistics.Field.INPUT_XML);
--            }
--            switch (outputFormat) {
--                case GNU:
--                    stats.incrementField(Statistics.Field.OUTPUT_GNU);
--                    break;
--                case HTML:
--                    stats.incrementField(Statistics.Field.OUTPUT_HTML);
--                    break;
--                case JSON:
--                    stats.incrementField(Statistics.Field.OUTPUT_JSON);
--                    break;
--                case TEXT:
--                    stats.incrementField(Statistics.Field.OUTPUT_TEXT);
--                    break;
--                case XHTML:
--                    stats.incrementField(Statistics.Field.OUTPUT_XHTML);
--                    break;
--                case XML:
--                    stats.incrementField(Statistics.Field.OUTPUT_XML);
--                    break;
--            }
--            if (schemaListForStats == null) {
--                stats.incrementField(Statistics.Field.LOGIC_ERROR);
--            } else {
--                boolean preset = false;
--                for (int i = 0; i < presetUrls.length; i++) {
--                    if (presetUrls[i].equals(schemaListForStats)) {
--                        preset = true;
--                        if (externalSchema || externalSchematron) {
--                            stats.incrementField(Statistics.Field.LOGIC_ERROR);
--                        } else {
--                            stats.incrementField(Statistics.Field.PRESET_SCHEMA);
--                            /*
--                             * XXX WARNING WARNING: These mappings correspond to
--                             * values in the presets.txt file in the validator
--                             * source repo. They might be bogus if a custom
--                             * presets file is used instead.
--                             */
--                            switch (i) {
--                                case 0:
--                                case 5:
--                                    stats.incrementField(Statistics.Field.HTML5_SCHEMA);
--                                    break;
--                                case 1:
--                                case 6:
--                                    stats.incrementField(Statistics.Field.HTML5_RDFA_LITE_SCHEMA);
--                                    break;
--                                case 2:
--                                    stats.incrementField(Statistics.Field.HTML4_STRICT_SCHEMA);
--                                    break;
--                                case 3:
--                                    stats.incrementField(Statistics.Field.HTML4_TRANSITIONAL_SCHEMA);
--                                    break;
--                                case 4:
--                                    stats.incrementField(Statistics.Field.HTML4_FRAMESET_SCHEMA);
--                                    break;
--                                case 7:
--                                    stats.incrementField(Statistics.Field.XHTML1_COMPOUND_SCHEMA);
--                                    break;
--                                case 8:
--                                    stats.incrementField(Statistics.Field.SVG_SCHEMA);
--                                    break;
--                                default:
--                                    stats.incrementField(Statistics.Field.LOGIC_ERROR);
--                                    break;
--                            }
--                        }
--                        break;
--                    }
--                }
--                if (!preset && !externalSchema) {
--                    stats.incrementField(Statistics.Field.BUILT_IN_NON_PRESET);
--                }
--            }
--            if ("".equals(schemaUrls)) {
--                stats.incrementField(Statistics.Field.AUTO_SCHEMA);
--                if (externalSchema) {
--                    stats.incrementField(Statistics.Field.LOGIC_ERROR);
--                }
--            } else if (externalSchema) {
--                if (externalSchematron) {
--                    stats.incrementField(Statistics.Field.EXTERNAL_SCHEMA_SCHEMATRON);
--                } else {
--                    stats.incrementField(Statistics.Field.EXTERNAL_SCHEMA_NON_SCHEMATRON);
--                }
--            } else if (externalSchematron) {
--                stats.incrementField(Statistics.Field.LOGIC_ERROR);
--            }
--        }
--    }
--
--    /**
--     * @return
--     * @throws SAXException
--     */
--    protected String successMessage() throws SAXException {
--        return "The document validates according to the specified schema(s) and to additional constraints checked by the validator.";
--    }
--
--    protected String failureMessage() throws SAXException {
--        return "There were errors.";
--    }
--
--    /**
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     */
--    protected void tryToSetupValidator() throws SAXException, IOException,
--            IncorrectSchemaException {
--        validator = validatorByUrls(schemaUrls);
--    }
--
--    protected void setErrorProfile() {
--        profile = request.getParameter("profile");
--
--        HashMap<String, String> profileMap = new HashMap<String, String>();
--
--        if ("pedagogical".equals(profile)) {
--            profileMap.put("xhtml1", "warn");
--        } else if ("polyglot".equals(profile)) {
--            profileMap.put("xhtml1", "warn");
--            profileMap.put("xhtml2", "warn");
--        } else {
--            return; // presumed to be permissive
--        }
--
--        htmlParser.setErrorProfile(profileMap);
--    }
--
--    /**
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     */
--    protected void loadDocAndSetupParser() throws SAXException, IOException,
--            IncorrectSchemaException, SAXNotRecognizedException,
--            SAXNotSupportedException {
--        switch (parser) {
--            case HTML_AUTO:
--            case HTML:
--            case HTML401_STRICT:
--            case HTML401_TRANSITIONAL:
--                if (isHtmlUnsafePreset()) {
--                    String message = "The chosen preset schema is not appropriate for HTML.";
--                    SAXException se = new SAXException(message);
--                    errorHandler.schemaError(se);
--                    throw se;
--                }
--                setAllowGenericXml(false);
--                setAllowHtml(true);
--                setAcceptAllKnownXmlTypes(false);
--                setAllowXhtml(false);
--                loadDocumentInput();
--                newHtmlParser();
--                DoctypeExpectation doctypeExpectation;
--                int schemaId;
--                switch (parser) {
--                    case HTML:
--                        doctypeExpectation = DoctypeExpectation.HTML;
--                        schemaId = HTML5_SCHEMA;
--                        break;
--                    case HTML401_STRICT:
--                        doctypeExpectation = DoctypeExpectation.HTML401_STRICT;
--                        schemaId = XHTML1STRICT_SCHEMA;
--                        break;
--                    case HTML401_TRANSITIONAL:
--                        doctypeExpectation = DoctypeExpectation.HTML401_TRANSITIONAL;
--                        schemaId = XHTML1TRANSITIONAL_SCHEMA;
--                        break;
--                    default:
--                        doctypeExpectation = DoctypeExpectation.AUTO;
--                        schemaId = 0;
--                        break;
--                }
--                htmlParser.setDoctypeExpectation(doctypeExpectation);
--                htmlParser.setDocumentModeHandler(this);
--                reader = htmlParser;
--                if (validator == null) {
--                    validator = validatorByDoctype(schemaId);
--                }
--                if (validator != null) {
--                    reader.setContentHandler(validator.getContentHandler());
--                }
--                break;
--            case XML_NO_EXTERNAL_ENTITIES:
--            case XML_EXTERNAL_ENTITIES_NO_VALIDATION:
--                setAllowGenericXml(true);
--                setAllowHtml(false);
--                setAcceptAllKnownXmlTypes(true);
--                setAllowXhtml(true);
--                loadDocumentInput();
--                setupXmlParser();
--                break;
--            default:
--                setAllowGenericXml(true);
--                setAllowHtml(true);
--                setAcceptAllKnownXmlTypes(true);
--                setAllowXhtml(true);
--                loadDocumentInput();
--                String type = documentInput.getType();
--                if ("text/html".equals(type) || "text/html-sandboxed".equals(type)) {
--                    if (isHtmlUnsafePreset()) {
--                        String message = "The Content-Type was \u201C" + type + "\u201D, but the chosen preset schema is not appropriate for HTML.";
--                        SAXException se = new SAXException(message);
--                        errorHandler.schemaError(se);
--                        throw se;
--                    }
--                    errorHandler.info("The Content-Type was \u201C" + type + "\u201D. Using the HTML parser.");
--                    newHtmlParser();
--                    if (useHtml5Schema()) {
--                        htmlParser.setDoctypeExpectation(DoctypeExpectation.HTML);
--                    } else {
--                        htmlParser.setDoctypeExpectation(DoctypeExpectation.AUTO);
--                    }
--                    htmlParser.setDocumentModeHandler(this);
--                    reader = htmlParser;
--                    if (validator != null) {
--                        reader.setContentHandler(validator.getContentHandler());
--                    }
--                } else {
--                    errorHandler.info("The Content-Type was \u201C"
--                            + type
--                            + "\u201D. Using the XML parser (not resolving external entities).");
--                    setupXmlParser();
--                }
--                break;
--        }
--    }
--
--    /**
--     * 
--     */
--    protected void newHtmlParser() {
--        htmlParser = new HtmlParser();
--        htmlParser.setCommentPolicy(XmlViolationPolicy.ALLOW);
--        htmlParser.setContentNonXmlCharPolicy(XmlViolationPolicy.ALLOW);
--        htmlParser.setContentSpacePolicy(XmlViolationPolicy.ALTER_INFOSET);
--        htmlParser.setNamePolicy(XmlViolationPolicy.ALLOW);
--        htmlParser.setStreamabilityViolationPolicy(XmlViolationPolicy.FATAL);
--        htmlParser.setXmlnsPolicy(XmlViolationPolicy.ALTER_INFOSET);
--        htmlParser.setMappingLangToXmlLang(true);
--        htmlParser.setHtml4ModeCompatibleWithXhtml1Schemata(true);
--        htmlParser.setHeuristics(Heuristics.ALL);
--    }
--
--    protected Validator validatorByDoctype(int schemaId) throws SAXException,
--            IOException, IncorrectSchemaException {
--        if (schemaId == 0) {
--            return null;
--        }
--        for (int i = 0; i < presetDoctypes.length; i++) {
--            if (presetDoctypes[i] == schemaId) {
--                return validatorByUrls(presetUrls[i]);
--            }
--        }
--        throw new RuntimeException("Doctype mappings not initialized properly.");
--    }
--
--    /**
--     * @throws SAXNotRecognizedException
--     * @throws SAXNotSupportedException
--     */
--    protected void setupXmlParser() throws SAXNotRecognizedException,
--            SAXNotSupportedException {
--        xmlParser = new SAXDriver();
--        xmlParser.setCharacterHandler(sourceCode);
--        if (lexicalHandler != null) {
--          xmlParser.setProperty("http://xml.org/sax/properties/lexical-handler",
--              (LexicalHandler) lexicalHandler);
--        }
--        reader = new IdFilter(xmlParser);
--        reader.setFeature("http://xml.org/sax/features/string-interning", true);
--        reader.setFeature(
--                "http://xml.org/sax/features/external-general-entities",
--                parser == ParserMode.XML_EXTERNAL_ENTITIES_NO_VALIDATION);
--        reader.setFeature(
--                "http://xml.org/sax/features/external-parameter-entities",
--                parser == ParserMode.XML_EXTERNAL_ENTITIES_NO_VALIDATION);
--        if (parser == ParserMode.XML_EXTERNAL_ENTITIES_NO_VALIDATION) {
--            reader.setEntityResolver(entityResolver);
--        } else {
--            reader.setEntityResolver(new NullEntityResolver());
--        }
--        if (validator == null) {
--            bufferingRootNamespaceSniffer = new BufferingRootNamespaceSniffer(
--                    this);
--            reader.setContentHandler(bufferingRootNamespaceSniffer);
--        } else {
--            reader.setContentHandler(new RootNamespaceSniffer(this,
--                    validator.getContentHandler()));
--            reader.setDTDHandler(validator.getDTDHandler());
--        }
--    }
--
--    /**
--     * @param validator
--     * @return
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     */
--    private Validator validatorByUrls(String schemaList) throws SAXException,
--            IOException, IncorrectSchemaException {
--        System.setProperty("nu.validator.schema.rdfa-full", "0");
--        schemaListForStats  = schemaList;
--        Validator v = null;
--        String[] schemas = SPACE.split(schemaList);
--        for (int i = schemas.length - 1; i > -1; i--) {
--            String url = schemas[i];
--            if ("http://s.validator.nu/html5-all.rnc".equals(url)) {
--                System.setProperty("nu.validator.schema.rdfa-full", "1");
--            }
--            if ("http://c.validator.nu/all/".equals(url)
--                    || "http://hsivonen.iki.fi/checkers/all/".equals(url)) {
--                for (int j = 0; j < ALL_CHECKERS.length; j++) {
--                    v = combineValidatorByUrl(v, ALL_CHECKERS[j]);
--                }
--            } else if ("http://c.validator.nu/all-html4/".equals(url)
--                    || "http://hsivonen.iki.fi/checkers/all-html4/".equals(url)) {
--                for (int j = 0; j < ALL_CHECKERS_HTML4.length; j++) {
--                    v = combineValidatorByUrl(v, ALL_CHECKERS_HTML4[j]);
--                }
--            } else {
--                v = combineValidatorByUrl(v, url);
--            }
--        }
--        if (imageCollector != null && v != null) {
--            v = new CombineValidator(imageCollector, v);
--        }
--        return v;
--    }
--
--    /**
--     * @param val
--     * @param url
--     * @return
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     */
--    private Validator combineValidatorByUrl(Validator val, String url)
--            throws SAXException, IOException, IncorrectSchemaException {
--        if (!"".equals(url)) {
--            Validator v = validatorByUrl(url);
--            if (val == null) {
--                val = v;
--            } else {
--                val = new CombineValidator(v, val);
--            }
--        }
--        return val;
--    }
--
--    /**
--     * @param url
--     * @return
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     */
--    private Validator validatorByUrl(String url) throws SAXException,
--            IOException, IncorrectSchemaException {
--        if (loadedValidatorUrls.contains(url)) {
--            return null;
--        }
--        loadedValidatorUrls.add(url);
--        if ("http://s.validator.nu/xhtml5.rnc".equals(url)
--                || "http://s.validator.nu/html5.rnc".equals(url)
--                || "http://s.validator.nu/html5-all.rnc".equals(url)
--                || "http://s.validator.nu/xhtml5-all.rnc".equals(url)
--                || "http://s.validator.nu/html5-its.rnc".equals(url)
--                || "http://s.validator.nu/xhtml5-rdfalite.rnc".equals(url)
--                || "http://s.validator.nu/html5-rdfalite.rnc".equals(url)) {
--            errorHandler.setSpec(html5spec);
--        }
--        Schema sch = resolveSchema(url, jingPropertyMap);
--        Validator validator = sch.createValidator(jingPropertyMap);
--        if (validator.getContentHandler() instanceof XmlPiChecker) {
--          lexicalHandler = (LexicalHandler) validator.getContentHandler();
--        }
--        return validator;
--    }
--
--    public Schema resolveSchema(String url, PropertyMap options)
--            throws SAXException, IOException, IncorrectSchemaException {
--        int i = Arrays.binarySearch(preloadedSchemaUrls, url);
--        if (i > -1) {
--            Schema rv = preloadedSchemas[i];
--            if (options.contains(WrapProperty.ATTRIBUTE_OWNER)) {
--                if (rv instanceof CheckerSchema) {
--                    errorHandler.error(new SAXParseException(
--                            "A non-schema checker cannot be used as an attribute schema.",
--                            null, url, -1, -1));
--                    throw new IncorrectSchemaException();
--                } else {
--                    // ugly fall through
--                }
--            } else {
--                return rv;
--            }
--        }
--
--        externalSchema  = true;
--
--        TypedInputSource schemaInput = (TypedInputSource) entityResolver.resolveEntity(
--                null, url);
--        SchemaReader sr = null;
--        if ("application/relax-ng-compact-syntax".equals(schemaInput.getType())) {
--            sr = CompactSchemaReader.getInstance();
--        } else {
--            sr = new AutoSchemaReader();
--        }
--        Schema sch = sr.createSchema(schemaInput, options);
--
--        if (Statistics.STATISTICS != null && "com.thaiopensource.validate.schematron.SchemaImpl".equals(sch.getClass().getName())) {
--            externalSchematron  = true;
--        }
--
--        return sch;
--    }
--
--    /**
--     * @param url
--     * @return
--     * @throws SAXException
--     * @throws IOException
--     * @throws IncorrectSchemaException
--     */
--    private static Schema schemaByUrl(String url, EntityResolver resolver,
--            PropertyMap pMap) throws SAXException, IOException,
--            IncorrectSchemaException {
--        log4j.debug("Will load schema: " + url);
--        TypedInputSource schemaInput;
--        try {
--        schemaInput = (TypedInputSource) resolver.resolveEntity(
--                null, url);
--        } catch (ClassCastException e) {
--            log4j.fatal(url, e);
--            throw e;
--        }
--        SchemaReader sr = null;
--        if ("application/relax-ng-compact-syntax".equals(schemaInput.getType())) {
--            sr = CompactSchemaReader.getInstance();
--        } else {
--            sr = new AutoSchemaReader();
--        }
--        Schema sch = sr.createSchema(schemaInput, pMap);
--        return sch;
--    }
--
--    /**
--     * @throws SAXException
--     */
--    void emitTitle(boolean markupAllowed) throws SAXException {
--        if (willValidate()) {
--            emitter.characters(RESULTS_TITLE);
--            emitter.characters(FOR);
--            if (document != null && document.length() > 0) {
--                emitter.characters(scrub(shortenDataUri(document)));
--            } else if (request.getAttribute("nu.validator.servlet.MultipartFormDataFilter.filename") != null) {
--                emitter.characters("uploaded file "
--                        + scrub(request.getAttribute(
--                                "nu.validator.servlet.MultipartFormDataFilter.filename").toString()));
--            } else {
--                emitter.characters("contents of text-input area");
--            }
--        } else {
--            emitter.characters(SERVICE_TITLE);
--            if (markupAllowed
--                    && System.getProperty("nu.validator.servlet.service-name",
--                            "").equals("Validator.nu")) {
--                emitter.startElement("span");
--                emitter.characters(LIVING_VERSION);
--                emitter.endElement("span");
--            }
--        }
--    }
--
--    protected String shortenDataUri(String uri) {
--        if (DataUri.startsWithData(uri)) {
--            return "data:\u2026";
--        } else {
--            return uri;
--        }
--    }
--
--    void emitForm() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("method", "get");
--//        attrs.addAttribute("action", request.getRequestURL().toString());
--        if (isSimple()) {
--            attrs.addAttribute("class", "simple");
--        }
--        // attrs.addAttribute("onsubmit", "formSubmission()");
--        emitter.startElement("form", attrs);
--        emitFormContent();
--        emitter.endElement("form");
--    }
--
--    protected boolean isSimple() {
--        return false;
--    }
--
--    /**
--     * @throws SAXException
--     */
--    protected void emitFormContent() throws SAXException {
--        FormEmitter.emit(contentHandler, this);
--    }
--
--    void emitSchemaField() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("name", "schema");
--        attrs.addAttribute("id", "schema");
--        // attrs.addAttribute("onchange", "schemaChanged();");
--        attrs.addAttribute(
--                "pattern",
--                "(?:(?:(?:https?://\\S+)|(?:data:\\S+))(?:\\s+(?:(?:https?://\\S+)|(?:data:\\S+)))*)?");
--        attrs.addAttribute("title",
--                "Space-separated list of schema IRIs. (Leave blank to let the service guess.)");
--        if (schemaUrls != null) {
--            attrs.addAttribute("value", scrub(schemaUrls));
--        }
--        emitter.startElement("input", attrs);
--        emitter.endElement("input");
--    }
--
--    void emitDocField() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("type", "url");
--        attrs.addAttribute("name", "doc");
--        attrs.addAttribute("id", "doc");
--        attrs.addAttribute("pattern", "(?:(?:https?://.+)|(?:data:.+))?");
--        attrs.addAttribute("title",
--                "Absolute IRI (http, https or data only) of the document to be checked.");
--        if (document != null) {
--            attrs.addAttribute("value", scrub(document));
--        }
--        Object att = request.getAttribute("nu.validator.servlet.MultipartFormDataFilter.type");
--        if (att != null) {
--            attrs.addAttribute("class", att.toString());
--        }
--        emitter.startElement("input", attrs);
--        emitter.endElement("input");
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitSchemaDuration() throws SAXException {
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitDocDuration() throws SAXException {
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitTotalDuration() throws SAXException {
--        emitter.characters("" + (System.currentTimeMillis() - start));
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitPresetOptions() throws SAXException {
--        for (int i = 0; i < presetUrls.length; i++) {
--            emitter.option(presetLabels[i], presetUrls[i], false);
--        }
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitParserOptions() throws SAXException {
--        emitter.option("Automatically from Content-Type", "",
--                (parser == ParserMode.AUTO));
--        emitter.option("XML; don\u2019t load external entities", "xml",
--                (parser == ParserMode.XML_NO_EXTERNAL_ENTITIES));
--        emitter.option("XML; load external entities", "xmldtd",
--                (parser == ParserMode.XML_EXTERNAL_ENTITIES_NO_VALIDATION));
--        emitter.option("HTML; flavor from doctype", "html",
--                (parser == ParserMode.HTML_AUTO));
--        emitter.option("HTML5", "html5", (parser == ParserMode.HTML));
--        emitter.option("HTML 4.01 Strict", "html4",
--                (parser == ParserMode.HTML401_STRICT));
--        emitter.option("HTML 4.01 Transitional", "html4tr",
--                (parser == ParserMode.HTML401_TRANSITIONAL));
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitProfileOptions() throws SAXException {
--        profile = request.getParameter("profile");
--
--        emitter.option("Permissive: only what the spec requires",
--                "", ("".equals(profile)));
--        emitter.option("Pedagogical: suitable for teaching purposes",
--                "pedagogical", ("pedagogical".equals(profile)));
--        emitter.option("Polyglot: works both as HTML and as XML",
--                "polyglot", ("polyglot".equals(profile)));
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitLaxTypeField() throws SAXException {
--        emitter.checkbox("laxtype", "yes", laxType);
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitShowSourceField() throws SAXException {
--        emitter.checkbox("showsource", "yes", showSource);
--    }
--
--    /**
--     * @throws SAXException
--     *
--     */
--    void emitShowOutlineField() throws SAXException {
--        emitter.checkbox("showoutline", "yes", showOutline);
--    }
--
--    /**
--     * @throws SAXException
--     * 
--     */
--    void emitShowImageReportField() throws SAXException {
--        emitter.checkbox("showimagereport", "yes", imageCollector != null);
--    }
--
--    void rootNamespace(String namespace, Locator locator) throws SAXException {
--        if (validator == null) {
--            int index = -1;
--            for (int i = 0; i < presetNamespaces.length; i++) {
--                if (namespace.equals(presetNamespaces[i])) {
--                    index = i;
--                    break;
--                }
--            }
--            if (index == -1) {
--                String message = "Cannot find preset schema for namespace: \u201C"
--                        + namespace + "\u201D.";
--                SAXException se = new SAXException(message);
--                errorHandler.schemaError(se);
--                throw se;
--            }
--            String label = presetLabels[index];
--            String urls = presetUrls[index];
--            errorHandler.info("Using the preset for " + label
--                    + " based on the root namespace.");
--            try {
--                validator = validatorByUrls(urls);
--            } catch (IOException ioe) {
--                // At this point the schema comes from memory.
--                throw new RuntimeException(ioe);
--            } catch (IncorrectSchemaException e) {
--                // At this point the schema comes from memory.
--                throw new RuntimeException(e);
--            }
--            if (bufferingRootNamespaceSniffer == null) {
--                throw new RuntimeException(
--                        "Bug! bufferingRootNamespaceSniffer was null.");
--            }
--            bufferingRootNamespaceSniffer.setContentHandler(validator.getContentHandler());
--        }
--
--        if (!rootNamespaceSeen) {
--            rootNamespaceSeen = true;
--            if (contentType != null) {
--                int i;
--                if ((i = Arrays.binarySearch(KNOWN_CONTENT_TYPES, contentType)) > -1) {
--                    if (!NAMESPACES_FOR_KNOWN_CONTENT_TYPES[i].equals(namespace)) {
--                        String message = "".equals(namespace) ? "\u201C"
--                                + contentType
--                                + "\u201D is not an appropriate Content-Type for a document whose root element is not in a namespace."
--                                : "\u201C"
--                                        + contentType
--                                        + "\u201D is not an appropriate Content-Type for a document whose root namespace is \u201C"
--                                        + namespace + "\u201D.";
--                        SAXParseException spe = new SAXParseException(message,
--                                locator);
--                        errorHandler.warning(spe);
--                    }
--                }
--            }
--        }
--    }
--
--    public void documentMode(DocumentMode mode, String publicIdentifier,
--            String systemIdentifier, boolean html4SpecificAdditionalErrorChecks)
--            throws SAXException {
--        if (validator == null) {
--            try {
--                if ("yes".equals(request.getParameter("sniffdoctype"))) {
--                    if ("-//W3C//DTD XHTML 1.0 Transitional//EN".equals(publicIdentifier)) {
--                        errorHandler.info("XHTML 1.0 Transitional doctype seen. Appendix C is not supported. Proceeding anyway for your convenience. The parser is still an HTML parser, so namespace processing is not performed and \u201Cxml:*\u201D attributes are not supported. Using the schema for "
--                                + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
--                                        : ""));
--                        validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
--                    } else if ("-//W3C//DTD XHTML 1.0 Strict//EN".equals(publicIdentifier)) {
--                        errorHandler.info("XHTML 1.0 Strict doctype seen. Appendix C is not supported. Proceeding anyway for your convenience. The parser is still an HTML parser, so namespace processing is not performed and \u201Cxml:*\u201D attributes are not supported. Using the schema for "
--                                + getPresetLabel(XHTML1STRICT_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
--                                        : ""));
--                        validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
--                    } else if ("-//W3C//DTD HTML 4.01 Transitional//EN".equals(publicIdentifier)) {
--                        errorHandler.info("HTML 4.01 Transitional doctype seen. Using the schema for "
--                                + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? ""
--                                        : " HTML4-specific tokenization errors are not enabled."));
--                        validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
--                    } else if ("-//W3C//DTD HTML 4.01//EN".equals(publicIdentifier)) {
--                        errorHandler.info("HTML 4.01 Strict doctype seen. Using the schema for "
--                                + getPresetLabel(XHTML1STRICT_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? ""
--                                        : " HTML4-specific tokenization errors are not enabled."));
--                        validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
--                    } else if ("-//W3C//DTD HTML 4.0 Transitional//EN".equals(publicIdentifier)) {
--                        errorHandler.info("Legacy HTML 4.0 Transitional doctype seen.  Please consider using HTML 4.01 Transitional instead. Proceeding anyway for your convenience with the schema for "
--                                + getPresetLabel(XHTML1TRANSITIONAL_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? ""
--                                        : " HTML4-specific tokenization errors are not enabled."));
--                        validator = validatorByDoctype(XHTML1TRANSITIONAL_SCHEMA);
--                    } else if ("-//W3C//DTD HTML 4.0//EN".equals(publicIdentifier)) {
--                        errorHandler.info("Legacy HTML 4.0 Strict doctype seen. Please consider using HTML 4.01 instead. Proceeding anyway for your convenience with the schema for "
--                                + getPresetLabel(XHTML1STRICT_SCHEMA)
--                                + "."
--                                + (html4SpecificAdditionalErrorChecks ? ""
--                                        : " HTML4-specific tokenization errors are not enabled."));
--                        validator = validatorByDoctype(XHTML1STRICT_SCHEMA);
--                    }
--                } else {
--                    errorHandler.info("Using the schema for "
--                            + getPresetLabel(HTML5_SCHEMA)
--                            + "."
--                            + (html4SpecificAdditionalErrorChecks ? " HTML4-specific tokenization errors are enabled."
--                                    : ""));
--                    validator = validatorByDoctype(HTML5_SCHEMA);
--                }
--            } catch (IOException ioe) {
--                // At this point the schema comes from memory.
--                throw new RuntimeException(ioe);
--            } catch (IncorrectSchemaException e) {
--                // At this point the schema comes from memory.
--                throw new RuntimeException(e);
--            }
--            ContentHandler ch = validator.getContentHandler();
--            ch.setDocumentLocator(htmlParser.getDocumentLocator());
--            ch.startDocument();
--            reader.setContentHandler(ch);
--        } else {
--            if (html4SpecificAdditionalErrorChecks) {
--                errorHandler.info("HTML4-specific tokenization errors are enabled.");
--            }
--        }
--    }
--
--    private String getPresetLabel(int schemaId) {
--        for (int i = 0; i < presetDoctypes.length; i++) {
--            if (presetDoctypes[i] == schemaId) {
--                return presetLabels[i];
--            }
--        }
--        return "unknown";
--    }
--
--    /**
--     * @param acceptAllKnownXmlTypes
--     * @see nu.validator.xml.ContentTypeParser#setAcceptAllKnownXmlTypes(boolean)
--     */
--    protected void setAcceptAllKnownXmlTypes(boolean acceptAllKnownXmlTypes) {
--        contentTypeParser.setAcceptAllKnownXmlTypes(acceptAllKnownXmlTypes);
--        dataRes.setAcceptAllKnownXmlTypes(acceptAllKnownXmlTypes);
--        httpRes.setAcceptAllKnownXmlTypes(acceptAllKnownXmlTypes);
--    }
--
--    /**
--     * @param allowGenericXml
--     * @see nu.validator.xml.ContentTypeParser#setAllowGenericXml(boolean)
--     */
--    protected void setAllowGenericXml(boolean allowGenericXml) {
--        contentTypeParser.setAllowGenericXml(allowGenericXml);
--        httpRes.setAllowGenericXml(allowGenericXml);
--        dataRes.setAllowGenericXml(allowGenericXml);
--    }
--
--    /**
--     * @param allowHtml
--     * @see nu.validator.xml.ContentTypeParser#setAllowHtml(boolean)
--     */
--    protected void setAllowHtml(boolean allowHtml) {
--        contentTypeParser.setAllowHtml(allowHtml);
--        httpRes.setAllowHtml(allowHtml);
--        dataRes.setAllowHtml(allowHtml);
--    }
--
--    /**
--     * @param allowRnc
--     * @see nu.validator.xml.ContentTypeParser#setAllowRnc(boolean)
--     */
--    protected void setAllowRnc(boolean allowRnc) {
--        contentTypeParser.setAllowRnc(allowRnc);
--        httpRes.setAllowRnc(allowRnc);
--        dataRes.setAllowRnc(allowRnc);
--        entityResolver.setAllowRnc(allowRnc);
--    }
--
--    /**
--     * @param allowXhtml
--     * @see nu.validator.xml.ContentTypeParser#setAllowXhtml(boolean)
--     */
--    protected void setAllowXhtml(boolean allowXhtml) {
--        contentTypeParser.setAllowXhtml(allowXhtml);
--        httpRes.setAllowXhtml(allowXhtml);
--        dataRes.setAllowXhtml(allowXhtml);
--    }
--
--    /**
--     * @throws SAXException
--     * @throws IOException
--     */
--    protected void loadDocumentInput() throws SAXException, IOException {
--        if (methodIsGet) {
--            documentInput = (TypedInputSource) entityResolver.resolveEntity(
--                    null, document);
--            errorHandler.setLoggingOk(true);
--        } else { // POST
--            long len = request.getContentLength();
--            if (len > SIZE_LIMIT) {
--                throw new StreamBoundException("Resource size exceeds limit.");
--            }
--            documentInput = contentTypeParser.buildTypedInputSource(document,
--                    null, postContentType);
--            documentInput.setByteStream(len < 0 ? new BoundedInputStream(
--                    request.getInputStream(), SIZE_LIMIT, document)
--                    : request.getInputStream());
--            documentInput.setSystemId(request.getHeader("Content-Location"));
--        }
--        if (imageCollector != null) {
--            baseUriTracker = new BaseUriTracker(documentInput.getSystemId(),
--                    documentInput.getLanguage());
--            imageCollector.initializeContext(baseUriTracker);
--        }
--    }
--
--    void emitStyle() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("href", STYLE_SHEET);
--        attrs.addAttribute("rel", "stylesheet");
--        emitter.startElement("link", attrs);
--        emitter.endElement("link");
--    }
--
--    void emitIcon() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("href", ICON);
--        attrs.addAttribute("rel", "icon");
--        emitter.startElement("link", attrs);
--        emitter.endElement("link");
--    }
--
--    void emitScript() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("src", SCRIPT);
--        emitter.startElement("script", attrs);
--        emitter.endElement("script");
--    }
--
--    void emitAbout() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("href", ABOUT_PAGE);
--        emitter.startElement("a", attrs);
--        emitter.characters(ABOUT_THIS_SERVICE);
--        emitter.endElement("a");
--    }
--
--    void emitVersion() throws SAXException {
--        emitter.characters(VERSION);
--    }
--
--    void emitUserAgentInput() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("name", "useragent");
--        attrs.addAttribute("list", "useragents");
--        attrs.addAttribute("value", userAgent);
--        emitter.startElement("input", attrs);
--        emitter.endElement("input");
--    }
--
--    void emitOtherFacetLink() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("href", HTML5_FACET);
--        emitter.startElement("a", attrs);
--        emitter.characters(SIMPLE_UI);
--        emitter.endElement("a");
--    }
--
--    void emitNsfilterField() throws SAXException {
--        attrs.clear();
--        attrs.addAttribute("name", "nsfilter");
--        attrs.addAttribute("id", "nsfilter");
--        attrs.addAttribute("pattern", "(?:.+:.+(?:\\s+.+:.+)*)?");
--        attrs.addAttribute("title",
--                "Space-separated namespace URIs for vocabularies to be filtered out.");
--        if (!filteredNamespaces.isEmpty()) {
--            StringBuilder sb = new StringBuilder();
--            boolean first = true;
--            for (String ns : filteredNamespaces) {
--                if (!first) {
--                    sb.append(' ');
--                }
--                sb.append(ns);
--                first = false;
--            }
--            attrs.addAttribute("value", scrub(sb));
--        }
--        emitter.startElement("input", attrs);
--        emitter.endElement("input");
--    }
--
--    void maybeEmitNsfilterField() throws SAXException {
--        NsFilterEmitter.emit(contentHandler, this);
--    }
--
--    void emitCharsetOptions() throws SAXException {
--        boolean found = false;
--        for (int i = 0; i < CHARSETS.length; i++) {
--            String charset = CHARSETS[i];
--            boolean selected = charset.equalsIgnoreCase(charsetOverride); // XXX
--            // use
--            // ASCII-caseinsensitivity
--            emitter.option(CHARSET_DESCRIPTIONS[i], charset, selected);
--            if (selected) {
--                found = true;
--            }
--        }
--        if (!found && charsetOverride != null) {
--            emitter.option(charsetOverride, charsetOverride, true);
--        }
--    }
--
--    void maybeEmitCharsetField() throws SAXException {
--        CharsetEmitter.emit(contentHandler, this);
--    }
--
--}
-diff --git a/src/nu/validator/servlet/VerifierServletXMLReaderCreator.java b/src/nu/validator/servlet/VerifierServletXMLReaderCreator.java
-deleted file mode 100644
-index 9fb99e1..0000000
---- a/src/nu/validator/servlet/VerifierServletXMLReaderCreator.java
-+++ /dev/null
-@@ -1,69 +0,0 @@
--/*
-- * Copyright (c) 2005, 2006 Henri Sivonen
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a 
-- * copy of this software and associated documentation files (the "Software"), 
-- * to deal in the Software without restriction, including without limitation 
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-- * and/or sell copies of the Software, and to permit persons to whom the 
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in 
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import nu.validator.gnu.xml.aelfred2.SAXDriver;
--
--import org.xml.sax.EntityResolver;
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.SAXException;
--import org.xml.sax.XMLReader;
--
--import com.thaiopensource.xml.sax.XMLReaderCreator;
--
--
--/**
-- * @version $Id$
-- * @author hsivonen
-- */
--public class VerifierServletXMLReaderCreator implements XMLReaderCreator {
--
--    private ErrorHandler errorHandler;
--
--    private EntityResolver entityResolver;
--
--    /**
--     * @param errorHandler
--     * @param entityResolver
--     */
--    public VerifierServletXMLReaderCreator(ErrorHandler errorHandler,
--            EntityResolver entityResolver) {
--        this.errorHandler = errorHandler;
--        this.entityResolver = entityResolver;
--    }
--
--    /**
--     * @see com.thaiopensource.xml.sax.XMLReaderCreator#createXMLReader()
--     */
--    public XMLReader createXMLReader() throws SAXException {
--        XMLReader r = new SAXDriver();
--        r.setFeature("http://xml.org/sax/features/external-general-entities",
--                true);
--        r.setFeature("http://xml.org/sax/features/external-parameter-entities",
--                true);
--        r.setEntityResolver(this.entityResolver);
--        r.setErrorHandler(this.errorHandler);
--        return r;
--    }
--
--}
-diff --git a/src/nu/validator/servlet/XhtmlOutlineEmitter.java b/src/nu/validator/servlet/XhtmlOutlineEmitter.java
-deleted file mode 100644
-index e34feef..0000000
---- a/src/nu/validator/servlet/XhtmlOutlineEmitter.java
-+++ /dev/null
-@@ -1,101 +0,0 @@
--/*
-- * Copyright (c) 2012 Vadim Zaslawski, Ontos AG
-- * Copyright (c) 2012 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.servlet;
--
--import java.io.IOException;
--import java.util.Deque;
--
--import nu.validator.servlet.OutlineBuildingXMLReaderWrapper.Section;
--import nu.validator.xml.AttributesImpl;
--import nu.validator.xml.XhtmlSaxEmitter;
--
--import org.xml.sax.ContentHandler;
--import org.xml.sax.SAXException;
--
--public class XhtmlOutlineEmitter {
--
--    private static final char[] OUTLINE = "Outline".toCharArray();
--
--    private final Deque<Section> outline;
--
--    private final XhtmlSaxEmitter emitter;
--
--    private final AttributesImpl attrs = new AttributesImpl();
--
--    public XhtmlOutlineEmitter(final ContentHandler contentHandler,
--            final Deque<Section> outline) {
--        this.emitter = new XhtmlSaxEmitter(contentHandler);
--        this.outline = outline;
--    }
--
--    public void emit() throws SAXException {
--        if (outline != null) {
--            attrs.clear();
--            attrs.addAttribute("id", "outline");
--            emitter.startElement("section", attrs);
--            emitter.startElement("h2");
--            emitter.characters(OUTLINE);
--            emitter.endElement("h2");
--            try {
--                emitOutline(outline, 0);
--            } catch (IOException e) {
--                throw new RuntimeException(e);
--            }
--            emitter.endElement("section");
--        }
--    }
--
--    protected void emitOutline(Deque<Section> outline, int currentDepth)
--            throws IOException, SAXException {
--        emitter.startElement("ol");
--        for (Section section : outline) {
--            emitter.startElement("li");
--            StringBuilder headingText = section.getHeadingTextBuilder();
--            if (headingText.length() > 0) {
--                emitter.startElementWithClass("span", "heading");
--                emitter.characters(headingText.toString().toCharArray());
--                emitter.endElement("span");
--            } else if (section.hasEmptyHeading()) {
--                emitter.characters(("[" + section.getElementName() + " element with empty heading]").toCharArray());
--            } else if ("h1".equals(section.getElementName())
--                    || "h2".equals(section.getElementName())
--                    || "h3".equals(section.getElementName())
--                    || "h4".equals(section.getElementName())
--                    || "h5".equals(section.getElementName())
--                    || "h6".equals(section.getElementName())) {
--                emitter.characters(("[section implied by empty "
--                        + section.getElementName() + " element]").toCharArray());
--            } else {
--                emitter.characters(("[" + section.getElementName() + " element with no heading]").toCharArray());
--            }
--            Deque<Section> sections = section.sections;
--            if (!sections.isEmpty()) {
--                emitOutline(sections, currentDepth + 1);
--            }
--            emitter.endElement("li");
--        }
--        emitter.endElement("ol");
--    }
--
--}
-diff --git a/src/nu/validator/xml/BaseUriTracker.java b/src/nu/validator/xml/BaseUriTracker.java
-index 8a4c91b..afea01c 100644
---- a/src/nu/validator/xml/BaseUriTracker.java
-+++ b/src/nu/validator/xml/BaseUriTracker.java
-@@ -32,17 +32,17 @@ import org.xml.sax.ContentHandler;
- import org.xml.sax.Locator;
- import org.xml.sax.SAXException;
- 
--import io.mola.galimatias.URL;
--import io.mola.galimatias.GalimatiasParseException;
-+import com.hp.hpl.jena.iri.IRI;
-+import com.hp.hpl.jena.iri.IRIFactory;
- 
- public class BaseUriTracker implements ContentHandler, UriLangContext {
--
-+    
-     private enum Direction {
-         LTR, RTL, INHERIT
-     }
- 
-     private class Node {
--        public URL currentAbsolute; // not null
-+        public URI currentAbsolute; // not null
- 
-         public String originalRelative; // null if no xml:base
- 
-@@ -56,7 +56,7 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-          * @param currentAbsolute
-          * @param originalRelative
-          */
--        public Node(URL currentAbsolute, String originalRelative, String lang,
-+        public Node(URI currentAbsolute, String originalRelative, String lang,
-                 boolean langSpecified, boolean rtl) {
-             this.currentAbsolute = currentAbsolute;
-             this.originalRelative = originalRelative;
-@@ -66,6 +66,8 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-         }
-     }
- 
-+    private final IRIFactory iriFactory;
-+    
-     private LinkedList<Node> stack = new LinkedList<Node>();
- 
-     private boolean baseSeen = false;
-@@ -110,13 +112,26 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
- 
-     public BaseUriTracker(String systemId, String contentLanguage) {
- 
--        URL url = null;
-+        this.iriFactory = new IRIFactory();
-+        this.iriFactory.shouldViolation(false, false);
-+        this.iriFactory.securityViolation(false, false);
-+        this.iriFactory.dnsViolation(false, false);
-+        this.iriFactory.mintingViolation(false, false);
-+        this.iriFactory.useSpecificationIRI(false);
-+        this.iriFactory.useSchemeSpecificRules("http", false);
-+        this.iriFactory.useSchemeSpecificRules("https", false);
-+        this.iriFactory.useSchemeSpecificRules("ftp", false);
-+        this.iriFactory.useSchemeSpecificRules("data", false);
-+
-+        URI uri = null;
-         try {
--            url = URL.parse(systemId);
--        } catch (GalimatiasParseException e) {
--            url = null;
-+            IRI iri = iriFactory.construct(systemId);
-+            uri = new URI(iri.toASCIIString());
-+            if (!uri.isAbsolute()) {
-+                uri = null;
-+            }
-         } catch (Exception e) {
--            url = null;
-+            uri = null;
-         }
- 
-         String lang = "";
-@@ -131,8 +146,8 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-             } catch (DatatypeException e) {
-             }
-         }
--        stack.add(new Node(url, null, lang, langSpecified, false));
--        stack.add(new Node(url, null, lang, false, false)); // base/content-language placeholder
-+        stack.add(new Node(uri, null, lang, langSpecified, false));
-+        stack.add(new Node(uri, null, lang, false, false)); // base/content-language placeholder
-     }
- 
-     private Node peek() {
-@@ -158,7 +173,7 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-         }
- 
-         Node curr = peek();
--        URL base = curr.currentAbsolute;
-+        URI base = curr.currentAbsolute;
-         if (!langSpecified) {
-             lang = curr.lang;
-         }
-@@ -178,19 +193,19 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-         if (relative == null) {
-             stack.addLast(new Node(base, null, lang, langSpecified, rtl));
-         } else {
--            URL newBase;
-+            URI newBase;
-             String ascii = null;
-             try {
-+                IRI relIri = iriFactory.construct(relative);
-+                ascii = relIri.toASCIIString();
-                 if (base != null) {
--                    try {
--                        newBase = base.resolve(relative);
--                    } catch (GalimatiasParseException e) {
-+                    newBase = base.resolve(ascii);
-+                    if (!newBase.isAbsolute()) {
-                         newBase = base;
-                     }
-                 } else {
--                    try {
--                        newBase = URL.parse((new URI(ascii)).toString());
--                    } catch (GalimatiasParseException e) {
-+                    newBase = new URI(ascii);
-+                    if (!newBase.isAbsolute()) {
-                         newBase = null;
-                     }
-                 }
-@@ -283,22 +298,23 @@ public class BaseUriTracker implements ContentHandler, UriLangContext {
-      */
-     public String toAbsoluteUriWithCurrentBase(String uri) {
-         try {
--            URL relUrl = URL.parse(uri);
-+            IRI relIri = iriFactory.construct(uri);
-             String ascii;
--            ascii = relUrl.toString();
-+            ascii = relIri.toASCIIString();
- 
--            URL base = stack.getLast().currentAbsolute;
--            URL rv;
--            try {
--                if (base == null) {
--                    rv = URL.parse(ascii);
--                } else {
--                    rv = base.resolve(ascii);
--                }
--            } catch (GalimatiasParseException e) {
-+            URI base = stack.getLast().currentAbsolute;
-+            URI rv;
-+            if (base == null) {
-+                rv = new URI(ascii);
-+            } else {
-+                rv = base.resolve(ascii);
-+
-+            }
-+            if (rv.isAbsolute()) {
-+                return rv.toASCIIString();
-+            } else {
-                 return null;
-             }
--            return rv.toString();
-         } catch (Exception e) {
-             return null;
-         }
-diff --git a/src/nu/validator/xml/DataUriEntityResolver.java b/src/nu/validator/xml/DataUriEntityResolver.java
-index eaacb82..2eac45a 100644
---- a/src/nu/validator/xml/DataUriEntityResolver.java
-+++ b/src/nu/validator/xml/DataUriEntityResolver.java
-@@ -31,8 +31,11 @@ import org.xml.sax.InputSource;
- import org.xml.sax.SAXException;
- import org.xml.sax.SAXParseException;
- 
--import io.mola.galimatias.URL;
--import io.mola.galimatias.GalimatiasParseException;
-+//import io.mola.galimatias.URL;
-+//import io.mola.galimatias.GalimatiasParseException;
-+import com.hp.hpl.jena.iri.IRI;
-+import com.hp.hpl.jena.iri.IRIException;
-+import com.hp.hpl.jena.iri.IRIFactory;
- 
- public class DataUriEntityResolver implements EntityResolver {
- 
-@@ -51,6 +54,8 @@ public class DataUriEntityResolver implements EntityResolver {
-     private boolean acceptAllKnownXmlTypes = false;
- 
-     private boolean allowGenericXml = true;
-+    
-+    private final IRIFactory iriFactory;
- 
-     private final ContentTypeParser contentTypeParser;
-     
-@@ -61,6 +66,9 @@ public class DataUriEntityResolver implements EntityResolver {
-             ErrorHandler errorHandler) {
-         this.laxContentType = laxContentType;
-         this.errorHandler = errorHandler;
-+        this.iriFactory = new IRIFactory();
-+        this.iriFactory.useSpecificationXMLSystemID(true);
-+        this.iriFactory.useSchemeSpecificRules("data", true);
-         this.contentTypeParser = new ContentTypeParser(errorHandler,
-                 laxContentType, this.allowRnc, this.allowHtml, this.allowXhtml,
-                 this.acceptAllKnownXmlTypes, this.allowGenericXml);
-@@ -74,10 +82,10 @@ public class DataUriEntityResolver implements EntityResolver {
-     public InputSource resolveEntity(String publicId, String systemId)
-             throws SAXException, IOException {
-         if (DataUri.startsWithData(systemId)) {
--            URL url;
-+            IRI iri;
-             try {
--                url = URL.parse(systemId);
--            } catch (GalimatiasParseException e) {
-+                iri = iriFactory.construct(systemId);
-+            } catch (IRIException e) {
-                 IOException ioe = (IOException) new IOException(e.getMessage()).initCause(e);
-                 SAXParseException spe = new SAXParseException(e.getMessage(),
-                         publicId, systemId, -1, -1, ioe);
-@@ -86,7 +94,7 @@ public class DataUriEntityResolver implements EntityResolver {
-                 }
-                 throw spe;
-             }
--            systemId = url.toString();
-+            systemId = iri.toASCIIString();
-             DataUri du = new DataUri(systemId);
-             TypedInputSource is = contentTypeParser.buildTypedInputSource(systemId, publicId,
-                     du.getContentType());
-diff --git a/src/nu/validator/xml/PrudentHttpEntityResolver.java b/src/nu/validator/xml/PrudentHttpEntityResolver.java
-deleted file mode 100644
-index 1a172f1..0000000
---- a/src/nu/validator/xml/PrudentHttpEntityResolver.java
-+++ /dev/null
-@@ -1,548 +0,0 @@
--/*
-- * Copyright (c) 2005 Henri Sivonen
-- * Copyright (c) 2007-2015 Mozilla Foundation
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- * DEALINGS IN THE SOFTWARE.
-- */
--
--package nu.validator.xml;
--
--import java.io.IOException;
--import java.io.InputStream;
--import java.security.KeyManagementException;
--import java.security.KeyStoreException;
--import java.security.NoSuchAlgorithmException;
--import java.security.cert.CertificateException;
--import java.security.cert.X509Certificate;
--import java.util.zip.GZIPInputStream;
--
--import javax.net.ssl.HostnameVerifier;
--import javax.net.ssl.SSLContext;
--
--import nu.validator.io.BoundedInputStream;
--import nu.validator.io.ObservableInputStream;
--import nu.validator.io.StreamBoundException;
--import nu.validator.io.StreamObserver;
--import nu.validator.io.SystemIdIOException;
--
--import org.apache.http.Header;
--import org.apache.http.HttpEntity;
--import org.apache.http.HttpResponse;
--import org.apache.http.client.HttpClient;
--import org.apache.http.client.config.CookieSpecs;
--import org.apache.http.client.config.RequestConfig;
--import org.apache.http.client.methods.HttpGet;
--import org.apache.http.config.Registry;
--import org.apache.http.config.RegistryBuilder;
--import org.apache.http.conn.socket.ConnectionSocketFactory;
--import org.apache.http.conn.socket.PlainConnectionSocketFactory;
--import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
--import org.apache.http.conn.ssl.SSLContextBuilder;
--import org.apache.http.conn.ssl.TrustStrategy;
--import org.apache.http.impl.client.HttpClientBuilder;
--import org.apache.http.impl.client.HttpClients;
--import org.apache.http.impl.client.LaxRedirectStrategy;
--import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
--import org.apache.log4j.Logger;
--
--import org.xml.sax.EntityResolver;
--import org.xml.sax.ErrorHandler;
--import org.xml.sax.InputSource;
--import org.xml.sax.SAXException;
--import org.xml.sax.SAXParseException;
--
--import io.mola.galimatias.URL;
--import io.mola.galimatias.GalimatiasParseException;
--
--/**
-- * @version $Id: PrudentHttpEntityResolver.java,v 1.1 2005/01/08 08:11:26
-- *          hsivonen Exp $
-- * @author hsivonen
-- */
--@SuppressWarnings("deprecation") public class PrudentHttpEntityResolver
--        implements EntityResolver {
--
--    private static final Logger log4j = Logger.getLogger(PrudentHttpEntityResolver.class);
--
--    private static HttpClient client;
--
--    private static int maxRequests;
--
--    private long sizeLimit;
--
--    private final ErrorHandler errorHandler;
--
--    private int requestsLeft;
--
--    private boolean allowRnc = false;
--
--    private boolean allowHtml = false;
--
--    private boolean allowXhtml = false;
--
--    private boolean acceptAllKnownXmlTypes = false;
--
--    private boolean allowGenericXml = true;
--
--    private final ContentTypeParser contentTypeParser;
--
--    private String userAgent;
--
--    /**
--     * Sets the timeouts of the HTTP client.
--     *
--     * @param connectionTimeout
--     *            timeout until connection established in milliseconds. Zero
--     *            means no timeout.
--     * @param socketTimeout
--     *            timeout for waiting for data in milliseconds. Zero means no
--     *            timeout.
--     * @param maxRequests
--     *            maximum number of connections to a particuar host
--     */
--    public static void setParams(int connectionTimeout, int socketTimeout,
--            int maxRequests) {
--        PrudentHttpEntityResolver.maxRequests = maxRequests;
--        PoolingHttpClientConnectionManager phcConnMgr;
--        Registry<ConnectionSocketFactory> registry = //
--        RegistryBuilder.<ConnectionSocketFactory> create() //
--        .register("http", PlainConnectionSocketFactory.getSocketFactory()) //
--        .register("https", SSLConnectionSocketFactory.getSocketFactory()) //
--        .build();
--        HttpClientBuilder builder = HttpClients.custom();
--        builder.setRedirectStrategy(new LaxRedirectStrategy());
--        builder.setMaxConnPerRoute(maxRequests);
--        builder.setMaxConnTotal(200);
--        if ("true".equals(System.getProperty(
--                "nu.validator.xml.promiscuous-ssl", "false"))) { //
--            try {
--                SSLContext promiscuousSSLContext = new SSLContextBuilder() //
--                .loadTrustMaterial(null, new TrustStrategy() {
--                    public boolean isTrusted(X509Certificate[] arg0, String arg1)
--                            throws CertificateException {
--                        return true;
--                    }
--                }).build();
--                builder.setSslcontext(promiscuousSSLContext);
--                HostnameVerifier verifier = //
--                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
--                SSLConnectionSocketFactory promiscuousSSLConnSocketFactory = //
--                new SSLConnectionSocketFactory(promiscuousSSLContext, verifier);
--                registry = RegistryBuilder.<ConnectionSocketFactory> create() //
--                .register("https", promiscuousSSLConnSocketFactory) //
--                .register("http",
--                        PlainConnectionSocketFactory.getSocketFactory()) //
--                .build();
--            } catch (KeyManagementException e) {
--                e.printStackTrace();
--            } catch (NumberFormatException e) {
--                e.printStackTrace();
--            } catch (NoSuchAlgorithmException e) {
--                e.printStackTrace();
--            } catch (KeyStoreException e) {
--                e.printStackTrace();
--            }
--        }
--        phcConnMgr = new PoolingHttpClientConnectionManager(registry);
--        phcConnMgr.setDefaultMaxPerRoute(maxRequests);
--        phcConnMgr.setMaxTotal(200);
--        builder.setConnectionManager(phcConnMgr);
--        RequestConfig.Builder config = RequestConfig.custom();
--        config.setCircularRedirectsAllowed(true);
--        config.setMaxRedirects(20); // Gecko default
--        config.setConnectTimeout(connectionTimeout);
--        config.setCookieSpec(CookieSpecs.BEST_MATCH);
--        config.setSocketTimeout(socketTimeout);
--        client = builder.setDefaultRequestConfig(config.build()).build();
--    }
--
--    public void setUserAgent(String ua) {
--        userAgent = ua;
--    }
--
--    /**
--     * @param sizeLimit
--     * @param laxContentType
--     * @param errorHandler
--     */
--    public PrudentHttpEntityResolver(long sizeLimit, boolean laxContentType,
--            ErrorHandler errorHandler) {
--        this.sizeLimit = sizeLimit;
--        this.requestsLeft = maxRequests;
--        this.errorHandler = errorHandler;
--        this.contentTypeParser = new ContentTypeParser(errorHandler,
--                laxContentType, this.allowRnc, this.allowHtml, this.allowXhtml,
--                this.acceptAllKnownXmlTypes, this.allowGenericXml);
--    }
--
--    /**
--     * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String,
--     *      java.lang.String)
--     */
--    public InputSource resolveEntity(String publicId, String systemId)
--            throws SAXException, IOException {
--        if (requestsLeft > -1) {
--            if (requestsLeft == 0) {
--                throw new IOException(
--                        "Number of permitted HTTP requests exceeded.");
--            } else {
--                requestsLeft--;
--            }
--        }
--        HttpGet m = null;
--        try {
--            URL url;
--            try {
--                url = URL.parse(systemId);
--            } catch (GalimatiasParseException e) {
--                IOException ioe = (IOException) new IOException(e.getMessage()).initCause(e);
--                SAXParseException spe = new SAXParseException(e.getMessage(),
--                        publicId, systemId, -1, -1, ioe);
--                if (errorHandler != null) {
--                    errorHandler.fatalError(spe);
--                }
--                throw spe;
--            }
--            String scheme = url.scheme();
--            if (!("http".equals(scheme) || "https".equals(scheme))) {
--                String msg = "Unsupported URI scheme: \u201C" + scheme
--                        + "\u201D.";
--                SAXParseException spe = new SAXParseException(msg, publicId,
--                        systemId, -1, -1, new IOException(msg));
--                if (errorHandler != null) {
--                    errorHandler.fatalError(spe);
--                }
--                throw spe;
--            }
--            systemId = url.toString();
--            try {
--                m = new HttpGet(systemId);
--            } catch (IllegalArgumentException e) {
--                SAXParseException spe = new SAXParseException(
--                        e.getMessage(),
--                        publicId,
--                        systemId,
--                        -1,
--                        -1,
--                        (IOException) new IOException(e.getMessage()).initCause(e));
--                if (errorHandler != null) {
--                    errorHandler.fatalError(spe);
--                }
--                throw spe;
--            }
--            m.setHeader("User-Agent", userAgent);
--            m.setHeader("Accept", buildAccept());
--            m.setHeader("Accept-Encoding", "gzip");
--            log4j.info(systemId);
--            HttpResponse response = client.execute(m);
--            int statusCode = response.getStatusLine().getStatusCode();
--            if (statusCode != 200) {
--                String msg = "HTTP resource not retrievable. The HTTP status from the remote server was: "
--                        + statusCode + ".";
--                SAXParseException spe = new SAXParseException(msg, publicId,
--                        m.getURI().toString(), -1, -1, new IOException(msg));
--                if (errorHandler != null) {
--                    errorHandler.fatalError(spe);
--                }
--                throw spe;
--            }
--            HttpEntity entity = response.getEntity();
--            long len = entity.getContentLength();
--            if (sizeLimit > -1 && len > sizeLimit) {
--                SAXParseException spe = new SAXParseException(
--                        "Resource size exceeds limit.",
--                        publicId,
--                        m.getURI().toString(),
--                        -1,
--                        -1,
--                        new StreamBoundException("Resource size exceeds limit."));
--                if (errorHandler != null) {
--                    errorHandler.fatalError(spe);
--                }
--                throw spe;
--            }
--            TypedInputSource is;
--            org.apache.http.Header ct = response.getFirstHeader("Content-Type");
--            String contentType = null;
--            final String baseUri = m.getURI().toString();
--            if (ct != null) {
--                contentType = ct.getValue();
--            }
--            is = contentTypeParser.buildTypedInputSource(baseUri, publicId,
--                    contentType);
--
--            Header cl = response.getFirstHeader("Content-Language");
--            if (cl != null) {
--                is.setLanguage(cl.getValue().trim());
--            }
--
--            Header xuac = response.getFirstHeader("X-UA-Compatible");
--            if (xuac != null) {
--                String val = xuac.getValue().trim();
--                if (!"ie=edge".equalsIgnoreCase(val)) {
--                    SAXParseException spe = new SAXParseException(
--                            "X-UA-Compatible HTTP header must have the value \u201CIE=edge\u201D,"
--                                    + " was \u201C" + val + "\u201D.",
--                            publicId, systemId, -1, -1);
--                    errorHandler.error(spe);
--                }
--            }
--
--            final HttpGet meth = m;
--            InputStream stream = entity.getContent();
--            if (sizeLimit > -1) {
--                stream = new BoundedInputStream(stream, sizeLimit, baseUri);
--            }
--            Header ce = response.getFirstHeader("Content-Encoding");
--            if (ce != null) {
--                String val = ce.getValue().trim();
--                if ("gzip".equalsIgnoreCase(val)
--                        || "x-gzip".equalsIgnoreCase(val)) {
--                    stream = new GZIPInputStream(stream);
--                    if (sizeLimit > -1) {
--                        stream = new BoundedInputStream(stream, sizeLimit,
--                                baseUri);
--                    }
--                }
--            }
--            is.setByteStream(new ObservableInputStream(stream,
--                    new StreamObserver() {
--                        private final Logger log4j = Logger.getLogger("nu.validator.xml.PrudentEntityResolver.StreamObserver");
--
--                        private boolean released = false;
--
--                        public void closeCalled() {
--                            log4j.debug("closeCalled");
--                            if (!released) {
--                                log4j.debug("closeCalled, not yet released");
--                                released = true;
--                                try {
--                                    meth.releaseConnection();
--                                } catch (Exception e) {
--                                    log4j.debug(
--                                            "closeCalled, releaseConnection", e);
--                                }
--                            }
--                        }
--
--                        public void exceptionOccurred(Exception ex)
--                                throws IOException {
--                            if (!released) {
--                                released = true;
--                                try {
--                                    meth.abort();
--                                } catch (Exception e) {
--                                    log4j.debug("exceptionOccurred, abort", e);
--                                } finally {
--                                    try {
--                                        meth.releaseConnection();
--                                    } catch (Exception e) {
--                                        log4j.debug(
--                                                "exceptionOccurred, releaseConnection",
--                                                e);
--                                    }
--                                }
--                            }
--                            if (ex instanceof SystemIdIOException) {
--                                SystemIdIOException siie = (SystemIdIOException) ex;
--                                throw siie;
--                            } else if (ex instanceof IOException) {
--                                IOException ioe = (IOException) ex;
--                                throw new SystemIdIOException(baseUri,
--                                        ioe.getMessage(), ioe);
--                            } else if (ex instanceof RuntimeException) {
--                                RuntimeException re = (RuntimeException) ex;
--                                throw re;
--                            } else {
--                                throw new RuntimeException(
--                                        "API contract violation. Wrong exception type.",
--                                        ex);
--                            }
--                        }
--
--                        public void finalizerCalled() {
--                            if (!released) {
--                                released = true;
--                                try {
--                                    meth.abort();
--                                } catch (Exception e) {
--                                    log4j.debug("finalizerCalled, abort", e);
--                                } finally {
--                                    try {
--                                        meth.releaseConnection();
--                                    } catch (Exception e) {
--                                        log4j.debug(
--                                                "finalizerCalled, releaseConnection",
--                                                e);
--                                    }
--                                }
--                            }
--                        }
--
--                    }));
--            return is;
--        } catch (IOException e) {
--            if (m != null) {
--                try {
--                    m.abort();
--                } catch (Exception ex) {
--                    log4j.debug("abort", ex);
--                } finally {
--                    try {
--                        m.releaseConnection();
--                    } catch (Exception ex) {
--                        log4j.debug("releaseConnection", ex);
--                    }
--                }
--            }
--            throw e;
--        } catch (SAXException e) {
--            if (m != null) {
--                try {
--                    m.abort();
--                } catch (Exception ex) {
--                    log4j.debug("abort", ex);
--                } finally {
--                    try {
--                        m.releaseConnection();
--                    } catch (Exception ex) {
--                        log4j.debug("releaseConnection", ex);
--                    }
--                }
--            }
--            throw e;
--        } catch (RuntimeException e) {
--            if (m != null) {
--                try {
--                    m.abort();
--                } catch (Exception ex) {
--                    log4j.debug("abort", ex);
--                } finally {
--                    try {
--                        m.releaseConnection();
--                    } catch (Exception ex) {
--                        log4j.debug("releaseConnection", ex);
--                    }
--                }
--            }
--            throw e;
--        }
--    }
--
--    /**
--     * @return Returns the allowRnc.
--     */
--    public boolean isAllowRnc() {
--        return allowRnc;
--    }
--
--    /**
--     * @param allowRnc
--     *            The allowRnc to set.
--     */
--    public void setAllowRnc(boolean allowRnc) {
--        this.allowRnc = allowRnc;
--        this.contentTypeParser.setAllowRnc(allowRnc);
--    }
--
--    /**
--     * @param allowHtml
--     */
--    public void setAllowHtml(boolean allowHtml) {
--        this.allowHtml = allowHtml;
--        this.contentTypeParser.setAllowHtml(allowHtml);
--    }
--
--    /**
--     * Returns the acceptAllKnownXmlTypes.
--     *
--     * @return the acceptAllKnownXmlTypes
--     */
--    public boolean isAcceptAllKnownXmlTypes() {
--        return acceptAllKnownXmlTypes;
--    }
--
--    /**
--     * Sets the acceptAllKnownXmlTypes.
--     *
--     * @param acceptAllKnownXmlTypes
--     *            the acceptAllKnownXmlTypes to set
--     */
--    public void setAcceptAllKnownXmlTypes(boolean acceptAllKnownXmlTypes) {
--        this.acceptAllKnownXmlTypes = acceptAllKnownXmlTypes;
--        this.contentTypeParser.setAcceptAllKnownXmlTypes(acceptAllKnownXmlTypes);
--    }
--
--    /**
--     * Returns the allowGenericXml.
--     *
--     * @return the allowGenericXml
--     */
--    public boolean isAllowGenericXml() {
--        return allowGenericXml;
--    }
--
--    /**
--     * Sets the allowGenericXml.
--     *
--     * @param allowGenericXml
--     *            the allowGenericXml to set
--     */
--    public void setAllowGenericXml(boolean allowGenericXml) {
--        this.allowGenericXml = allowGenericXml;
--        this.contentTypeParser.setAllowGenericXml(allowGenericXml);
--    }
--
--    /**
--     * Returns the allowXhtml.
--     *
--     * @return the allowXhtml
--     */
--    public boolean isAllowXhtml() {
--        return allowXhtml;
--    }
--
--    /**
--     * Sets the allowXhtml.
--     *
--     * @param allowXhtml
--     *            the allowXhtml to set
--     */
--    public void setAllowXhtml(boolean allowXhtml) {
--        this.allowXhtml = allowXhtml;
--        this.contentTypeParser.setAllowXhtml(allowXhtml);
--    }
--
--    private String buildAccept() {
--        return "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
--    }
--
--    /**
--     * Returns the allowHtml.
--     *
--     * @return the allowHtml
--     */
--    public boolean isAllowHtml() {
--        return allowHtml;
--    }
--
--    public boolean isOnlyHtmlAllowed() {
--        return !isAllowGenericXml() && !isAllowRnc() && !isAllowXhtml();
--    }
--}
diff --git a/ide/html.validation/nbproject/project.properties b/ide/html.validation/nbproject/project.properties
index 1ffa48b..1297c3b 100644
--- a/ide/html.validation/nbproject/project.properties
+++ b/ide/html.validation/nbproject/project.properties
@@ -15,18 +15,23 @@
 # specific language governing permissions and limitations
 # under the License.
 
-file.reference.iri-0.5.jar=external/iri.jar
-file.reference.jing-0unknown.jar=external/jing.jar
+file.reference.iri-0.8.jar=external/iri-0.8.jar
+file.reference.jing-0unknown.jar=external/jing-0unknown.jar
 file.reference.log4j-1.2.15.jar=external/log4j-1.2.15.jar
-file.reference.validator-20200626-patched.jar=external/validator.jar
-file.reference.saxon9B-9.1.0.2.jar=external/saxon9B.jar
-file.reference.isorelax-20041111.jar=external/isorelax.jar
-release.external/iri-0.5.jar=modules/ext/iri.jar
+file.reference.validator-20200626-patched.jar=external/validator-20200626-patched.jar
+file.reference.isorelax-20041111.jar=external/isorelax-20041111.jar
+file.reference.salvation-2.7.2.jar=external/salvation-2.7.2.jar
+file.reference.galimatias-0.1.3.jar=external/galimatias-0.1.3.jar
+file.reference.langdetect-1.2.jar=external/langdetect-1.2.jar
+
+release.external/iri-0.8.jar=modules/ext/iri.jar
 release.external/jing-0unknown.jar=modules/ext/jing.jar
 release.external/log4j-1.2.15.jar=modules/ext/log4j-1.2.15.jar
 release.external/validator-20200626-patched.jar=modules/ext/validator.jar
-release.external/saxon9B-9.1.0.2.jar=modules/ext/saxon9B.jar
 release.external/isorelax-20041111.jar=modules/ext/isorelax.jar
+release.external/salvation-2.7.2.jar=modules/ext/salvation.jar
+release.external/galimatias-0.1.3.jar=modules/ext/galimatias.jar
+release.external/langdetect-1.2.jar=modules/ext/langdetect.jar
 
 javac.source=1.8
 javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/ide/html.validation/nbproject/project.xml b/ide/html.validation/nbproject/project.xml
index 8cd5c92..64c8040 100644
--- a/ide/html.validation/nbproject/project.xml
+++ b/ide/html.validation/nbproject/project.xml
@@ -160,16 +160,12 @@
                 <binary-origin>external/jing-0unknown.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/saxon9B.jar</runtime-relative-path>
-                <binary-origin>external/saxon9B-9.1.0.2.jar</binary-origin>
-            </class-path-extension>
-            <class-path-extension>
                 <runtime-relative-path>ext/log4j-1.2.15.jar</runtime-relative-path>
                 <binary-origin>external/log4j-1.2.15.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 <runtime-relative-path>ext/iri.jar</runtime-relative-path>
-                <binary-origin>external/iri-0.5.jar</binary-origin>
+                <binary-origin>external/iri-0.8.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 <runtime-relative-path>ext/validator.jar</runtime-relative-path>
@@ -179,6 +175,18 @@
                 <runtime-relative-path>ext/isorelax.jar</runtime-relative-path>
                 <binary-origin>external/isorelax-20041111.jar</binary-origin>
             </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/salvation.jar</runtime-relative-path>
+                <binary-origin>external/salvation-2.7.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/galimatias.jar</runtime-relative-path>
+                <binary-origin>external/galimatias-0.1.3.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/langdetect.jar</runtime-relative-path>
+                <binary-origin>external/langdetect-1.2.jar</binary-origin>
+            </class-path-extension>
         </data>
     </configuration>
 </project>
diff --git a/ide/html.validation/test/unit/data/testfiles/testEmbeddedCSS.xhtml b/ide/html.validation/test/unit/data/testfiles/testEmbeddedCSS.xhtml
new file mode 100644
index 0000000..4b91274
--- /dev/null
+++ b/ide/html.validation/test/unit/data/testfiles/testEmbeddedCSS.xhtml
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<html>
+    <head>
+        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+        <title>TODO supply a title</title>
+        <style>
+            h1 {
+                font-family: sans-serif;
+            }
+        </style>
+    </head>
+    <body>
+        <p>
+            TODO write content
+        </p>
+    </body>
+</html>
diff --git a/ide/html.validation/test/unit/src/org/netbeans/modules/html/validation/ValidationTransactionTest.java b/ide/html.validation/test/unit/src/org/netbeans/modules/html/validation/ValidationTransactionTest.java
index 830f8f5..9857464 100644
--- a/ide/html.validation/test/unit/src/org/netbeans/modules/html/validation/ValidationTransactionTest.java
+++ b/ide/html.validation/test/unit/src/org/netbeans/modules/html/validation/ValidationTransactionTest.java
@@ -184,6 +184,22 @@
         assertNull(vt.htmlParser);
     }
 
+    // Ensure files with embedded CSS pass
+    public void testEmbeddedCSS() throws SAXException {
+        FileObject fo = getTestFile("testfiles/testEmbeddedCSS.xhtml");
+        Source source = Source.create(fo);
+        String code = source.createSnapshot().getText().toString();
+        SyntaxAnalyzerResult result = SyntaxAnalyzer.create(new HtmlSource(fo)).analyze();
+        assertNotNull(result);
+
+        assertSame(HtmlVersion.HTML5, result.getDetectedHtmlVersion());
+        HtmlVersion version = result.getHtmlVersion();
+        assertSame(HtmlVersion.HTML5, version);
+
+        NbValidationTransaction vt = NbValidationTransaction.create(result.getHtmlVersion());
+        validate(code, true, result.getHtmlVersion(), vt);
+    }
+
     public void testNamespacesFiltering() throws SAXException {
         FileObject fo = getTestFile("testfiles/wicket.xhtml");
         Source source = Source.create(fo);
diff --git a/nbbuild/licenses/MIT-galimatias b/nbbuild/licenses/MIT-galimatias
new file mode 100644
index 0000000..fb38238
--- /dev/null
+++ b/nbbuild/licenses/MIT-galimatias
@@ -0,0 +1,19 @@
+Copyright (c) 2013-2014 Santiago M. Mola <santi@mola.io>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
\ No newline at end of file
